Compare commits

..

1037 Commits

Author SHA1 Message Date
Franck Nijhof
4eddbe7b47 2024.1.2 (#107365) 2024-01-06 13:17:47 +01:00
Franck Nijhof
cab833160d Bump version to 2024.1.2 2024-01-06 12:25:05 +01:00
David F. Mulcahey
003d2be477 Fix assertion error when unloading ZHA with pollable entities (#107311) 2024-01-06 12:24:35 +01:00
Sid
5a01b55fd1 enigma2: fix exception when device in deep sleep, fix previous track (#107296)
enigma2: fix exception when device in deep sleep; previous track
2024-01-06 12:24:32 +01:00
Shay Levy
0dbb4105bc Fix Shelly missing Gen value for older devices (#107294) 2024-01-06 12:24:29 +01:00
Joost Lekkerkerker
5ff6284e0f Fix passing correct location id to streamlabs water (#107291) 2024-01-06 12:24:25 +01:00
Aidan Timson
97674cee88 Fix support for play/pause functionality in System Bridge (#103423)
Fix support for play/pause functionality
2024-01-06 12:24:21 +01:00
Franck Nijhof
24a8a512d6 2024.1.1 (#107239) 2024-01-05 16:25:49 +01:00
Franck Nijhof
658f1cf5c5 Bump version to 2024.1.1 2024-01-05 13:01:35 +01:00
Raman Gupta
d012817190 Bump zwave-js-server-python to 0.55.3 (#107225)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2024-01-05 13:01:06 +01:00
Joakim Sørensen
056701d218 Use supported_features_compat in update.install service (#107224) 2024-01-05 13:01:03 +01:00
Petru Paler
c3963b26e7 Fix entity property cache creation arguments (#107221) 2024-01-05 13:00:59 +01:00
tronikos
4ade5e46d9 Disable IPv6 in the opower integration to fix AEP utilities (#107203) 2024-01-05 13:00:55 +01:00
Brett Adams
c242dcd1f2 Hotfix cache logic bug in Tessie (#107187) 2024-01-05 13:00:52 +01:00
Michael
4e126d68b7 Fix switch states in AVM FRITZ!Box Tools (#107183) 2024-01-05 13:00:49 +01:00
Erwin Douna
d7e1a4fa20 Bump to PyTado 0.17.3 (#107181) 2024-01-05 13:00:46 +01:00
J. Nick Koston
3215dfee6d Bump aiohomekit to 3.1.2 (#107177) 2024-01-05 13:00:43 +01:00
Matt Emerick-Law
c78d691d30 Bump Orvibo to 1.1.2 (#107162)
* Bump python-orvibo version

Fixes https://github.com/home-assistant/core/issues/106923

* Add version number

* Remove version

* Bump python-orvibo version
2024-01-05 13:00:39 +01:00
Bram Kragten
04bf569308 Update frontend to 20240104.0 (#107155) 2024-01-05 13:00:36 +01:00
Erik Montnemery
b8576b8091 Include deprecated constants in wildcard imports (#107114) 2024-01-05 13:00:33 +01:00
J. Nick Koston
a7aa5c0e52 Bump habluetooth to 2.0.2 (#107097) 2024-01-05 13:00:29 +01:00
J. Nick Koston
d600b76801 Fix missing backwards compatibility layer for water_heater supported_features (#107091) 2024-01-05 13:00:26 +01:00
Erik Montnemery
c56d118e8b Deduplicate handling of duplicated constants (#107074)
* Deduplicate handling of duplicated constants

* Use DeprecatedConstant + DeprecatedConstantEnum

* Fixup

* Remove test cases with unnamed tuples
2024-01-05 13:00:23 +01:00
Robert Resch
80b45edb2e Fix mobile_app cloudhook creation (#107068) 2024-01-05 13:00:20 +01:00
Joost Lekkerkerker
5529a85a2b Fix data access in streamlabs water (#107062)
* Fix data access in streamlabs water

* Fix data access in streamlabs water
2024-01-05 13:00:17 +01:00
Joost Lekkerkerker
e2acc70128 Use async_register in streamlabswater (#107060) 2024-01-05 13:00:14 +01:00
J. Nick Koston
427077a4c9 Fix missing backwards compatiblity layer for humidifier supported_features (#107026)
fixes #107018
2024-01-05 13:00:10 +01:00
Maciej Bieniek
8c9875c3cc Get Shelly RPC device gen from config entry data (#107019)
Use gen from config entry data
2024-01-05 13:00:07 +01:00
Sid
ce5455fefc Bump openwebifpy to 4.0.4 (#107000) 2024-01-05 13:00:04 +01:00
Ståle Storø Hauknes
aef129afaf Close stale connections (Airthings BLE) (#106748)
Co-authored-by: J. Nick Koston <nick@koston.org>
2024-01-05 13:00:01 +01:00
Sid
1c94a94ba2 bump openwebifpy to 4.0.3 (#106593) 2024-01-05 12:59:56 +01:00
Patrick Frazer
d87baba96f Bump dropmqttapi to 1.0.2 (#106978) 2024-01-05 12:57:58 +01:00
Joe Neuman
5a0997bac0 Fix qBittorrent torrent count when empty (#106903)
* Fix qbittorrent torrent cound when empty

* lint fix

* Change based on comment
2024-01-05 12:57:55 +01:00
Marc Mueller
e70af204ee Enable strict typing for airthings_ble (#106815) 2024-01-05 12:57:50 +01:00
Franck Nijhof
fb0cc6c5d0 2024.1.0 (#106970) 2024-01-03 18:15:49 +01:00
Franck Nijhof
15cecbd4a4 Bump version to 2024.1.0 2024-01-03 17:13:22 +01:00
Franck Nijhof
8cf47c4925 Bump version to 2024.1.0b8 2024-01-03 15:29:59 +01:00
Bram Kragten
cd8d95a04d Update frontend to 20240103.3 (#106963) 2024-01-03 15:29:51 +01:00
Jonas Fors Lellky
015752ff11 Set precision to halves in flexit_bacnet (#106959)
flexit_bacnet: set precision to halves for target temperature
2024-01-03 15:29:48 +01:00
jan iversen
9d697c5026 Only set precision in modbus if not configured. (#106952)
Only set precision if not configured.
2024-01-03 15:29:42 +01:00
Bram Kragten
4595c3edaa Update frontend to 20240103.1 (#106948) 2024-01-03 15:29:38 +01:00
Robert Resch
e745542431 Fix creating cloud hook twice for mobile_app (#106945) 2024-01-03 15:29:33 +01:00
Franck Nijhof
2be72fd891 Bump version to 2024.1.0b7 2024-01-03 11:35:43 +01:00
Bram Kragten
2b43f5fcda Update frontend to 20240103.0 (#106942) 2024-01-03 11:35:35 +01:00
Erwin Douna
3295722e70 Change Tado deprecation version to 2024.7.0 (#106938)
Change version to 2024.7.0
2024-01-03 11:35:30 +01:00
Franck Nijhof
f98bbf88b1 Bump version to 2024.1.0b6 2024-01-03 09:56:28 +01:00
Michael
0226b3f10c Remove group_members from significant attributes in media player (#106916) 2024-01-03 09:55:55 +01:00
Jan-Philipp Benecke
5986967db7 Avoid triggering ping device tracker home after restore (#106913) 2024-01-03 09:55:52 +01:00
Michael Hansen
95ef2dd7f9 Bump intents to 2024.1.2 (#106909) 2024-01-03 09:55:49 +01:00
Erwin Douna
527d9fbb6b Add try-catch for invalid auth to Tado (#106774)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2024-01-03 09:55:45 +01:00
Michael
5eb1073b4a Apply late review comments on media player (#106727) 2024-01-03 09:55:41 +01:00
Franck Nijhof
77cdc10883 Bump version to 2024.1.0b5 2024-01-02 20:59:49 +01:00
Bram Kragten
5100ba252f Update frontend to 20240102.0 (#106898) 2024-01-02 20:59:40 +01:00
Allen Porter
b5b8bc3102 Improve To-do service error handling (#106886) 2024-01-02 20:59:37 +01:00
Allen Porter
6f18a29241 Improve fitbit authentication error handling (#106885) 2024-01-02 20:59:34 +01:00
David F. Mulcahey
596f855eab Bump Zigpy to 0.60.4 (#106870) 2024-01-02 20:59:31 +01:00
J. Nick Koston
5877fe135c Close stale connections in yalexs_ble to ensure setup can proceed (#106842) 2024-01-02 20:59:28 +01:00
J. Nick Koston
26cf30fc3a Update switchbot to use close_stale_connections_by_address (#106835) 2024-01-02 20:59:25 +01:00
Sid
3419b8d082 Move urllib3 constraint to pyproject.toml (#106768) 2024-01-02 20:59:22 +01:00
Robert Groot
35fc26457b Changed setup of EnergyZero services (#106224)
* Changed setup of energyzero services

* PR review updates

* Dict access instead of get

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

* Added tests for unloaded state

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2024-01-02 20:59:18 +01:00
Franck Nijhof
fc66dead64 Bump version to 2024.1.0b4 2024-01-02 12:59:23 +01:00
Erik Montnemery
056b06de13 Don't use entity_id in __repr__ of not added entity (#106861) 2024-01-02 12:59:11 +01:00
Matt Zimmerman
e604bc8c9b Map missing preset mapping for heat mode "ready" in smarttub (#106856) 2024-01-02 12:59:08 +01:00
J. Nick Koston
59bed57d48 Fix incorrect state in Yale Access Bluetooth when lock status is unknown (#106851) 2024-01-02 12:59:05 +01:00
J. Nick Koston
8c25e2610e Bump yalexs-ble to 2.4.0 (#106834) 2024-01-02 12:59:01 +01:00
J. Nick Koston
38b8a1f95d Bump pySwitchbot to 0.43.0 (#106833) 2024-01-02 12:58:58 +01:00
J. Nick Koston
54a87cf047 Bump bleak-retry-connector to 3.4.0 (#106831) 2024-01-02 12:58:55 +01:00
Bram Kragten
448e98eac5 Update frontend to 20240101.0 (#106808) 2024-01-02 12:58:52 +01:00
Maikel Punie
6ca3c7a673 Bump pyduotecno to 2024.1.1 (#106801)
* Bump pyduotecno to 2024.0.1

* Bump pyduotecno to 2024.1.0

* small update
2024-01-02 12:58:49 +01:00
J. Nick Koston
b1a55e9b19 Fix emulated_hue brightness check (#106783) 2024-01-02 12:58:46 +01:00
David Knowles
16d3d88fa3 Bump pyschlage to 2023.12.1 (#106782) 2024-01-02 12:58:43 +01:00
Christopher Bailey
39960caf36 Bump pyunifiprotect to v4.22.5 (#106781) 2024-01-02 12:58:40 +01:00
Benjamin Richter
e6d2721d1b Fix fints account type check (#106082) 2024-01-02 12:58:37 +01:00
David Knowles
fedb63720c Fix Hydrawise data not refreshing (#105923)
Co-authored-by: Robert Resch <robert@resch.dev>
2024-01-02 12:58:34 +01:00
Luke Lashley
77286e8f59 Constrain dacite to at least 1.7.0 (#105709) 2024-01-02 12:58:31 +01:00
Franck Nijhof
a7d11120fa Bump version to 2024.1.0b3 2023-12-31 18:57:11 +01:00
Tobias Sauerwein
c06df1957f Bump pyatmo to v8.0.2 (#106758) 2023-12-31 18:56:59 +01:00
puddly
99d575261d Bump ZHA dependencies (#106756)
* Bump ZHA dependencies

* Revert "Remove bellows thread, as it has been removed upstream"

This reverts commit c28053f4bf2539eb6150d35af19687610aaeac5e.
2023-12-31 18:56:57 +01:00
J. Nick Koston
3dca39d0f9 Bump habluetooth to 2.0.1 (#106750)
fixes switching scanners to quickly since the manager failed
to account for jitter in the auto discovered advertising interval

replaces and closes #96531

changelog: https://github.com/Bluetooth-Devices/habluetooth/compare/v2.0.0...v2.0.1
2023-12-31 18:56:53 +01:00
J. Nick Koston
a11fd2aaa6 Bump pyunifiprotect to 4.22.4 (#106749)
changelog: https://github.com/AngellusMortis/pyunifiprotect/compare/v4.22.3...v4.22.4
2023-12-31 18:56:51 +01:00
starkillerOG
05768f5fbd Bump reolink_aio to 0.8.5 (#106747) 2023-12-31 18:56:48 +01:00
David F. Mulcahey
3d75603b4f Fix Zlinky energy polling in ZHA (#106738) 2023-12-31 18:56:44 +01:00
Franck Nijhof
2179d4de3d Add missing vacuum toggle service description (#106729) 2023-12-31 18:56:41 +01:00
J. Nick Koston
2255f6737c Pin lxml to 4.9.4 (#106694) 2023-12-31 18:56:38 +01:00
J. Nick Koston
456cb20fcd Fix missed cached_property for hvac_mode in climate (#106692) 2023-12-31 18:56:35 +01:00
Keilin Bickar
8dfbe6849e Bump asyncsleepiq to v1.4.1 (#106682)
Update asyncsleepiq to v1.4.1
2023-12-31 18:56:32 +01:00
J. Nick Koston
3dd998b622 Bump roombapy to 1.6.10 (#106678)
changelog: https://github.com/pschmitt/roombapy/compare/1.6.8...1.6.10

fixes #105323
2023-12-31 18:56:29 +01:00
J. Nick Koston
84da1638e8 Bump thermobeacon-ble to 0.6.2 (#106676)
changelog: https://github.com/Bluetooth-Devices/thermobeacon-ble/compare/v0.6.0...v0.6.2
2023-12-31 18:56:26 +01:00
Erik Montnemery
362e5ca09a Fix changed_variables in automation traces (#106665) 2023-12-31 18:56:23 +01:00
G Johansson
494dd2ef07 Handle no permission for disks in Systemmonitor (#106653) 2023-12-31 18:56:20 +01:00
G Johansson
767c55fbac Use set instead of list in Systemmonitor (#106650) 2023-12-31 18:56:17 +01:00
Erik Montnemery
5f3389b8e4 Fix yolink entity descriptions (#106649) 2023-12-31 18:56:14 +01:00
Jaroslav Hanslík
c1e37a4cc3 Fixed native apparent temperature in WeatherEntity (#106645) 2023-12-31 18:56:11 +01:00
Jirka
3cd5f0568a Fix typo in Blink strings (#106641)
Update strings.json

Fixed typo.
2023-12-31 18:56:08 +01:00
Erik Montnemery
f9150b78b3 Ensure it's safe to call Entity.__repr__ on non added entity (#106032) 2023-12-31 18:56:04 +01:00
Franck Nijhof
c54af00ce9 Bump version to 2024.1.0b2 2023-12-29 11:29:50 +01:00
Erik Montnemery
bb6f3bc830 Fix missing await when running shutdown jobs (#106632) 2023-12-29 11:28:15 +01:00
J. Nick Koston
f84d865c51 Migrate light entity to use contains for LightEntityFeature with deprecation warnings (#106622) 2023-12-29 11:28:12 +01:00
J. Nick Koston
2147df4418 Add deprecation warning for siren supported features when using magic numbers (#106621) 2023-12-29 11:28:09 +01:00
J. Nick Koston
af9f6a2b12 Add deprecation warning for lock supported features when using magic numbers (#106620) 2023-12-29 11:28:06 +01:00
J. Nick Koston
024d689b94 Add deprecation warning for alarm_control_panel supported features when using magic numbers (#106619) 2023-12-29 11:28:03 +01:00
J. Nick Koston
9f4790902a Add deprecation warning for cover supported features when using magic numbers (#106618) 2023-12-29 11:27:59 +01:00
J. Nick Koston
5d9177d6e6 Media player platform back-compat for custom components without MediaPlayerEntityFeature (#106616) 2023-12-29 11:27:56 +01:00
J. Nick Koston
70842f197e Vacuum platform back-compat for custom components without VacuumEntityFeature (#106614) 2023-12-29 11:27:53 +01:00
J. Nick Koston
f03bb4a2da Humidifier platform back-compat for custom components without HumidifierEntityFeature (#106613) 2023-12-29 11:27:50 +01:00
J. Nick Koston
aa6e904e86 Remote platform back-compat for custom components without RemoteEntityFeature (#106609) 2023-12-29 11:27:47 +01:00
J. Nick Koston
6224e630ac Water heater platform back-compat for custom components without WaterHeaterEntityFeature (#106608) 2023-12-29 11:27:44 +01:00
J. Nick Koston
04fe8260ab Fan platform back-compat for custom components without FanEntityFeature (#106607) 2023-12-29 11:27:41 +01:00
J. Nick Koston
4a98a6465e Climate platform back-compat for custom components without ClimateEntityFeature (#106605) 2023-12-29 11:27:38 +01:00
Joe Neuman
06f06b7595 Fix count bug in qBittorrent (#106603) 2023-12-29 11:27:35 +01:00
J. Nick Koston
16192cd7f2 Add helper to report deprecated entity supported features magic numbers (#106602) 2023-12-29 11:27:32 +01:00
Robert Hillis
982707afe6 Fix Netgear LTE halting startup (#106598) 2023-12-29 11:27:28 +01:00
Joost Lekkerkerker
911234ae8f Move aeptexas to aep_texas (#106595) 2023-12-29 11:25:58 +01:00
tronikos
55877b0953 Rename domain aepohio to aep_ohio (#106536)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-12-29 11:23:08 +01:00
J. Nick Koston
0623972ee0 Camera platform back-compat for custom components without CameraEntityFeature (#106529) 2023-12-29 11:11:03 +01:00
J. Nick Koston
d407b9fca8 Update platform back-compat for custom components without UpdateEntityFeature (#106528) 2023-12-29 11:10:58 +01:00
Bram Kragten
2b7d37cbc2 Bump version to 2024.1.0b1 2023-12-28 21:21:15 +01:00
Bram Kragten
256e3e0597 Revert "Bump version to 2024.1.0"
This reverts commit c9f12d45b4.
2023-12-28 21:20:55 +01:00
Bram Kragten
c9f12d45b4 Bump version to 2024.1.0 2023-12-28 21:19:27 +01:00
J. Nick Koston
fc021f8633 Bump aiohomekit to 3.1.1 (#106591) 2023-12-28 21:19:19 +01:00
Erik Montnemery
2ffb033a46 Revert "Set volume_step in enigma2 media_player" (#106584) 2023-12-28 21:19:18 +01:00
jjlawren
9de482f429 Cleanup Sonos subscription used during setup (#106575) 2023-12-28 21:19:17 +01:00
G Johansson
fa34cbc414 Systemmonitor always load imported disks (#106546)
* Systemmonitor always load legacy disks

* loaded_resources
2023-12-28 20:40:28 +01:00
Erik Montnemery
df894acefa Revert "Set volume_step in frontier_silicon media_player" (#106583)
Revert "Set volume_step in frontier_silicon media_player (#105953)"

This reverts commit 3e50ca6cda.
2023-12-28 20:38:02 +01:00
Erik Montnemery
5125d8622d Revert "Set volume_step in bluesound media_player" (#106582)
Revert "Set volume_step in bluesound media_player (#105672)"

This reverts commit 7fa55ffdd2.
2023-12-28 20:38:01 +01:00
Erik Montnemery
35b9044187 Revert "Set volume_step in sonos media_player" (#106581)
Revert "Set volume_step in sonos media_player (#105671)"

This reverts commit 6dc8c2c370.
2023-12-28 20:38:00 +01:00
Erik Montnemery
e953587260 Revert "Set volume_step in monoprice media_player" (#106580)
Revert "Set volume_step in monoprice media_player (#105670)"

This reverts commit cffb51ebec.
2023-12-28 20:38:00 +01:00
Erik Montnemery
925b851366 Revert "Set volume_step in cmus media_player" (#106579)
Revert "Set volume_step in cmus media_player (#105667)"

This reverts commit c10b460c6b.
2023-12-28 20:37:59 +01:00
Erik Montnemery
72dd60e667 Revert "Set volume_step in clementine media_player" (#106578)
Revert "Set volume_step in clementine media_player (#105666)"

This reverts commit 36eeb15fee.
2023-12-28 20:37:58 +01:00
Erik Montnemery
104039e732 Revert "Set volume_step in aquostv media_player" (#106577)
Revert "Set volume_step in aquostv media_player (#105665)"

This reverts commit bb8dce6187.
2023-12-28 20:37:57 +01:00
jjlawren
e1e697c16e Bump plexapi to 4.15.7 (#106576) 2023-12-28 20:37:56 +01:00
Michael
a111e35026 Only check known attributes in significant change support (#106572)
only check known attributes
2023-12-28 20:37:55 +01:00
jan iversen
0e0cd8e7de Remove default value for modbus lazy_error (#106561) 2023-12-28 20:37:54 +01:00
G Johansson
d24a923a73 Replace dash in language if needed (#106559)
* Replace dash in language if needed

* Add tests
2023-12-28 20:37:53 +01:00
Bram Kragten
285bb5632d Update frontend to 20231228.0 (#106556) 2023-12-28 20:37:53 +01:00
G Johansson
d7a697faf4 Fix holiday HA language not supported (#106554) 2023-12-28 20:37:52 +01:00
jan iversen
1d0fafcf2d Remove default value from modbus retries (#106551)
Solve retries issue.
2023-12-28 20:37:51 +01:00
G Johansson
571ba0efb0 Bump python-holidays to 0.39 (#106550) 2023-12-28 20:37:50 +01:00
G Johansson
227a69da65 Add missing disks to Systemmonitor (#106541) 2023-12-28 20:37:49 +01:00
Brett Adams
0de6030911 Fix run errors in Tessie (#106521) 2023-12-28 20:37:48 +01:00
Brett Adams
42ffb51b76 Fix Tessie honk button (#106518) 2023-12-28 20:37:48 +01:00
Thomas Hollstegge
50acf85f48 Use correct state for emulated_hue covers (#106516) 2023-12-28 20:37:47 +01:00
Christopher Fenner
b8ddd61b26 Avoid changing state of reduced preset in ViCare integration (#105642) 2023-12-28 20:35:46 +01:00
Christopher Fenner
b685584b91 Handle AttributeError in ViCare integration (#106470) 2023-12-28 20:35:26 +01:00
Bart Janssens
924e47c2a8 Skip activating/deactivating Vicare standby preset (#106476) 2023-12-28 20:35:00 +01:00
mkmer
8e4fade725 Move services to entity services in blink (#105413)
* Use device name to lookup camera

* Fix device registry serial

* Move to entity based services

* Update tests

* Use config_entry
Move refresh service out of camera

* Use config entry for services

* Fix service schema

* Add depreciation note

* Depreciation note

* key error changes
deprecated (not depreciated)
repair issue

* tweak message

* deprication v2

* back out update field change

* backout update schema changes

* Finish rollback on update service

* update doc strings

* move to 2024.7.0
More verbosity to deprecation message
2023-12-28 20:32:38 +01:00
Franck Nijhof
0bb892588e Bump version to 2024.1.0b0 2023-12-27 21:23:25 +01:00
ollo69
ee25cb2616 Add AsusWrt temperature sensors provided by http protocol (#105692) 2023-12-27 21:20:03 +01:00
Daniel Schall
8778763a3e Synchronize and cache Generic Camera still image fetching (#105821) 2023-12-27 21:19:25 +01:00
Bernardus Jansen
5545883400 Opentherm gateway: Set unit of measurement for count sensors (#106313) 2023-12-27 21:16:55 +01:00
theorlangur
d0409e719b Add ZHA configuration number entity to set/get thermostat cluster local temperature offset (#105765) 2023-12-27 21:16:03 +01:00
David F. Mulcahey
11e4dd0764 Bump ZHA quirks to 109 and add associated configuration entities (#106492) 2023-12-27 21:15:45 +01:00
Martin Hjelmare
c462d5b8ca Bump zwave-js-server-python to 0.55.2 (#106496) 2023-12-27 21:05:26 +01:00
Mike Megally
9b2c67fcd2 Add Color Night Vision switch for UniFi Protect (#106500)
* Add a switch to enable and disable "Color Night Vision" for the Unifi Protect platform, which is a feature on the new G5 Pro cameras with a "Vision Enhancer" attached

* Updated tests for the new switch
2023-12-27 09:56:54 -10:00
J. Nick Koston
093c952c38 Bump aiohttp-zlib-ng to 0.1.3 (#106489)
Reverts the workaround that was created for #105254 since the original
issue is fixed in zlib_ng 0.3.0+ which the lib now requires as a minimum
version
2023-12-27 08:04:07 -10:00
Michael
389c8d39f5 Add significant Change support for cover (#106016) 2023-12-27 18:28:24 +01:00
Robert Resch
9508a23f95 Check and register cloud hook if needed for mobile_app (#106461) 2023-12-27 18:01:44 +01:00
Bram Kragten
eb437afc67 Update frontend to 20231227.0 (#106486) 2023-12-27 17:59:52 +01:00
dougiteixeira
65c21438a6 Add query type validation independent of declaration position for SQL (#105921)
* Add query type validation independent of declaration position

* Restore close sess

* Separates invalid query and non-read-only query tests

* Add more tests

* Use the SQLParseError exception for queries that are not read-only

* Add handling for multiple SQL queries.

* Fix test

* Clean ';' at the beginning of the SQL query

* Clean ';' at the beginning of the SQL query - init

* Query cleaning before storing

* Query cleaning before setup sesensor plataform - YAML

* Exception when the SQL query type is not detected

* Cleaning

* Cleaning

* Fix typing in tests

* Fix typing in tests

* Add test for query = ';;'

* Update homeassistant/components/sql/__init__.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Update homeassistant/components/sql/__init__.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Update __init__.py

* Update config_flow.py

* Clean query before storing

---------

Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2023-12-27 17:58:35 +01:00
Caius-Bonus
37707edc47 Match ZHA Custom ClusterHandler on a Custom Cluster using a unique id for the quirk (#101709)
* initial

* fix tests

* match on specific name and quirk name

* fix tests

* fix tests

* store cluster handlers in only one place

* edit tests

* use correct device for quirk id

* change quirk id

* fix tests

* even if there is a quirk id, it doesn't have to have a specific cluster handler

* add tests

* rename quirk_id

* add tests

* fix tests

* fix tests

* use quirk id from zha_quirks
2023-12-27 11:48:30 -05:00
Nikolay Vasilchuk
4330452212 Fix Starline attributes timezone (#105645)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2023-12-27 17:21:10 +01:00
Joost Lekkerkerker
e507d1c5a5 Add more Withings measurement sensors (#105561) 2023-12-27 16:55:42 +01:00
Marcel van der Veldt
13702d51b1 Add more fine grained control over Matter server commissioning for the Companion apps (#106237) 2023-12-27 16:55:07 +01:00
Michael
117ff21c48 Add significant Change support for number (#105863) 2023-12-27 16:54:08 +01:00
Simone Chemelli
a6d8a82f3e Add Comelit alarm zones sensor (#106421)
* Add Comelit alarm zones sensor

* apply review comment

* add translation key

* capitalize

* cleanup

* apply review comment

* apply review comment

* more review comment
2023-12-27 16:47:59 +01:00
David F. Mulcahey
817c71747f Delay all ZHA polling until initialization of entities has completed (#105814)
* Don't update entities until they are initialized

* fix hass reference

* only establish polling once

* fix log level and small cleanup

* start device availability checks after full initialization of network

* add logging

* clean up sensor polling and class hierarchy

* don't attempt restore sensor cleanup in this PR

* put check back

* fix race condition and remove parallel updates

* add sensor polling test

* cleanup switch polling and add a test

* clean up and actually fix race condition

* update light forced refresh

* only use flag

* unused flag

* reduce diff size

* collapse
2023-12-27 10:25:41 -05:00
Jon Caruana
45fde2db4e Remove hardcoded bits from LiteJet integration (#106281)
Use the new properties from pylitejet v0.6.0.
2023-12-27 15:43:00 +01:00
Cyrill Raccaud
1d9a2b53e7 Remove initial entity update from swiss_public_transport (#106478)
remove initial update
2023-12-27 15:28:59 +01:00
Martijn van der Pol
a823edf1c2 Jinja filter and function for median and statistical_mode (#105554)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-12-27 15:14:20 +01:00
Cyrill Raccaud
ed3ea5e5f4 Add device to swiss public transport (#106475)
add to device registry
2023-12-27 15:08:58 +01:00
G Johansson
83f4d3af5c Implement mode validation in Climate entity component (#105745)
* Implement mode validation in Climate entity component

* Fix some tests

* more tests

* Fix translations

* fix deconz tests

* Fix switcher_kis tests

* not None

* Fix homematicip_cloud test

* Always validate

* Fix shelly

* reverse logic in validation

* modes_str

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2023-12-27 14:51:39 +01:00
Jan-Philipp Benecke
e04fda3fad Add config flow to trend (#99761)
* Add config flow to trend

* Remove device_class from options flow

* Add min_samples and import step to config flow

* Fix import

* Fixing tests and some cleanup

* remove unneeded usefixtures

* Apply code review suggestions

* Re-add YAML support

* Re-add reload service

* Fix import

* Apply code review suggestions

* Add test coverage for yaml setup

---------

Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2023-12-27 14:46:57 +01:00
Erwin Douna
4decc2bbfb Refactor Tado to use OAuth in the DeviceTracker (#102610)
* Refactor to use TadoConnector in the DeviceTracker

* Proposing myself as code owner to be notified of issues

* Update homeassistant/components/tado/device_tracker.py

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

* Fixing method names

* Current progress, switching machines

* Updating DeviceTracker to working prototype

* Removing unnecessary callback

* Adding dispatcher logic

* Minor fine-tuning the intervals

* Removing unnecessary debug log

* Update homeassistant/components/tado/device_tracker.py

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

* Update homeassistant/components/tado/device_tracker.py

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

* Fix sorting

* Retrieve devices from the Tado connector data

* Asyncio feedback & dispatch generic mobile devices

* Updating const

* Fine-tuning unloading

* Making add_tracked_entites callback

* Adding unload over dispatcher_connect

* Convert on_demand_update to callback

* Removing now unused method

* Merging method to on_demand_u

* Adding create_issue to address repair

* Updating with better translation

* Converting to callback

* Adding _attr_should_poll

* Putting back the on_demand_update

* Adding unique_id

* Converting to TrackerEntity

* Adding import step (review needed!)

* Update homeassistant/components/tado/device_tracker.py

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

* Update homeassistant/components/tado/device_tracker.py

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

* Update homeassistant/components/tado/device_tracker.py

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

* Update homeassistant/components/tado/config_flow.py

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

* Typing and location_name

* Changing to _attr_unique_id

* Import improvement attempt

* Property feedback

* Update homeassistant/components/tado/config_flow.py

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

* Adding CONF_HOME_ID and task in get_scanner

* Updating descriptions

* Removing the create_task

* Putting back PLATFORM_SCHEMA

* Adding device_tracker

* Adding get for HomeID

* Get it better ;)

* Retrieve HomeID from API

* Add integration title in dialogs

* Update homeassistant/components/tado/config_flow.py

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

* Update homeassistant/components/tado/config_flow.py

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

* Update homeassistant/components/tado/config_flow.py

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

* Fixing homeID and strings.json

* Delete request in strings

* Update deprecation date

* Adding test cases for import flow

* Update tests/components/tado/test_config_flow.py

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

* Update tests/components/tado/test_config_flow.py

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

* Update tests/components/tado/test_config_flow.py

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

* Removing none

* Fixing test cases

* Update homeassistant/components/tado/config_flow.py

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

* Removing from context manager

* Removing code owner

* Re-adding code owner

* Fix get scanner return value

* Fix device tracker interface

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-12-27 14:17:23 +01:00
Jan-Philipp Benecke
0694ff8965 Use snapshot assertion in homekit_controller diagnostics tests (#105647) 2023-12-27 13:49:09 +01:00
Daniel Schall
485a02c89d Fix Generic Camera interval calculation (#105820) 2023-12-27 13:45:49 +01:00
Christopher Fenner
50b960fb5e Bump PyViCare to 2.32.0 (#106467) 2023-12-27 13:43:45 +01:00
Joakim Sørensen
b5012a9964 Adjust the GitHub config flow (#105295) 2023-12-27 13:42:24 +01:00
Joost Lekkerkerker
2d5176d1f6 Use entity descriptions in Netgear LTE (#106414) 2023-12-27 13:39:01 +01:00
Greg Dowling
3911894599 Fix roon volume truncation bug (#105696) 2023-12-27 13:37:13 +01:00
Franck Nijhof
5c566770e0 Merge branch 'master' into dev 2023-12-27 13:35:31 +01:00
Franck Nijhof
0f3e6b0dec Revert "Add preselect_remember_me to /auth/providers" (#106472)
Revert "Add preselect_remember_me to `/auth/providers` (#106462)"

This reverts commit c19688e2d2.
2023-12-27 13:22:12 +01:00
David Knowles
7746a94543 Fix Hydrawise watering time duration unit (#105919)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-12-27 13:20:09 +01:00
Allen Porter
2497798b5d Allow clearing To-do list item extended fields (#106208) 2023-12-27 13:14:59 +01:00
steffenrapp
c51ac7171a Add translatable title to Persistent Notification (#104661) 2023-12-27 13:07:44 +01:00
Klaas Schoute
d0b6acd5e0 Changed setup of easyEnergy services (#106288) 2023-12-27 13:04:49 +01:00
Richard Kroegel
bd4177edc8 Add supports_response to ServiceRegistry.register() (#106164)
Co-authored-by: rikroe <rikroe@users.noreply.github.com>
2023-12-27 13:01:20 +01:00
Michael
0824a1f4a2 Add significant Change support for media player (#105999) 2023-12-27 12:59:33 +01:00
Michael
d747b0891d Add significant Change support for fan (#105867) 2023-12-27 12:57:30 +01:00
Rami Mosleh
f71e01f652 Improve glances tests (#106402) 2023-12-27 12:55:10 +01:00
Cyrill Raccaud
b935facec8 Add coordinator to Swiss public transport (#106278) 2023-12-27 12:54:41 +01:00
Joost Lekkerkerker
9944047b35 Add typing to config flow A (#105721) 2023-12-27 12:51:24 +01:00
G Johansson
8cd0644035 Add translation to ServiceValidationError in Lock (#105746) 2023-12-27 12:50:27 +01:00
Jan Bouwhuis
dae8c0fc38 Fix MQTT retained event messages should be discarded (#106425) 2023-12-27 12:48:53 +01:00
kingy444
25f9c5f34b Fix RainMachine bugs (#106231) 2023-12-27 12:38:37 +01:00
Robert Resch
c19688e2d2 Add preselect_remember_me to /auth/providers (#106462) 2023-12-27 11:47:52 +01:00
Daniel Hjelseth Høyer
4f38d8cc5d Bump millheater to 0.11.8 (#106464) 2023-12-27 11:44:09 +01:00
Franck Nijhof
8fb5d5c299 Mark Tailwind a platinum quality integration (#106468) 2023-12-27 11:30:10 +01:00
Franck Nijhof
ae80d576bf 2023.12.4 (#106460) 2023-12-27 11:06:09 +01:00
Brett Adams
675d4f48b5 Fix update platform in Tessie (#106465)
Return up-to-date
2023-12-27 11:05:17 +01:00
Simone Chemelli
f7d482c85b Fix Comelit alarm state (#106466) 2023-12-27 11:04:20 +01:00
Franck Nijhof
a78ecb3895 Add error handling to Tailwind service methods (#106463) 2023-12-27 10:53:31 +01:00
Franck Nijhof
68ac4717dc Revert "Raise HomeAssistantError if event is triggered with invalid event_type" (#106458) 2023-12-27 10:22:37 +01:00
mkmer
2b8fc8e5ae Update quality scale for Aladdin (#99342)
update quality scale
2023-12-27 10:13:18 +01:00
Renat Sibgatulin
1031e416be Remove IP / mDNS validation in airq integration setup (#106326)
Original design relied on aioairq.AirQ.__init__ checking if the input
was a valid IP address or an mDNS of a very specific structure,
and raising an InvalidInput otherwise.
Now, aioairq==0.3.2 removes said check completely following a user's
request to allow arbitrary host name and DNS entries.
In the config flow, "cannot_connect" covers the cases of misspelled
inputs now, which previously were covered by a dedicated "invalid_input"
2023-12-27 09:56:13 +01:00
Franck Nijhof
d6d8e914bc Flip around Tailwind locked out binary sensor (#106457) 2023-12-27 09:52:16 +01:00
Joe Neuman
d33ad57dd3 Add qBittorrent torrent sensors (#105781)
* Upgrade QBittorrent integration to show torrents

This brings the QBittorrent integration to be more in line with the Transmission integration. It updates how the integration is written, along with adding sensors for Active Torrents, Inactive Torrents, Paused Torrents, Total Torrents, Seeding Torrents, Started Torrents.

* Remove unused stuff

* Fix codeowners

* Correct name in comments

* Update __init__.py

* Make get torrents a service with a response

* Update sensor.py

* Update sensor.py

* Update sensor.py

* Add new sensors

* remove service

* more removes

* more

* Address comments

* cleanup

* Update coordinator.py

* Fix most lint issues

* Update sensor.py

* Update sensor.py

* Update manifest.json

* Update sensor class

* Update sensor.py

* Fix lint issue with sensor class

* Adding codeowners

* Update homeassistant/components/qbittorrent/__init__.py

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-12-27 09:48:52 +01:00
Jan Bouwhuis
c7eab49c70 Raise ServiceValidationError on invalid select option (#106350)
* Raise ServiceValidationError on invalid select option

* Fix tests

* Correct place holders

* More test fixes
2023-12-27 09:45:55 +01:00
Franck Nijhof
fd8a3cf78f Bump version to 2023.12.4 2023-12-27 09:45:19 +01:00
mkmer
04c0dc7d91 Redact unique id from diagnostics in blink (#106413)
redact unique id
2023-12-27 09:45:06 +01:00
mkmer
690f68c571 Missing exception on relogin in Honeywell (#106324)
Missing exception on relogin
2023-12-27 09:45:03 +01:00
Erik Montnemery
2bf5f8563e Fix Shelly consumption_types (#106273) 2023-12-27 09:45:00 +01:00
Alan Murray
baa18eb0bd Bump aiopulse to 0.4.4 (#106239)
* Bump Rolease Acmeda version 

Bump aiopulse version to 0.4.4 to fix issue for blinds that use status structure to indicate blinds that are fully open or closed.

* Update manifest.json

* update requirements
2023-12-27 09:44:56 +01:00
fwestenberg
d420483869 Bump Devialet to 1.4.5 (#106184)
* Bump Devialet==1.4.4

* Bump Devialet to 1.4.5
2023-12-27 09:43:32 +01:00
sdb9696
b98cb82f41 Bump ring-doorbell to 0.8.5 (#106178) 2023-12-27 09:43:29 +01:00
fwestenberg
c76e1e8c80 Bump Devialet to 1.4.4 (#106171)
Bump Devialet==1.4.4
2023-12-27 09:43:26 +01:00
Tobias Sauerwein
5ab41c40a6 Fix Netatmo light switching states by assuming state until next update (#106162) 2023-12-27 09:43:23 +01:00
Aaron Bach
0beb47ac2c Fix bug with non-existent Notion bridge IDs (#106152) 2023-12-27 09:43:20 +01:00
Phil Bruckner
0ca8e52e57 Bump life360 to 6.0.1 (#106149)
* Bump life360 package to 6.0.1

Fix recent API issues.

* Update requirements files
2023-12-27 09:43:17 +01:00
puddly
e3cb90487c Bump ZHA dependencies (#106147) 2023-12-27 09:43:14 +01:00
J. Nick Koston
529d34235c Bump pyenphase to 1.15.2 (#106134) 2023-12-27 09:43:11 +01:00
Ben
56c6de7223 Bump surepy to 0.9.0 (#106101) 2023-12-27 09:43:08 +01:00
Tobias Sauerwein
59c5077557 Bump pyatmo to 8.0.1 (#106094)
Fix missing NLFE
2023-12-27 09:43:05 +01:00
On Freund
937b13dec6 Don't fetch unchanged OurGroceries lists (#105998) 2023-12-27 09:43:02 +01:00
mkmer
6291465313 Bump blinkpy 0.22.4 (#105993) 2023-12-27 09:42:59 +01:00
Stefan Agner
283f8f466f Add Raspberry Pi 5 to version and hardware integration (#105992) 2023-12-27 09:42:56 +01:00
Tobias Sauerwein
03009a2bb9 Fix unreachable Netatmo sensor returning false values (#105954)
* Fix unreachable sensor returning false values

* Clean up unnecessary code
2023-12-27 09:42:53 +01:00
starkillerOG
3b18eb214d Bump motionblinds to 0.6.19 (#105951) 2023-12-27 09:42:50 +01:00
starkillerOG
02919fc1a4 Bump reolink_aio to 0.8.4 (#105946) 2023-12-27 09:42:47 +01:00
starkillerOG
03d7e9182b Bump reolink_aio to 0.8.3 (#105489) 2023-12-27 09:42:42 +01:00
Michael
a6018c5f7e Set WiFi QR code entity to unknown when Fritzbox is not available (#105870) 2023-12-27 09:41:07 +01:00
Michael
e16fb3a9d3 Address late review comments on AVM FRITZ!SmartHome (#105860)
set copies dict keys by default
2023-12-27 09:41:04 +01:00
J. Nick Koston
5ea2471260 Bump pyunifiprotect to 4.22.3 (#105833)
changelog: https://github.com/AngellusMortis/pyunifiprotect/compare/v4.22.0...v4.22.3
2023-12-27 09:41:01 +01:00
Álvaro Fernández Rojas
7ae296b0f2 Fix Airzone temperature range on new climate card (#105830)
* airzone: climate: fix double setpoint

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

* tests: airzone: fix double setpoint temperature

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

* tests: airzone: fix swapped double setpoint

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

---------

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2023-12-27 09:40:58 +01:00
Maciej Bieniek
b58c8eaaa9 Fix HVAC mode duplication for Shelly Gen2 climate platform (#105812)
Fix HVAC mode duplication
2023-12-27 09:40:55 +01:00
Álvaro Fernández Rojas
c5e3d922b0 Update aioairzone to v0.7.2 (#105811) 2023-12-27 09:40:52 +01:00
Álvaro Fernández Rojas
0e2677396a Bump aioairzone to v0.7.0 (#105807) 2023-12-27 09:40:49 +01:00
Michael Hansen
f1f3301edc Set todo item status in intent (#105743) 2023-12-27 09:40:46 +01:00
Stefan Agner
8bfb6b5745 Add Raspberry Pi 5 specific container image (#105488) 2023-12-27 09:40:42 +01:00
vexofp
6720580a9e Pass timeout to httpx in RESTful Switch (#105364)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-12-27 09:40:39 +01:00
Robert Resch
fbcb31b103 Deprecate deprecated unit of measurement constants (#106455) 2023-12-27 09:04:25 +01:00
Joost Lekkerkerker
f92e732f27 Use translation placeholders in Swiss public transport (#106416) 2023-12-27 09:01:53 +01:00
Jan Bouwhuis
65e8bbacc9 Raise HomeAssistantError if event is triggered with invalid event_type (#106357) 2023-12-27 08:50:46 +01:00
J. Nick Koston
99734a76aa Use faster contains check in water_heater (#106438) 2023-12-27 08:48:27 +01:00
Martin Hjelmare
59a01da0ed Improve cloud tts tests (#106427) 2023-12-27 08:48:07 +01:00
J. Nick Koston
2cc6fd1afb Add attr caching support to the geo_location platform (#106432) 2023-12-27 08:46:36 +01:00
J. Nick Koston
9b864e8130 Use faster contains check in humidifier (#106433) 2023-12-27 08:46:13 +01:00
J. Nick Koston
7a2a99db2e Use faster contains check in update (#106436) 2023-12-27 08:45:51 +01:00
J. Nick Koston
6dbfd70e30 Use faster contains check in remote (#106435) 2023-12-27 08:45:25 +01:00
J. Nick Koston
e801413c73 Use faster contains check in vacuum (#106437) 2023-12-27 08:45:07 +01:00
Robert Resch
b08268da31 Deprecate deprecated core constants (#106456) 2023-12-27 08:42:57 +01:00
Brett Adams
2afe3364ca Add names to all Tessie entities (#106267)
* Add name back to device tracker and lock

* Add name to media player

* Add name to update

* Update snapshot

* Keep none name on Update

* Re-add update
2023-12-27 07:56:23 +01:00
Brett Adams
91aea843fc Move Trunks from Button to Cover in Tessie (#106448)
* Move trunks from buttons to covers

* Add tests

* Cleanup snapshot

* Use Constants

* StrEnum to IntEnum
2023-12-27 06:56:09 +01:00
Brett Adams
2fe982c7f3 Handle failed updates in Tessie (#106450) 2023-12-26 17:19:44 -10:00
J. Nick Koston
4b19c28ad9 Use faster contains check in media_player (#106434) 2023-12-26 13:18:22 -10:00
Brett Adams
9dde42a023 Handle Auto Fan and MyFan in Advantage Air (#95594)
* Decouple climate from MyFan

* Add tests

* Prepare for auto change

* Handle both modes

* Fix import

* Remove reference to FAN map

* Correct auto fan logic

* Remove multiline ternary operator

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Fix coverage

* fix tests

* ruff

* Test auto fan mode with snapshot

* add more testing

* Add switch testing

* Fix a bug caught by new tests

* Remove ineffective snapshot tests

* Readd snapshots but use args

---------

Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2023-12-26 23:31:25 +01:00
Keilin Bickar
615cd56f03 Add Support for SleepIQ Foot Warmers (#105931)
* Add foot warmer support

* Add Tests for foot warmers

* Move attr options out of constructor

* Change options to lowercase

* Update test and translations

* Switch back to entity

* Update homeassistant/components/sleepiq/strings.json

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-12-26 23:31:00 +01:00
J. Nick Koston
51a50fc134 Use faster contains check in fan (#106431) 2023-12-26 12:19:02 -10:00
J. Nick Koston
244a7bef39 Use faster contains check in climate (#106430) 2023-12-26 12:18:52 -10:00
Brett Adams
b51a242fd4 Add install to Tessie update platform (#106352) 2023-12-26 11:56:23 -10:00
Brett Adams
728bef20d6 Add more binary sensors to Tessie (#106212) 2023-12-26 11:54:28 -10:00
Joost Lekkerkerker
01ded7daea Add config flow to Streamlabs water (#104962)
* Add config flow to Streamlabs water

* Add config flow to Streamlabs water

* Add config flow to Streamlabs water

* Add issue when import is successful

* Remove import issue when entry already exists

* Remove import issue when entry already exists

* Fix feedback

* Fix feedback

---------

Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2023-12-26 22:24:28 +01:00
J. Nick Koston
c7b4f8f780 Use faster contains check in camera for stream feature (#106429) 2023-12-26 10:48:31 -10:00
Simone Chemelli
8be8524955 Fix freeze entity description (#106418) 2023-12-26 18:59:40 +01:00
Brett Adams
9b740c1111 Add missing translations to Tessie Button platform (#106232)
Add missing translations
2023-12-26 18:57:30 +01:00
G Johansson
4f0ee20ec5 Add config flow to System Monitor (#104906)
* Initial commit for config flow to System Monitor

* sensors

* Fixes

* Works

* Add import

* entity_registry_enabled_default = False

* entity_category = diagnostic

* Create issue

* issue in config flow

* Tests

* test requirement

* codeowner

* Fix names

* processes

* Fix type

* reviews

* get info during startup once

* Select process

* Legacy import of resources

* requirements

* Allow custom

* Fix tests

* strings

* strings

* Always enable process sensors

* Fix docstrings

* skip remove sensors if no sensors

* Modify sensors

* Fix tests
2023-12-26 18:29:32 +01:00
Simone Chemelli
2cd6c2b6bf Add alarm platform to Comelit (#104718)
* initial work on alarm

* final work on alarm

* coveragerc

* add tests

* add code validation

* remove sensor changes for a dedicated PR

* code optimization and cleanup

* tweaks

* tweak #2

* apply suggestion

* code quality

* code quality #2

* fix cover.py

* api typing

* use base classes where possibile

* apply const as per review comment

* cleanup unload entry

* apply review comments
2023-12-26 18:27:33 +01:00
Marc Mueller
c6d1f1ccc8 Fix pytest test collection warning (#106405) 2023-12-26 16:23:19 +01:00
mkmer
e9f28c2060 Redact unique id from diagnostics in blink (#106413)
redact unique id
2023-12-26 16:16:54 +01:00
Martin Hjelmare
e764372d1e Move cloud binary sensor to config entry (#106409)
* Move cloud binary sensor to config entry

* Fix docstring
2023-12-26 15:12:37 +01:00
Tobias Perschon
c8f9285aba Switch unifi_direct to external library (#105046)
* switch to external library

Signed-off-by: Tobias Perschon <tobias@perschon.at>

* use mac as name if no hostname is available

Signed-off-by: Tobias Perschon <tobias@perschon.at>

* update requirements_test_all

Signed-off-by: Tobias Perschon <tobias@perschon.at>

* update .coveragerc

Signed-off-by: Tobias Perschon <tobias@perschon.at>

* update codeowners and remove old tests

Signed-off-by: Tobias Perschon <tobias@perschon.at>

* reverted get_device_name to old behaviour

Signed-off-by: Tobias Perschon <tobias@perschon.at>

* typing and some cleanup

Signed-off-by: Tobias Perschon <tobias@perschon.at>

* typing fix

Signed-off-by: Tobias Perschon <tobias@perschon.at>

* code cleanup

Signed-off-by: Tobias Perschon <tobias@perschon.at>

---------

Signed-off-by: Tobias Perschon <tobias@perschon.at>
2023-12-26 13:22:53 +01:00
Marc Mueller
0d2ec6cd5c Improve drop_connect typing (#106404) 2023-12-26 13:11:05 +01:00
J. Nick Koston
1c96cf33b8 Avoid recreating a set each time sensor unit_of_measurement is called (#106401) 2023-12-25 21:11:48 -10:00
J. Nick Koston
b17bec2b0a Cache media player url hashing (#106400) 2023-12-25 21:03:35 -10:00
Maciej Bieniek
3eef1a3f6a Add valve platform for Shelly Gas Valve (#106087)
* Add valve platform

* Update BLOCK_PLATFORMS

* Add tests

* Use _attr_is_closed

* Fix mypy errors

* Make the valve switch to disabled by default

* Add deprecation issues

* Remove LOGGER

* Clean

* Add deprecation comments

* Suggested changes

* Set True for is_fixable

* Show valve entity and services in repair issue
2023-12-26 07:56:21 +01:00
J. Nick Koston
b800475242 Use shorthand attrs for more tplink light attributes (#106399)
* Use shorthand attrs for more tplink light attributes

supported_color_modes and features were having to be recalced every time
state was written

* preen
2023-12-26 07:28:40 +01:00
Raman Gupta
18ace16744 Bump zwave-js-server-python to 0.55.1 (#105502) 2023-12-25 23:29:05 -05:00
Robert Hillis
6f9bff7602 Add config flow to Netgear LTE (#93002)
* Add config flow to Netgear LTE

* uno mas

* uno mas

* forgot one

* uno mas

* uno mas

* apply suggestions

* tweak user step

* fix load/unload/dep

* clean up

* fix tests

* test yaml before importing

* uno mas

* uno mas

* uno mas

* uno mas

* uno mas

* fix startup hanging

* break out yaml import

* fix doc string

---------

Co-authored-by: Robert Resch <robert@resch.dev>
2023-12-26 05:19:28 +01:00
Alessandro Mariotti
f0e080f958 Bump getmac 0.9.4 (#106321) 2023-12-25 09:18:06 -10:00
J. Nick Koston
eb3fde7261 Avoid clearing the attr cache in setter when nothing has changed (#106384) 2023-12-25 09:13:48 -10:00
J. Nick Koston
50f64e053e Use identity checks for sensor device class enums (#106383) 2023-12-25 08:35:44 -10:00
Jan Bouwhuis
3016dbc2bd Enable toggle on valve/cover start in google_assistant (#106378) 2023-12-25 15:40:17 +01:00
Brett Adams
04a56eaabe Add data model to Tessie (#106285)
Add data model
2023-12-25 13:01:13 +01:00
G Johansson
123b2669f3 Add full coverage to Fast.com (#105596)
* Add full test coverage for Fast.com

* Remove not needed

* Add service deprecated test

* Rename speedtest

* Extend delay test
2023-12-25 12:04:07 +01:00
Brett Adams
4c11cb78c8 Add delay to manual refresh in Advantage Air (#104918)
* Add debouncer

* Avoid having 3 calls

* Debounce causes extra refresh in reload window

* Seperate disabled test to avoid latent refresh

---------

Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2023-12-25 12:01:59 +01:00
Maciej Bieniek
d59142a595 Add missing sensors for Shelly Pro Dimmer 2PM (#105008)
Add missing sensors for Shelly Pro Dimmer 2
2023-12-25 07:02:57 +01:00
Kevin Worrel
f45f0b4327 Split out shared screenlogic switch code (#106344) 2023-12-24 11:51:43 -10:00
jan iversen
9066555feb Deprecate parameter "retries" in modbus (#105024) 2023-12-24 16:47:22 +01:00
Patrick Frazer
771409579a Add select platform to drop_connect integration (#106309)
* Add select platform to drop_connect integration

* Fix select test

* Fix minor issues

* Make function definition more specific

* Revert change to switch.py for inclusion in separate PR

* Improve typing

* Add translation keys for select options

* Fix set function typing

* Remove redundant value check

* Remove args that match defaults
2023-12-24 15:03:10 +01:00
Dave T
0a4e82f190 Bump temperusb to 1.6.1 (#106346) 2023-12-24 12:23:26 +01:00
Sid
4ee0666efd Bump openwebifpy to 4.0.2 (#106345)
bump openwebifpy to 4.0.2
2023-12-24 12:22:53 +01:00
mkmer
fc349b0875 Missing exception on relogin in Honeywell (#106324)
Missing exception on relogin
2023-12-23 21:11:51 -05:00
J. Nick Koston
3d6fb60e93 Add support for attribute caching to the vacuum platform (#106332) 2023-12-23 15:36:45 -10:00
Joost Lekkerkerker
c7cb508896 Add diagnostics to ccm15 (#106329)
* Add diagnostics to ccm15

* Update homeassistant/components/ccm15/diagnostics.py

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

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2023-12-24 02:34:36 +01:00
Joost Lekkerkerker
e469c6892b Add Airnow to strict typing (#105566) 2023-12-23 15:16:15 -10:00
J. Nick Koston
278c7ac2a5 Add support for attribute caching to the todo platform (#106341) 2023-12-23 15:15:09 -10:00
J. Nick Koston
2a52453f5d Add support for attribute caching to the datetime platform (#106340) 2023-12-23 15:14:48 -10:00
J. Nick Koston
b5e1074062 Add support for attribute caching to the time platform (#106339) 2023-12-23 15:14:31 -10:00
J. Nick Koston
b6c2842b01 Add support for attribute caching to the date platform (#106338) 2023-12-23 15:14:09 -10:00
J. Nick Koston
24b14d07de Add support for attribute caching to the water_heater platform (#106336) 2023-12-23 14:29:18 -10:00
J. Nick Koston
38e79bbf9d Add support for attribute caching to the lawn_mower platform (#106335) 2023-12-23 14:28:25 -10:00
J. Nick Koston
63f3c23968 Add support for attribute caching to the weather platform (#106334) 2023-12-23 14:28:08 -10:00
J. Nick Koston
68974a849f Add support for attribute caching to the siren platform (#106337) 2023-12-23 14:27:38 -10:00
J. Nick Koston
85e9bc6f5a Add support for attribute caching to the image platform (#106333) 2023-12-23 14:27:14 -10:00
J. Nick Koston
f097e2a2f6 Add support for attribute caching to the media_player platform (#106257) 2023-12-23 13:33:11 -10:00
J. Nick Koston
b757984031 Optimize use_device_name check in base entity class (#106209) 2023-12-24 00:30:33 +01:00
J. Nick Koston
6e6d7a0c92 Add support for attribute caching to the event platform (#106330) 2023-12-23 13:23:32 -10:00
Diogo Gomes
b674985b20 Add 4 more entities in V2C Trydan EVSE (#105531)
* adds EVSE Lock, Timer, Dynamic Intensity, Dynamic Intensity Pause

* fix casing
2023-12-24 00:20:46 +01:00
J. Nick Koston
e43f4412fa Fix native_step in number not looking at _attr_native_step (#106327) 2023-12-23 13:20:24 -10:00
J. Nick Koston
abd3c54cbe Add support for attribute caching to the camera platform (#106256) 2023-12-23 13:01:47 -10:00
Jan-Philipp Benecke
2f72d4f9f0 Remove unnecessary async_add_job in face processing of image_processing (#106323) 2023-12-23 12:30:31 -10:00
Sid
bd6e2c54e1 Use shorthand attributes in enigma2 (#106318)
* enigma2: add strict typing, change property functions to _attr_*

* applied changes of review

* changes from review
2023-12-23 23:12:03 +01:00
Kevin Worrel
4c912fcf1b Update test data for screenlogic (#106325) 2023-12-23 11:57:27 -10:00
J. Nick Koston
9052b89d63 Add support for attribute caching to the climate platform (#106266) 2023-12-23 11:29:33 -10:00
J. Nick Koston
6d14c265b4 Ensure MQTT attributes are bound to the respective platform entity (#106316) 2023-12-23 10:39:25 -10:00
Oscar Calvo
b2caf15434 New integration Midea ccm15 climate (#94824)
* Initial commit

* Correct settings for config flow

* Use scan interval

* Store proper data

* Remove circular dependency

* Remove circular dependency

* Integration can be initialized

* Fix defaults

* Add setup entry

* Add setup entry

* Dont block forever

* Poll during async_setup_entry

* Remove not needed async methods

* Add debug info

* Parse binary data

* Parse binary data

* Use data to update device

* Use data to update device

* Add CCM15DeviceState

* Use DataCoordinator

* Use DataCoordinator

* Use DataCoordinator

* Use CoordinatorEntity

* Use CoordinatorEntity

* Call update API

* Call update API

* Call update API

* Call update API

* Use dataclass

* Use dataclass

* Use dataclass

* Use dataclass

* Use dataclass

* Use dataclass

* Use dataclass

* Use dataclass

* Fix bugs

* Implement swing

* Support swing mode, read only

* Add unit test

* Swing should work

* Set swing mode

* Add DeviceInfo

* Add error code

* Add error code

* Add error code

* Add error code

* Initial commit

* Refactor

* Remove comment code

* Try remove circular ref

* Try remove circular ref

* Remove circular ref

* Fix bug

* Fix tests

* Fix tests

* Increase test coverage

* Increase test coverage

* Increase test coverrage

* Add more unit tests

* Increase coverage

* Update coordinator.py

* Fix ruff

* Set unit of temperature

* Add bounds check

* Fix unit tests

* Add test coverage

* Use Py-ccm15

* Update tests

* Upgrade dependency

* Apply PR feedback

* Upgrade dependency

* Upgrade dependency

* Upgrade dependency

* Force ruff

* Delete not needed consts

* Fix mypy

* Update homeassistant/components/ccm15/coordinator.py

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

* Apply PR Feedback

* Apply PR Feedback

* Apply PR Feedback

* Apply PR Feedback

* Apply PR Feedback

* Apply PR Feedback

* Fix unit tests

* Move climate instance

* Revert "Move climate instance"

This reverts commit cc5b9916b79e805b77cc0062da67aea61e22e7c5.

* Apply PR feedback

* Apply PR Feedback

* Remove scan internal parameter

* Update homeassistant/components/ccm15/coordinator.py

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

* Remove empty keys

* Fix tests

* Use attr fields

* Try refactor

* Check for multiple hosts

* Check for duplicates

* Fix tests

* Use PRECISION_WHOLE

* Use str(ac_index)

* Move {self._ac_host}.{self._ac_index} to construtor

* Make it fancy

* Update homeassistant/components/ccm15/coordinator.py

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

* Move const to class variables

* Use actual config host

* Move device info to construtor

* Update homeassistant/components/ccm15/climate.py

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

* Set name to none, dont ask for poll

* Undo name change

* Dont use coordinator in config flow

* Dont use coordinator in config flow

* Check already configured

* Apply PR comments

* Move above

* Use device info name

* Update tests/components/ccm15/test_coordinator.py

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

* Update tests/components/ccm15/test_config_flow.py

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

* Apply feedback

* Remove logger debug calls

* Add new test to check for dupplicates

* Test error

* Use better name for test

* Update homeassistant/components/ccm15/config_flow.py

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

* Update homeassistant/components/ccm15/climate.py

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

* Update homeassistant/components/ccm15/config_flow.py

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

* Use prop data for all getters

* Fix tests

* Improve tests

* Improve tests, v2

* Replace log message by comment

* No need to do bounds check

* Update config_flow.py

* Update test_config_flow.py

* Update test_coordinator.py

* Update test_coordinator.py

* Create test_climate.py

* Delete tests/components/ccm15/test_coordinator.py

* Update coordinator.py

* Update __init__.py

* Create test_climate.ambr

* Update conftest.py

* Update test_climate.py

* Create test_init.py

* Update .coveragerc

* Update __init__.py

* We need to check bounds after all

* Add more test coverage

* Test is not None

* Use better naming

* fix tests

* Add available property

* Update homeassistant/components/ccm15/climate.py

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

* Use snapshots to simulate netwrok failure or power failure

* Remove not needed test

* Use walrus

---------

Co-authored-by: Robert Resch <robert@resch.dev>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-12-23 21:24:52 +01:00
J. Nick Koston
83e1ba338a Add support for attribute caching to the switch platform (#106258) 2023-12-23 09:22:02 -10:00
Robert Resch
ebdf7b9c8c Deprecate some deprecated const constants (#106230)
* Deprecate some deprecated const constants

* Improve code

* fix typing

* Apply suggestions from code review

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

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-12-23 20:18:51 +01:00
Franck Nijhof
55a5e9c4b5 Update psutil to 5.9.7 (#106295) 2023-12-23 09:04:34 -10:00
Joost Lekkerkerker
8c0594219f Add entity translations to Steamist (#96182)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-12-23 08:58:54 -10:00
Jan Bouwhuis
9234852e2a Improve typing on drop_connect switch entity description (#106314)
* Improve typing on drop_connext switch entity description

* Update homeassistant/components/drop_connect/switch.py

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

* Update homeassistant/components/drop_connect/switch.py

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

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-12-23 19:42:41 +01:00
J. Nick Koston
43757ecea5 Add support for attribute caching to the select platform (#106255) 2023-12-23 08:05:00 -10:00
J. Nick Koston
3d9fc8ed77 Add support for attribute caching to the light platform (#106260) 2023-12-23 08:04:30 -10:00
J. Nick Koston
1631a52b09 Add support for attribute caching to the alarm_control_panel platform (#106265) 2023-12-23 08:04:11 -10:00
J. Nick Koston
4ee961cd51 Add support for attribute caching to the cover platform (#106268) 2023-12-23 08:03:44 -10:00
c0ffeeca7
28dccc334d ISY994: remove reference to reload service (#106302) 2023-12-23 07:43:52 -10:00
Brandon Rothweiler
c629b434cd Add energy usage sensor to A. O. Smith integration (#105616)
* Add energy usage sensor to A. O. Smith integration

* Address review comments

* Address review comment

* Address review comment

* Create device outside of the entity class

* Address review comment

* remove platinum
2023-12-23 17:24:49 +01:00
Matt
345f7f2003 Fix feedreader date comparison to allow RSS entries with identical timestamps (#104925)
Change feedreader publishdate comparison
2023-12-23 16:48:36 +01:00
Jan Bouwhuis
e311a6835e Add valve platform support to google_assistant (#106139)
* Add valve platform to google_assistant

* Use constant for domains set
2023-12-23 16:46:25 +01:00
Patrick Frazer
c126022d4f Add switches to drop_connect integration (#106264)
* Add switches to drop_connect integration

* Let device update state

* Simplify icon property

* Use constants for icon names

* Add simulated responses from devices

* Use keyed form for switch value

* Clean up properties
2023-12-23 16:39:31 +01:00
Marco
d450a7f57e Improve mikrotik error handling (#106244)
* improve mikrotik error handling

* switch to debug

* fix mock command arguments

* add recommendations

---------

Co-authored-by: Marco98 <Marco98@users.noreply.github.com>
2023-12-23 16:26:27 +01:00
Sid
0af850cbb6 Restructure enigma2 integration to use async (#104206)
Restructure the enigma2 integration to use async
2023-12-23 16:08:53 +01:00
Jan Bouwhuis
6da2f98d34 Fix mqtt valve is not resetting opening or closing state (#106240)
* Fix mqtt valve is not resetting opening or closing state

* Require state or position attr in JSON state update

* Do not change `_attr_is_closed` if valve reports a position

* Add comment, use tuple

* Call _update_state
2023-12-23 15:18:44 +01:00
Brett Adams
043f3e640c Rework entity description functions in Tessie (#106287)
* use lamdba to return the library function

* Rename mocks

* lambda number

* Lambda button

* Add missing

* Remove context manager
2023-12-23 13:45:06 +01:00
doggkruse
ea7c839423 Apply units of measure provided in API when available in LaCrosse View (#106299)
* Apply units of measure provided in API when available to avoid mismatch of native units.  Improved fix for #106148

* Fix ruff error
2023-12-23 13:41:15 +01:00
Michael
da684d6a7b Add diagnostics support to Tankerkoenig (#106301) 2023-12-23 12:20:15 +01:00
J. Nick Koston
d83dafa14a Add support for attribute caching to the fan platform (#106269) 2023-12-23 11:26:40 +01:00
Robert Resch
060172fc24 Deprecate deprecated data entry flow constants (#106229) 2023-12-23 11:25:39 +01:00
Michael
859e7972ac Add significant Change support for vacuum (#106002) 2023-12-23 11:24:32 +01:00
J. Nick Koston
ff004a1c20 Add support for attribute caching to the sensor platform (#106252) 2023-12-23 11:13:02 +01:00
J. Nick Koston
97ed6570a7 Add support for attribute caching to the binary_sensor platform (#106253) 2023-12-23 11:11:50 +01:00
J. Nick Koston
1c8d961832 Add support for attribute caching to ToggleEntity (#106272) 2023-12-23 11:11:14 +01:00
J. Nick Koston
ca7daa21fe Add support for attribute caching to the text platform (#106262) 2023-12-23 11:10:46 +01:00
J. Nick Koston
ef0031cbcf Add support for attribute caching to the button platform (#106259) 2023-12-23 11:09:46 +01:00
J. Nick Koston
98dd69ba09 Add support for attribute caching to the remote platform (#106274) 2023-12-23 11:09:18 +01:00
J. Nick Koston
d1174593f9 Add support for attribute caching to the lock platform (#106275) 2023-12-23 11:08:35 +01:00
dependabot[bot]
01da8a089f Bump github/codeql-action from 2.22.10 to 3.22.12 (#106221)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-23 11:06:54 +01:00
J. Nick Koston
bb30bfa225 Reduce zeroconf matcher complexity (#105880) 2023-12-23 11:04:05 +01:00
Michael
321dc3984c Add significant Change support for humidifier (#106015) 2023-12-23 10:56:51 +01:00
Robert Resch
20ba764d92 Deprecate deprecated camera constants (#106095) 2023-12-23 10:46:23 +01:00
Franck Nijhof
3404bd4de5 Fix flaky Tailwind tests by fixing via_device (#106294) 2023-12-23 10:45:20 +01:00
Martin Hjelmare
1d0cee5e8a Improve cloud system health tests (#106235) 2023-12-23 10:35:16 +01:00
J. Nick Koston
5156a93b9e Add support for attribute caching to the update platform (#106261) 2023-12-23 10:29:55 +01:00
Aaron Bach
1e12c7fe12 Fix bug with non-existent Notion bridge IDs (#106152) 2023-12-23 10:26:00 +01:00
jjlawren
0ae4d017b9 Add subwoofer crossover support to Sonos Amp devices (#106290) 2023-12-23 10:25:20 +01:00
J. Nick Koston
5d2ddcb1d2 Add support for attribute caching to the number platform (#106254) 2023-12-22 15:22:18 -10:00
J. Nick Koston
634551dae0 Add support for attribute caching to the humidifier platform (#106271) 2023-12-22 15:22:06 -10:00
Phil Bruckner
963347b9c5 Reduce Life360 update time by fetching Places & Members in parallel (#106277) 2023-12-22 16:29:26 -06:00
Erik Montnemery
a4357409c8 Fix Shelly consumption_types (#106273) 2023-12-22 22:58:59 +01:00
Bram Kragten
7ba1736637 Filter by supported features for todo services (#106241) 2023-12-22 21:22:16 +01:00
Erik Montnemery
3a744d374b Add support for caching entity properties (#100601) 2023-12-22 09:02:55 -10:00
Martin Hjelmare
087eb86e37 Improve cloud binary sensor tests (#106238)
* Clean up cloud binary sensor test

* Test remove entity
2023-12-22 19:48:07 +01:00
Patrick Frazer
c41173bb29 Add binary sensors to drop_connect integration (#106248) 2023-12-22 19:26:52 +01:00
Allen Porter
656d0696bb Add support for re-ordering Google Tasks (#104769)
* Add reorder and task ordering

* Remove un-needed js id code

* Revert dead code deletion

* Remove reverted test and dead logger

* Update comment name
2023-12-22 18:49:41 +01:00
Kristof Mariën
32a5345a85 Add foscam coordinator (#92665)
* Add foscam coordinator

* Code cleanup

* Coordinator cleanup

* Coordinator cleanup

* Replace async_timeout with asyncio.timeout

* Ignore coordinator (requires external device)

---------

Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2023-12-22 17:44:52 +01:00
Cyrill Raccaud
181190d22d Log when swiss_public_transport loses connection (#106200)
* better handling of sensor init state

* sensor.py use integrated attr

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

* use parents implementation for availability

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

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-12-22 17:11:49 +01:00
G Johansson
d1d5c50b73 Add full test coverage to Trafikverket Train (#106247)
* Add full test coverage for Trafikverket Train

* Coordinator full coverage

* Now full coverage

* Add util
2023-12-22 16:53:51 +01:00
Floris272
8b0d19aca2 Add bluecurrent integration (#82483)
* Add bluecurrent integration

* Apply feedback

* Rename integration

* changed constants and removed strings.sensor.json

* update blue_current integration

* update bluecurrent-api to 1.0.4

* Update bluecurrent-api to 1.0.5

* Apply feedback

* Remove translation

* Apply feedback

* Use customer_id as unique id

* Apply feedback

* Add @pytest.mark.parametrize

* Replace loop.create_task with async_create_task
2023-12-22 16:34:16 +01:00
Joost Lekkerkerker
989a7e7b10 Clean up swiss public transport (#106245) 2023-12-22 15:59:01 +01:00
Rami Mosleh
c91ac22d3c Add location selector to Islamic prayer times (#105911)
* Add location selector to config flow

* Simplify entry data

* fix abort string

* Add migration with minor version

* Follow documented migration method
2023-12-22 15:24:50 +01:00
Alan Murray
b7661b4d79 Bump aiopulse to 0.4.4 (#106239)
* Bump Rolease Acmeda version 

Bump aiopulse version to 0.4.4 to fix issue for blinds that use status structure to indicate blinds that are fully open or closed.

* Update manifest.json

* update requirements
2023-12-22 15:23:39 +01:00
G Johansson
126a58a33e Return multiple trains in Trafikverket Train (#106206)
* Add list of trains to coordinator

* Fix to work

* snapshot

* Fixes

* Fix
2023-12-22 15:18:16 +01:00
Marc Mueller
f06d956da7 Update pytest warnings filter (#106234) 2023-12-22 14:52:31 +01:00
Jan-Philipp Benecke
13504d5fd5 Add consider home interval to ping (#104881)
* Add consider home interval to ping

* Run ruff after rebase

* Fix buggy consider home interval
2023-12-22 14:50:58 +01:00
Marc Mueller
a579a0c80a Update coverage to 7.3.4 (#106233) 2023-12-22 14:50:07 +01:00
Erik Montnemery
922cef2884 Don't make huawei_lte entity classes dataclasses (#106160) 2023-12-22 14:27:28 +01:00
Patrick Frazer
fce1b6d248 Add DROP integration (#104319)
* Add DROP integration

* Remove all but one platform for first PR

* Simplify initialization of hass.data[] structure

* Remove unnecessary mnemonic 'DROP_' prefix from DOMAIN constants

* Remove unnecessary whitespace

* Clarify configuration 'confirm' step description

* Remove unnecessary whitespace

* Use device class where applicable

* Remove unnecessary constructor and change its elements to class variables

* Change base entity inheritance to CoordinatorEntity

* Make sensor definitions more concise

* Rename HA domain from drop to drop_connect

* Remove underscores from class and function names

* Remove duplicate temperature sensor

* Change title capitalization

* Refactor using SensorEntityDescription

* Remove unnecessary intermediate dict layer

* Remove generated translations file

* Remove currently unused string values

* Use constants in sensor definitions

* Replace values with constants

* Move translation keys

* Remove unnecessary unique ID and config entry references

* Clean up DROPEntity initialization

* Clean up sensors

* Rename vars and functions according to style

* Remove redundant self references

* Clean up DROPSensor initializer

* Add missing state classes

* Simplify detection of configured devices

* Change entity identifiers to create device linkage

* Move device_info to coordinator

* Remove unnecessary properties

* Correct hub device IDs

* Remove redundant attribute

* Replace optional UID with assert

* Remove redundant attribute

* Correct coordinator initialization

* Fix mypy error

* Move API functionality to 3rd party library

* Abstract device to sensor map into a dict

* Unsubscribe MQTT on unload

* Move entity device information

* Make type checking for mypy conditional

* Bump dropmqttapi to 1.0.1

* Freeze dataclass to match parent class

* Fix race condition in MQTT unsubscribe setup

* Ensure unit tests begin with invalid MQTT state

* Change unit tests to reflect device firmware

* Move MQTT subscription out of the coordinator

* Tidy up initializer

* Move entirety of MQTT subscription out of the coordinator

* Make drop_api a class property

* Remove unnecessary type checks

* Simplify some unit test asserts

* Remove argument matching default

* Add entity category to battery and cartridge life sensors
2023-12-22 14:24:08 +01:00
Nikolay Vasilchuk
243ee2247b Add starline binary sensors (#105724)
* Additional attributes for starline

* Handsfree binary sensor

* Sensors

* Review
2023-12-22 13:22:44 +01:00
ashionky
102c7f1959 Add Refoss integration (#100573)
* refoss

* refoss

* refoss

* refoss

* refoss modify

* ip

* 8.22

* format

* format

* format

* bugfix

* test

* test

* test

* test

* test

* test

* 9.1

* refosss

* refoss

* refoss

* refoss

* refoss

* refoss

* refoss

* refoss

* test

* requirements_test_all.txt

* codeowners

* refoss

* Review feedback repair

* strings

* refoss

* refoss

* refoss

* 1.1.1

* 1.1.2

* refoss

* refoss

* refoss.1.1.7

* refoss-gree

* 1.1.7

* test

* refoss

* test refoss

* test refoss

* refoss-test

* refoss

* refoss

* test

* test

* refoss

* CODEOWNERS

* fix

* Update homeassistant/components/refoss/__init__.py

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-12-22 13:18:32 +01:00
Jan Bouwhuis
f536bc1d0c Add valve support to Amazon Alexa (#106053)
Add valve platform to Amazon Alexa
2023-12-22 12:08:06 +01:00
Brett Adams
b4f8fe8d4d Add media player platform to Tessie (#106214)
* Add media platform

* Add more props

* Fix platform filename

* Working

* Add a test

* Update test and fixture

* Refactor media player properties to handle null values

* Add comments

* add more assertions

* Fix test docstring

* Use walrus instead.

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

* Test  when media player is idle

* Fix tests

* Remove None type from volume_level

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

* Return media position only when a media duration is > 0

* Remove impossible None type

* Add snapshot and freezer

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-12-22 12:07:47 +01:00
RJPoelstra
2c2e6171e2 Add integration for Vogel's MotionMount (#103498)
* Skeleton for Vogel's MotionMount support.

* Generated updates.

* Add validation of the discovered information.

* Add manual configuration

* Use a mac address as a unique id

* Add tests for config_flow

* Add a 'turn' sensor entity.

* Add all needed sensors.

* Add number and select entity for control of MotionMount

* Update based on development checklist

* Preset selector now updates when a preset is chosen

* Fix adding presets selector to device

* Remove irrelevant TODO

* Bump python-MotionMount requirement

* Invert direction of turn slider

* Prepare for PR

* Make sure entities have correct values when created

* Use device's mac address as unique id for entities.

* Fix missing files in .coveragerc

* Remove typing ignore from device library.

Improved typing also gave rise to the need to improve the callback mechanism

* Improve typing

* Convert property to shorthand form

* Remove unneeded CONF_NAME in ConfigEntry

* Add small comment

* Refresh coordinator on notification from MotionMount

* Use translation for entity

* Bump python-MotionMount

* Raise `ConfigEntryNotReady` when connect fails

* Use local variable

* Improve exception handling

* Reduce duplicate code

* Make better use of constants

* Remove unneeded callback

* Remove other occurrence of unneeded callback

* Improve removal of suffix

* Catch 'getaddrinfo' exception

* Add config flow tests for invalid hostname

* Abort if device with same hostname is already configured

* Make sure we connect to a device with the same unique id as configured

* Convert function names to snake_case

* Remove unneeded commented-out code

* Use tuple

* Make us of config_entry id when mac is missing

* Prevent update of entities when nothing changed

* Don't store data in `hass.data` until we know we will proceed

* Remove coordinator

* Handle situation where mac is EMPTY_MAC

* Disable polling

* Fix failing hassfest

* Avoid calling unique-id-less discovery handler for situations where we've an unique id
2023-12-22 12:04:58 +01:00
Brett Adams
c824d06a8c Add number platform to Tessie (#106205)
* Add number platform

* Make self.set consistent

* Fix test docstring

* Use entity descriptions

* Add patch_description to tests

* Rename argument to arg

* Make max key mandatory

* Set SOC min to normal value
2023-12-22 11:57:21 +01:00
Nerdix
9237740103 Increase version default timeout from 10 to 30 seconds (#106158)
* Update __init__.py

* Update __init__.py

* Revert timeout changes

* Revert commit Revert timeout changes
2023-12-22 11:37:03 +01:00
Robert Resch
4d5bea7bcc Deprecate deprecated switch constants (#106225) 2023-12-22 11:23:21 +01:00
Robert Resch
06220849fc Deprecate deprecated water_heater constants (#106226) 2023-12-22 11:23:03 +01:00
Robert Resch
e18d2b8873 Deprecate deprecated device_registry helper constants (#106227) 2023-12-22 11:21:45 +01:00
Brett Adams
23fa86cc23 Add cover platform to Tessie (#105422)
* Add cover platform

* fix case

* Remove virtual key issue

* Remove redundant logic

* Fix logic that I missed

* Add missing types

* Add missing type

* Update entity

* Make window name better

* Fix test

* Update docstrings and comments
2023-12-22 10:17:23 +01:00
Brett Adams
1170e72913 Add lock platform to Tessie (#106216)
* Add lock platform

* Update tests

* fix test docstring
2023-12-22 10:11:48 +01:00
Brett Adams
abc57ea706 Quality improvements for Tessie (#106218)
Quality improvements
2023-12-22 10:11:18 +01:00
Jon Caruana
72da0a0e1d Bump pylitejet to v0.6.2 (#106222)
Bump pylitejet to 0.6.2
2023-12-22 10:04:16 +01:00
Tobias Sauerwein
7ef20c4431 Fix Netatmo light switching states by assuming state until next update (#106162) 2023-12-22 07:37:57 +01:00
Brett Adams
8918a9c2c4 Add button platform to Tessie (#106210) 2023-12-21 16:40:55 -10:00
Brett Adams
e86ac568e1 Add device tracker to Tessie (#105428)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-12-21 14:28:58 -10:00
Robert Resch
8b08b5e8d2 Deprecate legacy_templates (#105556)
* Deprecate legacy_templates

* Improve wording

* Implement suggestion

* simplify

* Add deleting of the repair issues back

* Update homeassistant/components/homeassistant/strings.json

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

* Test issue removal too

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-12-22 00:42:16 +01:00
Jan-Philipp Benecke
88ea5f7a54 Use call_soon_threadsafe in face processing of image_processing (#106168) 2023-12-22 00:38:49 +01:00
J. Nick Koston
e75357980a Bump aiohttp-zlib-ng to 0.1.2 (#106193)
fixes #105254
2023-12-22 00:03:42 +01:00
Diogo Alves
69f8514556 Fix lacrosse view sensor units (#106203)
Fixed Unit values from sensor.py

There was a mistake on the units from the sensor that where messing up the device readings on rain, windchill and feels like sensors
2023-12-21 23:28:19 +01:00
Robert Resch
c4c422de79 Skip logging deprecated constant if the calling integration couldn't be indentified (#106181)
* Add option to log only if a integreation is detected for a deprecated constant

* Require param

* Add test that log entry is not created

* typo
2023-12-21 23:19:40 +01:00
Cyrill Raccaud
9fbc15c28b Bump python-opendata-transport to 0.4.0 (#106199)
bump version to 0.4.0
2023-12-21 22:17:43 +01:00
Marc Mueller
d144d6cd68 Update mypy to 1.8.0 (#106189) 2023-12-21 22:01:49 +01:00
Denis Shulyaka
9ba53e03ee Bump httpx to 0.26.0 and httpcore to 1.0.2 (#106194) 2023-12-21 10:11:00 -10:00
Cyrill Raccaud
7e685f2bc7 Swiss public transport config flow (#105648)
* add config flow

* unit tests

* yaml config import flow

* change deprecation period and simply code

* keep name for legacy yaml
- removing the name now would break current implementations
- it will be removed together with the deprectation of  yaml config flow

* improve error handling, simpler unique_id, cleanup

* simplify issues for yaml import flow

* improve typing and clean name handling

* streamline unit tests
- happy path + errors
- mock opendata instead of aiohttp

* parametrize unit tests

* improve strings

* add missing aborts

* update coverage ignore

* remove redundant test

* minor clean up of constants
2023-12-21 20:38:00 +01:00
J. Nick Koston
54f460b7c9 Improve performance of dhcp on high activity networks (#105884)
* Improve performance of dhcp on high activity networks

Most of the overhead was constructing IPAddress objects
which is solved with https://github.com/bdraco/cached-ipaddress

* fix test

* fix: bump

* bump again

* lets do it on the correct branch
2023-12-21 20:36:09 +01:00
fwestenberg
f9c096687f Bump Devialet to 1.4.5 (#106184)
* Bump Devialet==1.4.4

* Bump Devialet to 1.4.5
2023-12-21 20:18:20 +01:00
DeerMaximum
dfc7ff8e64 Bump pyvlx to 0.2.21 (#105800)
* Bump pyvlx to 0.2.21

* Fix typing

* Optimize fix
2023-12-21 18:28:42 +01:00
Robert Groot
d5c7ae5b34 Add Energyzero get_gas_prices and get_energy_price services (#101374)
Co-authored-by: Klaas Schoute <klaas_schoute@hotmail.com>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-12-21 15:39:51 +01:00
Erik Montnemery
0534b0dee4 Improve entity tests (#106175) 2023-12-21 15:32:25 +01:00
fwestenberg
39a956cea3 Bump Devialet to 1.4.4 (#106171)
Bump Devialet==1.4.4
2023-12-21 15:00:11 +01:00
sdb9696
ab2f3381a5 Bump ring-doorbell to 0.8.5 (#106178) 2023-12-21 14:58:01 +01:00
Martin Hjelmare
e1f31194f7 Move cloud stt engine to config entry (#99608)
* Migrate cloud stt to config entry

* Update default engine

* Test config flow

* Migrate pipelines with cloud stt engine to new engine id

* Fix test after rebase

* Update and add comment

* Remove cloud specifics from default stt engine

* Refactor cloud assist pipeline

* Fix cloud stt entity_id

* Try to wait for platforms before creating default pipeline

* Clean up import

* Move function in cloud assist pipeline

* Wait for tts platform loaded in stt migration

* Update deprecation dates

* Clean up not used fixture

* Add test for async_update_pipeline

* Define pipeline update interface better

* Remove leftover

* Fix tests

* Change default engine test

* Add test for missing stt entity during login

* Add and update comments

* Update config entry title
2023-12-21 13:39:02 +01:00
Jan-Philipp Benecke
f0104d6851 Remove gios sensor description required fields mixin (#106174) 2023-12-21 13:25:21 +01:00
David Bonnes
aa9f00099d Make evohome strictly typed (#106012)
* initial commit

* return to conventional approach

* add type hint for wrapper

* use walrus operator
2023-12-21 13:22:42 +01:00
Richard Kroegel
2b65fb22d3 Remove warning message on BMW initialization (#106169)
Co-authored-by: rikroe <rikroe@users.noreply.github.com>
2023-12-21 13:12:25 +01:00
Brett Adams
13908cf5a6 Add update platform to Tessie (#106093)
* Add version platform

* Add strings and test

* Remove potential for None

* Dont show progress when no update is running

* Return None for no update

* Add comment

* Remove future feature

* WIP

* Fix statuses

* update fixture

* Remove entity name

* Remove name correctly

* Use False for in_progress
2023-12-21 12:43:11 +01:00
Jan Bouwhuis
f263da843a Fix typo's en and improve language on MQTT data descriptions (#106165)
* Fix typo's en and prove language on MQTT data descriptions

* Update homeassistant/components/mqtt/strings.json

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

* Update homeassistant/components/mqtt/strings.json

* Update homeassistant/components/mqtt/strings.json

Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com>

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com>
2023-12-21 12:32:24 +01:00
Jan-Philipp Benecke
0ae0331c5c Migrate google related tests to use freezegun (#105552)
* Migrate google related tests to use freezegun

* retrigger CI

* Fix google tests

* Add timezone to config_entry_token_expiry

* Separate config_entry_token_expiry from token_expiry

* Also test token refresh for offset-naive tokens

* retrigger CI

* Apply code review suggestion

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

* Run ruff-format

---------

Co-authored-by: Allen Porter <allen.porter@gmail.com>
2023-12-21 12:23:01 +01:00
Jan Bouwhuis
f8f31627ce Refactor ranging utils for mqtt cover (#105739)
* Refactor ranging utils for mqtt cover

* Use literals for default min and max percentage
2023-12-21 11:54:05 +01:00
Michael
0614e291c1 Set WiFi QR code entity to unknown when Fritzbox is not available (#105870) 2023-12-21 10:29:01 +01:00
Matthias Alphart
46d63ad7ba Allow Fronius devices to be deleted (#106141) 2023-12-21 10:02:38 +01:00
J. Nick Koston
235914c63a Improve performance of dhcp integration client processing (#106137)
We were using run_callback_threadsafe here which has the overhead
of creating a future and waiting for the result when we throw
it away.
2023-12-21 09:28:04 +01:00
Brett Adams
1d63c34816 Add flags to EntityDescriptions in Tessie (#105847)
* Add SensorEntityDescription flags

* fix datclass attributes
2023-12-21 09:15:51 +01:00
J. Nick Koston
6845218a24 Bump bluetooth-data-tools to 1.19.0 (#106156) 2023-12-20 21:13:59 -10:00
Erik Montnemery
037eb33710 Refactor media_player test classes (#105630) 2023-12-21 08:11:27 +01:00
Lucas Mindêllo de Andrade
48241771f6 Bump SunWEG to 2.0.3 (#106135)
* chore(sunweg): bump version

* chore(sunweg): bump 2.0.3
2023-12-21 07:45:41 +01:00
puddly
bfaae77e51 Bump ZHA dependencies (#106147) 2023-12-21 07:44:36 +01:00
J. Nick Koston
e50fe79911 Update habluetooth to 2.0.0 (#106145) 2023-12-20 20:37:39 -10:00
Brett Adams
dbb726f41f Add Select platform to Tessie (#105423)
* Add select platform

* Add error coverage

* Fix case

* fix value

* Remove virtual key issue

* Add TessieSeatHeaterOptions enum and update TessieSeatHeaterSelectEntity options

* use ENUM in tests

* Porting other fixes

* Update entity
2023-12-21 07:34:31 +01:00
Phil Bruckner
126f0e4047 Bump life360 to 6.0.1 (#106149)
* Bump life360 package to 6.0.1

Fix recent API issues.

* Update requirements files
2023-12-21 07:18:49 +01:00
tronikos
aa51b5f6d4 Add virtual integrations for AEP utilities supported by opower (#106146) 2023-12-21 06:44:40 +01:00
Brett Adams
e2cf4244ea Add switch platform to Tessie (#106153)
* Add switch platform

* Make functions mandatory

* Underscores

* Improvements
2023-12-21 06:34:52 +01:00
Brett Adams
7c5824b4f3 Add climate platform to Tessie (#105420)
* Add climate platform

* Other fixes

* Use super native value

* change to _value

* Sentence case strings

* Add some more type definition

* Add return types

* Add some more assertions

* Remove VirtualKey error

* Add type to args

* rename climate to primary

* fix min max

* Use String Enum

* Add PRECISION_HALVES

* Fix string enum

* fix str enum

* Simplify run logic

* Rename enum to TessieClimateKeeper
2023-12-21 06:18:18 +01:00
J. Nick Koston
e2314565bb Fix ESPHome Bluetooth diagnostics (#106151) 2023-12-20 18:33:43 -10:00
J. Nick Koston
ced4123d4c Bump pyenphase to 1.15.2 (#106134) 2023-12-20 14:10:56 -10:00
J. Nick Koston
5722b4a1ce Break out the ESPHome Bluetooth scanner connection logic into bleak-esphome (#105908) 2023-12-20 13:36:37 -10:00
Robert Resch
d47ec91231 Deprecate deprecated sensor constants (#106120) 2023-12-21 00:02:20 +01:00
Robert Resch
494a897568 Deprecate deprecated climate constants (#106096) 2023-12-21 00:00:21 +01:00
J. Nick Koston
dfb08e7efd Remove unneeded usage of run_callback_threadsafe in entity helper (#106138)
We do not need to create a future here as we do not
need to wait for the result as its going to run
in the background in a task anyways
2023-12-20 23:57:20 +01:00
Ville Skyttä
24b1e01d71 Update Ruff to 0.1.8, avoid linter/formatter conflicts (#106080)
* Disable Ruff rules that may conflict with the formatter

* Upgrade Ruff to 0.1.8

- https://github.com/astral-sh/ruff/releases/tag/v0.1.7
- https://github.com/astral-sh/ruff/releases/tag/v0.1.8

* Format with Ruff 0.1.8
2023-12-20 23:55:09 +01:00
Jan Bouwhuis
f5f9b89848 Add water_heater to google_assistant (#105915)
* Add water_heater to google_assistant

* Follow up comments

* Add water_heater to default exposed domains
2023-12-20 23:26:55 +01:00
Jan Bouwhuis
c57cc85174 Add note on overkiz measurement sensor fix (#105141) 2023-12-20 23:07:31 +01:00
Jan Bouwhuis
65d3f7e1c7 Improve error mqtt valve error logging (#106129)
* Improve error mqtt valve error logging

* Update homeassistant/components/mqtt/valve.py

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

* Update homeassistant/components/mqtt/valve.py

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

* Update homeassistant/components/mqtt/valve.py

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

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2023-12-20 21:18:30 +01:00
Tobias Sauerwein
69dcc159ae Bump pyatmo to 8.0.1 (#106094)
Fix missing NLFE
2023-12-20 20:32:03 +01:00
Robert Resch
98f0ed1892 Deprecate deprecated siren constants (#106121) 2023-12-20 19:11:03 +01:00
Robert Resch
803e77bebd Move prusalink migration to async_migrate_entry and use a minor version bump (#106109)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-12-20 19:10:12 +01:00
Robert Resch
ea28b74fe9 Deprecate deprecated alarm control panel constants (#106058) 2023-12-20 18:41:17 +01:00
Robert Resch
491a50a2f1 Deprecate deprecated lock constants (#106113) 2023-12-20 18:07:17 +01:00
Robert Resch
9dd1b9e268 Deprecate deprecated device tracker constants (#106099) 2023-12-20 18:06:38 +01:00
Robert Resch
28e4358c53 Deprecate deprecated humidifier constants (#106112) 2023-12-20 18:05:43 +01:00
Robert Resch
9830f77e9e Deprecate deprecated cover constants (#106098) 2023-12-20 18:04:44 +01:00
Robert Resch
c9c072ff3e Deprecate deprecated fan constants (#106111) 2023-12-20 17:54:43 +01:00
J. Nick Koston
2403b21c4f Bump zeroconf to 0.131.0 (#106037) 2023-12-20 06:37:52 -10:00
Robert Resch
036c856500 Deprecate deprecated number constants (#106114) 2023-12-20 17:28:52 +01:00
Robert Resch
58759ff6b7 Deprecate deprecated remote constants (#106116) 2023-12-20 17:20:50 +01:00
Jan Bouwhuis
93c800c4e8 Add water_heater to alexa (#106011)
* Add water_heater support to alexa

* Improve test coverage

* Follow up comments
2023-12-20 16:48:02 +01:00
Robert Resch
5a3db078d5 Use patch.dict in deprecation test "test_check_if_deprecated_constant" (#106117) 2023-12-20 16:06:26 +01:00
Ben
56967a92e0 Bump surepy to 0.9.0 (#106101) 2023-12-20 15:46:54 +01:00
On Freund
3e07cf50ce Don't fetch unchanged OurGroceries lists (#105998) 2023-12-20 10:35:42 +01:00
Nikolay Vasilchuk
33bcf70bf3 Add Starline Service Mode switch (#105741)
* Starline Service Mode switch

* Update homeassistant/components/starline/strings.json

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

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-12-20 09:51:46 +01:00
Jan Bouwhuis
c7f6ab2457 Add MQTT valve platform (#105766)
* Add mqtt valve platform

* No stop topic-reports_position and validation

* Do not allow state_open, state_closed with position reporing valve

* Allow open/close feature to be disabled

* Follow up comments

* Rename

* Apply defaults in validator

* Update docstr
2023-12-20 07:49:49 +01:00
Sid
918ea8f56d Move shared enigma2 constants (#106064)
enigma2: move shared constants from media_player.py into its own const.py
2023-12-19 23:19:24 +01:00
J. Nick Koston
97a14f6b6c Bump aioesphomeapi to 21.0.1 (#106079) 2023-12-19 11:43:00 -10:00
vexofp
c5a3e58994 Pass timeout to httpx in RESTful Switch (#105364)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-12-19 10:47:42 -10:00
raww
f7a5b14cd6 Bump switchbot-api to 1.3.0 (#105594) 2023-12-19 10:27:31 -10:00
Franck Nijhof
63a535e9d9 Small cleanup in Tailwind (#106073) 2023-12-19 21:17:29 +01:00
Michael Chisholm
64a2c64419 Bump async-upnp-client to 0.38.0 (#105980) 2023-12-19 10:12:30 -10:00
Erik Montnemery
1ae6f1e9e2 Add valve support to switch_as_x (#105988) 2023-12-19 20:16:18 +01:00
Robert Resch
db985925c4 Deprecate deprecated automation constants (#106067) 2023-12-19 19:22:13 +01:00
Klaas Schoute
9275d35c0a Improve tests for easyEnergy (#105989) 2023-12-19 19:02:40 +01:00
Niklas Wagner
91f8d3faef Upgrade Prusa Link to new Digest Authentication and /v1/ API (#103396)
Co-authored-by: Robert Resch <robert@resch.dev>
2023-12-19 18:07:27 +01:00
Robert Resch
c226d793d4 Move common function for testing derepcation constants to util (#106063) 2023-12-19 17:31:31 +01:00
Robert Resch
0e0fd39603 Add dir_with_deprecated_constants function to deprecation helper (#106059) 2023-12-19 16:37:21 +01:00
Franck Nijhof
63136572a5 Update gotailwind to 0.2.2 (#106054) 2023-12-19 13:35:29 +01:00
Joakim Sørensen
5b4000e759 Bump hass-nabucasa from 0.74.0 to 0.75.1 (#105958)
* Bump hass-nabucasa from 0.74.0 to 0.75.1

* Force sorting of parametrized test

* Simplify async_create_issue.severity

* use fixtures
2023-12-19 13:08:27 +01:00
Franck Nijhof
48740e6b05 Add cover platform to Tailwind integration (#106042) 2023-12-19 12:46:21 +01:00
Robert Resch
a4ccd6e13b Deprecate binary sensor device class constants (#105736)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-12-19 12:45:32 +01:00
G Johansson
c64c1c8f08 Workday create repair if named holiday missing (#101201) 2023-12-19 12:33:05 +01:00
Michael
c87f2027d4 Use check_valid_float helper in significant change support of sensor and weather (#106013) 2023-12-19 12:31:10 +01:00
Michael
a1614d6b7e Add significant Change support for climate (#106020) 2023-12-19 12:30:30 +01:00
Jan-Philipp Benecke
7d74c89606 Use freezegun in image_upload test (#106045) 2023-12-19 12:26:40 +01:00
Jan-Philipp Benecke
f84e43bc0a Use freezegun in qld_bushfire test (#106049) 2023-12-19 12:21:19 +01:00
Jan-Philipp Benecke
c50098a845 Use freezegun in nsw_rural_fire_service_feed test (#106050) 2023-12-19 12:20:56 +01:00
Jan-Philipp Benecke
2d31f9e984 Use freezegun in ign_sismologia test (#106051) 2023-12-19 12:20:28 +01:00
Jan-Philipp Benecke
f20e4b9df1 Add myself as code owner for rest_command (#106047) 2023-12-19 12:07:13 +01:00
Jan-Philipp Benecke
bb6f78dcc4 Remove sun entity description required fields mixin (#105848) 2023-12-19 11:16:35 +01:00
Franck Nijhof
ef59394ef4 Add binary sensor platform to Tailwind integration (#106033) 2023-12-19 10:38:56 +01:00
Michael
a4cb64e20e Add significant Change support for water heater (#106003) 2023-12-19 10:38:13 +01:00
mkmer
8c3911ffea Bump blinkpy 0.22.4 (#105993) 2023-12-19 10:36:13 +01:00
Jan-Philipp Benecke
40f30675dd Remove gree switch entity description required fields mixin (#105849) 2023-12-19 10:35:19 +01:00
Jan-Philipp Benecke
ed9e738985 Remove ipma entity description required fields mixin (#106039) 2023-12-19 10:35:04 +01:00
Guido Schmitz
24191545a1 Bump devolo_home_control_api to 0.18.3 (#106035) 2023-12-19 10:26:54 +01:00
Michael
458fcc6372 Add significant Change support for alarm control panel (#106021) 2023-12-19 09:58:02 +01:00
mkmer
061c144fe8 Correct logic in honeywell for cleaning up stale devices (#106018)
* code quality fixes

* remove unnecessary code

* Remove comment

* change config entry configuration order

* update based on aladdin connect pr
2023-12-19 07:58:35 +01:00
tronikos
09a0ace671 Fix opower for AEP utilities (#106010) 2023-12-18 20:49:18 -10:00
mkmer
69fccec147 Clean up device registry for doors that no longer exist in Aladdin Connect (#99743)
* Remove devices that no longer exist

* Run Black after merge

* config 2 devices then 1 devices

* clean up device assertions

* More generic device check

* Add request from Honeywell PR

* remove unnecesary test
optimize dont_remove

* remove unnecessary test

* Actually test same id different domain

* Test correct id

* refactor remove test

* Remove .get for non optional keys

* Comprehension for all_device_ids

* Fix DR test, remove `remove`

* fix entities for full test coverage

* remove unused variable assignment

* Additional assertions confirming other domain

* Assertion error

* new method for identifier loop

* device_entries for lists
2023-12-19 07:30:02 +01:00
Erik Montnemery
0c2485bc03 Freeze integration entity descriptions (#105984)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-12-18 16:28:13 -10:00
Joakim Plate
ae8db120e8 Upgrade gardena_bluetooth to 1.4.1 (#106017) 2023-12-18 16:27:31 -10:00
Luke Lashley
97e66ef9ee Bump Roborock to 0.38.0 (#106025) 2023-12-18 16:26:45 -10:00
Sid
953a035cb5 Update enigma2 codeowners (#106000) 2023-12-18 15:30:23 -10:00
Erik Montnemery
6f392a3b43 Avoid mutating entity descriptions in sunweg tests (#106024) 2023-12-18 15:26:59 -10:00
Erik Montnemery
649e8e689d Fix entity descriptions in upnp (#106023) 2023-12-18 15:26:38 -10:00
Erik Montnemery
d1f6b1271f Avoid mutating entity descriptions in screenlogic (#106022) 2023-12-18 15:26:17 -10:00
epenet
17b53d7acb Remove leftover logging in onewire (#105986)
Remove leftover logging
2023-12-19 00:23:51 +01:00
Michael
29e30e796a Add significant change helper check_valid_float (#106005) 2023-12-18 21:59:30 +01:00
Marc Mueller
446f560b59 Set aiohttp shutdown_timeout on AppRunner instead of TCPSite (#105973) 2023-12-18 10:59:23 -10:00
Guido Schmitz
b35afccdb7 Add PLC PHY rates as sensor to devolo Home Network (#87039)
* Add plc phyrate sensors

* Fix mypy

* Add tests

* Use suggested_display_precision

* Adapt to recent development

* Remove accidentally added constant

* Fix tests

* Fix pylint

* Use PHY rate instead of phyrate

* Adapt tests

* Hopefully fix mypy

* Hopefully fix mypy

* Use LogicalNetwork

* Apply mypy fixes
2023-12-18 21:11:06 +01:00
Eugenio Panadero
b96d2cadac Add new price sensors with API token access to pvpc hourly pricing (#85769)
*  Implement optional API token in config-flow + options

to make the data download from an authenticated path in ESIOS server

As this is an *alternative* access, and current public path works for the PVPC,
no user (current or new) is compelled to obtain a token,
and it can be enabled anytime in options, or doing the setup again

When enabling the token, it is verified (or "invalid_auth" error),
and a 'reauth' flow is implemented, which can change or disable the token if
it starts failing.

The 1st step of config/options flow adds a bool to enable this private access,
- if unchecked (default), entry is set for public access (like before)
- if checked, a 2nd step opens to input the token, with instructions
  of how to get one (with a direct link to create a 'request email').
  If the token is valid, the entry is set for authenticated access

The 'reauth' flow shows the boolean flag so the user could disable a bad token
by unchecking the boolean flag 'use_api_token'

* ♻️ Remove storage of flag 'use_api_token' in config entry

leaving it only to enable/disable the optional token in the config-flow

* ♻️ Adjust async_update_options

*  Add new price sensors with API token access

New price sensors added:
- Injection price: price of excess energy from self-consumption
- OMIE price: electricity price in the 'open' market
- MAG price: Temporal tax cost for gas compensation

*  Adapt tests to work with multiple sensors

* 🐛 Fix all integration sensors going unavailable

when any sensor lacks data for the current day (usually the 'OMIE price')

* Fix rebase

* Customize icons and display precision for new sensors

* Disable MAG Tax and OMIE price sensors by default

* Move logic to assign sensor unique ids to integration

* Move helper functions to helpers.py

* Fix sensor activation for API download
2023-12-18 21:06:02 +01:00
Erik Montnemery
1d1cd6be57 Avoid mutating entity descriptions in sunweg (#105982) 2023-12-18 10:03:40 -10:00
Erik Montnemery
27f81b3f63 Avoid mutating entity descriptions in unifiprotect (#105976) 2023-12-18 09:58:32 -10:00
Miguel Camba
5175737b60 Add Valve integration (#102184)
* Add Valve integration.

This adds the valve integration discussed in https://github.com/home-assistant/architecture/discussions/975
Most of the code is taken from the cover integration but simplified since valves
can't tilt.

There are a couple outstanding errors I'm not sure how to solve and prevents
me from even making this commit without `--no-verify`.

* Apply PR feedback

* Apply more feedback: Intruduce the bare minimum

* Remove file commited by mistake

* Hopefully this fixes tests

* Match cover's typing and mypy settings

* Change some configuration files

* Fix test

* Increase code coverage a little

* Code coverate inproved to 91%

* 95% code coverage

* Coverate up to 97%

* Coverage 98%

* Apply PR feedback

* Even more feedback

* Add line I shouldn't have removed

* Derive closed/open state from current position

* Hopefully last feedback

* Update homeassistant/components/valve/__init__.py

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

* Update homeassistant/components/valve/__init__.py

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

* Remove unnecesary translation

* Remove unused method arguments

* Complete code coverage

* Update homeassistant/components/valve/__init__.py

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

* Simplify tests

* Update homeassistant/components/valve/__init__.py

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

* Apply last feedback

* Update tests/components/valve/test_init.py

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

* Update tests/components/valve/test_init.py

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

* Update tests/testing_config/custom_components/test/valve.py

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

* More feedback

* Apply suggestion

* And more feedback

* Apply feedback

* Remove commented code

* Reverse logic to unindent

* Update homeassistant/components/valve/__init__.py

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

* Update homeassistant/components/valve/__init__.py

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

* Implement stop valve for Mock valve

* Fix tests now that I've implemented stop_valve

* Assert it's neither opening nor closing

* Use current position instead

* Avoid scheduling executor when opening or closing

* Fix incorrect bitwise operation

* Simplify toggle

* Remove uneeded partial functions

* Make is_last_toggle_direction_open private

* Remove valve from test custom integration

* Improve test coverage

* Address review comments

* Address review comments

* Address review comments

* Update homeassistant/components/valve/__init__.py

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

* Update tests

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Erik <erik@montnemery.com>
2023-12-18 19:48:00 +01:00
Stefan Agner
93a9a9d1e2 Add Raspberry Pi 5 to version and hardware integration (#105992) 2023-12-18 19:31:37 +01:00
Erik Montnemery
0a6f541b27 Avoid mutating entity descriptions in screenlogic (#105983) 2023-12-18 19:14:10 +01:00
Rami Mosleh
ab40ba80a9 Improve Transmission Entity description class (#105924)
* Add entity mixin for transmission sensors

* use kw_only in EntityDescription class

* minor fix

* Update sensor.py uom
2023-12-18 19:09:01 +01:00
Franck Nijhof
5f2a13fec6 Add DHCP discovery to Tailwind (#105981) 2023-12-18 15:52:48 +01:00
Daniel Gangl
72fe30439e Rename zamg to GeoSphere Austria (#105494) 2023-12-18 15:47:44 +01:00
Erik Montnemery
2515e520c1 Allow step size any for number selector in slider mode (#105978) 2023-12-18 15:30:59 +01:00
Marc Mueller
b671de8942 Improve logging util typing (#105968) 2023-12-18 14:54:12 +01:00
Michael
58070e14a7 Add significant Change support for camera (#105866) 2023-12-18 14:40:55 +01:00
Jan-Philipp Benecke
0972dc5867 Migrate directv test to use freezegun (#105894) 2023-12-18 14:40:13 +01:00
Franck Nijhof
556be26040 Add button platform to Tailwind integration (#105961) 2023-12-18 14:11:43 +01:00
J. Nick Koston
4bdfea5d67 Remove HaAsyncServiceBrowser from zeroconf (#105881) 2023-12-18 14:11:06 +01:00
tronikos
4f11419ae7 Bump google-generativeai to 0.3.1 (#105783) 2023-12-18 14:07:08 +01:00
Franck Nijhof
79aa888ca0 Add diagnostics platform to Tailwind (#105965) 2023-12-18 14:05:15 +01:00
mkmer
a2a9a8e231 Fix typo in deprecated comment (#105969) 2023-12-18 14:04:19 +01:00
Erik Montnemery
bad9598baa Avoid mutating entity descriptions in ovo_energy (#105971) 2023-12-18 14:03:57 +01:00
Erik Montnemery
8518d46d28 Avoid mutating entity descriptions in radarr (#105972) 2023-12-18 14:03:41 +01:00
Erik Montnemery
7a9e303e20 Avoid mutating entity descriptions in onewire (#105970) 2023-12-18 13:58:57 +01:00
Tobias Sauerwein
57a6effd70 Fix unreachable Netatmo sensor returning false values (#105954)
* Fix unreachable sensor returning false values

* Clean up unnecessary code
2023-12-18 13:57:34 +01:00
Erik Montnemery
94d22c936e Avoid mutating entity descriptions in tomorrowio (#105975) 2023-12-18 13:57:11 +01:00
Erik Montnemery
77c72f2402 Avoid mutating entity descriptions in solaredge (#105974) 2023-12-18 13:55:12 +01:00
Robert Resch
393da7b2e0 Fix easyenergy async_setup_services declaration (#105947) 2023-12-18 13:27:37 +01:00
Marc Mueller
8d0ce6ead6 Improve rfxtrx typing (#105966) 2023-12-18 13:23:30 +01:00
tronikos
82f3f17537 Bump opower to 0.1.0 (#105957) 2023-12-18 12:16:32 +01:00
Franck Nijhof
3c73c0f17f Add reauth support to Tailwind (#105959) 2023-12-18 12:12:56 +01:00
starkillerOG
60fe6ff771 Bump motionblinds to 0.6.19 (#105951) 2023-12-18 11:30:44 +01:00
starkillerOG
253182c650 Reolink change ir to switch (#105916)
* Change IR from light to switch

* Remove old entity

* Add test

* Apply suggestions from code review

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

---------

Co-authored-by: Jan-Philipp Benecke <github@bnck.me>
2023-12-18 11:13:20 +01:00
Erik Montnemery
3e50ca6cda Set volume_step in frontier_silicon media_player (#105953) 2023-12-18 11:08:26 +01:00
Franck Nijhof
90fef6b9c9 Add Tailwind zeroconf discovery (#105949) 2023-12-18 10:39:15 +01:00
starkillerOG
f912b9c34a Bump reolink_aio to 0.8.4 (#105946) 2023-12-18 10:37:22 +01:00
Joost Lekkerkerker
0d049d73cf Add AndroidTV remote to strict typing (#105571)
Co-authored-by: Robert Resch <robert@resch.dev>
2023-12-18 10:34:39 +01:00
Klaas Schoute
e59e1d7f8e Add prices service calls for easyEnergy (#105175) 2023-12-18 09:37:59 +01:00
Franck Nijhof
d50b79ba84 Add Tailwind integration (#105926)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-12-18 08:42:53 +01:00
Brandon Rothweiler
6acbbec839 Address late review comments for A. O. Smith reauth (#105941) 2023-12-18 07:10:14 +01:00
Keilin Bickar
017dc66046 Bump asyncsleepiq to v1.4.0 (#105939) 2023-12-17 17:19:29 -10:00
ollo69
2c54f8bf8e Bump pyasuswrt to 0.1.21 (#105922) 2023-12-17 15:34:19 -10:00
Brett Adams
a88335272a Implement Review Feedback for Tessie (#105937) 2023-12-17 15:33:26 -10:00
Marc Mueller
aac02d7b84 Add first TypeVarTuple annotations (#105379) 2023-12-18 00:38:07 +01:00
J. Nick Koston
5c503683b7 Bump lru-dict to 1.3.0 (#105914)
* Bump lru-dict to 1.3.0

changelog: https://github.com/amitdev/lru-dict/compare/v1.2.0...v1.3.0

* fix typing

* quote types

* quote types
2023-12-18 00:16:31 +01:00
David Bonnes
45b5ddfad7 Use library constants instead of literals in Evohome (#105039)
* initial commit

* roll back some consts

* doctweak

* tweak linting

* doctweak
2023-12-17 23:08:18 +01:00
J. Nick Koston
67d903ca99 Remove bluetooth-data-tools dep from ESPHome (#105912) 2023-12-17 09:18:20 -10:00
J. Nick Koston
9490da830c Bump bleak-esphome to 0.4.0 (#105909) 2023-12-17 06:15:55 -10:00
J. Nick Koston
3f68abdd3a Bump zeroconf to 0.130.0 (#105868) 2023-12-17 06:00:38 -10:00
Jan-Philipp Benecke
7772f60426 Migrate file test to use freezegun (#105892) 2023-12-17 05:09:10 -10:00
J. Nick Koston
89513efd8d Refactor ESPHome Bluetooth connection logic to prepare for esphome-bleak (#105747) 2023-12-17 04:42:28 -10:00
J. Nick Koston
e78588a585 Bump bluetooth-adapters to 0.16.2 (#105878)
changelog: https://github.com/Bluetooth-Devices/bluetooth-adapters/compare/v0.16.1...v0.16.2
2023-12-17 12:48:08 +01:00
J. Nick Koston
87c081e70d Bump aiodiscover to 1.6.0 (#105885) 2023-12-16 16:07:21 -10:00
J. Nick Koston
537dbd8375 Fix cloud tests doing socket I/O (#105874)
https://github.com/home-assistant/core/actions/runs/7233101649/job/19708631179?pr=105868
https://github.com/home-assistant/core/actions/runs/7232949349?pr=105834

I was hoping to only patch the library, but when I did that it still failed
because it had no access token
2023-12-17 01:23:56 +01:00
Ernst Klamer
299a2ef04e Bump qingping_ble to 0.9.0 (#105876) 2023-12-16 10:16:30 -10:00
Ernst Klamer
cd15283c2e Bump bthome_ble to 3.3.1 (#105834)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-12-16 09:08:28 -10:00
Michael
4cca174586 Address late review comments on AVM FRITZ!SmartHome (#105860)
set copies dict keys by default
2023-12-16 19:38:58 +01:00
Chris Cohen
5ce782d597 Bump glances-api to 0.5.0 (#105813)
bump glances API to 0.5.0
2023-12-16 19:27:46 +01:00
Álvaro Fernández Rojas
3be12c0611 Fix Airzone temperature range on new climate card (#105830)
* airzone: climate: fix double setpoint

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

* tests: airzone: fix double setpoint temperature

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

* tests: airzone: fix swapped double setpoint

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

---------

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2023-12-16 18:42:58 +01:00
J. Nick Koston
755dcd8bc6 Ensure bluetooth auto recovery does not run in tests (#105841) 2023-12-16 06:09:03 -10:00
Marc Mueller
8549311d1d Update feedparser to 6.0.11 (#105857) 2023-12-16 14:48:51 +01:00
Marc Mueller
e7d7bb4f25 Update coverage to 7.3.3 (#105855) 2023-12-16 14:47:47 +01:00
Marc Mueller
80a164347a Update pre-commit to 3.6.0 (#105856) 2023-12-16 14:47:30 +01:00
Erik Montnemery
104bcc64b7 Allow inheriting base component entity descriptions in frozen dataclasses (#105512)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-12-15 23:33:50 -10:00
J. Nick Koston
47f8e08261 Reduce overhead to connect dispatcher (#105715)
Reduce overhead connect dispatcher

- We tend to have 1000s (or 10000s) of connected dispatchers which
  makes these prime targets to reduce overhead/memory

- Instead of creating new functions to wrap log exceptions each time
  use partials which reuses the function body and only create new
  arguments

Previous optimizations #103307 #93602
2023-12-16 10:16:58 +01:00
Joseph Block
1271f16385 Add Unifi device state for additional diagnostics (#105138)
* Add device state for additional diagnostics

* Add state test and fix existing tests

* Utilize IntEnum and dict for state lookup

* Update aiounifi to v68
2023-12-16 08:38:21 +01:00
jjlawren
9c134c6b51 Bump soco to 0.30.0 (#105823) 2023-12-16 08:06:04 +01:00
J. Nick Koston
19341863ba Bump pyunifiprotect to 4.22.3 (#105833)
changelog: https://github.com/AngellusMortis/pyunifiprotect/compare/v4.22.0...v4.22.3
2023-12-16 08:02:00 +01:00
Brett Adams
887f9a21e5 Add Binary Sensor platform to Tessie (#105421) 2023-12-15 18:56:38 -10:00
Brett Adams
59630460c6 Quality fixes for Tessie (#105838) 2023-12-15 16:11:20 -10:00
Álvaro Fernández Rojas
a12c490cff Update aioairzone to v0.7.2 (#105811) 2023-12-15 14:59:43 -10:00
Brett Adams
e02f4c9c60 Fix translation keys in Tessie (#105824) 2023-12-15 11:25:51 -10:00
Maciej Bieniek
67a30d71e6 Fix HVAC mode duplication for Shelly Gen2 climate platform (#105812)
Fix HVAC mode duplication
2023-12-15 18:14:53 +01:00
Jan Bouwhuis
b4741c2069 Add data descriptions to MQTT config flow. (#105301)
* Add data descriptions to MQTT config flow.

* Remove keep allive, correct text CA cert
2023-12-15 16:30:54 +01:00
Álvaro Fernández Rojas
af91a54663 Bump aioairzone to v0.7.0 (#105807) 2023-12-15 16:27:00 +01:00
tronikos
b344ac42a8 Bump opower to 0.0.41 (#105791) 2023-12-15 13:38:38 +01:00
Joost Lekkerkerker
ef5d9d7377 Partly migrate Plex to has entity name (#98841)
* Partly migrate Plex to has entity name

* Use friendly name for device name

* Lowercase
2023-12-15 08:56:26 +01:00
Jan Bouwhuis
3f2fc2fce9 Fix mqtt tests modifying globals (#105774) 2023-12-15 08:15:10 +01:00
Erik Montnemery
a2b31a06e3 Avoid mutating entity descriptions in solaredge tests (#105718) 2023-12-15 08:10:35 +01:00
Erik Montnemery
c10b460c6b Set volume_step in cmus media_player (#105667) 2023-12-15 00:52:52 +01:00
Erik Montnemery
36eeb15fee Set volume_step in clementine media_player (#105666) 2023-12-15 00:49:30 +01:00
Erik Montnemery
bb8dce6187 Set volume_step in aquostv media_player (#105665) 2023-12-15 00:48:02 +01:00
Erik Montnemery
7fa55ffdd2 Set volume_step in bluesound media_player (#105672) 2023-12-15 00:10:31 +01:00
Erik Montnemery
cffb51ebec Set volume_step in monoprice media_player (#105670) 2023-12-15 00:09:05 +01:00
Martin Hjelmare
4da04a358a Refactor cloud assist pipeline (#105723)
* Refactor cloud assist pipeline

* Return None early
2023-12-14 23:56:08 +01:00
G Johansson
f4c8920231 Bump brottsplatskartan 1.0.5 (#105759) 2023-12-14 23:36:12 +01:00
Michael Hansen
6c5ca58405 Set todo item status in intent (#105743) 2023-12-14 22:53:22 +01:00
G Johansson
e055306482 Bump pytrafikverket to 0.3.9.2 (#105752) 2023-12-14 22:05:39 +01:00
Franck Nijhof
d56b79a993 2023.12.3 (#105757) 2023-12-14 21:44:14 +01:00
J. Nick Koston
34c7685927 Bump bleak-esphome to 0.3.0 (#105748) 2023-12-14 10:27:52 -10:00
Franck Nijhof
07667a6aee Bump version to 2023.12.3 2023-12-14 20:37:09 +01:00
Franck Nijhof
dbfc5ea8f9 Disable user profiles on login screen (#105749) 2023-12-14 20:36:59 +01:00
Charles Garwood
4aa03b33f6 Fix Fully Kiosk Browser MQTT event callbacks with non-standard event topics (#105735) 2023-12-14 20:36:56 +01:00
epenet
25bfe7ec82 Fix issue clearing renault schedules (#105719)
* Fix issue clearing renault schedules

* Adjust
2023-12-14 20:36:52 +01:00
Jan-Philipp Benecke
f8e92ddcb3 Add missing rest_command reload service to services.yaml (#105714)
* Add missing rest_command reload service to services.yaml

* Add missing strings.json

* retrigger stale CI
2023-12-14 20:36:48 +01:00
J. Nick Koston
73e234dfa5 Bump zeroconf to 0.128.5 (#105694) 2023-12-14 20:36:16 +01:00
Robert Svensson
3adda6b110 Fix restoring UniFi clients with old unique id (#105691)
Fix restoring UniFi clients with bad unique id
2023-12-14 20:35:07 +01:00
Álvaro Fernández Rojas
d5ecc55f89 Update AEMET-OpenData to v0.4.7 (#105676) 2023-12-14 20:35:03 +01:00
Michael
bfdadd12e9 Ensure platform setup for all AVM FRITZ!SmartHome devices (#105515) 2023-12-14 20:34:59 +01:00
Franck Nijhof
cc75430af3 Disable user profiles on login screen (#105749) 2023-12-14 20:28:08 +01:00
Charles Garwood
032d120a26 Include Envoy firmware version in Enphase diagnostics (#105742)
* Include Envoy firmware version in Enphase diagnostics

* Update tests
2023-12-14 13:59:39 -05:00
Charles Garwood
40f914214b Fix Fully Kiosk Browser MQTT event callbacks with non-standard event topics (#105735) 2023-12-14 18:59:37 +01:00
Álvaro Fernández Rojas
a488d120b7 Update AEMET-OpenData to v0.4.7 (#105676) 2023-12-14 18:59:04 +01:00
J. Nick Koston
8d1a69ae84 Migrate ESPHome bleak implementation to bleak-esphome library (#105611) 2023-12-14 07:21:31 -10:00
J. Nick Koston
0d9a583f4d Small speed up to data entry flow steps (#105713)
Instead of checking if the flow is completed with
a linear tuple search each time, use a constant
set
2023-12-14 17:32:14 +01:00
Sylvain Rivierre
ffb963c4c5 Add France to picnic countries (#105722)
Picnic is also available in France "FR" country
2023-12-14 16:55:17 +01:00
Lucas Mindêllo de Andrade
d4a7361bc6 Bump sunweg to 2.0.1 (#105613)
* chore(sunweg): minor requested changes

* test(sunweg): use of fixtures

* feat(sunweg): provide bad auth result on expired authentication

* chore(sunweg): bump version

* chore(sunweg): removed reauth

* chore(sunweg): removed features out of scope

* chore(sunweg): fixtures moved to conftest.py

* chore(sunweg): devicetype moved to const

* chore(sunweg):  conftest comment

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

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-12-14 16:51:57 +01:00
J. Nick Koston
7e1dc2286f Bump bluetooth-data-tools to 1.18.0 (#105685)
changelog: https://github.com/Bluetooth-Devices/bluetooth-data-tools/compare/v1.17.0...v1.18.0
2023-12-14 16:12:52 +01:00
Jan-Philipp Benecke
82218928e7 Add missing rest_command reload service to services.yaml (#105714)
* Add missing rest_command reload service to services.yaml

* Add missing strings.json

* retrigger stale CI
2023-12-14 15:20:34 +01:00
Nikolay Vasilchuk
356ad52d10 Replace Starline horn switch with button (#105728) 2023-12-14 15:00:23 +01:00
epenet
351b07b14d Fix issue clearing renault schedules (#105719)
* Fix issue clearing renault schedules

* Adjust
2023-12-14 12:54:03 +01:00
Erik Montnemery
9095027363 Avoid mutating entity descriptions in efergy tests (#105717) 2023-12-14 12:48:15 +01:00
Brig Lamoreaux
7721840298 Allow multiple configs for srp energy (#96573)
* Allow multiple configs.

* Rename test configs.

* Remove unused property

* Merge branch 'dev' into srp_energy_202307.coordinator

* Use title in device name.
2023-12-14 11:07:13 +01:00
Martin Hjelmare
2e448d2d13 Remove cloud details from assist pipeline (#105687)
* Remove cloud details from assist pipeline

* Update assist pipeline tests

* Update cloud tests
2023-12-14 10:15:59 +01:00
yangbo
82f0b28e89 Bump iammeter to 0.2.1 (#95885)
* Bump iammeter to 0.2.1

* Refactor sensor.

* Add const.py to .coveragerc.

* Add id migration.

* Modify translation file.

* Fix ruff test error

* update asyncio.timeout import.

* Delete homeassistant/components/iammeter/translations directory

* Add strings.json
2023-12-14 10:01:29 +01:00
Erik Montnemery
0ec3a222e3 Remove device_state_attributes property from entity base class (#105650) 2023-12-14 08:33:56 +01:00
Erik Montnemery
9020dbb093 Remove context_recent_time property from entity base class (#105652) 2023-12-14 08:33:31 +01:00
J. Nick Koston
aafdca88c9 Bump zeroconf to 0.129.0 (#105701)
* Bump zeroconf to 0.129.0

changelog: https://github.com/python-zeroconf/python-zeroconf/compare/0.128.5...0.129.0

* cleanup typing

* remove redunant lru

* revert type narrowing
2023-12-14 07:52:37 +01:00
J. Nick Koston
a16ab0d1ac Bump zeroconf to 0.128.5 (#105694) 2023-12-13 12:14:07 -10:00
Robert Svensson
7084889b78 Fix restoring UniFi clients with old unique id (#105691)
Fix restoring UniFi clients with bad unique id
2023-12-13 22:35:41 +01:00
Erik Montnemery
72cb21d875 Set volume_step in enigma2 media_player (#105669) 2023-12-13 19:42:11 +01:00
G Johansson
08b6d2af5e Add error translations to Yale Smart Living (#105678) 2023-12-13 19:41:31 +01:00
G Johansson
65514fbd73 Add error translations for Sensibo (#105600) 2023-12-13 19:40:57 +01:00
Erik Montnemery
6dc8c2c370 Set volume_step in sonos media_player (#105671) 2023-12-13 19:40:51 +01:00
G Johansson
5f69749420 Use Textselector in Trafikverket Camera (#105677)
* Use Textselector in Trafikverket Camera

* Update homeassistant/components/trafikverket_camera/strings.json

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

---------

Co-authored-by: Jan-Philipp Benecke <jan-philipp@bnck.me>
2023-12-13 19:39:19 +01:00
Jan-Philipp Benecke
d322cb5fdf Migrate homekit_controller tests to use freezegun (#105646) 2023-12-13 19:37:51 +01:00
Franck Nijhof
711d9e21ab 2023.12.2 (#105655) 2023-12-13 18:48:43 +01:00
Michael
08ca3678da Ensure platform setup for all AVM FRITZ!SmartHome devices (#105515) 2023-12-13 18:07:29 +01:00
Erik Montnemery
dd5a48996a Keep capabilities up to date in the entity registry (#101748)
* Keep capabilities up to date in the entity registry

* Warn if entities update their capabilities very often

* Fix updating of device class

* Stop tracking capability updates once flooding is logged

* Only sync registry if state changed

* Improve test

* Revert "Only sync registry if state changed"

This reverts commit 1c52571596c06444df234d4b088242b494b630f2.

* Avoid calculating device class twice

* Address review comments

* Revert using dataclass

* Fix unintended revert

* Add helper method
2023-12-13 17:27:26 +01:00
Erik Montnemery
4f9f548929 Add volume_step property to MediaPlayerEntity (#105574)
* Add volume_step property to MediaPlayerEntity

* Improve tests

* Address review comments
2023-12-13 17:26:34 +01:00
puddly
ebb54d7a6c Bump ZHA dependencies (#105661) 2023-12-13 17:10:56 +01:00
puddly
db52b9b0e1 Reload ZHA integration on any error, not just recoverable ones (#105659) 2023-12-13 17:10:52 +01:00
Marc Mueller
75bdd84c80 Update pylint to 3.0.3 (#105491) 2023-12-13 17:10:48 +01:00
Joost Lekkerkerker
896ca8ce83 Fix timing issue in Withings (#105203) 2023-12-13 17:07:36 +01:00
puddly
4e9b9add29 Bump ZHA dependencies (#105661) 2023-12-13 17:06:46 +01:00
Joost Lekkerkerker
a82410d5e9 Deduplicate constants E-Z (#105657) 2023-12-13 17:05:37 +01:00
Erik Montnemery
bbfffbb47e Avoid mutating entity descriptions in melcloud (#105629) 2023-12-13 16:57:22 +01:00
Joost Lekkerkerker
e4453ace88 Add country code constant (#105640) 2023-12-13 16:50:46 +01:00
Joost Lekkerkerker
816a37f9fc Fix timing issue in Withings (#105203) 2023-12-13 16:48:46 +01:00
puddly
e475829ce6 Reload ZHA integration on any error, not just recoverable ones (#105659) 2023-12-13 16:24:26 +01:00
Erik Montnemery
2d59eba4c7 Avoid mutating entity descriptions in airthings_ble (#105627) 2023-12-13 15:23:38 +01:00
Erik Montnemery
7ab003c746 Avoid mutating entity descriptions in lidarr (#105628) 2023-12-13 15:22:29 +01:00
Erik Montnemery
abac68f158 Avoid mutating entity descriptions in efergy (#105626) 2023-12-13 15:20:29 +01:00
Franck Nijhof
8744b05468 Bump version to 2023.12.2 2023-12-13 14:53:10 +01:00
Erik Montnemery
dff7725c1f Fix goodwe tests (#105653) 2023-12-13 14:52:44 +01:00
Michael Hansen
36c56eb32a Rename "satellite enabled" to "mute" (#105619) 2023-12-13 14:51:25 +01:00
Michael Hansen
797af14012 Skip TTS events entirely with empty text (#105617) 2023-12-13 14:48:51 +01:00
Michael Hansen
8812ca13d9 Add name slot to HassClimateGetTemperature intent (#105585) 2023-12-13 14:48:48 +01:00
G Johansson
8b3ba452bc Fix setup Fast.com (#105580)
* Fix setup fastdotcom

* Add if
2023-12-13 14:48:44 +01:00
Khole
fbb315b0a8 Bump pyhiveapi to v0.5.16 (#105513)
Co-authored-by: Khole Jones <khole.jones@frasers.group>
2023-12-13 14:48:41 +01:00
Julien "_FrnchFrgg_" Rivaud
9d0fed8539 Bump caldav to 1.3.8 (#105508)
* Bump caldav to 1.3.8

1.3.8 fixes a bug where duplicate STATUS properties would be emitted for a single VTODO depending on the case of the arguments used.

That bug meant that even though that is the intended API usage, passing lowercase for the status argument name would be rejected by caldav servers checking conformance with the spec which forbids duplicate STATUS.

This in turn prevented HomeAssistant to add new items to a caldav todo list.

Bump the requirements to 1.3.8 to repair that feature

* Update global requirements
2023-12-13 14:48:38 +01:00
Michael Hansen
4849884467 Disconnect before reconnecting to satellite (#105500)
Disconnect before reconnecting
2023-12-13 14:48:35 +01:00
Joost Lekkerkerker
8a0b1637b1 Remove Aftership import issue when entry already exists (#105476) 2023-12-13 14:48:30 +01:00
J. Nick Koston
ba84af9374 Bump zeroconf to 0.128.4 (#105465)
* Bump zeroconf to 0.128.3

significant bug fixes

changelog: https://github.com/python-zeroconf/python-zeroconf/compare/0.128.0...0.128.3

* .4
2023-12-13 14:47:27 +01:00
Allen Porter
557ce965cf Bump ical to 6.1.1 (#105462) 2023-12-13 14:42:03 +01:00
Arie Catsman
3b7add533b Write Enphase Envoy data to log when in debug mode (#105456) 2023-12-13 14:42:00 +01:00
Allen Porter
0683b8be21 Fix fitbit oauth reauth debug logging (#105450) 2023-12-13 14:41:56 +01:00
Jan Bouwhuis
399f98a726 Fix alexa calling not featured cover services (#105444)
* Fix alexa calls not supported cover services

* Follow up comment and additional tests
2023-12-13 14:41:53 +01:00
Bouwe Westerdijk
0023d66c80 Bump plugwise to v0.35.3 (#105442) 2023-12-13 14:41:49 +01:00
Erik Montnemery
164d0d2085 Bump hatasmota to 0.8.0 (#105440)
* Bump hatasmota to 0.8.0

* Keep devices with deep sleep support always available

* Add tests
2023-12-13 14:41:46 +01:00
Jan Schneider
a0e9772f52 Check if heat area exists when setting up valve opening and battery sensors in moehlenhoff alpha2 (#105437)
Check whether the referenced heat area exists

when setting up valve opening and battery sensors
2023-12-13 14:41:42 +01:00
Florian B
84c713894b Fix adding/updating todo items with due date in CalDAV integration (#105435)
* refactor: return date/datetime for due date

* fix: explicitly set due date on vTODO component

Using `set_due` automatically handles converting the Python-native
date/datetime values to the correct representation required by RFC5545.

* fix: fix tests with changed due date handling

* fix: item.due may not be a str

* refactor: keep local timezone of due datetime

* refactor: reorder import statement

To make ruff happy.

* fix: fix false-positive mypy error
2023-12-13 14:41:39 +01:00
mkmer
a02faaf489 Fix service missing key in Blink (#105387)
* fix update service
refactor service yaml

* Remove leftover target
2023-12-13 14:41:35 +01:00
G Johansson
15cf732463 Fix preset modes error in Smartthings (#105375) 2023-12-13 14:41:31 +01:00
David Knowles
ef17950d76 Bump pyschlage to 2023.12.0 (#105349)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-12-13 14:41:28 +01:00
mkmer
2d1c716444 Add missing configuration for services.yaml in blink (#105310) 2023-12-13 14:41:24 +01:00
Jan Bouwhuis
c6339cb0c0 Fix CI test_invalid_rrule_fix test by freezing the time (#105294) 2023-12-13 14:41:20 +01:00
J. Nick Koston
7c0a5baf77 Bump zeroconf to 0.128.0 (#104936) 2023-12-13 14:41:16 +01:00
Alex Thompson
0fa3ce763e Fix Lyric LCC thermostats auto mode (#104853) 2023-12-13 14:41:07 +01:00
Jan-Philipp Benecke
61a99c911c Migrate demo test to use freezegun (#105644) 2023-12-13 14:33:59 +01:00
Joost Lekkerkerker
ac53b78a0c Deduplicate constants A-D (#105638) 2023-12-13 14:21:44 +01:00
Martin Hjelmare
02853a62f0 Clean cloud client fixture from cloud http api tests (#105649) 2023-12-13 14:21:33 +01:00
Martin Hjelmare
5bb233998e Improve cloud http api tests (#105610)
* Improve cloud http api tests

* Add comments to the cloud fixture

* Fix docstring
2023-12-13 13:53:22 +01:00
mletenay
0548f9f342 Add diagnostics download to goodwe integration (#102928)
* Add diagnostics download to goodwe integration

* Revert change not related to test

* Use MagicMock for mock inverter

* Use spec with mock
2023-12-13 12:35:53 +01:00
Joost Lekkerkerker
22b2c588eb Use issue registry fixture (#105633) 2023-12-13 11:23:38 +01:00
Joost Lekkerkerker
06f81251fb Reduce code duplication in Suez config flow (#105558) 2023-12-13 10:41:35 +01:00
Erik Montnemery
a91dfc7954 Fix entity descriptions in philips_js (#105625) 2023-12-13 10:24:34 +01:00
Erik Montnemery
22c3847c0e Allow inheriting FrozenOrThawed with custom init (#105624) 2023-12-13 10:13:34 +01:00
Arie Catsman
c318445a76 Write Enphase Envoy data to log when in debug mode (#105456) 2023-12-13 09:22:10 +01:00
J. Nick Koston
5dbd0dede1 Refactor Bluetooth scanners to avoid the need to pass a callback (#105607) 2023-12-13 09:17:48 +01:00
Michael Hansen
aaccf19013 Rename "satellite enabled" to "mute" (#105619) 2023-12-13 09:09:22 +01:00
Maciej Bieniek
66d24b38aa Add diagnostics platform to BraviaTV (#105603)
* Add diagnostics platform

* Add test

* Improve test

* Use consts

* Fix test

* Patch methods

* Patch methods
2023-12-13 08:18:50 +01:00
dependabot[bot]
9e9b518433 Bump github/codeql-action from 2.22.9 to 2.22.10 (#105620) 2023-12-13 07:38:42 +01:00
Michael Hansen
a73e86a741 Skip TTS events entirely with empty text (#105617) 2023-12-13 00:21:16 -05:00
Michael Hansen
431a44ab67 Add name slot to HassClimateGetTemperature intent (#105585) 2023-12-12 22:54:15 -05:00
J. Nick Koston
22f0e09b8c Bump aioesphomeapi to 21.0.0 (#105609) 2023-12-12 15:20:05 -10:00
Brandon Rothweiler
a595cd7141 Add sensor platform to A. O. Smith integration (#105604)
* Add sensor platform to A. O. Smith integration

* Fix typo

* Remove unnecessary mixin

* Simplify async_setup_entry
2023-12-13 00:52:15 +01:00
J. Nick Koston
98b1bc9bed Bump aioesphomeapi to 20.1.0 (#105602) 2023-12-12 12:51:18 -10:00
Maciej Bieniek
77283704a5 Bump brother library, use pysnmp-lextudio with SNMP integration (#105591) 2023-12-12 11:36:11 -10:00
Franck Nijhof
d144d6c9ab Mark more entities secondary on Fully Kiosk Browser (#105595) 2023-12-12 21:40:11 +01:00
Joost Lekkerkerker
283ff4fada Add Adax to strict typing (#105562) 2023-12-12 21:29:18 +01:00
J. Nick Koston
f002a6a732 Refactor all Bluetooth scanners to inherit from BaseHaRemoteScanner (#105523) 2023-12-12 21:28:43 +01:00
Erik Montnemery
5bd0833f49 Improve FrozenOrThawed (#105541) 2023-12-12 21:19:41 +01:00
Erwin Douna
8bd265c3ae Add Fastdotcom service (#105553)
* Add service for manual control

* Proper naming

* Removing old translation

* Reverting back service

* Removig services.yaml

* Putting back in service

* Putting back in service description and yaml

* Proper naming

* Adding create_issue

* Feedback fixes

* Fix deprecation date in strings

* Update homeassistant/components/fastdotcom/__init__.py

* Update homeassistant/components/fastdotcom/strings.json

---------

Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2023-12-12 21:18:12 +01:00
Joost Lekkerkerker
0e5d72a501 Add Android IP webcam to strict typing (#105570) 2023-12-12 20:54:35 +01:00
Joost Lekkerkerker
84bffcd2e1 Add Aranet to strict typing (#105577) 2023-12-12 20:54:00 +01:00
Joost Lekkerkerker
09b07c071b Add Apprise to strict typing (#105575) 2023-12-12 20:53:36 +01:00
Erwin Douna
32147dbdd9 Bump PyTado to 0.17.0 (#105573) 2023-12-12 20:52:59 +01:00
Jan-Philipp Benecke
d33aa6b8e7 Migrate homematicip_cloud tests to use freezegun (#105592) 2023-12-12 20:51:32 +01:00
G Johansson
4ad16b56f2 Fix setup Fast.com (#105580)
* Fix setup fastdotcom

* Add if
2023-12-12 20:43:09 +01:00
J. Nick Koston
54d314d1d0 Bump aioesphomeapi to 20.0.0 (#105586)
changelog: https://github.com/esphome/aioesphomeapi/compare/v19.3.1...v20.0.0

- Add happy eyeballs support (RFC 8305) (#789)

Note that nothing much happens yet on the HA side since
we only pass one IP in so its always going to fallback
at this point
2023-12-12 08:41:50 -10:00
J. Nick Koston
f58af0d717 Bump aiohomekit to 3.1.0 (#105584) 2023-12-12 19:07:20 +01:00
J. Nick Koston
c7a95d5654 Bump dbus-fast to 2.21.0 (#105536) 2023-12-12 07:55:12 -10:00
J. Nick Koston
ec1cde77f6 Add support for Happy Eyeballs to homekit_controller (#105454) 2023-12-12 07:54:33 -10:00
Joost Lekkerkerker
64c3cfca17 Add Airvisual pro to strict typing (#105568) 2023-12-12 17:27:41 +01:00
Jan Bouwhuis
280637822b Use mocked entity platform for lock service tests (#105020)
* Use mocked entity platform for lock service tests

* Cleanup old mock class

* Follow up on code review

* Improve mock entity platform

* Use entity_id of passed entity instead of constant
2023-12-12 15:49:01 +01:00
Joost Lekkerkerker
5c514b6b19 Add Suez Water to strict typing (#105559) 2023-12-12 14:44:17 +01:00
Martin Hjelmare
2631fde0f7 Patch aiohttp server app router freeze in tests (#105555)
* Add test for registering a http view late

* Patch aiohttp server app router freeze

* Correct language
2023-12-12 14:40:38 +01:00
Erwin Douna
fb615817b4 Add Tado error handling to fetching devices (#105546) 2023-12-12 10:55:22 +01:00
Erwin Douna
9d44dc4437 Add Fast.com Device Info (#105528)
Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2023-12-12 10:41:00 +01:00
Erik Montnemery
6908497c3d Add minor version to config entries (#105479) 2023-12-12 08:44:35 +01:00
Khole
ac656847cb Bump pyhiveapi to v0.5.16 (#105513)
Co-authored-by: Khole Jones <khole.jones@frasers.group>
2023-12-12 08:38:12 +01:00
J. Nick Koston
e2abd3b8d0 Bump bluetooth libraries (#105522) 2023-12-12 08:31:23 +01:00
Jan-Philipp Benecke
4859226496 Migrate geonetnz_* tests to use freezegun (#105521) 2023-12-12 08:30:08 +01:00
Jan-Philipp Benecke
319d6db55b Migrate device_sun_light_trigger tests to use freezegun (#105520) 2023-12-12 08:29:10 +01:00
Jan Bouwhuis
a66c9bb7b6 Update stale doc strings in entity platform tests (#105526) 2023-12-12 08:28:08 +01:00
J. Nick Koston
f4ee2a1ab4 Bump anyio to 4.1.0 (#105529) 2023-12-12 08:24:24 +01:00
dependabot[bot]
324aa171c6 Bump sigstore/cosign-installer from 3.2.0 to 3.3.0 (#105537)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-12 08:20:26 +01:00
Diogo Gomes
54c218c139 Updates V2C sensor icons (#105534)
update icons
2023-12-12 08:17:09 +01:00
Brett Adams
8922c93259 Improve tests in Tessie (#105430) 2023-12-11 20:30:54 -10:00
Julien "_FrnchFrgg_" Rivaud
bf9c2a08b7 Bump caldav to 1.3.8 (#105508)
* Bump caldav to 1.3.8

1.3.8 fixes a bug where duplicate STATUS properties would be emitted for a single VTODO depending on the case of the arguments used.

That bug meant that even though that is the intended API usage, passing lowercase for the status argument name would be rejected by caldav servers checking conformance with the spec which forbids duplicate STATUS.

This in turn prevented HomeAssistant to add new items to a caldav todo list.

Bump the requirements to 1.3.8 to repair that feature

* Update global requirements
2023-12-11 19:42:52 -08:00
Erik Montnemery
d4cf049016 Remove unneeded class _EntityDescriptionBase (#105518) 2023-12-11 23:10:11 +01:00
Maciej Bieniek
bf93929826 Add support for Shelly Gen3 devices (#104874)
* Add support for Gen3 devices

* Add RPC_GENERATIONS const

* Add gen3 to tests

* More tests

* Add BLOCK_GENERATIONS const

* Use *_GENERATIONS constants from aioshelly
2023-12-11 22:58:56 +01:00
Erwin Douna
662e19999d Add Fastdotcom DataUpdateCoordinator (#104839)
* Adding DataUpdateCoordinator

* Updating and adding test cases

* Optimizing test

* Fix typing

* Prevent speedtest at startup

* Removing typing on Coordinator

* Update homeassistant/components/fastdotcom/coordinator.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Putting back typing

* Update homeassistant/components/fastdotcom/__init__.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Adding proper StateType typing

* Fix linting

* Stricter typing

* Creating proper test case for coordinator

* Fixing typo

* Patching librbary

* Adding unavailable state test

* Putting back in asserts

* Update tests/components/fastdotcom/test_coordinator.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Update tests/components/fastdotcom/test_coordinator.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Update tests/components/fastdotcom/test_coordinator.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Update tests/components/fastdotcom/test_coordinator.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Update tests/components/fastdotcom/test_coordinator.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Coordinator workable proposal

* Update tests/components/fastdotcom/test_coordinator.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Working test cases

* Update tests/components/fastdotcom/test_coordinator.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Update tests/components/fastdotcom/test_coordinator.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Update tests/components/fastdotcom/test_coordinator.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Update tests/components/fastdotcom/test_coordinator.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Fixing tests and context

* Fix the freezer interval to 59 minutes

* Fix test

---------

Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2023-12-11 22:28:04 +01:00
Joost Lekkerkerker
a187a39f0b Add config flow to Suez water (#104730)
* Add config flow to Suez water

* fix tests

* Complete coverage

* Change version to 2024.7

* Fix final test

* Add issue when import is successful

* Move hassdata

* Do unique_id

* Remove import issue when entry already exists

* Remove import issue when entry already exists
2023-12-11 22:06:16 +01:00
J. Nick Koston
e890671192 Relocate Bluetooth manager to habluetooth library (#105110)
* Relocate Bluetooth manager to habluetooth library

* Relocate Bluetooth manager to habluetooth library

* Relocate Bluetooth manager to habluetooth library

* fixes

* fix patching time

* fix more tests

* fix more tests

* split

* Bump habluetooth to 0.7.0

changelog: https://github.com/Bluetooth-Devices/habluetooth/compare/v0.6.1...v0.7.0

This is the big change that will move the manager so the HA
PR that will follow this will be a bit larger than the rest of them
since the manager is connected to everything

* fix types

* fix types

* fix types

* fix patch targets

* fix flakey logbook tests (will need another PR)

* mock shutdown

* bump again

* value can be a float now

* Revert "value can be a float now"

This reverts commit b7e7127143bd2947345c7590fc2727aa47e28d88.

* float
2023-12-11 15:42:00 -05:00
Erwin Douna
0dc61b3493 Add typing in Melcloud config flow (#105510)
* Add typing in config flow

* Patching functions with typing
2023-12-11 20:30:19 +01:00
Erik Montnemery
dd338799d4 Make it possible to inherit EntityDescription in frozen and mutable dataclasses (#105211) 2023-12-11 20:00:55 +01:00
Joakim Plate
bb0d082b25 Correctly report unavailable battery for value 255 of percentage (#104566)
* Ignore unavailable battery level for zha

* Adjust unavailable test
2023-12-11 19:17:06 +01:00
Stefan Agner
837ce99e30 Add Raspberry Pi 5 specific container image (#105488) 2023-12-11 17:39:48 +01:00
starkillerOG
d1ea04152a Bump reolink_aio to 0.8.3 (#105489) 2023-12-11 17:37:15 +01:00
Marc Mueller
6c2b3ef950 Update typing-extensions to 4.9.0 (#105490) 2023-12-11 17:30:24 +01:00
Michael Hansen
80607f7750 Disconnect before reconnecting to satellite (#105500)
Disconnect before reconnecting
2023-12-11 11:18:46 -05:00
Marc Mueller
b71f488d3e Update pylint to 3.0.3 (#105491) 2023-12-11 17:04:07 +01:00
Erik Montnemery
94fd7d0353 Improve test of config entry store (#105487)
* Improve test of config entry store

* Tweak test
2023-12-11 10:48:12 -05:00
Alex Thompson
4c0fda9ca0 Fix Lyric LCC thermostats auto mode (#104853) 2023-12-11 16:27:02 +01:00
jan iversen
3963f59121 Reduce modbus validator for "swap" (remove special handling) (#105021) 2023-12-11 16:12:32 +01:00
Stefan Agner
44e54e11d8 Follow Alpine 3.18 raspberrypi package updates (#105486)
Alpine 3.18 renamed the packages raspberrypi and raspberrypi-libs to
raspberrypi-userland and raspberrypi-userland-libs respectively. Follow
that rename. With this moderniziation raspistill and friends now gets
deployed to /usr/bin, which makes any symlinks obsolete.

Note that there is and was never a 64-bit variant of raspistill. So
these symlinks were essentially useless all along.

This effectively doesn't change anything for users: Alpine automatically
installed the renamed package already and Home Assistant Core picked
up the raspistill binary from /usr/bin already.
2023-12-11 15:58:51 +01:00
Denis Shulyaka
1242456ff1 Bump openai end switch from dall-e-2 to dall-e-3 (#104998)
* Bump openai

* Fix tests

* Apply suggestions from code review

* Undo conftest changes

* Raise repasir issue

* Explicitly use async mock for chat.completions.create

It is not always detected correctly as async because it uses a decorator

* removed duplicated message

* ruff

* Compatibility with old pydantic versions

* Compatibility with old pydantic versions

* More tests

* Apply suggestions from code review

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

* Apply suggestions from code review

---------

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2023-12-11 09:47:26 -05:00
G Johansson
c0314cd05c Make Workday UI setup nicer (#105407) 2023-12-11 14:06:29 +01:00
Jan Rieger
cedac41407 Bump python-holidays to 0.38 (#105482) 2023-12-11 13:18:23 +01:00
Joost Lekkerkerker
32681acc79 Remove Aftership import issue when entry already exists (#105476) 2023-12-11 12:09:43 +01:00
Jan-Philipp Benecke
47819bde4f Migrate sonarr tests to use freezegun (#105410) 2023-12-11 10:47:51 +01:00
Jan-Philipp Benecke
b4731674f8 Migrate octoprint tests to use freezegun (#105408) 2023-12-11 10:42:16 +01:00
Bouwe Westerdijk
3e3f9cf092 Bump plugwise to v0.35.3 (#105442) 2023-12-11 10:29:50 +01:00
Jan-Philipp Benecke
fbfe434e8b Migrate tag & tts tests to use freezegun (#105411) 2023-12-11 09:09:23 +01:00
Jon Caruana
c89c2f9392 Bump pylitejet to v0.6.0 (#105472) 2023-12-11 08:40:13 +01:00
J. Nick Koston
c634e3f0ca Bump zeroconf to 0.128.4 (#105465)
* Bump zeroconf to 0.128.3

significant bug fixes

changelog: https://github.com/python-zeroconf/python-zeroconf/compare/0.128.0...0.128.3

* .4
2023-12-11 07:47:53 +01:00
Allen Porter
72c6eb8885 Bump ical to 6.1.1 (#105462) 2023-12-10 15:46:27 -08:00
Jan Schneider
77c722630e Check if heat area exists when setting up valve opening and battery sensors in moehlenhoff alpha2 (#105437)
Check whether the referenced heat area exists

when setting up valve opening and battery sensors
2023-12-10 23:59:54 +01:00
Brandon Rothweiler
58d9d0daa5 Add reauth to A. O. Smith integration (#105320)
* Add reauth to A. O. Smith integration

* Validate reauth uses the same email address

* Only show password field during reauth
2023-12-10 14:30:24 -08:00
Erik Montnemery
b5af987a18 Bump hatasmota to 0.8.0 (#105440)
* Bump hatasmota to 0.8.0

* Keep devices with deep sleep support always available

* Add tests
2023-12-10 23:16:06 +01:00
Allen Porter
4752d37df7 Fix fitbit oauth reauth debug logging (#105450) 2023-12-10 23:09:58 +01:00
Jan Bouwhuis
a7155b154e Fix alexa calling not featured cover services (#105444)
* Fix alexa calls not supported cover services

* Follow up comment and additional tests
2023-12-10 17:27:01 +01:00
Florian B
063ac53f01 Fix adding/updating todo items with due date in CalDAV integration (#105435)
* refactor: return date/datetime for due date

* fix: explicitly set due date on vTODO component

Using `set_due` automatically handles converting the Python-native
date/datetime values to the correct representation required by RFC5545.

* fix: fix tests with changed due date handling

* fix: item.due may not be a str

* refactor: keep local timezone of due datetime

* refactor: reorder import statement

To make ruff happy.

* fix: fix false-positive mypy error
2023-12-10 08:23:05 -08:00
Franck Nijhof
6a3c422d2f Improve Amazon Alexa endpoint validation (#105287)
* Improve Amazon Alexa endpoint validation

* Add source comment

---------

Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
2023-12-10 13:38:10 +01:00
Jan-Philipp Benecke
ff85d0c290 Migrate mqtt tests to use freezegun (#105414) 2023-12-10 09:25:16 +01:00
Brett Adams
1cc47c0553 Add reauth to Tessie (#105419)
* First pass at Tessie

* Working POC

* async_step_reauth

* Config Flow tests

* WIP

* Add test requirement

* correctly gen test requirements

* 100% coverage

* Remove remnants of copy paste

* Add TPMS

* Fix docstring

* Remove redundant line

* Fix some more copied docstrings

* Grammar

* Create reusable StrEnum

* Streamline get

* Add a couple more sensors

* Removed need for a model

* Move MODELS

* Remove DOMAIN from config flow

* Add translation strings

* Remove unused parameter

* Simplify error handling

* Refactor coordinator to class

* Add missing types

* Add icon to shift state

* Simplify setdefault

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

* Use walrus for async_unload_platforms

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

* Reformat entity init

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

* Remove Unique ID

* Better Config Flow Tests

* Fix all remaining tests

* Standardise docstring

* Remove redudnant test

* Set TessieDataUpdateCoordinator on entity

* Correct some sensors

* add error types

* Make shift state a ENUM sensor

* Add more sensors

* Fix translation string

* Add precision suggestions

* Move session from init to coordinator

* Add api_key type

* Remove api_key parameter

* Meta changes

* Update TessieEntity and TessieSensor translations

* Goodbye translation keys

* bump tessie-api to 0.0.9

* Fix only_active to be True

* Per vehicle coordinator

* Rework coordinator

* Fix coverage

* WIP

* The grand rework

* Add comments

* Use ENUM more

* Add ENUM translations

* Update homeassistant/components/tessie/sensor.py

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

* Add entity_category

* Remove reauth

* Remove session

* Update homeassistant/components/tessie/__init__.py

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

* Add property tag

* Add error text

* Complete config flow tests

* Fix property and rename

* Fix init test

* Reworked coordinator tests

* Add extra checks

* Update homeassistant/components/tessie/__init__.py

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

* Update homeassistant/components/tessie/coordinator.py

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

* Apply suggestions from code review

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

* Ruff fix

* Update homeassistant/components/tessie/config_flow.py

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

* Remove future ENUMs

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

* Ruff fix

* Update homeassistant/components/tessie/config_flow.py

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

* Remove reauth and already configured strings

* Lowercase sensor values for translation

* Update homeassistant/components/tessie/__init__.py

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

* Fixed, before using lambda

* Add value lambda

* fix lambda

* Fix config flow test

* @bdraco fix for 500 errors

* format

* Add reauth

* Reuse string in reauth

* Ruff

* remove redundant check

* Improve error tests

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2023-12-09 23:37:57 -08:00
elmurato
7b32e4142e Make API init async in Minecraft Server (#105403)
* Make api init async

* Remove duplicate assignment of address and set server to None in constructor
2023-12-09 21:15:48 -08:00
Jan-Philipp Benecke
a8148cea65 Migrate roku tests to use freezegun (#105418) 2023-12-09 12:47:19 -10:00
Brett Adams
64a5271a51 Add Tessie Integration (#104684)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-12-09 12:46:32 -10:00
vexofp
327016eaeb Accept HTTP 200 through 206 as success for RESTful Switch (#105358) 2023-12-09 12:45:33 -10:00
Raman Gupta
4e1677e3f0 Remove zwave_js device on device reset (#104291)
* Reload zwave_js config entry on device reset

* remove device

* Just remove the device and don't reload

* revert change to notification message

* Assert device is no longer there
2023-12-09 23:33:31 +01:00
vexofp
885410bcfc Prevent duplicate default SSLContext instances (#105348)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-12-09 11:30:12 -10:00
Jan-Philipp Benecke
a090bcb8a5 Migrate time_date tests to use freezegun (#105409) 2023-12-09 21:35:52 +01:00
J. Nick Koston
a0bf170fb4 Avoid ffmpeg subprocess for many component tests (#105354) 2023-12-09 19:41:37 +01:00
mkmer
c96a588934 Fix service missing key in Blink (#105387)
* fix update service
refactor service yaml

* Remove leftover target
2023-12-09 19:18:59 +01:00
Maciej Bieniek
35b733fa2c Bump aioshelly to version 7.0.0 (#105384)
* Remove get_rpc_device_sleep_period() function

* Bump aioshelly version to 7.0.0

* Remove firmware compatibility check from BLE scanner

* Remove firmware compatibility check from light transition

* Update default fw ver

* Use LightEntityFeature in tests
2023-12-09 17:12:05 +02:00
G Johansson
f37f40c338 Fix preset modes error in Smartthings (#105375) 2023-12-09 13:49:32 +01:00
starkillerOG
25586f9efd Add data descriptions to Reolink (#105298) 2023-12-09 13:06:18 +01:00
Jan-Philipp Benecke
b5785003a3 Migrate unifi tests to use freezegun (#105343) 2023-12-09 12:55:40 +01:00
Marc Mueller
1eaf208450 Update freezegun to 1.3.1 (#105377) 2023-12-09 12:29:23 +01:00
Brett Adams
d54c36307a Fix the ruff-format error (#105376) 2023-12-09 11:53:47 +01:00
Jan-Philipp Benecke
2d02cdcd0d Migrate gree tests to use freezegun (#105340) 2023-12-09 10:19:42 +01:00
J. Nick Koston
cc85e89cf2 Make network fixture scoped to session to speed up tests (#105353) 2023-12-09 10:19:08 +01:00
Jan-Philipp Benecke
4d708f1931 Migrate template tests to use freezegun (#105341) 2023-12-09 09:47:28 +01:00
Lucas Mindêllo de Andrade
f567bf6dfe Sun WEG integration (#88272)
* feat(sunweg): initial support

* chore: removed commented out code

* chore: removed warning

* fix: set never_resets for total sensors

* test: some tests

* fix(sunweg): default plantid type

* fix(sunweg): return first plant id

* test(sunweg): improved code coverage

* chore(sunweg): missing FlowResult return type

* chore(sunweg): removed unused strings

* perf(sunweg): using only one api instance

* chore(sunweg): removed uneeded atribute

* refact(sunweg): small refactoring

* refact(sunweg): typing

* chore(sunweg): comments

* chore(sunweg): bump version

* chore(sunweg): bump lib version

* test(sunweg): different mocking and coverage

* test: fixed setup component parameter

* feat: dynamic metrics

* fix(sunweg): ruff

* fix(sunweg): mypy

* refact(sunweg): codereview suggestions

* chore(sunweg): removed unused string

* chore(sunweg): typehint and code formatting
2023-12-09 09:45:40 +01:00
David Knowles
906aa14b43 Bump pyschlage to 2023.12.0 (#105349)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-12-08 22:01:40 -10:00
vexofp
617b045727 Fix SSLCipherList typing error in IMAP coordinator (#105362) 2023-12-08 21:34:01 -10:00
Brett Adams
e1df1f9ffe Replace aiohttp mock with patch in Advantage Air (#104932)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-12-08 15:15:57 -10:00
mkmer
6a6956573f Add missing configuration for services.yaml in blink (#105310) 2023-12-08 21:30:41 +01:00
Viktor Andersson
12019ec77c Add myself as code owner for co2signal (#105302) 2023-12-08 21:22:34 +01:00
Jan-Philipp Benecke
a7845406a5 Migrate homeassistant component tests to use freezegun (#105333) 2023-12-08 21:18:09 +01:00
Bouwe Westerdijk
46e75ed94b Bump plugwise to v0.34.5 (#105330) 2023-12-08 21:15:33 +01:00
G Johansson
99cf4a6b2d Add rollback on exception that needs rollback in SQL (#104948) 2023-12-08 21:13:37 +01:00
Jan Bouwhuis
4bb0e13cda Workaround to_json template filter in parsing dict key (#105327)
* Work-a-round orjson for `to_json` fiter in case dict key is str subclass

* Add option instead

* Remove json.dumps work-a-round

* Update homeassistant/helpers/template.py

* Fix test

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2023-12-08 20:57:53 +01:00
Erik Montnemery
af715a4b9a Add workaround for orjson not handling subclasses of str (#105314)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-12-08 18:13:34 +01:00
Excentyl
46d626280e Initialize energy_state without price (#97031)
Co-authored-by: Erik <erik@montnemery.com>
2023-12-08 17:46:08 +01:00
Brandon Rothweiler
1c7bd3f729 Add A. O. Smith integration (#104976) 2023-12-08 17:17:42 +01:00
Michael Hansen
fdeb9e36c3 Use area id for context instead of name (#105313) 2023-12-08 10:05:21 -06:00
Jan Bouwhuis
e5a115ce1f Fix mqtt json light state updates using deprecated color handling (#105283) 2023-12-08 16:54:02 +01:00
Erik Montnemery
b0ef9623f9 Add test for energy cost sensor for late price sensor (#105312) 2023-12-08 16:51:07 +01:00
Paul Bottein
05f67f745b Update frontend to 20231208.2 (#105299) 2023-12-08 16:45:34 +01:00
Raj Laud
45f7ffb34c Add support for accessing Squeezebox over over https (#95088)
* Supports access to squeezebox server behind https reverse proxy

* Update squeezebox test

* Update homeassistant/components/squeezebox/config_flow.py

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

* Update homeassistant/components/squeezebox/config_flow.py

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

* Update squeezebox unit tests based on code review

* Migration unit test

* Run black on suggestions accepted in code review

* Apply suggestions from code review

Instead of upgrading squeezebox config, just assume a default of https=False.

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

* Update test_init.py

Remove migrate entry test since we are no longer migrating

* Delete tests/components/squeezebox/test_init.py

Remove unused test

---------

Co-authored-by: Robert Resch <robert@resch.dev>
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2023-12-08 15:51:19 +01:00
Øyvind Matheson Wergeland
a10f580815 Always set _attr_current_option in Nobø Hub select entities (#105289)
Always set _attr_current_option in select entities.
2023-12-08 14:42:42 +01:00
Jan-Philipp Benecke
6b7dace8d4 Migrate samsungtv tests to use freezegun (#105286) 2023-12-08 14:37:02 +01:00
Jan Bouwhuis
8721327176 Fix CI test_invalid_rrule_fix test by freezing the time (#105294) 2023-12-08 14:35:01 +01:00
Yuxin Wang
88ddc25129 Replace apcaccess dependency with aioapcaccess in apcupsd (#104571)
* Replace apcaccess dependency with async version aioapcaccess

* Upgrade the dependency to the latest version (v0.4.2)

* Handle asyncio.IncompleteReadError
2023-12-08 12:40:09 +01:00
Franck Nijhof
949ca6bafc Update yarl to 1.9.4 (#105282) 2023-12-08 12:11:59 +01:00
Øyvind Matheson Wergeland
9fb9ff4f90 Remove workaround for default lock code in Matter (#105173)
* Matter: Remove workaround for default lock code

* Review

* Review 2
2023-12-08 11:46:27 +01:00
Franck Nijhof
0eb7034f89 Adjust stale bot policy for PRs (#105280) 2023-12-08 10:59:38 +01:00
Duco Sebel
156dac394a Add migration for old HomeWizard sensors (#105251)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-12-08 09:39:39 +01:00
Lars
a09ccddaa3 Fix Fritzbox light setup (#105232) 2023-12-08 09:33:24 +01:00
ollo69
b29e9e2df0 Fix AsusWrt invalid data type with tuple type (#105247) 2023-12-08 09:01:22 +01:00
J. Nick Koston
97991cfa46 Bump pyunifiprotect to 4.22.0 (#105265) 2023-12-08 09:00:23 +01:00
J. Nick Koston
8aacd3ea1b Bump habluetooth to 0.10.0 (#105118) 2023-12-08 08:56:32 +01:00
dependabot[bot]
8879f7350a Bump github/codeql-action from 2.22.8 to 2.22.9 (#105274)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-08 08:55:25 +01:00
dependabot[bot]
a710491990 Bump actions/stale from 8.0.0 to 9.0.0 (#105275)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-08 08:54:27 +01:00
osohotwateriot
664d2410d5 Add OSO Energy integration (#70365)
* Add OSO Energy integration

* Add min/max for v40 level and bump pyosoenergyapi to 1.0.2

* OSO Energy address review comments

* Bump pyosoenergyapi to 1.0.3 and remove scan interval

* Remove unnecessary code

* Update homeassistant/components/osoenergy/__init__.py

Co-authored-by: Daniel Hjelseth Høyer <mail@dahoiv.net>

* Fixes to latest version

* Add support to set temperature

* Update homeassistant/components/osoenergy/config_flow.py

Co-authored-by: Daniel Hjelseth Høyer <mail@dahoiv.net>

* Fixes after review

* Remove unused code

* Add support for translations and modify services

* Apply suggestions from code review

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

* Refactor services and constants according to the PR suggestions

* Remove unnecessary code

* Remove unused import in constants

* Refactoring and support for multiple instances

* Apply suggestions from code review

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

* Refactor code and apply review suggestions

* Bump pyosoenergyapi to 1.0.5

* Remove services to reduce initial PR

* Remove extra state attributes and make OSO Entity generic

---------

Co-authored-by: Daniel Hjelseth Høyer <github@dahoiv.net>
Co-authored-by: Daniel Hjelseth Høyer <mail@dahoiv.net>
Co-authored-by: Robert Resch <robert@resch.dev>
2023-12-08 08:51:59 +01:00
Michael Hansen
43daeb2630 Set device id and forward errors to Wyoming satellites (#105266)
* Set device id and forward errors

* Fix tests
2023-12-07 19:44:43 -06:00
Michael Hansen
e9f8e7ab50 Add Wyoming satellite audio settings (#105261)
* Add noise suppression level

* Add auto gain and volume multiplier

* Always use mock TTS dir in Wyoming tests

* More tests
2023-12-07 17:02:55 -05:00
Jan-Philipp Benecke
d1aa690c24 Migrate non-component tests to use freezegun/freezer (#105142) 2023-12-07 22:58:09 +01:00
Joost Lekkerkerker
00e87b9dff Migrate Gree to has entity name (#104739)
* Migrate Gree to has entity name

* Migrate Gree to has entity name
2023-12-07 22:47:52 +01:00
On Freund
c4d77877d2 Fix update of uncategorized OurGroceries items (#105255)
* Fix update of uncategorized OurGroceries items

* Address code review comments
2023-12-07 22:11:08 +01:00
Jan-Philipp Benecke
8a4b761c78 Use freezegun in cert_expiry tests (#105125) 2023-12-07 21:55:37 +01:00
Michael Hansen
4c4ad9404f Don't return TTS URL in Assist pipeline (#105164)
* Don't return TTS URL

* Add test for empty queue
2023-12-07 15:28:04 -05:00
Jan-Philipp Benecke
6666b796f2 Migrate auth tests to use freezegun (#105243) 2023-12-07 21:18:10 +01:00
G Johansson
2daa94b600 Fix check_date service in workday (#105241)
* Fix check_date service in workday

* Add test
2023-12-07 20:04:39 +01:00
Jan-Philipp Benecke
dd902bc956 Explicit check for None in Discovergy entity if condition (#105248)
Fix checking for None in Discovergy
2023-12-07 19:47:14 +01:00
haimn
83a1ca5e83 fix supportedFanOscillationModes is null (#105205)
* fix supportedFanOscillationModes is null

* set default supported_swings to None

* return None if no fan oscillation modes listed
2023-12-07 18:03:07 +01:00
Klaas Schoute
d86abf214b Bump energyzero lib to v2.1.0 (#105228) 2023-12-07 15:22:30 +01:00
Klaas Schoute
d80547519a Bump easyenergy lib to v2.1.0 (#105224) 2023-12-07 14:57:08 +01:00
Erik Montnemery
84329844fd Disable config flow progress in peco config flow (#105222) 2023-12-07 13:25:23 +01:00
Franck Nijhof
72b0904b41 Merge branch 'master' into dev 2023-12-07 11:15:00 +01:00
Greg Dowling
334673154c Fix bug in roon incremental volume control. (#105201) 2023-12-07 11:00:26 +01:00
dewdrop
de758fd7b3 Add Seattle City Light virtual integration via Opower (#104997) 2023-12-07 10:39:54 +01:00
jimmyd-be
d61814a1ed Add custom services for renson fans (#94497)
Co-authored-by: Robert Resch <robert@resch.dev>
2023-12-07 09:57:01 +01:00
Jan-Philipp Benecke
0728106c98 Increase ping update interval to 30 seconds (#105199) 2023-12-07 09:50:21 +01:00
Duco Sebel
f8c216a5ea Use brightness scaling util in HomeWizard Number entity (#105147) 2023-12-07 09:37:20 +01:00
Jan Bouwhuis
f48e948871 Correct smtp error message string (#105148) 2023-12-07 09:35:22 +01:00
Mick Vleeshouwer
e40f486968 Disable scenarios (scenes) for local API in Overkiz (#105153) 2023-12-07 09:33:33 +01:00
dependabot[bot]
316776742f Bump actions/setup-python from 4.8.0 to 5.0.0 (#105193)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-07 09:27:48 +01:00
Duco Sebel
3d5329755f Add extra tests for HomeWizard for unsupported entity creation (#105149) 2023-12-07 09:24:27 +01:00
Michael Hansen
ebde8ccfe4 Expose todo entities to Assist by default (#105150) 2023-12-07 09:22:03 +01:00
Robert Svensson
2a8a60b381 Improve LIDL christmas light detection in deCONZ (#105155) 2023-12-07 09:19:38 +01:00
Quentame
f420dcbedc Bump Météo-France to 1.3.0 (#105170) 2023-12-07 09:18:34 +01:00
Cían Hughes
e051244927 Add Modbus fan speed support (#104577)
Co-authored-by: jan iversen <jancasacondor@gmail.com>
2023-12-07 08:19:03 +01:00
Sebastian Nohn
22119a2fd8 Set ping interval to 15 seconds instead of 5 minutes (#105191)
set ping interval to a more sane value of 15 seconds instead of 5 minutes. fixes home-assistant/core#105163
2023-12-07 07:44:19 +01:00
starkillerOG
0b6665ed09 Bump reolink_aio to 0.8.2 (#105157) 2023-12-07 07:39:37 +01:00
Matrix
4666d7e17f Bump yolink-api to 0.3.4 (#105124)
* Bump yolink-api to 0.3.3

* bump yolink api to 0.3.4
2023-12-07 07:30:27 +01:00
TheJulianJES
9181933619 Fix ZHA quirk ID custom entities matching all devices (#105184) 2023-12-07 07:15:31 +01:00
lunmay
16f6a57924 Fix missing apostrophe in smtp (#105189)
Fix missing apostrophe
2023-12-07 07:12:27 +01:00
Jan-Philipp Benecke
05e122e22b Modernize and cleanup trend tests (#105010)
Co-authored-by: Em <emmanuel.sciara@gmail.com>
2023-12-06 18:46:35 +01:00
TJ Horner
32febcda5a Bump apple_weatherkit to 1.1.2 (#105140) 2023-12-06 18:36:46 +01:00
Tucker Kern
ff21c02cb6 Add preset modes to ESPHome fan entities (#103781)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-12-06 06:53:52 -10:00
Marc Mueller
c93abd9d20 Improve decorator type annotations [zwave_js] (#104825)
* Improve decorator type annotations [zwave_js]

* Improve _async_get_entry annotation
2023-12-06 16:22:32 +01:00
Joost Lekkerkerker
6721f9fdb2 Bump python-opensky to 1.0.0 (#105131) 2023-12-06 16:21:12 +01:00
Paul Bottein
297a7638ca Update frontend to 20231206.0 (#105132) 2023-12-06 14:51:36 +01:00
Jan-Philipp Benecke
a16819e0e5 Use freezegun in utility_meter tests (#105123) 2023-12-06 14:43:26 +01:00
Franck Nijhof
3f28354a00 Fix missing target in todo.remove_completed_items service (#105127) 2023-12-06 14:39:27 +01:00
Xidorn Quan
eb00259356 Bump thermopro-ble to 0.5.0 (#105126) 2023-12-06 13:30:31 +01:00
Ville Skyttä
a29695e622 Add Huawei LTE network mode select (#104614)
* Convert network mode from sensor to select for huawei_lte

This also introduces the select platform to huawei_lte integration.

* Move (networkmode, str) mapping to const

Also, rebase on top of the current dev

* Fix variable naming, initialize name

* Fix wrong key for router access

* Typing fixes

* Adapt to current way of registering subscriptions

* Simplify option management, make translatable

* Make use of custom entity description

* Add icon

* Revert sensor formatting changes, move to another PR

* Improve entity class naming

* Add test

* Make sure entity descriptions define a setter function

---------

Co-authored-by: Teemu Rytilahti <tpr@iki.fi>
2023-12-06 14:23:26 +02:00
Jan Rieger
81d05acd07 Address late review for Holiday (#105121) 2023-12-06 12:39:46 +01:00
Tobias Perschon
7424c296b7 Add missing services and strings entries for reply_to_message_id (#105072) 2023-12-06 11:01:05 +01:00
David Bonnes
88a4b74d4b bump evohome-async to 0.4.15 (#105119) 2023-12-06 10:32:10 +01:00
dependabot[bot]
a904461b6a Bump actions/setup-python from 4.7.1 to 4.8.0 (#105117)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-06 08:28:02 +01:00
J. Nick Koston
bf8f78c041 Fix flakey logbook tests (#105111) 2023-12-06 08:15:48 +01:00
J. Nick Koston
a528183556 Bump habluetooth to 0.8.0 (#105109) 2023-12-06 08:15:24 +01:00
Michael Hansen
3fda43ef33 Bump intents to 2023.12.05 (#105116) 2023-12-06 08:14:34 +01:00
J. Nick Koston
2401a09600 Bump aioesphomeapi to 19.3.0 (#105114) 2023-12-06 08:13:35 +01:00
Klaas Schoute
9a3b4939a9 Update easyenergy lib to v2.0.0 (#105108) 2023-12-06 07:35:29 +01:00
lunmay
ad26af608b Fix typo in v2c strings.json (#105104)
fo -> of
2023-12-05 16:25:08 -05:00
Tudor Sandu
636e38f4b3 Trigger Home Assistant shutdown automations right before the stop event instead of during it (#91165)
Co-authored-by: Erik <erik@montnemery.com>
2023-12-05 11:24:41 -10:00
Robert Svensson
44810f9772 Bump aiounifi to v67 (#105099)
* Bump aiounifi to v67

* Fix mypy
2023-12-05 22:16:07 +01:00
jimmyd-be
712a401ee2 Bump renson library to version 1.7.1 (#105096) 2023-12-05 21:06:29 +01:00
TJ Horner
19e193ae1d Increase frequency of weatherkit updates (#105094) 2023-12-05 09:45:26 -10:00
TJ Horner
eadcceeed1 Update apple_weatherkit to 1.1.1 (#105079) 2023-12-05 09:45:00 -10:00
Jan Bouwhuis
be44de0a41 Fix overkiz measurement sensor returns None if 0 (#105090) 2023-12-05 20:00:53 +01:00
J. Nick Koston
3c635fdbf2 Split bluetooth manager so it can be extracted into the habluetooth lib (#105015) 2023-12-05 19:54:50 +01:00
J. Nick Koston
94d168e20e Move Bluetooth advertisement tracker to habluetooth library (#105083) 2023-12-05 19:53:29 +01:00
Michael
3310f4c130 Add significant Change support for weather (#104840) 2023-12-05 19:17:52 +01:00
Erik Montnemery
1edfaed7be Improve raise contains mocks (#105078)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-12-05 19:14:35 +01:00
Klaas Schoute
d4cbe89c2f Update energyzero lib to v2.0.0 (#105080) 2023-12-05 19:14:13 +01:00
Bram Kragten
dd37205a42 Update frontend to 20231205.0 (#105081) 2023-12-05 18:52:52 +01:00
Jan-Philipp Benecke
dc17780e5b Remove device from known_devices upon import in ping device tracker (#105009)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-12-05 18:52:22 +01:00
J. Nick Koston
b6245c834d Move local bluetooth scanner code into habluetooth library (#104970) 2023-12-05 07:19:02 -10:00
Erik Montnemery
428c184c75 Improve yamaha tests (#105077) 2023-12-05 07:17:56 -10:00
Erik Montnemery
5b55c7da5f Remove logic converting empty or falsy YAML to empty dict (#103912)
* Correct logic converting empty YAML to empty dict

* Modify according to github comments

* Add load_yaml_dict helper

* Update check_config script

* Update tests
2023-12-05 18:08:11 +01:00
Joost Lekkerkerker
a8ca73a7dd Finish scaffold config flow with either abort or create entry (#105012) 2023-12-05 17:13:29 +01:00
Robert Hillis
651df6b698 Add calendar entity to Radarr (#79077)
* Add calendar entity to Radarr

* address feedback/add tests

* black

* uno mas

* rework to coordinator

* uno mas

* move release atttribute writing

* fix calendar items and attributes
2023-12-05 07:51:51 -08:00
Erik Montnemery
3bcc6194ef Add domain key config validation (#104242)
* Drop use of regex in helpers.extract_domain_configs

* Update test

* Revert test update

* Add domain_from_config_key helper

* Add validator

* Address review comment

* Update snapshots

* Inline domain_from_config_key in validator
2023-12-05 15:07:32 +01:00
Erik Montnemery
25bea91683 Use modern platform path when reporting platform config errors (#104238)
* Use modern platform path when reporting platform config errors

* Update tests

* Address review comment

* Explicitly pass platform domain to log helpers

* Revert overly complicated changes

* Try a simpler solution
2023-12-05 15:06:13 +01:00
dupondje
db9d6b401a Add optional dsmr timestamp sensor (#104979)
* Add optional timestamp sensor

* Apply suggestions from code review

Remove "timestamp" translation

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

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-12-05 14:28:57 +01:00
GeoffAtHome
c4fbc78c05 Fix geniushub smart plug state at start-up (#102110)
* Smart plug did state wrong at start-up

* Update docstring to reflect code
2023-12-05 14:03:39 +01:00
Marc Mueller
6e0ba8e726 Improve matrix typing (#105067) 2023-12-05 13:40:14 +01:00
Thomas Zahari
f460fdf632 Add fields cancelled & extra to result of the departure HVV sensor (#105030) 2023-12-05 13:15:16 +01:00
jan iversen
0638088aee Deprecate and remove lazy_error from modbus (#105037) 2023-12-05 13:08:33 +01:00
Erik Montnemery
5b59e043fa Don't use deprecated_class decorator on deprecated YAML classes (#105063) 2023-12-05 11:36:26 +01:00
Erik Montnemery
ae002e2f38 Remove breaks_in_ha_version from deprecated YAML classes (#105062) 2023-12-05 10:48:31 +01:00
Jan-Philipp Benecke
5cab64bfcd Make season types translatable (#105027) 2023-12-05 09:48:46 +01:00
Robert Svensson
4b87936779 Fix stuck clients in UniFi options (#105028) 2023-12-05 09:42:43 +01:00
J. Nick Koston
9b53fa6478 Bump habluetooth to 0.6.1 (#105029) 2023-12-05 09:30:21 +01:00
J. Nick Koston
c2cc8014dc Avoid double URL creation for hassio ingress (#105052) 2023-12-05 09:29:43 +01:00
Marco
b7bc49b863 Fix Mikrotik rename from wifiwave2 to wifi for upcoming RouterOS 7.13 (#104966)
Co-authored-by: Marco98 <Marco98@users.noreply.github.com>
2023-12-05 09:21:03 +01:00
Robert Svensson
482e087a85 Make unifi RX-/TX-sensors diagnostic entities (#105022) 2023-12-05 08:55:15 +01:00
Robert Svensson
e80ee09f5e Make UniFi WiFi clients numerical (#105032) 2023-12-05 08:50:32 +01:00
Erik Montnemery
84e74e4c74 Reverse component path (#104087)
* Reverse component path

* Update translations helper

* Fix

* Revert incorrect change of PLATFORM_FORMAT

* Fix use of PLATFORM_FORMAT in tts

* Fix ios
2023-12-05 08:43:58 +01:00
Michael Hansen
a9381d2590 Add Wyoming satellite (#104759)
* First draft of Wyoming satellite

* Set up homeassistant in tests

* Move satellite

* Add devices with binary sensor and select

* Add more events

* Add satellite enabled switch

* Fix mistake

* Only set up necessary platforms for satellites

* Lots of fixes

* Add tests

* Use config entry id as satellite id

* Initial satellite test

* Add satellite pipeline test

* More tests

* More satellite tests

* Only support single device per config entry

* Address comments

* Make a copy of platforms
2023-12-04 15:13:15 -05:00
Aaron Godfrey
677c50a7cc Exclude Todoist sub-tasks for the todo platform (#104914) 2023-12-04 20:37:09 +01:00
Erik Montnemery
35e2f591c1 Make cv.string return subclasses of str as is (#103916) 2023-12-04 20:36:16 +01:00
Marcel van der Veldt
516966db33 Add Matter custom cluster sensors (Eve Energy Plug energy measurements) (#104830)
* Support for sensors from custom clusters in Matter

* lint

* no need to write state twice

* Add test for eve energy plug

* Update homeassistant/components/matter/entity.py

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

* adjust comment

* debounce extra poll timer

* use async_call_later helper

* Update homeassistant/components/matter/entity.py

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

* wip extend test

* Update test_sensor.py

* fix state class for sensors

* trigger (fake) event callback on all subscribers

* Update eve-energy-plug.json

* add test for additionally polled value

* adjust delay to 3 seconds

* Adjust subscribe_events to always use kwargs

* Update tests/components/matter/common.py

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

* Update test_sensor.py

* remove redundant code

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-12-04 17:21:41 +01:00
Jan Bouwhuis
7d21ed41a2 Refactor lock default code handling (#104807) 2023-12-04 14:59:51 +01:00
Bartosz Dokurno
13fdac23c1 Update Todoist config flow URL (#104992) 2023-12-04 14:58:37 +01:00
c0ffeeca7
188d6a6eee W-Z: add host field description (#104996) 2023-12-04 14:48:56 +01:00
jan iversen
1629bdcd7f Remove "swap: none" from modbus (#104713) 2023-12-04 14:48:40 +01:00
Bram Kragten
157c4e31df Update frontend to 20231204.0 (#104990) 2023-12-04 13:10:51 +01:00
c0ffeeca7
8661aa96bd U-V add host field description (#104872)
Co-authored-by: Simone Chemelli <simone.chemelli@gmail.com>
2023-12-04 13:10:22 +01:00
Erik Montnemery
95f7db1970 Move config_per_platform and extract_domain_configs to config.py (#104989) 2023-12-04 12:48:49 +01:00
tronikos
53becaa976 Bump opower==0.0.40 (#104986) 2023-12-04 12:32:08 +01:00
Jan Bouwhuis
e8475b9b33 Add scaling utils for brightness and fanspeed (#104753)
Co-authored-by: Robert Resch <robert@resch.dev>
2023-12-04 12:10:58 +01:00
c0ffeeca7
7222e2b2d6 T-add host field description (#104871) 2023-12-04 11:52:54 +01:00
Erik Montnemery
db51a8e1f7 Allow passing breaks_in_ha_version to deprecation helper decorators (#104985) 2023-12-04 11:52:10 +01:00
Jan Bouwhuis
d8a6d864c0 Raise on smtp notification if attachment is not allowed (#104981)
* Raise smtp notification if attachment not allowed

* Pass url as placeholder

* Use variable in err message

* Add allow_list as placeholder
2023-12-04 11:48:29 +01:00
Matthias Dunda
0f3cb9b1b6 Add telegram message timestamp to event data (#87493) 2023-12-04 10:53:59 +01:00
c0ffeeca7
bf49a3dcc2 Solar-Log to Soundtouch: add host field description (#104863) 2023-12-04 10:48:58 +01:00
Erik Montnemery
34d01719f2 Minor improvements of deprecation helper (#104980) 2023-12-04 10:47:49 +01:00
c0ffeeca7
7ac8f191bd Modern Forms to MyStrom: add host field description (#104856) 2023-12-04 10:46:49 +01:00
c0ffeeca7
ff84b82027 Squeezebox to Synology DSM: add host field description (#104864)
Co-authored-by: Michael <35783820+mib1185@users.noreply.github.com>
Co-authored-by: Jan-Philipp Benecke <jan-philipp@bnck.me>
Co-authored-by: Raj Laud <50647620+rajlaud@users.noreply.github.com>
2023-12-04 10:45:43 +01:00
c0ffeeca7
3cba10fa20 Lifx, Lutron: add host field description (#104855) 2023-12-04 10:44:52 +01:00
starkillerOG
3316f6980d Do not fail if Reolink ONVIF cannot be connected (#104947) 2023-12-04 10:44:29 +01:00
c0ffeeca7
bf63674af2 Nanoleaf to Nut: add host field description (#104857)
Co-authored-by: starkillerOG <starkiller.og@gmail.com>
2023-12-04 10:38:52 +01:00
c0ffeeca7
ab4c6cddf2 Radio Thermostat to Renson: add host field description (#104860) 2023-12-04 10:37:51 +01:00
c0ffeeca7
9b9d9c6116 Reolink to Ruckus: add host field description (#104861)
Co-authored-by: starkillerOG <starkiller.og@gmail.com>
2023-12-04 10:37:02 +01:00
J. Nick Koston
b0d0f15911 Bump dbus-fast to 2.20.0 (#104978) 2023-12-03 22:53:47 -10:00
Eric Härtel
557e9337bc Add CB3 descriptor to ZHA manifest (#104071) 2023-12-04 09:48:44 +01:00
Patrick Decat
8e42105b2d Fix incompatible 'measurement' state and 'volume' device class warnings in Overkiz (#104896) 2023-12-04 09:45:59 +01:00
Jan Bouwhuis
9c9d8669ec Link second Hue host field description (#104885) 2023-12-04 09:36:41 +01:00
Jirka
91463566c0 Update balboa strings.json (#104977) 2023-12-04 09:14:24 +01:00
c0ffeeca7
7ae6343b25 Obihai to OpenGarage: add host field description (#104858)
Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
2023-12-04 09:13:48 +01:00
Richard Kroegel
6335c24568 Bump bimmer-connected to 0.14.6 (#104961)
Co-authored-by: rikroe <rikroe@users.noreply.github.com>
2023-12-04 09:13:27 +01:00
J. Nick Koston
67039e0f26 Remove monotonic_time_coarse datetime helper (#104892) 2023-12-04 09:10:13 +01:00
Kevin Worrel
3b5e498c30 Bump screenlogicpy to v0.10.0 (#104866) 2023-12-04 09:07:46 +01:00
David Bonnes
6fd96f856d Bump evohome-async to 0.4.13 (#104960)
bump client to 0.4.13
2023-12-04 08:48:47 +01:00
J. Nick Koston
401c890364 Bump habluetooth to 0.5.1 (#104969)
* bump lib

* bump again to be patchable
2023-12-04 08:42:07 +01:00
Brett Adams
453f91a3ae Add virtual integration Fujitsu anywAIR (#102978)
Add anywair
2023-12-04 08:09:15 +01:00
Joost Lekkerkerker
374b1cfd0c Fix bug in config flow scaffold (#104965) 2023-12-04 07:48:05 +01:00
Joost Lekkerkerker
b56cd169ac Use constants in config flow scaffold (#104964) 2023-12-04 07:46:36 +01:00
Jan Bouwhuis
fe2906f159 Do not allow smtp to access insecure files (#104972) 2023-12-03 20:06:01 -05:00
J. Nick Koston
c1f68c3767 Bump habluetooth to 0.4.0 (#104958) 2023-12-03 12:18:10 -10:00
Alex Thompson
23cd66c54b Fix Lyric HVAC mode reset on temperature change (#104910)
* Fix Lyric HVAC mode reset on temperature change

* Reduce code duplication

* Revert additional bugfix

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

---------

Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
2023-12-03 22:13:26 +01:00
Joost Lekkerkerker
833805f9be Add StreamLabsWater to strict typing (#104957) 2023-12-03 21:10:37 +01:00
jjlawren
ecc49e61f6 Bump plexapi to 4.15.6 (#104949) 2023-12-03 21:05:30 +01:00
J. Nick Koston
28584ad240 Relocate base Bluetooth scanner code into an external library (#104930) 2023-12-03 10:00:11 -10:00
J. Nick Koston
c8bb72935d Bump bluetooth-data-tools to 1.17.0 (#104935) 2023-12-03 08:53:17 -10:00
Jan Rieger
244edb488b Add Holiday integration (#103795)
* Add Holiday integration

* Localize holiday names

* Changes based on review feedback

* Add tests

* Add device info

* Bump holidays to 0.36

* Default to Home Assistant country setting

* Update homeassistant/components/holiday/calendar.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Update homeassistant/components/holiday/calendar.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Update homeassistant/components/holiday/config_flow.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* black

* Move time

* Stop creating duplicate holiday calendars

* Set default language using python-holiday

* Use common translation

* Set _attr_name to None to fix friendly name

* Fix location

* Update homeassistant/components/holiday/__init__.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Update homeassistant/components/holiday/calendar.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Update homeassistant/components/holiday/calendar.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Update tests/components/holiday/test_init.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* cleanup

* Set up the integration and test the state

* Test that configuring more than one instance is rejected

* Set default_language to user's language, fallback to country's default language

* Improve tests

* Update homeassistant/components/holiday/calendar.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Cleanup

* Add next year so we don't run out

* Update tests/components/holiday/test_init.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Cleanup

* Set default language in `__init__`

* Add strict typing

* Change default language: HA's language `en` is `en_US` in holidays, apart from Canada

* CONF_PROVINCE can be None

* Fix test

* Fix default_language

* Refactor tests

* Province can be None

* Add test for translated title

* Address feedback

* Address feedback

* Change test to use service call

* Address feedback

* Apply suggestions from code review

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Changes based on review feedback

* Update homeassistant/components/holiday/calendar.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Update homeassistant/components/holiday/calendar.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Add a test if next event is missing

* Rebase

* Set device to service

* Remove not needed translation key

---------

Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2023-12-03 16:28:53 +01:00
G Johansson
67784def13 Only raise issue if switch used in Logitech Harmony Hub (#104941) 2023-12-03 11:57:48 +01:00
Jan Bouwhuis
5d6791e412 Remove CONF_PRECISION remainder from dsmr (#104919) 2023-12-03 11:53:09 +01:00
J. Nick Koston
edb52bb364 Bump zeroconf to 0.128.0 (#104936) 2023-12-03 11:51:34 +01:00
Jan Rieger
a5fe68c354 Bump python-holidays to 0.37 (#104937) 2023-12-03 11:15:07 +01:00
J. Nick Koston
dd9c22672a Refactor bluetooth scanners for better seperation of concerns (#104909) 2023-12-02 13:20:06 -10:00
Erwin Douna
7a9c3819e0 Add MELCloud token refresh upon firmware upgrade (#104391)
* Adding initial setup

* Update homeassistant/components/melcloud/__init__.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Adding ConfigEntryNotReady exception

* Update homeassistant/components/melcloud/__init__.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Update homeassistant/components/melcloud/config_flow.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Update homeassistant/components/melcloud/__init__.py

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* Placing exception handling in setup_entry

* Expanding test cases

---------

Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2023-12-02 23:07:06 +01:00
Dave T
b48ad268b5 Add alarm sensor to Aurora ABB (#104503)
* Add new sensors

* Add strings

* Fix tests

* Only add alarm sensor, & refactor

* Address review comments

* Address review comments.

* Fix ruff
2023-12-02 23:04:37 +01:00
Christopher Fenner
7480945465 Add number entities for program temperature in ViCare integration (#103960)
* add number platform

* Update .coveragerc

* reset default value

* fix default value

* cast Any value to float

* Apply suggestions from code review

* Update strings.json

* add translation keys

* remove obsolete unique id handling

* add eco program

* reset type

* remove name from entity

* Update strings.json

* Update strings.json

* rename

* Apply suggestions from code review

Co-authored-by: G Johansson <goran.johansson@shiftit.se>

* retype getter

* adjust interface

* use device classes

* check setter

* Revert "check setter"

This reverts commit 360e33315987c086d923992a4ced888886636627.

* remove eco entity

* Update strings.json

* add eco sensor entity

* Revert "add eco sensor entity"

This reverts commit d64b38c548d0cdc56571b7c75fa026b1bb755f42.

* Update strings.json

---------

Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2023-12-02 22:44:49 +01:00
Jan Bouwhuis
c9306049b3 Correct SerialException import in dsmr, firmata, landysgyr_heat_meater and rfxtrx integrations (#104889)
* Fix SerialException import in dsmr integration

* Fix imports firmata, landysgyr_heat_meter, rfxtrx
2023-12-02 19:30:04 +01:00
Jan Bouwhuis
5106dd173c Fix dsmr zero reconnect interval option could crash HA (#104900)
* Fix dsmr zero interval option could crash HA

* No change change the options
2023-12-02 19:28:56 +01:00
Marc Mueller
559e8dfc69 Improve decorator type annotations [esphome] (#104878) 2023-12-02 06:57:58 -10:00
Marc Mueller
e9d4a02bb1 Adjust roku type hint (#104877) 2023-12-02 10:37:44 -05:00
G Johansson
06d663d33f Fix get_events name in calendar strings (#104902) 2023-12-02 10:35:52 -05:00
starkillerOG
381036e46a Reolink only fetch data for enabled entities (#104157) 2023-12-02 14:10:44 +01:00
J. Nick Koston
a3dd2b8ea9 Migrate to using faster monotonic_time_coarse from bluetooth-data-tools (#104882) 2023-12-01 10:57:09 -10:00
c0ffeeca7
e724414475 SamsungTV to Snapcast: add host field description (#104862) 2023-12-01 16:45:53 +01:00
Marc Mueller
5014e2f0c7 Fix powerwall typing (#104875) 2023-12-01 05:42:50 -10:00
Michael
dc708b8a18 Fix handling of unrecognized mimetypes in Synology DSM photos integration (#104848) 2023-12-01 15:58:15 +01:00
J. Nick Koston
970751a635 Bump bluetooth-data-tools to 0.16.0 (#104854) 2023-12-01 04:44:58 -07:00
starkillerOG
742e2dbbe4 Reolink schedule update after firmware update (#104867) 2023-12-01 12:26:18 +01:00
c0ffeeca7
450bc8dd2c Ping to Qnap: add host field description (#104859) 2023-12-01 12:18:34 +01:00
Niccolò Maggioni
0232c8dcb0 Add temperature to the light color mode parameter fallbacks (#86026)
* Add color temperature to the color mode fallbacks

* Manually add ATTR_COLOR_TEMP since ATTR_COLOR_TEMP_KELVIN is pre-parsed

* Include the legacy ATTR_COLOR_TEMP attribute in the tests

* Apply suggestions from code review

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

* Add citation for McCamy's approximation formula

If still existing, also see page 3 of https://www.st.com/resource/en/application_note/an5638-how-correlated-color-temperature-is-calculated-by-vd6283-stmicroelectronics.pdf

* Update homeassistant/util/color.py

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2023-12-01 08:26:07 +01:00
Franck Nijhof
7ec2980e52 Change pytest fixture scope from core fixtures (#104831) 2023-12-01 07:14:13 +01:00
Jan Bouwhuis
1273bc8ec4 Let executor CI test pass under worse conditions (#104849) 2023-11-30 20:05:26 -10:00
Jan Bouwhuis
7767bb328d Filter out zero readings for DSMR enery sensors (#104843) 2023-11-30 23:42:51 +01:00
Erik Montnemery
00e57ab9a4 Use deprecated_class decorator in deprecated YAML loader classes (#104835) 2023-11-30 22:43:34 +01:00
mkmer
99f28c7163 Late review updates for Blink (#104755) 2023-11-30 22:40:41 +01:00
Daniel Hjelseth Høyer
3e95c1c705 Bump Mill library (#104836) 2023-11-30 22:39:54 +01:00
Robert Hillis
b0f5b78b9a Fix Harmony switch removal version (#104838) 2023-11-30 22:21:34 +01:00
cdnninja
ea732349c9 Vesync constant cleanup (#104842) 2023-11-30 22:19:02 +01:00
Marcel van der Veldt
4829b21fd0 Update Matter test fixtures to schema version 5 (#104829) 2023-11-30 20:08:58 +01:00
Franck Nijhof
cd1ee70707 Use orjson to load HomeWizard test fixtures (#104832) 2023-11-30 19:58:33 +01:00
Marc Mueller
ca9d58c442 Improve decorator type annotations [sensibo] (#104824) 2023-11-30 19:06:36 +01:00
Joost Lekkerkerker
fed8e5e873 Always create APCUPS device (#104716) 2023-11-30 18:51:23 +01:00
Marc Mueller
2496c275c8 Improve decorator type annotations [core] (#104826) 2023-11-30 18:50:31 +01:00
Marc Mueller
46ba62a3c0 Improve decorator type annotations [sabnzbd] (#104823) 2023-11-30 18:47:58 +01:00
Marc Mueller
6ffc298986 Improve decorator type annotations [matter] (#104822) 2023-11-30 18:47:18 +01:00
Maciej Bieniek
8e2f4a347c Address late review for the host field description in Shelly integration (#104815)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2023-11-30 18:46:18 +01:00
Mappenhei
9bdb713408 Add Humidity device class to LaCross humidity sensor (#104814) 2023-11-30 18:45:52 +01:00
Marc Mueller
d597cfec49 Improve decorator type annotations (#104821) 2023-11-30 18:45:18 +01:00
Franck Nijhof
4bc1e5075a Revert "Add Komfovent (#95722)" (#104819) 2023-11-30 18:45:04 +01:00
Sergiy Maysak
689c0d14ec Added typing for return value for async_migrate func. (#104828) 2023-11-30 18:19:10 +01:00
David Bonnes
f50cd5ab5e Bump evohome-async to 0.4.9 (#103660) 2023-11-30 18:17:34 +01:00
Erik Montnemery
abc05451a2 Restore renamed yaml loader classes and warn when used (#104818) 2023-11-30 18:14:48 +01:00
cdnninja
9447d954d6 Add codeowner to vesync (#104809) 2023-11-30 18:14:22 +01:00
Bram Kragten
99523c96a2 Update frontend to 20231130.0 (#104816) 2023-11-30 17:49:31 +01:00
Erik Montnemery
12902b8a68 Add NodeStrClass.__voluptuous_compile__ (#104808) 2023-11-30 17:45:27 +01:00
Maciej Bieniek
b7bf1e9f3f Make Shelly Wall Display thermostat implementation compatible with firmware 1.2.5 (#104812) 2023-11-30 17:26:07 +01:00
c0ffeeca7
3133585d52 Enphase to Evil: add host field description (#104779)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-30 17:25:04 +01:00
c0ffeeca7
0c08081386 Deconz to DoorBird: add host field description (#104772)
* Deconz to DoorBird: add host field description

* Update homeassistant/components/deconz/strings.json

Co-authored-by: Robert Svensson <Kane610@users.noreply.github.com>

---------

Co-authored-by: Robert Svensson <Kane610@users.noreply.github.com>
2023-11-30 17:24:21 +01:00
Erwin Douna
b3d64c3949 Fix Fastdotcom no entity (#104785)
Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2023-11-30 17:11:28 +01:00
Marcel van der Veldt
b31d805de1 Bump python-matter-server to version 5.0.0 (#104805) 2023-11-30 17:09:53 +01:00
Michael
7ec6510221 Add significant Change support for remote (#104627) 2023-11-30 17:09:06 +01:00
c0ffeeca7
419dc8adb1 Freebox to FRITZ!Box add host field description (#104784)
Co-authored-by: Simone Chemelli <simone.chemelli@gmail.com>
2023-11-30 17:05:32 +01:00
c0ffeeca7
41fb8d50cc Goalzero to HEOS: add host field description (#104786) 2023-11-30 17:04:15 +01:00
c0ffeeca7
b9ab28150e iAlarm to Keenetic: add host field description (#104791)
Co-authored-by: Andrey Kupreychik <foxel@quickfox.ru>
2023-11-30 17:03:27 +01:00
Marcel van der Veldt
52450291cb Fix device sync to Google Assistant if Matter integration is active (#104796)
* Only get Matter device info if device is an actual Matter device

* Return None if matter device does not exist

* lint

* fix test

* adjust google assistant test
2023-11-30 16:59:26 +01:00
c0ffeeca7
cc2c7c7be1 KMtronic to LG Soundbar: add host field description (#104792) 2023-11-30 16:57:44 +01:00
c0ffeeca7
3bbed8965a Frontier to Glances: add host field description (#104787)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-30 16:55:53 +01:00
Jonas Fors Lellky
25ebbda3a9 Add Flexit bacnet integration (#104275)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
Co-authored-by: Piotr Buliński <piotr@bulinski.no>
Co-authored-by: Piotr Buliński <piotr@qbee.io>
2023-11-30 16:50:13 +01:00
c0ffeeca7
1c78848c43 HLK to Hyperion: add host field description (#104789)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-30 16:38:40 +01:00
Jan-Philipp Benecke
f59588b413 Make the minimum number of samples used by the trend sensor configurable (#101102)
* Make the minimum of samples configurable & raise issue when min_samples > max_samples

* Wording

* Remove issue creation and use a custom schema validator

* Remove issue from strings.json

* Add test for validator and fix error message
2023-11-30 15:41:58 +01:00
Charles Garwood
aa4382e091 Use .get for Fully Kiosk SSL settings in coordinator (#104801) 2023-11-30 14:22:17 +01:00
starkillerOG
fa7a74c611 Cleanup Reolink formatting (late review) (#104793)
cleanup
2023-11-30 13:54:37 +01:00
Michael
68e883dc63 Fix runtime error in CalDAV (#104800) 2023-11-30 13:50:58 +01:00
Sergiy Maysak
1ab9357840 Fix wirelesstag unique_id to use uuid instead of tag_id (#104394)
Co-authored-by: Robert Resch <robert@resch.dev>
2023-11-30 12:14:46 +01:00
c0ffeeca7
d1a2192e37 FiveM to Foscam: add host field description (#104782) 2023-11-30 11:59:20 +01:00
starkillerOG
69af4c8603 Add common reolink entity description (#104142)
Co-authored-by: Robert Resch <robert@resch.dev>
2023-11-30 11:26:33 +01:00
c0ffeeca7
dd00357e9c Ecoforest to Emonitor: add host field description (#104778) 2023-11-30 09:44:18 +01:00
c0ffeeca7
da93daaa75 Dremel to Duotecno: add host field description (#104776)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-30 09:43:42 +01:00
c0ffeeca7
56350d1c0a Broadlink, BSB-Lan: add host field description (#104770) 2023-11-30 08:47:37 +01:00
c0ffeeca7
8bc1f9d03d Comelit, Coolmaster: add host field description (#104771) 2023-11-30 08:47:17 +01:00
Joost Lekkerkerker
6ac9a1d1f2 Migrate GDACS to has entity name (#104733) 2023-11-30 08:22:16 +01:00
c0ffeeca7
2f0846bd87 Axis: add host and user name field description (#104693) 2023-11-30 08:12:39 +01:00
Allen Porter
64a6a6a778 Add due date and description fields to Todoist To-do entity (#104655)
* Add Todoist Due date and description fields

* Update entity features with new names

* Make items into walrus

* Update due_datetime field

* Add additional tests for adding new fields to items

* Fix call args in todoist test
2023-11-30 07:01:57 +01:00
Allen Porter
c72e4e8b5c Fix bug in rainbird device ids that are int serial numbers (#104768) 2023-11-30 06:11:38 +01:00
starkillerOG
9fa163c107 Reolink cleanup when CAM disconnected from NVR (#103888)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2023-11-30 01:50:37 +01:00
Christopher Fenner
ec647677e9 Update initial translation for ViCare water heater entity (#104696) 2023-11-30 01:38:33 +01:00
Daniel Gangl
b957c4e3ee Bump zamg to 0.3.3 (#104756) 2023-11-30 01:31:39 +01:00
Michael Hansen
d793203163 Skip TTS when text is empty (#104741)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2023-11-30 01:31:27 +01:00
Jan Bouwhuis
04f1b11ef7 Debug level logging for DSMR migration code (#104757) 2023-11-30 00:32:12 +01:00
Franck Nijhof
ec3795ab97 Revert "Add proj dependency to our wheels builder (#104699)" (#104704) 2023-11-29 23:16:58 +01:00
Charles Garwood
e8091a47db Bump pynws to 1.6.0 (#104679) 2023-11-29 23:13:05 +01:00
Rami Mosleh
2437fb314f Add strict typing to push bullet (#99538)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-29 23:05:10 +01:00
Allen Porter
c8aed06438 Add due date and description to Google Tasks (#104654)
* Add tests for config validation function

* Add Google Tasks due date and description

* Revert test timezone

* Update changes after upstream

* Update homeassistant/components/google_tasks/todo.py

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

* Add google tasks tests for creating

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-29 22:37:43 +01:00
Joost Lekkerkerker
8e64eff626 Add entity translations to faa_delays (#104749) 2023-11-29 22:23:46 +01:00
Joost Lekkerkerker
9126b00dfe Move Faa delays state attributes to entity description (#104748) 2023-11-29 22:01:03 +01:00
Florian
7638b9bba1 Fix Philips TV none recordings_list (#104665)
Correct for missing recordings list in api client.
---------

Co-authored-by: Joakim Plate <elupus@ecce.se>
2023-11-29 21:54:05 +01:00
Joost Lekkerkerker
bdf4c61a05 Add faa_delays to strict typing (#104720) 2023-11-29 21:41:32 +01:00
Franck Nijhof
0a98a648bb Bump version to 2024.1.0dev0 (#104746) 2023-11-29 21:29:11 +01:00
2290 changed files with 70518 additions and 17911 deletions

View File

@@ -173,6 +173,7 @@ omit =
homeassistant/components/coinbase/sensor.py
homeassistant/components/comed_hourly_pricing/sensor.py
homeassistant/components/comelit/__init__.py
homeassistant/components/comelit/alarm_control_panel.py
homeassistant/components/comelit/const.py
homeassistant/components/comelit/cover.py
homeassistant/components/comelit/coordinator.py
@@ -337,7 +338,6 @@ omit =
homeassistant/components/escea/__init__.py
homeassistant/components/escea/climate.py
homeassistant/components/escea/discovery.py
homeassistant/components/esphome/bluetooth/*
homeassistant/components/esphome/manager.py
homeassistant/components/etherscan/sensor.py
homeassistant/components/eufy/*
@@ -364,8 +364,6 @@ omit =
homeassistant/components/faa_delays/binary_sensor.py
homeassistant/components/faa_delays/coordinator.py
homeassistant/components/familyhub/camera.py
homeassistant/components/fastdotcom/sensor.py
homeassistant/components/fastdotcom/__init__.py
homeassistant/components/ffmpeg/camera.py
homeassistant/components/fibaro/__init__.py
homeassistant/components/fibaro/binary_sensor.py
@@ -404,6 +402,9 @@ omit =
homeassistant/components/fjaraskupan/sensor.py
homeassistant/components/fleetgo/device_tracker.py
homeassistant/components/flexit/climate.py
homeassistant/components/flexit_bacnet/__init__.py
homeassistant/components/flexit_bacnet/const.py
homeassistant/components/flexit_bacnet/climate.py
homeassistant/components/flic/binary_sensor.py
homeassistant/components/flick_electric/__init__.py
homeassistant/components/flick_electric/sensor.py
@@ -419,6 +420,7 @@ omit =
homeassistant/components/fortios/device_tracker.py
homeassistant/components/foscam/__init__.py
homeassistant/components/foscam/camera.py
homeassistant/components/foscam/coordinator.py
homeassistant/components/foursquare/*
homeassistant/components/free_mobile/notify.py
homeassistant/components/freebox/camera.py
@@ -536,6 +538,7 @@ omit =
homeassistant/components/hvv_departures/binary_sensor.py
homeassistant/components/hvv_departures/sensor.py
homeassistant/components/ialarm/alarm_control_panel.py
homeassistant/components/iammeter/const.py
homeassistant/components/iammeter/sensor.py
homeassistant/components/iaqualink/binary_sensor.py
homeassistant/components/iaqualink/climate.py
@@ -754,6 +757,9 @@ omit =
homeassistant/components/motion_blinds/cover.py
homeassistant/components/motion_blinds/entity.py
homeassistant/components/motion_blinds/sensor.py
homeassistant/components/motionmount/__init__.py
homeassistant/components/motionmount/entity.py
homeassistant/components/motionmount/number.py
homeassistant/components/mpd/media_player.py
homeassistant/components/mqtt_room/sensor.py
homeassistant/components/msteams/notify.py
@@ -799,7 +805,8 @@ omit =
homeassistant/components/netgear/sensor.py
homeassistant/components/netgear/switch.py
homeassistant/components/netgear/update.py
homeassistant/components/netgear_lte/*
homeassistant/components/netgear_lte/__init__.py
homeassistant/components/netgear_lte/notify.py
homeassistant/components/netio/switch.py
homeassistant/components/neurio_energy/sensor.py
homeassistant/components/nexia/climate.py
@@ -900,6 +907,9 @@ omit =
homeassistant/components/opple/light.py
homeassistant/components/oru/*
homeassistant/components/orvibo/switch.py
homeassistant/components/osoenergy/__init__.py
homeassistant/components/osoenergy/const.py
homeassistant/components/osoenergy/water_heater.py
homeassistant/components/osramlightify/light.py
homeassistant/components/otp/sensor.py
homeassistant/components/overkiz/__init__.py
@@ -1026,6 +1036,12 @@ omit =
homeassistant/components/recorder/repack.py
homeassistant/components/recswitch/switch.py
homeassistant/components/reddit/sensor.py
homeassistant/components/refoss/__init__.py
homeassistant/components/refoss/bridge.py
homeassistant/components/refoss/coordinator.py
homeassistant/components/refoss/entity.py
homeassistant/components/refoss/switch.py
homeassistant/components/refoss/util.py
homeassistant/components/rejseplanen/sensor.py
homeassistant/components/remember_the_milk/__init__.py
homeassistant/components/remote_rpi_gpio/*
@@ -1209,6 +1225,7 @@ omit =
homeassistant/components/starline/__init__.py
homeassistant/components/starline/account.py
homeassistant/components/starline/binary_sensor.py
homeassistant/components/starline/button.py
homeassistant/components/starline/device_tracker.py
homeassistant/components/starline/entity.py
homeassistant/components/starline/lock.py
@@ -1226,8 +1243,12 @@ omit =
homeassistant/components/stream/fmp4utils.py
homeassistant/components/stream/hls.py
homeassistant/components/stream/worker.py
homeassistant/components/streamlabswater/*
homeassistant/components/suez_water/*
homeassistant/components/streamlabswater/__init__.py
homeassistant/components/streamlabswater/binary_sensor.py
homeassistant/components/streamlabswater/coordinator.py
homeassistant/components/streamlabswater/sensor.py
homeassistant/components/suez_water/__init__.py
homeassistant/components/suez_water/sensor.py
homeassistant/components/supervisord/sensor.py
homeassistant/components/supla/*
homeassistant/components/surepetcare/__init__.py
@@ -1235,6 +1256,8 @@ omit =
homeassistant/components/surepetcare/entity.py
homeassistant/components/surepetcare/sensor.py
homeassistant/components/swiss_hydrological_data/sensor.py
homeassistant/components/swiss_public_transport/__init__.py
homeassistant/components/swiss_public_transport/coordinator.py
homeassistant/components/swiss_public_transport/sensor.py
homeassistant/components/swisscom/device_tracker.py
homeassistant/components/switchbee/__init__.py
@@ -1286,7 +1309,9 @@ omit =
homeassistant/components/system_bridge/notify.py
homeassistant/components/system_bridge/sensor.py
homeassistant/components/system_bridge/update.py
homeassistant/components/systemmonitor/__init__.py
homeassistant/components/systemmonitor/sensor.py
homeassistant/components/systemmonitor/util.py
homeassistant/components/tado/__init__.py
homeassistant/components/tado/binary_sensor.py
homeassistant/components/tado/climate.py
@@ -1375,10 +1400,6 @@ omit =
homeassistant/components/tradfri/light.py
homeassistant/components/tradfri/sensor.py
homeassistant/components/tradfri/switch.py
homeassistant/components/trafikverket_train/__init__.py
homeassistant/components/trafikverket_train/coordinator.py
homeassistant/components/trafikverket_train/sensor.py
homeassistant/components/trafikverket_train/util.py
homeassistant/components/trafikverket_weatherstation/__init__.py
homeassistant/components/trafikverket_weatherstation/coordinator.py
homeassistant/components/trafikverket_weatherstation/sensor.py
@@ -1413,6 +1434,8 @@ omit =
homeassistant/components/ukraine_alarm/__init__.py
homeassistant/components/ukraine_alarm/binary_sensor.py
homeassistant/components/unifiled/*
homeassistant/components/unifi_direct/__init__.py
homeassistant/components/unifi_direct/device_tracker.py
homeassistant/components/upb/__init__.py
homeassistant/components/upb/light.py
homeassistant/components/upc_connect/*

View File

@@ -29,7 +29,7 @@ jobs:
fetch-depth: 0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
@@ -59,7 +59,7 @@ jobs:
uses: actions/checkout@v4.1.1
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
@@ -124,7 +124,7 @@ jobs:
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
if: needs.init.outputs.channel == 'dev'
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
@@ -197,7 +197,7 @@ jobs:
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build base image
uses: home-assistant/builder@2023.09.0
uses: home-assistant/builder@2023.12.0
with:
args: |
$BUILD_ARGS \
@@ -247,6 +247,7 @@ jobs:
- raspberrypi3-64
- raspberrypi4
- raspberrypi4-64
- raspberrypi5-64
- tinker
- yellow
- green
@@ -273,7 +274,7 @@ jobs:
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build base image
uses: home-assistant/builder@2023.09.0
uses: home-assistant/builder@2023.12.0
with:
args: |
$BUILD_ARGS \
@@ -330,7 +331,7 @@ jobs:
uses: actions/checkout@v4.1.1
- name: Install Cosign
uses: sigstore/cosign-installer@v3.2.0
uses: sigstore/cosign-installer@v3.3.0
with:
cosign-release: "v2.0.2"

View File

@@ -36,7 +36,7 @@ env:
CACHE_VERSION: 5
PIP_CACHE_VERSION: 4
MYPY_CACHE_VERSION: 6
HA_SHORT_VERSION: "2023.12"
HA_SHORT_VERSION: "2024.1"
DEFAULT_PYTHON: "3.11"
ALL_PYTHON_VERSIONS: "['3.11', '3.12']"
# 10.3 is the oldest supported version
@@ -225,7 +225,7 @@ jobs:
uses: actions/checkout@v4.1.1
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
@@ -269,7 +269,7 @@ jobs:
- name: Check out code from GitHub
uses: actions/checkout@v4.1.1
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
@@ -309,7 +309,7 @@ jobs:
- name: Check out code from GitHub
uses: actions/checkout@v4.1.1
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
@@ -348,7 +348,7 @@ jobs:
- name: Check out code from GitHub
uses: actions/checkout@v4.1.1
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
@@ -443,7 +443,7 @@ jobs:
uses: actions/checkout@v4.1.1
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
with:
python-version: ${{ matrix.python-version }}
check-latest: true
@@ -511,7 +511,7 @@ jobs:
uses: actions/checkout@v4.1.1
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
@@ -543,7 +543,7 @@ jobs:
uses: actions/checkout@v4.1.1
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
@@ -576,7 +576,7 @@ jobs:
uses: actions/checkout@v4.1.1
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
@@ -620,7 +620,7 @@ jobs:
uses: actions/checkout@v4.1.1
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
@@ -702,7 +702,7 @@ jobs:
uses: actions/checkout@v4.1.1
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
with:
python-version: ${{ matrix.python-version }}
check-latest: true
@@ -854,7 +854,7 @@ jobs:
uses: actions/checkout@v4.1.1
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
with:
python-version: ${{ matrix.python-version }}
check-latest: true
@@ -978,7 +978,7 @@ jobs:
uses: actions/checkout@v4.1.1
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
with:
python-version: ${{ matrix.python-version }}
check-latest: true

View File

@@ -29,11 +29,11 @@ jobs:
uses: actions/checkout@v4.1.1
- name: Initialize CodeQL
uses: github/codeql-action/init@v2.22.8
uses: github/codeql-action/init@v3.22.12
with:
languages: python
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2.22.8
uses: github/codeql-action/analyze@v3.22.12
with:
category: "/language:python"

View File

@@ -11,16 +11,16 @@ jobs:
if: github.repository_owner == 'home-assistant'
runs-on: ubuntu-latest
steps:
# The 90 day stale policy for PRs
# The 60 day stale policy for PRs
# Used for:
# - PRs
# - No PRs marked as no-stale
# - No issues (-1)
- name: 90 days stale PRs policy
uses: actions/stale@v8.0.0
- name: 60 days stale PRs policy
uses: actions/stale@v9.0.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
days-before-stale: 90
days-before-stale: 60
days-before-close: 7
days-before-issue-stale: -1
days-before-issue-close: -1
@@ -33,7 +33,11 @@ jobs:
pull request has been automatically marked as stale because of that
and will be closed if no further activity occurs within 7 days.
Thank you for your contributions.
If you are the author of this PR, please leave a comment if you want
to keep it open. Also, please rebase your PR onto the latest dev
branch to ensure that it's up to date with the latest changes.
Thank you for your contribution!
# Generate a token for the GitHub App, we use this method to avoid
# hitting API limits for our GitHub actions + have a higher rate limit.
@@ -53,7 +57,7 @@ jobs:
# - No issues marked as no-stale or help-wanted
# - No PRs (-1)
- name: 90 days stale issues
uses: actions/stale@v8.0.0
uses: actions/stale@v9.0.0
with:
repo-token: ${{ steps.token.outputs.token }}
days-before-stale: 90
@@ -83,7 +87,7 @@ jobs:
# - No Issues marked as no-stale or help-wanted
# - No PRs (-1)
- name: Needs more information stale issues policy
uses: actions/stale@v8.0.0
uses: actions/stale@v9.0.0
with:
repo-token: ${{ steps.token.outputs.token }}
only-labels: "needs-more-information"

View File

@@ -22,7 +22,7 @@ jobs:
uses: actions/checkout@v4.1.1
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v4.7.1
uses: actions/setup-python@v5.0.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}

View File

@@ -1,6 +1,6 @@
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.1.6
rev: v0.1.8
hooks:
- id: ruff
args:

View File

@@ -43,11 +43,15 @@ homeassistant.components.abode.*
homeassistant.components.accuweather.*
homeassistant.components.acer_projector.*
homeassistant.components.actiontec.*
homeassistant.components.adax.*
homeassistant.components.adguard.*
homeassistant.components.aftership.*
homeassistant.components.air_quality.*
homeassistant.components.airly.*
homeassistant.components.airnow.*
homeassistant.components.airthings_ble.*
homeassistant.components.airvisual.*
homeassistant.components.airvisual_pro.*
homeassistant.components.airzone.*
homeassistant.components.airzone_cloud.*
homeassistant.components.aladdin_connect.*
@@ -59,10 +63,14 @@ homeassistant.components.ambient_station.*
homeassistant.components.amcrest.*
homeassistant.components.ampio.*
homeassistant.components.analytics.*
homeassistant.components.android_ip_webcam.*
homeassistant.components.androidtv_remote.*
homeassistant.components.anova.*
homeassistant.components.anthemav.*
homeassistant.components.apcupsd.*
homeassistant.components.apprise.*
homeassistant.components.aqualogic.*
homeassistant.components.aranet.*
homeassistant.components.aseko_pool_live.*
homeassistant.components.assist_pipeline.*
homeassistant.components.asuswrt.*
@@ -75,6 +83,7 @@ homeassistant.components.bayesian.*
homeassistant.components.binary_sensor.*
homeassistant.components.bitcoin.*
homeassistant.components.blockchain.*
homeassistant.components.blue_current.*
homeassistant.components.bluetooth.*
homeassistant.components.bluetooth_tracker.*
homeassistant.components.bmw_connected_drive.*
@@ -117,9 +126,12 @@ homeassistant.components.elgato.*
homeassistant.components.elkm1.*
homeassistant.components.emulated_hue.*
homeassistant.components.energy.*
homeassistant.components.enigma2.*
homeassistant.components.esphome.*
homeassistant.components.event.*
homeassistant.components.evil_genius_labs.*
homeassistant.components.evohome.*
homeassistant.components.faa_delays.*
homeassistant.components.fan.*
homeassistant.components.fastdotcom.*
homeassistant.components.feedreader.*
@@ -127,6 +139,7 @@ homeassistant.components.file_upload.*
homeassistant.components.filesize.*
homeassistant.components.filter.*
homeassistant.components.fitbit.*
homeassistant.components.flexit_bacnet.*
homeassistant.components.flux_led.*
homeassistant.components.forecast_solar.*
homeassistant.components.fritz.*
@@ -150,6 +163,7 @@ homeassistant.components.hardkernel.*
homeassistant.components.hardware.*
homeassistant.components.here_travel_time.*
homeassistant.components.history.*
homeassistant.components.holiday.*
homeassistant.components.homeassistant.exposed_entities
homeassistant.components.homeassistant.triggers.event
homeassistant.components.homeassistant_alerts.*
@@ -228,6 +242,7 @@ homeassistant.components.modbus.*
homeassistant.components.modem_callerid.*
homeassistant.components.moon.*
homeassistant.components.mopeka.*
homeassistant.components.motionmount.*
homeassistant.components.mqtt.*
homeassistant.components.mysensors.*
homeassistant.components.nam.*
@@ -264,6 +279,7 @@ homeassistant.components.proximity.*
homeassistant.components.prusalink.*
homeassistant.components.pure_energie.*
homeassistant.components.purpleair.*
homeassistant.components.pushbullet.*
homeassistant.components.pvoutput.*
homeassistant.components.qnap_qsw.*
homeassistant.components.radarr.*
@@ -313,6 +329,8 @@ homeassistant.components.statistics.*
homeassistant.components.steamist.*
homeassistant.components.stookalert.*
homeassistant.components.stream.*
homeassistant.components.streamlabswater.*
homeassistant.components.suez_water.*
homeassistant.components.sun.*
homeassistant.components.surepetcare.*
homeassistant.components.switch.*
@@ -323,6 +341,7 @@ homeassistant.components.synology_dsm.*
homeassistant.components.systemmonitor.*
homeassistant.components.tag.*
homeassistant.components.tailscale.*
homeassistant.components.tailwind.*
homeassistant.components.tami4.*
homeassistant.components.tautulli.*
homeassistant.components.tcp.*
@@ -353,6 +372,7 @@ homeassistant.components.uptimerobot.*
homeassistant.components.usb.*
homeassistant.components.vacuum.*
homeassistant.components.vallox.*
homeassistant.components.valve.*
homeassistant.components.velbus.*
homeassistant.components.vlc_telnet.*
homeassistant.components.wake_on_lan.*

View File

@@ -86,6 +86,8 @@ build.json @home-assistant/supervisor
/tests/components/anova/ @Lash-L
/homeassistant/components/anthemav/ @hyralex
/tests/components/anthemav/ @hyralex
/homeassistant/components/aosmith/ @bdr99
/tests/components/aosmith/ @bdr99
/homeassistant/components/apache_kafka/ @bachya
/tests/components/apache_kafka/ @bachya
/homeassistant/components/apcupsd/ @yuxincs
@@ -153,6 +155,8 @@ build.json @home-assistant/supervisor
/tests/components/blebox/ @bbx-a @riokuu
/homeassistant/components/blink/ @fronzbot @mkmer
/tests/components/blink/ @fronzbot @mkmer
/homeassistant/components/blue_current/ @Floris272 @gleeuwen
/tests/components/blue_current/ @Floris272 @gleeuwen
/homeassistant/components/bluemaestro/ @bdraco
/tests/components/bluemaestro/ @bdraco
/homeassistant/components/blueprint/ @home-assistant/core
@@ -193,6 +197,8 @@ build.json @home-assistant/supervisor
/tests/components/camera/ @home-assistant/core
/homeassistant/components/cast/ @emontnemery
/tests/components/cast/ @emontnemery
/homeassistant/components/ccm15/ @ocalvo
/tests/components/ccm15/ @ocalvo
/homeassistant/components/cert_expiry/ @jjlawren
/tests/components/cert_expiry/ @jjlawren
/homeassistant/components/circuit/ @braam
@@ -205,8 +211,8 @@ build.json @home-assistant/supervisor
/tests/components/cloud/ @home-assistant/cloud
/homeassistant/components/cloudflare/ @ludeeus @ctalkington
/tests/components/cloudflare/ @ludeeus @ctalkington
/homeassistant/components/co2signal/ @jpbede
/tests/components/co2signal/ @jpbede
/homeassistant/components/co2signal/ @jpbede @VIKTORVAV99
/tests/components/co2signal/ @jpbede @VIKTORVAV99
/homeassistant/components/coinbase/ @tombrien
/tests/components/coinbase/ @tombrien
/homeassistant/components/color_extractor/ @GenericStudent
@@ -295,6 +301,8 @@ build.json @home-assistant/supervisor
/tests/components/dormakaba_dkey/ @emontnemery
/homeassistant/components/dremel_3d_printer/ @tkdrob
/tests/components/dremel_3d_printer/ @tkdrob
/homeassistant/components/drop_connect/ @ChandlerSystems @pfrazer
/tests/components/drop_connect/ @ChandlerSystems @pfrazer
/homeassistant/components/dsmr/ @Robbie1221 @frenck
/tests/components/dsmr/ @Robbie1221 @frenck
/homeassistant/components/dsmr_reader/ @depl0y @glodenox
@@ -344,7 +352,7 @@ build.json @home-assistant/supervisor
/tests/components/energy/ @home-assistant/core
/homeassistant/components/energyzero/ @klaasnicolaas
/tests/components/energyzero/ @klaasnicolaas
/homeassistant/components/enigma2/ @fbradyirl
/homeassistant/components/enigma2/ @autinerd
/homeassistant/components/enocean/ @bdurrer
/tests/components/enocean/ @bdurrer
/homeassistant/components/enphase_envoy/ @bdraco @cgarwood @dgomes @joostlek @catsmanac
@@ -395,6 +403,8 @@ build.json @home-assistant/supervisor
/tests/components/fivem/ @Sander0542
/homeassistant/components/fjaraskupan/ @elupus
/tests/components/fjaraskupan/ @elupus
/homeassistant/components/flexit_bacnet/ @lellky @piotrbulinski
/tests/components/flexit_bacnet/ @lellky @piotrbulinski
/homeassistant/components/flick_electric/ @ZephireNZ
/tests/components/flick_electric/ @ZephireNZ
/homeassistant/components/flipr/ @cnico
@@ -410,8 +420,8 @@ build.json @home-assistant/supervisor
/homeassistant/components/forked_daapd/ @uvjustin
/tests/components/forked_daapd/ @uvjustin
/homeassistant/components/fortios/ @kimfrellsen
/homeassistant/components/foscam/ @skgsergio
/tests/components/foscam/ @skgsergio
/homeassistant/components/foscam/ @skgsergio @krmarien
/tests/components/foscam/ @skgsergio @krmarien
/homeassistant/components/freebox/ @hacf-fr @Quentame
/tests/components/freebox/ @hacf-fr @Quentame
/homeassistant/components/freedompro/ @stefano055415
@@ -520,6 +530,8 @@ build.json @home-assistant/supervisor
/tests/components/hive/ @Rendili @KJonline
/homeassistant/components/hlk_sw16/ @jameshilliard
/tests/components/hlk_sw16/ @jameshilliard
/homeassistant/components/holiday/ @jrieger
/tests/components/holiday/ @jrieger
/homeassistant/components/home_connect/ @DavidMStraub
/tests/components/home_connect/ @DavidMStraub
/homeassistant/components/home_plus_control/ @chemaaa
@@ -803,6 +815,8 @@ build.json @home-assistant/supervisor
/tests/components/motion_blinds/ @starkillerOG
/homeassistant/components/motioneye/ @dermotduffy
/tests/components/motioneye/ @dermotduffy
/homeassistant/components/motionmount/ @RJPoelstra
/tests/components/motionmount/ @RJPoelstra
/homeassistant/components/mqtt/ @emontnemery @jbouwh
/tests/components/mqtt/ @emontnemery @jbouwh
/homeassistant/components/msteams/ @peroyvind
@@ -833,6 +847,7 @@ build.json @home-assistant/supervisor
/homeassistant/components/netgear/ @hacf-fr @Quentame @starkillerOG
/tests/components/netgear/ @hacf-fr @Quentame @starkillerOG
/homeassistant/components/netgear_lte/ @tkdrob
/tests/components/netgear_lte/ @tkdrob
/homeassistant/components/network/ @home-assistant/core
/tests/components/network/ @home-assistant/core
/homeassistant/components/nexia/ @bdraco
@@ -926,6 +941,8 @@ build.json @home-assistant/supervisor
/homeassistant/components/oralb/ @bdraco @Lash-L
/tests/components/oralb/ @bdraco @Lash-L
/homeassistant/components/oru/ @bvlaicu
/homeassistant/components/osoenergy/ @osohotwateriot
/tests/components/osoenergy/ @osohotwateriot
/homeassistant/components/otbr/ @home-assistant/core
/tests/components/otbr/ @home-assistant/core
/homeassistant/components/ourgroceries/ @OnFreund
@@ -985,8 +1002,8 @@ build.json @home-assistant/supervisor
/homeassistant/components/proximity/ @mib1185
/tests/components/proximity/ @mib1185
/homeassistant/components/proxmoxve/ @jhollowe @Corbeno
/homeassistant/components/prusalink/ @balloob
/tests/components/prusalink/ @balloob
/homeassistant/components/prusalink/ @balloob @Skaronator
/tests/components/prusalink/ @balloob @Skaronator
/homeassistant/components/ps4/ @ktnrg45
/tests/components/ps4/ @ktnrg45
/homeassistant/components/pure_energie/ @klaasnicolaas
@@ -1003,8 +1020,8 @@ build.json @home-assistant/supervisor
/tests/components/pvoutput/ @frenck
/homeassistant/components/pvpc_hourly_pricing/ @azogue
/tests/components/pvpc_hourly_pricing/ @azogue
/homeassistant/components/qbittorrent/ @geoffreylagaisse
/tests/components/qbittorrent/ @geoffreylagaisse
/homeassistant/components/qbittorrent/ @geoffreylagaisse @finder39
/tests/components/qbittorrent/ @geoffreylagaisse @finder39
/homeassistant/components/qingping/ @bdraco @skgsergio
/tests/components/qingping/ @bdraco @skgsergio
/homeassistant/components/qld_bushfire/ @exxamalte
@@ -1046,6 +1063,8 @@ build.json @home-assistant/supervisor
/tests/components/recorder/ @home-assistant/core
/homeassistant/components/recovery_mode/ @home-assistant/core
/tests/components/recovery_mode/ @home-assistant/core
/homeassistant/components/refoss/ @ashionky
/tests/components/refoss/ @ashionky
/homeassistant/components/rejseplanen/ @DarkFox
/homeassistant/components/remote/ @home-assistant/core
/tests/components/remote/ @home-assistant/core
@@ -1058,6 +1077,8 @@ build.json @home-assistant/supervisor
/homeassistant/components/repairs/ @home-assistant/core
/tests/components/repairs/ @home-assistant/core
/homeassistant/components/repetier/ @ShadowBr0ther
/homeassistant/components/rest_command/ @jpbede
/tests/components/rest_command/ @jpbede
/homeassistant/components/rflink/ @javicalle
/tests/components/rflink/ @javicalle
/homeassistant/components/rfxtrx/ @danielhiversen @elupus @RobBie1221
@@ -1243,13 +1264,17 @@ build.json @home-assistant/supervisor
/homeassistant/components/subaru/ @G-Two
/tests/components/subaru/ @G-Two
/homeassistant/components/suez_water/ @ooii
/tests/components/suez_water/ @ooii
/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
/homeassistant/components/swiss_hydrological_data/ @fabaff
/homeassistant/components/swiss_public_transport/ @fabaff
/homeassistant/components/swiss_public_transport/ @fabaff @miaucl
/tests/components/swiss_public_transport/ @fabaff @miaucl
/homeassistant/components/switch/ @home-assistant/core
/tests/components/switch/ @home-assistant/core
/homeassistant/components/switch_as_x/ @home-assistant/core
@@ -1272,12 +1297,16 @@ build.json @home-assistant/supervisor
/homeassistant/components/synology_srm/ @aerialls
/homeassistant/components/system_bridge/ @timmo001
/tests/components/system_bridge/ @timmo001
/homeassistant/components/tado/ @michaelarnauts @chiefdragon
/tests/components/tado/ @michaelarnauts @chiefdragon
/homeassistant/components/systemmonitor/ @gjohansson-ST
/tests/components/systemmonitor/ @gjohansson-ST
/homeassistant/components/tado/ @michaelarnauts @chiefdragon @erwindouna
/tests/components/tado/ @michaelarnauts @chiefdragon @erwindouna
/homeassistant/components/tag/ @balloob @dmulcahey
/tests/components/tag/ @balloob @dmulcahey
/homeassistant/components/tailscale/ @frenck
/tests/components/tailscale/ @frenck
/homeassistant/components/tailwind/ @frenck
/tests/components/tailwind/ @frenck
/homeassistant/components/tami4/ @Guy293
/tests/components/tami4/ @Guy293
/homeassistant/components/tankerkoenig/ @guillempages @mib1185
@@ -1293,6 +1322,8 @@ build.json @home-assistant/supervisor
/tests/components/template/ @PhracturedBlue @tetienne @home-assistant/core
/homeassistant/components/tesla_wall_connector/ @einarhauks
/tests/components/tesla_wall_connector/ @einarhauks
/homeassistant/components/tessie/ @Bre77
/tests/components/tessie/ @Bre77
/homeassistant/components/text/ @home-assistant/core
/tests/components/text/ @home-assistant/core
/homeassistant/components/tfiac/ @fredrike @mellado
@@ -1360,6 +1391,7 @@ build.json @home-assistant/supervisor
/tests/components/ukraine_alarm/ @PaulAnnekov
/homeassistant/components/unifi/ @Kane610
/tests/components/unifi/ @Kane610
/homeassistant/components/unifi_direct/ @tofuSCHNITZEL
/homeassistant/components/unifiled/ @florisvdk
/homeassistant/components/unifiprotect/ @AngellusMortis @bdraco
/tests/components/unifiprotect/ @AngellusMortis @bdraco
@@ -1388,6 +1420,8 @@ build.json @home-assistant/supervisor
/tests/components/vacuum/ @home-assistant/core
/homeassistant/components/vallox/ @andre-richter @slovdahl @viiru-
/tests/components/vallox/ @andre-richter @slovdahl @viiru-
/homeassistant/components/valve/ @home-assistant/core
/tests/components/valve/ @home-assistant/core
/homeassistant/components/velbus/ @Cereal2nd @brefra
/tests/components/velbus/ @Cereal2nd @brefra
/homeassistant/components/velux/ @Julius2342
@@ -1396,8 +1430,8 @@ build.json @home-assistant/supervisor
/homeassistant/components/versasense/ @imstevenxyz
/homeassistant/components/version/ @ludeeus
/tests/components/version/ @ludeeus
/homeassistant/components/vesync/ @markperdue @webdjoe @thegardenmonkey
/tests/components/vesync/ @markperdue @webdjoe @thegardenmonkey
/homeassistant/components/vesync/ @markperdue @webdjoe @thegardenmonkey @cdnninja
/tests/components/vesync/ @markperdue @webdjoe @thegardenmonkey @cdnninja
/homeassistant/components/vicare/ @CFenner
/tests/components/vicare/ @CFenner
/homeassistant/components/vilfo/ @ManneW

View File

@@ -6,7 +6,7 @@ FROM ${BUILD_FROM}
# Synchronize with homeassistant/core.py:async_stop
ENV \
S6_SERVICES_GRACETIME=220000
S6_SERVICES_GRACETIME=240000
ARG QEMU_CPU

View File

@@ -27,6 +27,7 @@ from .const import (
from .exceptions import HomeAssistantError
from .helpers import (
area_registry,
config_validation as cv,
device_registry,
entity,
entity_registry,
@@ -473,7 +474,9 @@ async def async_mount_local_lib_path(config_dir: str) -> str:
def _get_domains(hass: core.HomeAssistant, config: dict[str, Any]) -> set[str]:
"""Get domains of components to set up."""
# Filter out the repeating and common config section [homeassistant]
domains = {key.partition(" ")[0] for key in config if key != core.DOMAIN}
domains = {
domain for key in config if (domain := cv.domain_key(key)) != core.DOMAIN
}
# Add config entry domains
if not hass.config.recovery_mode:

View File

@@ -0,0 +1,5 @@
{
"domain": "flexit",
"name": "Flexit",
"integrations": ["flexit", "flexit_bacnet"]
}

View File

@@ -27,7 +27,7 @@ ABODE_TEMPERATURE_UNIT_HA_UNIT = {
}
@dataclass
@dataclass(frozen=True)
class AbodeSensorDescriptionMixin:
"""Mixin for Abode sensor."""
@@ -35,7 +35,7 @@ class AbodeSensorDescriptionMixin:
native_unit_of_measurement_fn: Callable[[AbodeSense], str]
@dataclass
@dataclass(frozen=True)
class AbodeSensorDescription(SensorEntityDescription, AbodeSensorDescriptionMixin):
"""Class describing Abode sensor entities."""

View File

@@ -45,14 +45,14 @@ from .const import (
PARALLEL_UPDATES = 1
@dataclass
@dataclass(frozen=True)
class AccuWeatherSensorDescriptionMixin:
"""Mixin for AccuWeather sensor."""
value_fn: Callable[[dict[str, Any]], str | int | float | None]
@dataclass
@dataclass(frozen=True)
class AccuWeatherSensorDescription(
SensorEntityDescription, AccuWeatherSensorDescriptionMixin
):

View File

@@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/acmeda",
"iot_class": "local_push",
"loggers": ["aiopulse"],
"requirements": ["aiopulse==0.4.3"]
"requirements": ["aiopulse==0.4.4"]
}

View File

@@ -24,7 +24,7 @@ async def async_migrate_entry(hass: HomeAssistant, config_entry: ConfigEntry) ->
# convert title and unique_id to string
if config_entry.version == 1:
if isinstance(config_entry.unique_id, int):
hass.config_entries.async_update_entry(
hass.config_entries.async_update_entry( # type: ignore[unreachable]
config_entry,
unique_id=str(config_entry.unique_id),
title=str(config_entry.title),

View File

@@ -137,7 +137,7 @@ class LocalAdaxDevice(ClimateEntity):
_attr_target_temperature_step = PRECISION_WHOLE
_attr_temperature_unit = UnitOfTemperature.CELSIUS
def __init__(self, adax_data_handler, unique_id):
def __init__(self, adax_data_handler: AdaxLocal, unique_id: str) -> None:
"""Initialize the heater."""
self._adax_data_handler = adax_data_handler
self._attr_unique_id = unique_id

View File

@@ -36,7 +36,9 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
VERSION = 2
async def async_step_user(self, user_input=None):
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Handle the initial step."""
data_schema = vol.Schema(
{
@@ -59,7 +61,9 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
return await self.async_step_local()
return await self.async_step_cloud()
async def async_step_local(self, user_input=None):
async def async_step_local(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Handle the local step."""
data_schema = vol.Schema(
{vol.Required(WIFI_SSID): str, vol.Required(WIFI_PSWD): str}

View File

@@ -22,7 +22,7 @@ SCAN_INTERVAL = timedelta(seconds=300)
PARALLEL_UPDATES = 4
@dataclass(kw_only=True)
@dataclass(frozen=True, kw_only=True)
class AdGuardHomeEntityDescription(SensorEntityDescription):
"""Describes AdGuard Home sensor entity."""

View File

@@ -21,7 +21,7 @@ SCAN_INTERVAL = timedelta(seconds=10)
PARALLEL_UPDATES = 1
@dataclass(kw_only=True)
@dataclass(frozen=True, kw_only=True)
class AdGuardHomeSwitchEntityDescription(SwitchEntityDescription):
"""Describes AdGuard Home switch entity."""

View File

@@ -8,6 +8,7 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_IP_ADDRESS, CONF_PORT, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.debounce import Debouncer
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import ADVANTAGE_AIR_RETRY, DOMAIN
@@ -26,6 +27,7 @@ PLATFORMS = [
]
_LOGGER = logging.getLogger(__name__)
REQUEST_REFRESH_DELAY = 0.5
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
@@ -51,6 +53,9 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
name="Advantage Air",
update_method=async_get,
update_interval=timedelta(seconds=ADVANTAGE_AIR_SYNC_INTERVAL),
request_refresh_debouncer=Debouncer(
hass, _LOGGER, cooldown=REQUEST_REFRESH_DELAY, immediate=False
),
)
await coordinator.async_config_entry_first_refresh()

View File

@@ -21,6 +21,7 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import (
ADVANTAGE_AIR_AUTOFAN_ENABLED,
ADVANTAGE_AIR_STATE_CLOSE,
ADVANTAGE_AIR_STATE_OFF,
ADVANTAGE_AIR_STATE_ON,
@@ -39,16 +40,6 @@ ADVANTAGE_AIR_HVAC_MODES = {
}
HASS_HVAC_MODES = {v: k for k, v in ADVANTAGE_AIR_HVAC_MODES.items()}
ADVANTAGE_AIR_FAN_MODES = {
"autoAA": FAN_AUTO,
"low": FAN_LOW,
"medium": FAN_MEDIUM,
"high": FAN_HIGH,
}
HASS_FAN_MODES = {v: k for k, v in ADVANTAGE_AIR_FAN_MODES.items()}
FAN_SPEEDS = {FAN_LOW: 30, FAN_MEDIUM: 60, FAN_HIGH: 100}
ADVANTAGE_AIR_AUTOFAN = "aaAutoFanModeEnabled"
ADVANTAGE_AIR_MYZONE = "MyZone"
ADVANTAGE_AIR_MYAUTO = "MyAuto"
ADVANTAGE_AIR_MYAUTO_ENABLED = "myAutoModeEnabled"
@@ -56,6 +47,7 @@ ADVANTAGE_AIR_MYTEMP = "MyTemp"
ADVANTAGE_AIR_MYTEMP_ENABLED = "climateControlModeEnabled"
ADVANTAGE_AIR_HEAT_TARGET = "myAutoHeatTargetTemp"
ADVANTAGE_AIR_COOL_TARGET = "myAutoCoolTargetTemp"
ADVANTAGE_AIR_MYFAN = "autoAA"
PARALLEL_UPDATES = 0
@@ -85,27 +77,25 @@ async def async_setup_entry(
class AdvantageAirAC(AdvantageAirAcEntity, ClimateEntity):
"""AdvantageAir AC unit."""
_attr_fan_modes = [FAN_LOW, FAN_MEDIUM, FAN_HIGH]
_attr_fan_modes = [FAN_LOW, FAN_MEDIUM, FAN_HIGH, FAN_AUTO]
_attr_temperature_unit = UnitOfTemperature.CELSIUS
_attr_target_temperature_step = PRECISION_WHOLE
_attr_max_temp = 32
_attr_min_temp = 16
_attr_name = None
_attr_hvac_modes = [
HVACMode.OFF,
HVACMode.COOL,
HVACMode.HEAT,
HVACMode.FAN_ONLY,
HVACMode.DRY,
]
_attr_supported_features = ClimateEntityFeature.FAN_MODE
def __init__(self, instance: AdvantageAirData, ac_key: str) -> None:
"""Initialize an AdvantageAir AC unit."""
super().__init__(instance, ac_key)
self._attr_supported_features = ClimateEntityFeature.FAN_MODE
self._attr_hvac_modes = [
HVACMode.OFF,
HVACMode.COOL,
HVACMode.HEAT,
HVACMode.FAN_ONLY,
HVACMode.DRY,
]
# Set supported features and HVAC modes based on current operating mode
if self._ac.get(ADVANTAGE_AIR_MYAUTO_ENABLED):
# MyAuto
@@ -118,10 +108,6 @@ class AdvantageAirAC(AdvantageAirAcEntity, ClimateEntity):
# MyZone
self._attr_supported_features |= ClimateEntityFeature.TARGET_TEMPERATURE
# Add "ezfan" mode if supported
if self._ac.get(ADVANTAGE_AIR_AUTOFAN):
self._attr_fan_modes += [FAN_AUTO]
@property
def current_temperature(self) -> float | None:
"""Return the selected zones current temperature."""
@@ -151,7 +137,7 @@ class AdvantageAirAC(AdvantageAirAcEntity, ClimateEntity):
@property
def fan_mode(self) -> str | None:
"""Return the current fan modes."""
return ADVANTAGE_AIR_FAN_MODES.get(self._ac["fan"])
return FAN_AUTO if self._ac["fan"] == ADVANTAGE_AIR_MYFAN else self._ac["fan"]
@property
def target_temperature_high(self) -> float | None:
@@ -189,7 +175,11 @@ class AdvantageAirAC(AdvantageAirAcEntity, ClimateEntity):
async def async_set_fan_mode(self, fan_mode: str) -> None:
"""Set the Fan Mode."""
await self.async_update_ac({"fan": HASS_FAN_MODES.get(fan_mode)})
if fan_mode == FAN_AUTO and self._ac.get(ADVANTAGE_AIR_AUTOFAN_ENABLED):
mode = ADVANTAGE_AIR_MYFAN
else:
mode = fan_mode
await self.async_update_ac({"fan": mode})
async def async_set_temperature(self, **kwargs: Any) -> None:
"""Set the Temperature."""

View File

@@ -5,3 +5,4 @@ ADVANTAGE_AIR_STATE_OPEN = "open"
ADVANTAGE_AIR_STATE_CLOSE = "close"
ADVANTAGE_AIR_STATE_ON = "on"
ADVANTAGE_AIR_STATE_OFF = "off"
ADVANTAGE_AIR_AUTOFAN_ENABLED = "aaAutoFanModeEnabled"

View File

@@ -30,7 +30,7 @@ class AdvantageAirEntity(CoordinatorEntity):
async def update_handle(*values):
try:
if await func(*keys, *values):
await self.coordinator.async_refresh()
await self.coordinator.async_request_refresh()
except ApiError as err:
raise HomeAssistantError(err) from err

View File

@@ -7,6 +7,7 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import (
ADVANTAGE_AIR_AUTOFAN_ENABLED,
ADVANTAGE_AIR_STATE_OFF,
ADVANTAGE_AIR_STATE_ON,
DOMAIN as ADVANTAGE_AIR_DOMAIN,
@@ -29,6 +30,8 @@ async def async_setup_entry(
for ac_key, ac_device in aircons.items():
if ac_device["info"]["freshAirStatus"] != "none":
entities.append(AdvantageAirFreshAir(instance, ac_key))
if ADVANTAGE_AIR_AUTOFAN_ENABLED in ac_device["info"]:
entities.append(AdvantageAirMyFan(instance, ac_key))
if things := instance.coordinator.data.get("myThings"):
for thing in things["things"].values():
if thing["channelDipState"] == 8: # 8 = Other relay
@@ -62,6 +65,32 @@ class AdvantageAirFreshAir(AdvantageAirAcEntity, SwitchEntity):
await self.async_update_ac({"freshAirStatus": ADVANTAGE_AIR_STATE_OFF})
class AdvantageAirMyFan(AdvantageAirAcEntity, SwitchEntity):
"""Representation of Advantage Air MyFan control."""
_attr_icon = "mdi:fan-auto"
_attr_name = "MyFan"
_attr_device_class = SwitchDeviceClass.SWITCH
def __init__(self, instance: AdvantageAirData, ac_key: str) -> None:
"""Initialize an Advantage Air MyFan control."""
super().__init__(instance, ac_key)
self._attr_unique_id += "-myfan"
@property
def is_on(self) -> bool:
"""Return the MyFan status."""
return self._ac[ADVANTAGE_AIR_AUTOFAN_ENABLED]
async def async_turn_on(self, **kwargs: Any) -> None:
"""Turn MyFan on."""
await self.async_update_ac({ADVANTAGE_AIR_AUTOFAN_ENABLED: True})
async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn MyFan off."""
await self.async_update_ac({ADVANTAGE_AIR_AUTOFAN_ENABLED: False})
class AdvantageAirRelay(AdvantageAirThingEntity, SwitchEntity):
"""Representation of Advantage Air Thing."""

View File

@@ -1,6 +1,8 @@
"""Config flow for AEMET OpenData."""
from __future__ import annotations
from typing import Any
from aemet_opendata.exceptions import AuthError
from aemet_opendata.interface import AEMET, ConnectionOptions
import voluptuous as vol
@@ -8,6 +10,7 @@ import voluptuous as vol
from homeassistant import config_entries
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME
from homeassistant.core import callback
from homeassistant.data_entry_flow import FlowResult
from homeassistant.helpers import aiohttp_client, config_validation as cv
from homeassistant.helpers.schema_config_entry_flow import (
SchemaFlowFormStep,
@@ -29,7 +32,9 @@ OPTIONS_FLOW = {
class AemetConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
"""Config flow for AEMET OpenData."""
async def async_step_user(self, user_input=None):
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Handle a flow initialized by the user."""
errors = {}

View File

@@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/aemet",
"iot_class": "cloud_polling",
"loggers": ["aemet_opendata"],
"requirements": ["AEMET-OpenData==0.4.6"]
"requirements": ["AEMET-OpenData==0.4.7"]
}

View File

@@ -0,0 +1 @@
"""Virtual integration: AEP Ohio."""

View File

@@ -0,0 +1,6 @@
{
"domain": "aep_ohio",
"name": "AEP Ohio",
"integration_type": "virtual",
"supported_by": "opower"
}

View File

@@ -0,0 +1 @@
"""Virtual integration: AEP Texas."""

View File

@@ -0,0 +1,6 @@
{
"domain": "aep_texas",
"name": "AEP Texas",
"integration_type": "virtual",
"supported_by": "opower"
}

View File

@@ -10,7 +10,7 @@ import voluptuous as vol
from homeassistant.config_entries import ConfigFlow
from homeassistant.const import CONF_API_KEY, CONF_NAME
from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN
from homeassistant.data_entry_flow import AbortFlow, FlowResult
from homeassistant.data_entry_flow import FlowResult
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue
@@ -51,25 +51,6 @@ class AfterShipConfigFlow(ConfigFlow, domain=DOMAIN):
async def async_step_import(self, config: dict[str, Any]) -> FlowResult:
"""Import configuration from yaml."""
try:
self._async_abort_entries_match({CONF_API_KEY: config[CONF_API_KEY]})
except AbortFlow as err:
async_create_issue(
self.hass,
DOMAIN,
"deprecated_yaml_import_issue_already_configured",
breaks_in_ha_version="2024.4.0",
is_fixable=False,
issue_domain=DOMAIN,
severity=IssueSeverity.WARNING,
translation_key="deprecated_yaml_import_issue_already_configured",
translation_placeholders={
"domain": DOMAIN,
"integration_title": "AfterShip",
},
)
raise err
async_create_issue(
self.hass,
HOMEASSISTANT_DOMAIN,
@@ -84,6 +65,8 @@ class AfterShipConfigFlow(ConfigFlow, domain=DOMAIN):
"integration_title": "AfterShip",
},
)
self._async_abort_entries_match({CONF_API_KEY: config[CONF_API_KEY]})
return self.async_create_entry(
title=config.get(CONF_NAME, "AfterShip"),
data={CONF_API_KEY: config[CONF_API_KEY]},

View File

@@ -49,10 +49,6 @@
}
},
"issues": {
"deprecated_yaml_import_issue_already_configured": {
"title": "The {integration_title} YAML configuration import failed",
"description": "Configuring {integration_title} using YAML is being removed but the YAML configuration was already imported.\n\nRemove the YAML configuration and restart Home Assistant."
},
"deprecated_yaml_import_issue_cannot_connect": {
"title": "The {integration_title} YAML configuration import failed",
"description": "Configuring {integration_title} using YAML is being removed but there was an connection error importing your YAML configuration.\n\nEnsure connection to {integration_title} works and restart Home Assistant to try again or remove the {integration_title} YAML configuration from your configuration.yaml file and continue to [set up the integration]({url}) manually."

View File

@@ -1,5 +1,6 @@
"""Config flow to configure Agent devices."""
from contextlib import suppress
from typing import Any
from agent import AgentConnectionError, AgentError
from agent.a import Agent
@@ -7,6 +8,7 @@ import voluptuous as vol
from homeassistant import config_entries
from homeassistant.const import CONF_HOST, CONF_PORT
from homeassistant.data_entry_flow import FlowResult
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from .const import DOMAIN, SERVER_URL
@@ -18,11 +20,9 @@ DEFAULT_PORT = 8090
class AgentFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
"""Handle an Agent config flow."""
def __init__(self):
"""Initialize the Agent config flow."""
self.device_config = {}
async def async_step_user(self, user_input=None):
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Handle an Agent config flow."""
errors = {}
@@ -49,13 +49,15 @@ class AgentFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
}
)
self.device_config = {
device_config = {
CONF_HOST: host,
CONF_PORT: port,
SERVER_URL: server_origin,
}
return await self._create_entry(agent_client.name)
return self.async_create_entry(
title=agent_client.name, data=device_config
)
errors["base"] = "cannot_connect"
@@ -66,11 +68,6 @@ class AgentFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
return self.async_show_form(
step_id="user",
description_placeholders=self.device_config,
data_schema=vol.Schema(data),
errors=errors,
)
async def _create_entry(self, server_name):
"""Create entry for device."""
return self.async_create_entry(title=server_name, data=self.device_config)

View File

@@ -56,7 +56,7 @@ from .const import (
PARALLEL_UPDATES = 1
@dataclass
@dataclass(frozen=True)
class AirlySensorEntityDescription(SensorEntityDescription):
"""Class describing Airly sensor entities."""

View File

@@ -6,8 +6,17 @@ from pyairnow import WebServiceAPI
from pyairnow.errors import AirNowError, EmptyResponseError, InvalidKeyError
import voluptuous as vol
from homeassistant import config_entries, core, data_entry_flow, exceptions
from homeassistant import core
from homeassistant.config_entries import (
ConfigEntry,
ConfigFlow,
OptionsFlow,
OptionsFlowWithConfigEntry,
)
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_RADIUS
from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResult
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.aiohttp_client import async_get_clientsession
import homeassistant.helpers.config_validation as cv
@@ -16,7 +25,7 @@ from .const import DOMAIN
_LOGGER = logging.getLogger(__name__)
async def validate_input(hass: core.HomeAssistant, data):
async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> bool:
"""Validate the user input allows us to connect.
Data has the keys from DATA_SCHEMA with values provided by the user.
@@ -46,12 +55,14 @@ async def validate_input(hass: core.HomeAssistant, data):
return True
class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
class AirNowConfigFlow(ConfigFlow, domain=DOMAIN):
"""Handle a config flow for AirNow."""
VERSION = 2
async def async_step_user(self, user_input=None):
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Handle the initial step."""
errors = {}
if user_input is not None:
@@ -108,18 +119,18 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
@staticmethod
@core.callback
def async_get_options_flow(
config_entry: config_entries.ConfigEntry,
) -> config_entries.OptionsFlow:
config_entry: ConfigEntry,
) -> OptionsFlow:
"""Return the options flow."""
return OptionsFlowHandler(config_entry)
return AirNowOptionsFlowHandler(config_entry)
class OptionsFlowHandler(config_entries.OptionsFlowWithConfigEntry):
class AirNowOptionsFlowHandler(OptionsFlowWithConfigEntry):
"""Handle an options flow for AirNow."""
async def async_step_init(
self, user_input: dict[str, Any] | None = None
) -> data_entry_flow.FlowResult:
) -> FlowResult:
"""Manage the options."""
if user_input is not None:
return self.async_create_entry(data=user_input)
@@ -141,13 +152,13 @@ class OptionsFlowHandler(config_entries.OptionsFlowWithConfigEntry):
)
class CannotConnect(exceptions.HomeAssistantError):
class CannotConnect(HomeAssistantError):
"""Error to indicate we cannot connect."""
class InvalidAuth(exceptions.HomeAssistantError):
class InvalidAuth(HomeAssistantError):
"""Error to indicate there is invalid auth."""
class InvalidLocation(exceptions.HomeAssistantError):
class InvalidLocation(HomeAssistantError):
"""Error to indicate the location is invalid."""

View File

@@ -1,11 +1,15 @@
"""DataUpdateCoordinator for the AirNow integration."""
from datetime import timedelta
import logging
from typing import Any
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 homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import (
@@ -31,12 +35,19 @@ from .const import (
_LOGGER = logging.getLogger(__name__)
class AirNowDataUpdateCoordinator(DataUpdateCoordinator):
class AirNowDataUpdateCoordinator(DataUpdateCoordinator[dict[str, Any]]):
"""The AirNow update coordinator."""
def __init__(
self, hass, session, api_key, latitude, longitude, distance, update_interval
):
self,
hass: HomeAssistant,
session: ClientSession,
api_key: str,
latitude: float,
longitude: float,
distance: int,
update_interval: timedelta,
) -> None:
"""Initialize."""
self.latitude = latitude
self.longitude = longitude
@@ -46,7 +57,7 @@ class AirNowDataUpdateCoordinator(DataUpdateCoordinator):
super().__init__(hass, _LOGGER, name=DOMAIN, update_interval=update_interval)
async def _async_update_data(self):
async def _async_update_data(self) -> dict[str, Any]:
"""Update data via library."""
data = {}
try:

View File

@@ -51,7 +51,7 @@ ATTR_LEVEL = "level"
ATTR_STATION = "reporting_station"
@dataclass
@dataclass(frozen=True)
class AirNowEntityDescriptionMixin:
"""Mixin for required keys."""
@@ -59,7 +59,7 @@ class AirNowEntityDescriptionMixin:
extra_state_attributes_fn: Callable[[Any], dict[str, str]] | None
@dataclass
@dataclass(frozen=True)
class AirNowEntityDescription(SensorEntityDescription, AirNowEntityDescriptionMixin):
"""Describes Airnow sensor entity."""

View File

@@ -4,7 +4,7 @@ from __future__ import annotations
import logging
from typing import Any
from aioairq import AirQ, InvalidAuth, InvalidInput
from aioairq import AirQ, InvalidAuth
from aiohttp.client_exceptions import ClientConnectionError
import voluptuous as vol
@@ -42,44 +42,32 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
errors: dict[str, str] = {}
session = async_get_clientsession(self.hass)
airq = AirQ(user_input[CONF_IP_ADDRESS], user_input[CONF_PASSWORD], session)
try:
airq = AirQ(user_input[CONF_IP_ADDRESS], user_input[CONF_PASSWORD], session)
except InvalidInput:
await airq.validate()
except ClientConnectionError:
_LOGGER.debug(
"%s does not appear to be a valid IP address or mDNS name",
(
"Failed to connect to device %s. Check the IP address / device"
" ID as well as whether the device is connected to power and"
" the WiFi"
),
user_input[CONF_IP_ADDRESS],
)
errors["base"] = "invalid_input"
errors["base"] = "cannot_connect"
except InvalidAuth:
_LOGGER.debug(
"Incorrect password for device %s", user_input[CONF_IP_ADDRESS]
)
errors["base"] = "invalid_auth"
else:
try:
await airq.validate()
except ClientConnectionError:
_LOGGER.debug(
(
"Failed to connect to device %s. Check the IP address / device"
" ID as well as whether the device is connected to power and"
" the WiFi"
),
user_input[CONF_IP_ADDRESS],
)
errors["base"] = "cannot_connect"
except InvalidAuth:
_LOGGER.debug(
"Incorrect password for device %s", user_input[CONF_IP_ADDRESS]
)
errors["base"] = "invalid_auth"
else:
_LOGGER.debug(
"Successfully connected to %s", user_input[CONF_IP_ADDRESS]
)
_LOGGER.debug("Successfully connected to %s", user_input[CONF_IP_ADDRESS])
device_info = await airq.fetch_device_info()
await self.async_set_unique_id(device_info["id"])
self._abort_if_unique_id_configured()
device_info = await airq.fetch_device_info()
await self.async_set_unique_id(device_info["id"])
self._abort_if_unique_id_configured()
return self.async_create_entry(
title=device_info["name"], data=user_input
)
return self.async_create_entry(title=device_info["name"], data=user_input)
return self.async_show_form(
step_id="user", data_schema=STEP_USER_DATA_SCHEMA, errors=errors

View File

@@ -7,5 +7,5 @@
"integration_type": "hub",
"iot_class": "local_polling",
"loggers": ["aioairq"],
"requirements": ["aioairq==0.3.1"]
"requirements": ["aioairq==0.3.2"]
}

View File

@@ -37,14 +37,14 @@ from .const import (
_LOGGER = logging.getLogger(__name__)
@dataclass
@dataclass(frozen=True)
class AirQEntityDescriptionMixin:
"""Class for keys required by AirQ entity."""
value: Callable[[dict], float | int | None]
@dataclass
@dataclass(frozen=True)
class AirQEntityDescription(SensorEntityDescription, AirQEntityDescriptionMixin):
"""Describes AirQ sensor entity."""

View File

@@ -7,12 +7,12 @@ import logging
from airthings import Airthings, AirthingsError
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import Platform
from homeassistant.const import CONF_ID, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import CONF_ID, CONF_SECRET, DOMAIN
from .const import CONF_SECRET, DOMAIN
_LOGGER = logging.getLogger(__name__)

View File

@@ -8,10 +8,11 @@ import airthings
import voluptuous as vol
from homeassistant import config_entries
from homeassistant.const import CONF_ID
from homeassistant.data_entry_flow import FlowResult
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from .const import CONF_ID, CONF_SECRET, DOMAIN
from .const import CONF_SECRET, DOMAIN
_LOGGER = logging.getLogger(__name__)

View File

@@ -2,5 +2,4 @@
DOMAIN = "airthings"
CONF_ID = "id"
CONF_SECRET = "secret"

View File

@@ -4,7 +4,8 @@ from __future__ import annotations
from datetime import timedelta
import logging
from airthings_ble import AirthingsBluetoothDeviceData
from airthings_ble import AirthingsBluetoothDeviceData, AirthingsDevice
from bleak_retry_connector import close_stale_connections_by_address
from homeassistant.components import bluetooth
from homeassistant.config_entries import ConfigEntry
@@ -30,6 +31,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
is_metric = hass.config.units is METRIC_SYSTEM
assert address is not None
await close_stale_connections_by_address(address)
ble_device = bluetooth.async_ble_device_from_address(hass, address)
if not ble_device:
@@ -37,13 +40,13 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
f"Could not find Airthings device with address {address}"
)
async def _async_update_method():
async def _async_update_method() -> AirthingsDevice:
"""Get data from Airthings BLE."""
ble_device = bluetooth.async_ble_device_from_address(hass, address)
airthings = AirthingsBluetoothDeviceData(_LOGGER, elevation, is_metric)
try:
data = await airthings.update_device(ble_device)
data = await airthings.update_device(ble_device) # type: ignore[arg-type]
except Exception as err:
raise UpdateFailed(f"Unable to fetch data: {err}") from err

View File

@@ -1,6 +1,7 @@
"""Support for airthings ble sensors."""
from __future__ import annotations
import dataclasses
import logging
from airthings_ble import AirthingsDevice
@@ -167,10 +168,13 @@ async def async_setup_entry(
# we need to change some units
sensors_mapping = SENSORS_MAPPING_TEMPLATE.copy()
if not is_metric:
for val in sensors_mapping.values():
for key, val in sensors_mapping.items():
if val.native_unit_of_measurement is not VOLUME_BECQUEREL:
continue
val.native_unit_of_measurement = VOLUME_PICOCURIE
sensors_mapping[key] = dataclasses.replace(
val,
native_unit_of_measurement=VOLUME_PICOCURIE,
)
entities = []
_LOGGER.debug("got sensors: %s", coordinator.data.sensors)

View File

@@ -19,6 +19,7 @@ from homeassistant.components import automation
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
from homeassistant.const import (
CONF_API_KEY,
CONF_COUNTRY,
CONF_IP_ADDRESS,
CONF_LATITUDE,
CONF_LONGITUDE,
@@ -44,7 +45,6 @@ from homeassistant.helpers.update_coordinator import (
from .const import (
CONF_CITY,
CONF_COUNTRY,
CONF_GEOGRAPHIES,
CONF_INTEGRATION_TYPE,
DOMAIN,

View File

@@ -19,6 +19,7 @@ from homeassistant import config_entries
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
CONF_API_KEY,
CONF_COUNTRY,
CONF_LATITUDE,
CONF_LONGITUDE,
CONF_SHOW_ON_MAP,
@@ -35,7 +36,6 @@ from homeassistant.helpers.schema_config_entry_flow import (
from . import async_get_geography_id
from .const import (
CONF_CITY,
CONF_COUNTRY,
CONF_INTEGRATION_TYPE,
DOMAIN,
INTEGRATION_TYPE_GEOGRAPHY_COORDS,

View File

@@ -9,6 +9,5 @@ INTEGRATION_TYPE_GEOGRAPHY_NAME = "Geographical Location by Name"
INTEGRATION_TYPE_NODE_PRO = "AirVisual Node/Pro"
CONF_CITY = "city"
CONF_COUNTRY = "country"
CONF_GEOGRAPHIES = "geographies"
CONF_INTEGRATION_TYPE = "integration_type"

View File

@@ -7,6 +7,7 @@ from homeassistant.components.diagnostics import async_redact_data
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
CONF_API_KEY,
CONF_COUNTRY,
CONF_LATITUDE,
CONF_LONGITUDE,
CONF_STATE,
@@ -15,7 +16,7 @@ from homeassistant.const import (
from homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from .const import CONF_CITY, CONF_COUNTRY, DOMAIN
from .const import CONF_CITY, DOMAIN
CONF_COORDINATES = "coordinates"
CONF_TITLE = "title"

View File

@@ -15,6 +15,7 @@ from homeassistant.const import (
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
CONCENTRATION_PARTS_PER_BILLION,
CONCENTRATION_PARTS_PER_MILLION,
CONF_COUNTRY,
CONF_LATITUDE,
CONF_LONGITUDE,
CONF_SHOW_ON_MAP,
@@ -25,7 +26,7 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from . import AirVisualEntity
from .const import CONF_CITY, CONF_COUNTRY, DOMAIN
from .const import CONF_CITY, DOMAIN
ATTR_CITY = "city"
ATTR_COUNTRY = "country"

View File

@@ -26,7 +26,7 @@ from . import AirVisualProData, AirVisualProEntity
from .const import DOMAIN
@dataclass
@dataclass(frozen=True)
class AirVisualProMeasurementKeyMixin:
"""Define an entity description mixin to include a measurement key."""
@@ -35,7 +35,7 @@ class AirVisualProMeasurementKeyMixin:
]
@dataclass
@dataclass(frozen=True)
class AirVisualProMeasurementDescription(
SensorEntityDescription, AirVisualProMeasurementKeyMixin
):

View File

@@ -29,7 +29,7 @@ from .coordinator import AirzoneUpdateCoordinator
from .entity import AirzoneEntity, AirzoneSystemEntity, AirzoneZoneEntity
@dataclass
@dataclass(frozen=True)
class AirzoneBinarySensorEntityDescription(BinarySensorEntityDescription):
"""A class that describes airzone binary sensor entities."""

View File

@@ -248,7 +248,6 @@ class AirzoneClimate(AirzoneZoneEntity, ClimateEntity):
self._attr_hvac_mode = HVACMode.OFF
self._attr_max_temp = self.get_airzone_value(AZD_TEMP_MAX)
self._attr_min_temp = self.get_airzone_value(AZD_TEMP_MIN)
self._attr_target_temperature = self.get_airzone_value(AZD_TEMP_SET)
if self.supported_features & ClimateEntityFeature.FAN_MODE:
self._attr_fan_mode = self._speeds.get(self.get_airzone_value(AZD_SPEED))
if self.supported_features & ClimateEntityFeature.TARGET_TEMPERATURE_RANGE:
@@ -258,3 +257,5 @@ class AirzoneClimate(AirzoneZoneEntity, ClimateEntity):
self._attr_target_temperature_low = self.get_airzone_value(
AZD_HEAT_TEMP_SET
)
else:
self._attr_target_temperature = self.get_airzone_value(AZD_TEMP_SET)

View File

@@ -11,5 +11,5 @@
"documentation": "https://www.home-assistant.io/integrations/airzone",
"iot_class": "local_polling",
"loggers": ["aioairzone"],
"requirements": ["aioairzone==0.6.9"]
"requirements": ["aioairzone==0.7.2"]
}

View File

@@ -26,7 +26,7 @@ from .coordinator import AirzoneUpdateCoordinator
from .entity import AirzoneEntity, AirzoneZoneEntity
@dataclass
@dataclass(frozen=True)
class AirzoneSelectDescriptionMixin:
"""Define an entity description mixin for select entities."""
@@ -34,7 +34,7 @@ class AirzoneSelectDescriptionMixin:
options_dict: dict[str, int]
@dataclass
@dataclass(frozen=True)
class AirzoneSelectDescription(SelectEntityDescription, AirzoneSelectDescriptionMixin):
"""Class to describe an Airzone select entity."""

View File

@@ -34,7 +34,7 @@ from .entity import (
)
@dataclass
@dataclass(frozen=True)
class AirzoneBinarySensorEntityDescription(BinarySensorEntityDescription):
"""A class that describes Airzone Cloud binary sensor entities."""

View File

@@ -11,6 +11,7 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.const import STATE_CLOSED, STATE_CLOSING, STATE_OPENING
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError, PlatformNotReady
import homeassistant.helpers.device_registry as dr
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback
@@ -33,6 +34,34 @@ async def async_setup_entry(
async_add_entities(
(AladdinDevice(acc, door, config_entry) for door in doors),
)
remove_stale_devices(hass, config_entry, doors)
def remove_stale_devices(
hass: HomeAssistant, config_entry: ConfigEntry, devices: list[dict]
) -> None:
"""Remove stale devices from device registry."""
device_registry = dr.async_get(hass)
device_entries = dr.async_entries_for_config_entry(
device_registry, config_entry.entry_id
)
all_device_ids = {f"{door['device_id']}-{door['door_number']}" for door in devices}
for device_entry in device_entries:
device_id: str | None = None
for identifier in device_entry.identifiers:
if identifier[0] == DOMAIN:
device_id = identifier[1]
break
if device_id is None or device_id not in all_device_ids:
# If device_id is None an invalid device entry was found for this config entry.
# If the device_id is not in existing device ids it's a stale device entry.
# Remove config entry from this device entry in either case.
device_registry.async_update_device(
device_entry.id, remove_config_entry_id=config_entry.entry_id
)
class AladdinDevice(CoverEntity):

View File

@@ -6,5 +6,6 @@
"documentation": "https://www.home-assistant.io/integrations/aladdin_connect",
"iot_class": "cloud_polling",
"loggers": ["aladdin_connect"],
"quality_scale": "platinum",
"requirements": ["AIOAladdinConnect==0.1.58"]
}

View File

@@ -23,14 +23,14 @@ from .const import DOMAIN
from .model import DoorDevice
@dataclass
@dataclass(frozen=True)
class AccSensorEntityDescriptionMixin:
"""Mixin for required keys."""
value_fn: Callable
@dataclass
@dataclass(frozen=True)
class AccSensorEntityDescription(
SensorEntityDescription, AccSensorEntityDescriptionMixin
):

View File

@@ -1,10 +1,10 @@
"""Component to interface with an alarm control panel."""
from __future__ import annotations
from dataclasses import dataclass
from datetime import timedelta
from functools import partial
import logging
from typing import Any, Final, final
from typing import TYPE_CHECKING, Any, Final, final
import voluptuous as vol
@@ -23,26 +23,36 @@ from homeassistant.const import (
from homeassistant.core import HomeAssistant
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.config_validation import make_entity_service_schema
from homeassistant.helpers.deprecation import (
all_with_deprecated_constants,
check_if_deprecated_constant,
dir_with_deprecated_constants,
)
from homeassistant.helpers.entity import Entity, EntityDescription
from homeassistant.helpers.entity_component import EntityComponent
from homeassistant.helpers.typing import ConfigType
from .const import ( # noqa: F401
_DEPRECATED_FORMAT_NUMBER,
_DEPRECATED_FORMAT_TEXT,
_DEPRECATED_SUPPORT_ALARM_ARM_AWAY,
_DEPRECATED_SUPPORT_ALARM_ARM_CUSTOM_BYPASS,
_DEPRECATED_SUPPORT_ALARM_ARM_HOME,
_DEPRECATED_SUPPORT_ALARM_ARM_NIGHT,
_DEPRECATED_SUPPORT_ALARM_ARM_VACATION,
_DEPRECATED_SUPPORT_ALARM_TRIGGER,
ATTR_CHANGED_BY,
ATTR_CODE_ARM_REQUIRED,
DOMAIN,
FORMAT_NUMBER,
FORMAT_TEXT,
SUPPORT_ALARM_ARM_AWAY,
SUPPORT_ALARM_ARM_CUSTOM_BYPASS,
SUPPORT_ALARM_ARM_HOME,
SUPPORT_ALARM_ARM_NIGHT,
SUPPORT_ALARM_ARM_VACATION,
SUPPORT_ALARM_TRIGGER,
AlarmControlPanelEntityFeature,
CodeFormat,
)
if TYPE_CHECKING:
from functools import cached_property
else:
from homeassistant.backports.functools import cached_property
_LOGGER: Final = logging.getLogger(__name__)
SCAN_INTERVAL: Final = timedelta(seconds=30)
@@ -121,12 +131,19 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
return await component.async_unload_entry(entry)
@dataclass
class AlarmControlPanelEntityDescription(EntityDescription):
class AlarmControlPanelEntityDescription(EntityDescription, frozen_or_thawed=True):
"""A class that describes alarm control panel entities."""
class AlarmControlPanelEntity(Entity):
CACHED_PROPERTIES_WITH_ATTR_ = {
"code_format",
"changed_by",
"code_arm_required",
"supported_features",
}
class AlarmControlPanelEntity(Entity, cached_properties=CACHED_PROPERTIES_WITH_ATTR_):
"""An abstract class for alarm control entities."""
entity_description: AlarmControlPanelEntityDescription
@@ -137,17 +154,17 @@ class AlarmControlPanelEntity(Entity):
AlarmControlPanelEntityFeature(0)
)
@property
@cached_property
def code_format(self) -> CodeFormat | None:
"""Code format or None if no code is required."""
return self._attr_code_format
@property
@cached_property
def changed_by(self) -> str | None:
"""Last change triggered by."""
return self._attr_changed_by
@property
@cached_property
def code_arm_required(self) -> bool:
"""Whether the code is required for arm actions."""
return self._attr_code_arm_required
@@ -208,10 +225,15 @@ class AlarmControlPanelEntity(Entity):
"""Send arm custom bypass command."""
await self.hass.async_add_executor_job(self.alarm_arm_custom_bypass, code)
@property
@cached_property
def supported_features(self) -> AlarmControlPanelEntityFeature:
"""Return the list of supported features."""
return self._attr_supported_features
features = self._attr_supported_features
if type(features) is int: # noqa: E721
new_features = AlarmControlPanelEntityFeature(features)
self._report_deprecated_supported_features_values(new_features)
return new_features
return features
@final
@property
@@ -222,3 +244,13 @@ class AlarmControlPanelEntity(Entity):
ATTR_CHANGED_BY: self.changed_by,
ATTR_CODE_ARM_REQUIRED: self.code_arm_required,
}
# As we import constants of the const module here, we need to add the following
# functions to check for deprecated constants again
# These can be removed if no deprecated constant are in this module anymore
__getattr__ = partial(check_if_deprecated_constant, module_globals=globals())
__dir__ = partial(
dir_with_deprecated_constants, module_globals_keys=[*globals().keys()]
)
__all__ = all_with_deprecated_constants(globals())

View File

@@ -1,7 +1,15 @@
"""Provides the constants needed for component."""
from enum import IntFlag, StrEnum
from functools import partial
from typing import Final
from homeassistant.helpers.deprecation import (
DeprecatedConstantEnum,
all_with_deprecated_constants,
check_if_deprecated_constant,
dir_with_deprecated_constants,
)
DOMAIN: Final = "alarm_control_panel"
ATTR_CHANGED_BY: Final = "changed_by"
@@ -15,10 +23,10 @@ class CodeFormat(StrEnum):
NUMBER = "number"
# These constants are deprecated as of Home Assistant 2022.5
# These constants are deprecated as of Home Assistant 2022.5, can be removed in 2025.1
# Please use the CodeFormat enum instead.
FORMAT_TEXT: Final = "text"
FORMAT_NUMBER: Final = "number"
_DEPRECATED_FORMAT_TEXT: Final = DeprecatedConstantEnum(CodeFormat.TEXT, "2025.1")
_DEPRECATED_FORMAT_NUMBER: Final = DeprecatedConstantEnum(CodeFormat.NUMBER, "2025.1")
class AlarmControlPanelEntityFeature(IntFlag):
@@ -34,12 +42,24 @@ class AlarmControlPanelEntityFeature(IntFlag):
# These constants are deprecated as of Home Assistant 2022.5
# Please use the AlarmControlPanelEntityFeature enum instead.
SUPPORT_ALARM_ARM_HOME: Final = 1
SUPPORT_ALARM_ARM_AWAY: Final = 2
SUPPORT_ALARM_ARM_NIGHT: Final = 4
SUPPORT_ALARM_TRIGGER: Final = 8
SUPPORT_ALARM_ARM_CUSTOM_BYPASS: Final = 16
SUPPORT_ALARM_ARM_VACATION: Final = 32
_DEPRECATED_SUPPORT_ALARM_ARM_HOME: Final = DeprecatedConstantEnum(
AlarmControlPanelEntityFeature.ARM_HOME, "2025.1"
)
_DEPRECATED_SUPPORT_ALARM_ARM_AWAY: Final = DeprecatedConstantEnum(
AlarmControlPanelEntityFeature.ARM_AWAY, "2025.1"
)
_DEPRECATED_SUPPORT_ALARM_ARM_NIGHT: Final = DeprecatedConstantEnum(
AlarmControlPanelEntityFeature.ARM_NIGHT, "2025.1"
)
_DEPRECATED_SUPPORT_ALARM_TRIGGER: Final = DeprecatedConstantEnum(
AlarmControlPanelEntityFeature.TRIGGER, "2025.1"
)
_DEPRECATED_SUPPORT_ALARM_ARM_CUSTOM_BYPASS: Final = DeprecatedConstantEnum(
AlarmControlPanelEntityFeature.ARM_CUSTOM_BYPASS, "2025.1"
)
_DEPRECATED_SUPPORT_ALARM_ARM_VACATION: Final = DeprecatedConstantEnum(
AlarmControlPanelEntityFeature.ARM_VACATION, "2025.1"
)
CONDITION_TRIGGERED: Final = "is_triggered"
CONDITION_DISARMED: Final = "is_disarmed"
@@ -48,3 +68,10 @@ CONDITION_ARMED_AWAY: Final = "is_armed_away"
CONDITION_ARMED_NIGHT: Final = "is_armed_night"
CONDITION_ARMED_VACATION: Final = "is_armed_vacation"
CONDITION_ARMED_CUSTOM_BYPASS: Final = "is_armed_custom_bypass"
# These can be removed if no deprecated constant are in this module anymore
__getattr__ = partial(check_if_deprecated_constant, module_globals=globals())
__dir__ = partial(
dir_with_deprecated_constants, module_globals_keys=[*globals().keys()]
)
__all__ = all_with_deprecated_constants(globals())

View File

@@ -28,13 +28,7 @@ from homeassistant.helpers.entity import get_supported_features
from homeassistant.helpers.typing import ConfigType, TemplateVarsType
from . import ATTR_CODE_ARM_REQUIRED, DOMAIN
from .const import (
SUPPORT_ALARM_ARM_AWAY,
SUPPORT_ALARM_ARM_HOME,
SUPPORT_ALARM_ARM_NIGHT,
SUPPORT_ALARM_ARM_VACATION,
SUPPORT_ALARM_TRIGGER,
)
from .const import AlarmControlPanelEntityFeature
ACTION_TYPES: Final[set[str]] = {
"arm_away",
@@ -82,16 +76,16 @@ async def async_get_actions(
}
# Add actions for each entity that belongs to this integration
if supported_features & SUPPORT_ALARM_ARM_AWAY:
if supported_features & AlarmControlPanelEntityFeature.ARM_AWAY:
actions.append({**base_action, CONF_TYPE: "arm_away"})
if supported_features & SUPPORT_ALARM_ARM_HOME:
if supported_features & AlarmControlPanelEntityFeature.ARM_HOME:
actions.append({**base_action, CONF_TYPE: "arm_home"})
if supported_features & SUPPORT_ALARM_ARM_NIGHT:
if supported_features & AlarmControlPanelEntityFeature.ARM_NIGHT:
actions.append({**base_action, CONF_TYPE: "arm_night"})
if supported_features & SUPPORT_ALARM_ARM_VACATION:
if supported_features & AlarmControlPanelEntityFeature.ARM_VACATION:
actions.append({**base_action, CONF_TYPE: "arm_vacation"})
actions.append({**base_action, CONF_TYPE: "disarm"})
if supported_features & SUPPORT_ALARM_TRIGGER:
if supported_features & AlarmControlPanelEntityFeature.TRIGGER:
actions.append({**base_action, CONF_TYPE: "trigger"})
return actions

View File

@@ -39,11 +39,7 @@ from .const import (
CONDITION_ARMED_VACATION,
CONDITION_DISARMED,
CONDITION_TRIGGERED,
SUPPORT_ALARM_ARM_AWAY,
SUPPORT_ALARM_ARM_CUSTOM_BYPASS,
SUPPORT_ALARM_ARM_HOME,
SUPPORT_ALARM_ARM_NIGHT,
SUPPORT_ALARM_ARM_VACATION,
AlarmControlPanelEntityFeature,
)
CONDITION_TYPES: Final[set[str]] = {
@@ -90,15 +86,15 @@ async def async_get_conditions(
{**base_condition, CONF_TYPE: CONDITION_DISARMED},
{**base_condition, CONF_TYPE: CONDITION_TRIGGERED},
]
if supported_features & SUPPORT_ALARM_ARM_HOME:
if supported_features & AlarmControlPanelEntityFeature.ARM_HOME:
conditions.append({**base_condition, CONF_TYPE: CONDITION_ARMED_HOME})
if supported_features & SUPPORT_ALARM_ARM_AWAY:
if supported_features & AlarmControlPanelEntityFeature.ARM_AWAY:
conditions.append({**base_condition, CONF_TYPE: CONDITION_ARMED_AWAY})
if supported_features & SUPPORT_ALARM_ARM_NIGHT:
if supported_features & AlarmControlPanelEntityFeature.ARM_NIGHT:
conditions.append({**base_condition, CONF_TYPE: CONDITION_ARMED_NIGHT})
if supported_features & SUPPORT_ALARM_ARM_VACATION:
if supported_features & AlarmControlPanelEntityFeature.ARM_VACATION:
conditions.append({**base_condition, CONF_TYPE: CONDITION_ARMED_VACATION})
if supported_features & SUPPORT_ALARM_ARM_CUSTOM_BYPASS:
if supported_features & AlarmControlPanelEntityFeature.ARM_CUSTOM_BYPASS:
conditions.append(
{**base_condition, CONF_TYPE: CONDITION_ARMED_CUSTOM_BYPASS}
)

View File

@@ -29,12 +29,7 @@ from homeassistant.helpers.trigger import TriggerActionType, TriggerInfo
from homeassistant.helpers.typing import ConfigType
from . import DOMAIN
from .const import (
SUPPORT_ALARM_ARM_AWAY,
SUPPORT_ALARM_ARM_HOME,
SUPPORT_ALARM_ARM_NIGHT,
SUPPORT_ALARM_ARM_VACATION,
)
from .const import AlarmControlPanelEntityFeature
BASIC_TRIGGER_TYPES: Final[set[str]] = {"triggered", "disarmed", "arming"}
TRIGGER_TYPES: Final[set[str]] = BASIC_TRIGGER_TYPES | {
@@ -82,28 +77,28 @@ async def async_get_triggers(
}
for trigger in BASIC_TRIGGER_TYPES
]
if supported_features & SUPPORT_ALARM_ARM_HOME:
if supported_features & AlarmControlPanelEntityFeature.ARM_HOME:
triggers.append(
{
**base_trigger,
CONF_TYPE: "armed_home",
}
)
if supported_features & SUPPORT_ALARM_ARM_AWAY:
if supported_features & AlarmControlPanelEntityFeature.ARM_AWAY:
triggers.append(
{
**base_trigger,
CONF_TYPE: "armed_away",
}
)
if supported_features & SUPPORT_ALARM_ARM_NIGHT:
if supported_features & AlarmControlPanelEntityFeature.ARM_NIGHT:
triggers.append(
{
**base_trigger,
CONF_TYPE: "armed_night",
}
)
if supported_features & SUPPORT_ALARM_ARM_VACATION:
if supported_features & AlarmControlPanelEntityFeature.ARM_VACATION:
triggers.append(
{
**base_trigger,

View File

@@ -0,0 +1,41 @@
"""Helper to test significant Alarm Control Panel state changes."""
from __future__ import annotations
from typing import Any
from homeassistant.core import HomeAssistant, callback
from . import ATTR_CHANGED_BY, ATTR_CODE_ARM_REQUIRED
SIGNIFICANT_ATTRIBUTES: set[str] = {
ATTR_CHANGED_BY,
ATTR_CODE_ARM_REQUIRED,
}
@callback
def async_check_significant_change(
hass: HomeAssistant,
old_state: str,
old_attrs: dict,
new_state: str,
new_attrs: dict,
**kwargs: Any,
) -> bool | None:
"""Test if state significantly changed."""
if old_state != new_state:
return True
old_attrs_s = set(
{k: v for k, v in old_attrs.items() if k in SIGNIFICANT_ATTRIBUTES}.items()
)
new_attrs_s = set(
{k: v for k, v in new_attrs.items() if k in SIGNIFICANT_ATTRIBUTES}.items()
)
changed_attrs: set[str] = {item[0] for item in old_attrs_s ^ new_attrs_s}
if changed_attrs:
return True
# no significant attribute change detected
return False

View File

@@ -2,6 +2,7 @@
from __future__ import annotations
import logging
from typing import Any
from adext import AdExt
from alarmdecoder.devices import SerialDevice, SocketDevice
@@ -12,8 +13,10 @@ from homeassistant import config_entries
from homeassistant.components.binary_sensor import (
DEVICE_CLASSES_SCHEMA as BINARY_SENSOR_DEVICE_CLASSES_SCHEMA,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST, CONF_PORT, CONF_PROTOCOL
from homeassistant.core import callback
from homeassistant.data_entry_flow import FlowResult
from .const import (
CONF_ALT_NIGHT_MODE,
@@ -66,7 +69,9 @@ class AlarmDecoderFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
"""Get the options flow for AlarmDecoder."""
return AlarmDecoderOptionsFlowHandler(config_entry)
async def async_step_user(self, user_input=None):
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Handle a flow initialized by the user."""
if user_input is not None:
self.protocol = user_input[CONF_PROTOCOL]
@@ -83,7 +88,9 @@ class AlarmDecoderFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
),
)
async def async_step_protocol(self, user_input=None):
async def async_step_protocol(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Handle AlarmDecoder protocol setup."""
errors = {}
if user_input is not None:
@@ -146,15 +153,18 @@ class AlarmDecoderFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
class AlarmDecoderOptionsFlowHandler(config_entries.OptionsFlow):
"""Handle AlarmDecoder options."""
selected_zone: str | None = None
def __init__(self, config_entry: config_entries.ConfigEntry) -> None:
"""Initialize AlarmDecoder options flow."""
self.arm_options = config_entry.options.get(OPTIONS_ARM, DEFAULT_ARM_OPTIONS)
self.zone_options = config_entry.options.get(
OPTIONS_ZONES, DEFAULT_ZONE_OPTIONS
)
self.selected_zone = None
async def async_step_init(self, user_input=None):
async def async_step_init(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Manage the options."""
if user_input is not None:
if user_input[EDIT_KEY] == EDIT_SETTINGS:
@@ -173,7 +183,9 @@ class AlarmDecoderOptionsFlowHandler(config_entries.OptionsFlow):
),
)
async def async_step_arm_settings(self, user_input=None):
async def async_step_arm_settings(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Arming options form."""
if user_input is not None:
return self.async_create_entry(
@@ -200,7 +212,9 @@ class AlarmDecoderOptionsFlowHandler(config_entries.OptionsFlow):
),
)
async def async_step_zone_select(self, user_input=None):
async def async_step_zone_select(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Zone selection form."""
errors = _validate_zone_input(user_input)
@@ -216,7 +230,9 @@ class AlarmDecoderOptionsFlowHandler(config_entries.OptionsFlow):
errors=errors,
)
async def async_step_zone_details(self, user_input=None):
async def async_step_zone_details(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Zone details form."""
errors = _validate_zone_input(user_input)
@@ -293,7 +309,7 @@ class AlarmDecoderOptionsFlowHandler(config_entries.OptionsFlow):
)
def _validate_zone_input(zone_input):
def _validate_zone_input(zone_input: dict[str, Any] | None) -> dict[str, str]:
if not zone_input:
return {}
errors = {}
@@ -327,7 +343,7 @@ def _validate_zone_input(zone_input):
return errors
def _fix_input_types(zone_input):
def _fix_input_types(zone_input: dict[str, Any]) -> dict[str, Any]:
"""Convert necessary keys to int.
Since ConfigFlow inputs of type int cannot default to an empty string, we collect the values below as
@@ -341,7 +357,9 @@ def _fix_input_types(zone_input):
return zone_input
def _device_already_added(current_entries, user_input, protocol):
def _device_already_added(
current_entries: list[ConfigEntry], user_input: dict[str, Any], protocol: str | None
) -> bool:
"""Determine if entry has already been added to HA."""
user_host = user_input.get(CONF_HOST)
user_port = user_input.get(CONF_PORT)

View File

@@ -36,6 +36,15 @@ CONF_FLASH_BRIEFINGS = "flash_briefings"
CONF_SMART_HOME = "smart_home"
DEFAULT_LOCALE = "en-US"
# Alexa Smart Home API send events gateway endpoints
# https://developer.amazon.com/en-US/docs/alexa/smarthome/send-events.html#endpoints
VALID_ENDPOINTS = [
"https://api.amazonalexa.com/v3/events",
"https://api.eu.amazonalexa.com/v3/events",
"https://api.fe.amazonalexa.com/v3/events",
]
ALEXA_ENTITY_SCHEMA = vol.Schema(
{
vol.Optional(CONF_DESCRIPTION): cv.string,
@@ -46,7 +55,7 @@ ALEXA_ENTITY_SCHEMA = vol.Schema(
SMART_HOME_SCHEMA = vol.Schema(
{
vol.Optional(CONF_ENDPOINT): cv.string,
vol.Optional(CONF_ENDPOINT): vol.All(vol.Lower, vol.In(VALID_ENDPOINTS)),
vol.Optional(CONF_CLIENT_ID): cv.string,
vol.Optional(CONF_CLIENT_SECRET): cv.string,
vol.Optional(CONF_LOCALE, default=DEFAULT_LOCALE): vol.In(

View File

@@ -19,6 +19,8 @@ from homeassistant.components import (
number,
timer,
vacuum,
valve,
water_heater,
)
from homeassistant.components.alarm_control_panel import (
AlarmControlPanelEntityFeature,
@@ -435,7 +437,8 @@ class AlexaPowerController(AlexaCapability):
is_on = self.entity.state == vacuum.STATE_CLEANING
elif self.entity.domain == timer.DOMAIN:
is_on = self.entity.state != STATE_IDLE
elif self.entity.domain == water_heater.DOMAIN:
is_on = self.entity.state not in (STATE_OFF, STATE_UNKNOWN)
else:
is_on = self.entity.state != STATE_OFF
@@ -938,6 +941,9 @@ class AlexaTemperatureSensor(AlexaCapability):
if self.entity.domain == climate.DOMAIN:
unit = self.hass.config.units.temperature_unit
temp = self.entity.attributes.get(climate.ATTR_CURRENT_TEMPERATURE)
elif self.entity.domain == water_heater.DOMAIN:
unit = self.hass.config.units.temperature_unit
temp = self.entity.attributes.get(water_heater.ATTR_CURRENT_TEMPERATURE)
if temp is None or temp in (STATE_UNAVAILABLE, STATE_UNKNOWN):
return None
@@ -1108,6 +1114,8 @@ class AlexaThermostatController(AlexaCapability):
supported = self.entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
if supported & climate.ClimateEntityFeature.TARGET_TEMPERATURE:
properties.append({"name": "targetSetpoint"})
if supported & water_heater.WaterHeaterEntityFeature.TARGET_TEMPERATURE:
properties.append({"name": "targetSetpoint"})
if supported & climate.ClimateEntityFeature.TARGET_TEMPERATURE_RANGE:
properties.append({"name": "lowerSetpoint"})
properties.append({"name": "upperSetpoint"})
@@ -1127,6 +1135,8 @@ class AlexaThermostatController(AlexaCapability):
return None
if name == "thermostatMode":
if self.entity.domain == water_heater.DOMAIN:
return None
preset = self.entity.attributes.get(climate.ATTR_PRESET_MODE)
mode: dict[str, str] | str | None
@@ -1176,9 +1186,13 @@ class AlexaThermostatController(AlexaCapability):
ThermostatMode Values.
ThermostatMode Value must be AUTO, COOL, HEAT, ECO, OFF, or CUSTOM.
Water heater devices do not return thermostat modes.
"""
if self.entity.domain == water_heater.DOMAIN:
return None
supported_modes: list[str] = []
hvac_modes = self.entity.attributes[climate.ATTR_HVAC_MODES]
hvac_modes = self.entity.attributes.get(climate.ATTR_HVAC_MODES, [])
for mode in hvac_modes:
if thermostat_mode := API_THERMOSTAT_MODES.get(mode):
supported_modes.append(thermostat_mode)
@@ -1408,6 +1422,16 @@ class AlexaModeController(AlexaCapability):
if mode in self.entity.attributes.get(humidifier.ATTR_AVAILABLE_MODES, []):
return f"{humidifier.ATTR_MODE}.{mode}"
# Water heater operation mode
if self.instance == f"{water_heater.DOMAIN}.{water_heater.ATTR_OPERATION_MODE}":
operation_mode = self.entity.attributes.get(
water_heater.ATTR_OPERATION_MODE, None
)
if operation_mode in self.entity.attributes.get(
water_heater.ATTR_OPERATION_LIST, []
):
return f"{water_heater.ATTR_OPERATION_MODE}.{operation_mode}"
# Cover Position
if self.instance == f"{cover.DOMAIN}.{cover.ATTR_POSITION}":
# Return state instead of position when using ModeController.
@@ -1421,6 +1445,19 @@ class AlexaModeController(AlexaCapability):
):
return f"{cover.ATTR_POSITION}.{mode}"
# Valve position state
if self.instance == f"{valve.DOMAIN}.state":
# Return state instead of position when using ModeController.
state = self.entity.state
if state in (
valve.STATE_OPEN,
valve.STATE_OPENING,
valve.STATE_CLOSED,
valve.STATE_CLOSING,
STATE_UNKNOWN,
):
return f"state.{state}"
return None
def configuration(self) -> dict[str, Any] | None:
@@ -1478,6 +1515,26 @@ class AlexaModeController(AlexaCapability):
)
return self._resource.serialize_capability_resources()
# Water heater operation modes
if self.instance == f"{water_heater.DOMAIN}.{water_heater.ATTR_OPERATION_MODE}":
self._resource = AlexaModeResource([AlexaGlobalCatalog.SETTING_MODE], False)
operation_modes = self.entity.attributes.get(
water_heater.ATTR_OPERATION_LIST, []
)
for operation_mode in operation_modes:
self._resource.add_mode(
f"{water_heater.ATTR_OPERATION_MODE}.{operation_mode}",
[operation_mode],
)
# Devices with a single mode completely break Alexa discovery,
# add a fake preset (see issue #53832).
if len(operation_modes) == 1:
self._resource.add_mode(
f"{water_heater.ATTR_OPERATION_MODE}.{PRESET_MODE_NA}",
[PRESET_MODE_NA],
)
return self._resource.serialize_capability_resources()
# Cover Position Resources
if self.instance == f"{cover.DOMAIN}.{cover.ATTR_POSITION}":
self._resource = AlexaModeResource(
@@ -1497,6 +1554,32 @@ class AlexaModeController(AlexaCapability):
)
return self._resource.serialize_capability_resources()
# Valve position resources
if self.instance == f"{valve.DOMAIN}.state":
supported_features = self.entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
self._resource = AlexaModeResource(
["Preset", AlexaGlobalCatalog.SETTING_PRESET], False
)
modes = 0
if supported_features & valve.ValveEntityFeature.OPEN:
self._resource.add_mode(
f"state.{valve.STATE_OPEN}",
["Open", AlexaGlobalCatalog.SETTING_PRESET],
)
modes += 1
if supported_features & valve.ValveEntityFeature.CLOSE:
self._resource.add_mode(
f"state.{valve.STATE_CLOSED}",
["Closed", AlexaGlobalCatalog.SETTING_PRESET],
)
modes += 1
# Alexa requiers at least 2 modes
if modes == 1:
self._resource.add_mode(f"state.{PRESET_MODE_NA}", [PRESET_MODE_NA])
return self._resource.serialize_capability_resources()
return {}
def semantics(self) -> dict[str, Any] | None:
@@ -1535,6 +1618,34 @@ class AlexaModeController(AlexaCapability):
return self._semantics.serialize_semantics()
# Valve Position
if self.instance == f"{valve.DOMAIN}.state":
close_labels = [AlexaSemantics.ACTION_CLOSE]
open_labels = [AlexaSemantics.ACTION_OPEN]
self._semantics = AlexaSemantics()
self._semantics.add_states_to_value(
[AlexaSemantics.STATES_CLOSED],
f"state.{valve.STATE_CLOSED}",
)
self._semantics.add_states_to_value(
[AlexaSemantics.STATES_OPEN],
f"state.{valve.STATE_OPEN}",
)
self._semantics.add_action_to_directive(
close_labels,
"SetMode",
{"mode": f"state.{valve.STATE_CLOSED}"},
)
self._semantics.add_action_to_directive(
open_labels,
"SetMode",
{"mode": f"state.{valve.STATE_OPEN}"},
)
return self._semantics.serialize_semantics()
return None
@@ -1648,6 +1759,10 @@ class AlexaRangeController(AlexaCapability):
)
return speed_index
# Valve Position
if self.instance == f"{valve.DOMAIN}.{valve.ATTR_POSITION}":
return self.entity.attributes.get(valve.ATTR_CURRENT_POSITION)
return None
def configuration(self) -> dict[str, Any] | None:
@@ -1771,6 +1886,17 @@ class AlexaRangeController(AlexaCapability):
return self._resource.serialize_capability_resources()
# Valve Position Resources
if self.instance == f"{valve.DOMAIN}.{valve.ATTR_POSITION}":
self._resource = AlexaPresetResource(
["Opening", AlexaGlobalCatalog.SETTING_OPENING],
min_value=0,
max_value=100,
precision=1,
unit=AlexaGlobalCatalog.UNIT_PERCENT,
)
return self._resource.serialize_capability_resources()
return {}
def semantics(self) -> dict[str, Any] | None:
@@ -1847,6 +1973,25 @@ class AlexaRangeController(AlexaCapability):
)
return self._semantics.serialize_semantics()
# Valve Position
if self.instance == f"{valve.DOMAIN}.{valve.ATTR_POSITION}":
close_labels = [AlexaSemantics.ACTION_CLOSE]
open_labels = [AlexaSemantics.ACTION_OPEN]
self._semantics = AlexaSemantics()
self._semantics.add_states_to_value([AlexaSemantics.STATES_CLOSED], value=0)
self._semantics.add_states_to_range(
[AlexaSemantics.STATES_OPEN], min_value=1, max_value=100
)
self._semantics.add_action_to_directive(
close_labels, "SetRangeValue", {"rangeValue": 0}
)
self._semantics.add_action_to_directive(
open_labels, "SetRangeValue", {"rangeValue": 100}
)
return self._semantics.serialize_semantics()
return None
@@ -1920,6 +2065,10 @@ class AlexaToggleController(AlexaCapability):
is_on = bool(self.entity.attributes.get(fan.ATTR_OSCILLATING))
return "ON" if is_on else "OFF"
# Stop Valve
if self.instance == f"{valve.DOMAIN}.stop":
return "OFF"
return None
def capability_resources(self) -> dict[str, list[dict[str, Any]]]:
@@ -1932,6 +2081,10 @@ class AlexaToggleController(AlexaCapability):
)
return self._resource.serialize_capability_resources()
if self.instance == f"{valve.DOMAIN}.stop":
self._resource = AlexaCapabilityResource(["Stop"])
return self._resource.serialize_capability_resources()
return {}

View File

@@ -32,6 +32,8 @@ from homeassistant.components import (
switch,
timer,
vacuum,
valve,
water_heater,
)
from homeassistant.const import (
ATTR_DEVICE_CLASS,
@@ -248,6 +250,9 @@ class DisplayCategory:
# Indicates a vacuum cleaner.
VACUUM_CLEANER = "VACUUM_CLEANER"
# Indicates a water heater.
WATER_HEATER = "WATER_HEATER"
# Indicates a network-connected wearable device, such as an Apple Watch,
# Fitbit, or Samsung Gear.
WEARABLE = "WEARABLE"
@@ -456,23 +461,46 @@ class ButtonCapabilities(AlexaEntity):
@ENTITY_ADAPTERS.register(climate.DOMAIN)
@ENTITY_ADAPTERS.register(water_heater.DOMAIN)
class ClimateCapabilities(AlexaEntity):
"""Class to represent Climate capabilities."""
def default_display_categories(self) -> list[str]:
"""Return the display categories for this entity."""
if self.entity.domain == water_heater.DOMAIN:
return [DisplayCategory.WATER_HEATER]
return [DisplayCategory.THERMOSTAT]
def interfaces(self) -> Generator[AlexaCapability, None, None]:
"""Yield the supported interfaces."""
# If we support two modes, one being off, we allow turning on too.
if climate.HVACMode.OFF in self.entity.attributes.get(
climate.ATTR_HVAC_MODES, []
supported_features = self.entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
if (
self.entity.domain == climate.DOMAIN
and climate.HVACMode.OFF
in self.entity.attributes.get(climate.ATTR_HVAC_MODES, [])
or self.entity.domain == water_heater.DOMAIN
and (supported_features & water_heater.WaterHeaterEntityFeature.ON_OFF)
):
yield AlexaPowerController(self.entity)
yield AlexaThermostatController(self.hass, self.entity)
yield AlexaTemperatureSensor(self.hass, self.entity)
if (
self.entity.domain == climate.DOMAIN
or self.entity.domain == water_heater.DOMAIN
and (
supported_features
& water_heater.WaterHeaterEntityFeature.OPERATION_MODE
)
):
yield AlexaThermostatController(self.hass, self.entity)
yield AlexaTemperatureSensor(self.hass, self.entity)
if self.entity.domain == water_heater.DOMAIN and (
supported_features & water_heater.WaterHeaterEntityFeature.OPERATION_MODE
):
yield AlexaModeController(
self.entity,
instance=f"{water_heater.DOMAIN}.{water_heater.ATTR_OPERATION_MODE}",
)
yield AlexaEndpointHealth(self.hass, self.entity)
yield Alexa(self.entity)
@@ -949,6 +977,31 @@ class VacuumCapabilities(AlexaEntity):
yield Alexa(self.entity)
@ENTITY_ADAPTERS.register(valve.DOMAIN)
class ValveCapabilities(AlexaEntity):
"""Class to represent Valve capabilities."""
def default_display_categories(self) -> list[str]:
"""Return the display categories for this entity."""
return [DisplayCategory.OTHER]
def interfaces(self) -> Generator[AlexaCapability, None, None]:
"""Yield the supported interfaces."""
supported = self.entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
if supported & valve.ValveEntityFeature.SET_POSITION:
yield AlexaRangeController(
self.entity, instance=f"{valve.DOMAIN}.{valve.ATTR_POSITION}"
)
elif supported & (
valve.ValveEntityFeature.CLOSE | valve.ValveEntityFeature.OPEN
):
yield AlexaModeController(self.entity, instance=f"{valve.DOMAIN}.state")
if supported & valve.ValveEntityFeature.STOP:
yield AlexaToggleController(self.entity, instance=f"{valve.DOMAIN}.stop")
yield AlexaEndpointHealth(self.hass, self.entity)
yield Alexa(self.entity)
@ENTITY_ADAPTERS.register(camera.DOMAIN)
class CameraCapabilities(AlexaEntity):
"""Class to represent Camera capabilities."""

View File

@@ -22,6 +22,8 @@ from homeassistant.components import (
number,
timer,
vacuum,
valve,
water_heater,
)
from homeassistant.const import (
ATTR_ENTITY_ID,
@@ -80,6 +82,23 @@ from .state_report import AlexaDirective, AlexaResponse, async_enable_proactive_
_LOGGER = logging.getLogger(__name__)
DIRECTIVE_NOT_SUPPORTED = "Entity does not support directive"
MIN_MAX_TEMP = {
climate.DOMAIN: {
"min_temp": climate.ATTR_MIN_TEMP,
"max_temp": climate.ATTR_MAX_TEMP,
},
water_heater.DOMAIN: {
"min_temp": water_heater.ATTR_MIN_TEMP,
"max_temp": water_heater.ATTR_MAX_TEMP,
},
}
SERVICE_SET_TEMPERATURE = {
climate.DOMAIN: climate.SERVICE_SET_TEMPERATURE,
water_heater.DOMAIN: water_heater.SERVICE_SET_TEMPERATURE,
}
HANDLERS: Registry[
tuple[str, str],
Callable[
@@ -804,8 +823,10 @@ async def async_api_set_target_temp(
) -> AlexaResponse:
"""Process a set target temperature request."""
entity = directive.entity
min_temp = entity.attributes[climate.ATTR_MIN_TEMP]
max_temp = entity.attributes[climate.ATTR_MAX_TEMP]
domain = entity.domain
min_temp = entity.attributes[MIN_MAX_TEMP[domain]["min_temp"]]
max_temp = entity.attributes["max_temp"]
unit = hass.config.units.temperature_unit
data: dict[str, Any] = {ATTR_ENTITY_ID: entity.entity_id}
@@ -849,9 +870,11 @@ async def async_api_set_target_temp(
}
)
service = SERVICE_SET_TEMPERATURE[domain]
await hass.services.async_call(
entity.domain,
climate.SERVICE_SET_TEMPERATURE,
service,
data,
blocking=False,
context=context,
@@ -867,11 +890,12 @@ async def async_api_adjust_target_temp(
directive: AlexaDirective,
context: ha.Context,
) -> AlexaResponse:
"""Process an adjust target temperature request."""
"""Process an adjust target temperature request for climates and water heaters."""
data: dict[str, Any]
entity = directive.entity
min_temp = entity.attributes[climate.ATTR_MIN_TEMP]
max_temp = entity.attributes[climate.ATTR_MAX_TEMP]
domain = entity.domain
min_temp = entity.attributes[MIN_MAX_TEMP[domain]["min_temp"]]
max_temp = entity.attributes[MIN_MAX_TEMP[domain]["max_temp"]]
unit = hass.config.units.temperature_unit
temp_delta = temperature_from_object(
@@ -932,9 +956,11 @@ async def async_api_adjust_target_temp(
}
)
service = SERVICE_SET_TEMPERATURE[domain]
await hass.services.async_call(
entity.domain,
climate.SERVICE_SET_TEMPERATURE,
service,
data,
blocking=False,
context=context,
@@ -1163,6 +1189,23 @@ async def async_api_set_mode(
msg = f"Entity '{entity.entity_id}' does not support Mode '{mode}'"
raise AlexaInvalidValueError(msg)
# Water heater operation mode
elif instance == f"{water_heater.DOMAIN}.{water_heater.ATTR_OPERATION_MODE}":
operation_mode = mode.split(".")[1]
operation_modes: list[str] | None = entity.attributes.get(
water_heater.ATTR_OPERATION_LIST
)
if (
operation_mode != PRESET_MODE_NA
and operation_modes
and operation_mode in operation_modes
):
service = water_heater.SERVICE_SET_OPERATION_MODE
data[water_heater.ATTR_OPERATION_MODE] = operation_mode
else:
msg = f"Entity '{entity.entity_id}' does not support Operation mode '{operation_mode}'"
raise AlexaInvalidValueError(msg)
# Cover Position
elif instance == f"{cover.DOMAIN}.{cover.ATTR_POSITION}":
position = mode.split(".")[1]
@@ -1174,6 +1217,15 @@ async def async_api_set_mode(
elif position == "custom":
service = cover.SERVICE_STOP_COVER
# Valve position state
elif instance == f"{valve.DOMAIN}.state":
position = mode.split(".")[1]
if position == valve.STATE_CLOSED:
service = valve.SERVICE_CLOSE_VALVE
elif position == valve.STATE_OPEN:
service = valve.SERVICE_OPEN_VALVE
if not service:
raise AlexaInvalidDirectiveError(DIRECTIVE_NOT_SUPPORTED)
@@ -1224,15 +1276,22 @@ async def async_api_toggle_on(
instance = directive.instance
domain = entity.domain
# Fan Oscillating
if instance != f"{fan.DOMAIN}.{fan.ATTR_OSCILLATING}":
raise AlexaInvalidDirectiveError(DIRECTIVE_NOT_SUPPORTED)
data: dict[str, Any]
service = fan.SERVICE_OSCILLATE
data: dict[str, Any] = {
ATTR_ENTITY_ID: entity.entity_id,
fan.ATTR_OSCILLATING: True,
}
# Fan Oscillating
if instance == f"{fan.DOMAIN}.{fan.ATTR_OSCILLATING}":
service = fan.SERVICE_OSCILLATE
data = {
ATTR_ENTITY_ID: entity.entity_id,
fan.ATTR_OSCILLATING: True,
}
elif instance == f"{valve.DOMAIN}.stop":
service = valve.SERVICE_STOP_VALVE
data = {
ATTR_ENTITY_ID: entity.entity_id,
}
else:
raise AlexaInvalidDirectiveError(DIRECTIVE_NOT_SUPPORTED)
await hass.services.async_call(
domain, service, data, blocking=False, context=context
@@ -1304,13 +1363,14 @@ async def async_api_set_range(
service = None
data: dict[str, Any] = {ATTR_ENTITY_ID: entity.entity_id}
range_value = directive.payload["rangeValue"]
supported = entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
# Cover Position
if instance == f"{cover.DOMAIN}.{cover.ATTR_POSITION}":
range_value = int(range_value)
if range_value == 0:
if supported & cover.CoverEntityFeature.CLOSE and range_value == 0:
service = cover.SERVICE_CLOSE_COVER
elif range_value == 100:
elif supported & cover.CoverEntityFeature.OPEN and range_value == 100:
service = cover.SERVICE_OPEN_COVER
else:
service = cover.SERVICE_SET_COVER_POSITION
@@ -1319,9 +1379,9 @@ async def async_api_set_range(
# Cover Tilt
elif instance == f"{cover.DOMAIN}.tilt":
range_value = int(range_value)
if range_value == 0:
if supported & cover.CoverEntityFeature.CLOSE_TILT and range_value == 0:
service = cover.SERVICE_CLOSE_COVER_TILT
elif range_value == 100:
elif supported & cover.CoverEntityFeature.OPEN_TILT and range_value == 100:
service = cover.SERVICE_OPEN_COVER_TILT
else:
service = cover.SERVICE_SET_COVER_TILT_POSITION
@@ -1332,13 +1392,11 @@ async def async_api_set_range(
range_value = int(range_value)
if range_value == 0:
service = fan.SERVICE_TURN_OFF
elif supported & fan.FanEntityFeature.SET_SPEED:
service = fan.SERVICE_SET_PERCENTAGE
data[fan.ATTR_PERCENTAGE] = range_value
else:
supported = entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
if supported and fan.FanEntityFeature.SET_SPEED:
service = fan.SERVICE_SET_PERCENTAGE
data[fan.ATTR_PERCENTAGE] = range_value
else:
service = fan.SERVICE_TURN_ON
service = fan.SERVICE_TURN_ON
# Humidifier target humidity
elif instance == f"{humidifier.DOMAIN}.{humidifier.ATTR_HUMIDITY}":
@@ -1376,6 +1434,17 @@ async def async_api_set_range(
data[vacuum.ATTR_FAN_SPEED] = speed
# Valve Position
elif instance == f"{valve.DOMAIN}.{valve.ATTR_POSITION}":
range_value = int(range_value)
if supported & valve.ValveEntityFeature.CLOSE and range_value == 0:
service = valve.SERVICE_CLOSE_VALVE
elif supported & valve.ValveEntityFeature.OPEN and range_value == 100:
service = valve.SERVICE_OPEN_VALVE
else:
service = valve.SERVICE_SET_VALVE_POSITION
data[valve.ATTR_POSITION] = range_value
else:
raise AlexaInvalidDirectiveError(DIRECTIVE_NOT_SUPPORTED)
@@ -1521,6 +1590,21 @@ async def async_api_adjust_range(
)
data[vacuum.ATTR_FAN_SPEED] = response_value = speed
# Valve Position
elif instance == f"{valve.DOMAIN}.{valve.ATTR_POSITION}":
range_delta = int(range_delta * 20) if range_delta_default else int(range_delta)
service = valve.SERVICE_SET_VALVE_POSITION
if not (current := entity.attributes.get(valve.ATTR_POSITION)):
msg = f"Unable to determine {entity.entity_id} current position"
raise AlexaInvalidValueError(msg)
position = response_value = min(100, max(0, range_delta + current))
if position == 100:
service = valve.SERVICE_OPEN_VALVE
elif position == 0:
service = valve.SERVICE_CLOSE_VALVE
else:
data[valve.ATTR_POSITION] = position
else:
raise AlexaInvalidDirectiveError(DIRECTIVE_NOT_SUPPORTED)

View File

@@ -4,7 +4,6 @@ import logging
from homeassistant.const import Platform
DOMAIN = "amberelectric"
CONF_API_TOKEN = "api_token"
CONF_SITE_NAME = "site_name"
CONF_SITE_ID = "site_id"
CONF_SITE_NMI = "site_nmi"

View File

@@ -1,5 +1,6 @@
"""Config flow for Ambiclimate."""
import logging
from typing import Any
from aiohttp import web
import ambiclimate
@@ -7,7 +8,8 @@ import ambiclimate
from homeassistant import config_entries
from homeassistant.components.http import HomeAssistantView
from homeassistant.const import CONF_CLIENT_ID, CONF_CLIENT_SECRET
from homeassistant.core import callback
from homeassistant.core import HomeAssistant, callback
from homeassistant.data_entry_flow import FlowResult
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.network import get_url
from homeassistant.helpers.storage import Store
@@ -26,7 +28,9 @@ _LOGGER = logging.getLogger(__name__)
@callback
def register_flow_implementation(hass, client_id, client_secret):
def register_flow_implementation(
hass: HomeAssistant, client_id: str, client_secret: str
) -> None:
"""Register a ambiclimate implementation.
client_id: Client id.
@@ -50,7 +54,9 @@ class AmbiclimateFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
self._registered_view = False
self._oauth = None
async def async_step_user(self, user_input=None):
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Handle external yaml configuration."""
self._async_abort_entries_match()
@@ -62,7 +68,9 @@ class AmbiclimateFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
return await self.async_step_auth()
async def async_step_auth(self, user_input=None):
async def async_step_auth(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Handle a flow start."""
self._async_abort_entries_match()
@@ -83,7 +91,7 @@ class AmbiclimateFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
errors=errors,
)
async def async_step_code(self, code=None):
async def async_step_code(self, code: str | None = None) -> FlowResult:
"""Received code for authentication."""
self._async_abort_entries_match()
@@ -95,7 +103,7 @@ class AmbiclimateFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
return self.async_create_entry(title="Ambiclimate", data=config)
async def _get_token_info(self, code):
async def _get_token_info(self, code: str | None) -> dict[str, Any] | None:
oauth = self._generate_oauth()
try:
token_info = await oauth.get_access_token(code)
@@ -103,16 +111,16 @@ class AmbiclimateFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
_LOGGER.exception("Failed to get access token")
return None
store = Store(self.hass, STORAGE_VERSION, STORAGE_KEY)
store = Store[dict[str, Any]](self.hass, STORAGE_VERSION, STORAGE_KEY)
await store.async_save(token_info)
return token_info
def _generate_view(self):
def _generate_view(self) -> None:
self.hass.http.register_view(AmbiclimateAuthCallbackView())
self._registered_view = True
def _generate_oauth(self):
def _generate_oauth(self) -> ambiclimate.AmbiclimateOAuth:
config = self.hass.data[DATA_AMBICLIMATE_IMPL]
clientsession = async_get_clientsession(self.hass)
callback_url = self._cb_url()

View File

@@ -63,14 +63,14 @@ TYPE_RELAY8 = "relay8"
TYPE_RELAY9 = "relay9"
@dataclass
@dataclass(frozen=True)
class AmbientBinarySensorDescriptionMixin:
"""Define an entity description mixin for binary sensors."""
on_state: Literal[0, 1]
@dataclass
@dataclass(frozen=True)
class AmbientBinarySensorDescription(
BinarySensorEntityDescription, AmbientBinarySensorDescriptionMixin
):

View File

@@ -35,7 +35,7 @@ if TYPE_CHECKING:
from . import AmcrestDevice
@dataclass
@dataclass(frozen=True)
class AmcrestSensorEntityDescription(BinarySensorEntityDescription):
"""Describe Amcrest sensor entity."""

View File

@@ -23,14 +23,14 @@ from .coordinator import AndroidIPCamDataUpdateCoordinator
from .entity import AndroidIPCamBaseEntity
@dataclass
@dataclass(frozen=True)
class AndroidIPWebcamSensorEntityDescriptionMixin:
"""Mixin for required keys."""
value_fn: Callable[[PyDroidIPCam], StateType]
@dataclass
@dataclass(frozen=True)
class AndroidIPWebcamSensorEntityDescription(
SensorEntityDescription, AndroidIPWebcamSensorEntityDescriptionMixin
):

View File

@@ -18,7 +18,7 @@ from .coordinator import AndroidIPCamDataUpdateCoordinator
from .entity import AndroidIPCamBaseEntity
@dataclass
@dataclass(frozen=True)
class AndroidIPWebcamSwitchEntityDescriptionMixin:
"""Mixin for required keys."""
@@ -26,7 +26,7 @@ class AndroidIPWebcamSwitchEntityDescriptionMixin:
off_func: Callable[[PyDroidIPCam], Coroutine[Any, Any, bool]]
@dataclass
@dataclass(frozen=True)
class AndroidIPWebcamSwitchEntityDescription(
SwitchEntityDescription, AndroidIPWebcamSwitchEntityDescriptionMixin
):

View File

@@ -160,7 +160,7 @@ def adb_decorator(
"""
def _adb_decorator(
func: _FuncType[_ADBDeviceT, _P, _R]
func: _FuncType[_ADBDeviceT, _P, _R],
) -> _ReturnFuncType[_ADBDeviceT, _P, _R]:
"""Wrap the provided ADB method and catch exceptions."""

View File

@@ -14,7 +14,7 @@ from androidtvremote2 import (
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST, CONF_NAME, EVENT_HOMEASSISTANT_STOP, Platform
from homeassistant.core import HomeAssistant, callback
from homeassistant.core import Event, HomeAssistant, callback
from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady
from .const import DOMAIN
@@ -69,7 +69,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
@callback
def on_hass_stop(event) -> None:
def on_hass_stop(event: Event) -> None:
"""Stop push updates when hass stops."""
api.disconnect()

View File

@@ -23,14 +23,14 @@ from .entity import AnovaDescriptionEntity
from .models import AnovaData
@dataclass
@dataclass(frozen=True)
class AnovaSensorEntityDescriptionMixin:
"""Describes the mixin variables for anova sensors."""
value_fn: Callable[[APCUpdateSensor], float | int | str]
@dataclass
@dataclass(frozen=True)
class AnovaSensorEntityDescription(
SensorEntityDescription, AnovaSensorEntityDescriptionMixin
):

View File

@@ -10,18 +10,12 @@ from anthemav.device_error import DeviceError
import voluptuous as vol
from homeassistant.config_entries import ConfigFlow
from homeassistant.const import CONF_HOST, CONF_MAC, CONF_PORT
from homeassistant.const import CONF_HOST, CONF_MAC, CONF_MODEL, CONF_PORT
from homeassistant.data_entry_flow import FlowResult
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.device_registry import format_mac
from .const import (
CONF_MODEL,
DEFAULT_NAME,
DEFAULT_PORT,
DEVICE_TIMEOUT_SECONDS,
DOMAIN,
)
from .const import DEFAULT_NAME, DEFAULT_PORT, DEVICE_TIMEOUT_SECONDS, DOMAIN
_LOGGER = logging.getLogger(__name__)

View File

@@ -1,6 +1,6 @@
"""Constants for the Anthem A/V Receivers integration."""
ANTHEMAV_UPDATE_SIGNAL = "anthemav_update"
CONF_MODEL = "model"
DEFAULT_NAME = "Anthem AV"
DEFAULT_PORT = 14999
DOMAIN = "anthemav"

View File

@@ -13,13 +13,13 @@ from homeassistant.components.media_player import (
MediaPlayerState,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_MAC
from homeassistant.const import CONF_MAC, CONF_MODEL
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import ANTHEMAV_UPDATE_SIGNAL, CONF_MODEL, DOMAIN, MANUFACTURER
from .const import ANTHEMAV_UPDATE_SIGNAL, DOMAIN, MANUFACTURER
_LOGGER = logging.getLogger(__name__)

View File

@@ -0,0 +1,73 @@
"""The A. O. Smith integration."""
from __future__ import annotations
from dataclasses import dataclass
from py_aosmith import AOSmithAPIClient
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_EMAIL, CONF_PASSWORD, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import aiohttp_client, device_registry as dr
from .const import DOMAIN
from .coordinator import AOSmithEnergyCoordinator, AOSmithStatusCoordinator
PLATFORMS: list[Platform] = [Platform.SENSOR, Platform.WATER_HEATER]
@dataclass
class AOSmithData:
"""Data for the A. O. Smith integration."""
client: AOSmithAPIClient
status_coordinator: AOSmithStatusCoordinator
energy_coordinator: AOSmithEnergyCoordinator
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up A. O. Smith from a config entry."""
email = entry.data[CONF_EMAIL]
password = entry.data[CONF_PASSWORD]
session = aiohttp_client.async_get_clientsession(hass)
client = AOSmithAPIClient(email, password, session)
status_coordinator = AOSmithStatusCoordinator(hass, client)
await status_coordinator.async_config_entry_first_refresh()
device_registry = dr.async_get(hass)
for junction_id, status_data in status_coordinator.data.items():
device_registry.async_get_or_create(
config_entry_id=entry.entry_id,
identifiers={(DOMAIN, junction_id)},
manufacturer="A. O. Smith",
name=status_data.get("name"),
model=status_data.get("model"),
serial_number=status_data.get("serial"),
suggested_area=status_data.get("install", {}).get("location"),
sw_version=status_data.get("data", {}).get("firmwareVersion"),
)
energy_coordinator = AOSmithEnergyCoordinator(
hass, client, list(status_coordinator.data)
)
await energy_coordinator.async_config_entry_first_refresh()
hass.data.setdefault(DOMAIN, {})[entry.entry_id] = AOSmithData(
client,
status_coordinator,
energy_coordinator,
)
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
return True
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Unload a config entry."""
if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
hass.data[DOMAIN].pop(entry.entry_id)
return unload_ok

View File

@@ -0,0 +1,107 @@
"""Config flow for A. O. Smith integration."""
from __future__ import annotations
from collections.abc import Mapping
import logging
from typing import Any
from py_aosmith import AOSmithAPIClient, AOSmithInvalidCredentialsException
import voluptuous as vol
from homeassistant import config_entries
from homeassistant.const import CONF_EMAIL, CONF_PASSWORD
from homeassistant.data_entry_flow import FlowResult
from homeassistant.helpers import aiohttp_client
from .const import DOMAIN
_LOGGER = logging.getLogger(__name__)
class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
"""Handle a config flow for A. O. Smith."""
VERSION = 1
_reauth_email: str | None = None
async def _async_validate_credentials(
self, email: str, password: str
) -> str | None:
"""Validate the credentials. Return an error string, or None if successful."""
session = aiohttp_client.async_get_clientsession(self.hass)
client = AOSmithAPIClient(email, password, session)
try:
await client.get_devices()
except AOSmithInvalidCredentialsException:
return "invalid_auth"
except Exception: # pylint: disable=broad-except
_LOGGER.exception("Unexpected exception")
return "unknown"
return None
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Handle the initial step."""
errors: dict[str, str] = {}
if user_input is not None:
unique_id = user_input[CONF_EMAIL].lower()
await self.async_set_unique_id(unique_id)
self._abort_if_unique_id_configured()
error = await self._async_validate_credentials(
user_input[CONF_EMAIL], user_input[CONF_PASSWORD]
)
if error is None:
return self.async_create_entry(
title=user_input[CONF_EMAIL], data=user_input
)
errors["base"] = error
return self.async_show_form(
step_id="user",
data_schema=vol.Schema(
{
vol.Required(CONF_EMAIL): str,
vol.Required(CONF_PASSWORD): str,
}
),
errors=errors,
)
async def async_step_reauth(self, entry_data: Mapping[str, Any]) -> FlowResult:
"""Perform reauth if the user credentials have changed."""
self._reauth_email = entry_data[CONF_EMAIL]
return await self.async_step_reauth_confirm()
async def async_step_reauth_confirm(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Handle user's reauth credentials."""
errors: dict[str, str] = {}
if user_input is not None and self._reauth_email is not None:
email = self._reauth_email
password = user_input[CONF_PASSWORD]
entry_id = self.context["entry_id"]
if entry := self.hass.config_entries.async_get_entry(entry_id):
error = await self._async_validate_credentials(email, password)
if error is None:
self.hass.config_entries.async_update_entry(
entry,
data=entry.data | user_input,
)
await self.hass.config_entries.async_reload(entry.entry_id)
return self.async_abort(reason="reauth_successful")
errors["base"] = error
return self.async_show_form(
step_id="reauth_confirm",
data_schema=vol.Schema({vol.Required(CONF_PASSWORD): str}),
description_placeholders={CONF_EMAIL: self._reauth_email},
errors=errors,
)

View File

@@ -0,0 +1,25 @@
"""Constants for the A. O. Smith integration."""
from datetime import timedelta
DOMAIN = "aosmith"
AOSMITH_MODE_ELECTRIC = "ELECTRIC"
AOSMITH_MODE_HEAT_PUMP = "HEAT_PUMP"
AOSMITH_MODE_HYBRID = "HYBRID"
AOSMITH_MODE_VACATION = "VACATION"
# Update interval to be used for normal background updates.
REGULAR_INTERVAL = timedelta(seconds=30)
# Update interval to be used while a mode or setpoint change is in progress.
FAST_INTERVAL = timedelta(seconds=1)
# Update interval to be used for energy usage data.
ENERGY_USAGE_INTERVAL = timedelta(minutes=10)
HOT_WATER_STATUS_MAP = {
"LOW": "low",
"MEDIUM": "medium",
"HIGH": "high",
}

View File

@@ -0,0 +1,83 @@
"""The data update coordinator for the A. O. Smith integration."""
import logging
from typing import Any
from py_aosmith import (
AOSmithAPIClient,
AOSmithInvalidCredentialsException,
AOSmithUnknownException,
)
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryAuthFailed
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import DOMAIN, ENERGY_USAGE_INTERVAL, FAST_INTERVAL, REGULAR_INTERVAL
_LOGGER = logging.getLogger(__name__)
class AOSmithStatusCoordinator(DataUpdateCoordinator[dict[str, dict[str, Any]]]):
"""Coordinator for device status, updating with a frequent interval."""
def __init__(self, hass: HomeAssistant, client: AOSmithAPIClient) -> None:
"""Initialize the coordinator."""
super().__init__(hass, _LOGGER, name=DOMAIN, update_interval=REGULAR_INTERVAL)
self.client = client
async def _async_update_data(self) -> dict[str, dict[str, Any]]:
"""Fetch latest data from the device status endpoint."""
try:
devices = await self.client.get_devices()
except AOSmithInvalidCredentialsException as err:
raise ConfigEntryAuthFailed from err
except AOSmithUnknownException as err:
raise UpdateFailed(f"Error communicating with API: {err}") from err
mode_pending = any(
device.get("data", {}).get("modePending") for device in devices
)
setpoint_pending = any(
device.get("data", {}).get("temperatureSetpointPending")
for device in devices
)
if mode_pending or setpoint_pending:
self.update_interval = FAST_INTERVAL
else:
self.update_interval = REGULAR_INTERVAL
return {device.get("junctionId"): device for device in devices}
class AOSmithEnergyCoordinator(DataUpdateCoordinator[dict[str, float]]):
"""Coordinator for energy usage data, updating with a slower interval."""
def __init__(
self,
hass: HomeAssistant,
client: AOSmithAPIClient,
junction_ids: list[str],
) -> None:
"""Initialize the coordinator."""
super().__init__(
hass, _LOGGER, name=DOMAIN, update_interval=ENERGY_USAGE_INTERVAL
)
self.client = client
self.junction_ids = junction_ids
async def _async_update_data(self) -> dict[str, float]:
"""Fetch latest data from the energy usage endpoint."""
energy_usage_by_junction_id: dict[str, float] = {}
for junction_id in self.junction_ids:
try:
energy_usage = await self.client.get_energy_use_data(junction_id)
except AOSmithInvalidCredentialsException as err:
raise ConfigEntryAuthFailed from err
except AOSmithUnknownException as err:
raise UpdateFailed(f"Error communicating with API: {err}") from err
energy_usage_by_junction_id[junction_id] = energy_usage.get("lifetimeKwh")
return energy_usage_by_junction_id

View File

@@ -0,0 +1,62 @@
"""The base entity for the A. O. Smith integration."""
from typing import TypeVar
from py_aosmith import AOSmithAPIClient
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import DOMAIN
from .coordinator import AOSmithEnergyCoordinator, AOSmithStatusCoordinator
_AOSmithCoordinatorT = TypeVar(
"_AOSmithCoordinatorT", bound=AOSmithStatusCoordinator | AOSmithEnergyCoordinator
)
class AOSmithEntity(CoordinatorEntity[_AOSmithCoordinatorT]):
"""Base entity for A. O. Smith."""
_attr_has_entity_name = True
def __init__(self, coordinator: _AOSmithCoordinatorT, junction_id: str) -> None:
"""Initialize the entity."""
super().__init__(coordinator)
self.junction_id = junction_id
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, junction_id)},
)
@property
def client(self) -> AOSmithAPIClient:
"""Shortcut to get the API client."""
return self.coordinator.client
class AOSmithStatusEntity(AOSmithEntity[AOSmithStatusCoordinator]):
"""Base entity for entities that use data from the status coordinator."""
@property
def device(self):
"""Shortcut to get the device status from the coordinator data."""
return self.coordinator.data.get(self.junction_id)
@property
def device_data(self):
"""Shortcut to get the device data within the device status."""
device = self.device
return None if device is None else device.get("data", {})
@property
def available(self) -> bool:
"""Return True if entity is available."""
return super().available and self.device_data.get("isOnline") is True
class AOSmithEnergyEntity(AOSmithEntity[AOSmithEnergyCoordinator]):
"""Base entity for entities that use data from the energy coordinator."""
@property
def energy_usage(self) -> float | None:
"""Shortcut to get the energy usage from the coordinator data."""
return self.coordinator.data.get(self.junction_id)

View File

@@ -0,0 +1,9 @@
{
"domain": "aosmith",
"name": "A. O. Smith",
"codeowners": ["@bdr99"],
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/aosmith",
"iot_class": "cloud_polling",
"requirements": ["py-aosmith==1.0.1"]
}

View File

@@ -0,0 +1,106 @@
"""The sensor platform for the A. O. Smith integration."""
from collections.abc import Callable
from dataclasses import dataclass
from typing import Any
from homeassistant.components.sensor import (
SensorDeviceClass,
SensorEntity,
SensorEntityDescription,
SensorStateClass,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import UnitOfEnergy
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import AOSmithData
from .const import DOMAIN, HOT_WATER_STATUS_MAP
from .coordinator import AOSmithEnergyCoordinator, AOSmithStatusCoordinator
from .entity import AOSmithEnergyEntity, AOSmithStatusEntity
@dataclass(frozen=True, kw_only=True)
class AOSmithStatusSensorEntityDescription(SensorEntityDescription):
"""Entity description class for sensors using data from the status coordinator."""
value_fn: Callable[[dict[str, Any]], str | int | None]
STATUS_ENTITY_DESCRIPTIONS: tuple[AOSmithStatusSensorEntityDescription, ...] = (
AOSmithStatusSensorEntityDescription(
key="hot_water_availability",
translation_key="hot_water_availability",
icon="mdi:water-thermometer",
device_class=SensorDeviceClass.ENUM,
options=["low", "medium", "high"],
value_fn=lambda device: HOT_WATER_STATUS_MAP.get(
device.get("data", {}).get("hotWaterStatus")
),
),
)
async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up A. O. Smith sensor platform."""
data: AOSmithData = hass.data[DOMAIN][entry.entry_id]
async_add_entities(
AOSmithStatusSensorEntity(data.status_coordinator, description, junction_id)
for description in STATUS_ENTITY_DESCRIPTIONS
for junction_id in data.status_coordinator.data
)
async_add_entities(
AOSmithEnergySensorEntity(data.energy_coordinator, junction_id)
for junction_id in data.status_coordinator.data
)
class AOSmithStatusSensorEntity(AOSmithStatusEntity, SensorEntity):
"""Class for sensor entities that use data from the status coordinator."""
entity_description: AOSmithStatusSensorEntityDescription
def __init__(
self,
coordinator: AOSmithStatusCoordinator,
description: AOSmithStatusSensorEntityDescription,
junction_id: str,
) -> None:
"""Initialize the entity."""
super().__init__(coordinator, junction_id)
self.entity_description = description
self._attr_unique_id = f"{description.key}_{junction_id}"
@property
def native_value(self) -> str | int | None:
"""Return the state of the sensor."""
return self.entity_description.value_fn(self.device)
class AOSmithEnergySensorEntity(AOSmithEnergyEntity, SensorEntity):
"""Class for the energy sensor entity."""
_attr_translation_key = "energy_usage"
_attr_device_class = SensorDeviceClass.ENERGY
_attr_state_class = SensorStateClass.TOTAL_INCREASING
_attr_native_unit_of_measurement = UnitOfEnergy.KILO_WATT_HOUR
_attr_suggested_display_precision = 1
def __init__(
self,
coordinator: AOSmithEnergyCoordinator,
junction_id: str,
) -> None:
"""Initialize the entity."""
super().__init__(coordinator, junction_id)
self._attr_unique_id = f"energy_usage_{junction_id}"
@property
def native_value(self) -> float | None:
"""Return the state of the sensor."""
return self.energy_usage

View File

@@ -0,0 +1,43 @@
{
"config": {
"step": {
"user": {
"data": {
"email": "[%key:common::config_flow::data::email%]",
"password": "[%key:common::config_flow::data::password%]"
},
"description": "Please enter your A. O. Smith credentials."
},
"reauth_confirm": {
"description": "Please update your password for {email}",
"title": "[%key:common::config_flow::title::reauth%]",
"data": {
"password": "[%key:common::config_flow::data::password%]"
}
}
},
"error": {
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
}
},
"entity": {
"sensor": {
"hot_water_availability": {
"name": "Hot water availability",
"state": {
"low": "Low",
"medium": "Medium",
"high": "High"
}
},
"energy_usage": {
"name": "Energy usage"
}
}
}
}

View File

@@ -0,0 +1,151 @@
"""The water heater platform for the A. O. Smith integration."""
from typing import Any
from homeassistant.components.water_heater import (
STATE_ECO,
STATE_ELECTRIC,
STATE_HEAT_PUMP,
STATE_OFF,
WaterHeaterEntity,
WaterHeaterEntityFeature,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import UnitOfTemperature
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import AOSmithData
from .const import (
AOSMITH_MODE_ELECTRIC,
AOSMITH_MODE_HEAT_PUMP,
AOSMITH_MODE_HYBRID,
AOSMITH_MODE_VACATION,
DOMAIN,
)
from .coordinator import AOSmithStatusCoordinator
from .entity import AOSmithStatusEntity
MODE_HA_TO_AOSMITH = {
STATE_OFF: AOSMITH_MODE_VACATION,
STATE_ECO: AOSMITH_MODE_HYBRID,
STATE_ELECTRIC: AOSMITH_MODE_ELECTRIC,
STATE_HEAT_PUMP: AOSMITH_MODE_HEAT_PUMP,
}
MODE_AOSMITH_TO_HA = {
AOSMITH_MODE_ELECTRIC: STATE_ELECTRIC,
AOSMITH_MODE_HEAT_PUMP: STATE_HEAT_PUMP,
AOSMITH_MODE_HYBRID: STATE_ECO,
AOSMITH_MODE_VACATION: STATE_OFF,
}
# Operation mode to use when exiting away mode
DEFAULT_OPERATION_MODE = AOSMITH_MODE_HYBRID
DEFAULT_SUPPORT_FLAGS = (
WaterHeaterEntityFeature.TARGET_TEMPERATURE
| WaterHeaterEntityFeature.OPERATION_MODE
)
async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up A. O. Smith water heater platform."""
data: AOSmithData = hass.data[DOMAIN][entry.entry_id]
async_add_entities(
AOSmithWaterHeaterEntity(data.status_coordinator, junction_id)
for junction_id in data.status_coordinator.data
)
class AOSmithWaterHeaterEntity(AOSmithStatusEntity, WaterHeaterEntity):
"""The water heater entity for the A. O. Smith integration."""
_attr_name = None
_attr_temperature_unit = UnitOfTemperature.FAHRENHEIT
_attr_min_temp = 95
def __init__(
self,
coordinator: AOSmithStatusCoordinator,
junction_id: str,
) -> None:
"""Initialize the entity."""
super().__init__(coordinator, junction_id)
self._attr_unique_id = junction_id
@property
def operation_list(self) -> list[str]:
"""Return the list of supported operation modes."""
op_modes = []
for mode_dict in self.device_data.get("modes", []):
mode_name = mode_dict.get("mode")
ha_mode = MODE_AOSMITH_TO_HA.get(mode_name)
# Filtering out STATE_OFF since it is handled by away mode
if ha_mode is not None and ha_mode != STATE_OFF:
op_modes.append(ha_mode)
return op_modes
@property
def supported_features(self) -> WaterHeaterEntityFeature:
"""Return the list of supported features."""
supports_vacation_mode = any(
mode_dict.get("mode") == AOSMITH_MODE_VACATION
for mode_dict in self.device_data.get("modes", [])
)
if supports_vacation_mode:
return DEFAULT_SUPPORT_FLAGS | WaterHeaterEntityFeature.AWAY_MODE
return DEFAULT_SUPPORT_FLAGS
@property
def target_temperature(self) -> float | None:
"""Return the temperature we try to reach."""
return self.device_data.get("temperatureSetpoint")
@property
def max_temp(self) -> float:
"""Return the maximum temperature."""
return self.device_data.get("temperatureSetpointMaximum")
@property
def current_operation(self) -> str:
"""Return the current operation mode."""
return MODE_AOSMITH_TO_HA.get(self.device_data.get("mode"), STATE_OFF)
@property
def is_away_mode_on(self):
"""Return True if away mode is on."""
return self.device_data.get("mode") == AOSMITH_MODE_VACATION
async def async_set_operation_mode(self, operation_mode: str) -> None:
"""Set new target operation mode."""
aosmith_mode = MODE_HA_TO_AOSMITH.get(operation_mode)
if aosmith_mode is not None:
await self.client.update_mode(self.junction_id, aosmith_mode)
await self.coordinator.async_request_refresh()
async def async_set_temperature(self, **kwargs: Any) -> None:
"""Set new target temperature."""
temperature = kwargs.get("temperature")
await self.client.update_setpoint(self.junction_id, temperature)
await self.coordinator.async_request_refresh()
async def async_turn_away_mode_on(self) -> None:
"""Turn away mode on."""
await self.client.update_mode(self.junction_id, AOSMITH_MODE_VACATION)
await self.coordinator.async_request_refresh()
async def async_turn_away_mode_off(self) -> None:
"""Turn away mode off."""
await self.client.update_mode(self.junction_id, DEFAULT_OPERATION_MODE)
await self.coordinator.async_request_refresh()

View File

@@ -7,8 +7,9 @@ from datetime import timedelta
import logging
from typing import Final
from apcaccess import status
import aioapcaccess
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.debounce import Debouncer
from homeassistant.helpers.device_registry import DeviceInfo
@@ -32,6 +33,8 @@ class APCUPSdCoordinator(DataUpdateCoordinator[OrderedDict[str, str]]):
updates from the server.
"""
config_entry: ConfigEntry
def __init__(self, hass: HomeAssistant, host: str, port: int) -> None:
"""Initialize the data object."""
super().__init__(
@@ -70,13 +73,10 @@ class APCUPSdCoordinator(DataUpdateCoordinator[OrderedDict[str, str]]):
return self.data.get("SERIALNO")
@property
def device_info(self) -> DeviceInfo | None:
def device_info(self) -> DeviceInfo:
"""Return the DeviceInfo of this APC UPS, if serial number is available."""
if not self.ups_serial_no:
return None
return DeviceInfo(
identifiers={(DOMAIN, self.ups_serial_no)},
identifiers={(DOMAIN, self.ups_serial_no or self.config_entry.entry_id)},
model=self.ups_model,
manufacturer="APC",
name=self.ups_name if self.ups_name else "APC UPS",
@@ -90,13 +90,8 @@ class APCUPSdCoordinator(DataUpdateCoordinator[OrderedDict[str, str]]):
Note that the result dict uses upper case for each resource, where our
integration uses lower cases as keys internally.
"""
async with asyncio.timeout(10):
try:
raw = await self.hass.async_add_executor_job(
status.get, self._host, self._port
)
result: OrderedDict[str, str] = status.parse(raw)
return result
except OSError as error:
return await aioapcaccess.request_status(self._host, self._port)
except (OSError, asyncio.IncompleteReadError) as error:
raise UpdateFailed(error) from error

View File

@@ -7,5 +7,5 @@
"iot_class": "local_polling",
"loggers": ["apcaccess"],
"quality_scale": "silver",
"requirements": ["apcaccess==0.0.13"]
"requirements": ["aioapcaccess==0.4.2"]
}

View File

@@ -0,0 +1 @@
"""Virtual integration: Appalachian Power."""

View File

@@ -0,0 +1,6 @@
{
"domain": "appalachianpower",
"name": "Appalachian Power",
"integration_type": "virtual",
"supported_by": "opower"
}

View File

@@ -2,6 +2,7 @@
from __future__ import annotations
import logging
from typing import Any
import apprise
import voluptuous as vol
@@ -61,11 +62,11 @@ def get_service(
class AppriseNotificationService(BaseNotificationService):
"""Implement the notification service for Apprise."""
def __init__(self, a_obj):
def __init__(self, a_obj: apprise.Apprise) -> None:
"""Initialize the service."""
self.apprise = a_obj
def send_message(self, message="", **kwargs):
def send_message(self, message: str = "", **kwargs: Any) -> None:
"""Send a message to a specified target.
If no target/tags are specified, then services are notified as is

View File

@@ -26,7 +26,7 @@ from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from . import DOMAIN, UPDATE_TOPIC, AquaLogicProcessor
@dataclass
@dataclass(frozen=True)
class AquaLogicSensorEntityDescription(SensorEntityDescription):
"""Describes AquaLogic sensor entity."""

View File

@@ -39,7 +39,7 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN
@dataclass
@dataclass(frozen=True)
class AranetSensorEntityDescription(SensorEntityDescription):
"""Class to describe an Aranet sensor entity."""

View File

@@ -20,14 +20,14 @@ from .coordinator import AsekoDataUpdateCoordinator
from .entity import AsekoEntity
@dataclass
@dataclass(frozen=True)
class AsekoBinarySensorDescriptionMixin:
"""Mixin for required keys."""
value_fn: Callable[[Unit], bool]
@dataclass
@dataclass(frozen=True)
class AsekoBinarySensorEntityDescription(
BinarySensorEntityDescription, AsekoBinarySensorDescriptionMixin
):

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