Compare commits

...

880 Commits

Author SHA1 Message Date
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 536e6868923ae7956f06b90baeb8f5bb1f15dfb1.
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 de1e06c39bce99f55ea36175e29cc1d76bc35836.
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 663d0691a780c25c9fa93ec4fae16bcc08966609.
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
pglab-electronics
c0e8f14745
Update support to external library pypglab to version 0.0.5 (#141876)
update support to external library pypglab to version 0.0.5
2025-03-31 10:25:48 +02:00
elmurato
0488012c77
Add sensor platform to Pterodactyl (#141428)
* Add sensor platform

* Correct CPU Limit state attribute translation

* Remove calculated util entitites, add usage and limit entities

* Use suggested_unit_of_measurement instead of converters

* Start only first word of sensor names in upper case, improve suggested units of sensors

* Simplify update of native_value, set uptime as timestamp

* Add paranthesis around multi-line lambda
2025-03-31 10:23:40 +02:00
J. Nick Koston
f247183e11
Bump SQLAlchemy to 2.0.40 (#141898)
changelog: https://docs.sqlalchemy.org/en/20/changelog/changelog_20.html#change-2.0.40
2025-03-31 10:11:13 +02:00
Norbert Rittel
c662b94d06
Replace "Away" in climate with common state string, matching "Home" (#141897)
* Replace "Away" in `climate` with common state string

Also reordered the states a bit to group the two presence-based options at the top and order the rest alphabetically.

* Prettier
2025-03-31 09:56:10 +02:00
Norbert Rittel
ee4bf165b5
Use common state for "Away" in nobo_hub (#141895) 2025-03-31 08:45:19 +02:00
Norbert Rittel
92ac396d19
Use common state for "Away" in honeywell (#141894) 2025-03-31 08:44:42 +02:00
Norbert Rittel
03366038ce
Define "Away" state in plugwise using common string (#141875) 2025-03-31 07:35:03 +02:00
Noah Husby
0b91aa9202
Bump aiorussound to 4.5.0 (#141892) 2025-03-31 07:32:14 +02:00
Norbert Rittel
ffc4fa1c2a
Replace "Away" in humidifier with common string (#141872) 2025-03-31 07:29:17 +02:00
Norbert Rittel
15e03957a9
Replace "Away" in generic_thermostat with common string (#141880) 2025-03-31 07:25:19 +02:00
Marc Mueller
0be881bca6
Fix test RuntimeWarnings for homeassistant_hardware (#141884) 2025-03-31 07:24:02 +02:00
Paulus Schoutsen
e88b321741
Ensure user always has first turn for Google Gen AI (#141893) 2025-03-30 23:31:45 -04:00
Allen Porter
0c4cb27fe9
Add OAuth support for Model Context Protocol (mcp) integration (#141874)
* Add authentication support for Model Context Protocol (mcp) integration

* Update homeassistant/components/mcp/application_credentials.py

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

* Handle MCP servers with ports

---------

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2025-03-30 23:14:52 -04:00
J. Nick Koston
1639163c2e
Handle encryption being disabled on an ESPHome device (#141887)
fixes #121442
2025-03-30 21:25:24 -04:00
J. Nick Koston
f043404cd9
Fix duplicate call to async_write_ha_state when adding elkm1 entities (#141890)
When an entity is added state is always written in
add_to_platform_finish:

7336178e03/homeassistant/helpers/entity.py (L1384)

We should not do it in async_added_to_hass as well
2025-03-30 21:23:54 -04:00
J. Nick Koston
018651ff1d
Improve handling of empty iterable in async_add_entities (#141889)
* Improve handling of empty iterable in async_add_entities

We had two checks here because we were doing an empty
iterable check. If its a list we can check it directly
but if its not we need to convert it to a list to know
if its empty.

* tweaks

* tasks never used
2025-03-30 21:22:47 -04:00
J. Nick Koston
704d7a037c
Bump aioesphomeapi to 29.8.0 (#141888)
changelog: https://github.com/esphome/aioesphomeapi/compare/v29.7.0...v29.8.0
2025-03-30 21:14:17 -04:00
Marc Mueller
7336178e03
Fix test RuntimeWarnings for hassio (#141883) 2025-03-30 12:00:48 -10:00
tdfountain
1c16fb8e42
Set and check unique id of config in NUT (#141783)
* Set and check unique id in config

* Update homeassistant/components/nut/config_flow.py

Set unique ID and abort only if value is defined

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

* Add duplicate ID test case for multiple devices

* Add unique ID check to config flow step for UPS

* Update homeassistant/components/nut/__init__.py

Fix to only set config_entries unique ID if not None

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

* Remove duplicate config flow call

---------

Co-authored-by: J. Nick Koston <nick+github@koston.org>
Co-authored-by: J. Nick Koston <nick@koston.org>
2025-03-30 11:41:56 -10:00
tdfountain
3ab2cd3fb7
Set device connection MAC address for networked devices in NUT (#141856)
* Set device connection MAC address for networked devices

* Change variable name for consistency
2025-03-30 11:21:11 -10:00
Norbert Rittel
5057343b6a
Replace "Home" and "Away" in vallox with common strings (#141870) 2025-03-30 22:49:52 +02:00
Norbert Rittel
6c3e85fd5e
Replace "Home" and "Away" in reolink with common strings (#141869) 2025-03-30 22:44:48 +02:00
Norbert Rittel
f046456445
Replace "Home" and "Away" in opentherm_gw with common strings (#141867) 2025-03-30 22:36:46 +02:00
tdfountain
e81a08916a
Remove scan interval option from NUT (#141845)
Remove scan interval option and test case, migrate config and add migration test case
2025-03-30 22:34:45 +02:00
John Karabudak
85d2e3d006
Fix LLM to speed up prefill (#141156)
* fix: two minor LLM changes to speed up prefill

- moved the current date/time to the end of the prompt
- started sorting all entities by last_changed

* addressed PR comments

* fixed tests

* reduced scope of try/catch in LLM prompt

* addressed more PR comments

* fixed Anthropic test

* addressed another PR comment

* fixed remainder of tests
2025-03-30 13:30:40 -07:00
Norbert Rittel
936b0b32ed
Replace "Home" and "Away" in drop_connect with common strings (#141864) 2025-03-30 22:30:08 +02:00
J. Nick Koston
0d511c697c
Improve performance of as_compressed_state (#141800)
We have to build all of these at startup.

Its a lot faster to compare floats instead
of datetime objects. Since we already have to
fetch last_changed_timestamp, use it to compare
with last_updated_timestamp since we already know
we will have last_updated_timestamp
2025-03-30 22:20:24 +02:00
Norbert Rittel
5bfe034b4d
Replace "Country" with common and pollutant labels with sensor strings (#141863)
* Replace "Country" with common and pollutant labels with `sensor` strings

* Fix copy & paste error for "ozone"
2025-03-30 22:17:51 +02:00
J. Nick Koston
cf786b3b04
Bump google_cloud deps (#141861)
speech: https://github.com/googleapis/google-cloud-python/compare/google-cloud-speech-v2.27.0...google-cloud-speech-v2.31.1
texttospeech: https://github.com/googleapis/google-cloud-python/compare/google-cloud-texttospeech-v2.17.2...google-cloud-texttospeech-v2.25.1
2025-03-30 22:15:19 +02:00
Joost Lekkerkerker
0f9f090db2
Bump pySmartThings to 3.0.1 (#141722) 2025-03-30 21:34:49 +02:00
J. Nick Koston
302eea7418
Bump PyISY to 3.4.0 (#141851)
* Bump PyISY to 3.3.0

changelog: https://github.com/automicus/PyISY/compare/v3.2.0...v3.3.0

* Apply suggestions from code review

---------

Co-authored-by: Shay Levy <levyshay1@gmail.com>
2025-03-30 22:29:51 +03:00
J. Nick Koston
b5e1f7e03e
Cleanup some typing in isy994 (#141859)
Now that pyisy is mostly typed there were some obvious
issues. We are still a long way away from being able
to add py.typed to pyisy, but we can now see some
obvious things in an IDE
2025-03-30 09:18:30 -10:00
Norbert Rittel
02397a8d2d
Replace "Off" state in selectors of home_connect with common state (#141857)
* Replace "Off" state in selectors of `home_connect` with common state

* Replace internal with common references
2025-03-30 21:03:46 +02:00
Norbert Rittel
ea9437eab2
Use common state for "Off" in climate selector (#141850)
* Use common states for "Away" and "Off" in `climate`

* Revert common state for "Away"

Four other integrations are referencing this instead of the common state. Needs to be addressed first.
2025-03-30 21:02:54 +02:00
Norbert Rittel
aaea30bee0
Replace "Off" in selector of media_player with common state (#141853) 2025-03-30 21:01:03 +02:00
Joost Lekkerkerker
9c869fa701
Add a coordinator to Point (#126775)
* Add a coordinator to Point

* Fix

* Fix

* Fix

* Fix

* Fix

* Fix
2025-03-30 20:58:40 +02:00
Eli Sand
5106548f2c
Fix generic_thermostat so it doesn't turn on when current temp is within target temp range (#138209)
* Don't turn on thermostat if temp is equal to target temp.

* Update strings to reflect logic change.

* Fix logic and add zero tolerance tests.

* Include tests for cool mode

* Removed unnecessary async_block_till_done calls
2025-03-30 19:43:13 +01:00
Franck Nijhof
506d485c0d
Ensure EcoNet operation modes are unique (#141689) 2025-03-30 20:31:08 +02:00
Bouwe Westerdijk
da190ec96f
Bump plugwise to v1.7.3 (#141843) 2025-03-30 20:24:13 +02:00
Franck Nijhof
9567929484
Update pvo to v2.2.1 (#141847) 2025-03-30 21:12:42 +03:00
Norbert Rittel
dc16494332
Replace "Disabled" with common state in schlage, fix sentence-case (#141849)
Replace "Disabled" with common state in `lamarzocco`, fix sentence-case

- replace "Disabled" with with common state reference
- fix sentence-casing of "Auto-lock"
2025-03-30 21:12:15 +03:00
Norbert Rittel
933f422588
Replace "Disabled" with common state in lamarzocco (#141848) 2025-03-30 20:00:18 +02:00
Michael
663d0691a7
Move setup messages from info to debug level (#141834)
move info to debug level
2025-03-30 19:49:41 +02:00
Norbert Rittel
97a0b9272e
Resolve state mismatches in wolflink (#141846) 2025-03-30 19:42:39 +02:00
Lucas Mindêllo de Andrade
3d49000c75
Remove sunweg integration (#124230)
* chore(sunweg): remove sunweg integration

* Update homeassistant/components/sunweg/strings.json

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

* Update homeassistant/components/sunweg/manifest.json

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

* feat: added async remove entry

* Clean setup_entry; add tests

---------

Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
Co-authored-by: abmantis <amfcalt@gmail.com>
2025-03-30 18:11:09 +01:00
Norbert Rittel
68d1a3c0a2
Replace "Off" and references with common state in tesla_fleet (#141840) 2025-03-30 19:06:28 +02:00
Norbert Rittel
b06de7a687
Replace "Off" and references with common state in teslemetry (#141841) 2025-03-30 18:50:58 +02:00
Michael
963ea6141c
Fix the entity category for max throughput sensors in AVM Fritz!Box Tools (#141838)
correct the entity category for max throughput sensors
2025-03-30 17:46:03 +02:00
Franck Nijhof
7232d36494
Fix hardcoded UoM for total power sensor for Tuya zndb devices (#141822) 2025-03-30 17:44:48 +02:00
Norbert Rittel
12eb071e8a
Replace "Off" with common state in plugwise (#141828) 2025-03-30 17:31:12 +02:00
Paulus Schoutsen
86be626c69
Migrate ESPHome to use token instead of media source ID for legacy Assist Pipelines (#139665)
Migrate legacy ESPHome devices to use TTS token

Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-03-30 16:53:49 +02:00
Mauricio Bonani
ec20e41836
Improve the readability of status messages in NUT (#141335)
Improve the readability of status messages
2025-03-30 16:26:44 +02:00
Michal Schwarz
b3564b6cff
Fix order of palettes, presets and playlists in WLED integration (#132207)
* Fix order of palettes, presets and playlists in WLED integration

* fix tests: update palette items order

---------

Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-03-30 16:14:56 +02:00
Marlon
acbee815be
Update apsystems library to support battery inverter (#140086)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-03-30 16:11:22 +02:00
Norbert Rittel
5a1aeff85c
Replace "On" and "Off" with common states in rfxtrx (#141835)
Also fix sentence-casing on other "… on" and "… off" states.
2025-03-30 16:10:17 +02:00
Allen Porter
4463e4c42b
Move roborock unique id to be based on roborock userid instead of email (#141337)
* Move roborock unique id to be based on roborock userid instead of email

* Remove unnecessary data update

* Update tests

* Add tests coverage for removal of config entry

* Use config entry migration

* Remove unused fixtues

* Remove unnecessary logging
2025-03-30 16:04:28 +02:00
Norbert Rittel
4103ef71c9
Replace "Off" with common state in wyoming (#141832) 2025-03-30 16:02:09 +02:00
Norbert Rittel
dccaa2dd2d
Replace "Off" with common state in sleepiq (#141831) 2025-03-30 16:01:15 +02:00
Norbert Rittel
5ac6096e08
Replace "Off" with common state in osoenergy (#141830) 2025-03-30 16:00:50 +02:00
Norbert Rittel
4734a82f99
Replace "Off" with common state in airgradient (#141829)
* Replace "Off" with common state in `airgradient`

Also reference the name for CO2 from the `sensor` integration.

* Replace indirect with direct references
2025-03-30 16:00:11 +02:00
Norbert Rittel
c6c2309dee
Replace "Idle" with common state in zha (#141825) 2025-03-30 15:21:13 +02:00
Simone Chemelli
5e1bbd8bff
Add full test coverage for Comelit climate platform (#140460)
* Add climate tests for Comelit

* fix climate and humidifier

* fix code and tests

* fix humidifier

* apply review comment

* align post merge

* add more tests

* typo

* apply review comment

* ruff
2025-03-30 15:15:26 +02:00
Michael
4761207097
Add boost preset to AVM Fritz!SmartHome climate entities (#141802)
* add boost preset to climate entities

* add set boost preset test
2025-03-30 15:03:26 +02:00
Simone Chemelli
b4a6ca63b3
Add full test coverage for Comelit sensor platform (#141813) 2025-03-30 15:02:15 +02:00
Jan Bouwhuis
a5b320180a
Correct spelling for 'availability` in MQTT translation strings (#141818) 2025-03-30 15:01:06 +02:00
Aidan Timson
bcc767136c
Add System Bridge suggested sensor precisions (#141815) 2025-03-30 15:00:38 +02:00
Simone Chemelli
d3257d96d0
Add full test coverage for Comelit light platform (#141736)
* Add full test coverage for Comelit light platform

* cleanup
2025-03-30 14:59:56 +02:00
Martin Hjelmare
89df6a82b0
Bump pydroid-ipcam to 3.0.0 (#141739) 2025-03-30 14:59:13 +02:00
Thomas55555
e725ba403b
Bump ical to 9.0.3 (#141805) 2025-03-30 14:58:47 +02:00
Aidan Timson
578fece13e
Fix System Bridge wait timeout wait condition (#141811)
* Fix System Bridge wait timeout wait condition

* Add DataMissingException as a timeout condition

* Add tests
2025-03-30 14:57:53 +02:00
Norbert Rittel
0eeb6b5fd5
Replace "Idle" with common state in backup, fix sentence-case (#141814)
* Replace "Idle" with common state in `backup`, fix sentence-case

* Update test_sensors.ambr
2025-03-30 14:56:36 +02:00
Norbert Rittel
ad3f7f041f
Replace "Idle" with common state in homekit_controller (#141820) 2025-03-30 15:34:36 +03:00
Norbert Rittel
dce9bfd359
Replace "Idle" with common state in venstar, fix sentence-case (#141819) 2025-03-30 15:34:23 +03:00
Norbert Rittel
8f96ccc835
Fix sentence-casing in a few strings of bmw_connected_drive (#141816)
* Fix sentence-casing in a few strings of `bmw_connected_drive`

Also replace "Standby" state with common string reference.

* Update test_select.ambr
2025-03-30 15:13:35 +03:00
Andrew Sayre
a48dd05035
Refactor registration of HEOS media player entity services (#141666)
Refactor entity service registration
2025-03-30 15:10:05 +03:00
Norbert Rittel
eb90958341
Replace "Stand-by" and "Off" with common states in palazzetti (#141809)
Also fixes the  wrong spelling of "Stand-by" by using "Standby" from the common string.
2025-03-30 15:08:03 +03:00
Norbert Rittel
31ed6a48cb
Replace "Standby" with common state in roborock (#141810) 2025-03-30 15:07:43 +03:00
Norbert Rittel
dfa80f0787
Replace "Standby" with common state in knx (#141817)
Also reordered the states alphabetically to improve code readability.
2025-03-30 15:07:08 +03:00
Norbert Rittel
73acfa6a8e
Replace "Stand-by" with common state in incomfort (#141807)
Also fixes the  wrong spelling of "Stand-by" by using "Standby" from the common string.
2025-03-30 13:55:06 +02:00
Norbert Rittel
efad20cdff
Replace "Standby" and "Idle" with common states in fronius (#141812) 2025-03-30 13:43:33 +02:00
Norbert Rittel
11d68cef54
Replace "Standby" with common state in blue_current (#141806) 2025-03-30 14:14:17 +03:00
J. Nick Koston
9c28e60475
Bump pyisy to 3.2.0 (#141798)
changelog: https://github.com/automicus/PyISY/compare/v3.1.15...v3.2.0

Fixes some tasks missing a strong reference
https://github.com/automicus/PyISY/pull/425

There is a bit of refactoring so I did not tag it for
beta.
2025-03-30 14:06:07 +03:00
Simone Chemelli
9ee79b87ee
Add full test coverage for Comelit switch platform (#141738)
* Add full test coverage for Comelit switch platform

* cleanup
2025-03-30 12:10:41 +02:00
Simone Chemelli
600aedc9a1
Add tests for Comelit cover platform (#141740)
* Add  tests for Comelit cover platform

* cleanup up
2025-03-30 12:04:00 +02:00
Norbert Rittel
5b5efb5aaa
Replace "Stopped" with common state in smartthings (#141789)
* Replace "Stopped" with common state in `smartthings`

* Replace internal references with common ones
2025-03-30 11:58:17 +02:00
Norbert Rittel
391b3ed1e7
Replace "Stopped" with common state in snoo (#141788)
* Replace "Stopped" with common state in `snoo`

* Replace internal reference with common one
2025-03-30 11:57:15 +02:00
Norbert Rittel
24277259ad
Use more common states for ESS and PV in vicare (#141792) 2025-03-30 11:56:50 +02:00
J. Nick Koston
65261de7cc
Migrate emulated_roku to use runtime_data to fix flakey tests (#141795) 2025-03-30 11:55:58 +02:00
Norbert Rittel
beb92a7f9c
Replace "Charging" state for binary_sensor with common string (#141796) 2025-03-30 11:41:01 +02:00
J. Nick Koston
f1b059c75d
Bump PyISY to 3.1.15 (#141778)
changelog: https://github.com/automicus/PyISY/compare/v3.1.14...v3.1.15

fixes #141517
fixes #132279
2025-03-30 11:40:25 +02:00
J. Nick Koston
d4970f81aa
Cleanup ESPHome update tests to avoid accessing integration internals (#141786)
We should not access DomainData directly in the test
2025-03-29 22:30:06 -10:00
Norbert Rittel
29219afb7f
Replace "Charging" state in renault with common string (#141787) 2025-03-30 10:16:42 +02:00
tdfountain
7fbf15edc9
Add ambient state translations in NUT (#141772)
Add ambient state translations
2025-03-29 21:00:53 -10:00
J. Nick Koston
c8d3fa6768
Small cleanups to the device registry (#141773)
Remove some calls to internal functions that
are now available directly on the devices
and deleted_devices objects

Remove internal functions that are no
longer used
2025-03-29 21:00:13 -10:00
J. Nick Koston
ea5cf3d854
Bump aiohomekit to 3.2.13 (#141764)
changelog: https://github.com/Jc2k/aiohomekit/compare/3.2.8...3.2.13
2025-03-29 20:59:56 -10:00
J. Nick Koston
4a833fb489
Fix blocking late import of httpcore from httpx (#141771)
There is a late import that blocks the event loop
in newer version
9e8ab40369/httpx/_transports/default.py (L75)
2025-03-29 20:59:40 -10:00
Norbert Rittel
02aa823d25
Replace "Stopped" with common state in matter (#141768) 2025-03-30 09:42:48 +03:00
Norbert Rittel
92034aeecc
Replace "Opening" / "Closing" with common states in homee (#141766) 2025-03-30 09:42:28 +03:00
Florent Thoumie
9f2232fad1
Bump iaqualink to 0.5.3 (#141709)
* Update to iaqualink 0.5.3 and silence warning

* Update to iaqualink 0.5.3 and silence warning

* Re-add via_device line
2025-03-30 06:49:18 +02:00
tdfountain
2be2d54a5c
Replace hard coded attributes with constants for test cases in NUT (#141774)
Replace hard coded attributes with constants
2025-03-29 15:19:41 -10:00
J. Nick Koston
ed99686cc1
Bump propcache to 0.3.1 (#141770)
* Bump propcache to 0.3.1

changelog: https://github.com/aio-libs/propcache/compare/v0.3.0...v0.3.1

* revert
2025-03-29 23:10:08 +00:00
Norbert Rittel
a6c1f1e485
Replace "Opening" / "Closing" with common states in shelly (#141767) 2025-03-30 00:48:28 +03:00
puddly
a219445751
Add helper methods to simplify USB integration testing (#141733)
* Add some helper methods to simplify USB integration testing

* Re-export `usb_device_from_port`
2025-03-29 11:26:37 -10:00
Norbert Rittel
b65b5aacb6
Add common state references to cover, valve and lock (#141754)
* Add common states to `cover`

* @NoRi2909 Add common states to `valve`

* Add common states to `lock`
2025-03-29 17:06:15 -04:00
Norbert Rittel
bcead72265
Replace "Stopped" with common state in traccar_server (#141751) 2025-03-29 17:05:34 -04:00
Benjamin Bender
35b9564ed4
Show external cover art in music-assistant-integration (#141716)
* fix: handling of external album-art in music-assistant-integration

* chore: refinements

* make the image-logic more readable

* fix code comment to be accurate
2025-03-29 17:04:57 -04:00
Florent Thoumie
aba01d4361
Remove iaqualink warning caused by via_device (#141761)
Remove warning caused by via_device
2025-03-29 17:03:35 -04:00
Franck Nijhof
4398af51c8
Fix spamming log message in QNAP (#141752) 2025-03-29 16:57:43 -04:00
Norbert Rittel
83f4f4cc96
Replace "Stopped" with common state in ipp (#141750) 2025-03-29 19:19:56 +01:00
Norbert Rittel
1800e6fb8e
Add common states for "Opening" and "Closing" (#141747) 2025-03-29 19:19:30 +01:00
Simone Chemelli
43b83c855f
Align code styling in Vodafone Station tests (#141745) 2025-03-29 18:42:12 +01:00
Marcel van der Veldt
20e2de200f
Always set pause feature on Music Assistant mediaplayers (#141686) 2025-03-29 18:39:59 +01:00
Josef Zweck
ed4ebe1222
Add unkown to uncalibrated state for tedee (#141262) 2025-03-29 18:38:19 +01:00
Simone Chemelli
4e4446cef4
Fix immediate state update for Comelit (#141735) 2025-03-29 18:22:03 +01:00
Norbert Rittel
e2ff0b265d
Replace "Stopped" with common state in prusalink (#141743)
* Replace "Stopped" with common state in `prusalink`

* Sentence-case "Nozzle diameter"
2025-03-29 18:07:38 +01:00
J. Nick Koston
6d48fc183a
Fix ESPHome update entities being loaded before device_info is available (#141704)
* Fix ESPHome update entities being loaded before device_info is available

Since we load platforms when restoring config, the update
platform could be loaded before the connection to the
device was finished which meant device_info could still
be empty. Wait until device_info is available to
load the update platform.

fixes #135906

* Apply suggestions from code review

* move comment

* Update entry_data.py

Co-authored-by: TheJulianJES <TheJulianJES@users.noreply.github.com>

---------

Co-authored-by: TheJulianJES <TheJulianJES@users.noreply.github.com>
2025-03-29 17:53:01 +01:00
J. Nick Koston
ea8392a4a1
Fix ESPHome entities not being removed when the ESPHome config removes an entire platform (#141708)
* Fix old ESPHome entities not being removed when configuration changes

fixes #140756

* make sure all callbacks fire

* make sure all callbacks fire

* make sure all callbacks fire

* make sure all callbacks fire

* revert

* cover
2025-03-29 17:48:51 +01:00
Simone Chemelli
bcd296822d
Add full test coverage for Comelit alarm control panel (#141371)
* Add full test coverage for Comelit alarm control panel

* fix methods description

* revert unwanted change

* apply review comment
2025-03-29 17:29:37 +01:00
Jan Bouwhuis
6ee97f341d
Improve MQTT translation strings (#141691)
* Improve MQTT options translation string

* more improvements
2025-03-29 17:29:04 +01:00
Norbert Rittel
aa2ab74ee9
Replace "On" and "Off" in airzone_cloud with common states (#141711)
* Replace "On", "Off" and "Stop(ped)" in `airzone_cloud` with common strings

* Revert to "Stop" as mode name by manufacturer

Co-authored-by: acidcoke <acidcoke@acidic.codes>

---------

Co-authored-by: acidcoke <acidcoke@acidic.codes>
2025-03-29 18:05:41 +03:00
Norbert Rittel
49b2ab9889
Replace "Stopped" etc. with common state in teslemetry/tessie/tesla_fleet (#141714)
* Replace "Stopped" with common state in `teslemetry`

* Replace "Disconnected" with common state in `teslemetry`

* Replace "Stopped"/"Disconnected" with common state in `tessie`

* Replace "Stopped", "Connected", "Disconnected" with common state in `tesla_fleet`
2025-03-29 18:03:48 +03:00
Martin Hjelmare
2549e2cc0f
Patch Z-Wave platforms in humidifier tests (#141732) 2025-03-29 17:59:13 +03:00
J. Diego Rodríguez Royo
b15fa81a44
Set Home Connect program action field as not required (#141729)
* Set Home Connect program action field as not required

* Remove required field

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

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-03-29 15:02:54 +01:00
J. Diego Rodríguez Royo
09f6246d1b
Dynamically add Home Connect event sensors (#141198)
* Dynamically add Home Connect event sensors to HA

* Add and remove listeners on paired and depaired events

* Apply suggestion

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

* Update test

* Adjust English

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-03-29 12:53:34 +01:00
Norbert Rittel
96ff389fd1
Sentence-case "Medium type" in mopeka (#141718) 2025-03-29 10:19:25 +01:00
Joost Lekkerkerker
b55f1df297
Only link the parent device if known in SmartThings (#141719)
Only link the parent device if we know the parent device
2025-03-29 10:18:27 +01:00
Joost Lekkerkerker
d88f7b8600
Only trigger events on button updates in SmartThings (#141720)
Only trigger events on button updates
2025-03-29 10:17:38 +01:00
Norbert Rittel
df2a94bb5b
Replace "country" with common string in lg_thinq (#141690) 2025-03-29 00:27:10 +00:00
Norbert Rittel
c4ac492c6e
Add common state "Stopped" (#141701) 2025-03-29 00:25:22 +00:00
Franck Nijhof
fcd4d3e2df
Add ability to subscribe to own YouTube channels (#141693) 2025-03-28 19:59:24 -04:00
Franck Nijhof
42d6bd3839
Handle invalid JSON errors in AirNow (#141695) 2025-03-28 19:58:41 -04:00
J. Nick Koston
d6b48003b6
Improve performance of websocket_api _state_diff_event (#141696)
We can use last_updated_timestamp for the compare since its always
calculated when the state is created and comparing floats is
much faster than datetime objects
2025-03-28 19:58:12 -04:00
Franck Nijhof
ba8f69d956
Fix Tuya tdq category to pick up temp & humid (#141698) 2025-03-28 19:57:56 -04:00
Norbert Rittel
f22bb72d18
Replace 4 occurrences of "Enable" in teslemetry with common string (#141699) 2025-03-28 23:47:44 +01:00
Marcel van der Veldt
f7a0a9fa41
Bump music assistant client to 1.2.0 (#141668)
* Bump music assistant client to 1.2.0

* Update test fixtures
2025-03-28 22:43:31 +01:00
Norbert Rittel
3795d653c5
Replace "country" with common string in holiday (#141687) 2025-03-28 22:43:00 +01:00
Norbert Rittel
8ee014b855
Fix grammar / sentence-casing in workday (#141682)
* Fix grammar / sentence-casing in `workday`

Also replace "country" with common string.

* Add two more references

* Fix second data description reference

* Add "given" to action description for better translations
2025-03-28 21:22:53 +01:00
Erwin Douna
1ab5bdf85f
Tado add proper off state (#135480)
* Add proper off state

* Remove current temp

* Add default frost temp
2025-03-28 20:54:36 +01:00
puddly
5283e1a39f
Handle all firmware types for ZBT-1 and Yellow update entities (#141674)
Handle other firmware types
2025-03-28 20:38:16 +01:00
Franck Nijhof
17c56208ee
Fix camera proxy with sole image quality settings (#141676) 2025-03-28 20:36:15 +01:00
Norbert Rittel
8474d9fefe
Replace "country" with common string in ecovacs (#141677) 2025-03-28 20:32:32 +01:00
J. Nick Koston
fd9f002e9f
Increase websocket_api allowed peak time to 10s (#141680)
* Increase websocket_api allowed peak time to 10s

fixes #141624

During integration reload or startup, we can end up sending a message for
each entity being created for integrations that create them from an external
source (ie MQTT) because the messages come in one at a time. This can overload
the loop and/or client for more than 5s. While we have done significant work
to optimize for this path, we are at the limit at what we can expect clients
to be able to process in the time window, so increase the time window.

* adjust test
2025-03-28 20:32:00 +01:00
Norbert Rittel
26268357a0
Replace "country" with common string in prosegur (#141678) 2025-03-28 20:19:20 +01:00
Dan Raper
82b463b22f
Get Ohme to gold quality (#140617)
* Add reconfigure step, diagnostics and default disabled entities to Ohme

* Formatting

* Update tests

* Bugfixes and add tests for diagnostics and reconfigure

* Remove diagnostics changes

* Remove reconfigure changes

* Pull upstream strings.json
2025-03-28 18:41:00 +00:00
Jason Hunter
7ae397a211
Update Duke Energy package to fix integration (#141669)
* Update Duke Energy package to fix integration

* fix tests
2025-03-28 18:33:59 +00:00
Norbert Rittel
ea4ad681e4
Replace "country" with common string in cookidoo (#141670) 2025-03-28 18:29:31 +00:00
Michael Hansen
a150f9d5ad
Bump intents and always prefer more literal text (#141663) 2025-03-28 13:03:42 -04:00
puddly
afb7fe0d40
Include ZBT-1 and Yellow in device registry (#141623)
* Add the Yellow and ZBT-1 to the device registry

* Unload platforms

* Fix unit tests

* Rename the Yellow update entity to `Radio firmware`

* Rename `EmberZNet` to `EmberZNet Zigbee`

* Prefix the `sw_version` with the firmware type and clean up

* Fix unit tests

* Remove unnecessary `always_update=False` from data update coordinator
2025-03-28 18:00:05 +01:00
Norbert Rittel
8bf42b9d3e
Replace "language" and "country" with common strings in epic_games_store (#141665) 2025-03-28 17:50:36 +01:00
Andrew Sayre
ba00707d89
Add HEOS entity service to remove queue items (#141495)
* Add remove queue items service

* Tests

* Correct casing of ID

* Match docs
2025-03-28 11:09:01 -05:00
tdfountain
2121b943a3
Add exception translation to NUT (#141629)
* Add exception translation and test cases

* Capitalize ID in error string

* Test translation placeholders, simplify test cases
2025-03-28 16:43:16 +01:00
Bram Kragten
ef06d2c06e
Update frontend to 20250328.0 (#141659) 2025-03-28 16:08:14 +01:00
Norbert Rittel
cc1fac5776
Add a common string for "country" (#141653) 2025-03-28 15:52:44 +01:00
Norbert Rittel
6cb3430c60
Fix sentence-casing of "sea level" in matter (#141655)
* Fix sentence-casing of "sea level" in `matter`

* Update test_number.ambr
2025-03-28 15:30:21 +01:00
Paulus Schoutsen
4cea90f773
Enable the message box on default for satelitte announcement actions (#141654) 2025-03-28 15:07:09 +01:00
Paulus Schoutsen
4da5f6188d
Ensure connection test sound has no preannouncement (#141647) 2025-03-28 14:01:12 +01:00
Norbert Rittel
e7f8b9ad92
Fix typo and sentence-casing in jewish_calendar (#141651)
Also replace "Language" with common string.
2025-03-28 15:55:52 +03:00
Jan Bouwhuis
473a28c5f2
Fix duplicate 'device' term in MQTT translation strings (#141646)
* Fix duplicate 'device' from MQTT translation strings

* Update homeassistant/components/mqtt/strings.json
2025-03-28 13:55:36 +01:00
Franck Nijhof
d765936be3
Fix ESPHome event entity staying unavailable (#141650) 2025-03-28 13:55:11 +01:00
Norbert Rittel
0db643d9d1
Replace "connect" / "disconnect" with common strings in idasen_desk (#141649) 2025-03-28 08:46:13 -04:00
Norbert Rittel
af29159e2f
Remove "meter" from entity names of rainforest_raven sensors (#141487)
* Fix misleading friendly names of `rainforest_raven` sensors

The three sensors
- power_demand
- total_energy_delivered
- total_energy_received

currently add "meter" in their friendly names.

This does not provide any useful information and is rather irritating instead – it sounds like these are the power demands or consumption of the meter itself. But they are the measured values.

This commit removes "meter" from the names making them simpler and more precise, too.

In addition the sentence-casing of "MAC addresses" is fixed.

* Update test_sensor.ambr

* Update test_sensor.ambr (2)

* Also remove "meter" from Signal strength

* Update test_sensor.ambr (3)

* Change `meter_price` to `energy_price` in strings.json

* Change `meter_price` to `energy_price` in test_sensor.ambr

* Change `meter_price` to `energy_price` in sensor.py
2025-03-28 11:26:51 +00:00
Tsvi Mostovicz
65c38d8e31
Jewish calendar match omer service variables requirement to documentation (#141620)
The documentation and the omer schema require a Nusach to be specified, but the YAML misses that requirement
2025-03-28 13:59:04 +03:00
LG-ThinQ-Integration
adb7aa237b
Add number for ventilator's sleepTimer (#140972)
Add sleepTimer for ventilator

Co-authored-by: yunseon.park <yunseon.park@lge.com>
2025-03-28 11:54:18 +01:00
Norbert Rittel
577f86b83a
Remove "meter" from entity names of rainforest_eagle sensors (#141641)
* Remove "meter" from entity names in strings.json

* Replace `meter_price`with `energy_price`in sensor.py

* Update test_sensor.py
2025-03-28 13:52:15 +03:00
J. Diego Rodríguez Royo
01169e9184
Add Pitsos virtual integration (#141610) 2025-03-28 13:50:48 +03:00
J. Diego Rodríguez Royo
dde037291a
Add Neff virtual integration (#141609) 2025-03-28 13:50:29 +03:00
J. Diego Rodríguez Royo
6971a189f9
Add Gaggenau virtual integration (#141608) 2025-03-28 13:50:12 +03:00
J. Diego Rodríguez Royo
c860686138
Add Constructa virtual integration (#141607) 2025-03-28 13:49:52 +03:00
J. Diego Rodríguez Royo
2eb507863f
Add Balay virtual integration (#141606) 2025-03-28 13:49:38 +03:00
Joost Lekkerkerker
54ee5c6998
Add default string and icon for light effect off (#141567) 2025-03-28 11:48:34 +01:00
alorente
63df2474a9
Fix missing response for queued mode scripts (#141460) 2025-03-28 10:47:41 +00:00
Robert Resch
93f12fb7c6
Reverts #141363 "Deprecate SmartThings machine state sensors" (#141573)
Reverts #141363
2025-03-28 11:40:24 +01:00
Nick Pesce
b7a995ac53
Use correct default value for multi press buttons in the Matter integration (#141630)
* Respect the min 2 constraint for the switch MultiPressMax attribute

* Update test_event.py

* Update generic_switch_multi.json

* Fix issue and update tests
2025-03-28 11:11:18 +01:00
Solmath
267a80e70c
Show internet radio station if no artist is available in Cambridge Audio (#140716)
* Add media_channel property to cambridge audio

* Return channel instead of artist when playing internet radio to mimick behaviour of CXN100 and StreamMagic app

* Add test for media_artist attribute

* Add test that media_artist is not set in certain cases

* Update homeassistant/components/cambridge_audio/media_player.py

Co-authored-by: Noah Husby <32528627+noahhusby@users.noreply.github.com>

---------

Co-authored-by: Noah Husby <32528627+noahhusby@users.noreply.github.com>
2025-03-28 09:49:20 +01:00
Norbert Rittel
078be3b8df
Replace already_configured in teslemetry with common string (#141637) 2025-03-28 09:44:34 +01:00
J. Diego Rodríguez Royo
7b6c967c3a
Add Profilo virtual integration (#141611) 2025-03-28 09:42:51 +01:00
J. Diego Rodríguez Royo
a405ccd044
Add Siemens virtual integration (#141612) 2025-03-28 09:37:27 +01:00
J. Diego Rodríguez Royo
f6c55ebf05
Add Thermador virtual integration (#141613) 2025-03-28 09:35:05 +01:00
Shay Levy
6b3b4cce4b
Record Shelly quality scale (#141062)
* Record Shelly quality scale

* Update

* change stale-devices status to todo

* Update homeassistant/components/shelly/quality_scale.yaml

Co-authored-by: Maciej Bieniek <bieniu@users.noreply.github.com>

---------

Co-authored-by: Maciej Bieniek <bieniu@users.noreply.github.com>
2025-03-28 09:30:29 +01:00
Jan Bouwhuis
8887c979b4
Fix volatile_organic_compounds_parts translation string to be referenced for MQTT subentries device class selector (#141618)
* Fix ` volatile_organic_compounds_parts` translation string to be referenced for MQTT subentries device class selector

* Fix tests
2025-03-28 08:48:23 +01:00
Norbert Rittel
665541409a
Fix sentence-casing in airvisual user strings (#141632) 2025-03-28 10:37:55 +03:00
Denis Shulyaka
195919b5fb
Add PDF support for openai_conversation.generate_content service (#141588)
Add PDF support for openai_conversation.generate_content service
2025-03-27 20:05:54 -04:00
Petro31
31479056ed
Fix an issue with the switch preview in beta (#141617)
Fix an issue with the switch preview
2025-03-28 00:43:17 +02:00
Jan-Philipp Benecke
9f0976d94a
Bump aiowebdav2 to 0.4.4 (#141615) 2025-03-27 23:19:04 +01:00
Norbert Rittel
a049d2b7db
Make names of switch entities in gree consistent with docs (#141580) 2025-03-27 21:51:11 +00:00
Norbert Rittel
6959017d55
Use official camel-cased spelling "FullTopic" in tasmota (#141604)
* Use camel-cased spelling "FullTopic" in `tasmota`

This  should ensure that this fixed term is kept in translations.

In addition an excessive space character is removed.

* Fix wrong plural in second sentence
2025-03-27 23:12:42 +02:00
Luke Lashley
4ff5a04a72
Bump Python-Snoo to 0.6.5 (#141599)
* Bump Python-Snoo to 0.6.5

* add to event_types
2025-03-27 21:56:11 +01:00
Norbert Rittel
ea0c4a7263
Fix misleading friendly names of pvoutput sensors (#141312)
* Fix misleading friendly names of `pvoutput` sensors

* Update test_sensor.py

* Update test_sensor.py - prettier
2025-03-27 21:49:16 +01:00
J. Nick Koston
9633f03ddc
Fix zeroconf logging level not being respected (#141601)
Removes an old logging workaround that is no longer needed

fixes #141558
2025-03-27 21:45:48 +01:00
Artur Pragacz
4c0d8ce87c
Remove deprecated YAML import in Onkyo (#141600) 2025-03-27 21:13:23 +01:00
Joost Lekkerkerker
d92728e533
Add brand for Bosch (#141561) 2025-03-27 21:01:52 +01:00
Paul Bottein
799962ef0e
Update frontend to 20250327.1 (#141596) 2025-03-27 20:58:59 +01:00
Stephan Traub
631f817f11
Wiz - update dependency to support new light features and bugfixes (#141529)
* Bump pywizlight and fix deprecation issue

* Removed workaround for color_mode; update pywizlight
2025-03-27 21:51:42 +02:00
Martin Hjelmare
52f7bdeb5d
Patch Z-Wave platforms in fan tests (#141591) 2025-03-27 21:40:39 +02:00
Martin Hjelmare
51db140aed
Clean up Z-Wave config flow (#141595) 2025-03-27 21:30:16 +02:00
Jan-Philipp Benecke
1ad12d5945
Bump aiowebdav2 to 0.4.3 (#141586) 2025-03-27 19:44:33 +02:00
Simon Lamon
9f5d94046d
Fix typing error in NMBS (#141589)
Fix typing error
2025-03-27 19:39:33 +02:00
Erik Montnemery
de1e06c39b
Revert "Promote after dependencies in bootstrap" (#141584)
Revert "Promote after dependencies in bootstrap (#140352)"

This reverts commit 376604096049ac2388a1c9d23c578402acbce0b5.
2025-03-27 12:57:58 -04:00
Bram Kragten
abbabc11d2
Update frontend to 20250327.0 (#141585) 2025-03-27 17:51:52 +01:00
Joost Lekkerkerker
62be82fd3c
Also migrate completion time entities in SmartThings (#141572) 2025-03-27 16:36:45 +01:00
Luke Lashley
f0fd5a639a
Better handle Roborock discovery (#141575) 2025-03-27 11:17:56 -04:00
Andrii Mitnovych
dea00fac3f
Get area and floor by alias (#126150)
* Add possibility to get area by alias

* Add ability to get floor by alias

* Moved alias lookup to separate function, adjusted templates.

* Changed registry to return all areas/floors with given alias

* Use normalize_name from normalized_name_base_registry
2025-03-27 16:02:47 +01:00
Erwin Douna
c30f17f592
Tado fix HomeKit flow (#141525)
* Initial commit

* Fix

* Fix

---------

Co-authored-by: Joostlek <joostlek@outlook.com>
2025-03-27 16:01:54 +01:00
Martin Hjelmare
e9e95f45d8
Handle cloud subscription expired for backup upload (#141564)
Handle cloud backup subscription expired for upload
2025-03-27 15:29:11 +01:00
Joost Lekkerkerker
e8aa3e6d34
Add icons to hue effects (#141559) 2025-03-27 12:05:45 +01:00
Norbert Rittel
3646884d79
Replace "controller_id" with friendly name in homeworks error message (#141550) 2025-03-27 12:29:53 +02:00
Norbert Rittel
5747c6b1a8
Fix sentence-casing in konnected strings, replace "override" with "custom" (#141553)
Fix sentence-casing in `konnected`strings, replace "Override" with "Custom"

Make string consistent with HA standards.

As "Override" can be misunderstood as the verb, replace it with "Custom".
2025-03-27 10:59:19 +01:00
Thomas55555
43a5c7ddc8
Handle webcal prefix in remote calendar (#141541)
Handel webcal prefix in remote calendar
2025-03-27 10:22:25 +01:00
J. Diego Rodríguez Royo
d9d74107fe
Improve some Home Connect deprecations (#141508) 2025-03-27 10:18:30 +01:00
Erik Montnemery
373cca9857
Remove unused mypy ignore from google_generative_ai_conversation (#141549) 2025-03-27 10:03:07 +01:00
Martin Hjelmare
284b3f444d
Remove leftover cloudflare persistent notification dismiss (#141548) 2025-03-27 09:53:47 +01:00
Simon Lamon
dfb088e524
Bump linkplay to v0.2.2 (#141542)
Bump linkplay
2025-03-27 08:51:12 +01:00
Manu
5546f1d73d
Support for upcoming pyLoad-ng release in pyLoad integration (#141297)
Fix extra key `proxy` in pyLoad
2025-03-27 07:46:58 +01:00
Jan Bouwhuis
13fc871806
Use kwargs only for MQTT subentry PlatformField helper (#141498) 2025-03-27 07:46:08 +01:00
J. Nick Koston
0f9fd78656
Bump pyserial-asyncio-fast to 0.16 (#141540)
changelog: https://github.com/home-assistant-libs/pyserial-asyncio-fast/compare/0.15...0.16
2025-03-27 07:32:59 +01:00
Ivan Lopez Hernandez
4f318c0be3
Initialize google.genai.Client in the executor (#141432)
* Intialize the client on an executor thread

* Fix MyPy error

* MyPy error

* Exception error

* Fix ruff

* Update __init__.py

---------

Co-authored-by: tronikos <tronikos@users.noreply.github.com>
2025-03-26 22:05:22 -07:00
Michael Hansen
5eb1d0a28e
Add default preannounce sound to Assist satellites (#141522)
* Add default preannounce sound

* Allow None to disable sound

* Register static path instead of HTTP view

* Fix path

---------

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2025-03-26 22:45:28 -05:00
Brett Adams
66c03713b7
Fix Auto Seat Heater in Tesla Fleet (#141539)
Fix Auto Seat Heater
2025-03-26 20:55:34 -04:00
Marc Mueller
d51070c99b
Update boto3 to 1.37.1 and aiobotocore to 2.21.1 (#141499) 2025-03-27 01:38:34 +01:00
Marc Mueller
50d050e63e
Update pyserial-asyncio-fast to 0.15 (#141537) 2025-03-27 01:33:01 +01:00
Norbert Rittel
89bf426163
Fix wrong friendly name for storage_power in solaredge (#141269)
* Fix wrong friendly name for `storage_power` in `solaredge`

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

* Two additional spelling fixes

* Sentence-case "site"
2025-03-27 00:24:14 +01:00
Jan Bouwhuis
377548e3a1
Fix QoS schema issue in MQTT subentries (#141531) 2025-03-26 23:35:28 +01:00
Simone Chemelli
543c6929e6
Fix refresh state for Comelit alarm (#141370) 2025-03-26 22:34:53 +00:00
Jan Bouwhuis
42ae572948
Fix MQTT options flow QoS selector can not serialize (#141528) 2025-03-26 22:56:57 +01:00
Thomas55555
c3f8b7e200
Fix work area sensor for Husqvarna Automower (#141527)
* Fix work area sensor for Husqvarna Automower

* simplify
2025-03-26 23:16:26 +02:00
Robert Resch
3a207e2571
Show box for Smartthings rise number entity (#141526) 2025-03-26 22:03:24 +01:00
Andrew Sayre
6bfd39f094
Add play queue item to HEOS (#141480)
Add ability to play specific queue item
2025-03-26 15:47:10 -05:00
Robert Resch
002ca9611d
Add test for invalid mean type in StatisticsMeta (#141475) 2025-03-26 21:40:02 +01:00
Joost Lekkerkerker
46ee3d2b26
Sort SmartThings devices to be created by parent device id (#141515) 2025-03-26 20:52:39 +01:00
Franck Nijhof
eb901bcf3a
Bump version to 2025.5.0dev0 (#141507) 2025-03-26 20:30:03 +01:00
Norbert Rittel
930b4a2c81
Capitalize "Ethernet" in roku sensor name (#141509)
* Capitalize "Ethernet" in `roku` sensor name

* Update test_binary_sensor.py
2025-03-26 21:18:52 +02:00
Robert Resch
22d1b8e1cd
Bump deebot-client to 12.4.0 (#141501) 2025-03-26 19:36:04 +01:00
1458 changed files with 71799 additions and 21578 deletions

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:

View File

@ -40,7 +40,7 @@ env:
CACHE_VERSION: 12
UV_CACHE_VERSION: 1
MYPY_CACHE_VERSION: 9
HA_SHORT_VERSION: "2025.4"
HA_SHORT_VERSION: "2025.5"
DEFAULT_PYTHON: "3.13"
ALL_PYTHON_VERSIONS: "['3.13']"
# 10.3 is the oldest supported version
@ -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 }}

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"

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.*

9
CODEOWNERS generated
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
@ -1480,8 +1483,6 @@ build.json @home-assistant/supervisor
/tests/components/suez_water/ @ooii @jb101010-2
/homeassistant/components/sun/ @Swamp-Ig
/tests/components/sun/ @Swamp-Ig
/homeassistant/components/sunweg/ @rokam
/tests/components/sunweg/ @rokam
/homeassistant/components/supla/ @mwegrzynek
/homeassistant/components/surepetcare/ @benleb @danielhiversen
/tests/components/surepetcare/ @benleb @danielhiversen

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

View File

@ -0,0 +1,5 @@
{
"domain": "bosch",
"name": "Bosch",
"integrations": ["bosch_alarm", "bosch_shc", "home_connect"]
}

View File

@ -0,0 +1,5 @@
{
"domain": "eve",
"name": "Eve",
"iot_standards": ["matter"]
}

View File

@ -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%]"
}
}
}

View File

@ -68,8 +68,8 @@
"led_bar_mode": {
"name": "LED bar mode",
"state": {
"off": "Off",
"co2": "Carbon dioxide",
"off": "[%key:common::state::off%]",
"co2": "[%key:component::sensor::entity_component::carbon_dioxide::name%]",
"pm": "Particulate matter"
}
},
@ -143,8 +143,8 @@
"led_bar_mode": {
"name": "[%key:component::airgradient::entity::select::led_bar_mode::name%]",
"state": {
"off": "[%key:component::airgradient::entity::select::led_bar_mode::state::off%]",
"co2": "[%key:component::airgradient::entity::select::led_bar_mode::state::co2%]",
"off": "[%key:common::state::off%]",
"co2": "[%key:component::sensor::entity_component::carbon_dioxide::name%]",
"pm": "[%key:component::airgradient::entity::select::led_bar_mode::state::pm%]"
}
},

View File

@ -8,7 +8,7 @@ from aiohttp import ClientSession
from aiohttp.client_exceptions import ClientConnectorError
from pyairnow import WebServiceAPI
from pyairnow.conv import aqi_to_concentration
from pyairnow.errors import AirNowError
from pyairnow.errors import AirNowError, InvalidJsonError
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
@ -79,7 +79,7 @@ class AirNowDataUpdateCoordinator(DataUpdateCoordinator[dict[str, Any]]):
distance=self.distance,
)
except (AirNowError, ClientConnectorError) as error:
except (AirNowError, ClientConnectorError, InvalidJsonError) as error:
raise UpdateFailed(error) from error
if not obs:

View File

@ -2,7 +2,7 @@
"config": {
"step": {
"geography_by_coords": {
"title": "Configure a Geography",
"title": "Configure a geography",
"description": "Use the AirVisual cloud API to monitor a latitude/longitude.",
"data": {
"api_key": "[%key:common::config_flow::data::api_key%]",
@ -16,8 +16,8 @@
"data": {
"api_key": "[%key:common::config_flow::data::api_key%]",
"city": "City",
"country": "Country",
"state": "State"
"state": "State",
"country": "[%key:common::config_flow::data::country%]"
}
},
"reauth_confirm": {
@ -56,12 +56,12 @@
"sensor": {
"pollutant_label": {
"state": {
"co": "Carbon Monoxide",
"n2": "Nitrogen Dioxide",
"o3": "Ozone",
"p1": "PM10",
"p2": "PM2.5",
"s2": "Sulfur Dioxide"
"co": "[%key:component::sensor::entity_component::carbon_monoxide::name%]",
"n2": "[%key:component::sensor::entity_component::nitrogen_dioxide::name%]",
"o3": "[%key:component::sensor::entity_component::ozone::name%]",
"p1": "[%key:component::sensor::entity_component::pm10::name%]",
"p2": "[%key:component::sensor::entity_component::pm25::name%]",
"s2": "[%key:component::sensor::entity_component::sulphur_dioxide::name%]"
}
},
"pollutant_level": {

View File

@ -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"]
}

View File

@ -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",
),
)

View File

@ -76,6 +76,9 @@
"sensor": {
"rssi": {
"name": "RSSI"
},
"thermostat_signal": {
"name": "Signal strength"
}
}
}

View File

@ -32,9 +32,9 @@
"air_quality": {
"name": "Air Quality mode",
"state": {
"off": "Off",
"on": "On",
"auto": "Auto"
"off": "[%key:common::state::off%]",
"on": "[%key:common::state::on%]",
"auto": "[%key:common::state::auto%]"
}
},
"modes": {

View File

@ -6,5 +6,5 @@
"iot_class": "cloud_push",
"loggers": ["boto3", "botocore", "s3transfer"],
"quality_scale": "legacy",
"requirements": ["boto3==1.34.131"]
"requirements": ["boto3==1.37.1"]
}

View File

@ -5,5 +5,5 @@
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/android_ip_webcam",
"iot_class": "local_polling",
"requirements": ["pydroid-ipcam==2.0.0"]
"requirements": ["pydroid-ipcam==3.0.0"]
}

View File

@ -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

View File

@ -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

View File

@ -54,5 +54,10 @@
}
}
}
},
"exceptions": {
"connection_closed": {
"message": "Connection to the Android TV device is closed"
}
}
}

View File

@ -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,

View File

@ -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": [

View File

@ -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

View File

@ -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",

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.

View File

@ -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

View File

@ -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(

View File

@ -43,6 +43,7 @@ class ApSystemsDataCoordinator(DataUpdateCoordinator[ApSystemsSensorData]):
config_entry: ApSystemsConfigEntry
device_version: str
battery_system: bool
def __init__(
self,
@ -68,6 +69,7 @@ class ApSystemsDataCoordinator(DataUpdateCoordinator[ApSystemsSensorData]):
self.api.max_power = device_info.maxPower
self.api.min_power = device_info.minPower
self.device_version = device_info.devVer
self.battery_system = device_info.isBatterySystem
async def _async_update_data(self) -> ApSystemsSensorData:
try:

View File

@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/apsystems",
"integration_type": "device",
"iot_class": "local_polling",
"requirements": ["apsystems-ez1==2.4.0"]
"requirements": ["apsystems-ez1==2.5.0"]
}

View File

@ -36,6 +36,8 @@ class ApSystemsInverterSwitch(ApSystemsEntity, SwitchEntity):
super().__init__(data)
self._api = data.coordinator.api
self._attr_unique_id = f"{data.device_id}_inverter_status"
if data.coordinator.battery_system:
self._attr_available = False
async def async_update(self) -> None:
"""Update switch status and availability."""

View File

@ -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%]"
}
}
}

View File

@ -26,7 +26,7 @@
"sensor": {
"threshold": {
"state": {
"error": "Error",
"error": "[%key:common::state::error%]",
"green": "Green",
"yellow": "Yellow",
"red": "Red"

View File

@ -1,9 +1,11 @@
"""Base class for assist satellite entities."""
import logging
from pathlib import Path
import voluptuous as vol
from homeassistant.components.http import StaticPathConfig
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers import config_validation as cv
@ -15,6 +17,8 @@ from .const import (
CONNECTION_TEST_DATA,
DATA_COMPONENT,
DOMAIN,
PREANNOUNCE_FILENAME,
PREANNOUNCE_URL,
AssistSatelliteEntityFeature,
)
from .entity import (
@ -56,6 +60,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
{
vol.Optional("message"): str,
vol.Optional("media_id"): str,
vol.Optional("preannounce"): bool,
vol.Optional("preannounce_media_id"): str,
}
),
@ -71,6 +76,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
{
vol.Optional("start_message"): str,
vol.Optional("start_media_id"): str,
vol.Optional("preannounce"): bool,
vol.Optional("preannounce_media_id"): str,
vol.Optional("extra_system_prompt"): str,
}
@ -84,6 +90,15 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
async_register_websocket_api(hass)
hass.http.register_view(ConnectionTestView())
# Default preannounce sound
await hass.http.async_register_static_paths(
[
StaticPathConfig(
PREANNOUNCE_URL, str(Path(__file__).parent / PREANNOUNCE_FILENAME)
)
]
)
return True

View File

@ -20,6 +20,9 @@ CONNECTION_TEST_DATA: HassKey[dict[str, asyncio.Event]] = HassKey(
f"{DOMAIN}_connection_tests"
)
PREANNOUNCE_FILENAME = "preannounce.mp3"
PREANNOUNCE_URL = f"/api/assist_satellite/static/{PREANNOUNCE_FILENAME}"
class AssistSatelliteEntityFeature(IntFlag):
"""Supported features of Assist satellite entity."""

View File

@ -28,7 +28,7 @@ from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import chat_session, entity
from homeassistant.helpers.entity import EntityDescription
from .const import AssistSatelliteEntityFeature
from .const import PREANNOUNCE_URL, AssistSatelliteEntityFeature
from .errors import AssistSatelliteError, SatelliteBusyError
_LOGGER = logging.getLogger(__name__)
@ -180,7 +180,8 @@ class AssistSatelliteEntity(entity.Entity):
self,
message: str | None = None,
media_id: str | None = None,
preannounce_media_id: str | None = None,
preannounce: bool = True,
preannounce_media_id: str = PREANNOUNCE_URL,
) -> None:
"""Play and show an announcement on the satellite.
@ -190,7 +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_media_id is provided, it is played before the announcement.
If preannounce is True, a sound is played before the announcement.
If preannounce_media_id is provided, it overrides the default sound.
Calls async_announce with message and media id.
"""
@ -200,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:
@ -228,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 = None,
preannounce: bool = True,
preannounce_media_id: str = PREANNOUNCE_URL,
) -> None:
"""Start a conversation from the satellite.
@ -238,7 +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 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.
"""
@ -255,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:

View File

@ -8,12 +8,18 @@ announce:
message:
required: false
example: "Time to wake up!"
default: ""
selector:
text:
media_id:
required: false
selector:
text:
preannounce:
required: false
default: true
selector:
boolean:
preannounce_media_id:
required: false
selector:
@ -28,6 +34,7 @@ start_conversation:
start_message:
required: false
example: "You left the lights on in the living room. Turn them off?"
default: ""
selector:
text:
start_media_id:
@ -38,6 +45,11 @@ start_conversation:
required: false
selector:
text:
preannounce:
required: false
default: true
selector:
boolean:
preannounce_media_id:
required: false
selector:

View File

@ -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."
}
}
}

View File

@ -198,7 +198,8 @@ async def websocket_test_connection(
hass.async_create_background_task(
satellite.async_internal_announce(
media_id=f"{CONNECTION_TEST_URL_BASE}/{connection_id}"
media_id=f"{CONNECTION_TEST_URL_BASE}/{connection_id}",
preannounce=False,
),
f"assist_satellite_connection_test_{msg['entity_id']}",
)

View File

@ -6,5 +6,5 @@
"iot_class": "cloud_push",
"loggers": ["aiobotocore", "botocore"],
"quality_scale": "legacy",
"requirements": ["aiobotocore==2.13.1", "botocore==1.34.131"]
"requirements": ["aiobotocore==2.21.1", "botocore==1.37.1"]
}

View File

@ -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

View File

@ -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)

View File

@ -26,9 +26,9 @@
"entity": {
"sensor": {
"backup_manager_state": {
"name": "Backup Manager State",
"name": "Backup Manager state",
"state": {
"idle": "Idle",
"idle": "[%key:common::state::idle%]",
"create_backup": "Creating a backup",
"receive_backup": "Receiving a backup",
"restore_backup": "Restoring a backup"

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%]"
}
}
}

View File

@ -0,0 +1 @@
"""Balay virtual integration."""

View File

@ -0,0 +1,6 @@
{
"domain": "balay",
"name": "Balay",
"integration_type": "virtual",
"supported_by": "home_connect"
}

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%]"
}
}
},

View File

@ -124,15 +124,15 @@
"battery": {
"name": "Battery",
"state": {
"off": "Normal",
"on": "Low"
"off": "[%key:common::state::normal%]",
"on": "[%key:common::state::low%]"
}
},
"battery_charging": {
"name": "Charging",
"state": {
"off": "Not charging",
"on": "Charging"
"on": "[%key:common::state::charging%]"
}
},
"carbon_monoxide": {
@ -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"
}
},

View File

@ -30,18 +30,18 @@
"available": "Available",
"charging": "[%key:common::state::charging%]",
"unavailable": "Unavailable",
"error": "Error",
"error": "[%key:common::state::error%]",
"offline": "Offline"
}
},
"vehicle_status": {
"name": "Vehicle status",
"state": {
"standby": "Standby",
"standby": "[%key:common::state::standby%]",
"vehicle_detected": "Detected",
"ready": "Ready",
"no_power": "No power",
"vehicle_error": "Error"
"vehicle_error": "[%key:common::state::error%]"
}
},
"actual_v1": {

View File

@ -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."

View File

@ -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."""

View File

@ -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"
]
}

View File

@ -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)

View File

@ -6,7 +6,7 @@
"data": {
"username": "[%key:common::config_flow::data::username%]",
"password": "[%key:common::config_flow::data::password%]",
"region": "ConnectedDrive Region"
"region": "ConnectedDrive region"
},
"data_description": {
"username": "The email address of your MyBMW/MINI Connected account.",
@ -113,10 +113,10 @@
},
"select": {
"ac_limit": {
"name": "AC Charging Limit"
"name": "AC charging limit"
},
"charging_mode": {
"name": "Charging Mode",
"name": "Charging mode",
"state": {
"immediate_charging": "Immediate charging",
"delayed_charging": "Delayed charging",
@ -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",
@ -181,7 +181,7 @@
"cooling": "Cooling",
"heating": "Heating",
"inactive": "Inactive",
"standby": "Standby",
"standby": "[%key:common::state::standby%]",
"ventilation": "Ventilation"
}
},

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(

View File

@ -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"],

View File

@ -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

View File

@ -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)

View File

@ -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,
)

View File

@ -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,
},
}

View File

@ -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)

View File

@ -0,0 +1,9 @@
{
"entity": {
"sensor": {
"faulting_points": {
"default": "mdi:alert-circle-outline"
}
}
}
}

View File

@ -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"]
}

View File

@ -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

View File

@ -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)

View File

@ -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"
}
}
}
}

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": {

View File

@ -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."""

View File

@ -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),
}

View File

@ -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",

View File

@ -142,6 +142,12 @@ class CambridgeAudioDevice(CambridgeAudioEntity, MediaPlayerEntity):
@property
def media_artist(self) -> str | None:
"""Artist of current playing media, music track only."""
if (
not self.client.play_state.metadata.artist
and self.client.state.source == "IR"
):
# Return channel instead of artist when playing internet radio
return self.client.play_state.metadata.station
return self.client.play_state.metadata.artist
@property
@ -169,6 +175,11 @@ class CambridgeAudioDevice(CambridgeAudioEntity, MediaPlayerEntity):
"""Last time the media position was updated."""
return self.client.position_last_updated
@property
def media_channel(self) -> str | None:
"""Channel currently playing."""
return self.client.play_state.metadata.station
@property
def is_volume_muted(self) -> bool | None:
"""Volume mute status."""

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

View File

@ -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"
}
},
@ -98,13 +98,13 @@
"name": "Preset",
"state": {
"none": "None",
"eco": "Eco",
"away": "Away",
"home": "[%key:common::state::home%]",
"away": "[%key:common::state::not_home%]",
"activity": "Activity",
"boost": "Boost",
"comfort": "Comfort",
"home": "[%key:common::state::home%]",
"sleep": "Sleep",
"activity": "Activity"
"eco": "Eco",
"sleep": "Sleep"
}
},
"preset_modes": {
@ -257,8 +257,8 @@
"selector": {
"hvac_mode": {
"options": {
"off": "Off",
"auto": "Auto",
"off": "[%key:common::state::off%]",
"auto": "[%key:common::state::auto%]",
"cool": "Cool",
"dry": "Dry",
"fan_only": "Fan only",

View File

@ -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

View File

@ -4,13 +4,14 @@ from __future__ import annotations
import asyncio
from collections.abc import AsyncIterator, Callable, Coroutine, Mapping
from http import HTTPStatus
import logging
import random
from typing import Any
from aiohttp import ClientError
from aiohttp import ClientError, ClientResponseError
from hass_nabucasa import Cloud, CloudError
from hass_nabucasa.api import CloudApiNonRetryableError
from hass_nabucasa.api import CloudApiError, CloudApiNonRetryableError
from hass_nabucasa.cloud_api import (
FilesHandlerListEntry,
async_files_delete_file,
@ -120,6 +121,8 @@ class CloudBackupAgent(BackupAgent):
"""
if not backup.protected:
raise BackupAgentError("Cloud backups must be protected")
if self._cloud.subscription_expired:
raise BackupAgentError("Cloud subscription has expired")
size = backup.size
try:
@ -152,6 +155,13 @@ class CloudBackupAgent(BackupAgent):
) from err
raise BackupAgentError(f"Failed to upload backup {err}") from err
except CloudError as err:
if (
isinstance(err, CloudApiError)
and isinstance(err.orig_exc, ClientResponseError)
and err.orig_exc.status == HTTPStatus.FORBIDDEN
and self._cloud.subscription_expired
):
raise BackupAgentError("Cloud subscription has expired") from err
if tries == _RETRY_LIMIT:
raise BackupAgentError(f"Failed to upload backup {err}") from err
tries += 1

View File

@ -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})

View File

@ -9,7 +9,6 @@ from typing import Any
import pycfdns
import voluptuous as vol
from homeassistant.components import persistent_notification
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.const import CONF_API_TOKEN, CONF_ZONE
from homeassistant.core import HomeAssistant
@ -118,8 +117,6 @@ class CloudflareConfigFlow(ConfigFlow, domain=DOMAIN):
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
"""Handle a flow initiated by the user."""
persistent_notification.async_dismiss(self.hass, "cloudflare_setup")
errors: dict[str, str] = {}
if user_input is not None:

View File

@ -41,6 +41,7 @@ ALARM_ACTIONS: dict[str, str] = {
ALARM_AREA_ARMED_STATUS: dict[str, int] = {
DISABLE: 0,
HOME_P1: 1,
HOME_P2: 2,
NIGHT: 3,
@ -82,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
@ -128,20 +128,46 @@ class ComelitAlarmEntity(CoordinatorEntity[ComelitVedoSystem], AlarmControlPanel
AlarmAreaState.TRIGGERED: AlarmControlPanelState.TRIGGERED,
}.get(self._area.human_status)
async def _async_update_state(self, area_state: AlarmAreaState, armed: int) -> None:
"""Update state after action."""
self._area.human_status = area_state
self._area.armed = armed
await self.async_update_ha_state()
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]
)

View File

@ -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

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:

View File

@ -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()

View File

@ -8,12 +8,12 @@ from aiocomelit import ComelitSerialBridgeObject
from aiocomelit.const import COVER, STATE_COVER, STATE_OFF, STATE_ON
from homeassistant.components.cover import CoverDeviceClass, CoverEntity, CoverState
from homeassistant.core import HomeAssistant, callback
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
@ -98,13 +89,20 @@ class ComelitCoverEntity(
"""Return if the cover is opening."""
return self._current_action("opening")
async def _cover_set_state(self, action: int, state: int) -> None:
"""Set desired cover state."""
self._last_state = self.state
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()
async def async_close_cover(self, **kwargs: Any) -> None:
"""Close cover."""
await self._api.set_device_status(COVER, self._device.index, STATE_OFF)
await self._cover_set_state(STATE_OFF, 2)
async def async_open_cover(self, **kwargs: Any) -> None:
"""Open cover."""
await self._api.set_device_status(COVER, self._device.index, STATE_ON)
await self._cover_set_state(STATE_ON, 1)
async def async_stop_cover(self, **_kwargs: Any) -> None:
"""Stop the cover."""
@ -112,13 +110,7 @@ class ComelitCoverEntity(
return
action = STATE_ON if self.is_closing else STATE_OFF
await self._api.set_device_status(COVER, self._device.index, action)
@callback
def _handle_coordinator_update(self) -> None:
"""Handle device update."""
self._last_state = self.state
self.async_write_ha_state()
await self._cover_set_state(action, 0)
async def async_added_to_hass(self) -> None:
"""Handle entity which will be added."""

View File

@ -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)

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()

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,33 +32,18 @@ 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)
await self.coordinator.async_request_refresh()
self.coordinator.data[LIGHT][self._device.index].status = state
self.async_write_ha_state()
async def async_turn_on(self, **kwargs: Any) -> None:
"""Turn the light on."""

View File

@ -7,5 +7,6 @@
"integration_type": "hub",
"iot_class": "local_polling",
"loggers": ["aiocomelit"],
"quality_scale": "bronze",
"requirements": ["aiocomelit==0.11.3"]
}

View File

@ -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

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

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}"
}
}
}

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
@ -67,7 +61,8 @@ class ComelitSwitchEntity(CoordinatorEntity[ComelitSerialBridge], SwitchEntity):
await self.coordinator.api.set_device_status(
self._device.type, self._device.index, state
)
await self.coordinator.async_request_refresh()
self.coordinator.data[self._device.type][self._device.index].status = state
self.async_write_ha_state()
async def async_turn_on(self, **kwargs: Any) -> None:
"""Turn the switch on."""
@ -80,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
)

View File

@ -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:

View File

@ -0,0 +1 @@
"""Constructa virtual integration."""

View File

@ -0,0 +1,6 @@
{
"domain": "constructa",
"name": "Constructa",
"integration_type": "virtual",
"supported_by": "home_connect"
}

View File

@ -197,6 +197,7 @@ class ChatLog:
(
"?",
";", # Greek question mark
"", # Chinese question mark
)
)
)
@ -354,11 +355,40 @@ class ChatLog:
if self.delta_listener:
self.delta_listener(self, asdict(tool_result))
async def _async_expand_prompt_template(
self,
llm_context: llm.LLMContext,
prompt: str,
language: str,
user_name: str | None = None,
) -> str:
try:
return template.Template(prompt, self.hass).async_render(
{
"ha_name": self.hass.config.location_name,
"user_name": user_name,
"llm_context": llm_context,
},
parse_result=False,
)
except TemplateError as err:
LOGGER.error("Error rendering prompt: %s", err)
intent_response = intent.IntentResponse(language=language)
intent_response.async_set_error(
intent.IntentResponseErrorCode.UNKNOWN,
"Sorry, I had a problem with my template",
)
raise ConverseError(
"Error rendering prompt",
conversation_id=self.conversation_id,
response=intent_response,
) from err
async def async_update_llm_data(
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."""
@ -409,38 +439,28 @@ class ChatLog:
):
user_name = user.name
try:
prompt_parts = [
template.Template(
llm.BASE_PROMPT
+ (user_llm_prompt or llm.DEFAULT_INSTRUCTIONS_PROMPT),
self.hass,
).async_render(
{
"ha_name": self.hass.config.location_name,
"user_name": user_name,
"llm_context": llm_context,
},
parse_result=False,
)
]
except TemplateError as err:
LOGGER.error("Error rendering prompt: %s", err)
intent_response = intent.IntentResponse(language=user_input.language)
intent_response.async_set_error(
intent.IntentResponseErrorCode.UNKNOWN,
"Sorry, I had a problem with my template",
prompt_parts = []
prompt_parts.append(
await self._async_expand_prompt_template(
llm_context,
(user_llm_prompt or llm.DEFAULT_INSTRUCTIONS_PROMPT),
user_input.language,
user_name,
)
raise ConverseError(
"Error rendering prompt",
conversation_id=self.conversation_id,
response=intent_response,
) from err
)
if llm_api:
prompt_parts.append(llm_api.api_prompt)
prompt_parts.append(
await self._async_expand_prompt_template(
llm_context,
llm.BASE_PROMPT,
user_input.language,
user_name,
)
)
if extra_system_prompt := (
# Take new system prompt if one was given
user_input.extra_system_prompt or self.extra_system_prompt

View File

@ -650,7 +650,14 @@ class DefaultAgent(ConversationEntity):
if (
(maybe_result is None) # first result
or (num_matched_entities > best_num_matched_entities)
or (
# More literal text matched
result.text_chunks_matched > maybe_result.text_chunks_matched
)
or (
# More entities matched
num_matched_entities > best_num_matched_entities
)
or (
# Fewer unmatched entities
(num_matched_entities == best_num_matched_entities)
@ -662,16 +669,6 @@ class DefaultAgent(ConversationEntity):
and (num_unmatched_entities == best_num_unmatched_entities)
and (num_unmatched_ranges > best_num_unmatched_ranges)
)
or (
# More literal text matched
(num_matched_entities == best_num_matched_entities)
and (num_unmatched_entities == best_num_unmatched_entities)
and (num_unmatched_ranges == best_num_unmatched_ranges)
and (
result.text_chunks_matched
> maybe_result.text_chunks_matched
)
)
or (
# Prefer match failures with entities
(result.text_chunks_matched == maybe_result.text_chunks_matched)

View File

@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/conversation",
"integration_type": "system",
"quality_scale": "internal",
"requirements": ["hassil==2.2.3", "home-assistant-intents==2025.3.24"]
"requirements": ["hassil==2.2.3", "home-assistant-intents==2025.3.28"]
}

View File

@ -6,7 +6,7 @@
"data": {
"email": "[%key:common::config_flow::data::email%]",
"password": "[%key:common::config_flow::data::password%]",
"country": "Country"
"country": "[%key:common::config_flow::data::country%]"
},
"data_description": {
"email": "Email used to access your {cookidoo} account.",

View File

@ -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:

View File

@ -38,10 +38,10 @@
"name": "[%key:component::cover::title%]",
"state": {
"open": "[%key:common::state::open%]",
"opening": "Opening",
"opening": "[%key:common::state::opening%]",
"closed": "[%key:common::state::closed%]",
"closing": "Closing",
"stopped": "Stopped"
"closing": "[%key:common::state::closing%]",
"stopped": "[%key:common::state::stopped%]"
},
"state_attributes": {
"current_position": {

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