Compare commits

...

1107 Commits

Author SHA1 Message Date
Franck Nijhof
a1fe6b9cf3 Bump version to 2025.4.0b3 2025-03-27 15:38:31 +00:00
Luke Lashley
2567181cc2 Better handle Roborock discovery (#141575) 2025-03-27 15:38:24 +00:00
Joost Lekkerkerker
028e4f6029 Also migrate completion time entities in SmartThings (#141572) 2025-03-27 15:38:21 +00:00
Martin Hjelmare
b82e1a9bef Handle cloud subscription expired for backup upload (#141564)
Handle cloud backup subscription expired for upload
2025-03-27 15:38:18 +00:00
Joost Lekkerkerker
438f226c31 Add icons to hue effects (#141559) 2025-03-27 15:38:15 +00:00
Erwin Douna
2f139e3cb1 Tado fix HomeKit flow (#141525)
* Initial commit

* Fix

* Fix

---------

Co-authored-by: Joostlek <joostlek@outlook.com>
2025-03-27 15:38:07 +00:00
Franck Nijhof
5d75e96fbf Bump version to 2025.4.0b2 2025-03-27 10:19:35 +00:00
Norbert Rittel
dcf2ec5c37 Fix sentence-casing in konnected strings, replace "override" with "custom" (#141553)
Fix sentence-casing in `konnected`strings, replace "Override" with "Custom"

Make string consistent with HA standards.

As "Override" can be misunderstood as the verb, replace it with "Custom".
2025-03-27 10:19:22 +00:00
Simon Lamon
2431e1ba98 Bump linkplay to v0.2.2 (#141542)
Bump linkplay
2025-03-27 10:19:18 +00:00
Thomas55555
4ead108c15 Handle webcal prefix in remote calendar (#141541)
Handel webcal prefix in remote calendar
2025-03-27 10:19:14 +00:00
Michael Hansen
ec8363fa49 Add default preannounce sound to Assist satellites (#141522)
* Add default preannounce sound

* Allow None to disable sound

* Register static path instead of HTTP view

* Fix path

---------

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2025-03-27 10:19:09 +00:00
J. Diego Rodríguez Royo
e7ff0a3f8b Improve some Home Connect deprecations (#141508) 2025-03-27 10:19:06 +00:00
Ivan Lopez Hernandez
f4c0eb4189 Initialize google.genai.Client in the executor (#141432)
* Intialize the client on an executor thread

* Fix MyPy error

* MyPy error

* Exception error

* Fix ruff

* Update __init__.py

---------

Co-authored-by: tronikos <tronikos@users.noreply.github.com>
2025-03-27 10:19:02 +00:00
Manu
b1ee5a76e1 Support for upcoming pyLoad-ng release in pyLoad integration (#141297)
Fix extra key `proxy` in pyLoad
2025-03-27 10:18:58 +00:00
Norbert Rittel
6b9e8c301b Fix wrong friendly name for storage_power in solaredge (#141269)
* Fix wrong friendly name for `storage_power` in `solaredge`

"Stored power" is a contradiction in itself.
You can only store energy.

* Two additional spelling fixes

* Sentence-case "site"
2025-03-27 10:18:53 +00:00
Franck Nijhof
89c3266c7e Bump version to 2025.4.0b1 2025-03-26 23:21:26 +00:00
Jan Bouwhuis
cff0a632e8 Fix QoS schema issue in MQTT subentries (#141531) 2025-03-26 23:21:17 +00:00
Jan Bouwhuis
e04d8557ae Fix MQTT options flow QoS selector can not serialize (#141528) 2025-03-26 23:21:14 +00:00
Thomas55555
ca6286f241 Fix work area sensor for Husqvarna Automower (#141527)
* Fix work area sensor for Husqvarna Automower

* simplify
2025-03-26 23:21:10 +00:00
Robert Resch
35bcc9d5af Show box for Smartthings rise number entity (#141526) 2025-03-26 23:21:07 +00:00
Joost Lekkerkerker
25b45ce867 Sort SmartThings devices to be created by parent device id (#141515) 2025-03-26 23:21:03 +00:00
Robert Resch
d568209bd5 Bump deebot-client to 12.4.0 (#141501) 2025-03-26 23:21:00 +00:00
Simone Chemelli
8a43e8af9e Fix refresh state for Comelit alarm (#141370) 2025-03-26 23:20:56 +00:00
Franck Nijhof
785e5b2c16 Bump version to 2025.4.0b0 2025-03-26 17:41:03 +00:00
Joost Lekkerkerker
2e3853dd7d Deprecate SmartThings media player switch (#141467)
* Deprecate SmartThings media player switch

* Fix

* Fix

* Update homeassistant/components/smartthings/strings.json

Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>

* Fix

---------

Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-03-26 18:40:11 +01:00
Joost Lekkerkerker
fe99c39e25 Deprecate media player sensors for SmartThings (#141469)
* Deprecate media player sensors for SmartThings

* Deprecate media player sensors
2025-03-26 18:21:49 +01:00
Maciej Bieniek
c8ab5bc796 Bump IMGW-PIB library to 1.0.10 (#141491) 2025-03-26 17:57:27 +01:00
Álvaro Fernández Rojas
4f3b36c2e1 Update aioairzone-cloud to v0.6.11 (#141488)
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2025-03-26 17:57:15 +01:00
Marc Mueller
222d89a84c Update meteofrance-api to 1.4.0 (#141490) 2025-03-26 17:56:45 +01:00
Joost Lekkerkerker
eb3cb0e0c7 Bump yt-dlp to 2025.03.26 (#141484) 2025-03-26 11:49:29 -05:00
Joost Lekkerkerker
69c8f4fbb6 Add button to reset the water filter in SmartThings (#141493)
* Add button to reset the water filter in SmartThings

* Add button to reset the water filter in SmartThings
2025-03-26 11:48:03 -05:00
Jan Bouwhuis
3bcf1c942c Cleanup missed QoS translation string for MQTT subentries (#141485) 2025-03-26 17:40:22 +01:00
Michael Hansen
220aaf93c6 Add preannounce media id support for ESPHome (#141474)
* Working on preannounce media id support for ESPHome

* Fix test

* Update tests
2025-03-26 11:31:05 -05:00
Jan Bouwhuis
febc455bc5 Add switch as entity platform on MQTT subentries (#140658) 2025-03-26 16:46:44 +01:00
Marc Mueller
57f65c205e Use SPDX identifier for container license (#141477) 2025-03-26 16:31:28 +01:00
Erik Montnemery
6e56486294 Bump pychromecast to 14.0.7 (#141479) 2025-03-26 16:30:37 +01:00
Joost Lekkerkerker
3a1e1684ea Add power binary sensor for Cooktop in SmartThings (#141482) 2025-03-26 16:29:02 +01:00
Bram Kragten
9d63a49812 Update frontend to 20250326.0 (#141481) 2025-03-26 16:27:43 +01:00
Markus Adrario
7a4ca6dcdc Add Homee lock platform (#140893)
* Add homee lock platform

* finish tests

* add locking & unlocking

* add PARALLEL_UPDATES

* fix review comments

* fix test review comment.

* fix another review comment
2025-03-26 09:46:21 -05:00
Marc Mueller
1622638f10 Update mypy-dev to 1.16.0a7 (#141472) 2025-03-26 15:21:38 +01:00
Jan Bouwhuis
0de3549e6e Move QoS setting to shared device properties in MQTT device subentries configuration (#141369)
* Move QoS setting to shared device properties in MQTT device subentries configuration

* Use kwargs for validate_user_input helper
2025-03-26 15:20:08 +01:00
Joost Lekkerkerker
63d4efda2e Deprecate switch entity for airdresser (#141470)
* Deprecate switch entity for airdresser

* Deprecate switch entity for airdresser
2025-03-26 15:06:13 +01:00
J. Diego Rodríguez Royo
b5910dd7d6 Move Home Connect alarm clock entity from time platform to number platform (#141400)
* Move alarm clock entity from time platform to number platform

* Deprecate alarm clock time entity

* Don't update unique id

* Fix tests

* Fixable issues

* improvement

* Make the issues persistent
2025-03-26 14:46:07 +01:00
Denis Shulyaka
c974285490 Add Web search to OpenAI Conversation integration (#141426)
* Add Web search to OpenAI Conversation integration

* Limit search for gpt-4o models

* Add more tests
2025-03-26 09:36:05 -04:00
Michael Hansen
8db91623ec Add language scores websocket command (#140480)
* Add language scores websocket command

* Don't store language scores in snapshot

* Add language/country args for preferred lang

* Bump intents to 2025.3.24 for dash lang code
2025-03-26 14:07:15 +01:00
Michael Hansen
3eda5333b0 Add info websocket command to wyoming integration (#139982)
* Add info websocket command to wyoming integration

* Add snapshot

* Add config schema

* Remove snapshots because of changing config entry ids
2025-03-26 14:06:51 +01:00
Robert Resch
3aaf859985 Add state class MEASUREMENT_ANGLE to wind direction sensor (#141392)
* Add state class MEASUREMENT_ANGLE to wind direction sensor

* Update snapshots

* Add some more
2025-03-26 13:58:23 +01:00
Sanjay Govind
dba4c197c8 Add bosch_alarm integration (#138497)
* Add bosch_alarm integration

* Remove other platforms for now

* update some strings not being consistant

* fix sentence-casing for strings

* remove options flow and versioning

* clean up config flow

* Add OSI license + tagged releases + ci to bosch-alarm-mode2

* Apply suggestions from code review

Co-authored-by: Josef Zweck <josef@zweck.dev>

* apply changes from review

* apply changes from review

* remove options flow

* work on fixtures

* work on fixtures

* fix errors and complete flow

* use fixtures for alarm config

* Update homeassistant/components/bosch_alarm/manifest.json

Co-authored-by: Josef Zweck <josef@zweck.dev>

* fix missing type

* mock setup entry

* remove use of patch in config flow test

* Use coordinator for managing panel data

* Use coordinator for managing panel data

* Coordinator cleanup

* remove unnecessary observers

* update listeners when error state changes

* Update homeassistant/components/bosch_alarm/coordinator.py

Co-authored-by: Josef Zweck <josef@zweck.dev>

* Update homeassistant/components/bosch_alarm/quality_scale.yaml

Co-authored-by: Josef Zweck <josef@zweck.dev>

* Update homeassistant/components/bosch_alarm/config_flow.py

Co-authored-by: Josef Zweck <josef@zweck.dev>

* rename config flow

* Update homeassistant/components/bosch_alarm/quality_scale.yaml

Co-authored-by: Josef Zweck <josef@zweck.dev>

* add missing types

* fix quality_scale.yaml

* enable strict typing

* enable strict typing

* Add test for alarm control panel

* add more tests

* add more tests

* Update homeassistant/components/bosch_alarm/coordinator.py

Co-authored-by: Josef Zweck <josef@zweck.dev>

* Update homeassistant/components/bosch_alarm/coordinator.py

Co-authored-by: Josef Zweck <josef@zweck.dev>

* Update homeassistant/components/bosch_alarm/alarm_control_panel.py

Co-authored-by: Josef Zweck <josef@zweck.dev>

* Update homeassistant/components/bosch_alarm/alarm_control_panel.py

Co-authored-by: Josef Zweck <josef@zweck.dev>

* Update homeassistant/components/bosch_alarm/alarm_control_panel.py

Co-authored-by: Josef Zweck <josef@zweck.dev>

* Add snapshot test

* add snapshot test

* add snapshot test

* update quality scale

* update quality scale

* update quality scale

* update quality scale

* Apply suggestions from code review

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* apply changes from code review

* apply changes from code review

* apply changes from code review

* Apply suggestions from code review

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* apply changes from code review

* apply changes from code review

* Fix alarm control panel device name

* Fix

* Fix

* Fix

* Fix

---------

Co-authored-by: Josef Zweck <josef@zweck.dev>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-03-26 13:56:44 +01:00
Robert Resch
f842640249 Add check that sensor state classes are used only with valid unit of measurements (#141444) 2025-03-26 13:52:00 +01:00
Robert Resch
aa493ff97d Correct device class and state class for wind direction sensors (#141393)
* Fix state class on wind direction sensors

* Update snapshots
2025-03-26 13:48:08 +01:00
Joost Lekkerkerker
21d5885ded Add select entity for dishwasher operating state in SmartThings (#141468)
* Add select entity for dishwasher operating state in SmartThings

* Add select entity for dishwasher operating state in SmartThings
2025-03-26 13:39:36 +01:00
Tsvi Mostovicz
054b3bb26c Add service for counting the omer (#141008)
* Add service for counting the omer

* Add description and strings. Expect string from user

* Fix constraints on nusach and language + Make independent of config_entry

* Provide config schema

* Fix services.yaml and strings.json to match updated service.py

* Use LanguageSelector and some constants

* Action description -> third-person singular

* Use built-in language selector in yaml

* Fix schema

* Show the hebrew date in the correct language in the response

* Revert "Show the hebrew date in the correct language in the response"

This reverts commit 59442d16c5.

Requires a bugfix in the original library

* Don't return the hebrew date as it doesn't return correctly
2025-03-26 13:38:58 +01:00
Jan Bouwhuis
77bf977d63 Add sensor as entity platform on MQTT subentries (#139899)
* Add sensor as entity platform on MQTT subentries

* Fix typo

* Improve device class data description

* Tweak

* Rework reconfig calculation

* Filter out last_reset_value_template if state class is not total

* Collapse expire after as advanced setting

* Update suggested_display_precision translation strings

* Make options and last_reset_template conditional, use sections for advanced settings

* Ensure options are removed properly

* Improve sensor options label, ensure UOM is set when device class has units

* Use helper to apply suggested values from component config

* Rename to `Add option`

* Fix schema builder not hiding empty sections and removing fields excluded from reconfig

* Do not hide advanced settings if values are available or are defaults

* Improve spelling and Learn more links

* Improve unit of measurement validation

* Fix UOM selector and translation strings

* Address comments from code review

* Remove stale comment

* Rename selector constant, split validator

* Simplify config validator

* Return tuple with config and errors for config validation
2025-03-26 13:34:24 +01:00
Robert Resch
3f68e327f3 Bump uv to 0.6.10 (#141464) 2025-03-26 13:30:57 +01:00
Marc Mueller
82db1ffd12 Update typing-extensions to 4.13.0 (#141465) 2025-03-26 13:28:46 +01:00
Allen Porter
06f6c86ba5 Simplify roborock map storage test fixture (#141430) 2025-03-26 08:19:48 -04:00
Robert Resch
e3f2f30395 Add circular mean statistics and sensor state class MEASUREMENT_ANGLE (#138453)
* Add circular mean statistics

* fixes

* Add has_circular_mean and fix tests

* Fix mypy

* Rename to MEASUREMENT_ANGLE

* Fix kitchen_sink tests

* Fix sensor tests

* for testing only

* Revert ws command change

* Apply suggestions

* test only

* add custom handling for postgres

* fix recursion limit

* Check if column is already available

* Set default false and not nullable for has_circular_mean

* Proper fix to be backwards compatible

* Fix value is None

* Align with schema

* Remove has_circular_mean from test schemas as it's not required anymore

* fix wrong column type

* Use correct variable to reduce stats

* Add guard that the uom is matching a valid one from the state class

* Add some tests

* Fix tests again

* Use mean_type in StatisticsMetato difference between different mean type algorithms

* Fix leftovers

* Fix kitchen_sink tests

* Fix postgres

* Add circular mean test

* Add mean_type_changed stats issue

* Align the attributes with unit_changed

* Fix mean_type_change stats issue

* Add missing sensor recorder tests

* Add test_statistic_during_period_circular_mean

* Add mean_weight

* Add test_statistic_during_period_hole_circular_mean

* Use seperate migration step to null has_mean

* Typo ARITHMETIC

* Implement requested changes

* Implement requested changes

* Split into #141444

* Add StatisticMeanType.NONE and forbid that mean_type can be None

* Fix mean_type

* Implement requested changes

* Small leftover of latest StatisticMeanType changes
2025-03-26 13:15:58 +01:00
Brett Adams
4a6d2c91da Bump tesla-fleet-api to v1.0.16 (#140869)
* Add streaming climate

* fixes

* Add missing changes

* Fix restore

* Update homeassistant/components/teslemetry/climate.py

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* Use dict

* Add fan mode translations

* Infer side

* WIP

* fix deps

* Migration in progress

* Working

* tesla-fleet-api==1.0.15

* tesla-fleet-api==1.0.16

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-03-26 12:28:16 +01:00
Simone Chemelli
d7de8c5f68 Add full test coverage for Comelit coordinator (#141321)
* Add full test coverage for Comelit coordinator

* add common const

* apply review comment
2025-03-26 13:21:58 +02:00
Norbert Rittel
7bcba2b639 Fix online docs URL in motionblinds plus gateway naming (#141453)
* Fix online docs URL in `motionblinds` plus gateway naming

- add missing "api" to the online docs URL to make it work
- fix sentence-casing of "API key"
- replace "Motion Gateway" with "Motionblinds gateway" as there is no brand "Motion" and the list of compatible bridges cover a lot more brands

* Replace comma with period to improve readability
2025-03-26 13:11:49 +02:00
Maciej Bieniek
53990f8fad Do not show the firmware changelog for Shelly Wall Display X2 update entities (#141457)
There is no firmware changelog for Wall Display X2
2025-03-26 12:11:09 +01:00
Joost Lekkerkerker
ed7c864869 Add switch for icemaker in SmartThings (#141313)
* Add switch for icemaker in SmartThings

* Fix
2025-03-26 12:10:44 +01:00
Joost Lekkerkerker
74ff40e253 Deprecate SmartThings machine state sensors (#141363)
* Deprecate SmartThings machine state sensors

* Fix
2025-03-26 11:46:50 +01:00
TimL
57d02d7a17 Cleanups related to improved typing on radios objects (#141455)
* Improved handling of radio objects

* Drop get_radio helper

* Remove mock of get_radio in tests
2025-03-26 11:45:07 +01:00
TimL
043603c9be Add SMLIGHT sensor entities for second radio (#137403)
* Add sensors for second radio

* Add test for zigbee2 sensor

* Update homeassistant/components/smlight/sensor.py

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* drop useless replace

* Fix test failure

* Fix code coverage in config flow

* Update homeassistant/components/smlight/sensor.py

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* fix conversion of iterator to list

* Remove assert on radios

* simplify handling of radios further

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-03-26 11:34:44 +01:00
TimL
e10801af80 Bump pysmlight to v0.2.4 (#141450) 2025-03-26 11:28:25 +01:00
Simone Chemelli
f4fa4056ac Make BT support detection dynamic for Shelly RPC devices (#137323) 2025-03-26 11:17:54 +01:00
Joost Lekkerkerker
208e8ae451 Deprecate SmartThings switch entity (#141360)
* Deprecate SmartThings switch entity

* Apply suggestions from code review

Co-authored-by: Robert Resch <robert@resch.dev>

* Fix

* Revert "Apply suggestions from code review"

This reverts commit c6d39d38de.

* Revert "Revert "Apply suggestions from code review""

This reverts commit d92411c156.

* Fix

* Fix

---------

Co-authored-by: Robert Resch <robert@resch.dev>
2025-03-26 11:05:31 +01:00
TheJulianJES
02f8322ac1 Bump ZHA to 0.0.54 (#141447)
* Bump ZHA to 0.0.54

* Add strings for v2 quirk entities

* Adjust cover tests for new ZHA behavior

* Improve cover tests further
2025-03-26 11:55:18 +02:00
Norbert Rittel
e8158234a9 Fix grammar in spotify reauthentication error (#141451) 2025-03-26 11:45:55 +02:00
Norbert Rittel
7848c3cd79 Fixes to user-facing strings of cloudflare integration (#141452)
- fix sentence-casing of a few strings
- fix grammar of action description
2025-03-26 11:45:05 +02:00
Norbert Rittel
2d8420b656 Fix spelling of "serial number" in smappee (#141449) 2025-03-26 10:25:12 +01:00
Joost Lekkerkerker
63a86763b1 Migrate unique ids in SmartThings (#141308)
* Migrate unique ids in SmartThings

* Migrate

* Migrate

* Migrate

* Fix

* Fix
2025-03-26 10:23:20 +01:00
Michael
b5117eb071 Proper handling of unavailable Synology DSM nas during backup (#140721)
* raise BackupAgentUnreachableError when NAS is unavailable

* also raise BackupAgentUnreachableError during upload when nas unavailable

* Revert "also raise BackupAgentUnreachableError during upload when nas unavailable"

This reverts commit 38877d8540.

* Revert "raise BackupAgentUnreachableError when NAS is unavailable"

This reverts commit 4d8cfae396.

* check last_update_success of  coordinator_central to get backup agents

* consider last_update_success before notify backup listeners

* add test

* use walrus :=  :)
2025-03-26 10:22:43 +01:00
Norbert Rittel
f0c774a4bd Small grammar fixes in hue user strings (#141446)
… including proper sentence-casing
2025-03-26 11:16:10 +02:00
Simone Chemelli
8bedf97382 Remove helpers and align coding style in Shelly tests (#140080)
* Cleanup hass.states method in Shelly tests (part 1)

* remove helper functions and align coding style

* missed

* revert unwanted changes

* apply review comment

* apply review comment

* apply review comment

* apply ATTR where missing

* apply walrus

* add missed walrus

* add walrus to entity_registry.async_get

* minor tweak

* align after merge
2025-03-26 10:05:42 +01:00
Robert Resch
65c05d66c0 Use a constant for sensor statistics issues (#141441) 2025-03-26 09:43:09 +01:00
Norbert Rittel
1cb4332a3c Fix sentence-case and naming of "Security code" in tradfri (#141440) 2025-03-26 10:07:30 +02:00
Robert Resch
18dfd3db88 Simplify Reolink exception handling (#141427) 2025-03-26 08:53:46 +01:00
Luke Lashley
dd914deb47 Bump roborock to silver (#141433) 2025-03-26 08:36:07 +01:00
Michael
d954d04d12 Add diagnostics for Home Assistant Backup integration (#141407)
add diagnostics platform
2025-03-26 08:34:15 +01:00
Erik Montnemery
e95f2c4282 Fix log level of cast print informing users to contribute model number (#141438) 2025-03-26 08:28:57 +01:00
Franck Nijhof
eb1caeb770 Add template list functions: intersect, difference, symmetric_difference, union (#141420) 2025-03-26 07:51:25 +01:00
Ivan Lopez Hernandez
56cc4044e4 Fix a type error when using google-genai==1.7.0 (#141431)
* Fix parts

* Fix the type being sent to the SDK

* Revert changes to __init__

* Test fixes

* Bump version back to 1.7
2025-03-25 19:59:21 -07:00
Thomas D
2208650fde Add climate platform to qbus (#139327)
* Add climate platform

* Add unit tests for climate platform

* Use setup_integration fixture

* Apply new import order

* Undo import order

* Code review

* Throw an exception on invalid preset mode

* Let device response determine state

* Remove hvac mode OFF

* Remove hvac mode OFF

* Setup debouncer when being added to hass

* Fix typo
2025-03-26 00:25:05 +00:00
Tsvi Mostovicz
e2a3bfca9a Jewish calendar migration bugfix (#141425)
Fix migration of Jewish calendar
2025-03-26 01:33:38 +02:00
starkillerOG
840613f43d Add mac to Reolink IPC cam device info (#140822)
* Add mac to Reolink IPC cams

* Add test

* check mac none
2025-03-26 00:31:01 +01:00
starkillerOG
e78a19ae3e Reolink translate key (#140821)
* Add firmware exception translations

* Add test

* Much nicer syntax

* Check if translation key is present in string.json

* fix tests

* fix typo
2025-03-26 00:30:02 +01:00
Norbert Rittel
07bce8850f Capitalize one occurrence of "bluetooth" in idasen_desk (#141423)
All others are correct in the integration.

And (according to Lokalise) in Home Assistant now, too. :-)
2025-03-25 22:53:32 +00:00
Alexey ALERT Rubashёff
25a36c1588 Add AtlanticDomesticHotWaterProductionV2IOComponent to Overkiz (#139524) 2025-03-25 23:05:14 +01:00
Andrew Sayre
ab709aeb46 Add Get Queue HEOS entity service (#141150) 2025-03-25 16:55:44 -05:00
J. Diego Rodríguez Royo
f3bcb96b41 Tiny Home Connect tweaks (#141403) 2025-03-25 22:06:38 +01:00
Norbert Rittel
56a8c74e87 Capitalize "Bluetooth proxy" in private_ble_device integration (#141418) 2025-03-25 22:05:24 +01:00
Norbert Rittel
cec21b5507 Capitalize "Bluetooth" in motionblinds_ble user strings (#141419) 2025-03-25 22:03:32 +01:00
Joost Lekkerkerker
3a62095af2 Add power binary sensor for dishwasher in SmartThings (#141417)
Add power binary sensor for dishwasher
2025-03-25 21:49:38 +01:00
Shay Levy
8dd179c9e0 Fix Ecoforest spelling of "convector" air flow sensor (#141414) 2025-03-25 21:24:44 +01:00
Joost Lekkerkerker
c29ca4c50a Add power binary sensor for microwave in SmartThings (#141415)
Add power binary sensor for microwave
2025-03-25 21:24:01 +01:00
Brett Adams
013439f7c6 Add streaming to Climate platform in Teslemetry (#138689)
* Add streaming climate

* fixes

* Add missing changes

* Fix restore

* Update homeassistant/components/teslemetry/climate.py

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* Use dict

* Add fan mode translations

* Infer side

* Apply suggestions from code review

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* Update homeassistant/components/teslemetry/climate.py

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-03-25 21:09:45 +01:00
Norbert Rittel
646c97a26c Fix spelling / grammar in sensibo strings (#141130)
- capitalize "ID"
- remove excessive space and comma
- remove excessive "the"
2025-03-25 21:06:44 +01:00
elmurato
e853df4fb0 Add Pterodactyl integration (#141197)
* Add Pterodactyl integration

* Remove translation for unavailable platform sensor, use constant for host

* Improve data descriptions

* Replace index based handling of data (list) with dict[str, PterodactylData]

* Replace CONF_HOST with CONF_URL

* Parse URL with YARL

* Set proper availability in binary sensor

* Remove storage of data within api.py

* Fix some review findings

* Use better unique ID for binary_sensor

* Fix more review findings

* Fix remaining review findings

* Add wrapper for server and util API, use underscore in unique ID

* Reuse result in config flow tests

* Patch async_setup_entry in config_flow tests

* Move patching of library APIs to the fixture mock_pterodactyl
2025-03-25 20:50:03 +01:00
Norbert Rittel
4cd4201a31 Add missing "r" in "Convector air flow" sensor of ecoforest (#141410)
Add lost "r" in "Convector air flow" sensor of `ecoforest`
2025-03-25 20:49:20 +01:00
Shay Levy
5db52cd5df Add data description for Shelly Bluetooth scanner mode (#141409) 2025-03-25 21:43:46 +02:00
Norbert Rittel
10d9e0c684 Fix missing capitalization in two strings of nobo_hub (#141404)
Fix missing capitalization of two strings in `nobo_hub`
2025-03-25 21:25:04 +02:00
tdfountain
8b9939c344 Remove invalid watts sensor from NUT (#141401) 2025-03-25 09:04:07 -10:00
Marc Mueller
746f49884c Update setuptools for build-system to 77.0.3 (#141394) 2025-03-25 18:39:06 +00:00
Michael Hansen
ae18fa2e30 Add start conversation support to ESPHome (#141387) 2025-03-25 13:38:52 -05:00
Michael Hansen
7319637bd5 Set responding state in assist satellite start_conversation (#141388)
* Set responding state in async_start_conversation

* Check idle state
2025-03-25 14:30:44 -04:00
Simone Chemelli
c8745cc339 Add full test coverage for Vodafone Station button platform (#141298) 2025-03-25 20:19:00 +02:00
G Johansson
44a02ac7a7 Bump holidays to 0.69 (#141391) 2025-03-25 18:52:31 +01:00
Joost Lekkerkerker
73642da7a4 Add sensor for brightness intensity to SmartThings (#141368) 2025-03-25 18:45:10 +01:00
J. Nick Koston
e1eb031022 Bump orjson to 3.10.16 (#141339)
changelog: https://github.com/ijl/orjson/compare/3.10.15...3.10.16
2025-03-25 18:44:00 +01:00
G Johansson
db66b4093a Bump psutil to 7.0.0 (#141390) 2025-03-25 07:27:17 -10:00
Maciej Bieniek
ef531cec41 Add data description for Shelly config flow (#141383) 2025-03-25 17:26:13 +01:00
Huyuwei
1772348eef Add illuminance sensor to SwitchBot integration (#141382)
* Add illuminance sensor to SwitchBot integration

* Add WoHub2 sensor tests
2025-03-25 17:09:51 +01:00
Maciej Bieniek
0920d7d82d Set PARALLEL_UPDATES in IMGW-PIB sensor platform (#141386) 2025-03-25 16:09:33 +00:00
Joost Lekkerkerker
2cbe8a4a14 Add translations to Hue effects (#138990)
* Add translations to Hue effects

* Add translations to Hue effects

* Add more effects

* Fix

* Trigger build
2025-03-25 17:01:25 +01:00
Mick Vleeshouwer
a2f92b1e28 Add battery discrete level sensor to Overkiz (#141328) 2025-03-25 17:19:06 +02:00
Norbert Rittel
a2d9eb2a5b Sentence-case "TOTP secret" in opower config flow (#141384)
… and replace the second occurrence with a reference.
2025-03-25 17:17:57 +02:00
Huyuwei
e72231037e Bump PySwitchBot to 0.58.0 (#141378) 2025-03-25 17:12:01 +02:00
starkillerOG
37aaf149f9 Bump reolink-aio to 0.13.0 (#141379)
* Bump reolink-aio to 0.13.0

* Add push cmd_id 588
2025-03-25 17:09:51 +02:00
Joost Lekkerkerker
83c21570c8 Support TVs in SmartThings (#141366) 2025-03-25 17:05:35 +02:00
Marc Mueller
42566b7378 Update pytest-asyncio to 0.26.0 (#141365) 2025-03-25 17:03:10 +02:00
Maciej Bieniek
735f877cf1 Add data description for IMGW-PIB config flow (#141381)
* Add data description for IMGW-PIB config flow

* Better wording
2025-03-25 16:57:37 +02:00
Simone Chemelli
8f000f222d Bump aiocomelit to 0.11.3 (#141375) 2025-03-25 15:50:40 +01:00
Shay Levy
05ead4d1f5 Initialize Shelly runtime_data in async_setup_entry (#141315) 2025-03-25 16:43:48 +02:00
Maikel Punie
3775f15461 Fix Velbus translations (#141372) 2025-03-25 14:37:21 +01:00
Joost Lekkerkerker
20a2fdb660 Create separate httpx client for Discovergy (#141374) 2025-03-25 09:32:25 -04:00
David Badura
e49b105724 Align Matter eve thermo offset max range with eve app (#140579)
* align eve thermo offset max range with eve app

* fix tests
2025-03-25 14:22:32 +01:00
Noah Groß
19bc54c1de Bump python-picnic-api2 from 1.2.2 to 1.2.4 (#141353) 2025-03-25 14:12:07 +01:00
dependabot[bot]
3e018f2523 Bump home-assistant/wheels from 2025.02.0 to 2025.03.0 (#141359) 2025-03-25 13:51:11 +01:00
Piotr Machowski
f00fb1d9a3 Add media_player support to SmartThings integration (#141296)
* Initial soundbar support

* Soundbar support

* Add SAMSUNG_VD_AUDIO_INPUT_SOURCE capability

* Adjust setting input source

* Add unit tests for media_player platform

* Adjust code after merge

* Adjust code after merge

* Adjust code style

* Adjust code style

* Fix

* Fix

---------

Co-authored-by: Piotr Machowski <PiotrMachowski@users.noreply.github.com>
Co-authored-by: Joostlek <joostlek@outlook.com>
2025-03-25 13:34:19 +01:00
jukrebs
0ddf3c794b Add attachment and connection status for IOmeter (#140998)
* add binary sensors

* fix: suggestion value_fn

* add snapshot test and split cases
2025-03-25 13:26:07 +01:00
Maikel Punie
77c210fb87 Velbus add missing translations (#141358)
Fix the translation items for Velbus
2025-03-25 13:05:46 +01:00
Norbert Rittel
17efff940a Fix missing capitalization of two strings in mysensors (#141356)
… and replace both duplicates with identical references.
2025-03-25 12:49:43 +01:00
Shay Levy
32a16ae0f0 Make UnitSystem a frozen dataclass (#140954)
* Make UnitSystem a frozen dataclass

* Use super() for attribute setting in UnitSystem class
2025-03-25 11:45:54 +01:00
Artur Pragacz
3766040960 Promote after dependencies in bootstrap (#140352) 2025-03-25 11:34:53 +01:00
adam-the-hero
a1a808b843 Add EventEntity for Auto Shut Off events in Watergate integration (#135675)
* Add EventEntity for Auto Shut Off events in Watergate integration

* Split events into two: volume and duration

* Add icons to json. Extract some common translation keys. Simplify tests

* Apply suggestions from code review

* Fix

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-03-25 10:53:36 +01:00
starkillerOG
e7eb173e07 Add Reolink smart ai number entities (#140417) 2025-03-25 10:49:10 +01:00
Joost Lekkerkerker
615afeb4d5 Log bare exceptions in the config flow (#135584)
* Log bare exceptions in the config flow

* add more

* Fix
2025-03-25 10:34:05 +01:00
Manu
348ebe1402 Adds create_daily action to Habitica integration (#140684)
Add create_daily action
2025-03-25 10:27:21 +01:00
J. Diego Rodríguez Royo
d20fc30409 Add missing events to Home Connect (#141323)
* Add missing events to Home Connect

* Unsort

* Unsort strings also
2025-03-25 10:11:35 +01:00
pglab-electronics
13f306ddbc Add cover support to PG LAB integration (#140290)
* Add cover support to PG LAB Electronics integration

* check shutter none state in is_closing and is_opening

* adding a loop instead of test test single cover individually
2025-03-25 09:55:11 +01:00
Erik Montnemery
36d32eaabc Improve backup exclude filters (#141311)
* Improve backup exclude filters

* Add comment
2025-03-25 09:52:45 +01:00
Jan Bouwhuis
4f6daa227a Move MQTT light constants to const module (#140945) 2025-03-25 09:34:44 +01:00
Ted van den Brink
b3e054d5a7 Fix for whois - quota exceeded and private registry (#141060)
* Fix for quota exceeded and private registry

* Add tests
2025-03-25 09:24:32 +01:00
Abílio Costa
5fd219fc9e Add Motionblinds Matter virtual integration (#140812)
* Add Motionblinds Matter virtual integration

* Change to iot_standards instead of virtual integration
2025-03-25 08:41:02 +01:00
Matrix
4e266fe56e Bump YoLink API to 0.4.9 fix fob event (#141343)
Fix Fob Event
2025-03-25 08:39:58 +01:00
dependabot[bot]
c7e2acb4bf Bump actions/setup-python from 5.4.0 to 5.5.0 (#141342)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5.4.0 to 5.5.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5.4.0...v5.5.0)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-25 08:38:13 +01:00
dependabot[bot]
9888385dbe Bump github/codeql-action from 3.28.12 to 3.28.13 (#141344)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.28.12 to 3.28.13.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v3.28.12...v3.28.13)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-25 08:37:55 +01:00
Joost Lekkerkerker
11877a3b12 Bump pysmartthings to 3.0.0 (#141058)
* Bump pysmartthings to 2.7.5

* Bump to pysmartthings 3.0.0
2025-03-25 08:37:32 +01:00
tdfountain
ee3b31c01f Improve default icons for sensors in NUT (#141255) 2025-03-24 19:12:26 -10:00
tdfountain
598a75379b Add sensor native unit of measure in NUT (#141338) 2025-03-24 19:11:13 -10:00
Allen Porter
f864f71028 Remove nest event media files that are no longer referenced (#141295)
* Remove nest event media files that are no longer referenced

* Fix double glob
2025-03-24 21:08:54 -04:00
Allen Porter
204b1e1f24 Add a Google Calendar birthdays calendar (#141300) 2025-03-24 21:06:45 -04:00
Mick Vleeshouwer
b2377d6da3 Bump pyOverkiz to version 1.16.5 (#141326)
Bump pyoverkiz to version 1.16.5
2025-03-24 23:28:37 +00:00
J. Nick Koston
d657809ffe Bump annotatedyaml to 0.4.5 (#141316) 2025-03-24 11:04:54 -10:00
Michael Hansen
33198cd704 Add preannounce_media_id to Assist Satellite (#141317)
Add preannounce_media_id
2025-03-24 17:04:13 -04:00
Andrew Scott
61a76b4064 Jellyfin: display album primary art instead of artist backdrop (#141246)
* Jellyfin: Properly display album primary art instead of artist backdrop when playing music

* add test for album art urls, fix existing tests that broke because they have extraneous "album*" fields for non-album items.

* fix snapshot test
2025-03-24 21:33:34 +01:00
Thomas D
0e6d72dcc8 Let device response determine state in Qbus (#141302)
Let device response determine state
2025-03-24 19:26:02 +00:00
SLaks
c8f839068c Bump google-genai to 1.7.0 (#140770)
Gemini: Upgrade google-genai to support generating images
2025-03-24 10:52:16 -07:00
Erik Montnemery
3132cba51f Improve tests of backup exclusion (#141303) 2025-03-24 18:10:08 +01:00
Simone Chemelli
6661218220 Add device reconfigure to Vodafone Station config flow (#141221)
* Add device reconfigure to Vodafone Station config flow

* remove unreachable code

* apply review comment
2025-03-24 12:03:29 -05:00
Artur Pragacz
8904f174d2 Remove unused util module in conversation (#141293) 2025-03-24 17:27:27 +01:00
Michael Hansen
4472dc533d Don't filter nevermind for fallback (#141294) 2025-03-24 17:26:35 +01:00
Erik Montnemery
9fdb69c558 Remove the zengge integration (#141283) 2025-03-24 17:22:52 +01:00
Artur Pragacz
93561543ff Improve code quality of condition validation (#141292)
Streamline condition validation
2025-03-24 17:21:32 +01:00
Maciej Bieniek
1166c9d927 Do not return router as source_type for Tractive device_tracker entity (#141188)
* Do not return router as source_type

* Add test

* Update stale docstring

---------

Co-authored-by: Andrew Sayre <6730289+andrewsayre@users.noreply.github.com>
2025-03-24 17:16:59 +01:00
Maciej Bieniek
95cc3e31f5 Add exceptions translations for Shelly integration (#141071)
* Add exceptions translations

* Improve exception strings for update platform

* Fix tests

* Improve device_communication_error

* Remove error placeholder

* Improve tests

* Fix test_rpc_set_state_errors

* Strings improvement

* Remove `device`

* Remove `entity`

* Fix tests
2025-03-24 17:16:29 +01:00
puddly
5f093180ab Include hardware integrations in the cached integrations.json (#139001)
Include hardware integrations in the cached integrations JSON
2025-03-24 17:15:02 +01:00
Thomas55555
c3bab1f316 Add downtime and uptime sensors for Husqvarna Automower (#140804)
* Add downtime and uptime sensors for Husqvarna Automower

* add strings
2025-03-24 11:08:39 -05:00
Norbert Rittel
e9cf4a209e Fix typos in smartthings binary sensor deprecation messages (#141299)
Fix typos in 'smartthings` binary sensor deprecation messages
2025-03-24 18:01:19 +02:00
Denis Shulyaka
cb9692f3fb Raise error when max tokens reached for openai_conversation (#140214)
* Handle ResponseIncompleteEvent

* Updated error text

* Fix tests

* Update conversation.py

* ruff

* More tests

* Handle ResponseFailed and ResponseError

---------

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2025-03-24 15:49:34 +01:00
Joost Lekkerkerker
90623bbaff Deprecate fridge door sensor in SmartThings (#141275) 2025-03-24 15:49:10 +01:00
Joost Lekkerkerker
69a375776a Add wrinkle prevent binary sensor active to SmartThings (#141289)
* Add wrinkle prevent binary sensor active to SmartThings

* Fix
2025-03-24 15:48:18 +01:00
Joost Lekkerkerker
06382f33e0 Add command to SmartThings button unique id (#141281)
* Add command to SmartThings button unique id

* Add command to SmartThings button unique id
2025-03-24 15:42:26 +01:00
Norbert Rittel
b3e3d77d7c Fix spelling of "Power factor" and capitalization in enphase_envoy (#141285)
* Fix spelling of "Power factor" and capitalization in `enphase_envoy`

* Update test_sensor.ambr
2025-03-24 15:38:59 +01:00
Jan Bouwhuis
e192bfb62e Do not deepcopy section schema when applying suggested values (#141280)
Do not deep copy section schema when appying suggested values
2025-03-24 15:32:57 +01:00
Erwin Douna
358f78c7cd Tado migrate to OAuth Device Flow (#140761)
* Bump PyTado 0.19.0

* Initial setup

* Current state

* Update to PyTado 0.18.8

* First concept for review

* Fix

* Fix

* Fix

* First concept for review

* Bump PyTado to 0.18.9

* Remove redundant part

* Initial test setup

* Authentication exceptions

* Fix

* Fix

* Fix

* Update version to 2

* All migration code

* Small tuning

* Add reauth unique ID check

* Add reauth test

* 100% on config flow

* Making tests working on new device flow

* Fix

* Fix

* Fix

* Update homeassistant/components/tado/strings.json

* Update homeassistant/components/tado/strings.json

---------

Co-authored-by: Joostlek <joostlek@outlook.com>
Co-authored-by: Josef Zweck <josef@zweck.dev>
2025-03-24 14:28:12 +01:00
Simone Chemelli
83a0ed4250 Update Vodafone Station quality scale (#141196) 2025-03-24 13:57:08 +01:00
Franck Nijhof
fa526552dc Merge branch 'master' into dev 2025-03-24 12:08:05 +00:00
Michael
e96e95c32d Add sensor platform to backup integration (#138663)
* add sensor platform to backup integration

* adjust namings, remove system integration flag

* add first simple test

* apply review comments

* fix test

* add sensor tests

* adjustements to use backup helper

* remove obsolet async_get_manager from init

* unsubscribe from events on entry unload

* add configuration_url

* fix doc string

* fix sensor tests

* mark async_unsubscribe as callback

* set integration_type service

* extend sensor test

* set integration_type on correct integration :)

* fix after online conflict resolution

* add sensor update tests

* simplify the sensor update tests

* avoid io during tests

* Add comment

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-03-24 12:54:16 +01:00
Joost Lekkerkerker
265a2ace90 Add Bubble soak switch to SmartThings (#141139)
* Add Bubble soak switch to SmartThings

* Fix
2025-03-24 12:43:53 +01:00
karwosts
1ae2cebeb1 Support for hierarchy of individual energy devices (#132616)
* Support for hierarchy of individual energy devices

* update DeviceConsumption dict

* change name parent to 'included_in'

* Break comment

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-03-24 12:37:55 +01:00
Martin Hjelmare
75cd32b742 Fix backup tests typing warnings (#141274) 2025-03-24 12:36:57 +01:00
Martin Hjelmare
86ff540db9 Patch Z-Wave platforms in custom event tests (#141268)
Patch Z-Wave platforms in custom events tests
2025-03-24 12:19:29 +01:00
tronikos
f4bc1a3545 Bump androidtvremote2 to 0.2.1 (#141259) 2025-03-24 13:04:47 +02:00
tronikos
4e6eecf11b Retry Google Cloud exceptions (#141266) 2025-03-24 11:27:59 +01:00
Jan Bouwhuis
0f60fd8c40 Test data entry flow form showing suggested values (#141249)
Add test with from showing suggested values to data entry flow tests
2025-03-24 10:36:02 +01:00
Simon Lamon
b4fd5339c6 Bump linkplay to v0.2.1 (#141260) 2025-03-24 10:45:09 +02:00
Erik Montnemery
ab9d29bf9d Remove reauth persistent notification (#140932)
* Remove persistent notification created when starting reauth

* Update netatmo tests
2025-03-24 09:29:14 +01:00
Joost Lekkerkerker
12e001cf2b Add binary sensors for fridge doors in SmartThings (#141252)
* Add binary sensors for fridge doors

* Add binary sensors for fridge doors

* Add binary sensors for fridge doors

* Add binary sensors for fridge doors
2025-03-24 10:28:10 +02:00
Norbert Rittel
590c588557 Fix sentence-casing and change to "1-Wire" in onewire strings (#141265)
* Fix sentence-casing in a few `onewire` strings

* Change "OneWire" to "1-Wire"
2025-03-24 10:25:13 +02:00
Pieter Viljoen
d65392a374 ConfigSubEntryFlow _get_reconfigure_entry() -> _get_entry() (#141017)
* ConfigSubEntryFlow _get_reconfigure_entry() -> _get_entry()

* Update MQTT test

* Fix test_config_entries

* Minimize changes to keep existing tests working

* Re-revert and update negative test instead
2025-03-24 09:24:43 +01:00
Simon Lamon
0514de3e16 Remove manufacturer data for linkplay (#141261)
Remove manufacturer data
2025-03-24 09:13:06 +01:00
tronikos
59190786f9 Bump gassist-text to 0.0.12 (#141244) 2025-03-24 00:46:30 -07:00
Erik Montnemery
f4d57e3722 Add cloud onboarding views (#139422)
* Add cloud onboarding views

* Break import cycle when running hassfest

* Add exemption to hassfest for onboarding using cloud

* Adjust according to discussion

* Fix copy-paste errors

* Add tests

* Fix stale docstring

* Import cloud loally
2025-03-24 08:41:19 +01:00
Mirko Liebender
d3b8dbb76c Google gen ai fix for empty chat log messages (#136019) (#140315)
* Google gen ai fix for empty chat log messages (#136019)

* Google gen ai test for empty chat history fields (#136019)
2025-03-23 22:27:35 -07:00
Ivan Lopez Hernandez
6a7fa3769d Add Google Search tool in Google Generative AI (#140772)
* Added Google Search grounding

* Added testing
2025-03-23 22:23:52 -07:00
tdfountain
af96fedc0f Alphabetize key lists for strings, icons and sensors in NUT (#141254) 2025-03-23 15:58:41 -10:00
Joost Lekkerkerker
174515d197 Use common translation string in SmartThings (#141250) 2025-03-23 23:18:40 +01:00
Norbert Rittel
693de289a2 Fix descriptions of virtualkey and set_variable_value actions (#141175)
- fix the broken grammar ("presses" vs. "simulate") in the description of the `virtualkey` action by using the wording from the online docs instead
- fix the wrong description of the `set_variable_value` action by replacing it with the right one from the online docs
2025-03-23 23:03:58 +01:00
Thomas55555
b171439098 Bump aioautomower to 2025.3.2 (#141211)
* Bump aioautomower to 2025.3.2

* requirements

* adjust test
2025-03-23 22:19:16 +01:00
Jan Bouwhuis
93010ab5c9 Ensure suggested values are added to section schema in data entry fow (#141227) 2025-03-23 22:14:06 +01:00
Allen Porter
842356877e Bump mcp to 1.5.0 (#141219)
* Bump mcp to 1.5.0

* Add required server lifespan typing

* Remove comment about typing
2025-03-23 22:12:44 +01:00
Michael Hansen
2883f0a1e8 Bump intents to 2025.3.23 (#141241) 2025-03-23 22:12:05 +01:00
Patrick ZAJDA
27f529622c Switchbot: revert name set to none for temperature sensor (#141149) 2025-03-23 10:51:13 -10:00
J. Nick Koston
3917b460f4 Bump dbus-fast to 2.43.0 (#141240) 2025-03-23 10:48:34 -10:00
Norbert Rittel
ec5139eb94 Fix typo "to setup" in slide_local (#141216) 2025-03-23 21:12:45 +01:00
Robert Svensson
5d16a23d79 Bump pydeconz to v120 (#141239) 2025-03-23 10:00:27 -10:00
tdfountain
56cb54588e Set parallel updates in NUT (#141225) 2025-03-23 09:35:58 -10:00
Norbert Rittel
e2f7133d00 Fix spelling of "breadcrumbs" in sentry integration (#141189)
Replace "breadcrums" with "breadcrumps" as this is the spelling  that both Sentry and the HA online docs use.

Also use "events" instead of "logs" as the log is the whole and the events are its parts.
2025-03-23 21:26:45 +02:00
Maciej Bieniek
1f122ea54d Improve error handling and add exception translations for Nettigo Air Monitor integration (#141183)
* Add update_error

* Add device_communication_error

* Add auth_error

* Add device_communication_action_error

* Coverage
2025-03-23 21:23:11 +02:00
Norbert Rittel
ef84fc52af Clarify the meaning of "recorder" in energy issue description (#141228)
Clarify the meaning of "The recorder" in `energy` issue description

"The recorder" has resulted in a bunch of overtranslations that make this alert useless.

By using "Home Assistant Recorder" instead this should get fixed.
2025-03-23 21:21:18 +02:00
Norbert Rittel
9677b0d254 Capitalize "Recorder" as the component name in Home Assistant (#141226) 2025-03-23 21:09:52 +02:00
Norbert Rittel
1d36279e79 Use correct unit symbol "min" for minutes in systemmonitor integration (#141236)
* Use correct unit symbol "min" for minutes in `systemmonitor` integration

* Update test_sensor.ambr

* Remove accidentially added, excessive space character
2025-03-23 21:08:25 +02:00
Norbert Rittel
c2057d19c0 Capitalize "ID" and "URL" abbreviations in trafikverket_camera (#141238)
Make the spelling consistent throughout Home Assistant.
2025-03-23 21:05:15 +02:00
Norbert Rittel
d23a724f79 Fix typo "to setup" in reolink (#141214) 2025-03-23 19:28:45 +01:00
Allen Porter
28ef0a33ad Update MCP to reconnect to the server on demand (#141215)
* Reconnect to the MCP client on deman

* Remove debug log

* Update log messages
2025-03-23 12:11:40 -04:00
Allen Porter
c451518959 Fix google calendar working location event filtering (#141222) 2025-03-23 09:07:42 -07:00
Allen Porter
f14b76c54b Add Gemini/OpenAI token stats to the conversation trace (#141118)
* Add gemini token status to the conversation trace

* Add OpenAI Token Stats

* Revert input_tokens_details since its not in the openai version yet

* Fix ruff lint errors
2025-03-23 12:03:06 -04:00
Artur Pragacz
663a204c04 Fix Python path for vscode run core task (#141090)
Fix Python path for vscode launch core task
2025-03-23 12:01:35 -04:00
Norbert Rittel
a6ff5391e5 Fix typo "to setup" in homeassistant_hardware (#141212)
Fix typo "to setup" in multiple integrations
2025-03-23 17:26:28 +02:00
Norbert Rittel
3df1ebf2fc Fix typo "to setup" and sentence-casing in twilio (#141218) 2025-03-23 17:25:05 +02:00
Simon Lamon
5f3344cd3d Bump linkplay to v0.2.0 (#141098)
* Bump linkplay to v0.2.0

* Fix invalid reference on items()

* Ruff
2025-03-23 16:27:40 +02:00
Norbert Rittel
56f553e352 Clarify meaning of "level" in dynalite.request_channel_level action (#141184)
Without context it's very difficult to come up with a good translation of "level" as there are many different words for this in other languages.

This commit adds "brightness" to explain the meaning of "channel level" in `dynalite`.
2025-03-23 16:26:44 +02:00
J. Nick Koston
8869236e9c Bump google-cloud-pubsub to 2.29.0 (#141178)
changelog: https://github.com/googleapis/python-pubsub/compare/v2.28.0...v2.29.0
2025-03-23 16:26:14 +02:00
Norbert Rittel
f94b55b608 Fixes to user-facing strings of azure_devops integration (#141208)
* Fixes to user-facing strings of `azure_devops` integration

- capitalize abbreviations "ID" and "URL"
- sentence-case "project"
- consistently capitalize "Personal Access Token" as a name

* Update test_sensor.ambr
2025-03-23 16:22:57 +02:00
Martin Hjelmare
fdaba003ce Patch Z-Wave platforms in event tests (#141209) 2025-03-23 16:22:18 +02:00
Norbert Rittel
703848766a Capitalize "URL" in feedreader error message (#141210) 2025-03-23 16:21:48 +02:00
Shay Levy
ba8ec22587 Add Switcher missing data descriptions (#141077) 2025-03-23 16:20:37 +02:00
Michael
6b724603c8 Remove orphan fuel type settings from Tankerkoening (#141207)
remove orphan fule type settings
2025-03-23 15:01:53 +01:00
Simone Chemelli
2465d0db7b Cleanup Vodafone Station strings (#141202) 2025-03-23 14:52:22 +01:00
Norbert Rittel
4758452e92 Use correct unit symbol "min" for minutes in asuswrt integration (#141206)
* Use correct unit symbol "min" for minutes in `asuswrt` integration

* Sentence-case all "temperature" sensors
2025-03-23 15:35:59 +02:00
Martin Hjelmare
588d6ad4cf Patch Z-Wave platforms in cover tests (#141205) 2025-03-23 15:35:29 +02:00
Norbert Rittel
c7d1e5a28c Fix spelling of "Do you want to set up?" in airgradient (#141199) 2025-03-23 15:17:32 +02:00
Norbert Rittel
8874fbe9c7 Fix sentence-casing of "Station radius" in airnow (#141200) 2025-03-23 15:16:54 +02:00
Norbert Rittel
ef2485be3b Fix sentence-casing in part of airq sensor names (#141203) 2025-03-23 15:15:41 +02:00
Martin Hjelmare
34504f45a5 Patch Z-Wave platforms in climate tests (#141204) 2025-03-23 15:15:09 +02:00
Artur Pragacz
798ee60ae5 Make variables action not restricted to local scopes (#141114)
Make variables action in scripts not restricted to local scopes
2025-03-23 14:07:52 +01:00
Simone Chemelli
ca10618dc7 Update strings for Comelit (#140925)
* Update strings for Comelit

* apply review comment

* apply review comment

* Update homeassistant/components/comelit/strings.json

Co-authored-by: Michael <35783820+mib1185@users.noreply.github.com>

---------

Co-authored-by: Michael <35783820+mib1185@users.noreply.github.com>
2025-03-23 12:50:02 +01:00
Simone Chemelli
77f8ddd948 Fix climate and humidifier platform for Comelit (#140611)
fix climate and humidifier platform for Comelit
2025-03-23 12:32:38 +01:00
Norbert Rittel
5c642ef626 Fix spelling of user-facing strings in adax integration (#141190)
- capitalize "Bluetooth" and "LED"
- sentence-case "Wi-Fi password"
2025-03-23 13:21:07 +02:00
Michael
489c486278 Rework Synology DSM to use config entry runtime_data (#141084)
rework to use config entry runtime_data
2025-03-23 12:05:40 +01:00
J. Diego Rodríguez Royo
d8a5881eaa Home Connect test improvements (#141135)
* Home Connect test improvements

* Remove `appliance_ha_id` fixture in favour of `appliance` fixture
2025-03-23 11:33:55 +01:00
Nerdix
883ce6842d Fix icon for "Coffee and Milk counter" in HomeConnect (#141170)
fix coffee and milk counter
2025-03-23 10:28:10 +01:00
Allen Porter
3a80a2d5b9 Bump openai to 1.68.2 (#141154)
* Bump openai to 1.68.2

* Remove unused type ignore
2025-03-22 23:12:02 -10:00
Luke Lashley
65279c94ac Finish strict typing for Roborock (#141165)
Mark strict typing as done
2025-03-22 23:07:22 -10:00
J. Nick Koston
87db981712 Bump anyio to 4.9.0 (#141161)
changelog: https://github.com/agronholm/anyio/compare/4.8.0...4.9.0
2025-03-23 10:34:49 +02:00
J. Nick Koston
153ccf86b0 Bump dbus-fast to 2.41.1 (#141162)
* Bump dbus-fast to 2.41.0

changelog: https://github.com/Bluetooth-Devices/dbus-fast/compare/v2.39.6...v2.41.0

* Apply suggestions from code review
2025-03-23 10:33:44 +02:00
tdfountain
9e86ca2e9e Add Switch platform and PDU dynamic outlet switches to NUT (#141159) 2025-03-22 19:27:52 -10:00
Luke Lashley
e2e80a850c Add dhcp discovery to Roborock (#141148)
* Add discovery to Roborock

* Update homeassistant/components/roborock/config_flow.py

Co-authored-by: Allen Porter <allen.porter@gmail.com>

* MR comments

* go back to removing the ":"

* change method of getting devices

---------

Co-authored-by: Allen Porter <allen.porter@gmail.com>
2025-03-22 21:21:43 -07:00
tdfountain
ddd67a7e58 Add PDU dynamic outlet buttons to NUT (#140317) 2025-03-22 13:04:20 -10:00
tdfountain
a9df341abf Optimize entity creation by storing device name as data in NUT (#141147) 2025-03-22 11:11:48 -10:00
Allen Porter
4e2dfba45f Omit state from the Assist LLM prompts (#141034)
* Omit state from the Assist LLM prompts

* Add back the stateful prompt
2025-03-22 15:41:51 -04:00
Thomas55555
61e30d0e91 Add diagnostics to remote calendar (#141111)
* Add diagnostics

* add diagnostics

* address review

* ruff

* ruff

* use raw ics data

* mypy

* mypy

* naming

* redact ics

* ruff

* simpify

* reduce data

* ruff
2025-03-22 12:27:48 -07:00
Luke Lashley
6d91bdb02e Inject websession for Roborock api client (#141141) 2025-03-22 12:19:54 -07:00
Andrew Sayre
7f640252a1 Use Debouncer helper in HEOS Coordinator (#141133)
Use Debouncer
2025-03-22 21:12:51 +02:00
Joost Lekkerkerker
f245bbd8dd Add door state binary sensor to SmartThings (#141143) 2025-03-22 20:04:21 +01:00
Joost Lekkerkerker
b47d3076cc Add oven stop button to SmartThings (#141142) 2025-03-22 20:51:41 +02:00
Mick Vleeshouwer
99d0449cbe Bump pyOverkiz to 1.16.4 in Overkiz (#141132)
* Bump Overkiz to 1.16.3

* Add missing generated files
2025-03-22 20:40:47 +02:00
Luke Lashley
1e0b89c381 Bump python Roborock to 2.16.1 (#141033)
* Bump python Roborock to 2.15.0

* Add aiohttp clientsession

* inject websession

* fix lint after merge

* bump to 2.16

* bump and revert

* revert formatting
2025-03-22 11:29:32 -07:00
Joost Lekkerkerker
c56b087d0c Add Dryer Wrinkle Prevent switch to SmartThings (#141085)
* Add Dryer Wrinkle Prevent switch to SmartThings

* Fix
2025-03-22 19:05:21 +01:00
Joost Lekkerkerker
4b4d75063c Add number platform to SmartThings (#141063)
* Add select platform to SmartThings

* Add number platform to SmartThings

* Fix

* Fix

* Fix

* Fix
2025-03-22 19:03:26 +01:00
Joost Lekkerkerker
931ce8951e Use category to define SmartThings binary sensor device class (#141075)
* Use category to define SmartThings binary sensor device class

* Fix
2025-03-22 12:41:15 -05:00
tdfountain
92c619cdd6 Create new entity base class for NUT (#141122) 2025-03-22 07:40:47 -10:00
Andrew Sayre
436acaf3d0 Remove uncalled function in HEOS (#141134)
Remove uncalled function
2025-03-22 12:37:11 -05:00
Andrew Sayre
ec4de0dcce Always allow browsing TuneIn for HEOS (#141131)
* Always allow browsing TuneIn

* Update test snapshots

* Retry CI
2025-03-22 18:14:42 +01:00
Joost Lekkerkerker
1b8b348eff Add select platform to SmartThings (#141115)
* Add select platform to SmartThings

* Add select platform to SmartThings
2025-03-22 18:03:50 +01:00
Joost Lekkerkerker
765691c84d Add power binary sensor for SmartThings (#141126) 2025-03-22 17:59:15 +01:00
Luke Lashley
fc0dbcd600 Refresh coordinator after map sleep for Roborock (#141093)
Refresh coordinator after the map sleep
2025-03-22 09:01:57 -07:00
Matthew FitzGerald-Chamberlain
b2942d61b3 Update pyaprilaire to 0.8.1 (#141094)
* Update pyaprilaire to 0.8.1

* Update requirements
2025-03-22 16:57:30 +02:00
Simone Chemelli
37a048a2ca Move Vodafone Station to silver quality scale (#141106) 2025-03-22 15:53:12 +01:00
Norbert Rittel
2453e7e686 Improve descriptions of fan_min_on_time in ecobee actions (#141086)
Add the explanations from the online docs to the `description` strings of both the `set_fan_min_on_time` action and its `fan_min_on_time` field.

Make the `fan_min_on_time` field of the `create_vacation` action consistent by dropping "(0 to 60)" from it (the UI takes care of that).

Fix sentence-casing of "Away indefinitely" state.
2025-03-22 16:30:24 +02:00
J. Diego Rodríguez Royo
4479b7b13d Add missing Home Connect chiller doors (#141105) 2025-03-22 14:31:28 +01:00
Joost Lekkerkerker
1492c59abe Delete deleted devices on runtime in SmartThings (#141080) 2025-03-22 13:12:37 +01:00
Joost Lekkerkerker
5961a46fc0 Start reauth for SmartThings if token expired (#141082) 2025-03-22 13:12:24 +01:00
J. Nick Koston
b7d300b49f Bump habluetooth to 3.37.0 (#141088)
changelog: https://github.com/Bluetooth-Devices/habluetooth/compare/v3.36.0...v3.37.0
2025-03-22 14:06:49 +02:00
J. Diego Rodríguez Royo
dc146e393c Add coordinator context override to Home Connect entity constructor (#141104)
* Improve Home Connect entity constructor to allow coordinator context override

* Simplify context usage at entity constructor
2025-03-22 12:42:54 +01:00
J. Diego Rodríguez Royo
9d9b352631 Move Home Connect service actions to a services.py (#141100)
* Move Home Connect service actions to a actions.py

* Rename actions.py to services.py

* Move more fuctions to module level
2025-03-22 12:35:46 +01:00
Maciej Bieniek
c08cbf3763 Use ShellyConfigEntry type in Shelly config flow (#141103)
Use ShellyConfigEntry type in async_get_options_flow
2025-03-22 11:57:59 +02:00
J. Diego Rodríguez Royo
ffd5c003cb Remove Home Connect service error string constants (#141102) 2025-03-22 10:48:35 +01:00
Andrew Sayre
34318ab655 Bump pyheos to 1.0.4 (#141091) 2025-03-21 12:19:05 -10:00
J. Nick Koston
6027a26761 Add SSLContext.set_default_verify_paths to asyncio blocking detection (#140648)
This one loads a significant number of files from /etc/ssl
2025-03-21 11:50:18 -10:00
tdfountain
2571725eb9 Add metered PDU dynamic outlet sensors to NUT (#140179)
* Add metered PDU dynamic outlet sensors

* Make deep copy and improve efficiency of loops

* Improve performance by creating new dict

Co-authored-by: J. Nick Koston <nick+github@koston.org>

* Remove unused import copy

* Use outlet name (if available) in friendly name and remove as separate sensor

---------

Co-authored-by: J. Nick Koston <nick+github@koston.org>
2025-03-21 11:41:43 -10:00
dependabot[bot]
84c6fa256c Bump home-assistant/builder from 2025.02.0 to 2025.03.0 (#141039)
Bumps [home-assistant/builder](https://github.com/home-assistant/builder) from 2025.02.0 to 2025.03.0.
- [Release notes](https://github.com/home-assistant/builder/releases)
- [Commits](https://github.com/home-assistant/builder/compare/2025.02.0...2025.03.0)

---
updated-dependencies:
- dependency-name: home-assistant/builder
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-21 21:44:33 +01:00
Franck Nijhof
2f244b2b66 2025.3.4 (#141081) 2025-03-21 21:21:43 +01:00
Martin Hjelmare
1b7e53fd01 Improve Home Connect appliances test fixture (#139787)
Improve Home Connect appliances fixture
2025-03-21 19:45:18 +00:00
Franck Nijhof
bfabf972a8 Bump version to 2025.3.4 2025-03-21 19:35:24 +00:00
Luke Lashley
c0c997eed8 Bump python-snoo to 0.6.4 (#141030) 2025-03-21 19:35:03 +00:00
Luke Lashley
14b07087dc Bump Python-Snoo to 0.6.3 (#140628)
Bump python-Snoo to 0.6.3
2025-03-21 19:34:59 +00:00
puddly
f54a634563 Bump ZHA to 0.0.53 (#141025)
* Bump ZHA to 0.0.53

* Regenerate snapshot
2025-03-21 19:33:41 +00:00
J. Diego Rodríguez Royo
e98d518b0b Fix some Home Connect options keys (#141023)
Fix some options keys
2025-03-21 19:33:38 +00:00
starkillerOG
121ee27105 Reolink fix playback headers (#141015) 2025-03-21 19:33:35 +00:00
Ivan Lopez Hernandez
5681f4f2ea Ensure file is correctly uploaded by the GenAI SDK (#140969)
Opened the file outside of the SDK
2025-03-21 19:33:32 +00:00
Joost Lekkerkerker
8a63fa3bb7 Log SmartThings subscription error on exception (#140939) 2025-03-21 19:33:28 +00:00
Josef Zweck
983a2f513d Bump pylamarzocco to 1.4.9 (#140916) 2025-03-21 19:33:24 +00:00
Joost Lekkerkerker
aab349e787 Fix SmartThings ACs without supported AC modes (#140744) 2025-03-21 19:31:08 +00:00
Joost Lekkerkerker
21ced23c3c Bump pySmartThings to 2.7.4 (#140720)
* Bump pySmartThings to 2.7.3

* Bump pySmartThings to 2.7.3

* Fix

* Fix

* Fix
2025-03-21 19:25:33 +00:00
Josef Zweck
a453e9d4c2 Don't reload onedrive on options flow (#140712) 2025-03-21 19:21:22 +00:00
Joost Lekkerkerker
1385bcdb90 Grade SmartThings on the integration quality scale (#141078) 2025-03-21 20:19:45 +01:00
Adam Feldman
3f493dce06 Fix broken core integration Smart Meter Texas by switching it to use HA's SSL Context (#140694)
* Update __init__.py to use HA's SSLContext

* Update config_flow.py to use HA's SSLContext

* Use default context for config_flow.py

* Use default context instead in __init__.py

Co-authored-by: Josef Zweck <josef@zweck.dev>

* Fix import in __init__.py

* Fix import in config_flow.py

---------

Co-authored-by: Josef Zweck <josef@zweck.dev>
2025-03-21 19:19:06 +00:00
Joost Lekkerkerker
403fe36489 Check Celsius in SmartThings oven setpoint (#140687) 2025-03-21 19:19:03 +00:00
J. Nick Koston
66fd7d9e8a Bump PySwitchBot to 0.57.1 (#140681)
changelog: https://github.com/sblibs/pySwitchbot/compare/0.56.1...0.57.1

fixes #140405
2025-03-21 19:19:00 +00:00
Glenn Waters
c9ceade10d Fix Elk-M1 missing TLS 1.2 check (#140672)
* Fix for missing TLS 1.2 check

* Fix error message.

* combine startswith

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2025-03-21 19:18:57 +00:00
Joost Lekkerkerker
85b6b3a360 Make Oven setpoint follow temperature UoM in SmartThings (#140666) 2025-03-21 19:18:08 +00:00
Maikel Punie
a2102f9b98 Fix optional password in Velbus config flow (#140615)
* Fix velbusconfigflow

* add tests

* Paramtize the tests

* Removed duplicate test in favor of another case

* more comments
2025-03-21 19:12:20 +00:00
J. Diego Rodríguez Royo
28cad1d085 Handle non documented options at Home Connect select entities (#140608)
* Allow non documented options at select entities

* Don't allow undocumented options
2025-03-21 19:12:17 +00:00
J. Diego Rodríguez Royo
9d8dbfbf3f Add 700 RPM option to washer spin speed options at Home Connect (#140607)
Add 700 RPM option to washer spin speed options
2025-03-21 19:12:14 +00:00
Hessel
1382a001e3 Change max ICP value to fixed value for Wallbox Integration (#140592)
change max ICP value to fixed value

Co-authored-by: Hessel van Es <hessel@datadragons.nl>
2025-03-21 19:12:10 +00:00
Pete Sage
88e3dcccda Album art not available for Sonos media library favorites (#140557)
* get album art uri for favorites

* add tests

* update typing

* update typing

* update typing

* simplify
2025-03-21 19:12:07 +00:00
J. Diego Rodríguez Royo
43e24cf833 Handle API rate limit error on Home Connect entities fetch (#139384)
* Handle API rate limit error on entities fetch

* Apply suggestions

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

* Add decorator (does not work)

* Fix decorator

* Apply suggestions

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

* Add test

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-03-21 19:12:03 +00:00
J. Diego Rodríguez Royo
65aef40a3f Fix initial fetch of Home Connect appliance data to handle API rate limit errors (#139379)
* Fix initial fetch of appliance data to handle API rate limit errors

* Apply comments

* Delete stale function

* Handle api rate limit error at options fetching

* Update appliances after stream non-breaking error

* Always initialize coordinator data

* Improve device update

* Update test description

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-03-21 19:11:58 +00:00
Joost Lekkerkerker
276e2e8f59 Move device creation in SmartThings (#141074)
Move device creation
2025-03-21 19:32:05 +02:00
Joost Lekkerkerker
5f67623214 Deprecate SmartThings events (#141073) 2025-03-21 18:26:17 +01:00
Joost Lekkerkerker
e78e873892 Add update platform to SmartThings (#141070)
* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* fix

* fix

* Add AC tests

* Add thermostat tests

* Add cover tests

* Add device tests

* Add light tests

* Add rest of the tests

* Add update

* Add oauth

* Add oauth tests

* Add oauth tests

* Add oauth tests

* Add oauth tests

* Bump version

* Add rest of the tests

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Add test fixtures

* Add test fixtures
2025-03-21 17:01:13 +01:00
G Johansson
16d335efc0 Update quality scale for Sensibo (#135924)
* Update quality scale for Sensibo

* platinum
2025-03-21 16:59:03 +01:00
Joost Lekkerkerker
74ed0e8011 Add support for PM1.0 in SmartThings (#141061)
* Add support for PM1.0 in SmartThings

* Add test fixtures

* Add test fixtures
2025-03-21 16:29:00 +01:00
Simone Chemelli
c1753631b1 Handle button presses exceptions for Vodafone Station (#140953)
* Handle button presses execeptions for Vodafone Station

* apply review comment
2025-03-21 16:26:51 +01:00
Joost Lekkerkerker
f84a46680d Add event platform to SmartThings (#141066)
* Add event platform to SmartThings

* Add event platform to SmartThings

* Fix
2025-03-21 16:20:42 +01:00
Joost Lekkerkerker
a9cbc72ce5 Add child lock to SmartThings (#140200)
* Add kids lock to SmartThings

* Add kids lock to SmartThings

* Fix

* Fix
2025-03-21 14:03:44 +01:00
Luke Lashley
466ec0b596 Fix failing Roborock test (#141059)
Fix the falky test
2025-03-21 05:31:17 -07:00
Wouter
858f0e6657 Fixed issue where the device was already disconnected when setting up the event platform (#140722)
* Changed where the script events are collected to remove any device communication from async_setup_entry

* Implemented improvements and added a test to test whats happends when script_getcode fails

* Renamed script_events to rpc_script_event to make clear this is only for RPC devices

Co-authored-by: Shay Levy <levyshay1@gmail.com>

---------

Co-authored-by: Shay Levy <levyshay1@gmail.com>
2025-03-21 14:13:56 +02:00
Jan-Philipp Benecke
4ed2689678 Handle wrong WebDAV URL more gracefully in config flow (#141040) 2025-03-21 12:25:26 +02:00
fwestenberg
1fafe81d20 Update Stookwijzer diagnostics and description (#141041)
Update diagnostics and description
2025-03-21 12:20:15 +02:00
Norbert Rittel
3101d9099b Fix spelling of "mDNS" in esphome (#141052)
Change "MDNS" to the correct "mDNS".
2025-03-21 12:19:07 +02:00
Maciej Bieniek
2785688f57 Add calibrate button for Shelly BLU TRV (#140578)
* Initial commit

* Refactor

* Call async_add_entities() once

* Type

* Cleaning

* `supported` is not needed here

* Add error handling

* Add test

* Fix name

* Change class name

* Change method name

* Move BLU_TRV_TIMEOUT

* Fix BLU_TRV_TIMEOUT import

* Coverage

* Use test snapshots

* Support error translations

* Fix tests

* Introduce ShellyBaseButton class

* Rename press_method to _press_method

* Improve exception strings
2025-03-21 10:14:20 +01:00
Norbert Rittel
bce7fcc3c6 Capitalize "DIP" abbreviation in apcupsd (#141048)
As "DIP" stands for "dual in-line package" it becomes capitalized as an abbreviation.
2025-03-21 09:44:02 +01:00
J. Nick Koston
021e4fab8c Bump habluetooth to 3.36.0 (#141037)
* Bump habluetooth to 3.35.0

changelog: https://github.com/Bluetooth-Devices/habluetooth/compare/v3.32.0...v3.35.0

* adjust
2025-03-21 08:12:55 +01:00
puddly
110500b860 Bump ZHA to 0.0.53 (#141025)
* Bump ZHA to 0.0.53

* Regenerate snapshot
2025-03-21 07:44:57 +01:00
Luke Lashley
e388d0c344 Bump python-snoo to 0.6.4 (#141030) 2025-03-21 07:42:02 +01:00
Allen Porter
a83bf4f514 Add a GetHomeState tool to return the current state of the home (#140971)
* Add a GetHomeState tool to return the current state of the home

* Fix check for exposing entities

* Add "all" to get home state description
2025-03-20 19:37:54 -07:00
Luke Lashley
a388863e62 Remove stale devices automatically for Roborock (#140991)
* Remove stale devices

* Add test

* extra test + fix networking patch bug
2025-03-20 18:28:37 -07:00
Abílio Costa
d12b4a1460 Log a warning for modules that log too often (#139708)
* Log a warning for modules that log too often

* Improve var naming

* Increase time window; improve log info

* Fix zha type

* Fix typo

* Ignore debug logs

* Use timer to avoid now() calls

* Switch to async_track_time_interval

* Allow using base QueueLister

* Add test for counters reset

* Make var names consistent; reduce message/time ratio

* Use log times instead of timer

* Simplify reset test

* Warn only once per module

* Remove uneeded counter reset
2025-03-20 14:53:53 -10:00
puddly
87c8234cdc Allow USB polling monitor on macOS for development (#141029)
* Allow USB polling on macOS

* Remove `_async_supports_monitoring`
2025-03-20 14:43:29 -10:00
dependabot[bot]
72645dff8b Bump actions/cache from 4.2.2 to 4.2.3 (#140977) 2025-03-21 00:34:48 +01:00
Marc Mueller
b936739917 Update pylint to 3.3.6 (#141028) 2025-03-21 00:33:16 +01:00
J. Diego Rodríguez Royo
a45c8d2820 Fix some Home Connect options keys (#141023)
Fix some options keys
2025-03-20 22:52:46 +01:00
Norbert Rittel
98f7193986 Apply sentence-casing to all status codes in litterrobot (#141020) 2025-03-20 21:23:35 +01:00
starkillerOG
5d1c8ea537 Reolink fix playback headers (#141015) 2025-03-20 20:45:07 +01:00
Norbert Rittel
95014dfdd8 Fix name of energenie_power_sockets integration (#141014)
* Fix name of `energenie_power_sockets` integration

Remove "integration." from the integration name.

* Fix

---------

Co-authored-by: Joostlek <joostlek@outlook.com>
2025-03-20 21:43:13 +02:00
Maciej Bieniek
53f1dd8adf Improve error handling and add exception translations for NextDNS integration (#141005)
* Add exception translations

* Coverage

* Add missing auth_error

* Coverage

* Use async_start_reauth

* Fix test

* Remove method placeholder
2025-03-20 20:33:45 +02:00
Norbert Rittel
a338205b73 Fix sentence-casing of "round-trip time" sensors in ping (#141012)
* Fix sentence-casing of "round-trip time" sensors in `ping`

Also add a hyphen for better English grammar.

* Update test_sensor.ambr
2025-03-20 20:30:28 +02:00
poucz
a030502489 Add MQTT cover stop tilt (#139912)
* Stop tilt move.

Stop tilt use same payload as cover - payload_stop

* Add test for STOP_TILT

* Tilt action

* Revert "Tilt action"

This reverts commit 7ce4fbb086.

* Update tests/components/mqtt/test_cover.py

Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>

* Update homeassistant/components/mqtt/cover.py

Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>

* Append CONF_PAYLOAD_STOP_TILT

* Update homeassistant/components/mqtt/cover.py

Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>

* Test for new payload

* Update tests/components/mqtt/test_cover.py

Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>

* Update tests/components/mqtt/test_cover.py

Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>

* Ruff format

* abbreviation

---------

Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
2025-03-20 18:20:12 +00:00
EnjoyingM
f9bb250621 Wolf Smartset: Adding Heatpump Parameters: Frequency, RPM and Flow rate (#140844)
* Add missing Heatpump parameters and units

* Fix merge issue

* Fix snapshot

* Removing bundle_id as extra state attribute till functionality is needed and updating api translation with missing phrase

* Fix translations for listparameters

* Fix translations for listparameters
2025-03-20 18:46:04 +01:00
Abílio Costa
eca10ea591 Improve Withings sleep and weight default units (#140665) 2025-03-20 18:45:52 +01:00
Robert Resch
32c6fb8629 Bump uv to 0.6.8 (#141007) 2025-03-20 19:20:40 +02:00
Norbert Rittel
4bbd49af53 Capitalize "PIN to Drive" feature name in teslemetry (#141011)
* Capitalize "PIN to Drive" as feature name in `teslemetry`

Fixes the spelling of "PIN" for consistency and turns "PIN to Drive" into the feature name that Tesla uses (in English).

* Update test_binary_sensor.ambr
2025-03-20 19:20:08 +02:00
peteS-UK
e48a25e952 Add button platform for Squeezebox integration (#140697)
* initial

* trans key correction

* base class updates

* model tidy up

* Update homeassistant/components/squeezebox/strings.json

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* Update homeassistant/components/squeezebox/entity.py

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* Update homeassistant/components/squeezebox/media_player.py

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* Update homeassistant/components/squeezebox/media_player.py

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* Update homeassistant/components/squeezebox/button.py

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* review updates

* update

* move manufacturer to library

* updates

* list concat

* review updates

* Update tests/components/squeezebox/test_button.py

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-03-20 17:18:08 +01:00
Maciej Bieniek
70ed120c6e Add exception translations for GIOS integration (#141006)
Add exception translations
2025-03-20 16:58:49 +01:00
Martin Hjelmare
a835c85f59 Patch Z-Wave platforms in button tests (#141001) 2025-03-20 16:37:02 +02:00
Luke Lashley
2a4ed9ace7 Add translations for Roborock Exceptions (#140964)
* Add translations to a few exceptions

* match existing wording

* fix regex

* consolidate errors

* fix test
2025-03-20 07:14:45 -07:00
Petro31
212d39ba19 Migrate template switch to new style (#140324)
* Migrate template switch to new style

* update tests

* Update tests

* Add config flow migration

* comment fixes

* revert entity config migration
2025-03-20 15:12:43 +01:00
Martin Hjelmare
5f84fc3ee5 Patch Z-Wave platforms in binary sensor tests (#140992) 2025-03-20 16:06:21 +02:00
Artur Pragacz
c9b27cf26e Detect early base platforms in bootstrap (#140359)
* Detect early base platforms in bootstrap

* Address feedback

* Address feedback
2025-03-20 12:56:45 +01:00
Martin Hjelmare
df0125abdd Patch Z-Wave platforms in api tests (#140988) 2025-03-20 12:54:40 +01:00
Martin Hjelmare
d8a4a97ee0 Allow patching Z-Wave platforms specifically in tests (#140987) 2025-03-20 12:19:14 +01:00
starkillerOG
a20601a1f0 Bump reolink-aio to 0.12.3 (#140789)
* Add password length restriction

* Bump reolink-aio to 0.12.3

* Add repair issue for too long password

* finish password too long repair issue

* add test
2025-03-20 11:39:57 +01:00
Franck Nijhof
d3c40939f6 Reorder template extensions (#140985) 2025-03-20 11:34:02 +01:00
Marc Mueller
56e966a980 Update project metadata for PEP 639 (#140960) 2025-03-20 11:04:49 +01:00
Joost Lekkerkerker
827d5256c6 Bump pySmartThings to 2.7.4 (#140720)
* Bump pySmartThings to 2.7.3

* Bump pySmartThings to 2.7.3

* Fix

* Fix

* Fix
2025-03-20 11:02:51 +01:00
Franck Nijhof
c6d3928ed1 Add template function: combine (#140948)
* Add template function: combine

* Add test to take away concern raised
2025-03-20 10:29:40 +01:00
Petar Petrov
3fb0290fba Remove unused params in "zwave_js/provision_smart_start_node" API (#140982) 2025-03-20 10:19:26 +01:00
Martin Hjelmare
2674b02bfa Refactor zwave_js config entry setup (#107635)
* Refactor zwave_js config entry setup

* Fix blocking update test

* Address timeout comment

* Remove platform tasks

* Replace deprecated async_add_job

* Use ConfigEntry.async_on_state_change

* Use modern config entry methods

* Clarify exception message

* Test listen error after config entry setup

* Test listen failure during setup after forward entry

* Test not reloading when hass is stopping

* Test client disconnect is called on entry unload

* Fix and test client not connected during driver setup

* Fix and test driver ready timeout

* Stringify listen task exception when logging

* Use identity compare

* Guard for closed connection

* Consolidate listen task checking and tests
2025-03-20 10:16:48 +01:00
Simone Chemelli
32f9c07254 Add missing exception translation in Vodafone Station (#140951)
* Add missing exception translation in Vodafone Station

* strings
2025-03-20 09:47:02 +01:00
J. Diego Rodríguez Royo
2ec80fd1ca Fix initial fetch of Home Connect appliance data to handle API rate limit errors (#139379)
* Fix initial fetch of appliance data to handle API rate limit errors

* Apply comments

* Delete stale function

* Handle api rate limit error at options fetching

* Update appliances after stream non-breaking error

* Always initialize coordinator data

* Improve device update

* Update test description

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-03-20 09:39:28 +01:00
dependabot[bot]
adf3e4fcca Bump actions/download-artifact from 4.2.0 to 4.2.1 (#140974)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4.2.0 to 4.2.1.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v4.2.0...v4.2.1)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-20 09:30:59 +01:00
dependabot[bot]
03bd8cd251 Bump github/codeql-action from 3.28.11 to 3.28.12 (#140975)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.28.11 to 3.28.12.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v3.28.11...v3.28.12)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-20 09:30:36 +01:00
Norbert Rittel
006dde435e Clarify descriptions of lcn.address_to_device_id action (#140979)
Clarify descriptions of `lcn.address_to_device` action

Changes the wording of the action and field descriptions so there is less ambiguity for translations.
2025-03-20 10:26:39 +02:00
dependabot[bot]
9f68ac575d Bump actions/upload-artifact from 4.6.1 to 4.6.2 (#140976)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.6.1 to 4.6.2.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4.6.1...v4.6.2)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-20 09:20:33 +01:00
Ivan Lopez Hernandez
d9cf2750d5 Ensure file is correctly uploaded by the GenAI SDK (#140969)
Opened the file outside of the SDK
2025-03-19 22:58:19 -07:00
J. Nick Koston
a600bc5e57 Add turn on/off support to HomeKit TVs (#140957)
* Add turn on/off support to HomeKit TVs

* 0 = off, 1 = on, not a bool

* add coverage

* update snapshot
2025-03-19 11:19:04 -10:00
Joost Lekkerkerker
100e4425e4 Log SmartThings subscription error on exception (#140939) 2025-03-19 20:13:46 +01:00
Joost Lekkerkerker
4344e9d604 Add remote control status to SmartThings (#140197)
* Add remote control status to SmartThings

* Add remote control status to SmartThings

* Fix
2025-03-19 18:23:15 +00:00
Norbert Rittel
2ffec3415c Use official spelling "FFmpeg" in ezviz / canary / onvif (#140938)
* Use official spelling "FFmpeg" in `ezviz`

* Use official spelling "FFmpeg" in `canary`

Fix sentence-casing along the way.

* Use official spelling "FFmpeg" in `onvif`

Fix sentence-casing along the way
2025-03-19 18:17:42 +00:00
J. Diego Rodríguez Royo
8afd9c0c44 Handle API rate limit error on Home Connect entities fetch (#139384)
* Handle API rate limit error on entities fetch

* Apply suggestions

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

* Add decorator (does not work)

* Fix decorator

* Apply suggestions

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

* Add test

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-03-19 18:53:14 +01:00
Norbert Rittel
d99df8701c Use official spelling "FFmpeg" in user-facing strings (#140937)
* Use official spelling "FFmpeg" in user-facing strings

* Replace "a" with "an"
2025-03-19 18:50:19 +01:00
Erik Montnemery
05c61b7ec3 Rename BackupManager last_non_idle_event to last_action_event (#140291)
* Rename BackupManager last_non_idle_event to last_action_event

* Update snapshots
2025-03-19 17:28:40 +01:00
jukrebs
2c9eb288e3 Add capability to display updated firmware versions in Home Assistant (#140524)
* add firmware version update

* incoperate review feedback
2025-03-19 16:51:39 +01:00
Erik Montnemery
6b9c1e17e0 Fix docstring in selector helper (#140929) 2025-03-19 16:37:07 +01:00
Maciej Bieniek
4a5567806b Add exception translations for IMGW-PIB integration (#140936)
Add exception translations
2025-03-19 17:14:02 +02:00
Erik Montnemery
6211e378c3 Fix flaky cast tests (#140928) 2025-03-19 16:50:09 +02:00
Simone Chemelli
6af23d2348 Add quality scale to Vodafone Station (#139444)
* Add quality scale and strict typing to Vodafone Station

* mypy and hassfest

* tweek

* parallel-updates

* update

* update manifest

* apply review comment
2025-03-19 15:35:47 +01:00
Erik Montnemery
6434befdcd Fix misleading airthings_ble test (#140933) 2025-03-19 15:12:43 +01:00
dontinelli
a2f0970dfc Bump fyta_cli to 0.7.2 (#140930) 2025-03-19 14:09:10 +00:00
starkillerOG
334359871d Add Reolink home hub scene select entity (#140823) 2025-03-19 14:34:49 +01:00
Erik Montnemery
245f0a1958 Minor typing tweak in cast (#140911) 2025-03-19 12:52:27 +00:00
Simone Chemelli
adc3f542cf Update strings for Vodafone Station (#140919) 2025-03-19 13:11:29 +01:00
Josef Zweck
3fd17c802c Bump pylamarzocco to 1.4.9 (#140916) 2025-03-19 11:25:12 +01:00
Norbert Rittel
f79aa2f73e Fix typos in nibe_heatpump strings (#140917)
* Fix typo in `nibe_heatpump` strings

* Also capitalize "Telnet"
2025-03-19 11:02:37 +01:00
Norbert Rittel
f28b9ba961 Fix sentence-casing in nibe_heatpump strings (#140915) 2025-03-19 11:36:49 +02:00
Erik Montnemery
793e36635b Improve google cast known hosts configuration (#140913) 2025-03-19 10:07:47 +01:00
Norbert Rittel
7c6abe17a2 Clarify description of speed field in omnilogic.set_pump_speed action (#140912)
Replace "VSP" (for variable speed pump) with just "pump" so it can be properly translated.
2025-03-19 10:55:49 +02:00
J. Nick Koston
f4fe234279 Bump annotatedyaml to 0.4.4 (#140861)
* Bump annotatedyaml to 0.4.2

changelog: https://github.com/home-assistant-libs/annotatedyaml/compare/v0.2.0...v0.4.2

~10-11% performance improvement

* tweak imports

* bump to .3 to make pylint happy

* bump again for fixes

---------

Co-authored-by: Shay Levy <levyshay1@gmail.com>
2025-03-18 22:26:23 -10:00
dependabot[bot]
d37783fb21 Bump actions/download-artifact from 4.1.9 to 4.2.0 (#140907)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4.1.9 to 4.2.0.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v4.1.9...v4.2.0)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-19 09:53:00 +02:00
Manu
caf81eecd3 Bump bring-api to v1.1.0 (#140906) 2025-03-18 20:25:41 -10:00
Luke Lashley
254622878a Add Roborock entity with the name of the current room (#140895)
* Add current room entity

* Update homeassistant/components/roborock/models.py

Co-authored-by: Allen Porter <allen.porter@gmail.com>

* Update homeassistant/components/roborock/models.py

Co-authored-by: Allen Porter <allen.porter@gmail.com>

* use current_room property

* remove select changes

---------

Co-authored-by: Allen Porter <allen.porter@gmail.com>
2025-03-18 18:48:34 -07:00
Erik Montnemery
c41d5f2577 Fix cast.show_lovelace_view service description (#140859) 2025-03-18 23:13:08 +01:00
Maciej Bieniek
3ce9d47d7d Add exception translations for Airly integration (#140864)
* Add exception translations

* Improve error strings
2025-03-18 21:27:36 +02:00
Norbert Rittel
07302ea178 Fix duplicate descriptions of homematicip_cloud.activate_eco_mode_with_… actions (#140885)
Update strings.json

Currently both the `activate_eco_mode_with_duration` and the `activate_eco_mode_with_period` actions have the identical description:

"Activates eco mode with period."

To resolve this confusing duplicate, both actions get their own descriptions, making the latter consistent with that of the `activate_vacation` action.
2025-03-18 21:27:21 +02:00
Norbert Rittel
2d82a12e0a Make description of homeassistant.reload_all action consistent (#140887)
Change it to "Reloads …" like all other `homeassistant.reload_xyz` actions.
2025-03-18 18:47:14 +00:00
starkillerOG
f8ab4d0238 Fix warnings in Reolink tests (#140878) 2025-03-18 16:47:33 +01:00
Maciej Bieniek
11e02f89cf Add exception translations for Brother integration (#140868)
Add exception translations
2025-03-18 17:40:47 +02:00
starkillerOG
4564d2537b Fix flakey reolink test (#140877) 2025-03-18 17:38:34 +02:00
Markus Adrario
e2460a4393 bump pyHomee to 1.2.8 (#140870) 2025-03-18 17:32:14 +02:00
Simone Chemelli
a170e32852 Deprecate Shelly state attributes (#140791) 2025-03-18 17:29:21 +02:00
Maikel Punie
4176776d70 Fix optional password in Velbus config flow (#140615)
* Fix velbusconfigflow

* add tests

* Paramtize the tests

* Removed duplicate test in favor of another case

* more comments
2025-03-18 14:49:27 +00:00
Luke Lashley
1cae866da9 Update Roborock Map on status change (#140873)
* update map on status change

* Update tests/components/roborock/test_image.py

Co-authored-by: Allen Porter <allen.porter@gmail.com>

* update code to handle state logic within async_update_data

* Update homeassistant/components/roborock/coordinator.py

Co-authored-by: Allen Porter <allen.porter@gmail.com>

* move previous_state and allow update on None

---------

Co-authored-by: Allen Porter <allen.porter@gmail.com>
2025-03-18 07:34:02 -07:00
Norbert Rittel
de1823070f Replace unsupported markup of examples in humidifier.set_mode action (#140824)
Markup language is not supported in the action UI. Thus the underscores for italics are replaced with quote marks.
2025-03-18 12:55:32 +01:00
Maciej Bieniek
29f03f5b87 Add exception translations for AccuWeather integration (#140863)
* Add exception translations

* Improve error strings
2025-03-18 13:23:51 +02:00
Petar Petrov
516aaa741d Add Z-Wave JS lookup_device API (#140802)
* ZwaveJS lookup_device API

* add FailedCommand test

* test tweak
2025-03-18 12:05:10 +01:00
Simone Chemelli
12f5bd2aea Add dedicated sensors for extra_state_attributes in Shelly integration (#140793)
* Add dedicated sensors for extra_state_attributes in Shelly integration

* add tests

* apply review comment

* fix text syntax

* add gas test

* update strings

* add icons
2025-03-18 11:48:18 +01:00
Dan Raper
30c19ec373 Add reconfigure flow to Ohme (#140835)
* Add reconfigure flow to Ohme

* Remove incorrect unique ID check from ohme reconfig
2025-03-18 10:36:21 +01:00
EnjoyingM
5438532780 Bump wolf-comm to 0.0.23 (#140840)
* Bump wolf-comm to 0.0.23

* fix test for new lib
2025-03-18 11:22:32 +02:00
starkillerOG
fdd36e457d Add Reolink day night state sensor (#140825)
* Add day night state sensor

* Update test_diagnostics.ambr
2025-03-18 11:19:45 +02:00
Norbert Rittel
603557af73 Improve description of vicare.set_vicare_mode action (#140826)
Add some additional information from the online docs so they get included in translations.
2025-03-18 11:16:21 +02:00
Norbert Rittel
36d42760a4 Fix capitalization in nextcloud entity names (#140856)
* Fix capitalization in `nextcloud` entity names

Use uppercase for abbreviations, sentence-case for words.

* Update test_sensor.ambr
2025-03-18 11:07:05 +02:00
Luke Lashley
ea259ffa66 Add event to Snoo (#140827) 2025-03-18 09:35:57 +01:00
Jan Schneider
52054d69c7 Update moehlenhoff-alpha2 to 1.4.0 (#140829)
* Update moehlenhoff-alpha2 to 1.4.0

* Fix test
2025-03-18 09:32:28 +01:00
Dan Raper
74992344d5 Add diagnostics for Ohme (#140833) 2025-03-18 09:31:08 +01:00
Adam Feldman
776495dfa2 Fix broken core integration Smart Meter Texas by switching it to use HA's SSL Context (#140694)
* Update __init__.py to use HA's SSLContext

* Update config_flow.py to use HA's SSLContext

* Use default context for config_flow.py

* Use default context instead in __init__.py

Co-authored-by: Josef Zweck <josef@zweck.dev>

* Fix import in __init__.py

* Fix import in config_flow.py

---------

Co-authored-by: Josef Zweck <josef@zweck.dev>
2025-03-18 09:24:05 +01:00
Norbert Rittel
426be3c11b Capitalize "ZIP" as abbreviation in rova integration strings (#140852)
Capitalized "ZIP" as abbreviation in `rova`
2025-03-18 09:21:28 +02:00
Norbert Rittel
a93ab74e40 Sentence-case "Zip code" in iqvia integration strings (#140853) 2025-03-18 09:21:06 +02:00
Luke Lashley
0eac679a5a Move MapData to Coordinator for Roborock (#140766)
* Move MapData to Coordinator

* seeing if mypy likes this

* delete dead code

* Some MR comments

* remove MapData and always update on startup if we don't have a stored map.

* don't do on demand updates

* remove unneeded logic and pull out map save

* Apply suggestions from code review

Co-authored-by: Allen Porter <allen.porter@gmail.com>

* see if mypy is happy

---------

Co-authored-by: Allen Porter <allen.porter@gmail.com>
2025-03-17 19:34:47 -07:00
Luke Lashley
73a24bf799 Set Parallel updates to 0 in Roborock (#140837)
roborock set parallel updates to 0
2025-03-17 18:39:48 -07:00
Allen Porter
412705302d Update MCP server to make the stateless API implicit (#140753)
* Update MCP server to not register the stateless API, but use it implicitly as an Assist API replacement

* Ensure backwards compatibility with old registration
2025-03-17 16:38:21 -05:00
LG-ThinQ-Integration
c9276aedde Bump thinqconnect to 1.0.5 (#140577)
Co-authored-by: yunseon.park <yunseon.park@lge.com>
2025-03-17 21:38:37 +01:00
Norbert Rittel
eafea6070d Improve action description in mealie integration (#140817)
- change all action descriptions to third-person singular
- use neutral wording for the description of `config_entry_id` so it works with all the different action contexts.
2025-03-17 21:45:17 +02:00
Norbert Rittel
539a28dcba Make all action descriptions in rachio consistent (#140816)
Changes 4 of the 6 action descriptions in the `rachio` integration to also use the descriptive style of Home Assistant.

In addition "API key" is sentence-cased to match the common string used in the same dialog.
2025-03-17 21:19:38 +02:00
Andrew Sayre
52d86ede3e Add ability to browse (and play) HEOS media (#140433)
* Add browse and play

* Tests

* Add tests involving media source
2025-03-17 14:10:56 -05:00
starkillerOG
4dfb56a2f7 Bump reolink-aio to 0.12.3b1 (#140811) 2025-03-17 20:06:49 +01:00
Erik Montnemery
290dab25bf Don't raise in ConfigFlow.async_set_unique_id if the other flow is a reauth flow (#140723)
* Don't raise in ConfigFlow.async_set_unique_id if the other flow is a reauth flow

* Improve test
2025-03-17 09:04:30 -10:00
Norbert Rittel
e16f0e9af3 Clarify action descriptions of smarttub.snooze_reminder / reset_reminder (#140810)
- change both descriptions to descriptive HA style
- change "reminder" to "maintenance reminder" (helps translators a lot)
- use more of the wording from the online documentation
2025-03-17 20:03:05 +02:00
Norbert Rittel
a2fec8c2ce Fix inconsistent capitalization in growatt_server entities (#140803)
* Fix inconsistent capitalization in `growatt_server` entities

* Makes "amperage" and "wattage" consistent (with "voltage")
2025-03-17 19:21:56 +02:00
Thomas55555
9a0837593a Improve test coverage and add comment for loading in executor for remote calendar (#140807)
Improve calendar loading by executing in a separate thread and add test for CalendarParseError
2025-03-17 17:38:40 +01:00
Simone Chemelli
f4787d469a Remove Shelly extra_attributes for RPC & REST devices (#140792)
* Remove Shelly extra_attributes for RPC devices

* apply review comment
2025-03-17 17:27:01 +01:00
Thomas55555
a252c19e7c Use MowerDictionary in Husqvarna Automower (#140805) 2025-03-17 16:57:03 +01:00
Shay Levy
9b57a831f7 Fix Shelly Air lamp life sensor (#140799) 2025-03-17 17:33:11 +02:00
starkillerOG
18bd8b561a Add Reolink smart ai binary sensors (#140408)
* Add Crossline smart AI binary sensor

* Add intrusion, lingering, forgotten item, item taken detection

* Use unique_index instead of location for unique_id

* Add test

* Apply suggestions from code review

Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>

* Name changes

* Update homeassistant/components/reolink/binary_sensor.py

Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>

* Use smart_type instead of key

* Use occupancy translation instead of gas (point to the same thing).

* Revert "Use occupancy translation instead of gas (point to the same thing)."

This reverts commit 9caf796585.

* fix styling

---------

Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-03-17 14:49:13 +00:00
Stephan van Rooij
76aef5be9f Add PKCE implementation in oauth2 helper (#139509)
* Update config_entry_oauth2_flow.py

* Specify type on request_data

* Added LocalOAuth2ImplementationWithPkce

* LocalOAuth2ImplementationWithPkce works more like specs

* fix: Adding tests for pkce flow and feedback applied

* fix last test for pkce

* Clean test_abort_if_oauth_with_pkce_rejected

* Improve assertion of code verifier and code challenge

* Break long docstrings

* Shorten docstring

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-03-17 14:16:52 +01:00
Erik Montnemery
fb2b3ce7d2 Bump pychromecast to 14.0.6 (#140794) 2025-03-17 13:19:27 +01:00
Petar Petrov
0d1c79b427 Bump zwave-js-server-python to 0.62.0 (#140796)
* Bump zwave-js-server-python to 0.62.0

* fix breaking change
2025-03-17 13:18:15 +01:00
Indu Prakash
a5913147e7 Add support for fan night light in VeSync (#140637)
* style: rename humidifier night const

* fix: separate night light for fan and humidifier

Check for the presence of set_night_light_brightness and
set_night_light to indentify humidifier and fan devices.

set_night_light is defined on VeSyncAirBypass and
set_night_light_brightness is defined on VeSyncHumid200300S.

update test
2025-03-17 10:32:52 +01:00
Ivan Lopez Hernandez
110e827ede Add @IvanLH to owners of google_generative_ai_conversation (#140764)
Update CODEOWNERS
2025-03-17 09:12:22 +01:00
dependabot[bot]
74ce703755 Bump docker/login-action from 3.3.0 to 3.4.0 (#140780)
Bumps [docker/login-action](https://github.com/docker/login-action) from 3.3.0 to 3.4.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v3.3.0...v3.4.0)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-17 09:08:47 +01:00
J. Diego Rodríguez Royo
4baf72d80b Call only required listeners on CONNECT/PAIRED in Home Connect (#140765)
Call only to the required listeners on CONNECT/PAIRED
2025-03-17 07:43:02 +01:00
J. Nick Koston
ab6c5af374 Bump aiohttp to 3.11.14 (#140773)
changelog: https://github.com/aio-libs/aiohttp/compare/v3.11.13...v3.11.14
2025-03-17 07:36:43 +01:00
J. Nick Koston
5fb03114b5 Bump dbus-fast to 2.39.6 (#140775)
changelog: https://github.com/Bluetooth-Devices/dbus-fast/compare/v2.39.5...v2.39.6
2025-03-17 07:35:49 +01:00
Marc Mueller
bddec1168b Bump ci cache version (#140767) 2025-03-17 01:38:05 +01:00
Norbert Rittel
f19a5b28f7 Update description of evaluate_payload to use friendly name (#140736)
* Update description of `evaluate_payload` to use friendly name

For the graphical UI the action descriptions need to refer to the friendly names of other fields so these can be translated to match.

Small change from `payload` to 'Payload'.

* Replace "When …" with "If …"
2025-03-16 22:38:25 +01:00
Johnny Willemsen
a9949aece0 Fix typo in Homee (#140759)
* Update strings.json

Fixed typo

* Update homeassistant/components/homee/strings.json

* Fix

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-03-16 22:27:35 +01:00
Luke Lashley
15e983e997 Add snoo switches (#140748)
* Add snoo switches

* change naming

* change wording
2025-03-16 22:24:49 +01:00
Luke Lashley
a40bb2790e Move Roborock map refresh to coordinator (#140758)
Move refresh coordinator to coordinator
2025-03-16 14:15:04 -07:00
Ivaylo Iliev
1b91240d54 Bump nibe_heatpump component version to add S332/S330 model (#140741) 2025-03-16 21:31:34 +01:00
Joost Lekkerkerker
bbe2a95b3d Deprecate Valve binary sensor in SmartThings (#140751)
Deprecate Valve binary sensor
2025-03-16 22:29:03 +02:00
mbraem
5351fe3f9b Add specific sensor device_class, state_class and unit_of_measurement (#137038)
Support additional units in the coil unit descriptions: min, s, Pa, kPa, bar,
l/m, m³/h and %RH.

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-03-16 21:06:49 +01:00
Luke Lashley
b0db7b432e Move Roborock MapParser to coordinator (#140750)
Move MapParser to coordinator
2025-03-16 12:55:00 -07:00
Joost Lekkerkerker
784381a25f Deprecate SmartThings cover battery state attribute (#140752) 2025-03-16 20:45:46 +01:00
Markus Adrario
42f0e70cde Add Homee binary sensor platform (#140088)
* binary-sensor initial

* Add binary sensor tests

* small string changes

* fix review comments

* review change 1
2025-03-16 20:13:36 +01:00
Allen Porter
1ee4f02e70 Bump ical to 9.0.1 (#140726) 2025-03-16 21:10:40 +02:00
Joost Lekkerkerker
d061f4ee05 Fix SmartThings ACs without supported AC modes (#140744) 2025-03-16 20:06:50 +01:00
MarkGodwin
56fe4319a0 Bump TP-Link Omada API to 1.4.4 (#140738) 2025-03-16 21:04:58 +02:00
Thomas55555
a7b6bcf1d6 Address post merge comments for remote calendar (#140735) 2025-03-16 20:03:02 +01:00
Manu
46973f0446 Redact emails and names in Bring! diagnostics (#140746) 2025-03-16 20:00:10 +01:00
Joost Lekkerkerker
735c98cb86 Set Home Connect button unique id to shorthand attribute (#140745) 2025-03-16 19:54:00 +01:00
starkillerOG
b5fa3e74c0 Add option to specify Reolink Basic Service Port (#137603)
* Allow changing the baichuan port

* styling

* Add description

* Add tests

* Review feedback

* capital letters

Co-authored-by: Robert Resch <robert@resch.dev>

---------

Co-authored-by: Robert Resch <robert@resch.dev>
2025-03-16 19:51:06 +01:00
Manu
8a552aef9d Adjusts strings in create actions in Habitica integration (#140742)
Adjusts strings in create actions
2025-03-16 19:33:28 +01:00
Thomas55555
2ece7fbc11 Add strict typing to remote_calendar (#140734) 2025-03-16 19:32:59 +01:00
Luke Lashley
2424d1c615 bump Python-Roborock to 2.14.0 (#140727)
bump Python Roborock to 2.14.0
2025-03-16 10:19:32 -07:00
Denis Shulyaka
bb7b5b9ccb OpenAI Responses API (#140713) 2025-03-16 13:18:18 -04:00
Luke Lashley
214d14b06b Add binary sensor to Snoo (#140729)
* Add binary sensor

* Update homeassistant/components/snoo/binary_sensor.py

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-03-16 16:57:21 +01:00
Denis Shulyaka
056616f9c5 Stronger type annotations for conversation content (#140725)
stronger type annotations for conversation content
2025-03-16 10:59:25 -04:00
Josef Zweck
012b4645f3 Don't reload onedrive on options flow (#140712) 2025-03-16 09:51:53 -04:00
Jan-Philipp Benecke
4ca31da0a5 Bump annotatedyaml to 0.2.0 (#140715) 2025-03-16 09:51:36 -04:00
Pete Sage
d560083e15 Album art not available for Sonos media library favorites (#140557)
* get album art uri for favorites

* add tests

* update typing

* update typing

* update typing

* simplify
2025-03-16 14:09:21 +01:00
Dan Raper
d365092bcc Add price cap support to Ohme (#140537)
* Add price cap support

* Change service input to box mode

* Add icon for set_price_cap service

* Improve test coverage

* Change ohme service description wording
2025-03-16 14:05:08 +01:00
Luke Lashley
4e0985e1a7 Add Select entity to Snoo (#140638) 2025-03-16 14:00:43 +01:00
Brett Adams
011a076155 Fix auto seat heater in Teslemetry (#140703)
Fix auto seat heater
2025-03-16 10:16:21 +01:00
Pete Sage
5f8564bfc5 Fix audiobooks always start from beginning on Sonos (#140663)
* play audible favorite

* play audible favorite

* simplify tests
2025-03-16 10:11:08 +01:00
Serge Wagener
6b6470f345 Update knx-frontend and increase BinarySensor reset_after limit (#140196)
Bumped to newest knx-frontend version and adapt knx ui schema
2025-03-16 08:29:44 +01:00
Jan-Philipp Benecke
7b9ea63f17 Split out yaml loading into own package (#140683)
* Split out yaml loading into library

* Code review

* Code review

* Fix check config script
2025-03-15 22:26:18 -04:00
Denis Shulyaka
3a6ddcf428 Bump openai to 1.66.3 (#140690) 2025-03-15 22:24:27 -04:00
Thomas55555
4050c216ed Add Remote calendar integration (#138862)
* Add remote_calendar with storage

* Use coordinator and remove storage

* cleanup

* cleanup

* remove init from config_flow

* add some tests

* some fixes

* test-before-setup

* fix error handling

* remove unneeded code

* fix updates

* load calendar in the event loop

* allow redirects

* test_update_failed

* tests

* address review

* use error from local_calendar

* adress more comments

* remove unique_id

* add unique entity_id

* add excemption

* abort_entries_match

* unique_id

* add ,

* cleanup

* deduplicate call

* don't raise for status end de-nest

* multiline

* test

* tests

* use raise_for_status again

* use respx

* just use config_entry argument that already is defined

* Also assert on the config entry result title and data

* improve config_flow

* update quality scale

* address review

---------

Co-authored-by: Allen Porter <allen@thebends.org>
2025-03-15 18:57:45 -07:00
IceBotYT
91e0f1cb46 Add voip_utils to voip loggers (#140695)
* Add voip_utils to voip loggers

* Sort
2025-03-15 23:40:02 +01:00
Joost Lekkerkerker
675b684290 Check Celsius in SmartThings oven setpoint (#140687) 2025-03-15 23:09:55 +01:00
J. Nick Koston
d69bcc02b0 Pass scanner mode to shelly Bluetooth scanner (#140689)
habluetooth will eventually be able to make better decisions
on how to route data based on the scanning mode.
2025-03-15 12:00:23 -10:00
Glenn Waters
76244e0d6b Fix Elk-M1 missing TLS 1.2 check (#140672)
* Fix for missing TLS 1.2 check

* Fix error message.

* combine startswith

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2025-03-15 11:07:45 -10:00
Thomas55555
ed0b1f58dc Bump aioautomower to 2025.3.1 (#140682) 2025-03-15 21:30:19 +01:00
J. Nick Koston
16556fa2a9 Bump PySwitchBot to 0.57.1 (#140681)
changelog: https://github.com/sblibs/pySwitchbot/compare/0.56.1...0.57.1

fixes #140405
2025-03-15 21:06:00 +01:00
Joost Lekkerkerker
43898d7845 Add valve platform to SmartThings (#140195)
* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* fix

* fix

* Add AC tests

* Add thermostat tests

* Add cover tests

* Add device tests

* Add light tests

* Add rest of the tests

* Add valve

* Add oauth

* Add oauth tests

* Add oauth tests

* Add oauth tests

* Add oauth tests

* Bump version

* Add rest of the tests

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Fix

* Fix
2025-03-15 20:28:51 +01:00
Joost Lekkerkerker
bff73ee5f8 Add EHS test fixture to SmartThings (#140199) 2025-03-15 20:28:04 +01:00
Jeff Terrace
02a75edf1d Add onvif parser support for reolink package and hikvision alarm (#140669) 2025-03-15 09:03:40 -10:00
EnjoyingM
c1c8deed0c Fix sensor values for Power and Energy for Wolf Heatpumps (#139007)
* Add sensor values for Power and Energy

* test

* test

* Sensor test

* Fix test

* fix test

* Fixing test coverage

* refactored

* WolfllinkSensorEntityDescriptions and updated tests

* fix test

* Add name_fn and test_sensor adoptions

* fix test coverage

* Revert "fix test coverage"

This reverts commit 2405751f5a.

* resolve requested changes and fix test

* Fix Snapshot

* clean up

* Fixed unknown state in snapshot test
2025-03-15 19:56:45 +01:00
Simone Chemelli
2fd91e7f9c Remove unknown from Shelly sensor state (#140597) 2025-03-15 18:10:35 +01:00
Maciej Bieniek
58ff593f96 Bump aioshelly to version 13.4.0 (#140671)
Bump aioshelly to version 13.4.0
2025-03-15 18:11:04 +02:00
Maciej Bieniek
89e7536731 Add missing translations for options attribute in Nettigo Air Monitor integration (#140662)
Add missing translations for options attribute
2025-03-15 15:38:45 +01:00
Joost Lekkerkerker
b7e2e041bc Make Oven setpoint follow temperature UoM in SmartThings (#140666) 2025-03-15 15:08:21 +01:00
J. Diego Rodríguez Royo
940625505f Handle non documented options at Home Connect select entities (#140608)
* Allow non documented options at select entities

* Don't allow undocumented options
2025-03-15 14:17:16 +01:00
J. Nick Koston
f801cfee7e Bump habluetooth to 3.32.0 (#140640)
changelog: https://github.com/Bluetooth-Devices/habluetooth/compare/v3.27.0...v3.32.0
2025-03-15 12:27:21 +02:00
J. Nick Koston
99f661538d Bump aioesphomeapi to 29.7.0 (#140641)
changelog: https://github.com/esphome/aioesphomeapi/compare/v29.6.0...v29.7.0
2025-03-15 12:27:06 +02:00
Tim Laing
13b6cfa438 Add generate content service for OpenAI to match Google AI (#122818)
* Aded Generate Content Service for OpenAI to match Google AI

* Fixed code for commit checks

* Addressed code review comments

* Address review comments

* Addressed @balloob review comments.

* Address futher review comments from @balloob
2025-03-14 22:54:49 -04:00
J. Nick Koston
5dc1a321dd Rework cover reproduce_state to consider supported features (#140558)
* Handle open/closed state in reproduce_state for tilt only covers

fixes #137144

* cleanups

* cleanups

* cleanups

* cleanups

* cleanups

* cleanups

* cleanups

* cleanups

* cleanups

* cleanups

* cleanups

* cleanups

* rework

* rework

* rework

* rework

* more coverage

* more coverage

* more coverage

* more coverage

* more coverage

* more coverage

* more coverage

* more coverage

* more coverage

* more coverage

* more coverage

* back compat

* back compat

* back compat

* cleanups

* cleanups

* cleanups

* cleanups

* comments

* comments
2025-03-14 22:14:09 -04:00
Denis Shulyaka
07e7672b78 Anthropic conversation extended thinking support (#139662)
* Anthropic conversation extended thinking support

* update conversation snapshots

* Add conversation test

* Update openai_conversation snapshots

* Removed metadata

* Removed metadata

* Removed thinking

* cosmetic fix

* combine user messages

* Apply suggestions from code review

* Add tests for chat_log messages conversion

* s/THINKING_BUDGET_TOKENS/THINKING_BUDGET/

* Apply suggestions from code review

* Update tests

* Update homeassistant/components/anthropic/strings.json

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>

* apply suggestions from code review

---------

Co-authored-by: Robert Resch <robert@resch.dev>
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2025-03-14 22:07:59 -04:00
Luke Lashley
baafcf48dc Separate Roborock entities to a new dock device (#140612)
* Seperate entities to a new dock device

* update entity names

* Update homeassistant/components/roborock/coordinator.py

---------

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2025-03-14 22:06:09 -04:00
Luke Lashley
ed2ef04b98 Bump Python-Snoo to 0.6.3 (#140628)
Bump python-Snoo to 0.6.3
2025-03-14 21:48:47 -04:00
J. Nick Koston
c54a2e7338 Bump nexia to 2.4.0 (#140634)
changelog: https://github.com/bdraco/nexia/compare/2.2.2...2.4.0
2025-03-14 15:27:51 -10:00
J. Nick Koston
fa836118b2 Bump bluetooth-data-tools to 1.26.1 (#140635)
changelog: https://github.com/Bluetooth-Devices/bluetooth-data-tools/compare/v1.26.0...v1.26.1
2025-03-14 15:24:55 -10:00
Jeff Terrace
11e15b1405 Move redundant attribute and key error handling to event parser caller (#140630) 2025-03-14 14:16:35 -10:00
puddly
537302ce56 ZBT-1 and Yellow firmware update entities for Zigbee/Thread (#138505)
* Initial implementation of hardware update model

* Fixes

* WIP: change the `homeassistant_sky_connect` integration type

* More fixes

* WIP

* Display firmware info in the device page

* Make progress more responsive

* WIP: Yellow

* Abstract the bootloader reset type

* Clean up comments

* Make the Yellow integration non-hardware

* Use the correct radio device for Yellow

* Avoid hardcoding strings

* Use `FIRMWARE_VERSION` within config flows

* Fix up unit tests

* Revert integration type changes

* Rewrite hardware ownership context manager name, for clarity

* Move manifest parsing logic into a new package

Pass the correct type to the firmware API library

* Create and delete entities instead of mutating the entity description

* Move entity replacement into a `async_setup_entry` callback

* Change update entity category from "diagnostic" to "config"

* Have the client library handle firmware fetching

* Switch from dispatcher to `async_on_state_change`

* Remove unnecessary type annotation on base update entity

* Simplify state recomputation

* Remove device registry code, since the devices will not be visible

* Further simplify state computation

* Give the device-less update entity a more descriptive name

* Limit state changes to integer increments when sending firmware update progress

* Re-raise `HomeAssistantError` if there is a problem during flashing

* Remove unnecessary state write during entity creation

* Rename `_maybe_recompute_state` to `_update_attributes`

* Bump the flasher to 0.0.30

* Add some tests

* Ensure the update entity has a sensible name

* Initial ZBT-1 unit tests

* Replace `_update_config_entry_after_install` with a more explicit `_firmware_info_callback` override

* Write the firmware version to the config entry as well

* Test the hardware update platform independently

* Add unit tests to the Yellow and ZBT-1 integrations

* Load firmware info from the config entry when creating the update entity

* Test entity state restoration

* Test the reloading of integrations marked as "owning"

* Test installation failure cases

* Test firmware type change callback failure case

* Address review comments
2025-03-15 00:28:02 +01:00
Mick Vleeshouwer
b07c28126a Bump pyOverkiz to 1.16.3 (#140621)
Bump Overkiz to 1.16.3
2025-03-15 00:42:10 +02:00
J. Diego Rodríguez Royo
59cab7cd58 Add 700 RPM option to washer spin speed options at Home Connect (#140607)
Add 700 RPM option to washer spin speed options
2025-03-14 19:35:13 +01:00
Maciej Bieniek
8964af428a Add missing translations for options attribute in AccuWeather integration (#140610)
Add missing translations for options attribute
2025-03-14 19:20:18 +01:00
Michel van de Wetering
160b98bd28 Fix media_player Toggle when in idle (#78192)
* Remove idle as off state

* Fix merge mistake

* Fix merge mistake

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-03-14 17:24:39 +01:00
Marc Mueller
2951eb5cc8 Fix len-test (PLC1802) (#140600) 2025-03-14 17:03:42 +01:00
Erik Montnemery
588366a514 Add setup function to improv_ble (#140594) 2025-03-14 16:55:42 +01:00
Manu
78a04776e4 Add update_daily action to Habitica integration (#140328)
* add update_daily action

* day strings
2025-03-14 16:49:56 +01:00
Paul Bottein
324f208d68 Add lawn mower support to Google Assistant (#140530)
* Add lawn mower support to google assistant

* Update snapshots

* Sort alphabetically

* Refactor service call

* Refactor service call

* Feedback
2025-03-14 15:22:23 +00:00
Hessel
e740e341c8 Change max ICP value to fixed value for Wallbox Integration (#140592)
change max ICP value to fixed value

Co-authored-by: Hessel van Es <hessel@datadragons.nl>
2025-03-14 16:13:07 +01:00
Joost Lekkerkerker
532c860bf0 Bump ruff to 0.11.0 (#140598) 2025-03-14 16:04:11 +01:00
Brett Adams
251bb30dc7 Add streaming media platform to Teslemetry (#140482)
* Update media player

* Add media player platform with tests and bump firmware
2025-03-14 15:27:18 +01:00
Petar Petrov
de0efd61d1 Add Z-Wave JS NVM backup and restore API (#139233)
* ZWaveJS: NVM backup and restore API

* remove unused const

* test fix

* switch to WS commands

* Backup & restore MVP

* Use base64 data directly

* update tests

* fix mistake

* Apply suggestions from code review

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

* PR comments

* update tests

* more tests

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-03-14 15:17:23 +01:00
J. Nick Koston
e9c8b3acfc Bump aioharmony to 0.5.2 (#140589)
mostly logging fixes (some format stings were missing values)

related issue #139126
2025-03-14 16:07:32 +02:00
Erik Montnemery
08fc6dcff6 Allow configuring ignored devices from improve_ble user flow (#140595) 2025-03-14 16:05:58 +02:00
Erik Montnemery
96a6d88dca Allow configuring ignored devices from dormakaba_dkey user flow (#140596) 2025-03-14 16:01:43 +02:00
Luke Lashley
1bd8ff884e Improve Snoo testing (#139302)
* improve snoo testing

* change to asyncMock method of testing

* Apply suggestions from code review

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* address comments

* Apply suggestions from code review

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* adress comments

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-03-14 14:58:55 +01:00
Jan Bouwhuis
a8f1df3e55 Add availability support for MQTT subentries (#138673)
* Add availability support for MQTT subentries

* Update homeassistant/components/mqtt/config_flow.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* Update homeassistant/components/mqtt/config_flow.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* Update homeassistant/components/mqtt/config_flow.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* Update homeassistant/components/mqtt/strings.json

Co-authored-by: Erik Montnemery <erik@montnemery.com>

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-03-14 14:56:27 +01:00
Luke Lashley
7ff842fc37 Add dynamic update interval to Roborock (#140563)
* Add dynamic update interval to Roborock

* mr comments

* update time intervals

* Set A01 to 1 minute

* set interval to 30
2025-03-14 06:55:18 -07:00
Brett Adams
220bd5a27f Fix time to full charge in Teslemetry (#137996)
* Fix streaming full charge

* ruff
2025-03-14 14:48:17 +01:00
Brett Adams
4e759e59a4 Add streaming switches to Teslemetry (#137145)
* Add streaming switches

* Add switch tests

* Update snapshot

* Fix sentry

* update test docstring
2025-03-14 14:41:09 +01:00
Jan Bouwhuis
bd4d0ec4b8 Add initial MQTT subentry support for notify entities (#138461)
* Add initial MQTT subentry support for notify entities

* Fix componts assigment is reset on device config. Translation tweaks

* Rephrase

* Go to summary menu when components are set up already - add test

* Fix suggested device info on config flow

* Invert

* Simplify subentry config flow and omit menu

* Use constants instead of literals

* More constants

* Teak some translations

* Only show save when the the entry is dirty

* Do not trigger an entry reload twice

* Remove encoding, entity_category

* Remove icon from mqtt subentry flow

* Separate entity settings and MQTT specific settings

* Remove object_id and refactor

* Migrate translations

* Make subconfig flow test extensible

* Make sub reconfig flow tests extensible

* Rename entity_platform_config step to mqtt_platform_config

* Make component unique ID independent from the name

* Move code for update of component data to helper

* Follow up on code review

* Skip dirty stuff

* Fix rebase issues #1

* Do not allow reconfig for entity platform/name, default QoS and refactor tests

* Add entity platform and entity name label to basic entity config dialog

* Rename to exclude_from_reconfig and make reconfig option not optional
2025-03-14 14:00:07 +01:00
Joost Lekkerkerker
dcc63a6f2e Bump ruff to 0.10.0 (#140541)
* Bump ruff to 0.10.0

* Bump ruff to 0.10.0

* Bump ruff to 0.10.0

* Bump ruff to 0.10.0

* Update pyproject.toml

Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>

* Fix

---------

Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
2025-03-14 12:32:50 +00:00
Franck Nijhof
4d1c89f0d1 2025.3.3 (#140583) 2025-03-14 12:55:51 +01:00
Petar Petrov
ae8709be21 Expose ZWaveJSsupports_long_range to the frontend (#140489)
* Expose ZWaveJS`supports_long_range` to the frontend

* update test
2025-03-14 12:19:49 +01:00
Maciej Bieniek
5ea7c113b0 Use test snapshots for Shelly climate (#140582) 2025-03-14 11:15:38 +01:00
Franck Nijhof
831f2dc30e Bump version to 2025.3.3 2025-03-14 09:56:13 +00:00
ashionky
1566ab3b28 Fix missing UnitOfPower.MILLIWATT in sensor and number allowed units (#140567)
* MILLIWATT

* MILLIWATT
2025-03-14 09:53:08 +00:00
Joost Lekkerkerker
c852e1398c Set unit of measurement for SmartThings oven setpoint (#140560) 2025-03-14 09:53:05 +00:00
Joost Lekkerkerker
761be9342e Fix windowShadeLevel capability in SmartThings (#140552) 2025-03-14 09:52:58 +00:00
Maciej Bieniek
54ad44a574 Fix Shelly diagnostics for devices without WebSocket Outbound support (#140501)
* Don't assume that `ws` is always in config

* Fix device
2025-03-14 09:49:52 +00:00
Matthias Alphart
fed4015bab Update xknxproject to 3.8.2 (#140499) 2025-03-14 09:49:49 +00:00
Brett Adams
019a0ebf9b Bump Tesla Fleet API to 0.9.13 (#140485) 2025-03-14 09:49:45 +00:00
Joost Lekkerkerker
7607b7d494 Mark value in number.set_value action as required (#140445) 2025-03-14 09:49:40 +00:00
Maikel Punie
8b96a9606d Bump velbusaio to 2025.3.1 (#140443) 2025-03-14 09:49:37 +00:00
Jan-Philipp Benecke
6349821037 Only do WebDAV path migration when path differs (#140402) 2025-03-14 09:49:33 +00:00
Louis Christ
db26a42734 Use only IPv4 for zeroconf in bluesound integration (#140226)
* Use only ipv4 for zeroconf

* Fix tests

* Use only ip_address for ip version check

* Add test

* Reduce test
2025-03-14 09:49:30 +00:00
Glenn Waters
74fe35f44e Bump upb-lib to 0.6.1 (#140212) 2025-03-14 09:49:26 +00:00
jb101010-2
e648716ddf Bump pysuezV2 to 2.0.4 (#139824) 2025-03-14 09:49:23 +00:00
Luke Lashley
2e20245cdf Fix bug with all Roborock maps being set to the wrong map when empty (#138493)
* Fix bug with all maps being set to the same when empty

* fix parens

* fix other parens

* rework some of the logic

* few small updates

* Remove test that is no longer relevant

* remove updated time bump
2025-03-14 09:49:19 +00:00
Norbert Rittel
8726be31ff Use correct unit symbol "min" for minutes in webmin integration (#140448)
* Use correct unit symbol "min" for minutes in `webmin` integration

Replace the unit symbol "m" which stands for meter with the correct SI uni symbol "min".

* Update test_sensor.ambr

* Update test_sensor.ambr (2)
2025-03-14 10:28:37 +01:00
Jan-Philipp Benecke
99b140f73f Remove WebDAV properties and rely on metadata file (#140539) 2025-03-14 10:21:16 +01:00
Louis Christ
d952e8186f Use only IPv4 for zeroconf in bluesound integration (#140226)
* Use only ipv4 for zeroconf

* Fix tests

* Use only ip_address for ip version check

* Add test

* Reduce test
2025-03-14 10:20:16 +01:00
ashionky
2b0a2e7644 Fix missing UnitOfPower.MILLIWATT in sensor and number allowed units (#140567)
* MILLIWATT

* MILLIWATT
2025-03-14 10:19:43 +01:00
Simone Chemelli
9820cbb036 Add exceptions translation for Comelit (#140404)
* Add exceptions translation for Comelit

* apply review comment

* Add climate tests for Comelit

* Revert "Add climate tests for Comelit"

This reverts commit 6d76d312a0.
2025-03-14 10:17:10 +01:00
Marc Mueller
f48d94ce34 Use TypeVar default for Generator (#140506) 2025-03-14 10:08:39 +01:00
Simone Chemelli
5daa3167ca Add parallel updates to Comelit (#140527) 2025-03-14 10:03:29 +01:00
J. Nick Koston
23f4f97603 Bump habluetooth to 3.27.0 (#140569)
changelog: https://github.com/Bluetooth-Devices/habluetooth/compare/v3.25.1...v3.27.0
2025-03-13 22:57:24 -10:00
J. Nick Koston
1e8f211725 Bump aioshelly to 13.3.0 (#140571)
changelog: https://github.com/home-assistant-libs/aioshelly/compare/13.2.0...13.3.0
2025-03-14 09:47:36 +01:00
Petro31
84667fd32d Migrate template light to new style (#140326)
* Migrate template light to new style

* add modern templates to tests

* fix comments
2025-03-14 09:00:46 +01:00
Norbert Rittel
e42a6c5d4f Fix missing RGBW field description reference in Lokalise - step 2 (#140576)
Reverts step 1, re-adding the field reference.
2025-03-14 09:51:49 +02:00
Simone Chemelli
6f926d0a66 Add missing typing to Vodafone Station (#140562) 2025-03-14 08:28:56 +01:00
J. Nick Koston
9f801e7785 Bump dbus-fast to 2.39.5 (#140565) 2025-03-13 14:49:37 -10:00
J. Nick Koston
f0b86c512d Bump habluetooth to 3.25.1 and bluetooth-auto-recovery to 1.4.5 (#140561)
habluetooth: https://github.com/Bluetooth-Devices/habluetooth/compare/v3.25.0...v3.25.1
bluetooth-auto-recovery: https://github.com/Bluetooth-Devices/bluetooth-auto-recovery/compare/v1.4.4...v1.4.5
2025-03-13 14:06:24 -10:00
Norbert Rittel
3383e8b70d Fix missing RGBW field description reference in Lokalise - step 1 (#140526)
Empties the string to trigger an export to Lokalise.
Will be followed up by a second PR to restore the reference.
2025-03-14 01:47:11 +02:00
Joost Lekkerkerker
058aed96d2 Fix windowShadeLevel capability in SmartThings (#140552) 2025-03-14 01:28:08 +02:00
Joost Lekkerkerker
b1285fcc4e Set unit of measurement for SmartThings oven setpoint (#140560) 2025-03-14 01:28:01 +02:00
Joakim Plate
d56680e05e Update to version 1.6.0 of gardena library (#140559) 2025-03-13 13:13:16 -10:00
Marc Mueller
5cf3bea8fe Fix unnecessary-dict-comprehension-for-iterable (C420) (#140555) 2025-03-13 23:32:00 +01:00
Marc Mueller
b48ab77a38 Fix call on root logger (LOG015) (#140556) 2025-03-13 23:02:26 +01:00
Paul Bottein
cdead8661d Add lawn mower support to HomeKit (#140438)
Add lawn mower support to homekit
2025-03-13 10:27:00 -10:00
J. Nick Koston
474d427b87 Bump bleak-esphome to 2.12.0 (#140543)
changelog: https://github.com/Bluetooth-Devices/bleak-esphome/compare/v2.11.0...v2.12.0
2025-03-13 21:01:41 +01:00
Shay Levy
87f726141a Fix ollama history trimming test (#140538) 2025-03-13 19:41:45 +00:00
Maciej Bieniek
fa57d57215 Fix Shelly diagnostics for devices without WebSocket Outbound support (#140501)
* Don't assume that `ws` is always in config

* Fix device
2025-03-13 20:58:09 +02:00
Dan Raper
8ea2d40467 Bump ohmepy to 1.4.1 (#140535) 2025-03-13 20:57:05 +02:00
Simone Chemelli
d5af542dd1 Add parallel updates to Vodafone Station (#140532) 2025-03-13 17:32:45 +00:00
Paulus Schoutsen
55895df54d Switch more TTS core to async generators (#140432)
* Switch more TTS core to async generators

* Document a design choice

* robust

* Add more tests

* Update comment

* Clarify and document TTSCache variables
2025-03-13 13:24:44 -04:00
Matthias Alphart
b07ac301b9 Update xknxproject to 3.8.2 (#140499) 2025-03-13 15:57:22 +00:00
Marc Mueller
473a5559cc Improve tado typing (#140505) 2025-03-13 15:48:04 +00:00
Norbert Rittel
c92ee120b6 Make actions in flo integration UI-friendly (#140522)
Makes actions in `flo` integration UI-friendly

- replace key name `sleep_minutes` with its friendly name to match the UI (in translations)
- replace "time" with "duration" to reduce the ambiguity
- use third-person singular for `run_health_test` description for consistency (in translations)
2025-03-13 16:39:12 +01:00
Simone Chemelli
3bba781554 Use runtime data in Vodafone Station (#140464)
* Use runtime data in Vodafone Station

* specialize config entry

* revert unwanted change
2025-03-13 15:53:01 +01:00
Norbert Rittel
bc6eb94c0d Fix sentence-casing and spelling of "ID" in system_bridge integration (#140516) 2025-03-13 16:36:12 +02:00
Norbert Rittel
5526585eeb Fix spelling of "ID" and excessive colon in bang_olufsen integration (#140518) 2025-03-13 16:35:40 +02:00
Paulus Schoutsen
f32bb1a318 Assist satellite to use TTS tokens for announcements (#140336)
* Migrate Assist Satellite to use token

* Fix tests

* Fix tests
2025-03-13 08:36:38 -05:00
Marc Mueller
e710d3699c Improve frontend typing (#140503) 2025-03-13 13:23:52 +01:00
Marc Mueller
26e3624610 Update pipdeptree to 2.25.1 (#140507) 2025-03-13 13:23:00 +01:00
Erik Montnemery
427aa55789 Correct fallback to state in state machine when processing statistics (#140396) 2025-03-13 09:28:15 +01:00
Pieter Viljoen
ffa6f42c0e Use runtime_data to store coordinator state (#140486)
Use runtime-data to save coordinator state
2025-03-13 08:52:42 +01:00
Brett Adams
f5412dd209 Bump Tesla Fleet API to 0.9.13 (#140485) 2025-03-13 08:23:26 +01:00
Allen Porter
6d58dd541e Update roborock quality scale for docs items (#140483) 2025-03-12 22:50:42 -04:00
Allen Porter
6a743310bb Change the local to-do list creation button to 'Create' (#140484) 2025-03-12 22:38:50 -04:00
J. Nick Koston
ab56a4ca69 Bump aioesphomeapi to 29.6.0 (#140481)
changelog: https://github.com/esphome/aioesphomeapi/compare/v29.5.1...v29.6.0
2025-03-12 22:15:28 -04:00
Jan-Philipp Benecke
db9a805ff0 Add rain state binary sensor to ecowitt (#140463) 2025-03-12 23:32:55 +00:00
J. Nick Koston
e78dc486f7 Bump SQLAlchemy to 2.0.39 (#140473)
* Bump SQLAlchemy to 2.0.39

changelog: https://docs.sqlalchemy.org/en/20/changelog/changelog_20.html#change-2.0.39

* fix typing
2025-03-12 13:09:41 -10:00
Pete Sage
1f6658fca0 Prevent ipv6 discovery messages for Sonos (#139648) 2025-03-12 15:19:09 -04:00
Joost Lekkerkerker
bad109dec5 Mark value in number.set_value action as required (#140445) 2025-03-12 19:07:41 +01:00
Simone Chemelli
892b78a1f9 Add exceptions translation for Vodafone Station (#140410) 2025-03-12 16:12:27 +00:00
Maikel Punie
70c355b52e Bump velbusaio to 2025.3.1 (#140443) 2025-03-12 16:30:01 +01:00
dontinelli
d3376f31d0 Bump fyta_cli to 0.7.1 (#140452) 2025-03-12 15:29:43 +01:00
J. Nick Koston
06019e7995 Split timeout in lutron_caseta to increase configure timeout (#138875) 2025-03-12 10:59:36 +00:00
Austin Mroczek
2f1ff5ab95 TotalConnect refactor tests (#140240)
* refactor button

* refactor test_options_flow
2025-03-12 09:52:28 +02:00
epenet
593ae48aa2 Migrate mqtt tests to use unit system (#140376)
* Migrate mqtt tests to use unit system

* Fix param list

* Missed one

---------

Co-authored-by: jbouwh <jan@jbsoft.nl>
2025-03-12 09:47:34 +02:00
Tobias Perschon
25cfd6ceda bump pydaikin to 2.14.1 (#140424)
Signed-off-by: Tobias Perschon <tobias@perschon.at>
2025-03-12 08:31:58 +02:00
Luke Lashley
7197b8ebff Set Roborock current map to config instead of select (#140429)
Set current map to config instead of select
2025-03-11 19:22:36 -07:00
Norbert Rittel
7b736908fa Fix typo in description of lifx.effect_morph action (#140416) 2025-03-12 01:15:25 +02:00
J. Nick Koston
e858e21a40 Add Bluetooth discovery support for InkBird ITH-11-B (#140423)
Add support for InkBird ITH-11-B
2025-03-11 22:57:16 +00:00
Tiddly Widdly
2f44e30013 Add lutron caseta model Caseta Shade SerenaEssentialsRollerShade (#139800)
* Update cover.py

Add support for new model roller shade SerenaEssentialsRollerShade, SYERX-B-X

* update requirements

	modified:   homeassistant/components/lutron_caseta/cover.py
	modified:   homeassistant/components/lutron_caseta/manifest.json
	modified:   requirements_all.txt
	modified:   requirements_test_all.txt

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2025-03-11 10:39:31 -10:00
Allen Porter
b88d662677 Add Roborock data_description for config flow and options flow (#140384)
* Add Roborock data_description for config flow and options flow

* Remove the drawables logging
2025-03-11 21:02:56 +01:00
Paulus Schoutsen
7aeefa1400 Only store strings in cloud TTS default options (#140332)
* Only store strings in cloud TTS default options

* more type check

* Don't stringify strenum
2025-03-11 15:28:13 -04:00
Norbert Rittel
6fb6f92985 Improve descriptions of lifx.effect_sky action (#140400)
* Improve descriptions of `lifx.effect_sky` action

The 'Sky Effect' action of the LIFX integration allows three types of sky types to choose from:
- "Clouds"
- "Sunrise"
- "Sunset"
This commit fixes the wrong naming of the "Clouds" effect as "Cloud" and adds details about it to the descriptions of the `cloud_saturation_min`and `cloud_saturation_max` fields (from the online docs).

In addition the inconsistent capitalization of their `name` strings is fixed, too.

* Improve action description as well
2025-03-11 20:23:41 +01:00
Luke Lashley
f50325fc7d Add dock dryer control to Roborock (#138495)
* Add a dock dryer select

* change import

* Change name to match app
2025-03-11 20:21:28 +01:00
Jan-Philipp Benecke
0b41d056d3 Only do WebDAV path migration when path differs (#140402) 2025-03-11 20:05:02 +01:00
Andrew Sayre
d8bcba9ef0 Enable HEOS automatic failover (#140394)
Failover
2025-03-11 13:00:43 -05:00
Franck Nijhof
d309239bcc Fix typo in Google Generative AI conversation: intead -> instead (#140398) 2025-03-11 10:18:34 -07:00
epenet
a13911e00e Rename test helpers module in mqtt (#140375)
* Rename test helpers module in mqtt

* missed a file
2025-03-11 18:00:51 +01:00
Paulus Schoutsen
0ba5711603 Add TTS token to TTS-END event (#140333) 2025-03-11 17:54:39 +01:00
Jan Bouwhuis
36cbd28d9d Add platinum quality scale to incomfort integration (#136387)
* Add platinum quality scale to incomfort integration

* Add platinum quality scale to incomfort integration

* Exempt actions attributes

* Comment on known limitations
2025-03-11 17:41:19 +01:00
Franck Nijhof
a12915fc14 2025.3.2 (#140392)
* Don't allow creating backups if Home Assistant is not running (#139499)

* Don't allow creating backups if hass is not running

* Revert "Don't allow creating backups if hass is not running"

This reverts commit 1bf545eb25.

* Set backup manager to idle only after Home Assistant has started

* Update according to discussion, add tests

* Add more test

* Bump govee_ble to 0.43.1 (#139862)

Bump govee_ble to 0.43.0

* Label emergency heat switch (#139872)

* Add label to emergency heat switch

* Use sentence case names

Co-authored-by: Franck Nijhof <frenck@frenck.nl>

---------

Co-authored-by: Franck Nijhof <frenck@frenck.nl>

* Bump sense-energy lib to 0.13.7 (#140068)

* Update jinja to 3.1.6 (#140069)

* Update evohome-async to 1.0.3 (#140083)

bump client to 1.0.3

* Fix HEOS discovery error when previously ignored (#140091)

Abort ignored discovery

* Map prewash job state in SmartThings (#140097)

* Check support for thermostat operating state in SmartThings (#140103)

* Handle None options in SmartThings (#140110)

* Handle None options in SmartThings

* Handle None options in SmartThings

* Fix MQTT JSON light not reporting color temp status if color is not supported (#140113)

* Fix HEOS user initiated setup when discovery is waiting confirmation (#140119)

* Support null supported Thermostat modes in SmartThings (#140101)

* Set device class for Oven Completion time in SmartThings (#140139)

* Revert "Check if the unit of measurement is valid before creating the entity" (#140155)

Revert "Check if the unit of measurement is valid before creating the entity …"

This reverts commit 99e1a7a676.

* Fix the order of the group members attribute of the Music Assistant integration (#140204)

* Fix events without user in Bring integration (#140213)

Fix events without publicUserUuid

* Log broad exception in Electricity Maps config flow (#140219)

* Bump evohome-async to 1.0.4 to fix  #140194 (#140230)

bump client, add test for fix  #140194

* Refresh Home Connect token during config entry setup (#140233)

* Refresh token during config entry setup

* Test 500 error

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

* Add 900 RPM option to washer spin speed options at Home Connect (#140234)

Add 900 RPM option to washer spin speed options

* Fix todo tool broken with Gemini 2.0 models. (#140246)

* Change tool name for addlist item

* Change to HasListAddItem

* extract to function

* Fix version not always available in onewire (#140260)

* Fix `client_id` not generated when connecting to the MQTT broker (#140264)

Fix client_id not generated when connecting to the MQTT broker

* Bump velbusaio to 2025.3.0 (#140267)

* Fix dryer operating state in SmartThings (#140277)

* FGLair : Upgrade to ayla-iot-unofficial 1.4.7 (#140296)

Upgrade to ayla-iot-unofficial 1.4.7

* Bump pyheos to v1.0.3 (#140310)

Bump pyheos v1.0.3

* Bump ZHA to 0.0.52 (#140325)

* Bump pydrawise to 2025.3.0 (#140330)

* Bump teslemetry-stream (#140335)

Bump

* Fix no temperature unit in SmartThings (#140363)

* Fix double space quoting in WebDAV (#140364)

* Bump python-roborock to 2.12.2 (#140368)

bump python roboorck to 2.12.2

* Handle incomplete power consumption reports in SmartThings (#140370)

* Fix browsing Audible Favorites in Sonos (#140378)

* initial commit

* updates

* update test data

* Make sure SmartThings light can deal with unknown states (#140190)

* Fix

* add comment

* Make light unknown

* Make light unknown

* Delete subscription on shutdown of SmartThings (#140135)

* Cache subscription url in SmartThings

* Cache subscription url in SmartThings

* Fix

* Fix

* Fix

* Fix

* Fix

* Fix

* Fix

* Fix

* Bump pysmartthings to 2.7.1

* 2.7.2

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

* Bump version to 2025.3.2

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
Co-authored-by: Evan Farrell <evan@evanfarrell.com>
Co-authored-by: John Hillery <34005807+jrhillery@users.noreply.github.com>
Co-authored-by: Keilin Bickar <TrumpetGod@gmail.com>
Co-authored-by: David Bonnes <zxdavb@bonnes.me>
Co-authored-by: Andrew Sayre <6730289+andrewsayre@users.noreply.github.com>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
Co-authored-by: msm595 <msm595@users.noreply.github.com>
Co-authored-by: Manu <4445816+tr4nt0r@users.noreply.github.com>
Co-authored-by: Jan-Philipp Benecke <jan-philipp@bnck.me>
Co-authored-by: J. Diego Rodríguez Royo <jdrr1998@hotmail.com>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Luke Lashley <conway220@gmail.com>
Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>
Co-authored-by: Maikel Punie <maikel.punie@gmail.com>
Co-authored-by: Antoine Reversat <a.reversat@gmail.com>
Co-authored-by: puddly <32534428+puddly@users.noreply.github.com>
Co-authored-by: David Knowles <dknowles2@gmail.com>
Co-authored-by: Brett Adams <Bre77@users.noreply.github.com>
Co-authored-by: Pete Sage <76050312+PeteRager@users.noreply.github.com>
2025-03-11 17:36:00 +01:00
Norbert Rittel
7b7483b254 Fix wrong punctuation in hive integration (#140390) 2025-03-11 17:44:52 +02:00
Lincoln Kirchoff
95afebceb4 Add modbus climate hvac action (#139864)
* Added the hvac action attribute for modbus climate entities.

* Fixed issue in hvac action unit test, was incorrectly referencing the hvac mode attribute.

* Fixed the modbus climate test for hvac action, it now correctly checks that hvac actions in the config match HVACActions.

* Made changes recommended by @crug80 to remove dead code and to add ability to use input or holding register for hvac action.

* Moved action test case in test_climate.py

* Updated comment for `test_service_climate_action_update`

* Fixed ruff formatting error.

* Addressed request to update labels from `state_*` to `action_*`
2025-03-11 15:27:47 +00:00
Franck Nijhof
3d5e4b980f Bump version to 2025.3.2 2025-03-11 15:22:38 +00:00
Joost Lekkerkerker
f2f653efcf Delete subscription on shutdown of SmartThings (#140135)
* Cache subscription url in SmartThings

* Cache subscription url in SmartThings

* Fix

* Fix

* Fix

* Fix

* Fix

* Fix

* Fix

* Fix

* Bump pysmartthings to 2.7.1

* 2.7.2

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-03-11 15:21:27 +00:00
Joost Lekkerkerker
b5c7bdd98f Make sure SmartThings light can deal with unknown states (#140190)
* Fix

* add comment

* Make light unknown

* Make light unknown
2025-03-11 14:58:36 +00:00
Norbert Rittel
ad126a745a Fix sentence-casing in hive integration (#140382)
Use sentence-casing for all strings following the HA standard.
Capitalize "Internet" as a name.
2025-03-11 14:58:16 +00:00
Pete Sage
38e6133202 Fix browsing Audible Favorites in Sonos (#140378)
* initial commit

* updates

* update test data
2025-03-11 14:58:02 +00:00
Joost Lekkerkerker
8541dc5bde Handle incomplete power consumption reports in SmartThings (#140370) 2025-03-11 14:57:58 +00:00
Luke Lashley
5327996bad Bump python-roborock to 2.12.2 (#140368)
bump python roboorck to 2.12.2
2025-03-11 14:57:55 +00:00
Jan-Philipp Benecke
4ddc43a9d9 Fix double space quoting in WebDAV (#140364) 2025-03-11 14:57:51 +00:00
Joost Lekkerkerker
e6dea4179b Fix no temperature unit in SmartThings (#140363) 2025-03-11 14:57:47 +00:00
Brett Adams
0318b85517 Bump teslemetry-stream (#140335)
Bump
2025-03-11 14:57:43 +00:00
David Knowles
29987d443e Bump pydrawise to 2025.3.0 (#140330) 2025-03-11 14:57:27 +00:00
puddly
cbfd8707b9 Bump ZHA to 0.0.52 (#140325) 2025-03-11 14:57:18 +00:00
Andrew Sayre
5f158f5c87 Bump pyheos to v1.0.3 (#140310)
Bump pyheos v1.0.3
2025-03-11 14:57:14 +00:00
Antoine Reversat
d67ccd2fce FGLair : Upgrade to ayla-iot-unofficial 1.4.7 (#140296)
Upgrade to ayla-iot-unofficial 1.4.7
2025-03-11 14:57:10 +00:00
Joost Lekkerkerker
29c9d3804b Fix dryer operating state in SmartThings (#140277) 2025-03-11 14:57:07 +00:00
Maikel Punie
76d478c84f Bump velbusaio to 2025.3.0 (#140267) 2025-03-11 14:56:54 +00:00
Jan Bouwhuis
5d9d6f099c Fix client_id not generated when connecting to the MQTT broker (#140264)
Fix client_id not generated when connecting to the MQTT broker
2025-03-11 14:56:49 +00:00
epenet
e4b31640b3 Fix version not always available in onewire (#140260) 2025-03-11 14:56:43 +00:00
Luke Lashley
c43f6a67d0 Fix todo tool broken with Gemini 2.0 models. (#140246)
* Change tool name for addlist item

* Change to HasListAddItem

* extract to function
2025-03-11 14:55:51 +00:00
victorclaessen
490dd3b525 Add microseconds as unit for device class duration (#140307)
* Add microseconds as unit for device class duration. 

Add microseconds as unit for device class duration. The converter already supports it.

* Update const.py

Also update number component
2025-03-11 14:52:55 +00:00
J. Diego Rodríguez Royo
0bbab63193 Add 900 RPM option to washer spin speed options at Home Connect (#140234)
Add 900 RPM option to washer spin speed options
2025-03-11 14:52:37 +00:00
J. Diego Rodríguez Royo
06188b8fbd Refresh Home Connect token during config entry setup (#140233)
* Refresh token during config entry setup

* Test 500 error

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-03-11 14:52:33 +00:00
David Bonnes
bbbb5cadd4 Bump evohome-async to 1.0.4 to fix #140194 (#140230)
bump client, add test for fix  #140194
2025-03-11 14:52:29 +00:00
Jan-Philipp Benecke
52fcdda429 Log broad exception in Electricity Maps config flow (#140219) 2025-03-11 14:52:25 +00:00
Manu
7d93ceb0f0 Fix events without user in Bring integration (#140213)
Fix events without publicUserUuid
2025-03-11 14:52:22 +00:00
msm595
873e4b77eb Fix the order of the group members attribute of the Music Assistant integration (#140204) 2025-03-11 14:52:17 +00:00
Jan Bouwhuis
61f0eabcbb Revert "Check if the unit of measurement is valid before creating the entity" (#140155)
Revert "Check if the unit of measurement is valid before creating the entity …"

This reverts commit 99e1a7a676.
2025-03-11 14:50:10 +00:00
Joost Lekkerkerker
134b5319e1 Set device class for Oven Completion time in SmartThings (#140139) 2025-03-11 14:50:05 +00:00
Joost Lekkerkerker
ee78e21950 Support null supported Thermostat modes in SmartThings (#140101) 2025-03-11 14:47:50 +00:00
Andrew Sayre
323bc54efc Fix HEOS user initiated setup when discovery is waiting confirmation (#140119) 2025-03-11 14:46:18 +00:00
Jan Bouwhuis
fd2dee3c11 Fix MQTT JSON light not reporting color temp status if color is not supported (#140113) 2025-03-11 14:46:14 +00:00
Joost Lekkerkerker
fc53322c07 Handle None options in SmartThings (#140110)
* Handle None options in SmartThings

* Handle None options in SmartThings
2025-03-11 14:46:08 +00:00
Joost Lekkerkerker
faf9977abb Check support for thermostat operating state in SmartThings (#140103) 2025-03-11 14:46:03 +00:00
Joost Lekkerkerker
7336c8fc07 Map prewash job state in SmartThings (#140097) 2025-03-11 14:36:17 +00:00
Andrew Sayre
5cfaeda95b Fix HEOS discovery error when previously ignored (#140091)
Abort ignored discovery
2025-03-11 14:36:13 +00:00
David Bonnes
a78e9039c6 Update evohome-async to 1.0.3 (#140083)
bump client to 1.0.3
2025-03-11 14:36:10 +00:00
Franck Nijhof
227f3cea25 Update jinja to 3.1.6 (#140069) 2025-03-11 14:36:06 +00:00
Keilin Bickar
cab4890246 Bump sense-energy lib to 0.13.7 (#140068) 2025-03-11 14:36:03 +00:00
John Hillery
95fd096bdd Label emergency heat switch (#139872)
* Add label to emergency heat switch

* Use sentence case names

Co-authored-by: Franck Nijhof <frenck@frenck.nl>

---------

Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2025-03-11 14:35:59 +00:00
Evan Farrell
91cf8cb547 Bump govee_ble to 0.43.1 (#139862)
Bump govee_ble to 0.43.0
2025-03-11 14:35:56 +00:00
Erik Montnemery
3ce4f3f918 Don't allow creating backups if Home Assistant is not running (#139499)
* Don't allow creating backups if hass is not running

* Revert "Don't allow creating backups if hass is not running"

This reverts commit 1bf545eb25.

* Set backup manager to idle only after Home Assistant has started

* Update according to discussion, add tests

* Add more test
2025-03-11 14:35:46 +00:00
Joost Lekkerkerker
71159c755f Delete subscription on shutdown of SmartThings (#140135)
* Cache subscription url in SmartThings

* Cache subscription url in SmartThings

* Fix

* Fix

* Fix

* Fix

* Fix

* Fix

* Fix

* Fix

* Bump pysmartthings to 2.7.1

* 2.7.2

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-03-11 15:33:32 +01:00
Luke Lashley
3c57b12cd1 Fix bug with all Roborock maps being set to the wrong map when empty (#138493)
* Fix bug with all maps being set to the same when empty

* fix parens

* fix other parens

* rework some of the logic

* few small updates

* Remove test that is no longer relevant

* remove updated time bump
2025-03-11 07:31:20 -07:00
Allen Porter
ca33d7263f Improve roborock map image (#140379) 2025-03-11 15:12:19 +01:00
Pete Sage
6c54f8dff2 Fix browsing Audible Favorites in Sonos (#140378)
* initial commit

* updates

* update test data
2025-03-11 14:56:41 +01:00
starkillerOG
7bdec5f19f Bump reolink-aio to 0.12.2 (#140369) 2025-03-11 14:54:02 +01:00
Luke Lashley
8edecd8671 Bump python-roborock to 2.12.2 (#140368)
bump python roboorck to 2.12.2
2025-03-11 14:47:30 +01:00
Joost Lekkerkerker
536109251e Make sure SmartThings light can deal with unknown states (#140190)
* Fix

* add comment

* Make light unknown

* Make light unknown
2025-03-11 14:47:13 +01:00
Artur Pragacz
d82c30364a Remove redundant after dependencies in person (#140354) 2025-03-11 14:12:30 +01:00
Norbert Rittel
ca5ce74740 Improve user-facing strings of hassio component (#140355)
- capitalize "Internet"
- remove excessive space character
- add "the" and trailing period in description of `homeassistant_exclude_database` field
- replace duplicate strings in `backup_partial` with references to `backup_full` action
2025-03-11 15:10:54 +02:00
epenet
1c242a6602 Migrate homekit tests to use unit system (#140372) 2025-03-11 15:10:20 +02:00
Joost Lekkerkerker
0e7a083847 Handle incomplete power consumption reports in SmartThings (#140370) 2025-03-11 14:10:06 +01:00
Artur Pragacz
13e9906929 Remove redundant after dependencies in search (#140353) 2025-03-11 14:09:58 +01:00
epenet
25d6974137 Migrate balboa tests to use unit system (#140371) 2025-03-11 15:09:50 +02:00
Jan-Philipp Benecke
d2124db3ec Fix double space quoting in WebDAV (#140364) 2025-03-11 14:06:44 +01:00
Joost Lekkerkerker
bc6d342919 Fix no temperature unit in SmartThings (#140363) 2025-03-11 14:03:15 +01:00
epenet
daaa1486fc Migrate lg_thinq tests to use unit system (#140365) 2025-03-11 14:54:21 +02:00
epenet
7826bb9323 Migrate google_assistant tests to use unit system (#140366) 2025-03-11 13:51:56 +01:00
epenet
289e94f270 Migrate gree tests to use unit system (#140358) 2025-03-11 14:38:44 +02:00
epenet
b160ce21fc Migrate google_assistant tests to use unit system (#140357) 2025-03-11 13:21:00 +01:00
Maciej Bieniek
98cf936ff5 Improve config flow for GIOS (#139935)
* Initial commit

* Use TYPE_CHECKING

* Update strings

* Remove default value

* Improve tests
2025-03-11 13:52:40 +02:00
Norbert Rittel
d3a96ba688 Use trademark "Time-of-Use Price Plan" in srp_energy integration (#140350) 2025-03-11 11:18:35 +01:00
Norbert Rittel
47a9f25ba6 Improve name and description of nexia.set_hvac_run_mode action (#140348)
- use proper capitalization of "HVAC" in action name
- better explain that you can set the run mode ("permanent_hold" / "run_schedule") and / or the operation mode ("auto" / "cool" / "heat") of the HVAC system
2025-03-11 11:14:22 +01:00
Norbert Rittel
3199b538ee Capitalize "HVAC" abbreviation in fritzbox integration (#140344)
* Capitalize "HVAC" abbreviation in `fritzbox` integration

* Update test_climate.py

* Update test_climate.py (2)
2025-03-11 11:12:22 +01:00
Artur Pragacz
4f25296c50 Improve dependencies resolution (#138502)
* Improve dependencies resolution

* Improve tests

* Better docstrings

* Fix comment

* Improve tests

* Improve logging

* Address feedback

* Address feedback

* Address feedback

* Address feedback

* Address feedback

* Simplify error handling

* small log change

* Add comment

* Address feedback

* shorter comments

* Add test
2025-03-11 10:12:23 +01:00
Tsvi Mostovicz
52408e67b2 Update hdate dependency to 1.0.3 (#137247)
* Update hdate version

* Update code to reflect changes from hdate==1.0.0

* Fix some tests

* Fix parasha tests

* Fix  holiday tests

* Cleanup holidays changes

* Zmanim objects should now access the local attribute

* Fix binary sensors

* Update test values on upcoming shabbat times

* Update hdate to 1.0.1

* Adapt to changes from 1.0.0 -> 1.0.1

* Change shabbat candle lighthing test scenario to 40 minutes as expected in Jerusalem

* Update to version 1.0.2

* Update keys based on updated nomenclature in library

* Update HolidayDatabase .get_all_names in test

* Make holiday type an ordered set

* Fix freeze_time

* Fix imports

* Fix tests and minor change

* Update hdate version 1.0.3, add migration method

* Fix migration code

* Add test for migration

* The change is not backwards compatible if config is not restored
2025-03-11 09:43:29 +01:00
J. Nick Koston
3b115506b9 Bump inkbird-ble to 0.9.0 (#140339)
changelog: https://github.com/Bluetooth-Devices/inkbird-ble/compare/v0.8.0...v0.9.0
2025-03-11 09:19:21 +01:00
Andrew Sayre
6e2148193a Bump pyheos to v1.0.3 (#140310)
Bump pyheos v1.0.3
2025-03-11 09:18:31 +01:00
David Knowles
e0f4da390a Bump pydrawise to 2025.3.0 (#140330) 2025-03-11 09:16:44 +01:00
J. Nick Koston
a45ce3083b Bump pylutron-caseta 0.24.0 (#140338)
changelog: https://github.com/gurumitts/pylutron-caseta/compare/v0.23.0...v0.24.0
2025-03-11 09:15:20 +01:00
Norbert Rittel
711f9ab900 Correct sentence-casing and spelling of "LED" in zha integration (#140342) 2025-03-11 09:12:29 +01:00
Andrew Jackson
cdff2e4648 Add strict typing of post to Mastodon (#140299)
* Type post API

* Update quality scale
2025-03-11 09:11:46 +01:00
puddly
6b601b9aad Bump ZHA to 0.0.52 (#140325) 2025-03-11 09:09:53 +01:00
Norbert Rittel
873cf6ac09 Fix sentence-casing and spelling of "LED" in baf integration (#140343) 2025-03-11 09:09:15 +01:00
Brett Adams
a65bf35a06 Bump teslemetry-stream (#140335)
Bump
2025-03-11 09:06:29 +01:00
Norbert Rittel
b6df07b2ed Improve user-facing strings of nordpool integration (#140286) 2025-03-11 06:14:22 +01:00
Artur Pragacz
2e79db3695 Fix hass stop in bootstrap (#132795) 2025-03-10 21:29:26 -04:00
Antoine Reversat
37213503b1 Do not add outside temperature sensor for FGLair if reading is None (#140298)
* Do not add outside temperature sensor if reading is None

* Fix comments
2025-03-10 22:16:44 +00:00
Norbert Rittel
bf50ee9b5e Capitalize abbreviations in lektrico integration (#140311)
* Capitalize abbreviations in `lektrico` integration

* Update test_number.ambr

* Update test_binary_sensor.ambr

* Update test_binary_sensor.ambr

* Update test_number.ambr
2025-03-10 22:12:47 +00:00
Glen Robertson
058c965b88 Set anthemav volume_step to 0.01 (#140130) 2025-03-10 22:25:38 +01:00
Luke Lashley
8fe45fb994 Fix todo tool broken with Gemini 2.0 models. (#140246)
* Change tool name for addlist item

* Change to HasListAddItem

* extract to function
2025-03-10 14:02:07 -07:00
Paulus Schoutsen
49a62d5294 Standardize conversation.async_process method (#140125) 2025-03-10 14:15:10 -05:00
Paulus Schoutsen
1665d9474f Enable TTS streaming implementations (#140176)
* Enable TTS streaming implementations

* Update comment

* Revert type change
2025-03-10 14:12:37 -05:00
Antoine Reversat
d498dbd5ac FGLair : Upgrade to ayla-iot-unofficial 1.4.7 (#140296)
Upgrade to ayla-iot-unofficial 1.4.7
2025-03-10 17:37:30 +01:00
Robert Resch
8807e326d1 Bump go2rtc to 1.9.9 (#140302) 2025-03-10 18:15:52 +02:00
Andrew Jackson
290116029b Add strict typing of account & instance to Mastodon (#139739)
Add strict typing of account & instance
2025-03-10 15:54:18 +01:00
Manu
ed20947e30 Fix events without user in Bring integration (#140213)
Fix events without publicUserUuid
2025-03-10 15:49:29 +01:00
Austin Mroczek
e4e476f83e TotalConnect add partition arming_state in diagnostic (#140140)
add partition arming_state
2025-03-10 15:18:13 +01:00
Brett Adams
8620309f9e Add streaming to Teslemetry update platform (#140021)
* Update platform

* Tests

* fix tests
2025-03-10 15:06:40 +01:00
J. Nick Koston
688d5bb4c9 Bump bluetooth-data-tools to 1.26.0 (#140262)
changelog: https://github.com/Bluetooth-Devices/bluetooth-data-tools/compare/v1.25.0...v1.26.0
2025-03-10 14:54:02 +01:00
Norbert Rittel
9edec57a82 Improve action descriptions in energyzero integration (#140283)
- use descriptive style to match HA standard
- fix sentence-casing of "Config entry"
2025-03-10 14:46:09 +01:00
Petar Petrov
00fc3f294b Bump zwave-js-server-python to 0.61.0 (#140282) 2025-03-10 14:45:48 +01:00
Norbert Rittel
f5c73027bb Improve description of schedule.get_schedule action (#140284)
Changes to descriptive style and adds a little more detail from the online docs.
2025-03-10 14:45:14 +01:00
Erik Montnemery
219b441be0 Don't allow creating backups if Home Assistant is not running (#139499)
* Don't allow creating backups if hass is not running

* Revert "Don't allow creating backups if hass is not running"

This reverts commit 1bf545eb25.

* Set backup manager to idle only after Home Assistant has started

* Update according to discussion, add tests

* Add more test
2025-03-10 14:40:08 +01:00
Joost Lekkerkerker
76e76a417c Fix dryer operating state in SmartThings (#140277) 2025-03-10 12:19:18 +01:00
Maikel Punie
994bf27024 Bump velbusaio to 2025.3.0 (#140267) 2025-03-10 11:45:37 +01:00
Jan Bouwhuis
6284a83a34 Fix client_id not generated when connecting to the MQTT broker (#140264)
Fix client_id not generated when connecting to the MQTT broker
2025-03-10 11:04:49 +01:00
epenet
25f15c1149 Use short-hand attributes in remote-rpi-gpio (#140263) 2025-03-10 10:46:54 +01:00
Maciej Bieniek
e831b1b230 Add support for BH1750 illuminance sensor in Nettigo Air Monitor integration (#140242)
* Add support for BH1750 illuminance sensor

* Update strings

* Update test snapshot
2025-03-10 10:38:44 +02:00
epenet
a3e981f148 Fix version not always available in onewire (#140260) 2025-03-10 09:16:05 +01:00
J. Nick Koston
0abe7514b9 Bump inkbird-ble to 0.8.0 (#140244)
Adds support for the ITH-21-B and ITH-13-B models
2025-03-10 10:15:41 +02:00
dependabot[bot]
40292a154d Bump github/codeql-action from 3.28.10 to 3.28.11 (#140254)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.28.10 to 3.28.11.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v3.28.10...v3.28.11)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-10 09:11:15 +01:00
Felipe Santos
8192f2ef2e Fix ONVIF camera entities ids getting shuffled on reload (#139676) 2025-03-09 17:17:55 -10:00
Maciej Bieniek
b3d640982d Bump nettigo_air_monitor to version 4.1.0 (#140241)
* Bump nam to 4.1.0

* Update test snapshot
2025-03-10 01:29:25 +02:00
David Bonnes
93982241a2 Bump evohome-async to 1.0.4 to fix #140194 (#140230)
bump client, add test for fix  #140194
2025-03-09 23:45:47 +02:00
J. Nick Koston
3c6b49b34f Bump aioesphomeapi to 29.5.1 (#140231)
changelog: https://github.com/esphome/aioesphomeapi/compare/v29.4.1...v29.5.1

Adds a `--verbose` flag to `aioesphomeapi-discover` to help
track down https://github.com/esphome/issues/issues/6311
2025-03-09 23:03:19 +02:00
J. Diego Rodríguez Royo
1766f87620 Refresh Home Connect token during config entry setup (#140233)
* Refresh token during config entry setup

* Test 500 error

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-03-09 21:59:09 +01:00
J. Diego Rodríguez Royo
717e5b95e6 Add 900 RPM option to washer spin speed options at Home Connect (#140234)
Add 900 RPM option to washer spin speed options
2025-03-09 21:40:15 +01:00
Keith
ff622af888 Add locking and unlocking feature to igloohome integration (#136002)
* - Added lock platform
- Added creation of IgloohomeLockEntity when bridge devices are included.

* - Migrated retrieval of linked_bridge utility to utils module.
- Added ability for lock to update it's own linked bridge automatically

* - Added mock bridge device to test fixture

* - Added snapshot test for lock module

* - Added bridge with no linked devices
- Added test for util.get_linked_bridge

* - Added handling of errors from API call

* - Bump igloohome-api to v0.1.0

* - Minor change

* - Removed async update for locks. Focus on MVP

* - Removed need for update on entity creation

* - Updated snapshot test

* - Updated snapshot

* - Updated to use walrus during lock entity creation
- Updated callback class for async_setup_entry based on lint suggestion

* - Set _attr_name as None
- Updated snapshot test

* Update homeassistant/components/igloohome/lock.py

* Update homeassistant/components/igloohome/lock.py

---------

Co-authored-by: Josef Zweck <josef@zweck.dev>
2025-03-09 20:47:13 +01:00
Martin Hjelmare
8b4d9f96d4 Remove mysensors assumed state dead code (#140227) 2025-03-09 20:16:34 +01:00
Martin Hjelmare
f3a43e273a Fix mysensors climate target temps (#140220)
* Test hvac node only hvac

* Assert supported features in all climate tests

* Fix mysensors climate target temperatures
2025-03-09 20:11:13 +01:00
Glenn Waters
7eeb3df1c2 Bump upb-lib to 0.6.1 (#140212) 2025-03-09 21:03:03 +02:00
Jan-Philipp Benecke
7cbcdbe610 Log broad exception in Electricity Maps config flow (#140219) 2025-03-09 21:01:07 +02:00
Simone Chemelli
8a51644d1d Align CONF_ in Shelly integration (#140202)
* Allign CONST_ in Shelly integration

* apply review comment
2025-03-09 18:04:00 +01:00
msm595
befcd63221 Fix the order of the group members attribute of the Music Assistant integration (#140204) 2025-03-09 16:07:35 +01:00
Galorhallen
264d4a53a2 Update govee-local-api to 2.1.0 (#140201) 2025-03-09 15:23:44 +01:00
Maciej Bieniek
8a67e89e91 Improve category map for air quality and pollen sensors in AccuWeather (#140193)
* Fix typo

* Improve category map for air quality and pollen

* Update test snapshot
2025-03-09 16:18:26 +02:00
Franck Nijhof
e8069e1c07 Add template functions: md5, sha1, sha256, sha512 (#140192) 2025-03-09 16:15:27 +02:00
Jan Bouwhuis
1a46edffaa Deprecate use of invalid unit of measurement for mqtt sensor (#140164)
* Deprecate use of invalid unit of measurement for mqtt sensor

* Update learn more URL to point to user docs instead

* typo
2025-03-09 14:20:31 +01:00
Manu
e2d4e8b65d Add create_todo action to Habitica integration (#140090) 2025-03-09 13:47:15 +01:00
Marc Mueller
f1a6e949c0 Update mypy-dev to 1.16.0a5 (#140188) 2025-03-09 13:12:08 +01:00
Simone Chemelli
03aff0d662 Use CONF_* const in Shelly tests (#140189) 2025-03-09 13:07:20 +01:00
J. Nick Koston
d9d47f7203 Migrate shelly Bluetooth scanner to use correct MAC address (#140180) 2025-03-09 13:28:56 +02:00
Maciej Bieniek
4e7dd92a3d Add Ogemray virtual integration (#140185) 2025-03-09 13:27:02 +02:00
J. Nick Koston
60db355577 Bump aioshelly to 13.2.0 (#140178)
Adds support for getting the Bluetooth MAC

changelog: https://github.com/home-assistant-libs/aioshelly/compare/13.1.0...13.2.0
2025-03-09 01:13:09 -05:00
Artur Pragacz
aa2a1fc5ef Fix not available source in Onkyo (#140175) 2025-03-08 22:42:57 -05:00
Allen Porter
6675b497bd Improve LLM tool descriptions for brightness and volume percentage (#138685)
* Improve tool descriptions for brightness and volume percentage

* Address lint errors

* Update intent.py to revert of a light

* Create explicit types to make intent slots more future proof

* Remove comments about slot type

---------

Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-03-08 22:28:35 -05:00
Artur Pragacz
f0c5e00cc1 Fix conversation trigger with variables (#140066) 2025-03-08 22:23:24 -05:00
J. Nick Koston
ffcc0496f1 Bump aioesphomeapi to 29.4.1 (#140165)
changelog: https://github.com/esphome/aioesphomeapi/compare/v29.4.0...v29.4.1
2025-03-08 12:52:51 -10:00
Jan Bouwhuis
0d3011f0fb Revert "Check if the unit of measurement is valid before creating the entity" (#140155)
Revert "Check if the unit of measurement is valid before creating the entity …"

This reverts commit 99e1a7a676.
2025-03-08 23:04:05 +01:00
Franck Nijhof
9aa8a786a5 Add template function: flatten (#140157) 2025-03-08 11:14:27 -10:00
Matthias Alphart
62c025fd12 Use HAs configured timezone for KNX expose time (#140158)
* Use HAs configured timezone for KNX expose time

* use `hass.config.async_set_time_zone` in tests
2025-03-08 21:46:15 +01:00
Norbert Rittel
be67f320b5 Fix typos in homeassistant_hardware strings (#140154)
- "addon" -> "add-on"
- "internet" -> "Internet"
- "an Thread border router" -> "a …"
2025-03-08 22:23:44 +02:00
Norbert Rittel
b0b28bd98a Replace typo "an code" with "alarm code" in elkm1 integration (#140143)
The use of "alarm code" matches the online docs, too.
2025-03-08 22:23:27 +02:00
Norbert Rittel
40f92bac93 Fix typo "an comma" in doorbird integration (#140146) 2025-03-08 22:22:30 +02:00
Norbert Rittel
726bd5b012 Fix typo "an connection" in aftership integration (#140148) 2025-03-08 22:22:06 +02:00
Norbert Rittel
9bbf4fe8c1 Make spelling of "MELCloud" consistent, fix typo "an connection" (#140150) 2025-03-08 22:21:46 +02:00
Norbert Rittel
e0cff8de84 Fix typo "an problem" in nmbs integration (#140151) 2025-03-08 22:21:24 +02:00
Franck Nijhof
e54febdc1e Add template function: typeof (#140081) 2025-03-08 09:16:21 -10:00
Jan Bouwhuis
d94bdb7ecd Fix MQTT JSON light not reporting color temp status if color is not supported (#140113) 2025-03-08 09:15:56 -10:00
Maciej Bieniek
06fd6442b6 Use the set language for condition sensors in Accuweather integration (#140107)
* Use the set language for condition sensors

* Update strings

* Update test snapshots

* Add missing string
2025-03-08 21:03:25 +02:00
Joost Lekkerkerker
b910bc7802 Set device class for Oven Completion time in SmartThings (#140139) 2025-03-08 20:58:10 +02:00
John Hillery
2d22a60b8f Label emergency heat switch (#139872)
* Add label to emergency heat switch

* Use sentence case names

Co-authored-by: Franck Nijhof <frenck@frenck.nl>

---------

Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2025-03-08 19:22:26 +01:00
Luke Lashley
6754bf2466 Send Roborock commands via cloud api when needed (#138496)
* Send via cloud api when needed

* Extract logic to helper function

* change to class method
2025-03-08 10:04:40 -08:00
Franck Nijhof
244b666dee Add Dependency Review action (#140108) 2025-03-08 14:59:29 +01:00
Joost Lekkerkerker
105d9d5970 Handle None options in SmartThings (#140110)
* Handle None options in SmartThings

* Handle None options in SmartThings
2025-03-08 14:59:10 +01:00
Andrew Sayre
81e6b93529 Fix HEOS user initiated setup when discovery is waiting confirmation (#140119) 2025-03-08 14:57:44 +01:00
Maciej Bieniek
7507a9c24e Bump accuweather to version 4.2.0 (#140106)
Bump accuweather to version 4.2.0
2025-03-08 12:50:32 +01:00
Franck Nijhof
1aed112c2c Update coverage to 7.6.12 (#140104) 2025-03-08 12:11:45 +01:00
Franck Nijhof
817597b07a Update ruff to 0.9.10 (#140105) 2025-03-08 12:10:56 +01:00
Franck Nijhof
2c68be3f7e Update pytest to 8.3.5 (#140102) 2025-03-08 12:02:41 +01:00
Joost Lekkerkerker
f209d75f2c Support null supported Thermostat modes in SmartThings (#140101) 2025-03-08 11:27:26 +01:00
Joost Lekkerkerker
ea33925afc Check support for thermostat operating state in SmartThings (#140103) 2025-03-08 11:22:09 +01:00
Joost Lekkerkerker
f399ffae72 Map prewash job state in SmartThings (#140097) 2025-03-08 10:57:25 +01:00
Matthias Alphart
3a2b446e33 Update pyfronius to 0.7.7 and adjust quality scale to platinum (#140084) 2025-03-08 06:48:09 +01:00
Andrew Sayre
deea19db51 Fix HEOS discovery error when previously ignored (#140091)
Abort ignored discovery
2025-03-07 23:31:32 -05:00
J. Nick Koston
e2c050ed40 Cache sensor precision calculation (#140019) 2025-03-07 16:14:22 -10:00
Greg Dowling
02e9002466 Set media type correctly in the roon integration- so the media card correctly displays the artist. (#139871)
Set media type correctly - so media card display works properly.
2025-03-07 20:59:04 -05:00
Franck Nijhof
d4f205c366 Add template function: shuffle (#140077) 2025-03-07 20:36:17 -05:00
David Bonnes
b7094c12f7 Update evohome-async to 1.0.3 (#140083)
bump client to 1.0.3
2025-03-08 00:17:29 +01:00
Petro31
293d455cba Add check for invalid options with specific platforms (#140082) 2025-03-08 00:09:04 +01:00
Simone Chemelli
99b5adaef1 Cleanup add_to_hass method in Shelly tests (part 1) (#140075) 2025-03-07 23:04:49 +01:00
Evan Farrell
aa556d8678 Bump govee_ble to 0.43.1 (#139862)
Bump govee_ble to 0.43.0
2025-03-07 11:15:22 -10:00
Franck Nijhof
9b14faa43d Update jinja to 3.1.6 (#140069) 2025-03-07 20:35:36 +01:00
Keilin Bickar
52838d8b84 Bump sense-energy lib to 0.13.7 (#140068) 2025-03-07 20:29:11 +01:00
Franck Nijhof
ccb0be9df4 Update debugpy to 1.8.13 (#140067) 2025-03-07 20:27:01 +01:00
Josef Zweck
3b03a37f3b Add file upload service to OneDrive (#139092)
* Add file upload service to OneDrive

* fix

* Add test

* docstring

* docstring

* Fix capitalization in description text.
2025-03-07 20:05:13 +01:00
Manu
3ccb7d80f3 Add update_todo action to Habitica (#139799)
* update_todo action

* fix strings
2025-03-07 19:40:17 +01:00
Franck Nijhof
4e89948b5c 2025.3.1 (#140061) 2025-03-07 18:54:39 +01:00
Norbert Rittel
fe34e6beee Improve user-facing strings of Bang & Olufsen integration (#140062)
- fix typo "Setup …" -> "Set up …"
- fix the wrong capitalization of "… all Connected …"
- change all action descriptions to match Home Assistant style
- reword descriptions of `beolink_expand` and `beolink_unexpand` action using different verbs to better explain them
2025-03-07 18:16:55 +01:00
Franck Nijhof
9f95383201 Bump version to 2025.3.1 2025-03-07 17:03:29 +00:00
Joost Lekkerkerker
7e452521c8 Restore SmartThings button event (#140044)
* Restore SmartThings button event

* Fix
2025-03-07 17:03:16 +00:00
Michael
991de6f1d0 Bump py-synologydsm-api to 2.7.1 (#140052)
bump py-synologydsm-api to 2.7.1
2025-03-07 16:49:07 +00:00
Joost Lekkerkerker
be32e3fe8f Only keep valid powerConsumptionReports in SmartThings (#140049)
* power consumption report

* Only keep valid powerConsumptionReports in SmartThings
2025-03-07 16:49:03 +00:00
Joost Lekkerkerker
d6eb61e9ec Bump pysmartthings to 2.7.0 (#140047) 2025-03-07 16:49:00 +00:00
Joost Lekkerkerker
e74fe69d65 Fix SmartThings thermostat climate check (#140046)
* Fix SmartThings thermostat climate check

* Add tests
2025-03-07 16:48:55 +00:00
Joost Lekkerkerker
208406123e Fix SmartThings disabling working capabilities (#140039) 2025-03-07 16:03:40 +00:00
David Bonnes
8bcd135f3d Fix evohome to gracefully handle null schedules (#140036)
* extend tests to catch null schedules

* add fixture with null schedule

* remove null schedules for now

* fic the typing for _schedule attr (is list, not dict)

* add valid schedule to fixture

* update ssetpoints only if there is a schedule

* snapshot to match last change

* refactor: dont update switchpoints if no schedule

* add in warnings for null schedules

* add fixture for DHW without schedule
2025-03-07 16:03:36 +00:00
hahn-th
e7ea0e435e Add description for HomematicIP HCU1 in homematicip_cloud setup config flow (#140025)
add description for hcu1
2025-03-07 16:03:33 +00:00
Brett Adams
b15b680cfe Fix shift state default in Teslemetry and Tessie (#140018)
* Fix again

* Fix Tessie

* Update snap
2025-03-07 16:03:29 +00:00
Brett Adams
5e26d98bdf Fix powerwall 0% in Tessie and Tesla Fleet (#140017)
Fix powerwall zero
2025-03-07 16:03:26 +00:00
Martin Hjelmare
9f94ee280a Bump aiohomeconnect to 0.16.3 (#140014) 2025-03-07 16:03:23 +00:00
J. Diego Rodríguez Royo
efa98539fa Check operation state on Home Connect program sensor update (#140011)
Check operation state on program sensor update
2025-03-07 16:03:19 +00:00
David Bonnes
113cd4bfcc Fix regression to evohome debug logging (#140000)
* fix regression in debug logging

* lint
2025-03-07 16:03:15 +00:00
Ivan Lopez Hernandez
ccbaf76e44 Correctly retrieve only loaded Google Generative AI config_entries (#139999)
* Correctly retrieve only loaded config_entries

* Ruff
2025-03-07 16:03:08 +00:00
Jan-Philipp Benecke
5d9d93d3a1 Bump aiowebdav2 to 0.4.1 (#139988) 2025-03-07 16:03:04 +00:00
J. Nick Koston
c2c5274aac Bump nexia to 2.2.2 (#139986)
changelog: https://github.com/bdraco/nexia/compare/2.2.1...2.2.2
2025-03-07 16:03:01 +00:00
Joost Lekkerkerker
89756394c9 Fix SmartThings dust sensor UoM (#139977) 2025-03-07 16:02:57 +00:00
Bram Kragten
352aa88e79 Update frontend to 20250306.0 (#139965) 2025-03-07 16:02:54 +00:00
Joost Lekkerkerker
714962bd7a Fix SmartThings fan (#139962) 2025-03-07 16:02:50 +00:00
Luke Lashley
fb4c50b5dc Bump to python-snoo 0.6.1 (#139954) 2025-03-07 16:02:47 +00:00
Jan-Philipp Benecke
b4794b2029 Set content length when uploading files to WebDAV (#139950) 2025-03-07 16:02:43 +00:00
Joost Lekkerkerker
3a8c8accfe Add config entry level diagnostics to SmartThings (#139939)
* Add config entry level diagnostics to SmartThings

* Add config entry level diagnostics to SmartThings

* Add config entry level diagnostics to SmartThings
2025-03-07 16:02:40 +00:00
Jan-Philipp Benecke
844adfc590 Bump aiowebdav2 to 0.4.0 (#139938) 2025-03-07 16:02:36 +00:00
Joost Lekkerkerker
a279e23fb5 Bump pysmartthings to 2.6.1 (#139936)
* Bump pysmartthings to 2.6.1

* Bump pysmartthings to 2.6.1
2025-03-07 15:58:00 +00:00
Jan Bouwhuis
af9bbd0585 Check if the unit of measurement is valid before creating the entity (#139932) 2025-03-07 15:50:55 +00:00
Joost Lekkerkerker
1304194f09 Deduplicate climate modes in SmartThings (#139930)
* Deduplicate climate modes in SmartThings

* Deduplicate climate modes in SmartThings
2025-03-07 15:50:51 +00:00
J. Nick Koston
e909417a3f Bump thermobeacon-ble to 0.8.1 (#139919)
changelog: https://github.com/Bluetooth-Devices/thermobeacon-ble/compare/v0.8.0...v0.8.1

fixes #139917
2025-03-07 15:50:48 +00:00
Ivan Lopez Hernandez
02706c116d Trim the Schema allowed keys to match the Public Gemini API docs. (#139876)
* Trim the Schema allowed types to match the Public API docs, not the SDK types as those do not match

* Testing
2025-03-07 15:50:43 +00:00
peteS-UK
3af6b5cb4c Fix Unit of Measurement for Squeezebox duration sensor entity on LMS service (#139861)
UOM Fix
2025-03-07 15:42:02 +00:00
Ishima
35c1bb1ec5 Check support for demand load control in SmartThings AC (#139616)
* Check support for demand load control in SmartThings AC

* Fix

---------

Co-authored-by: Joostlek <joostlek@outlook.com>
2025-03-07 15:41:52 +00:00
Joost Lekkerkerker
e51154ae69 Restore SmartThings button event (#140044)
* Restore SmartThings button event

* Fix
2025-03-07 15:46:00 +01:00
Michael
cd2ce5e11b Bump py-synologydsm-api to 2.7.1 (#140052)
bump py-synologydsm-api to 2.7.1
2025-03-07 15:44:58 +01:00
Martin Hjelmare
27964e16c1 Clean up ondilo ico oauth2 (#139927) 2025-03-07 15:26:40 +01:00
Norbert Rittel
edd2d4c349 Improve strings of swiss_public_transport.fetch_connections action (#139911)
Improve strings of `swiss_public.transport.fetch_connections` action

- use sentence-casing in action name
- capitalize the integration name in action description
- remove "from [1-15]" from `limit` description as this is handled by the UI
2025-03-07 15:25:37 +01:00
Joost Lekkerkerker
0aa09a2d51 Only keep valid powerConsumptionReports in SmartThings (#140049)
* power consumption report

* Only keep valid powerConsumptionReports in SmartThings
2025-03-07 15:04:46 +01:00
Joost Lekkerkerker
62e45e393d Fix SmartThings thermostat climate check (#140046)
* Fix SmartThings thermostat climate check

* Add tests
2025-03-07 14:56:31 +01:00
Joost Lekkerkerker
eadff2938f Bump pysmartthings to 2.7.0 (#140047) 2025-03-07 14:26:43 +01:00
peteS-UK
354cd90c92 Fix Unit of Measurement for Squeezebox duration sensor entity on LMS service (#139861)
UOM Fix
2025-03-07 13:53:24 +01:00
Norbert Rittel
11348959ca Make descriptions of keymitt_ble.calibrate action UI-friendly (#139866)
* Make descriptions of `keymitt_ble.calibrate` action UI-friendly

Update the action and field descriptions to better work within the graphical UI (selector / units shown) and for translations.

* Change to "press or release" to cover the 'Invert' mode
2025-03-07 13:39:48 +01:00
Brett Adams
935890e4e0 Fix shift state default in Teslemetry and Tessie (#140018)
* Fix again

* Fix Tessie

* Update snap
2025-03-07 13:28:21 +01:00
Abílio Costa
82d5304b45 Update whirlpool-sixth-sense to 0.19.1 (#139987) 2025-03-07 13:13:35 +01:00
hahn-th
2401d8900a Add description for HomematicIP HCU1 in homematicip_cloud setup config flow (#140025)
add description for hcu1
2025-03-07 13:11:45 +01:00
David Bonnes
c834944ee7 Fix evohome to gracefully handle null schedules (#140036)
* extend tests to catch null schedules

* add fixture with null schedule

* remove null schedules for now

* fic the typing for _schedule attr (is list, not dict)

* add valid schedule to fixture

* update ssetpoints only if there is a schedule

* snapshot to match last change

* refactor: dont update switchpoints if no schedule

* add in warnings for null schedules

* add fixture for DHW without schedule
2025-03-07 13:04:04 +01:00
J. Nick Koston
9a90e1e410 Bump ulid-transform to 1.4.0 (#140037)
changelog: https://github.com/Bluetooth-Devices/ulid-transform/compare/v1.3.0...v1.4.0
2025-03-07 13:01:31 +01:00
Joost Lekkerkerker
73ef240921 Fix SmartThings disabling working capabilities (#140039) 2025-03-07 12:55:32 +01:00
J. Nick Koston
2985f08054 Bump dbus-fast to 2.39.3 (#140015)
* Bump dbus-fast to 2.39.2

changelog: https://github.com/Bluetooth-Devices/dbus-fast/compare/v2.37.0...v2.39.2

* bump again for more fixes
2025-03-07 12:56:00 +02:00
Jan-Philipp Benecke
8780bc99eb Set content length when uploading files to WebDAV (#139950) 2025-03-07 10:44:17 +01:00
David Bonnes
452fbbe61c Fix regression to evohome debug logging (#140000)
* fix regression in debug logging

* lint
2025-03-07 09:12:21 +00:00
Brett Adams
6be8370eb3 Fix powerwall 0% in Tessie and Tesla Fleet (#140017)
Fix powerwall zero
2025-03-07 08:45:25 +01:00
Martin Hjelmare
9682d3b313 Bump aiohomeconnect to 0.16.3 (#140014) 2025-03-06 20:50:34 -10:00
Paulus Schoutsen
d47481a30e Track when an LLM expects to continue a conversation (#139810)
* Track when an LLM expects to continue a conversation

* Strip content

* Address comments
2025-03-06 22:52:29 -05:00
J. Diego Rodríguez Royo
3dd1fadc7d Check operation state on Home Connect program sensor update (#140011)
Check operation state on program sensor update
2025-03-07 01:50:06 +01:00
Jan-Philipp Benecke
fd1044dcba Bump aiowebdav2 to 0.4.1 (#139988) 2025-03-06 22:06:47 +00:00
Ivan Lopez Hernandez
2aa584ce39 Correctly retrieve only loaded Google Generative AI config_entries (#139999)
* Correctly retrieve only loaded config_entries

* Ruff
2025-03-06 13:17:33 -08:00
J. Nick Koston
e78139edf1 Bump nexia to 2.2.2 (#139986)
changelog: https://github.com/bdraco/nexia/compare/2.2.1...2.2.2
2025-03-06 10:10:07 -10:00
Allen Porter
eb49e596f9 Add a roborock quality_scale.yaml (#139849)
* Add a roborock quality_scale.yaml

* Update wording in polling

* Update event listening

* Update quality scale based on feedback
2025-03-06 19:00:40 +00:00
Markus Adrario
eaad8ec49d Add Homee select platform (#139534)
* homee select initial

* Finish select tests

* Add motor rotation

* fix snapshot after translation compilation

* string improvement

* last fixes

* fix review comments

* remove restore last known state

* readd wind monitoring state

* fix strings

* remove problematic selects

* remove motor rotation from strings

* fix review comments

* Update tests/components/homee/test_select.py

Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>

* add PARALLEL_UPDATES

* parallel updates for select, not light.

---------

Co-authored-by: Robert Resch <robert@resch.dev>
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-03-06 18:56:17 +00:00
Jan Bouwhuis
99e1a7a676 Check if the unit of measurement is valid before creating the entity (#139932) 2025-03-06 18:52:46 +01:00
Martin Hjelmare
4ff2309a90 Use mysensors config entry async_on_unload (#139978)
* Use config entry on unload in mysensors

* Test mysensors config entry load and unload

* Fix docstring
2025-03-06 18:50:47 +01:00
Joost Lekkerkerker
4bafdf5e4b Add config entry level diagnostics to SmartThings (#139939)
* Add config entry level diagnostics to SmartThings

* Add config entry level diagnostics to SmartThings

* Add config entry level diagnostics to SmartThings
2025-03-06 18:48:39 +01:00
Joost Lekkerkerker
f38a32477e Fix SmartThings fan (#139962) 2025-03-06 18:47:37 +01:00
Luke Lashley
59073d47a1 Bump to python-snoo 0.6.1 (#139954) 2025-03-06 18:44:13 +01:00
Regev Brody
df1563daaf Add Roborock buttons for starting routines (#139845) 2025-03-06 17:18:37 +00:00
Bram Kragten
93dfbb4166 Update frontend to 20250306.0 (#139965) 2025-03-06 17:52:45 +01:00
Joost Lekkerkerker
9549b1488e Fix SmartThings dust sensor UoM (#139977) 2025-03-06 17:52:05 +01:00
Erik Montnemery
6ba45a32c0 Update typing of BackupAgent.async_get_backup (#139923)
* Update typing of BackupAgent.async_get_backup

* Remove manual reset of frame helper
2025-03-06 17:25:34 +01:00
Artur Pragacz
88f18fdfdc Improve loader dependency tests (#139916) 2025-03-06 15:20:08 +01:00
epenet
377e0a64d1 Reset helpers.frame._REPORTED_INTEGRATIONS in between tests (#139924)
* Reset helpers.frame._REPORTED_INTEGRATIONS in between tests

* Rename

* Apply suggestions from code review

Co-authored-by: Erik Montnemery <erik@montnemery.com>

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-03-06 13:57:13 +01:00
epenet
1a4a3a0f08 Use runtime_data in forked_daapd (#138284)
* Use runtime_data in forked_daapd

* Adjust
2025-03-06 13:42:35 +01:00
Ishima
485da61d3c Check support for demand load control in SmartThings AC (#139616)
* Check support for demand load control in SmartThings AC

* Fix

---------

Co-authored-by: Joostlek <joostlek@outlook.com>
2025-03-06 13:42:23 +01:00
Jan-Philipp Benecke
5d7b60e4c8 Bump aiowebdav2 to 0.4.0 (#139938) 2025-03-06 13:30:02 +01:00
marc7s
5d8e03c124 Update geocachingapi to v0.3.0 (#139878)
Bump Geocaching API version

Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-03-06 13:29:30 +01:00
Joost Lekkerkerker
edc763b7d2 Bump pysmartthings to 2.6.1 (#139936)
* Bump pysmartthings to 2.6.1

* Bump pysmartthings to 2.6.1
2025-03-06 13:22:49 +01:00
Erik Montnemery
c51e644203 Prioritize integration_domain passed to helper.frame.report_usage (#139819)
* Prioritize integration_domain passed to helper.frame.report_usage

* Update tests

* Update tests

* Improve docstring

* Rename according to suggestion
2025-03-06 13:16:50 +01:00
Franck Nijhof
dc4464a347 Merge branch 'master' into dev 2025-03-06 12:10:27 +00:00
Marc Mueller
47919fe7e9 Simplify lint-only config (2) [ci] (#139933) 2025-03-06 12:56:46 +01:00
Martin Hjelmare
6455daf092 Set Ondilo ICO diagnostic sensors (#139934) 2025-03-06 12:30:42 +01:00
Norbert Rittel
e06af94a1a Improve description of tibber.get_prices action (#139863)
Replace with the description from the online docs which add the information that a price level is included.

This also makes it consistent with the standard descriptive style in Home Assistant.
2025-03-06 12:22:36 +01:00
Joost Lekkerkerker
052eed6bb3 Deduplicate climate modes in SmartThings (#139930)
* Deduplicate climate modes in SmartThings

* Deduplicate climate modes in SmartThings
2025-03-06 12:20:53 +01:00
Markus Adrario
095b04caf9 Homee parallel updates (#139926)
* set parallel updates to 0

* add platforms
2025-03-06 12:20:22 +01:00
epenet
83dd1af6d2 Drop report method from frame helper (#139920)
* Drop report method from frame helper

* Adjust test_prevent_flooding

* Adjust test_report_missing_integration_frame

* Adjust test_report_error_if_integration

* Remove test_report
2025-03-06 11:25:22 +01:00
J. Nick Koston
8bfffcbd29 Bump thermobeacon-ble to 0.8.1 (#139919)
changelog: https://github.com/Bluetooth-Devices/thermobeacon-ble/compare/v0.8.0...v0.8.1

fixes #139917
2025-03-06 11:24:56 +01:00
Manu
f2b07ea886 Add support for IronOS v2.23 (#139903)
Add support for IronOS 2.23
2025-03-06 11:23:10 +01:00
Norbert Rittel
4f255439eb Fix sentence-casing in music_assistant.get_library action (#139901)
- make the casing of several words consistent
- make the action's description consistent with HA style using "Retrieves …" instead of "Get …"
2025-03-06 11:11:22 +01:00
Avi Miller
b44c26d324 Bump aiolifx to 1.1.4 to enable new LIFX product support (#139897)
Signed-off-by: Avi Miller <me@dje.li>
2025-03-06 11:10:49 +01:00
dependabot[bot]
46f4bc3434 Bump actions/attest-build-provenance from 2.2.2 to 2.2.3 (#139896)
Bumps [actions/attest-build-provenance](https://github.com/actions/attest-build-provenance) from 2.2.2 to 2.2.3.
- [Release notes](https://github.com/actions/attest-build-provenance/releases)
- [Changelog](https://github.com/actions/attest-build-provenance/blob/main/RELEASE.md)
- [Commits](bd77c07785...c074443f1a)

---
updated-dependencies:
- dependency-name: actions/attest-build-provenance
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-06 10:02:16 +01:00
J. Nick Koston
b280874dc0 Small cleanups for HomeKit (#139889)
* Small cleanups for HomeKit

- Add some missing typing
- Break out some duplicate code

* Small cleanups for HomeKit

- Add some missing typing
- Break out some duplicate code
2025-03-05 22:54:48 -10:00
Petro31
aec6868af1 Add abstract class to trigger based template entities (#139650)
* add abstract class to trigger based template entities

* updates after merge of parent PR

* add comments

* add tests
2025-03-06 08:00:11 +01:00
Manu
48865e00b6 Bump pynecil to v4.1.0 (#139881) 2025-03-06 07:42:09 +01:00
J. Nick Koston
a5002018e0 Bump dbus-fast to 2.37.0 (#139877) 2025-03-06 07:38:23 +01:00
Ivan Lopez Hernandez
8e35783164 Trim the Schema allowed keys to match the Public Gemini API docs. (#139876)
* Trim the Schema allowed types to match the Public API docs, not the SDK types as those do not match

* Testing
2025-03-05 18:34:11 -08:00
Norbert Rittel
f8e3f2a94f Improve descriptions in overseerr.get_requests action (#139781)
Make the action description consistent with HA style adding a bit more info from the online docs.

Fix spelling of "ID"
2025-03-05 23:00:12 +00:00
pglab-electronics
cc30823726 Reimplement PGLab sensor to use a coordinator (#139789)
* Reimplement PGLab sensor to use a coordinator

* fix spelling mistake on coordinator name

* rename createDiscoverDeviceInfo function in snake_case

* adding suffix pglab_ to PGLabBaseEntity/PGLabEntity constructor parameters

* Fix docs of PGLabEntity::async_added_to_hass

* make coordinator able to return the sensor native value

* renaming PGLABConfigEntry in PGLabConfigEntry to be consistent with the integration naming

* renamed entry function arguments to config_entry to be less confusing

* pass config_entry to constructor of base class of PGLabSensorsCoordinator

* set the return value type of get_sensor_value

* store coordinator as regular instance attribute

* Avoid to access directly entity from discovery module

* Rearrange get_sensor_value return types
2025-03-05 20:33:59 +01:00
Franck Nijhof
97cc3984c5 2025.3.0 (#139859)
* Add vesync debug mode in library (#134571)

* Debug mode pass through

* Correct code, shouldn't have been lambda

* listener for change

* ruff

* Update manifest.json

* Reflect correct logger title

* Ruff fix from merge

* Fix return value for DataUpdateCoordinator._async setup (#139181)

Fix return value for coodinator async setup

* Fix race in WS command recorder/info (#139177)

* Fix race in WS command recorder/info

* Add comment

* Remove unnecessary local import

* Bump aiohttp to 3.11.13 (#139197)

changelog: https://github.com/aio-libs/aiohttp/compare/v3.11.12...v3.11.13

* Update Linkplay constants for Arylic S10+ and Arylic Up2Stream Amp 2.1 (#138198)

* Add support for Apps and Radios to Squeezebox Media Browser (#135009)

* Add azure_storage as backup agent (#134085)

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

* Bump onedrive quality scale to platinum (#137451)

* Bump pyloadapi to v1.4.2 (#139140)

* Add missing translations to switchbot (#139212)

* Fix bug in check_translations fixture (#139206)

* Fix bug in check_translations fixture

* Fix check for ignored translation errors

* Fix websocket_api test

* Add missing exception translation to Home Connect (#139218)

Add missing exception translation

* Configure trusted publishing for PyPI file upload (#137607)

* Bump aiostreammagic to 2.11.0 (#139213)

* Add missing exception translation to Home Connect (#139223)

* Bump ohmepy to 1.3.2 (#139013)

* Fix kitchen_sink statistic issues (#139228)

* Bump aiowebdav2 to 0.3.0 (#139202)

* Bump pylamarzocco to 1.4.7 (#139231)

* Add backup helper (#139199)

* Add backup helper

* Add hassio to stage 1

* Apply same changes to newly merged `webdav` and `azure_storage` to fix inflight conflict

* Address comments, add tests

---------

Co-authored-by: J. Nick Koston <nick@koston.org>

* Reduce requests made by webdav (#139238)

* Reduce requests made by webdav

* Update homeassistant/components/webdav/backup.py

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

* Add Homee valve platform (#139188)

* Fix units for LCN sensor (#138940)

* Add Ohme voltage and slot list sensor (#139203)

* Bump ohmepy to 1.3.1

* Bump ohmepy to 1.3.2

* Add voltage and slot list sensor

* CI fixes

* Change slot list sensor name

* Fix snapshot tests

* Initiate source list as instance variable in Volumio (#139243)

* `logbook.log` action: Make description of  `name` field UI-friendly (#139200)

* Treat "Twist Assist" & "Block to Block" as feature names and add descriptions in Z-Wave (#139239)

Treat "Twist Assist" & "Block to Block" as feature names and add descriptions

- name-case both "Twist Assist" and "Block to Block" so those feature names don't get translated
- for proper translation of both features add useful descriptions of what they actually do
- fix sentence-casing on "Operation type"

* Add climate's swing mode to LG ThinQ (#137619)

Co-authored-by: yunseon.park <yunseon.park@lge.com>

* Bump aiowithings to 3.1.6 (#139242)

* Add update reward action to Habitica integration (#139157)

* Add Re-Auth Flow to vesync (#137398)

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* Rework the velbus configflow to make it more user-friendly (#135609)

* Add missing ATTR_HVAC_MODE of async_set_temperature to LG ThinQ (#137621)

Co-authored-by: yunseon.park <yunseon.park@lge.com>

* Make Radarr units translatable (#139250)

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* Improve Minecraft Server config flow tests (#139251)

* Revert "Bump Stookwijzer to 1.5.7" (#139253)

* Add parallel updates to Home Connect (#139255)

* Bump fnv-hash-fast to 1.2.6 (#139246)

* Make default dim level configurable in Lutron (#137127)

* Set PARALLEL_UPDATES in all Minecraft Server platforms (#139259)

* Bump aiowebostv to 0.7.1 (#139244)

* Consistently capitalize "Velbus" brand name, camel-case "VelServ" (#139257)

* Bump cached-ipaddress to 0.9.2 (#139245)

* Make Sonarr component's units translatable (#139254)

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* Bump stookwijzer to 1.5.8 (#139258)

* Bump Velbus to bronze quality scale (#139256)

* Add Homee number platform (#138962)

Co-authored-by: Joostlek <joostlek@outlook.com>

* Fix yolink lock v2 state update (#138710)

* Set Minecraft Server quality scale to silver (#139265)

* Add OpenWeatherMap Minute forecast action (#128799)

* Fix Ezviz entity state for cameras that are offline (#136003)

* Use proper camel-case for "VeSync", fix sentence-casing in title (#139252)

Just a quick follow-up PR to fix these two spelling mistakes.

* Add request made by `rest_command` to debug log (#139266)

* Create repair for configured unavailable backup agents (#137382)

* Create repair for configured not loaded agents

* Rework to repair issue

* Extract logic to config function

* Update test

* Handle empty agend ids config update

* Address review comment

* Update tests

* Address comment

* Improve description of `openweathermap.get_minute_forecast` action (#139267)

* Use right import in ezviz (#139272)

* Change touchline dependency to pytouchline_extended (#136362)

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* Rename description field to notes in Habitica action (#139271)

* Add support for effects in Govee lights (#137846)

* Add Burbank Water and Power (BWP) virtual integration (#139027)

* Update adext to 0.4.4 (#139151)

* Add sound mode support to Onkyo (#133531)

* Use new python library for picnic component (#139111)

* Bump securetar to 2025.2.1 (#139273)

* Fix race in async_get_integrations with multiple calls when an integration is not found (#139270)

* Fix race in async_get_integrations with multiple calls when an integration is not found

* Fix race in async_get_integrations with multiple calls when an integration is not found

* Fix race in async_get_integrations with multiple calls when an integration is not found

* tweaks

* tweaks

* tweaks

* restore lost comment

* tweak test

* comment cache

* improve test

* improve comment

* Bump python-overseerr to 0.7.1 (#139263)

Co-authored-by: Shay Levy <levyshay1@gmail.com>

* Add coordinator to SMHI (#139052)

* Add coordinator to SMHI

* Remove not needed logging

* docstrings

* Make Radarr unit translation lowercase (#139261)

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* Add common state translation string for charging and discharging (#139074)

add common state translation string for charging and discharging

* Add test fixture ignore_translations_for_mock_domains (#139235)

* Add test fixture ignore_translations_for_mock_domains

* Fix fixture

* Avoid unnecessary attempt to get integration

* Really fix fixture

* Add forgotten parameter

* Address review comment

* Fix grammar in loader comments (#139276)

https://github.com/home-assistant/core/pull/139270#discussion_r1970315129

* Bump aiohomeconnect to 0.15.0 (#139277)

* Add current cavity temperature sensor to Home Connect (#139282)

* Bump anthropic to 0.47.2 (#139283)

* Adjust recorder validate_statistics handler (#139229)

* Fix re-connect logic in Apple TV integration (#139289)

* Revert "Bump stookwijzer==1.5.8" (#139287)

* Add option to ESPHome to subscribe to logs (#139073)

* Remove not used constants in smhi (#139298)

* Bump `aioshelly` to version `13.0.0` (#139294)

* Bump aioshelly to version 13.0.0

* MODEL_BLU_GATEWAY_GEN3 -> MODEL_BLU_GATEWAY_G3

* Remove timeout from vscode test launch configuration (#139288)

* Add missing Home Connect context at event listener registration for appliance options (#139292)

* Add missing context at event listener registration for appliance options

* Add tests

* Sort common translation strings (#139300)

sort common strings

* Add album artist media browser category to Squeezebox (#139210)

* Bump aioesphomeapi to 29.2.0 (#139309)

* Bump actions/download-artifact from 4.1.8 to 4.1.9 (#139317)

Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4.1.8 to 4.1.9.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v4.1.8...v4.1.9)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump home-assistant/builder from 2024.08.2 to 2025.02.0 (#139316)

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Adjust remote ESPHome log subscription level on logging change (#139308)

* Fix homeassistant/expose_entity/list (#138872)

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>

* Bump `accuweather` to version `4.1.0` (#139320)

* Bump ZHA to 0.0.50 (#139318)

* Bump pytechnove to 2.0.0 (#139314)

* Update python-smarttub dependency to 0.0.39 (#139313)

* Fix anthropic blocking call (#139299)

* Bump pybotvac to 0.0.26 (#139330)

* Bump stookwijzer==1.6.0 (#139332)

* Improve error message when failing to create backups (#139262)

* Improve error message when failing to create backups

* Check for expected error message in tests

* Add translations and icon for Twinkly select entity (#139336)

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* Bump recommended ESPHome Bluetooth proxy version to 2025.2.1 (#139196)

* Add default_db_url flag to WS command recorder/info (#139333)

* Improve action descriptions of LIFX integration (#139329)

Improve action description of lifx integration

- fix sentence-casing on two action names
- change "Kelvin" unit name to proper uppercase
- reference 'Theme' and 'Palette' fields by their friendly names for matching translations
- change paint_theme action description to match HA style

* Bump Music Assistant client to 1.1.1 (#139331)

* Refactor SmartThings (#137940)

* Add keys initiate_flow and entry_type to data entry translations (#138882)

* Add support for swing horizontal mode for mqtt climate (#139303)

* Add support for swing horizontal mode for mqtt climate

* Fix import

* Add entity translations to SmartThings (#139342)

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* Refactor SmartThings

* fix

* fix

* Add AC tests

* Add thermostat tests

* Add cover tests

* Add device tests

* Add light tests

* Add rest of the tests

* Add oauth

* Add oauth tests

* Add oauth tests

* Add oauth tests

* Add oauth tests

* Bump version

* Add rest of the tests

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Finalize

* Iterate over entities instead

* use set

* use const

* uncomment

* fix handler

* Fix device info

* Fix device info

* Fix lib

* Fix lib

* Fix

* Fix

* Fix

* Fix

* Fix

* Fix

* Fix

* Fix

* Fix

* Add fake fan

* Fix

* Add entity translations to SmartThings

* Fix

* Improve logging for selected options in Onkyo (#139279)

Different error for not selected option

* Change no fixtures comment in SmartThings (#139344)

* Set options for carbon monoxide detector sensor in SmartThings (#139346)

* Improve calculating supported features in template light (#139339)

* Update frontend to 20250226.0 (#139340)

Co-authored-by: Robert Resch <robert@resch.dev>

* Use particulate matter device class in SmartThings (#139351)

Use particule matter device class in SmartThings

* Set options for dishwasher job state sensor in SmartThings (#139349)

* Set options for dishwasher machine state sensor in SmartThings (#139347)

* Set options for dishwasher machine state sensor in SmartThings

* Fix

* Set options for alarm sensor in SmartThings (#139345)

* Set options for alarm sensor in SmartThings

* Set options for alarm sensor in SmartThings

* Fix

* Fix variable scopes in scripts (#138883)

Co-authored-by: Erik <erik@montnemery.com>

* Add translatable states to SmartThings media source input (#139353)

Add translatable states to media source input

* Add translatable states to SmartThings media playback (#139354)

Add translatable states to media playback

* Add translatable states to oven mode in SmartThings (#139356)

* Add translatable states to oven job state in SmartThings (#139361)

* Add translatable states to oven machine state (#139358)

* Add translatable states to robot cleaner movement in SmartThings (#139363)

* Add translatable states to robot cleaner cleaning mode in SmartThings (#139362)

* Add translatable states to robot cleaner cleaning mode in SmartThings

* Update homeassistant/components/smartthings/strings.json

* Update homeassistant/components/smartthings/strings.json

---------

Co-authored-by: Josef Zweck <josef@zweck.dev>

* Add translatable states to washer machine state in SmartThings (#139366)

* Add translatable states to smoke detector in SmartThings (#139365)

* Add translatable states to robot cleaner turbo mode in SmartThings (#139364)

* Add translatable states to washer job state in SmartThings (#139368)

* Add translatable states to washer job state in SmartThings

* fix

* Update homeassistant/components/smartthings/sensor.py

* Improve Home Connect oven cavity temperature sensor (#139355)

* Improve oven cavity temperature translation

* Fetch cavity temperature unit

* Handle generic Home Connect error

* Improve test clarity

* Add translatable states to dryer machine state in Smartthings (#139369)

* Add translatable states to dryer job state in SmartThings (#139370)

* Add translatable states to washer job state in SmartThings

* Add translatable states to dryer job state in Smartthings

* fix

* fix

* Don't create entities for disabled capabilities in SmartThings (#139343)

* Don't create entities for disabled capabilities in SmartThings

* Fix

* fix

* fix

* Fix typo in SmartThing string (#139373)

* Bump version to 2025.3.0b0

* Bump stookwijzer==1.6.1 (#139380)

* Bump ZHA to 0.0.51 (#139383)

* Bump ZHA to 0.0.51

* Fix unit tests not accounting for primary entities

* Bump intents to 2025.2.26 (#139387)

* Fix fetch options error for Home connect (#139392)

* Handle errors when obtaining options definitions

* Don't fetch program options if the program key is unknown

* Test to ensure that available program endpoint is not called on unknown program

* Bump onedrive to 0.0.12 (#139410)

* Bump onedrive to 0.0.12

* Add alternative name

* Bump pysmartthings to 2.0.0 (#139418)

* Bump pysmartthings to 2.0.0

* Fix

* Fix

* Fix

* Fix

* Bump habluetooth to 3.24.1 (#139420)

* Fix conversation agent fallback (#139421)

* Add diagnostics to SmartThings (#139423)

* Bump bleak-esphome to 2.8.0 (#139426)

* Bump reolink-aio to 0.12.1 (#139427)

* Fix Music Assistant media player entity features (#139428)

* Fix Music Assistant supported media player features

* Update supported features when player config changes

* Add tests

* Update frontend to 20250227.0 (#139437)

* Bump version to 2025.3.0b1

* Bump weatherflow4py to 1.3.1 (#135529)

* version bump of dep

* update requirements

* Add new mediatypes to Music Assistant integration (#139338)

* Bump Music Assistant client to 1.1.0

* Add some casts to help mypy

* Add handling of the new media types in Music Assistant

* mypy cleanup

* lint

* update snapshot

* Adjust tests

---------

Co-authored-by: Franck Nijhof <git@frenck.dev>

* Move climate intent to homeassistant integration (#139371)

* Move climate intent to homeassistant integration

* Move get temperature intent to intent integration

* Clean up old test

* Bump aiohomeconnect to 0.15.1 (#139445)

* Fix SmartThings diagnostics (#139447)

* Bump pysmartthings to 2.0.1 (#139454)

* Change webdav namespace to absolut URI (#139456)

* Change webdav namespace to absolut URI

* Add const file

* Improve onedrive migration (#139458)

* Bump pysmartthings to 2.1.0 (#139460)

* Only lowercase SmartThings media input source if we have it (#139468)

* Set SmartThings suggested display precision (#139470)

* Fix Gemini Schema validation for #139416 (#139478)

Fixed Schema validation for issue #139477

* Fail recorder.backup.async_pre_backup if Home Assistant is not running (#139491)

Fail recorder.backup.async_pre_backup if hass is not running

* Fix shift state in Teslemetry (#139505)

* Fix shift state

* Different fix

* Improve error handling in CoreBackupReaderWriter (#139508)

* Add diagnostics to onedrive (#139516)

* Add diagnostics to onedrive

* redact PII

* add raw data

* Make the Tuya backend library compatible with the newer paho mqtt client. (#139518)

* Make the Tuya backend library compatible with the newer paho mqtt client.

* Improve classnames and docstrings

* Suppress unsupported event 'EVT_USP_RpsPowerDeniedByPsuOverload' by bumping aiounifi to v83 (#139519)

Bump aiounifi to v83

* Don't split wheels builder anymore (#139522)

* Bump yt-dlp to 2025.02.19 (#139526)

* Update frontend to 20250228.0 (#139531)

* Bump version to 2025.3.0b2

* Add missing 'state_class' attribute for Growatt plant sensors (#132145)

* Add missing 'state_class' attribute for Growatt plant sensors

* Update total.py

* Update total.py 'TOTAL_INCREASING'

* Update total.py "maximum_output" -> 'TOTAL_INCREASING'

* Update homeassistant/components/growatt_server/sensor/total.py

---------

Co-authored-by: Franck Nijhof <frenck@frenck.nl>

* Bump env_canada to 0.8.0 (#138237)

* Bump env_canada to 0.8.0

* Fix requirements*.txt

* Grepped more

---------

Co-authored-by: Franck Nijhof <git@frenck.dev>

* Fix Nederlandse Spoorwegen to ignore trains in the past (#138331)

* Update NS integration to show first next train instead of just the first.

* Handle no first or next trip.

* Remove debug statement.

* Remove seconds and revert back to minutes.

* Make use of dt_util.now().

* Fix issue with next train if no first train.

* Use multiple indexed group-by queries to get start time states for MySQL (#138786)

* tweaks

* mysql

* mysql

* Update homeassistant/components/recorder/history/modern.py

* Update homeassistant/components/recorder/history/modern.py

* Update homeassistant/components/recorder/const.py

* Update homeassistant/components/recorder/statistics.py

* Apply suggestions from code review

* mysql

* mysql

* cover

* make sure db is fully init on old schema

* fixes

* fixes

* coverage

* coverage

* coverage

* s/slow_dependant_subquery/slow_dependent_subquery/g

* reword

* comment that callers are responsible for staying under the limit

* comment that callers are responsible for staying under the limit

* switch to kwargs

* reduce branching complexity

* split stats query

* preen

* split tests

* split tests

* Specify recorder as after dependency in sql integration (#139037)

* Specify recorder as after dependency in sql integration

* Remove hassfest exception

---------

Co-authored-by: J. Nick Koston <nick@koston.org>

* Handle IPv6 URLs in devolo Home Network (#139191)

* Handle IPv6 URLs in devolo Home Network

* Use yarl

* Fix bug in derivative sensor when source sensor's state is constant (#139230)

Previously, when the source sensor's state remains constant, the derivative
sensor repeats its latest value indefinitely.

This patch fixes this bug by consuming the state_reported event and updating
the sensor's output even when the source sensor doesn't change its state.

* Ensure Hue bridge is added first to the device registry (#139438)

* Fix update data for multiple Gree devices (#139469)

fix sync date for multiple devices

do not use handler for explicit update devices as internal communication lib do not provide which device is updated
use ha update loop

copy data object to prevent rewrite data from internal lib

allow more time to process response before log warning about long wait for response and make log message more clear

* Use last event as color mode in SmartThings (#139473)

* Use last event as color mode in SmartThings

* Use last event as color mode in SmartThings

* Fix

* Set SmartThings delta energy to Total (#139474)

* Fix alert not respecting can_acknowledge setting (#139483)

* fix(alert): check can_ack prior to acking

* fix(alert): add test for when can_acknowledge=False

* fix(alert): warn on can_ack blocking an ack

* Raise error when trying to acknowledge alert with can_acknowledge set to False

* Rewrite can_ack check as guard

Co-authored-by: Franck Nijhof <frenck@frenck.nl>

* Make can_ack service error msg human readable because it will show up in the UI

* format with ruff

* Make pytest aware of service error when acking an unackable alert

---------

Co-authored-by: Franck Nijhof <frenck@frenck.nl>

* Bump pysmartthings to 2.2.0 (#139539)

* Remove orphan devices on startup in SmartThings (#139541)

* Bump PySwitchBot to 0.56.1 (#139544)

changelog: https://github.com/sblibs/pySwitchbot/compare/0.56.0...0.56.1

* Bump pysmartthings to 2.3.0 (#139546)

* Improve SmartThings OCF device info (#139547)

* Add SmartThings Viper device info (#139548)

* Revert polling changes to HomeKit Controller (#139550)

This reverts #116200

We changed the polling logic to avoid polling if all chars are marked as watchable
to avoid crashing the firmware on a very limited set of devices as it was
more in line with what iOS does. In the end, the user ended up replacing
the device in #116143 because it turned out to be unreliable in other
ways. The vendor has since issued a firmware update that may resolve
the problem with all of these devices.

In practice it turns out many more devices
report that chars are evented and never send events. After a few months
of data and reports the trade-off does not seem worth it since
users are having to set up manual polling on a wide range of
devices. The amount of devices with evented chars that do not
actually send state vastly exceeds the number of devices that
might crash if they are polled too often so restore the previous
behavior

fixes #138561
fixes #100331
fixes #124529
fixes #123456
fixes #130763
fixes #124099
fixes #124916
fixes #135434
fixes #125273
fixes #124099
fixes #119617

* Bump pysmartthings to 2.4.0 (#139564)

* Bump Tesla Fleet API to v0.9.12 (#139565)

* bump

* Update manifest.json

* Fix versions

* remove tesla_bluetooth

* Remove mistake

* Bump aiowebdav2 to 0.3.1 (#139567)

* Validate scopes in SmartThings config flow (#139569)

* Only determine SmartThings swing modes if we support it (#139571)

Only determine swing modes if we support it

* Don't require not needed scopes in SmartThings (#139576)

* Don't require not needed scopes

* Don't require not needed scopes

* Homee: fix watchdog icon (#139577)

fix watchdog icon

* Bump aiohomekit to 3.2.8 (#139579)

changelog: https://github.com/Jc2k/aiohomekit/compare/3.2.7...3.2.8

* Fix duplicate unique id issue in Sensibo (#139582)

* Fix duplicate unique id issue in Sensibo

* Fixes

* Mods

* Improve field descriptions of `zha.permit` action (#139584)

Make the field descriptions of `source_ieee` and `install_code` UI-friendly by cross-referencing them using their friendly names to allow matching translations.

Better explain the alternative of using the `qr_code` field by adding that this contains both the IEEE address and the Install code of the joining device.

* Fix - Allow brightness only light MQTT json light to be set up using the `brightness` flag or via  `supported_color_modes` (#139585)

* Fix - Allow brightness only light MQTT json light to be set up using the `brightness` flag or via  `supported_color_modes`

* Improve comment

* Fix Manufacturer naming for Squeezelite model name for Squeezebox (#139586)

Squeezelite Manufacturer Fix

* Bump deebot-client to 12.3.1 (#139598)

* Fix handling of NaN float values for current humidity in ESPHome (#139600)

fixes #131837

* Bump aioshelly to 13.1.0 (#139601)

Co-authored-by: Franck Nijhof <git@frenck.dev>

* Bump inkbird-ble to 0.7.1 (#139603)

changelog: https://github.com/Bluetooth-Devices/inkbird-ble/compare/v0.7.0...v0.7.1

* Fix body text of imap message not available in custom event data template (#139609)

* Fix arm vacation mode showing as armed away in elkm1 (#139613)

Add native arm vacation mode support to elkm1

Vacation mode is currently implemented as a custom
service which will be deprecated in a future PR.

Note that the custom service was added long before
HA had a native vacation mode which was added
in #45980

* Still request scopes in SmartThings (#139626)

Still request scopes

* Bump pysmartthings to 2.4.1 (#139627)

* Bump version to 2025.3.0b3

* Fix unique identifiers where multiple IKEA Tradfri gateways are in use (#136060)

* Create unique identifiers where multiple gateways are in use

Resolving issue https://github.com/home-assistant/core/issues/134497

* Added migration function to __init__.py

Added migration function to execute upon initialisation, to:
a) remove the erroneously-added config)_entry added to the device (gateway B gets added as a config_entry to a device associated to gateway A), and
b) swap out the non-unique identifiers for genuinely unique identifiers.

* Added tests to simulate migration from bad data scenario (i.e. explicitly executing migrate_entity_unique_ids() from __init__.py)

* Ammendments suggested in first review

* Changes after second review

* Rewrite of test_migrate_config_entry_and_identifiers after feedback

* Converted migrate function into major version, updated tests

* Finalised variable naming convention per feedback, added test to validate config entry migrated to v2

* Hopefully final changes for cosmetic / comment stucture

* Further code-coverage in test_migrate_config_entry_and_identifiers()

* Minor test corrections

* Added test for non-tradfri identifiers

* Fix vicare exception for specific ventilation device type (#138343)

* fix for exception for specific ventilation device type + tests

* fix for exception for specific ventilation device type + tests

* New Testset just for fan

* update test_sensor.ambr

* Prevent zero interval in Calendar get_events service (#139378)

* Prevent zero interval in Calendar get_events service

* Fix holiday calendar tests

* Remove redundant entity_id

* Use translation for exception

* Replace check with voluptuous validator

* Revert strings.xml

* Fix Homee brightness sensors reporting in percent (#139409)

* fix brigtness sensor having percent as unit.

* add test for percent-brightness-sensor

* remove valve position and update tests

* Removed test, because covered by Snapshots

* fix review comments

* move device calss to init.

* fix test

* fix review comments

* add battery sensor back to test fixture

* fix

* Fix ability to remove orphan device in Music Assistant integration (#139431)

* Fix ability to remove orphan device in Music Assistant integration

* Add test

* Remove orphaned device entries at startup as well

* adjust mocked client

* Fix broken link in ESPHome BLE repair (#139639)

ESPHome always uses .0 in the URL for the changelog,
and we never had a patch version in the stable
BLE version field so we need to switch it to
.0 for the URL.

* Fix scope comparison in SmartThings (#139652)

* Avoid duplicate chat log content (#139679)

* Add additional roborock debug logging (#139680)

* Improve failure handling and logging for invalid map responses (#139681)

* Abort SmartThings flow if default_config is not enabled (#139700)

* Abort SmartThings flow if default_config is not enabled

* Abort SmartThings flow if default_config is not enabled

* Abort SmartThings flow if default_config is not enabled

* Bump ESPHome stable BLE version to 2025.2.2 (#139704)

ensure proxies have https://github.com/esphome/esphome/pull/8328
so they do not reboot themselves if disconnecting takes
too long

* Bump holidays to 0.68 (#139711)

* Bump aiowebostv to 0.7.2 (#139712)

* Bump sense-energy to 0.13.6 (#139714)

changes: https://github.com/scottbonline/sense/releases/tag/0.13.6

* Add nest translation string for `already_in_progress` (#139727)

* Bump google-nest-sdm to 7.1.4 (#139728)

* Delete refresh after a non-breaking error at event stream at Home Connect (#139740)

* Delete refresh after non-breaking error

And improve how many time does it take to retry to open stream

* Update tests

* Bump version to 2025.3.0b4

* Bump aiohomeconnect to 0.16.2 (#139750)

* Add Apollo Automation virtual integration (#139751)

Co-authored-by: Robert Resch <robert@resch.dev>

* Fix incorrect weather state returned by HKO (#139757)

* Fix incorrect weather state

* Clean up unused import

---------

Co-authored-by: Franck Nijhof <frenck@frenck.nl>
Co-authored-by: Franck Nijhof <git@frenck.dev>

* Bump pysmartthings to 2.5.0 (#139758)

* Bump pysmartthings to 2.5.0

* Bump pysmartthings to 2.5.0

* Fix home connect available (#139760)

* Fix home connect available

* Extend and clarify test

* Do not change connected state on stream interrupted

* Bump nexia to 2.1.1 (#139772)

changelog: https://github.com/bdraco/nexia/compare/2.0.9...2.1.1

fixes #133368

* Bump version to 2025.3.0b5

* Bump aiowebostv to 0.7.3 (#139788)

* Drop BETA postfix from Matter integration's title (#139816)

Drop BETA postfix from Matter title

Now that the whole Matter stack of Home Assistant is officially certified, we can drop the beta flag.

* Split the energy and data retrieval in WeHeat (#139211)

* Split the energy and data logs

* Make sure that pump_info name is set to device name, bump weheat

* Adding config entry

* Fixed circular import

* parallelisation of awaits

* Update homeassistant/components/weheat/binary_sensor.py

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* Fix undefined weheatdata

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* Bump version to 2025.3.0b6

* Update frontend to 20250305.0 (#139829)

* Bump version to 2025.3.0b7

* Get temperature data appropriate for hass.config.unit in LG ThinQ (#137626)

* Get temperature data appropriate for hass.config.unit

* Modify temperature_unit for init

* Modify unit's map

* Fix ruff error

---------

Co-authored-by: yunseon.park <yunseon.park@lge.com>

* Bump nexia to 2.2.1 (#139786)

* Bump nexia to 2.2.0

changelog: https://github.com/bdraco/nexia/compare/2.1.1...2.2.0

* Apply suggestions from code review

* Revert "Add scene support to roborock (#137203)" (#139840)

This reverts commit 379bf10675.

* Bump aioecowitt to 2025.3.1 (#139841)

* Bump aioecowitt to 2025.3.1

* Bump aioecowitt to 2025.3.1

* Bump onedrive-personal-sdk to 0.0.13 (#139846)

* Bump intents to 2025.3.5 (#139851)

Co-authored-by: Franck Nijhof <git@frenck.dev>

* Bump version to 2025.3.0b8

* Bump version to 2025.3.0

* Fix no disabled capabilities in SmartThings (#139860)

Fix no disabled capabilities

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: cdnninja <jaydenaphillips@gmail.com>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Erik Montnemery <erik@montnemery.com>
Co-authored-by: J. Nick Koston <nick@koston.org>
Co-authored-by: Tristan <tristan.steele@gmail.com>
Co-authored-by: peteS-UK <64092177+peteS-UK@users.noreply.github.com>
Co-authored-by: Josef Zweck <josef@zweck.dev>
Co-authored-by: Manu <4445816+tr4nt0r@users.noreply.github.com>
Co-authored-by: J. Diego Rodríguez Royo <jdrr1998@hotmail.com>
Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
Co-authored-by: Noah Husby <32528627+noahhusby@users.noreply.github.com>
Co-authored-by: Dan Raper <me@danr.uk>
Co-authored-by: Jan-Philipp Benecke <jan-philipp@bnck.me>
Co-authored-by: Markus Adrario <Mozilla@adrario.de>
Co-authored-by: Andre Lengwenus <alengwenus@gmail.com>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
Co-authored-by: Norbert Rittel <norbert@rittel.de>
Co-authored-by: LG-ThinQ-Integration <LG-ThinQ-Integration@lge.com>
Co-authored-by: yunseon.park <yunseon.park@lge.com>
Co-authored-by: Maikel Punie <maikel.punie@gmail.com>
Co-authored-by: Dan Bishop <d@nbishop.uk>
Co-authored-by: elmurato <1382097+elmurato@users.noreply.github.com>
Co-authored-by: Robert Resch <robert@resch.dev>
Co-authored-by: Cameron Ring <cameron@cs.stanford.edu>
Co-authored-by: Shay Levy <levyshay1@gmail.com>
Co-authored-by: fwestenberg <47930023+fwestenberg@users.noreply.github.com>
Co-authored-by: Matrix <justin@yosmart.com>
Co-authored-by: Andrew <34544450+10100011@users.noreply.github.com>
Co-authored-by: Renier Moorcroft <66512715+RenierM26@users.noreply.github.com>
Co-authored-by: Peter Brøndum <34370407+brondum@users.noreply.github.com>
Co-authored-by: Galorhallen <12990764+Galorhallen@users.noreply.github.com>
Co-authored-by: tronikos <tronikos@users.noreply.github.com>
Co-authored-by: Paul Traina <pleasantone@users.noreply.github.com>
Co-authored-by: Artur Pragacz <49985303+arturpragacz@users.noreply.github.com>
Co-authored-by: Noah Groß <me@codesalat.dev>
Co-authored-by: G Johansson <goran.johansson@shiftit.se>
Co-authored-by: Michael <35783820+mib1185@users.noreply.github.com>
Co-authored-by: Denis Shulyaka <Shulyaka@gmail.com>
Co-authored-by: Pierre Ståhl <pierre.staahl@gmail.com>
Co-authored-by: Maciej Bieniek <bieniu@users.noreply.github.com>
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
Co-authored-by: TheJulianJES <TheJulianJES@users.noreply.github.com>
Co-authored-by: Christophe Gagnier <Moustachauve@users.noreply.github.com>
Co-authored-by: Matt Zimmerman <mdz@users.noreply.github.com>
Co-authored-by: Ben Bridts <ben.bridts@gmail.com>
Co-authored-by: Paul Bottein <paul.bottein@gmail.com>
Co-authored-by: Marcel van der Veldt <m.vanderveldt@outlook.com>
Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
Co-authored-by: puddly <32534428+puddly@users.noreply.github.com>
Co-authored-by: Michael Hansen <mike@rhasspy.org>
Co-authored-by: starkillerOG <starkiller.og@gmail.com>
Co-authored-by: Jeef <jeeftor@users.noreply.github.com>
Co-authored-by: Ivan Lopez Hernandez <ivan.lh.94@outlook.com>
Co-authored-by: Brett Adams <Bre77@users.noreply.github.com>
Co-authored-by: Robert Svensson <Kane610@users.noreply.github.com>
Co-authored-by: LaithBudairi <69572447+LaithBudairi@users.noreply.github.com>
Co-authored-by: M-A <maruel@gmail.com>
Co-authored-by: Martreides <8385298+Martreides@users.noreply.github.com>
Co-authored-by: Guido Schmitz <Shutgun@users.noreply.github.com>
Co-authored-by: Juan Grande <juan.grande@gmail.com>
Co-authored-by: Filip Agh <filip11agh@gmail.com>
Co-authored-by: StaleLoafOfBread <45444205+StaleLoafOfBread@users.noreply.github.com>
Co-authored-by: cs12ag <70966712+cs12ag@users.noreply.github.com>
Co-authored-by: Niklas Neesen <n.neesen@me.com>
Co-authored-by: Allen Porter <allen@thebends.org>
Co-authored-by: Anthony Hou <anthony.tr.hou@gmail.com>
Co-authored-by: SteveDiks <126147459+SteveDiks@users.noreply.github.com>
2025-03-05 20:00:41 +01:00
Erik Montnemery
cc5c8bf5e3 Make helpers.frame.report_usage work when called from any thread (#139836)
* Make helpers.frame.report_usage work when called from any thread

* Address review comments, update tests

* Add test

* Update test

* Update recorder test

* Update tests
2025-03-05 19:37:34 +01:00
Erik Montnemery
cfaf18f942 Improve the mock_integration_frame test fixture (#139850)
* Improve the mock_integration_frame test fixture

* Update test
2025-03-05 18:42:34 +01:00
Joost Lekkerkerker
98e317dd55 Fix no disabled capabilities in SmartThings (#139860)
Fix no disabled capabilities
2025-03-05 17:42:31 +00:00
Joost Lekkerkerker
1f24e5aec4 Fix no disabled capabilities in SmartThings (#139860)
Fix no disabled capabilities
2025-03-05 18:41:21 +01:00
Franck Nijhof
ed088aa72f Bump version to 2025.3.0 2025-03-05 17:39:36 +00:00
Franck Nijhof
51162320cb Bump version to 2025.3.0b8 2025-03-05 17:25:33 +00:00
Michael Hansen
b88eab8ba3 Bump intents to 2025.3.5 (#139851)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-03-05 17:23:04 +00:00
Josef Zweck
6c080ee650 Bump onedrive-personal-sdk to 0.0.13 (#139846) 2025-03-05 17:22:17 +00:00
Joost Lekkerkerker
8056b0df2b Bump aioecowitt to 2025.3.1 (#139841)
* Bump aioecowitt to 2025.3.1

* Bump aioecowitt to 2025.3.1
2025-03-05 17:22:14 +00:00
Allen Porter
3f94b7a61c Revert "Add scene support to roborock (#137203)" (#139840)
This reverts commit 379bf10675.
2025-03-05 17:22:11 +00:00
J. Nick Koston
1484e46317 Bump nexia to 2.2.1 (#139786)
* Bump nexia to 2.2.0

changelog: https://github.com/bdraco/nexia/compare/2.1.1...2.2.0

* Apply suggestions from code review
2025-03-05 17:22:08 +00:00
LG-ThinQ-Integration
2812c8a993 Get temperature data appropriate for hass.config.unit in LG ThinQ (#137626)
* Get temperature data appropriate for hass.config.unit

* Modify temperature_unit for init

* Modify unit's map

* Fix ruff error

---------

Co-authored-by: yunseon.park <yunseon.park@lge.com>
2025-03-05 17:22:04 +00:00
Michael Hansen
cfe102f274 Bump intents to 2025.3.5 (#139851)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-03-05 18:20:48 +01:00
jb101010-2
b225a7f370 Bump pysuezV2 to 2.0.4 (#139824) 2025-03-05 17:12:34 +00:00
Erik Montnemery
0f3409bd09 Fix stale test name in vacuum (#139853) 2025-03-05 17:07:43 +01:00
Joost Lekkerkerker
e7d371cddc Bump aioecowitt to 2025.3.1 (#139841)
* Bump aioecowitt to 2025.3.1

* Bump aioecowitt to 2025.3.1
2025-03-05 17:04:41 +01:00
Josef Zweck
fffb414ba9 Bump onedrive-personal-sdk to 0.0.13 (#139846) 2025-03-05 16:19:15 +01:00
Erik Montnemery
1552aec416 Improve frame helper tests (#139843) 2025-03-05 16:13:09 +01:00
Maciej Bieniek
c69cec28fe Bump gios to version 6.0.0 (#139832)
* Fix the code

* Fix tests

* Bump version

* Use https for configuration URL
2025-03-05 15:04:56 +01:00
Simone Chemelli
61e0b938ae Convert Shelly block switches to EntityDescription (#106985) 2025-03-05 14:56:30 +01:00
Allen Porter
c0e5a549b6 Revert "Add scene support to roborock (#137203)" (#139840)
This reverts commit 379bf10675.
2025-03-05 14:36:20 +01:00
Robert Resch
f0bba1d6d4 Fix disable test results uploads properly (#139827)
* Fix disable test results uploads properly

* use dedicated variable

* fix pushes
2025-03-05 13:52:29 +01:00
tdfountain
1c1a950c05 Add conditional support for ambient sensors in NUT (#139675)
* Conditionally remove ambient sensors if not present

* Create ambient sensors list and use list comprehension

* Update homeassistant/components/nut/sensor.py

Co-authored-by: J. Nick Koston <nick@koston.org>

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2025-03-05 12:12:56 +00:00
LG-ThinQ-Integration
df2248bb82 Get temperature data appropriate for hass.config.unit in LG ThinQ (#137626)
* Get temperature data appropriate for hass.config.unit

* Modify temperature_unit for init

* Modify unit's map

* Fix ruff error

---------

Co-authored-by: yunseon.park <yunseon.park@lge.com>
2025-03-05 12:13:11 +01:00
Franck Nijhof
5043e2ad10 Bump version to 2025.3.0b7 2025-03-05 11:01:06 +00:00
Bram Kragten
2c2fd76270 Update frontend to 20250305.0 (#139829) 2025-03-05 11:00:56 +00:00
Bram Kragten
7fe75a959f Update frontend to 20250305.0 (#139829) 2025-03-05 11:54:58 +01:00
Dan Raper
5f88354cb3 Add vehicle select to Ohme (#139795)
* Add vehicle select to Ohme

* mypy fixes

* Update homeassistant/components/ohme/select.py

Co-authored-by: Josef Zweck <josef@zweck.dev>

---------

Co-authored-by: Josef Zweck <josef@zweck.dev>
2025-03-05 10:59:47 +01:00
Erik Montnemery
09561aeb39 Improve frame helper tests (#139821) 2025-03-05 10:43:29 +01:00
Franck Nijhof
7001f8daaf Bump version to 2025.3.0b6 2025-03-05 09:39:26 +00:00
SteveDiks
b41fc932c5 Split the energy and data retrieval in WeHeat (#139211)
* Split the energy and data logs

* Make sure that pump_info name is set to device name, bump weheat

* Adding config entry

* Fixed circular import

* parallelisation of awaits

* Update homeassistant/components/weheat/binary_sensor.py

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* Fix undefined weheatdata

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-03-05 09:39:13 +00:00
SteveDiks
2a11c413c7 Split the energy and data retrieval in WeHeat (#139211)
* Split the energy and data logs

* Make sure that pump_info name is set to device name, bump weheat

* Adding config entry

* Fixed circular import

* parallelisation of awaits

* Update homeassistant/components/weheat/binary_sensor.py

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* Fix undefined weheatdata

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-03-05 10:11:59 +01:00
Marcel van der Veldt
0872243297 Drop BETA postfix from Matter integration's title (#139816)
Drop BETA postfix from Matter title

Now that the whole Matter stack of Home Assistant is officially certified, we can drop the beta flag.
2025-03-05 08:44:44 +00:00
Shay Levy
bba889975a Bump aiowebostv to 0.7.3 (#139788) 2025-03-05 08:44:39 +00:00
Dan Raper
36412a034d Bump ohmepy to 1.4.0 (#139791) 2025-03-05 09:27:10 +01:00
Martin Hjelmare
13dfd27b7e Clean Home Connect error handling (#139817) 2025-03-05 09:07:45 +01:00
Marcel van der Veldt
1fb02944b7 Drop BETA postfix from Matter integration's title (#139816)
Drop BETA postfix from Matter title

Now that the whole Matter stack of Home Assistant is officially certified, we can drop the beta flag.
2025-03-05 09:04:55 +01:00
dependabot[bot]
1c045ab222 Bump actions/download-artifact from 4.1.8 to 4.1.9 (#139814)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4.1.8 to 4.1.9.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v4.1.8...v4.1.9)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-05 08:16:42 +01:00
dependabot[bot]
0d329bd83d Bump actions/upload-artifact from 4.6.0 to 4.6.1 (#139813)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.6.0 to 4.6.1.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4.6.0...v4.6.1)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-05 07:49:18 +01:00
J. Nick Koston
d1995086cc Bump habluetooth to 3.25.0 (#139811)
changelog: https://github.com/Bluetooth-Devices/habluetooth/compare/v3.24.1...v3.25.0
2025-03-05 00:15:00 -05:00
J. Nick Koston
f0ad0e6eae Bump cached-ipaddress to 0.10.0 (#139807) 2025-03-04 17:51:46 -10:00
J. Nick Koston
457a7216ff Bump dbus-fast to 2.35.1 (#139809) 2025-03-04 17:51:31 -10:00
tdfountain
782f504522 Add common PDU sensors to NUT (#139669)
* Add common PDU sensors and alphabetize sensors list

* Back out code quality improvements

* Change voltage and current status to diagnostic and disabled by default
2025-03-04 17:26:43 -10:00
J. Nick Koston
e60a284354 Bump aioesphomeapi to 29.4.0 (#139806)
changelog: https://github.com/esphome/aioesphomeapi/compare/v29.3.2...v29.4.0
2025-03-04 17:25:43 -10:00
J. Nick Koston
d5d9bc1df6 Bump ulid-transform to 1.3.0 (#139808)
changelog: https://github.com/Bluetooth-Devices/ulid-transform/compare/v1.2.1...v1.3.0
2025-03-04 17:25:11 -10:00
J. Nick Koston
27fd0a88f4 Bump bleak-esphome to 2.11.0 (#139803)
changelog: https://github.com/Bluetooth-Devices/bleak-esphome/compare/v2.10.2...v2.11.0
2025-03-04 17:12:45 -10:00
J. Nick Koston
24188ffb31 Bump zeroconf to 0.146.0 (#139804)
changelog: https://github.com/python-zeroconf/python-zeroconf/compare/0.145.1...0.146.0
2025-03-04 17:10:07 -10:00
Petro31
e51d9bd6f4 Remove redundant is not None checks in Template integration (#139790)
Remove redundant is not None checks
2025-03-04 21:58:41 -05:00
J. Nick Koston
3eb7302fde Bump fnv-hash-fast to 1.4.0 (#139801)
changelog: https://github.com/Bluetooth-Devices/fnv-hash-fast/compare/v1.2.6...v1.4.0
2025-03-04 21:57:43 -05:00
J. Nick Koston
49b2f8fd7f Bump bluetooth-data-tools to 1.25.0 (#139802)
changelog: https://github.com/Bluetooth-Devices/bluetooth-data-tools/compare/v1.23.4...v1.25.0
2025-03-04 21:57:27 -05:00
Shay Levy
0143a71e97 Bump aiowebostv to 0.7.3 (#139788) 2025-03-04 16:45:23 -10:00
J. Nick Koston
9bc806ab21 Bump nexia to 2.2.1 (#139786)
* Bump nexia to 2.2.0

changelog: https://github.com/bdraco/nexia/compare/2.1.1...2.2.0

* Apply suggestions from code review
2025-03-05 01:57:03 +01:00
Simone Chemelli
366c5c3f10 Improve unique_id tests for Shelly block devices (#139778)
* Improve unique_id tests for Shelly block devices

* type test

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2025-03-04 14:03:38 -10:00
peteS-UK
3ee5262a8d Clean up squeezebox build_item_response part 2 (#139595) 2025-03-04 17:48:13 -06:00
Martin Hjelmare
c671862d3f Improve Home Connect appliances test fixture (#139787)
Improve Home Connect appliances fixture
2025-03-05 00:45:58 +01:00
Manu
50ba93042b Add create_habit action to Habitica integration (#139673) 2025-03-04 21:43:49 +00:00
Franck Nijhof
01e8ca6495 Bump version to 2025.3.0b5 2025-03-04 20:25:14 +00:00
J. Nick Koston
7d82375f81 Bump nexia to 2.1.1 (#139772)
changelog: https://github.com/bdraco/nexia/compare/2.0.9...2.1.1

fixes #133368
2025-03-04 20:24:56 +00:00
Martin Hjelmare
47033e587b Fix home connect available (#139760)
* Fix home connect available

* Extend and clarify test

* Do not change connected state on stream interrupted
2025-03-04 20:24:47 +00:00
Joost Lekkerkerker
e73b08b269 Bump pysmartthings to 2.5.0 (#139758)
* Bump pysmartthings to 2.5.0

* Bump pysmartthings to 2.5.0
2025-03-04 20:23:45 +00:00
Anthony Hou
a195a9107b Fix incorrect weather state returned by HKO (#139757)
* Fix incorrect weather state

* Clean up unused import

---------

Co-authored-by: Franck Nijhof <frenck@frenck.nl>
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-03-04 20:12:25 +00:00
Joost Lekkerkerker
185949cc18 Add Apollo Automation virtual integration (#139751)
Co-authored-by: Robert Resch <robert@resch.dev>
2025-03-04 20:12:22 +00:00
J. Diego Rodríguez Royo
c129f27c95 Bump aiohomeconnect to 0.16.2 (#139750) 2025-03-04 20:12:16 +00:00
Norbert Rittel
1456d9d800 Capitalize "Suez Water" and "ID" in user-facing strings (#139782) 2025-03-04 21:00:51 +01:00
Erik Montnemery
3b9bb96784 Align google_drive with changes in BackupAgent (#139767) 2025-03-04 11:45:10 -08:00
epenet
7359013db0 Move ForkedDaapdUpdater setup to __init__ module (#139733)
* Move ForkedDaapdUpdater setup to __init__ module

* Adjust tests

* One more
2025-03-04 20:24:36 +01:00
Erik Montnemery
be3d678f23 Align hassio with changes in BackupAgent (#139780) 2025-03-04 20:20:49 +01:00
Martin Hjelmare
e8099fd3b2 Fix home connect available (#139760)
* Fix home connect available

* Extend and clarify test

* Do not change connected state on stream interrupted
2025-03-04 19:26:20 +01:00
Erik Montnemery
344cfedd6f Align synology_dsm with changes in BackupAgent (#139770) 2025-03-04 19:22:18 +01:00
Robert Resch
c0d882e305 Upload test result artifacts always (#139776)
Upload test results artificats always
2025-03-04 19:19:38 +01:00
Erik Montnemery
e86fc88631 Minor improvement of hassio backup tests (#139775) 2025-03-04 18:20:55 +01:00
J. Nick Koston
e1127fc78c Bump nexia to 2.1.1 (#139772)
changelog: https://github.com/bdraco/nexia/compare/2.0.9...2.1.1

fixes #133368
2025-03-04 18:01:40 +01:00
Erik Montnemery
95fbba1d74 Align cloud with changes in BackupAgent (#139766) 2025-03-04 17:46:13 +01:00
Erik Montnemery
46ac44c248 Align webdav with changes in BackupAgent (#139771) 2025-03-04 17:44:26 +01:00
Erik Montnemery
0ebdb1c2a8 Align kitchen_sink with changes in BackupAgent (#139768) 2025-03-04 16:38:03 +01:00
Erik Montnemery
e3a90831bf Align onedrive with changes in BackupAgent (#139769) 2025-03-04 16:32:47 +01:00
Erik Montnemery
ec100e5a6c Align azure_storage with changes in BackupAgent (#139765) 2025-03-04 16:10:33 +01:00
Joost Lekkerkerker
0eb087ba3f Bump pysmartthings to 2.5.0 (#139758)
* Bump pysmartthings to 2.5.0

* Bump pysmartthings to 2.5.0
2025-03-04 15:59:38 +01:00
Erik Montnemery
e55757dc82 Simplify error handling in BackupAgent when a backup is not found (#139754)
Simplify error handling in BackupAgent when backup is not found
2025-03-04 15:56:12 +01:00
Paulus Schoutsen
c51a2317e1 Add timer support to VoIP (#139763) 2025-03-04 15:48:10 +01:00
Anthony Hou
7fb949dff7 Fix incorrect weather state returned by HKO (#139757)
* Fix incorrect weather state

* Clean up unused import

---------

Co-authored-by: Franck Nijhof <frenck@frenck.nl>
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-03-04 15:25:47 +01:00
J. Diego Rodríguez Royo
74ea553b63 Bump aiohomeconnect to 0.16.2 (#139750) 2025-03-04 15:17:05 +01:00
Joost Lekkerkerker
d9690507a4 Add Apollo Automation virtual integration (#139751)
Co-authored-by: Robert Resch <robert@resch.dev>
2025-03-04 15:08:14 +01:00
Marc Mueller
e69b4f389f Simplify lint-only job config [ci] (#139748) 2025-03-04 14:07:27 +01:00
Paulus Schoutsen
8a97c2bfca VoIP block non-TTS announcements (#139658)
* VoIP block non-TTS announcements

* Migrate VoIP to use pipeline token
2025-03-04 08:02:58 -05:00
Robert Resch
d5ba55d2fc Disable test results upload on forks (#139749)
Disable test result uploads on forks
2025-03-04 13:27:51 +01:00
J. Nick Koston
d38e046494 Bump bleak-esphome to 2.10.2 (#139731)
* Bump bleak-esphome to 2.10.0

changelog: https://github.com/Bluetooth-Devices/bleak-esphome/compare/v2.9.0...v2.10.0

* again for wheel fix

* disable name check since its a binary now
2025-03-04 11:49:44 +01:00
Franck Nijhof
6a5a66e2f9 Bump version to 2025.3.0b4 2025-03-04 10:46:11 +00:00
J. Diego Rodríguez Royo
db63d9fcbf Delete refresh after a non-breaking error at event stream at Home Connect (#139740)
* Delete refresh after non-breaking error

And improve how many time does it take to retry to open stream

* Update tests
2025-03-04 10:45:10 +00:00
Allen Porter
5b3d798eca Bump google-nest-sdm to 7.1.4 (#139728) 2025-03-04 10:45:06 +00:00
Allen Porter
a0dde2a7d6 Add nest translation string for already_in_progress (#139727) 2025-03-04 10:45:00 +00:00
J. Nick Koston
1bdc33d52d Bump sense-energy to 0.13.6 (#139714)
changes: https://github.com/scottbonline/sense/releases/tag/0.13.6
2025-03-04 10:44:57 +00:00
Shay Levy
f1d332da5a Bump aiowebostv to 0.7.2 (#139712) 2025-03-04 10:44:51 +00:00
G Johansson
304c13261a Bump holidays to 0.68 (#139711) 2025-03-04 10:44:48 +00:00
J. Nick Koston
c58cbfd6f4 Bump ESPHome stable BLE version to 2025.2.2 (#139704)
ensure proxies have https://github.com/esphome/esphome/pull/8328
so they do not reboot themselves if disconnecting takes
too long
2025-03-04 10:44:44 +00:00
Joost Lekkerkerker
b890d3e15a Abort SmartThings flow if default_config is not enabled (#139700)
* Abort SmartThings flow if default_config is not enabled

* Abort SmartThings flow if default_config is not enabled

* Abort SmartThings flow if default_config is not enabled
2025-03-04 10:44:41 +00:00
Allen Porter
2c9b8b6835 Improve failure handling and logging for invalid map responses (#139681) 2025-03-04 10:44:37 +00:00
Allen Porter
73cc1f51ca Add additional roborock debug logging (#139680) 2025-03-04 10:44:33 +00:00
Paulus Schoutsen
dca77e8232 Avoid duplicate chat log content (#139679) 2025-03-04 10:44:30 +00:00
Joost Lekkerkerker
03cb177e7c Fix scope comparison in SmartThings (#139652) 2025-03-04 10:44:26 +00:00
J. Nick Koston
ad04b53615 Fix broken link in ESPHome BLE repair (#139639)
ESPHome always uses .0 in the URL for the changelog,
and we never had a patch version in the stable
BLE version field so we need to switch it to
.0 for the URL.
2025-03-04 10:44:23 +00:00
Marcel van der Veldt
46bcb307f6 Fix ability to remove orphan device in Music Assistant integration (#139431)
* Fix ability to remove orphan device in Music Assistant integration

* Add test

* Remove orphaned device entries at startup as well

* adjust mocked client
2025-03-04 10:44:19 +00:00
Markus Adrario
b816625028 Fix Homee brightness sensors reporting in percent (#139409)
* fix brigtness sensor having percent as unit.

* add test for percent-brightness-sensor

* remove valve position and update tests

* Removed test, because covered by Snapshots

* fix review comments

* move device calss to init.

* fix test

* fix review comments

* add battery sensor back to test fixture

* fix
2025-03-04 10:44:15 +00:00
Abílio Costa
0940fc7806 Prevent zero interval in Calendar get_events service (#139378)
* Prevent zero interval in Calendar get_events service

* Fix holiday calendar tests

* Remove redundant entity_id

* Use translation for exception

* Replace check with voluptuous validator

* Revert strings.xml
2025-03-04 10:44:12 +00:00
Niklas Neesen
50aefc3653 Fix vicare exception for specific ventilation device type (#138343)
* fix for exception for specific ventilation device type + tests

* fix for exception for specific ventilation device type + tests

* New Testset just for fan

* update test_sensor.ambr
2025-03-04 10:44:09 +00:00
cs12ag
c0dc83cbc0 Fix unique identifiers where multiple IKEA Tradfri gateways are in use (#136060)
* Create unique identifiers where multiple gateways are in use

Resolving issue https://github.com/home-assistant/core/issues/134497

* Added migration function to __init__.py

Added migration function to execute upon initialisation, to:
a) remove the erroneously-added config)_entry added to the device (gateway B gets added as a config_entry to a device associated to gateway A), and
b) swap out the non-unique identifiers for genuinely unique identifiers.

* Added tests to simulate migration from bad data scenario (i.e. explicitly executing migrate_entity_unique_ids() from __init__.py)

* Ammendments suggested in first review

* Changes after second review

* Rewrite of test_migrate_config_entry_and_identifiers after feedback

* Converted migrate function into major version, updated tests

* Finalised variable naming convention per feedback, added test to validate config entry migrated to v2

* Hopefully final changes for cosmetic / comment stucture

* Further code-coverage in test_migrate_config_entry_and_identifiers()

* Minor test corrections

* Added test for non-tradfri identifiers
2025-03-04 10:44:01 +00:00
Robert Resch
50cec420ef Upload test results to codecov (#138512)
* Upload test results to codecov

* Upload tests results in single job
2025-03-04 11:43:41 +01:00
Markus Adrario
23dac3933f Fix Homee brightness sensors reporting in percent (#139409)
* fix brigtness sensor having percent as unit.

* add test for percent-brightness-sensor

* remove valve position and update tests

* Removed test, because covered by Snapshots

* fix review comments

* move device calss to init.

* fix test

* fix review comments

* add battery sensor back to test fixture

* fix
2025-03-04 11:40:36 +01:00
Erik Montnemery
32f59bfd25 Remove unused constant from recorder (#139741) 2025-03-04 11:39:35 +01:00
Erik Montnemery
4f36bbdfe6 Fix regression in template flag introduced by #139645 (#139742) 2025-03-04 11:33:27 +01:00
J. Diego Rodríguez Royo
973fee9fe1 Delete refresh after a non-breaking error at event stream at Home Connect (#139740)
* Delete refresh after non-breaking error

And improve how many time does it take to retry to open stream

* Update tests
2025-03-04 11:07:44 +01:00
Norbert Rittel
13001faf51 Improve strings in openai_conversation.generate_image action (#139736)
Use descriptive wording, fix sentence-casing.
2025-03-04 09:57:38 +01:00
Marcel van der Veldt
9f780a5308 Fix ability to remove orphan device in Music Assistant integration (#139431)
* Fix ability to remove orphan device in Music Assistant integration

* Add test

* Remove orphaned device entries at startup as well

* adjust mocked client
2025-03-04 09:56:42 +01:00
Abílio Costa
d87c963db5 Prevent zero interval in Calendar get_events service (#139378)
* Prevent zero interval in Calendar get_events service

* Fix holiday calendar tests

* Remove redundant entity_id

* Use translation for exception

* Replace check with voluptuous validator

* Revert strings.xml
2025-03-04 09:52:29 +01:00
Allen Porter
c6a9472fdb Add nest translation string for already_in_progress (#139727) 2025-03-04 09:46:56 +01:00
Allen Porter
cd0a983850 Bump google-nest-sdm to 7.1.4 (#139728) 2025-03-04 09:28:10 +01:00
Petro31
890d3f4af4 Add a base class for template entities to inherit from (#139645)
* add-abstract-template-entity-base-class

* review 1 changes
2025-03-04 07:23:05 +01:00
Joshua Leaper
a778092941 Support up to 8 AUX outputs in Ness Alarm (#139718)
Support up to 8 AUX outputs
2025-03-03 23:35:20 +00:00
J. Nick Koston
9ea582de26 Bump sense-energy to 0.13.6 (#139714)
changes: https://github.com/scottbonline/sense/releases/tag/0.13.6
2025-03-03 11:20:25 -10:00
Shay Levy
b6f2d8f30b Bump aiowebostv to 0.7.2 (#139712) 2025-03-03 10:26:16 -10:00
G Johansson
139072bb59 Bump holidays to 0.68 (#139711) 2025-03-03 21:47:38 +02:00
Paul Bottein
07a93dade2 Add translations for switch state by device class (#139693) 2025-03-03 20:24:36 +01:00
Allen Porter
9dc04cb088 Improve failure handling and logging for invalid map responses (#139681) 2025-03-03 20:23:29 +01:00
StaleLoafOfBread
890c672f8c Add charging binary_sensor so front end can render battery icon properly (#139684)
* Add charging binary sensor

* Add charging binary sensor test
2025-03-03 20:21:05 +01:00
Simone Chemelli
e28e4d210f Bump aiocomelit to 0.11.2 (#139707) 2025-03-03 20:19:09 +01:00
Joost Lekkerkerker
dcd2d42894 Abort SmartThings flow if default_config is not enabled (#139700)
* Abort SmartThings flow if default_config is not enabled

* Abort SmartThings flow if default_config is not enabled

* Abort SmartThings flow if default_config is not enabled
2025-03-03 20:07:07 +01:00
Allen Porter
e47e151259 Add additional roborock debug logging (#139680) 2025-03-03 21:02:45 +02:00
Andrew Jackson
2c44043e6a Bump mastodon.py to 2.0.1 (#139701)
* Bump mastodon to 2.0.1

* Fix mypy
2025-03-03 20:57:30 +02:00
Norbert Rittel
f248901ea8 Grammar fixes in user-facing strings of the LinkPlay integration (#139709)
Grammar fixes in user-facing string of the LinkPlay integration

Fix spelling of "set up", "media player", "ID" and improve the descriptions of the `play_preset` action.
2025-03-03 20:55:47 +02:00
Elias Wernicke
62b6be900f Add complete item intent function for todo component (#127806)
* add complete item intent

* fix error and add tests

* fix merge conflict

* improve error tests

* improve error tests

* add response_key

* add check for non completed

---------

Co-authored-by: Michael Hansen <mike@rhasspy.org>
2025-03-03 12:16:43 -06:00
J. Nick Koston
1b15df3075 Bump ESPHome stable BLE version to 2025.2.2 (#139704)
ensure proxies have https://github.com/esphome/esphome/pull/8328
so they do not reboot themselves if disconnecting takes
too long
2025-03-03 12:44:49 -05:00
Norbert Rittel
229407d685 Fix missing sentence-casing in three Fully Kiosk Browser strings (#139705)
Fix missing sentence-casing in Fully Kiosk Browser strings
2025-03-03 18:25:18 +01:00
Simone Chemelli
aaecb47125 Add strict typing to Comelit (#139455)
* Add quality scale and strict typing to Comelit

* mypy

* fix strings

* remove quality scale

* revert quality scale changes

* improve typing

* letfover

* update typing based on new lib

* align to platform

* cleanup

* apply review comments (part 1)

* apply review comment ( part 2)

* apply review comments

* align

* align test data

* TypedDict

* better casting
2025-03-03 17:57:42 +01:00
Joakim Sørensen
b17ee78dec Bump hass-nabucasa from 0.92.0 to 0.94.0 (#139697) 2025-03-03 15:51:04 +00:00
Erik Montnemery
20e48054cf Fix stale docstrings in onboarding tests (#139696) 2025-03-03 15:08:39 +00:00
cs12ag
ee486c269c Fix unique identifiers where multiple IKEA Tradfri gateways are in use (#136060)
* Create unique identifiers where multiple gateways are in use

Resolving issue https://github.com/home-assistant/core/issues/134497

* Added migration function to __init__.py

Added migration function to execute upon initialisation, to:
a) remove the erroneously-added config)_entry added to the device (gateway B gets added as a config_entry to a device associated to gateway A), and
b) swap out the non-unique identifiers for genuinely unique identifiers.

* Added tests to simulate migration from bad data scenario (i.e. explicitly executing migrate_entity_unique_ids() from __init__.py)

* Ammendments suggested in first review

* Changes after second review

* Rewrite of test_migrate_config_entry_and_identifiers after feedback

* Converted migrate function into major version, updated tests

* Finalised variable naming convention per feedback, added test to validate config entry migrated to v2

* Hopefully final changes for cosmetic / comment stucture

* Further code-coverage in test_migrate_config_entry_and_identifiers()

* Minor test corrections

* Added test for non-tradfri identifiers
2025-03-03 14:06:25 +01:00
Paulus Schoutsen
aee891434f Avoid duplicate chat log content (#139679) 2025-03-03 11:46:40 +01:00
Brett Adams
5472345f45 Add additional garage door code to Advantage Air (#139687)
add Garage door
2025-03-03 11:45:04 +01:00
Norbert Rittel
572534b306 Fix missing camel-case in one "ElevenLabs" string (#139686) 2025-03-03 10:18:30 +01:00
Erik Montnemery
3c363eb5ce Adjust type hints in update entity (#129387)
* Adjust type hints in update entity

* Update allowed return type of update_percentage

---------

Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-03-03 10:17:13 +01:00
andresb5555
7e4432e321 Do not force logfile to roll over when using TimedRotatingFileHandler (#128301)
Do not force log file to roll over when using TimedRotatingFileHandler
2025-03-02 22:07:35 +01:00
Elias Wernicke
5ae7109561 Increase test coverage for todo intent (#135960)
* move intent tests to file

* add tests for errors
2025-03-02 22:04:25 +01:00
hydazz
4602c0a1c3 Add Night mode and HVACAction to Advantage Air (#137475)
* add night mode toggle

* populate AC's action

* set hvac action on zones

* update tests

* show zones as off if AC is off

---------

Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-03-02 21:59:44 +01:00
Michel van de Wetering
53bc5ff029 Keep entered values in form when connecting to Epson projector fails (#135402)
Add suggested values to form
2025-03-02 21:41:38 +01:00
martin12as
c782a6ab63 Improve outlet constant naming for NUT (#139660)
* Update const.py

Fixed to match string.json

* Update const.py
2025-03-02 21:38:12 +01:00
Trevor Warwick
23644a60ac Improve Linkplay device unavailability detection (#138457)
* Dampen reachability changes

Retry a few times before declaring player is unavailable

* Fix ruff-format complaint

Co-authored-by: Simon Lamon <32477463+silamon@users.noreply.github.com>

* Fix ruff-format complaint

Co-authored-by: Simon Lamon <32477463+silamon@users.noreply.github.com>

* Fix ruff-format complaint

Co-authored-by: Simon Lamon <32477463+silamon@users.noreply.github.com>

* Fix duplicated change

Co-authored-by: Simon Lamon <32477463+silamon@users.noreply.github.com>

---------

Co-authored-by: Simon Lamon <32477463+silamon@users.noreply.github.com>
2025-03-02 21:26:54 +01:00
Joost Lekkerkerker
14e66ffef4 Fetch integration list from next branch for analytics insights (#137250)
Fetch integration list from next branch
2025-03-02 21:21:47 +01:00
karwosts
fa40d02a07 Add model_id filter to device selector (#135646)
* Add model_id filter to device selector

* Rerun CI
2025-03-02 21:15:37 +01:00
Bram Kragten
8382663be4 Bump version to 2025.3.0b3 2025-03-02 16:15:38 +01:00
Joost Lekkerkerker
7e1309d874 Bump pysmartthings to 2.4.1 (#139627) 2025-03-02 16:15:16 +01:00
Joost Lekkerkerker
1d0cba1a43 Still request scopes in SmartThings (#139626)
Still request scopes
2025-03-02 16:15:15 +01:00
J. Nick Koston
7d9a6ceb6b Fix arm vacation mode showing as armed away in elkm1 (#139613)
Add native arm vacation mode support to elkm1

Vacation mode is currently implemented as a custom
service which will be deprecated in a future PR.

Note that the custom service was added long before
HA had a native vacation mode which was added
in #45980
2025-03-02 16:15:14 +01:00
Jan Bouwhuis
6abdb28a03 Fix body text of imap message not available in custom event data template (#139609) 2025-03-02 16:15:13 +01:00
J. Nick Koston
3690e03951 Bump inkbird-ble to 0.7.1 (#139603)
changelog: https://github.com/Bluetooth-Devices/inkbird-ble/compare/v0.7.0...v0.7.1
2025-03-02 16:15:13 +01:00
Shay Levy
4fe4d14f16 Bump aioshelly to 13.1.0 (#139601)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-03-02 16:15:12 +01:00
J. Nick Koston
74e8ffa555 Fix handling of NaN float values for current humidity in ESPHome (#139600)
fixes #131837
2025-03-02 16:15:11 +01:00
Robert Resch
c257b228f1 Bump deebot-client to 12.3.1 (#139598) 2025-03-02 16:15:10 +01:00
peteS-UK
6ff0f67d03 Fix Manufacturer naming for Squeezelite model name for Squeezebox (#139586)
Squeezelite Manufacturer Fix
2025-03-02 16:15:10 +01:00
Jan Bouwhuis
8fdff9ca37 Fix - Allow brightness only light MQTT json light to be set up using the brightness flag or via supported_color_modes (#139585)
* Fix - Allow brightness only light MQTT json light to be set up using the `brightness` flag or via  `supported_color_modes`

* Improve comment
2025-03-02 16:15:09 +01:00
Norbert Rittel
9055dff9bd Improve field descriptions of zha.permit action (#139584)
Make the field descriptions of `source_ieee` and `install_code` UI-friendly by cross-referencing them using their friendly names to allow matching translations.

Better explain the alternative of using the `qr_code` field by adding that this contains both the IEEE address and the Install code of the joining device.
2025-03-02 16:15:08 +01:00
G Johansson
e766d681b5 Fix duplicate unique id issue in Sensibo (#139582)
* Fix duplicate unique id issue in Sensibo

* Fixes

* Mods
2025-03-02 16:15:07 +01:00
J. Nick Koston
511e57d0b3 Bump aiohomekit to 3.2.8 (#139579)
changelog: https://github.com/Jc2k/aiohomekit/compare/3.2.7...3.2.8
2025-03-02 16:15:04 +01:00
Markus Adrario
74be49d00d Homee: fix watchdog icon (#139577)
fix watchdog icon
2025-03-02 16:15:04 +01:00
Joost Lekkerkerker
684c3aac6b Don't require not needed scopes in SmartThings (#139576)
* Don't require not needed scopes

* Don't require not needed scopes
2025-03-02 16:15:03 +01:00
Joost Lekkerkerker
a718b6ebff Only determine SmartThings swing modes if we support it (#139571)
Only determine swing modes if we support it
2025-03-02 16:15:02 +01:00
Joost Lekkerkerker
f17274d417 Validate scopes in SmartThings config flow (#139569) 2025-03-02 16:15:01 +01:00
Jan-Philipp Benecke
1530139a61 Bump aiowebdav2 to 0.3.1 (#139567) 2025-03-02 16:15:01 +01:00
Brett Adams
f56d65b2ec Bump Tesla Fleet API to v0.9.12 (#139565)
* bump

* Update manifest.json

* Fix versions

* remove tesla_bluetooth

* Remove mistake
2025-03-02 16:15:00 +01:00
Joost Lekkerkerker
21277a81d3 Bump pysmartthings to 2.4.0 (#139564) 2025-03-02 16:14:59 +01:00
J. Nick Koston
e1ce5b8c69 Revert polling changes to HomeKit Controller (#139550)
This reverts #116200

We changed the polling logic to avoid polling if all chars are marked as watchable
to avoid crashing the firmware on a very limited set of devices as it was
more in line with what iOS does. In the end, the user ended up replacing
the device in #116143 because it turned out to be unreliable in other
ways. The vendor has since issued a firmware update that may resolve
the problem with all of these devices.

In practice it turns out many more devices
report that chars are evented and never send events. After a few months
of data and reports the trade-off does not seem worth it since
users are having to set up manual polling on a wide range of
devices. The amount of devices with evented chars that do not
actually send state vastly exceeds the number of devices that
might crash if they are polled too often so restore the previous
behavior

fixes #138561
fixes #100331
fixes #124529
fixes #123456
fixes #130763
fixes #124099
fixes #124916
fixes #135434
fixes #125273
fixes #124099
fixes #119617
2025-03-02 16:14:59 +01:00
Joost Lekkerkerker
0323a9c4e6 Add SmartThings Viper device info (#139548) 2025-03-02 16:14:58 +01:00
Joost Lekkerkerker
c7d89398a0 Improve SmartThings OCF device info (#139547) 2025-03-02 16:14:57 +01:00
Joost Lekkerkerker
8cc587d3a7 Bump pysmartthings to 2.3.0 (#139546) 2025-03-02 16:14:56 +01:00
J. Nick Koston
5ad156767a Bump PySwitchBot to 0.56.1 (#139544)
changelog: https://github.com/sblibs/pySwitchbot/compare/0.56.0...0.56.1
2025-03-02 16:14:56 +01:00
Joost Lekkerkerker
f54b3f4de2 Remove orphan devices on startup in SmartThings (#139541) 2025-03-02 16:14:55 +01:00
Joost Lekkerkerker
6f0c62dc9d Bump pysmartthings to 2.2.0 (#139539) 2025-03-02 16:14:54 +01:00
StaleLoafOfBread
dce8bca103 Fix alert not respecting can_acknowledge setting (#139483)
* fix(alert): check can_ack prior to acking

* fix(alert): add test for when can_acknowledge=False

* fix(alert): warn on can_ack blocking an ack

* Raise error when trying to acknowledge alert with can_acknowledge set to False

* Rewrite can_ack check as guard

Co-authored-by: Franck Nijhof <frenck@frenck.nl>

* Make can_ack service error msg human readable because it will show up in the UI

* format with ruff

* Make pytest aware of service error when acking an unackable alert

---------

Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2025-03-02 16:14:53 +01:00
Joost Lekkerkerker
22af8af132 Set SmartThings delta energy to Total (#139474) 2025-03-02 16:14:52 +01:00
Joost Lekkerkerker
8a62b882bf Use last event as color mode in SmartThings (#139473)
* Use last event as color mode in SmartThings

* Use last event as color mode in SmartThings

* Fix
2025-03-02 16:14:52 +01:00
Filip Agh
708f22fe6f Fix update data for multiple Gree devices (#139469)
fix sync date for multiple devices

do not use handler for explicit update devices as internal communication lib do not provide which device is updated
use ha update loop

copy data object to prevent rewrite data from internal lib

allow more time to process response before log warning about long wait for response and make log message more clear
2025-03-02 16:14:51 +01:00
Marcel van der Veldt
a4e71e2055 Ensure Hue bridge is added first to the device registry (#139438) 2025-03-02 16:14:50 +01:00
Juan Grande
61a3cc37e0 Fix bug in derivative sensor when source sensor's state is constant (#139230)
Previously, when the source sensor's state remains constant, the derivative
sensor repeats its latest value indefinitely.

This patch fixes this bug by consuming the state_reported event and updating
the sensor's output even when the source sensor doesn't change its state.
2025-03-02 16:11:06 +01:00
Guido Schmitz
a0668e5a5b Handle IPv6 URLs in devolo Home Network (#139191)
* Handle IPv6 URLs in devolo Home Network

* Use yarl
2025-03-02 16:11:06 +01:00
G Johansson
b4b7142b55 Specify recorder as after dependency in sql integration (#139037)
* Specify recorder as after dependency in sql integration

* Remove hassfest exception

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2025-03-02 16:11:05 +01:00
J. Nick Koston
108b71d33c Use multiple indexed group-by queries to get start time states for MySQL (#138786)
* tweaks

* mysql

* mysql

* Update homeassistant/components/recorder/history/modern.py

* Update homeassistant/components/recorder/history/modern.py

* Update homeassistant/components/recorder/const.py

* Update homeassistant/components/recorder/statistics.py

* Apply suggestions from code review

* mysql

* mysql

* cover

* make sure db is fully init on old schema

* fixes

* fixes

* coverage

* coverage

* coverage

* s/slow_dependant_subquery/slow_dependent_subquery/g

* reword

* comment that callers are responsible for staying under the limit

* comment that callers are responsible for staying under the limit

* switch to kwargs

* reduce branching complexity

* split stats query

* preen

* split tests

* split tests
2025-03-02 16:11:04 +01:00
Martreides
2636a47333 Fix Nederlandse Spoorwegen to ignore trains in the past (#138331)
* Update NS integration to show first next train instead of just the first.

* Handle no first or next trip.

* Remove debug statement.

* Remove seconds and revert back to minutes.

* Make use of dt_util.now().

* Fix issue with next train if no first train.
2025-03-02 16:11:03 +01:00
M-A
17116fcd6c Bump env_canada to 0.8.0 (#138237)
* Bump env_canada to 0.8.0

* Fix requirements*.txt

* Grepped more

---------

Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-03-02 16:11:03 +01:00
LaithBudairi
17c16144d1 Add missing 'state_class' attribute for Growatt plant sensors (#132145)
* Add missing 'state_class' attribute for Growatt plant sensors

* Update total.py

* Update total.py 'TOTAL_INCREASING'

* Update total.py "maximum_output" -> 'TOTAL_INCREASING'

* Update homeassistant/components/growatt_server/sensor/total.py

---------

Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2025-03-02 16:11:02 +01:00
Bram Kragten
178d509d56 Bump version to 2025.3.0b2 2025-02-28 17:06:59 +01:00
Bram Kragten
09c129de40 Update frontend to 20250228.0 (#139531) 2025-02-28 17:06:51 +01:00
Joost Lekkerkerker
07128ba063 Bump yt-dlp to 2025.02.19 (#139526) 2025-02-28 17:06:50 +01:00
Robert Resch
a786ff53ff Don't split wheels builder anymore (#139522) 2025-02-28 17:06:50 +01:00
Robert Svensson
d2e19c829d Suppress unsupported event 'EVT_USP_RpsPowerDeniedByPsuOverload' by bumping aiounifi to v83 (#139519)
Bump aiounifi to v83
2025-02-28 17:06:49 +01:00
Jan Bouwhuis
94b342f26a Make the Tuya backend library compatible with the newer paho mqtt client. (#139518)
* Make the Tuya backend library compatible with the newer paho mqtt client.

* Improve classnames and docstrings
2025-02-28 17:06:48 +01:00
Josef Zweck
9e3e6b3f43 Add diagnostics to onedrive (#139516)
* Add diagnostics to onedrive

* redact PII

* add raw data
2025-02-28 17:06:47 +01:00
Erik Montnemery
4300900322 Improve error handling in CoreBackupReaderWriter (#139508) 2025-02-28 17:06:46 +01:00
Brett Adams
342e04974d Fix shift state in Teslemetry (#139505)
* Fix shift state

* Different fix
2025-02-28 17:06:46 +01:00
Erik Montnemery
fdb4c0a81f Fail recorder.backup.async_pre_backup if Home Assistant is not running (#139491)
Fail recorder.backup.async_pre_backup if hass is not running
2025-02-28 17:06:45 +01:00
Ivan Lopez Hernandez
6de878ffe4 Fix Gemini Schema validation for #139416 (#139478)
Fixed Schema validation for issue #139477
2025-02-28 17:06:44 +01:00
Joost Lekkerkerker
c63aaec09e Set SmartThings suggested display precision (#139470) 2025-02-28 17:06:43 +01:00
Joost Lekkerkerker
d8bf47c101 Only lowercase SmartThings media input source if we have it (#139468) 2025-02-28 17:06:42 +01:00
Joost Lekkerkerker
736ff8828d Bump pysmartthings to 2.1.0 (#139460) 2025-02-28 17:06:41 +01:00
Josef Zweck
b501999a4c Improve onedrive migration (#139458) 2025-02-28 17:06:40 +01:00
Jan-Philipp Benecke
3985f1c6c8 Change webdav namespace to absolut URI (#139456)
* Change webdav namespace to absolut URI

* Add const file
2025-02-28 17:06:39 +01:00
Joost Lekkerkerker
46ec3987a8 Bump pysmartthings to 2.0.1 (#139454) 2025-02-28 17:06:39 +01:00
Joost Lekkerkerker
df4e5a54e3 Fix SmartThings diagnostics (#139447) 2025-02-28 17:06:38 +01:00
J. Diego Rodríguez Royo
d8a259044f Bump aiohomeconnect to 0.15.1 (#139445) 2025-02-28 17:06:37 +01:00
Michael Hansen
0891669aee Move climate intent to homeassistant integration (#139371)
* Move climate intent to homeassistant integration

* Move get temperature intent to intent integration

* Clean up old test
2025-02-28 17:06:36 +01:00
Marcel van der Veldt
83c0351338 Add new mediatypes to Music Assistant integration (#139338)
* Bump Music Assistant client to 1.1.0

* Add some casts to help mypy

* Add handling of the new media types in Music Assistant

* mypy cleanup

* lint

* update snapshot

* Adjust tests

---------

Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-02-28 17:06:35 +01:00
Jeef
c5e5fe555d Bump weatherflow4py to 1.3.1 (#135529)
* version bump of dep

* update requirements
2025-02-28 17:06:34 +01:00
Bram Kragten
345ba73777 Bump version to 2025.3.0b1 2025-02-27 16:48:00 +01:00
Bram Kragten
e4200a79a2 Update frontend to 20250227.0 (#139437) 2025-02-27 16:47:52 +01:00
Marcel van der Veldt
381fa65ba0 Fix Music Assistant media player entity features (#139428)
* Fix Music Assistant supported media player features

* Update supported features when player config changes

* Add tests
2025-02-27 16:47:51 +01:00
starkillerOG
16314711b8 Bump reolink-aio to 0.12.1 (#139427) 2025-02-27 16:47:50 +01:00
J. Nick Koston
553abe4a4a Bump bleak-esphome to 2.8.0 (#139426) 2025-02-27 16:47:49 +01:00
Joost Lekkerkerker
6a1bbdb3a7 Add diagnostics to SmartThings (#139423) 2025-02-27 16:47:48 +01:00
Paulus Schoutsen
59d92c75bd Fix conversation agent fallback (#139421) 2025-02-27 16:47:47 +01:00
J. Nick Koston
7732e6878e Bump habluetooth to 3.24.1 (#139420) 2025-02-27 16:47:46 +01:00
Joost Lekkerkerker
2cde317d59 Bump pysmartthings to 2.0.0 (#139418)
* Bump pysmartthings to 2.0.0

* Fix

* Fix

* Fix

* Fix
2025-02-27 16:47:45 +01:00
Josef Zweck
0c08430507 Bump onedrive to 0.0.12 (#139410)
* Bump onedrive to 0.0.12

* Add alternative name
2025-02-27 16:47:45 +01:00
J. Diego Rodríguez Royo
fa6d7d5e3c Fix fetch options error for Home connect (#139392)
* Handle errors when obtaining options definitions

* Don't fetch program options if the program key is unknown

* Test to ensure that available program endpoint is not called on unknown program
2025-02-27 16:47:43 +01:00
Michael Hansen
585b950a46 Bump intents to 2025.2.26 (#139387) 2025-02-27 16:47:42 +01:00
puddly
3effc2e182 Bump ZHA to 0.0.51 (#139383)
* Bump ZHA to 0.0.51

* Fix unit tests not accounting for primary entities
2025-02-27 16:47:42 +01:00
fwestenberg
0e1602ff71 Bump stookwijzer==1.6.1 (#139380) 2025-02-27 16:47:41 +01:00
Bram Kragten
693584ce29 Bump version to 2025.3.0b0 2025-02-26 18:23:01 +01:00
1650 changed files with 85190 additions and 18633 deletions

View File

@@ -32,7 +32,7 @@ jobs:
fetch-depth: 0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
@@ -69,7 +69,7 @@ jobs:
run: find ./homeassistant/components/*/translations -name "*.json" | tar zcvf translations.tar.gz -T -
- name: Upload translations
uses: actions/upload-artifact@v4.6.1
uses: actions/upload-artifact@v4.6.2
with:
name: translations
path: translations.tar.gz
@@ -116,7 +116,7 @@ jobs:
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
if: needs.init.outputs.channel == 'dev'
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
@@ -175,7 +175,7 @@ jobs:
sed -i "s|pykrakenapi|# pykrakenapi|g" requirements_all.txt
- name: Download translations
uses: actions/download-artifact@v4.1.9
uses: actions/download-artifact@v4.2.1
with:
name: translations
@@ -190,14 +190,14 @@ jobs:
echo "${{ github.sha }};${{ github.ref }};${{ github.event_name }};${{ github.actor }}" > rootfs/OFFICIAL_IMAGE
- name: Login to GitHub Container Registry
uses: docker/login-action@v3.3.0
uses: docker/login-action@v3.4.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build base image
uses: home-assistant/builder@2025.02.0
uses: home-assistant/builder@2025.03.0
with:
args: |
$BUILD_ARGS \
@@ -256,14 +256,14 @@ jobs:
fi
- name: Login to GitHub Container Registry
uses: docker/login-action@v3.3.0
uses: docker/login-action@v3.4.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build base image
uses: home-assistant/builder@2025.02.0
uses: home-assistant/builder@2025.03.0
with:
args: |
$BUILD_ARGS \
@@ -330,14 +330,14 @@ jobs:
- name: Login to DockerHub
if: matrix.registry == 'docker.io/homeassistant'
uses: docker/login-action@v3.3.0
uses: docker/login-action@v3.4.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
if: matrix.registry == 'ghcr.io/home-assistant'
uses: docker/login-action@v3.3.0
uses: docker/login-action@v3.4.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
@@ -457,12 +457,12 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Download translations
uses: actions/download-artifact@v4.1.9
uses: actions/download-artifact@v4.2.1
with:
name: translations
@@ -502,7 +502,7 @@ jobs:
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Login to GitHub Container Registry
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
@@ -531,7 +531,7 @@ jobs:
- name: Generate artifact attestation
if: needs.init.outputs.channel != 'dev' && needs.init.outputs.publish == 'true'
uses: actions/attest-build-provenance@bd77c077858b8d561b7a36cbe48ef4cc642ca39d # v2.2.2
uses: actions/attest-build-provenance@c074443f1aee8d4aeeae555aebba3282517141b2 # v2.2.3
with:
subject-name: ${{ env.HASSFEST_IMAGE_NAME }}
subject-digest: ${{ steps.push.outputs.digest }}

View File

@@ -37,7 +37,7 @@ on:
type: boolean
env:
CACHE_VERSION: 11
CACHE_VERSION: 12
UV_CACHE_VERSION: 1
MYPY_CACHE_VERSION: 9
HA_SHORT_VERSION: "2025.4"
@@ -89,6 +89,7 @@ jobs:
test_groups: ${{ steps.info.outputs.test_groups }}
tests_glob: ${{ steps.info.outputs.tests_glob }}
tests: ${{ steps.info.outputs.tests }}
lint_only: ${{ steps.info.outputs.lint_only }}
skip_coverage: ${{ steps.info.outputs.skip_coverage }}
runs-on: ubuntu-24.04
steps:
@@ -142,6 +143,7 @@ jobs:
test_group_count=10
tests="[]"
tests_glob=""
lint_only=""
skip_coverage=""
if [[ "${{ steps.integrations.outputs.changes }}" != "[]" ]];
@@ -192,6 +194,17 @@ jobs:
test_full_suite="true"
fi
if [[ "${{ github.event.inputs.lint-only }}" == "true" ]] \
|| [[ "${{ github.event.inputs.pylint-only }}" == "true" ]] \
|| [[ "${{ github.event.inputs.mypy-only }}" == "true" ]] \
|| [[ "${{ github.event.inputs.audit-licenses-only }}" == "true" ]] \
|| [[ "${{ github.event_name }}" == "push" \
&& "${{ github.event.repository.full_name }}" != "home-assistant/core" ]];
then
lint_only="true"
skip_coverage="true"
fi
if [[ "${{ github.event.inputs.skip-coverage }}" == "true" ]] \
|| [[ "${{ contains(github.event.pull_request.labels.*.name, 'ci-skip-coverage') }}" == "true" ]];
then
@@ -217,6 +230,8 @@ jobs:
echo "tests=${tests}" >> $GITHUB_OUTPUT
echo "tests_glob: ${tests_glob}"
echo "tests_glob=${tests_glob}" >> $GITHUB_OUTPUT
echo "lint_only": ${lint_only}
echo "lint_only=${lint_only}" >> $GITHUB_OUTPUT
echo "skip_coverage: ${skip_coverage}"
echo "skip_coverage=${skip_coverage}" >> $GITHUB_OUTPUT
@@ -234,13 +249,13 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v4.2.2
uses: actions/cache@v4.2.3
with:
path: venv
key: >-
@@ -256,7 +271,7 @@ jobs:
uv pip install "$(cat requirements_test.txt | grep pre-commit)"
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v4.2.2
uses: actions/cache@v4.2.3
with:
path: ${{ env.PRE_COMMIT_CACHE }}
lookup-only: true
@@ -279,14 +294,14 @@ jobs:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.2
uses: actions/cache/restore@v4.2.3
with:
path: venv
fail-on-cache-miss: true
@@ -295,7 +310,7 @@ jobs:
needs.info.outputs.pre-commit_cache_key }}
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache/restore@v4.2.2
uses: actions/cache/restore@v4.2.3
with:
path: ${{ env.PRE_COMMIT_CACHE }}
fail-on-cache-miss: true
@@ -319,14 +334,14 @@ jobs:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.2
uses: actions/cache/restore@v4.2.3
with:
path: venv
fail-on-cache-miss: true
@@ -335,7 +350,7 @@ jobs:
needs.info.outputs.pre-commit_cache_key }}
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache/restore@v4.2.2
uses: actions/cache/restore@v4.2.3
with:
path: ${{ env.PRE_COMMIT_CACHE }}
fail-on-cache-miss: true
@@ -359,14 +374,14 @@ jobs:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.2
uses: actions/cache/restore@v4.2.3
with:
path: venv
fail-on-cache-miss: true
@@ -375,7 +390,7 @@ jobs:
needs.info.outputs.pre-commit_cache_key }}
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache/restore@v4.2.2
uses: actions/cache/restore@v4.2.3
with:
path: ${{ env.PRE_COMMIT_CACHE }}
fail-on-cache-miss: true
@@ -469,7 +484,7 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
with:
python-version: ${{ matrix.python-version }}
check-latest: true
@@ -482,7 +497,7 @@ jobs:
env.HA_SHORT_VERSION }}-$(date -u '+%Y-%m-%dT%H:%M:%s')" >> $GITHUB_OUTPUT
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v4.2.2
uses: actions/cache@v4.2.3
with:
path: venv
key: >-
@@ -490,7 +505,7 @@ jobs:
needs.info.outputs.python_cache_key }}
- name: Restore uv wheel cache
if: steps.cache-venv.outputs.cache-hit != 'true'
uses: actions/cache@v4.2.2
uses: actions/cache@v4.2.3
with:
path: ${{ env.UV_CACHE_DIR }}
key: >-
@@ -537,7 +552,7 @@ jobs:
python --version
uv pip freeze >> pip_freeze.txt
- name: Upload pip_freeze artifact
uses: actions/upload-artifact@v4.6.1
uses: actions/upload-artifact@v4.6.2
with:
name: pip-freeze-${{ matrix.python-version }}
path: pip_freeze.txt
@@ -572,13 +587,13 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore full Python ${{ env.DEFAULT_PYTHON }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.2
uses: actions/cache/restore@v4.2.3
with:
path: venv
fail-on-cache-miss: true
@@ -605,13 +620,13 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.2
uses: actions/cache/restore@v4.2.3
with:
path: venv
fail-on-cache-miss: true
@@ -623,6 +638,25 @@ jobs:
. venv/bin/activate
python -m script.gen_requirements_all validate
dependency-review:
name: Dependency review
runs-on: ubuntu-24.04
needs:
- info
- base
if: |
github.event.inputs.pylint-only != 'true'
&& github.event.inputs.mypy-only != 'true'
&& needs.info.outputs.requirements == 'true'
&& github.event_name == 'pull_request'
steps:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
- name: Dependency review
uses: actions/dependency-review-action@v4.5.0
with:
license-check: false # We use our own license audit checks
audit-licenses:
name: Audit licenses
runs-on: ubuntu-24.04
@@ -643,13 +677,13 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
with:
python-version: ${{ matrix.python-version }}
check-latest: true
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.2
uses: actions/cache/restore@v4.2.3
with:
path: venv
fail-on-cache-miss: true
@@ -661,7 +695,7 @@ jobs:
. venv/bin/activate
python -m script.licenses extract --output-file=licenses-${{ matrix.python-version }}.json
- name: Upload licenses
uses: actions/upload-artifact@v4.6.1
uses: actions/upload-artifact@v4.6.2
with:
name: licenses-${{ github.run_number }}-${{ matrix.python-version }}
path: licenses-${{ matrix.python-version }}.json
@@ -686,13 +720,13 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore full Python ${{ env.DEFAULT_PYTHON }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.2
uses: actions/cache/restore@v4.2.3
with:
path: venv
fail-on-cache-miss: true
@@ -733,13 +767,13 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore full Python ${{ env.DEFAULT_PYTHON }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.2
uses: actions/cache/restore@v4.2.3
with:
path: venv
fail-on-cache-miss: true
@@ -778,7 +812,7 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
@@ -791,7 +825,7 @@ jobs:
env.HA_SHORT_VERSION }}-$(date -u '+%Y-%m-%dT%H:%M:%s')" >> $GITHUB_OUTPUT
- name: Restore full Python ${{ env.DEFAULT_PYTHON }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.2
uses: actions/cache/restore@v4.2.3
with:
path: venv
fail-on-cache-miss: true
@@ -799,7 +833,7 @@ jobs:
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.info.outputs.python_cache_key }}
- name: Restore mypy cache
uses: actions/cache@v4.2.2
uses: actions/cache@v4.2.3
with:
path: .mypy_cache
key: >-
@@ -829,11 +863,7 @@ jobs:
prepare-pytest-full:
runs-on: ubuntu-24.04
if: |
(github.event_name != 'push' || github.event.repository.full_name == 'home-assistant/core')
&& github.event.inputs.lint-only != 'true'
&& github.event.inputs.pylint-only != 'true'
&& github.event.inputs.mypy-only != 'true'
&& github.event.inputs.audit-licenses-only != 'true'
needs.info.outputs.lint_only != 'true'
&& needs.info.outputs.test_full_suite == 'true'
needs:
- info
@@ -859,13 +889,13 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.2
uses: actions/cache/restore@v4.2.3
with:
path: venv
fail-on-cache-miss: true
@@ -877,7 +907,7 @@ jobs:
. venv/bin/activate
python -m script.split_tests ${{ needs.info.outputs.test_group_count }} tests
- name: Upload pytest_buckets
uses: actions/upload-artifact@v4.6.1
uses: actions/upload-artifact@v4.6.2
with:
name: pytest_buckets
path: pytest_buckets.txt
@@ -886,11 +916,7 @@ jobs:
pytest-full:
runs-on: ubuntu-24.04
if: |
(github.event_name != 'push' || github.event.repository.full_name == 'home-assistant/core')
&& github.event.inputs.lint-only != 'true'
&& github.event.inputs.pylint-only != 'true'
&& github.event.inputs.mypy-only != 'true'
&& github.event.inputs.audit-licenses-only != 'true'
needs.info.outputs.lint_only != 'true'
&& needs.info.outputs.test_full_suite == 'true'
needs:
- info
@@ -923,13 +949,13 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
with:
python-version: ${{ matrix.python-version }}
check-latest: true
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.2
uses: actions/cache/restore@v4.2.3
with:
path: venv
fail-on-cache-miss: true
@@ -942,7 +968,7 @@ jobs:
run: |
echo "::add-matcher::.github/workflows/matchers/pytest-slow.json"
- name: Download pytest_buckets
uses: actions/download-artifact@v4.1.9
uses: actions/download-artifact@v4.2.1
with:
name: pytest_buckets
- name: Compile English translations
@@ -962,6 +988,7 @@ jobs:
if [[ "${{ needs.info.outputs.skip_coverage }}" != "true" ]]; then
cov_params+=(--cov="homeassistant")
cov_params+=(--cov-report=xml)
cov_params+=(--junitxml=junit.xml -o junit_family=legacy)
fi
echo "Test group ${{ matrix.group }}: $(sed -n "${{ matrix.group }},1p" pytest_buckets.txt)"
@@ -980,18 +1007,24 @@ jobs:
2>&1 | tee pytest-${{ matrix.python-version }}-${{ matrix.group }}.txt
- name: Upload pytest output
if: success() || failure() && steps.pytest-full.conclusion == 'failure'
uses: actions/upload-artifact@v4.6.1
uses: actions/upload-artifact@v4.6.2
with:
name: pytest-${{ github.run_number }}-${{ matrix.python-version }}-${{ matrix.group }}
path: pytest-*.txt
overwrite: true
- name: Upload coverage artifact
if: needs.info.outputs.skip_coverage != 'true'
uses: actions/upload-artifact@v4.6.1
uses: actions/upload-artifact@v4.6.2
with:
name: coverage-${{ matrix.python-version }}-${{ matrix.group }}
path: coverage.xml
overwrite: true
- name: Upload test results artifact
if: needs.info.outputs.skip_coverage != 'true' && !cancelled()
uses: actions/upload-artifact@v4.6.2
with:
name: test-results-full-${{ matrix.python-version }}-${{ matrix.group }}
path: junit.xml
- name: Remove pytest_buckets
run: rm pytest_buckets.txt
- name: Check dirty
@@ -1009,11 +1042,7 @@ jobs:
MYSQL_ROOT_PASSWORD: password
options: --health-cmd="mysqladmin ping -uroot -ppassword" --health-interval=5s --health-timeout=2s --health-retries=3
if: |
(github.event_name != 'push' || github.event.repository.full_name == 'home-assistant/core')
&& github.event.inputs.lint-only != 'true'
&& github.event.inputs.pylint-only != 'true'
&& github.event.inputs.mypy-only != 'true'
&& github.event.inputs.audit-licenses-only != 'true'
needs.info.outputs.lint_only != 'true'
&& needs.info.outputs.mariadb_groups != '[]'
needs:
- info
@@ -1045,13 +1074,13 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
with:
python-version: ${{ matrix.python-version }}
check-latest: true
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.2
uses: actions/cache/restore@v4.2.3
with:
path: venv
fail-on-cache-miss: true
@@ -1088,6 +1117,7 @@ jobs:
cov_params+=(--cov="homeassistant.components.recorder")
cov_params+=(--cov-report=xml)
cov_params+=(--cov-report=term-missing)
cov_params+=(--junitxml=junit.xml -o junit_family=legacy)
fi
python3 -b -X dev -m pytest \
@@ -1108,7 +1138,7 @@ jobs:
2>&1 | tee pytest-${{ matrix.python-version }}-${mariadb}.txt
- name: Upload pytest output
if: success() || failure() && steps.pytest-partial.conclusion == 'failure'
uses: actions/upload-artifact@v4.6.1
uses: actions/upload-artifact@v4.6.2
with:
name: pytest-${{ github.run_number }}-${{ matrix.python-version }}-${{
steps.pytest-partial.outputs.mariadb }}
@@ -1116,12 +1146,19 @@ jobs:
overwrite: true
- name: Upload coverage artifact
if: needs.info.outputs.skip_coverage != 'true'
uses: actions/upload-artifact@v4.6.1
uses: actions/upload-artifact@v4.6.2
with:
name: coverage-${{ matrix.python-version }}-${{
steps.pytest-partial.outputs.mariadb }}
path: coverage.xml
overwrite: true
- name: Upload test results artifact
if: needs.info.outputs.skip_coverage != 'true' && !cancelled()
uses: actions/upload-artifact@v4.6.2
with:
name: test-results-mariadb-${{ matrix.python-version }}-${{
steps.pytest-partial.outputs.mariadb }}
path: junit.xml
- name: Check dirty
run: |
./script/check_dirty
@@ -1137,11 +1174,7 @@ jobs:
POSTGRES_PASSWORD: password
options: --health-cmd="pg_isready -hlocalhost -Upostgres" --health-interval=5s --health-timeout=2s --health-retries=3
if: |
(github.event_name != 'push' || github.event.repository.full_name == 'home-assistant/core')
&& github.event.inputs.lint-only != 'true'
&& github.event.inputs.pylint-only != 'true'
&& github.event.inputs.mypy-only != 'true'
&& github.event.inputs.audit-licenses-only != 'true'
needs.info.outputs.lint_only != 'true'
&& needs.info.outputs.postgresql_groups != '[]'
needs:
- info
@@ -1175,13 +1208,13 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
with:
python-version: ${{ matrix.python-version }}
check-latest: true
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.2
uses: actions/cache/restore@v4.2.3
with:
path: venv
fail-on-cache-miss: true
@@ -1218,6 +1251,7 @@ jobs:
cov_params+=(--cov="homeassistant.components.recorder")
cov_params+=(--cov-report=xml)
cov_params+=(--cov-report=term-missing)
cov_params+=(--junitxml=junit.xml -o junit_family=legacy)
fi
python3 -b -X dev -m pytest \
@@ -1239,7 +1273,7 @@ jobs:
2>&1 | tee pytest-${{ matrix.python-version }}-${postgresql}.txt
- name: Upload pytest output
if: success() || failure() && steps.pytest-partial.conclusion == 'failure'
uses: actions/upload-artifact@v4.6.1
uses: actions/upload-artifact@v4.6.2
with:
name: pytest-${{ github.run_number }}-${{ matrix.python-version }}-${{
steps.pytest-partial.outputs.postgresql }}
@@ -1247,12 +1281,19 @@ jobs:
overwrite: true
- name: Upload coverage artifact
if: needs.info.outputs.skip_coverage != 'true'
uses: actions/upload-artifact@v4.6.1
uses: actions/upload-artifact@v4.6.2
with:
name: coverage-${{ matrix.python-version }}-${{
steps.pytest-partial.outputs.postgresql }}
path: coverage.xml
overwrite: true
- name: Upload test results artifact
if: needs.info.outputs.skip_coverage != 'true' && !cancelled()
uses: actions/upload-artifact@v4.6.2
with:
name: test-results-postgres-${{ matrix.python-version }}-${{
steps.pytest-partial.outputs.postgresql }}
path: junit.xml
- name: Check dirty
run: |
./script/check_dirty
@@ -1271,7 +1312,7 @@ jobs:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
- name: Download all coverage artifacts
uses: actions/download-artifact@v4.1.9
uses: actions/download-artifact@v4.2.1
with:
pattern: coverage-*
- name: Upload coverage to Codecov
@@ -1285,11 +1326,7 @@ jobs:
pytest-partial:
runs-on: ubuntu-24.04
if: |
(github.event_name != 'push' || github.event.repository.full_name == 'home-assistant/core')
&& github.event.inputs.lint-only != 'true'
&& github.event.inputs.pylint-only != 'true'
&& github.event.inputs.mypy-only != 'true'
&& github.event.inputs.audit-licenses-only != 'true'
needs.info.outputs.lint_only != 'true'
&& needs.info.outputs.tests_glob
&& needs.info.outputs.test_full_suite == 'false'
needs:
@@ -1322,13 +1359,13 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
with:
python-version: ${{ matrix.python-version }}
check-latest: true
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.2
uses: actions/cache/restore@v4.2.3
with:
path: venv
fail-on-cache-miss: true
@@ -1365,6 +1402,7 @@ jobs:
cov_params+=(--cov="homeassistant.components.${{ matrix.group }}")
cov_params+=(--cov-report=xml)
cov_params+=(--cov-report=term-missing)
cov_params+=(--junitxml=junit.xml -o junit_family=legacy)
fi
python3 -b -X dev -m pytest \
@@ -1382,18 +1420,24 @@ jobs:
2>&1 | tee pytest-${{ matrix.python-version }}-${{ matrix.group }}.txt
- name: Upload pytest output
if: success() || failure() && steps.pytest-partial.conclusion == 'failure'
uses: actions/upload-artifact@v4.6.1
uses: actions/upload-artifact@v4.6.2
with:
name: pytest-${{ github.run_number }}-${{ matrix.python-version }}-${{ matrix.group }}
path: pytest-*.txt
overwrite: true
- name: Upload coverage artifact
if: needs.info.outputs.skip_coverage != 'true'
uses: actions/upload-artifact@v4.6.1
uses: actions/upload-artifact@v4.6.2
with:
name: coverage-${{ matrix.python-version }}-${{ matrix.group }}
path: coverage.xml
overwrite: true
- name: Upload test results artifact
if: needs.info.outputs.skip_coverage != 'true' && !cancelled()
uses: actions/upload-artifact@v4.6.2
with:
name: test-results-partial-${{ matrix.python-version }}-${{ matrix.group }}
path: junit.xml
- name: Check dirty
run: |
./script/check_dirty
@@ -1410,7 +1454,7 @@ jobs:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
- name: Download all coverage artifacts
uses: actions/download-artifact@v4.1.9
uses: actions/download-artifact@v4.2.1
with:
pattern: coverage-*
- name: Upload coverage to Codecov
@@ -1419,3 +1463,28 @@ jobs:
with:
fail_ci_if_error: true
token: ${{ secrets.CODECOV_TOKEN }}
upload-test-results:
name: Upload test results to Codecov
# codecov/test-results-action currently doesn't support tokenless uploads
# therefore we can't run it on forks
if: ${{ (github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork) && needs.info.outputs.skip_coverage != 'true' && !cancelled() }}
runs-on: ubuntu-24.04
needs:
- info
- pytest-partial
- pytest-full
- pytest-postgres
- pytest-mariadb
timeout-minutes: 10
steps:
- name: Download all coverage artifacts
uses: actions/download-artifact@v4.2.1
with:
pattern: test-results-*
- name: Upload test results to Codecov
uses: codecov/test-results-action@v1
with:
fail_ci_if_error: true
verbose: true
token: ${{ secrets.CODECOV_TOKEN }}

View File

@@ -24,11 +24,11 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Initialize CodeQL
uses: github/codeql-action/init@v3.28.10
uses: github/codeql-action/init@v3.28.13
with:
languages: python
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3.28.10
uses: github/codeql-action/analyze@v3.28.13
with:
category: "/language:python"

View File

@@ -22,7 +22,7 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}

View File

@@ -36,7 +36,7 @@ jobs:
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.4.0
uses: actions/setup-python@v5.5.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
@@ -91,7 +91,7 @@ jobs:
) > build_constraints.txt
- name: Upload env_file
uses: actions/upload-artifact@v4.6.1
uses: actions/upload-artifact@v4.6.2
with:
name: env_file
path: ./.env_file
@@ -99,14 +99,14 @@ jobs:
overwrite: true
- name: Upload build_constraints
uses: actions/upload-artifact@v4.6.1
uses: actions/upload-artifact@v4.6.2
with:
name: build_constraints
path: ./build_constraints.txt
overwrite: true
- name: Upload requirements_diff
uses: actions/upload-artifact@v4.6.1
uses: actions/upload-artifact@v4.6.2
with:
name: requirements_diff
path: ./requirements_diff.txt
@@ -118,7 +118,7 @@ jobs:
python -m script.gen_requirements_all ci
- name: Upload requirements_all_wheels
uses: actions/upload-artifact@v4.6.1
uses: actions/upload-artifact@v4.6.2
with:
name: requirements_all_wheels
path: ./requirements_all_wheels_*.txt
@@ -138,17 +138,17 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Download env_file
uses: actions/download-artifact@v4.1.9
uses: actions/download-artifact@v4.2.1
with:
name: env_file
- name: Download build_constraints
uses: actions/download-artifact@v4.1.9
uses: actions/download-artifact@v4.2.1
with:
name: build_constraints
- name: Download requirements_diff
uses: actions/download-artifact@v4.1.9
uses: actions/download-artifact@v4.2.1
with:
name: requirements_diff
@@ -159,7 +159,7 @@ jobs:
sed -i "/uv/d" requirements_diff.txt
- name: Build wheels
uses: home-assistant/wheels@2025.02.0
uses: home-assistant/wheels@2025.03.0
with:
abi: ${{ matrix.abi }}
tag: musllinux_1_2
@@ -187,22 +187,22 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Download env_file
uses: actions/download-artifact@v4.1.9
uses: actions/download-artifact@v4.2.1
with:
name: env_file
- name: Download build_constraints
uses: actions/download-artifact@v4.1.9
uses: actions/download-artifact@v4.2.1
with:
name: build_constraints
- name: Download requirements_diff
uses: actions/download-artifact@v4.1.9
uses: actions/download-artifact@v4.2.1
with:
name: requirements_diff
- name: Download requirements_all_wheels
uses: actions/download-artifact@v4.1.9
uses: actions/download-artifact@v4.2.1
with:
name: requirements_all_wheels
@@ -219,7 +219,7 @@ jobs:
sed -i "/uv/d" requirements_diff.txt
- name: Build wheels
uses: home-assistant/wheels@2025.02.0
uses: home-assistant/wheels@2025.03.0
with:
abi: ${{ matrix.abi }}
tag: musllinux_1_2

1
.gitignore vendored
View File

@@ -69,6 +69,7 @@ test-reports/
test-results.xml
test-output.xml
pytest-*.txt
junit.xml
# Translations
*.mo

View File

@@ -1,6 +1,6 @@
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.9.8
rev: v0.11.0
hooks:
- id: ruff
args:

View File

@@ -119,6 +119,7 @@ homeassistant.components.bluetooth_adapters.*
homeassistant.components.bluetooth_tracker.*
homeassistant.components.bmw_connected_drive.*
homeassistant.components.bond.*
homeassistant.components.bosch_alarm.*
homeassistant.components.braviatv.*
homeassistant.components.bring.*
homeassistant.components.brother.*
@@ -136,6 +137,7 @@ homeassistant.components.clicksend.*
homeassistant.components.climate.*
homeassistant.components.cloud.*
homeassistant.components.co2signal.*
homeassistant.components.comelit.*
homeassistant.components.command_line.*
homeassistant.components.config.*
homeassistant.components.configurator.*
@@ -411,6 +413,7 @@ homeassistant.components.recollect_waste.*
homeassistant.components.recorder.*
homeassistant.components.remember_the_milk.*
homeassistant.components.remote.*
homeassistant.components.remote_calendar.*
homeassistant.components.renault.*
homeassistant.components.reolink.*
homeassistant.components.repairs.*

2
.vscode/tasks.json vendored
View File

@@ -4,7 +4,7 @@
{
"label": "Run Home Assistant Core",
"type": "shell",
"command": "hass -c ./config",
"command": "${command:python.interpreterPath} -m homeassistant -c ./config",
"group": "test",
"presentation": {
"reveal": "always",

14
CODEOWNERS generated
View File

@@ -216,6 +216,8 @@ build.json @home-assistant/supervisor
/tests/components/bmw_connected_drive/ @gerard33 @rikroe
/homeassistant/components/bond/ @bdraco @prystupa @joshs85 @marciogranzotto
/tests/components/bond/ @bdraco @prystupa @joshs85 @marciogranzotto
/homeassistant/components/bosch_alarm/ @mag1024 @sanjay900
/tests/components/bosch_alarm/ @mag1024 @sanjay900
/homeassistant/components/bosch_shc/ @tschamm
/tests/components/bosch_shc/ @tschamm
/homeassistant/components/braviatv/ @bieniu @Drafteed
@@ -570,8 +572,8 @@ build.json @home-assistant/supervisor
/tests/components/google_cloud/ @lufton @tronikos
/homeassistant/components/google_drive/ @tronikos
/tests/components/google_drive/ @tronikos
/homeassistant/components/google_generative_ai_conversation/ @tronikos
/tests/components/google_generative_ai_conversation/ @tronikos
/homeassistant/components/google_generative_ai_conversation/ @tronikos @ivanlh
/tests/components/google_generative_ai_conversation/ @tronikos @ivanlh
/homeassistant/components/google_mail/ @tkdrob
/tests/components/google_mail/ @tkdrob
/homeassistant/components/google_photos/ @allenporter
@@ -1183,6 +1185,8 @@ build.json @home-assistant/supervisor
/tests/components/prusalink/ @balloob
/homeassistant/components/ps4/ @ktnrg45
/tests/components/ps4/ @ktnrg45
/homeassistant/components/pterodactyl/ @elmurato
/tests/components/pterodactyl/ @elmurato
/homeassistant/components/pure_energie/ @klaasnicolaas
/tests/components/pure_energie/ @klaasnicolaas
/homeassistant/components/purpleair/ @bachya
@@ -1252,6 +1256,8 @@ build.json @home-assistant/supervisor
/tests/components/refoss/ @ashionky
/homeassistant/components/remote/ @home-assistant/core
/tests/components/remote/ @home-assistant/core
/homeassistant/components/remote_calendar/ @Thomas55555
/tests/components/remote_calendar/ @Thomas55555
/homeassistant/components/renault/ @epenet
/tests/components/renault/ @epenet
/homeassistant/components/renson/ @jimmyd-be
@@ -1529,8 +1535,8 @@ build.json @home-assistant/supervisor
/tests/components/tedee/ @patrickhilker @zweckj
/homeassistant/components/tellduslive/ @fredrike
/tests/components/tellduslive/ @fredrike
/homeassistant/components/template/ @PhracturedBlue @home-assistant/core
/tests/components/template/ @PhracturedBlue @home-assistant/core
/homeassistant/components/template/ @Petro31 @PhracturedBlue @home-assistant/core
/tests/components/template/ @Petro31 @PhracturedBlue @home-assistant/core
/homeassistant/components/tesla_fleet/ @Bre77
/tests/components/tesla_fleet/ @Bre77
/homeassistant/components/tesla_wall_connector/ @einarhauks

4
Dockerfile generated
View File

@@ -25,13 +25,13 @@ RUN \
"armv7") go2rtc_suffix='arm' ;; \
*) go2rtc_suffix=${BUILD_ARCH} ;; \
esac \
&& curl -L https://github.com/AlexxIT/go2rtc/releases/download/v1.9.8/go2rtc_linux_${go2rtc_suffix} --output /bin/go2rtc \
&& curl -L https://github.com/AlexxIT/go2rtc/releases/download/v1.9.9/go2rtc_linux_${go2rtc_suffix} --output /bin/go2rtc \
&& chmod +x /bin/go2rtc \
# Verify go2rtc can be executed
&& go2rtc --version
# Install uv
RUN pip3 install uv==0.6.1
RUN pip3 install uv==0.6.10
WORKDIR /usr/src

View File

@@ -19,4 +19,4 @@ labels:
org.opencontainers.image.authors: The Home Assistant Authors
org.opencontainers.image.url: https://www.home-assistant.io/
org.opencontainers.image.documentation: https://www.home-assistant.io/docs/
org.opencontainers.image.licenses: Apache License 2.0
org.opencontainers.image.licenses: Apache-2.0

View File

@@ -178,6 +178,15 @@ _BLOCKING_CALLS: tuple[BlockingCall, ...] = (
strict_core=False,
skip_for_tests=True,
),
BlockingCall(
original_func=SSLContext.set_default_verify_paths,
object=SSLContext,
function="set_default_verify_paths",
check_allowed=None,
strict=False,
strict_core=False,
skip_for_tests=True,
),
BlockingCall(
original_func=Path.open,
object=Path,

View File

@@ -81,6 +81,7 @@ from .helpers import (
entity,
entity_registry,
floor_registry,
frame,
issue_registry,
label_registry,
recorder,
@@ -92,6 +93,7 @@ from .helpers.dispatcher import async_dispatcher_send_internal
from .helpers.storage import get_internal_store_manager
from .helpers.system_info import async_get_system_info
from .helpers.typing import ConfigType
from .loader import Integration
from .setup import (
# _setup_started is marked as protected to make it clear
# that it is not part of the public API and should not be used
@@ -298,14 +300,6 @@ async def async_setup_hass(
return hass
async def stop_hass(hass: core.HomeAssistant) -> None:
"""Stop hass."""
# Ask integrations to shut down. It's messy but we can't
# do a clean stop without knowing what is broken
with contextlib.suppress(TimeoutError):
async with hass.timeout.async_timeout(10):
await hass.async_stop()
hass = await create_hass()
if runtime_config.skip_pip or runtime_config.skip_pip_packages:
@@ -344,7 +338,7 @@ async def async_setup_hass(
if config_dict is None:
recovery_mode = True
await stop_hass(hass)
await hass.async_stop(force=True)
hass = await create_hass()
elif not basic_setup_success:
@@ -352,7 +346,7 @@ async def async_setup_hass(
"Unable to set up core integrations. Activating recovery mode"
)
recovery_mode = True
await stop_hass(hass)
await hass.async_stop(force=True)
hass = await create_hass()
elif any(
@@ -367,7 +361,7 @@ async def async_setup_hass(
old_logging = hass.data.get(DATA_LOGGING)
recovery_mode = True
await stop_hass(hass)
await hass.async_stop(force=True)
hass = await create_hass()
if old_logging:
@@ -441,9 +435,10 @@ async def async_load_base_functionality(hass: core.HomeAssistant) -> None:
if DATA_REGISTRIES_LOADED in hass.data:
return
hass.data[DATA_REGISTRIES_LOADED] = None
translation.async_setup(hass)
entity.async_setup(hass)
frame.async_setup(hass)
template.async_setup(hass)
translation.async_setup(hass)
await asyncio.gather(
create_eager_task(get_internal_store_manager(hass).async_initialize()),
create_eager_task(area_registry.async_load(hass)),
@@ -664,11 +659,10 @@ def _create_log_file(
err_handler = _RotatingFileHandlerWithoutShouldRollOver(
err_log_path, backupCount=1
)
try:
err_handler.doRollover()
except OSError as err:
_LOGGER.error("Error rolling over log file: %s", err)
try:
err_handler.doRollover()
except OSError as err:
_LOGGER.error("Error rolling over log file: %s", err)
return err_handler
@@ -718,20 +712,25 @@ def _get_domains(hass: core.HomeAssistant, config: dict[str, Any]) -> set[str]:
return domains
async def _async_resolve_domains_to_setup(
async def _async_resolve_domains_and_preload(
hass: core.HomeAssistant, config: dict[str, Any]
) -> tuple[set[str], dict[str, loader.Integration]]:
"""Resolve all dependencies and return list of domains to set up."""
) -> tuple[dict[str, Integration], dict[str, Integration]]:
"""Resolve all dependencies and return integrations to set up.
The return value is a tuple of two dictionaries:
- The first dictionary contains integrations
specified by the configuration (including config entries).
- The second dictionary contains the same integrations as the first dictionary
together with all their dependencies.
"""
domains_to_setup = _get_domains(hass, config)
needed_requirements: set[str] = set()
platform_integrations = conf_util.extract_platform_integrations(
config, BASE_PLATFORMS
)
# Ensure base platforms that have platform integrations are added to
# to `domains_to_setup so they can be setup first instead of
# discovering them when later when a config entry setup task
# notices its needed and there is already a long line to use
# the import executor.
# Ensure base platforms that have platform integrations are added to `domains`,
# so they can be setup first instead of discovering them later when a config
# entry setup task notices that it's needed and there is already a long line
# to use the import executor.
#
# For example if we have
# sensor:
@@ -747,111 +746,78 @@ async def _async_resolve_domains_to_setup(
# so this will be less of a problem in the future.
domains_to_setup.update(platform_integrations)
# Load manifests for base platforms and platform based integrations
# that are defined under base platforms right away since we do not require
# the manifest to list them as dependencies and we want to avoid the lock
# contention when multiple integrations try to load them at once
additional_manifests_to_load = {
# Additionally process base platforms since we do not require the manifest
# to list them as dependencies.
# We want to later avoid lock contention when multiple integrations try to load
# their manifests at once.
# Also process integrations that are defined under base platforms
# to speed things up.
additional_domains_to_process = {
*BASE_PLATFORMS,
*chain.from_iterable(platform_integrations.values()),
}
translations_to_load = additional_manifests_to_load.copy()
# Resolve all dependencies so we know all integrations
# that will have to be loaded and start right-away
integration_cache: dict[str, loader.Integration] = {}
to_resolve: set[str] = domains_to_setup
while to_resolve or additional_manifests_to_load:
old_to_resolve: set[str] = to_resolve
to_resolve = set()
integrations_or_excs = await loader.async_get_integrations(
hass, {*domains_to_setup, *additional_domains_to_process}
)
# Eliminate those missing or with invalid manifest
integrations_to_process = {
domain: itg
for domain, itg in integrations_or_excs.items()
if isinstance(itg, Integration)
}
integrations_dependencies = await loader.resolve_integrations_dependencies(
hass, integrations_to_process.values()
)
# Eliminate those without valid dependencies
integrations_to_process = {
domain: integrations_to_process[domain] for domain in integrations_dependencies
}
if additional_manifests_to_load:
to_get = {*old_to_resolve, *additional_manifests_to_load}
additional_manifests_to_load.clear()
else:
to_get = old_to_resolve
integrations_to_setup = {
domain: itg
for domain, itg in integrations_to_process.items()
if domain in domains_to_setup
}
all_integrations_to_setup = integrations_to_setup.copy()
all_integrations_to_setup.update(
(dep, loader.async_get_loaded_integration(hass, dep))
for domain in integrations_to_setup
for dep in integrations_dependencies[domain].difference(
all_integrations_to_setup
)
)
manifest_deps: set[str] = set()
resolve_dependencies_tasks: list[asyncio.Task[bool]] = []
integrations_to_process: list[loader.Integration] = []
for domain, itg in (await loader.async_get_integrations(hass, to_get)).items():
if not isinstance(itg, loader.Integration):
continue
integration_cache[domain] = itg
needed_requirements.update(itg.requirements)
# Make sure manifests for dependencies are loaded in the next
# loop to try to group as many as manifest loads in a single
# call to avoid the creating one-off executor jobs later in
# the setup process
additional_manifests_to_load.update(
dep
for dep in chain(itg.dependencies, itg.after_dependencies)
if dep not in integration_cache
)
if domain not in old_to_resolve:
continue
integrations_to_process.append(itg)
manifest_deps.update(itg.dependencies)
manifest_deps.update(itg.after_dependencies)
if not itg.all_dependencies_resolved:
resolve_dependencies_tasks.append(
create_eager_task(
itg.resolve_dependencies(),
name=f"resolve dependencies {domain}",
loop=hass.loop,
)
)
if unseen_deps := manifest_deps - integration_cache.keys():
# If there are dependencies, try to preload all
# the integrations manifest at once and add them
# to the list of requirements we need to install
# so we can try to check if they are already installed
# in a single call below which avoids each integration
# having to wait for the lock to do it individually
deps = await loader.async_get_integrations(hass, unseen_deps)
for dependant_domain, dependant_itg in deps.items():
if isinstance(dependant_itg, loader.Integration):
integration_cache[dependant_domain] = dependant_itg
needed_requirements.update(dependant_itg.requirements)
if resolve_dependencies_tasks:
await asyncio.gather(*resolve_dependencies_tasks)
for itg in integrations_to_process:
try:
all_deps = itg.all_dependencies
except RuntimeError:
# Integration.all_dependencies raises RuntimeError if
# dependencies could not be resolved
continue
for dep in all_deps:
if dep in domains_to_setup:
continue
domains_to_setup.add(dep)
to_resolve.add(dep)
_LOGGER.info("Domains to be set up: %s", domains_to_setup)
# Gather requirements for all integrations,
# their dependencies and after dependencies.
# To gather all the requirements we must ignore exceptions here.
# The exceptions will be detected and handled later in the bootstrap process.
integrations_after_dependencies = (
await loader.resolve_integrations_after_dependencies(
hass, integrations_to_process.values(), ignore_exceptions=True
)
)
integrations_requirements = {
domain: itg.requirements for domain, itg in integrations_to_process.items()
}
integrations_requirements.update(
(dep, loader.async_get_loaded_integration(hass, dep).requirements)
for deps in integrations_after_dependencies.values()
for dep in deps.difference(integrations_requirements)
)
all_requirements = set(chain.from_iterable(integrations_requirements.values()))
# Optimistically check if requirements are already installed
# ahead of setting up the integrations so we can prime the cache
# We do not wait for this since its an optimization only
# We do not wait for this since it's an optimization only
hass.async_create_background_task(
requirements.async_load_installed_versions(hass, needed_requirements),
requirements.async_load_installed_versions(hass, all_requirements),
"check installed requirements",
eager_start=True,
)
#
# Only add the domains_to_setup after we finish resolving
# as new domains are likely to added in the process
#
translations_to_load.update(domains_to_setup)
# Start loading translations for all integrations we are going to set up
# in the background so they are ready when we need them. This avoids a
# lot of waiting for the translation load lock and a thundering herd of
@@ -862,6 +828,7 @@ async def _async_resolve_domains_to_setup(
# hold the translation load lock and if anything is fast enough to
# wait for the translation load lock, loading will be done by the
# time it gets to it.
translations_to_load = {*all_integrations_to_setup, *additional_domains_to_process}
hass.async_create_background_task(
translation.async_load_integrations(hass, translations_to_load),
"load translations",
@@ -873,13 +840,13 @@ async def _async_resolve_domains_to_setup(
# in the setup process.
hass.async_create_background_task(
get_internal_store_manager(hass).async_preload(
[*PRELOAD_STORAGE, *domains_to_setup]
[*PRELOAD_STORAGE, *all_integrations_to_setup]
),
"preload storage",
eager_start=True,
)
return domains_to_setup, integration_cache
return integrations_to_setup, all_integrations_to_setup
async def _async_set_up_integrations(
@@ -889,69 +856,84 @@ async def _async_set_up_integrations(
watcher = _WatchPendingSetups(hass, _setup_started(hass))
watcher.async_start()
domains_to_setup, integration_cache = await _async_resolve_domains_to_setup(
integrations, all_integrations = await _async_resolve_domains_and_preload(
hass, config
)
stage_2_domains = domains_to_setup.copy()
# Detect all cycles
integrations_after_dependencies = (
await loader.resolve_integrations_after_dependencies(
hass, all_integrations.values(), set(all_integrations)
)
)
all_domains = set(integrations_after_dependencies)
domains = set(integrations) & all_domains
_LOGGER.info(
"Domains to be set up: %s | %s",
domains,
all_domains - domains,
)
async_set_domains_to_be_loaded(hass, all_domains)
# Initialize recorder
if "recorder" in domains_to_setup:
if "recorder" in all_domains:
recorder.async_initialize_recorder(hass)
# Initialize backup
if "backup" in domains_to_setup:
if "backup" in all_domains:
backup.async_initialize_backup(hass)
stage_0_and_1_domains: list[tuple[str, set[str], int | None]] = [
stages: list[tuple[str, set[str], int | None]] = [
*(
(name, domain_group & domains_to_setup, timeout)
(name, domain_group, timeout)
for name, domain_group, timeout in STAGE_0_INTEGRATIONS
),
("stage 1", STAGE_1_INTEGRATIONS & domains_to_setup, STAGE_1_TIMEOUT),
("1", STAGE_1_INTEGRATIONS, STAGE_1_TIMEOUT),
("2", domains, STAGE_2_TIMEOUT),
]
_LOGGER.info("Setting up stage 0 and 1")
for name, domain_group, timeout in stage_0_and_1_domains:
if not domain_group:
_LOGGER.info("Setting up stage 0")
for name, domain_group, timeout in stages:
stage_domains_unfiltered = domain_group & all_domains
if not stage_domains_unfiltered:
_LOGGER.info("Nothing to set up in stage %s: %s", name, domain_group)
continue
_LOGGER.info("Setting up %s: %s", name, domain_group)
to_be_loaded = domain_group.copy()
to_be_loaded.update(
stage_domains = stage_domains_unfiltered - hass.config.components
if not stage_domains:
_LOGGER.info("Already set up stage %s: %s", name, stage_domains_unfiltered)
continue
stage_dep_domains_unfiltered = {
dep
for domain in domain_group
if (integration := integration_cache.get(domain)) is not None
for dep in integration.all_dependencies
for domain in stage_domains
for dep in integrations_after_dependencies[domain]
if dep not in stage_domains
}
stage_dep_domains = stage_dep_domains_unfiltered - hass.config.components
stage_all_domains = stage_domains | stage_dep_domains
_LOGGER.info(
"Setting up stage %s: %s | %s\nDependencies: %s | %s",
name,
stage_domains,
stage_domains_unfiltered - stage_domains,
stage_dep_domains,
stage_dep_domains_unfiltered - stage_dep_domains,
)
async_set_domains_to_be_loaded(hass, to_be_loaded)
stage_2_domains -= to_be_loaded
if timeout is None:
await _async_setup_multi_components(hass, domain_group, config)
else:
try:
async with hass.timeout.async_timeout(timeout, cool_down=COOLDOWN_TIME):
await _async_setup_multi_components(hass, domain_group, config)
except TimeoutError:
_LOGGER.warning(
"Setup timed out for %s waiting on %s - moving forward",
name,
hass._active_tasks, # noqa: SLF001
)
# Add after dependencies when setting up stage 2 domains
async_set_domains_to_be_loaded(hass, stage_2_domains)
if stage_2_domains:
_LOGGER.info("Setting up stage 2: %s", stage_2_domains)
await _async_setup_multi_components(hass, stage_all_domains, config)
continue
try:
async with hass.timeout.async_timeout(
STAGE_2_TIMEOUT, cool_down=COOLDOWN_TIME
):
await _async_setup_multi_components(hass, stage_2_domains, config)
async with hass.timeout.async_timeout(timeout, cool_down=COOLDOWN_TIME):
await _async_setup_multi_components(hass, stage_all_domains, config)
except TimeoutError:
_LOGGER.warning(
"Setup timed out for stage 2 waiting on %s - moving forward",
"Setup timed out for stage %s waiting on %s - moving forward",
name,
hass._active_tasks, # noqa: SLF001
)
@@ -1053,8 +1035,6 @@ async def _async_setup_multi_components(
config: dict[str, Any],
) -> None:
"""Set up multiple domains. Log on failure."""
# Avoid creating tasks for domains that were setup in a previous stage
domains_not_yet_setup = domains - hass.config.components
# Create setup tasks for base platforms first since everything will have
# to wait to be imported, and the sooner we can get the base platforms
# loaded the sooner we can start loading the rest of the integrations.
@@ -1064,9 +1044,7 @@ async def _async_setup_multi_components(
f"setup component {domain}",
eager_start=True,
)
for domain in sorted(
domains_not_yet_setup, key=SETUP_ORDER_SORT_KEY, reverse=True
)
for domain in sorted(domains, key=SETUP_ORDER_SORT_KEY, reverse=True)
}
results = await asyncio.gather(*futures.values(), return_exceptions=True)
for idx, domain in enumerate(futures):

View File

@@ -1,5 +1,6 @@
{
"domain": "motionblinds",
"name": "Motionblinds",
"integrations": ["motion_blinds", "motionblinds_ble"]
"integrations": ["motion_blinds", "motionblinds_ble"],
"iot_standards": ["matter"]
}

View File

@@ -24,7 +24,7 @@ from homeassistant.components.weather import (
API_METRIC: Final = "Metric"
ATTRIBUTION: Final = "Data provided by AccuWeather"
ATTR_CATEGORY: Final = "Category"
ATTR_CATEGORY_VALUE = "CategoryValue"
ATTR_DIRECTION: Final = "Direction"
ATTR_ENGLISH: Final = "English"
ATTR_LEVEL: Final = "level"
@@ -55,5 +55,18 @@ CONDITION_MAP = {
for cond_ha, cond_codes in CONDITION_CLASSES.items()
for cond_code in cond_codes
}
AIR_QUALITY_CATEGORY_MAP = {
1: "good",
2: "moderate",
3: "unhealthy",
4: "very_unhealthy",
5: "hazardous",
}
POLLEN_CATEGORY_MAP = {
1: "low",
2: "moderate",
3: "high",
4: "very_high",
}
UPDATE_INTERVAL_OBSERVATION = timedelta(minutes=40)
UPDATE_INTERVAL_DAILY_FORECAST = timedelta(hours=6)

View File

@@ -75,7 +75,11 @@ class AccuWeatherObservationDataUpdateCoordinator(
async with timeout(10):
result = await self.accuweather.async_get_current_conditions()
except EXCEPTIONS as error:
raise UpdateFailed(error) from error
raise UpdateFailed(
translation_domain=DOMAIN,
translation_key="current_conditions_update_error",
translation_placeholders={"error": repr(error)},
) from error
_LOGGER.debug("Requests remaining: %d", self.accuweather.requests_remaining)
@@ -117,9 +121,15 @@ class AccuWeatherDailyForecastDataUpdateCoordinator(
"""Update data via library."""
try:
async with timeout(10):
result = await self.accuweather.async_get_daily_forecast()
result = await self.accuweather.async_get_daily_forecast(
language=self.hass.config.language
)
except EXCEPTIONS as error:
raise UpdateFailed(error) from error
raise UpdateFailed(
translation_domain=DOMAIN,
translation_key="forecast_update_error",
translation_placeholders={"error": repr(error)},
) from error
_LOGGER.debug("Requests remaining: %d", self.accuweather.requests_remaining)

View File

@@ -7,6 +7,6 @@
"integration_type": "service",
"iot_class": "cloud_polling",
"loggers": ["accuweather"],
"requirements": ["accuweather==4.1.0"],
"requirements": ["accuweather==4.2.0"],
"single_config_entry": true
}

View File

@@ -29,8 +29,9 @@ from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import (
AIR_QUALITY_CATEGORY_MAP,
API_METRIC,
ATTR_CATEGORY,
ATTR_CATEGORY_VALUE,
ATTR_DIRECTION,
ATTR_ENGLISH,
ATTR_LEVEL,
@@ -38,6 +39,7 @@ from .const import (
ATTR_VALUE,
ATTRIBUTION,
MAX_FORECAST_DAYS,
POLLEN_CATEGORY_MAP,
)
from .coordinator import (
AccuWeatherConfigEntry,
@@ -59,9 +61,9 @@ class AccuWeatherSensorDescription(SensorEntityDescription):
FORECAST_SENSOR_TYPES: tuple[AccuWeatherSensorDescription, ...] = (
AccuWeatherSensorDescription(
key="AirQuality",
value_fn=lambda data: cast(str, data[ATTR_CATEGORY]),
value_fn=lambda data: AIR_QUALITY_CATEGORY_MAP[data[ATTR_CATEGORY_VALUE]],
device_class=SensorDeviceClass.ENUM,
options=["good", "hazardous", "high", "low", "moderate", "unhealthy"],
options=list(AIR_QUALITY_CATEGORY_MAP.values()),
translation_key="air_quality",
),
AccuWeatherSensorDescription(
@@ -83,7 +85,9 @@ FORECAST_SENSOR_TYPES: tuple[AccuWeatherSensorDescription, ...] = (
entity_registry_enabled_default=False,
native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER,
value_fn=lambda data: cast(int, data[ATTR_VALUE]),
attr_fn=lambda data: {ATTR_LEVEL: data[ATTR_CATEGORY]},
attr_fn=lambda data: {
ATTR_LEVEL: POLLEN_CATEGORY_MAP[data[ATTR_CATEGORY_VALUE]]
},
translation_key="grass_pollen",
),
AccuWeatherSensorDescription(
@@ -107,7 +111,9 @@ FORECAST_SENSOR_TYPES: tuple[AccuWeatherSensorDescription, ...] = (
entity_registry_enabled_default=False,
native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER,
value_fn=lambda data: cast(int, data[ATTR_VALUE]),
attr_fn=lambda data: {ATTR_LEVEL: data[ATTR_CATEGORY]},
attr_fn=lambda data: {
ATTR_LEVEL: POLLEN_CATEGORY_MAP[data[ATTR_CATEGORY_VALUE]]
},
translation_key="mold_pollen",
),
AccuWeatherSensorDescription(
@@ -115,7 +121,9 @@ FORECAST_SENSOR_TYPES: tuple[AccuWeatherSensorDescription, ...] = (
native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER,
entity_registry_enabled_default=False,
value_fn=lambda data: cast(int, data[ATTR_VALUE]),
attr_fn=lambda data: {ATTR_LEVEL: data[ATTR_CATEGORY]},
attr_fn=lambda data: {
ATTR_LEVEL: POLLEN_CATEGORY_MAP[data[ATTR_CATEGORY_VALUE]]
},
translation_key="ragweed_pollen",
),
AccuWeatherSensorDescription(
@@ -181,14 +189,18 @@ FORECAST_SENSOR_TYPES: tuple[AccuWeatherSensorDescription, ...] = (
native_unit_of_measurement=CONCENTRATION_PARTS_PER_CUBIC_METER,
entity_registry_enabled_default=False,
value_fn=lambda data: cast(int, data[ATTR_VALUE]),
attr_fn=lambda data: {ATTR_LEVEL: data[ATTR_CATEGORY]},
attr_fn=lambda data: {
ATTR_LEVEL: POLLEN_CATEGORY_MAP[data[ATTR_CATEGORY_VALUE]]
},
translation_key="tree_pollen",
),
AccuWeatherSensorDescription(
key="UVIndex",
native_unit_of_measurement=UV_INDEX,
value_fn=lambda data: cast(int, data[ATTR_VALUE]),
attr_fn=lambda data: {ATTR_LEVEL: data[ATTR_CATEGORY]},
attr_fn=lambda data: {
ATTR_LEVEL: POLLEN_CATEGORY_MAP[data[ATTR_CATEGORY_VALUE]]
},
translation_key="uv_index_forecast",
),
AccuWeatherSensorDescription(

View File

@@ -26,10 +26,20 @@
"state": {
"good": "Good",
"hazardous": "Hazardous",
"high": "High",
"low": "Low",
"moderate": "Moderate",
"unhealthy": "Unhealthy"
"unhealthy": "Unhealthy",
"very_unhealthy": "Very unhealthy"
},
"state_attributes": {
"options": {
"state": {
"good": "[%key:component::accuweather::entity::sensor::air_quality::state::good%]",
"hazardous": "[%key:component::accuweather::entity::sensor::air_quality::state::hazardous%]",
"moderate": "[%key:component::accuweather::entity::sensor::air_quality::state::moderate%]",
"unhealthy": "[%key:component::accuweather::entity::sensor::air_quality::state::unhealthy%]",
"very_unhealthy": "[%key:component::accuweather::entity::sensor::air_quality::state::very_unhealthy%]"
}
}
}
},
"apparent_temperature": {
@@ -62,12 +72,10 @@
"level": {
"name": "Level",
"state": {
"good": "[%key:component::accuweather::entity::sensor::air_quality::state::good%]",
"hazardous": "[%key:component::accuweather::entity::sensor::air_quality::state::hazardous%]",
"high": "[%key:component::accuweather::entity::sensor::air_quality::state::high%]",
"low": "[%key:component::accuweather::entity::sensor::air_quality::state::low%]",
"moderate": "[%key:component::accuweather::entity::sensor::air_quality::state::moderate%]",
"unhealthy": "[%key:component::accuweather::entity::sensor::air_quality::state::unhealthy%]"
"high": "High",
"low": "Low",
"moderate": "Moderate",
"very_high": "Very high"
}
}
}
@@ -81,12 +89,10 @@
"level": {
"name": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::name%]",
"state": {
"good": "[%key:component::accuweather::entity::sensor::air_quality::state::good%]",
"hazardous": "[%key:component::accuweather::entity::sensor::air_quality::state::hazardous%]",
"high": "[%key:component::accuweather::entity::sensor::air_quality::state::high%]",
"low": "[%key:component::accuweather::entity::sensor::air_quality::state::low%]",
"moderate": "[%key:component::accuweather::entity::sensor::air_quality::state::moderate%]",
"unhealthy": "[%key:component::accuweather::entity::sensor::air_quality::state::unhealthy%]"
"high": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::high%]",
"low": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::low%]",
"moderate": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::moderate%]",
"very_high": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::very_high%]"
}
}
}
@@ -100,6 +106,15 @@
"steady": "Steady",
"rising": "Rising",
"falling": "Falling"
},
"state_attributes": {
"options": {
"state": {
"falling": "[%key:component::accuweather::entity::sensor::pressure_tendency::state::falling%]",
"rising": "[%key:component::accuweather::entity::sensor::pressure_tendency::state::rising%]",
"steady": "[%key:component::accuweather::entity::sensor::pressure_tendency::state::steady%]"
}
}
}
},
"ragweed_pollen": {
@@ -108,12 +123,10 @@
"level": {
"name": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::name%]",
"state": {
"good": "[%key:component::accuweather::entity::sensor::air_quality::state::good%]",
"hazardous": "[%key:component::accuweather::entity::sensor::air_quality::state::hazardous%]",
"high": "[%key:component::accuweather::entity::sensor::air_quality::state::high%]",
"low": "[%key:component::accuweather::entity::sensor::air_quality::state::low%]",
"moderate": "[%key:component::accuweather::entity::sensor::air_quality::state::moderate%]",
"unhealthy": "[%key:component::accuweather::entity::sensor::air_quality::state::unhealthy%]"
"high": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::high%]",
"low": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::low%]",
"moderate": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::moderate%]",
"very_high": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::very_high%]"
}
}
}
@@ -154,12 +167,10 @@
"level": {
"name": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::name%]",
"state": {
"good": "[%key:component::accuweather::entity::sensor::air_quality::state::good%]",
"hazardous": "[%key:component::accuweather::entity::sensor::air_quality::state::hazardous%]",
"high": "[%key:component::accuweather::entity::sensor::air_quality::state::high%]",
"low": "[%key:component::accuweather::entity::sensor::air_quality::state::low%]",
"moderate": "[%key:component::accuweather::entity::sensor::air_quality::state::moderate%]",
"unhealthy": "[%key:component::accuweather::entity::sensor::air_quality::state::unhealthy%]"
"high": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::high%]",
"low": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::low%]",
"moderate": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::moderate%]",
"very_high": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::very_high%]"
}
}
}
@@ -170,12 +181,10 @@
"level": {
"name": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::name%]",
"state": {
"good": "[%key:component::accuweather::entity::sensor::air_quality::state::good%]",
"hazardous": "[%key:component::accuweather::entity::sensor::air_quality::state::hazardous%]",
"high": "[%key:component::accuweather::entity::sensor::air_quality::state::high%]",
"low": "[%key:component::accuweather::entity::sensor::air_quality::state::low%]",
"moderate": "[%key:component::accuweather::entity::sensor::air_quality::state::moderate%]",
"unhealthy": "[%key:component::accuweather::entity::sensor::air_quality::state::unhealthy%]"
"high": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::high%]",
"low": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::low%]",
"moderate": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::moderate%]",
"very_high": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::very_high%]"
}
}
}
@@ -186,12 +195,10 @@
"level": {
"name": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::name%]",
"state": {
"good": "[%key:component::accuweather::entity::sensor::air_quality::state::good%]",
"hazardous": "[%key:component::accuweather::entity::sensor::air_quality::state::hazardous%]",
"high": "[%key:component::accuweather::entity::sensor::air_quality::state::high%]",
"low": "[%key:component::accuweather::entity::sensor::air_quality::state::low%]",
"moderate": "[%key:component::accuweather::entity::sensor::air_quality::state::moderate%]",
"unhealthy": "[%key:component::accuweather::entity::sensor::air_quality::state::unhealthy%]"
"high": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::high%]",
"low": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::low%]",
"moderate": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::moderate%]",
"very_high": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::state::very_high%]"
}
}
}
@@ -222,6 +229,14 @@
}
}
},
"exceptions": {
"current_conditions_update_error": {
"message": "An error occurred while retrieving weather current conditions data from the AccuWeather API: {error}"
},
"forecast_update_error": {
"message": "An error occurred while retrieving weather forecast data from the AccuWeather API: {error}"
}
},
"system_health": {
"info": {
"can_reach_server": "Reach AccuWeather server",

View File

@@ -5,14 +5,14 @@
"data": {
"connection_type": "Select connection type"
},
"description": "Select connection type. Local requires heaters with bluetooth"
"description": "Select connection type. Local requires heaters with Bluetooth"
},
"local": {
"data": {
"wifi_ssid": "Wi-Fi SSID",
"wifi_pswd": "Wi-Fi Password"
"wifi_pswd": "Wi-Fi password"
},
"description": "Reset the heater by pressing + and OK until display shows 'Reset'. Then press and hold OK button on the heater until the blue led starts blinking before pressing Submit. Configuring heater might take some minutes."
"description": "Reset the heater by pressing + and OK until display shows 'Reset'. Then press and hold OK button on the heater until the blue LED starts blinking before pressing Submit. Configuring heater might take some minutes."
},
"cloud": {
"data": {

View File

@@ -2,6 +2,7 @@
from __future__ import annotations
from decimal import Decimal
import logging
from typing import Any
@@ -14,6 +15,7 @@ from homeassistant.components.climate import (
FAN_MEDIUM,
ClimateEntity,
ClimateEntityFeature,
HVACAction,
HVACMode,
)
from homeassistant.const import ATTR_TEMPERATURE, PRECISION_WHOLE, UnitOfTemperature
@@ -49,6 +51,14 @@ ADVANTAGE_AIR_MYTEMP_ENABLED = "climateControlModeEnabled"
ADVANTAGE_AIR_HEAT_TARGET = "myAutoHeatTargetTemp"
ADVANTAGE_AIR_COOL_TARGET = "myAutoCoolTargetTemp"
ADVANTAGE_AIR_MYFAN = "autoAA"
ADVANTAGE_AIR_MYAUTO_MODE_SET = "myAutoModeCurrentSetMode"
HVAC_ACTIONS = {
"cool": HVACAction.COOLING,
"heat": HVACAction.HEATING,
"vent": HVACAction.FAN,
"dry": HVACAction.DRYING,
}
HVAC_MODES = [
HVACMode.OFF,
@@ -175,6 +185,17 @@ class AdvantageAirAC(AdvantageAirAcEntity, ClimateEntity):
return ADVANTAGE_AIR_HVAC_MODES.get(self._ac["mode"])
return HVACMode.OFF
@property
def hvac_action(self) -> HVACAction | None:
"""Return the current running HVAC action."""
if self._ac["state"] == ADVANTAGE_AIR_STATE_OFF:
return HVACAction.OFF
if self._ac["mode"] == "myauto":
return HVAC_ACTIONS.get(
self._ac.get(ADVANTAGE_AIR_MYAUTO_MODE_SET, HVACAction.OFF)
)
return HVAC_ACTIONS.get(self._ac["mode"])
@property
def fan_mode(self) -> str | None:
"""Return the current fan modes."""
@@ -273,6 +294,22 @@ class AdvantageAirZone(AdvantageAirZoneEntity, ClimateEntity):
return HVACMode.HEAT_COOL
return HVACMode.OFF
@property
def hvac_action(self) -> HVACAction | None:
"""Return the HVAC action, inheriting from master AC if zone is open but idle if air is <= 5%."""
if self._ac["state"] == ADVANTAGE_AIR_STATE_OFF:
return HVACAction.OFF
master_action = HVAC_ACTIONS.get(self._ac["mode"], HVACAction.OFF)
if self._ac["mode"] == "myauto":
master_action = HVAC_ACTIONS.get(
str(self._ac.get(ADVANTAGE_AIR_MYAUTO_MODE_SET)), HVACAction.OFF
)
if self._zone["state"] == ADVANTAGE_AIR_STATE_OPEN:
if self._zone["value"] <= Decimal(5):
return HVACAction.IDLE
return master_action
return HVACAction.OFF
@property
def current_temperature(self) -> float | None:
"""Return the current temperature."""

View File

@@ -7,3 +7,4 @@ ADVANTAGE_AIR_STATE_CLOSE = "close"
ADVANTAGE_AIR_STATE_ON = "on"
ADVANTAGE_AIR_STATE_OFF = "off"
ADVANTAGE_AIR_AUTOFAN_ENABLED = "aaAutoFanModeEnabled"
ADVANTAGE_AIR_NIGHT_MODE_ENABLED = "quietNightModeEnabled"

View File

@@ -41,7 +41,7 @@ async def async_setup_entry(
entities.append(
AdvantageAirThingCover(instance, thing, CoverDeviceClass.BLIND)
)
elif thing["channelDipState"] == 3: # 3 = "Garage door"
elif thing["channelDipState"] in [3, 10]: # 3 & 10 = "Garage door"
entities.append(
AdvantageAirThingCover(instance, thing, CoverDeviceClass.GARAGE)
)

View File

@@ -9,6 +9,7 @@ from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import AdvantageAirDataConfigEntry
from .const import (
ADVANTAGE_AIR_AUTOFAN_ENABLED,
ADVANTAGE_AIR_NIGHT_MODE_ENABLED,
ADVANTAGE_AIR_STATE_OFF,
ADVANTAGE_AIR_STATE_ON,
)
@@ -32,6 +33,8 @@ async def async_setup_entry(
entities.append(AdvantageAirFreshAir(instance, ac_key))
if ADVANTAGE_AIR_AUTOFAN_ENABLED in ac_device["info"]:
entities.append(AdvantageAirMyFan(instance, ac_key))
if ADVANTAGE_AIR_NIGHT_MODE_ENABLED in ac_device["info"]:
entities.append(AdvantageAirNightMode(instance, ac_key))
if things := instance.coordinator.data.get("myThings"):
entities.extend(
AdvantageAirRelay(instance, thing)
@@ -93,6 +96,32 @@ class AdvantageAirMyFan(AdvantageAirAcEntity, SwitchEntity):
await self.async_update_ac({ADVANTAGE_AIR_AUTOFAN_ENABLED: False})
class AdvantageAirNightMode(AdvantageAirAcEntity, SwitchEntity):
"""Representation of Advantage 'MySleep$aver' Mode control."""
_attr_icon = "mdi:weather-night"
_attr_name = "MySleep$aver"
_attr_device_class = SwitchDeviceClass.SWITCH
def __init__(self, instance: AdvantageAirData, ac_key: str) -> None:
"""Initialize an Advantage Air Night Mode control."""
super().__init__(instance, ac_key)
self._attr_unique_id += "-nightmode"
@property
def is_on(self) -> bool:
"""Return the Night Mode status."""
return self._ac[ADVANTAGE_AIR_NIGHT_MODE_ENABLED]
async def async_turn_on(self, **kwargs: Any) -> None:
"""Turn Night Mode on."""
await self.async_update_ac({ADVANTAGE_AIR_NIGHT_MODE_ENABLED: True})
async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn Night Mode off."""
await self.async_update_ac({ADVANTAGE_AIR_NIGHT_MODE_ENABLED: False})
class AdvantageAirRelay(AdvantageAirThingEntity, SwitchEntity):
"""Representation of Advantage Air Thing."""

View File

@@ -51,7 +51,7 @@
"issues": {
"deprecated_yaml_import_issue_cannot_connect": {
"title": "The {integration_title} YAML configuration import failed",
"description": "Configuring {integration_title} using YAML is being removed but there was an connection error importing your YAML configuration.\n\nEnsure connection to {integration_title} works and restart Home Assistant to try again or remove the {integration_title} YAML configuration from your configuration.yaml file and continue to [set up the integration]({url}) manually."
"description": "Configuring {integration_title} using YAML is being removed but there was a connection error importing your YAML configuration.\n\nEnsure connection to {integration_title} works and restart Home Assistant to try again or remove the {integration_title} YAML configuration from your configuration.yaml file and continue to [set up the integration]({url}) manually."
}
}
}

View File

@@ -11,7 +11,7 @@
}
},
"discovery_confirm": {
"description": "Do you want to setup {model}?"
"description": "Do you want to set up {model}?"
}
},
"abort": {

View File

@@ -105,7 +105,14 @@ class AirlyDataUpdateCoordinator(DataUpdateCoordinator[dict[str, str | float | i
try:
await measurements.update()
except (AirlyError, ClientConnectorError) as error:
raise UpdateFailed(error) from error
raise UpdateFailed(
translation_domain=DOMAIN,
translation_key="update_error",
translation_placeholders={
"entry": self.config_entry.title,
"error": repr(error),
},
) from error
_LOGGER.debug(
"Requests remaining: %s/%s",
@@ -126,7 +133,11 @@ class AirlyDataUpdateCoordinator(DataUpdateCoordinator[dict[str, str | float | i
standards = measurements.current["standards"]
if index["description"] == NO_AIRLY_SENSORS:
raise UpdateFailed("Can't retrieve data: no Airly sensors in this area")
raise UpdateFailed(
translation_domain=DOMAIN,
translation_key="no_station",
translation_placeholders={"entry": self.config_entry.title},
)
for value in values:
data[value["name"]] = value["value"]
for standard in standards:

View File

@@ -36,5 +36,13 @@
"name": "[%key:component::sensor::entity_component::carbon_monoxide::name%]"
}
}
},
"exceptions": {
"update_error": {
"message": "An error occurred while retrieving data from the Airly API for {entry}: {error}"
},
"no_station": {
"message": "An error occurred while retrieving data from the Airly API for {entry}: no measuring stations in this area"
}
}
}

View File

@@ -7,7 +7,7 @@
"api_key": "[%key:common::config_flow::data::api_key%]",
"latitude": "[%key:common::config_flow::data::latitude%]",
"longitude": "[%key:common::config_flow::data::longitude%]",
"radius": "Station Radius (miles; optional)"
"radius": "Station radius (miles; optional)"
}
}
},
@@ -25,7 +25,7 @@
"step": {
"init": {
"data": {
"radius": "Station Radius (miles)"
"radius": "Station radius (miles)"
}
}
}

View File

@@ -91,7 +91,7 @@
"name": "Hydrogen fluoride"
},
"health_index": {
"name": "Health Index"
"name": "Health index"
},
"absolute_humidity": {
"name": "Absolute humidity"
@@ -112,10 +112,10 @@
"name": "Oxygen"
},
"performance_index": {
"name": "Performance Index"
"name": "Performance index"
},
"hydrogen_phosphide": {
"name": "Hydrogen Phosphide"
"name": "Hydrogen phosphide"
},
"relative_pressure": {
"name": "Relative pressure"
@@ -127,22 +127,22 @@
"name": "Refrigerant"
},
"silicon_hydride": {
"name": "Silicon Hydride"
"name": "Silicon hydride"
},
"noise": {
"name": "Noise"
},
"maximum_noise": {
"name": "Noise (Maximum)"
"name": "Noise (maximum)"
},
"radon": {
"name": "Radon"
},
"industrial_volatile_organic_compounds": {
"name": "VOCs (Industrial)"
"name": "VOCs (industrial)"
},
"virus_index": {
"name": "Virus Index"
"name": "Virus index"
}
}
}

View File

@@ -102,7 +102,8 @@ class AirthingsConfigFlow(ConfigFlow, domain=DOMAIN):
device = await self._get_device_data(discovery_info)
except AirthingsDeviceUpdateError:
return self.async_abort(reason="cannot_connect")
except Exception: # noqa: BLE001
except Exception:
_LOGGER.exception("Unknown error occurred")
return self.async_abort(reason="unknown")
name = get_name(device)
@@ -160,7 +161,8 @@ class AirthingsConfigFlow(ConfigFlow, domain=DOMAIN):
device = await self._get_device_data(discovery_info)
except AirthingsDeviceUpdateError:
return self.async_abort(reason="cannot_connect")
except Exception: # noqa: BLE001
except Exception:
_LOGGER.exception("Unknown error occurred")
return self.async_abort(reason="unknown")
name = get_name(device)
self._discovered_devices[address] = Discovery(name, discovery_info, device)

View File

@@ -32,7 +32,8 @@ class AirTouch5ConfigFlow(ConfigFlow, domain=DOMAIN):
client = Airtouch5SimpleClient(user_input[CONF_HOST])
try:
await client.test_connection()
except Exception: # noqa: BLE001
except Exception:
_LOGGER.exception("Unexpected exception")
errors = {"base": "cannot_connect"}
else:
await self.async_set_unique_id(user_input[CONF_HOST])

View File

@@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/airzone_cloud",
"iot_class": "cloud_push",
"loggers": ["aioairzone_cloud"],
"requirements": ["aioairzone-cloud==0.6.10"]
"requirements": ["aioairzone-cloud==0.6.11"]
}

View File

@@ -1438,7 +1438,7 @@ class AlexaModeController(AlexaCapability):
# Fan preset_mode
if self.instance == f"{fan.DOMAIN}.{fan.ATTR_PRESET_MODE}":
mode = self.entity.attributes.get(fan.ATTR_PRESET_MODE, None)
if mode in self.entity.attributes.get(fan.ATTR_PRESET_MODES, None):
if mode in self.entity.attributes.get(fan.ATTR_PRESET_MODES, ()):
return f"{fan.ATTR_PRESET_MODE}.{mode}"
# Humidifier mode

View File

@@ -240,6 +240,7 @@ SENSOR_DESCRIPTIONS = (
suggested_display_precision=0,
entity_registry_enabled_default=False,
device_class=SensorDeviceClass.WIND_DIRECTION,
state_class=SensorStateClass.MEASUREMENT_ANGLE,
),
SensorEntityDescription(
key=TYPE_WINDGUSTMPH,

View File

@@ -609,6 +609,7 @@ SENSOR_DESCRIPTIONS = (
translation_key="wind_direction",
native_unit_of_measurement=DEGREE,
device_class=SensorDeviceClass.WIND_DIRECTION,
state_class=SensorStateClass.MEASUREMENT_ANGLE,
),
SensorEntityDescription(
key=TYPE_WINDDIR_AVG10M,

View File

@@ -8,7 +8,7 @@ from python_homeassistant_analytics import (
HomeassistantAnalyticsClient,
HomeassistantAnalyticsConnectionError,
)
from python_homeassistant_analytics.models import IntegrationType
from python_homeassistant_analytics.models import Environment, IntegrationType
import voluptuous as vol
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow
@@ -81,7 +81,7 @@ class HomeassistantAnalyticsConfigFlow(ConfigFlow, domain=DOMAIN):
)
try:
addons = await client.get_addons()
integrations = await client.get_integrations()
integrations = await client.get_integrations(Environment.NEXT)
custom_integrations = await client.get_custom_integrations()
except HomeassistantAnalyticsConnectionError:
LOGGER.exception("Error connecting to Home Assistant analytics")
@@ -165,7 +165,7 @@ class HomeassistantAnalyticsOptionsFlowHandler(OptionsFlow):
)
try:
addons = await client.get_addons()
integrations = await client.get_integrations()
integrations = await client.get_integrations(Environment.NEXT)
custom_integrations = await client.get_custom_integrations()
except HomeassistantAnalyticsConnectionError:
LOGGER.exception("Error connecting to Home Assistant analytics")

View File

@@ -7,6 +7,6 @@
"integration_type": "device",
"iot_class": "local_push",
"loggers": ["androidtvremote2"],
"requirements": ["androidtvremote2==0.2.0"],
"requirements": ["androidtvremote2==0.2.1"],
"zeroconf": ["_androidtvremote2._tcp.local."]
}

View File

@@ -2,6 +2,8 @@
from __future__ import annotations
import logging
from anova_wifi import AnovaApi, InvalidLogin
import voluptuous as vol
@@ -11,8 +13,10 @@ from homeassistant.helpers.aiohttp_client import async_get_clientsession
from .const import DOMAIN
_LOGGER = logging.getLogger(__name__)
class AnovaConfligFlow(ConfigFlow, domain=DOMAIN):
class AnovaConfigFlow(ConfigFlow, domain=DOMAIN):
"""Sets up a config flow for Anova."""
VERSION = 1
@@ -35,7 +39,8 @@ class AnovaConfligFlow(ConfigFlow, domain=DOMAIN):
await api.authenticate()
except InvalidLogin:
errors["base"] = "invalid_auth"
except Exception: # noqa: BLE001
except Exception:
_LOGGER.exception("Unexpected exception")
errors["base"] = "unknown"
else:
return self.async_create_entry(

View File

@@ -22,6 +22,7 @@ from . import AnthemavConfigEntry
from .const import ANTHEMAV_UPDATE_SIGNAL, DOMAIN, MANUFACTURER
_LOGGER = logging.getLogger(__name__)
VOLUME_STEP = 0.01
async def async_setup_entry(
@@ -60,6 +61,7 @@ class AnthemAVR(MediaPlayerEntity):
| MediaPlayerEntityFeature.TURN_OFF
| MediaPlayerEntityFeature.SELECT_SOURCE
)
_attr_volume_step = VOLUME_STEP
def __init__(
self,

View File

@@ -34,10 +34,12 @@ from .const import (
CONF_PROMPT,
CONF_RECOMMENDED,
CONF_TEMPERATURE,
CONF_THINKING_BUDGET,
DOMAIN,
RECOMMENDED_CHAT_MODEL,
RECOMMENDED_MAX_TOKENS,
RECOMMENDED_TEMPERATURE,
RECOMMENDED_THINKING_BUDGET,
)
_LOGGER = logging.getLogger(__name__)
@@ -128,21 +130,29 @@ class AnthropicOptionsFlow(OptionsFlow):
) -> ConfigFlowResult:
"""Manage the options."""
options: dict[str, Any] | MappingProxyType[str, Any] = self.config_entry.options
errors: dict[str, str] = {}
if user_input is not None:
if user_input[CONF_RECOMMENDED] == self.last_rendered_recommended:
if user_input[CONF_LLM_HASS_API] == "none":
user_input.pop(CONF_LLM_HASS_API)
return self.async_create_entry(title="", data=user_input)
# Re-render the options again, now with the recommended options shown/hidden
self.last_rendered_recommended = user_input[CONF_RECOMMENDED]
if user_input.get(
CONF_THINKING_BUDGET, RECOMMENDED_THINKING_BUDGET
) >= user_input.get(CONF_MAX_TOKENS, RECOMMENDED_MAX_TOKENS):
errors[CONF_THINKING_BUDGET] = "thinking_budget_too_large"
options = {
CONF_RECOMMENDED: user_input[CONF_RECOMMENDED],
CONF_PROMPT: user_input[CONF_PROMPT],
CONF_LLM_HASS_API: user_input[CONF_LLM_HASS_API],
}
if not errors:
return self.async_create_entry(title="", data=user_input)
else:
# Re-render the options again, now with the recommended options shown/hidden
self.last_rendered_recommended = user_input[CONF_RECOMMENDED]
options = {
CONF_RECOMMENDED: user_input[CONF_RECOMMENDED],
CONF_PROMPT: user_input[CONF_PROMPT],
CONF_LLM_HASS_API: user_input[CONF_LLM_HASS_API],
}
suggested_values = options.copy()
if not suggested_values.get(CONF_PROMPT):
@@ -156,6 +166,7 @@ class AnthropicOptionsFlow(OptionsFlow):
return self.async_show_form(
step_id="init",
data_schema=schema,
errors=errors or None,
)
@@ -205,6 +216,10 @@ def anthropic_config_option_schema(
CONF_TEMPERATURE,
default=RECOMMENDED_TEMPERATURE,
): NumberSelector(NumberSelectorConfig(min=0, max=1, step=0.05)),
vol.Optional(
CONF_THINKING_BUDGET,
default=RECOMMENDED_THINKING_BUDGET,
): int,
}
)
return schema

View File

@@ -13,3 +13,8 @@ CONF_MAX_TOKENS = "max_tokens"
RECOMMENDED_MAX_TOKENS = 1024
CONF_TEMPERATURE = "temperature"
RECOMMENDED_TEMPERATURE = 1.0
CONF_THINKING_BUDGET = "thinking_budget"
RECOMMENDED_THINKING_BUDGET = 0
MIN_THINKING_BUDGET = 1024
THINKING_MODELS = ["claude-3-7-sonnet-20250219", "claude-3-7-sonnet-latest"]

View File

@@ -1,23 +1,32 @@
"""Conversation support for Anthropic."""
from collections.abc import AsyncGenerator, Callable
from collections.abc import AsyncGenerator, Callable, Iterable
import json
from typing import Any, Literal
from typing import Any, Literal, cast
import anthropic
from anthropic import AsyncStream
from anthropic._types import NOT_GIVEN
from anthropic.types import (
InputJSONDelta,
Message,
MessageParam,
MessageStreamEvent,
RawContentBlockDeltaEvent,
RawContentBlockStartEvent,
RawContentBlockStopEvent,
RawMessageStartEvent,
RawMessageStopEvent,
RedactedThinkingBlock,
RedactedThinkingBlockParam,
SignatureDelta,
TextBlock,
TextBlockParam,
TextDelta,
ThinkingBlock,
ThinkingBlockParam,
ThinkingConfigDisabledParam,
ThinkingConfigEnabledParam,
ThinkingDelta,
ToolParam,
ToolResultBlockParam,
ToolUseBlock,
@@ -30,7 +39,7 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_LLM_HASS_API, MATCH_ALL
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import chat_session, device_registry as dr, intent, llm
from homeassistant.helpers import device_registry as dr, intent, llm
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import AnthropicConfigEntry
@@ -39,11 +48,15 @@ from .const import (
CONF_MAX_TOKENS,
CONF_PROMPT,
CONF_TEMPERATURE,
CONF_THINKING_BUDGET,
DOMAIN,
LOGGER,
MIN_THINKING_BUDGET,
RECOMMENDED_CHAT_MODEL,
RECOMMENDED_MAX_TOKENS,
RECOMMENDED_TEMPERATURE,
RECOMMENDED_THINKING_BUDGET,
THINKING_MODELS,
)
# Max number of back and forth with the LLM to generate a response
@@ -71,73 +84,101 @@ def _format_tool(
)
def _message_convert(
message: Message,
) -> MessageParam:
"""Convert from class to TypedDict."""
param_content: list[TextBlockParam | ToolUseBlockParam] = []
def _convert_content(
chat_content: Iterable[conversation.Content],
) -> list[MessageParam]:
"""Transform HA chat_log content into Anthropic API format."""
messages: list[MessageParam] = []
for message_content in message.content:
if isinstance(message_content, TextBlock):
param_content.append(TextBlockParam(type="text", text=message_content.text))
elif isinstance(message_content, ToolUseBlock):
param_content.append(
ToolUseBlockParam(
type="tool_use",
id=message_content.id,
name=message_content.name,
input=message_content.input,
)
for content in chat_content:
if isinstance(content, conversation.ToolResultContent):
tool_result_block = ToolResultBlockParam(
type="tool_result",
tool_use_id=content.tool_call_id,
content=json.dumps(content.tool_result),
)
return MessageParam(role=message.role, content=param_content)
def _convert_content(chat_content: conversation.Content) -> MessageParam:
"""Create tool response content."""
if isinstance(chat_content, conversation.ToolResultContent):
return MessageParam(
role="user",
content=[
ToolResultBlockParam(
type="tool_result",
tool_use_id=chat_content.tool_call_id,
content=json.dumps(chat_content.tool_result),
)
],
)
if isinstance(chat_content, conversation.AssistantContent):
return MessageParam(
role="assistant",
content=[
TextBlockParam(type="text", text=chat_content.content or ""),
*[
ToolUseBlockParam(
type="tool_use",
id=tool_call.id,
name=tool_call.tool_name,
input=tool_call.tool_args,
if not messages or messages[-1]["role"] != "user":
messages.append(
MessageParam(
role="user",
content=[tool_result_block],
)
for tool_call in chat_content.tool_calls or ()
],
],
)
if isinstance(chat_content, conversation.UserContent):
return MessageParam(
role="user",
content=chat_content.content,
)
# Note: We don't pass SystemContent here as its passed to the API as the prompt
raise ValueError(f"Unexpected content type: {type(chat_content)}")
)
elif isinstance(messages[-1]["content"], str):
messages[-1]["content"] = [
TextBlockParam(type="text", text=messages[-1]["content"]),
tool_result_block,
]
else:
messages[-1]["content"].append(tool_result_block) # type: ignore[attr-defined]
elif isinstance(content, conversation.UserContent):
# Combine consequent user messages
if not messages or messages[-1]["role"] != "user":
messages.append(
MessageParam(
role="user",
content=content.content,
)
)
elif isinstance(messages[-1]["content"], str):
messages[-1]["content"] = [
TextBlockParam(type="text", text=messages[-1]["content"]),
TextBlockParam(type="text", text=content.content),
]
else:
messages[-1]["content"].append( # type: ignore[attr-defined]
TextBlockParam(type="text", text=content.content)
)
elif isinstance(content, conversation.AssistantContent):
# Combine consequent assistant messages
if not messages or messages[-1]["role"] != "assistant":
messages.append(
MessageParam(
role="assistant",
content=[],
)
)
if content.content:
messages[-1]["content"].append( # type: ignore[union-attr]
TextBlockParam(type="text", text=content.content)
)
if content.tool_calls:
messages[-1]["content"].extend( # type: ignore[union-attr]
[
ToolUseBlockParam(
type="tool_use",
id=tool_call.id,
name=tool_call.tool_name,
input=tool_call.tool_args,
)
for tool_call in content.tool_calls
]
)
else:
# Note: We don't pass SystemContent here as its passed to the API as the prompt
raise TypeError(f"Unexpected content type: {type(content)}")
return messages
async def _transform_stream(
result: AsyncStream[MessageStreamEvent],
messages: list[MessageParam],
) -> AsyncGenerator[conversation.AssistantContentDeltaDict]:
"""Transform the response stream into HA format.
A typical stream of responses might look something like the following:
- RawMessageStartEvent with no content
- RawContentBlockStartEvent with an empty ThinkingBlock (if extended thinking is enabled)
- RawContentBlockDeltaEvent with a ThinkingDelta
- RawContentBlockDeltaEvent with a ThinkingDelta
- RawContentBlockDeltaEvent with a ThinkingDelta
- ...
- RawContentBlockDeltaEvent with a SignatureDelta
- RawContentBlockStopEvent
- RawContentBlockStartEvent with a RedactedThinkingBlock (occasionally)
- RawContentBlockStopEvent (RedactedThinkingBlock does not have a delta)
- RawContentBlockStartEvent with an empty TextBlock
- RawContentBlockDeltaEvent with a TextDelta
- RawContentBlockDeltaEvent with a TextDelta
@@ -151,44 +192,103 @@ async def _transform_stream(
- RawContentBlockStopEvent
- RawMessageDeltaEvent with a stop_reason='tool_use'
- RawMessageStopEvent(type='message_stop')
Each message could contain multiple blocks of the same type.
"""
if result is None:
raise TypeError("Expected a stream of messages")
current_tool_call: dict | None = None
current_message: MessageParam | None = None
current_block: (
TextBlockParam
| ToolUseBlockParam
| ThinkingBlockParam
| RedactedThinkingBlockParam
| None
) = None
current_tool_args: str
async for response in result:
LOGGER.debug("Received response: %s", response)
if isinstance(response, RawContentBlockStartEvent):
if isinstance(response, RawMessageStartEvent):
if response.message.role != "assistant":
raise ValueError("Unexpected message role")
current_message = MessageParam(role=response.message.role, content=[])
elif isinstance(response, RawContentBlockStartEvent):
if isinstance(response.content_block, ToolUseBlock):
current_tool_call = {
"id": response.content_block.id,
"name": response.content_block.name,
"input": "",
}
current_block = ToolUseBlockParam(
type="tool_use",
id=response.content_block.id,
name=response.content_block.name,
input="",
)
current_tool_args = ""
elif isinstance(response.content_block, TextBlock):
current_block = TextBlockParam(
type="text", text=response.content_block.text
)
yield {"role": "assistant"}
if response.content_block.text:
yield {"content": response.content_block.text}
elif isinstance(response.content_block, ThinkingBlock):
current_block = ThinkingBlockParam(
type="thinking",
thinking=response.content_block.thinking,
signature=response.content_block.signature,
)
elif isinstance(response.content_block, RedactedThinkingBlock):
current_block = RedactedThinkingBlockParam(
type="redacted_thinking", data=response.content_block.data
)
LOGGER.debug(
"Some of Claudes internal reasoning has been automatically "
"encrypted for safety reasons. This doesnt affect the quality of "
"responses"
)
elif isinstance(response, RawContentBlockDeltaEvent):
if current_block is None:
raise ValueError("Unexpected delta without a block")
if isinstance(response.delta, InputJSONDelta):
if current_tool_call is None:
raise ValueError("Unexpected delta without a tool call")
current_tool_call["input"] += response.delta.partial_json
current_tool_args += response.delta.partial_json
elif isinstance(response.delta, TextDelta):
LOGGER.debug("yielding delta: %s", response.delta.text)
text_block = cast(TextBlockParam, current_block)
text_block["text"] += response.delta.text
yield {"content": response.delta.text}
elif isinstance(response.delta, ThinkingDelta):
thinking_block = cast(ThinkingBlockParam, current_block)
thinking_block["thinking"] += response.delta.thinking
elif isinstance(response.delta, SignatureDelta):
thinking_block = cast(ThinkingBlockParam, current_block)
thinking_block["signature"] += response.delta.signature
elif isinstance(response, RawContentBlockStopEvent):
if current_tool_call:
if current_block is None:
raise ValueError("Unexpected stop event without a current block")
if current_block["type"] == "tool_use":
tool_block = cast(ToolUseBlockParam, current_block)
tool_args = json.loads(current_tool_args)
tool_block["input"] = tool_args
yield {
"tool_calls": [
llm.ToolInput(
id=current_tool_call["id"],
tool_name=current_tool_call["name"],
tool_args=json.loads(current_tool_call["input"]),
id=tool_block["id"],
tool_name=tool_block["name"],
tool_args=tool_args,
)
]
}
current_tool_call = None
elif current_block["type"] == "thinking":
thinking_block = cast(ThinkingBlockParam, current_block)
LOGGER.debug("Thinking: %s", thinking_block["thinking"])
if current_message is None:
raise ValueError("Unexpected stop event without a current message")
current_message["content"].append(current_block) # type: ignore[union-attr]
current_block = None
elif isinstance(response, RawMessageStopEvent):
if current_message is not None:
messages.append(current_message)
current_message = None
class AnthropicConversationEntity(
@@ -226,18 +326,6 @@ class AnthropicConversationEntity(
self.entry.add_update_listener(self._async_entry_update_listener)
)
async def async_process(
self, user_input: conversation.ConversationInput
) -> conversation.ConversationResult:
"""Process a sentence."""
with (
chat_session.async_get_chat_session(
self.hass, user_input.conversation_id
) as session,
conversation.async_get_chat_log(self.hass, session, user_input) as chat_log,
):
return await self._async_handle_message(user_input, chat_log)
async def _async_handle_message(
self,
user_input: conversation.ConversationInput,
@@ -266,34 +354,50 @@ class AnthropicConversationEntity(
system = chat_log.content[0]
if not isinstance(system, conversation.SystemContent):
raise TypeError("First message must be a system message")
messages = [_convert_content(content) for content in chat_log.content[1:]]
messages = _convert_content(chat_log.content[1:])
client = self.entry.runtime_data
thinking_budget = options.get(CONF_THINKING_BUDGET, RECOMMENDED_THINKING_BUDGET)
model = options.get(CONF_CHAT_MODEL, RECOMMENDED_CHAT_MODEL)
# To prevent infinite loops, we limit the number of iterations
for _iteration in range(MAX_TOOL_ITERATIONS):
try:
stream = await client.messages.create(
model=options.get(CONF_CHAT_MODEL, RECOMMENDED_CHAT_MODEL),
messages=messages,
tools=tools or NOT_GIVEN,
max_tokens=options.get(CONF_MAX_TOKENS, RECOMMENDED_MAX_TOKENS),
system=system.content,
temperature=options.get(CONF_TEMPERATURE, RECOMMENDED_TEMPERATURE),
stream=True,
model_args = {
"model": model,
"messages": messages,
"tools": tools or NOT_GIVEN,
"max_tokens": options.get(CONF_MAX_TOKENS, RECOMMENDED_MAX_TOKENS),
"system": system.content,
"stream": True,
}
if model in THINKING_MODELS and thinking_budget >= MIN_THINKING_BUDGET:
model_args["thinking"] = ThinkingConfigEnabledParam(
type="enabled", budget_tokens=thinking_budget
)
else:
model_args["thinking"] = ThinkingConfigDisabledParam(type="disabled")
model_args["temperature"] = options.get(
CONF_TEMPERATURE, RECOMMENDED_TEMPERATURE
)
try:
stream = await client.messages.create(**model_args)
except anthropic.AnthropicError as err:
raise HomeAssistantError(
f"Sorry, I had a problem talking to Anthropic: {err}"
) from err
messages.extend(
[
_convert_content(content)
async for content in chat_log.async_add_delta_content_stream(
user_input.agent_id, _transform_stream(stream)
)
]
_convert_content(
[
content
async for content in chat_log.async_add_delta_content_stream(
user_input.agent_id, _transform_stream(stream, messages)
)
if not isinstance(content, conversation.AssistantContent)
]
)
)
if not chat_log.unresponded_tool_results:
@@ -305,7 +409,9 @@ class AnthropicConversationEntity(
intent_response = intent.IntentResponse(language=user_input.language)
intent_response.async_set_speech(response_content.content or "")
return conversation.ConversationResult(
response=intent_response, conversation_id=chat_log.conversation_id
response=intent_response,
conversation_id=chat_log.conversation_id,
continue_conversation=chat_log.continue_conversation,
)
async def _async_entry_update_listener(

View File

@@ -23,12 +23,17 @@
"max_tokens": "Maximum tokens to return in response",
"temperature": "Temperature",
"llm_hass_api": "[%key:common::config_flow::data::llm_hass_api%]",
"recommended": "Recommended model settings"
"recommended": "Recommended model settings",
"thinking_budget_tokens": "Thinking budget"
},
"data_description": {
"prompt": "Instruct how the LLM should respond. This can be a template."
"prompt": "Instruct how the LLM should respond. This can be a template.",
"thinking_budget_tokens": "The number of tokens the model can use to think about the response out of the total maximum number of tokens. Set to 1024 or greater to enable extended thinking."
}
}
},
"error": {
"thinking_budget_too_large": "Maximum tokens must be greater than the thinking budget."
}
}
}

View File

@@ -57,7 +57,7 @@
"name": "Status date"
},
"dip_switch_settings": {
"name": "Dip switch settings"
"name": "DIP switch settings"
},
"low_battery_signal": {
"name": "Low battery signal"

View File

@@ -0,0 +1 @@
"""Virtual integration: Apollo Automation."""

View File

@@ -0,0 +1,6 @@
{
"domain": "apollo_automation",
"name": "Apollo Automation",
"integration_type": "virtual",
"supported_by": "esphome"
}

View File

@@ -7,5 +7,5 @@
"integration_type": "device",
"iot_class": "local_push",
"loggers": ["pyaprilaire"],
"requirements": ["pyaprilaire==0.7.7"]
"requirements": ["pyaprilaire==0.8.1"]
}

View File

@@ -60,7 +60,7 @@ class AquaCellConfigFlow(ConfigFlow, domain=DOMAIN):
errors["base"] = "cannot_connect"
except AuthenticationFailed:
errors["base"] = "invalid_auth"
except Exception: # pylint: disable=broad-except
except Exception:
_LOGGER.exception("Unexpected exception")
errors["base"] = "unknown"
else:

View File

@@ -6,7 +6,11 @@ import logging
from typing import Any
from homeassistant.components import mqtt
from homeassistant.components.sensor import SensorDeviceClass, SensorEntity
from homeassistant.components.sensor import (
SensorDeviceClass,
SensorEntity,
SensorStateClass,
)
from homeassistant.const import DEGREE, UnitOfPrecipitationDepth, UnitOfTemperature
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
@@ -98,6 +102,7 @@ def discover_sensors(topic: str, payload: dict[str, Any]) -> list[ArwnSensor] |
DEGREE,
"mdi:compass",
device_class=SensorDeviceClass.WIND_DIRECTION,
state_class=SensorStateClass.MEASUREMENT_ANGLE,
),
]
return None
@@ -178,6 +183,7 @@ class ArwnSensor(SensorEntity):
units: str,
icon: str | None = None,
device_class: SensorDeviceClass | None = None,
state_class: SensorStateClass | None = None,
) -> None:
"""Initialize the sensor."""
self.entity_id = _slug(name)
@@ -188,6 +194,7 @@ class ArwnSensor(SensorEntity):
self._attr_native_unit_of_measurement = units
self._attr_icon = icon
self._attr_device_class = device_class
self._attr_state_class = state_class
def set_event(self, event: dict[str, Any]) -> None:
"""Update the sensor with the most recent event."""

View File

@@ -125,7 +125,7 @@ SAVE_DELAY = 10
@callback
def _async_local_fallback_intent_filter(result: RecognizeResult) -> bool:
"""Filter out intents that are not local fallback."""
return result.intent.name in (intent.INTENT_GET_STATE, intent.INTENT_NEVERMIND)
return result.intent.name in (intent.INTENT_GET_STATE)
@callback
@@ -649,6 +649,7 @@ class PipelineRun:
data["runner_data"] = self.runner_data
if self.tts_stream:
data["tts_output"] = {
"token": self.tts_stream.token,
"url": self.tts_stream.url,
"mime_type": self.tts_stream.content_type,
}
@@ -1295,6 +1296,7 @@ class PipelineRun:
tts_output = {
"media_id": tts_media_id,
"token": self.tts_stream.token,
"url": self.tts_stream.url,
"mime_type": self.tts_stream.content_type,
}

View File

@@ -1,9 +1,11 @@
"""Base class for assist satellite entities."""
import logging
from pathlib import Path
import voluptuous as vol
from homeassistant.components.http import StaticPathConfig
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers import config_validation as cv
@@ -15,6 +17,8 @@ from .const import (
CONNECTION_TEST_DATA,
DATA_COMPONENT,
DOMAIN,
PREANNOUNCE_FILENAME,
PREANNOUNCE_URL,
AssistSatelliteEntityFeature,
)
from .entity import (
@@ -56,6 +60,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
{
vol.Optional("message"): str,
vol.Optional("media_id"): str,
vol.Optional("preannounce_media_id"): vol.Any(str, None),
}
),
cv.has_at_least_one_key("message", "media_id"),
@@ -70,6 +75,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
{
vol.Optional("start_message"): str,
vol.Optional("start_media_id"): str,
vol.Optional("preannounce_media_id"): vol.Any(str, None),
vol.Optional("extra_system_prompt"): str,
}
),
@@ -82,6 +88,15 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
async_register_websocket_api(hass)
hass.http.register_view(ConnectionTestView())
# Default preannounce sound
await hass.http.async_register_static_paths(
[
StaticPathConfig(
PREANNOUNCE_URL, str(Path(__file__).parent / PREANNOUNCE_FILENAME)
)
]
)
return True

View File

@@ -20,6 +20,9 @@ CONNECTION_TEST_DATA: HassKey[dict[str, asyncio.Event]] = HassKey(
f"{DOMAIN}_connection_tests"
)
PREANNOUNCE_FILENAME = "preannounce.mp3"
PREANNOUNCE_URL = f"/api/assist_satellite/static/{PREANNOUNCE_FILENAME}"
class AssistSatelliteEntityFeature(IntFlag):
"""Supported features of Assist satellite entity."""

View File

@@ -23,15 +23,12 @@ from homeassistant.components.assist_pipeline import (
vad,
)
from homeassistant.components.media_player import async_process_play_media_url
from homeassistant.components.tts import (
generate_media_source_id as tts_generate_media_source_id,
)
from homeassistant.core import Context, callback
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import chat_session, entity
from homeassistant.helpers.entity import EntityDescription
from .const import AssistSatelliteEntityFeature
from .const import PREANNOUNCE_URL, AssistSatelliteEntityFeature
from .errors import AssistSatelliteError, SatelliteBusyError
_LOGGER = logging.getLogger(__name__)
@@ -98,9 +95,15 @@ class AssistSatelliteAnnouncement:
original_media_id: str
"""The raw media ID before processing."""
tts_token: str | None
"""The TTS token of the media."""
media_id_source: Literal["url", "media_id", "tts"]
"""Source of the media ID."""
preannounce_media_id: str | None = None
"""Media ID to be played before announcement."""
class AssistSatelliteEntity(entity.Entity):
"""Entity encapsulating the state and functionality of an Assist satellite."""
@@ -177,6 +180,7 @@ class AssistSatelliteEntity(entity.Entity):
self,
message: str | None = None,
media_id: str | None = None,
preannounce_media_id: str | None = PREANNOUNCE_URL,
) -> None:
"""Play and show an announcement on the satellite.
@@ -186,6 +190,9 @@ class AssistSatelliteEntity(entity.Entity):
If media_id is provided, it is played directly. It is possible
to omit the message and the satellite will not show any text.
If preannounce_media_id is provided, it overrides the default sound.
If preannounce_media_id is None, no sound is played.
Calls async_announce with message and media id.
"""
await self._cancel_running_pipeline()
@@ -193,7 +200,9 @@ class AssistSatelliteEntity(entity.Entity):
if message is None:
message = ""
announcement = await self._resolve_announcement_media_id(message, media_id)
announcement = await self._resolve_announcement_media_id(
message, media_id, preannounce_media_id
)
if self._is_announcing:
raise SatelliteBusyError
@@ -220,6 +229,7 @@ class AssistSatelliteEntity(entity.Entity):
start_message: str | None = None,
start_media_id: str | None = None,
extra_system_prompt: str | None = None,
preannounce_media_id: str | None = PREANNOUNCE_URL,
) -> None:
"""Start a conversation from the satellite.
@@ -229,6 +239,9 @@ class AssistSatelliteEntity(entity.Entity):
If start_media_id is provided, it is played directly. It is possible
to omit the message and the satellite will not show any text.
If preannounce_media_id is provided, it is played before the announcement.
If preannounce_media_id is None, no sound is played.
Calls async_start_conversation.
"""
await self._cancel_running_pipeline()
@@ -244,13 +257,15 @@ class AssistSatelliteEntity(entity.Entity):
start_message = ""
announcement = await self._resolve_announcement_media_id(
start_message, start_media_id
start_message, start_media_id, preannounce_media_id
)
if self._is_announcing:
raise SatelliteBusyError
self._is_announcing = True
self._set_state(AssistSatelliteState.RESPONDING)
# Provide our start info to the LLM so it understands context of incoming message
if extra_system_prompt is not None:
self._extra_system_prompt = extra_system_prompt
@@ -280,6 +295,7 @@ class AssistSatelliteEntity(entity.Entity):
raise
finally:
self._is_announcing = False
self._set_state(AssistSatelliteState.IDLE)
async def async_start_conversation(
self, start_announcement: AssistSatelliteAnnouncement
@@ -470,20 +486,27 @@ class AssistSatelliteEntity(entity.Entity):
return vad.VadSensitivity.to_seconds(vad_sensitivity)
async def _resolve_announcement_media_id(
self, message: str, media_id: str | None
self,
message: str,
media_id: str | None,
preannounce_media_id: str | None = None,
) -> AssistSatelliteAnnouncement:
"""Resolve the media ID."""
media_id_source: Literal["url", "media_id", "tts"] | None = None
tts_token: str | None = None
if media_id:
original_media_id = media_id
else:
media_id_source = "tts"
# Synthesize audio and get URL
pipeline_id = self._resolve_pipeline()
pipeline = async_get_pipeline(self.hass, pipeline_id)
engine = tts.async_resolve_engine(self.hass, pipeline.tts_engine)
if engine is None:
raise HomeAssistantError(f"TTS engine {pipeline.tts_engine} not found")
tts_options: dict[str, Any] = {}
if pipeline.tts_voice is not None:
tts_options[tts.ATTR_VOICE] = pipeline.tts_voice
@@ -491,14 +514,23 @@ class AssistSatelliteEntity(entity.Entity):
if self.tts_options is not None:
tts_options.update(self.tts_options)
media_id = tts_generate_media_source_id(
stream = tts.async_create_stream(
self.hass,
message,
engine=pipeline.tts_engine,
engine=engine,
language=pipeline.tts_language,
options=tts_options,
)
stream.async_set_message(message)
tts_token = stream.token
media_id = stream.url
original_media_id = tts.generate_media_source_id(
self.hass,
message,
engine=engine,
language=pipeline.tts_language,
options=tts_options,
)
original_media_id = media_id
if media_source.is_media_source_id(media_id):
if not media_id_source:
@@ -516,6 +548,26 @@ class AssistSatelliteEntity(entity.Entity):
# Resolve to full URL
media_id = async_process_play_media_url(self.hass, media_id)
# Resolve preannounce media id
if preannounce_media_id:
if media_source.is_media_source_id(preannounce_media_id):
preannounce_media = await media_source.async_resolve_media(
self.hass,
preannounce_media_id,
None,
)
preannounce_media_id = preannounce_media.url
# Resolve to full URL
preannounce_media_id = async_process_play_media_url(
self.hass, preannounce_media_id
)
return AssistSatelliteAnnouncement(
message, media_id, original_media_id, media_id_source
message=message,
media_id=media_id,
original_media_id=original_media_id,
tts_token=tts_token,
media_id_source=media_id_source,
preannounce_media_id=preannounce_media_id,
)

View File

@@ -14,6 +14,10 @@ announce:
required: false
selector:
text:
preannounce_media_id:
required: false
selector:
text:
start_conversation:
target:
entity:
@@ -34,3 +38,7 @@ start_conversation:
required: false
selector:
text:
preannounce_media_id:
required: false
selector:
text:

View File

@@ -23,6 +23,10 @@
"media_id": {
"name": "Media ID",
"description": "The media ID to announce instead of using text-to-speech."
},
"preannounce_media_id": {
"name": "Preannounce Media ID",
"description": "The media ID to play before the announcement."
}
}
},
@@ -41,6 +45,10 @@
"extra_system_prompt": {
"name": "Extra system prompt",
"description": "Provide background information to the AI about the request."
},
"preannounce_media_id": {
"name": "Preannounce Media ID",
"description": "The media ID to play before the start message or media."
}
}
}

View File

@@ -66,28 +66,28 @@
"name": "Upload"
},
"load_avg_1m": {
"name": "Average load (1m)"
"name": "Average load (1 min)"
},
"load_avg_5m": {
"name": "Average load (5m)"
"name": "Average load (5 min)"
},
"load_avg_15m": {
"name": "Average load (15m)"
"name": "Average load (15 min)"
},
"24ghz_temperature": {
"name": "2.4GHz Temperature"
"name": "2.4GHz temperature"
},
"5ghz_temperature": {
"name": "5GHz Temperature"
"name": "5GHz temperature"
},
"cpu_temperature": {
"name": "CPU Temperature"
"name": "CPU temperature"
},
"5ghz_2_temperature": {
"name": "5GHz Temperature (Radio 2)"
"name": "5GHz temperature (Radio 2)"
},
"6ghz_temperature": {
"name": "6GHz Temperature"
"name": "6GHz temperature"
},
"cpu_usage": {
"name": "CPU usage"

View File

@@ -14,7 +14,7 @@
"personal_access_token": "Personal Access Token (PAT)"
},
"description": "Set up an Azure DevOps instance to access your project. A Personal Access Token is only required for a private project.",
"title": "Add Azure DevOps Project"
"title": "Add Azure DevOps project"
},
"reauth_confirm": {
"data": {
@@ -32,7 +32,7 @@
"entity": {
"sensor": {
"build_id": {
"name": "{definition_name} latest build id"
"name": "{definition_name} latest build ID"
},
"finish_time": {
"name": "{definition_name} latest build finish time"
@@ -59,7 +59,7 @@
"name": "{definition_name} latest build start time"
},
"url": {
"name": "{definition_name} latest build url"
"name": "{definition_name} latest build URL"
},
"work_item_count": {
"name": "{item_type} {item_state} work items"
@@ -68,7 +68,7 @@
},
"exceptions": {
"authentication_failed": {
"message": "Could not authorize with Azure DevOps for {title}. You will need to update your personal access token."
"message": "Could not authorize with Azure DevOps for {title}. You will need to update your Personal Access Token."
}
}
}

View File

@@ -141,7 +141,7 @@ class AzureStorageBackupAgent(BackupAgent):
"""Delete a backup file."""
blob = await self._find_blob_by_backup_id(backup_id)
if blob is None:
return
raise BackupNotFound(f"Backup {backup_id} not found")
await self._client.delete_blob(blob.name)
@handle_backup_errors
@@ -163,11 +163,11 @@ class AzureStorageBackupAgent(BackupAgent):
self,
backup_id: str,
**kwargs: Any,
) -> AgentBackup | None:
) -> AgentBackup:
"""Return a backup."""
blob = await self._find_blob_by_backup_id(backup_id)
if blob is None:
return None
raise BackupNotFound(f"Backup {backup_id} not found")
return AgentBackup.from_dict(json.loads(blob.metadata["backup_metadata"]))

View File

@@ -1,7 +1,9 @@
"""The Backup integration."""
from homeassistant.config_entries import SOURCE_SYSTEM
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant, ServiceCall
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers import config_validation as cv, discovery_flow
from homeassistant.helpers.backup import DATA_BACKUP
from homeassistant.helpers.hassio import is_hassio
from homeassistant.helpers.typing import ConfigType
@@ -18,10 +20,12 @@ from .agent import (
)
from .config import BackupConfig, CreateBackupParametersDict
from .const import DATA_MANAGER, DOMAIN
from .coordinator import BackupConfigEntry, BackupDataUpdateCoordinator
from .http import async_register_http_views
from .manager import (
BackupManager,
BackupManagerError,
BackupPlatformEvent,
BackupPlatformProtocol,
BackupReaderWriter,
BackupReaderWriterError,
@@ -52,6 +56,7 @@ __all__ = [
"BackupConfig",
"BackupManagerError",
"BackupNotFound",
"BackupPlatformEvent",
"BackupPlatformProtocol",
"BackupReaderWriter",
"BackupReaderWriterError",
@@ -74,6 +79,8 @@ __all__ = [
"suggested_filename_from_name_date",
]
PLATFORMS = [Platform.SENSOR]
CONFIG_SCHEMA = cv.empty_config_schema(DOMAIN)
@@ -128,4 +135,28 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
async_register_http_views(hass)
discovery_flow.async_create_flow(
hass, DOMAIN, context={"source": SOURCE_SYSTEM}, data={}
)
return True
async def async_setup_entry(hass: HomeAssistant, entry: BackupConfigEntry) -> bool:
"""Set up a config entry."""
backup_manager: BackupManager = hass.data[DATA_MANAGER]
coordinator = BackupDataUpdateCoordinator(hass, entry, backup_manager)
await coordinator.async_config_entry_first_refresh()
entry.async_on_unload(coordinator.async_unsubscribe)
entry.runtime_data = coordinator
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
return True
async def async_unload_entry(hass: HomeAssistant, entry: BackupConfigEntry) -> bool:
"""Unload a config entry."""
return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)

View File

@@ -41,6 +41,8 @@ class BackupAgent(abc.ABC):
) -> AsyncIterator[bytes]:
"""Download a backup file.
Raises BackupNotFound if the backup does not exist.
:param backup_id: The ID of the backup that was returned in async_list_backups.
:return: An async iterator that yields bytes.
"""
@@ -67,6 +69,8 @@ class BackupAgent(abc.ABC):
) -> None:
"""Delete a backup file.
Raises BackupNotFound if the backup does not exist.
:param backup_id: The ID of the backup that was returned in async_list_backups.
"""
@@ -79,8 +83,11 @@ class BackupAgent(abc.ABC):
self,
backup_id: str,
**kwargs: Any,
) -> AgentBackup | None:
"""Return a backup."""
) -> AgentBackup:
"""Return a backup.
Raises BackupNotFound if the backup does not exist.
"""
class LocalBackupAgent(BackupAgent):

View File

@@ -88,13 +88,13 @@ class CoreLocalBackupAgent(LocalBackupAgent):
self,
backup_id: str,
**kwargs: Any,
) -> AgentBackup | None:
) -> AgentBackup:
"""Return a backup."""
if not self._loaded_backups:
await self._load_backups()
if backup_id not in self._backups:
return None
raise BackupNotFound(f"Backup {backup_id} not found")
backup, backup_path = self._backups[backup_id]
if not await self._hass.async_add_executor_job(backup_path.exists):
@@ -107,7 +107,7 @@ class CoreLocalBackupAgent(LocalBackupAgent):
backup_path,
)
self._backups.pop(backup_id)
return None
raise BackupNotFound(f"Backup {backup_id} not found")
return backup
@@ -130,10 +130,7 @@ class CoreLocalBackupAgent(LocalBackupAgent):
if not self._loaded_backups:
await self._load_backups()
try:
backup_path = self.get_backup_path(backup_id)
except BackupNotFound:
return
backup_path = self.get_backup_path(backup_id)
await self._hass.async_add_executor_job(backup_path.unlink, True)
LOGGER.debug("Deleted backup located at %s", backup_path)
self._backups.pop(backup_id)

View File

@@ -0,0 +1,21 @@
"""Config flow for Home Assistant Backup integration."""
from __future__ import annotations
from typing import Any
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from .const import DOMAIN
class BackupConfigFlow(ConfigFlow, domain=DOMAIN):
"""Handle a config flow for Home Assistant Backup."""
VERSION = 1
async def async_step_system(
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
"""Handle the initial step."""
return self.async_create_entry(title="Backup", data={})

View File

@@ -16,8 +16,8 @@ DATA_MANAGER: HassKey[BackupManager] = HassKey(DOMAIN)
LOGGER = getLogger(__package__)
EXCLUDE_FROM_BACKUP = [
"__pycache__/*",
".DS_Store",
"**/__pycache__/*",
"**/.DS_Store",
".HA_RESTORE",
"*.db-shm",
"*.log.*",

View File

@@ -0,0 +1,81 @@
"""Coordinator for Home Assistant Backup integration."""
from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
from datetime import datetime
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.backup import (
async_subscribe_events,
async_subscribe_platform_events,
)
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from .const import DOMAIN, LOGGER
from .manager import (
BackupManager,
BackupManagerState,
BackupPlatformEvent,
ManagerStateEvent,
)
type BackupConfigEntry = ConfigEntry[BackupDataUpdateCoordinator]
@dataclass
class BackupCoordinatorData:
"""Class to hold backup data."""
backup_manager_state: BackupManagerState
last_successful_automatic_backup: datetime | None
next_scheduled_automatic_backup: datetime | None
class BackupDataUpdateCoordinator(DataUpdateCoordinator[BackupCoordinatorData]):
"""Class to retrieve backup status."""
config_entry: ConfigEntry
def __init__(
self,
hass: HomeAssistant,
config_entry: ConfigEntry,
backup_manager: BackupManager,
) -> None:
"""Initialize coordinator."""
super().__init__(
hass,
LOGGER,
config_entry=config_entry,
name=DOMAIN,
update_interval=None,
)
self.unsubscribe: list[Callable[[], None]] = [
async_subscribe_events(hass, self._on_event),
async_subscribe_platform_events(hass, self._on_event),
]
self.backup_manager = backup_manager
@callback
def _on_event(self, event: ManagerStateEvent | BackupPlatformEvent) -> None:
"""Handle new event."""
LOGGER.debug("Received backup event: %s", event)
self.config_entry.async_create_task(self.hass, self.async_refresh())
async def _async_update_data(self) -> BackupCoordinatorData:
"""Update backup manager data."""
return BackupCoordinatorData(
self.backup_manager.state,
self.backup_manager.config.data.last_completed_automatic_backup,
self.backup_manager.config.data.schedule.next_automatic_backup,
)
@callback
def async_unsubscribe(self) -> None:
"""Unsubscribe from events."""
for unsub in self.unsubscribe:
unsub()

View File

@@ -0,0 +1,27 @@
"""Diagnostics support for Home Assistant Backup integration."""
from __future__ import annotations
from typing import Any
from homeassistant.components.diagnostics import async_redact_data
from homeassistant.const import CONF_PASSWORD
from homeassistant.core import HomeAssistant
from .coordinator import BackupConfigEntry
async def async_get_config_entry_diagnostics(
hass: HomeAssistant, entry: BackupConfigEntry
) -> dict[str, Any]:
"""Return diagnostics for a config entry."""
coordinator = entry.runtime_data
return {
"backup_agents": [
{"name": agent.name, "agent_id": agent.agent_id}
for agent in coordinator.backup_manager.backup_agents.values()
],
"backup_config": async_redact_data(
coordinator.backup_manager.config.data.to_dict(), [CONF_PASSWORD]
),
}

View File

@@ -0,0 +1,36 @@
"""Base for backup entities."""
from __future__ import annotations
from homeassistant.const import __version__ as HA_VERSION
from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
from homeassistant.helpers.entity import EntityDescription
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import DOMAIN
from .coordinator import BackupDataUpdateCoordinator
class BackupManagerEntity(CoordinatorEntity[BackupDataUpdateCoordinator]):
"""Base entity for backup manager."""
_attr_has_entity_name = True
def __init__(
self,
coordinator: BackupDataUpdateCoordinator,
entity_description: EntityDescription,
) -> None:
"""Initialize base entity."""
super().__init__(coordinator)
self.entity_description = entity_description
self._attr_unique_id = entity_description.key
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, "backup_manager")},
manufacturer="Home Assistant",
model="Home Assistant Backup",
sw_version=HA_VERSION,
name="Backup",
entry_type=DeviceEntryType.SERVICE,
configuration_url="homeassistant://config/backup",
)

View File

@@ -15,6 +15,7 @@ from multidict import istr
from homeassistant.components.http import KEY_HASS, HomeAssistantView, require_admin
from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import frame
from homeassistant.util import slugify
from . import util
@@ -59,11 +60,19 @@ class DownloadBackupView(HomeAssistantView):
if agent_id not in manager.backup_agents:
return Response(status=HTTPStatus.BAD_REQUEST)
agent = manager.backup_agents[agent_id]
backup = await agent.async_get_backup(backup_id)
try:
backup = await agent.async_get_backup(backup_id)
except BackupNotFound:
return Response(status=HTTPStatus.NOT_FOUND)
# We don't need to check if the path exists, aiohttp.FileResponse will handle
# that
if backup is None:
# Check for None to be backwards compatible with the old BackupAgent API,
# this can be removed in HA Core 2025.10
if not backup:
frame.report_usage(
"returns None from BackupAgent.async_get_backup",
breaks_in_ha_version="2025.10",
integration_domain=agent_id.partition(".")[0],
)
return Response(status=HTTPStatus.NOT_FOUND)
headers = {
@@ -92,6 +101,8 @@ class DownloadBackupView(HomeAssistantView):
) -> StreamResponse | FileResponse | Response:
if agent_id in manager.local_backup_agents:
local_agent = manager.local_backup_agents[agent_id]
# We don't need to check if the path exists, aiohttp.FileResponse will
# handle that
path = local_agent.get_backup_path(backup_id)
return FileResponse(path=path.as_posix(), headers=headers)

View File

@@ -30,6 +30,7 @@ from homeassistant.backup_restore import (
from homeassistant.const import __version__ as HAVERSION
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import (
frame,
instance_id,
integration_platform,
issue_registry as ir,
@@ -64,6 +65,7 @@ from .models import (
AgentBackup,
BackupError,
BackupManagerError,
BackupNotFound,
BackupReaderWriterError,
BaseBackup,
Folder,
@@ -118,6 +120,7 @@ class BackupManagerState(StrEnum):
IDLE = "idle"
CREATE_BACKUP = "create_backup"
BLOCKED = "blocked"
RECEIVE_BACKUP = "receive_backup"
RESTORE_BACKUP = "restore_backup"
@@ -226,6 +229,20 @@ class RestoreBackupEvent(ManagerStateEvent):
state: RestoreBackupState
@dataclass(frozen=True, kw_only=True, slots=True)
class BackupPlatformEvent:
"""Backup platform class."""
domain: str
@dataclass(frozen=True, kw_only=True, slots=True)
class BlockedEvent(ManagerStateEvent):
"""Backup manager blocked, Home Assistant is starting."""
manager_state: BackupManagerState = BackupManagerState.BLOCKED
class BackupPlatformProtocol(Protocol):
"""Define the format that backup platforms can have."""
@@ -340,11 +357,14 @@ class BackupManager:
self.remove_next_delete_event: Callable[[], None] | None = None
# Latest backup event and backup event subscribers
self.last_event: ManagerStateEvent = IdleEvent()
self.last_non_idle_event: ManagerStateEvent | None = None
self.last_event: ManagerStateEvent = BlockedEvent()
self.last_action_event: ManagerStateEvent | None = None
self._backup_event_subscriptions = hass.data[
DATA_BACKUP
].backup_event_subscriptions
self._backup_platform_event_subscriptions = hass.data[
DATA_BACKUP
].backup_platform_event_subscriptions
async def async_setup(self) -> None:
"""Set up the backup manager."""
@@ -354,10 +374,19 @@ class BackupManager:
self.known_backups.load(stored["backups"])
await self._reader_writer.async_validate_config(config=self.config)
await self._reader_writer.async_resume_restore_progress_after_restart(
on_progress=self.async_on_backup_event
)
async def set_manager_idle_after_start(hass: HomeAssistant) -> None:
"""Set manager to idle after start."""
self.async_on_backup_event(IdleEvent())
if self.state == BackupManagerState.BLOCKED:
# If we're not finishing a restore job, set the manager to idle after start
start.async_at_started(self.hass, set_manager_idle_after_start)
await self.load_platforms()
@property
@@ -446,6 +475,9 @@ class BackupManager:
LOGGER.debug("%s platforms loaded in total", len(self.platforms))
LOGGER.debug("%s agents loaded in total", len(self.backup_agents))
LOGGER.debug("%s local agents loaded in total", len(self.local_backup_agents))
event = BackupPlatformEvent(domain=integration_domain)
for subscription in self._backup_platform_event_subscriptions:
subscription(event)
async def async_pre_backup_actions(self) -> None:
"""Perform pre backup actions."""
@@ -648,6 +680,8 @@ class BackupManager:
)
for idx, result in enumerate(get_backup_results):
agent_id = agent_ids[idx]
if isinstance(result, BackupNotFound):
continue
if isinstance(result, BackupAgentError):
agent_errors[agent_id] = result
continue
@@ -659,7 +693,14 @@ class BackupManager:
continue
if isinstance(result, BaseException):
raise result # unexpected error
# Check for None to be backwards compatible with the old BackupAgent API,
# this can be removed in HA Core 2025.10
if not result:
frame.report_usage(
"returns None from BackupAgent.async_get_backup",
breaks_in_ha_version="2025.10",
integration_domain=agent_id.partition(".")[0],
)
continue
if backup is None:
if known_backup := self.known_backups.get(backup_id):
@@ -723,6 +764,8 @@ class BackupManager:
)
for idx, result in enumerate(delete_backup_results):
agent_id = agent_ids[idx]
if isinstance(result, BackupNotFound):
continue
if isinstance(result, BackupAgentError):
agent_errors[agent_id] = result
continue
@@ -832,7 +875,7 @@ class BackupManager:
agent_errors = {
backup_id: error
for backup_id, error in zip(backup_ids, delete_results, strict=True)
if error
if error and not isinstance(error, BackupNotFound)
}
if agent_errors:
LOGGER.error(
@@ -1264,7 +1307,20 @@ class BackupManager:
) -> None:
"""Initiate restoring a backup."""
agent = self.backup_agents[agent_id]
if not await agent.async_get_backup(backup_id):
try:
backup = await agent.async_get_backup(backup_id)
except BackupNotFound as err:
raise BackupManagerError(
f"Backup {backup_id} not found in agent {agent_id}"
) from err
# Check for None to be backwards compatible with the old BackupAgent API,
# this can be removed in HA Core 2025.10
if not backup:
frame.report_usage(
"returns None from BackupAgent.async_get_backup",
breaks_in_ha_version="2025.10",
integration_domain=agent_id.partition(".")[0],
)
raise BackupManagerError(
f"Backup {backup_id} not found in agent {agent_id}"
)
@@ -1293,8 +1349,8 @@ class BackupManager:
if (current_state := self.state) != (new_state := event.manager_state):
LOGGER.debug("Backup state: %s -> %s", current_state, new_state)
self.last_event = event
if not isinstance(event, IdleEvent):
self.last_non_idle_event = event
if not isinstance(event, (BlockedEvent, IdleEvent)):
self.last_action_event = event
for subscription in self._backup_event_subscriptions:
subscription(event)
@@ -1352,7 +1408,20 @@ class BackupManager:
agent = self.backup_agents[agent_id]
except KeyError as err:
raise BackupManagerError(f"Invalid agent selected: {agent_id}") from err
if not await agent.async_get_backup(backup_id):
try:
backup = await agent.async_get_backup(backup_id)
except BackupNotFound as err:
raise BackupManagerError(
f"Backup {backup_id} not found in agent {agent_id}"
) from err
# Check for None to be backwards compatible with the old BackupAgent API,
# this can be removed in HA Core 2025.10
if not backup:
frame.report_usage(
"returns None from BackupAgent.async_get_backup",
breaks_in_ha_version="2025.10",
integration_domain=agent_id.partition(".")[0],
)
raise BackupManagerError(
f"Backup {backup_id} not found in agent {agent_id}"
)
@@ -1657,7 +1726,9 @@ class CoreBackupReaderWriter(BackupReaderWriter):
"""Filter to filter excludes."""
for exclude in excludes:
if not path.match(exclude):
# The home assistant core configuration directory is added as "data"
# in the tar file, so we need to prefix that path to the filters.
if not path.full_match(f"data/{exclude}"):
continue
LOGGER.debug("Ignoring %s because of %s", path, exclude)
return True

View File

@@ -5,8 +5,9 @@
"codeowners": ["@home-assistant/core"],
"dependencies": ["http", "websocket_api"],
"documentation": "https://www.home-assistant.io/integrations/backup",
"integration_type": "system",
"integration_type": "service",
"iot_class": "calculated",
"quality_scale": "internal",
"requirements": ["cronsim==2.6", "securetar==2025.2.1"]
"requirements": ["cronsim==2.6", "securetar==2025.2.1"],
"single_config_entry": true
}

View File

@@ -0,0 +1,75 @@
"""Sensor platform for Home Assistant Backup integration."""
from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
from datetime import datetime
from homeassistant.components.sensor import (
SensorDeviceClass,
SensorEntity,
SensorEntityDescription,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from .coordinator import BackupConfigEntry, BackupCoordinatorData
from .entity import BackupManagerEntity
from .manager import BackupManagerState
@dataclass(kw_only=True, frozen=True)
class BackupSensorEntityDescription(SensorEntityDescription):
"""Description for Home Assistant Backup sensor entities."""
value_fn: Callable[[BackupCoordinatorData], str | datetime | None]
BACKUP_MANAGER_DESCRIPTIONS = (
BackupSensorEntityDescription(
key="backup_manager_state",
translation_key="backup_manager_state",
device_class=SensorDeviceClass.ENUM,
options=[state.value for state in BackupManagerState],
value_fn=lambda data: data.backup_manager_state,
),
BackupSensorEntityDescription(
key="next_scheduled_automatic_backup",
translation_key="next_scheduled_automatic_backup",
device_class=SensorDeviceClass.TIMESTAMP,
value_fn=lambda data: data.next_scheduled_automatic_backup,
),
BackupSensorEntityDescription(
key="last_successful_automatic_backup",
translation_key="last_successful_automatic_backup",
device_class=SensorDeviceClass.TIMESTAMP,
value_fn=lambda data: data.last_successful_automatic_backup,
),
)
async def async_setup_entry(
hass: HomeAssistant,
config_entry: BackupConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Sensor set up for backup config entry."""
coordinator = config_entry.runtime_data
async_add_entities(
BackupManagerSensor(coordinator, description)
for description in BACKUP_MANAGER_DESCRIPTIONS
)
class BackupManagerSensor(BackupManagerEntity, SensorEntity):
"""Sensor to track backup manager state."""
entity_description: BackupSensorEntityDescription
@property
def native_value(self) -> str | datetime | None:
"""Return native value of entity."""
return self.entity_description.value_fn(self.coordinator.data)

View File

@@ -22,5 +22,24 @@
"name": "Create automatic backup",
"description": "Creates a new backup with automatic backup settings."
}
},
"entity": {
"sensor": {
"backup_manager_state": {
"name": "Backup Manager State",
"state": {
"idle": "Idle",
"create_backup": "Creating a backup",
"receive_backup": "Receiving a backup",
"restore_backup": "Restoring a backup"
}
},
"next_scheduled_automatic_backup": {
"name": "Next scheduled automatic backup"
},
"last_successful_automatic_backup": {
"name": "Last successful automatic backup"
}
}
}
}

View File

@@ -55,7 +55,7 @@ async def handle_info(
"backups": list(backups.values()),
"last_attempted_automatic_backup": manager.config.data.last_attempted_automatic_backup,
"last_completed_automatic_backup": manager.config.data.last_completed_automatic_backup,
"last_non_idle_event": manager.last_non_idle_event,
"last_action_event": manager.last_action_event,
"next_automatic_backup": manager.config.data.schedule.next_automatic_backup,
"next_automatic_backup_additional": manager.config.data.schedule.next_automatic_backup_additional,
"state": manager.state,

View File

@@ -23,7 +23,7 @@
"entity": {
"climate": {
"auto_comfort": {
"name": "Auto comfort"
"name": "Auto Comfort"
}
},
"fan": {
@@ -39,25 +39,25 @@
},
"number": {
"comfort_min_speed": {
"name": "Auto Comfort Minimum Speed"
"name": "Auto Comfort minimum speed"
},
"comfort_max_speed": {
"name": "Auto Comfort Maximum Speed"
"name": "Auto Comfort maximum speed"
},
"comfort_heat_assist_speed": {
"name": "Auto Comfort Heat Assist Speed"
"name": "Auto Comfort Heat Assist speed"
},
"return_to_auto_timeout": {
"name": "Return to Auto Timeout"
"name": "Return to Auto timeout"
},
"motion_sense_timeout": {
"name": "Motion Sense Timeout"
"name": "Motion sense timeout"
},
"light_return_to_auto_timeout": {
"name": "Light Return to Auto Timeout"
"name": "Light return to Auto timeout"
},
"light_auto_motion_timeout": {
"name": "Light Motion Sense Timeout"
"name": "Light motion sense timeout"
}
},
"sensor": {
@@ -76,10 +76,10 @@
},
"switch": {
"legacy_ir_remote_enable": {
"name": "Legacy IR Remote"
"name": "Legacy IR remote"
},
"led_indicators_enable": {
"name": "Led Indicators"
"name": "LED indicators"
},
"comfort_heat_assist_enable": {
"name": "Auto Comfort Heat Assist"
@@ -88,10 +88,10 @@
"name": "Beep"
},
"eco_enable": {
"name": "Eco Mode"
"name": "Eco mode"
},
"motion_sense_enable": {
"name": "Motion Sense"
"name": "Motion sense"
},
"return_to_auto_enable": {
"name": "Return to Auto"
@@ -103,7 +103,7 @@
"name": "Dim to Warm"
},
"light_return_to_auto_enable": {
"name": "Light Return to Auto"
"name": "Light return to Auto"
}
}
}

View File

@@ -29,7 +29,7 @@
"description": "Manually configure your Bang & Olufsen device."
},
"zeroconf_confirm": {
"title": "Setup Bang & Olufsen device",
"title": "Set up Bang & Olufsen device",
"description": "Confirm the configuration of the {model}-{serial_number} @ {host}."
}
}
@@ -197,11 +197,11 @@
"services": {
"beolink_allstandby": {
"name": "Beolink all standby",
"description": "Set all Connected Beolink devices to standby."
"description": "Sets all connected Beolink devices to standby."
},
"beolink_expand": {
"name": "Beolink expand",
"description": "Expand current Beolink experience.",
"description": "Adds devices to the current Beolink experience.",
"fields": {
"all_discovered": {
"name": "All discovered",
@@ -221,7 +221,7 @@
},
"beolink_join": {
"name": "Beolink join",
"description": "Join a Beolink experience.",
"description": "Joins a Beolink experience.",
"fields": {
"beolink_jid": {
"name": "Beolink JID",
@@ -241,11 +241,11 @@
},
"beolink_leave": {
"name": "Beolink leave",
"description": "Leave a Beolink experience."
"description": "Leaves a Beolink experience."
},
"beolink_unexpand": {
"name": "Beolink unexpand",
"description": "Unexpand from current Beolink experience.",
"description": "Removes devices from the current Beolink experience.",
"fields": {
"beolink_jids": {
"name": "Beolink JIDs",
@@ -274,7 +274,7 @@
"message": "An error occurred while attempting to play {media_type}: {error_message}."
},
"invalid_grouping_entity": {
"message": "Entity with id: {entity_id} can't be added to the Beolink session. Is the entity a Bang & Olufsen media_player?"
"message": "Entity with ID {entity_id} can't be added to the Beolink session. Is the entity a Bang & Olufsen media_player?"
},
"invalid_sound_mode": {
"message": "{invalid_sound_mode} is an invalid sound mode. Valid values are: {valid_sound_modes}."

View File

@@ -75,6 +75,9 @@ class BluesoundConfigFlow(ConfigFlow, domain=DOMAIN):
self, discovery_info: ZeroconfServiceInfo
) -> ConfigFlowResult:
"""Handle a flow initialized by zeroconf discovery."""
# the player can have an ipv6 address, but the api is only available on ipv4
if discovery_info.ip_address.version != 4:
return self.async_abort(reason="no_ipv4_address")
if discovery_info.port is not None:
self._port = discovery_info.port

View File

@@ -19,7 +19,8 @@
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]",
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]"
"already_in_progress": "[%key:common::config_flow::abort::already_in_progress%]",
"no_ipv4_address": "No IPv4 address found."
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]"

View File

@@ -18,9 +18,9 @@
"bleak==0.22.3",
"bleak-retry-connector==3.9.0",
"bluetooth-adapters==0.21.4",
"bluetooth-auto-recovery==1.4.4",
"bluetooth-data-tools==1.23.4",
"dbus-fast==2.33.0",
"habluetooth==3.24.1"
"bluetooth-auto-recovery==1.4.5",
"bluetooth-data-tools==1.26.1",
"dbus-fast==2.43.0",
"habluetooth==3.37.0"
]
}

View File

@@ -0,0 +1,62 @@
"""The Bosch Alarm integration."""
from __future__ import annotations
from ssl import SSLError
from bosch_alarm_mode2 import Panel
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT, Platform
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.helpers import device_registry as dr
from .const import CONF_INSTALLER_CODE, CONF_USER_CODE, DOMAIN
PLATFORMS: list[Platform] = [Platform.ALARM_CONTROL_PANEL]
type BoschAlarmConfigEntry = ConfigEntry[Panel]
async def async_setup_entry(hass: HomeAssistant, entry: BoschAlarmConfigEntry) -> bool:
"""Set up Bosch Alarm from a config entry."""
panel = Panel(
host=entry.data[CONF_HOST],
port=entry.data[CONF_PORT],
automation_code=entry.data.get(CONF_PASSWORD),
installer_or_user_code=entry.data.get(
CONF_INSTALLER_CODE, entry.data.get(CONF_USER_CODE)
),
)
try:
await panel.connect()
except (PermissionError, ValueError) as err:
await panel.disconnect()
raise ConfigEntryNotReady from err
except (TimeoutError, OSError, ConnectionRefusedError, SSLError) as err:
await panel.disconnect()
raise ConfigEntryNotReady("Connection failed") from err
entry.runtime_data = panel
device_registry = dr.async_get(hass)
device_registry.async_get_or_create(
config_entry_id=entry.entry_id,
identifiers={(DOMAIN, entry.unique_id or entry.entry_id)},
name=f"Bosch {panel.model}",
manufacturer="Bosch Security Systems",
model=panel.model,
sw_version=panel.firmware_version,
)
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
return True
async def async_unload_entry(hass: HomeAssistant, entry: BoschAlarmConfigEntry) -> bool:
"""Unload a config entry."""
if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
await entry.runtime_data.disconnect()
return unload_ok

View File

@@ -0,0 +1,109 @@
"""Support for Bosch Alarm Panel."""
from __future__ import annotations
from bosch_alarm_mode2 import Panel
from homeassistant.components.alarm_control_panel import (
AlarmControlPanelEntity,
AlarmControlPanelEntityFeature,
AlarmControlPanelState,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import BoschAlarmConfigEntry
from .const import DOMAIN
async def async_setup_entry(
hass: HomeAssistant,
config_entry: BoschAlarmConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up control panels for each area."""
panel = config_entry.runtime_data
async_add_entities(
AreaAlarmControlPanel(
panel,
area_id,
config_entry.unique_id or config_entry.entry_id,
)
for area_id in panel.areas
)
class AreaAlarmControlPanel(AlarmControlPanelEntity):
"""An alarm control panel entity for a bosch alarm panel."""
_attr_has_entity_name = True
_attr_supported_features = (
AlarmControlPanelEntityFeature.ARM_HOME
| AlarmControlPanelEntityFeature.ARM_AWAY
)
_attr_code_arm_required = False
_attr_name = None
def __init__(self, panel: Panel, area_id: int, unique_id: str) -> None:
"""Initialise a Bosch Alarm control panel entity."""
self.panel = panel
self._area = panel.areas[area_id]
self._area_id = area_id
self._attr_unique_id = f"{unique_id}_area_{area_id}"
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, self._attr_unique_id)},
name=self._area.name,
manufacturer="Bosch Security Systems",
via_device=(
DOMAIN,
unique_id,
),
)
@property
def alarm_state(self) -> AlarmControlPanelState | None:
"""Return the state of the alarm."""
if self._area.is_triggered():
return AlarmControlPanelState.TRIGGERED
if self._area.is_disarmed():
return AlarmControlPanelState.DISARMED
if self._area.is_arming():
return AlarmControlPanelState.ARMING
if self._area.is_pending():
return AlarmControlPanelState.PENDING
if self._area.is_part_armed():
return AlarmControlPanelState.ARMED_HOME
if self._area.is_all_armed():
return AlarmControlPanelState.ARMED_AWAY
return None
async def async_alarm_disarm(self, code: str | None = None) -> None:
"""Disarm this panel."""
await self.panel.area_disarm(self._area_id)
async def async_alarm_arm_home(self, code: str | None = None) -> None:
"""Send arm home command."""
await self.panel.area_arm_part(self._area_id)
async def async_alarm_arm_away(self, code: str | None = None) -> None:
"""Send arm away command."""
await self.panel.area_arm_all(self._area_id)
@property
def available(self) -> bool:
"""Return True if entity is available."""
return self.panel.connection_status()
async def async_added_to_hass(self) -> None:
"""Run when entity attached to hass."""
await super().async_added_to_hass()
self._area.status_observer.attach(self.schedule_update_ha_state)
self.panel.connection_status_observer.attach(self.schedule_update_ha_state)
async def async_will_remove_from_hass(self) -> None:
"""Run when entity removed from hass."""
await super().async_will_remove_from_hass()
self._area.status_observer.detach(self.schedule_update_ha_state)
self.panel.connection_status_observer.detach(self.schedule_update_ha_state)

View File

@@ -0,0 +1,165 @@
"""Config flow for Bosch Alarm integration."""
from __future__ import annotations
import asyncio
import logging
import ssl
from typing import Any
from bosch_alarm_mode2 import Panel
import voluptuous as vol
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.const import (
CONF_CODE,
CONF_HOST,
CONF_MODEL,
CONF_PASSWORD,
CONF_PORT,
)
import homeassistant.helpers.config_validation as cv
from .const import CONF_INSTALLER_CODE, CONF_USER_CODE, DOMAIN
_LOGGER = logging.getLogger(__name__)
STEP_USER_DATA_SCHEMA = vol.Schema(
{
vol.Required(CONF_HOST): str,
vol.Required(CONF_PORT, default=7700): cv.positive_int,
}
)
STEP_AUTH_DATA_SCHEMA_SOLUTION = vol.Schema(
{
vol.Required(CONF_USER_CODE): str,
}
)
STEP_AUTH_DATA_SCHEMA_AMAX = vol.Schema(
{
vol.Required(CONF_INSTALLER_CODE): str,
vol.Required(CONF_PASSWORD): str,
}
)
STEP_AUTH_DATA_SCHEMA_BG = vol.Schema(
{
vol.Required(CONF_PASSWORD): str,
}
)
STEP_INIT_DATA_SCHEMA = vol.Schema({vol.Optional(CONF_CODE): str})
async def try_connect(
data: dict[str, Any], load_selector: int = 0
) -> tuple[str, int | None]:
"""Validate the user input allows us to connect.
Data has the keys from STEP_USER_DATA_SCHEMA with values provided by the user.
"""
panel = Panel(
host=data[CONF_HOST],
port=data[CONF_PORT],
automation_code=data.get(CONF_PASSWORD),
installer_or_user_code=data.get(CONF_INSTALLER_CODE, data.get(CONF_USER_CODE)),
)
try:
await panel.connect(load_selector)
finally:
await panel.disconnect()
return (panel.model, panel.serial_number)
class BoschAlarmConfigFlow(ConfigFlow, domain=DOMAIN):
"""Handle a config flow for Bosch Alarm."""
def __init__(self) -> None:
"""Init config flow."""
self._data: dict[str, Any] = {}
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
"""Handle the initial step."""
errors: dict[str, str] = {}
if user_input is not None:
try:
# Use load_selector = 0 to fetch the panel model without authentication.
(model, serial) = await try_connect(user_input, 0)
except (
OSError,
ConnectionRefusedError,
ssl.SSLError,
asyncio.exceptions.TimeoutError,
) as e:
_LOGGER.error("Connection Error: %s", e)
errors["base"] = "cannot_connect"
except Exception:
_LOGGER.exception("Unexpected exception")
errors["base"] = "unknown"
else:
self._data = user_input
self._data[CONF_MODEL] = model
return await self.async_step_auth()
return self.async_show_form(
step_id="user",
data_schema=self.add_suggested_values_to_schema(
STEP_USER_DATA_SCHEMA, user_input
),
errors=errors,
)
async def async_step_auth(
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
"""Handle the auth step."""
errors: dict[str, str] = {}
# Each model variant requires a different authentication flow
if "Solution" in self._data[CONF_MODEL]:
schema = STEP_AUTH_DATA_SCHEMA_SOLUTION
elif "AMAX" in self._data[CONF_MODEL]:
schema = STEP_AUTH_DATA_SCHEMA_AMAX
else:
schema = STEP_AUTH_DATA_SCHEMA_BG
if user_input is not None:
self._data.update(user_input)
try:
(model, serial_number) = await try_connect(
self._data, Panel.LOAD_EXTENDED_INFO
)
except (PermissionError, ValueError) as e:
errors["base"] = "invalid_auth"
_LOGGER.error("Authentication Error: %s", e)
except (
OSError,
ConnectionRefusedError,
ssl.SSLError,
TimeoutError,
) as e:
_LOGGER.error("Connection Error: %s", e)
errors["base"] = "cannot_connect"
except Exception:
_LOGGER.exception("Unexpected exception")
errors["base"] = "unknown"
else:
if serial_number:
await self.async_set_unique_id(str(serial_number))
self._abort_if_unique_id_configured()
else:
self._async_abort_entries_match({CONF_HOST: self._data[CONF_HOST]})
return self.async_create_entry(title=f"Bosch {model}", data=self._data)
return self.async_show_form(
step_id="auth",
data_schema=self.add_suggested_values_to_schema(schema, user_input),
errors=errors,
)

View File

@@ -0,0 +1,6 @@
"""Constants for the Bosch Alarm integration."""
DOMAIN = "bosch_alarm"
HISTORY_ATTR = "history"
CONF_INSTALLER_CODE = "installer_code"
CONF_USER_CODE = "user_code"

View File

@@ -0,0 +1,11 @@
{
"domain": "bosch_alarm",
"name": "Bosch Alarm",
"codeowners": ["@mag1024", "@sanjay900"],
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/bosch_alarm",
"integration_type": "device",
"iot_class": "local_push",
"quality_scale": "bronze",
"requirements": ["bosch-alarm-mode2==0.4.3"]
}

View File

@@ -0,0 +1,84 @@
rules:
# Bronze
action-setup:
status: exempt
comment: |
No custom actions defined
appropriate-polling:
status: exempt
comment: |
No polling
brands: done
common-modules: done
config-flow-test-coverage: done
config-flow: done
dependency-transparency: done
docs-actions:
status: exempt
comment: |
No custom actions are defined.
docs-high-level-description: done
docs-installation-instructions: done
docs-removal-instructions: done
entity-event-setup: done
entity-unique-id: done
has-entity-name: done
runtime-data: done
test-before-configure: done
test-before-setup: done
unique-config-entry: done
# Silver
action-exceptions:
status: exempt
comment: |
No custom actions are defined.
config-entry-unloading: done
docs-configuration-parameters: todo
docs-installation-parameters: todo
entity-unavailable: todo
integration-owner: done
log-when-unavailable: todo
parallel-updates: todo
reauthentication-flow: todo
test-coverage: done
# Gold
devices: done
diagnostics: todo
discovery-update-info: todo
discovery: todo
docs-data-update: todo
docs-examples: todo
docs-known-limitations: todo
docs-supported-devices: todo
docs-supported-functions: todo
docs-troubleshooting: todo
docs-use-cases: todo
dynamic-devices:
status: exempt
comment: |
Device type integration
entity-category: todo
entity-device-class: todo
entity-disabled-by-default: todo
entity-translations: todo
exception-translations: todo
icon-translations: todo
reconfiguration-flow: todo
repair-issues:
status: exempt
comment: |
No repairs
stale-devices:
status: exempt
comment: |
Device type integration
# Platinum
async-dependency: done
inject-websession:
status: exempt
comment: |
Integration does not make any HTTP requests.
strict-typing: done

View File

@@ -0,0 +1,36 @@
{
"config": {
"step": {
"user": {
"data": {
"host": "[%key:common::config_flow::data::host%]",
"port": "[%key:common::config_flow::data::port%]"
},
"data_description": {
"host": "The hostname or IP address of your Bosch alarm panel",
"port": "The port used to connect to your Bosch alarm panel. This is usually 7700"
}
},
"auth": {
"data": {
"password": "[%key:common::config_flow::data::password%]",
"installer_code": "Installer code",
"user_code": "User code"
},
"data_description": {
"password": "The Mode 2 automation code from your panel",
"installer_code": "The installer code from your panel",
"user_code": "The user code from your panel"
}
}
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
}
}
}

View File

@@ -4,10 +4,14 @@ from __future__ import annotations
from typing import Any
from homeassistant.components.diagnostics import async_redact_data
from homeassistant.const import CONF_EMAIL, CONF_NAME
from homeassistant.core import HomeAssistant
from .coordinator import BringConfigEntry
TO_REDACT = {CONF_NAME, CONF_EMAIL}
async def async_get_config_entry_diagnostics(
hass: HomeAssistant, config_entry: BringConfigEntry
@@ -15,7 +19,10 @@ async def async_get_config_entry_diagnostics(
"""Return diagnostics for a config entry."""
return {
"data": {k: v.to_dict() for k, v in config_entry.runtime_data.data.items()},
"data": {
k: async_redact_data(v.to_dict(), TO_REDACT)
for k, v in config_entry.runtime_data.data.items()
},
"lists": [lst.to_dict() for lst in config_entry.runtime_data.lists],
"user_settings": config_entry.runtime_data.user_settings.to_dict(),
}

View File

@@ -77,9 +77,12 @@ class BringEventEntity(BringBaseEntity, EventEntity):
attributes = asdict(activity.content)
attributes["last_activity_by"] = next(
x.name
for x in bring_list.users.users
if x.publicUuid == activity.content.publicUserUuid
(
x.name
for x in bring_list.users.users
if x.publicUuid == activity.content.publicUserUuid
),
None,
)
self._trigger_event(

View File

@@ -8,5 +8,5 @@
"iot_class": "cloud_polling",
"loggers": ["bring_api"],
"quality_scale": "platinum",
"requirements": ["bring-api==1.0.2"]
"requirements": ["bring-api==1.1.0"]
}

View File

@@ -9,6 +9,7 @@ from homeassistant.const import CONF_HOST, CONF_TYPE, Platform
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryNotReady
from .const import DOMAIN
from .coordinator import BrotherConfigEntry, BrotherDataUpdateCoordinator
PLATFORMS = [Platform.SENSOR]
@@ -25,7 +26,14 @@ async def async_setup_entry(hass: HomeAssistant, entry: BrotherConfigEntry) -> b
host, printer_type=printer_type, snmp_engine=snmp_engine
)
except (ConnectionError, SnmpError, TimeoutError) as error:
raise ConfigEntryNotReady from error
raise ConfigEntryNotReady(
translation_domain=DOMAIN,
translation_key="cannot_connect",
translation_placeholders={
"device": entry.title,
"error": repr(error),
},
) from error
coordinator = BrotherDataUpdateCoordinator(hass, entry, brother)
await coordinator.async_config_entry_first_refresh()

View File

@@ -26,6 +26,7 @@ class BrotherDataUpdateCoordinator(DataUpdateCoordinator[BrotherSensors]):
) -> None:
"""Initialize."""
self.brother = brother
self.device_name = config_entry.title
super().__init__(
hass,
@@ -41,5 +42,12 @@ class BrotherDataUpdateCoordinator(DataUpdateCoordinator[BrotherSensors]):
async with timeout(20):
data = await self.brother.async_update()
except (ConnectionError, SnmpError, UnsupportedModelError) as error:
raise UpdateFailed(error) from error
raise UpdateFailed(
translation_domain=DOMAIN,
translation_key="update_error",
translation_placeholders={
"device": self.device_name,
"error": repr(error),
},
) from error
return data

View File

@@ -159,5 +159,13 @@
"name": "Last restart"
}
}
},
"exceptions": {
"cannot_connect": {
"message": "An error occurred while connecting to the {device} printer: {error}"
},
"update_error": {
"message": "An error occurred while retrieving data from the {device} printer: {error}"
}
}
}

View File

@@ -170,6 +170,7 @@ SENSOR_TYPES: tuple[SensorEntityDescription, ...] = (
native_unit_of_measurement=DEGREE,
icon="mdi:compass-outline",
device_class=SensorDeviceClass.WIND_DIRECTION,
state_class=SensorStateClass.MEASUREMENT_ANGLE,
),
SensorEntityDescription(
key="pressure",

View File

@@ -153,6 +153,27 @@ def _has_min_duration(
return validate
def _has_positive_interval(
start_key: str, end_key: str, duration_key: str
) -> Callable[[dict[str, Any]], dict[str, Any]]:
"""Verify that the time span between start and end is greater than zero."""
def validate(obj: dict[str, Any]) -> dict[str, Any]:
if (duration := obj.get(duration_key)) is not None:
if duration <= datetime.timedelta(seconds=0):
raise vol.Invalid(f"Expected positive duration ({duration})")
return obj
if (start := obj.get(start_key)) and (end := obj.get(end_key)):
if start >= end:
raise vol.Invalid(
f"Expected end time to be after start time ({start}, {end})"
)
return obj
return validate
def _has_same_type(*keys: Any) -> Callable[[dict[str, Any]], dict[str, Any]]:
"""Verify that all values are of the same type."""
@@ -281,6 +302,7 @@ SERVICE_GET_EVENTS_SCHEMA: Final = vol.All(
),
}
),
_has_positive_interval(EVENT_START_DATETIME, EVENT_END_DATETIME, EVENT_DURATION),
)
@@ -870,6 +892,7 @@ async def async_get_events_service(
end = start + service_call.data[EVENT_DURATION]
else:
end = service_call.data[EVENT_END_DATETIME]
calendar_event_list = await calendar.async_get_events(
calendar.hass, dt_util.as_local(start), dt_util.as_local(end)
)

View File

@@ -21,8 +21,8 @@
"step": {
"init": {
"data": {
"ffmpeg_arguments": "Arguments passed to ffmpeg for cameras",
"timeout": "Request Timeout (seconds)"
"ffmpeg_arguments": "Arguments passed to FFmpeg for cameras",
"timeout": "Request timeout (seconds)"
}
}
}

View File

@@ -16,12 +16,21 @@ from homeassistant.config_entries import (
from homeassistant.const import CONF_UUID
from homeassistant.core import callback
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.selector import SelectSelector, SelectSelectorConfig
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from .const import CONF_IGNORE_CEC, CONF_KNOWN_HOSTS, DOMAIN
IGNORE_CEC_SCHEMA = vol.Schema(vol.All(cv.ensure_list, [cv.string]))
KNOWN_HOSTS_SCHEMA = vol.Schema(vol.All(cv.ensure_list, [cv.string]))
KNOWN_HOSTS_SCHEMA = vol.Schema(
{
vol.Optional(
CONF_KNOWN_HOSTS,
): SelectSelector(
SelectSelectorConfig(custom_value=True, options=[], multiple=True),
)
}
)
WANTED_UUID_SCHEMA = vol.Schema(vol.All(cv.ensure_list, [cv.string]))
@@ -30,12 +39,6 @@ class FlowHandler(ConfigFlow, domain=DOMAIN):
VERSION = 1
def __init__(self) -> None:
"""Initialize flow."""
self._ignore_cec = set[str]()
self._known_hosts = set[str]()
self._wanted_uuid = set[str]()
@staticmethod
@callback
def async_get_options_flow(
@@ -62,48 +65,31 @@ class FlowHandler(ConfigFlow, domain=DOMAIN):
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
"""Confirm the setup."""
errors = {}
data = {CONF_KNOWN_HOSTS: self._known_hosts}
if user_input is not None:
bad_hosts = False
known_hosts = user_input[CONF_KNOWN_HOSTS]
known_hosts = [x.strip() for x in known_hosts.split(",") if x.strip()]
try:
known_hosts = KNOWN_HOSTS_SCHEMA(known_hosts)
except vol.Invalid:
errors["base"] = "invalid_known_hosts"
bad_hosts = True
else:
self._known_hosts = known_hosts
data = self._get_data()
if not bad_hosts:
return self.async_create_entry(title="Google Cast", data=data)
known_hosts = _trim_items(user_input.get(CONF_KNOWN_HOSTS, []))
return self.async_create_entry(
title="Google Cast",
data=self._get_data(known_hosts=known_hosts),
)
fields = {}
fields[vol.Optional(CONF_KNOWN_HOSTS, default="")] = str
return self.async_show_form(
step_id="config", data_schema=vol.Schema(fields), errors=errors
)
return self.async_show_form(step_id="config", data_schema=KNOWN_HOSTS_SCHEMA)
async def async_step_confirm(
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
"""Confirm the setup."""
data = self._get_data()
if user_input is not None or not onboarding.async_is_onboarded(self.hass):
return self.async_create_entry(title="Google Cast", data=data)
return self.async_create_entry(title="Google Cast", data=self._get_data())
return self.async_show_form(step_id="confirm")
def _get_data(self):
def _get_data(
self, *, known_hosts: list[str] | None = None
) -> dict[str, list[str]]:
return {
CONF_IGNORE_CEC: list(self._ignore_cec),
CONF_KNOWN_HOSTS: list(self._known_hosts),
CONF_UUID: list(self._wanted_uuid),
CONF_IGNORE_CEC: [],
CONF_KNOWN_HOSTS: known_hosts or [],
CONF_UUID: [],
}
@@ -123,31 +109,24 @@ class CastOptionsFlowHandler(OptionsFlow):
) -> ConfigFlowResult:
"""Manage the Google Cast options."""
errors: dict[str, str] = {}
current_config = self.config_entry.data
if user_input is not None:
bad_hosts, known_hosts = _string_to_list(
user_input.get(CONF_KNOWN_HOSTS, ""), KNOWN_HOSTS_SCHEMA
known_hosts = _trim_items(user_input.get(CONF_KNOWN_HOSTS, []))
self.updated_config = dict(self.config_entry.data)
self.updated_config[CONF_KNOWN_HOSTS] = known_hosts
if self.show_advanced_options:
return await self.async_step_advanced_options()
self.hass.config_entries.async_update_entry(
self.config_entry, data=self.updated_config
)
if not bad_hosts:
self.updated_config = dict(current_config)
self.updated_config[CONF_KNOWN_HOSTS] = known_hosts
if self.show_advanced_options:
return await self.async_step_advanced_options()
self.hass.config_entries.async_update_entry(
self.config_entry, data=self.updated_config
)
return self.async_create_entry(title="", data={})
fields: dict[vol.Marker, type[str]] = {}
suggested_value = _list_to_string(current_config.get(CONF_KNOWN_HOSTS))
_add_with_suggestion(fields, CONF_KNOWN_HOSTS, suggested_value)
return self.async_create_entry(title="", data={})
return self.async_show_form(
step_id="basic_options",
data_schema=vol.Schema(fields),
data_schema=self.add_suggested_values_to_schema(
KNOWN_HOSTS_SCHEMA, self.config_entry.data
),
errors=errors,
last_step=not self.show_advanced_options,
)
@@ -206,6 +185,10 @@ def _string_to_list(string, schema):
return invalid, items
def _trim_items(items: list[str]) -> list[str]:
return [x.strip() for x in items if x.strip()]
def _add_with_suggestion(
fields: dict[vol.Marker, type[str]], key: str, suggested_value: str
) -> None:

View File

@@ -2,7 +2,7 @@
from __future__ import annotations
from typing import TYPE_CHECKING, TypedDict
from typing import TYPE_CHECKING, NotRequired, TypedDict
from homeassistant.util.signal_type import SignalType
@@ -46,3 +46,4 @@ class HomeAssistantControllerData(TypedDict):
hass_uuid: str
client_id: str | None
refresh_token: str
app_id: NotRequired[str]

View File

@@ -7,6 +7,7 @@ from dataclasses import dataclass
import logging
from typing import TYPE_CHECKING, ClassVar
from urllib.parse import urlparse
from uuid import UUID
import aiohttp
import attr
@@ -40,7 +41,7 @@ class ChromecastInfo:
is_dynamic_group = attr.ib(type=bool | None, default=None)
@property
def friendly_name(self) -> str:
def friendly_name(self) -> str | None:
"""Return the Friendly Name."""
return self.cast_info.friendly_name
@@ -50,7 +51,7 @@ class ChromecastInfo:
return self.cast_info.cast_type == CAST_TYPE_GROUP
@property
def uuid(self) -> bool:
def uuid(self) -> UUID:
"""Return the UUID."""
return self.cast_info.uuid
@@ -80,7 +81,7 @@ class ChromecastInfo:
"+label%3A%22integration%3A+cast%22"
)
_LOGGER.debug(
_LOGGER.info(
(
"Fetched cast details for unknown model '%s' manufacturer:"
" '%s', type: '%s'. Please %s"
@@ -111,7 +112,10 @@ class ChromecastInfo:
is_dynamic_group = False
http_group_status = None
http_group_status = dial.get_multizone_status(
None,
# We pass services which will be used for the HTTP request, and we
# don't care about the host in http_group_status.dynamic_groups so
# we pass an empty string to simplify the code.
"",
services=self.cast_info.services,
zconf=ChromeCastZeroconf.get_zeroconf(),
)

View File

@@ -14,7 +14,7 @@
"documentation": "https://www.home-assistant.io/integrations/cast",
"iot_class": "local_polling",
"loggers": ["casttube", "pychromecast"],
"requirements": ["PyChromecast==14.0.5"],
"requirements": ["PyChromecast==14.0.7"],
"single_config_entry": true,
"zeroconf": ["_googlecast._tcp.local."]
}

Some files were not shown because too many files have changed in this diff Show More