Compare commits

..

664 Commits

Author SHA1 Message Date
Ville Skyttä 5c75c33267 Update action-exceptions status
https://github.com/home-assistant/core/pull/144200
2025-05-04 15:20:25 +03:00
Ville Skyttä 0c7abcbf39 Update icon-translations status 2025-05-01 00:21:35 +03:00
Ville Skyttä 811457ff3b Update entity-device-class status
https://github.com/home-assistant/core/pull/143764
2025-04-27 13:29:09 +03:00
Ville Skyttä 727649905d Update url-normalize typing status 2025-04-27 09:11:08 +03:00
Ville Skyttä fe7c052428 Note more specific exceptions for config flow 2025-04-26 15:11:51 +03:00
Ville Skyttä 5e418ba1fa Note use of modelName in SSDP discovery 2025-04-26 15:08:10 +03:00
Ville Skyttä 6f4b51d1ee Expand on test coverage TODOs 2025-04-26 14:37:41 +03:00
Ville Skyttä 2808787c84 Expand on action-exceptions TODO 2025-04-26 14:24:43 +03:00
Ville Skyttä 8857b75fee Note binary sensor device class TODOs 2025-04-26 14:21:33 +03:00
Ville Skyttä 5995845721 Update strict-typing status 2025-04-26 14:10:05 +03:00
Ville Skyttä 80b58fc675 Add note on future coordinator placement 2025-04-26 13:47:55 +03:00
Ville Skyttä a088ef9e35 Mark config flow class name a TODO 2025-04-26 00:18:17 +03:00
Ville Skyttä 38781b3f9d Downgrade entity-translations to TODO 2025-04-26 00:14:22 +03:00
Ville Skyttä 2bef2d7cfa Downgrade icon-translations to TODO 2025-04-25 23:56:59 +03:00
Ville Skyttä aafc685080 Downgrade dependency-transparency to TODO 2025-04-25 23:11:37 +03:00
Ville Skyttä 2d39324ba7 Add huawei_lte quality scale YAML
To keep track, one more item to go before bronze.
2025-04-20 18:57:59 +03:00
Norbert Rittel 9b2faf207d Fix spelling of "off-peak", improve error message in teslemetry (#143321) 2025-04-20 12:49:16 +03:00
Norbert Rittel 9e59f07401 Use common state for "Error" in zha (#143320) 2025-04-20 11:55:36 +03:00
Norbert Rittel 928faeba0d Use common state for "Error" in tessie (#143319) 2025-04-20 11:49:34 +03:00
Norbert Rittel 521a44b953 Use common state for "Error" in roborock (#143318) 2025-04-20 11:49:17 +03:00
Norbert Rittel fb60479578 Use common state for "Error" in prusalink (#143317) 2025-04-20 11:49:02 +03:00
Norbert Rittel 29b67505a7 Use common state for "Error" in bmw_connected_drive (#143316) 2025-04-20 11:37:27 +03:00
Norbert Rittel 6f178a8a23 Use common state for "Error", capitalize "1P" in lektrico (#143315)
- replace "Error" with new common state reference
- capitalize the abbreviation "1P" (single phase)
2025-04-20 11:37:07 +03:00
Norbert Rittel b29c295adc Use common state for "Error" in jvc_projector (#143283) 2025-04-20 10:57:00 +03:00
Norbert Rittel 8b0f9d4317 Use common state for "Error" in aranet (#143282) 2025-04-20 10:56:27 +03:00
Norbert Rittel e1ba2a8ca2 Use common state for "Error" in matter (#143268) 2025-04-20 10:56:12 +03:00
Norbert Rittel eb852cec43 Use common state for "Error" in tesla_wall_connector (#143272) 2025-04-20 10:55:50 +03:00
Arjan 0bed5727cb Linkplay: bump lib to 0.2.4 (#143313) 2025-04-20 09:53:40 +02:00
Marc Mueller a749ecceed Add helper method to clear logger overwrites for tests (#143301) 2025-04-20 09:28:30 +02:00
tdfountain b5b934b8a1 Use _get_reauth_entry rather than storing in flow for NUT (#143308)
Use _get_reauth_entry rather than storing in flow
2025-04-20 08:30:15 +02:00
Mick Vleeshouwer 6b09fe2377 Support new local token generation method in Overkiz (#143181)
* Initial implementation of new token method for Local API

* Improve translations

* Update text

* Bugfix

* Bugfix

* Bugfixes

* Fixes

* Bugfix

* Bugfix

* Fix

* small fix

* Fix tests

* Refactor token usage in Overkiz config flow tests

* Refactor local API configuration flow tests for clarity and update reauthentication logic

* Improve comments

* Update tests

* Update homeassistant/components/overkiz/strings.json

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

---------

Co-authored-by: Josef Zweck <josef@zweck.dev>
2025-04-20 06:29:18 +02:00
tdfountain cbb4ff2fd9 Remove icon for button that uses default icon in NUT (#143305) 2025-04-19 16:35:13 -10:00
tdfountain eb642e8a06 Remove unused variable in test util for NUT (#143304) 2025-04-19 16:22:10 -10:00
tdfountain b97d8e163d Fix type of port in test util for NUT (#143303) 2025-04-19 16:13:05 -10:00
tdfountain 7c0d2832cd Add remove device support to NUT (#143293) 2025-04-19 16:07:42 -10:00
Marc Mueller 205cfae1a4 Update setuptools to 78.1.1 (#143275) 2025-04-19 15:57:53 -10:00
Marc Mueller f861a2b72c Fix licenses check for setuptools (#143292) 2025-04-20 02:24:44 +02:00
Marc Mueller 5843e63878 Add contextmanager to reset logger after set_level call in tests (#143295) 2025-04-20 02:13:01 +02:00
Marc Mueller 961f8afe53 Remove debug option in unifiprotect tests (#143296) 2025-04-19 14:00:22 -10:00
tdfountain 37769b94cd Remove unnecessary persistent notification in test case for NUT (#143298)
Remove unnecessary persistent notification
2025-04-20 01:55:26 +02:00
tdfountain f5c0c207ec Fix display state to return None instead of STATE_UNKNOWN in NUT (#143297)
Fix return value to avoid STATE_UNKNOWN
2025-04-20 01:53:29 +02:00
tdfountain b4344a8de2 Remove unused variable and import in NUT (#143294)
Remove unused variable in validate_input
2025-04-20 01:50:22 +02:00
J. Nick Koston e02c200775 Bump aiohttp to 3.11.17 (#143290) 2025-04-19 12:30:43 -10:00
Marc Mueller 8f4435019b Reset logging level in esphome test (#143291) 2025-04-19 23:59:45 +02:00
Norbert Rittel ec55f716e1 Use common state for "Error" in fronius (#143284) 2025-04-19 23:06:44 +02:00
Thomas55555 012f6b660c Add more states to error sensor in Husqvarna Automower (#143270)
* Add more states to error sensor in Husqvarna Automower

* Use new common state

* tests and duplicates
2025-04-19 21:16:01 +02:00
Norbert Rittel 9de136789c Use common state for "Error" in blue_current (#143274) 2025-04-19 21:13:52 +02:00
Thomas55555 84a8c1312f Add entity categories to Husqvarna Automower sensors (#143277) 2025-04-19 21:13:24 +02:00
Norbert Rittel 21f9ad3994 Use common state for "Error" in home_connect (#143276) 2025-04-19 21:13:09 +02:00
Norbert Rittel a9e77dc0db Use common state for "Error", fix sentence-casing in tplink_omada (#143278)
* Use common state for "Error", fix sentence-casing in `tplink_omada`

- replace "Error" with common state reference
- correct missing sentence-casing in several strings

* Update test_switch.ambr
2025-04-19 21:12:14 +02:00
Abílio Costa 626eb77060 Replace literals with consts in Govee Light Local tests (#143280) 2025-04-19 21:11:36 +02:00
Abílio Costa 7674f6b5aa Turn on after setting parameters in Govee Light Local (#143233) 2025-04-19 19:56:56 +01:00
Norbert Rittel 16c72c491d Use common state for "Error" in lawn_mower (#143266) 2025-04-19 21:23:51 +03:00
Norbert Rittel 99e1245c9b Use common state for "Error" in vacuum (#143265) 2025-04-19 21:22:04 +03:00
tdfountain f42b137c1b Add missing data description strings of config flow for NUT (#143267) 2025-04-19 07:27:03 -10:00
Maciej Bieniek 4e852911aa Add tracker power saving binary sensor to Tractive integration (#142718)
* Add power saving binary sensor

* Update tests

* tracker_state_reason is not always present in hardware event
2025-04-19 17:30:15 +02:00
Paulus Schoutsen 30ab068bfe Wyoming to use tokens instead of media source IDs for TTS (#139668)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-04-19 12:50:41 +02:00
Tsvi Mostovicz 6499ad6cdb Cleanup tests for Jewish calendar integration (#138793) 2025-04-19 12:46:04 +02:00
Paulus Schoutsen 6f99b1d69b TTS to use ffmpeg in streaming fashion (#140536) 2025-04-19 12:41:52 +02:00
J. Nick Koston 42c4ed85a1 Remove legacy format exception for ESPHome entity naming (#143049) 2025-04-19 12:41:07 +02:00
J. Nick Koston 3e3697dc7a Add reconfigure support to ESPHome (#143132) 2025-04-19 12:40:07 +02:00
epenet ff1ab1da37 Decouple service registration in Renault (#143210) 2025-04-19 12:36:54 +02:00
Allen Porter 3da77726d0 Allow selection of multiple LLM APIs in Anthropic (#143190) 2025-04-19 12:34:51 +02:00
Josef Zweck 879cdcc0a4 Filter media players in browse media action to supported feature (#143183) 2025-04-19 12:31:39 +02:00
Josef Zweck 9b8a35dbb3 Add sensors to lamarzocco (#143156)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-04-19 12:30:22 +02:00
Josef Zweck 7c7f18b501 Add preinfusion settings to lamarzocco (#143159) 2025-04-19 12:29:08 +02:00
Sid 6e8c971038 Initialize time _attr_native_value with None (#143171) 2025-04-19 12:08:29 +02:00
Josef Zweck 09131d8647 Add more features to lamarzocco updates (#143157) 2025-04-19 12:07:11 +02:00
J. Nick Koston 930fa18224 Avoid creating ClientTimeout object on every hassio ingress request (#143254) 2025-04-19 12:05:27 +02:00
Josef Zweck 9c9c115d1a Add websocket connectivity binary sensor to lamarzocco (#143161) 2025-04-19 11:52:56 +02:00
K b6e9643586 Continue conversation with full-width question mark support (#143078) 2025-04-19 11:51:56 +02:00
LG-ThinQ-Integration 83f2acddf8 Raise ConfigEntryNotReady mqtt setup fails In LG ThinQ (#140488)
Co-authored-by: yunseon.park <yunseon.park@lge.com>
2025-04-19 11:50:13 +02:00
MichaelMKKelly 35f9cc55f1 Fix Automation/Script: sequence within a parallel ignoring enabled flag (#142977)
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-04-19 11:49:05 +02:00
Allen Porter 4483025856 Update Google Generative AI to allow multiple LLM APIs (#143191) 2025-04-19 11:44:12 +02:00
Allen Porter 61e4be4456 Update OpenAI conversation agent to allow multiple LLM APIs (#143189) 2025-04-19 11:43:27 +02:00
Retha Runolfsson f11f4510a2 Add switchot switches unit test with restore state (#143250) 2025-04-19 11:39:52 +02:00
Norbert Rittel b3c3be0483 Add common state for "Error" (#143139) 2025-04-19 11:32:05 +02:00
Brett Adams 7c3df46570 Add typed listeners to Teslemetry binary sensor platform (#142238) 2025-04-19 11:29:14 +02:00
Josef Zweck 44450f9d7d Fix reconfigure flow for lamarzocco (#143152) 2025-04-19 11:07:45 +02:00
Brett Adams c34e280fc2 Add typed listeners to Teslemetry sensor platform (#142236) 2025-04-19 10:56:29 +02:00
J. Nick Koston aef266b940 Refactor live history and logbook to avoid unnecessary task creation for recorder sync (#143244) 2025-04-19 10:55:11 +02:00
G Johansson f873219d25 Bump pysmhi to 1.0.2 (#143007)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-04-18 22:45:09 -10:00
Louis Christ 7de5646d6b Bump pyblu to 2.0.1 (#143178) 2025-04-19 10:41:50 +02:00
puddly 1e89f3ec9a Bump ZHA to 0.0.56 (#143165)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-04-19 10:38:34 +02:00
Joost Lekkerkerker d8d9449e2b Fix SmartThings soundbar without media playback (#143170) 2025-04-19 09:53:31 +02:00
Marc Mueller 850d9a0254 Update types packages (#143187) 2025-04-19 09:52:09 +02:00
tmenguy c422bcf1e2 Make renault scan interval dynamic (#142964)
Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>
2025-04-19 09:51:41 +02:00
Retha Runolfsson 27b7fb6f91 Add humidifier unit test for switchbot (#143207) 2025-04-19 09:48:01 +02:00
Mick Vleeshouwer 302dbc424b Add device class and options to sensor defect for Overkiz (#143241) 2025-04-19 06:51:33 +02:00
J. Nick Koston a7922690c4 Adjust cover reproduce state to prefer setting positions if supported (#143226) 2025-04-18 11:34:33 -10:00
Mick Vleeshouwer 5541de2bcb Fix state class for tariff sensor in Overkiz (#143234) 2025-04-18 22:15:35 +02:00
Mick Vleeshouwer 4c14184111 Add native units, device classes, and state classes for consumption sensors in Overkiz (#143239) 2025-04-18 22:13:49 +02:00
Mick Vleeshouwer d78f63e4d0 Add device class for outlet engine sensor in Overkiz integration (#143238) 2025-04-18 22:12:30 +02:00
Mick Vleeshouwer f38d50b928 Add duration device class and unit of measurement for Overkiz (#143237) 2025-04-18 22:11:51 +02:00
Mick Vleeshouwer 5c5b832d01 Add device class for moisture detection in Overkiz binary sensors (#143236) 2025-04-18 22:11:06 +02:00
Jan Bouwhuis 2b4c5178f4 Fix Intergas climate entity category (#143240) 2025-04-18 22:09:50 +02:00
J. Nick Koston 59588f960d Fix flakey Bluetooth options flow tests (#143215) 2025-04-18 10:08:17 -10:00
Joost Lekkerkerker d3b335f53f Fix missing binary sensor for CoolSelect+ in SmartThings (#143216) 2025-04-18 20:41:18 +03:00
Josef Zweck c3037bae39 Add service definition for user facing action to media player search (#143177)
* Add service definition for user facing action to media player search

* add filter

* Reorder and update fields in services.yaml
2025-04-18 15:07:46 +02:00
J. Nick Koston 9b1ab34352 Fix hassio mocking in ESPHome dashboard tests (#143212) 2025-04-18 14:11:36 +02:00
J. Nick Koston 221a8597da Make unknown media source exception translatable (#143208) 2025-04-18 01:17:56 -10:00
J. Nick Koston 45022752a0 Make remaining ESPHome exceptions translatable (#143184) 2025-04-17 22:22:08 -10:00
J. Nick Koston aa342eb476 Add additional config entry typing to ESPHome (#143126) 2025-04-17 22:03:52 -10:00
J. Nick Koston 32b26b8270 Add icons for ESPHome entities (#143202) 2025-04-17 21:56:11 -10:00
J. Nick Koston e07c29caad Small improvements to ESPHome setup (#143204) 2025-04-17 21:51:16 -10:00
J. Nick Koston b487c12ab1 Remove unreachable code in ESPHome media_players (#143203) 2025-04-17 21:51:03 -10:00
J. Diego Rodríguez Royo 60293648dc Create Home Connect active and selected program entities only when there are programs (#143185)
* Create active and selected program entities only when there are programs

* Test improvements
2025-04-18 00:09:52 +02:00
Abílio Costa e7994b3da1 Fix missing go2rtc dependency in non-docker setups (#143172) 2025-04-17 10:03:47 -10:00
Josef Zweck b88bf74e13 Cleanup lamarzocco tests (#143176) 2025-04-17 20:53:47 +02:00
peteS-UK 8355727eb1 Fix for media content type case in Squeezebox (#143099) 2025-04-17 18:56:28 +02:00
Marc Mueller c7290908cc Update mypy-dev 1.16.0a8 (#143166) 2025-04-17 18:13:00 +02:00
Abílio Costa 1307cd4b10 Add bronze quality scale for Whirlpool (#142752) 2025-04-17 15:31:12 +01:00
Abílio Costa c0b2193718 Use freezer for time change in Whirlpool config flow test (#143162) 2025-04-17 16:14:21 +02:00
Abílio Costa f9bb7e404e Improve Whirlpool config flow test completeness and naming (#143118) 2025-04-17 13:40:57 +01:00
Josef Zweck bbb8a1bacc Migrate lamarzocco to pylamarzocco 2.0.0 (#142098)
* Migrate lamarzocco to pylamarzocco 2.0.0

* bump manifest

* Remove CONF_TOKEN

* remove icons

* Rename coordiantor

* use none for token

* Bump version

* Move first get settings

* remove sensor snapshots

* Change iot_class from cloud_polling to cloud_push

* Update integrations.json

* Re-add release url

* Remove extra icon, fix native step

* fomat

* Rename const

* review comments

* Update tests/components/lamarzocco/test_config_flow.py

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

* add unique id check

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-04-17 13:34:06 +02:00
Petar Petrov 0aaa4fa79b Create empty Z-Wave JS device on smart start provisioning (#140872)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-04-17 13:18:48 +02:00
Paul Bottein 4ed81fb03f Use firmware name from device class for matter update entity (#143140)
* Use firmware name from device class for matter update entity

* Update tests
2025-04-17 12:50:10 +02:00
Åke Strandberg 7d13c2d854 Add miele diagnostics platform (#142900) 2025-04-17 11:42:07 +02:00
Petar Petrov cadbb623c7 New ZWave-JS migration flow (#142717)
* ZwaveJS radio migration flow

* Partial migration flow

* basic migration flow

* report exact progress to frontend

* Display backup file path

* string tweak

* update tests

* improve exception handling

* radio -> controller

* test tweak

* test tweak

* clean up and test error handling

* more tests

* test progress

* PR comments

* fix tests

* test restore progress

* more coverage

* coverage

* coverage

* make mypy happy

* PR comments

* Apply suggestions from code review

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

* ruff

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-04-17 10:14:47 +02:00
J. Nick Koston 4d959fb91c Bump esphome-dashboard-api to 1.3.0 (#143128) 2025-04-17 09:57:55 +02:00
J. Nick Koston 1fb3d8d601 Bump habluetooth to 3.39.0 (#143125) 2025-04-17 09:56:38 +02:00
J. Nick Koston dd4334e3ba Bump yarl to 1.20.0 (#143124) 2025-04-17 09:55:30 +02:00
Sid 5eee47d1e4 Bump eheimdigital to 1.1.0 (#143138) 2025-04-17 09:44:40 +02:00
Arjan 54def1ae0e Meteofrance: adding new states provided by MF API since mid April (#143137) 2025-04-17 08:47:37 +02:00
J. Nick Koston 6a36fc75cf Fix flakey ESPHome dashboard tests (attempt 2) (#143123)
These tests do not need a config entry, only the integration
to be set up. Since I cannot replicate the issue locally after
1000 runs, I switched it to use async_setup_component to minimize
the potential problem area and hopefully fix the flakey test

I also modified the test to explictly set up hassio to ensure
the patch is effective since we have to patch a late import

last observed flake: https://github.com/home-assistant/core/actions/runs/14503715101/job/40689452294?pr=143106
2025-04-17 08:36:34 +02:00
Josef Zweck bf69d4e0a8 Add search to media_player (#140321)
* Add search to media_player

* rename attr

* Add searchable property

* add pagination parameters

* Add suggested changes

* Apply suggestions

* Fix cast tests

* Fix first set of components

* update snapshot

* More tests

* more test fixes

* Rename attr

* first own test

* Add to google test

* Add service test

* Rename search query arg

* Add required feature to search service

* remove kwarg

* Update homeassistant/components/media_player/__init__.py

Co-authored-by: Marcel van der Veldt <m.vanderveldt@outlook.com>

* fix hue test

---------

Co-authored-by: Marcel van der Veldt <m.vanderveldt@outlook.com>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2025-04-16 23:09:16 +02:00
Eric Park fe248a2ebd Keep track of last play status update time in Apple TV (#142838) 2025-04-16 22:41:32 +02:00
Norbert Rittel 49ad9a8bd5 Use common states for "Auto" and "Manual" in smartthings (#142976) 2025-04-16 22:28:34 +02:00
Franck Nijhof fa75b477e9 Add device class for fuel sensor in StarLine integration (#143111) 2025-04-16 22:11:14 +02:00
Guido Schmitz 3c1d93f503 Use entity_registry_enabled_by_default fixture in devolo Home Network (#143108) 2025-04-16 21:12:50 +02:00
Norbert Rittel 21fabd3afa Use common state for "Manual" in tolo (#143104) 2025-04-16 21:47:07 +03:00
Norbert Rittel 0ec4652b52 Use common state for "Manual", unify intercardinal directions in netatmo (#143062)
In US English the intercardinal directions (Northeast, Southwest, etc.) are written in single words, not using hyphens. That can be adapted in Lokalise for Home Assistant's "English (United Kingdom)" UI language.

Making them identical in both occurrences also resolves the missing sentence-casing of "North-East" etc.
2025-04-16 21:44:24 +03:00
Abílio Costa e901dc4ec4 Move _attr_should_poll to base Whirlpool entity class (#143100) 2025-04-16 21:43:38 +03:00
Artur Pragacz 9d02436a72 Remove outdated test for locks (#143061)
Co-authored-by: Franck Nijhof <git@frenck.dev>
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-04-16 18:34:14 +01:00
Guido Schmitz 9fb7542a6f Remove old test in devolo Home Network (#143095) 2025-04-16 17:29:44 +01:00
Norbert Rittel ddf37a847d Use common state for "Manual", fix sentence-casing in homekit_controller (#143083) 2025-04-16 06:19:43 -10:00
Evan Graham 024ec2b153 OpenAI Conversation: Add web search support for new models (#143054)
Use a list of openai models for web search support in openai_conversation
2025-04-16 18:08:36 +02:00
Alex Meridian f8b56c460e Update blueprint syntax (#135050) 2025-04-16 15:41:14 +02:00
Guido Schmitz 42277955fa Use icon translations in devolo Home Network device tracker (#143089) 2025-04-16 15:38:26 +02:00
Abílio Costa 950c332e36 Fix wrong return type in Whirlpool test helper (#143085) 2025-04-16 14:10:25 +02:00
Simone Chemelli 44d6f0bc2b Increase uptime deviation for Shelly (#142996)
* Increase uptime deviation for Shelly

* fix test

* make troubleshooting easy

* change deviation interval

* increase deviation to 1m
2025-04-16 14:02:27 +02:00
rappenze 9bff88ad3e Add diagnostics to fibaro integration (#143003)
* Add diagnostics to fibaro

* Enhance diagnostic test

---------

Co-authored-by: Josef Zweck <josef@zweck.dev>
2025-04-16 14:52:42 +03:00
Guido Schmitz 8de23b9559 Raise on failed switching in devolo Home Network (#143072) 2025-04-16 13:49:37 +02:00
Abílio Costa fbba0d9a21 Remove unused fixtures from Whirlpool (#143082) 2025-04-16 13:39:28 +02:00
Abílio Costa 5beb415ada Refactor Whirlpool climate tests (#142689) 2025-04-16 12:03:40 +01:00
Franck Nijhof 187024367a Reduce jumping Starlink uptime sensor (#143076) 2025-04-16 12:23:54 +02:00
Norbert Rittel e6262de5ab Use common state for "Manual" in homee (#143063) 2025-04-16 12:44:14 +03:00
Maksim Doroshko c96bb45940 Use pyephember2 library in ephember (#140459)
* multiple homes support, all zones visible

* Update homes and zones

* set zone, target temp, curent temp, hot water type fixes

* Hotwater devices added

* Mode ajust

* next version could be 0.4.4

* depricated climate feature removed ClimateEntityFeature

* Migrate to pyephember2

* HEAT_COOL mode

* Revert EPH_TO_HA_STATE to HEAT_COOL

* homes and ember declaretion removed

* cleaning try catch blocks, flatten list on zones

* refactored

* Version updated

* try catch returned

* pyephember2==0.4.12

* Update homeassistant/components/ephember/climate.py

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

* reverting unique_id and depricated vClimateEntityFeature.AUX_HEAT

* Update homeassistant/components/ephember/climate.py

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

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-04-16 10:43:39 +02:00
Joost Lekkerkerker 50796a6a77 Grade Syncthru on the quality scale (#142829)
* Grade Syncthru on the quality scale

* Update homeassistant/components/syncthru/quality_scale.yaml

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

* Update homeassistant/components/syncthru/quality_scale.yaml

---------

Co-authored-by: Josef Zweck <josef@zweck.dev>
2025-04-16 10:42:41 +02:00
J. Nick Koston 0fb0e132b6 Explictly set PARALLEL_UPDATES in ESPHome assist_satellite entity platform (#143068) 2025-04-15 21:39:47 -10:00
Norbert Rittel 494a991d10 Use common states for "Auto" / "Manual" in lametric (#143066) 2025-04-16 09:25:37 +02:00
J. Nick Koston c32654db18 Add translated exception for ESPHome action call failures (#143067) 2025-04-15 21:19:05 -10:00
J. Nick Koston f4e7ccfcfc Explictly set PARALLEL_UPDATES for ESPHome entity platforms (#143065) 2025-04-15 21:11:05 -10:00
J. Nick Koston 4a4cbe011a Bump aioesphomeapi to 30.0.1 (#143056) 2025-04-16 08:00:20 +02:00
J. Nick Koston f68111c59f Fix flakey ESPHome dashboard setup test (#143057) 2025-04-16 07:59:09 +02:00
Kamil Breguła 1d845623a8 Add links to enable Google Calendar API (#142377)
* Add links to enable Google Calendar API

* Update tests
2025-04-15 21:24:32 -06:00
Marc Mueller a93121a88d Add Python-2.0 to list of approved licenses (#143052) 2025-04-16 00:27:07 +02:00
J. Nick Koston 4ea1d88826 Improve ESPHome strings (#143048) 2025-04-15 11:35:20 -10:00
RogerSelwyn a87b6fee89 Update sky_hub to remove codeowner (#143047) 2025-04-15 22:57:45 +02:00
Norbert Rittel 9baf5ad404 Use common states for "Auto" and "Manual" in flipr (#143011) 2025-04-15 22:39:20 +02:00
Norbert Rittel 5fd7306446 Use common state for "Auto" in wolflink (#143014) 2025-04-15 22:38:57 +02:00
Norbert Rittel 3a8828325a Use common state for "Auto", fix sentence-casing of "QR code" in romy (#143016) 2025-04-15 22:38:06 +02:00
Norbert Rittel 57bf59f6bd Use common state for "Auto" in xiaomi_miio (#143015) 2025-04-15 22:37:21 +02:00
Franck Nijhof f0d81d077f Adjust issue template to assign Bug issue type (#143017) 2025-04-15 22:09:59 +02:00
Norbert Rittel bb5aefb9e4 Use common state for "Manual" in hive (#143009) 2025-04-15 21:44:41 +03:00
Norbert Rittel 6a1739e883 Use common state for "Auto", fix casing in mqtt (#143000)
- use the (new) common state for "Auto"
- capitalize one occurrence of "mqtt"
- (fully) sentence-case two title strings

Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-04-15 20:24:44 +02:00
J. Nick Koston ae306893ff Handle name conflicts in ESPHome config flow (#142966) 2025-04-15 08:09:51 -10:00
Norbert Rittel 5fd17d092b Use common states for "Auto" and "Manual" in overkiz (#143005) 2025-04-15 20:56:58 +03:00
Norbert Rittel fad1d7bd1f Use common state for "Auto" in iron_os (#143001) 2025-04-15 19:30:05 +02:00
Norbert Rittel dcf7520d2a Use common states for "Low", "Medium", "High" and "Auto" in tuya (#143002) 2025-04-15 19:29:15 +02:00
rappenze 998b33c207 Fix device creation in fibaro integration (#142957)
* Fix device creation in fibaro integration

* Better naming
2025-04-15 18:41:53 +02:00
Abílio Costa 7b3e7b7aea Remove uneeded setdefault from Whirlpool config entry (#142999) 2025-04-15 18:03:51 +02:00
Simone Chemelli 09a86d2ed2 Add quality scale to UptimeRobot (#142912)
* Add quality scale (gold) to UptimeRobot

* todos

* tweak

* tweak comment

* update after #142940

* improve comment

* update as per review comment

* one more comment

* update reconfiguration use case
2025-04-15 17:01:38 +02:00
Sid 285f7ec696 Add number platform to eheimdigital (#142835)
* Add number platform to eheimdigital

* Pylint

* Review

* Update homeassistant/components/eheimdigital/number.py

* Update homeassistant/components/eheimdigital/number.py

* Review

---------

Co-authored-by: Josef Zweck <josef@zweck.dev>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-04-15 16:45:56 +02:00
Brian Choromanski 595508bf7d Check that time_pattern interval matcher is not zero (#142630)
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-04-15 14:50:11 +01:00
starkillerOG 2074c7fcee Bump reolink-aio to 0.13.2 (#142985) 2025-04-15 15:03:47 +02:00
Simone Chemelli 759d8a3f90 Code optimization for UptimeRobot binary (#142986) 2025-04-15 12:07:48 +02:00
cdheiser f2fa583101 Bump lutron's dependency on pylutron to 0.2.17 (#142953)
* Bump lutron's dependency on pylutron to 0.2.17

This fixes https://github.com/home-assistant/core/issues/127672

* Bump to pylutron 0.2.18 (0.2.17 has a bug with smartquotes that 0.2.18 fixes)

---------

Co-authored-by: cdheiser <cdheiser@users.noreply.github.com>
2025-04-15 10:41:56 +02:00
dependabot[bot] 18feb4bb81 Bump codecov/codecov-action from 5.4.0 to 5.4.2 (#142974)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5.4.0 to 5.4.2.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v5.4.0...v5.4.2)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-version: 5.4.2
  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-04-15 10:40:12 +02:00
Norbert Rittel b49a60fa3e Use common state for "Auto" in roborock (#142972)
Also moved the "off" state to the top to group the common states a bit.
2025-04-15 09:56:40 +02:00
Simone Chemelli fa81a83893 Fix switch state for Comelit (#142978) 2025-04-15 09:55:16 +02:00
Norbert Rittel 942bf2ef78 Use common state for "Auto" in lg_thinq (#142973) 2025-04-15 08:45:37 +02:00
J. Nick Koston a9d4b1afe4 Bump zeroconf to 0.146.5 (#142962) 2025-04-15 08:19:48 +02:00
Norbert Rittel cdd8ba78e7 Use common state for "Auto" in climate (#142948) 2025-04-15 08:18:08 +02:00
Norbert Rittel 254d4c6534 Use common state for "Auto" and fix sentence-casing in tado (#142969) 2025-04-15 08:17:03 +02:00
Norbert Rittel 33a0db3935 Use common state for "Auto" and fix sentence-casing in plugwise (#142970) 2025-04-15 08:16:27 +02:00
Norbert Rittel 514f83cc96 Use common state for "Auto" in reolink (#142971)
The common state replaces the internal references, too.
2025-04-15 08:12:30 +02:00
Marc Mueller 4950bda406 Fix homeaticip_cloud RuntimeWarnings (#142961) 2025-04-14 23:32:52 +02:00
Norbert Rittel 9e9be6055d Use common state for "Auto" in knx (#142959) 2025-04-14 23:19:25 +02:00
Norbert Rittel c9ccc79789 Use common state for "Auto" in vesync (#142958) 2025-04-14 22:53:01 +02:00
G Johansson 3fab596518 Bump holidays to 0.70 (#142954) 2025-04-14 22:52:21 +02:00
Ville Skyttä 3378b8d7ce Simplify huawei_lte entities event setup (#142501) 2025-04-14 22:31:27 +02:00
Alex L 881079ccc1 Update UK Transport Integration URL (#142949) 2025-04-14 22:22:53 +02:00
starkillerOG cf1cbc6d75 Add Reolink recording packing time (#142847) 2025-04-14 22:22:21 +02:00
Michael e418491f19 Add support for device sub units in AVM Fritz!SmartHome (#142845) 2025-04-14 22:19:14 +02:00
Norbert Rittel a4f75ca249 Use common states "Auto" and "Manual" in osoenergy (#142950) 2025-04-14 22:18:03 +02:00
Norbert Rittel 6ba2d0be31 Replace reference from climate with common "Auto" state in baf (#142936) 2025-04-14 22:17:21 +02:00
Norbert Rittel fb2a671e86 Use common state for "Auto" in matter (#142947) 2025-04-14 21:42:35 +02:00
J. Nick Koston 8cb62341ef Fix race to rename entity (#142584) 2025-04-14 21:42:23 +02:00
Simon Lamon 074378bef6 Bump python-linkplay to 0.2.3 (#142571) 2025-04-14 21:40:32 +02:00
Guido Schmitz a772832917 Bump devolo_plc_api to 1.5.1 (#142908) 2025-04-14 21:24:52 +02:00
Norbert Rittel cf467b8593 Use common state for "Auto" in sensibo (#142941) 2025-04-14 20:57:15 +02:00
Norbert Rittel b4a3470cb9 Use common states for "Auto" and "High" in palazzetti (#142945) 2025-04-14 20:50:59 +02:00
Norbert Rittel e44d86479e Use common state for "Auto" in airzone_cloud (#142944) 2025-04-14 20:40:38 +02:00
Norbert Rittel 42345d9a06 Use common states for "Auto"/"Manual" in huawei_lte (#142943) 2025-04-14 18:21:40 +00:00
starkillerOG 40fd7cf852 Select correct Reolink device uid (#142864)
* Select correct device_uid

* Fix styling

* restructure

* Add test

* Update test_util.py

* Add explanation string
2025-04-14 20:12:34 +02:00
J. Nick Koston 870350b961 Add async_has_entity_registry_updated_listeners (#142772) 2025-04-14 19:45:09 +02:00
Simone Chemelli 198a6b2e8f Add missing strings to UptimeRobot (#142921) 2025-04-14 19:37:01 +02:00
Simone Chemelli 0479fc6f54 Remove redundant logging from UptimeRobot config_flow (#142940) 2025-04-14 19:35:30 +02:00
Norbert Rittel be6e1e5e15 Use common states "Auto"/"Manual", fix sentence-casing in yamaha_musiccast (#142931) 2025-04-14 19:29:22 +02:00
J. Nick Koston 9ce44845fe Add a repair for ESPHome device conflicts (#142507) 2025-04-14 07:10:05 -10:00
Joost Lekkerkerker 1463f05d46 Restore python 3.13.2 requirement (#142932) 2025-04-14 18:56:54 +02:00
Norbert Rittel 49a9923b5c Use common state for "Auto" in humidifier (#142937) 2025-04-14 17:50:20 +01:00
Norbert Rittel 23844c0f1a Use common state for "Auto", fix sentence-casing in demo (#142934) 2025-04-14 17:41:20 +01:00
cdnninja 82efa0893f Vesync Display Switch Feature (#137493)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-04-14 17:26:21 +02:00
Simone Chemelli 9e93d1fd7e Introduce common base entity for Comelit bridge (#142855) 2025-04-14 17:17:06 +02:00
Norbert Rittel 0a424f53b1 Add common states for "Auto" and "Manual" (#142914) 2025-04-14 16:52:31 +03:00
Hervé Cauwelier efc44d83bb Add wind gust attribute to Météo France weather entity (#136839) 2025-04-14 15:41:10 +02:00
Petro31 9b274a0bc4 Correct template fan optimistic mode and supported features (#142414) 2025-04-14 15:40:29 +02:00
Barry vd. Heuvel aeca2842fe Add WeHeat Flow sensors for pumps (#139390)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-04-14 15:39:44 +02:00
Emily Love Watson d44d07ffcf Kulersky refactor to new Bluetooth subsystem (#142309)
Co-authored-by: J. Nick Koston <nick@koston.org>
2025-04-14 15:38:34 +02:00
Lachlan Banks bc683ce6ee Bump qbittorrent-api to 2024.9.67 (#142588) 2025-04-14 15:37:57 +02:00
Paulus Schoutsen c6abe1d1bb Remove the word "node" from ESPHome texts (#142929) 2025-04-14 15:28:02 +02:00
karwosts 6a95abb831 Add effects translation/icon for Demo light (#142862) 2025-04-14 15:14:00 +02:00
hahn-th 6d74a6aa19 Refactor homematicip_cloud connection (#139081) 2025-04-14 15:01:55 +02:00
Joost Lekkerkerker 83c3275054 Remove deprecated state attributes in seventeentrack (#142622) 2025-04-14 14:40:08 +02:00
Joost Lekkerkerker b3eb0301ae Remove YAML import in Point (#142627) 2025-04-14 14:37:45 +02:00
Joost Lekkerkerker f00dfd32d4 Remove config import in EmonCMS (#142624) 2025-04-14 14:30:41 +02:00
Paul Bottein 8ec436423f Add template function: device_name (#142683) 2025-04-14 14:30:00 +02:00
Marc Mueller 5f2ae37ee5 Improve backup tests (#142785) 2025-04-14 14:26:29 +02:00
J. Nick Koston 514363f1c5 Use configured names in HomeKit for child accessories (#142531) 2025-04-14 14:24:43 +02:00
cdnninja f84f6aa713 Fix vesync purifier 131 tests (#142860) 2025-04-14 13:58:54 +02:00
Thomas55555 b5f15b6d67 Bump aioautomower to 2025.4.0 (#142609) 2025-04-14 13:51:55 +02:00
Stefano Angeleri c8972a2234 Fix powerwall display of actual remaining battery, instead of reserved capacity (#142391) 2025-04-14 12:59:28 +02:00
J. Nick Koston 1892c8fa62 Bump habluetooth to 3.38.1 (#142915) 2025-04-14 00:40:55 -10:00
Norbert Rittel 589633bc23 Fix spelling of "off-peak" in huisbaasje (#142810) 2025-04-14 12:38:26 +02:00
Mathijs van de Nes 458162c3f5 Fix typo in util.ssl test (#142799) 2025-04-14 12:31:44 +02:00
Joost Lekkerkerker 583eb1a80e Remove state attributes in Totalconnect (#142625) 2025-04-14 12:24:32 +02:00
Tsvi Mostovicz 1480b77461 Don't do I/O while getting Jewish calendar data schema (#142919) 2025-04-14 12:15:46 +02:00
J. Nick Koston 908a7c6991 Fix flakey bluetooth options flow tests (#142920) 2025-04-14 12:07:47 +02:00
J. Nick Koston 53b991fb54 Add preset modes to HKC fans (#142528) 2025-04-14 11:40:54 +02:00
Norbert Rittel 35187a4b52 Fix typo "Could not login …" and add common state in xiaomi_miio (#142648) 2025-04-14 11:39:19 +02:00
J. Nick Koston 621326f4e4 Small cleanups to the inkbird coordinator (#142911) 2025-04-13 23:27:46 -10:00
J. Nick Koston a6643d8fb3 Add support for InkBird IAM-T1 (#142824) 2025-04-13 22:31:38 -10:00
Petar Petrov 9239ace1c8 Config flow progress in percent (#142737)
* Config flow progress in percent

* PR comments
2025-04-14 10:24:01 +02:00
Simone Chemelli 422bcecec1 Add quality scale to Comelit (#139743)
* Add quality scale to Comelit

* tweek

* updates

* update

* update manifest

* tweak

* update after latest merges

* update quality scale

* tweak

* apply review comments

* apply review comment

* one more review comment
2025-04-14 10:18:33 +02:00
J. Nick Koston 6f02550ac3 Include HKC BLE MAC in device info when available (#141900)
* Include HKC BLE MAC in device info when available

* update tests

* cover

* dry

* dry

* dry
2025-04-14 10:14:48 +02:00
J. Nick Koston 1aa996d5f0 Add debug logging to homekit when an sensor entity cannot be classified (#142707)
* Add debug logging to homekit when an sensor entity cannot be classified

In #132937 many hours were spent investigating an issue which
turned out to be that the entity did not have a device class
at startup because the group integration does not set the device
class if any of the underlying entities state is invalid.

closes #132937

* coverage

* Update tests/components/homekit/test_get_accessories.py
2025-04-14 10:12:27 +02:00
J. Nick Koston a340646e1e Avoid starting ESPHome reauth when an unexpected device is found at the last address (#142814)
* Bump aioesphomeapi to 29.10.0

changelog: https://github.com/esphome/aioesphomeapi/compare/v29.9.0...v29.10.0

* Avoid starting ESPHome reauth when an unexpected device is found at the last address

fixes #133956

* coverage
2025-04-14 10:10:07 +02:00
Allen Porter db043b26da Fix quality loss for LLM conversation agent question answering (#142873)
* Fix a bug parsing a streaming response with no json

* Remove debug lines

* Fix  quality loss for LLM conversation agent question answering

* Update tests
2025-04-14 10:05:34 +02:00
J. Nick Koston 8767599ad4 Validate ESPHome mac address before updating IP on discovery (#142878)
* Bump aioesphomeapi to 29.10.0

changelog: https://github.com/esphome/aioesphomeapi/compare/v29.9.0...v29.10.0

* Validate ESPHome mac address before updating IP on discovery

In some cases the data coming in from discovery may be
stale since there is a small race window if devices
get new IP allocations. Since some routers do not update
their names right away and zeroconf has a non-zero TTL
there is a small window where the discovery data can be
stale. This is a rare condition but it does happen. With
aioesphomeapi 29.10.0+ and ESPHome 2025.4.x+ we can validate
the mac address even without the correct encryption key
which allows us to be able to always validate the MAC
before updating the IP from any discovery method.

* tweaks

* fix test
2025-04-14 10:02:46 +02:00
Joost Lekkerkerker 6d5c000e1f Set entity categories for some entities in Syncthru (#142828)
Set entity categories for some entities
2025-04-14 09:51:41 +02:00
Simone Chemelli 2750535928 Use runtime_data in UptimeRobot (#142848)
* Use runtime_data in UptimeRobot

* fix unload
2025-04-14 09:51:06 +02:00
Simone Chemelli 1e31e2944b Add parallel updates to UptimeRobot (#142849) 2025-04-14 09:50:29 +02:00
J. Nick Koston 8bcc4f4c82 Avoid setting up ESPHome dashboard if its been uninstalled (#142904)
* Avoid setting up ESPHome dashboard if its been uninstalled

* tweaks

* coverage

* coverage

* fix
2025-04-14 09:49:21 +02:00
Norbert Rittel bfc3080292 Use common states for "Low" / "Medium" / "High" in climate (#142842) 2025-04-14 09:42:05 +02:00
Mick Vleeshouwer 9bff86e7aa Bump pyOverkiz to 1.17.0 (#142854)
Bump pyoverkiz to 1.17.0
2025-04-14 09:41:07 +02:00
Retha Runolfsson 0689a6ed62 Bump PySwitchBot to 0.60.0 (#142905)
update pyswitchbot ver
2025-04-14 09:40:14 +02:00
starkillerOG 61f2251336 Fix Reolink Home Hub Pro playback (#142871)
Fix Home Hub Pro playback
2025-04-14 09:39:41 +02:00
Kevin Stillhammer 62a0932deb Only get tracked pairs for kraken (#142877)
Only get tracked pairs

Getting all available pairs leads to a too long request URL
2025-04-14 09:39:01 +02:00
J. Nick Koston 3389ee4b80 Bump inkbird-ble to 0.13.0 (#142885)
* Bump inkbird-ble to 0.12.0

changelog: https://github.com/Bluetooth-Devices/inkbird-ble/compare/v0.11.0...v0.12.0

* map discovery as well

* fix merge

* fix merge error

* bump again for more cleanups

* fix tests
2025-04-14 09:37:42 +02:00
Åke Strandberg cc6e2ef3f7 Spelling corrections in miele integration (#142907)
Spelling corrections
2025-04-14 09:36:02 +02:00
Glenn Waters 1a1c95af12 Bump Environment Canada library to 0.10.1 (#142882) 2025-04-13 18:39:50 -10:00
Allen Porter 658299ee21 Strip whitespace from new todo list item names (#142889)
Strip whitspace from new todo list item names
2025-04-13 17:42:42 -07:00
Allen Porter 5b8ca8d0ed Improve local calendar error logging when uploading invalid .ics files (#142891) 2025-04-13 17:42:24 -07:00
Allen Porter d91528648f Update ollama to allow selecting mutiple LLM APIs (#142445)
* Update ollama to allow selecting mutiple LLM APIs

* Update homeassistant/helpers/llm.py

* Avoid gather since these don't do I/O

---------

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2025-04-13 15:37:46 -07:00
J. Nick Koston 8b88272bc0 Add async_set_updated_data method to PassiveBluetoothProcessorCoordinator (#142879) 2025-04-13 11:08:22 -10:00
zry98 8ab59bee47 [xiaomi_ble] Support Body Composition Scale S400 (#142705) 2025-04-13 10:41:43 -10:00
J. Nick Koston 18c814d3dc Bump inkbird-ble to 0.11.0 (#142832) 2025-04-13 10:08:28 -10:00
Jan Bouwhuis 4f0928d93b Use existing translations for mqtt subentry platform selector (#142876) 2025-04-13 22:08:19 +02:00
J. Nick Koston 6c7865a247 Bump aioesphomeapi to 29.10.0 (#142813) 2025-04-13 10:08:01 -10:00
Jan Bouwhuis 7cf63d1985 Add transition and flash feature flags for MQTT JSON light (#142692) 2025-04-13 21:39:40 +02:00
Åke Strandberg 0b02b43b11 Add integration for Miele (#142498) 2025-04-13 21:09:41 +02:00
Simone Chemelli b25a0e2272 Small cleanup for Vodafone Station (#142867) 2025-04-13 18:57:00 +02:00
Thomas55555 6d78c961d9 Bump colorlog to 6.9.0 (#142616) 2025-04-13 16:10:52 +02:00
Simone Chemelli e370248c9e Use typed ConfigEntry in UptimeRobot (#142846) 2025-04-13 15:30:47 +02:00
Brett Adams 31c2d22912 Check Energy Live API works before creating the coordinator in Tessie (#142510)
* Check live API works before creating the coordinator

* Fix diag

* Fix mypy on entity

* is not None
2025-04-13 13:55:16 +02:00
Norbert Rittel 5eb25b2d4a Use common states for "Low"/"Medium"/"High" in sensibo (#142118) 2025-04-13 12:40:53 +02:00
Chase Mamatey 6737c51fca Fix duke_energy data retrieval to adhere to service start date (#136054) 2025-04-12 19:00:49 -04:00
Marc Mueller d23c9f715e Update beautifulsoup4 to 4.13.3 (#142751) 2025-04-12 12:04:50 -10:00
Marc Mueller 03ccb529e4 Update pillow to 11.2.1 (#142811) 2025-04-12 12:03:28 -10:00
zry98 505e09242d Bump xiaomi-ble to 0.37.0 (#142812) 2025-04-12 12:03:01 -10:00
Mathijs van de Nes d6b4f1c95d Ensure no ALPN is negotiated for SMTP (#142296) 2025-04-12 12:02:07 -10:00
Norbert Rittel 67c0af4c57 Fix spelling of "off-peak", add common state for "Normal" in plugwise (#142682) 2025-04-12 21:04:05 +02:00
Joost Lekkerkerker cba0cf0609 Migrate Syncthru to runtime data (#142775) 2025-04-12 20:59:59 +02:00
Joost Lekkerkerker b957017799 Clean up Syncthru unique id (#142778) 2025-04-12 20:50:37 +02:00
Joost Lekkerkerker ebe71a1a38 Add diagnostics support to Syncthru (#142776) 2025-04-12 20:22:12 +02:00
Joost Lekkerkerker 6feb9d4b4e Add entity translations to Syncthru (#142774)
* Add entity translations to Syncthru

* Add entity translations to Syncthru

* Fix
2025-04-12 20:19:49 +02:00
Ernst Klamer 06d6155862 add support for quadruple button events for xiaomi-ble (#142760)
* bump xiaomi-ble to 0.36.0

* fix ruff

* fix ruff

* revert dependency bump
2025-04-12 20:18:26 +02:00
J. Nick Koston f13bdd0da4 Add support for passing though description_placeholders to _abort_if_unique_id_configured (#142779) 2025-04-12 07:47:02 -10:00
Dionisis Toulatos 3489ea30dd Fix MQTT device discovery when using node_id (#142784)
* Fix device discovery when using node_id

* tests

---------

Co-authored-by: jbouwh <jan@jbsoft.nl>
Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
2025-04-12 19:30:06 +02:00
Marc Mueller d218ac85f7 Update pytest warnings filter (#142797) 2025-04-12 19:15:38 +02:00
peteS-UK 5129c7521b Force Squeezebox item id to string (#142793)
force item_id to string
2025-04-12 17:09:17 +02:00
J. Diego Rodríguez Royo eb19c7af32 Disable Home Connect appliance refresh when frequent disconnects are detected (#142615)
* Disable specific updates for an appliance when is done repeatedly

* Fix deprecation issues fix tests

* Fix message

* Avoid fetching appliance info also

* Apply suggestions

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

* Create specific RepairFlow for enabling appliance's updates

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-04-12 14:58:35 +02:00
J. Nick Koston 6b65b21ee0 Migrate inkbird to use entry.runtime_data (#142780) 2025-04-12 12:20:07 +02:00
Erik Montnemery 4eda081574 Remove unnecessary error handling from backup onboarding (#142786) 2025-04-12 11:01:41 +02:00
Erik Montnemery 234c4c1958 Move backup backup onboarding API to an onboarding platform (#142713)
* Move backup backup onboarding API to an onboarding platform

* Move additional test from onboarding to backup

* Remove backup tests from onboarding
2025-04-12 09:41:54 +02:00
Marc Mueller ad3c4d24b8 Update h2 to 4.2.0 (#142777) 2025-04-11 14:08:09 -10:00
J. Nick Koston ee37b32ca1 Log lutron_caseta exception on pairing failure (#140776) 2025-04-11 13:57:47 -10:00
Ernst Klamer 49721a541a bump xiaomi-ble to 0.36.0 (#142761) 2025-04-12 01:16:14 +03:00
Robert Svensson c18d96e2f5 UniFi redact WLAN password (#142767)
* Recact password key word in WLAN diagnostic data

* Fix testdata
2025-04-12 01:15:15 +03:00
Joost Lekkerkerker 3efb009e82 Introduce base entity in Syncthru (#142694) 2025-04-12 00:12:23 +02:00
Mathijs van de Nes b20f46e8b9 Add non-shared ssl client_context (#142653) 2025-04-11 10:55:05 -10:00
Marc Mueller 4f0ece1bb4 Update uiprotect to 7.5.3 (#142766) 2025-04-11 22:37:15 +02:00
J. Nick Koston 2c316c5820 Ensure person loads after recorder (#142585)
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-04-11 09:39:30 -10:00
Marc Mueller 9d10d8f55e Fix slack DeprecationWarnings (#142754) 2025-04-11 20:27:45 +02:00
Abílio Costa 0fcac987df Update strings for Whirlpool config flows (#142758) 2025-04-11 20:21:53 +02:00
Joost Lekkerkerker ffcc2254ce Refactor Syncthru binary sensor (#142696) 2025-04-11 19:40:37 +02:00
Manu b01eac3ba5 Fix error in recurrence calculation of Habitica integration (#142759)
Fix error in rrule calculation of Habitica integration
2025-04-11 19:39:40 +02:00
Simone Chemelli a3341c4330 Add full test coverage for Comelit humidifier platform (#141852)
* Add full test coverage for Comelit humidifier platform

* clean

* update snapshot

* apply review comment
2025-04-11 18:23:03 +02:00
Jeff Rescignano a4fac730d4 Upgrade sharkiq depedency to 1.1.0 (#142746) 2025-04-11 18:07:27 +02:00
Allen Porter ca07975ead Fix Anthropic bug parsing a streaming response with no json (#142745) 2025-04-11 17:30:12 +02:00
Michael 5a1a41beb1 Fix reload of AVM FRITZ!Tools when new connected device is detected (#142430) 2025-04-11 17:26:58 +02:00
Bram Kragten 20a3a061a1 Update frontend to 20250411.0 (#142736) 2025-04-11 17:25:26 +02:00
Joost Lekkerkerker 7b78f6db17 Fix SmartThings gas meter (#142741) 2025-04-11 17:24:39 +02:00
Simone Chemelli 5816a24577 Cleanup snapshot call in tests (#142750) 2025-04-11 17:21:12 +02:00
Joost Lekkerkerker 0e4f44b775 Bump pySmartThings to 3.0.4 (#142739) 2025-04-11 16:51:32 +02:00
Erik Montnemery 0105332476 Add WS command integration/wait (#142040)
* Add WS command integration/wait

* Add test

* Update homeassistant/components/websocket_api/commands.py

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

* Use helper setup.async_wait_component

* Add onboarding view

* Revert "Add onboarding view"

This reverts commit df3a1a05807ae18cac6455cf04ca0cd6bea31857.

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-04-11 16:09:15 +02:00
Erik Montnemery 4aca9cd66b Move cloud onboarding API to an onboarding platform (#141978)
* Move cloud onboarding API to an onboarding platform

* Address review comments

* Add tests

* Move cloud onboarding tests to the cloud integration

* Address review comments

* Don't wait for platforms

* Add test

* Remove useless check for CLOUD_DATA
2025-04-11 16:02:27 +02:00
Norbert Rittel a4234bf80e Add more state references to shelly (#142716)
- replace "Normal" with common state
- replace `self_test` state attributes with references
2025-04-11 16:39:44 +03:00
Norbert Rittel f42f698dbc Fix missing sentence-casing in a few plex strings (#142720) 2025-04-11 16:38:07 +03:00
Martin Hjelmare cd45c5d886 Avoid Z-Wave config entry unload in test teardown (#142732) 2025-04-11 16:37:47 +03:00
Simone Chemelli 2af6ee7584 Add missing typed to SamsungTV (#142738) 2025-04-11 15:19:21 +02:00
Erik Montnemery 3b437c9b84 Add onboarding view /api/onboarding/integration/wait (#142688) 2025-04-11 13:43:18 +02:00
Martin Hjelmare af8ecdd48d Improve Z-Wave reconfigure flow (#142475) 2025-04-11 12:15:11 +02:00
starkillerOG 16d9ccd423 Reolink migrate unique ID debugging (#142723)
* Filter out unexpected unique_ids

* correct

* Add test

* fix styling
2025-04-11 11:42:18 +02:00
Simone Chemelli e1d223f726 Add exceptions translation to SamsungTV (#142406)
* Add exceptions translation to SmasungTV

* Update strings.json

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

---------

Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2025-04-11 11:32:19 +02:00
Stefan Agner a4904a3f2d Bump aiohasupervisor from version 0.3.0 to version 0.3.1b1 (#142721) 2025-04-11 10:14:07 +01:00
Christopher Fenner dff7b30405 Bump PyViCare to 2.44.0 (#142701)
bump vicare to v2.44.0
2025-04-11 10:32:54 +02:00
starkillerOG a06cd770a4 Bump reolink-aio 0.13.1 (#142719) 2025-04-11 10:22:30 +02:00
Joost Lekkerkerker 56c4121eb2 Refactor Syncthru sensor platform (#142704) 2025-04-11 08:12:59 +02:00
Christopher Fenner f519b20495 Add device error sensor to ViCare integration (#142605)
* add error sensor

* remove translation
2025-04-11 08:11:53 +02:00
Jan Bouwhuis 32da8c52f7 Add test to assert different private key types are accepted and stored correctly in MQTT config flow (#142703) 2025-04-11 00:58:48 +02:00
Hugo van Rijswijk c6994731b1 Add Buienradar apparent temperature and forecast rain chance & wind gust (#135287)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-04-11 00:24:59 +02:00
Renier Moorcroft 2eb1041f4b Use sub stream as default option for EZVIZ (#136023) 2025-04-11 00:07:03 +02:00
Jan Bouwhuis 4ad5eb5a82 Fix EC certificate key not allowed in MQTT client setup (#142698) 2025-04-10 23:11:35 +02:00
Jan Bouwhuis ea38639395 Validate MQTT device tracker location data before assigning (#141980)
* Validate MQTT device tracker location data before assigning

* Log warning for invalid gps_accuracy
2025-04-10 22:32:17 +02:00
Joost Lekkerkerker bf0d2e9bd2 Extract Syncthru coordinator in separate file (#142620) 2025-04-10 21:24:38 +02:00
Simone Chemelli bb3c2175bc Comelit config flow timeout error (#142667) 2025-04-10 21:16:53 +02:00
Joost Lekkerkerker 6fafafbed0 Improve Syncthru config flow tests (#142618) 2025-04-10 21:16:12 +02:00
Norbert Rittel 8f73c53d26 Replace "Setup your …" with correct "Set up your …" in iometer (#142685) 2025-04-10 21:12:39 +02:00
Erik Montnemery 5a09847596 Add backup support to the hassio OS update entity (#142580)
* Add backup support to the hassio OS update entity

* Remove meaningless assert
2025-04-10 20:56:02 +02:00
Erik Montnemery cf63175232 Abort reauth flows on config entry reload (#140931)
* Abort reauth flows on config entry reload

* Don't cancel reauth when reload is triggered by a reauth flow

* Revert "Don't cancel reauth when reload is triggered by a reauth flow"

This reverts commit f37c75621e99d4c160c2c4adc9b36e52e4cc81ec.

* Don't fail in FlowManager._async_handle_step when the flow was aborted

* Update tplink config flow

* Add tests

* Don't allow create_entry from an aborted flow

* Add comment

* Adjust after merge with dev
2025-04-10 20:55:34 +02:00
Thimo Seitz 88428fc772 Update growatt server dependency to 1.6.0 (#142606)
* Update GrowattServer Dependency

* Update requirements_test_all.txt
2025-04-10 20:14:30 +02:00
Jan Bouwhuis 505dfcbcd9 Use shorthand attributes for MQTT device tracker entity (#142671) 2025-04-10 19:51:36 +02:00
Erik Montnemery 7cbcb21e80 Revert "Don't create repairs asking user to remove duplicate flipr config entries" (#142647)
Revert "Don't create repairs asking user to remove duplicate flipr config ent…"

This reverts commit 536e686892.
2025-04-10 19:50:50 +02:00
Erik Montnemery d4dbd76a0a Revert "Add onboarding view /api/onboarding/integration/wait" (#142680)
This reverts commit 956cac8f1aa57950e4469669d4440951faf8b77c.
2025-04-10 19:15:54 +02:00
Norbert Rittel 1d9343df7f Fixes to user-facing strings of rfxtrx integration (#142677)
- consistently use "RFXtrx" for the friendly name of the integration
- apply sentence-casing to all strings
- use the common state for "Normal"
2025-04-10 18:00:37 +02:00
Norbert Rittel c7ca88e666 Use common state for "Normal" in onedrive (#142673) 2025-04-10 17:47:02 +02:00
Artur Pragacz efbb94a1b1 Use common helper function in resolve integration dependencies (#140989)
Extract to helper function in resolve integration dependencies
2025-04-10 17:41:06 +02:00
Erik Montnemery eee6e8a2c3 Add WS command config_entries/flow/subscribe (#142459) 2025-04-10 16:58:46 +02:00
Abílio Costa a26cdef427 Refactor Whirlpool sensor tests (#142437) 2025-04-10 15:47:28 +01:00
Erik Montnemery a5013cddd5 Correct enum member check in home_connect (#142666)
* Correct enum member check in home_connect

* Update homeassistant/components/home_connect/coordinator.py

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

* Add mypy override

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-04-10 16:46:30 +02:00
Yuxin Wang 844515787b Fallback to config entry ID as unique ID when serialno is not available for APCUPSD (#130852) 2025-04-10 16:45:46 +02:00
Erik Montnemery d5476a1da1 Store update settings in hassio store (#142526) 2025-04-10 11:55:07 +02:00
Norbert Rittel 12ae70630f Fix sentence-casing and typo in elmax (#142650)
- change a few words to lowercase
- replace "login to" with "log in to"
2025-04-10 11:43:46 +02:00
Norbert Rittel 954a47d9ef Replace typo "login to" with "log in to" in fireservicerota (#142652)
Fix typo "login to" with "log in to" in `fireservicerota`
2025-04-10 11:43:16 +02:00
Norbert Rittel 6ed847f49e Fix typo "You can login to …" in opensky (#142649) 2025-04-10 11:39:59 +02:00
cnico ea50bbeb11 Flipr - Removal of obsolete code. (#142504)
Removal of obsolete code.
2025-04-10 10:48:03 +02:00
Christopher Fenner aefadd6684 Improve config flow title in ViCare integration (#142573)
* Update strings.json

* Update strings.json
2025-04-10 10:08:53 +02:00
Norbert Rittel 4096a8931a Use common state for "Off" in nut (#142643) 2025-04-10 10:08:12 +02:00
Thomas55555 d2bd0e8ca2 Bump livisi to 0.0.25 (#142638) 2025-04-10 10:05:38 +02:00
Joost Lekkerkerker e119675100 Remove deprecated aux heat from econet (#142626) 2025-04-10 10:03:22 +02:00
Norbert Rittel 5ff2608794 Use common state for "Normal" in ecovacs (#142642) 2025-04-10 10:02:30 +02:00
Norbert Rittel 96d1c9ab91 Use common state for "Normal" in yeelight (#142641)
* Use common state for "Normal" in `yeelight`

Also remove one excessive hyphen in "RGB format".

* Sentence-case "Color flow"
2025-04-10 10:02:10 +02:00
Norbert Rittel 60268e97d4 Fix sentence-casing and spelling in touchline_sl (#142644)
- use sentence-casing for "setup flow"
- replace "Login to … " with the verb "Log in to …"
2025-04-10 09:34:21 +02:00
Imeon-Energy b51bb668c6 Add imeon inverter integration (#130958)
* Initial commit prototype with empty inverters

* Use modern methods and global variable for character strings

* Platform that get the value of the meter in an entity

* Add check if inverter already configured

* Add tests for config_flow

* Update "imeon_inverter_api" in manifest.json

* Update "imeon_inverter_api" in requirements_all.txt

* Remove async_setup, clean comments, use of const PLATFORM

* Use of global variable and remove configuration of device name

* Use of entry.data instead of user_input variable

* Remove services.yaml

* No quality scale

* Use of common string

* Add sensors, use of EntityDescription and '_attr_device_info'

* Remove name from config_flow tests

* Use sentence case and change integration from hub to device

* Check connection before add platform in config_flow

* Use of _async_setup and minor changes

* Improve sensor description

* Add quality_scale.yaml

* Update the quality_scale.json

* Add tests for host invalid, route invalid, exception and invalid auth

* Type more precisely 'DataUpdateCoordinator'

* Don't use 'self.data' directly in coordinator and minor corrections

* Complete full quality_scale.yaml

* Use of fixtures in the tests

* Add snapshot tests for sensors

* Refactor the try except and use serial as unique id

* Change API version

* Add test for sensor

* Mock the api to generate the snapshot

* New type for async_add_entries

* Except timeout error for get_serial

* Add test for get_serial timeout error

* Move store data out of the try

* Use sentence case

* Use of fixtures

* Use separates fixtures

* Mock the api

* Put sensors fake data in json fixture file

* Use of a const interval, remove except timeout, enhance lisibility

* Try to use same fixture in test_config_flow

* Try use same fixture for all mock of inverter

* Modify the fixture in the context manager, correct the tests

* Fixture return mock.__aenter__ directly

* Adjust code clarity

* Bring all tests to either ABORT or CREATE_ENTRY

* Make the try except more concise

* Synthetize exception tests into one

* Add code clarity

* Nitpick with the tests

* Use unique id sensor

* Log an error on unknown error

* Remove useless comments, disable always_update and better use of timeout

* Adjust units, set the model and software version

* Set full name for Battery SOC and use ip instead of url

* Use of host instead of IP

* Fix the unit of economy factor

* Reduce mornitoring data display precision and update snapshots

* Remove unused variable HUBs

* Fix device info

* Set address label 'Host or IP'

* Fix the config_flow tests

* Re evaluate the quality_scale

* Use of 'host' instead of 'address'

* Make inverter discoverable by ssdp

* Add test ssdp configuration already exist

* Add exemption in quality scale

* Test abort ssdp if serial is unknown

* Handle update error

* Raise other exceptions

* Handle ClientError and ValueError from the api

* Update homeassistant/components/imeon_inverter/quality_scale.yaml

---------

Co-authored-by: Franck Nijhof <git@frenck.dev>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
Co-authored-by: Josef Zweck <josef@zweck.dev>
2025-04-10 08:25:35 +02:00
henryptung 87e5b024c1 Bump led_ble to 1.1.7 (#142629)
changelog: https://github.com/Bluetooth-Devices/led-ble/compare/v1.1.6...v1.1.7
2025-04-09 16:52:10 -10:00
J. Nick Koston 54f3bb8ddf Bump pydantic to 2.11.13 (#142612)
changelog: https://github.com/pydantic/pydantic/compare/v2.11.2...v2.11.3
2025-04-09 16:30:26 -10:00
J. Nick Koston fa291c20e5 Pin multidict to >= 6.4.2 to resolve memory leaks (#142614)
* Pin multidict to >= 6.4.1 to resolve memory leaks

https://github.com/aio-libs/multidict/issues/1134
https://github.com/aio-libs/multidict/issues/1131
https://github.com/aio-libs/multidict/releases/tag/v6.4.1
https://github.com/aio-libs/multidict/releases/tag/v6.4.0

* Apply suggestions from code review
2025-04-09 15:48:29 -10:00
Abílio Costa dd97d5bc7e Move Whirlpool test and clean unused code (#142617) 2025-04-10 00:59:00 +02:00
Norbert Rittel b3fccc0de6 Replace typo "to login to" with "to log in to" in reolink (#142577) 2025-04-09 22:46:02 +02:00
Maarten Staa 9fe306f056 Add support for air purifiers in HomeKit (#142467)
* Add support for air purifier type in HomeKit.

Any fan and PM2.5 in the same device will be treated as an air purifier.

type_air_purifiers.py heavily based on type_fans.py -
I tried extending type_fans.py but this looked better to me.

* Refactor to make AirPurifier class extend Fan.

* Ensure all chars are added before creating service

* Add support for switching automatic mode.

* Add test for auto/manual switch

* Add support for air purifier type in HomeKit.

Any fan and PM2.5 in the same device will be treated as an air purifier.

type_air_purifiers.py heavily based on type_fans.py -
I tried extending type_fans.py but this looked better to me.

* Add support for air purifier type in HomeKit.

Any fan and PM2.5 in the same device will be treated as an air purifier.

type_air_purifiers.py heavily based on type_fans.py -
I tried extending type_fans.py but this looked better to me.

* Refactor to make AirPurifier class extend Fan.

* Ensure all chars are added before creating service

* Add support for switching automatic mode.

* Add test for auto/manual switch

* Add support for air purifier type in HomeKit.

Any fan and PM2.5 in the same device will be treated as an air purifier.

type_air_purifiers.py heavily based on type_fans.py -
I tried extending type_fans.py but this looked better to me.

* Improve fan config: allow setting fan type (fan or air purifier)

Be more explicit than assuming a fan is an air purifier if it has a PM2.5 sensor. Set defaults based on the presence of sensors.

* Fix return type annotation for fan/air purifier create_services

* Allow linking air purifier filter level/change indicator

* Remove no longer needed if statement in fan init

* Fix up types and clean up code

* Update homekit tests to account for air purifiers

* Fix pylint errors

* Fix mypy errors

* Improve type annotations

* Improve readability of auto preset mode discovery

* Test air purifier with 'Auto' preset mode

* Handle case with a single preset mode

* Test air purifier edge cases: state updates to same value, and removed linked entities

* Don't create 'auto mode' switch for air purifiers

This is already exposed as a target mode on the air purifier service itself

* Handle unavailable states in air purifier

Also don't remove device class when updating state in test

* Reduce branching in air purifier test

* Split up air purifier tests for with and without auto presets, to reduce branching

* Handle unavailable states in air purifier more explicitly

* Use constant for ignored state values

* Use a set for ignored_states

* Update tests/components/homekit/test_type_air_purifiers.py

---------

Co-authored-by: Andrew Kurowski <62596884+ak6i@users.noreply.github.com>
Co-authored-by: J. Nick Koston <nick+github@koston.org>
Co-authored-by: J. Nick Koston <nick@koston.org>
2025-04-09 10:20:21 -10:00
skrynklarn 1b66278a68 Extend UnitOfReactivePower with 'kvar' (#142558) 2025-04-09 20:22:02 +01:00
Christopher Fenner 76015740f8 Fix Quickmode handling in ViCare integration (#142561)
* only check quickmode if supported

* update snapshot

* revert
2025-04-09 20:36:41 +02:00
Simone Chemelli 816edb66c7 Add full test coverage for Fritz config_flow (#142418) 2025-04-09 20:22:26 +02:00
Norbert Rittel 82c688e3be Replace typo "to login" with "to log in" in smarttub (#142600) 2025-04-09 12:13:06 -05:00
Norbert Rittel 46d6241f58 Replace typo "to login to" with "to log in to" in traccar_server (#142599) 2025-04-09 12:12:47 -05:00
Norbert Rittel b5083ce973 Replace typo "to login to" with "to log in to" in ohme (#142578) 2025-04-09 12:12:26 -05:00
Norbert Rittel 1663756983 Replace typo "to login to" with "to log in to" in fyta (#142576) 2025-04-09 12:06:00 -05:00
Erik Montnemery f344314762 Abort if a flow is removed during a step (#142138)
* Abort if a flow is removed during a step

* Reorganize code

* Only call _set_pending_import_done if an entry is created

* Try a new approach

* Add tests

* Update tests
2025-04-09 07:04:41 -10:00
TimL 7f4d178781 Make exceptions translatable for SMLIGHT (#142587)
* Exceptions translations

* check off quality scale

* translate another exception
2025-04-09 12:04:19 -05:00
Joost Lekkerkerker ba629fbddb Add Syncthru platform tests (#142596) 2025-04-09 12:00:56 -05:00
Norbert Rittel 157c776019 Replace typo "to login to" with "to log in to" in mqtt (#142575)
Fix typo "to login to" with "to log in to" in `mqtt`
2025-04-09 18:41:46 +02:00
Erik Montnemery 70aacfce98 Improve tests of clean up when reauth flow aborts (#142592) 2025-04-09 16:47:04 +02:00
Simone Chemelli 8625a36d1d Add missing strings to Fritz (#142413)
* Add missing strings to Fritz

* update quality scale

* add common section

this avoids later re-structuring and re-translating

* fix strings

* fix strings

* apply review comment

---------

Co-authored-by: Michael <35783820+mib1185@users.noreply.github.com>
2025-04-09 16:44:36 +02:00
Norbert Rittel 002f5b5ee6 Replace typo "to login to" with "to log in to" in bring (#142579) 2025-04-09 16:26:12 +02:00
Erwin Douna b058b2574f SMA add DHCP discovery (#135843)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-04-09 16:24:30 +02:00
Erik Montnemery 170e6bdcab Protect hass data keys in setup.py (#142589) 2025-04-09 15:27:52 +02:00
Erik Montnemery 075a0ad780 Add tests of behavior when completing an aborted data entry flow (#142590) 2025-04-09 15:17:54 +02:00
Erik Montnemery e7c2e86c93 Attempt to fix flaky bootstrap test (#142536) 2025-04-09 13:37:21 +02:00
Erik Montnemery 3ca1f07cc4 Remove meaningless asserts in some hassio tests (#142583) 2025-04-09 12:13:56 +02:00
TimL 762c752918 Set quality scale to silver for SMLIGHT integration (#142448)
* Add quality scale for SMLIGHT

* Review and update all rules

* Add missing data_description strings as detected by CI

* update for a few merged docs PR's

* Parallel updates done

https://github.com/home-assistant/core/pull/142455

* Set quality scale to silver

* Update homeassistant/components/smlight/quality_scale.yaml

* Update homeassistant/components/smlight/quality_scale.yaml

---------

Co-authored-by: Josef Zweck <josef@zweck.dev>
2025-04-09 08:55:09 +02:00
Maciej Bieniek 06a2de4d1c Fix Shelly initialization if device runs large script (#142487)
* Don't check the whole script to see if it generates events

* Fix tests

---------

Co-authored-by: Shay Levy <levyshay1@gmail.com>
2025-04-08 20:53:44 -10:00
Fredrik Erlandsson d4f47bfc6b Fix ssl_cert load from config_flow (#142570)
fix ssl_cert load from config_flow
2025-04-08 20:51:44 -10:00
puddly 271a4ba7c8 Fix Core deadlock by ensuring only one ZHA log queue handler thread is running at a time (#142568)
Ensure only one log queue handler is running at a time
2025-04-08 22:02:51 -04:00
Joost Lekkerkerker 528ca49368 Improve Syncthru tests (#142338) 2025-04-08 23:55:00 +02:00
dependabot[bot] 5d8c90ae0d Bump github/codeql-action from 3.28.13 to 3.28.15 (#142516)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.28.13 to 3.28.15.
- [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.13...v3.28.15)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 3.28.15
  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-04-09 00:42:12 +03:00
Abílio Costa f872dc8948 Use base entity class for Whirlpool climate (#142548)
* Use base entity class for Whirlpool climate

* Set model_id instead of model
2025-04-09 00:39:45 +03:00
Andrew Sayre ec520b8cf5 Bump pyheos to v1.0.5 (#142554)
Update pyheos
2025-04-09 00:38:48 +03:00
tronikos ff8b96a19f Fix range of Google Generative AI temperature (#142513) 2025-04-08 20:46:09 +02:00
Thomas55555 f6b55c7eb9 Fix adding devices in Husqvarna Automower (#142549) 2025-04-08 20:40:13 +02:00
elmurato 3aae280de5 Fix blocking call in Pterodactyl (#142518)
* Fix blocking call

* Group blocking calls into a single executor job, catch StopIteration
2025-04-08 18:52:26 +02:00
Norbert Rittel 6c1f9e39c4 Improve friendly names of rf_strength and wifi_strength in netatmo (#141673)
* Improve friendly names of `rf_strength` and `wifi_strength` in `netatmo`

- Replace "Radio" with "RF strength" for `rf_strength`
- Replace "Wi-Fi" with "Wi-Fi strength" for `wifi_strength`

* Update test_sensor.ambr

* Update test_sensor.py

* Update test_sensor.py

* Update test_sensor.ambr
2025-04-08 18:16:20 +02:00
Norbert Rittel a957db7c27 Use common states for "Low" and "High" in tuya (#142491) 2025-04-08 18:15:57 +02:00
Norbert Rittel 3a670e74f7 Use common state for "Normal" in yolink (#142544)
Also reordered the three states alphabetically which groups the common ones, too.
2025-04-08 18:15:05 +02:00
Barry vd. Heuvel a114ecfb73 Bump weheat to 2025.3.7 (#142539) 2025-04-08 17:18:43 +02:00
J. Nick Koston 626935ee14 Move inkbird coordinator logic into coordinator.py (#142517)
* Move inkbird coordinator logic into coordinator.py

Not a functional change, one to one relocation

* Move inkbird coordinator logic into coordinator.py

Not a functional change, one to one copy

* Move inkbird coordinator logic into coordinator.py

Not a functional change, one to one copy
2025-04-08 16:59:01 +02:00
Norbert Rittel 3f2975e93f Use common state for "Normal" in tessie / teslemetry / tesla_fleet (#142515)
* Use common state for "Normal" in `tessie`

* Use common state for "Normal" in `teslemetry`

* Use common state for "Normal" in `tesla_fleet`
2025-04-08 16:57:30 +02:00
Martin Hjelmare 38bf06e179 Improve parameters in Z-Wave init tests (#142532) 2025-04-08 15:18:22 +01:00
Marcel van der Veldt 12fc458abb Fix small typo in Music Assistant integration causing unavailable players (#142535)
Fix small typo in Music Assistant integration causing issues with adding players
2025-04-08 15:44:35 +02:00
Erik Montnemery 0ed7348d2d Fix typos in hassio (#142529) 2025-04-08 15:05:19 +02:00
Ville Skyttä 67e7554702 Increase huawei_lte scan interval to 30 seconds (#142533)
To follow what other similar integrations do, namely at least asuswrt
and netgear.

Refs https://developers.home-assistant.io/docs/core/integration-quality-scale/rules/appropriate-polling
2025-04-08 14:57:07 +02:00
Arie Catsman 74141c39ea Remember prior config flow user entries for enphase_envoy (#142457)
* Remember prior config flow user entries for enphase_envoy

* Do not reflect password in config userforms

* de-duplicate avoid reflect key code
2025-04-08 02:22:52 -10:00
Martin Hjelmare cb09207cd7 Improve Supervisor addon_running test fixture (#142525) 2025-04-08 14:03:16 +02:00
Sanjay Govind 894cc7cc4d Add sensor platform to bosch_alarm (#142151)
* add sensor platform to bosch_alarm

* add icon translations for sensors

* translate entity names

* translate entity names

* translate entity names

* update snapshots

* translate ready to arm sensor

* translate ready to arm sensor

* update tests

* update translations

* remove history sensor, we will replace it with an events sensor later

* fix tests

* fix tests

* fix tests

* update tests

* fix sensor links

* only call async_add_entities once

* convert area alarms to sensors based on type

* add sensor for alarms

* add icons

* cleanup area sensor

* add available

* loop over dict

* use entity description

* use entity description

* clean up entity descriptions

* observe_alarms and observe_ready

* refactor alarm_control_panel to use base entity

* remove more old sensors

* add unit of measurement

* update test snapshots

* use correct observer
2025-04-08 13:55:43 +02:00
Glenn Vandeuren (aka Iondependent) 36192ebc3a Add niko_home_control quality scale (#134000)
* Add quality scale

* Update quality_scale.yaml

* Update quality_scale.yaml

* Apply suggestions from code review

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-04-08 12:03:50 +02:00
Jan Bouwhuis 26663756a5 Allow max to be equal with min for mqtt number config validation (#142522) 2025-04-08 12:00:05 +02:00
tronikos 167e766811 Add translations for connection closed errors in Android TV Remote (#142523) 2025-04-08 10:10:23 +02:00
J. Nick Koston 08304ca5f3 Small improvements to the repairs testing helpers (#142511)
- Fix incorrect type on flow_id and issue_id
- Show the error when something goes wrong
2025-04-08 09:59:39 +02:00
Sanjay Govind 323c459442 bump bosch_alarm_mode2 to 0.4.6 (#142436)
* bump bosch_alarm_mode2 to 0.4.5

* bump bosch_alarm_mode2 to 0.4.6

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-04-08 08:58:58 +02:00
tronikos 89c9288706 Bump opower to 0.11.1 (#142395)
* Bump opower to 0.10.1

* opower==0.11.0

* opower==0.11.1

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2025-04-08 08:58:43 +02:00
Maciej Bieniek 480d645650 Bump aioshelly to version 13.4.1 (#142477)
* Bymp aioshelly to 13.4.1

* Catch InvalidHostError

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2025-04-08 08:58:08 +02:00
John Hillery 553091e95e Bump nexia to 2.7.0 (#142429)
Co-authored-by: J. Nick Koston <nick@koston.org>
2025-04-08 08:57:53 +02:00
Martin Hjelmare dacc4c230d Add more Z-Wave USB discovery (#142460) 2025-04-08 09:30:43 +03:00
Sanjay Govind cb07e64b47 Add reconfig flow to bosch_alarm (#142451)
* add reconfig flow to bosch_alarm

* change translation string key

* change translation string key

* cleanup

* cleanup

* Update homeassistant/components/bosch_alarm/config_flow.py

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

* fix linting

---------

Co-authored-by: Josef Zweck <josef@zweck.dev>
2025-04-08 08:22:39 +02:00
Sanjay Govind 8dee5851d2 Add jaraco.itertools license exception as the classifier was removed but no SPDX expression was added (#142439) 2025-04-07 19:50:36 -10:00
Ivan Lopez Hernandez c14380247b Handle None on the response candidates in Google Generative AI (#142497)
* Added type checking on the candidates list

* Made error message a constant
2025-04-07 21:20:54 -07:00
epenet c6ac8780ca Fix kelvin parameter in light action specifications (#142456) 2025-04-07 21:56:21 +01:00
Norbert Rittel 8f3f8fa35f Make spelling of "ecobee" consistent, matching official branding (#142496) 2025-04-07 21:06:11 +02:00
J. Diego Rodríguez Royo 1cedacc395 Delete deprecated strings related to Home Connect binary door sensor (#142495)
Delete deprecated strings related to binary door sensor
2025-04-07 21:03:01 +02:00
Norbert Rittel 19a39a3647 Use common state for "Normal" in homee (#142450)
* Use common state for "Normal" in `homee`

Also capitalize the brand name in one string.

* Change all occurrences of "homee" to lower-case
2025-04-07 20:27:01 +02:00
Norbert Rittel 5c2f19de88 Use common states for "Normal" and "High" in romy (#142485)
Also reordered the lines a bit for grouping the common states.
2025-04-07 20:24:43 +02:00
Norbert Rittel 4ccd30865b Use common state for "Normal" in humidifier (#142479) 2025-04-07 20:24:18 +02:00
J. Diego Rodríguez Royo 7ad13c8897 Delete Home Connect deprecated binary door sensor (#142490) 2025-04-07 20:23:38 +02:00
Artur Pragacz 4813b5c882 Fix wait for a dependency with config entries (#142318)
* Fix wait for dependency with config entries

* test types

* test coverage

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2025-04-07 20:16:48 +02:00
rappenze a787c6a31e Add state multiplexer in fibaro integration (#139649)
* Add state multiplexer in fibaro integration

* Add unload test

* Adjust code comments

* Add event entity test

* .
2025-04-07 18:53:35 +02:00
G Johansson f2e4bcea19 Add subdiv aliases to workday (#133608)
* Add subdiv aliases to workday

* Fix

* Add lib test
2025-04-07 18:24:07 +02:00
RJPoelstra cd2313d2ca Add tests to MotionMount integration (#137540)
* Add entity tests

* Add __init__ tests

* Cleanup

* Rename mock_motionmount_config_flow to mock_motionmount

* Remove unneeded PropertyMock

* Set defaults on mock_motionmount

* Test proper device is created

* Check whether proper device is created from test_init.py, also without mac

* Find callback and use that to update name
2025-04-07 18:16:44 +02:00
Retha Runolfsson 79b984d612 Add switchbot roller shade and hubmini matter support (#142168)
* Add roller shade and hubmini matter support

* add unit tests

* fix adv data
2025-04-07 16:25:00 +02:00
Wilfred Ketelaar bf003d643c Fixed Renault charge state icon (#142478)
Fixed charge state icon (duplicate mdi prefix)
2025-04-07 15:54:08 +02:00
Norbert Rittel 04fa699498 Use common states for "Low" and "High" in fyta (#142472) 2025-04-07 15:37:17 +02:00
Norbert Rittel 4020c987b5 Use common state for "Normal" in lg_thinq (#142453)
* Use common state for "Normal" in lg_thinq`

* Replace internal references with common ones
2025-04-07 14:06:52 +02:00
Norbert Rittel 2818f74634 Use common states for "Normal" and "Low" in binary_sensor (#142465)
* Use common state for "Normal" in `binary_sensor`

Replace the "Normal" string for `battery` and the two references to it from `heat` and `cold` to it with the common state.

* Use common state for "Low" in `binary_sensor`
2025-04-07 14:05:28 +02:00
Erik Montnemery a026820483 Remove FlowManager.async_post_init (#142462) 2025-04-07 13:28:27 +02:00
Erik Montnemery 33fa8df73e Remove ConfigEntriesFlowManager.async_post_init (#142463)
Remove ConfigEntriesFlowManager.async_post_init
2025-04-07 13:28:09 +02:00
Erik Montnemery 2ed70ef241 Use mock_config_flow test helper in config tests (#142461) 2025-04-07 12:27:15 +02:00
J. Nick Koston 04dfa45db0 Add GATT polling support to INKBird (#142307)
* Add GATT polling support to INKBird

* reduce

* fixes

* coverage

* dry

* reduce

* reduce
2025-04-07 10:18:46 +02:00
J. Nick Koston 8d82ef8e36 Fix HKC showing hvac_action as idle when fan is active and heat cool target is off (#142443)
* Fix HKC showing hvac_action as idle when fan is active and heat cool target is off

fixes #142442

* comment relocation
2025-04-07 10:11:15 +02:00
Norbert Rittel 43f93c74da Use common state for "Normal" in matter (#142452) 2025-04-07 09:54:57 +02:00
Simone Chemelli 1e104ba40b Add missing strings to SamsungTV (#142405) 2025-04-07 09:40:06 +02:00
TimL 056d26f13c Set parallel updates for SMLIGHT entities (#142455)
Set parallel updates for entities
2025-04-07 09:38:50 +02:00
starkillerOG 3e4a077862 Fix Reolink smart AI sensors (#142454) 2025-04-07 09:35:44 +02:00
Norbert Rittel a44adf2e6f Use common states for battery_critical in nuki (#142349)
Replace "on": "Low" and "off": "Normal" with common states.

This will allow us to use the common states in the `binary_sensor` class, too.
2025-04-07 09:17:21 +02:00
Álvaro Fernández Rojas 7c488f1e54 Add thermostat battery and signal sensors for Airzone integration (#142390)
* airzone: add thermostat battery/signal sensors

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>

* tests: airzone: use snapshot_platform for sensors

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>

* airzone: rename sensor strength

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>

---------

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2025-04-06 20:07:46 +02:00
Simone Chemelli bea389eed7 Add parallel updates to SamsungTV (#142403) 2025-04-06 18:25:57 +02:00
Simone Chemelli e96f2f06fb Add parallel updates to Fritz (#142409)
* Add parallel updates to Fritz

* apply review comment

* tweak
2025-04-06 17:28:51 +02:00
Simone Chemelli 9a897d5e12 Update Fritz quality scale (#142411) 2025-04-06 17:04:34 +02:00
Sid b35a44a0e0 Add sensor platform to eheimdigital (#138809)
* Add fan platform to eheimdigital

* Fix pylint

* Convert fan to sensor platform

* Remove unnecessary changes

* Add state update test

* Review

* Review

* Review
2025-04-06 14:46:19 +02:00
J. Nick Koston 8aee79085a Bump aioesphomeapi to 29.9.0 (#142393)
changelog: https://github.com/esphome/aioesphomeapi/compare/v29.8.0...v29.9.0

fixes #142381
2025-04-06 01:00:41 -10:00
J. Nick Koston d7ca168b77 Fix flapping logger test (#142367)
The websocket_api logger might get adjusted from other tests
so we cannot be sure its set at debug in this test
2025-04-06 00:09:11 -10:00
Jan-Philipp Benecke 638b88c61c Only load files ending .metadata.json in WebDAV (#142388) 2025-04-06 10:04:18 +02:00
Álvaro Fernández Rojas 62845fe4a7 Update aioairzone to v1.0.0 (#142385)
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2025-04-06 11:01:26 +03:00
Ville Skyttä c93b4cf61a Upgrade url-normalize to 2.2.0 (#142365)
* https://github.com/niksite/url-normalize/releases/tag/2.0.0
* https://github.com/niksite/url-normalize/releases/tag/2.0.1
* https://github.com/niksite/url-normalize/releases/tag/2.1.0
* https://github.com/niksite/url-normalize/releases/tag/2.2.0
2025-04-06 09:23:45 +03:00
J. Nick Koston 55de21477c Bump yarl to 1.19.0 (#142379) 2025-04-05 17:35:19 -10:00
J. Nick Koston dcef86a30d Add DHCP discovery support to Bond (#142372)
* Add DHCP discovery support to Bond

* fixes

* unique ids are always upper

* raise_on_progress=False for user

* Update tests/components/bond/test_config_flow.py

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

* assert unique id

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-04-05 14:22:23 -10:00
Luke Lashley 0a7b4d18dc Check that the current roboorck map exists before updating it. (#142341)
* Check that the current map exists

* Add a few extra checks

* Update coordinator.py

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

* fixlint

---------

Co-authored-by: Allen Porter <allen.porter@gmail.com>
2025-04-05 16:45:00 -07:00
J. Nick Koston bd8c723e08 Bump flux_led to 1.2.0 (#142362)
changelog: https://github.com/lightinglibs/flux_led/compare/1.1.3...1.2.0
2025-04-05 11:07:21 -10:00
tdfountain cd7d7cd35c Add reconfiguration flow to NUT (#142127)
* Add reconfiguration flow

* Check host/port/alias without comparing strings

* Replace repeat strings with references
2025-04-05 11:02:46 -10:00
Robert Resch 33cbebc727 Add some Xiaomi BLE sensor translations (#142109) 2025-04-05 10:51:43 -10:00
Arie Catsman 6da37691ff Improve enphase_envoy diagnostics error handling to retain collected data (#142255)
Improve enphase_envoy Diagnostics error handling to retain collected data
2025-04-05 10:51:22 -10:00
Jan Bouwhuis ae0f27c42f Limit mqtt info logging for discovery of new components (#142344)
* Limit mqtt info logging for discovery of new component

* Keep in bail out, when debug logging is not enabled
2025-04-05 22:38:11 +02:00
Andrew Sayre 660cbc136f Add move queue item HEOS entity service (#142301) 2025-04-05 15:05:01 -05:00
Maciej Bieniek 52143155e7 Record quality scale for IMGW-PIB (#141380)
* Record quality scale for IMGW-PIB

* Update quality scale

* Add the scale to the manifest

* Typo

* Suggested
2025-04-05 22:12:13 +03:00
Norbert Rittel a29ba51bdb Use common states for sensor levels in accuweather (#142345)
Replace states "Low", "High" and "Very high" with (new) common states.
2025-04-05 22:11:46 +03:00
tronikos 051a503047 Add a description for the enable_google_search_tool option in Google AI (#142322)
* Add a description for the enable_google_search_tool option in Google AI

* Use quotes
2025-04-05 20:49:38 +02:00
Andre Lengwenus 8121d147a6 Add SensorDeviceClass and unit for LCN CO2 sensor. (#142320)
Add SesnorDeviceClass and unit for LCN CO2 sensor.
2025-04-05 20:48:16 +02:00
Norbert Rittel 913d3d4ac6 Use common states for sensor levels in openuv (#142346)
Replace states "Low", "High" and "Very high" with (new) common states.
2025-04-05 21:21:03 +03:00
Norbert Rittel 236f33537b Use common states for "Low" and "Normal" in dsmr (#142354)
Use common state for "Low" and "Normal" in `dsmr`
2025-04-05 21:20:27 +03:00
Ernst Klamer 9f4b2ad05a Bump xiaomi-ble to 0.35.0 (#142350)
bump xiaomi-ble
2025-04-05 08:13:51 -10:00
Thomas55555 f290199606 Add error details in remote calendar flow (#141753)
* Add error details in remote calendar flow

* no args

* adjust

* json

* Apply suggestions

* remove description placeholder
2025-04-05 09:07:06 -07:00
Sanjay Govind 9692d637ca Add reauth flow to bosch_alarm (#142251)
* add reauth flow

* fix tests

* move not happy flow to its own test

* reference existing strings

* Update test_config_flow.py
2025-04-05 14:26:35 +02:00
elmurato 904265bca7 Add reauth flow to Pterodactyl (#142285)
* Add reauth flow

* Add common function to validate connection in config flow

* Fix remaining review findings
2025-04-05 13:56:52 +02:00
Tomek Wasilczyk 1ab8deff3d Add missing test_all requirements (#142036)
Fix homeassistant_hardware handling and add missing test_all requirements
2025-04-05 12:12:34 +02:00
Norbert Rittel 4ab31e2d4e Use common states for sensor levels in tomorrowio (#142324) 2025-04-05 11:05:43 +02:00
J. Nick Koston d7e36513b5 Bump inkbird-ble to 0.10.1 (#142314)
* Bump inkbird-ble to 0.10.0

changelog: https://github.com/Bluetooth-Devices/inkbird-ble/compare/v0.9.0...v0.10.0

* Apply suggestions from code review
2025-04-05 11:05:01 +02:00
tronikos d07378e87b Bump opower to 0.10.0 (#142321) 2025-04-05 11:03:20 +02:00
Norbert Rittel e235a04dae Use common states for sensor levels in nam (#142323) 2025-04-05 11:02:46 +02:00
Norbert Rittel be32968ed4 Use common states for sensor levels in overkiz (#142325) 2025-04-05 11:01:47 +02:00
Luke Lashley 31c660557d Update Roborock map more consistently on state change (#142228)
* update map more consistently on state change

* Makecoordinator keep track of last_updated_state
2025-04-04 19:58:46 -07:00
Emily Love Watson 414fe53261 Bump pykulersky dependency (#142311) 2025-04-04 21:23:22 -04:00
J. Nick Koston 1d10c81ff3 Add coverage to flux_led to ensure a user flow can replace an ignored entry (#142103)
* Ensure a flux_led user flow can replace an ignored entry

Allow ignored devices to be selected in the user step and replace the ignored entry.

Same as #137056 and #137052 but for flux_led

* works as-is was a problem with core.config_entries
2025-04-04 23:27:05 +02:00
Erik Montnemery 1e55d4b613 Restore "Promote after dependencies in bootstrap" (#142001)
Revert "Revert "Promote after dependencies in bootstrap" (#141584)"

This reverts commit de1e06c39b.
2025-04-04 23:26:43 +02:00
Norbert Rittel f9cd0f37f7 Add common states "Normal", "Very high" and "Very low" (#142167) 2025-04-04 23:22:05 +02:00
J. Nick Koston 39ebc103df Bump pydantic to 2.11.2 (#142302)
changelog: https://github.com/pydantic/pydantic/compare/v2.11.1...v2.11.2
2025-04-04 23:20:36 +02:00
Erwin Douna 52724c5c22 Bump DSMR parser to 1.4.3 (#142303) 2025-04-04 23:20:23 +02:00
J. Nick Koston 0abe57edaa Avoid checking if debug logging is enabled on every WebSocket message (#142258)
Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>
2025-04-04 22:28:55 +02:00
Petro31 8d95fb3b31 Fix empty actions (#142292)
* Apply fix

* Add tests for alarm button cover lock

* update light

* add number tests

* test select

* add switch tests

* test vacuum

* update lock test
2025-04-04 22:17:52 +02:00
Franck Nijhof 69e241d2e6 Add Docker host networking issue detection (#142259)
* Add Docker host networking issue detection

* Update homeassistant/components/network/strings.json

Co-authored-by: Jan-Philipp Benecke <jan-philipp@bnck.me>

* Process review comments

---------

Co-authored-by: Jan-Philipp Benecke <jan-philipp@bnck.me>
2025-04-04 22:03:02 +02:00
Robert Resch 64e1735647 Fix circular mean by always storing and using the weighted one (#142208)
* Fix circular mean by always storing and using the weighted one

* fix

* Fix test
2025-04-04 21:19:15 +02:00
Klaas Schoute 9c538d1e22 Bump forecast-solar lib to v4.1.0 (#142280)
Co-authored-by: Jan-Philipp Benecke <jan-philipp@bnck.me>
2025-04-04 21:18:09 +02:00
Ludovic BOUÉ 3c60bff7dc Add support for Matter EVSE devicetype (#137189)
* Binary sensors

* Add tests

* Update strings

* Enable testing

* Add command_timeout to MatterEntityDescription

* Add entities

* Update strings.json

* Add sensors

* Add tests

* Move command_timeout keyword to MatterGenericCommandSwitch

* Icons

* Update snapshots

* Add tests for switch entity

* Fix switch tests

* Rename states

* Update strings.json

* Update snapshot

* Rename charging switch

* Remove MatterEntity

* Update strings.json

* Update snapshots

* Update snaphots 2/2

* Update strings

* Update test binary
2025-04-04 17:57:22 +02:00
Joost Lekkerkerker 61d2c9335f Bump pySmartThings to 3.0.2 (#142257)
Co-authored-by: Robert Resch <robert@resch.dev>
2025-04-04 17:52:06 +02:00
tdfountain f4ed9edec6 Use common state strings in NUT (#142284)
User common state strings
2025-04-04 17:06:37 +02:00
Bram Kragten 5eea5858ea Update frontend to 20250404.0 (#142274) 2025-04-04 16:38:56 +02:00
Marc Mueller a05785529f Fix RuntimeWarning in homeassistant_hardware (#142269) 2025-04-04 08:39:54 -04:00
Josef Zweck a407a3c98d Fix skyconnect tests (#142262)
fix tests
2025-04-04 12:32:14 +02:00
Erwin Douna 986095482f Tado add diagnostics platform (#142225)
* Add diagnostics platform

* Fix

* Update

* Fix
2025-04-04 12:16:19 +02:00
J. Diego Rodríguez Royo 5ca0441771 Do not fetch disconnected Home Connect appliances (#142200)
* Do not fetch disconnected Home Connect appliances

* Apply suggestions

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

* Update docstring

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-04-04 09:56:40 +02:00
David Bonnes 79fe8650f8 Tweak evohome to handle older TCC-compatible systems (#142226)
Handle zone.id == TCS.id
2025-04-04 09:54:18 +02:00
David Bonnes 93418f587c Bump evohome-async to 1.0.5 (#141871)
bump client to 1.0.5
2025-04-04 09:52:18 +02:00
tdfountain 9ed8419b5d Add device class ENUM and options for sensors in NUT (#142242)
Add device class ENUM and options for sensors
2025-04-04 09:48:39 +02:00
Norbert Rittel b5721604b9 Use common states for "Low"/"Medium"/"High" in lg_thinq (#142253) 2025-04-04 09:45:36 +02:00
J. Diego Rodríguez Royo b7d9ad1c7d Bump aiohomeconnect to 0.17.0 (#142244) 2025-04-04 09:12:57 +02:00
J. Nick Koston 5e04347f13 Bump bluetooth-data-tools to 1.27.0 (#142221)
changelog: https://github.com/Bluetooth-Devices/bluetooth-data-tools/compare/v1.26.5...v1.27.0
2025-04-04 08:56:41 +02:00
Brett Adams 1cc8a170e6 Bump teslemetry-stream (#142234)
bump stream
2025-04-04 08:54:13 +02:00
Brett Adams 88455702bb Slow down polling in Tesla Fleet (#142130)
* Slow down polling

* Fix tests
2025-04-04 08:51:09 +02:00
tdfountain 471b05ff4b Improve config entry type hints in NUT (#142237)
Fix config entry type hints
2025-04-04 08:45:52 +02:00
J. Nick Koston 95ffa20bd5 Bump bleak-esphome to 2.13.1 (#142233)
* Bump bleak-esphome to 2.13.0

changelog: https://github.com/Bluetooth-Devices/bleak-esphome/compare/v2.12.0...v2.13.0

* 13.1
2025-04-04 08:43:04 +02:00
Thomas55555 5424fa0a00 Bump ical to 9.1.0 (#142197) 2025-04-03 22:21:40 -07:00
puddly 7152c86591 Hide broken ZBT-1 config entries on the hardware page (#142110)
* Hide bad ZBT-1 config entries on the hardware page

* Set up the bad config entry in the unit test

* Roll into a list comprehension

* Remove constant changes

* Fix condition in unit test
2025-04-04 03:09:13 +02:00
DeerMaximum b9e17c6cc6 Bump pynina to 0.3.5 (#142218) 2025-04-03 22:50:06 +01:00
Norbert Rittel 7751964db4 Use common states for "Low"/"Medium"/"High" in tesla_fleet (#142211) 2025-04-03 22:48:33 +01:00
Norbert Rittel 2f180c96c8 Use common states for "Low"/"Medium"/"High" in teslemetry (#142210) 2025-04-03 22:48:14 +01:00
Norbert Rittel 74d6019f81 Use common states for "Low"/"Medium"/"High" in tessie (#142209) 2025-04-03 22:47:57 +01:00
Norbert Rittel b84096097c Make calendar.get_events action description consistent (#142170)
Changes it to match the standard HA style using descriptive wording and changes to "Retrieves …" matching other "Get xyz" actions.
2025-04-03 22:25:13 +01:00
Marcel van der Veldt b9d819e0e5 Do not create a HA mediaplayer for the builtin Music Assistant player (#142192)
Do not create a HA mediaplayer for the builtin Music player
2025-04-03 16:26:56 -04:00
Ivan Lopez Hernandez 30e50d261d Made Google Search enable dependent on Assist availability (#141712)
* Made Google Search enable dependent on Assist availability

* Show error instead of rendering again

* Cleanup test code
2025-04-03 16:23:59 -04:00
Norbert Rittel 3b2ff38f02 Use common states for "Low"/"Medium"/"High" in yolink (#142139) 2025-04-03 21:35:34 +03:00
Erwin Douna 3ed4859db9 Tado bump to 0.18.11 (#142175)
* Bump to version 0.18.11

* Adding hassfest files
2025-04-03 20:30:34 +02:00
Joost Lekkerkerker 380fb6176b Add preset mode to SmartThings climate (#142180)
* Add preset mode to SmartThings climate

* Add preset mode to SmartThings climate
2025-04-03 20:12:24 +02:00
rappenze fefa2a9dd6 Fix fibaro setup (#142201) 2025-04-03 18:36:44 +02:00
Fredrik Erlandsson 53d2347c10 Fix blocking event loop - daikin (#141442)
* fix blocking event loop

* create ssl_context directly

* update manifest

* update manifest.json
2025-04-03 16:54:23 +02:00
Abílio Costa b2af1084f9 Update Whirlpool to 0.20.0 (#142119) 2025-04-03 15:35:37 +01:00
Paul Bottein cf005feace Add translation for hassio update entity name (#142090) 2025-04-03 13:13:52 +02:00
Sanjay Govind 7a9a4db8d7 Add diagnostics for bosch alam integration (#142165)
* add diagnostics to bosch_alarm

* use snapshot
2025-04-03 12:05:08 +02:00
Retha Runolfsson 934e81db43 Bump PySwitchBot to 0.59.0 (#142166)
update pyswitchbot to 0590
2025-04-03 11:48:16 +02:00
Norbert Rittel 8b3a43258d Use common states for "Low" and "High" in dsmr_reader (#142159) 2025-04-03 10:31:45 +02:00
Erik Montnemery b7bc9607a2 Fix lying comment in ConfigEntriesFlowManager.async_finish_flow (#142146) 2025-04-03 10:21:26 +02:00
Norbert Rittel c2eb72fce4 Use common states for "Low" and "High" in yale_smart_alarm (#142149) 2025-04-03 09:47:54 +02:00
Norbert Rittel 1d694450ef Use common states for "Low" and "High" in balboa (#142150) 2025-04-03 09:46:49 +02:00
Arie Catsman 98c56bce4b Bump pyenphase to 1.25.5 (#142107) 2025-04-03 09:46:09 +02:00
G Johansson ec396513a2 Bump pysmhi to 1.0.1 (#142111) 2025-04-03 09:43:00 +02:00
J. Nick Koston 0b61b62334 Avoid logging a warning when replacing an ignored config entry (#142114)
Replacing an ignored config entry with one from the user
flow should not generate a warning. We should only warn
if we are replacing a usable config entry.

Followup to adjust the warning added in #130567
cc @epenet
2025-04-03 09:38:50 +02:00
Norbert Rittel dfa180ba64 Use common states for "Low"/"Medium"/"High" in home_connect (#142142)
* Use common states for "Low"/"Medium"/"High" in `home_connect`

Replaces two occurrences of "Low"/"Medium"/"High" each with the (new) common strings.

* Replace internal references with common ones
2025-04-03 09:33:06 +02:00
Norbert Rittel db44ed845d Use common states for "Low"/"Medium"/"High" in ecovacs (#142140) 2025-04-03 09:24:48 +02:00
elmurato 4a562b5085 Improve exception handling in Pterodactyl (#141955)
Improve exception handling
2025-04-03 08:45:06 +02:00
Norbert Rittel 03c70e18df Use common states for "Low"/"Medium"/"High" in roborock (#142113) 2025-04-03 08:14:14 +02:00
Norbert Rittel df5cdf7de4 Use common states for "Low"/"Medium"/"High" in litterrobot (#142112) 2025-04-03 08:14:02 +02:00
Norbert Rittel 1860db4632 Use common state for "Medium" in iron_os (#142117) 2025-04-03 08:13:16 +02:00
Brett Adams 09d25f322a Bump tesla-fleet-api to v1.0.17 (#142131)
bump
2025-04-03 08:12:41 +02:00
Michael 33d895bc7d Use snapshot_platform in all platform test modules for AVM Fritz!SmartHome (#142093)
use snapshot_platform in all platform test modules
2025-04-03 00:14:07 +02:00
tdfountain 02ca1f2889 Fix strings username data description in NUT (#142115)
Fix strings username data description
2025-04-02 11:08:13 -10:00
Abílio Costa e8335b1ed7 Revert "Move setup messages from info to debug level" (#142023)
Revert "Move setup messages from info to debug level (#141834)"

This reverts commit 663d0691a7.
2025-04-02 10:42:38 -10:00
Erik Montnemery ec96e54f87 Avoid unnecessary reload in apple_tv reauth flow (#142079) 2025-04-02 10:39:35 -10:00
Norbert Rittel 519a416837 Use common states for "ptc_level" in xiaomi_miio (#142044) 2025-04-02 23:38:14 +03:00
Norbert Rittel d56a3ac652 Use common states for "wi_fi_strength" in aquacell (#142047) 2025-04-02 23:37:56 +03:00
Norbert Rittel d13beec3e1 Use more common states for "foot_warmer_temp" in sleepiq (#142048) 2025-04-02 23:37:42 +03:00
Norbert Rittel 5d0de138f6 Use common states for "speed" in motionblinds_ble (#142050) 2025-04-02 23:37:27 +03:00
Norbert Rittel 06edb2e36b Use common states for selectors in openai_conversation (#142056) 2025-04-02 23:37:19 +03:00
Norbert Rittel 23ade8180a Replace "to log into" with "to log in to" in honeywell (#142063) 2025-04-02 23:37:09 +03:00
Norbert Rittel 314f658d92 Fix grammar bug "to sign into" in hive (#142086) 2025-04-02 23:36:31 +03:00
Norbert Rittel 48cbe22609 Replace "Sign into …" with "Sign in to …" in sharkiq (#142087)
Fix grammar bug "to sign into" in `sharkiq`
2025-04-02 23:36:04 +03:00
Norbert Rittel f8a15c8228 Use common states for "Low"/"Medium"/"High" in matter (#142095) 2025-04-02 23:35:52 +03:00
Norbert Rittel 17f6ded7b0 Use common states for "Low"/"Medium"/"High" in wyoming (#142096) 2025-04-02 23:32:24 +03:00
currand 691cb378a0 Correctly support humidification and dehumidification in Nexia Thermostats (#139792)
* Add set_dehumidify_setpoint service. Refactor set_humidify_setpoint.

* Add closest_value function in utils

* Refactor target humidity

* Update tests for util.py

* Refactor target humidity. Update tests.

* Remove duplicate constant

* Add humidify and dehumidfy sensors

* Update sensor names

* Remove clamping and commented code

* Iplement suggestions from review

* Switch order check order

* remove closest_value()

* Update strings for clarity/grammar

* Update strings for grammar/clarity

* tweaks

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2025-04-02 10:29:40 -10:00
tdfountain 2876e5d0cd Improve and add missing config flow strings in NUT (#142035)
* Improve and add missing config descriptions

* Fix string

* Conform to Microsoft style guidelines on 'sign in'

* Note username and password are optional

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2025-04-02 10:29:27 -10:00
Norbert Rittel 2601217209 Use common states for battery sensor in withings (#142043)
Use common states for battery level in `withings`
2025-04-02 19:50:55 +02:00
Simone Chemelli a7be9e6643 Fix humidifier platform for Comelit (#141854)
* Fix humidifier platform for Comelit

* apply review comment
2025-04-02 19:17:51 +02:00
Norbert Rittel 30ea27d4a5 Replace "to log into" with "to log in to" in incomfort (#142060)
* Replace "to log into" with "to log in to" in `incomfort`

Also fix one missing sentence-casing of "gateway".

* Replace duplicate "data_description" strings with references
2025-04-02 17:33:36 +02:00
Joost Lekkerkerker 2a66c03d73 Fix switch name Unknown in SmartThings (#142081)
Fix switch name Unknown
2025-04-02 17:15:36 +02:00
Michael 6b34c38d21 Fix state class for battery sensors in AVM Fritz!SmartHome (#142078)
* set proper state class for battery sensor

* fix tests
2025-04-02 17:00:29 +02:00
Marcel van der Veldt 0871bf13a4 Deprecate None effect instead of breaking it for Hue (#142073)
* Deprecate effect none instead of breaking it for Hue

* add guard for unknown effect value

* revert guard

* Fix

* Add test

* Add test

* Add test

---------

Co-authored-by: Joostlek <joostlek@outlook.com>
2025-04-02 15:39:31 +02:00
puddly 4c44d2f4d9 Translation key for ZBT-1 integration failing due to disconnection (#142077)
Translation key for device disconnected
2025-04-02 15:33:41 +02:00
Joost Lekkerkerker 833a8be2d1 Improve SmartThings switch deprecation (#142072) 2025-04-02 15:33:17 +02:00
Abílio Costa f8113ae80b Allow excluding modules from noisy logs check (#142020)
* Allow excluding modules from noisy logs check

* Cache non-excluded modules; hardcode self module name; optimize call

* Address review comments
2025-04-02 15:07:00 +02:00
Erik Montnemery feff5355c8 Mark Integration with @final (#142057) 2025-04-02 15:05:43 +02:00
Erik Montnemery 6fbee5c2e3 Mark ReadOnlyDict with @final (#142059) 2025-04-02 14:06:01 +02:00
Erik Montnemery 8200c234dd Mark logbook.EventAsRow with @final (#142058) 2025-04-02 14:05:23 +02:00
Erik Montnemery dfd86d56ec Convert test fixtures to async (#142052) 2025-04-02 14:05:07 +02:00
Erik Montnemery 93162f6b65 Mark Event and HassJob with @final (#142055) 2025-04-02 14:04:48 +02:00
Joost Lekkerkerker 93ea88f3de Improve SmartThings sensor deprecation (#142070)
* Improve SmartThings sensor deprecation

* Improve SmartThings sensor deprecation

* Improve SmartThings sensor deprecation
2025-04-02 13:56:23 +02:00
Joost Lekkerkerker ca48b07858 Add Eve brand (#142067) 2025-04-02 13:54:58 +02:00
Erik Montnemery 795e01512a Correct TodoItem docstrings (#142066) 2025-04-02 13:49:12 +02:00
Petro31 36857b4b20 Fix weather templates using new style configuration (#136677) 2025-04-02 12:38:48 +02:00
Robert Resch 8432b6a790 Bump deebot-client to 12.5.0 (#142046) 2025-04-02 11:48:27 +02:00
Erik Montnemery e02a6f2f19 Convert alexa test fixtures to async (#142054) 2025-04-02 11:00:13 +02:00
J. Nick Koston 6b45b0f522 Bump bluetooth-data-tools to 1.26.5 (#142045)
changelog: https://github.com/Bluetooth-Devices/bluetooth-data-tools/compare/v1.26.1...v1.26.5
2025-04-02 10:37:27 +02:00
dependabot[bot] c35ec1f12b Bump actions/dependency-review-action from 4.5.0 to 4.6.0 (#142042)
Bumps [actions/dependency-review-action](https://github.com/actions/dependency-review-action) from 4.5.0 to 4.6.0.
- [Release notes](https://github.com/actions/dependency-review-action/releases)
- [Commits](https://github.com/actions/dependency-review-action/compare/v4.5.0...v4.6.0)

---
updated-dependencies:
- dependency-name: actions/dependency-review-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-04-02 09:19:06 +02:00
J. Nick Koston bb7e1d4723 Reduce overhead to run headers middleware (#142032)
Instead of having to itererate a dict, update
the headers multidict using a pre-build CIMultiDict
which has an internal fast path
2025-04-02 09:09:39 +02:00
Tomek Wasilczyk 2305cb0131 Fix warning about unfinished oauth tasks on shutdown (#141969)
* Don't wait for OAuth token task on shutdown

To reproduce the warning:
1. Start authentication with integration using OAuth (e.g. SmartThings)
2. When redirected to external login site, just close the page
3. Settings -> Restart Home Assistant

* Clarify comment

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-04-02 09:07:36 +02:00
TheJulianJES 253293c986 Bump ZHA to 0.0.55 (#142031) 2025-04-02 07:45:17 +02:00
J. Nick Koston 1040fe50ec Bump aiohttp to 3.11.16 (#142034)
changelog: https://github.com/aio-libs/aiohttp/compare/v3.11.15...v3.11.16
2025-04-02 07:43:43 +02:00
puddly 6a012498a5 Fix entity names for HA hardware firmware update entities (#142029)
* Fix entity names for HA hardware firmware update entities

* Fix unit tests
2025-04-01 18:43:01 -04:00
puddly 74c2060c49 Skip firmware config flow confirmation if the hardware is in use (#142017)
* Auto-confirm the discovery if we detect that the device is already in use

* Add a unit test
2025-04-01 21:39:25 +01:00
Jan Bouwhuis 177fff3ff0 Add type hint on inherrited attribute _message_callback for MQTT mixin classes (#142011) 2025-04-01 20:28:11 +02:00
G Johansson e7fadcda7b Fix train to for multiple stations in Trafikverket Train (#142016) 2025-04-01 20:27:34 +02:00
puddly 91c53e9c52 Fix data in old SkyConnect integration config entries or delete them (#141959)
* Delete old SkyConnect integration config entries

* Try migrating, if possible

* Do not delete config entries, log a failure
2025-04-01 20:27:06 +02:00
Norbert Rittel bd1c66984f Sentence-case "Heat pump" / "High demand" states in water_heater (#142012) 2025-04-01 19:23:03 +01:00
Abílio Costa 704777444c Refactor Whirlpool sensor platform (#141958)
* Refactor Whirlpool sensor platform

* Rename sensor classes

* Remove unused logging

* Split washer dryer translation keys to use icon translations

* Address review comments

* Remove entity name; fix sentence casing
2025-04-01 20:02:24 +02:00
Mikko Koo c28a6a867d Fix nordpool Not to return Unknown if price is exactly 0 (#140647)
* now the price will return even if it is exactly 0

* now the price will return even if it is exactly 0

* now the price will return even if it is exactly 0

* clean code

* clean code

* update testing code coverage

* change zero testing to SE4

* remove row duplicate

* fix date comments

* improve testing

* simplify if-return-0

* remove unnecessary tests

* order testing rows

* restore test_sensor_no_next_price

* remove_average_price_test

* fix test name
2025-04-01 19:45:23 +02:00
Joost Lekkerkerker 4bfc96c02b Improve SmartThings deprecation (#141939)
* Improve SmartThings deprecation

* Improve SmartThings deprecation
2025-04-01 19:36:14 +02:00
Jan Bouwhuis faac51d219 Improve error handling and logging on MQTT update entity state updates when template rederings fails (#141960) 2025-04-01 19:22:32 +02:00
Joost Lekkerkerker d9cd62bf65 Add LG ThinQ event bus listener to lifecycle hooks (#142006) 2025-04-01 19:20:31 +02:00
Bram Kragten 6007629293 Update frontend to 20250401.0 (#142010) 2025-04-01 19:19:53 +02:00
Markus Adrario 426e9846d9 Add Homee climate platform (#141616)
* Add climate platform

* Add climate tests

* Add service tests

* Add snapshot test

* Code optimazitions 1

* Add test for current preset mode.

* code optimization 2

* code optimization 3

* small tweaks

* another small tweak

* Last minute changes

* Update tests/components/homee/test_climate.py

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

* fix review comments

* typo

* more review fixes.

* maybe final review fixes.

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-04-01 18:08:36 +02:00
Norbert Rittel 935db1308f Add common states for "Low", "Medium" and "High" (#141999) 2025-04-01 18:07:19 +02:00
aaronburt 597540b611 Correct unit conversion for OneDrive quota display (#140337)
* Correct unit conversion for OneDrive quota display

* Convert OneDrive quota values from bytes to GiB in coordinator and update strings
2025-04-01 17:17:34 +02:00
LG-ThinQ-Integration e0b030c892 Add select for dehumidifier's mode control (#140572)
* Add select for dehumidifier

* Add device_class POWER

* Delete not related to select

* Update homeassistant/components/lg_thinq/strings.json

---------

Co-authored-by: yunseon.park <yunseon.park@lge.com>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-04-01 17:14:39 +02:00
tmenguy da9b3dc68b Better throttling handling for the Renault API (#141667)
* Added some better throttling handling for the Renault API, it fixes #106777 HA ticket

* Added some better throttling handling for the Renault API, it fixes #106777 HA ticket, test fixing

* Update homeassistant/components/renault/coordinator.py

Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>

* Update homeassistant/components/renault/coordinator.py

Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>

* Update homeassistant/components/renault/coordinator.py

Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>

* Update homeassistant/components/renault/coordinator.py

Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>

* Update homeassistant/components/renault/coordinator.py

Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>

* Update homeassistant/components/renault/coordinator.py

Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>

* Update homeassistant/components/renault/coordinator.py

Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>

* Update homeassistant/components/renault/renault_hub.py

Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>

* bigger testsuite for  #106777 HA ticket

* bigger testsuite for  #106777 HA ticket

* bigger testsuite for  #106777 HA ticket

* bigger testsuite for  #106777 HA ticket

* Adjust tests

* Update homeassistant/components/renault/coordinator.py

Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>

* Update homeassistant/components/renault/renault_hub.py

Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>

* Update homeassistant/components/renault/renault_hub.py

Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>

* Update tests/components/renault/test_sensor.py

* Update tests/components/renault/test_sensor.py

* Update tests/components/renault/test_sensor.py

* requested changes  #106777 HA ticket

* Use unkown

* Fix test

* Fix test again

* Reduce and fix

* Use assumed_state

* requested changes  #106777 HA ticket

---------

Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>
2025-04-01 17:14:21 +02:00
Norbert Rittel 23b79b2f39 Capitalize app name in deluge description string (#142003)
This should help fix / prevent some wrong translations like "impostazioni di diluvio" in Italian.
2025-04-01 16:39:22 +02:00
Erik Montnemery b9a0d553ab Fix import issues related to onboarding views (#141919)
* Fix import issues related to onboarding views

* Add ha-intents and numpy to pyproject.toml

* Add more requirements to pyproject.toml

* Add more requirements to pyproject.toml
2025-04-01 16:29:18 +02:00
Artur Pragacz c4f0d9d2fa Always set up after dependencies if they are scheduled to be loaded (#141593)
* Always setup after dependencies

* Add comment
2025-04-01 16:28:29 +02:00
Erik Montnemery 78338f161f Add base class for onboarding views (#141970) 2025-04-01 16:13:18 +02:00
Simone Chemelli aaafdee56f Remove un-necessary wait for background tasks in Comelit tests (#142000) 2025-04-01 16:05:46 +02:00
Dan Raper 7068986c14 Bump Ohme to platinum (#141762)
* Bump version of ohmepy and fix types

* Add strict typing to ohme

* Inject websession for ohme

* CI/code formatting fixes for ohme

* Update mypy.ini for ohme

* Fix typing in services for ohme

* Bump ohme quality in manifest
2025-04-01 15:48:45 +02:00
Louis Christ 32ee31b8c7 Use saved volume when selecting preset in bluesound integration (#141079)
* Use load_preset to select preset as source

* Add tests

* Fix

---------

Co-authored-by: Joostlek <joostlek@outlook.com>
2025-04-01 14:41:24 +02:00
Simone Chemelli 50c12d4487 Move Vodafone Station to platinum quality scale (#141406) 2025-04-01 14:39:44 +02:00
Erik Montnemery 2427b77363 Use send_json_auto_id in websocket_api tests (#141994) 2025-04-01 14:31:49 +02:00
Erik Montnemery fa9613a879 Unconditionally import turbojpeg from camera (#141995) 2025-04-01 14:24:15 +02:00
Erik Montnemery 145e02769c Remove redundant type hint from core_config.py (#141989) 2025-04-01 13:54:24 +03:00
Norbert Rittel c151696357 Fix spelling in Reolink user-facing strings (#141971)
Fix spelling in `reolink` user-facing string

- replace three occurrences of "a" with proper "an"
- replace "infra red" with "infrared"
2025-04-01 11:38:48 +02:00
Paulus Schoutsen cbcd1929dd Move Z-Wave JS smoke, CO, CO2, Heat, Water problem entities to diagnostic (#129922)
* Move Z-Wave JS smoke, CO, CO2, Heat, Water problem entities to diagnostic

* Update link + states

* Specify problem class explicitly instead of catch-all

* Heat alarm test is not a problem

* Also split out smoke alarm

* Document mapping rule

* add tests

* format

* update test

* review comments

* remove idle state from doc as it is ignored

---------

Co-authored-by: Petar Petrov <MindFreeze@users.noreply.github.com>
2025-04-01 11:37:59 +02:00
Norbert Rittel 7a9836064d Replace "A entity" with "An entity" in modbus (#141973)
* Replace "A entity" with "An entity" in `modbus`

* Fix wrong commas
2025-04-01 11:14:41 +02:00
epenet 3155c1cd4f Add tests for renault QuotaLimitException (#141985) 2025-04-01 11:01:13 +02:00
Norbert Rittel 28c38e92d4 Fix typo "certificartes" in fully_kiosk (#141979) 2025-04-01 09:28:41 +02:00
Norbert Rittel 9c3b9eee2a Replace "a entity" with "an entity" in isy994 user strings (#141972) 2025-04-01 09:52:31 +03:00
J. Nick Koston def50b255d Bump aiohttp to 3.11.15 (#141967)
changelog: https://github.com/aio-libs/aiohttp/compare/v3.11.14...v3.11.15

fixes #141855
fixes #141146
2025-04-01 08:31:25 +02:00
Steven Stallion aa7694e81c Bump sensorpush-api to 2.1.2 (#141965) 2025-04-01 07:29:09 +02:00
Manu a722912e05 Add translations for flash options in light.turn_on action (#141950) 2025-04-01 05:43:24 +02:00
Norbert Rittel a09213bce8 Replace "Start" and "Disable" with common actions in hassio (#141953) 2025-03-31 23:23:25 +02:00
J. Nick Koston 0abaaa0a06 Bump pydantic to 2.11.1 (#141951) 2025-03-31 23:23:02 +02:00
Ben Jones 363b88407c Handle empty or missing state values for MQTT light entities using 'template' schema (#141177)
* check for empty or missing values when processing state messages for MQTT light entities using 'template' schema

* normalise warning logs

* add tests (one is still failing and I can't work out why)

* fix test

* improve test coverage after PR review

* improve test coverage after PR review
2025-03-31 23:16:22 +02:00
Norbert Rittel 4a4458ec5b Replace "Open" with common state in comelit (#141949) 2025-03-31 22:02:22 +02:00
Steven Looman b3379e1921 Bump async-upnp-client to 0.44.0 (#141946) 2025-03-31 21:35:21 +02:00
Bram Kragten 09e5fbb258 Update frontend to 20250331.0 (#141943) 2025-03-31 21:23:48 +02:00
puddly b758dc202f Reload the ZBT-1 integration on USB state changes (#141287)
* Reload the config entry when the ZBT-1 is unplugged

* Register the USB event handler globally to react better to re-plugs

* Fix existing unit tests

* Add an empty `CONFIG_SCHEMA`

* Add a unit test

* Fix unit tests

* Fix unit tests for Linux

* Address most review comments

* Address remaining review comments
2025-03-31 09:10:24 -10:00
Jan-Philipp Benecke c5f75bc135 Import function instead of relying on hass.component in watergate (#141945) 2025-03-31 21:10:14 +02:00
Michael a904df5bc2 Add common module to ProxymoxVE integration (#141941)
add common module
2025-03-31 21:03:13 +02:00
Abílio Costa 1978e94aaa Fix Whirlpool sensor icon definition (#141937) 2025-03-31 19:32:24 +01:00
Michael Hansen 28dbf6e3dc Add preannounce boolean for announce/start conversation (#141930)
* Add preannounce boolean

* Fix disabling preannounce in wizard

* Fix casing

* Fix type of preannounce_media_id

* Adjust description of preannounce_media_id
2025-03-31 20:29:07 +02:00
Jan-Philipp Benecke ef989160af Bump aiowebdav2 to 0.4.5 (#141934) 2025-03-31 19:08:21 +02:00
Erik Montnemery 4071eb76c7 Revert PR 136314 (Cleanup map references in lovelace) (#141928)
* Revert PR 136314 (Cleanup map references in lovelace)

* Update homeassistant/components/lovelace/__init__.py

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

* Fix dashboard creation

* Update homeassistant/components/lovelace/__init__.py

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

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-03-31 18:33:45 +02:00
J. Nick Koston ac723161c1 Bump grpcio to 1.71.0 (#141881) 2025-03-31 06:16:33 -10:00
elmurato 94884d33db Add button platform to Pterodactyl (#141910)
* Add button platform to Pterodactyl

* Fix parameter order of send_power_action, remove _attr_has_entity_name from button

* Rename PterodactylCommands to PterodactylCommand
2025-03-31 17:53:08 +02:00
Norbert Rittel 64994277b1 Fix spelling of "QR code" and improve grammar in tuya (#141929)
* Fix spelling of "QR code" in `tuya`

Remove the wrong hyphen.

* Add "the" to the sentence to improve the grammar
2025-03-31 17:23:14 +03:00
Josef Zweck 8abf822d92 Add None check to azure_storage (#141922) 2025-03-31 15:29:17 +02:00
Erik Montnemery 6e6f10c085 Don't create persistent notification when starting discovery flow (#141546)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-03-31 14:42:58 +02:00
Norbert Rittel 1c0768dd78 Replace "Disconnected" with common string in teslemetry (#141914)
Replaced "Disconnected" with common string in `teslemetry`
2025-03-31 14:42:07 +02:00
Paulus Schoutsen c888502671 Add quality scale summary generator (#141780)
* Add quality scale summary generator

* Remove executable bit

* Split out virtual
2025-03-31 14:41:13 +02:00
Michael 58af3545f4 Correct further sensor categorizations in AVM Fritz!Box tools (#141911)
mark margin and attenuation as diagnostic and disable them by default
2025-03-31 13:18:44 +02:00
Norbert Rittel d669dd45cf Use common state for "Paused" and "Unplugged" / "Plugged in" from binary sensor (#141908)
Use common state for "Paused" and "Unplugged" / "Plugged" from `binary sensor`
2025-03-31 13:18:12 +02:00
Norbert Rittel 05a5b8cdf0 Replace "Connected" and "Disconnected" with common states (#141912) 2025-03-31 13:17:46 +02:00
Norbert Rittel 33b6d0a45f Replace "Connected" and "Disconnected" with common states (#141913) 2025-03-31 13:13:48 +02:00
Joost Lekkerkerker fba11d8016 Don't create SmartThings entities for disabled components (#141909) 2025-03-31 13:36:46 +03:00
Norbert Rittel 314834b4eb Use more common state strings in lektrico (#141906) 2025-03-31 13:36:31 +03:00
Abílio Costa 46a8325556 Simplify Energy cost sensor update method (#138961) 2025-03-31 11:32:30 +01:00
Erik Montnemery 86622cd29d Remove unnecessary imports of http integration (#141899)
* Remove unnecessary imports of http integration

* Check reason for test failures

* Revert "Check reason for test failures"

This reverts commit 5ccf356ab029402ab87e00dc00eeb4798a0f6658.

* Update tests
2025-03-31 11:30:20 +01:00
Joost Lekkerkerker c91a1d0fce Fix SmartThings being able to understand incomplete DRLC (#141907) 2025-03-31 12:20:06 +02:00
Dan Raper 778a2891ce Bump ohmepy to 1.5.1 (#141879)
* Bump ohmepy to 1.5.1

* Fix types for ohmepy version change
2025-03-31 11:44:01 +02:00
Retha Runolfsson 560c719b0f Add switchbot cover unit tests (#140265)
* add cover unit tests

* Add unit test for SwitchBot cover

* fix: use mock_restore_cache to mock the last state

* modify unit tests

* modify scripts as suggest

* improve readability

* adjust patch target per review comments

* adjust patch target per review comments

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2025-03-31 11:42:31 +02:00
Franck Nijhof d5ab86edbf Fix SmartThings climate entity missing off HAVC mode (#141700)
* Fix smartthing climate entity missing off HAVC mode:

* Fix tests

* Fix test

---------

Co-authored-by: Joostlek <joostlek@outlook.com>
2025-03-31 11:41:52 +02:00
Thomas55555 6aeb7f36f6 Handle 403 error in remote calendar (#141839)
* Handle 403 error in remote calendar

* tests
2025-03-31 11:40:14 +02:00
Erik Montnemery f6308368b0 Test behavior of statistic_during_period when circular mean is undefined (#141554)
* Test behavior of statistic_during_period when circular mean is undefined

* Improve comment
2025-03-31 10:43:57 +02:00
1206 changed files with 63938 additions and 16948 deletions
+1
View File
@@ -1,5 +1,6 @@
name: Report an issue with Home Assistant Core
description: Report an issue with Home Assistant Core.
type: Bug
body:
- type: markdown
attributes:
+3 -3
View File
@@ -653,7 +653,7 @@ jobs:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
- name: Dependency review
uses: actions/dependency-review-action@v4.5.0
uses: actions/dependency-review-action@v4.6.0
with:
license-check: false # We use our own license audit checks
@@ -1317,7 +1317,7 @@ jobs:
pattern: coverage-*
- name: Upload coverage to Codecov
if: needs.info.outputs.test_full_suite == 'true'
uses: codecov/codecov-action@v5.4.0
uses: codecov/codecov-action@v5.4.2
with:
fail_ci_if_error: true
flags: full-suite
@@ -1459,7 +1459,7 @@ jobs:
pattern: coverage-*
- name: Upload coverage to Codecov
if: needs.info.outputs.test_full_suite == 'false'
uses: codecov/codecov-action@v5.4.0
uses: codecov/codecov-action@v5.4.2
with:
fail_ci_if_error: true
token: ${{ secrets.CODECOV_TOKEN }}
+2 -2
View File
@@ -24,11 +24,11 @@ jobs:
uses: actions/checkout@v4.2.2
- name: Initialize CodeQL
uses: github/codeql-action/init@v3.28.13
uses: github/codeql-action/init@v3.28.15
with:
languages: python
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3.28.13
uses: github/codeql-action/analyze@v3.28.15
with:
category: "/language:python"
+2
View File
@@ -291,6 +291,7 @@ homeassistant.components.kaleidescape.*
homeassistant.components.knocki.*
homeassistant.components.knx.*
homeassistant.components.kraken.*
homeassistant.components.kulersky.*
homeassistant.components.lacrosse.*
homeassistant.components.lacrosse_view.*
homeassistant.components.lamarzocco.*
@@ -364,6 +365,7 @@ homeassistant.components.notify.*
homeassistant.components.notion.*
homeassistant.components.number.*
homeassistant.components.nut.*
homeassistant.components.ohme.*
homeassistant.components.onboarding.*
homeassistant.components.oncue.*
homeassistant.components.onedrive.*
Generated
+5 -2
View File
@@ -432,7 +432,7 @@ build.json @home-assistant/supervisor
/homeassistant/components/entur_public_transport/ @hfurubotten
/homeassistant/components/environment_canada/ @gwww @michaeldavie
/tests/components/environment_canada/ @gwww @michaeldavie
/homeassistant/components/ephember/ @ttroy50
/homeassistant/components/ephember/ @ttroy50 @roberty99
/homeassistant/components/epic_games_store/ @hacf-fr @Quentame
/tests/components/epic_games_store/ @hacf-fr @Quentame
/homeassistant/components/epion/ @lhgravendeel
@@ -704,6 +704,8 @@ build.json @home-assistant/supervisor
/tests/components/image_upload/ @home-assistant/core
/homeassistant/components/imap/ @jbouwh
/tests/components/imap/ @jbouwh
/homeassistant/components/imeon_inverter/ @Imeon-Energy
/tests/components/imeon_inverter/ @Imeon-Energy
/homeassistant/components/imgw_pib/ @bieniu
/tests/components/imgw_pib/ @bieniu
/homeassistant/components/improv_ble/ @emontnemery
@@ -935,6 +937,8 @@ build.json @home-assistant/supervisor
/tests/components/metoffice/ @MrHarcombe @avee87
/homeassistant/components/microbees/ @microBeesTech
/tests/components/microbees/ @microBeesTech
/homeassistant/components/miele/ @astrandb
/tests/components/miele/ @astrandb
/homeassistant/components/mikrotik/ @engrbm87
/tests/components/mikrotik/ @engrbm87
/homeassistant/components/mill/ @danielhiversen
@@ -1387,7 +1391,6 @@ build.json @home-assistant/supervisor
/homeassistant/components/siren/ @home-assistant/core @raman325
/tests/components/siren/ @home-assistant/core @raman325
/homeassistant/components/sisyphus/ @jkeljo
/homeassistant/components/sky_hub/ @rogerselwyn
/homeassistant/components/sky_remote/ @dunnmj @saty9
/tests/components/sky_remote/ @dunnmj @saty9
/homeassistant/components/skybell/ @tkdrob
+12 -17
View File
@@ -53,6 +53,7 @@ from .components import (
logbook as logbook_pre_import, # noqa: F401
lovelace as lovelace_pre_import, # noqa: F401
onboarding as onboarding_pre_import, # noqa: F401
person as person_pre_import, # noqa: F401
recorder as recorder_import, # noqa: F401 - not named pre_import since it has requirements
repairs as repairs_pre_import, # noqa: F401
search as search_pre_import, # noqa: F401
@@ -859,8 +860,14 @@ async def _async_set_up_integrations(
integrations, all_integrations = await _async_resolve_domains_and_preload(
hass, config
)
all_domains = set(all_integrations)
domains = set(integrations)
# 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",
@@ -868,6 +875,8 @@ async def _async_set_up_integrations(
all_domains - domains,
)
async_set_domains_to_be_loaded(hass, all_domains)
# Initialize recorder
if "recorder" in all_domains:
recorder.async_initialize_recorder(hass)
@@ -900,24 +909,12 @@ async def _async_set_up_integrations(
stage_dep_domains_unfiltered = {
dep
for domain in stage_domains
for dep in all_integrations[domain].all_dependencies
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
stage_all_integrations = {
domain: all_integrations[domain] for domain in stage_all_domains
}
# Detect all cycles
stage_integrations_after_dependencies = (
await loader.resolve_integrations_after_dependencies(
hass, stage_all_integrations.values(), stage_all_domains
)
)
stage_all_domains = set(stage_integrations_after_dependencies)
stage_domains &= stage_all_domains
stage_dep_domains &= stage_all_domains
_LOGGER.info(
"Setting up stage %s: %s | %s\nDependencies: %s | %s",
@@ -928,8 +925,6 @@ async def _async_set_up_integrations(
stage_dep_domains_unfiltered - stage_dep_domains,
)
async_set_domains_to_be_loaded(hass, stage_all_domains)
if timeout is None:
await _async_setup_multi_components(hass, stage_all_domains, config)
continue
+5
View File
@@ -0,0 +1,5 @@
{
"domain": "eve",
"name": "Eve",
"iot_standards": ["matter"]
}
@@ -72,10 +72,10 @@
"level": {
"name": "Level",
"state": {
"high": "High",
"low": "Low",
"high": "[%key:common::state::high%]",
"low": "[%key:common::state::low%]",
"moderate": "Moderate",
"very_high": "Very high"
"very_high": "[%key:common::state::very_high%]"
}
}
}
@@ -89,10 +89,10 @@
"level": {
"name": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::name%]",
"state": {
"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%]",
"high": "[%key:common::state::high%]",
"low": "[%key:common::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%]"
"very_high": "[%key:common::state::very_high%]"
}
}
}
@@ -123,10 +123,10 @@
"level": {
"name": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::name%]",
"state": {
"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%]",
"high": "[%key:common::state::high%]",
"low": "[%key:common::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%]"
"very_high": "[%key:common::state::very_high%]"
}
}
}
@@ -167,10 +167,10 @@
"level": {
"name": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::name%]",
"state": {
"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%]",
"high": "[%key:common::state::high%]",
"low": "[%key:common::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%]"
"very_high": "[%key:common::state::very_high%]"
}
}
}
@@ -181,10 +181,10 @@
"level": {
"name": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::name%]",
"state": {
"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%]",
"high": "[%key:common::state::high%]",
"low": "[%key:common::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%]"
"very_high": "[%key:common::state::very_high%]"
}
}
}
@@ -195,10 +195,10 @@
"level": {
"name": "[%key:component::accuweather::entity::sensor::grass_pollen::state_attributes::level::name%]",
"state": {
"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%]",
"high": "[%key:common::state::high%]",
"low": "[%key:common::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%]"
"very_high": "[%key:common::state::very_high%]"
}
}
}
@@ -11,5 +11,5 @@
"documentation": "https://www.home-assistant.io/integrations/airzone",
"iot_class": "local_polling",
"loggers": ["aioairzone"],
"requirements": ["aioairzone==0.9.9"]
"requirements": ["aioairzone==1.0.0"]
}
@@ -9,6 +9,8 @@ from aioairzone.const import (
AZD_HUMIDITY,
AZD_TEMP,
AZD_TEMP_UNIT,
AZD_THERMOSTAT_BATTERY,
AZD_THERMOSTAT_SIGNAL,
AZD_WEBSERVER,
AZD_WIFI_RSSI,
AZD_ZONES,
@@ -73,6 +75,20 @@ ZONE_SENSOR_TYPES: Final[tuple[SensorEntityDescription, ...]] = (
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
device_class=SensorDeviceClass.BATTERY,
key=AZD_THERMOSTAT_BATTERY,
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
entity_category=EntityCategory.DIAGNOSTIC,
entity_registry_enabled_default=False,
key=AZD_THERMOSTAT_SIGNAL,
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
translation_key="thermostat_signal",
),
)
@@ -76,6 +76,9 @@
"sensor": {
"rssi": {
"name": "RSSI"
},
"thermostat_signal": {
"name": "Signal strength"
}
}
}
@@ -34,7 +34,7 @@
"state": {
"off": "[%key:common::state::off%]",
"on": "[%key:common::state::on%]",
"auto": "Auto"
"auto": "[%key:common::state::auto%]"
}
},
"modes": {
@@ -73,7 +73,7 @@ class AndroidTVRemoteBaseEntity(Entity):
self._api.send_key_command(key_code, direction)
except ConnectionClosed as exc:
raise HomeAssistantError(
"Connection to Android TV device is closed"
translation_domain=DOMAIN, translation_key="connection_closed"
) from exc
def _send_launch_app_command(self, app_link: str) -> None:
@@ -85,5 +85,5 @@ class AndroidTVRemoteBaseEntity(Entity):
self._api.send_launch_app_command(app_link)
except ConnectionClosed as exc:
raise HomeAssistantError(
"Connection to Android TV device is closed"
translation_domain=DOMAIN, translation_key="connection_closed"
) from exc
@@ -21,7 +21,7 @@ from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import AndroidTVRemoteConfigEntry
from .const import CONF_APP_ICON, CONF_APP_NAME
from .const import CONF_APP_ICON, CONF_APP_NAME, DOMAIN
from .entity import AndroidTVRemoteBaseEntity
PARALLEL_UPDATES = 0
@@ -233,5 +233,5 @@ class AndroidTVRemoteMediaPlayerEntity(AndroidTVRemoteBaseEntity, MediaPlayerEnt
await asyncio.sleep(delay_secs)
except ConnectionClosed as exc:
raise HomeAssistantError(
"Connection to Android TV device is closed"
translation_domain=DOMAIN, translation_key="connection_closed"
) from exc
@@ -54,5 +54,10 @@
}
}
}
},
"exceptions": {
"connection_closed": {
"message": "Connection to the Android TV device is closed"
}
}
}
@@ -52,7 +52,7 @@ STEP_USER_DATA_SCHEMA = vol.Schema(
RECOMMENDED_OPTIONS = {
CONF_RECOMMENDED: True,
CONF_LLM_HASS_API: llm.LLM_API_ASSIST,
CONF_LLM_HASS_API: [llm.LLM_API_ASSIST],
CONF_PROMPT: llm.DEFAULT_INSTRUCTIONS_PROMPT,
}
@@ -134,9 +134,8 @@ class AnthropicOptionsFlow(OptionsFlow):
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)
if not user_input.get(CONF_LLM_HASS_API):
user_input.pop(CONF_LLM_HASS_API, None)
if user_input.get(
CONF_THINKING_BUDGET, RECOMMENDED_THINKING_BUDGET
) >= user_input.get(CONF_MAX_TOKENS, RECOMMENDED_MAX_TOKENS):
@@ -151,12 +150,16 @@ class AnthropicOptionsFlow(OptionsFlow):
options = {
CONF_RECOMMENDED: user_input[CONF_RECOMMENDED],
CONF_PROMPT: user_input[CONF_PROMPT],
CONF_LLM_HASS_API: user_input[CONF_LLM_HASS_API],
CONF_LLM_HASS_API: user_input.get(CONF_LLM_HASS_API),
}
suggested_values = options.copy()
if not suggested_values.get(CONF_PROMPT):
suggested_values[CONF_PROMPT] = llm.DEFAULT_INSTRUCTIONS_PROMPT
if (
suggested_llm_apis := suggested_values.get(CONF_LLM_HASS_API)
) and isinstance(suggested_llm_apis, str):
suggested_values[CONF_LLM_HASS_API] = [suggested_llm_apis]
schema = self.add_suggested_values_to_schema(
vol.Schema(anthropic_config_option_schema(self.hass, options)),
@@ -176,24 +179,18 @@ def anthropic_config_option_schema(
) -> dict:
"""Return a schema for Anthropic completion options."""
hass_apis: list[SelectOptionDict] = [
SelectOptionDict(
label="No control",
value="none",
)
]
hass_apis.extend(
SelectOptionDict(
label=api.name,
value=api.id,
)
for api in llm.async_get_apis(hass)
)
]
schema = {
vol.Optional(CONF_PROMPT): TemplateSelector(),
vol.Optional(CONF_LLM_HASS_API, default="none"): SelectSelector(
SelectSelectorConfig(options=hass_apis)
),
vol.Optional(
CONF_LLM_HASS_API,
): SelectSelector(SelectSelectorConfig(options=hass_apis, multiple=True)),
vol.Required(
CONF_RECOMMENDED, default=options.get(CONF_RECOMMENDED, False)
): bool,
@@ -266,7 +266,7 @@ async def _transform_stream(
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_args = json.loads(current_tool_args) if current_tool_args else {}
tool_block["input"] = tool_args
yield {
"tool_calls": [
@@ -53,10 +53,8 @@ class OnlineStatus(CoordinatorEntity[APCUPSdCoordinator], BinarySensorEntity):
"""Initialize the APCUPSd binary device."""
super().__init__(coordinator, context=description.key.upper())
# Set up unique id and device info if serial number is available.
if (serial_no := coordinator.data.serial_no) is not None:
self._attr_unique_id = f"{serial_no}_{description.key}"
self.entity_description = description
self._attr_unique_id = f"{coordinator.unique_device_id}_{description.key}"
self._attr_device_info = coordinator.device_info
@property
@@ -85,11 +85,16 @@ class APCUPSdCoordinator(DataUpdateCoordinator[APCUPSdData]):
self._host = host
self._port = port
@property
def unique_device_id(self) -> str:
"""Return a unique ID of the device, which is the serial number (if available) or the config entry ID."""
return self.data.serial_no or self.config_entry.entry_id
@property
def device_info(self) -> DeviceInfo:
"""Return the DeviceInfo of this APC UPS, if serial number is available."""
return DeviceInfo(
identifiers={(DOMAIN, self.data.serial_no or self.config_entry.entry_id)},
identifiers={(DOMAIN, self.unique_device_id)},
model=self.data.model,
manufacturer="APC",
name=self.data.name or "APC UPS",
+1 -4
View File
@@ -458,11 +458,8 @@ class APCUPSdSensor(CoordinatorEntity[APCUPSdCoordinator], SensorEntity):
"""Initialize the sensor."""
super().__init__(coordinator=coordinator, context=description.key.upper())
# Set up unique id and device info if serial number is available.
if (serial_no := coordinator.data.serial_no) is not None:
self._attr_unique_id = f"{serial_no}_{description.key}"
self.entity_description = description
self._attr_unique_id = f"{coordinator.unique_device_id}_{description.key}"
self._attr_device_info = coordinator.device_info
# Initial update of attributes.
@@ -20,6 +20,7 @@ import voluptuous as vol
from homeassistant.components import zeroconf
from homeassistant.config_entries import (
SOURCE_IGNORE,
SOURCE_REAUTH,
SOURCE_ZEROCONF,
ConfigEntry,
ConfigFlow,
@@ -381,7 +382,9 @@ class AppleTVConfigFlow(ConfigFlow, domain=DOMAIN):
CONF_IDENTIFIERS: list(combined_identifiers),
},
)
if entry.source != SOURCE_IGNORE:
# Don't reload ignored entries or in the middle of reauth,
# e.g. if the user is entering a new PIN
if entry.source != SOURCE_IGNORE and self.source != SOURCE_REAUTH:
self.hass.config_entries.async_schedule_reload(entry.entry_id)
if not allow_exist:
raise DeviceAlreadyConfigured
@@ -120,6 +120,7 @@ class AppleTvMediaPlayer(
"""Initialize the Apple TV media player."""
super().__init__(name, identifier, manager)
self._playing: Playing | None = None
self._playing_last_updated: datetime | None = None
self._app_list: dict[str, str] = {}
@callback
@@ -209,6 +210,7 @@ class AppleTvMediaPlayer(
This is a callback function from pyatv.interface.PushListener.
"""
self._playing = playstatus
self._playing_last_updated = dt_util.utcnow()
self.async_write_ha_state()
@callback
@@ -316,7 +318,7 @@ class AppleTvMediaPlayer(
def media_position_updated_at(self) -> datetime | None:
"""Last valid time of media position."""
if self.state in {MediaPlayerState.PLAYING, MediaPlayerState.PAUSED}:
return dt_util.utcnow()
return self._playing_last_updated
return None
async def async_play_media(
@@ -36,9 +36,9 @@
"wi_fi_strength": {
"name": "Wi-Fi strength",
"state": {
"low": "Low",
"medium": "Medium",
"high": "High"
"low": "[%key:common::state::low%]",
"medium": "[%key:common::state::medium%]",
"high": "[%key:common::state::high%]"
}
}
}
+1 -1
View File
@@ -26,7 +26,7 @@
"sensor": {
"threshold": {
"state": {
"error": "Error",
"error": "[%key:common::state::error%]",
"green": "Green",
"yellow": "Yellow",
"red": "Red"
@@ -60,7 +60,8 @@ 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),
vol.Optional("preannounce"): bool,
vol.Optional("preannounce_media_id"): str,
}
),
cv.has_at_least_one_key("message", "media_id"),
@@ -75,7 +76,8 @@ 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("preannounce"): bool,
vol.Optional("preannounce_media_id"): str,
vol.Optional("extra_system_prompt"): str,
}
),
@@ -180,7 +180,8 @@ class AssistSatelliteEntity(entity.Entity):
self,
message: str | None = None,
media_id: str | None = None,
preannounce_media_id: str | None = PREANNOUNCE_URL,
preannounce: bool = True,
preannounce_media_id: str = PREANNOUNCE_URL,
) -> None:
"""Play and show an announcement on the satellite.
@@ -190,8 +191,8 @@ 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 is True, a sound is played before the announcement.
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.
"""
@@ -201,7 +202,9 @@ class AssistSatelliteEntity(entity.Entity):
message = ""
announcement = await self._resolve_announcement_media_id(
message, media_id, preannounce_media_id
message,
media_id,
preannounce_media_id=preannounce_media_id if preannounce else None,
)
if self._is_announcing:
@@ -229,7 +232,8 @@ 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,
preannounce: bool = True,
preannounce_media_id: str = PREANNOUNCE_URL,
) -> None:
"""Start a conversation from the satellite.
@@ -239,8 +243,8 @@ 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.
If preannounce is True, a sound is played before the start message or media.
If preannounce_media_id is provided, it overrides the default sound.
Calls async_start_conversation.
"""
@@ -257,7 +261,9 @@ class AssistSatelliteEntity(entity.Entity):
start_message = ""
announcement = await self._resolve_announcement_media_id(
start_message, start_media_id, preannounce_media_id
start_message,
start_media_id,
preannounce_media_id=preannounce_media_id if preannounce else None,
)
if self._is_announcing:
@@ -15,6 +15,11 @@ announce:
required: false
selector:
text:
preannounce:
required: false
default: true
selector:
boolean:
preannounce_media_id:
required: false
selector:
@@ -40,6 +45,11 @@ start_conversation:
required: false
selector:
text:
preannounce:
required: false
default: true
selector:
boolean:
preannounce_media_id:
required: false
selector:
@@ -24,9 +24,13 @@
"name": "Media ID",
"description": "The media ID to announce instead of using text-to-speech."
},
"preannounce": {
"name": "Preannounce",
"description": "Play a sound before the announcement."
},
"preannounce_media_id": {
"name": "Preannounce Media ID",
"description": "The media ID to play before the announcement."
"name": "Preannounce media ID",
"description": "Custom media ID to play before the announcement."
}
}
},
@@ -46,9 +50,13 @@
"name": "Extra system prompt",
"description": "Provide background information to the AI about the request."
},
"preannounce": {
"name": "Preannounce",
"description": "Play a sound before the start message or media."
},
"preannounce_media_id": {
"name": "Preannounce Media ID",
"description": "The media ID to play before the start message or media."
"name": "Preannounce media ID",
"description": "Custom media ID to play before the start message or media."
}
}
}
@@ -199,7 +199,7 @@ async def websocket_test_connection(
hass.async_create_background_task(
satellite.async_internal_announce(
media_id=f"{CONNECTION_TEST_URL_BASE}/{connection_id}",
preannounce_media_id=None,
preannounce=False,
),
f"assist_satellite_connection_test_{msg['entity_id']}",
)
@@ -175,7 +175,8 @@ class AzureStorageBackupAgent(BackupAgent):
"""Find a blob by backup id."""
async for blob in self._client.list_blobs(include="metadata"):
if (
backup_id == blob.metadata.get("backup_id", "")
blob.metadata is not None
and backup_id == blob.metadata.get("backup_id", "")
and blob.metadata.get("metadata_version") == METADATA_VERSION
):
return blob
@@ -0,0 +1,136 @@
"""Backup onboarding views."""
from __future__ import annotations
from collections.abc import Callable, Coroutine
from functools import wraps
from http import HTTPStatus
from typing import TYPE_CHECKING, Any, Concatenate
from aiohttp import web
from aiohttp.web_exceptions import HTTPUnauthorized
import voluptuous as vol
from homeassistant.components.http import KEY_HASS
from homeassistant.components.http.data_validator import RequestDataValidator
from homeassistant.components.onboarding import (
BaseOnboardingView,
NoAuthBaseOnboardingView,
)
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.backup import async_get_manager as async_get_backup_manager
from . import BackupManager, Folder, IncorrectPasswordError, http as backup_http
if TYPE_CHECKING:
from homeassistant.components.onboarding import OnboardingStoreData
async def async_setup_views(hass: HomeAssistant, data: OnboardingStoreData) -> None:
"""Set up the backup views."""
hass.http.register_view(BackupInfoView(data))
hass.http.register_view(RestoreBackupView(data))
hass.http.register_view(UploadBackupView(data))
def with_backup_manager[_ViewT: BaseOnboardingView, **_P](
func: Callable[
Concatenate[_ViewT, BackupManager, web.Request, _P],
Coroutine[Any, Any, web.Response],
],
) -> Callable[Concatenate[_ViewT, web.Request, _P], Coroutine[Any, Any, web.Response]]:
"""Home Assistant API decorator to check onboarding and inject manager."""
@wraps(func)
async def with_backup(
self: _ViewT,
request: web.Request,
*args: _P.args,
**kwargs: _P.kwargs,
) -> web.Response:
"""Check admin and call function."""
if self._data["done"]:
raise HTTPUnauthorized
manager = await async_get_backup_manager(request.app[KEY_HASS])
return await func(self, manager, request, *args, **kwargs)
return with_backup
class BackupInfoView(NoAuthBaseOnboardingView):
"""Get backup info view."""
url = "/api/onboarding/backup/info"
name = "api:onboarding:backup:info"
@with_backup_manager
async def get(self, manager: BackupManager, request: web.Request) -> web.Response:
"""Return backup info."""
backups, _ = await manager.async_get_backups()
return self.json(
{
"backups": list(backups.values()),
"state": manager.state,
"last_action_event": manager.last_action_event,
}
)
class RestoreBackupView(NoAuthBaseOnboardingView):
"""Restore backup view."""
url = "/api/onboarding/backup/restore"
name = "api:onboarding:backup:restore"
@RequestDataValidator(
vol.Schema(
{
vol.Required("backup_id"): str,
vol.Required("agent_id"): str,
vol.Optional("password"): str,
vol.Optional("restore_addons"): [str],
vol.Optional("restore_database", default=True): bool,
vol.Optional("restore_folders"): [vol.Coerce(Folder)],
}
)
)
@with_backup_manager
async def post(
self, manager: BackupManager, request: web.Request, data: dict[str, Any]
) -> web.Response:
"""Restore a backup."""
try:
await manager.async_restore_backup(
data["backup_id"],
agent_id=data["agent_id"],
password=data.get("password"),
restore_addons=data.get("restore_addons"),
restore_database=data["restore_database"],
restore_folders=data.get("restore_folders"),
restore_homeassistant=True,
)
except IncorrectPasswordError:
return self.json(
{"code": "incorrect_password"}, status_code=HTTPStatus.BAD_REQUEST
)
except HomeAssistantError as err:
return self.json(
{"code": "restore_failed", "message": str(err)},
status_code=HTTPStatus.BAD_REQUEST,
)
return web.Response(status=HTTPStatus.OK)
class UploadBackupView(NoAuthBaseOnboardingView, backup_http.UploadBackupView):
"""Upload backup view."""
url = "/api/onboarding/backup/upload"
name = "api:onboarding:backup:upload"
@with_backup_manager
async def post(self, manager: BackupManager, request: web.Request) -> web.Response:
"""Upload a backup file."""
return await self._post(request)
+1 -1
View File
@@ -31,7 +31,7 @@
"state_attributes": {
"preset_mode": {
"state": {
"auto": "[%key:component::climate::entity_component::_::state_attributes::fan_mode::state::auto%]"
"auto": "[%key:common::state::auto%]"
}
}
}
+2 -2
View File
@@ -103,8 +103,8 @@
"temperature_range": {
"name": "Temperature range",
"state": {
"low": "Low",
"high": "High"
"low": "[%key:common::state::low%]",
"high": "[%key:common::state::high%]"
}
}
},
@@ -124,8 +124,8 @@
"battery": {
"name": "Battery",
"state": {
"off": "Normal",
"on": "Low"
"off": "[%key:common::state::normal%]",
"on": "[%key:common::state::low%]"
}
},
"battery_charging": {
@@ -145,7 +145,7 @@
"cold": {
"name": "Cold",
"state": {
"off": "[%key:component::binary_sensor::entity_component::battery::state::off%]",
"off": "[%key:common::state::normal%]",
"on": "Cold"
}
},
@@ -180,7 +180,7 @@
"heat": {
"name": "Heat",
"state": {
"off": "[%key:component::binary_sensor::entity_component::battery::state::off%]",
"off": "[%key:common::state::normal%]",
"on": "Hot"
}
},
@@ -30,7 +30,7 @@
"available": "Available",
"charging": "[%key:common::state::charging%]",
"unavailable": "Unavailable",
"error": "Error",
"error": "[%key:common::state::error%]",
"offline": "Offline"
}
},
@@ -41,7 +41,7 @@
"vehicle_detected": "Detected",
"ready": "Ready",
"no_power": "No power",
"vehicle_error": "Error"
"vehicle_error": "[%key:common::state::error%]"
}
},
"actual_v1": {
@@ -6,7 +6,7 @@
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/bluesound",
"iot_class": "local_polling",
"requirements": ["pyblu==2.0.0"],
"requirements": ["pyblu==2.0.1"],
"zeroconf": [
{
"type": "_musc._tcp.local."
@@ -330,7 +330,12 @@ class BluesoundPlayer(CoordinatorEntity[BluesoundCoordinator], MediaPlayerEntity
if self._status.input_id is not None:
for input_ in self._inputs:
if input_.id == self._status.input_id:
# the input might not have an id => also try to match on the stream_url/url
# we have to use both because neither matches all the time
if (
input_.id == self._status.input_id
or input_.url == self._status.stream_url
):
return input_.text
for preset in self._presets:
@@ -501,18 +506,16 @@ class BluesoundPlayer(CoordinatorEntity[BluesoundCoordinator], MediaPlayerEntity
return
# presets and inputs might have the same name; presets have priority
url: str | None = None
for input_ in self._inputs:
if input_.text == source:
url = input_.url
await self._player.play_url(input_.url)
return
for preset in self._presets:
if preset.name == source:
url = preset.url
await self._player.load_preset(preset.id)
return
if url is None:
raise ServiceValidationError(f"Source {source} not found")
await self._player.play_url(url)
raise ServiceValidationError(f"Source {source} not found")
async def async_clear_playlist(self) -> None:
"""Clear players playlist."""
@@ -19,8 +19,8 @@
"bleak-retry-connector==3.9.0",
"bluetooth-adapters==0.21.4",
"bluetooth-auto-recovery==1.4.5",
"bluetooth-data-tools==1.26.1",
"bluetooth-data-tools==1.27.0",
"dbus-fast==2.43.0",
"habluetooth==3.37.0"
"habluetooth==3.39.0"
]
}
@@ -374,6 +374,27 @@ class PassiveBluetoothProcessorCoordinator[_DataT](BasePassiveBluetoothCoordinat
self.logger.exception("Unexpected error updating %s data", self.name)
return
self._process_update(update, was_available)
@callback
def async_set_updated_data(self, update: _DataT) -> None:
"""Manually update the processor with new data.
If the data comes in via a different method, like a
notification, this method can be used to update the
processor with the new data.
This is useful for devices that retrieve
some of their data via notifications.
"""
was_available = self._available
self._available = True
self._process_update(update, was_available)
def _process_update(
self, update: _DataT, was_available: bool | None = None
) -> None:
"""Process the update from the bluetooth device."""
if not self.last_update_success:
self.last_update_success = True
self.logger.info("Coordinator %s recovered", self.name)
@@ -139,7 +139,7 @@
"state": {
"default": "Default",
"charging": "[%key:common::state::charging%]",
"error": "Error",
"error": "[%key:common::state::error%]",
"complete": "Complete",
"fully_charged": "Fully charged",
"finished_fully_charged": "Finished, fully charged",
+29 -5
View File
@@ -16,6 +16,7 @@ from homeassistant.const import CONF_ACCESS_TOKEN, CONF_HOST, CONF_NAME
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.service_info.dhcp import DhcpServiceInfo
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from .const import DOMAIN
@@ -91,11 +92,22 @@ class BondConfigFlow(ConfigFlow, domain=DOMAIN):
self._discovered[CONF_ACCESS_TOKEN] = token
try:
_, hub_name = await _validate_input(self.hass, self._discovered)
bond_id, hub_name = await _validate_input(self.hass, self._discovered)
except InputValidationError:
return
await self.async_set_unique_id(bond_id)
self._abort_if_unique_id_configured(updates={CONF_HOST: host})
self._discovered[CONF_NAME] = hub_name
async def async_step_dhcp(
self, discovery_info: DhcpServiceInfo
) -> ConfigFlowResult:
"""Handle a flow initialized by dhcp discovery."""
host = discovery_info.ip
bond_id = discovery_info.hostname.partition("-")[2].upper()
await self.async_set_unique_id(bond_id)
return await self.async_step_any_discovery(bond_id, host)
async def async_step_zeroconf(
self, discovery_info: ZeroconfServiceInfo
) -> ConfigFlowResult:
@@ -104,11 +116,17 @@ class BondConfigFlow(ConfigFlow, domain=DOMAIN):
host: str = discovery_info.host
bond_id = name.partition(".")[0]
await self.async_set_unique_id(bond_id)
return await self.async_step_any_discovery(bond_id, host)
async def async_step_any_discovery(
self, bond_id: str, host: str
) -> ConfigFlowResult:
"""Handle a flow initialized by discovery."""
for entry in self._async_current_entries():
if entry.unique_id != bond_id:
continue
updates = {CONF_HOST: host}
if entry.state == ConfigEntryState.SETUP_ERROR and (
if entry.state is ConfigEntryState.SETUP_ERROR and (
token := await async_get_token(self.hass, host)
):
updates[CONF_ACCESS_TOKEN] = token
@@ -153,10 +171,14 @@ class BondConfigFlow(ConfigFlow, domain=DOMAIN):
CONF_HOST: self._discovered[CONF_HOST],
}
try:
_, hub_name = await _validate_input(self.hass, data)
bond_id, hub_name = await _validate_input(self.hass, data)
except InputValidationError as error:
errors["base"] = error.base
else:
await self.async_set_unique_id(bond_id)
self._abort_if_unique_id_configured(
updates={CONF_HOST: self._discovered[CONF_HOST]}
)
return self.async_create_entry(
title=hub_name,
data=data,
@@ -185,8 +207,10 @@ class BondConfigFlow(ConfigFlow, domain=DOMAIN):
except InputValidationError as error:
errors["base"] = error.base
else:
await self.async_set_unique_id(bond_id)
self._abort_if_unique_id_configured()
await self.async_set_unique_id(bond_id, raise_on_progress=False)
self._abort_if_unique_id_configured(
updates={CONF_HOST: user_input[CONF_HOST]}
)
return self.async_create_entry(title=hub_name, data=user_input)
return self.async_show_form(
@@ -3,6 +3,16 @@
"name": "Bond",
"codeowners": ["@bdraco", "@prystupa", "@joshs85", "@marciogranzotto"],
"config_flow": true,
"dhcp": [
{
"hostname": "bond-*",
"macaddress": "3C6A2C1*"
},
{
"hostname": "bond-*",
"macaddress": "F44E38*"
}
],
"documentation": "https://www.home-assistant.io/integrations/bond",
"iot_class": "local_push",
"loggers": ["bond_async"],
@@ -9,12 +9,12 @@ 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.exceptions import ConfigEntryAuthFailed, 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]
PLATFORMS: list[Platform] = [Platform.ALARM_CONTROL_PANEL, Platform.SENSOR]
type BoschAlarmConfigEntry = ConfigEntry[Panel]
@@ -34,10 +34,15 @@ async def async_setup_entry(hass: HomeAssistant, entry: BoschAlarmConfigEntry) -
await panel.connect()
except (PermissionError, ValueError) as err:
await panel.disconnect()
raise ConfigEntryNotReady from err
raise ConfigEntryAuthFailed(
translation_domain=DOMAIN, translation_key="authentication_failed"
) from err
except (TimeoutError, OSError, ConnectionRefusedError, SSLError) as err:
await panel.disconnect()
raise ConfigEntryNotReady("Connection failed") from err
raise ConfigEntryNotReady(
translation_domain=DOMAIN,
translation_key="cannot_connect",
) from err
entry.runtime_data = panel
@@ -10,11 +10,10 @@ from homeassistant.components.alarm_control_panel import (
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
from .entity import BoschAlarmAreaEntity
async def async_setup_entry(
@@ -35,7 +34,7 @@ async def async_setup_entry(
)
class AreaAlarmControlPanel(AlarmControlPanelEntity):
class AreaAlarmControlPanel(BoschAlarmAreaEntity, AlarmControlPanelEntity):
"""An alarm control panel entity for a bosch alarm panel."""
_attr_has_entity_name = True
@@ -48,19 +47,8 @@ class AreaAlarmControlPanel(AlarmControlPanelEntity):
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,
),
)
super().__init__(panel, area_id, unique_id, False, False, True)
self._attr_unique_id = self._area_unique_id
@property
def alarm_state(self) -> AlarmControlPanelState | None:
@@ -90,20 +78,3 @@ class AreaAlarmControlPanel(AlarmControlPanelEntity):
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)
@@ -3,6 +3,7 @@
from __future__ import annotations
import asyncio
from collections.abc import Mapping
import logging
import ssl
from typing import Any
@@ -10,7 +11,12 @@ from typing import Any
from bosch_alarm_mode2 import Panel
import voluptuous as vol
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.config_entries import (
SOURCE_RECONFIGURE,
SOURCE_USER,
ConfigFlow,
ConfigFlowResult,
)
from homeassistant.const import (
CONF_CODE,
CONF_HOST,
@@ -107,6 +113,13 @@ class BoschAlarmConfigFlow(ConfigFlow, domain=DOMAIN):
else:
self._data = user_input
self._data[CONF_MODEL] = model
if self.source == SOURCE_RECONFIGURE:
if (
self._get_reconfigure_entry().data[CONF_MODEL]
!= self._data[CONF_MODEL]
):
return self.async_abort(reason="device_mismatch")
return await self.async_step_auth()
return self.async_show_form(
step_id="user",
@@ -116,6 +129,12 @@ class BoschAlarmConfigFlow(ConfigFlow, domain=DOMAIN):
errors=errors,
)
async def async_step_reconfigure(
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
"""Handle the reconfigure step."""
return await self.async_step_user()
async def async_step_auth(
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
@@ -153,13 +172,77 @@ class BoschAlarmConfigFlow(ConfigFlow, domain=DOMAIN):
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)
if self.source == SOURCE_USER:
if 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
)
if serial_number:
self._abort_if_unique_id_mismatch(reason="device_mismatch")
return self.async_update_reload_and_abort(
self._get_reconfigure_entry(),
data=self._data,
)
return self.async_show_form(
step_id="auth",
data_schema=self.add_suggested_values_to_schema(schema, user_input),
errors=errors,
)
async def async_step_reauth(
self, entry_data: Mapping[str, Any]
) -> ConfigFlowResult:
"""Perform reauth upon an authentication error."""
self._data = dict(entry_data)
return await self.async_step_reauth_confirm()
async def async_step_reauth_confirm(
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
"""Handle the reauth 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:
reauth_entry = self._get_reauth_entry()
self._data.update(user_input)
try:
(_, _) = 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:
return self.async_update_reload_and_abort(
reauth_entry,
data_updates=user_input,
)
return self.async_show_form(
step_id="reauth_confirm",
data_schema=self.add_suggested_values_to_schema(schema, user_input),
errors=errors,
)
@@ -0,0 +1,73 @@
"""Diagnostics for bosch alarm."""
from typing import Any
from homeassistant.components.diagnostics import async_redact_data
from homeassistant.const import CONF_PASSWORD
from homeassistant.core import HomeAssistant
from . import BoschAlarmConfigEntry
from .const import CONF_INSTALLER_CODE, CONF_USER_CODE
TO_REDACT = [CONF_INSTALLER_CODE, CONF_USER_CODE, CONF_PASSWORD]
async def async_get_config_entry_diagnostics(
hass: HomeAssistant, entry: BoschAlarmConfigEntry
) -> dict[str, Any]:
"""Return diagnostics for a config entry."""
return {
"entry_data": async_redact_data(entry.data, TO_REDACT),
"data": {
"model": entry.runtime_data.model,
"serial_number": entry.runtime_data.serial_number,
"protocol_version": entry.runtime_data.protocol_version,
"firmware_version": entry.runtime_data.firmware_version,
"areas": [
{
"id": area_id,
"name": area.name,
"all_ready": area.all_ready,
"part_ready": area.part_ready,
"faults": area.faults,
"alarms": area.alarms,
"disarmed": area.is_disarmed(),
"arming": area.is_arming(),
"pending": area.is_pending(),
"part_armed": area.is_part_armed(),
"all_armed": area.is_all_armed(),
"armed": area.is_armed(),
"triggered": area.is_triggered(),
}
for area_id, area in entry.runtime_data.areas.items()
],
"points": [
{
"id": point_id,
"name": point.name,
"open": point.is_open(),
"normal": point.is_normal(),
}
for point_id, point in entry.runtime_data.points.items()
],
"doors": [
{
"id": door_id,
"name": door.name,
"open": door.is_open(),
"locked": door.is_locked(),
}
for door_id, door in entry.runtime_data.doors.items()
],
"outputs": [
{
"id": output_id,
"name": output.name,
"active": output.is_active(),
}
for output_id, output in entry.runtime_data.outputs.items()
],
"history_events": entry.runtime_data.events,
},
}
@@ -0,0 +1,88 @@
"""Support for Bosch Alarm Panel History as a sensor."""
from __future__ import annotations
from bosch_alarm_mode2 import Panel
from homeassistant.components.sensor import Entity
from homeassistant.helpers.device_registry import DeviceInfo
from .const import DOMAIN
PARALLEL_UPDATES = 0
class BoschAlarmEntity(Entity):
"""A base entity for a bosch alarm panel."""
_attr_has_entity_name = True
def __init__(self, panel: Panel, unique_id: str) -> None:
"""Set up a entity for a bosch alarm panel."""
self.panel = panel
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, unique_id)},
name=f"Bosch {panel.model}",
manufacturer="Bosch Security Systems",
)
@property
def available(self) -> bool:
"""Return True if entity is available."""
return self.panel.connection_status()
async def async_added_to_hass(self) -> None:
"""Observe state changes."""
self.panel.connection_status_observer.attach(self.schedule_update_ha_state)
async def async_will_remove_from_hass(self) -> None:
"""Stop observing state changes."""
self.panel.connection_status_observer.detach(self.schedule_update_ha_state)
class BoschAlarmAreaEntity(BoschAlarmEntity):
"""A base entity for area related entities within a bosch alarm panel."""
def __init__(
self,
panel: Panel,
area_id: int,
unique_id: str,
observe_alarms: bool,
observe_ready: bool,
observe_status: bool,
) -> None:
"""Set up a area related entity for a bosch alarm panel."""
super().__init__(panel, unique_id)
self._area_id = area_id
self._area_unique_id = f"{unique_id}_area_{area_id}"
self._observe_alarms = observe_alarms
self._observe_ready = observe_ready
self._observe_status = observe_status
self._area = panel.areas[area_id]
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, self._area_unique_id)},
name=self._area.name,
manufacturer="Bosch Security Systems",
via_device=(DOMAIN, unique_id),
)
async def async_added_to_hass(self) -> None:
"""Observe state changes."""
await super().async_added_to_hass()
if self._observe_alarms:
self._area.alarm_observer.attach(self.schedule_update_ha_state)
if self._observe_ready:
self._area.ready_observer.attach(self.schedule_update_ha_state)
if self._observe_status:
self._area.status_observer.attach(self.schedule_update_ha_state)
async def async_will_remove_from_hass(self) -> None:
"""Stop observing state changes."""
await super().async_added_to_hass()
if self._observe_alarms:
self._area.alarm_observer.detach(self.schedule_update_ha_state)
if self._observe_ready:
self._area.ready_observer.detach(self.schedule_update_ha_state)
if self._observe_status:
self._area.status_observer.detach(self.schedule_update_ha_state)
@@ -0,0 +1,9 @@
{
"entity": {
"sensor": {
"faulting_points": {
"default": "mdi:alert-circle-outline"
}
}
}
}
@@ -7,5 +7,5 @@
"integration_type": "device",
"iot_class": "local_push",
"quality_scale": "bronze",
"requirements": ["bosch-alarm-mode2==0.4.3"]
"requirements": ["bosch-alarm-mode2==0.4.6"]
}
@@ -40,7 +40,7 @@ rules:
integration-owner: done
log-when-unavailable: todo
parallel-updates: todo
reauthentication-flow: todo
reauthentication-flow: done
test-coverage: done
# Gold
@@ -62,9 +62,9 @@ rules:
entity-category: todo
entity-device-class: todo
entity-disabled-by-default: todo
entity-translations: todo
entity-translations: done
exception-translations: todo
icon-translations: todo
icon-translations: done
reconfiguration-flow: todo
repair-issues:
status: exempt
@@ -0,0 +1,86 @@
"""Support for Bosch Alarm Panel History as a sensor."""
from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
from bosch_alarm_mode2 import Panel
from bosch_alarm_mode2.panel import Area
from homeassistant.components.sensor import SensorEntity, SensorEntityDescription
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import BoschAlarmConfigEntry
from .entity import BoschAlarmAreaEntity
@dataclass(kw_only=True, frozen=True)
class BoschAlarmSensorEntityDescription(SensorEntityDescription):
"""Describes Bosch Alarm sensor entity."""
value_fn: Callable[[Area], int]
observe_alarms: bool = False
observe_ready: bool = False
observe_status: bool = False
SENSOR_TYPES: list[BoschAlarmSensorEntityDescription] = [
BoschAlarmSensorEntityDescription(
key="faulting_points",
translation_key="faulting_points",
value_fn=lambda area: area.faults,
observe_ready=True,
),
]
async def async_setup_entry(
hass: HomeAssistant,
config_entry: BoschAlarmConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up bosch alarm sensors."""
panel = config_entry.runtime_data
unique_id = config_entry.unique_id or config_entry.entry_id
async_add_entities(
BoschAreaSensor(panel, area_id, unique_id, template)
for area_id in panel.areas
for template in SENSOR_TYPES
)
PARALLEL_UPDATES = 0
class BoschAreaSensor(BoschAlarmAreaEntity, SensorEntity):
"""An area sensor entity for a bosch alarm panel."""
entity_description: BoschAlarmSensorEntityDescription
def __init__(
self,
panel: Panel,
area_id: int,
unique_id: str,
entity_description: BoschAlarmSensorEntityDescription,
) -> None:
"""Set up an area sensor entity for a bosch alarm panel."""
super().__init__(
panel,
area_id,
unique_id,
entity_description.observe_alarms,
entity_description.observe_ready,
entity_description.observe_status,
)
self.entity_description = entity_description
self._attr_unique_id = f"{self._area_unique_id}_{entity_description.key}"
@property
def native_value(self) -> int:
"""Return the state of the sensor."""
return self.entity_description.value_fn(self._area)
@@ -22,6 +22,18 @@
"installer_code": "The installer code from your panel",
"user_code": "The user code from your panel"
}
},
"reauth_confirm": {
"data": {
"password": "[%key:common::config_flow::data::password%]",
"installer_code": "[%key:component::bosch_alarm::config::step::auth::data::installer_code%]",
"user_code": "[%key:component::bosch_alarm::config::step::auth::data::user_code%]"
},
"data_description": {
"password": "[%key:component::bosch_alarm::config::step::auth::data_description::password%]",
"installer_code": "[%key:component::bosch_alarm::config::step::auth::data_description::installer_code%]",
"user_code": "[%key:component::bosch_alarm::config::step::auth::data_description::user_code%]"
}
}
},
"error": {
@@ -30,7 +42,26 @@
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]",
"device_mismatch": "Please ensure you reconfigure against the same device."
}
},
"exceptions": {
"cannot_connect": {
"message": "Could not connect to panel."
},
"authentication_failed": {
"message": "Incorrect credentials for panel."
}
},
"entity": {
"sensor": {
"faulting_points": {
"name": "Faulting points",
"unit_of_measurement": "points"
}
}
}
}
+1 -1
View File
@@ -13,7 +13,7 @@
},
"data_description": {
"email": "The email address associated with your Bring! account.",
"password": "The password to login to your Bring! account."
"password": "The password to log in to your Bring! account."
}
},
"reauth_confirm": {
@@ -12,6 +12,7 @@ from buienradar.constants import (
CONDITION,
CONTENT,
DATA,
FEELTEMPERATURE,
FORECAST,
HUMIDITY,
MESSAGE,
@@ -22,6 +23,7 @@ from buienradar.constants import (
TEMPERATURE,
VISIBILITY,
WINDAZIMUTH,
WINDGUST,
WINDSPEED,
)
from buienradar.urls import JSON_FEED_URL, json_precipitation_forecast_url
@@ -200,6 +202,14 @@ class BrData:
except (ValueError, TypeError):
return None
@property
def feeltemperature(self):
"""Return the feeltemperature, or None."""
try:
return float(self.data.get(FEELTEMPERATURE))
except (ValueError, TypeError):
return None
@property
def pressure(self):
"""Return the pressure, or None."""
@@ -224,6 +234,14 @@ class BrData:
except (ValueError, TypeError):
return None
@property
def wind_gust(self):
"""Return the windgust, or None."""
try:
return float(self.data.get(WINDGUST))
except (ValueError, TypeError):
return None
@property
def wind_speed(self):
"""Return the windspeed, or None."""
@@ -9,6 +9,7 @@ from buienradar.constants import (
MAX_TEMP,
MIN_TEMP,
RAIN,
RAIN_CHANCE,
WINDAZIMUTH,
WINDSPEED,
)
@@ -33,6 +34,7 @@ from homeassistant.components.weather import (
ATTR_FORECAST_NATIVE_TEMP,
ATTR_FORECAST_NATIVE_TEMP_LOW,
ATTR_FORECAST_NATIVE_WIND_SPEED,
ATTR_FORECAST_PRECIPITATION_PROBABILITY,
ATTR_FORECAST_TIME,
ATTR_FORECAST_WIND_BEARING,
Forecast,
@@ -153,7 +155,9 @@ class BrWeather(WeatherEntity):
)
self._attr_native_pressure = data.pressure
self._attr_native_temperature = data.temperature
self._attr_native_apparent_temperature = data.feeltemperature
self._attr_native_visibility = data.visibility
self._attr_native_wind_gust_speed = data.wind_gust
self._attr_native_wind_speed = data.wind_speed
self._attr_wind_bearing = data.wind_bearing
@@ -188,6 +192,7 @@ class BrWeather(WeatherEntity):
ATTR_FORECAST_NATIVE_TEMP_LOW: data_in.get(MIN_TEMP),
ATTR_FORECAST_NATIVE_TEMP: data_in.get(MAX_TEMP),
ATTR_FORECAST_NATIVE_PRECIPITATION: data_in.get(RAIN),
ATTR_FORECAST_PRECIPITATION_PROBABILITY: data_in.get(RAIN_CHANCE),
ATTR_FORECAST_WIND_BEARING: data_in.get(WINDAZIMUTH),
ATTR_FORECAST_NATIVE_WIND_SPEED: data_in.get(WINDSPEED),
}
@@ -74,7 +74,7 @@
},
"get_events": {
"name": "Get events",
"description": "Get events on a calendar within a time range.",
"description": "Retrieves events on a calendar within a time range.",
"fields": {
"start_date_time": {
"name": "Start time",
+1 -8
View File
@@ -2,17 +2,10 @@
from __future__ import annotations
from contextlib import suppress
import logging
from typing import TYPE_CHECKING, Literal, cast
with suppress(Exception):
# TurboJPEG imports numpy which may or may not work so
# we have to guard the import here. We still want
# to import it at top level so it gets loaded
# in the import executor and not in the event loop.
from turbojpeg import TurboJPEG
from turbojpeg import TurboJPEG
if TYPE_CHECKING:
from . import Image
@@ -28,10 +28,10 @@
"name": "Thermostat",
"state": {
"off": "[%key:common::state::off%]",
"auto": "[%key:common::state::auto%]",
"heat": "Heat",
"cool": "Cool",
"heat_cool": "Heat/Cool",
"auto": "Auto",
"dry": "Dry",
"fan_only": "Fan only"
},
@@ -50,10 +50,10 @@
"state": {
"off": "[%key:common::state::off%]",
"on": "[%key:common::state::on%]",
"auto": "Auto",
"low": "Low",
"medium": "Medium",
"high": "High",
"auto": "[%key:common::state::auto%]",
"low": "[%key:common::state::low%]",
"medium": "[%key:common::state::medium%]",
"high": "[%key:common::state::high%]",
"top": "Top",
"middle": "Middle",
"focus": "Focus",
@@ -69,13 +69,13 @@
"hvac_action": {
"name": "Current action",
"state": {
"off": "[%key:common::state::off%]",
"idle": "[%key:common::state::idle%]",
"cooling": "Cooling",
"defrosting": "Defrosting",
"drying": "Drying",
"fan": "Fan",
"heating": "Heating",
"idle": "[%key:common::state::idle%]",
"off": "[%key:common::state::off%]",
"preheating": "Preheating"
}
},
@@ -258,7 +258,7 @@
"hvac_mode": {
"options": {
"off": "[%key:common::state::off%]",
"auto": "Auto",
"auto": "[%key:common::state::auto%]",
"cool": "Cool",
"dry": "Dry",
"fan_only": "Fan only",
@@ -127,7 +127,11 @@ class CloudOAuth2Implementation(config_entry_oauth2_flow.AbstractOAuth2Implement
flow_id=flow_id, user_input=tokens
)
self.hass.async_create_task(await_tokens())
# It's a background task because it should be cancelled on shutdown and there's nothing else
# we can do in such case. There's also no need to wait for this during setup.
self.hass.async_create_background_task(
await_tokens(), name="Awaiting OAuth tokens"
)
return authorize_url
@@ -0,0 +1,110 @@
"""Cloud onboarding views."""
from __future__ import annotations
from collections.abc import Callable, Coroutine
from functools import wraps
from typing import TYPE_CHECKING, Any, Concatenate
from aiohttp import web
from aiohttp.web_exceptions import HTTPUnauthorized
from homeassistant.components.http import KEY_HASS
from homeassistant.components.onboarding import (
BaseOnboardingView,
NoAuthBaseOnboardingView,
)
from homeassistant.core import HomeAssistant
from . import http_api as cloud_http
from .const import DATA_CLOUD
if TYPE_CHECKING:
from homeassistant.components.onboarding import OnboardingStoreData
async def async_setup_views(hass: HomeAssistant, data: OnboardingStoreData) -> None:
"""Set up the cloud views."""
hass.http.register_view(CloudForgotPasswordView(data))
hass.http.register_view(CloudLoginView(data))
hass.http.register_view(CloudLogoutView(data))
hass.http.register_view(CloudStatusView(data))
def ensure_not_done[_ViewT: BaseOnboardingView, **_P](
func: Callable[
Concatenate[_ViewT, web.Request, _P],
Coroutine[Any, Any, web.Response],
],
) -> Callable[Concatenate[_ViewT, web.Request, _P], Coroutine[Any, Any, web.Response]]:
"""Home Assistant API decorator to check onboarding and cloud."""
@wraps(func)
async def _ensure_not_done(
self: _ViewT,
request: web.Request,
*args: _P.args,
**kwargs: _P.kwargs,
) -> web.Response:
"""Check onboarding status, cloud and call function."""
if self._data["done"]:
# If at least one onboarding step is done, we don't allow accessing
# the cloud onboarding views.
raise HTTPUnauthorized
return await func(self, request, *args, **kwargs)
return _ensure_not_done
class CloudForgotPasswordView(
NoAuthBaseOnboardingView, cloud_http.CloudForgotPasswordView
):
"""View to start Forgot Password flow."""
url = "/api/onboarding/cloud/forgot_password"
name = "api:onboarding:cloud:forgot_password"
@ensure_not_done
async def post(self, request: web.Request) -> web.Response:
"""Handle forgot password request."""
return await super()._post(request)
class CloudLoginView(NoAuthBaseOnboardingView, cloud_http.CloudLoginView):
"""Login to Home Assistant Cloud."""
url = "/api/onboarding/cloud/login"
name = "api:onboarding:cloud:login"
@ensure_not_done
async def post(self, request: web.Request) -> web.Response:
"""Handle login request."""
return await super()._post(request)
class CloudLogoutView(NoAuthBaseOnboardingView, cloud_http.CloudLogoutView):
"""Log out of the Home Assistant cloud."""
url = "/api/onboarding/cloud/logout"
name = "api:onboarding:cloud:logout"
@ensure_not_done
async def post(self, request: web.Request) -> web.Response:
"""Handle logout request."""
return await super()._post(request)
class CloudStatusView(NoAuthBaseOnboardingView):
"""Get cloud status view."""
url = "/api/onboarding/cloud/status"
name = "api:onboarding:cloud:status"
@ensure_not_done
async def get(self, request: web.Request) -> web.Response:
"""Return cloud status."""
hass = request.app[KEY_HASS]
cloud = hass.data[DATA_CLOUD]
return self.json({"logged_in": cloud.is_logged_in})
@@ -83,7 +83,6 @@ class ComelitAlarmEntity(CoordinatorEntity[ComelitVedoSystem], AlarmControlPanel
config_entry_entry_id: str,
) -> None:
"""Initialize the alarm panel."""
self._api = coordinator.api
self._area_index = area.index
super().__init__(coordinator)
# Use config_entry.entry_id as base for unique_id
@@ -137,30 +136,38 @@ class ComelitAlarmEntity(CoordinatorEntity[ComelitVedoSystem], AlarmControlPanel
async def async_alarm_disarm(self, code: str | None = None) -> None:
"""Send disarm command."""
if code != str(self._api.device_pin):
if code != str(self.coordinator.api.device_pin):
return
await self._api.set_zone_status(self._area.index, ALARM_ACTIONS[DISABLE])
await self.coordinator.api.set_zone_status(
self._area.index, ALARM_ACTIONS[DISABLE]
)
await self._async_update_state(
AlarmAreaState.DISARMED, ALARM_AREA_ARMED_STATUS[DISABLE]
)
async def async_alarm_arm_away(self, code: str | None = None) -> None:
"""Send arm away command."""
await self._api.set_zone_status(self._area.index, ALARM_ACTIONS[AWAY])
await self.coordinator.api.set_zone_status(
self._area.index, ALARM_ACTIONS[AWAY]
)
await self._async_update_state(
AlarmAreaState.ARMED, ALARM_AREA_ARMED_STATUS[AWAY]
)
async def async_alarm_arm_home(self, code: str | None = None) -> None:
"""Send arm home command."""
await self._api.set_zone_status(self._area.index, ALARM_ACTIONS[HOME])
await self.coordinator.api.set_zone_status(
self._area.index, ALARM_ACTIONS[HOME]
)
await self._async_update_state(
AlarmAreaState.ARMED, ALARM_AREA_ARMED_STATUS[HOME_P1]
)
async def async_alarm_arm_night(self, code: str | None = None) -> None:
"""Send arm night command."""
await self._api.set_zone_status(self._area.index, ALARM_ACTIONS[NIGHT])
await self.coordinator.api.set_zone_status(
self._area.index, ALARM_ACTIONS[NIGHT]
)
await self._async_update_state(
AlarmAreaState.ARMED, ALARM_AREA_ARMED_STATUS[NIGHT]
)
@@ -50,7 +50,6 @@ class ComelitVedoBinarySensorEntity(
config_entry_entry_id: str,
) -> None:
"""Init sensor entity."""
self._api = coordinator.api
self._zone_index = zone.index
super().__init__(coordinator)
# Use config_entry.entry_id as base for unique_id
+3 -10
View File
@@ -19,10 +19,10 @@ from homeassistant.const import ATTR_TEMPERATURE, PRECISION_TENTHS
from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import DOMAIN
from .coordinator import ComelitConfigEntry, ComelitSerialBridge
from .entity import ComelitBridgeBaseEntity
# Coordinator is used to centralize the data updates
PARALLEL_UPDATES = 0
@@ -89,7 +89,7 @@ async def async_setup_entry(
)
class ComelitClimateEntity(CoordinatorEntity[ComelitSerialBridge], ClimateEntity):
class ComelitClimateEntity(ComelitBridgeBaseEntity, ClimateEntity):
"""Climate device."""
_attr_hvac_modes = [HVACMode.AUTO, HVACMode.COOL, HVACMode.HEAT, HVACMode.OFF]
@@ -102,7 +102,6 @@ class ComelitClimateEntity(CoordinatorEntity[ComelitSerialBridge], ClimateEntity
)
_attr_target_temperature_step = PRECISION_TENTHS
_attr_temperature_unit = UnitOfTemperature.CELSIUS
_attr_has_entity_name = True
_attr_name = None
def __init__(
@@ -112,13 +111,7 @@ class ComelitClimateEntity(CoordinatorEntity[ComelitSerialBridge], ClimateEntity
config_entry_entry_id: str,
) -> None:
"""Init light entity."""
self._api = coordinator.api
self._device = device
super().__init__(coordinator)
# Use config_entry.entry_id as base for unique_id
# because no serial number or mac is available
self._attr_unique_id = f"{config_entry_entry_id}-{device.index}"
self._attr_device_info = coordinator.platform_device_info(device, device.type)
super().__init__(coordinator, device, config_entry_entry_id)
self._update_attributes()
def _update_attributes(self) -> None:
@@ -2,6 +2,7 @@
from __future__ import annotations
from asyncio.exceptions import TimeoutError
from collections.abc import Mapping
from typing import Any
@@ -53,10 +54,18 @@ async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> dict[str,
try:
await api.login()
except aiocomelit_exceptions.CannotConnect as err:
raise CannotConnect from err
except (aiocomelit_exceptions.CannotConnect, TimeoutError) as err:
raise CannotConnect(
translation_domain=DOMAIN,
translation_key="cannot_connect",
translation_placeholders={"error": repr(err)},
) from err
except aiocomelit_exceptions.CannotAuthenticate as err:
raise InvalidAuth from err
raise InvalidAuth(
translation_domain=DOMAIN,
translation_key="cannot_authenticate",
translation_placeholders={"error": repr(err)},
) from err
finally:
await api.logout()
await api.close()
+4 -13
View File
@@ -11,9 +11,9 @@ from homeassistant.components.cover import CoverDeviceClass, CoverEntity, CoverS
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.restore_state import RestoreEntity
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .coordinator import ComelitConfigEntry, ComelitSerialBridge
from .entity import ComelitBridgeBaseEntity
# Coordinator is used to centralize the data updates
PARALLEL_UPDATES = 0
@@ -34,13 +34,10 @@ async def async_setup_entry(
)
class ComelitCoverEntity(
CoordinatorEntity[ComelitSerialBridge], RestoreEntity, CoverEntity
):
class ComelitCoverEntity(ComelitBridgeBaseEntity, RestoreEntity, CoverEntity):
"""Cover device."""
_attr_device_class = CoverDeviceClass.SHUTTER
_attr_has_entity_name = True
_attr_name = None
def __init__(
@@ -50,13 +47,7 @@ class ComelitCoverEntity(
config_entry_entry_id: str,
) -> None:
"""Init cover entity."""
self._api = coordinator.api
self._device = device
super().__init__(coordinator)
# Use config_entry.entry_id as base for unique_id
# because no serial number or mac is available
self._attr_unique_id = f"{config_entry_entry_id}-{device.index}"
self._attr_device_info = coordinator.platform_device_info(device, device.type)
super().__init__(coordinator, device, config_entry_entry_id)
# Device doesn't provide a status so we assume UNKNOWN at first startup
self._last_action: int | None = None
self._last_state: str | None = None
@@ -101,7 +92,7 @@ class ComelitCoverEntity(
async def _cover_set_state(self, action: int, state: int) -> None:
"""Set desired cover state."""
self._last_state = self.state
await self._api.set_device_status(COVER, self._device.index, action)
await self.coordinator.api.set_device_status(COVER, self._device.index, action)
self.coordinator.data[COVER][self._device.index].status = state
self.async_write_ha_state()
@@ -0,0 +1,29 @@
"""Base entity for Comelit."""
from __future__ import annotations
from aiocomelit import ComelitSerialBridgeObject
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .coordinator import ComelitSerialBridge
class ComelitBridgeBaseEntity(CoordinatorEntity[ComelitSerialBridge]):
"""Comelit Bridge base entity."""
_attr_has_entity_name = True
def __init__(
self,
coordinator: ComelitSerialBridge,
device: ComelitSerialBridgeObject,
config_entry_entry_id: str,
) -> None:
"""Init cover entity."""
self._device = device
super().__init__(coordinator)
# Use config_entry.entry_id as base for unique_id
# because no serial number or mac is available
self._attr_unique_id = f"{config_entry_entry_id}-{device.index}"
self._attr_device_info = coordinator.platform_device_info(device, device.type)
+8 -10
View File
@@ -19,10 +19,10 @@ from homeassistant.components.humidifier import (
from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import HomeAssistantError, ServiceValidationError
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import DOMAIN
from .coordinator import ComelitConfigEntry, ComelitSerialBridge
from .entity import ComelitBridgeBaseEntity
# Coordinator is used to centralize the data updates
PARALLEL_UPDATES = 0
@@ -92,14 +92,13 @@ async def async_setup_entry(
async_add_entities(entities)
class ComelitHumidifierEntity(CoordinatorEntity[ComelitSerialBridge], HumidifierEntity):
class ComelitHumidifierEntity(ComelitBridgeBaseEntity, HumidifierEntity):
"""Humidifier device."""
_attr_supported_features = HumidifierEntityFeature.MODES
_attr_available_modes = [MODE_NORMAL, MODE_AUTO]
_attr_min_humidity = 10
_attr_max_humidity = 90
_attr_has_entity_name = True
def __init__(
self,
@@ -112,13 +111,8 @@ class ComelitHumidifierEntity(CoordinatorEntity[ComelitSerialBridge], Humidifier
device_class: HumidifierDeviceClass,
) -> None:
"""Init light entity."""
self._api = coordinator.api
self._device = device
super().__init__(coordinator)
# Use config_entry.entry_id as base for unique_id
# because no serial number or mac is available
super().__init__(coordinator, device, config_entry_entry_id)
self._attr_unique_id = f"{config_entry_entry_id}-{device.index}-{device_class}"
self._attr_device_info = coordinator.platform_device_info(device, device_class)
self._attr_device_class = device_class
self._attr_translation_key = device_class.value
self._active_mode = active_mode
@@ -162,7 +156,7 @@ class ComelitHumidifierEntity(CoordinatorEntity[ComelitSerialBridge], Humidifier
async def async_set_humidity(self, humidity: int) -> None:
"""Set new target humidity."""
if self.mode == HumidifierComelitMode.OFF:
if not self._attr_is_on:
raise ServiceValidationError(
translation_domain=DOMAIN,
translation_key="humidity_while_off",
@@ -190,9 +184,13 @@ class ComelitHumidifierEntity(CoordinatorEntity[ComelitSerialBridge], Humidifier
await self.coordinator.api.set_humidity_status(
self._device.index, self._set_command
)
self._attr_is_on = True
self.async_write_ha_state()
async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn off."""
await self.coordinator.api.set_humidity_status(
self._device.index, HumidifierComelitCommand.OFF
)
self._attr_is_on = False
self.async_write_ha_state()
+2 -19
View File
@@ -4,15 +4,14 @@ from __future__ import annotations
from typing import Any, cast
from aiocomelit import ComelitSerialBridgeObject
from aiocomelit.const import LIGHT, STATE_OFF, STATE_ON
from homeassistant.components.light import ColorMode, LightEntity
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .coordinator import ComelitConfigEntry, ComelitSerialBridge
from .entity import ComelitBridgeBaseEntity
# Coordinator is used to centralize the data updates
PARALLEL_UPDATES = 0
@@ -33,29 +32,13 @@ async def async_setup_entry(
)
class ComelitLightEntity(CoordinatorEntity[ComelitSerialBridge], LightEntity):
class ComelitLightEntity(ComelitBridgeBaseEntity, LightEntity):
"""Light device."""
_attr_color_mode = ColorMode.ONOFF
_attr_has_entity_name = True
_attr_name = None
_attr_supported_color_modes = {ColorMode.ONOFF}
def __init__(
self,
coordinator: ComelitSerialBridge,
device: ComelitSerialBridgeObject,
config_entry_entry_id: str,
) -> None:
"""Init light entity."""
self._api = coordinator.api
self._device = device
super().__init__(coordinator)
# Use config_entry.entry_id as base for unique_id
# because no serial number or mac is available
self._attr_unique_id = f"{config_entry_entry_id}-{device.index}"
self._attr_device_info = coordinator.platform_device_info(device, device.type)
async def _light_set_state(self, state: int) -> None:
"""Set desired light state."""
await self.coordinator.api.set_device_status(LIGHT, self._device.index, state)
@@ -7,5 +7,6 @@
"integration_type": "hub",
"iot_class": "local_polling",
"loggers": ["aiocomelit"],
"quality_scale": "bronze",
"requirements": ["aiocomelit==0.11.3"]
}
@@ -0,0 +1,92 @@
rules:
# Bronze
action-setup:
status: exempt
comment: no actions
appropriate-polling: done
brands: done
common-modules: done
config-flow-test-coverage: done
config-flow: done
dependency-transparency: done
docs-actions:
status: exempt
comment: no actions
docs-high-level-description: done
docs-installation-instructions: done
docs-removal-instructions: done
entity-event-setup:
status: exempt
comment: no events
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: todo
comment: wrap api calls in try block
config-entry-unloading: done
docs-configuration-parameters:
status: exempt
comment: no configuration parameters
docs-installation-parameters: done
entity-unavailable: done
integration-owner: done
log-when-unavailable: done
parallel-updates: done
reauthentication-flow: done
test-coverage: done
# Gold
devices: done
diagnostics: done
discovery-update-info:
status: exempt
comment: device not discoverable
discovery:
status: exempt
comment: device not discoverable
docs-data-update: done
docs-examples: done
docs-known-limitations:
status: exempt
comment: no known limitations, yet
docs-supported-devices:
status: todo
comment: review and complete missing ones
docs-supported-functions: todo
docs-troubleshooting: done
docs-use-cases: done
dynamic-devices:
status: todo
comment: missing implementation
entity-category:
status: todo
comment: PR in progress
entity-device-class: done
entity-disabled-by-default: done
entity-translations: done
exception-translations:
status: todo
comment: PR in progress
icon-translations: done
reconfiguration-flow:
status: todo
comment: PR in progress
repair-issues:
status: exempt
comment: no known use cases for repair issues or flows, yet
stale-devices:
status: todo
comment: missing implementation
# Platinum
async-dependency: done
inject-websession:
status: todo
comment: implement aiohttp_client.async_create_clientsession
strict-typing: done
+3 -10
View File
@@ -19,6 +19,7 @@ from homeassistant.helpers.typing import StateType
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .coordinator import ComelitConfigEntry, ComelitSerialBridge, ComelitVedoSystem
from .entity import ComelitBridgeBaseEntity
# Coordinator is used to centralize the data updates
PARALLEL_UPDATES = 0
@@ -95,10 +96,9 @@ async def async_setup_vedo_entry(
async_add_entities(entities)
class ComelitBridgeSensorEntity(CoordinatorEntity[ComelitSerialBridge], SensorEntity):
class ComelitBridgeSensorEntity(ComelitBridgeBaseEntity, SensorEntity):
"""Sensor device."""
_attr_has_entity_name = True
_attr_name = None
def __init__(
@@ -109,13 +109,7 @@ class ComelitBridgeSensorEntity(CoordinatorEntity[ComelitSerialBridge], SensorEn
description: SensorEntityDescription,
) -> None:
"""Init sensor entity."""
self._api = coordinator.api
self._device = device
super().__init__(coordinator)
# Use config_entry.entry_id as base for unique_id
# because no serial number or mac is available
self._attr_unique_id = f"{config_entry_entry_id}-{device.index}"
self._attr_device_info = coordinator.platform_device_info(device, device.type)
super().__init__(coordinator, device, config_entry_entry_id)
self.entity_description = description
@@ -144,7 +138,6 @@ class ComelitVedoSensorEntity(CoordinatorEntity[ComelitVedoSystem], SensorEntity
description: SensorEntityDescription,
) -> None:
"""Init sensor entity."""
self._api = coordinator.api
self._zone_index = zone.index
super().__init__(coordinator)
# Use config_entry.entry_id as base for unique_id
+10 -2
View File
@@ -42,9 +42,9 @@
"sensor": {
"zone_status": {
"state": {
"open": "[%key:common::state::open%]",
"alarm": "Alarm",
"armed": "Armed",
"open": "Open",
"excluded": "Excluded",
"faulty": "Faulty",
"inhibited": "Inhibited",
@@ -52,7 +52,9 @@
"rest": "Rest",
"sabotated": "Sabotated"
}
},
}
},
"humidifier": {
"humidifier": {
"name": "Humidifier"
},
@@ -67,6 +69,12 @@
},
"invalid_clima_data": {
"message": "Invalid 'clima' data"
},
"cannot_connect": {
"message": "Error connecting: {error}"
},
"cannot_authenticate": {
"message": "Error authenticating: {error}"
}
}
}
+7 -10
View File
@@ -10,9 +10,9 @@ from aiocomelit.const import IRRIGATION, OTHER, STATE_OFF, STATE_ON
from homeassistant.components.switch import SwitchDeviceClass, SwitchEntity
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .coordinator import ComelitConfigEntry, ComelitSerialBridge
from .entity import ComelitBridgeBaseEntity
# Coordinator is used to centralize the data updates
PARALLEL_UPDATES = 0
@@ -39,10 +39,9 @@ async def async_setup_entry(
async_add_entities(entities)
class ComelitSwitchEntity(CoordinatorEntity[ComelitSerialBridge], SwitchEntity):
class ComelitSwitchEntity(ComelitBridgeBaseEntity, SwitchEntity):
"""Switch device."""
_attr_has_entity_name = True
_attr_name = None
def __init__(
@@ -52,13 +51,8 @@ class ComelitSwitchEntity(CoordinatorEntity[ComelitSerialBridge], SwitchEntity):
config_entry_entry_id: str,
) -> None:
"""Init switch entity."""
self._api = coordinator.api
self._device = device
super().__init__(coordinator)
# Use config_entry.entry_id as base for unique_id
# because no serial number or mac is available
super().__init__(coordinator, device, config_entry_entry_id)
self._attr_unique_id = f"{config_entry_entry_id}-{device.type}-{device.index}"
self._attr_device_info = coordinator.platform_device_info(device, device.type)
if device.type == OTHER:
self._attr_device_class = SwitchDeviceClass.OUTLET
@@ -81,4 +75,7 @@ class ComelitSwitchEntity(CoordinatorEntity[ComelitSerialBridge], SwitchEntity):
@property
def is_on(self) -> bool:
"""Return True if switch is on."""
return self.coordinator.data[OTHER][self._device.index].status == STATE_ON
return (
self.coordinator.data[self._device.type][self._device.index].status
== STATE_ON
)
@@ -58,7 +58,8 @@ def async_setup(hass: HomeAssistant) -> bool:
websocket_api.async_register_command(hass, config_entry_get_single)
websocket_api.async_register_command(hass, config_entry_update)
websocket_api.async_register_command(hass, config_entries_subscribe)
websocket_api.async_register_command(hass, config_entries_progress)
websocket_api.async_register_command(hass, config_entries_flow_progress)
websocket_api.async_register_command(hass, config_entries_flow_subscribe)
websocket_api.async_register_command(hass, ignore_config_flow)
websocket_api.async_register_command(hass, config_subentry_delete)
@@ -357,7 +358,7 @@ class SubentryManagerFlowResourceView(
@websocket_api.require_admin
@websocket_api.websocket_command({"type": "config_entries/flow/progress"})
def config_entries_progress(
def config_entries_flow_progress(
hass: HomeAssistant,
connection: websocket_api.ActiveConnection,
msg: dict[str, Any],
@@ -378,6 +379,66 @@ def config_entries_progress(
)
@websocket_api.require_admin
@websocket_api.websocket_command({"type": "config_entries/flow/subscribe"})
def config_entries_flow_subscribe(
hass: HomeAssistant,
connection: websocket_api.ActiveConnection,
msg: dict[str, Any],
) -> None:
"""Subscribe to non user created flows being initiated or removed.
When initiating the subscription, the current flows are sent to the client.
Example of a non-user initiated flow is a discovered Hue hub that
requires user interaction to finish setup.
"""
@callback
def async_on_flow_init_remove(change_type: str, flow_id: str) -> None:
"""Forward config entry state events to websocket."""
if change_type == "removed":
connection.send_message(
websocket_api.event_message(
msg["id"],
[{"type": change_type, "flow_id": flow_id}],
)
)
return
# change_type == "added"
connection.send_message(
websocket_api.event_message(
msg["id"],
[
{
"type": change_type,
"flow_id": flow_id,
"flow": hass.config_entries.flow.async_get(flow_id),
}
],
)
)
connection.subscriptions[msg["id"]] = hass.config_entries.flow.async_subscribe_flow(
async_on_flow_init_remove
)
connection.send_message(
websocket_api.event_message(
msg["id"],
[
{"type": None, "flow_id": flw["flow_id"], "flow": flw}
for flw in hass.config_entries.flow.async_progress()
if flw["context"]["source"]
not in (
config_entries.SOURCE_RECONFIGURE,
config_entries.SOURCE_USER,
)
],
)
)
connection.send_result(msg["id"])
def send_entry_not_found(
connection: websocket_api.ActiveConnection, msg_id: int
) -> None:
@@ -197,6 +197,7 @@ class ChatLog:
(
"?",
";", # Greek question mark
"", # Chinese question mark
)
)
)
@@ -387,7 +388,7 @@ class ChatLog:
self,
conversing_domain: str,
user_input: ConversationInput,
user_llm_hass_api: str | None = None,
user_llm_hass_api: str | list[str] | None = None,
user_llm_prompt: str | None = None,
) -> None:
"""Set the LLM system prompt."""
@@ -73,14 +73,14 @@ async def _async_set_position(
Returns True if the position was set, False if there is no
supported method for setting the position.
"""
if target_position == FULL_CLOSE and CoverEntityFeature.CLOSE in features:
await service_call(SERVICE_CLOSE_COVER, service_data)
elif target_position == FULL_OPEN and CoverEntityFeature.OPEN in features:
await service_call(SERVICE_OPEN_COVER, service_data)
elif CoverEntityFeature.SET_POSITION in features:
if CoverEntityFeature.SET_POSITION in features:
await service_call(
SERVICE_SET_COVER_POSITION, service_data | {ATTR_POSITION: target_position}
)
elif target_position == FULL_CLOSE and CoverEntityFeature.CLOSE in features:
await service_call(SERVICE_CLOSE_COVER, service_data)
elif target_position == FULL_OPEN and CoverEntityFeature.OPEN in features:
await service_call(SERVICE_OPEN_COVER, service_data)
else:
# Requested a position but the cover doesn't support it
return False
@@ -98,15 +98,17 @@ async def _async_set_tilt_position(
Returns True if the tilt position was set, False if there is no
supported method for setting the tilt position.
"""
if target_tilt_position == FULL_CLOSE and CoverEntityFeature.CLOSE_TILT in features:
await service_call(SERVICE_CLOSE_COVER_TILT, service_data)
elif target_tilt_position == FULL_OPEN and CoverEntityFeature.OPEN_TILT in features:
await service_call(SERVICE_OPEN_COVER_TILT, service_data)
elif CoverEntityFeature.SET_TILT_POSITION in features:
if CoverEntityFeature.SET_TILT_POSITION in features:
await service_call(
SERVICE_SET_COVER_TILT_POSITION,
service_data | {ATTR_TILT_POSITION: target_tilt_position},
)
elif (
target_tilt_position == FULL_CLOSE and CoverEntityFeature.CLOSE_TILT in features
):
await service_call(SERVICE_CLOSE_COVER_TILT, service_data)
elif target_tilt_position == FULL_OPEN and CoverEntityFeature.OPEN_TILT in features:
await service_call(SERVICE_OPEN_COVER_TILT, service_data)
else:
# Requested a tilt position but the cover doesn't support it
return False
@@ -183,12 +185,12 @@ async def _async_reproduce_state(
current_attrs = cur_state.attributes
target_attrs = state.attributes
current_position = current_attrs.get(ATTR_CURRENT_POSITION)
target_position = target_attrs.get(ATTR_CURRENT_POSITION)
current_position: int | None = current_attrs.get(ATTR_CURRENT_POSITION)
target_position: int | None = target_attrs.get(ATTR_CURRENT_POSITION)
position_matches = current_position == target_position
current_tilt_position = current_attrs.get(ATTR_CURRENT_TILT_POSITION)
target_tilt_position = target_attrs.get(ATTR_CURRENT_TILT_POSITION)
current_tilt_position: int | None = current_attrs.get(ATTR_CURRENT_TILT_POSITION)
target_tilt_position: int | None = target_attrs.get(ATTR_CURRENT_TILT_POSITION)
tilt_position_matches = current_tilt_position == target_tilt_position
state_matches = cur_state.state == target_state
@@ -214,19 +216,11 @@ async def _async_reproduce_state(
)
service_data = {ATTR_ENTITY_ID: entity_id}
set_position = (
not position_matches
and target_position is not None
and await _async_set_position(
service_call, service_data, features, target_position
)
set_position = target_position is not None and await _async_set_position(
service_call, service_data, features, target_position
)
set_tilt = (
not tilt_position_matches
and target_tilt_position is not None
and await _async_set_tilt_position(
service_call, service_data, features, target_tilt_position
)
set_tilt = target_tilt_position is not None and await _async_set_tilt_position(
service_call, service_data, features, target_tilt_position
)
if target_state in CLOSING_STATES:
@@ -21,6 +21,7 @@ from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.helpers import device_registry as dr, entity_registry as er
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.device_registry import CONNECTION_NETWORK_MAC
from homeassistant.util.ssl import client_context_no_verify
from .const import KEY_MAC, TIMEOUT
from .coordinator import DaikinConfigEntry, DaikinCoordinator
@@ -48,6 +49,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: DaikinConfigEntry) -> bo
key=entry.data.get(CONF_API_KEY),
uuid=entry.data.get(CONF_UUID),
password=entry.data.get(CONF_PASSWORD),
ssl_context=client_context_no_verify(),
)
_LOGGER.debug("Connection to %s successful", host)
except TimeoutError as err:
@@ -18,6 +18,7 @@ from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.const import CONF_API_KEY, CONF_HOST, CONF_PASSWORD, CONF_UUID
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from homeassistant.util.ssl import client_context_no_verify
from .const import DOMAIN, KEY_MAC, TIMEOUT
@@ -90,6 +91,7 @@ class FlowHandler(ConfigFlow, domain=DOMAIN):
key=key,
uuid=uuid,
password=password,
ssl_context=client_context_no_verify(),
)
except (TimeoutError, ClientError):
self.host = None
@@ -6,6 +6,6 @@
"documentation": "https://www.home-assistant.io/integrations/daikin",
"iot_class": "local_polling",
"loggers": ["pydaikin"],
"requirements": ["pydaikin==2.14.1"],
"requirements": ["pydaikin==2.15.0"],
"zeroconf": ["_dkapi._tcp.local."]
}
+1 -1
View File
@@ -2,7 +2,7 @@
"config": {
"step": {
"user": {
"description": "To be able to use this integration, you have to enable the following option in deluge settings: Daemon > Allow remote controls",
"description": "To be able to use this integration, you have to enable the following option in Deluge settings: Daemon > Allow remote controls",
"data": {
"host": "[%key:common::config_flow::data::host%]",
"username": "[%key:common::config_flow::data::username%]",
+11
View File
@@ -45,6 +45,17 @@
}
}
},
"light": {
"bed_light": {
"state_attributes": {
"effect": {
"state": {
"rainbow": "mdi:looks"
}
}
}
}
},
"number": {
"volume": {
"default": "mdi:volume-high"
+5 -1
View File
@@ -15,6 +15,7 @@ from homeassistant.components.light import (
ATTR_WHITE,
DEFAULT_MAX_KELVIN,
DEFAULT_MIN_KELVIN,
EFFECT_OFF,
ColorMode,
LightEntity,
LightEntityFeature,
@@ -28,7 +29,7 @@ from . import DOMAIN
LIGHT_COLORS = [(56, 86), (345, 75)]
LIGHT_EFFECT_LIST = ["rainbow", "none"]
LIGHT_EFFECT_LIST = ["rainbow", EFFECT_OFF]
LIGHT_TEMPS = [4166, 2631]
@@ -48,6 +49,7 @@ async def async_setup_entry(
available=True,
effect_list=LIGHT_EFFECT_LIST,
effect=LIGHT_EFFECT_LIST[0],
translation_key="bed_light",
device_name="Bed Light",
state=False,
unique_id="light_1",
@@ -119,8 +121,10 @@ class DemoLight(LightEntity):
rgbw_color: tuple[int, int, int, int] | None = None,
rgbww_color: tuple[int, int, int, int, int] | None = None,
supported_color_modes: set[ColorMode] | None = None,
translation_key: str | None = None,
) -> None:
"""Initialize the light."""
self._attr_translation_key = translation_key
self._available = True
self._brightness = brightness
self._ct = ct or random.choice(LIGHT_TEMPS)
@@ -41,6 +41,7 @@ async def async_setup_entry(
DemoTVShowPlayer(),
DemoBrowsePlayer("Browse"),
DemoGroupPlayer("Group"),
DemoSearchPlayer("Search"),
]
)
@@ -95,6 +96,8 @@ NETFLIX_PLAYER_SUPPORT = (
BROWSE_PLAYER_SUPPORT = MediaPlayerEntityFeature.BROWSE_MEDIA
SEARCH_PLAYER_SUPPORT = MediaPlayerEntityFeature.SEARCH_MEDIA
class AbstractDemoPlayer(MediaPlayerEntity):
"""A demo media players."""
@@ -398,3 +401,9 @@ class DemoGroupPlayer(AbstractDemoPlayer):
| MediaPlayerEntityFeature.GROUPING
| MediaPlayerEntityFeature.TURN_OFF
)
class DemoSearchPlayer(AbstractDemoPlayer):
"""A Demo media player that supports searching."""
_attr_supported_features = SEARCH_PLAYER_SUPPORT
+22 -11
View File
@@ -28,10 +28,10 @@
"state_attributes": {
"fan_mode": {
"state": {
"auto_high": "Auto High",
"auto_low": "Auto Low",
"on_high": "On High",
"on_low": "On Low"
"auto_high": "Auto high",
"auto_low": "Auto low",
"on_high": "On high",
"on_low": "On low"
}
},
"swing_mode": {
@@ -39,14 +39,14 @@
"1": "1",
"2": "2",
"3": "3",
"auto": "Auto",
"auto": "[%key:common::state::auto%]",
"off": "[%key:common::state::off%]"
}
},
"swing_horizontal_mode": {
"state": {
"rangefull": "Full range",
"auto": "Auto",
"auto": "[%key:common::state::auto%]",
"off": "[%key:common::state::off%]"
}
}
@@ -58,7 +58,7 @@
"state_attributes": {
"preset_mode": {
"state": {
"auto": "[%key:component::climate::entity_component::_::state_attributes::fan_mode::state::auto%]",
"auto": "[%key:common::state::auto%]",
"sleep": "[%key:component::climate::entity_component::_::state_attributes::preset_mode::state::sleep%]",
"smart": "Smart",
"on": "[%key:common::state::on%]"
@@ -78,12 +78,23 @@
}
}
},
"light": {
"bed_light": {
"state_attributes": {
"effect": {
"state": {
"rainbow": "Rainbow"
}
}
}
}
},
"select": {
"speed": {
"state": {
"light_speed": "Light Speed",
"ludicrous_speed": "Ludicrous Speed",
"ridiculous_speed": "Ridiculous Speed"
"light_speed": "Light speed",
"ludicrous_speed": "Ludicrous speed",
"ridiculous_speed": "Ridiculous speed"
}
}
},
@@ -102,7 +113,7 @@
"model_s": {
"state_attributes": {
"cleaned_area": {
"name": "Cleaned Area"
"name": "Cleaned area"
}
}
}
@@ -88,6 +88,8 @@ class DevoloScannerEntity( # pylint: disable=hass-enforce-class-module
):
"""Representation of a devolo device tracker."""
_attr_translation_key = "device_tracker"
def __init__(
self,
coordinator: DevoloDataUpdateCoordinator[list[ConnectedStationInfo]],
@@ -123,13 +125,6 @@ class DevoloScannerEntity( # pylint: disable=hass-enforce-class-module
)
return attrs
@property
def icon(self) -> str:
"""Return device icon."""
if self.is_connected:
return "mdi:lan-connect"
return "mdi:lan-disconnect"
@property
def is_connected(self) -> bool:
"""Return true if the device is connected to the network."""
@@ -13,6 +13,14 @@
"default": "mdi:wifi-plus"
}
},
"device_tracker": {
"device_tracker": {
"default": "mdi:lan-disconnect",
"state": {
"home": "mdi:lan-connect"
}
}
},
"sensor": {
"connected_plc_devices": {
"default": "mdi:lan"
@@ -8,7 +8,7 @@
"integration_type": "device",
"iot_class": "local_polling",
"loggers": ["devolo_plc_api"],
"requirements": ["devolo-plc-api==1.4.1"],
"requirements": ["devolo-plc-api==1.5.1"],
"zeroconf": [
{
"type": "_dvl-deviceapi._tcp.local.",
@@ -114,9 +114,14 @@ class DevoloSwitchEntity[_DataT: _DataType](
translation_key="password_protected",
translation_placeholders={"title": self.entry.title},
) from ex
except DeviceUnavailable:
pass # The coordinator will handle this
await self.coordinator.async_request_refresh()
except DeviceUnavailable as ex:
raise HomeAssistantError(
translation_domain=DOMAIN,
translation_key="no_response",
translation_placeholders={"title": self.entry.title},
) from ex
finally:
await self.coordinator.async_request_refresh()
async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn the entity off."""
@@ -129,6 +134,11 @@ class DevoloSwitchEntity[_DataT: _DataType](
translation_key="password_protected",
translation_placeholders={"title": self.entry.title},
) from ex
except DeviceUnavailable:
pass # The coordinator will handle this
await self.coordinator.async_request_refresh()
except DeviceUnavailable as ex:
raise HomeAssistantError(
translation_domain=DOMAIN,
translation_key="no_response",
translation_placeholders={"title": self.entry.title},
) from ex
finally:
await self.coordinator.async_request_refresh()
@@ -8,7 +8,7 @@
"documentation": "https://www.home-assistant.io/integrations/dlna_dmr",
"iot_class": "local_push",
"loggers": ["async_upnp_client"],
"requirements": ["async-upnp-client==0.43.0", "getmac==0.9.5"],
"requirements": ["async-upnp-client==0.44.0", "getmac==0.9.5"],
"ssdp": [
{
"deviceType": "urn:schemas-upnp-org:device:MediaRenderer:1",
@@ -7,7 +7,7 @@
"dependencies": ["ssdp"],
"documentation": "https://www.home-assistant.io/integrations/dlna_dms",
"iot_class": "local_polling",
"requirements": ["async-upnp-client==0.43.0"],
"requirements": ["async-upnp-client==0.44.0"],
"ssdp": [
{
"deviceType": "urn:schemas-upnp-org:device:MediaServer:1",
+1 -1
View File
@@ -6,5 +6,5 @@
"iot_class": "local_polling",
"loggers": ["pydoods"],
"quality_scale": "legacy",
"requirements": ["pydoods==1.0.2", "Pillow==11.1.0"]
"requirements": ["pydoods==1.0.2", "Pillow==11.2.1"]
}
+1 -1
View File
@@ -7,5 +7,5 @@
"integration_type": "hub",
"iot_class": "local_push",
"loggers": ["dsmr_parser"],
"requirements": ["dsmr-parser==1.4.2"]
"requirements": ["dsmr-parser==1.4.3"]
}
+2 -2
View File
@@ -51,8 +51,8 @@
"electricity_active_tariff": {
"name": "Active tariff",
"state": {
"low": "Low",
"normal": "Normal"
"low": "[%key:common::state::low%]",
"normal": "[%key:common::state::normal%]"
}
},
"electricity_delivered_tariff_1": {
@@ -140,8 +140,8 @@
"electricity_tariff": {
"name": "Electricity tariff",
"state": {
"low": "Low",
"high": "High"
"low": "[%key:common::state::low%]",
"high": "[%key:common::state::high%]"
}
},
"power_failure_count": {
@@ -179,22 +179,18 @@ class DukeEnergyCoordinator(DataUpdateCoordinator[None]):
one = timedelta(days=1)
if start_time is None:
# Max 3 years of data
agreement_date = dt_util.parse_datetime(meter["agreementActiveDate"])
if agreement_date is None:
start = dt_util.now(tz) - timedelta(days=3 * 365)
else:
start = max(
agreement_date.replace(tzinfo=tz),
dt_util.now(tz) - timedelta(days=3 * 365),
)
start = dt_util.now(tz) - timedelta(days=3 * 365)
else:
start = datetime.fromtimestamp(start_time, tz=tz) - lookback
agreement_date = dt_util.parse_datetime(meter["agreementActiveDate"])
if agreement_date is not None:
start = max(agreement_date.replace(tzinfo=tz), start)
start = start.replace(hour=0, minute=0, second=0, microsecond=0)
end = dt_util.now(tz).replace(hour=0, minute=0, second=0, microsecond=0) - one
_LOGGER.debug("Data lookup range: %s - %s", start, end)
start_step = end - lookback
start_step = max(end - lookback, start)
end_step = end
usage: dict[datetime, dict[str, float | int]] = {}
while True:
+7 -7
View File
@@ -55,7 +55,7 @@
"fields": {
"entity_id": {
"name": "Entity",
"description": "Ecobee thermostat on which to create the vacation."
"description": "ecobee thermostat on which to create the vacation."
},
"vacation_name": {
"name": "Vacation name",
@@ -101,7 +101,7 @@
"fields": {
"entity_id": {
"name": "Entity",
"description": "Ecobee thermostat on which to delete the vacation."
"description": "ecobee thermostat on which to delete the vacation."
},
"vacation_name": {
"name": "[%key:component::ecobee::services::create_vacation::fields::vacation_name::name%]",
@@ -149,7 +149,7 @@
},
"set_mic_mode": {
"name": "Set mic mode",
"description": "Enables/disables Alexa microphone (only for Ecobee 4).",
"description": "Enables/disables Alexa microphone (only for ecobee 4).",
"fields": {
"mic_enabled": {
"name": "Mic enabled",
@@ -177,7 +177,7 @@
"fields": {
"entity_id": {
"name": "Entity",
"description": "Ecobee thermostat on which to set active sensors."
"description": "ecobee thermostat on which to set active sensors."
},
"preset_mode": {
"name": "Climate Name",
@@ -203,12 +203,12 @@
},
"issues": {
"migrate_aux_heat": {
"title": "Migration of Ecobee set_aux_heat action",
"title": "Migration of ecobee set_aux_heat action",
"fix_flow": {
"step": {
"confirm": {
"description": "The Ecobee `set_aux_heat` action has been migrated. A new `aux_heat_only` switch entity is available for each thermostat that supports a Heat Pump.\n\nUpdate any automations to use the new `aux_heat_only` switch entity. When this is done, fix this issue and restart Home Assistant.",
"title": "Disable legacy Ecobee set_aux_heat action"
"description": "The ecobee `set_aux_heat` action has been migrated. A new `aux_heat_only` switch entity is available for each thermostat that supports a Heat Pump.\n\nUpdate any automations to use the new `aux_heat_only` switch entity. When this is done, fix this issue and restart Home Assistant.",
"title": "Disable legacy ecobee set_aux_heat action"
}
}
}
@@ -23,10 +23,8 @@ from homeassistant.components.climate import (
from homeassistant.const import ATTR_TEMPERATURE, UnitOfTemperature
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.issue_registry import IssueSeverity, create_issue
from . import EconetConfigEntry
from .const import DOMAIN
from .entity import EcoNetEntity
ECONET_STATE_TO_HA = {
@@ -212,34 +210,6 @@ class EcoNetThermostat(EcoNetEntity[Thermostat], ClimateEntity):
"""Set the fan mode."""
self._econet.set_fan_mode(HA_FAN_STATE_TO_ECONET[fan_mode])
def turn_aux_heat_on(self) -> None:
"""Turn auxiliary heater on."""
create_issue(
self.hass,
DOMAIN,
"migrate_aux_heat",
breaks_in_ha_version="2025.4.0",
is_fixable=True,
is_persistent=True,
translation_key="migrate_aux_heat",
severity=IssueSeverity.WARNING,
)
self._econet.set_mode(ThermostatOperationMode.EMERGENCY_HEAT)
def turn_aux_heat_off(self) -> None:
"""Turn auxiliary heater off."""
create_issue(
self.hass,
DOMAIN,
"migrate_aux_heat",
breaks_in_ha_version="2025.4.0",
is_fixable=True,
is_persistent=True,
translation_key="migrate_aux_heat",
severity=IssueSeverity.WARNING,
)
self._econet.set_mode(ThermostatOperationMode.HEATING)
@property
def min_temp(self):
"""Return the minimum temperature."""
@@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/ecovacs",
"iot_class": "cloud_push",
"loggers": ["sleekxmppfs", "sucks", "deebot_client"],
"requirements": ["py-sucks==0.9.10", "deebot-client==12.4.0"]
"requirements": ["py-sucks==0.9.10", "deebot-client==12.5.0"]
}
@@ -176,9 +176,9 @@
"water_amount": {
"name": "Water flow level",
"state": {
"high": "High",
"low": "Low",
"medium": "Medium",
"high": "[%key:common::state::high%]",
"low": "[%key:common::state::low%]",
"medium": "[%key:common::state::medium%]",
"ultrahigh": "Ultrahigh"
}
},
@@ -229,9 +229,9 @@
"state_attributes": {
"fan_speed": {
"state": {
"normal": "[%key:common::state::normal%]",
"max": "Max",
"max_plus": "Max+",
"normal": "Normal",
"quiet": "Quiet"
}
},
@@ -9,7 +9,7 @@ from homeassistant.helpers.device_registry import DeviceEntry
from .const import DOMAIN
from .coordinator import EheimDigitalConfigEntry, EheimDigitalUpdateCoordinator
PLATFORMS = [Platform.CLIMATE, Platform.LIGHT]
PLATFORMS = [Platform.CLIMATE, Platform.LIGHT, Platform.NUMBER, Platform.SENSOR]
async def async_setup_entry(

Some files were not shown because too many files have changed in this diff Show More