Compare commits

..

1102 Commits

Author SHA1 Message Date
Franck Nijhof
711d9e21ab 2023.12.2 (#105655) 2023-12-13 18:48:43 +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
Franck Nijhof
8744b05468 Bump version to 2023.12.2 2023-12-13 14:53:10 +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
Franck Nijhof
9b10af612a 2023.12.1 (#105324) 2023-12-08 22:13:24 +01:00
Bouwe Westerdijk
47dc48ca66 Bump plugwise to v0.34.5 (#105330) 2023-12-08 21:20:02 +01:00
Jan Bouwhuis
5220afa856 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 21:19:59 +01:00
G Johansson
629731e2dd Add rollback on exception that needs rollback in SQL (#104948) 2023-12-08 21:19:56 +01:00
Franck Nijhof
9aaff618e2 Bump version to 2023.12.1 2023-12-08 19:08:47 +01:00
Erik Montnemery
35954128ad Add workaround for orjson not handling subclasses of str (#105314)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-12-08 19:08:02 +01:00
Michael Hansen
d9b31e9841 Use area id for context instead of name (#105313) 2023-12-08 19:07:58 +01:00
Erik Montnemery
1e3c154fdf Add test for energy cost sensor for late price sensor (#105312) 2023-12-08 19:07:24 +01:00
Paul Bottein
1777f6b935 Update frontend to 20231208.2 (#105299) 2023-12-08 19:06:25 +01:00
Øyvind Matheson Wergeland
c24af97514 Always set _attr_current_option in Nobø Hub select entities (#105289)
Always set _attr_current_option in select entities.
2023-12-08 19:06:08 +01:00
Jan Bouwhuis
892a7c36ca Fix mqtt json light state updates using deprecated color handling (#105283) 2023-12-08 19:06:03 +01:00
Michael Hansen
53cbde8dca Set device id and forward errors to Wyoming satellites (#105266)
* Set device id and forward errors

* Fix tests
2023-12-08 19:05:23 +01:00
J. Nick Koston
f3bb832b19 Bump pyunifiprotect to 4.22.0 (#105265) 2023-12-08 19:02:43 +01:00
On Freund
d89f6b5eb0 Fix update of uncategorized OurGroceries items (#105255)
* Fix update of uncategorized OurGroceries items

* Address code review comments
2023-12-08 19:02:40 +01:00
Duco Sebel
4953a36da8 Add migration for old HomeWizard sensors (#105251)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-12-08 19:02:37 +01:00
Jan-Philipp Benecke
38e01b248f Explicit check for None in Discovergy entity if condition (#105248)
Fix checking for None in Discovergy
2023-12-08 19:02:34 +01:00
ollo69
f8d9c4c3ad Fix AsusWrt invalid data type with tuple type (#105247) 2023-12-08 19:02:31 +01:00
G Johansson
3a10ea1892 Fix check_date service in workday (#105241)
* Fix check_date service in workday

* Add test
2023-12-08 19:02:28 +01:00
Lars
c6187ed914 Fix Fritzbox light setup (#105232) 2023-12-08 19:02:24 +01:00
Erik Montnemery
d679764d3b Disable config flow progress in peco config flow (#105222) 2023-12-08 19:02:21 +01:00
haimn
f1169e0a0d 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-08 19:02:18 +01:00
Greg Dowling
119c9c3a6b Fix bug in roon incremental volume control. (#105201) 2023-12-08 19:02:15 +01:00
Jan-Philipp Benecke
c5d1a0fbe1 Increase ping update interval to 30 seconds (#105199) 2023-12-08 19:02:12 +01:00
Sebastian Nohn
8ffb147926 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-08 19:02:04 +01:00
lunmay
688fab49c3 Fix missing apostrophe in smtp (#105189)
Fix missing apostrophe
2023-12-08 19:01:20 +01:00
TheJulianJES
c035ffb06e Fix ZHA quirk ID custom entities matching all devices (#105184) 2023-12-08 19:00:39 +01:00
Quentame
054ede9663 Bump Météo-France to 1.3.0 (#105170) 2023-12-08 19:00:36 +01:00
Michael Hansen
614e9069c2 Don't return TTS URL in Assist pipeline (#105164)
* Don't return TTS URL

* Add test for empty queue
2023-12-08 19:00:33 +01:00
starkillerOG
b832a692d9 Bump reolink_aio to 0.8.2 (#105157) 2023-12-08 19:00:30 +01:00
Robert Svensson
cfa85956e1 Improve LIDL christmas light detection in deCONZ (#105155) 2023-12-08 19:00:25 +01:00
Mick Vleeshouwer
a2f9ffe50f Disable scenarios (scenes) for local API in Overkiz (#105153) 2023-12-08 19:00:22 +01:00
Michael Hansen
47032d055c Expose todo entities to Assist by default (#105150) 2023-12-08 19:00:14 +01:00
Jan Bouwhuis
b977fd6ab2 Correct smtp error message string (#105148) 2023-12-08 18:59:36 +01:00
Jan Bouwhuis
3972d8fc00 Correct smtp error message string (#105148) 2023-12-08 18:58:00 +01:00
TJ Horner
53497e3fad Bump apple_weatherkit to 1.1.2 (#105140) 2023-12-08 18:57:16 +01:00
Matrix
24f0e927f3 Bump yolink-api to 0.3.4 (#105124)
* Bump yolink-api to 0.3.3

* bump yolink api to 0.3.4
2023-12-08 18:57:10 +01:00
Excentyl
9527548207 Initialize energy_state without price (#97031)
Co-authored-by: Erik <erik@montnemery.com>
2023-12-08 18:56:05 +01:00
Franck Nijhof
ea1222bff3 2023.12.0 (#105135) 2023-12-06 17:44:26 +01:00
Franck Nijhof
af23580530 Bump version to 2023.12.0 2023-12-06 16:31:24 +01:00
Paul Bottein
d8b056b340 Update frontend to 20231206.0 (#105132) 2023-12-06 16:31:06 +01:00
Franck Nijhof
0958e8fadf Fix missing target in todo.remove_completed_items service (#105127) 2023-12-06 16:30:59 +01:00
Xidorn Quan
e165d6741e Bump thermopro-ble to 0.5.0 (#105126) 2023-12-06 16:30:52 +01:00
Tobias Perschon
6b3e9904c8 Add missing services and strings entries for reply_to_message_id (#105072) 2023-12-06 16:27:06 +01:00
Franck Nijhof
9fcb722381 Bump version to 2023.12.0b5 2023-12-06 08:31:21 +01:00
Michael Hansen
da766bc7c5 Bump intents to 2023.12.05 (#105116) 2023-12-06 08:31:13 +01:00
lunmay
681a3fd271 Fix typo in v2c strings.json (#105104)
fo -> of
2023-12-06 08:31:10 +01:00
Robert Svensson
990fd31e84 Bump aiounifi to v67 (#105099)
* Bump aiounifi to v67

* Fix mypy
2023-12-06 08:31:06 +01:00
Jan Bouwhuis
f7c9d20472 Fix overkiz measurement sensor returns None if 0 (#105090) 2023-12-06 08:31:03 +01:00
TJ Horner
ae4811b776 Update apple_weatherkit to 1.1.1 (#105079) 2023-12-06 08:30:46 +01:00
Franck Nijhof
b0367d3d74 Bump version to 2023.12.0b4 2023-12-05 19:09:24 +01:00
Bram Kragten
30d529aab0 Update frontend to 20231205.0 (#105081) 2023-12-05 19:09:16 +01:00
Jan-Philipp Benecke
4018a28510 Remove device from known_devices upon import in ping device tracker (#105009)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-12-05 19:09:12 +01:00
Franck Nijhof
a076b7d992 Bump version to 2023.12.0b3 2023-12-05 15:57:40 +01:00
Erik Montnemery
55c686ad03 Don't use deprecated_class decorator on deprecated YAML classes (#105063) 2023-12-05 15:55:27 +01:00
Robert Svensson
7cb383146a Make UniFi WiFi clients numerical (#105032) 2023-12-05 15:55:23 +01:00
Robert Svensson
2f727d5fe1 Fix stuck clients in UniFi options (#105028) 2023-12-05 15:55:18 +01:00
Robert Svensson
65c8aa3249 Make unifi RX-/TX-sensors diagnostic entities (#105022) 2023-12-05 15:55:15 +01:00
Bartosz Dokurno
c62c002657 Update Todoist config flow URL (#104992) 2023-12-05 15:55:12 +01:00
Erik Montnemery
fd4a05fc7a Minor improvements of deprecation helper (#104980) 2023-12-05 15:55:08 +01:00
Marco
56e325a2b1 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 15:55:05 +01:00
Aaron Godfrey
48cce1a854 Exclude Todoist sub-tasks for the todo platform (#104914) 2023-12-05 15:55:01 +01:00
Marcel van der Veldt
99401c60c7 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-05 15:54:58 +01:00
Michael Hansen
5a49e1dd5c 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-05 15:54:55 +01:00
Allen Porter
db6b804298 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-12-05 15:54:52 +01:00
Allen Porter
655b067277 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-12-05 15:54:48 +01:00
GeoffAtHome
55bafc260d 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 15:54:44 +01:00
Franck Nijhof
ca147060d9 Bump version to 2023.12.0b2 2023-12-04 15:00:20 +01:00
c0ffeeca7
8fd2e6451a W-Z: add host field description (#104996) 2023-12-04 15:00:09 +01:00
Bram Kragten
df8f462370 Update frontend to 20231204.0 (#104990) 2023-12-04 15:00:06 +01:00
Jan Bouwhuis
64f7855b94 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 15:00:02 +01:00
Jan Bouwhuis
204cc20bc2 Do not allow smtp to access insecure files (#104972) 2023-12-04 14:59:59 +01:00
Richard Kroegel
63ed4b0769 Bump bimmer-connected to 0.14.6 (#104961)
Co-authored-by: rikroe <rikroe@users.noreply.github.com>
2023-12-04 14:59:56 +01:00
starkillerOG
cd86318b4b Do not fail if Reolink ONVIF cannot be connected (#104947) 2023-12-04 14:59:53 +01:00
G Johansson
214f214122 Only raise issue if switch used in Logitech Harmony Hub (#104941) 2023-12-04 14:59:49 +01:00
Alex Thompson
b53b1ab614 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-04 14:59:46 +01:00
G Johansson
f5fae54c32 Fix get_events name in calendar strings (#104902) 2023-12-04 14:59:43 +01:00
Jan Bouwhuis
e1142e2ad8 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-04 14:59:40 +01:00
Patrick Decat
380e71d1b2 Fix incompatible 'measurement' state and 'volume' device class warnings in Overkiz (#104896) 2023-12-04 14:59:36 +01:00
Jan Bouwhuis
cda7863a45 Link second Hue host field description (#104885) 2023-12-04 14:59:33 +01:00
c0ffeeca7
9181d655f9 U-V add host field description (#104872)
Co-authored-by: Simone Chemelli <simone.chemelli@gmail.com>
2023-12-04 14:59:30 +01:00
c0ffeeca7
555e413edb T-add host field description (#104871) 2023-12-04 14:59:26 +01:00
starkillerOG
39026e3b53 Reolink schedule update after firmware update (#104867) 2023-12-04 14:59:23 +01:00
c0ffeeca7
8fd9761e7d Solar-Log to Soundtouch: add host field description (#104863) 2023-12-04 14:59:20 +01:00
c0ffeeca7
0cf4c6e568 SamsungTV to Snapcast: add host field description (#104862) 2023-12-04 14:59:17 +01:00
c0ffeeca7
0dc157dc31 Reolink to Ruckus: add host field description (#104861)
Co-authored-by: starkillerOG <starkiller.og@gmail.com>
2023-12-04 14:59:14 +01:00
c0ffeeca7
9827ba7e60 Radio Thermostat to Renson: add host field description (#104860) 2023-12-04 14:59:10 +01:00
c0ffeeca7
f194ffcd52 Ping to Qnap: add host field description (#104859) 2023-12-04 14:59:07 +01:00
c0ffeeca7
42982de223 Obihai to OpenGarage: add host field description (#104858)
Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
2023-12-04 14:59:04 +01:00
c0ffeeca7
1d04fcc485 Nanoleaf to Nut: add host field description (#104857)
Co-authored-by: starkillerOG <starkiller.og@gmail.com>
2023-12-04 14:59:01 +01:00
c0ffeeca7
1378abab35 Modern Forms to MyStrom: add host field description (#104856) 2023-12-04 14:58:58 +01:00
c0ffeeca7
78cf9f2a01 Lifx, Lutron: add host field description (#104855) 2023-12-04 14:58:55 +01:00
Michael
074bcc8adc Fix handling of unrecognized mimetypes in Synology DSM photos integration (#104848) 2023-12-04 14:58:52 +01:00
Jan Bouwhuis
d67d2d9566 Filter out zero readings for DSMR enery sensors (#104843) 2023-12-04 14:58:49 +01:00
Robert Hillis
262e59f293 Fix Harmony switch removal version (#104838) 2023-12-04 14:58:46 +01:00
Daniel Hjelseth Høyer
11db0ab1e1 Bump Mill library (#104836) 2023-12-04 14:58:43 +01:00
Erik Montnemery
367bbf5709 Use deprecated_class decorator in deprecated YAML loader classes (#104835) 2023-12-04 14:58:40 +01:00
Marcel van der Veldt
0d318da9aa Update Matter test fixtures to schema version 5 (#104829) 2023-12-04 14:58:37 +01:00
mkmer
7ea4e15ff2 Late review updates for Blink (#104755) 2023-12-04 14:58:32 +01:00
Eric Härtel
cc0326548e Add CB3 descriptor to ZHA manifest (#104071) 2023-12-04 14:51:43 +01:00
Franck Nijhof
93c8618f8a Bump version to 2023.12.0b1 2023-11-30 19:48:24 +01:00
Franck Nijhof
208622e8a7 Revert "Add Komfovent (#95722)" (#104819) 2023-11-30 19:48:08 +01:00
Erik Montnemery
45f79ee1ba Restore renamed yaml loader classes and warn when used (#104818) 2023-11-30 19:48:04 +01:00
Bram Kragten
7739f99233 Update frontend to 20231130.0 (#104816) 2023-11-30 19:48:01 +01:00
Maciej Bieniek
43e0ddc74e Address late review for the host field description in Shelly integration (#104815)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2023-11-30 19:47:57 +01:00
Mappenhei
7e012183da Add Humidity device class to LaCross humidity sensor (#104814) 2023-11-30 19:47:54 +01:00
Maciej Bieniek
7a36bdb052 Make Shelly Wall Display thermostat implementation compatible with firmware 1.2.5 (#104812) 2023-11-30 19:47:51 +01:00
Erik Montnemery
83d881459a Add NodeStrClass.__voluptuous_compile__ (#104808) 2023-11-30 19:47:47 +01:00
Marcel van der Veldt
9d53d6811a Bump python-matter-server to version 5.0.0 (#104805) 2023-11-30 19:47:44 +01:00
Charles Garwood
847fd4c653 Use .get for Fully Kiosk SSL settings in coordinator (#104801) 2023-11-30 19:47:40 +01:00
Michael
0eefc98b33 Fix runtime error in CalDAV (#104800) 2023-11-30 19:47:36 +01:00
Marcel van der Veldt
ea8a47d0e9 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 19:47:30 +01:00
c0ffeeca7
75d2ea9c57 KMtronic to LG Soundbar: add host field description (#104792) 2023-11-30 19:45:02 +01:00
c0ffeeca7
cf63cd33c5 iAlarm to Keenetic: add host field description (#104791)
Co-authored-by: Andrey Kupreychik <foxel@quickfox.ru>
2023-11-30 19:44:58 +01:00
c0ffeeca7
fd442fadf8 HLK to Hyperion: add host field description (#104789)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-30 19:44:52 +01:00
c0ffeeca7
62537aa63a Frontier to Glances: add host field description (#104787)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-30 19:44:48 +01:00
c0ffeeca7
d7de9c13fd Goalzero to HEOS: add host field description (#104786) 2023-11-30 19:44:45 +01:00
Erwin Douna
04b72953e6 Fix Fastdotcom no entity (#104785)
Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2023-11-30 19:44:41 +01:00
c0ffeeca7
ddba7d8ed8 Freebox to FRITZ!Box add host field description (#104784)
Co-authored-by: Simone Chemelli <simone.chemelli@gmail.com>
2023-11-30 19:44:38 +01:00
c0ffeeca7
40c7432e8a FiveM to Foscam: add host field description (#104782) 2023-11-30 19:44:35 +01:00
c0ffeeca7
e1504759fe Enphase to Evil: add host field description (#104779)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-30 19:44:31 +01:00
c0ffeeca7
b6b2cf194d Ecoforest to Emonitor: add host field description (#104778) 2023-11-30 19:44:28 +01:00
c0ffeeca7
c3566db339 Dremel to Duotecno: add host field description (#104776)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-30 19:44:25 +01:00
c0ffeeca7
4eec48de51 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 19:44:21 +01:00
c0ffeeca7
fe544f670f Comelit, Coolmaster: add host field description (#104771) 2023-11-30 19:44:18 +01:00
c0ffeeca7
816e524457 Broadlink, BSB-Lan: add host field description (#104770) 2023-11-30 19:44:15 +01:00
Allen Porter
4b22551af1 Fix bug in rainbird device ids that are int serial numbers (#104768) 2023-11-30 19:44:12 +01:00
Jan Bouwhuis
b4907800a9 Debug level logging for DSMR migration code (#104757) 2023-11-30 19:44:08 +01:00
Daniel Gangl
f366b37c52 Bump zamg to 0.3.3 (#104756) 2023-11-30 19:44:05 +01:00
Michael Hansen
90bcad31b5 Skip TTS when text is empty (#104741)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2023-11-30 19:44:01 +01:00
Franck Nijhof
34c65749e2 Revert "Add proj dependency to our wheels builder (#104699)" (#104704) 2023-11-30 19:43:58 +01:00
Christopher Fenner
5f549649de Update initial translation for ViCare water heater entity (#104696) 2023-11-30 19:43:55 +01:00
c0ffeeca7
78f1c0cb80 Axis: add host and user name field description (#104693) 2023-11-30 19:43:51 +01:00
Charles Garwood
6f45fafc11 Bump pynws to 1.6.0 (#104679) 2023-11-30 19:43:48 +01:00
Florian
4acea82ca1 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-30 19:43:44 +01:00
Sergiy Maysak
f1e8c1c7ee Fix wirelesstag unique_id to use uuid instead of tag_id (#104394)
Co-authored-by: Robert Resch <robert@resch.dev>
2023-11-30 19:43:40 +01:00
Franck Nijhof
19f543214f Bump version to 2023.12.0b0 2023-11-29 20:40:14 +01:00
Allen Porter
af2f8699b7 Add due date and description to CalDAV To-do (#104656)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Robert Resch <robert@resch.dev>
2023-11-29 19:35:36 +01:00
J. Nick Koston
1522118453 Remove aiohttp cancel on disconnect workaround (#104175) 2023-11-29 11:20:36 -07:00
J. Nick Koston
50f2c41145 Avoid db hit and executor job for impossible history queries (#104724) 2023-11-29 11:20:22 -07:00
Joost Lekkerkerker
1fefa93648 Use config entry callbacks in Gree (#104740) 2023-11-29 19:03:58 +01:00
Michael Hansen
e10d58ef3e Bump intents to 2023.11.29 (#104738) 2023-11-29 18:52:27 +01:00
J. Nick Koston
1b048ff388 Remove HomeAssistantAccessLogger (#104173) 2023-11-29 10:40:19 -07:00
Duco Sebel
1727c19e0d Address review comments for Picnic (#104732) 2023-11-29 18:35:55 +01:00
Paul Bottein
38eda9f46e Add multiple option to text selector (#104635)
Co-authored-by: Robert Resch <robert@resch.dev>
2023-11-29 18:32:32 +01:00
J. Nick Koston
dfed10420c Remove aiohttp enable_compression helper (#104174) 2023-11-29 10:24:34 -07:00
Richard Kroegel
2287c45afc Bump bimmer-connected to 0.14.5 (#104715)
Co-authored-by: rikroe <rikroe@users.noreply.github.com>
2023-11-29 18:11:04 +01:00
Michael Hansen
a894146cee Fix TTS streaming for VoIP (#104620)
* Use wav instead of raw tts audio in voip

* More tests

* Use mock TTS dir
2023-11-29 12:07:22 -05:00
Jan Bouwhuis
47426a3ddc Remove redundant websocket_api exception handler (#104727) 2023-11-29 16:56:26 +01:00
Jan Bouwhuis
4bf88b1690 Improve MQTT json light brightness scaling (#104510)
* Improve MQTT json light brightness scaling

* Revert unrelated changes

* Format
2023-11-29 16:42:10 +01:00
Joost Lekkerkerker
b36ddaa15c Change super class order in Withings Calendar (#104721) 2023-11-29 16:30:23 +01:00
Jan Bouwhuis
82264a0d6b Fix mqtt cover state is open after receiving stopped payload (#104726) 2023-11-29 16:29:42 +01:00
Bram Kragten
4628b03677 Update frontend to 20231129.1 (#104723) 2023-11-29 16:29:20 +01:00
Jan-Philipp Benecke
e2bab699b5 Avoid double refresh when adding entities in bsblan (#104647) 2023-11-29 16:24:30 +01:00
J. Nick Koston
608f4f7c52 Bump aiohttp to 3.9.1 (#104176) 2023-11-29 16:13:54 +01:00
dupondje
ba481001c3 Add support for multiple mbus devices in dsmr (#84097)
* Add support for multiple mbus devices in dsmr

A dsmr meter can have 4 mbus devices.
Support them all and also add support for a water meter on the mbus
device.

* Apply suggestions from code review

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

* Rewrite old gas sensor to new mbus sensor

* No force updates + fix mbus entity unique_id

* Remove old gas device

* Add additional tests

* Fix remarks from last review + move migrated 5b gas meter to new device_id

* Fix ruff error

* Last fixes

---------

Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
2023-11-29 15:41:58 +01:00
Joost Lekkerkerker
36eb858d0a Rename variable in Epson tests (#104722) 2023-11-29 15:22:21 +01:00
Stefan Rado
c6c8bb6970 Bump aioesphomeapi to 19.2.1 (#104703) 2023-11-29 15:20:40 +01:00
Erik Montnemery
61d82ae9ab Tweak dockerfile generation (#104717) 2023-11-29 15:20:21 +01:00
Franck Nijhof
8f2e69fdb7 Revert "Update stookwijzer api to atlas leefomgeving (#103323)" (#104705) 2023-11-29 15:18:25 +01:00
Martin Hjelmare
e884933dbd Remove rest api service call timeout (#104709) 2023-11-29 14:46:19 +01:00
stegm
09d7679818 Add new sensors of Kostal Plenticore integration (#103802) 2023-11-29 14:24:09 +01:00
Marc Mueller
0a13968209 Improve devialet coordinator typing (#104707) 2023-11-29 14:17:15 +01:00
Jan Bouwhuis
953a212dd6 Use ServiceValidationError for invalid fan preset_mode and move check to fan entity component (#104560)
* Use ServiceValidationError for fan preset_mode

* Use _valid_preset_mode_or_raise to raise

* Move preset_mode validation to entity component

* Fix bond fan and comments

* Fixes baf, fjaraskupan and template

* More integration adjustments

* Add custom components mock and test code

* Make NotValidPresetModeError subclass

* Update homeassistant/components/fan/strings.json

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

* Keep bond has_action validation

* Move demo test asserts outside context block

* Follow up comment

* Update homeassistant/components/fan/strings.json

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

* Fix demo tests

* Remove pylint disable

* Remove unreachable code

* Update homeassistant/components/fan/__init__.py

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

* Use NotValidPresetModeError, Final methods

* Address comments

* Correct docst

* Follow up comments

* Update homeassistant/components/fan/__init__.py

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

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: G Johansson <goran.johansson@shiftit.se>
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2023-11-29 13:56:51 +01:00
Bram Kragten
49381cefa3 Update frontend to 20231129.0 (#104710) 2023-11-29 13:37:23 +01:00
G Johansson
e5a7446afe Use id as location data in Trafikverket Camera (#104473) 2023-11-29 13:35:32 +01:00
Franck Nijhof
cf23de1c48 Add proj-dev dependency to our wheels builder (#104711) 2023-11-29 13:15:37 +01:00
Martin Hjelmare
5f44dadb66 Rename todo due_date_time parameter to due_datetime (#104698)
* Rename todo due_date_time parameter to due_datetime

* Apply suggestions from code review

---------

Co-authored-by: c0ffeeca7 <38767475+c0ffeeca7@users.noreply.github.com>
2023-11-29 13:11:15 +01:00
Jan Bouwhuis
861bb48ab6 Assign specific error code for HomeAssistantError on websocket_api connection exceptions (#104700)
Assign specific error code for HomeAssistantError
2023-11-29 13:07:52 +01:00
Franck Nijhof
9741380cc0 Add proj-util dependency to our wheels builder (#104708) 2023-11-29 12:41:47 +01:00
Simone Chemelli
fc7b17d35b Handle server disconnection for Comelit devices (#104583) 2023-11-29 12:33:25 +01:00
schelv
31cab5803c Add Option For Kelvin Unit To Color Temperature Selector (#103799) 2023-11-29 12:25:06 +01:00
Stefan Rado
d9c0acc1d2 Partially revert #103807: Remove deprecated aux heat support from ESPHome climate entities (#104694) 2023-11-29 04:45:15 -06:00
Franck Nijhof
6dc818b682 Add proj dependency to our wheels builder (#104699) 2023-11-29 11:38:23 +01:00
puddly
bd8f01bd35 Bump ZHA dependencies (#104335) 2023-11-29 11:30:15 +01:00
Erik Montnemery
999875d0e4 Autogenerate Dockerfile (#104669) 2023-11-29 11:26:50 +01:00
c0ffeeca7
bcfb5307f5 Balboa, Bond, Bosch: add host field description (#104695) 2023-11-29 11:06:50 +01:00
Jan Bouwhuis
efd330f182 Send localization info on websocket_api script errors (#104638)
* Send localization info on script errors

* Use connection exception hander

* Keep HomeAssistantError is unknown_error

* Move specific exception handling
2023-11-29 10:47:23 +01:00
Franck Nijhof
7dbaf40f48 Merge branch 'master' into dev 2023-11-29 10:13:51 +01:00
Ville Skyttä
afc3f1d933 Make huawei_lte operator search and preferred network modes translatable (#104673) 2023-11-29 10:07:54 +01:00
c0ffeeca7
634785a2d8 Atag: add host field description (#104691) 2023-11-29 10:02:49 +01:00
Sebastian YEPES
a3bad54583 Add Tuya Smart Water Timer (#95053)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-29 09:48:45 +01:00
Simone Chemelli
6a87876729 Handle server disconnection for Vodafone devices (#104650) 2023-11-29 09:39:30 +01:00
Maciej Bieniek
8c56b5ef82 Add a host field description for Bravia, Brother and NAM (#104689) 2023-11-29 09:35:38 +01:00
c0ffeeca7
4d00767081 ASUSWRT: add description of host field. Fix title (#104690)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-29 09:35:08 +01:00
Christopher Fenner
c4e3ae84f4 Optimize async executor use in ViCare integration (#104645)
* use one async executor

* use list comprehension

* simplify

* simplify

* simplify

* simplify

* simplify

* simplify

* simplify

* simplify

* add type

* Apply suggestions from code review

* fix ruff findings
2023-11-29 09:28:56 +01:00
TheJulianJES
2663a4d617 Bump zha-quirks to 0.0.107 (#104683) 2023-11-29 09:19:02 +01:00
Christopher Fenner
5dc64dd6b9 Fix HA state update in ViCare number platform (#104687)
use sync update fn
2023-11-29 09:16:58 +01:00
c0ffeeca7
8e8e8077a0 Agent DVR and Android IP webcam: Add description of host field (#104688) 2023-11-29 09:13:35 +01:00
IceBotYT
526180a8af Add PECO smart meter binary_sensor (#71034)
* Add support for PECO smart meter

* Add support for PECO smart meter

* Conform to black

* Fix tests and additional clean-up

* Return init file to original state

* Move to FlowResultType

* Catch up to upstream

* Remove commented code

* isort

* Merge smart meter and outage count into one entry

* Test coverage

* Remove logging exceptions from config flow verification

* Fix comments from @emontnemery

* Revert "Add support for PECO smart meter"

This reverts commit 36ca90856684f328e71bc3778fa7aa52a6bde5ca.

* More fixes
2023-11-29 09:08:27 +01:00
Maciej Bieniek
3aa9066a50 Add field description for Shelly host (#104686) 2023-11-29 08:45:47 +01:00
c0ffeeca7
4b667cff26 Host field description: implement review from #104658 (#104685) 2023-11-29 08:44:28 +01:00
Renat Sibgatulin
68722ce662 Bump aioairq to 0.3.1 (#104659) 2023-11-29 08:43:48 +01:00
Jan-Philipp Benecke
a9a95ad881 Revert "Introduce base entity for ping" (#104682) 2023-11-29 08:42:02 +01:00
Stefan Rado
017d05c03e Add humidity and aux heat support to ESPHome climate entities (#103807)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-11-29 17:57:30 +13:00
J. Nick Koston
3c25d95481 Bump aioesphomeapi to 19.2.0 (#104677) 2023-11-29 16:57:39 +13:00
J. Nick Koston
de3b608e78 Remove BLE connection state unsubscribe workaround from ESPHome (#104674)
aioesphomeapi now has explict coverage to ensure calling
the unsubscribe function after the connection drops is safe
and will not raise anymore
2023-11-28 23:38:00 +01:00
Alex Hermann
bdef0ba6e5 Significantly improve performance for some cases of the history start time state query (#99450)
* recorder: Apply filter in the outer query too

Function _get_start_time_state_for_entities_stmt() produced a query which
is dead-slow in my installation. On analysis, the outer query produced
millions of rows which had to be joined to the subquery. The subquery has
a filter which would eliminate almost all of the outer rows.

To speed up the query, apply the same filter to the outer query, so way
less rows have to be joined.

This reduced the query time on my system from more than half an hour to
mere milliseconds.

* lint

* merge filter

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2023-11-28 16:23:49 -06:00
Ville Skyttä
21d842cb58 Fix human readable huawei_lte sensor names (#104672)
Regression from 7c85d84133, #98631
2023-11-28 23:44:35 +02:00
Adrian Huber
2c196baa7a Add DeviceInfo to Wolf SmartSet Entities (#104642)
* Fix await warning

* Add DeviceInfo to Wolflink sensors

* Remove comment

* Don't pass device name to DeviceInfo

* Use _attr_device_info instead of property
2023-11-28 22:24:25 +01:00
J. Nick Koston
93aa31c835 Bump aioesphomeapi to 19.1.7 (#104644)
* Bump aioesphomeapi to 19.1.5

changelog: https://github.com/esphome/aioesphomeapi/compare/v19.1.4...v19.1.5

- Removes the need to watch for BLE connection drops with a seperate
  future as the library now raises BluetoothConnectionDroppedError when
  the connection drops during a BLE operation

* reduce stack

* .6

* tweak

* 19.1.7
2023-11-28 21:51:35 +01:00
Daniel Hjelseth Høyer
63ef9efa26 Bump pyAdax to 0.4.0 (#104660)
Updata Adax lib

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>
2023-11-28 21:22:48 +01:00
mkmer
595663778c Bump aiosomecomfort to 0.0.24 (#104649)
* Bump aiosomecomfort to 0.0.24

* PascalCase change
2023-11-28 19:34:30 +01:00
c0ffeeca7
9bdf82eb32 Add info what to enter into host field (#104658)
* Add info what to enter into host field

* Fix style
2023-11-28 19:32:11 +01:00
mkmer
56f2f17ed1 Bump aiosomecomfort to 0.0.23 (#104641) 2023-11-28 15:51:47 +01:00
glanch
7533895a3d Add tag name to tag_scanned event data (#97553)
* Add tag name to tag scanned event data

* Make name in event data optional, add test cases for events

* Simplify sanity None check of tag data

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

* Apply suggestions from code review

---------

Co-authored-by: Robert Resch <robert@resch.dev>
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2023-11-28 13:58:40 +01:00
fwestenberg
d3b04a5a58 Add Devialet integration (#86551)
* Add Devialet

* Bump Devialet==1.4.0

* Bump Devialet==1.4.1

* Sort manifest and add shorthand

* Black formatting

* Fix incompatible type

* Add type guarding for name

* Rename host keywork in tests

* Fix Devialet tests

* Add update coordinator

* Update devialet tests

* Create unique_id from entry data
2023-11-28 13:56:17 +01:00
Jan-Philipp Benecke
61a5c0de5e Use shorthand attributes in HVV departures (#104637)
* Use shorthand attributes in HVV departures

* Apply code review suggestion

Co-authored-by: Christopher Fenner <9592452+CFenner@users.noreply.github.com>

* Apply code review sugesstion

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

---------

Co-authored-by: Christopher Fenner <9592452+CFenner@users.noreply.github.com>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-11-28 13:44:40 +01:00
fwestenberg
9dc5d4a1bb Update stookwijzer api to atlas leefomgeving (#103323)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-11-28 13:23:51 +01:00
Allen Porter
b8cc3349be Add To-do due date and description fields (#104128)
* Add To-do due date and description fields

* Fix due date schema

* Revert devcontainer change

* Split due date and due date time

* Add tests for config validation function

* Add timezone converstion tests

* Add local todo due date/time and description implementation

* Revert configuration

* Revert test changes

* Add comments for the todo item field description

* Rename function _validate_supported_features

* Fix issues in items factory

* Readability improvements

* Apply suggestions from code review

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

* Rename CONF to ATTR usages

* Simplify local time validator

* Rename TodoListEntityFeature fields for setting extended fields

* Remove duplicate validations

* Update subscribe test

* Fix local_todo tests

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-28 13:01:12 +01:00
Franck Nijhof
2a4a5d0a07 Update cryptography to 41.0.7 (#104632) 2023-11-28 12:09:12 +01:00
Maciej Bieniek
2d2e215e2c Fix Tractive switch availability (#104502) 2023-11-28 12:08:12 +01:00
Christopher Fenner
1ef97ab6f8 Set min, max, and step for ViCare number entities (#104593)
Co-authored-by: Robert Resch <robert@resch.dev>
2023-11-28 10:53:59 +01:00
Christopher Fenner
d1463a81d3 Fix async issue in ViCare climate entity (#104619)
* use async executor

* use async executor

* Revert "use async executor"

This reverts commit 4913e05b1c6f6289018d55bcc8f16cf6391e4121.

* Revert "use async executor"

This reverts commit 40abc10362bc0910ebb9649e664d3daaeed939f5.

* fix async issue
2023-11-28 10:19:20 +01:00
Franck Nijhof
f149c809c2 Add field description for Roku host (#104631)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-11-28 10:03:57 +01:00
Teemu R
28a3d36bc1 Remove eq3btsmart integration (#94698) 2023-11-28 09:11:32 +01:00
mkmer
d318155f09 Move to new service handeling methods in Blink (#103435) 2023-11-28 08:34:41 +01:00
Allen Porter
a1aff5f4a0 Add websocket todo/item/subscribe for subscribing to changes to todo list items (#103952)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-28 08:27:51 +01:00
J. Nick Koston
e048ad5a62 Bump aioesphomeapi to 19.1.4 (#104629) 2023-11-28 08:20:04 +01:00
J. Nick Koston
7d45227a59 Bump aioesphomeapi to 19.1.3 (#104628)
- small fix for aioesphomeapi-discover
- 100% line coverage for the library
- fix not backing off on encryption errors (fixes #104624)

changelog: https://github.com/esphome/aioesphomeapi/compare/v19.1.1...v19.1.3
2023-11-27 19:48:29 -06:00
Ville Skyttä
e594c19c1e Upgrade huawei-lte-api to 1.7.3 (#104613) 2023-11-27 22:05:46 +01:00
Ville Skyttä
fd5cda4ec6 Issue bytes vs str related warnings from tests (#101186) 2023-11-27 21:59:54 +01:00
sdb9696
5cde367366 Bump ring_doorbell to 0.8.3 (#104611) 2023-11-27 21:49:33 +01:00
Ville Skyttä
04ba7fcbf4 Update leftover comment reference from black to ruff (#104605) 2023-11-27 21:42:11 +01:00
Jan-Philipp Benecke
7efc581a48 Remove duplicate fixture from bsblan (#104612) 2023-11-27 21:35:13 +01:00
Aarni Koskela
b994141bc6 CI: simplify Ruff-related things (#104602) 2023-11-27 21:23:37 +01:00
On Freund
ba33ad6b18 OurGroceries review comments (#104606) 2023-11-27 20:21:07 +01:00
Thijs Putman
360ef894a7 Use non-persistent connection for MPD (#94507)
* Do not use a persistent connection to MPD

In other words, don't rely on the connection management provided by
"python-mpd2". Instead of keeping the connection to MPD open, we
explicitly connect before and disconnect after each command.

There is probably a bit of overhead to this, but as the integration
uses a local-polling approach to begin with, no functionality is lost or
degraded.

This change greatly hardens the MPD integration against both network
issues and problems with the daemon itself. All connection-related
failure modes have effectively been removed.

* Update state retrieval methods

Only "async_get_media_image" attempts to connect, all others are either
called from there, or from the main "async_update" method (see previous
commit) which also attempts to connect.

So, this commit mainly revolves around gracefully handling situations
where no connection is available when trying to retrieve MPD state.

Finally, note the removal of "self._commands". This property is only
used at the start of "_async_get_file_image_response" and was thus
changed into a local variable.

* Update media-player control methods

These all need to explicitly connect to MPD as part of their flow.

* Correct ruff failure (auto-fixed)

* Use "async_timeout.timeout" context manager

* Minor changes

* Replace "async_timeout" with "asyncio.timeout"

* Initialise "self._status" to empty dictionary

Used to be initialised as None, which caused "NoneType is not iterable"
type of issues in case of an unexpected disconnect (at which point
status gets set to None again). Instead of guarding against None
everywhere, using an empty dictionary seemed more prudent...

Furthermore, more cautiously access its members to prevent potential
KeyError-s in similar cases.

* Fix livelock in "async_mute_volume()"

This method doesn't need a connection; it calls into two other methods
that actually connect to MPD – attempting to connect from here resulted
in a livelock.
2023-11-27 18:35:46 +01:00
Ville Skyttä
2a4ab3d53d Support HTTPS connections to Huawei LTE devices (#86119)
* Support HTTPS connections to Huawei LTE devices

Not all devices support HTTPS, so we default to plain HTTP still.

Ones that do are very likely to have certificates that do not pass
hostname verification, and are either self signed or issued by an
untrusted CA. Add option to use unverified HTTPS to make it possible to
connect to these, and when in effect, filter urllib3's related warnings
about insecure connections to the hostname in question.

* Use common config key and strings for certificate verification settings

Even though the wording might be slightly suboptimal here, it's better
to be consistent across the codebase than to finetune on this level.

This also switches the default the other way around: verification is
now disabled by default. This is not a good general default, but for
this particular case setups where the verification would succeed would
be so rare and require considerable local setup that it's very
unlikely to happen in practice.

* Add config flow tests

* Mock logout for better test coverage

* Set up custom requests session only when using unverified https

* Add https config flow test case

* Make better use of verify SSL default
2023-11-27 18:03:29 +01:00
Pascal Reeb
239d7c9d80 Enable the use of non-encrypted token in Nuki (#104007) 2023-11-27 17:28:13 +01:00
Allen Porter
664aca2c68 Fix rainbird duplicate devices (#104528)
* Repair duplicate devices added to the rainbird integration

* Apply suggestions from code review

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

* Update tests/components/rainbird/test_init.py

* Remove use of config_entry.async_setup

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-27 07:43:03 -08:00
J. Nick Koston
74d7d02833 Bump aiohttp-fast-url-dispatcher to 0.3.0 (#104592) 2023-11-27 09:04:04 -06:00
Christopher Fenner
a5934e9acc Handle preset change errors in ViCare integration (#103992) 2023-11-27 15:35:43 +01:00
Aarni Koskela
706add4a57 Switch formatting from black to ruff-format (#102893)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-27 14:38:59 +01:00
Robert Resch
cf9b0e804f Deprecate legacy api auth provider (#104409)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-27 14:16:18 +01:00
Matthias Alphart
5550dcbec8 Add textual representation entities for Fronius status codes (#94155)
* optionally decouple `EntityDescription.key` from API response key

this makes it possible to have multiple entities for a single API response field

* Add optional `value_fn` to EntityDescriptions

eg. to be able to map a API response value to a different value (status_code -> message)

* Add inverter `status_message` entity

* Add meter `meter_location_description` entity

* add external battery state

* Make Ohmpilot entity state translateable

* use built-in StrEnum

* test coverage

* remove unnecessary checks

None is handled before
2023-11-27 13:59:25 +01:00
Marc Mueller
ba8e2ed7d6 Improve picnic typing (#104587) 2023-11-27 13:13:02 +01:00
epenet
a5fd479608 Bump sfrbox-api to 0.0.8 (#104580) 2023-11-27 12:30:51 +01:00
Maciej Bieniek
855c2da64e Bump gios to version 3.2.2 (#104582) 2023-11-27 12:15:55 +01:00
CodingSquirrel
b4553f19a1 Poll econet water heater once an hour (#90961) 2023-11-27 11:16:10 +01:00
mkmer
669b347ed1 Add init test to Blink (#103263) 2023-11-27 11:13:40 +01:00
Joost Lekkerkerker
ccc8804906 Bump aiowithings to 2.0.0 (#104579) 2023-11-27 10:53:41 +01:00
ufodone
9907e11b03 Remove code owner for envisalink integration (#103864) 2023-11-27 09:59:18 +01:00
Maciej Bieniek
b3ff30a9c8 Bump accuweather to version 2.1.1 (#104563) 2023-11-27 09:49:46 +01:00
epenet
5ba70ef2cb Fix AccessDeniedException handling in Renault (#104574) 2023-11-27 09:19:58 +01:00
Jesse Hills
95c771e330 Send esphome tts_stream event after audio bytes are actually loaded into memory (#104448)
Send tts_stream event after audio bytes are actually loaded into memory
2023-11-27 09:00:39 +01:00
J. Nick Koston
7fbf68fd11 Bump aioesphomeapi to 19.1.1 (#104569)
- Fixes races in bluetooth connections
- The client now has 100% coverage
- The library is approaching ~100% coverage
- Minor performance improvement

changelog: https://github.com/esphome/aioesphomeapi/compare/v19.1.0...v19.1.1

coverage: https://app.codecov.io/gh/esphome/aioesphomeapi/tree/main
2023-11-27 08:56:06 +01:00
Franck Nijhof
321b24b146 Improve user-facing error messages in HomeWizard Energy (#104547) 2023-11-27 07:47:46 +01:00
Maciej Bieniek
670e5a2eae Bump nettigo-air-monitor to version 2.2.2 (#104562)
Bump nettigo-air-monitor to version 2.2.2
2023-11-26 22:05:50 +01:00
Jan-Philipp Benecke
b49505b390 Add reauth flow to co2signal (#104507) 2023-11-26 20:45:45 +01:00
Hessel
53e78cb017 Wallbox Change Minimum Value Charging Current (#104553) 2023-11-26 20:40:27 +01:00
J. Nick Koston
06b74249f7 Bump aioesphomeapi to 19.1.0 (#104557) 2023-11-26 19:48:35 +01:00
dotvav
087efb7545 Add Hitachi air to air heat pumps to the Climate platform (#104517) 2023-11-26 17:55:48 +01:00
jan iversen
be889c89c1 Update modbus validate table to be 3 state, to simplify the code (#104514) 2023-11-26 17:49:51 +01:00
On Freund
6e5dfa0e9b Add OurGroceries integration (#103387)
* Add OurGroceries integration

* Handle review comments

* Fix coordinator test

* Additional review comments

* Address code review comments

* Remove devices
2023-11-26 17:38:47 +01:00
Jan Bouwhuis
8a1f7b6802 Add translation key for some mqtt exceptions (#104550) 2023-11-26 17:33:54 +01:00
Jan-Philipp Benecke
b314df272f Cleanup Discovergy a bit (#104552)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-11-26 17:32:47 +01:00
Christopher Fenner
ad17acc6ca Fix async issue in ViCare integration (#104541)
* use async executor for get_circuits

* use async executor for get_burners and get_compressors
2023-11-26 15:28:58 +01:00
Maciej Bieniek
14387cf94b Remove Shelly Wall Display switch entity only if the relay is used as the thermostat actuator (#104506) 2023-11-26 14:46:29 +01:00
Maciej Bieniek
c831802774 Bump nextdns to version 2.1.0 (#104545) 2023-11-26 13:14:01 +01:00
Bouwe Westerdijk
959b98be0e Plugwise: bug-fix for Anna + Techneco Elga combination (#104521) 2023-11-26 13:08:10 +01:00
Joost Lekkerkerker
2e1c722303 Add entity translations to Balboa (#104543) 2023-11-26 13:07:21 +01:00
Joost Lekkerkerker
e3599bc26f Move APCUPSd coordinator to separate file (#104540) 2023-11-26 13:04:52 +01:00
Franck Nijhof
32eab2c7ed Remove duplicate sensors on single phase HomeWizard meters (#104493)
Co-authored-by: Duco Sebel <74970928+DCSBL@users.noreply.github.com>
2023-11-26 11:42:47 +01:00
Joost Lekkerkerker
4a5b1ab301 Migrate Epson to has entity name (#98164) 2023-11-26 11:42:30 +01:00
Franck Nijhof
bd27358398 Adjust HomeWizard test fixtures to match actual devices (#104537) 2023-11-26 11:09:14 +01:00
Christopher Fenner
e2e58c4495 Fix translation key in ViCare integration (#104536)
fix translation key
2023-11-26 10:49:06 +01:00
Raman Gupta
a074c06f92 Add alert to zwave_js device info page for custom device config (#104115) 2023-11-26 10:08:20 +01:00
Joakim Plate
b42629ecf3 Update nibe heatpump dependency to 2.5.2 (#104526)
Bump nibe to 2.5.2
2023-11-26 03:51:55 +01:00
Joost Lekkerkerker
8ffad6f7a6 Bump aiowithings to 1.0.3 (#104530) 2023-11-26 03:01:45 +01:00
Christopher Fenner
76f78d7747 Bump PyViCare to 2.29.0 (#104516)
* Update requirements_all.txt

* Update requirements_test_all.txt

* Update manifest.json
2023-11-26 01:01:53 +01:00
J. Nick Koston
498bea09f2 Bump aioesphomeapi to 19.0.1 (#104527) 2023-11-25 15:46:19 -06:00
jan iversen
86b172037b Add address to error text in modbus (#104520) 2023-11-25 21:28:49 +01:00
J. Nick Koston
fc5ae50e06 Bump aioesphomeapi to 19.0.0 (#104512) 2023-11-25 14:00:04 -06:00
Tudor Sandu
837f34c40c Add scene.delete service for dynamically created scenes (with scene.create) (#89090)
* Added scene.delete service

Only for scenes created with scene.create

* Refactor after #95984 #96390

* Split scene validation in 2

First, check if entity_id is a scene
Second, check if it's a scene created with `scene.create`

* Address feedback

- Move service to `homeassistant` domain
- Register with `platform.async_register_entity_service`
- Raise validation errors instead of just logging messages

* Revert moving the service to the `homeassistant` domain

* Remove unneeded validation

* Use helpers and fix tests

* Apply suggestions from code review

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

* Fix linting

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-25 20:14:48 +01:00
Christopher Fenner
48f8cec84b Add reuse functions to access circuits, burners and compressors in ViCare integration (#104371) 2023-11-25 15:47:45 +01:00
cronjefourie
03caa21a51 Add additional sensors for Tuya DIN (#98752)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-25 15:47:03 +01:00
Michael Hansen
71268bd407 Add HassClimateGetTemperature intent (#102831) 2023-11-25 14:50:44 +01:00
Franck Nijhof
eb472d9f71 Update sentry-sdk to 1.37.1 (#104499) 2023-11-25 14:43:30 +01:00
Avi Miller
e821ff8b49 Bump aiolifx and aiolifx-themes to support new LIFX devices (#104498) 2023-11-25 14:42:53 +01:00
Rami Mosleh
dd028220ba Use iso8601 format when fetching prayer times (#104458) 2023-11-25 14:05:08 +01:00
Christopher Fenner
17cef8940f Add translation keys to ViCare integration (#104425)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2023-11-25 13:11:29 +01:00
Paulus Schoutsen
1cfbdd6a5d Allow overriding blueprints on import (#103340)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-25 11:49:50 +01:00
Daniel Hjelseth Høyer
af7155df7a Fix link in Tibber configuration menu (#104322)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-25 11:41:20 +01:00
Xitee
ceb2680185 Add available state to OctoPrint camera (#104162) 2023-11-25 11:34:50 +01:00
tronikos
c685d56e82 Add long term statistics for IPP ink/toner levels (#102632) 2023-11-25 10:46:49 +01:00
G Johansson
8376a6bda9 Change to language selector in Workday (#104472) 2023-11-25 10:44:15 +01:00
J. Nick Koston
df37ee4033 Remove chatty ESPHome state debug logging (#104477) 2023-11-25 10:41:51 +01:00
J. Nick Koston
1c4d7e9588 Improve test coverage for ESPHome deep sleep entities (#104476) 2023-11-25 09:20:56 +01:00
Jan Bouwhuis
487ff8cd7f Rename ex to exc as name for exceptions (#104479) 2023-11-25 08:30:18 +01:00
J. Nick Koston
b94c9c8f6d Bump bluetooth-data-tools to 1.15.0 (#104480)
changelog: https://github.com/Bluetooth-Devices/bluetooth-data-tools/compare/v1.14.0...v1.15.0
2023-11-25 08:21:25 +01:00
Franck Nijhof
8273427974 Complete tests for HomeWizard energy plug HWE-SKT (#104474) 2023-11-24 17:38:39 -06:00
J. Nick Koston
4860daf1f9 Bump aioesphomeapi to 18.5.9 (#104465) 2023-11-24 17:29:19 -06:00
sdb9696
0c39c18aaf Bump ring_doorbell to 0.8.2 with listen extra (#104033) 2023-11-24 15:20:09 -06:00
Jan Bouwhuis
19040becd3 Fix hassio mqtt discovery CI test (#104463)
* Fix hassio mqtt discovery CI test

* Avoid mqtt set up before mocking the flow

* Fix mock
2023-11-24 21:54:53 +01:00
Duco Sebel
d4458cbac4 Fix HomeWizard sensors unavailable when value is '0' (#104302)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-24 21:38:46 +01:00
Jan-Philipp Benecke
94995f560f Add sensor tests to co2signal (#104464) 2023-11-24 21:35:36 +01:00
Jan Bouwhuis
9962301b42 Do not notify config errors during logging (#104466) 2023-11-24 21:34:09 +01:00
Bouwe Westerdijk
4700ad7817 Add HVACMode.OFF to Plugwise Adam (#103360) 2023-11-24 20:07:17 +01:00
Simone Chemelli
e161bb9e41 fix BLE stop error for disconnected Shelly devices (#104457) 2023-11-24 20:56:15 +02:00
Maciej Bieniek
2515dbeee1 Bump aioshelly to version 6.1.0 (#104456)
* Bump aioshelly

* Use MODEL_* consts from aioshelly

* Add missing models to BATTERY_DEVICES_WITH_PERMANENT_CONNECTION
2023-11-24 20:55:00 +02:00
Jan-Philipp Benecke
724352d55c Use AsyncMock and fixtures in co2signal tests (#104041) 2023-11-24 18:56:58 +01:00
disforw
95cfe41f87 Add toggle switch to Daikin HVAC units (#95954)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2023-11-24 18:53:59 +01:00
Marc-Olivier Arsenault
b14a7edb55 Add compWaterHeater to ecobee HVAC actions (#103278) 2023-11-24 18:32:20 +01:00
Jan Bouwhuis
af71c2bb45 Raise and suppress stack trace when reloading yaml fails (#102410)
* Allow async_integration_yaml_config to raise

* Docstr - split check

* Implement as wrapper, return dataclass

* Fix setup error handling

* Fix reload test mock

* Move log_messages to error handler

* Remove unreachable code

* Remove config test helper

* Refactor and ensure notifications during setup

* Remove redundat error, adjust tests notifications

* Fix patch

* Apply suggestions from code review

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

* Follow up comments

* Add call_back decorator

* Split long lines

* Update exception abbreviations

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2023-11-24 17:34:45 +01:00
Robert Resch
852fb58ca8 Extend auth/providers endpoint and add /api/person/list endpoint for local ip requests (#103906)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-24 17:11:54 +01:00
mkmer
512902fc59 Add Switch platform for motion detection in Blink (#102789)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-11-24 17:02:19 +01:00
dotvav
a1701f0c56 Support HitachiAirToAirHeatPump (hlrrwifi:HLinkMainController) in Overkiz (#103803) 2023-11-24 15:00:36 +01:00
Hejki
65a2f5bcd5 Support for group into command_line auth provider (#92906)
Co-authored-by: Franck Nijhof <git@frenck.dev>
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2023-11-24 13:19:25 +01:00
Joseph
df025b5993 Enumerate openai.Models to validate config (#99438) 2023-11-24 13:14:44 +01:00
Duco Sebel
62473936e2 Allow adding items Picnic shopping cart by searching (#102862)
Co-authored-by: Robert Resch <robert@resch.dev>
2023-11-24 13:06:32 +01:00
Maciej Bieniek
adc56b6b67 Add support for Shelly Wall Display in thermostat mode (#103937) 2023-11-24 12:55:41 +01:00
Paulus Schoutsen
130822fcc6 Attach Matter info to Google Assistant serialize (#103768) 2023-11-24 12:55:05 +01:00
Allen Porter
378a708bf7 Only show Google Tasks that are parents and fix ordering (#103820) 2023-11-24 12:54:49 +01:00
Tom Harris
4096687112 Allow for manual config entry of Insteon PLM path (#103705) 2023-11-24 12:33:51 +01:00
Robert Hillis
76427a0080 Deprecate Harmony switch platform (#92787)
* Deprecate Harmony switches

* uno mas

* add test for issues

* switch to remote

* uno mas
2023-11-24 11:54:43 +01:00
starkillerOG
e9dd158a8d Reolink ptz service to specify move speed (#104350) 2023-11-24 11:50:16 +01:00
J. Nick Koston
9ed745638d Chunk purging attributes and data ids for old SQLite versions (#104296) 2023-11-24 11:46:02 +01:00
Robert Svensson
b41b56e54c Support new deCONZ Particulate Matter endpoint (#104276) 2023-11-24 11:39:13 +01:00
Eugenio Panadero
3c72cd7612 Await step in config-flow instead of moving to another form (#104412)
* Await step in config-flow instead of moving to another form

* Fix call to step-api-token

* Fix condition in step-api-token
2023-11-24 11:28:49 +01:00
Franck Nijhof
560ac3d087 Remove Wiz entity descriptions required fields mixins (#104005) 2023-11-24 11:26:21 +01:00
Jan-Philipp Benecke
6f54aaf564 Introduce base entity for ping (#104197) 2023-11-24 11:20:34 +01:00
Robert Svensson
6271fe333d Rework some UniFi unique IDs (#104390) 2023-11-24 11:18:55 +01:00
Geir Råness
d4450c6c55 Add Z-wave climate sensor override for Heatit Z-TRM6 (#103896)
* add some basic overrides for z-trm6

* switched id and type

* add fixtures some lints

* duplicate tests of z-trm3

* add broken test for trm6

* fix tests, remove name from fixtures, fix comment

* lints

* forgot lints

* add better description on pwer mode

* Update comment v2

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

* fix space from github web merge

* lint on fixture

* fix permissions on fixture

---------

Co-authored-by: geir råness <11741725+geirra@users.noreply.github.com>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-24 11:01:15 +01:00
dependabot[bot]
a3eb44209d Bump github/codeql-action from 2.22.7 to 2.22.8 (#104444)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-24 10:58:05 +01:00
Martin Hjelmare
b3211fa5ee Clean mqtt patch.dict config entries (#104449) 2023-11-24 10:56:17 +01:00
Isak Nyberg
e03ccb5ab6 Add Mypermobil integration (#95613)
Co-authored-by: Franck Nijhof <git@frenck.dev>
Co-authored-by: Robert Resch <robert@resch.dev>
2023-11-24 10:40:59 +01:00
Allen Porter
114ca70961 Bump gcal_sync to 6.0.3 (#104423) 2023-11-24 10:12:00 +01:00
Joakim Plate
60370228f6 Update nibe heatpump dependency to 2.5.1 (#104429) 2023-11-24 10:09:57 +01:00
Marc Mueller
140b563312 Update mypy to 1.7.1 (#104434) 2023-11-24 10:08:48 +01:00
Luke Lashley
6a2fd434fc Bump Python Roborock to 0.36.2 (#104441) 2023-11-24 10:07:16 +01:00
Damian Sypniewski
258a93bf19 Bump yeelight to 0.7.14 (#104439) 2023-11-24 08:39:56 +01:00
J. Nick Koston
b24fa4839d Bump aioesphomeapi to 18.5.7 (#104426) 2023-11-23 22:59:51 +01:00
Robert Svensson
d78c0bd948 Handle 403 errors in UniFi (#104387)
UniFi handle 403 error
2023-11-23 20:25:26 +01:00
Ville Skyttä
616f6aab76 Add Huawei LTE restart and clear traffic statistics buttons (#91967)
* Add Huawei LTE restart and clear traffic statistics buttons

Deprecate corresponding services in favour of these.

* Change to be removed service warnings to issues

* Add tests

* Update planned service remove versions
2023-11-23 19:35:35 +01:00
aptalca
a1f7f899c9 Make SMTP notify send images as attachments if html is disabled (#93562)
smtp notify: send images without html as attachments

update smtp test to detect content_type for plain txt + image
2023-11-23 13:51:51 +01:00
starkillerOG
6b138a276a Add diagnostics platform to Reolink (#104378) 2023-11-23 12:55:21 +01:00
Raman Gupta
e9920ff73d Add select entity for zwave_js Door Lock CC (#104292)
* Add select entity for zwave_js Door Lock CC

* fix test
2023-11-23 12:51:29 +01:00
Michał Huryn
933cd89833 Blebox update IP address if already configured via zeroconf (#90511)
feat: zeroconf, update ip address if device allready configured
2023-11-23 11:15:24 +01:00
Mike Heath
d460eadce0 Add support to fully_kiosk for hybrid local push/pull switches using MQTT (#89010)
* Support hybrid local push/pull switches using MQTT

* Update homeassistant/components/fully_kiosk/entity.py

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

* Fix MQTT subscribe method

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2023-11-23 10:38:32 +01:00
Klaas Schoute
1144e33e68 Add re-auth config flow strings for Sure Petcare (#104357) 2023-11-23 10:23:15 +01:00
Joakim Sørensen
2febc9c4b3 Force IPv4 when getting location information (#104363) 2023-11-23 09:13:00 +01:00
Klaas Schoute
ada0578f3a Update gridnet lib to v5.0.0 (#104396) 2023-11-23 09:03:20 +01:00
nachonam
a91fad47bc Bump pysuez to 0.2.0 (#104338) 2023-11-23 08:57:15 +01:00
Eugenio Panadero
32aa1aaec2 Add pvpc hourly pricing optional API Token support (#85767)
* 🍱 Add new fixture for PVPC data from authenticated API call

and update mocked server responses when data is not available
(now returns a 200 OK with empty data)

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

* 🌐 Update strings for config/options flows

*  Adapt tests to check API token option and add test_reauth

* 🎨 Link new strings to those in config-flow

* 🐛 tests: Fix mocked date-change with async_fire_time_changed

* ♻️ 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
2023-11-23 08:35:30 +01:00
dependabot[bot]
0b213c6732 Bump dessant/lock-threads from 5.0.0 to 5.0.1 (#104403) 2023-11-23 08:20:50 +01:00
deosrc
5623834b37 Add Netatmo temperature services (#104124)
* Update datetime strings to match input_datetime integration

* Add netatmo service to set temperature

* Add netatmo service to clear temperature setting

* Fix formatting

* Add tests for new services

* Fix mypy error

* Fix formatting

* Fix formatting

* Apply suggestions from code review (WIP)

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

* Complete changes from review suggestions

* Fix build error

* Add service to set temperature for time period

* Expand and fix test

* Replace duplicated strings with links

---------

Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2023-11-23 08:10:10 +01:00
Klaas Schoute
eaba2c7dc1 Update p1monitor lib to v3.0.0 (#104395) 2023-11-23 07:53:50 +01:00
Christopher Fenner
556e72abf8 Add number entities to adjust heating curve in ViCare integration (#103901)
* add number entity

* use static constraints

* use async execute job

* add number platform

* Update .coveragerc

* remove unused code parts

* add types

* add missing return type

* Apply suggestions from code review

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

* Apply suggestions from code review

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

* fix docstrings

* fix variable names

* add unit of measurement

* remove obsolete unique id handling

* remove hass from constructor

* inline _entities_from_descriptions function

* fix return type

* rename variable

* Apply suggestions from code review

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

* Apply suggestions from code review

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
Co-authored-by: Jan-Philipp Benecke <github@bnck.me>
2023-11-23 07:29:28 +01:00
J. Nick Koston
a59076d140 Speed up ESPHome connection setup (#104304) 2023-11-22 23:27:17 +01:00
starkillerOG
a3c0f36592 Add Reolink serial number (#104383)
* Add Reolink serial number

* fix tests
2023-11-22 22:54:48 +01:00
Øyvind Matheson Wergeland
3e641b3ef2 Add Nobø Hub week profiles and global override (#80866)
* * Nobø Ecohub select entities
  - Week profiles
  - Global overrides

* Set integration_type

* Typing

* Remove translations

* Translation fixes
- Moved strings.select.json into strings.json
- Added translation keys for select entities
- Use shared translation keys for global override states

* Use DeviceInfo object

* Revert temperature name - uses device class name

* Fix updated checks

* Improve error handling (preparing for Silver level)

* Review
2023-11-22 21:38:13 +01:00
Jan Bouwhuis
3a42bd35e7 Test platform setup errors are notified (#104384)
Test setup errors are notified
2023-11-22 21:16:12 +01:00
starkillerOG
968563253f Bump reolink-aio to 0.8.1 (#104382) 2023-11-22 20:49:21 +01:00
Aarni Koskela
ae4552eb3e Improve Unifi switch entity unique ID naming function (#104370) 2023-11-22 20:02:16 +01:00
Jakub Čermák
41626ed500 Support for more features on smartthings AC (#99424)
* ability to set swing mode on samsung AC

* support for windFree mode on samsung AC

* Apply suggestions from code review

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

* suggestion from code reviews

* Apply suggestions from code review

---------

Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2023-11-22 20:00:28 +01:00
Dave T
7a727dc3ad Migrate Aurora_ABB_Powerone to DataUpdateCoordinator (#72363)
* Refactor to DataUpdateCoordinator

* Fix tests for sunset/sunrise

* Correct time offsets in tests

* Fix time intervals (attempt 2)

* Merge dev

* Fix tests after rebase

* Fix isort

* Address review comments: const and increase cov

* Fix merge problems

* Refactor, removing unnecessary file

* Perform blocking serial IO in the executor

* Replace deprecated  async_setup_platforms

* Update based on review comments

* Fix tests

* Update based on review comments.

* Update homeassistant/components/aurora_abb_powerone/sensor.py

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

* Use freezer for time deltas.

* Address review comments

---------

Co-authored-by: Dave T <davet2001@users.noreply.github.com>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-11-22 19:04:49 +01:00
Robert Hillis
200804237f Add binary sensor tests to Skybell (#79568)
* Add tests to Skybell

* better way to manage cache

* uno mas

* try ci fix

* temporary

* undo temporary

* ruff

* black

* uno mas

* uno mas

* remove problematic test for now

* reduce to binary sensor tests

* coverage

* move cache to json

* Update tests/components/skybell/conftest.py

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2023-11-22 18:56:50 +01:00
Joost Lekkerkerker
9278db7344 Rename variable in Overkiz config flow (#104377) 2023-11-22 18:31:18 +01:00
Joost Lekkerkerker
b5f8b35549 Remove Overkiz config flow constructor (#104375) 2023-11-22 17:54:10 +01:00
Luke Lashley
5f41d6bbfb Add better error handling for Roborock initialization (#104181)
* Introduce better handling of errors in init for Roborock

* patch internally

* push exceptions up

* remove duplicated test
2023-11-22 08:34:20 -08:00
Mick Vleeshouwer
75f237b587 Add local API support to Overkiz integration (Somfy TaHoma Developer Mode) (#71644)
* Add initial config flow implementation

* Add initial config flow implementation

* Add todos

* Bugfixes

* Add first zeroconf code

* Fixes for new firmware

* Bugfixes for local integration

* Delete local token

* Fix diagnostics

* Update translations and improve code

* Update translations and improve code

* Add local integration updates

* Add local integration updates

* Small tweaks

* Add comments

* Bugfix

* Small code improvements

* Small code improvements

* Small code improvements

* Small code improvements

* Small code improvements

* Small code improvements

* Bugfixes

* Small code improvements

* Small code improvements

* Change Config Flow (breaking change)

* Remove token when integration is unloaded

* Remove print

* Simplify

* Bugfixes

* Improve configflow

* Clean up unnecessary things

* Catch nosuchtoken exception

* Add migration for Config Flow

* Add version 2 migration

* Revert change in Config Flow

* Fix api type

* Update strings

* Improve migrate entry

* Implement changes

* add more comments

* Extend diagnostics

* Ruff fixes

* Clean up code

* Bugfixes

* Set gateway id

* Start writing tests

* Add first local test

* Code coverage to 64%

* Fixes

* Remove local token on remove entry

* Add debug logging + change manifest

* Add developer mode check

* Fix not_such_token issue

* Small text changes

* Bugfix

* Fix tests

* Address feedback

* DRY

* Test coverage to 77%

* Coverage to 78%

* Remove token removal by UUID

* Add better retry methods

* Clean up

* Remove old data

* 87% coverage

* 90% code coverage

* 100% code coverage

* Use patch.multiple

* Improve tests

* Apply pre-commit after rebase

* Fix breaking changes in ZeroconfServiceInfo

* Add verify_ssl

* Fix test import

* Fix tests

* Catch SSL verify failed

* Revert hub to server rename

* Move Config Flow version back to 1

* Add diagnostics tests

* Fix tests

* Fix strings

* Implement feedback

* Add debug logging for local connection errors

* Simplify Config Flow and fix tests

* Simplify Config Flow

* Fix verify_ssl

* Fix rebase mistake

* Address feedback

* Apply suggestions from code review

* Update tests/components/overkiz/test_config_flow.py

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2023-11-22 16:53:17 +01:00
Florian
01c49ba0e4 Add recording status for Philips TV (#94691) 2023-11-22 14:24:49 +00:00
Marc Mueller
1f3f073df9 Fix idasen_desk coordinator typing (#104361) 2023-11-22 14:08:22 +01:00
Malene Trab
60dcd24bf9 Remove MTrab from Repetier CodeOwners (#104356)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-22 13:32:36 +01:00
Bouwe Westerdijk
0996c82c02 Plugwise: limit _attr_max_temp to 35.0 for thermostats that report a max of 100. (#104324) 2023-11-22 13:20:33 +01:00
Franck Nijhof
ef89d1cd3d 2023.11.3 (#104348) 2023-11-22 12:51:36 +01:00
Klaas Schoute
02e09ed4cc Update odp-amsterdam lib to v6.0.0 (#104339) 2023-11-22 10:24:10 +01:00
Mick Vleeshouwer
254d43dcf7 Support tilt commands for DynamicVenetianBlind in Overkiz (#104330) 2023-11-22 10:23:19 +01:00
Franck Nijhof
4f94649ee2 Update sentry-sdk to 1.36.0 (#104317) 2023-11-22 10:14:46 +01:00
Allen Porter
9c4fd88a3d Bump ical to 6.1.0 (#103759) 2023-11-22 09:45:45 +01:00
Allen Porter
f5783cd3b5 Bump ical to 6.0.0 (#103482) 2023-11-22 09:45:40 +01:00
IceBotYT
cbb5d7ea39 Add Linear Garage Door integration (#91436)
* Add Linear Garage Door integration

* Add Linear Garage Door integration

* Remove light platform

* Add tests for diagnostics

* Changes suggested by Lash

* Minor refactoring

* Various improvements

* Catch up to dev, various fixes

* Fix DeviceInfo import

* Use the HA dt_util

* Update tests/components/linear_garage_door/test_cover.py

* Apply suggestions from code review

---------

Co-authored-by: Robert Resch <robert@resch.dev>
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2023-11-22 09:35:31 +01:00
Franck Nijhof
1200ded24c Bumped version to 2023.11.3 2023-11-22 09:12:24 +01:00
Erik Montnemery
da992e9f45 Bump pychromecast to 13.0.8 (#104320) 2023-11-22 09:11:21 +01:00
Allen Porter
40326385ae Bump pyrainbird to 4.0.1 (#104293) 2023-11-22 09:11:17 +01:00
Richard Kroegel
da04c32893 Bump bimmer_connected to 0.14.3 (#104282)
Co-authored-by: rikroe <rikroe@users.noreply.github.com>
2023-11-22 09:11:13 +01:00
Jan Bouwhuis
ae2ff926c1 Restore removed guard for non-string inputs in Alexa (#104263) 2023-11-22 09:11:10 +01:00
epenet
a5d48da07a Catch ClientOSError in renault integration (#104248) 2023-11-22 09:11:06 +01:00
Anton Tolchanov
669daabfdb Handle attributes set to None in prometheus (#104247)
Better handle attributes set to None
2023-11-22 09:11:02 +01:00
Jan Bouwhuis
b64ef24f20 Fix mqtt json light allows to set brightness value >255 (#104220) 2023-11-22 09:10:58 +01:00
Jan Bouwhuis
86beb9d135 Fix imap does not decode text body correctly (#104217) 2023-11-22 09:10:06 +01:00
Rene Nemec
64297aeb8f Increase Tomato request timeout (#104203)
* tomato integration timeout fixed

* update tests in tomato integration
2023-11-22 09:10:01 +01:00
mkmer
5650df5cfb Bump aiosomecomfort to 0.0.22 (#104202)
* Bump aiosomecomfort to 0.0.20

* Bump aiosomecomfort to 0.0.22
2023-11-22 09:09:56 +01:00
Allen Porter
83c59d4154 Fix Local To-do list bug renaming items (#104182)
* Fix Local To-do bug renaming items

* Fix renaming
2023-11-22 09:09:53 +01:00
Thomas Schamm
4680ac0cbf Bump boschshcpy to 0.2.75 (#104159)
Bumped to boschshcpy==0.2.75
2023-11-22 09:08:37 +01:00
J. Nick Koston
8b79d38497 Prevent Bluetooth reconnects from blocking shutdown (#104150) 2023-11-22 09:08:33 +01:00
J. Nick Koston
35b1051c67 Add debug logging for which adapter is used to connect bluetooth devices (#103264)
Log which adapter is used to connect bluetooth devices

This is a debug logging improvement to help users find problems
with their setup
2023-11-22 09:08:28 +01:00
starkillerOG
6c6e85f996 Reolink use parenthesis for multi-line lambda (#104321)
Use parenthesis
2023-11-22 08:50:29 +01:00
J. Nick Koston
59469828f1 Bump aioesphomeapi to 18.5.6 (#104341) 2023-11-22 08:43:52 +01:00
Duco Sebel
af15aab35e Add Picnic shopping cart as Todo list (#102855)
Co-authored-by: Robert Resch <robert@resch.dev>
Co-authored-by: Allen Porter <allen.porter@gmail.com>
2023-11-22 08:40:19 +01:00
J. Nick Koston
fcc7020946 Fix memory leak in ESPHome disconnect callbacks (#104149) 2023-11-22 08:35:58 +01:00
J. Nick Koston
d69d9863b5 Fix ESPHome BLE client raising confusing error when not connected (#104146) 2023-11-22 08:35:55 +01:00
Arie Catsman
885152df81 Bump pyenphase to 1.14.3 (#104101)
fix(101354):update pyenphase to 1.14.3
2023-11-22 08:35:51 +01:00
Martin Hjelmare
7ff1bdb098 Fix device tracker see gps accuracy selector (#104022) 2023-11-22 08:35:48 +01:00
deosrc
399299c13c Fix netatmo authentication when using cloud authentication credentials (#104021)
* Fix netatmo authentication loop

* Update unit tests

* Move logic to determine api scopes

* Add unit tests for new method

* Use pyatmo scope list (#1)

* Exclude scopes not working with cloud

* Fix linting error

---------

Co-authored-by: Tobias Sauerwein <cgtobi@users.noreply.github.com>
2023-11-22 08:35:44 +01:00
J. Nick Koston
c241c2f79c Fix emulated_hue with None values (#104020) 2023-11-22 08:35:40 +01:00
Martin Hjelmare
b010c6b793 Fix openexchangerates form data description (#103974) 2023-11-22 08:35:36 +01:00
Chuck Foster
2f380d4b75 Fix duplicate Ban file entries (#103953) 2023-11-22 08:35:33 +01:00
Matt Zimmerman
19f268a1e1 Update smarttub to 0.0.36 (#103948) 2023-11-22 08:35:29 +01:00
Raman Gupta
bcd371ac2b Bump zwave-js-server-python to 0.54.0 (#103943) 2023-11-22 08:35:25 +01:00
Tom Brien
a5a8d38d08 Fix Coinbase for new API Structure (#103930) 2023-11-22 08:35:22 +01:00
Simone Chemelli
56298b2c88 fix Comelit cover stop (#103911) 2023-11-22 08:35:18 +01:00
Allen Porter
cf35e9b154 Update Fitbit to avoid a KeyError when restingHeartRate is not present (#103872)
* Update Fitbit to avoid a KeyError when `restingHeartRate` is not present

* Explicitly handle none response values
2023-11-22 08:35:15 +01:00
Allen Porter
29a65d5620 Fix for Google Calendar API returning invalid RRULE:DATE rules (#103870) 2023-11-22 08:35:11 +01:00
Allen Porter
c352cf0bd8 Fix bug in Fitbit config flow, and switch to prefer display name (#103869) 2023-11-22 08:35:08 +01:00
Allen Porter
e89b47138d Bump gcal_sync to 6.0.1 (#103861) 2023-11-22 08:35:04 +01:00
suaveolent
339e9e7b48 Bump lupupy to 0.3.1 (#103835)
Co-authored-by: suaveolent <suaveolent@users.noreply.github.com>
2023-11-22 08:35:00 +01:00
J. Nick Koston
92780dd217 Bump pyunifiprotect to 4.21.0 (#103832)
changelog: https://github.com/AngellusMortis/pyunifiprotect/compare/v4.20.0...v4.21.0
2023-11-22 08:34:56 +01:00
Maikel Punie
6133ce0258 Bump velbusaio to 2023.11.0 (#103798) 2023-11-22 08:34:53 +01:00
Simone Chemelli
57c76b2ea3 Bump aiocomelit to 0.5.2 (#103791)
* Bump aoicomelit to 0.5.0

* bump to 0.5.2
2023-11-22 08:34:49 +01:00
Mick Vleeshouwer
149aef9a12 Bump pyOverkiz to 1.13.2 (#103790) 2023-11-22 08:34:45 +01:00
Mick Vleeshouwer
3dddf6b9f6 Bump pyOverkiz to 1.13.0 (#103582) 2023-11-22 08:34:41 +01:00
Allen Porter
2a26dea587 Fix Rainbird unique to use a more reliable source (mac address) (#101603)
* Fix rainbird unique id to use a mac address for new entries

* Fix typo

* Normalize mac address before using as unique id

* Apply suggestions from code review

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

* Update test check and remove dead code

* Update all config entries to the new format

* Update config entry tests for migration

* Fix rainbird entity unique ids

* Add test coverage for repair failure

* Apply suggestions from code review

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

* Apply suggestions from code review

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

* Remove unnecessary migration failure checks

* Remove invalid config entries

* Update entry when entering a different hostname for an existing host.

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-22 08:34:36 +01:00
Jan Rieger
31ac03fe50 Fix typo in calendar translation (#103789) 2023-11-22 08:31:14 +01:00
Marcel van der Veldt
fb1dfb016e Fix race condition in Matter unsubscribe method (#103770) 2023-11-22 08:31:10 +01:00
Jan Bouwhuis
8a152a68d8 Fix raising vol.Invalid during mqtt config validation instead of ValueError (#103764) 2023-11-22 08:31:06 +01:00
Marcel van der Veldt
df3e49b24f Fix discovery schema for Matter switches (#103762)
* Fix discovery schema for matter switches

* fix typo in function that generates device name

* add test for switchunit
2023-11-22 08:31:02 +01:00
G-Two
db604170ba Bump subarulink to 0.7.9 (#103761) 2023-11-22 08:30:58 +01:00
J. Nick Koston
d8a6d3e1bc Bump python-matter-server to 4.0.2 (#103760)
Co-authored-by: Marcel van der Veldt <m.vanderveldt@outlook.com>
2023-11-22 08:30:54 +01:00
Maciej Bieniek
6f086a27d4 Bump accuweather to version 2.1.0 (#103744) 2023-11-22 08:30:51 +01:00
Joost Lekkerkerker
3993c14f1d Lock Withings token refresh (#103688)
Lock Withings refresh
2023-11-22 08:30:44 +01:00
Allen Porter
d63d7841c3 Remove rainbird yaml config test fixtures (#103607) 2023-11-22 08:30:38 +01:00
Maciej Bieniek
e555671765 Bump accuweather to version 2.0.1 (#103532) 2023-11-22 08:30:33 +01:00
Vaarlion
3929b0163c Add RGB, RGBW and RGBWW capability to template.light (#86047)
* Add RGB, RGBW and RGBWW capability to template.light

Add the required unit test

Mute 'LightTemplate.async_turn_on' is too complex

Rename all HS color mode from a generic "Color" name to a specific "HS" name

* Bring back legacy "color" keyword

* Cleanup unrequested commented test

* Increase code coverage to 100%

* Remove confusing if that should never be false

* Apply suggestions from code review

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2023-11-22 08:15:26 +01:00
Robert Svensson
edf18df0e6 Add PoE power cycle button to UniFi integration (#104332) 2023-11-22 07:02:49 +01:00
Robert Svensson
f1fd8a0d2b Bump aiounifi to v66 (#104336) 2023-11-22 07:02:13 +01:00
Luke Lashley
464270d849 Add reauthentication to Roborock (#104215)
* add reauth to roborock

* update reauth based on comments

* fix diagnostics?

* Update homeassistant/components/roborock/config_flow.py

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

* remove unneeded import

* fix tests coverage

---------

Co-authored-by: Allen Porter <allen.porter@gmail.com>
2023-11-21 15:21:31 -08:00
starkillerOG
aea15ee20c Reolink add media browser for playback of recordings (#103407) 2023-11-21 23:43:56 +01:00
Klaas Schoute
91e0a53cb2 Move to asyncio.timeout for APC integration (#104340)
Move to asyncio.timeout for apcupsd
2023-11-21 23:29:46 +01:00
Yuxin Wang
33c5d1855d Rewrite APCUPSD sensors using DataUpdateCoordinator (#88467)
* Add test sensor.

* Fix sensor test file name.

* Add binary sensor test.

* Fix comments and styling.

* Remove apcupsd from omissions in coveragerc.

* Revert "Remove apcupsd from omissions in coveragerc."

This reverts commit 66b05fcb8829619a771a650a3d70174089e15d91.

* Implement the data coordinator for apcupsd.

* Add tests for sensor updates and throttles.

* Reorder the statement for better code clarity.

* Update docstring.

* Add more tests for checking if the coordinator works ok.

* Implement a custom debouncer with 5 second cooldown for the coordinator.

* Add more tests for checking if our integration is able to properly mark entity's availability.

* Make apcupsd a silver integration.

* Try to fix non-deterministic test behaviors

* Fix JSON format

* Use new `with` format in python 3.10 for better readability

* Update tests.

* Rebase and simplify code.

* Add an ups prefix to the property methods of the coordinator

* Replace init_integration with async_init_integration

* Lint fixes

* Fix imports

* Update BinarySensor implementation to add initial update of attributes

* Fix test failures due to rebases

* Reorder the statements for better code clarity

* Fix incorrect references to the ups_name property

* Simplify BinarySensor value getter code

* No need to update when adding coordinator-controlled sensors
2023-11-21 22:40:05 +01:00
Luke Lashley
f45d373e17 Make non-selected Roborock images diagnostic (#104233)
* Make images diagnostic

* Add return type

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-21 20:45:53 +01:00
Marcel van der Veldt
b604c1c222 Fix discovery schema for Matter switches (#103762)
* Fix discovery schema for matter switches

* fix typo in function that generates device name

* add test for switchunit
2023-11-21 20:25:07 +01:00
Allen Porter
95e322c52e Set Motion Blinds battery sensor as a diagnostic (#104329) 2023-11-21 10:47:06 -08:00
J. Nick Koston
4c7da97eca Bump python-matter-server to 4.0.2 (#103760)
Co-authored-by: Marcel van der Veldt <m.vanderveldt@outlook.com>
2023-11-21 18:36:50 +01:00
Erik Montnemery
c929b70fba Bump pychromecast to 13.0.8 (#104320) 2023-11-21 17:41:04 +01:00
starkillerOG
6d529a82d7 Reolink improve error handeling (#104301)
* Raise proper HomeAssistantError

* fix styling

* Use ServiceValidationError
2023-11-21 17:21:48 +01:00
Joost Lekkerkerker
dece6c8042 Bump aiowaqi to 3.0.1 (#104314) 2023-11-21 14:49:10 +01:00
starkillerOG
2dd0a74b38 Reolink add animal detection (#104216) 2023-11-21 12:45:02 +01:00
Martin Hjelmare
2d38a42fea Clean stt and tts codeowners (#104307) 2023-11-21 12:21:27 +01:00
Franck Nijhof
9ce161c09d Update vehicle to 2.2.1 (#104299) 2023-11-21 12:21:02 +01:00
Erwin Douna
eb5c7a3e76 Add Fastdotcom config flow (#98686)
* Adding config flow and tests

* Removing update and adding to integrations.json

* Updating hassfest

* Removing comments

* Removing unique ID

* Putting the setup_platform out of order

* Adding feedback on issues and importing

* Removing uniqueID (again)

* Adjusting unload and typo

* Updating manifest properly

* Minor patching

* Removing hass.data.setdefault(DOMAIN, {})

* Moving load_platform to __init__.py

* Update homeassistant/components/fastdotcom/config_flow.py

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

* Update homeassistant/components/fastdotcom/strings.json

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

* Update homeassistant/components/fastdotcom/__init__.py

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

* Update homeassistant/components/fastdotcom/config_flow.py

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

* Adding an unload function for the timer

* Adding issue on setup platform in sensor

* Update homeassistant/components/fastdotcom/config_flow.py

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

* Removing platform

* Fixing strings.json

* Fine-tuning

* Putting back last_state

---------

Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2023-11-21 09:59:34 +01:00
Christopher Fenner
5805601a83 Set unique_id by base entity in ViCare integration (#104277)
* set unique_id in ViCareEntity

* remove individual unique_id functions

* remove description

* remove individual _attr_unique_id

* fix return types
2023-11-21 09:53:02 +01:00
Erik Montnemery
6f41243410 Change confusing parameter naming in reload helper (#104257) 2023-11-21 08:25:46 +01:00
Klaas Schoute
f359b33f2e Bump energyzero lib to v1.0.0 (#104288) 2023-11-21 08:19:33 +01:00
Jan Bouwhuis
5c72d3c2d8 Restore removed guard for non-string inputs in Alexa (#104263) 2023-11-21 07:59:39 +01:00
J. Nick Koston
29ac3a8f66 Fix memory leak in ESPHome disconnect callbacks (#104149) 2023-11-21 07:58:22 +01:00
Allen Porter
3e1c12507e Bump pyrainbird to 4.0.1 (#104293) 2023-11-21 07:57:31 +01:00
Klaas Schoute
dad8545138 Bump easyenergy lib to v1.0.0 (#104289) 2023-11-21 07:56:48 +01:00
Erik Montnemery
645f916cf4 Remove support for deprecated light attributes from light scenes (#104254) 2023-11-21 07:51:41 +01:00
Richard Kroegel
d4ca9843e2 Bump bimmer_connected to 0.14.3 (#104282)
Co-authored-by: rikroe <rikroe@users.noreply.github.com>
2023-11-21 07:50:00 +01:00
J. Nick Koston
af6f451cc0 Bump aioesphomeapi to 18.5.5 (#104285) 2023-11-21 07:48:05 +01:00
Franck Nijhof
afc664f83f Update adguardhome to 0.6.3 (#104253) 2023-11-21 07:44:34 +01:00
Mick Vleeshouwer
6f82c2e230 Bump pyOverkiz to 1.13.3 (#104280) 2023-11-20 22:19:04 -08:00
Robert Resch
9d3f374728 Add todo.remove_completed_items service call (#104035)
* Extend `remove_item` service by status

* update services.yaml

* Create own service

* add tests

* Update tests/components/todo/test_init.py

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

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-20 22:39:22 +01:00
Øyvind Matheson Wergeland
5527cbd78a Fix default lock code for lock services (#103463)
* verisure: Support default code from lock entity

* Actually use default lock code

* Typing

* Only pass default code if set

* Avoid passing code as empty string

* Simplified code
2023-11-20 22:38:16 +01:00
Blastoise186
5fe5057b15 Bump yt-dlp to 2023.11.16 (#104255)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-20 20:50:15 +01:00
Franck Nijhof
b7f8ddb04c Update pvo to 2.1.1 (#104271) 2023-11-20 19:58:22 +01:00
Jan Bouwhuis
4da77d2253 Use more specific exception type for imap decoding (#104227)
* Use more specific exception type for imap decoding

* Only catch ValueError
2023-11-20 19:55:10 +01:00
Anton Tolchanov
80f8e76fa3 Handle attributes set to None in prometheus (#104247)
Better handle attributes set to None
2023-11-20 19:53:25 +01:00
Franck Nijhof
58a73f7723 Update elgato to 5.1.1 (#104252) 2023-11-20 19:27:55 +01:00
Michael
f69045fb64 Address late fritzbox coordinator runtime device discover review comments (#104267)
replace list comprehension by generator expression
2023-11-20 19:02:02 +01:00
starkillerOG
ce497dd7ed Use entity description for Reolink cameras (#104139)
* Use entity description for cams

* expend for loops
2023-11-20 09:30:39 -08:00
Erik Montnemery
cd5595a130 Use send_json_auto_id in todo tests (#104245)
* Use send_json_auto_id in todo tests

* Update tests
2023-11-20 09:13:37 -08:00
Michael
9c5e0fc2c9 Discover new added device at runtime in AVM Fritz!Smarthome (#103859) 2023-11-20 17:13:52 +01:00
Quentame
923c13907c Fix Freebox Home alarm & improve platform tests (#103475)
* Fix Freebox Home alarm

* Add trigger feature test & fix

* FreeboxCallSensor: Add test for missing coverage of new call

* Use generator

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

* Add test for arm_home feature (questions about the check)

* Stay focus on alam tests

* can_arm_home ==> if _command_arm_home

* Use one liner for supported_features

* Add idle state

* Fix rebase

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-20 15:01:18 +01:00
Franck Nijhof
6d7df5ae13 Update twentemilieu to 2.0.1 (#104250) 2023-11-20 14:18:05 +01:00
Erik Montnemery
124e1cebac Small improvement of config tests (#104243)
* Small improvement of config tests

* Update snapshots
2023-11-20 14:15:29 +01:00
Erik Montnemery
a573f60947 Rename some check_config test cases (#104244) 2023-11-20 13:02:44 +01:00
epenet
2def7d2e71 Catch ClientOSError in renault integration (#104248) 2023-11-20 12:58:55 +01:00
Erik Montnemery
afea9f7739 Don't mutate config in the check_config helper (#104241) 2023-11-20 12:55:27 +01:00
Erik Montnemery
67e25dc0bf Quote domain name in setup logs (#104239)
* Quote domain name in setup logs

* Update tests
2023-11-20 12:55:16 +01:00
J. Nick Koston
d90605f9bc Bump protobuf to 4.25.1 (#104231)
changelog: https://github.com/protocolbuffers/protobuf/releases/tag/v25.1
2023-11-20 12:34:58 +01:00
Erik Montnemery
88698d8dfe Fix docstring in yaml util (#104240) 2023-11-20 11:34:14 +01:00
J. Nick Koston
a9384d6d4f Fix ESPHome BLE client raising confusing error when not connected (#104146) 2023-11-20 10:08:44 +01:00
c0ffeeca7
ae2099b2eb Reolink: fix typo in UI strings (#104236) 2023-11-20 09:22:26 +01:00
Abílio Costa
e6226b0924 Add height sensor to Idasen Desk integration (#103324) 2023-11-20 08:07:29 +01:00
J. Nick Koston
7160e956a6 Bump aioesphomeapi to 18.5.4 (#104187)
This is mostly to clean up duplicate code in the lib, but it will
also make connecting just a tiny bit faster

We have reached over ~83% coverage in the library now
2023-11-19 22:27:44 -05:00
J. Nick Koston
cc31d77205 Use ulid_now instead of ulid_at_timestamp if no timestamp is passed (#104226)
* Use ulid_now instead of ulid_at_timestamp if no timestamp is passed

ulid_now is slightly faster than ulid_at_timestamp

* tweak usage
2023-11-19 22:27:24 -05:00
Luke Lashley
6ef194f992 Add listeners for roborock (#103651)
* Add listeners for roborock

* add tests

* decrease test complexity
2023-11-19 16:24:43 -08:00
Rene Nemec
f8e3f1497c Increase Tomato request timeout (#104203)
* tomato integration timeout fixed

* update tests in tomato integration
2023-11-19 23:49:40 +01:00
starkillerOG
a1678ebd23 Add Reolink day night switch threshold (#104219) 2023-11-19 20:46:03 +01:00
Kevin Stillhammer
173f4760bc Deprecate weather.get_forecast (#102534)
* Deprecate weather.get_forecast

* Rename forecast to get_forecasts

* raise issue for use of deprecated service

* Add fix_flow

* Add service translation/yaml
2023-11-19 20:44:02 +01:00
starkillerOG
41224f1674 Add Reolink firmware version for IPC cams (#104212) 2023-11-19 20:43:31 +01:00
G Johansson
091559d147 Add new sensors to Trafikverket Weather (#104199) 2023-11-19 20:34:41 +01:00
Allen Porter
25cc4df455 Fix Local To-do list bug renaming items (#104182)
* Fix Local To-do bug renaming items

* Fix renaming
2023-11-19 20:26:58 +01:00
Jan Bouwhuis
9a38e23f28 Fix imap does not decode text body correctly (#104217) 2023-11-19 20:15:02 +01:00
starkillerOG
1ca95965b6 Bump reolink_aio to 0.8.0 (#104211) 2023-11-19 20:01:08 +01:00
Jan Bouwhuis
68f8b2cab5 Fix mqtt json light allows to set brightness value >255 (#104220) 2023-11-19 19:50:25 +01:00
Joost Lekkerkerker
ec069fbebf Change name of universal media player to sentence case (#104204) 2023-11-19 19:27:03 +01:00
starkillerOG
9e0bc9e252 Reolink update current firmware state after install attempt (#104210) 2023-11-19 18:55:30 +01:00
Kevin Stillhammer
51385dcaab Deprecate calendar.list_events (#102481)
* deprecate calendar.list_events

* rename events to get_events

* raise issue for use of deprecated service

* Make issue fixable

* Add fix_flow

* Add service translation/yaml
2023-11-19 07:12:43 -08:00
J. Nick Koston
d3b4dd226b Prevent Bluetooth reconnects from blocking shutdown (#104150) 2023-11-19 08:22:26 -06:00
J. Nick Koston
e7cec9b148 Small speed up to constructing Bluetooth service_uuids (#104193) 2023-11-19 08:14:55 -06:00
mkmer
267bbaf425 Bump aiosomecomfort to 0.0.22 (#104202)
* Bump aiosomecomfort to 0.0.20

* Bump aiosomecomfort to 0.0.22
2023-11-19 14:07:24 +01:00
G Johansson
47cd368ed2 New api endpoint for Trafikverket Weather (#104165)
* New api endpoint for Trafikverket Weather

* fix tests
2023-11-19 10:41:48 +01:00
mkmer
0eb8daee23 Refactor async_update in Honeywell (#103069)
* Refactor async_update

* remove ignore-import

* Restore somecomforterror rather than autherror

* Update climate.py

Limit exceptions in async_update()

* Update climate.py

Ruff it

* Update climate.py

Ruff

* Refactor to login routine

* Add back avialable change

* Address extra logic in try

* Address expected returns with logic move
2023-11-19 10:41:17 +01:00
Maxwell Burdick
3622944dda Bump mopeka-iot-ble to 0.5.0 (#104186) 2023-11-18 23:14:06 -06:00
jflefebvre06
9c86adf644 Fix integration failed when freebox is configured in bridge mode (#103221) 2023-11-19 00:02:00 +01:00
Jan-Philipp Benecke
c2e81bbafb Add entity tests for ping (#104168)
* Add entity tests for ping

* Remove unused param

* Use async_setup of config_entries
2023-11-18 23:45:24 +01:00
J. Nick Koston
09df04fafe Pickup tplink codeowner (#104189)
I am going to attempt a fix for https://github.com/home-assistant/core/issues/103977
via https://github.com/python-kasa/python-kasa/pull/538

I am picking up codeowner on this for the forseeable future to watch
for issues as well
2023-11-18 23:39:47 +01:00
Abílio Costa
ce38d8542f Update Idasen Desk to fulfill Silver requirements (#102979)
* Update Idasen Desk to fulfill Silver requirements

* Add tests
2023-11-18 23:17:05 +01:00
Luke Lashley
bee457ed6f Add Image to Roborock to display maps (#102941)
* add image to roborock

* add vacuum position

* addressing MR comments

* remove room names as it isn't supported in base package

* 100% coverage

* remove unneeded map changes

* fix image logic

* optimize create_coordinator_maps

* only update time if map is valid

* Update test_image.py

* fix linting from merge conflict

* fix mypy complaints

* re-add vacuum to const

* fix hanging test

* Make map sleep a const

* adjust commenting to be less than 88 characters.

* bump map parser
2023-11-18 12:22:30 -08:00
Jan-Philipp Benecke
dfff22b5ce Add update coordinator to ping (#104148)
* Add update coordinator to ping

* Remove config_entry from coordinator

* Remove PARALLEL_UPDATES and set to hass.data
2023-11-18 17:07:58 +01:00
Marc Mueller
6773c29ccc Update aiohttp to 3.9.0 (Python 3.12) (#104152) 2023-11-18 08:53:49 -06:00
Thomas Schamm
878ccbaaef Bump boschshcpy to 0.2.75 (#104159)
Bumped to boschshcpy==0.2.75
2023-11-18 13:39:17 +01:00
J. Nick Koston
0d2bcc0192 Bump aioesphomeapi to 18.5.3 (#104141) 2023-11-17 17:16:44 -06:00
J. Nick Koston
bf87773d87 Fix zeroconf mocking (#104144) 2023-11-17 16:20:54 -06:00
Erik Montnemery
80813e992d Improve formatting of component errors (#104081)
* Improve formatting of component errors

* Update tests
2023-11-17 23:01:00 +01:00
Erik Montnemery
23ef97f774 Use relative paths in yaml syntax error messages (#104084) 2023-11-17 23:00:23 +01:00
Jan-Philipp Benecke
e5bc25523e Add config flow for Ping (#103743) 2023-11-17 13:30:30 -06:00
Jan-Philipp Benecke
2d891c77ef Reduce nesting in discovergy setup (#104127)
* Reduce nesting in discovergy setup

* Update homeassistant/components/discovergy/sensor.py

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

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-11-17 19:31:29 +01:00
Erik Montnemery
e2f6fbd59b Fix colors in check_config script (#104069) 2023-11-17 13:21:04 -05:00
sdb9696
2387e4941b Add constants to ring integration (#104134) 2023-11-17 13:17:16 -05:00
codyhackw
483e0c9a85 Fix ZHA VZM35-SN attributes (#102924)
* Fixes for VZM35-SN Attributes

* Fixes

* Update strings.json

Was missing translation keys from strings.json

* Minor Tweak to switch_type entity

Editing main switch_type entity to ensure it doesn't cause an error for the VZM35-SN

* Fix for Button Delay Entity
2023-11-17 12:38:58 -05:00
TheJulianJES
e755dd83b6 Change ZHA Tuya plugs to use quirk IDs (#102489)
Change ZHA Tuya plug matches to use quirk IDs
2023-11-17 12:28:27 -05:00
TheJulianJES
c047f47595 Fix ZHA covering mode for Aqara E1 curtain driver not initialized (#102749) 2023-11-17 12:26:46 -05:00
Michael Hansen
8c99cf14d3 Context slot decisions moved into hassil (#104132) 2023-11-17 11:07:08 -06:00
Mark Coombes
fd7f75e9af Remove marthoc as ecobee code owner (#104053)
* Update ecobee manifest.json

Remove @marthoc as codeowner.

* run hassfest

---------

Co-authored-by: Charles Garwood <cgarwood@gmail.com>
2023-11-17 14:59:17 +01:00
Erik Montnemery
a78764f000 Improve formatting of package errors (#104078) 2023-11-17 14:57:37 +01:00
Cody C
2ff9beb9c9 Fix typo in Netatmo homekit auto-discovery (#104060)
* Fix typo in Netatmo auto-discovery manifest.json

* Update zeroconf.py to fix CI issue with Netatmo
2023-11-17 14:36:28 +01:00
Michael Hansen
a8acde62ff Use device area as context during intent recognition (#103939)
* Use device area as context during intent recognition

* Use guard clauses
2023-11-17 07:34:14 -06:00
Arie Catsman
43c5bf27e6 Bump pyenphase to 1.14.3 (#104101)
fix(101354):update pyenphase to 1.14.3
2023-11-17 08:16:53 -05:00
Duco Sebel
97d38dae09 Bumb python-homewizard-energy to 4.1.0 (#104121)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-17 13:01:44 +01:00
Marc Mueller
b58af167a2 Update RestrictedPython to 7.0 (#104117) 2023-11-17 13:01:06 +01:00
J. Nick Koston
cd27b0e961 Bump aioesphomeapi to 18.5.2 (#104113) 2023-11-17 12:59:14 +01:00
dependabot[bot]
d70ef30a2a Bump github/codeql-action from 2.22.6 to 2.22.7 (#104114)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-17 12:58:33 +01:00
Franck Nijhof
b3ceb82700 Add device fixtures and tests for HomeWizard Energy 3-phase kWh meter (#104118) 2023-11-17 11:47:42 +01:00
J. Nick Koston
cf9299df59 Avoid duplicate calls to color_supported and color_temp_supported in emulated_hue (#104096) 2023-11-16 23:22:13 -06:00
Michael Hansen
f605df5bf2 Adjust logbook message for assist pipeline recording (#104105)
* Adjust logbook message

* Fix test
2023-11-16 23:39:08 -05:00
Tom Harris
d5885e0da2 Bump pyinsteon to 1.5.2 (#104098)
bump pyinsteon
2023-11-16 23:44:43 +01:00
laurentriffard
33d144fe2d Set nextcloud integration sensors as numerical values (#103856) 2023-11-16 23:29:44 +01:00
J. Nick Koston
ef5c9c2187 Bump aioesphomeapi to 18.5.1 (#104085)
* Bump aioesphomeapi to 18.5.0

changelog: https://github.com/esphome/aioesphomeapi/compare/v18.4.0...v18.5.0

* one more
2023-11-16 17:13:13 -05:00
Michael
ea6a26467e Add myself as codeowner for Proximity (#104100)
add myself as codeowner for proximity
2023-11-16 23:12:10 +01:00
Michael
0a3b20d8b2 Replace deprecated linting and formatting settings by extensions (#104050) 2023-11-16 23:10:33 +01:00
Arie Catsman
cd9ad32e32 Add catsmanac to enphase_envoy codeowners (#104086) 2023-11-16 14:56:36 -06:00
TheJulianJES
a996a51aa9 Add "Jasco Products" manufacturer to ZHA ForceOnLight (#104089)
* Add "Jasco Products" manufacturer to ZHA `ForceOnLight`

* Change tests to expect `ForceOnLight` for "Jasco Products" lights
2023-11-16 15:24:32 -05:00
Michael Hansen
b3e247d5f0 Add websocket command to capture audio from a device (#103936)
* Add websocket command to capture audio from a device

* Update homeassistant/components/assist_pipeline/pipeline.py

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

* Add device capture test

* More tests

* Add logbook

* Remove unnecessary check

* Remove seconds and make logbook message past tense

---------

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2023-11-16 10:28:06 -06:00
Erik Montnemery
4536fb3541 Remove mock_entity_platform test helper (#104073) 2023-11-16 16:55:08 +01:00
Jan-Philipp Benecke
7c030cfffa Add tests for Discovergy to reach full test coverage (#104039)
* Add tests for Discovergy to reach full test coverage

* Use snapshots and freezer
2023-11-16 16:13:15 +01:00
Franck Nijhof
2c003d8c10 Remove Deconz entity descriptions required fields mixins (#104009) 2023-11-16 16:05:29 +01:00
Erik Montnemery
b400b33b0d Refer to domain configuration in custom validator errors (#104065) 2023-11-16 15:28:48 +01:00
Jan-Philipp Benecke
cf985a8702 Fix mock typing for Discovergy (#104047) 2023-11-16 14:43:02 +01:00
sdb9696
38961c6ddc Add diagnostics platform to ring integration (#104049)
* Add diagnostics platform to ring integration

* Use real-ish data for diagnostics test and use snapshot output
2023-11-16 14:36:15 +01:00
ollo69
b4797e283f Add HTTP protocol support to AsusWRT (#95720) 2023-11-16 13:45:18 +01:00
Erik Montnemery
654c4b6e35 Use core domain constant in bootstrap (#104061) 2023-11-16 11:26:57 +01:00
Erik Montnemery
d8a49b14e5 Use relative paths in configuration validation error messages (#104064) 2023-11-16 10:56:47 +01:00
Erik Montnemery
98030a9ce1 Improve formatting of package errors (#103976) 2023-11-16 09:08:47 +01:00
gigatexel
86f87262ed Remove force_update from all DSMR entities (#104037)
Remove force_update
2023-11-16 08:59:29 +01:00
David Knowles
e10c5246b9 Add reauth support to Schlage (#103351)
* Add reauth support to Schlage

* Enforce same user credentials are used on reauth

* Changes requested during review

* Changes requested during review

* Add password to reauth_confirm data
2023-11-16 08:47:13 +01:00
Erik Montnemery
1c817cc18c Attach relevant config to check_config errors (#104048) 2023-11-16 07:25:52 +01:00
Allen Porter
613afe322f Add CalDAV To-do item support for Add, Update, and Delete (#103922)
* Add CalDAV To-do item support for Add, Update, and Delete

* Remove unnecessary cast

* Fix ruff error

* Fix ruff errors

* Remove exception from error message

* Remove unnecessary duplicate state update
2023-11-15 19:57:46 -05:00
Jan Rieger
422b09f4ec Bump python-holidays to 0.36 (#104055) 2023-11-16 01:42:55 +01:00
David Knowles
0899be6d4b Migrate Hydrawise to an async client library (#103636)
* Migrate Hydrawise to an async client library

* Changes requested during review

* Additional changes requested during review
2023-11-16 00:59:37 +01:00
Michael Hansen
45f1d50f03 Add HassGetWeather intent (#102613)
* Add HassGetWeather intent

* Use async_match_states

* Extend test coverage

* Use get_entity

* Update homeassistant/components/weather/intent.py

* Fix state

---------

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2023-11-15 16:20:15 -06:00
deosrc
c92945ecd6 Fix netatmo authentication when using cloud authentication credentials (#104021)
* Fix netatmo authentication loop

* Update unit tests

* Move logic to determine api scopes

* Add unit tests for new method

* Use pyatmo scope list (#1)

* Exclude scopes not working with cloud

* Fix linting error

---------

Co-authored-by: Tobias Sauerwein <cgtobi@users.noreply.github.com>
2023-11-15 15:28:16 -05:00
Erik Montnemery
5b37096b5f Refactor config.async_log_exception (#104034)
* Refactor config.async_log_exception

* Improve test coverage

* Make functions public
2023-11-15 19:09:49 +01:00
Raman Gupta
c132900b92 Add zwave_js.set_lock_configuration service (#103595)
* Add zwave_js.set_lock_configuration service

* Add tests

* string tweaks

* Update homeassistant/components/zwave_js/lock.py

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

* Update strings.json

* Update services.yaml

* Update lock.py

* Remove handle params

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-15 17:01:20 +01:00
Maciej Bieniek
c92a90e04d Disable options flow for Shelly Wall Display (#103988) 2023-11-15 15:45:33 +01:00
Duco Sebel
cf3a2741c5 Bumb python-homewizard-energy to 4.0.0 (#104032) 2023-11-15 15:15:48 +01:00
suaveolent
c98a3a2fd1 Add support for lupusec smoke and water sensor (#103905) 2023-11-15 13:39:34 +01:00
Maciej Bieniek
dbe193aaa4 Add release_url property of Shelly update entities (#103739) 2023-11-15 13:36:20 +01:00
Jan-Philipp Benecke
b4e8243e18 Refactor tests for discovergy (#103667) 2023-11-15 13:18:20 +01:00
Joost Lekkerkerker
0e04cd6b35 Add reauth flow to Trafikverket Weatherstation (#104027)
* Add reauth flow to Trafikverket Weatherstation

* Add tests
2023-11-15 13:15:31 +01:00
Jan-Philipp Benecke
194104f5f8 Remove CO2Signal entity description required fields mixin (#104031) 2023-11-15 13:14:12 +01:00
Erik Montnemery
c4bf8f96dd Add tests for components with custom validators (#104024)
* Add tests for components with custom validators

* Address review comments
2023-11-15 13:11:33 +01:00
Jan-Philipp Benecke
23ac3248e6 Remove Discovergy entity description required fields mixin (#104028) 2023-11-15 12:03:15 +01:00
Allen Porter
5f13faac76 Add the todo.get_items service (#103285) 2023-11-15 11:41:29 +01:00
David Bonnes
bba2734a5c Correct typo in evohome service call description (#103986)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2023-11-15 11:01:52 +01:00
Martin Hjelmare
bb456464ae Fix device tracker see gps accuracy selector (#104022) 2023-11-15 10:51:12 +01:00
Erik Montnemery
dd7670cacf Improve errors for component configuration with missing keys (#103982) 2023-11-15 10:47:05 +01:00
TheJulianJES
ac0c1d12c3 Add test checking ZHA light restores with None attributes (#102806)
* Add ZHA test checking light restores with None attributes

* Move shared `core_rs` fixture to `conftest.py`

* Remove special `color_mode` case, use `parametrize` for expected state

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-11-15 10:45:35 +01:00
Jan-Philipp Benecke
9326ea09a5 Update m* tests to use entity & device registry fixtures (#103980) 2023-11-15 10:33:11 +01:00
J. Nick Koston
51c1ea85f3 Bump zeroconf to 0.127.0 (#104017) 2023-11-15 10:29:19 +01:00
J. Nick Koston
3f11bb5f62 Speed up connecting to ESPHome devices (#104018) 2023-11-15 10:28:49 +01:00
J. Nick Koston
7803ca2612 Fix emulated_hue with None values (#104020) 2023-11-15 10:27:50 +01:00
Aidan Timson
b082ee2050 Update systembridgeconnector to 3.10.0 (#103983) 2023-11-15 09:30:56 +01:00
Franck Nijhof
a101bb9354 Remove RDW entity descriptions required fields mixins (#103995) 2023-11-15 09:23:25 +01:00
Franck Nijhof
2d36225405 Remove Reolink entity descriptions required fields mixins (#104006) 2023-11-15 09:16:47 +01:00
dependabot[bot]
880483624b Bump github/codeql-action from 2.22.5 to 2.22.6 (#104016)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-15 09:01:36 +01:00
Franck Nijhof
cfac6d18f3 Remove HomeWizard entity descriptions required fields mixins (#103994) 2023-11-15 09:00:28 +01:00
Franck Nijhof
8df7291abb Remove Withings entity descriptions required fields mixins (#104008) 2023-11-15 06:31:10 +01:00
sdb9696
182c40f16e Add reauth flow to ring integration (#103758)
* Add reauth flow to ring integration

* Refactor re-auth flow post review

* Fix threading issue on device update
2023-11-14 19:49:27 -08:00
Franck Nijhof
d1e460e97a Remove AdGuard entity descriptions required fields mixins (#103991) 2023-11-14 22:12:31 -05:00
Franck Nijhof
f24212b66e Remove TwenteMilieu entity descriptions required fields mixins (#103990)
* Remove TwenteMilieu entity descriptions required fields mixins

* Fix doc
2023-11-14 22:11:52 -05:00
Franck Nijhof
a513511936 Remove Elgato entity descriptions required fields mixins (#103989) 2023-11-14 21:51:45 -05:00
Franck Nijhof
3359619436 Remove PVOutput entity descriptions required fields mixins (#103993) 2023-11-14 21:50:11 -05:00
Franck Nijhof
e9c6da9803 Remove WLED entity descriptions required fields mixins (#103996) 2023-11-14 21:49:14 -05:00
Franck Nijhof
aecfa67265 Remove Whois entity descriptions required fields mixins (#103997) 2023-11-14 21:48:58 -05:00
Franck Nijhof
599579b26d Remove Tailscale entity descriptions required fields mixins (#103998)
Remove Tailsale entity descriptions required fields mixins
2023-11-14 21:48:49 -05:00
Franck Nijhof
76ccad40ff Remove Rituals Parfume Genie entity descriptions required fields mixins (#103999) 2023-11-14 21:48:31 -05:00
Franck Nijhof
1a079d7c6f Remove LaMetric entity descriptions required fields mixins (#104001) 2023-11-14 21:48:20 -05:00
Franck Nijhof
ce1e6ce006 Remove DSMR entity descriptions required fields mixins (#104002) 2023-11-14 21:48:01 -05:00
Franck Nijhof
17f0676483 Remove Plugwise entity descriptions required fields mixins (#104004) 2023-11-14 21:47:39 -05:00
J. Nick Koston
54c98f32c2 Bump aiohttp to 3.9.0rc0 for python 3.12 only (#103507)
Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
2023-11-15 01:02:14 +01:00
Erik Montnemery
e87ebbef01 Improve errors for component configuration with multiple errors (#103969)
* Improve errors for component configuration with multiple errors

* Suffix with link to documentation
2023-11-14 21:50:54 +01:00
Martin Hjelmare
9facdc2dbb Remove openexchangerates sensor rounding (#103972) 2023-11-14 13:01:45 -05:00
Michael Hansen
be8507f870 Add HassListAddItem intent (#103716)
* Add HassListAddItem intent

* Add missing list test
2023-11-14 13:00:30 -05:00
Erik Montnemery
2cb4435cf0 Add tests for component configuration with documentation links (#103971) 2023-11-14 17:14:34 +01:00
Chuck Foster
aca48b5e45 Fix duplicate Ban file entries (#103953) 2023-11-14 17:13:14 +01:00
Martin Hjelmare
7f08f139d6 Fix openexchangerates form data description (#103974) 2023-11-14 17:07:27 +01:00
Kalpit
b35afab5ef Add reply_to_message_id to all telegram_bot message types (#103566) 2023-11-14 16:41:13 +01:00
Chris Straffon
c621c5df39 Removed codeowner for growatt_server (#103970) 2023-11-14 16:40:55 +01:00
Kevin Stillhammer
4465c74d23 Add broadlink climate (#91183) 2023-11-14 16:05:08 +01:00
Erik Montnemery
381ebf3e53 Add tests for component configuration with multiple errors (#103964)
* Add tests for component configuration with multiple errors

* Add new configuration file

* Fix typo

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-14 15:08:20 +01:00
Erik Montnemery
2d39eaf0a2 Improve docstring of config.stringify_invalid (#103965) 2023-11-14 14:05:46 +01:00
Erik Montnemery
94a2087ba0 Improve formatting of config validation errors (#103957)
* Improve formatting of config validation errors

* Address review comments
2023-11-14 12:48:45 +01:00
Erik Montnemery
85eac5a1b1 Add additional test for package errors (#103955)
* Add additional test for package errors

* Adjust tests
2023-11-14 11:48:56 +01:00
Erik Montnemery
44c1cef42e Add tests for component configuration with extra keys (#103959) 2023-11-14 11:26:22 +01:00
Jan-Philipp Benecke
fe15ed4a28 Add device info to generic camera (#103715)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2023-11-14 10:50:55 +01:00
Matt Zimmerman
0a84c2dba6 Update smarttub to 0.0.36 (#103948) 2023-11-14 10:17:44 +01:00
fb22
96bcc6c35a Add Vicare volumetric flow and compressor phase sensors (#103875)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
Co-authored-by: Robert Resch <robert@resch.dev>
2023-11-14 09:18:37 +01:00
Raman Gupta
7a060176b6 Bump zwave-js-server-python to 0.54.0 (#103943) 2023-11-14 08:30:15 +01:00
Erik Montnemery
dedd3418a1 Improve print of line numbers when there are configuration errors (#103216)
* Improve print of line numbers when there are configuration errors

* Update alarm_control_panel test
2023-11-14 08:21:36 +01:00
dependabot[bot]
9241554d45 Bump dessant/lock-threads from 4.0.1 to 5.0.0 (#103954)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-14 08:19:42 +01:00
sdb9696
cf6c72fdbd Bump ring_doorbell to 0.8.0 and handle new exceptions (#103904)
* Bump ring_doorbell to 0.8.0 and handle the new exceptions

* Modify data update tests to not call coordinator internals
2023-11-13 23:15:19 -08:00
Jan Bouwhuis
7ca264e746 Fix raising vol.Invalid during mqtt config validation instead of ValueError (#103764) 2023-11-13 22:59:03 +01:00
mkmer
feabbfc375 Remove unneeded self.async_write_ha_state() in Blink (#103932) 2023-11-13 22:56:51 +01:00
J. Nick Koston
74c51ec9e0 Bump zeroconf to 0.126.0 (#103934)
changelog: https://github.com/python-zeroconf/python-zeroconf/compare/0.125.0...0.126.0
2023-11-13 22:04:58 +01:00
Michael Hansen
8ca1eaa839 Bump intents and hassil (#103927) 2023-11-13 15:25:15 -05:00
mkmer
f7fef14d06 Add diagnostic platform and tests to Blink (#102650)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-11-13 13:49:07 -06:00
Jan-Philipp Benecke
685537e475 Exchange co2signal package with aioelectricitymaps (#101955) 2023-11-13 13:48:33 -06:00
Tom Brien
2557e41ec0 Fix Coinbase for new API Structure (#103930) 2023-11-13 20:10:15 +01:00
Jan-Philipp Benecke
0eafc8f2cd Update k-l* tests to use entity & device registry fixtures (#103929) 2023-11-13 20:02:33 +01:00
Ruslan Sayfutdinov
1a3475ea60 Fix typing for entity_platform.async_register_entity_service (#103777) 2023-11-13 20:00:09 +01:00
Jan-Philipp Benecke
f0a455e5c7 Update icmplib privilege detection function to be async in ping integration (#103925)
* Make icmplib privilege detection function async

* I should also commit the tests..
2023-11-13 19:37:58 +01:00
Ruslan Sayfutdinov
1610dd94f9 Add 'do not edit' comment to generated files (#103923) 2023-11-13 18:33:42 +00:00
Simone Chemelli
7ab4d9793a Bump aiocomelit to 0.5.2 (#103791)
* Bump aoicomelit to 0.5.0

* bump to 0.5.2
2023-11-13 19:09:46 +01:00
Manuel Richarz
067ece97b8 Add support to fints for configuring unsupported account_types (#83537)
* Possibility to configure unsupported account_types

Changed conditions to be able to configure unsupported account_types like: Loan, Creditcards, Call money, etcpp.
Those accounts won't be added automatically. But with this fix you can add them manually via configuration if needed.

* chore: add integration_type for fints
fix: lint error
chore: add more info to warning for debugging purpose

* Possibility to configure unsupported account_types

Changed conditions to be able to configure unsupported account_types like: Loan, Creditcards, Call money, etcpp.
Those accounts won't be added automatically. But with this fix you can add them manually via configuration if needed.

* chore: broken merge

* fix: remove version from manifest.json

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2023-11-13 17:41:22 +01:00
r01k
7ef47da27d Add HTTPS support for Fully Kiosk (#89592)
* Add HTTPS support for Fully Kiosk with optional certificate verification.

* All pytests passing.

* Better readability for url parameter of DeviceInfo

* All pytests passing with latest fixes from upstream

* Removing fully_kiosk/translations

* Rebasing

* Added extra error detail when the integration config flow fails

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2023-11-13 17:40:57 +01:00
Steven Looman
39c81cb4b1 Prefer IPv4 locations over IPv6 locations for upnp devices/component (#103792) 2023-11-13 10:09:27 -06:00
Max
1e57bc5415 Add number state to prometheus metrics (#102518) 2023-11-13 17:03:08 +01:00
Allen Porter
ba3269540f Cleanup CalDAV test fixtures (#103893) 2023-11-13 15:57:47 +01:00
Marcel van der Veldt
0e4186ff8a Fix race condition in Matter unsubscribe method (#103770) 2023-11-13 15:42:51 +01:00
Mick Vleeshouwer
818bc12f87 Bump pyOverkiz to 1.13.2 (#103790) 2023-11-13 15:41:06 +01:00
Erik Montnemery
f89194784d Fix including yaml files with scalar values (#103914) 2023-11-13 15:23:50 +01:00
Erik Montnemery
07af073735 Remove trailing space from configuration error messages (#103909)
* Remove trailing space from configuration error messages

* Update test
2023-11-13 15:19:37 +01:00
Marc Mueller
c6f9af2cab Reset mypy ci cache (#103910) 2023-11-13 14:40:26 +01:00
Rami Mosleh
a1356874ea Bump Islamic prayer times library to 0.0.10 (#103420) 2023-11-13 14:13:06 +01:00
Erik Montnemery
e64582ae9a Add tests for yaml syntax errors (#103908) 2023-11-13 14:04:58 +01:00
Simone Chemelli
2bdd969cf6 fix Comelit cover stop (#103911) 2023-11-13 14:04:12 +01:00
Christopher Fenner
109bcd86f1 Add reauth flow to ViCare integration (#103109)
Co-authored-by: Robert Resch <robert@resch.dev>
2023-11-13 13:57:29 +01:00
ollo69
1e375352bb Use decorator for AsusWrt api calls (#103690) 2023-11-13 13:55:31 +01:00
Maikel Punie
9bd73ab362 Bump velbusaio to 2023.11.0 (#103798) 2023-11-13 13:53:49 +01:00
G Johansson
8e71086c21 Workday add languages (#103127) 2023-11-13 13:41:46 +01:00
FredericMa
d4c5a93b63 Add Risco communication delay (#101349)
* Add optional communication delay in case a panel responds slow.

* Add migration test

* Connect by increasing the communication delay

* Update init to use option instead of config

* Updated strings

* Fix migration and tests

* Review changes

* Update connect strategy

* Update tests

* Changes after review

* Change typing from object to Any.

* Add test to validate communication delay update.

* Move test to separate file

* Change filename.
2023-11-13 12:24:20 +01:00
Jan-Philipp Benecke
92b3c0c96b Update i-j* tests to use entity & device registry fixtures (#103900) 2023-11-13 11:51:55 +01:00
Erik Montnemery
be2cee228c Add tests for package errors (#103902) 2023-11-13 11:21:37 +01:00
suaveolent
74bf255da6 Bump lupupy to 0.3.1 (#103835)
Co-authored-by: suaveolent <suaveolent@users.noreply.github.com>
2023-11-13 10:37:49 +01:00
Erik Montnemery
d0efea3dbd Add tests for configuration validation errors (#103848)
* Add tests for configuration validation errors

* Use absolute path for hass.config.config_dir

* Apply suggestions from code review

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-13 07:25:58 +01:00
J. Nick Koston
50a65fc8c4 Bump zeroconf to 0.125.0 (#103877) 2023-11-12 17:12:58 -06:00
David Knowles
1888311800 Hydrawise: Explicitly set switch state on toggle (#103827)
Explicitly set switch state on toggle
2023-11-12 23:09:08 +01:00
Allen Porter
64c9aa0cff Update Fitbit to avoid a KeyError when restingHeartRate is not present (#103872)
* Update Fitbit to avoid a KeyError when `restingHeartRate` is not present

* Explicitly handle none response values
2023-11-12 12:49:49 -08:00
Michael
efe33d815f Address late proximity coordinator review comments (#103879) 2023-11-12 21:36:54 +01:00
Jan Bouwhuis
f94167a4bb Fix invalid oauth2_unauthorized translation ref (#103873)
* Fix invalids oauth2_unauthorized translation ref

* Fix oauth2_failed
2023-11-12 21:13:38 +01:00
Joakim Plate
5ee62f2965 Update nibe heatpump to 2.5.0 (#103788)
* Update nibe heatpump to 2.5.0

* Adjust for typing changes in lib

* If we use float value, we assume it's valid
2023-11-12 20:25:34 +01:00
Jan-Philipp Benecke
eda475fe25 Update h* tests to use entity & device registry fixtures (#103866)
* Update h* tests to use entity & device registry fixtures

* Add missed lines
2023-11-12 13:52:32 -05:00
dotvav
3a531f5698 Add Hitachi Heat Pumps outdoor temperature sensors (#103806)
Add  OVP and HLRRWIFI outdoor temperature sensors
2023-11-12 19:50:18 +01:00
Jan-Philipp Benecke
9ab1cb83d8 Update a-c* tests to use entity & device registry fixtures (#103793)
* Update a-c* tests to use entity & device registry fixtures

* Revert some changes

* Revert formatting

* retrigger CI
2023-11-12 13:45:30 -05:00
Allen Porter
abb1328a67 Fix for Google Calendar API returning invalid RRULE:DATE rules (#103870) 2023-11-12 13:44:26 -05:00
Diogo Gomes
80042aa108 Add binary sensors to V2C (#103722)
* Add binary_sensor to V2C

* sort platforms

* change to generator

* make it generator

* fix
2023-11-12 19:35:37 +01:00
Allen Porter
96a19d61ab Fix bug in Fitbit config flow, and switch to prefer display name (#103869) 2023-11-12 19:27:02 +01:00
Erik Montnemery
51b599e1f6 Deduplicate some code in helpers.check_config.async_check_ha_config_file (#103852)
Tweak helpers.check_config.async_check_ha_config_file
2023-11-12 19:15:01 +01:00
Erik Montnemery
1168956f8c Small improvement of yaml util tests (#103853) 2023-11-12 19:14:52 +01:00
Erik Montnemery
6303366cf4 Tweak config._recursive_merge (#103850) 2023-11-12 19:06:12 +01:00
Erik Montnemery
01b3e0c49e Remove useless code from entity helper tests (#103854) 2023-11-12 18:55:34 +01:00
Allen Porter
fd7d2dfe75 Bump gcal_sync to 6.0.1 (#103861) 2023-11-12 18:48:42 +01:00
Michael
b2f31d5763 Implement update coordinator in Proximity (#103443) 2023-11-12 18:28:39 +01:00
Erik Montnemery
50e11a7a37 Tweak loader.resolve_dependencies (#103851) 2023-11-12 17:27:32 +01:00
Ruslan Sayfutdinov
adcd4e59cf More useful message on services.yaml parse error (#103847) 2023-11-12 16:18:12 +00:00
Franck Nijhof
bb63da764e Complete tests for HomeWizard kWh Meter SDM230 (#103840) 2023-11-12 14:30:00 +01:00
Rami Mosleh
0c421b7309 Add entity description mixin to transmission switches (#103843)
* Add entity description mixin for transmission switches

* minor fix
2023-11-12 13:13:49 +01:00
Jan-Philipp Benecke
04a497343d Update f-g* tests to use entity & device registry fixtures (#103841) 2023-11-12 13:07:38 +01:00
Diogo Gomes
b9bc6ca070 Address late V2C review comments (#103808)
* address review

* missing fixture
2023-11-12 12:04:10 +01:00
Greg Dowling
6a7e87f1c3 Add Roon volume hooks (#102470)
* Add ability for roon to call HA for volume changes.

* Fix merge errors.

* Fix mypy errors.

* Remove config option for hooks.

* WIP split entities.

* Tidy, fix test.

* Tidy after review.

* Remove event tests for now.

* Recview comments.

* remove trace.

* Bump pyroon to 0.1.5, deregister volume hooks.

* Remove type annotations.

* Add new file .coveragerc.

* Remove ghost constants.

* Review changes.

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-12 11:58:15 +01:00
Franck Nijhof
5a452155fc Small cleanup in HomeWizard tests (#103837) 2023-11-12 11:38:22 +01:00
Jan-Philipp Benecke
81450f0117 Update d-e* tests to use entity & device registry fixtures (#103804) 2023-11-12 10:38:32 +01:00
J. Nick Koston
2cffb4df6d Bump pyunifiprotect to 4.21.0 (#103832)
changelog: https://github.com/AngellusMortis/pyunifiprotect/compare/v4.20.0...v4.21.0
2023-11-12 09:33:48 +01:00
J. Nick Koston
492d8acf3f Bump zeroconf to 0.123.0 (#103830)
changelog: https://github.com/python-zeroconf/python-zeroconf/compare/0.122.3...0.123.0
2023-11-12 09:32:14 +01:00
Allen Porter
25650563fe Fix Rainbird unique to use a more reliable source (mac address) (#101603)
* Fix rainbird unique id to use a mac address for new entries

* Fix typo

* Normalize mac address before using as unique id

* Apply suggestions from code review

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

* Update test check and remove dead code

* Update all config entries to the new format

* Update config entry tests for migration

* Fix rainbird entity unique ids

* Add test coverage for repair failure

* Apply suggestions from code review

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

* Apply suggestions from code review

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

* Remove unnecessary migration failure checks

* Remove invalid config entries

* Update entry when entering a different hostname for an existing host.

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-12 08:36:30 +01:00
J. Nick Koston
48a8ae4df5 Bump aioesphomeapi to 18.4.0 (#103817) 2023-11-11 18:27:49 -06:00
Allen Porter
1d5fcfc7c8 Improve local calendar based on local todo review feedback (#103483)
* Improve local calendar based on local todo review feedback

* Revert fakestore change to diagnose timeout

* Revert init changes

* Revert and add assert
2023-11-12 00:14:08 +01:00
Marc Mueller
a70ec64408 Update mypy to 1.7.0 (#103800) 2023-11-11 23:31:04 +01:00
Marc Mueller
66d1a7f1dd Update ReadOnlyEntityOptions typing (#103813) 2023-11-11 22:30:55 +01:00
Marc Mueller
c35f56ea77 Handle BaseException from asyncio gather (#103814) 2023-11-11 22:26:37 +01:00
Jan Rieger
bf41167951 Fix typo in calendar translation (#103789) 2023-11-11 14:24:23 +01:00
Allen Porter
048b989b2b Bump ical to 6.1.0 (#103759) 2023-11-11 12:57:05 +01:00
Alex Tsernoh
f3cccf0a2b Add Komfovent (#95722)
* komfovent integration V1

* add dependency

* integrate komfovent api

* fix errors found in testing

* tests for form handling

* update deps

* update coverage rc

* add correct naming

* minor feedback

* pre-commit fixes

* feedback fixes part 1 of 2

* feedback fixes part 2 of 2

* add hvac mode support

* fix tests

* address feedback

* fix code coverage + PR feedback

* PR feedback

* use device name

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-11-11 11:19:41 +01:00
Allen Porter
787fb3b954 Improve OAuth error handling in configuration flows (#103157)
* Improve OAuth error handling in configuration flows

* Update strings for all integrations that use oauth2 config flow

* Remove invalid_auth strings

* Revert change to release

* Revert close change in aiohttp mock
2023-11-11 11:02:51 +01:00
Joost Lekkerkerker
667a453a35 Lock Withings token refresh (#103688)
Lock Withings refresh
2023-11-11 09:39:41 +01:00
Allen Porter
3f70437888 Add support to Google Calendar for Web auth credentials (#103570)
* Add support to Google Calendar for webauth credentials

* Fix broken import

* Fix credential name used on import in test

* Remove unnecessary creds domain parameters

* Remove unnecessary guard to improve code coverage

* Clarify comments about credential preferences

* Fix typo

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-10 22:49:10 -08:00
Paul Bottein
eaaca3e556 Add translations for update entity components (#103752)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-11 01:33:02 +01:00
Maciej Bieniek
531a3e4fa8 Bump accuweather to version 2.1.0 (#103744) 2023-11-10 21:46:15 +01:00
Raman Gupta
618b666126 Add support for responses to call_service WS cmd (#98610)
* Add support for responses to call_service WS cmd

* Revert ServiceNotFound removal and add a parameter for return_response

* fix type

* fix tests

* remove exception handling that was added

* Revert unnecessary modifications

* Use kwargs
2023-11-10 21:44:43 +01:00
G-Two
229944c21c Bump subarulink to 0.7.9 (#103761) 2023-11-10 21:32:10 +01:00
sdb9696
70f7582f95 Add myself as code owner for ring integration (#103767) 2023-11-10 20:11:18 +01:00
Marcel van der Veldt
ebdd2daab6 Add helper method to get matter device info (#103765)
* Add helper method to get matter device info

* Cleanup async

* Guard

* get node from device id instead of node id

* Fix test

---------

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2023-11-10 13:43:54 -05:00
Michael Hansen
e157206eeb Conversation reload with language=None clears all languages (#103757)
Reload with language=None clears all languages
2023-11-10 13:22:49 -05:00
J. Nick Koston
253e6188eb Bump dbus-fast to 2.14.0 (#103754) 2023-11-10 17:11:41 +01:00
Jean-Marie White
82ce5e56b5 Fix DST handling in TOD (#84931)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-11-10 07:25:25 -06:00
Quentame
3666af0b10 Fix Freebox flaky tests (#103745) 2023-11-10 13:51:35 +01:00
Diogo Gomes
93f63c5472 Add number to V2C (#103681) 2023-11-10 13:28:32 +01:00
Christopher Fenner
dda40c10d4 Add myself to vicare codeowners (#103738)
* Revert "Remove myself from vicare codeowners (#90755)"

This reverts commit 21a873f0af.

* Apply suggestions from code review
2023-11-10 11:31:14 +01:00
tronikos
10e7622e38 Address flume post merge review comments (#102807)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-10 11:20:58 +01:00
Franck Nijhof
70ad5ab3e4 Update helper tests to use device & entity registry fixtures (#103710) 2023-11-10 09:32:19 +01:00
starkillerOG
9f6eef7cca Fix Reolink DHCP IP update (#103654) 2023-11-10 09:27:33 +01:00
Bram Kragten
2f26096469 Update frontend to 20231030.2 (#103706) 2023-11-10 09:04:33 +01:00
J. Nick Koston
a06fabfbc6 Bump aioesphomeapi to 18.3.0 (#103730)
changelog: https://github.com/esphome/aioesphomeapi/compare/v18.2.7...v18.3.0
2023-11-10 07:30:31 +01:00
Diogo Gomes
64e8c995e6 Bump pytrydan to 0.4.0 (#103721)
Bump pytrydan
2023-11-10 07:11:28 +01:00
Tudor Sandu
527a3dba9c Add script_mode parameter to custom intent scripts (#102203)
* Add script_mode parameter to custom intent scripts

* Reuse CONF_MODE from the script component
2023-11-09 16:41:25 -06:00
Franck Nijhof
04e0e2bd75 Update a* tests to use device & entity registry fixtures (#103711) 2023-11-09 20:46:20 +01:00
Jan-Philipp Benecke
b81f15725f Update bond tests to use entity & device registry fixtures (#103708) 2023-11-09 19:47:23 +01:00
J. Nick Koston
5ee826528d Bump zeroconf to 0.122.3 (#103657) 2023-11-09 19:46:34 +01:00
Jan-Philipp Benecke
0a57968fdc Update nut sensor tests to use parametrize (#103707)
* Update nut sensor tests to use parametrize

* Add missing model

* Check on unique_id instead of config_entry_id

* Separate tests
2023-11-09 19:01:07 +01:00
Franck Nijhof
81909f7ddf Update deconz tests to use device & entity registry fixtures (#103703) 2023-11-09 18:06:53 +01:00
J. Nick Koston
d1f1bbe304 Migrate to using aiohttp-fast-url-dispatcher (#103656) 2023-11-09 17:23:33 +01:00
Joost Lekkerkerker
1a6c3a4944 Add name to Withings coordinator (#103692) 2023-11-09 12:44:50 +01:00
tronikos
9af5e838c6 Add type annotation for service functions with response (#102813)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-09 12:31:12 +01:00
Diogo Gomes
4bbdf475b4 Add switch platform to V2C (#103678)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-11-09 11:12:05 +01:00
Diogo Gomes
cd94ad125a Bump pytrydan to 0.3.0 (#103691) 2023-11-09 10:41:05 +01:00
ollo69
143e114528 Improve AsusWRT integration tests (#102810) 2023-11-09 09:18:32 +01:00
J. Nick Koston
78add0f51d Bump aioesphomeapi to 18.2.7 (#103676) 2023-11-09 08:47:37 +01:00
J. Nick Koston
dc7d817398 Incease tplink setup timeout (#103671)
It can take longer than 5s to do the first update of the device
especially when the device is overloaded as seen in #103668

Wait 10 seconds for the discovery since when the power strips are loaded they cannot respond in time
2023-11-09 01:13:11 +01:00
Erik Montnemery
123f14dd6c Attach correct platform config in check_config warnings and errors (#103633) 2023-11-09 00:06:04 +01:00
Raman Gupta
f511a8a26a Expand zwave_js.set_config_parameter with additional parameters (#102092) 2023-11-08 17:05:31 -05:00
Luke Lashley
1a51d863cf Bump Python-Roborock to 0.36.1 (#103662)
bump to 0.36.1
2023-11-08 22:39:06 +01:00
Allen Porter
cec617cfbb Add support for deleting To-do items in Google Tasks (#102967)
* Add support for deleting To-do items in Google Tasks

* Cleanup multipart test

* Fix comments

* Add additional error checking to increase coverage

* Apply suggestions and fix tests
2023-11-08 18:13:48 +01:00
Jan-Philipp Benecke
5901f6f7e7 Move met coordinator to own module (#103546) 2023-11-08 16:55:09 +01:00
ccrepin
241e8560e9 Change NP, NO code to Disarmed (#103617) 2023-11-08 14:46:49 +01:00
Jan Bouwhuis
db97e7588b Fix entity category for binary_sensor fails setup (#103511) 2023-11-08 14:10:24 +01:00
Hessel
5bb3c7ca55 Wallbox Add Authentication Decorator (#102520) 2023-11-08 13:13:11 +01:00
Franck Nijhof
24a65808ac Update black to 23.11.0 (#103644) 2023-11-08 13:08:41 +01:00
Erik Montnemery
d913508607 Allow removing an entity more than once (#102904) 2023-11-08 12:50:40 +01:00
Luke Lashley
44fe704f49 Bump python-roborock to 0.36.0 (#103465) 2023-11-08 12:48:05 +01:00
Maikel Punie
a78ef60773 Add duotecno OFF hvac mode (#103223) 2023-11-08 12:46:15 +01:00
Joakim Plate
0a2a699133 Extend climate tests for nibe heatpump (#103522) 2023-11-08 12:40:28 +01:00
Mick Vleeshouwer
3697567f18 Remove redundant exception and catch NotSuchTokenException in Overkiz integration (#103584) 2023-11-08 12:32:37 +01:00
Ville Hartikainen
8e99760595 Add vscode task to run changed tests (#103501) 2023-11-08 11:33:19 +01:00
dependabot[bot]
381d8abd58 Bump sigstore/cosign-installer from 3.1.2 to 3.2.0 (#103640)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-08 11:29:50 +01:00
jan iversen
81cb7470fc Remove illegal int8 from modbus config (#103489) 2023-11-08 11:06:14 +01:00
Erik Montnemery
cc5eda76d3 Humanize core config errors in check_config helper (#103635) 2023-11-08 10:15:27 +01:00
jan iversen
40dc6d8191 Reduce modbus validator by using table (#103488) 2023-11-08 09:55:00 +01:00
David Knowles
8e9528d34d Bump pydrawise to 2023.11.0 (#103638) 2023-11-08 09:28:38 +01:00
dupondje
4f11ee6e0b Fix 5B Gas meter in dsmr (#103506)
* Fix 5B Gas meter in dsmr

In commit 1b73219 the gas meter broke for 5B.
As the change can't be reverted easily without removing the peak usage
sensors, we implement a workaround.

The first MBUS_METER_READING2 value will contain the gas meter data just
like the previous BELGIUM_5MIN_GAS_METER_READING did.
But this without the need to touch dsmr_parser (version).

Fixes: #103306, #103293

* Use parametrize

* Apply suggestions from code review

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

* Add additional tests + typo fix

---------

Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
2023-11-08 09:13:51 +01:00
Joakim Sørensen
a0f19f26c4 Bump awesomeversion from 23.8.0 to 23.11.0 (#103641) 2023-11-08 09:11:54 +01:00
Franck Nijhof
f69b8f37f8 Update pytest-picked to 0.5.0 (#103631) 2023-11-08 07:02:07 +01:00
Diogo Gomes
0fdd929f54 Add 4 new sensors to V2C (#103634)
* add 4 sensors

* no need for extra class
2023-11-08 06:59:24 +01:00
J. Nick Koston
23578d8046 Bump dbus-fast to 2.13.1 (#103621)
* Bump dbus-fast to 2.13.0

changelog: https://github.com/Bluetooth-Devices/dbus-fast/compare/v2.12.0...v2.13.0

* no change re-release since upload failed due to running out of space on pypi
2023-11-07 19:42:53 -06:00
starkillerOG
a51bbe9a66 Add HDR switch to Reolink (#103550) 2023-11-08 01:11:44 +01:00
Franck Nijhof
22fa33ce7a Small cleanup in conftest mocks of Sensors.Community (#103630) 2023-11-08 01:11:07 +01:00
Franck Nijhof
2b12a95607 Update cryptography to 40.0.5 (#103624) 2023-11-08 01:10:41 +01:00
Franck Nijhof
780e6c06ec Update syrupy to 4.6.0 (#103626) 2023-11-08 01:09:56 +01:00
Franck Nijhof
3e204ab82b Small cleanup in conftest mocks of PVOutput (#103628) 2023-11-08 01:09:44 +01:00
Franck Nijhof
91ffe4f9e5 Update sentry-sdk to 1.34.0 (#103623) 2023-11-08 00:55:52 +01:00
Erik Montnemery
e49f6b41ee Rename YAML loader classes (#103609) 2023-11-08 00:26:54 +01:00
Frederik Gladhorn
41a235bb52 Improve HomeKit description of what the PIN looks like (#103170)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-11-08 00:06:30 +01:00
Rami Mosleh
77a2f1664e Use EntityDescription for Transmission entities (#103581) 2023-11-08 00:05:17 +01:00
mkmer
36011d0384 Bump blinkpy to 0.22.3 (#103438) 2023-11-08 00:04:23 +01:00
Jan Bouwhuis
cbccdbc6fa Fix entity category for sensor fails mqtt sensor platform setup (#103449) 2023-11-08 00:03:47 +01:00
Mick Vleeshouwer
a11091890f Support continue_on_error for command execution in Overkiz (#103591) 2023-11-08 00:02:34 +01:00
Franck Nijhof
d935d06265 Remove myself from verisure codeowners (#103625) 2023-11-08 00:01:25 +01:00
Franck Nijhof
c69141236e Update radios to v0.2.0 (#103614) 2023-11-07 23:54:06 +01:00
Joakim Sørensen
2859055b36 Add instance id to the cloud integration (#103162) 2023-11-07 23:52:18 +01:00
Mick Vleeshouwer
947ce592c1 Remove obstruction detected property for covers in Overkiz (#103597) 2023-11-07 23:50:22 +01:00
Erik Montnemery
859c5c48c4 Fix yaml loader tests to test both C and Python implementations (#103606) 2023-11-07 23:49:31 +01:00
Allen Porter
e8c568a243 Remove rainbird yaml config test fixtures (#103607) 2023-11-07 23:24:34 +01:00
Erik Montnemery
c29b0cd05b Correct line numbers in yaml node annotations (#103605) 2023-11-07 23:22:23 +01:00
Franck Nijhof
95fe7aa491 Update open-meteo to v0.3.1 (#103613) 2023-11-07 22:54:56 +01:00
Joost Lekkerkerker
836ebfd84b Bump yt-dlp to 2023.10.13 (#103616) 2023-11-07 22:50:09 +01:00
Jan Bouwhuis
624837912c Fix metoffice test_forecast_subscription raises key error (#103598)
Allow test time change to be processed
2023-11-07 22:11:02 +01:00
Diogo Gomes
0d67557106 Add V2C Trydan EVSE integration (#103478)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-11-07 21:53:22 +01:00
Michael Hansen
9c2febc72e Small code clean up (#103603) 2023-11-07 20:52:58 +01:00
J. Nick Koston
0d63e2f9b5 Ensure large payloads are compressed in the executor with aiohttp 3.9.0 (#103592) 2023-11-07 12:37:54 -06:00
Tudor Sandu
d3ed8a6b8b Validate empty sentence triggers (#103579)
* Validate empty sentence triggers

* Add extra test for no sentences

* Remove extra line

---------

Co-authored-by: Michael Hansen <mike@rhasspy.org>
2023-11-07 11:56:24 -06:00
Erik Montnemery
05deae09fc Add file and line annotation to strings when loading yaml (#103586) 2023-11-07 17:10:15 +01:00
Joost Lekkerkerker
6276c4483c Raise exception when data can't be fetched in Opensky (#103596) 2023-11-07 16:33:46 +01:00
Raman Gupta
0fcaa2c581 Add zwave_js.refresh_notifications service (#101370) 2023-11-07 09:11:38 -05:00
Teemu R
21af563dfe Bump python-songpal to 0.16 (#103561)
* Bump python-songpal to 0.16

* Set _attr_device_class
2023-11-07 09:06:34 -05:00
suaveolent
5b43351807 fix: get_devices only checks for the first type (#103583) 2023-11-07 14:46:02 +01:00
Joost Lekkerkerker
b636a4d5cf Parametrize DSMR serial config flow tests (#103524) 2023-11-07 14:13:57 +01:00
Luke Lashley
c13744f4cf Remove MyQ Integration (#103565)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2023-11-07 14:11:54 +01:00
Lukáš Vasek
38acad8263 Add geofencing mode for Somfy Thermostat in Overkiz (#103160)
103136 Added geofencing mode for Overkiz thermostat
2023-11-07 13:14:30 +01:00
Mick Vleeshouwer
6c5ba53668 Bump pyOverkiz to 1.13.0 (#103582) 2023-11-07 13:12:26 +01:00
Mick Vleeshouwer
76b322c6b3 Retrieve manufacturer and configuration_url from client in Overkiz integration (#103585)
Retrieve manufacturer and configuration_url from client
2023-11-07 13:10:14 +01:00
Etienne G
b233d248ff Add support for SomfyHeatingTemperatureInterface in Overkiz integration (#83514) 2023-11-07 12:48:41 +01:00
Christian Fetzer
2349e3ac1d Add select for partial position (garage door) in Overkiz (#99500) 2023-11-07 12:15:25 +01:00
J. Nick Koston
2a80164508 Bump aioesphomeapi to 18.2.4 (#103552) 2023-11-07 11:22:41 +01:00
G Johansson
ef7a3787bb Remove Ezviz detection sensitivity service (#103392) 2023-11-07 10:51:11 +01:00
J. Nick Koston
da1780f9ec Small cleanups to process_success_login (#103282) 2023-11-07 10:48:34 +01:00
dupondje
3ca6cddc1f Update dsmr-parser to 1.3.1 to fix parsing issues (#103572) 2023-11-07 10:38:37 +01:00
Florent Fourcot
446de10aec Add hvac_action support to melcloud (#103372)
Since actions are shared between water tank (if any) and climate device,
hvac action can be idle even when heat pump is active

Co-authored-by: jan iversen <jancasacondor@gmail.com>
2023-11-07 10:14:50 +01:00
Allen Porter
0a05a16fcb Add read-only Caldav todo platform (#103415)
* Add Caldav todo enttiy for VTODO components

* Use new shared apis for todos

* Update homeassistant/components/caldav/todo.py

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

* Update todo item conversion checks

* Iterate over results once

* Add 15 minute poll interval for caldav todo

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-07 09:11:52 +01:00
Rami Mosleh
b6a3f628d1 Bump transmission-rpc to version 7.0.3 (#103502)
* Bump transmission-rpc to version 7.0.3

* Change `date_added` to `added_date`
2023-11-07 09:04:59 +01:00
Álvaro Fernández Rojas
369cea175a Update aioairzone-cloud to v0.3.6 (#103535) 2023-11-07 08:50:05 +01:00
Mick Vleeshouwer
9a1173f6a6 Add diagnostics tests to Overkiz integration (#103560)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2023-11-07 08:44:24 +01:00
Franck Nijhof
9a776d958c Update pvo to 2.1.0 (#103551) 2023-11-07 08:18:25 +01:00
Charles Garwood
b372a64057 Bump pyenphase to 1.14.2 (#103553) 2023-11-06 17:53:44 -06:00
Nathan Spencer
53b15fd16d Allow WeatherFlow devices to be removed (#103556)
Allow WeatherFlow devices to be removed if they haven't reported
2023-11-07 00:25:00 +01:00
starkillerOG
9c0bfc1b58 Bump reolink_aio to 0.7.15 (#103548) 2023-11-06 23:56:18 +01:00
Aidan Timson
96e9a57fa3 Add processes count sensor to System Bridge (#103516)
* Add processes count sensor to System Bridge

* Add processes string
2023-11-06 23:47:39 +01:00
epenet
c9e8a3a887 Fix invalid MAC in samsungtv (#103512)
* Fix invalid MAC in samsungtv

* Also adjust __init__
2023-11-06 23:43:56 +01:00
Franck Nijhof
0b4d20b1f9 Update vehicle to 2.2.0 (#103545) 2023-11-06 23:31:54 +01:00
David Bonnes
af4ccefb8a Bump evohome-async to 0.4.6 (#103534)
* bump client to 0.4.5

* bump to 0.4.6

* adress lint mypy fails
2023-11-06 22:13:17 +01:00
Jan-Philipp Benecke
0dc6c1d03a Fix entry data typing in bsblan (#103544) 2023-11-06 21:43:02 +01:00
Michael Hansen
ae516ffbb5 Automatically convert TTS audio to MP3 on demand (#102814)
* Add ATTR_PREFERRED_FORMAT to TTS for auto-converting audio

* Move conversion into SpeechManager

* Handle None case for expected_extension

* Only use ATTR_AUDIO_OUTPUT

* Prefer MP3 in pipelines

* Automatically convert to mp3 on demand

* Add preferred audio format

* Break out preferred format

* Add ATTR_BLOCKING to allow async fetching

* Make a copy of supported options

* Fix MaryTTS tests

* Update ESPHome to use "wav" instead of "raw"

* Clean up tests, remove blocking

* Clean up rest of TTS tests

* Fix ESPHome tests

* More test coverage
2023-11-06 15:26:00 -05:00
Joost Lekkerkerker
054089291f Bump nettigo-air-monitor to 2.2.1 (#103529) 2023-11-06 21:03:48 +01:00
Maciej Bieniek
e08d2408c9 Bump accuweather to version 2.0.1 (#103532) 2023-11-06 21:02:02 +01:00
Aidan Timson
471fb4bce3 Update systembridgeconnector version to 3.9.5 (#103515) 2023-11-06 21:01:25 +01:00
J. Nick Koston
408e977b17 Try to avoid re-parsing the content-type in hassio ingress if possible (#103477)
Co-authored-by: Stefan Agner <stefan@agner.ch>
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-11-06 20:48:47 +01:00
Maciej Bieniek
570b4ccb4b Bump gios to version 3.2.1 (#103533) 2023-11-06 20:31:12 +01:00
Maciej Bieniek
57a3c70731 Bump nextdns to version 2.0.1 (#103531) 2023-11-06 20:30:01 +01:00
Franck Nijhof
8371fe520e Update elgato to 5.1.0 (#103530) 2023-11-06 20:24:01 +01:00
Franck Nijhof
08b43c4477 Add device fixtures and tests for HomeWizard Energy Watersensor (#103383)
Co-authored-by: Duco Sebel <74970928+DCSBL@users.noreply.github.com>
2023-11-06 18:12:58 +01:00
Aidan Timson
ad22a11485 Update systembridgeconnector to 3.9.4 (#103425)
* Update systembridgeconnector to 3.9.2

* Update systembridgeconnector to version 3.9.3

* Update systembridgeconnector to version 3.9.4

* Fix import
2023-11-06 15:50:28 +01:00
Jan Bouwhuis
54cf7010cd Add ServiceValidationError and translation support (#102592)
* Add ServiceValidationError

* Add translation support

* Extend translation support to HomeAssistantError

* Add translation support for ServiceNotFound exc

* Frontend translation & translation_key from caller

* Improve fallback message

* Set websocket_api as default translation_domain

* Add MQTT ServiceValidationError exception

* Follow up comments

* Revert removing gueard on translation_key

* Revert test changes to fix CI test

* Follow up comments

* Fix CI test

* Follow up

* Improve language

* Follow up comment
2023-11-06 15:45:04 +01:00
David Bonnes
5cd61a0cf4 Remove redundant code from the evohome integration (#103508)
* remove unreachable except clause

* remove uneccesary try
2023-11-06 15:17:28 +01:00
Nathan Spencer
b0e04ae690 Handle null data in WeatherFlow sensors (#103349)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-11-06 14:48:00 +01:00
dupondje
91182603d5 Use right equipment identifier in DSMR setup (#103494) 2023-11-06 14:19:47 +01:00
Joakim Plate
a35f5dc6f5 Split out coordinator and add tests for nibe_heatpump (#103452)
* Separate coordinator in nibe heatpump

* Add tests for coordinator in nibe

* Correct errors in coordinator found during testing

* If coil is missing we should still write state
* async_shutdown did not call base class

* Add more tests for coordinator

* Add minimal test to climate
2023-11-06 11:15:00 +01:00
Franck Nijhof
cee8379628 Update tailscale to 0.6.0 (#103409) 2023-11-06 11:12:33 +01:00
Joakim Sørensen
6d567c3e0a Bump pycfdns from 2.0.1 to 3.0.0 (#103426) 2023-11-06 11:05:44 +01:00
Álvaro Fernández Rojas
779b19ca46 On Airzone cloud unload logout (#103487) 2023-11-06 10:51:14 +01:00
Jan Bouwhuis
5dd787aa10 Validate entity category for binary_sensor (#103464) 2023-11-06 10:34:06 +01:00
G Johansson
b580ca6e6f Add Check date service for Workday (#97280) 2023-11-06 10:17:48 +01:00
David Bonnes
3cfb2d557f Bump evohome-async to 0.4.4 (#103084)
* initial commit

* use correct attr

* fix hass-logger-period

* initial commit

* reduce footprint

* reduce footprint 2

* reduce footprint 3

* reduce footprint 4

* reduce footprint 6

* reduce footprint 7

* reduce footprint 8

* reduce footprint 9

* bump client to 0.4.1

* missing commit - changed method name

* bump client to 0.4.3

* bump client to 0.4.4
2023-11-06 10:10:28 +01:00
Allen Porter
aa8b36c4e2 Bump ical to 6.0.0 (#103482) 2023-11-06 08:54:30 +01:00
Rami Mosleh
1b17f6d837 Store Islamic Prayer Times coordinator in 'entry_id' key (#103405) 2023-11-06 08:50:41 +01:00
Matthias Alphart
70196d5ee0 Fix KNX expose default value when attribute is None (#103446)
Fix KNX expose default value when attribute is `null`
2023-11-06 08:39:40 +01:00
Joost Lekkerkerker
52736c6039 Sort Withings sleep data on end date (#103454)
* Sort Withings sleep data on end date

* Sort Withings sleep data on end date
2023-11-06 07:58:13 +01:00
jan iversen
5eba6dbc9f modbus Allow swap: byte for datatype: string. (#103441) 2023-11-06 07:52:15 +01:00
Matt Zimmerman
fd3d615c0d Handle smarttub sensor values being None (#103385)
* [smarttub] handle sensor values being None

* empty commit to rerun CI

* lint

* use const in test

* reorder checks

* use None instead of STATE_UNKNOWN

* empty commit to rerun CI

* check for STATE_UNKNOWN in test

* empty commit to rerun CI
2023-11-06 04:11:50 +01:00
Rami Mosleh
f6cb7e1bc5 Refactor tests for Islamic Prayer Times (#103439)
Refactor tests
2023-11-06 04:07:57 +01:00
Álvaro Fernández Rojas
ab6b3d5668 Allow setting HVAC mode through set_temperature service in Airzone Cloud integration (#103184)
* airzone_cloud: climate: set_temperature: support ATTR_HVAC_MODE

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

* tests: airzone_cloud: set_temp: check HVAC mode

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

---------

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2023-11-06 01:33:01 +01:00
Álvaro Fernández Rojas
77baea8cb7 Allow setting HVAC mode through set_temperature service in Airzone integration (#103185)
* airzone: climate: set_temperature: support ATTR_HVAC_MODE

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

* tests: airzone: set_temp: check HVAC mode

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

---------

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2023-11-06 01:32:03 +01:00
rappenze
17acb04fb8 Refactor fibaro config flow test (#102604)
* Refactor fibaro config flow test

* Use constants from FlowResultType

* Extend tests with recovery after failure

* Add recovery from failure in all tests
2023-11-06 01:30:06 +01:00
G Johansson
43cab28700 Remove platform YAML from GeoJSON (#103393) 2023-11-06 01:15:49 +01:00
Jan Bouwhuis
f88e137679 Fix fritz entity category binary sensor is invalid (#103470) 2023-11-05 22:49:08 +01:00
Tobias Sauerwein
35791d7d6c Bump pyatmo to v7.6.0 (#103410)
Signed-off-by: Tobias Sauerwein <cgtobi@gmail.com>
2023-11-05 21:13:45 +01:00
jan iversen
701a93c298 Modbus set device_class in slaves (#103442) 2023-11-05 20:20:13 +01:00
Matt Zimmerman
806205952f Fix litterrobot test failure due to time zone dependence (#103444)
* fix litterrobot test

* use a date in northern hemisehpere summer
2023-11-05 18:42:07 +01:00
mkmer
751ebbda51 Use local variables in Blink (#103430)
local variables
2023-11-05 14:21:20 +01:00
Álvaro Fernández Rojas
fefea89d89 Update aioairzone-cloud to v0.3.5 (#103315)
* Update aioairzone-cloud to v0.3.3

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

* Update aioairzone-cloud to v0.3.4

Reverts accidental TaskGroup changes.

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

* Update aioairzone-cloud to v0.3.5

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

* Trigger Github CI

---------

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-11-05 07:09:29 -06:00
J. Nick Koston
a8deb6afd0 Bump zeroconf to 0.120.0 (#103412)
changelog: https://github.com/python-zeroconf/python-zeroconf/compare/0.119.0...0.120.0
2023-11-05 07:08:24 -06:00
J. Nick Koston
8ef3cf2e18 Bump bluetooth-data-tools to 0.14.0 (#103413)
changelog: https://github.com/Bluetooth-Devices/bluetooth-data-tools/compare/v1.13.0...v1.14.0
2023-11-05 07:07:44 -06:00
Michael
108aed7843 Fix serial in Flo device information (#103427) 2023-11-05 12:41:15 +01:00
Erik Montnemery
3ba8a82243 Differentiate between warnings and errors in check_config helper (#102902)
* Differentiate between warnings and errors in check_config helper

* Update tests

* Treat configuration errors in frontend and its dependencies as errors

* Improve test coverage

* Address review comments

* Improve test coverage

* Improve test coverage

* Address review comments

* Add comment
2023-11-05 03:08:04 +01:00
Allen Porter
936956a430 Fix CalDAV supported components check when configured from the UI (#103411)
* Fix CalDAV supported components check when configured from the UI

* Move async_get_calendars to a seprate file

* Simplify return value for async_get_calendars
2023-11-05 01:36:00 +01:00
J. Nick Koston
d3bbcbe27c Pin jaraco.functools to fix builds and CI (#103406) 2023-11-04 18:38:28 -05:00
Sebastian Lövdahl
c04db6a249 Bump vallox_websocket_api to 4.0.2 (#103339) 2023-11-04 14:55:50 -05:00
G Johansson
941239262a Remove platform YAML from LastFM (#103391) 2023-11-04 19:24:34 +01:00
G Johansson
d0603729f2 Remove platform YAML from DWD Weather Warnings (#103379) 2023-11-04 18:56:53 +01:00
Maciej Bieniek
8e8f2a2163 Don't assume that the sleep value is a dictionary in Tractive integration (#103138)
* Sleep value can be null

* Catch TypeError
2023-11-04 18:08:06 +01:00
G Johansson
d078a4396c Remove platform YAML from Qnap (#103377) 2023-11-04 17:59:12 +01:00
J. Nick Koston
b9b986dc8d Bump protobuf to 4.25.0 (#103373) 2023-11-04 10:54:34 -05:00
J. Nick Koston
8b30a901dd Remove unreachable code in logbook (#103309) 2023-11-04 10:54:22 -05:00
David Knowles
22306bd309 Add diagnostics support to Schlage (#103347)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-11-04 10:54:00 -05:00
G Johansson
7671ab0bb7 Remove platform yaml from myStrom (#103378) 2023-11-04 16:41:59 +01:00
mkmer
26e1285f34 Address late review for blink (#103376)
* use self.coordinator

* Dont store coordinator

* revert unintended sensor change

* revert remove

* indention error

* revert

* Revert more
2023-11-04 16:21:10 +01:00
G Johansson
72c02d4d63 Remove counter configure service (#103204)
* Remove counter configure service after deprecation

* reproduce state
2023-11-04 16:17:51 +01:00
G Johansson
2d3318e767 Remove platform YAML from Command line (#103202) 2023-11-04 16:17:31 +01:00
Franck Nijhof
07f03d9ec9 Set suggested display precision for HomeWizard Energy power sensors (#103369) 2023-11-04 15:40:50 +01:00
Jan-Philipp Benecke
c561372f30 Remove deprecated /config/server_control redirect (#103331) 2023-11-04 09:14:03 -05:00
Jan-Philipp Benecke
1517081a2d Set device entry type for dwd_weather_warnings (#103370)
* Set device entry type for dwd_weather_warnings

* Set integration type to service
2023-11-04 14:47:06 +01:00
Jan-Philipp Benecke
216349de25 Address late review for NINA (#103367)
Set device entry type
2023-11-04 14:00:01 +01:00
Franck Nijhof
109944e4ff Replace/restructure HomeWizard device fixtures to reflect reality (#103311) 2023-11-04 13:37:08 +01:00
Jan Rieger
aa2a748235 Add translations to speedtest.net state attributes (#103362) 2023-11-04 13:20:16 +01:00
Jan-Philipp Benecke
6036fda219 Add DeviceInfo to NINA (#103361) 2023-11-04 13:19:23 +01:00
Chris Xiao
37757f777f AirNow sensors should share device identifier (#103279)
* Entities from the same config entry should have the same device identifier
* Clean up unused device entries with no entities after sensor setup

Co-authored-by: James Pan <32176676+jzpan1@users.noreply.github.com>
Co-authored-by: Theo Ma <62950302+t1an-xyz@users.noreply.github.com>
Co-authored-by: Jonathan McDevitt <69861492+Jonmcd1@users.noreply.github.com>
Co-authored-by: Jadon Yack <86989502+jadonyack@users.noreply.github.com>
Co-authored-by: Ashton Foley <121987068+foleyash@users.noreply.github.com>
Co-authored-by: Leon Yan <138124222+leony7@users.noreply.github.com>
2023-11-04 13:16:40 +01:00
Jan Rieger
39c97f5b14 Add translations to Tankerkoenig state attributes (#103363) 2023-11-04 13:14:24 +01:00
Raman Gupta
2b3d57859e Add test for firmware update scenario (#103314) 2023-11-04 13:12:06 +01:00
Tobias Sauerwein
fa6d8d281d Change log level to debug in Netatmo (#103365)
Change log level to debug
2023-11-04 12:31:57 +01:00
Robert Svensson
22be56a05b Handle UniFi traffic rules not supported on older versions (#103346) 2023-11-04 12:19:56 +01:00
Tobias Sauerwein
96409cf0e0 Use pyatmo device type enum instead of string (#103030) 2023-11-04 11:28:26 +01:00
Jan Rieger
f5fee73e01 Add translations to DWD state attributes (#103359) 2023-11-04 11:15:54 +01:00
Matthias Alphart
5cd27a877e Use setdefault() in scaffold script for setting hass.data (#103338) 2023-11-04 10:51:34 +01:00
Jan Rieger
bb8375da72 Report correct weather condition at night for Met (#103334)
* Report correct weather condition at night for Met, fixes #68369, fixes #89001

* Update homeassistant/components/met/weather.py

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

---------

Co-authored-by: Jan-Philipp Benecke <github@bnck.me>
2023-11-04 09:48:02 +01:00
J. Nick Koston
68471b6da5 Reduce template render overhead (#103343)
The contextmanager decorator creates a new context manager every
time its run, but since we only have a single context var, we can
use the same one every time. Creating the contextmanager was roughly
20% of the time time of the template render

I was a bit suprised to find it creates a new context manager
object every time https://stackoverflow.com/questions/34872535/why-contextmanager-is-slow
2023-11-04 09:46:01 +01:00
Rami Mosleh
62067fc64c Fix sensor unique id in Islamic prayer times (#103356) 2023-11-04 09:43:20 +01:00
Ian
51c3a5d11d Nextbus: Listify directions (#103337)
When a single value is returned, the list wrapper is not present in the
json payload. This patch ensures that the result is always a list.
2023-11-04 08:56:27 +01:00
Jan-Philipp Benecke
ae1117bc74 Fix failing entity reuse test (#103342)
* Fix failing entity reuse test

* One more test
2023-11-03 23:19:37 +01:00
Erik Montnemery
0ea0a1ed06 Prevent accidentally reusing an entity object (#102911)
* Prevent accidentally reusing an entity object

* Fix group reload service

* Revert "Fix group reload service"

* Improve test

* Add tests aserting entity can't be reused
2023-11-03 21:01:38 +01:00
J. Nick Koston
dca72c598e Small speed up to async_listen (#103307)
Avoid constructing an inner function each time we call async_listen
and use a partial which holds a reference to the function body with new
args instead of making another full function
2023-11-03 20:58:03 +01:00
J. Nick Koston
062b510ec0 Cache the mime type of static files (#103281) 2023-11-03 12:37:29 -05:00
Joakim Sørensen
4778c55d2b Bump pytraccar from 1.0.0 to 2.0.0 (#103318) 2023-11-03 18:09:56 +01:00
Jan Rieger
0f1c96ba97 Add translations to Workday state attributes (#103320) 2023-11-03 17:49:48 +01:00
Joakim Sørensen
921d6feae7 Remove extra from traccar webhook (#103319) 2023-11-03 17:44:48 +01:00
Jan-Philipp Benecke
88850334f1 Fix typo in Todoist config flow (#103317) 2023-11-03 17:16:20 +01:00
J. Nick Koston
fd8caaf846 Bump SQLAlchemy to 2.0.23 (#103313) 2023-11-03 11:10:08 -05:00
starkillerOG
1df69f52e5 Bump reolink-aio to 0.7.14 and improve typing of Reolink (#103129)
* Improve typing

* fix mypy

* Further improve typing

* Restore Literal typing

* Bump reolink_aio to 0.7.13

* Bump reolink-aio to 0.7.14
2023-11-03 17:05:27 +01:00
Ian
c1d979dc07 Bump py_nextbusnext to v1.0.2 to fix TypeError (#103214)
* Bump py_nextbusnext to v1.0.1 to fix TypeError

Currently throwing an error as a set is passed into the method that is currently
expecting a Sequence. That method is technically compatible with Iterable, so the
latest patch relaxes that restriction.

* Bump version to v1.0.2 to fix error message
2023-11-03 17:03:02 +01:00
J. Nick Koston
5bcff82148 Remove useless inner function in the base Bluetooth coordinator (#103305)
Remove unless inner function in the base Bluetooth coordinator
2023-11-03 15:41:47 +01:00
Raman Gupta
eeb88f5e07 Fix zwave_js cover bug for Window Covering CC values (#103289)
* Fix cover bug for Window Covering CC values

* update test

* Fix fixture

* Remove no-op line from test
2023-11-03 15:36:48 +01:00
Maikel Punie
eadfd51dab Add loggers to the duotecno integration (#103300) 2023-11-03 13:11:26 +01:00
Tom
2a31eb6762 Fix Plugwise Schedule selection (#103262) 2023-11-03 12:17:36 +01:00
tronikos
5d2110c32c Bump opower to 0.0.39 (#103292) 2023-11-03 12:15:49 +01:00
Marcel van der Veldt
680162d494 Fix Matter 1.2 locks with specific unlatch/unbolt support (#103275) 2023-11-03 12:09:31 +01:00
Raman Gupta
ac1dc4eeea Fix firmware update failure (#103277) 2023-11-03 12:08:40 +01:00
Paul Bottein
89a9e6c6e8 Add trigger selector for blueprint (#103050) 2023-11-03 09:11:49 +01:00
Guido Schmitz
f5cc4dcf3e Add MAC adress to devolo Home Network DeviceInfo (#103290)
Add MAC adress to devolo Home Network devices
2023-11-03 08:34:49 +01:00
J. Nick Koston
c81ada16ba Add debug logging for which adapter is used to connect bluetooth devices (#103264)
Log which adapter is used to connect bluetooth devices

This is a debug logging improvement to help users find problems
with their setup
2023-11-03 07:35:51 +01:00
Erik Montnemery
a63c420890 Quote entity ids in entity excpetions (#103286) 2023-11-03 06:04:07 +01:00
G Johansson
12e1acfcfc Cleanup weather test (#103090)
* Cleanup weather test

* rename

* Clean off not used MockWeatherCompat

* conftest

* more cleanup

* Fin mod tests

* fix others
2023-11-03 05:53:38 +01:00
J. Nick Koston
379c75ea1b Bump yalexs-ble to 2.3.2 (#103267) 2023-11-02 22:00:43 -05:00
Allen Porter
a95aa4e15f Add config flow to CalDAV (#103215)
* Initial caldav config flow with broken calendar platform

* Set up calendar entities

* Remove separate caldav entity

* Update tests after merge

* Readbility improvements

* Address lint issues

* Apply suggestions from code review

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

* Add checking for duplicate configuration entries

* Use verify SSL as input into caldav and simplify test setup

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-02 19:48:56 -07:00
Kevin Stillhammer
06c9719cd6 Support multiple responses for service calls (#96370)
* add supports_response to platform entity services

* support multiple entities in entity_service_call

* support legacy response format for service calls

* revert changes to script/shell_command

* add back test for multiple responses for legacy service

* remove SupportsResponse.ONLY_LEGACY

* Apply suggestion

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

* test for entity_id remove None

* revert Apply suggestion

* return EntityServiceResponse from _handle_entity_call

* Use asyncio.gather

* EntityServiceResponse not Optional

* styling

---------

Co-authored-by: Allen Porter <allen.porter@gmail.com>
2023-11-02 18:37:35 -07:00
Jan Bouwhuis
b86f3be510 Optmize timing excecutor timeout test (#103276) 2023-11-02 20:00:34 -05:00
Abílio Costa
4a117c0a1e Add buttons to connect/disconnect the Idasen Desk (#102433)
Co-authored-by: J. Nick Koston <nick@koston.org>
2023-11-02 19:57:48 -05:00
Pedro Januário
e7db0bf34d add library logger info on ecoforest integration manifest (#103274) 2023-11-02 23:32:46 +01:00
Jan-Philipp Benecke
4e3ff45a5e Use constant instead of plain key name for device info attributes (#103188)
* Use constant instead of plain key name for device info connections

* Some more device info constant changes
2023-11-02 21:59:25 +01:00
J. Nick Koston
f15fb6cf5e Reduce overhead to run event triggers (#103172) 2023-11-02 15:48:32 -05:00
J. Nick Koston
45f5c21402 Speed up websocket and ingress with aiohttp-zlib-ng (#103247) 2023-11-02 15:18:12 -05:00
Álvaro Fernández Rojas
35e1ecec8d Update aioairzone-cloud to v0.3.2 (#103258)
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2023-11-02 20:53:26 +01:00
Charles Garwood
b12d99bd2b Bump pyenphase to 1.14.1 (#103239) 2023-11-02 15:46:58 -04:00
rappenze
4c3c86511b Fix fibaro event handling (#103199) 2023-11-02 18:07:35 +01:00
Joakim Plate
194a799b0a Remove measurement flag from timestamp in gardena bluetooth (#103245)
Remove measurement flag from timestamp
2023-11-02 16:47:33 +01:00
Joost Lekkerkerker
401bb90215 Use shorthand attributes in Random (#103206) 2023-11-02 14:40:27 +01:00
Joost Lekkerkerker
a0741c74b2 Remove icon in Random (#103235) 2023-11-02 13:18:13 +01:00
Denis Shulyaka
d18b2d8748 Shield service call from cancellation on REST API connection loss (#102657)
* Shield service call from cancellation on connection loss

* add test for timeout

* Apply suggestions from code review

* Apply suggestions from code review

* fix merge

* Apply suggestions from code review
2023-11-02 12:58:26 +01:00
Jan Bouwhuis
4a4d2ad743 Fix mqtt config validation error handling (#103210)
* Fix MQTT config check

* Fix handling invalid enity_category for sensors

* Improve docstr

* Update comment

* Use correct util for yaml dump
2023-11-02 10:57:00 +01:00
Allen Porter
fe482af561 Add modernized fitbit battery level sensor (#102500)
* Add modernized fitbit battery level sensor

* Use entity names for existing battery sensors

* Use icon from device class

* Update homeassistant/components/fitbit/strings.json

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

* Update tests with lower case naming

* Swap the names of the device battery sensors

* Revert "Swap the names of the device battery sensors"

This reverts commit c9516f6d06d77a27c5d7528cdbaa69153546bbbb.

* Update homeassistant/components/fitbit/sensor.py

Co-authored-by: Jan Vaníček <janvanicek@post.cz>

* Improve typing

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
Co-authored-by: Jan Vaníček <janvanicek@post.cz>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-11-02 10:22:27 +01:00
Matthias Alphart
76115ce766 Fix Fronius entity initialisation (#103211)
* Use None instead of raising ValueError if value invalid

* use async_dispatcher_send
2023-11-02 09:13:04 +01:00
Luke Lashley
47d6d6c344 Add button platform to Roborock (#103010)
* add button platform to roborock

* Update tests/components/roborock/test_button.py

Co-authored-by: Duco Sebel <74970928+DCSBL@users.noreply.github.com>

* Remove device class

* improve tests

* sort platforms

---------

Co-authored-by: Duco Sebel <74970928+DCSBL@users.noreply.github.com>
2023-11-01 21:34:04 +01:00
Xitee
f05d2eb261 Fix roomba error if battery stats are not available (#103196) 2023-11-01 21:12:57 +01:00
Xitee
135944b6f0 Fix roomba translation key mismatch (#103191) 2023-11-01 20:15:18 +01:00
Jan-Philipp Benecke
67fa304b78 Use constant instead of plain key name for device info connections in roborock and roomba (#103182) 2023-11-01 18:09:49 +01:00
Jan-Philipp Benecke
56b4369f44 Add MAC address to bsblan device info (#103180) 2023-11-01 17:53:40 +01:00
J. Nick Koston
12c5aec5e6 Add bluetooth address to august (#103177) 2023-11-01 10:47:56 -05:00
Jan-Philipp Benecke
ebee51a794 Add MAC address to roborock device info (#103175) 2023-11-01 10:28:03 -05:00
Jan-Philipp Benecke
e48cb909f4 Use shorthand device info attribute for roomba (#103176) 2023-11-01 10:27:51 -05:00
jimmyd-be
ae02e3f903 Add reset filter counter button to Renson integration (#103126)
Add reset filter counter button
2023-11-01 16:27:23 +01:00
Tudor Sandu
66dd3b153d Support HassTurnOn/Off intents for lock domain (#93231)
* Support HassTurnOn/Off intents for lock domain

Fix https://github.com/home-assistant/intents/issues/1347

* Added tests

* Linting changes

* Linting
2023-11-01 09:46:13 -05:00
mkmer
4a93465e85 Catch unexpected response in Honeywell (#103169)
catch unexpected response
2023-11-01 15:41:41 +01:00
Xitee
cef68ea33c Add hardware version to Roomba (#103171) 2023-11-01 09:21:42 -05:00
Jan-Philipp Benecke
8b7cfc070e Move base entity of system_bridge to own module (#103167)
* Move base entity of system_bridge to own module

* Add entity.py to .coveragerc
2023-11-01 14:21:39 +01:00
Joost Lekkerkerker
6e5479d307 Bump aiowaqi to 3.0.0 (#103166) 2023-11-01 13:25:33 +01:00
G Johansson
412b0e1c55 Bump python-holidays to 0.35 (#103092) 2023-11-01 12:37:59 +01:00
Bram Kragten
f624946ac0 Update frontend to 20231030.1 (#103163) 2023-11-01 11:05:17 +01:00
J. Nick Koston
78e546b35a Avoid enumerating the whole state machine on api service calls (#103147) 2023-11-01 10:25:02 +01:00
Jan Bouwhuis
daee5baef6 Fix mqtt is not reloading without yaml config (#103159) 2023-11-01 09:25:56 +01:00
J. Nick Koston
6ea5af7575 Bump aioesphomeapi to 18.2.1 (#103156) 2023-11-01 08:56:48 +01:00
Allen Porter
04dfbd2e03 Improve fitbit oauth token error handling in config flow (#103131)
* Improve fitbit oauth token error handling in config flow

* Apply suggestions from code review

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

* Update tests with updated error reason

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-10-31 19:48:33 -07:00
Teemu R
f944c68e01 Bump python-kasa to 0.5.4 for tplink (#103038) 2023-10-31 19:54:51 -05:00
Erik Montnemery
e880ad7bda Improve reload of legacy groups (#102925)
* Improve reload of legacy groups

* Simplify reload

* Get rid of inner function

* Fix logic when there are no group.group entities

* Update homeassistant/components/group/__init__.py

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

* Fix type hints

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2023-11-01 00:18:21 +01:00
J. Nick Koston
1a6184a9aa Allow non-admins to subscribe to the issue registry updated event (#103145) 2023-10-31 16:29:22 -05:00
J. Nick Koston
8eb7766f30 Avoid path construction for static files cache hit (#102882) 2023-10-31 14:31:58 -05:00
Paul Bottein
4d475a9758 Don't try to load resources in safe mode (#103122) 2023-10-31 19:25:25 +01:00
Aidan Timson
6433bf4d77 Create update component for System Bridge (#102966)
* Create update component for System Bridge

* Add
2023-10-31 19:08:47 +01:00
J. Nick Koston
3ebd029026 Bump aiohomekit to 3.0.9 (#103123) 2023-10-31 12:56:15 -05:00
J. Nick Koston
9b27552238 Fix race in starting reauth flows (#103130) 2023-10-31 12:38:05 -05:00
Joost Lekkerkerker
d75a6a3b4b Use right functions for fixtures in Freebox test (#103135) 2023-10-31 17:25:08 +01:00
Narmishka
f55cd17982 Move Freebox tests to fixtures (#103128) 2023-10-31 15:50:17 +00:00
starkillerOG
620a3350d7 Bump reolink-aio to 0.7.12 (#103120) 2023-10-31 15:15:20 +01:00
Christopher Fenner
22126a1280 Handle exception introduced with recent PyViCare update (#103110) 2023-10-31 13:42:52 +01:00
G Johansson
193ce08b39 No aliases in workday (#103091) 2023-10-31 11:35:09 +01:00
Joost Lekkerkerker
55a4769172 Abort config flow if Google Tasks API is not enabled (#103114)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-10-31 11:32:17 +01:00
Christopher Fenner
5f09503cf3 Fix client id label in ViCare integration (#103111) 2023-10-31 10:35:51 +01:00
Jan Bouwhuis
8668f47543 Add strict typing for input_text (#103095) 2023-10-31 10:29:04 +01:00
Robert Resch
8e2c2e5cc5 Fix todo.remove_item frontend (#103108) 2023-10-31 10:06:42 +01:00
Bram Kragten
1fc1e85b01 Update frontend to 20231030.0 (#103086) 2023-10-31 10:05:16 +01:00
Erik Montnemery
0304ac5a1b Fix restore state for light when saved attribute is None (#103096) 2023-10-31 10:05:03 +01:00
G Johansson
a851907f78 Add serial to Sensibo (#103089) 2023-10-31 09:10:43 +01:00
Duco Sebel
b63c33d320 Bumb python-homewizard-energy to 3.1.0 (#103011)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2023-10-31 08:53:56 +01:00
Rami Mosleh
61a1245a84 Code cleanup for transmission integration (#103078) 2023-10-31 08:49:03 +01:00
G Johansson
85d49a2920 Fix Met Device Info (#103082) 2023-10-31 08:31:53 +01:00
Paul Manzotti
06bbea2e0f Update geniushub-client to v0.7.1 (#103071) 2023-10-31 08:09:03 +01:00
Erik Montnemery
8e3b5f1be4 Add todo to core files (#103102) 2023-10-31 07:55:03 +01:00
G Johansson
12afd0ad94 Bump pytrafikverket to 0.3.8 (#103080) 2023-10-31 06:57:06 +01:00
Erik Montnemery
246ebc99cc Fix local_todo todo tests (#103099) 2023-10-31 02:38:58 +01:00
Erik Montnemery
64f8967739 Fix todoist todo tests (#103101) 2023-10-31 02:38:18 +01:00
Erik Montnemery
df814af076 Fix shopping_list todo tests (#103100) 2023-10-31 02:03:54 +01:00
Erik Montnemery
6e62cf5efb Fix google_tasks todo tests (#103098) 2023-10-31 02:03:34 +01:00
Mislav Mandarić
84b71c9ddb Allow setting hvac mode through set_temperature climate method in Gree integration (#101196)
* Allow setting hvac mode through set_temperature climate method

* Suggested code simplification when reading hvac mode

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

* Remove unnecessary temperature unit handling from set temperature with hvac mode tests

---------

Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2023-10-30 22:10:47 +01:00
Robert Resch
d97a030872 Refactor todo services and their schema (#103079) 2023-10-30 21:43:24 +01:00
Joost Lekkerkerker
7319abcab0 Show a warning when no Withings data found (#103066) 2023-10-30 19:40:27 +01:00
Duco Sebel
0f72495a7d Rename power to energy in HomeWizard (#102948) 2023-10-30 19:09:23 +01:00
Álvaro Fernández Rojas
cb0517d20e Update AEMET-OpenData to v0.4.6 (#102996) 2023-10-30 18:54:50 +01:00
Christopher Fenner
bdfb138b09 Update PyViCare to v2.28.1 for ViCare integration (#103064) 2023-10-30 18:47:33 +01:00
Nortonko
78e316aa7e Bump python-androidtv to 0.0.73 (#102999)
* Update manifest.json

Bump python-androidtv to version 0.0.73

* bump androidtv 0.0.73

* bump androidtv 0.0.73
2023-10-30 18:32:24 +01:00
tronikos
74b19564ad Fix Opower not refreshing statistics when there are no forecast entities (#103058)
Ensure _insert_statistics is periodically called
2023-10-30 11:08:51 -04:00
Mike Woudenberg
7b6910882e Use correct config entry field to update when IP changes in loqed (#103051) 2023-10-30 15:57:00 +01:00
Joost Lekkerkerker
953d5e0080 Add 2 properties to Withings diagnostics (#103067) 2023-10-30 15:47:08 +01:00
David Knowles
f160fa4bc3 Make Hydrawise initialize data immediately (#101936) 2023-10-30 15:18:59 +01:00
mkmer
92ec525de1 Add retry before unavailable to Honeywell (#101702)
Co-authored-by: Robert Resch <robert@resch.dev>
2023-10-30 15:16:41 +01:00
David Knowles
4ed3676a56 Bump pyschlage to 2023.10.0 (#103065) 2023-10-30 14:57:24 +01:00
Franck Nijhof
487dcf227e Rewrite HomeWizard Energy tests (#103000)
Co-authored-by: Duco Sebel <74970928+DCSBL@users.noreply.github.com>
2023-10-30 14:07:42 +01:00
J. Nick Koston
b3743937de Avoid looking up the callable type for HassJob when we already know it (#102962)
* Avoid looking up the callable type for HassJob when we already know it

When we connect the frontend we call async_listen with run_immediately MANY
times when we already know the job type (it will always be a callback). This
reduces the latency to get the frontend going

* missing coverage
2023-10-30 12:45:22 +01:00
Robert Hillis
7dbe0c3a48 Fix Google Mail expired authorization (#102735)
* Fix Google Mail expired authorization

* add test

* raise HomeAssistantError

* handle in api module

* uno mas
2023-10-30 12:36:34 +01:00
Álvaro Fernández Rojas
ba7dbc5927 Show proper name on Airzone errors (#102997)
* airzone: fix showing None on errors

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

* airzone: use entity_id on erros/logs

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

---------

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2023-10-30 11:03:34 +01:00
Álvaro Fernández Rojas
9952eed671 Show proper name on Airzone Cloud errors (#102998)
* airzone_cloud: fix showing None on errors

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

* airzone_cloud: use entity_id on errors/logs

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

---------

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2023-10-30 11:02:24 +01:00
Erwin Douna
8acc45d482 Enable dry mode for Tado AC's V3 (#99568) 2023-10-30 10:29:40 +01:00
Jirka
422af9d438 Update MQTT QoS description string (#103036)
Update strings.json
2023-10-30 09:54:46 +01:00
G-Two
dd3790641a Bump to subarulink 0.7.8 (#103033) 2023-10-30 09:46:48 +01:00
Diogo Gomes
7c94293cb4 Fix utility_meter reset when DST change occurs (#103012) 2023-10-30 09:46:20 +01:00
Pedro Januário
71ecb39dc5 Add additional sensors to ecoforest integration (#102734) 2023-10-30 09:41:53 +01:00
Jack Boswell
8fde275662 Rename Starlink Idle to Sleep (#103048) 2023-10-30 09:40:15 +01:00
dependabot[bot]
0369187340 Bump github/codeql-action from 2.22.4 to 2.22.5 (#103045)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-30 09:17:01 +01:00
Jack Boswell
89d7c33e31 Bump starlink-grpc-core to 1.1.3 (#103043) 2023-10-30 08:56:50 +01:00
Jan Bouwhuis
d6a0f9b5a0 Give mqtt test more time to process subscriptions (#103006) 2023-10-30 06:02:03 +01:00
Allen Porter
a373f5eac5 Bump google-nest-sdm to 3.0.3 (#103035) 2023-10-29 15:48:01 -07:00
Allen Porter
d75f1b2b3e Fix bug in fitbit credential import for expired tokens (#103024)
* Fix bug in fitbit credential import on token refresh

* Use stable test ids

* Update homeassistant/components/fitbit/sensor.py

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

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-10-29 14:26:10 -07:00
Franck Nijhof
b323295aa1 Clean up old config entry migration from Tuya (#103026) 2023-10-29 19:18:31 +01:00
kpine
46ecf0d4bd Revert "Fix temperature setting for multi-setpoint z-wave device (#102395)" (#103022)
This reverts commit 2d6dc2bccc.
2023-10-29 19:15:19 +01:00
Joost Lekkerkerker
b7667d44fd Use built in config entry from coordinator in HomeWizard (#102959) 2023-10-29 18:23:48 +01:00
Raman Gupta
94e192db12 Fix zwave_js siren name (#103016)
* Fix zwave_js.siren name

* Fix test
2023-10-29 17:44:15 +01:00
Franck Nijhof
59f238b9a7 Clean up two year old entity migration from Tuya (#103003) 2023-10-29 14:47:24 +01:00
David Bonnes
8a87ea5506 Harden evohome against failures to retrieve high-precision temps (#102989)
fix hass-logger-period
2023-10-29 13:28:35 +01:00
Michael
2616794e1d Fix proximity entity id (#102992)
* fix proximity entity id

* extend test to cover entity id
2023-10-29 10:43:57 +01:00
Tom Puttemans
19f1d14000 DSMR Gas currently delivered device state class conflict (#102991)
Fixes #102985
2023-10-29 10:23:24 +01:00
Bouwe Westerdijk
9cc7012d32 Correct total state_class of huisbaasje sensors (#102945)
* Change all cumulative-interval sensors to TOTAL
2023-10-29 09:17:57 +01:00
Allen Porter
af851b6c2b Cleanup caldav test fixtures (#102982)
* Caldav test fixture cleanup

* Remove a text fixture only used 3 times
2023-10-29 09:16:28 +01:00
Allen Porter
4e22958486 Move caldav coordinator to its own file (#102976)
* Move caldav coordinator to its own file.

* Remove unused offset.
2023-10-29 09:04:09 +01:00
tronikos
82688d2a33 Bump opower to 0.0.38 (#102983) 2023-10-29 08:05:37 +01:00
Michael
6202f178af Fix proximity zone handling (#102971)
* fix proximity zone

* fix test
2023-10-28 22:32:42 -04:00
Allen Porter
4599b788b4 Update caldav to use an DataUpdateCoordinator for fetching data (#102089) 2023-10-28 15:35:31 -07:00
Brett Adams
a4c31f63bf Add current temperature to master climate entity in Advantage Air (#102938)
* Add current_temperature

* Update tests
2023-10-28 21:59:02 +02:00
Matthias Alphart
b1aeaf2296 Update xknxproject to 3.4.0 (#102946) 2023-10-28 21:31:43 +02:00
Allen Porter
efc9f845db Fix error message strings for Todoist configuration flow (#102968)
* Fix error message strings for Todoist configuration flow

* Update error code in test
2023-10-28 21:02:42 +02:00
Álvaro Fernández Rojas
fb5d058885 Add AEMET library data to coordinator and use it for weather platform (#102954) 2023-10-28 13:53:40 -05:00
Allen Porter
8703621c64 Improve fitbit oauth import robustness (#102833)
* Improve fitbit oauth import robustness

* Improve sensor tests and remove unnecessary client check

* Fix oauth client id/secret config key checks

* Add executor for sync call
2023-10-28 17:20:44 +02:00
Erik Montnemery
03d3a87f23 Small cleanup of legacy groups (#102918)
* Small cleanup of legacy groups

* Update tests which create groups
2023-10-28 17:16:41 +02:00
Álvaro Fernández Rojas
7e4e124f50 Move has entity name to parent entity in Airzone Cloud (#102961)
airzone_cloud: consolidate _attr_has_entity_name

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2023-10-28 16:32:31 +02:00
J. Nick Koston
5648dc6cd1 Reduce string copy needed to subscribe to entities (#102870) 2023-10-28 09:18:25 -05:00
J. Nick Koston
18fa5b8532 Small cleanups to mobile_app encryption (#102883) 2023-10-28 09:18:09 -05:00
Ville Skyttä
7d598801fe Update prettier to 3.0.3 (#102929) 2023-10-28 08:56:26 -05:00
J. Nick Koston
009dc91b97 Fix inner callback decorators with partials (#102873) 2023-10-28 08:38:42 -05:00
Erik Montnemery
524e20536d Improve dlna_dmr tests (#102905) 2023-10-28 14:53:34 +02:00
Erik Montnemery
6f515c06a2 Add test for check_config helper (#102898) 2023-10-28 14:52:20 +02:00
Tom Puttemans
7f5896bc45 Add gas device class to dsmr_reader sensor (#102953)
DSMR reader integration - can't configure gas meter in energy dashboard posible due to missing device_class
Fixes #102367
2023-10-28 13:59:24 +02:00
Joost Lekkerkerker
2601c6789d Add entity translations to Airzone (#99054) 2023-10-28 13:56:45 +02:00
Franck Nijhof
8e112c04fb Improve diagnostic handling in HomeWizard Energy (#102935) 2023-10-27 23:27:17 +02:00
Franck Nijhof
fd1c1dba7c Handle/extend number entity availability property in HomeWizard Energy (#102934) 2023-10-27 23:27:02 +02:00
Franck Nijhof
923d2d0d81 Small base entity cleanup for HomeWizard Energy entities (#102933) 2023-10-27 23:26:41 +02:00
Franck Nijhof
100c3079ae Hide mac address from HomeWizard Energy config entry/discovery titles (#102931) 2023-10-27 23:26:28 +02:00
Franck Nijhof
4fa551612e Move HomeWizard Energy identify button to config entity category (#102932) 2023-10-27 23:26:03 +02:00
myztillx
9c6884a526 Bump python-ecobee-api to 0.2.17 (#102900) 2023-10-27 21:46:59 +02:00
Bram Kragten
1c1ff56021 Update frontend to 20231027.0 (#102913) 2023-10-27 19:17:15 +02:00
Maikel Punie
c7d7ce457c Bump velbusaio to 2023.10.2 (#102919) 2023-10-27 16:15:16 +00:00
Joost Lekkerkerker
c3da075554 Use present wording in version bump script (#102897) 2023-10-27 17:50:33 +02:00
Álvaro Fernández Rojas
ca5bcb9ab1 Update aioairzone-cloud to v0.3.1 (#102899) 2023-10-27 17:36:28 +02:00
Magnus Larsson
a516f32bbd Use new API for Vasttrafik (#102570) 2023-10-27 16:49:01 +02:00
Bram Kragten
3f56ca49c6 Add redirect from shopping list to todo (#102894) 2023-10-27 13:55:22 +02:00
Franck Nijhof
c77a3facf5 Some textual fixes for todo (#102895) 2023-10-27 13:28:16 +02:00
Erik Montnemery
a7183a0cbf Allow missing components in safe mode (#102891) 2023-10-27 13:26:26 +02:00
Erik Montnemery
294f565bad Allow missing components in safe mode (#102888) 2023-10-27 12:25:27 +02:00
Jan-Philipp Benecke
43915fbaf3 Add connections to PassiveBluetoothProcessorEntity (#102854) 2023-10-27 12:09:59 +02:00
Paul Bottein
e0885ef109 Don't return resources in safe mode (#102865) 2023-10-27 11:30:37 +02:00
Jan Bouwhuis
8eaf38cd44 Fix mqtt schema import not available for mqtt_room (#102866) 2023-10-27 10:51:45 +02:00
Abílio Costa
6b5f2a1349 Cleanup exception logging in Idasen Desk (#102617)
* Cleaup exception logging in Idasen Desk

* Apply suggestions from code review

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

* Re-add trace

* Remove uneeded exc_info

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2023-10-27 00:53:35 +02:00
mletenay
3b2a849f77 Update goodwe library to 0.2.32 (#102868) 2023-10-26 22:20:29 +02:00
Simone Chemelli
ae9106effd Improve exception handling for Vodafone Station (#102761)
* improve exception handling for Vodafone Station

* address review comment

* apply review comment

* better except handling (bump library)

* cleanup
2023-10-26 19:34:59 +00:00
Allen Porter
af9cae289f Change todo move API to reference previous uid (#102795) 2023-10-26 18:43:10 +02:00
Joost Lekkerkerker
c741b8cbd1 Bump aiowithings to 1.0.2 (#102852) 2023-10-26 17:31:53 +02:00
Paul Bottein
e7a867f630 Update frontend to 20231026.0 (#102857) 2023-10-26 11:26:27 -04:00
nachonam
cf03f8338a Add Freebox Home alarm panel (#102607)
* add alarm control panel

* optimize update node

* Modify comment

* move const to alarm

* add alarm panel tests

* tests modified

* add file into coveragerc

* Review: DATA_HOME_GET_VALUES -> DATA_HOME_PIR_GET_VALUES

* Review: commands rename

* Review: precise what "alarm2" is for features

* Review: remove custom attributes & properties that exists in parent

* Review: Avoid duplicates of async_write_ha_state()

* make functions private

* Review: initial state never works

* Review: remove extra attrs

* Review: fix tests

* Fix tests

* Remove line in .coveragerc

---------

Co-authored-by: Quentame <polletquentin74@me.com>
2023-10-26 12:35:51 +00:00
Erik Montnemery
9ea97fd8d2 Improve docstrings for time related event helpers (#102839)
* Improve docstrings for time related event helpers

* Fix grammar

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2023-10-26 14:00:44 +02:00
Ravaka Razafimanantsoa
1a1bc05470 Address late review of switchbot cloud (#102842)
For Martin's review
2023-10-26 12:12:18 +02:00
Kevin Worrel
36c6f426df Bump screenlogicpy to v0.9.4 (#102836) 2023-10-26 11:59:48 +02:00
Amit Finkelstein
edf2e42e4d Apple TV: Use replacement commands for deprecated ones (#102056)
Co-authored-by: Robert Resch <robert@resch.dev>
2023-10-26 10:46:20 +02:00
Erik Montnemery
087df10d27 Improve validation of device automations (#102766)
* Improve validation of device automations

* Improve comments

* Address review comment
2023-10-26 09:46:16 +02:00
Jesse Hills
4838b2dee6 ESPHome: Add suggested_area from device info (#102834) 2023-10-26 09:19:31 +02:00
hahn-th
aa67542ef8 Bump homematicip to 1.0.16 (#102822) 2023-10-25 23:26:10 -04:00
William Scanlon
dd28d1e17f Bump pyeconet to 0.1.22 to handle breaking API change (#102820) 2023-10-25 23:25:44 -04:00
Robert Van Gorkom
6939970624 Remove code owner. (#102829) 2023-10-25 23:25:23 -04:00
J. Nick Koston
b89e7a2fe2 Bump bleak-retry-connector to 3.3.0 (#102825)
changelog: https://github.com/Bluetooth-Devices/bleak-retry-connector/compare/v3.2.1...v3.3.0
2023-10-25 23:23:06 -04:00
Erik Montnemery
43ac77ca2f Fix fan device actions (#102797) 2023-10-25 23:22:38 -04:00
Erik Montnemery
e5078a3e13 Use real devices in automation blueprint tests (#102824) 2023-10-25 23:20:50 -04:00
Erik Montnemery
64f0ea60d1 Correct logic for picking bluetooth local name (#102823)
* Correct logic for picking bluetooth local name

* make test more robust

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2023-10-25 18:08:31 -05:00
mkmer
69a0c0d435 Move coordinator first refresh in Blink (#102805)
Move coordinator first refresh
2023-10-25 23:57:47 +02:00
TheJulianJES
f9712627c5 Add myself as a code owner for ZHA (#102812)
Add 'TheJulianJES' as a code owner for ZHA
2023-10-25 23:53:14 +02:00
Marc Mueller
27ac2ceae3 Fix velbus import (#102780) 2023-10-25 23:09:36 +02:00
J. Nick Koston
371a49d2f4 Bump HAP-python 4.9.1 (#102811) 2023-10-25 15:55:28 -05:00
Raman Gupta
13378b4ae2 Add script to convert zwave_js device diagnostics to fixture (#102799) 2023-10-25 16:07:22 -04:00
Franck Nijhof
f28c9221e6 Bump version to 2023.12.0dev0 (#102798) 2023-10-25 20:37:16 +02:00
2246 changed files with 99780 additions and 25922 deletions

View File

@@ -67,9 +67,6 @@ omit =
homeassistant/components/android_ip_webcam/switch.py
homeassistant/components/anel_pwrctrl/switch.py
homeassistant/components/anthemav/media_player.py
homeassistant/components/apcupsd/__init__.py
homeassistant/components/apcupsd/binary_sensor.py
homeassistant/components/apcupsd/sensor.py
homeassistant/components/apple_tv/__init__.py
homeassistant/components/apple_tv/browse_media.py
homeassistant/components/apple_tv/media_player.py
@@ -123,6 +120,7 @@ omit =
homeassistant/components/blink/binary_sensor.py
homeassistant/components/blink/camera.py
homeassistant/components/blink/sensor.py
homeassistant/components/blink/switch.py
homeassistant/components/blinksticklight/light.py
homeassistant/components/blockchain/sensor.py
homeassistant/components/bloomsky/*
@@ -144,6 +142,7 @@ omit =
homeassistant/components/braviatv/coordinator.py
homeassistant/components/braviatv/media_player.py
homeassistant/components/braviatv/remote.py
homeassistant/components/broadlink/climate.py
homeassistant/components/broadlink/light.py
homeassistant/components/broadlink/remote.py
homeassistant/components/broadlink/switch.py
@@ -216,9 +215,6 @@ omit =
homeassistant/components/discogs/sensor.py
homeassistant/components/discord/__init__.py
homeassistant/components/discord/notify.py
homeassistant/components/discovergy/__init__.py
homeassistant/components/discovergy/sensor.py
homeassistant/components/discovergy/coordinator.py
homeassistant/components/dlib_face_detect/image_processing.py
homeassistant/components/dlib_face_identify/image_processing.py
homeassistant/components/dlink/data.py
@@ -338,7 +334,6 @@ omit =
homeassistant/components/epson/__init__.py
homeassistant/components/epson/media_player.py
homeassistant/components/epsonworkforce/sensor.py
homeassistant/components/eq3btsmart/climate.py
homeassistant/components/escea/__init__.py
homeassistant/components/escea/climate.py
homeassistant/components/escea/discovery.py
@@ -369,7 +364,8 @@ omit =
homeassistant/components/faa_delays/binary_sensor.py
homeassistant/components/faa_delays/coordinator.py
homeassistant/components/familyhub/camera.py
homeassistant/components/fastdotcom/*
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
@@ -426,9 +422,7 @@ omit =
homeassistant/components/foursquare/*
homeassistant/components/free_mobile/notify.py
homeassistant/components/freebox/camera.py
homeassistant/components/freebox/device_tracker.py
homeassistant/components/freebox/home_base.py
homeassistant/components/freebox/router.py
homeassistant/components/freebox/switch.py
homeassistant/components/fritz/common.py
homeassistant/components/fritz/device_tracker.py
@@ -769,9 +763,6 @@ omit =
homeassistant/components/mutesync/binary_sensor.py
homeassistant/components/mvglive/sensor.py
homeassistant/components/mycroft/*
homeassistant/components/myq/__init__.py
homeassistant/components/myq/cover.py
homeassistant/components/myq/light.py
homeassistant/components/mysensors/__init__.py
homeassistant/components/mysensors/climate.py
homeassistant/components/mysensors/cover.py
@@ -822,7 +813,6 @@ omit =
homeassistant/components/nfandroidtv/__init__.py
homeassistant/components/nfandroidtv/notify.py
homeassistant/components/nibe_heatpump/__init__.py
homeassistant/components/nibe_heatpump/climate.py
homeassistant/components/nibe_heatpump/binary_sensor.py
homeassistant/components/nibe_heatpump/select.py
homeassistant/components/nibe_heatpump/sensor.py
@@ -837,6 +827,7 @@ omit =
homeassistant/components/noaa_tides/sensor.py
homeassistant/components/nobo_hub/__init__.py
homeassistant/components/nobo_hub/climate.py
homeassistant/components/nobo_hub/select.py
homeassistant/components/nobo_hub/sensor.py
homeassistant/components/norway_air/air_quality.py
homeassistant/components/notify_events/notify.py
@@ -937,6 +928,9 @@ omit =
homeassistant/components/panasonic_viera/media_player.py
homeassistant/components/pandora/media_player.py
homeassistant/components/pencom/switch.py
homeassistant/components/permobil/__init__.py
homeassistant/components/permobil/coordinator.py
homeassistant/components/permobil/sensor.py
homeassistant/components/philips_js/__init__.py
homeassistant/components/philips_js/light.py
homeassistant/components/philips_js/media_player.py
@@ -950,8 +944,6 @@ omit =
homeassistant/components/pilight/light.py
homeassistant/components/pilight/switch.py
homeassistant/components/ping/__init__.py
homeassistant/components/ping/binary_sensor.py
homeassistant/components/ping/device_tracker.py
homeassistant/components/ping/helpers.py
homeassistant/components/pioneer/media_player.py
homeassistant/components/plaato/__init__.py
@@ -1069,6 +1061,7 @@ omit =
homeassistant/components/roomba/sensor.py
homeassistant/components/roomba/vacuum.py
homeassistant/components/roon/__init__.py
homeassistant/components/roon/event.py
homeassistant/components/roon/media_browser.py
homeassistant/components/roon/media_player.py
homeassistant/components/roon/server.py
@@ -1132,10 +1125,7 @@ omit =
homeassistant/components/sky_hub/*
homeassistant/components/skybeacon/sensor.py
homeassistant/components/skybell/__init__.py
homeassistant/components/skybell/binary_sensor.py
homeassistant/components/skybell/camera.py
homeassistant/components/skybell/coordinator.py
homeassistant/components/skybell/entity.py
homeassistant/components/skybell/light.py
homeassistant/components/skybell/sensor.py
homeassistant/components/skybell/switch.py
@@ -1291,9 +1281,11 @@ omit =
homeassistant/components/system_bridge/__init__.py
homeassistant/components/system_bridge/binary_sensor.py
homeassistant/components/system_bridge/coordinator.py
homeassistant/components/system_bridge/entity.py
homeassistant/components/system_bridge/media_player.py
homeassistant/components/system_bridge/notify.py
homeassistant/components/system_bridge/sensor.py
homeassistant/components/system_bridge/update.py
homeassistant/components/systemmonitor/sensor.py
homeassistant/components/tado/__init__.py
homeassistant/components/tado/binary_sensor.py
@@ -1431,6 +1423,13 @@ omit =
homeassistant/components/upnp/device.py
homeassistant/components/upnp/sensor.py
homeassistant/components/vasttrafik/sensor.py
homeassistant/components/v2c/__init__.py
homeassistant/components/v2c/binary_sensor.py
homeassistant/components/v2c/coordinator.py
homeassistant/components/v2c/entity.py
homeassistant/components/v2c/number.py
homeassistant/components/v2c/sensor.py
homeassistant/components/v2c/switch.py
homeassistant/components/velbus/__init__.py
homeassistant/components/velbus/binary_sensor.py
homeassistant/components/velbus/button.py
@@ -1467,6 +1466,7 @@ omit =
homeassistant/components/vicare/button.py
homeassistant/components/vicare/climate.py
homeassistant/components/vicare/entity.py
homeassistant/components/vicare/number.py
homeassistant/components/vicare/sensor.py
homeassistant/components/vicare/utils.py
homeassistant/components/vicare/water_heater.py

View File

@@ -10,6 +10,8 @@
"customizations": {
"vscode": {
"extensions": [
"charliermarsh.ruff",
"ms-python.pylint",
"ms-python.vscode-pylance",
"visualstudioexptteam.vscodeintellicode",
"redhat.vscode-yaml",
@@ -19,14 +21,6 @@
// Please keep this file in sync with settings in home-assistant/.vscode/settings.default.json
"settings": {
"python.pythonPath": "/usr/local/bin/python",
"python.linting.enabled": true,
"python.linting.pylintEnabled": true,
"python.formatting.blackPath": "/usr/local/bin/black",
"python.linting.pycodestylePath": "/usr/local/bin/pycodestyle",
"python.linting.pydocstylePath": "/usr/local/bin/pydocstyle",
"python.linting.mypyPath": "/usr/local/bin/mypy",
"python.linting.pylintPath": "/usr/local/bin/pylint",
"python.formatting.provider": "black",
"python.testing.pytestArgs": ["--no-cov"],
"editor.formatOnPaste": false,
"editor.formatOnSave": true,
@@ -45,7 +39,10 @@
"!include_dir_list scalar",
"!include_dir_merge_list scalar",
"!include_dir_merge_named scalar"
]
],
"[python]": {
"editor.defaultFormatter": "charliermarsh.ruff"
}
}
}
}

View File

@@ -60,7 +60,7 @@
- [ ] There is no commented out code in this PR.
- [ ] I have followed the [development checklist][dev-checklist]
- [ ] I have followed the [perfect PR recommendations][perfect-pr]
- [ ] The code has been formatted using Black (`black --fast homeassistant tests`)
- [ ] The code has been formatted using Ruff (`ruff format homeassistant tests`)
- [ ] Tests have been added to verify that the new code works.
If user exposed functionality or configuration variables are added/changed:

View File

@@ -330,7 +330,7 @@ jobs:
uses: actions/checkout@v4.1.1
- name: Install Cosign
uses: sigstore/cosign-installer@v3.1.2
uses: sigstore/cosign-installer@v3.2.0
with:
cosign-release: "v2.0.2"

View File

@@ -35,9 +35,8 @@ on:
env:
CACHE_VERSION: 5
PIP_CACHE_VERSION: 4
MYPY_CACHE_VERSION: 5
BLACK_CACHE_VERSION: 1
HA_SHORT_VERSION: "2023.11"
MYPY_CACHE_VERSION: 6
HA_SHORT_VERSION: "2023.12"
DEFAULT_PYTHON: "3.11"
ALL_PYTHON_VERSIONS: "['3.11', '3.12']"
# 10.3 is the oldest supported version
@@ -58,7 +57,6 @@ env:
POSTGRESQL_VERSIONS: "['postgres:12.14','postgres:15.2']"
PRE_COMMIT_CACHE: ~/.cache/pre-commit
PIP_CACHE: /tmp/pip-cache
BLACK_CACHE: /tmp/black-cache
SQLALCHEMY_WARN_20: 1
PYTHONASYNCIODEBUG: 1
HASS_CI: 1
@@ -261,8 +259,8 @@ jobs:
. venv/bin/activate
pre-commit install-hooks
lint-black:
name: Check black
lint-ruff-format:
name: Check ruff-format
runs-on: ubuntu-22.04
needs:
- info
@@ -276,13 +274,6 @@ jobs:
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Generate partial black restore key
id: generate-black-key
run: |
black_version=$(cat requirements_test_pre_commit.txt | grep black | cut -d '=' -f 3)
echo "version=$black_version" >> $GITHUB_OUTPUT
echo "key=black-${{ env.BLACK_CACHE_VERSION }}-$black_version-${{
env.HA_SHORT_VERSION }}-$(date -u '+%Y-%m-%dT%H:%M:%s')" >> $GITHUB_OUTPUT
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache/restore@v3.3.2
@@ -301,33 +292,12 @@ jobs:
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.info.outputs.pre-commit_cache_key }}
- name: Restore black cache
uses: actions/cache@v3.3.2
with:
path: ${{ env.BLACK_CACHE }}
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
steps.generate-black-key.outputs.key }}
restore-keys: |
${{ runner.os }}-${{ steps.python.outputs.python-version }}-black-${{
env.BLACK_CACHE_VERSION }}-${{ steps.generate-black-key.outputs.version }}-${{
env.HA_SHORT_VERSION }}-
- name: Run black (fully)
if: needs.info.outputs.test_full_suite == 'true'
env:
BLACK_CACHE_DIR: ${{ env.BLACK_CACHE }}
- name: Run ruff-format
run: |
. venv/bin/activate
pre-commit run --hook-stage manual black --all-files --show-diff-on-failure
- name: Run black (partially)
if: needs.info.outputs.test_full_suite == 'false'
shell: bash
pre-commit run --hook-stage manual ruff-format --all-files --show-diff-on-failure
env:
BLACK_CACHE_DIR: ${{ env.BLACK_CACHE }}
run: |
. venv/bin/activate
shopt -s globstar
pre-commit run --hook-stage manual black --files {homeassistant,tests}/components/${{ needs.info.outputs.integrations_glob }}/{*,**/*} --show-diff-on-failure
RUFF_OUTPUT_FORMAT: github
lint-ruff:
name: Check ruff
@@ -362,22 +332,12 @@ jobs:
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.info.outputs.pre-commit_cache_key }}
- name: Register ruff problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/ruff.json"
- name: Run ruff (fully)
if: needs.info.outputs.test_full_suite == 'true'
- name: Run ruff
run: |
. venv/bin/activate
pre-commit run --hook-stage manual ruff --all-files --show-diff-on-failure
- name: Run ruff (partially)
if: needs.info.outputs.test_full_suite == 'false'
shell: bash
run: |
. venv/bin/activate
shopt -s globstar
pre-commit run --hook-stage manual ruff --files {homeassistant,tests}/components/${{ needs.info.outputs.integrations_glob }}/{*,**/*} --show-diff-on-failure
env:
RUFF_OUTPUT_FORMAT: github
lint-other:
name: Check other linters
runs-on: ubuntu-22.04
@@ -787,7 +747,7 @@ jobs:
cov_params+=(--cov-report=xml)
fi
python3 -X dev -m pytest \
python3 -b -X dev -m pytest \
-qq \
--timeout=9 \
--durations=10 \
@@ -824,7 +784,7 @@ jobs:
cov_params+=(--cov-report=term-missing)
fi
python3 -X dev -m pytest \
python3 -b -X dev -m pytest \
-qq \
--timeout=9 \
-n auto \
@@ -945,7 +905,7 @@ jobs:
cov_params+=(--cov-report=term-missing)
fi
python3 -X dev -m pytest \
python3 -b -X dev -m pytest \
-qq \
--timeout=20 \
-n 1 \
@@ -1069,7 +1029,7 @@ jobs:
cov_params+=(--cov-report=term-missing)
fi
python3 -X dev -m pytest \
python3 -b -X dev -m pytest \
-qq \
--timeout=9 \
-n 1 \

View File

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

View File

@@ -10,7 +10,7 @@ jobs:
if: github.repository_owner == 'home-assistant'
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v4.0.1
- uses: dessant/lock-threads@v5.0.1
with:
github-token: ${{ github.token }}
issue-inactive-days: "30"

View File

@@ -1,30 +0,0 @@
{
"problemMatcher": [
{
"owner": "ruff-error",
"severity": "error",
"pattern": [
{
"regexp": "^(.*):(\\d+):(\\d+):\\s([EF]\\d{3}\\s.*)$",
"file": 1,
"line": 2,
"column": 3,
"message": 4
}
]
},
{
"owner": "ruff-warning",
"severity": "warning",
"pattern": [
{
"regexp": "^(.*):(\\d+):(\\d+):\\s([CDNW]\\d{3}\\s.*)$",
"file": 1,
"line": 2,
"column": 3,
"message": 4
}
]
}
]
}

View File

@@ -1,16 +1,11 @@
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.1.1
rev: v0.1.6
hooks:
- id: ruff
args:
- --fix
- repo: https://github.com/psf/black-pre-commit-mirror
rev: 23.10.0
hooks:
- id: black
args:
- --quiet
- id: ruff-format
files: ^((homeassistant|pylint|script|tests)/.+)?[^/]+\.py$
- repo: https://github.com/codespell-project/codespell
rev: v2.2.2
@@ -39,7 +34,7 @@ repos:
hooks:
- id: yamllint
- repo: https://github.com/pre-commit/mirrors-prettier
rev: v2.7.1
rev: v3.0.3
hooks:
- id: prettier
- repo: https://github.com/cdce8p/python-typing-update

View File

@@ -5,3 +5,4 @@ homeassistant/components/*/translations/*.json
homeassistant/generated/*
tests/components/lidarr/fixtures/initialize.js
tests/components/lidarr/fixtures/initialize-wrong.js
tests/fixtures/core/config/yaml_errors/

View File

@@ -180,6 +180,7 @@ homeassistant.components.image_upload.*
homeassistant.components.imap.*
homeassistant.components.input_button.*
homeassistant.components.input_select.*
homeassistant.components.input_text.*
homeassistant.components.integration.*
homeassistant.components.ipp.*
homeassistant.components.iqvia.*
@@ -201,6 +202,7 @@ homeassistant.components.ld2410_ble.*
homeassistant.components.lidarr.*
homeassistant.components.lifx.*
homeassistant.components.light.*
homeassistant.components.linear_garage_door.*
homeassistant.components.litejet.*
homeassistant.components.litterrobot.*
homeassistant.components.local_ip.*

View File

@@ -1,3 +1,7 @@
{
"recommendations": ["esbenp.prettier-vscode", "ms-python.python"]
"recommendations": [
"charliermarsh.ruff",
"esbenp.prettier-vscode",
"ms-python.python"
]
}

8
.vscode/launch.json vendored
View File

@@ -22,6 +22,14 @@
"args": ["--debug", "-c", "config", "--skip-pip"],
"preLaunchTask": "Compile English translations"
},
{
"name": "Home Assistant: Changed tests",
"type": "python",
"request": "launch",
"module": "pytest",
"justMyCode": false,
"args": ["--timeout=10", "--picked"],
},
{
// Debug by attaching to local Home Assistant server using Remote Python Debugger.
// See https://www.home-assistant.io/integrations/debugpy/

View File

@@ -1,6 +1,5 @@
{
// Please keep this file in sync with settings in home-assistant/.devcontainer/devcontainer.json
"python.formatting.provider": "black",
// Added --no-cov to work around TypeError: message must be set
// https://github.com/microsoft/vscode-python/issues/14067
"python.testing.pytestArgs": ["--no-cov"],

View File

@@ -1,5 +1,6 @@
ignore: |
azure-*.yml
tests/fixtures/core/config/yaml_errors/
rules:
braces:
level: error

View File

@@ -151,8 +151,8 @@ build.json @home-assistant/supervisor
/homeassistant/components/bizkaibus/ @UgaitzEtxebarria
/homeassistant/components/blebox/ @bbx-a @riokuu
/tests/components/blebox/ @bbx-a @riokuu
/homeassistant/components/blink/ @fronzbot
/tests/components/blink/ @fronzbot
/homeassistant/components/blink/ @fronzbot @mkmer
/tests/components/blink/ @fronzbot @mkmer
/homeassistant/components/bluemaestro/ @bdraco
/tests/components/bluemaestro/ @bdraco
/homeassistant/components/blueprint/ @home-assistant/core
@@ -170,8 +170,8 @@ build.json @home-assistant/supervisor
/tests/components/bosch_shc/ @tschamm
/homeassistant/components/braviatv/ @bieniu @Drafteed
/tests/components/braviatv/ @bieniu @Drafteed
/homeassistant/components/broadlink/ @danielhiversen @felipediel @L-I-Am
/tests/components/broadlink/ @danielhiversen @felipediel @L-I-Am
/homeassistant/components/broadlink/ @danielhiversen @felipediel @L-I-Am @eifinger
/tests/components/broadlink/ @danielhiversen @felipediel @L-I-Am @eifinger
/homeassistant/components/brother/ @bieniu
/tests/components/brother/ @bieniu
/homeassistant/components/brottsplatskartan/ @gjohansson-ST
@@ -259,6 +259,8 @@ build.json @home-assistant/supervisor
/tests/components/denonavr/ @ol-iver @starkillerOG
/homeassistant/components/derivative/ @afaucogney
/tests/components/derivative/ @afaucogney
/homeassistant/components/devialet/ @fwestenberg
/tests/components/devialet/ @fwestenberg
/homeassistant/components/device_automation/ @home-assistant/core
/tests/components/device_automation/ @home-assistant/core
/homeassistant/components/device_tracker/ @home-assistant/core
@@ -307,12 +309,12 @@ build.json @home-assistant/supervisor
/tests/components/eafm/ @Jc2k
/homeassistant/components/easyenergy/ @klaasnicolaas
/tests/components/easyenergy/ @klaasnicolaas
/homeassistant/components/ecobee/ @marthoc @marcolivierarsenault
/tests/components/ecobee/ @marthoc @marcolivierarsenault
/homeassistant/components/ecobee/ @marcolivierarsenault
/tests/components/ecobee/ @marcolivierarsenault
/homeassistant/components/ecoforest/ @pjanuario
/tests/components/ecoforest/ @pjanuario
/homeassistant/components/econet/ @vangorra @w1ll1am23
/tests/components/econet/ @vangorra @w1ll1am23
/homeassistant/components/econet/ @w1ll1am23
/tests/components/econet/ @w1ll1am23
/homeassistant/components/ecovacs/ @OverloadUT @mib1185
/homeassistant/components/ecowitt/ @pvizeli
/tests/components/ecowitt/ @pvizeli
@@ -345,17 +347,15 @@ build.json @home-assistant/supervisor
/homeassistant/components/enigma2/ @fbradyirl
/homeassistant/components/enocean/ @bdurrer
/tests/components/enocean/ @bdurrer
/homeassistant/components/enphase_envoy/ @bdraco @cgarwood @dgomes @joostlek
/tests/components/enphase_envoy/ @bdraco @cgarwood @dgomes @joostlek
/homeassistant/components/enphase_envoy/ @bdraco @cgarwood @dgomes @joostlek @catsmanac
/tests/components/enphase_envoy/ @bdraco @cgarwood @dgomes @joostlek @catsmanac
/homeassistant/components/entur_public_transport/ @hfurubotten
/homeassistant/components/environment_canada/ @gwww @michaeldavie
/tests/components/environment_canada/ @gwww @michaeldavie
/homeassistant/components/envisalink/ @ufodone
/homeassistant/components/ephember/ @ttroy50
/homeassistant/components/epson/ @pszafer
/tests/components/epson/ @pszafer
/homeassistant/components/epsonworkforce/ @ThaStealth
/homeassistant/components/eq3btsmart/ @rytilahti
/homeassistant/components/escea/ @lazdavila
/tests/components/escea/ @lazdavila
/homeassistant/components/esphome/ @OttoWinter @jesserockz @kbx81 @bdraco
@@ -373,7 +373,8 @@ build.json @home-assistant/supervisor
/tests/components/faa_delays/ @ntilley905
/homeassistant/components/fan/ @home-assistant/core
/tests/components/fan/ @home-assistant/core
/homeassistant/components/fastdotcom/ @rohankapoorcom
/homeassistant/components/fastdotcom/ @rohankapoorcom @erwindouna
/tests/components/fastdotcom/ @rohankapoorcom @erwindouna
/homeassistant/components/fibaro/ @rappenze
/tests/components/fibaro/ @rappenze
/homeassistant/components/file/ @fabaff
@@ -490,8 +491,6 @@ build.json @home-assistant/supervisor
/tests/components/greeneye_monitor/ @jkeljo
/homeassistant/components/group/ @home-assistant/core
/tests/components/group/ @home-assistant/core
/homeassistant/components/growatt_server/ @muppet3000
/tests/components/growatt_server/ @muppet3000
/homeassistant/components/guardian/ @bachya
/tests/components/guardian/ @bachya
/homeassistant/components/habitica/ @ASMfreaK @leikoilja
@@ -699,6 +698,8 @@ build.json @home-assistant/supervisor
/tests/components/life360/ @pnbruckner
/homeassistant/components/light/ @home-assistant/core
/tests/components/light/ @home-assistant/core
/homeassistant/components/linear_garage_door/ @IceBotYT
/tests/components/linear_garage_door/ @IceBotYT
/homeassistant/components/linux_battery/ @fabaff
/homeassistant/components/litejet/ @joncar
/tests/components/litejet/ @joncar
@@ -811,8 +812,6 @@ build.json @home-assistant/supervisor
/tests/components/mutesync/ @currentoor
/homeassistant/components/my/ @home-assistant/core
/tests/components/my/ @home-assistant/core
/homeassistant/components/myq/ @ehendrix23 @Lash-L
/tests/components/myq/ @ehendrix23 @Lash-L
/homeassistant/components/mysensors/ @MartinHjelmare @functionpointer
/tests/components/mysensors/ @MartinHjelmare @functionpointer
/homeassistant/components/mystrom/ @fabaff
@@ -929,6 +928,8 @@ build.json @home-assistant/supervisor
/homeassistant/components/oru/ @bvlaicu
/homeassistant/components/otbr/ @home-assistant/core
/tests/components/otbr/ @home-assistant/core
/homeassistant/components/ourgroceries/ @OnFreund
/tests/components/ourgroceries/ @OnFreund
/homeassistant/components/overkiz/ @imicknl @vlebourl @tetienne @nyroDev
/tests/components/overkiz/ @imicknl @vlebourl @tetienne @nyroDev
/homeassistant/components/ovo_energy/ @timmo001
@@ -943,6 +944,8 @@ build.json @home-assistant/supervisor
/tests/components/peco/ @IceBotYT
/homeassistant/components/pegel_online/ @mib1185
/tests/components/pegel_online/ @mib1185
/homeassistant/components/permobil/ @IsakNyberg
/tests/components/permobil/ @IsakNyberg
/homeassistant/components/persistent_notification/ @home-assistant/core
/tests/components/persistent_notification/ @home-assistant/core
/homeassistant/components/philips_js/ @elupus
@@ -979,6 +982,8 @@ build.json @home-assistant/supervisor
/tests/components/prometheus/ @knyar
/homeassistant/components/prosegur/ @dgomes
/tests/components/prosegur/ @dgomes
/homeassistant/components/proximity/ @mib1185
/tests/components/proximity/ @mib1185
/homeassistant/components/proxmoxve/ @jhollowe @Corbeno
/homeassistant/components/prusalink/ @balloob
/tests/components/prusalink/ @balloob
@@ -1052,7 +1057,7 @@ build.json @home-assistant/supervisor
/tests/components/reolink/ @starkillerOG
/homeassistant/components/repairs/ @home-assistant/core
/tests/components/repairs/ @home-assistant/core
/homeassistant/components/repetier/ @MTrab @ShadowBr0ther
/homeassistant/components/repetier/ @ShadowBr0ther
/homeassistant/components/rflink/ @javicalle
/tests/components/rflink/ @javicalle
/homeassistant/components/rfxtrx/ @danielhiversen @elupus @RobBie1221
@@ -1061,6 +1066,8 @@ build.json @home-assistant/supervisor
/tests/components/rhasspy/ @balloob @synesthesiam
/homeassistant/components/ridwell/ @bachya
/tests/components/ridwell/ @bachya
/homeassistant/components/ring/ @sdb9696
/tests/components/ring/ @sdb9696
/homeassistant/components/risco/ @OnFreund
/tests/components/risco/ @OnFreund
/homeassistant/components/rituals_perfume_genie/ @milanmeu @frenck
@@ -1231,8 +1238,8 @@ build.json @home-assistant/supervisor
/tests/components/stookwijzer/ @fwestenberg
/homeassistant/components/stream/ @hunterjm @uvjustin @allenporter
/tests/components/stream/ @hunterjm @uvjustin @allenporter
/homeassistant/components/stt/ @home-assistant/core @pvizeli
/tests/components/stt/ @home-assistant/core @pvizeli
/homeassistant/components/stt/ @home-assistant/core
/tests/components/stt/ @home-assistant/core
/homeassistant/components/subaru/ @G-Two
/tests/components/subaru/ @G-Two
/homeassistant/components/suez_water/ @ooii
@@ -1317,8 +1324,8 @@ build.json @home-assistant/supervisor
/tests/components/tomorrowio/ @raman325 @lymanepp
/homeassistant/components/totalconnect/ @austinmroczek
/tests/components/totalconnect/ @austinmroczek
/homeassistant/components/tplink/ @rytilahti @thegardenmonkey
/tests/components/tplink/ @rytilahti @thegardenmonkey
/homeassistant/components/tplink/ @rytilahti @thegardenmonkey @bdraco
/tests/components/tplink/ @rytilahti @thegardenmonkey @bdraco
/homeassistant/components/tplink_omada/ @MarkGodwin
/tests/components/tplink_omada/ @MarkGodwin
/homeassistant/components/traccar/ @ludeeus
@@ -1339,8 +1346,8 @@ build.json @home-assistant/supervisor
/tests/components/transmission/ @engrbm87 @JPHutchins
/homeassistant/components/trend/ @jpbede
/tests/components/trend/ @jpbede
/homeassistant/components/tts/ @home-assistant/core @pvizeli
/tests/components/tts/ @home-assistant/core @pvizeli
/homeassistant/components/tts/ @home-assistant/core
/tests/components/tts/ @home-assistant/core
/homeassistant/components/tuya/ @Tuya @zlinoliver @frenck
/tests/components/tuya/ @Tuya @zlinoliver @frenck
/homeassistant/components/twentemilieu/ @frenck
@@ -1375,6 +1382,8 @@ build.json @home-assistant/supervisor
/tests/components/usgs_earthquakes_feed/ @exxamalte
/homeassistant/components/utility_meter/ @dgomes
/tests/components/utility_meter/ @dgomes
/homeassistant/components/v2c/ @dgomes
/tests/components/v2c/ @dgomes
/homeassistant/components/vacuum/ @home-assistant/core
/tests/components/vacuum/ @home-assistant/core
/homeassistant/components/vallox/ @andre-richter @slovdahl @viiru-
@@ -1384,13 +1393,13 @@ build.json @home-assistant/supervisor
/homeassistant/components/velux/ @Julius2342
/homeassistant/components/venstar/ @garbled1 @jhollowe
/tests/components/venstar/ @garbled1 @jhollowe
/homeassistant/components/verisure/ @frenck
/tests/components/verisure/ @frenck
/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/vicare/ @CFenner
/tests/components/vicare/ @CFenner
/homeassistant/components/vilfo/ @ManneW
/tests/components/vilfo/ @ManneW
/homeassistant/components/vivotek/ @HarlemSquirrel
@@ -1501,8 +1510,8 @@ build.json @home-assistant/supervisor
/tests/components/zerproc/ @emlove
/homeassistant/components/zeversolar/ @kvanzuijlen
/tests/components/zeversolar/ @kvanzuijlen
/homeassistant/components/zha/ @dmulcahey @adminiuga @puddly
/tests/components/zha/ @dmulcahey @adminiuga @puddly
/homeassistant/components/zha/ @dmulcahey @adminiuga @puddly @TheJulianJES
/tests/components/zha/ @dmulcahey @adminiuga @puddly @TheJulianJES
/homeassistant/components/zodiac/ @JulienTant
/tests/components/zodiac/ @JulienTant
/homeassistant/components/zone/ @home-assistant/core

View File

@@ -1,3 +1,6 @@
# Automatically generated by hassfest.
#
# To update, run python3 -m script.hassfest -p docker
ARG BUILD_FROM
FROM ${BUILD_FROM}

View File

@@ -5,8 +5,7 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
# Uninstall pre-installed formatting and linting tools
# They would conflict with our pinned versions
RUN \
pipx uninstall black \
&& pipx uninstall pydocstyle \
pipx uninstall pydocstyle \
&& pipx uninstall pycodestyle \
&& pipx uninstall mypy \
&& pipx uninstall pylint

View File

@@ -280,7 +280,8 @@ class AuthManager:
credentials=credentials,
name=info.name,
is_active=info.is_active,
group_ids=[GROUP_ID_ADMIN],
group_ids=[GROUP_ID_ADMIN if info.group is None else info.group],
local_only=info.local_only,
)
self.hass.bus.async_fire(EVENT_USER_ADDED, {"user_id": user.id})

View File

@@ -134,3 +134,5 @@ class UserMeta(NamedTuple):
name: str | None
is_active: bool
group: str | None = None
local_only: bool | None = None

View File

@@ -5,9 +5,7 @@ from collections.abc import Mapping
ValueType = (
# Example: entities.all = { read: true, control: true }
Mapping[str, bool]
| bool
| None
Mapping[str, bool] | bool | None
)
# Example: entities.domains = { light: … }

View File

@@ -44,7 +44,11 @@ class CommandLineAuthProvider(AuthProvider):
DEFAULT_TITLE = "Command Line Authentication"
# which keys to accept from a program's stdout
ALLOWED_META_KEYS = ("name",)
ALLOWED_META_KEYS = (
"name",
"group",
"local_only",
)
def __init__(self, *args: Any, **kwargs: Any) -> None:
"""Extend parent's __init__.
@@ -118,10 +122,15 @@ class CommandLineAuthProvider(AuthProvider):
) -> UserMeta:
"""Return extra user metadata for credentials.
Currently, only name is supported.
Currently, supports name, group and local_only.
"""
meta = self._user_meta.get(credentials.data["username"], {})
return UserMeta(name=meta.get("name"), is_active=True)
return UserMeta(
name=meta.get("name"),
is_active=True,
group=meta.get("group"),
local_only=meta.get("local_only") == "true",
)
class CommandLineLoginFlow(LoginFlow):

View File

@@ -10,10 +10,11 @@ from typing import Any, cast
import voluptuous as vol
from homeassistant.core import callback
from homeassistant.core import async_get_hass, callback
from homeassistant.data_entry_flow import FlowResult
from homeassistant.exceptions import HomeAssistantError
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue
from ..models import Credentials, UserMeta
from . import AUTH_PROVIDER_SCHEMA, AUTH_PROVIDERS, AuthProvider, LoginFlow
@@ -21,10 +22,28 @@ from . import AUTH_PROVIDER_SCHEMA, AUTH_PROVIDERS, AuthProvider, LoginFlow
AUTH_PROVIDER_TYPE = "legacy_api_password"
CONF_API_PASSWORD = "api_password"
CONFIG_SCHEMA = AUTH_PROVIDER_SCHEMA.extend(
_CONFIG_SCHEMA = AUTH_PROVIDER_SCHEMA.extend(
{vol.Required(CONF_API_PASSWORD): cv.string}, extra=vol.PREVENT_EXTRA
)
def _create_repair_and_validate(config: dict[str, Any]) -> dict[str, Any]:
async_create_issue(
async_get_hass(),
"auth",
"deprecated_legacy_api_password",
breaks_in_ha_version="2024.6.0",
is_fixable=False,
severity=IssueSeverity.WARNING,
translation_key="deprecated_legacy_api_password",
)
return _CONFIG_SCHEMA(config) # type: ignore[no-any-return]
CONFIG_SCHEMA = _create_repair_and_validate
LEGACY_USER_NAME = "Legacy API password user"

View File

@@ -22,6 +22,7 @@ from homeassistant.core import callback
from homeassistant.data_entry_flow import FlowResult
from homeassistant.exceptions import HomeAssistantError
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.network import is_cloud_connection
from .. import InvalidAuthError
from ..models import Credentials, RefreshToken, UserMeta
@@ -192,11 +193,8 @@ class TrustedNetworksAuthProvider(AuthProvider):
if any(ip_addr in trusted_proxy for trusted_proxy in self.trusted_proxies):
raise InvalidAuthError("Can't allow access from a proxy server")
if "cloud" in self.hass.config.components:
from hass_nabucasa import remote # pylint: disable=import-outside-toplevel
if remote.is_cloud_request.get():
raise InvalidAuthError("Can't allow access from Home Assistant Cloud")
if is_cloud_connection(self.hass):
raise InvalidAuthError("Can't allow access from Home Assistant Cloud")
@callback
def async_validate_refresh_token(

View File

@@ -41,6 +41,7 @@ from .setup import (
DATA_SETUP,
DATA_SETUP_STARTED,
DATA_SETUP_TIME,
async_notify_setup_error,
async_set_domains_to_be_loaded,
async_setup_component,
)
@@ -292,7 +293,8 @@ async def async_from_config_dict(
try:
await conf_util.async_process_ha_core_config(hass, core_config)
except vol.Invalid as config_err:
conf_util.async_log_exception(config_err, "homeassistant", core_config, hass)
conf_util.async_log_schema_error(config_err, core.DOMAIN, core_config, hass)
async_notify_setup_error(hass, core.DOMAIN)
return None
except HomeAssistantError:
_LOGGER.error(
@@ -398,7 +400,7 @@ def async_enable_logging(
logging.getLogger("httpx").setLevel(logging.WARNING)
sys.excepthook = lambda *args: logging.getLogger(None).exception(
"Uncaught exception", exc_info=args # type: ignore[arg-type]
"Uncaught exception", exc_info=args
)
threading.excepthook = lambda args: logging.getLogger(None).exception(
"Uncaught thread exception",

View File

@@ -1,5 +1,5 @@
{
"domain": "eq3",
"name": "eQ-3",
"integrations": ["eq3btsmart", "maxcube"]
"integrations": ["maxcube"]
}

View File

@@ -8,5 +8,5 @@
"iot_class": "cloud_polling",
"loggers": ["accuweather"],
"quality_scale": "platinum",
"requirements": ["accuweather==2.0.0"]
"requirements": ["accuweather==2.1.1"]
}

View File

@@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/adax",
"iot_class": "local_polling",
"loggers": ["adax", "adax_local"],
"requirements": ["adax==0.3.0", "Adax-local==0.1.5"]
"requirements": ["adax==0.4.0", "Adax-local==0.1.5"]
}

View File

@@ -7,5 +7,5 @@
"integration_type": "service",
"iot_class": "local_polling",
"loggers": ["adguardhome"],
"requirements": ["adguardhome==0.6.2"]
"requirements": ["adguardhome==0.6.3"]
}

View File

@@ -22,20 +22,13 @@ SCAN_INTERVAL = timedelta(seconds=300)
PARALLEL_UPDATES = 4
@dataclass
class AdGuardHomeEntityDescriptionMixin:
"""Mixin for required keys."""
@dataclass(kw_only=True)
class AdGuardHomeEntityDescription(SensorEntityDescription):
"""Describes AdGuard Home sensor entity."""
value_fn: Callable[[AdGuardHome], Coroutine[Any, Any, int | float]]
@dataclass
class AdGuardHomeEntityDescription(
SensorEntityDescription, AdGuardHomeEntityDescriptionMixin
):
"""Describes AdGuard Home sensor entity."""
SENSORS: tuple[AdGuardHomeEntityDescription, ...] = (
AdGuardHomeEntityDescription(
key="dns_queries",

View File

@@ -10,6 +10,9 @@
"username": "[%key:common::config_flow::data::username%]",
"ssl": "[%key:common::config_flow::data::ssl%]",
"verify_ssl": "[%key:common::config_flow::data::verify_ssl%]"
},
"data_description": {
"host": "The hostname or IP address of the device running your AdGuard Home."
}
},
"hassio_confirm": {

View File

@@ -21,22 +21,15 @@ SCAN_INTERVAL = timedelta(seconds=10)
PARALLEL_UPDATES = 1
@dataclass
class AdGuardHomeSwitchEntityDescriptionMixin:
"""Mixin for required keys."""
@dataclass(kw_only=True)
class AdGuardHomeSwitchEntityDescription(SwitchEntityDescription):
"""Describes AdGuard Home switch entity."""
is_on_fn: Callable[[AdGuardHome], Callable[[], Coroutine[Any, Any, bool]]]
turn_on_fn: Callable[[AdGuardHome], Callable[[], Coroutine[Any, Any, None]]]
turn_off_fn: Callable[[AdGuardHome], Callable[[], Coroutine[Any, Any, None]]]
@dataclass
class AdGuardHomeSwitchEntityDescription(
SwitchEntityDescription, AdGuardHomeSwitchEntityDescriptionMixin
):
"""Describes AdGuard Home switch entity."""
SWITCHES: tuple[AdGuardHomeSwitchEntityDescription, ...] = (
AdGuardHomeSwitchEntityDescription(
key="protection",

View File

@@ -122,6 +122,13 @@ class AdvantageAirAC(AdvantageAirAcEntity, ClimateEntity):
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."""
if self._myzone:
return self._myzone["measuredTemp"]
return None
@property
def target_temperature(self) -> float | None:
"""Return the current target temperature."""

View File

@@ -1,9 +1,8 @@
"""The AEMET OpenData component."""
import asyncio
import logging
from aemet_opendata.exceptions import TownNotFound
from aemet_opendata.exceptions import AemetError, TownNotFound
from aemet_opendata.interface import AEMET, ConnectionOptions
from homeassistant.config_entries import ConfigEntry
@@ -39,8 +38,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
except TownNotFound as err:
_LOGGER.error(err)
return False
except asyncio.TimeoutError as err:
raise ConfigEntryNotReady("AEMET OpenData API timed out") from err
except AemetError as err:
raise ConfigEntryNotReady(err) from err
weather_coordinator = WeatherUpdateCoordinator(hass, aemet)
await weather_coordinator.async_config_entry_first_refresh()

View File

@@ -12,6 +12,18 @@ from aemet_opendata.const import (
AOD_COND_RAINY,
AOD_COND_SNOWY,
AOD_COND_SUNNY,
AOD_CONDITION,
AOD_FORECAST_DAILY,
AOD_FORECAST_HOURLY,
AOD_PRECIPITATION,
AOD_PRECIPITATION_PROBABILITY,
AOD_TEMP,
AOD_TEMP_MAX,
AOD_TEMP_MIN,
AOD_TIMESTAMP,
AOD_WIND_DIRECTION,
AOD_WIND_SPEED,
AOD_WIND_SPEED_MAX,
)
from homeassistant.components.weather import (
@@ -25,6 +37,15 @@ from homeassistant.components.weather import (
ATTR_CONDITION_RAINY,
ATTR_CONDITION_SNOWY,
ATTR_CONDITION_SUNNY,
ATTR_FORECAST_CONDITION,
ATTR_FORECAST_NATIVE_PRECIPITATION,
ATTR_FORECAST_NATIVE_TEMP,
ATTR_FORECAST_NATIVE_TEMP_LOW,
ATTR_FORECAST_NATIVE_WIND_GUST_SPEED,
ATTR_FORECAST_NATIVE_WIND_SPEED,
ATTR_FORECAST_PRECIPITATION_PROBABILITY,
ATTR_FORECAST_TIME,
ATTR_FORECAST_WIND_BEARING,
)
from homeassistant.const import Platform
@@ -122,3 +143,30 @@ FORECAST_MODE_ATTR_API = {
FORECAST_MODE_DAILY: ATTR_API_FORECAST_DAILY,
FORECAST_MODE_HOURLY: ATTR_API_FORECAST_HOURLY,
}
FORECAST_MAP = {
AOD_FORECAST_DAILY: {
AOD_CONDITION: ATTR_FORECAST_CONDITION,
AOD_PRECIPITATION_PROBABILITY: ATTR_FORECAST_PRECIPITATION_PROBABILITY,
AOD_TEMP_MAX: ATTR_FORECAST_NATIVE_TEMP,
AOD_TEMP_MIN: ATTR_FORECAST_NATIVE_TEMP_LOW,
AOD_TIMESTAMP: ATTR_FORECAST_TIME,
AOD_WIND_DIRECTION: ATTR_FORECAST_WIND_BEARING,
AOD_WIND_SPEED: ATTR_FORECAST_NATIVE_WIND_SPEED,
},
AOD_FORECAST_HOURLY: {
AOD_CONDITION: ATTR_FORECAST_CONDITION,
AOD_PRECIPITATION_PROBABILITY: ATTR_FORECAST_PRECIPITATION_PROBABILITY,
AOD_PRECIPITATION: ATTR_FORECAST_NATIVE_PRECIPITATION,
AOD_TEMP: ATTR_FORECAST_NATIVE_TEMP,
AOD_TIMESTAMP: ATTR_FORECAST_TIME,
AOD_WIND_DIRECTION: ATTR_FORECAST_WIND_BEARING,
AOD_WIND_SPEED_MAX: ATTR_FORECAST_NATIVE_WIND_GUST_SPEED,
AOD_WIND_SPEED: ATTR_FORECAST_NATIVE_WIND_SPEED,
},
}
WEATHER_FORECAST_MODES = {
AOD_FORECAST_DAILY: "daily",
AOD_FORECAST_HOURLY: "hourly",
}

View File

@@ -0,0 +1,23 @@
"""Entity classes for the AEMET OpenData integration."""
from __future__ import annotations
from typing import Any
from aemet_opendata.helpers import dict_nested_value
from homeassistant.components.weather import Forecast
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .weather_update_coordinator import WeatherUpdateCoordinator
class AemetEntity(CoordinatorEntity[WeatherUpdateCoordinator]):
"""Define an AEMET entity."""
def get_aemet_forecast(self, forecast_mode: str) -> list[Forecast]:
"""Return AEMET entity forecast by mode."""
return self.coordinator.data["forecast"][forecast_mode]
def get_aemet_value(self, keys: list[str]) -> Any:
"""Return AEMET entity value by keys."""
return dict_nested_value(self.coordinator.data["lib"], keys)

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.5"]
"requirements": ["AEMET-OpenData==0.4.6"]
}

View File

@@ -1,16 +1,19 @@
"""Support for the AEMET OpenData service."""
from typing import cast
from aemet_opendata.const import (
AOD_CONDITION,
AOD_FORECAST_DAILY,
AOD_FORECAST_HOURLY,
AOD_HUMIDITY,
AOD_PRESSURE,
AOD_TEMP,
AOD_WEATHER,
AOD_WIND_DIRECTION,
AOD_WIND_SPEED,
AOD_WIND_SPEED_MAX,
)
from homeassistant.components.weather import (
ATTR_FORECAST_CONDITION,
ATTR_FORECAST_NATIVE_PRECIPITATION,
ATTR_FORECAST_NATIVE_TEMP,
ATTR_FORECAST_NATIVE_TEMP_LOW,
ATTR_FORECAST_NATIVE_WIND_GUST_SPEED,
ATTR_FORECAST_NATIVE_WIND_SPEED,
ATTR_FORECAST_PRECIPITATION_PROBABILITY,
ATTR_FORECAST_TIME,
ATTR_FORECAST_WIND_BEARING,
DOMAIN as WEATHER_DOMAIN,
Forecast,
SingleCoordinatorWeatherEntity,
@@ -28,55 +31,16 @@ from homeassistant.helpers import entity_registry as er
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import (
ATTR_API_CONDITION,
ATTR_API_FORECAST_CONDITION,
ATTR_API_FORECAST_PRECIPITATION,
ATTR_API_FORECAST_PRECIPITATION_PROBABILITY,
ATTR_API_FORECAST_TEMP,
ATTR_API_FORECAST_TEMP_LOW,
ATTR_API_FORECAST_TIME,
ATTR_API_FORECAST_WIND_BEARING,
ATTR_API_FORECAST_WIND_MAX_SPEED,
ATTR_API_FORECAST_WIND_SPEED,
ATTR_API_HUMIDITY,
ATTR_API_PRESSURE,
ATTR_API_TEMPERATURE,
ATTR_API_WIND_BEARING,
ATTR_API_WIND_MAX_SPEED,
ATTR_API_WIND_SPEED,
ATTRIBUTION,
CONDITIONS_MAP,
DOMAIN,
ENTRY_NAME,
ENTRY_WEATHER_COORDINATOR,
FORECAST_MODE_ATTR_API,
FORECAST_MODE_DAILY,
FORECAST_MODE_HOURLY,
FORECAST_MODES,
WEATHER_FORECAST_MODES,
)
from .entity import AemetEntity
from .weather_update_coordinator import WeatherUpdateCoordinator
FORECAST_MAP = {
FORECAST_MODE_DAILY: {
ATTR_API_FORECAST_CONDITION: ATTR_FORECAST_CONDITION,
ATTR_API_FORECAST_PRECIPITATION_PROBABILITY: ATTR_FORECAST_PRECIPITATION_PROBABILITY,
ATTR_API_FORECAST_TEMP_LOW: ATTR_FORECAST_NATIVE_TEMP_LOW,
ATTR_API_FORECAST_TEMP: ATTR_FORECAST_NATIVE_TEMP,
ATTR_API_FORECAST_TIME: ATTR_FORECAST_TIME,
ATTR_API_FORECAST_WIND_BEARING: ATTR_FORECAST_WIND_BEARING,
ATTR_API_FORECAST_WIND_SPEED: ATTR_FORECAST_NATIVE_WIND_SPEED,
},
FORECAST_MODE_HOURLY: {
ATTR_API_FORECAST_CONDITION: ATTR_FORECAST_CONDITION,
ATTR_API_FORECAST_PRECIPITATION_PROBABILITY: ATTR_FORECAST_PRECIPITATION_PROBABILITY,
ATTR_API_FORECAST_PRECIPITATION: ATTR_FORECAST_NATIVE_PRECIPITATION,
ATTR_API_FORECAST_TEMP: ATTR_FORECAST_NATIVE_TEMP,
ATTR_API_FORECAST_TIME: ATTR_FORECAST_TIME,
ATTR_API_FORECAST_WIND_BEARING: ATTR_FORECAST_WIND_BEARING,
ATTR_API_FORECAST_WIND_MAX_SPEED: ATTR_FORECAST_NATIVE_WIND_GUST_SPEED,
ATTR_API_FORECAST_WIND_SPEED: ATTR_FORECAST_NATIVE_WIND_SPEED,
},
}
async def async_setup_entry(
hass: HomeAssistant,
@@ -95,11 +59,11 @@ async def async_setup_entry(
if entity_registry.async_get_entity_id(
WEATHER_DOMAIN,
DOMAIN,
f"{config_entry.unique_id} {FORECAST_MODE_HOURLY}",
f"{config_entry.unique_id} {WEATHER_FORECAST_MODES[AOD_FORECAST_HOURLY]}",
):
for mode in FORECAST_MODES:
name = f"{domain_data[ENTRY_NAME]} {mode}"
unique_id = f"{config_entry.unique_id} {mode}"
for mode, mode_id in WEATHER_FORECAST_MODES.items():
name = f"{domain_data[ENTRY_NAME]} {mode_id}"
unique_id = f"{config_entry.unique_id} {mode_id}"
entities.append(AemetWeather(name, unique_id, weather_coordinator, mode))
else:
entities.append(
@@ -107,15 +71,18 @@ async def async_setup_entry(
domain_data[ENTRY_NAME],
config_entry.unique_id,
weather_coordinator,
FORECAST_MODE_DAILY,
AOD_FORECAST_DAILY,
)
)
async_add_entities(entities, False)
class AemetWeather(SingleCoordinatorWeatherEntity[WeatherUpdateCoordinator]):
"""Implementation of an AEMET OpenData sensor."""
class AemetWeather(
AemetEntity,
SingleCoordinatorWeatherEntity[WeatherUpdateCoordinator],
):
"""Implementation of an AEMET OpenData weather."""
_attr_attribution = ATTRIBUTION
_attr_native_precipitation_unit = UnitOfPrecipitationDepth.MILLIMETERS
@@ -137,7 +104,7 @@ class AemetWeather(SingleCoordinatorWeatherEntity[WeatherUpdateCoordinator]):
super().__init__(coordinator)
self._forecast_mode = forecast_mode
self._attr_entity_registry_enabled_default = (
self._forecast_mode == FORECAST_MODE_DAILY
self._forecast_mode == AOD_FORECAST_DAILY
)
self._attr_name = name
self._attr_unique_id = unique_id
@@ -145,61 +112,50 @@ class AemetWeather(SingleCoordinatorWeatherEntity[WeatherUpdateCoordinator]):
@property
def condition(self):
"""Return the current condition."""
return self.coordinator.data[ATTR_API_CONDITION]
def _forecast(self, forecast_mode: str) -> list[Forecast]:
"""Return the forecast array."""
forecasts = self.coordinator.data[FORECAST_MODE_ATTR_API[forecast_mode]]
forecast_map = FORECAST_MAP[forecast_mode]
return cast(
list[Forecast],
[
{ha_key: forecast[api_key] for api_key, ha_key in forecast_map.items()}
for forecast in forecasts
],
)
cond = self.get_aemet_value([AOD_WEATHER, AOD_CONDITION])
return CONDITIONS_MAP.get(cond)
@property
def forecast(self) -> list[Forecast]:
"""Return the forecast array."""
return self._forecast(self._forecast_mode)
return self.get_aemet_forecast(self._forecast_mode)
@callback
def _async_forecast_daily(self) -> list[Forecast]:
"""Return the daily forecast in native units."""
return self._forecast(FORECAST_MODE_DAILY)
return self.get_aemet_forecast(AOD_FORECAST_DAILY)
@callback
def _async_forecast_hourly(self) -> list[Forecast]:
"""Return the hourly forecast in native units."""
return self._forecast(FORECAST_MODE_HOURLY)
return self.get_aemet_forecast(AOD_FORECAST_HOURLY)
@property
def humidity(self):
"""Return the humidity."""
return self.coordinator.data[ATTR_API_HUMIDITY]
return self.get_aemet_value([AOD_WEATHER, AOD_HUMIDITY])
@property
def native_pressure(self):
"""Return the pressure."""
return self.coordinator.data[ATTR_API_PRESSURE]
return self.get_aemet_value([AOD_WEATHER, AOD_PRESSURE])
@property
def native_temperature(self):
"""Return the temperature."""
return self.coordinator.data[ATTR_API_TEMPERATURE]
return self.get_aemet_value([AOD_WEATHER, AOD_TEMP])
@property
def wind_bearing(self):
"""Return the wind bearing."""
return self.coordinator.data[ATTR_API_WIND_BEARING]
return self.get_aemet_value([AOD_WEATHER, AOD_WIND_DIRECTION])
@property
def native_wind_gust_speed(self):
"""Return the wind gust speed in native units."""
return self.coordinator.data[ATTR_API_WIND_MAX_SPEED]
return self.get_aemet_value([AOD_WEATHER, AOD_WIND_SPEED_MAX])
@property
def native_wind_speed(self):
"""Return the wind speed."""
return self.coordinator.data[ATTR_API_WIND_SPEED]
return self.get_aemet_value([AOD_WEATHER, AOD_WIND_SPEED])

View File

@@ -4,7 +4,7 @@ from __future__ import annotations
from asyncio import timeout
from datetime import timedelta
import logging
from typing import Any, Final
from typing import Any, Final, cast
from aemet_opendata.const import (
AEMET_ATTR_DATE,
@@ -31,17 +31,24 @@ from aemet_opendata.const import (
AEMET_ATTR_TEMPERATURE,
AEMET_ATTR_WIND,
AEMET_ATTR_WIND_GUST,
AOD_CONDITION,
AOD_FORECAST,
AOD_FORECAST_DAILY,
AOD_FORECAST_HOURLY,
AOD_TOWN,
ATTR_DATA,
)
from aemet_opendata.exceptions import AemetError
from aemet_opendata.forecast import ForecastValue
from aemet_opendata.helpers import (
dict_nested_value,
get_forecast_day_value,
get_forecast_hour_value,
get_forecast_interval_value,
)
from aemet_opendata.interface import AEMET
from homeassistant.components.weather import Forecast
from homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from homeassistant.util import dt as dt_util
@@ -79,6 +86,7 @@ from .const import (
ATTR_API_WIND_SPEED,
CONDITIONS_MAP,
DOMAIN,
FORECAST_MAP,
)
_LOGGER = logging.getLogger(__name__)
@@ -239,6 +247,12 @@ class WeatherUpdateCoordinator(DataUpdateCoordinator):
weather_response, now
)
data = self.aemet.data()
forecasts: list[dict[str, Forecast]] = {
AOD_FORECAST_DAILY: self.aemet_forecast(data, AOD_FORECAST_DAILY),
AOD_FORECAST_HOURLY: self.aemet_forecast(data, AOD_FORECAST_HOURLY),
}
return {
ATTR_API_CONDITION: condition,
ATTR_API_FORECAST_DAILY: forecast_daily,
@@ -261,8 +275,29 @@ class WeatherUpdateCoordinator(DataUpdateCoordinator):
ATTR_API_WIND_BEARING: wind_bearing,
ATTR_API_WIND_MAX_SPEED: wind_max_speed,
ATTR_API_WIND_SPEED: wind_speed,
"forecast": forecasts,
"lib": data,
}
def aemet_forecast(
self,
data: dict[str, Any],
forecast_mode: str,
) -> list[Forecast]:
"""Return the forecast array."""
forecasts = dict_nested_value(data, [AOD_TOWN, forecast_mode, AOD_FORECAST])
forecast_map = FORECAST_MAP[forecast_mode]
forecast_list: list[dict[str, Any]] = []
for forecast in forecasts:
cur_forecast: dict[str, Any] = {}
for api_key, ha_key in forecast_map.items():
value = forecast[api_key]
if api_key == AOD_CONDITION:
value = CONDITIONS_MAP.get(value)
cur_forecast[ha_key] = value
forecast_list += [cur_forecast]
return cast(list[Forecast], forecast_list)
def _get_daily_forecast_from_weather_response(self, weather_response, now):
if weather_response.daily:
parse = False

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

@@ -6,6 +6,9 @@
"data": {
"host": "[%key:common::config_flow::data::host%]",
"port": "[%key:common::config_flow::data::port%]"
},
"data_description": {
"host": "The IP address of the Agent DVR server."
}
}
},

View File

@@ -11,6 +11,7 @@ from homeassistant.const import (
Platform,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr, entity_registry as er
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from .const import DOMAIN
@@ -50,6 +51,20 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
# Clean up unused device entries with no entities
device_registry = dr.async_get(hass)
entity_registry = er.async_get(hass)
device_entries = dr.async_entries_for_config_entry(
device_registry, config_entry_id=entry.entry_id
)
for dev in device_entries:
dev_entities = er.async_entries_for_device(
entity_registry, dev.id, include_disabled_entities=True
)
if not dev_entities:
device_registry.async_remove_device(dev.id)
return True

View File

@@ -148,13 +148,14 @@ class AirNowSensor(CoordinatorEntity[AirNowDataUpdateCoordinator], SensorEntity)
) -> None:
"""Initialize."""
super().__init__(coordinator)
_device_id = f"{coordinator.latitude}-{coordinator.longitude}"
self.entity_description = description
self._attr_unique_id = (
f"{coordinator.latitude}-{coordinator.longitude}-{description.key.lower()}"
)
self._attr_unique_id = f"{_device_id}-{description.key.lower()}"
self._attr_device_info = DeviceInfo(
entry_type=DeviceEntryType.SERVICE,
identifiers={(DOMAIN, self._attr_unique_id)},
identifiers={(DOMAIN, _device_id)},
manufacturer=DEFAULT_NAME,
name=DEFAULT_NAME,
)

View File

@@ -3,7 +3,6 @@ from typing import Final
DOMAIN: Final = "airq"
MANUFACTURER: Final = "CorantGmbH"
TARGET_ROUTE: Final = "average"
CONCENTRATION_GRAMS_PER_CUBIC_METER: Final = "g/m³"
ACTIVITY_BECQUEREL_PER_CUBIC_METER: Final = "Bq/m³"
UPDATE_INTERVAL: float = 10.0

View File

@@ -13,7 +13,7 @@ from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from .const import DOMAIN, MANUFACTURER, TARGET_ROUTE, UPDATE_INTERVAL
from .const import DOMAIN, MANUFACTURER, UPDATE_INTERVAL
_LOGGER = logging.getLogger(__name__)
@@ -56,6 +56,4 @@ class AirQCoordinator(DataUpdateCoordinator):
hw_version=info["hw_version"],
)
)
data = await self.airq.get(TARGET_ROUTE)
return self.airq.drop_uncertainties_from_data(data)
return await self.airq.get_latest_data()

View File

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

View File

@@ -12,6 +12,9 @@
"title": "Set up your AirTouch 4 connection details.",
"data": {
"host": "[%key:common::config_flow::data::host%]"
},
"data_description": {
"host": "The hostname or IP address of your AirTouch controller."
}
}
}

View File

@@ -12,6 +12,9 @@
"data": {
"ip_address": "[%key:common::config_flow::data::host%]",
"password": "[%key:common::config_flow::data::password%]"
},
"data_description": {
"ip_address": "The hostname or IP address of your AirVisual Pro device."
}
}
},

View File

@@ -9,7 +9,6 @@ from aioairzone.const import (
AZD_BATTERY_LOW,
AZD_ERRORS,
AZD_FLOOR_DEMAND,
AZD_NAME,
AZD_PROBLEMS,
AZD_SYSTEMS,
AZD_ZONES,
@@ -45,7 +44,6 @@ SYSTEM_BINARY_SENSOR_TYPES: Final[tuple[AirzoneBinarySensorEntityDescription, ..
device_class=BinarySensorDeviceClass.PROBLEM,
entity_category=EntityCategory.DIAGNOSTIC,
key=AZD_PROBLEMS,
name="Problem",
),
)
@@ -53,17 +51,16 @@ ZONE_BINARY_SENSOR_TYPES: Final[tuple[AirzoneBinarySensorEntityDescription, ...]
AirzoneBinarySensorEntityDescription(
device_class=BinarySensorDeviceClass.RUNNING,
key=AZD_AIR_DEMAND,
name="Air Demand",
translation_key="air_demand",
),
AirzoneBinarySensorEntityDescription(
device_class=BinarySensorDeviceClass.BATTERY,
key=AZD_BATTERY_LOW,
name="Battery Low",
),
AirzoneBinarySensorEntityDescription(
device_class=BinarySensorDeviceClass.RUNNING,
key=AZD_FLOOR_DEMAND,
name="Floor Demand",
translation_key="floor_demand",
),
AirzoneBinarySensorEntityDescription(
attributes={
@@ -72,7 +69,6 @@ ZONE_BINARY_SENSOR_TYPES: Final[tuple[AirzoneBinarySensorEntityDescription, ...]
device_class=BinarySensorDeviceClass.PROBLEM,
entity_category=EntityCategory.DIAGNOSTIC,
key=AZD_PROBLEMS,
name="Problem",
),
)
@@ -149,7 +145,6 @@ class AirzoneSystemBinarySensor(AirzoneSystemEntity, AirzoneBinarySensor):
) -> None:
"""Initialize."""
super().__init__(coordinator, entry, system_data)
self._attr_name = f"System {system_id} {description.name}"
self._attr_unique_id = f"{self._attr_unique_id}_{system_id}_{description.key}"
self.entity_description = description
self._async_update_attrs()
@@ -169,7 +164,6 @@ class AirzoneZoneBinarySensor(AirzoneZoneEntity, AirzoneBinarySensor):
"""Initialize."""
super().__init__(coordinator, entry, system_zone_id, zone_data)
self._attr_name = f"{zone_data[AZD_NAME]} {description.name}"
self._attr_unique_id = (
f"{self._attr_unique_id}_{system_zone_id}_{description.key}"
)

View File

@@ -19,7 +19,6 @@ from aioairzone.const import (
AZD_MASTER,
AZD_MODE,
AZD_MODES,
AZD_NAME,
AZD_ON,
AZD_SPEED,
AZD_SPEEDS,
@@ -32,6 +31,7 @@ from aioairzone.const import (
)
from homeassistant.components.climate import (
ATTR_HVAC_MODE,
ATTR_TARGET_TEMP_HIGH,
ATTR_TARGET_TEMP_LOW,
FAN_AUTO,
@@ -114,6 +114,7 @@ async def async_setup_entry(
class AirzoneClimate(AirzoneZoneEntity, ClimateEntity):
"""Define an Airzone sensor."""
_attr_name = None
_speeds: dict[int, str] = {}
_speeds_reverse: dict[str, int] = {}
@@ -127,7 +128,6 @@ class AirzoneClimate(AirzoneZoneEntity, ClimateEntity):
"""Initialize Airzone climate entity."""
super().__init__(coordinator, entry, system_zone_id, zone_data)
self._attr_name = f"{zone_data[AZD_NAME]}"
self._attr_unique_id = f"{self._attr_unique_id}_{system_zone_id}"
self._attr_supported_features = ClimateEntityFeature.TARGET_TEMPERATURE
self._attr_target_temperature_step = API_TEMPERATURE_STEP
@@ -209,7 +209,9 @@ class AirzoneClimate(AirzoneZoneEntity, ClimateEntity):
await self._async_update_hvac_params(params)
if slave_raise:
raise HomeAssistantError(f"Mode can't be changed on slave zone {self.name}")
raise HomeAssistantError(
f"Mode can't be changed on slave zone {self.entity_id}"
)
async def async_set_temperature(self, **kwargs: Any) -> None:
"""Set new target temperature."""
@@ -221,6 +223,9 @@ class AirzoneClimate(AirzoneZoneEntity, ClimateEntity):
params[API_HEAT_SET_POINT] = kwargs[ATTR_TARGET_TEMP_LOW]
await self._async_update_hvac_params(params)
if ATTR_HVAC_MODE in kwargs:
await self.async_set_hvac_mode(kwargs[ATTR_HVAC_MODE])
@callback
def _handle_coordinator_update(self) -> None:
"""Update attributes when the coordinator updates."""

View File

@@ -39,6 +39,8 @@ _LOGGER = logging.getLogger(__name__)
class AirzoneEntity(CoordinatorEntity[AirzoneUpdateCoordinator]):
"""Define an Airzone entity."""
_attr_has_entity_name = True
def get_airzone_value(self, key: str) -> Any:
"""Return Airzone entity value by key."""
raise NotImplementedError()
@@ -62,7 +64,7 @@ class AirzoneSystemEntity(AirzoneEntity):
identifiers={(DOMAIN, f"{entry.entry_id}_{self.system_id}")},
manufacturer=MANUFACTURER,
model=self.get_airzone_value(AZD_MODEL),
name=self.get_airzone_value(AZD_FULL_NAME),
name=f"System {self.system_id}",
sw_version=self.get_airzone_value(AZD_FIRMWARE),
via_device=(DOMAIN, f"{entry.entry_id}_ws"),
)
@@ -116,9 +118,7 @@ class AirzoneHotWaterEntity(AirzoneEntity):
try:
await self.coordinator.airzone.set_dhw_parameters(_params)
except AirzoneError as error:
raise HomeAssistantError(
f"Failed to set dhw {self.name}: {error}"
) from error
raise HomeAssistantError(f"Failed to set DHW: {error}") from error
self.coordinator.async_set_updated_data(self.coordinator.airzone.data())
@@ -172,7 +172,7 @@ class AirzoneZoneEntity(AirzoneEntity):
identifiers={(DOMAIN, f"{entry.entry_id}_{system_zone_id}")},
manufacturer=MANUFACTURER,
model=self.get_airzone_value(AZD_THERMOSTAT_MODEL),
name=f"Airzone [{system_zone_id}] {zone_data[AZD_NAME]}",
name=zone_data[AZD_NAME],
sw_version=self.get_airzone_value(AZD_THERMOSTAT_FW),
via_device=(DOMAIN, f"{entry.entry_id}_{self.system_id}"),
)
@@ -203,7 +203,7 @@ class AirzoneZoneEntity(AirzoneEntity):
await self.coordinator.airzone.set_hvac_parameters(_params)
except AirzoneError as error:
raise HomeAssistantError(
f"Failed to set zone {self.name}: {error}"
f"Failed to set zone {self.entity_id}: {error}"
) from error
self.coordinator.async_set_updated_data(self.coordinator.airzone.data())

View File

@@ -11,7 +11,6 @@ from aioairzone.const import (
API_SLEEP,
AZD_COLD_ANGLE,
AZD_HEAT_ANGLE,
AZD_NAME,
AZD_SLEEP,
AZD_ZONES,
)
@@ -60,7 +59,6 @@ ZONE_SELECT_TYPES: Final[tuple[AirzoneSelectDescription, ...]] = (
api_param=API_COLD_ANGLE,
entity_category=EntityCategory.CONFIG,
key=AZD_COLD_ANGLE,
name="Cold Angle",
options=list(GRILLE_ANGLE_DICT),
options_dict=GRILLE_ANGLE_DICT,
translation_key="grille_angles",
@@ -69,16 +67,14 @@ ZONE_SELECT_TYPES: Final[tuple[AirzoneSelectDescription, ...]] = (
api_param=API_HEAT_ANGLE,
entity_category=EntityCategory.CONFIG,
key=AZD_HEAT_ANGLE,
name="Heat Angle",
options=list(GRILLE_ANGLE_DICT),
options_dict=GRILLE_ANGLE_DICT,
translation_key="grille_angles",
translation_key="heat_angles",
),
AirzoneSelectDescription(
api_param=API_SLEEP,
entity_category=EntityCategory.CONFIG,
key=AZD_SLEEP,
name="Sleep",
options=list(SLEEP_DICT),
options_dict=SLEEP_DICT,
translation_key="sleep_times",
@@ -146,7 +142,6 @@ class AirzoneZoneSelect(AirzoneZoneEntity, AirzoneBaseSelect):
"""Initialize."""
super().__init__(coordinator, entry, system_zone_id, zone_data)
self._attr_name = f"{zone_data[AZD_NAME]} {description.name}"
self._attr_unique_id = (
f"{self._attr_unique_id}_{system_zone_id}_{description.key}"
)

View File

@@ -6,7 +6,6 @@ from typing import Any, Final
from aioairzone.const import (
AZD_HOT_WATER,
AZD_HUMIDITY,
AZD_NAME,
AZD_TEMP,
AZD_TEMP_UNIT,
AZD_WEBSERVER,
@@ -54,7 +53,7 @@ WEBSERVER_SENSOR_TYPES: Final[tuple[SensorEntityDescription, ...]] = (
entity_category=EntityCategory.DIAGNOSTIC,
entity_registry_enabled_default=False,
key=AZD_WIFI_RSSI,
name="RSSI",
translation_key="rssi",
native_unit_of_measurement=SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
state_class=SensorStateClass.MEASUREMENT,
),
@@ -64,14 +63,12 @@ ZONE_SENSOR_TYPES: Final[tuple[SensorEntityDescription, ...]] = (
SensorEntityDescription(
device_class=SensorDeviceClass.TEMPERATURE,
key=AZD_TEMP,
name="Temperature",
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
device_class=SensorDeviceClass.HUMIDITY,
key=AZD_HUMIDITY,
name="Humidity",
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
),
@@ -144,8 +141,6 @@ class AirzoneSensor(AirzoneEntity, SensorEntity):
class AirzoneHotWaterSensor(AirzoneHotWaterEntity, AirzoneSensor):
"""Define an Airzone Hot Water sensor."""
_attr_has_entity_name = True
def __init__(
self,
coordinator: AirzoneUpdateCoordinator,
@@ -176,7 +171,6 @@ class AirzoneWebServerSensor(AirzoneWebServerEntity, AirzoneSensor):
) -> None:
"""Initialize."""
super().__init__(coordinator, entry)
self._attr_name = f"WebServer {description.name}"
self._attr_unique_id = f"{self._attr_unique_id}_ws_{description.key}"
self.entity_description = description
self._async_update_attrs()
@@ -196,7 +190,6 @@ class AirzoneZoneSensor(AirzoneZoneEntity, AirzoneSensor):
"""Initialize."""
super().__init__(coordinator, entry, system_zone_id, zone_data)
self._attr_name = f"{zone_data[AZD_NAME]} {description.name}"
self._attr_unique_id = (
f"{self._attr_unique_id}_{system_zone_id}_{description.key}"
)

View File

@@ -25,8 +25,17 @@
}
},
"entity": {
"binary_sensor": {
"air_demand": {
"name": "Air demand"
},
"floor_demand": {
"name": "Floor demand"
}
},
"select": {
"grille_angles": {
"name": "Cold angle",
"state": {
"90deg": "90°",
"50deg": "50°",
@@ -34,7 +43,17 @@
"40deg": "40°"
}
},
"heat_angles": {
"name": "Heat angle",
"state": {
"90deg": "[%key:component::airzone::entity::select::grille_angles::state::90deg%]",
"50deg": "[%key:component::airzone::entity::select::grille_angles::state::50deg%]",
"45deg": "[%key:component::airzone::entity::select::grille_angles::state::45deg%]",
"40deg": "[%key:component::airzone::entity::select::grille_angles::state::40deg%]"
}
},
"sleep_times": {
"name": "Sleep",
"state": {
"off": "[%key:common::state::off%]",
"30m": "30 minutes",
@@ -42,6 +61,11 @@
"90m": "90 minutes"
}
}
},
"sensor": {
"rssi": {
"name": "RSSI"
}
}
}
}

View File

@@ -9,7 +9,6 @@ from aioairzone.const import (
API_ACS_POWER_MODE,
API_ACS_SET_POINT,
AZD_HOT_WATER,
AZD_NAME,
AZD_OPERATION,
AZD_OPERATIONS,
AZD_TEMP,
@@ -67,6 +66,7 @@ async def async_setup_entry(
class AirzoneWaterHeater(AirzoneHotWaterEntity, WaterHeaterEntity):
"""Define an Airzone Water Heater."""
_attr_name = None
_attr_supported_features = (
WaterHeaterEntityFeature.TARGET_TEMPERATURE
| WaterHeaterEntityFeature.ON_OFF
@@ -81,7 +81,6 @@ class AirzoneWaterHeater(AirzoneHotWaterEntity, WaterHeaterEntity):
"""Initialize Airzone water heater entity."""
super().__init__(coordinator, entry)
self._attr_name = self.get_airzone_value(AZD_NAME)
self._attr_unique_id = f"{self._attr_unique_id}_dhw"
self._attr_operation_list = [
OPERATION_LIB_TO_HASS[operation]

View File

@@ -46,7 +46,9 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
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)
coordinator: AirzoneUpdateCoordinator = hass.data[DOMAIN].pop(entry.entry_id)
await coordinator.airzone.logout()
return unload_ok

View File

@@ -159,8 +159,6 @@ class AirzoneBinarySensor(AirzoneEntity, BinarySensorEntity):
class AirzoneAidooBinarySensor(AirzoneAidooEntity, AirzoneBinarySensor):
"""Define an Airzone Cloud Aidoo binary sensor."""
_attr_has_entity_name = True
def __init__(
self,
coordinator: AirzoneUpdateCoordinator,
@@ -180,8 +178,6 @@ class AirzoneAidooBinarySensor(AirzoneAidooEntity, AirzoneBinarySensor):
class AirzoneSystemBinarySensor(AirzoneSystemEntity, AirzoneBinarySensor):
"""Define an Airzone Cloud System binary sensor."""
_attr_has_entity_name = True
def __init__(
self,
coordinator: AirzoneUpdateCoordinator,
@@ -201,8 +197,6 @@ class AirzoneSystemBinarySensor(AirzoneSystemEntity, AirzoneBinarySensor):
class AirzoneZoneBinarySensor(AirzoneZoneEntity, AirzoneBinarySensor):
"""Define an Airzone Cloud Zone binary sensor."""
_attr_has_entity_name = True
def __init__(
self,
coordinator: AirzoneUpdateCoordinator,

View File

@@ -32,6 +32,7 @@ from aioairzone_cloud.const import (
)
from homeassistant.components.climate import (
ATTR_HVAC_MODE,
ClimateEntity,
ClimateEntityFeature,
HVACAction,
@@ -142,7 +143,6 @@ async def async_setup_entry(
class AirzoneClimate(AirzoneEntity, ClimateEntity):
"""Define an Airzone Cloud climate."""
_attr_has_entity_name = True
_attr_name = None
_attr_supported_features = ClimateEntityFeature.TARGET_TEMPERATURE
_attr_temperature_unit = UnitOfTemperature.CELSIUS
@@ -205,6 +205,9 @@ class AirzoneDeviceClimate(AirzoneClimate):
}
await self._async_update_params(params)
if ATTR_HVAC_MODE in kwargs:
await self.async_set_hvac_mode(kwargs[ATTR_HVAC_MODE])
class AirzoneDeviceGroupClimate(AirzoneClimate):
"""Define an Airzone Cloud DeviceGroup base class."""
@@ -239,6 +242,9 @@ class AirzoneDeviceGroupClimate(AirzoneClimate):
}
await self._async_update_params(params)
if ATTR_HVAC_MODE in kwargs:
await self.async_set_hvac_mode(kwargs[ATTR_HVAC_MODE])
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
"""Set hvac mode."""
params: dict[str, Any] = {
@@ -387,4 +393,6 @@ class AirzoneZoneClimate(AirzoneZoneEntity, AirzoneDeviceClimate):
await self._async_update_params(params)
if slave_raise:
raise HomeAssistantError(f"Mode can't be changed on slave zone {self.name}")
raise HomeAssistantError(
f"Mode can't be changed on slave zone {self.entity_id}"
)

View File

@@ -34,6 +34,8 @@ _LOGGER = logging.getLogger(__name__)
class AirzoneEntity(CoordinatorEntity[AirzoneUpdateCoordinator], ABC):
"""Define an Airzone Cloud entity."""
_attr_has_entity_name = True
@property
def available(self) -> bool:
"""Return Airzone Cloud entity availability."""
@@ -78,14 +80,14 @@ class AirzoneAidooEntity(AirzoneEntity):
async def _async_update_params(self, params: dict[str, Any]) -> None:
"""Send Aidoo parameters to Cloud API."""
_LOGGER.debug("aidoo=%s: update_params=%s", self.name, params)
_LOGGER.debug("aidoo=%s: update_params=%s", self.entity_id, params)
try:
await self.coordinator.airzone.api_set_aidoo_id_params(
self.aidoo_id, params
)
except AirzoneCloudError as error:
raise HomeAssistantError(
f"Failed to set {self.name} params: {error}"
f"Failed to set {self.entity_id} params: {error}"
) from error
self.coordinator.async_set_updated_data(self.coordinator.airzone.data())
@@ -120,14 +122,14 @@ class AirzoneGroupEntity(AirzoneEntity):
async def _async_update_params(self, params: dict[str, Any]) -> None:
"""Send Group parameters to Cloud API."""
_LOGGER.debug("group=%s: update_params=%s", self.name, params)
_LOGGER.debug("group=%s: update_params=%s", self.entity_id, params)
try:
await self.coordinator.airzone.api_set_group_id_params(
self.group_id, params
)
except AirzoneCloudError as error:
raise HomeAssistantError(
f"Failed to set {self.name} params: {error}"
f"Failed to set {self.entity_id} params: {error}"
) from error
self.coordinator.async_set_updated_data(self.coordinator.airzone.data())
@@ -162,14 +164,18 @@ class AirzoneInstallationEntity(AirzoneEntity):
async def _async_update_params(self, params: dict[str, Any]) -> None:
"""Send Installation parameters to Cloud API."""
_LOGGER.debug("installation=%s: update_params=%s", self.name, params)
_LOGGER.debug(
"installation=%s: update_params=%s",
self.entity_id,
params,
)
try:
await self.coordinator.airzone.api_set_installation_id_params(
self.inst_id, params
)
except AirzoneCloudError as error:
raise HomeAssistantError(
f"Failed to set {self.name} params: {error}"
f"Failed to set {self.entity_id} params: {error}"
) from error
self.coordinator.async_set_updated_data(self.coordinator.airzone.data())
@@ -265,12 +271,12 @@ class AirzoneZoneEntity(AirzoneEntity):
async def _async_update_params(self, params: dict[str, Any]) -> None:
"""Send Zone parameters to Cloud API."""
_LOGGER.debug("zone=%s: update_params=%s", self.name, params)
_LOGGER.debug("zone=%s: update_params=%s", self.entity_id, params)
try:
await self.coordinator.airzone.api_set_zone_id_params(self.zone_id, params)
except AirzoneCloudError as error:
raise HomeAssistantError(
f"Failed to set {self.name} params: {error}"
f"Failed to set {self.entity_id} params: {error}"
) from error
self.coordinator.async_set_updated_data(self.coordinator.airzone.data())

View File

@@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/airzone_cloud",
"iot_class": "cloud_polling",
"loggers": ["aioairzone_cloud"],
"requirements": ["aioairzone-cloud==0.3.5"]
"requirements": ["aioairzone-cloud==0.3.6"]
}

View File

@@ -141,8 +141,6 @@ class AirzoneSensor(AirzoneEntity, SensorEntity):
class AirzoneAidooSensor(AirzoneAidooEntity, AirzoneSensor):
"""Define an Airzone Cloud Aidoo sensor."""
_attr_has_entity_name = True
def __init__(
self,
coordinator: AirzoneUpdateCoordinator,
@@ -162,8 +160,6 @@ class AirzoneAidooSensor(AirzoneAidooEntity, AirzoneSensor):
class AirzoneWebServerSensor(AirzoneWebServerEntity, AirzoneSensor):
"""Define an Airzone Cloud WebServer sensor."""
_attr_has_entity_name = True
def __init__(
self,
coordinator: AirzoneUpdateCoordinator,
@@ -183,8 +179,6 @@ class AirzoneWebServerSensor(AirzoneWebServerEntity, AirzoneSensor):
class AirzoneZoneSensor(AirzoneZoneEntity, AirzoneSensor):
"""Define an Airzone Cloud Zone sensor."""
_attr_has_entity_name = True
def __init__(
self,
coordinator: AirzoneUpdateCoordinator,

View File

@@ -14,6 +14,10 @@
"port": "[%key:common::config_flow::data::port%]",
"device_baudrate": "Device Baud Rate",
"device_path": "Device Path"
},
"data_description": {
"host": "The hostname or IP address of the AlarmDecoder device that is connected to your alarm panel.",
"port": "The port on which AlarmDecoder is accessible (for example, 10000)"
}
}
},

View File

@@ -857,16 +857,18 @@ class AlexaInputController(AlexaCapability):
def inputs(self) -> list[dict[str, str]] | None:
"""Return the list of valid supported inputs."""
source_list: list[str] = self.entity.attributes.get(
source_list: list[Any] = self.entity.attributes.get(
media_player.ATTR_INPUT_SOURCE_LIST, []
)
return AlexaInputController.get_valid_inputs(source_list)
@staticmethod
def get_valid_inputs(source_list: list[str]) -> list[dict[str, str]]:
def get_valid_inputs(source_list: list[Any]) -> list[dict[str, str]]:
"""Return list of supported inputs."""
input_list: list[dict[str, str]] = []
for source in source_list:
if not isinstance(source, str):
continue
formatted_source = (
source.lower().replace("-", "").replace("_", "").replace(" ", "")
)

View File

@@ -1304,13 +1304,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 +1320,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 +1333,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}":

View File

@@ -7,6 +7,9 @@
"port": "[%key:common::config_flow::data::port%]",
"username": "[%key:common::config_flow::data::username%]",
"password": "[%key:common::config_flow::data::password%]"
},
"data_description": {
"host": "The IP address of the device running the Android IP Webcam app. The IP address is shown in the app once you start the server."
}
}
},

View File

@@ -1,44 +1,34 @@
"""Support for APCUPSd via its Network Information Server (NIS)."""
from __future__ import annotations
from datetime import timedelta
import logging
from typing import Any, Final
from apcaccess import status
from typing import Final
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST, CONF_PORT, Platform
from homeassistant.core import HomeAssistant
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.util import Throttle
from .const import DOMAIN
from .coordinator import APCUPSdCoordinator
_LOGGER = logging.getLogger(__name__)
DOMAIN: Final = "apcupsd"
VALUE_ONLINE: Final = 8
PLATFORMS: Final = (Platform.BINARY_SENSOR, Platform.SENSOR)
MIN_TIME_BETWEEN_UPDATES: Final = timedelta(seconds=60)
CONFIG_SCHEMA = cv.removed(DOMAIN, raise_if_present=False)
async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
"""Use config values to set up a function enabling status retrieval."""
data_service = APCUPSdData(
config_entry.data[CONF_HOST], config_entry.data[CONF_PORT]
)
host, port = config_entry.data[CONF_HOST], config_entry.data[CONF_PORT]
coordinator = APCUPSdCoordinator(hass, host, port)
try:
await hass.async_add_executor_job(data_service.update)
except OSError as ex:
_LOGGER.error("Failure while testing APCUPSd status retrieval: %s", ex)
return False
await coordinator.async_config_entry_first_refresh()
# Store the data service object.
# Store the coordinator for later uses.
hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN][config_entry.entry_id] = data_service
hass.data[DOMAIN][config_entry.entry_id] = coordinator
# Forward the config entries to the supported platforms.
await hass.config_entries.async_forward_entry_setups(config_entry, PLATFORMS)
@@ -51,66 +41,3 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
if unload_ok and DOMAIN in hass.data:
hass.data[DOMAIN].pop(entry.entry_id)
return unload_ok
class APCUPSdData:
"""Stores the data retrieved from APCUPSd.
For each entity to use, acts as the single point responsible for fetching
updates from the server.
"""
def __init__(self, host: str, port: int) -> None:
"""Initialize the data object."""
self._host = host
self._port = port
self.status: dict[str, str] = {}
@property
def name(self) -> str | None:
"""Return the name of the UPS, if available."""
return self.status.get("UPSNAME")
@property
def model(self) -> str | None:
"""Return the model of the UPS, if available."""
# Different UPS models may report slightly different keys for model, here we
# try them all.
for model_key in ("APCMODEL", "MODEL"):
if model_key in self.status:
return self.status[model_key]
return None
@property
def serial_no(self) -> str | None:
"""Return the unique serial number of the UPS, if available."""
return self.status.get("SERIALNO")
@property
def statflag(self) -> str | None:
"""Return the STATFLAG indicating the status of the UPS, if available."""
return self.status.get("STATFLAG")
@property
def device_info(self) -> DeviceInfo | None:
"""Return the DeviceInfo of this APC UPS for the sensors, if serial number is available."""
if self.serial_no is None:
return None
return DeviceInfo(
identifiers={(DOMAIN, self.serial_no)},
model=self.model,
manufacturer="APC",
name=self.name if self.name is not None else "APC UPS",
hw_version=self.status.get("FIRMWARE"),
sw_version=self.status.get("VERSION"),
)
@Throttle(MIN_TIME_BETWEEN_UPDATES)
def update(self, **kwargs: Any) -> None:
"""Fetch the latest status from APCUPSd.
Note that the result dict uses upper case for each resource, where our
integration uses lower cases as keys internally.
"""
self.status = status.parse(status.get(host=self._host, port=self._port))

View File

@@ -2,6 +2,7 @@
from __future__ import annotations
import logging
from typing import Final
from homeassistant.components.binary_sensor import (
BinarySensorEntity,
@@ -10,8 +11,9 @@ from homeassistant.components.binary_sensor import (
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from . import DOMAIN, VALUE_ONLINE, APCUPSdData
from . import DOMAIN, APCUPSdCoordinator
_LOGGER = logging.getLogger(__name__)
_DESCRIPTION = BinarySensorEntityDescription(
@@ -19,6 +21,8 @@ _DESCRIPTION = BinarySensorEntityDescription(
name="UPS Online Status",
icon="mdi:heart",
)
# The bit in STATFLAG that indicates the online status of the APC UPS.
_VALUE_ONLINE_MASK: Final = 0b1000
async def async_setup_entry(
@@ -27,50 +31,36 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up an APCUPSd Online Status binary sensor."""
data_service: APCUPSdData = hass.data[DOMAIN][config_entry.entry_id]
coordinator: APCUPSdCoordinator = hass.data[DOMAIN][config_entry.entry_id]
# Do not create the binary sensor if APCUPSd does not provide STATFLAG field for us
# to determine the online status.
if data_service.statflag is None:
if _DESCRIPTION.key.upper() not in coordinator.data:
return
async_add_entities(
[OnlineStatus(data_service, _DESCRIPTION)],
update_before_add=True,
)
async_add_entities([OnlineStatus(coordinator, _DESCRIPTION)])
class OnlineStatus(BinarySensorEntity):
class OnlineStatus(CoordinatorEntity[APCUPSdCoordinator], BinarySensorEntity):
"""Representation of a UPS online status."""
def __init__(
self,
data_service: APCUPSdData,
coordinator: APCUPSdCoordinator,
description: BinarySensorEntityDescription,
) -> None:
"""Initialize the APCUPSd binary device."""
super().__init__(coordinator, context=description.key.upper())
# Set up unique id and device info if serial number is available.
if (serial_no := data_service.serial_no) is not None:
if (serial_no := coordinator.ups_serial_no) is not None:
self._attr_unique_id = f"{serial_no}_{description.key}"
self._attr_device_info = data_service.device_info
self.entity_description = description
self._data_service = data_service
self._attr_device_info = coordinator.device_info
def update(self) -> None:
"""Get the status report from APCUPSd and set this entity's state."""
try:
self._data_service.update()
except OSError as ex:
if self._attr_available:
self._attr_available = False
_LOGGER.exception("Got exception while fetching state: %s", ex)
return
self._attr_available = True
@property
def is_on(self) -> bool | None:
"""Returns true if the UPS is online."""
# Check if ONLINE bit is set in STATFLAG.
key = self.entity_description.key.upper()
if key not in self._data_service.status:
self._attr_is_on = None
return
self._attr_is_on = int(self._data_service.status[key], 16) & VALUE_ONLINE > 0
return int(self.coordinator.data[key], 16) & _VALUE_ONLINE_MASK != 0

View File

@@ -1,6 +1,7 @@
"""Config flow for APCUPSd integration."""
from __future__ import annotations
import asyncio
from typing import Any
import voluptuous as vol
@@ -10,8 +11,9 @@ from homeassistant.const import CONF_HOST, CONF_PORT
from homeassistant.data_entry_flow import FlowResult
from homeassistant.helpers import selector
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.update_coordinator import UpdateFailed
from . import DOMAIN, APCUPSdData
from . import DOMAIN, APCUPSdCoordinator
_PORT_SELECTOR = vol.All(
selector.NumberSelector(
@@ -43,36 +45,37 @@ class ConfigFlowHandler(ConfigFlow, domain=DOMAIN):
if user_input is None:
return self.async_show_form(step_id="user", data_schema=_SCHEMA)
host, port = user_input[CONF_HOST], user_input[CONF_PORT]
# Abort if an entry with same host and port is present.
self._async_abort_entries_match(
{CONF_HOST: user_input[CONF_HOST], CONF_PORT: user_input[CONF_PORT]}
)
self._async_abort_entries_match({CONF_HOST: host, CONF_PORT: port})
# Test the connection to the host and get the current status for serial number.
data_service = APCUPSdData(user_input[CONF_HOST], user_input[CONF_PORT])
try:
await self.hass.async_add_executor_job(data_service.update)
except OSError:
coordinator = APCUPSdCoordinator(self.hass, host, port)
await coordinator.async_request_refresh()
await self.hass.async_block_till_done()
if isinstance(coordinator.last_exception, (UpdateFailed, asyncio.TimeoutError)):
errors = {"base": "cannot_connect"}
return self.async_show_form(
step_id="user", data_schema=_SCHEMA, errors=errors
)
if not data_service.status:
if not coordinator.data:
return self.async_abort(reason="no_status")
# We _try_ to use the serial number of the UPS as the unique id since this field
# is not guaranteed to exist on all APC UPS models.
await self.async_set_unique_id(data_service.serial_no)
await self.async_set_unique_id(coordinator.ups_serial_no)
self._abort_if_unique_id_configured()
title = "APC UPS"
if data_service.name is not None:
title = data_service.name
elif data_service.model is not None:
title = data_service.model
elif data_service.serial_no is not None:
title = data_service.serial_no
if coordinator.ups_name is not None:
title = coordinator.ups_name
elif coordinator.ups_model is not None:
title = coordinator.ups_model
elif coordinator.ups_serial_no is not None:
title = coordinator.ups_serial_no
return self.async_create_entry(
title=title,

View File

@@ -0,0 +1,4 @@
"""Constants for APCUPSd component."""
from typing import Final
DOMAIN: Final = "apcupsd"

View File

@@ -0,0 +1,102 @@
"""Support for APCUPSd via its Network Information Server (NIS)."""
from __future__ import annotations
import asyncio
from collections import OrderedDict
from datetime import timedelta
import logging
from typing import Final
from apcaccess import status
from homeassistant.core import HomeAssistant
from homeassistant.helpers.debounce import Debouncer
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.update_coordinator import (
REQUEST_REFRESH_DEFAULT_IMMEDIATE,
DataUpdateCoordinator,
UpdateFailed,
)
from .const import DOMAIN
_LOGGER = logging.getLogger(__name__)
UPDATE_INTERVAL: Final = timedelta(seconds=60)
REQUEST_REFRESH_COOLDOWN: Final = 5
class APCUPSdCoordinator(DataUpdateCoordinator[OrderedDict[str, str]]):
"""Store and coordinate the data retrieved from APCUPSd for all sensors.
For each entity to use, acts as the single point responsible for fetching
updates from the server.
"""
def __init__(self, hass: HomeAssistant, host: str, port: int) -> None:
"""Initialize the data object."""
super().__init__(
hass,
_LOGGER,
name=DOMAIN,
update_interval=UPDATE_INTERVAL,
request_refresh_debouncer=Debouncer(
hass,
_LOGGER,
cooldown=REQUEST_REFRESH_COOLDOWN,
immediate=REQUEST_REFRESH_DEFAULT_IMMEDIATE,
),
)
self._host = host
self._port = port
@property
def ups_name(self) -> str | None:
"""Return the name of the UPS, if available."""
return self.data.get("UPSNAME")
@property
def ups_model(self) -> str | None:
"""Return the model of the UPS, if available."""
# Different UPS models may report slightly different keys for model, here we
# try them all.
for model_key in ("APCMODEL", "MODEL"):
if model_key in self.data:
return self.data[model_key]
return None
@property
def ups_serial_no(self) -> str | None:
"""Return the unique serial number of the UPS, if available."""
return self.data.get("SERIALNO")
@property
def device_info(self) -> DeviceInfo | None:
"""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)},
model=self.ups_model,
manufacturer="APC",
name=self.ups_name if self.ups_name else "APC UPS",
hw_version=self.data.get("FIRMWARE"),
sw_version=self.data.get("VERSION"),
)
async def _async_update_data(self) -> OrderedDict[str, str]:
"""Fetch the latest status from APCUPSd.
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:
raise UpdateFailed(error) from error

View File

@@ -6,5 +6,6 @@
"documentation": "https://www.home-assistant.io/integrations/apcupsd",
"iot_class": "local_polling",
"loggers": ["apcaccess"],
"quality_scale": "silver",
"requirements": ["apcaccess==0.0.13"]
}

View File

@@ -20,10 +20,11 @@ from homeassistant.const import (
UnitOfTemperature,
UnitOfTime,
)
from homeassistant.core import HomeAssistant
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from . import DOMAIN, APCUPSdData
from . import DOMAIN, APCUPSdCoordinator
_LOGGER = logging.getLogger(__name__)
@@ -452,11 +453,11 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the APCUPSd sensors from config entries."""
data_service: APCUPSdData = hass.data[DOMAIN][config_entry.entry_id]
coordinator: APCUPSdCoordinator = hass.data[DOMAIN][config_entry.entry_id]
# The resources from data service are in upper-case by default, but we use
# lower cases throughout this integration.
available_resources: set[str] = {k.lower() for k, _ in data_service.status.items()}
# The resource keys in the data dict collected in the coordinator is in upper-case
# by default, but we use lower cases throughout this integration.
available_resources: set[str] = {k.lower() for k, _ in coordinator.data.items()}
entities = []
for resource in available_resources:
@@ -464,9 +465,9 @@ async def async_setup_entry(
_LOGGER.warning("Invalid resource from APCUPSd: %s", resource.upper())
continue
entities.append(APCUPSdSensor(data_service, SENSORS[resource]))
entities.append(APCUPSdSensor(coordinator, SENSORS[resource]))
async_add_entities(entities, update_before_add=True)
async_add_entities(entities)
def infer_unit(value: str) -> tuple[str, str | None]:
@@ -483,41 +484,36 @@ def infer_unit(value: str) -> tuple[str, str | None]:
return value, None
class APCUPSdSensor(SensorEntity):
class APCUPSdSensor(CoordinatorEntity[APCUPSdCoordinator], SensorEntity):
"""Representation of a sensor entity for APCUPSd status values."""
def __init__(
self,
data_service: APCUPSdData,
coordinator: APCUPSdCoordinator,
description: SensorEntityDescription,
) -> None:
"""Initialize the sensor."""
super().__init__(coordinator=coordinator, context=description.key.upper())
# Set up unique id and device info if serial number is available.
if (serial_no := data_service.serial_no) is not None:
if (serial_no := coordinator.ups_serial_no) is not None:
self._attr_unique_id = f"{serial_no}_{description.key}"
self._attr_device_info = data_service.device_info
self.entity_description = description
self._data_service = data_service
self._attr_device_info = coordinator.device_info
def update(self) -> None:
"""Get the latest status and use it to update our sensor state."""
try:
self._data_service.update()
except OSError as ex:
if self._attr_available:
self._attr_available = False
_LOGGER.exception("Got exception while fetching state: %s", ex)
return
# Initial update of attributes.
self._update_attrs()
self._attr_available = True
@callback
def _handle_coordinator_update(self) -> None:
"""Handle updated data from the coordinator."""
self._update_attrs()
self.async_write_ha_state()
def _update_attrs(self) -> None:
"""Update sensor attributes based on coordinator data."""
key = self.entity_description.key.upper()
if key not in self._data_service.status:
self._attr_native_value = None
return
self._attr_native_value, inferred_unit = infer_unit(
self._data_service.status[key]
)
self._attr_native_value, inferred_unit = infer_unit(self.coordinator.data[key])
if not self.native_unit_of_measurement:
self._attr_native_unit_of_measurement = inferred_unit

View File

@@ -1,9 +1,11 @@
"""Rest API for Home Assistant."""
import asyncio
from asyncio import timeout
from asyncio import shield, timeout
from collections.abc import Collection
from functools import lru_cache
from http import HTTPStatus
import logging
from typing import Any
from aiohttp import web
from aiohttp.web_exceptions import HTTPBadRequest
@@ -16,6 +18,7 @@ from homeassistant.components.http import HomeAssistantView, require_admin
from homeassistant.const import (
CONTENT_TYPE_JSON,
EVENT_HOMEASSISTANT_STOP,
EVENT_STATE_CHANGED,
MATCH_ALL,
URL_API,
URL_API_COMPONENTS,
@@ -38,10 +41,12 @@ from homeassistant.exceptions import (
Unauthorized,
)
from homeassistant.helpers import config_validation as cv, template
from homeassistant.helpers.event import EventStateChangedData
from homeassistant.helpers.json import json_dumps
from homeassistant.helpers.service import async_get_all_descriptions
from homeassistant.helpers.typing import ConfigType
from homeassistant.helpers.typing import ConfigType, EventType
from homeassistant.util.json import json_loads
from homeassistant.util.read_only_dict import ReadOnlyDict
_LOGGER = logging.getLogger(__name__)
@@ -57,6 +62,7 @@ ATTR_VERSION = "version"
DOMAIN = "api"
STREAM_PING_PAYLOAD = "ping"
STREAM_PING_INTERVAL = 50 # seconds
SERVICE_WAIT_TIMEOUT = 10
CONFIG_SCHEMA = cv.empty_config_schema(DOMAIN)
@@ -211,7 +217,9 @@ class APIStatesView(HomeAssistantView):
if entity_perm(state.entity_id, "read")
)
response = web.Response(
body=f'[{",".join(states)}]', content_type=CONTENT_TYPE_JSON
body=f'[{",".join(states)}]',
content_type=CONTENT_TYPE_JSON,
zlib_executor_size=32768,
)
response.enable_compression()
return response
@@ -369,19 +377,30 @@ class APIDomainServicesView(HomeAssistantView):
)
context = self.context(request)
changed_states: list[ReadOnlyDict[str, Collection[Any]]] = []
@ha.callback
def _async_save_changed_entities(
event: EventType[EventStateChangedData],
) -> None:
if event.context == context and (state := event.data["new_state"]):
changed_states.append(state.as_dict())
cancel_listen = hass.bus.async_listen(
EVENT_STATE_CHANGED, _async_save_changed_entities, run_immediately=True
)
try:
await hass.services.async_call(
domain, service, data, blocking=True, context=context
# shield the service call from cancellation on connection drop
await shield(
hass.services.async_call(
domain, service, data, blocking=True, context=context
)
)
except (vol.Invalid, ServiceNotFound) as ex:
raise HTTPBadRequest() from ex
changed_states = []
for state in hass.states.async_all():
if state.context is context:
changed_states.append(state)
finally:
cancel_listen()
return self.json(changed_states)

View File

@@ -9,7 +9,13 @@ from homeassistant.components import stt
from homeassistant.core import Context, HomeAssistant
from homeassistant.helpers.typing import ConfigType
from .const import CONF_DEBUG_RECORDING_DIR, DATA_CONFIG, DATA_LAST_WAKE_UP, DOMAIN
from .const import (
CONF_DEBUG_RECORDING_DIR,
DATA_CONFIG,
DATA_LAST_WAKE_UP,
DOMAIN,
EVENT_RECORDING,
)
from .error import PipelineNotFound
from .pipeline import (
AudioSettings,
@@ -40,6 +46,7 @@ __all__ = (
"PipelineEventType",
"PipelineNotFound",
"WakeWordSettings",
"EVENT_RECORDING",
)
CONFIG_SCHEMA = vol.Schema(

View File

@@ -11,3 +11,5 @@ CONF_DEBUG_RECORDING_DIR = "debug_recording_dir"
DATA_LAST_WAKE_UP = f"{DOMAIN}.last_wake_up"
DEFAULT_WAKE_WORD_COOLDOWN = 2 # seconds
EVENT_RECORDING = f"{DOMAIN}_recording"

View File

@@ -0,0 +1,39 @@
"""Describe assist_pipeline logbook events."""
from __future__ import annotations
from collections.abc import Callable
from homeassistant.components.logbook import LOGBOOK_ENTRY_MESSAGE, LOGBOOK_ENTRY_NAME
from homeassistant.const import ATTR_DEVICE_ID
from homeassistant.core import Event, HomeAssistant, callback
import homeassistant.helpers.device_registry as dr
from .const import DOMAIN, EVENT_RECORDING
@callback
def async_describe_events(
hass: HomeAssistant,
async_describe_event: Callable[[str, str, Callable[[Event], dict[str, str]]], None],
) -> None:
"""Describe logbook events."""
device_registry = dr.async_get(hass)
@callback
def async_describe_logbook_event(event: Event) -> dict[str, str]:
"""Describe logbook event."""
device: dr.DeviceEntry | None = None
device_name: str = "Unknown device"
device = device_registry.devices[event.data[ATTR_DEVICE_ID]]
if device:
device_name = device.name_by_user or device.name or "Unknown device"
message = f"{device_name} captured an audio sample"
return {
LOGBOOK_ENTRY_NAME: device_name,
LOGBOOK_ENTRY_MESSAGE: message,
}
async_describe_event(DOMAIN, EVENT_RECORDING, async_describe_logbook_event)

View File

@@ -9,7 +9,7 @@ from dataclasses import asdict, dataclass, field
from enum import StrEnum
import logging
from pathlib import Path
from queue import Queue
from queue import Empty, Queue
from threading import Thread
import time
from typing import TYPE_CHECKING, Any, Final, cast
@@ -320,7 +320,7 @@ class Pipeline:
wake_word_entity: str | None
wake_word_id: str | None
id: str = field(default_factory=ulid_util.ulid)
id: str = field(default_factory=ulid_util.ulid_now)
@classmethod
def from_json(cls, data: dict[str, Any]) -> Pipeline:
@@ -369,6 +369,7 @@ class PipelineStage(StrEnum):
STT = "stt"
INTENT = "intent"
TTS = "tts"
END = "end"
PIPELINE_STAGE_ORDER = [
@@ -482,7 +483,7 @@ class PipelineRun:
wake_word_settings: WakeWordSettings | None = None
audio_settings: AudioSettings = field(default_factory=AudioSettings)
id: str = field(default_factory=ulid_util.ulid)
id: str = field(default_factory=ulid_util.ulid_now)
stt_provider: stt.SpeechToTextEntity | stt.Provider = field(init=False, repr=False)
tts_engine: str = field(init=False, repr=False)
tts_options: dict | None = field(init=False, default=None)
@@ -503,6 +504,9 @@ class PipelineRun:
audio_processor_buffer: AudioBuffer = field(init=False, repr=False)
"""Buffer used when splitting audio into chunks for audio processing"""
_device_id: str | None = None
"""Optional device id set during run start."""
def __post_init__(self) -> None:
"""Set language for pipeline."""
self.language = self.pipeline.language or self.hass.config.language
@@ -554,7 +558,8 @@ class PipelineRun:
def start(self, device_id: str | None) -> None:
"""Emit run start event."""
self._start_debug_recording_thread(device_id)
self._device_id = device_id
self._start_debug_recording_thread()
data = {
"pipeline": self.pipeline.id,
@@ -567,6 +572,9 @@ class PipelineRun:
async def end(self) -> None:
"""Emit run end event."""
# Signal end of stream to listeners
self._capture_chunk(None)
# Stop the recording thread before emitting run-end.
# This ensures that files are properly closed if the event handler reads them.
await self._stop_debug_recording_thread()
@@ -746,9 +754,7 @@ class PipelineRun:
if self.abort_wake_word_detection:
raise WakeWordDetectionAborted
if self.debug_recording_queue is not None:
self.debug_recording_queue.put_nowait(chunk.audio)
self._capture_chunk(chunk.audio)
yield chunk.audio, chunk.timestamp_ms
# Wake-word-detection occurs *after* the wake word was actually
@@ -870,8 +876,7 @@ class PipelineRun:
chunk_seconds = AUDIO_PROCESSOR_SAMPLES / sample_rate
sent_vad_start = False
async for chunk in audio_stream:
if self.debug_recording_queue is not None:
self.debug_recording_queue.put_nowait(chunk.audio)
self._capture_chunk(chunk.audio)
if stt_vad is not None:
if not stt_vad.process(chunk_seconds, chunk.is_speech):
@@ -971,12 +976,16 @@ class PipelineRun:
# pipeline.tts_engine can't be None or this function is not called
engine = cast(str, self.pipeline.tts_engine)
tts_options = {}
tts_options: dict[str, Any] = {}
if self.pipeline.tts_voice is not None:
tts_options[tts.ATTR_VOICE] = self.pipeline.tts_voice
if self.tts_audio_output is not None:
tts_options[tts.ATTR_AUDIO_OUTPUT] = self.tts_audio_output
tts_options[tts.ATTR_PREFERRED_FORMAT] = self.tts_audio_output
if self.tts_audio_output == "wav":
# 16 Khz, 16-bit mono
tts_options[tts.ATTR_PREFERRED_SAMPLE_RATE] = 16000
tts_options[tts.ATTR_PREFERRED_SAMPLE_CHANNELS] = 1
try:
options_supported = await tts.async_support_options(
@@ -1002,8 +1011,8 @@ class PipelineRun:
self.tts_engine = engine
self.tts_options = tts_options
async def text_to_speech(self, tts_input: str) -> str:
"""Run text-to-speech portion of pipeline. Returns URL of TTS audio."""
async def text_to_speech(self, tts_input: str) -> None:
"""Run text-to-speech portion of pipeline."""
self.process_event(
PipelineEvent(
PipelineEventType.TTS_START,
@@ -1038,22 +1047,37 @@ class PipelineRun:
) from src_error
_LOGGER.debug("TTS result %s", tts_media)
tts_output = {
"media_id": tts_media_id,
**asdict(tts_media),
}
self.process_event(
PipelineEvent(
PipelineEventType.TTS_END,
{
"tts_output": {
"media_id": tts_media_id,
**asdict(tts_media),
}
},
)
PipelineEvent(PipelineEventType.TTS_END, {"tts_output": tts_output})
)
return tts_media.url
def _capture_chunk(self, audio_bytes: bytes | None) -> None:
"""Forward audio chunk to various capturing mechanisms."""
if self.debug_recording_queue is not None:
# Forward to debug WAV file recording
self.debug_recording_queue.put_nowait(audio_bytes)
def _start_debug_recording_thread(self, device_id: str | None) -> None:
if self._device_id is None:
return
# Forward to device audio capture
pipeline_data: PipelineData = self.hass.data[DOMAIN]
audio_queue = pipeline_data.device_audio_queues.get(self._device_id)
if audio_queue is None:
return
try:
audio_queue.queue.put_nowait(audio_bytes)
except asyncio.QueueFull:
audio_queue.overflow = True
_LOGGER.warning("Audio queue full for device %s", self._device_id)
def _start_debug_recording_thread(self) -> None:
"""Start thread to record wake/stt audio if debug_recording_dir is set."""
if self.debug_recording_thread is not None:
# Already started
@@ -1064,7 +1088,7 @@ class PipelineRun:
if debug_recording_dir := self.hass.data[DATA_CONFIG].get(
CONF_DEBUG_RECORDING_DIR
):
if device_id is None:
if self._device_id is None:
# <debug_recording_dir>/<pipeline.name>/<run.id>
run_recording_dir = (
Path(debug_recording_dir)
@@ -1075,7 +1099,7 @@ class PipelineRun:
# <debug_recording_dir>/<device_id>/<pipeline.name>/<run.id>
run_recording_dir = (
Path(debug_recording_dir)
/ device_id
/ self._device_id
/ self.pipeline.name
/ str(time.monotonic_ns())
)
@@ -1096,8 +1120,8 @@ class PipelineRun:
# Not running
return
# Signal thread to stop gracefully
self.debug_recording_queue.put(None)
# NOTE: Expecting a None to have been put in self.debug_recording_queue
# in self.end() to signal the thread to stop.
# Wait until the thread has finished to ensure that files are fully written
await self.hass.async_add_executor_job(self.debug_recording_thread.join)
@@ -1218,6 +1242,8 @@ def _pipeline_debug_recording_thread_proc(
# Chunk of 16-bit mono audio at 16Khz
if wav_writer is not None:
wav_writer.writeframes(message)
except Empty:
pass # occurs when pipeline has unexpected error
except Exception: # pylint: disable=broad-exception-caught
_LOGGER.exception("Unexpected error in debug recording thread")
finally:
@@ -1286,9 +1312,9 @@ class PipelineInput:
if stt_audio_buffer:
# Send audio in the buffer first to speech-to-text, then move on to stt_stream.
# This is basically an async itertools.chain.
async def buffer_then_audio_stream() -> AsyncGenerator[
ProcessedAudioChunk, None
]:
async def buffer_then_audio_stream() -> (
AsyncGenerator[ProcessedAudioChunk, None]
):
# Buffered audio
for chunk in stt_audio_buffer:
yield chunk
@@ -1317,7 +1343,11 @@ class PipelineInput:
self.conversation_id,
self.device_id,
)
current_stage = PipelineStage.TTS
if tts_input.strip():
current_stage = PipelineStage.TTS
else:
# Skip TTS
current_stage = PipelineStage.END
if self.run.end_stage != PipelineStage.INTENT:
# text-to-speech
@@ -1447,7 +1477,7 @@ class PipelineStorageCollection(
@callback
def _get_suggested_id(self, info: dict) -> str:
"""Suggest an ID based on the config."""
return ulid_util.ulid()
return ulid_util.ulid_now()
async def _update_data(self, item: Pipeline, update_data: dict) -> Pipeline:
"""Return a new updated item."""
@@ -1628,6 +1658,20 @@ class PipelineRuns:
pipeline_run.abort_wake_word_detection = True
@dataclass
class DeviceAudioQueue:
"""Audio capture queue for a satellite device."""
queue: asyncio.Queue[bytes | None]
"""Queue of audio chunks (None = stop signal)"""
id: str = field(default_factory=ulid_util.ulid_now)
"""Unique id to ensure the correct audio queue is cleaned up in websocket API."""
overflow: bool = False
"""Flag to be set if audio samples were dropped because the queue was full."""
class PipelineData:
"""Store and debug data stored in hass.data."""
@@ -1637,6 +1681,7 @@ class PipelineData:
self.pipeline_debug: dict[str, LimitedSizeDict[str, PipelineRunDebug]] = {}
self.pipeline_devices: set[str] = set()
self.pipeline_runs = PipelineRuns(pipeline_store)
self.device_audio_queues: dict[str, DeviceAudioQueue] = {}
@dataclass

View File

@@ -93,9 +93,7 @@ class AssistPipelineSelect(SelectEntity, restore_state.RestoreEntity):
if self.registry_entry and (device_id := self.registry_entry.device_id):
pipeline_data.pipeline_devices.add(device_id)
self.async_on_remove(
lambda: pipeline_data.pipeline_devices.discard(
device_id # type: ignore[arg-type]
)
lambda: pipeline_data.pipeline_devices.discard(device_id)
)
async def async_select_option(self, option: str) -> None:

View File

@@ -3,22 +3,31 @@ import asyncio
# Suppressing disable=deprecated-module is needed for Python 3.11
import audioop # pylint: disable=deprecated-module
import base64
from collections.abc import AsyncGenerator, Callable
import contextlib
import logging
from typing import Any
import math
from typing import Any, Final
import voluptuous as vol
from homeassistant.components import conversation, stt, tts, websocket_api
from homeassistant.const import MATCH_ALL
from homeassistant.const import ATTR_DEVICE_ID, ATTR_SECONDS, MATCH_ALL
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import config_validation as cv
from homeassistant.util import language as language_util
from .const import DEFAULT_PIPELINE_TIMEOUT, DEFAULT_WAKE_WORD_TIMEOUT, DOMAIN
from .const import (
DEFAULT_PIPELINE_TIMEOUT,
DEFAULT_WAKE_WORD_TIMEOUT,
DOMAIN,
EVENT_RECORDING,
)
from .error import PipelineNotFound
from .pipeline import (
AudioSettings,
DeviceAudioQueue,
PipelineData,
PipelineError,
PipelineEvent,
@@ -32,6 +41,11 @@ from .pipeline import (
_LOGGER = logging.getLogger(__name__)
CAPTURE_RATE: Final = 16000
CAPTURE_WIDTH: Final = 2
CAPTURE_CHANNELS: Final = 1
MAX_CAPTURE_TIMEOUT: Final = 60.0
@callback
def async_register_websocket_api(hass: HomeAssistant) -> None:
@@ -40,6 +54,7 @@ def async_register_websocket_api(hass: HomeAssistant) -> None:
websocket_api.async_register_command(hass, websocket_list_languages)
websocket_api.async_register_command(hass, websocket_list_runs)
websocket_api.async_register_command(hass, websocket_get_run)
websocket_api.async_register_command(hass, websocket_device_capture)
@websocket_api.websocket_command(
@@ -371,3 +386,100 @@ async def websocket_list_languages(
else pipeline_languages
},
)
@websocket_api.require_admin
@websocket_api.websocket_command(
{
vol.Required("type"): "assist_pipeline/device/capture",
vol.Required("device_id"): str,
vol.Required("timeout"): vol.All(
# 0 < timeout <= MAX_CAPTURE_TIMEOUT
vol.Coerce(float),
vol.Range(min=0, min_included=False, max=MAX_CAPTURE_TIMEOUT),
),
}
)
@websocket_api.async_response
async def websocket_device_capture(
hass: HomeAssistant,
connection: websocket_api.connection.ActiveConnection,
msg: dict[str, Any],
) -> None:
"""Capture raw audio from a satellite device and forward to client."""
pipeline_data: PipelineData = hass.data[DOMAIN]
device_id = msg["device_id"]
# Number of seconds to record audio in wall clock time
timeout_seconds = msg["timeout"]
# We don't know the chunk size, so the upper bound is calculated assuming a
# single sample (16 bits) per queue item.
max_queue_items = (
# +1 for None to signal end
int(math.ceil(timeout_seconds * CAPTURE_RATE)) + 1
)
audio_queue = DeviceAudioQueue(queue=asyncio.Queue(maxsize=max_queue_items))
# Running simultaneous captures for a single device will not work by design.
# The new capture will cause the old capture to stop.
if (
old_audio_queue := pipeline_data.device_audio_queues.pop(device_id, None)
) is not None:
with contextlib.suppress(asyncio.QueueFull):
# Signal other websocket command that we're taking over
old_audio_queue.queue.put_nowait(None)
# Only one client can be capturing audio at a time
pipeline_data.device_audio_queues[device_id] = audio_queue
def clean_up_queue() -> None:
# Clean up our audio queue
maybe_audio_queue = pipeline_data.device_audio_queues.get(device_id)
if (maybe_audio_queue is not None) and (maybe_audio_queue.id == audio_queue.id):
# Only pop if this is our queue
pipeline_data.device_audio_queues.pop(device_id)
# Unsubscribe cleans up queue
connection.subscriptions[msg["id"]] = clean_up_queue
# Audio will follow as events
connection.send_result(msg["id"])
# Record to logbook
hass.bus.async_fire(
EVENT_RECORDING,
{
ATTR_DEVICE_ID: device_id,
ATTR_SECONDS: timeout_seconds,
},
)
try:
with contextlib.suppress(asyncio.TimeoutError):
async with asyncio.timeout(timeout_seconds):
while True:
# Send audio chunks encoded as base64
audio_bytes = await audio_queue.queue.get()
if audio_bytes is None:
# Signal to stop
break
connection.send_event(
msg["id"],
{
"type": "audio",
"rate": CAPTURE_RATE, # hertz
"width": CAPTURE_WIDTH, # bytes
"channels": CAPTURE_CHANNELS,
"audio": base64.b64encode(audio_bytes).decode("ascii"),
},
)
# Capture has ended
connection.send_event(
msg["id"], {"type": "end", "overflow": audio_queue.overflow}
)
finally:
clean_up_queue()

View File

@@ -3,10 +3,14 @@ from __future__ import annotations
from abc import ABC, abstractmethod
from collections import namedtuple
from collections.abc import Awaitable, Callable, Coroutine
import functools
import logging
from typing import Any, cast
from typing import Any, TypeVar, cast
from aioasuswrt.asuswrt import AsusWrt as AsusWrtLegacy
from aiohttp import ClientSession
from pyasuswrt import AsusWrtError, AsusWrtHttp
from homeassistant.const import (
CONF_HOST,
@@ -17,6 +21,7 @@ from homeassistant.const import (
CONF_USERNAME,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.device_registry import format_mac
from homeassistant.helpers.update_coordinator import UpdateFailed
@@ -29,6 +34,8 @@ from .const import (
DEFAULT_INTERFACE,
KEY_METHOD,
KEY_SENSORS,
PROTOCOL_HTTP,
PROTOCOL_HTTPS,
PROTOCOL_TELNET,
SENSORS_BYTES,
SENSORS_LOAD_AVG,
@@ -47,9 +54,42 @@ WrtDevice = namedtuple("WrtDevice", ["ip", "name", "connected_to"])
_LOGGER = logging.getLogger(__name__)
def _get_dict(keys: list, values: list) -> dict[str, Any]:
"""Create a dict from a list of keys and values."""
return dict(zip(keys, values))
_AsusWrtBridgeT = TypeVar("_AsusWrtBridgeT", bound="AsusWrtBridge")
_FuncType = Callable[
[_AsusWrtBridgeT], Awaitable[list[Any] | tuple[Any] | dict[str, Any]]
]
_ReturnFuncType = Callable[[_AsusWrtBridgeT], Coroutine[Any, Any, dict[str, Any]]]
def handle_errors_and_zip(
exceptions: type[Exception] | tuple[type[Exception], ...], keys: list[str] | None
) -> Callable[[_FuncType], _ReturnFuncType]:
"""Run library methods and zip results or manage exceptions."""
def _handle_errors_and_zip(func: _FuncType) -> _ReturnFuncType:
"""Run library methods and zip results or manage exceptions."""
@functools.wraps(func)
async def _wrapper(self: _AsusWrtBridgeT) -> dict[str, Any]:
try:
data = await func(self)
except exceptions as exc:
raise UpdateFailed(exc) from exc
if keys is None:
if not isinstance(data, dict):
raise UpdateFailed("Received invalid data type")
return data
if isinstance(data, dict):
return dict(zip(keys, list(data.values())))
if not isinstance(data, (list, tuple)):
raise UpdateFailed("Received invalid data type")
return dict(zip(keys, data))
return _wrapper
return _handle_errors_and_zip
class AsusWrtBridge(ABC):
@@ -60,6 +100,9 @@ class AsusWrtBridge(ABC):
hass: HomeAssistant, conf: dict[str, Any], options: dict[str, Any] | None = None
) -> AsusWrtBridge:
"""Get Bridge instance."""
if conf[CONF_PROTOCOL] in (PROTOCOL_HTTPS, PROTOCOL_HTTP):
session = async_get_clientsession(hass)
return AsusWrtHttpBridge(conf, session)
return AsusWrtLegacyBridge(conf, options)
def __init__(self, host: str) -> None:
@@ -236,38 +279,135 @@ class AsusWrtLegacyBridge(AsusWrtBridge):
availability = await self._api.async_find_temperature_commands()
return [SENSORS_TEMPERATURES[i] for i in range(3) if availability[i]]
async def _get_bytes(self) -> dict[str, Any]:
@handle_errors_and_zip((IndexError, OSError, ValueError), SENSORS_BYTES)
async def _get_bytes(self) -> Any:
"""Fetch byte information from the router."""
try:
datas = await self._api.async_get_bytes_total()
except (IndexError, OSError, ValueError) as exc:
raise UpdateFailed(exc) from exc
return await self._api.async_get_bytes_total()
return _get_dict(SENSORS_BYTES, datas)
async def _get_rates(self) -> dict[str, Any]:
@handle_errors_and_zip((IndexError, OSError, ValueError), SENSORS_RATES)
async def _get_rates(self) -> Any:
"""Fetch rates information from the router."""
try:
rates = await self._api.async_get_current_transfer_rates()
except (IndexError, OSError, ValueError) as exc:
raise UpdateFailed(exc) from exc
return await self._api.async_get_current_transfer_rates()
return _get_dict(SENSORS_RATES, rates)
async def _get_load_avg(self) -> dict[str, Any]:
@handle_errors_and_zip((IndexError, OSError, ValueError), SENSORS_LOAD_AVG)
async def _get_load_avg(self) -> Any:
"""Fetch load average information from the router."""
try:
avg = await self._api.async_get_loadavg()
except (IndexError, OSError, ValueError) as exc:
raise UpdateFailed(exc) from exc
return await self._api.async_get_loadavg()
return _get_dict(SENSORS_LOAD_AVG, avg)
async def _get_temperatures(self) -> dict[str, Any]:
@handle_errors_and_zip((OSError, ValueError), None)
async def _get_temperatures(self) -> Any:
"""Fetch temperatures information from the router."""
try:
temperatures: dict[str, Any] = await self._api.async_get_temperature()
except (OSError, ValueError) as exc:
raise UpdateFailed(exc) from exc
return await self._api.async_get_temperature()
return temperatures
class AsusWrtHttpBridge(AsusWrtBridge):
"""The Bridge that use HTTP library."""
def __init__(self, conf: dict[str, Any], session: ClientSession) -> None:
"""Initialize Bridge that use HTTP library."""
super().__init__(conf[CONF_HOST])
self._api: AsusWrtHttp = self._get_api(conf, session)
@staticmethod
def _get_api(conf: dict[str, Any], session: ClientSession) -> AsusWrtHttp:
"""Get the AsusWrtHttp API."""
return AsusWrtHttp(
conf[CONF_HOST],
conf[CONF_USERNAME],
conf.get(CONF_PASSWORD, ""),
use_https=conf[CONF_PROTOCOL] == PROTOCOL_HTTPS,
port=conf.get(CONF_PORT),
session=session,
)
@property
def is_connected(self) -> bool:
"""Get connected status."""
return cast(bool, self._api.is_connected)
async def async_connect(self) -> None:
"""Connect to the device."""
await self._api.async_connect()
# get main router properties
if mac := self._api.mac:
self._label_mac = format_mac(mac)
self._firmware = self._api.firmware
self._model = self._api.model
async def async_disconnect(self) -> None:
"""Disconnect to the device."""
await self._api.async_disconnect()
async def async_get_connected_devices(self) -> dict[str, WrtDevice]:
"""Get list of connected devices."""
try:
api_devices = await self._api.async_get_connected_devices()
except AsusWrtError as exc:
raise UpdateFailed(exc) from exc
return {
format_mac(mac): WrtDevice(dev.ip, dev.name, dev.node)
for mac, dev in api_devices.items()
}
async def async_get_available_sensors(self) -> dict[str, dict[str, Any]]:
"""Return a dictionary of available sensors for this bridge."""
sensors_temperatures = await self._get_available_temperature_sensors()
sensors_types = {
SENSORS_TYPE_BYTES: {
KEY_SENSORS: SENSORS_BYTES,
KEY_METHOD: self._get_bytes,
},
SENSORS_TYPE_LOAD_AVG: {
KEY_SENSORS: SENSORS_LOAD_AVG,
KEY_METHOD: self._get_load_avg,
},
SENSORS_TYPE_RATES: {
KEY_SENSORS: SENSORS_RATES,
KEY_METHOD: self._get_rates,
},
SENSORS_TYPE_TEMPERATURES: {
KEY_SENSORS: sensors_temperatures,
KEY_METHOD: self._get_temperatures,
},
}
return sensors_types
async def _get_available_temperature_sensors(self) -> list[str]:
"""Check which temperature information is available on the router."""
try:
available_temps = await self._api.async_get_temperatures()
available_sensors = [
t for t in SENSORS_TEMPERATURES if t in available_temps
]
except AsusWrtError as exc:
_LOGGER.warning(
(
"Failed checking temperature sensor availability for ASUS router"
" %s. Exception: %s"
),
self.host,
exc,
)
return []
return available_sensors
@handle_errors_and_zip(AsusWrtError, SENSORS_BYTES)
async def _get_bytes(self) -> Any:
"""Fetch byte information from the router."""
return await self._api.async_get_traffic_bytes()
@handle_errors_and_zip(AsusWrtError, SENSORS_RATES)
async def _get_rates(self) -> Any:
"""Fetch rates information from the router."""
return await self._api.async_get_traffic_rates()
@handle_errors_and_zip(AsusWrtError, SENSORS_LOAD_AVG)
async def _get_load_avg(self) -> Any:
"""Fetch cpu load avg information from the router."""
return await self._api.async_get_loadavg()
@handle_errors_and_zip(AsusWrtError, None)
async def _get_temperatures(self) -> Any:
"""Fetch temperatures information from the router."""
return await self._api.async_get_temperatures()

View File

@@ -7,6 +7,7 @@ import os
import socket
from typing import Any, cast
from pyasuswrt import AsusWrtError
import voluptuous as vol
from homeassistant.components.device_tracker import (
@@ -15,6 +16,7 @@ from homeassistant.components.device_tracker import (
)
from homeassistant.config_entries import ConfigEntry, ConfigFlow
from homeassistant.const import (
CONF_BASE,
CONF_HOST,
CONF_MODE,
CONF_PASSWORD,
@@ -30,6 +32,7 @@ from homeassistant.helpers.schema_config_entry_flow import (
SchemaFlowFormStep,
SchemaOptionsFlowHandler,
)
from homeassistant.helpers.selector import SelectSelector, SelectSelectorConfig
from .bridge import AsusWrtBridge
from .const import (
@@ -44,11 +47,21 @@ from .const import (
DOMAIN,
MODE_AP,
MODE_ROUTER,
PROTOCOL_HTTP,
PROTOCOL_HTTPS,
PROTOCOL_SSH,
PROTOCOL_TELNET,
)
LABEL_MAC = "LABEL_MAC"
ALLOWED_PROTOCOL = [
PROTOCOL_HTTPS,
PROTOCOL_SSH,
PROTOCOL_HTTP,
PROTOCOL_TELNET,
]
PASS_KEY = "pass_key"
PASS_KEY_MSG = "Only provide password or SSH key file"
RESULT_CONN_ERROR = "cannot_connect"
RESULT_SUCCESS = "success"
@@ -56,14 +69,20 @@ RESULT_UNKNOWN = "unknown"
_LOGGER = logging.getLogger(__name__)
LEGACY_SCHEMA = vol.Schema(
{
vol.Required(CONF_MODE, default=MODE_ROUTER): vol.In(
{MODE_ROUTER: "Router", MODE_AP: "Access Point"}
),
}
)
OPTIONS_SCHEMA = vol.Schema(
{
vol.Optional(
CONF_CONSIDER_HOME, default=DEFAULT_CONSIDER_HOME.total_seconds()
): vol.All(vol.Coerce(int), vol.Clamp(min=0, max=900)),
vol.Optional(CONF_TRACK_UNKNOWN, default=DEFAULT_TRACK_UNKNOWN): bool,
vol.Required(CONF_INTERFACE, default=DEFAULT_INTERFACE): str,
vol.Required(CONF_DNSMASQ, default=DEFAULT_DNSMASQ): str,
}
)
@@ -72,12 +91,22 @@ async def get_options_schema(handler: SchemaCommonFlowHandler) -> vol.Schema:
"""Get options schema."""
options_flow: SchemaOptionsFlowHandler
options_flow = cast(SchemaOptionsFlowHandler, handler.parent_handler)
if options_flow.config_entry.data[CONF_MODE] == MODE_AP:
return OPTIONS_SCHEMA.extend(
used_protocol = options_flow.config_entry.data[CONF_PROTOCOL]
if used_protocol in [PROTOCOL_SSH, PROTOCOL_TELNET]:
data_schema = OPTIONS_SCHEMA.extend(
{
vol.Optional(CONF_REQUIRE_IP, default=True): bool,
vol.Required(CONF_INTERFACE, default=DEFAULT_INTERFACE): str,
vol.Required(CONF_DNSMASQ, default=DEFAULT_DNSMASQ): str,
}
)
if options_flow.config_entry.data[CONF_MODE] == MODE_AP:
return data_schema.extend(
{
vol.Optional(CONF_REQUIRE_IP, default=True): bool,
}
)
return data_schema
return OPTIONS_SCHEMA
@@ -101,45 +130,47 @@ def _get_ip(host: str) -> str | None:
class AsusWrtFlowHandler(ConfigFlow, domain=DOMAIN):
"""Handle a config flow."""
"""Handle a config flow for AsusWRT."""
VERSION = 1
def __init__(self) -> None:
"""Initialize the AsusWrt config flow."""
self._config_data: dict[str, Any] = {}
@callback
def _show_setup_form(
self,
user_input: dict[str, Any] | None = None,
errors: dict[str, str] | None = None,
) -> FlowResult:
def _show_setup_form(self, error: str | None = None) -> FlowResult:
"""Show the setup form to the user."""
if user_input is None:
user_input = {}
user_input = self._config_data
adv_schema = {}
conf_password = vol.Required(CONF_PASSWORD)
if self.show_advanced_options:
conf_password = vol.Optional(CONF_PASSWORD)
adv_schema[vol.Optional(CONF_PORT)] = cv.port
adv_schema[vol.Optional(CONF_SSH_KEY)] = str
add_schema = {
vol.Exclusive(CONF_PASSWORD, PASS_KEY, PASS_KEY_MSG): str,
vol.Optional(CONF_PORT): cv.port,
vol.Exclusive(CONF_SSH_KEY, PASS_KEY, PASS_KEY_MSG): str,
}
else:
add_schema = {vol.Required(CONF_PASSWORD): str}
schema = {
vol.Required(CONF_HOST, default=user_input.get(CONF_HOST, "")): str,
vol.Required(CONF_USERNAME, default=user_input.get(CONF_USERNAME, "")): str,
conf_password: str,
vol.Required(CONF_PROTOCOL, default=PROTOCOL_SSH): vol.In(
{PROTOCOL_SSH: "SSH", PROTOCOL_TELNET: "Telnet"}
),
**adv_schema,
vol.Required(CONF_MODE, default=MODE_ROUTER): vol.In(
{MODE_ROUTER: "Router", MODE_AP: "Access Point"}
**add_schema,
vol.Required(
CONF_PROTOCOL,
default=user_input.get(CONF_PROTOCOL, PROTOCOL_HTTPS),
): SelectSelector(
SelectSelectorConfig(
options=ALLOWED_PROTOCOL, translation_key="protocols"
)
),
}
return self.async_show_form(
step_id="user",
data_schema=vol.Schema(schema),
errors=errors or {},
errors={CONF_BASE: error} if error else None,
)
async def _async_check_connection(
@@ -147,25 +178,49 @@ class AsusWrtFlowHandler(ConfigFlow, domain=DOMAIN):
) -> tuple[str, str | None]:
"""Attempt to connect the AsusWrt router."""
api: AsusWrtBridge
host: str = user_input[CONF_HOST]
api = AsusWrtBridge.get_bridge(self.hass, user_input)
protocol = user_input[CONF_PROTOCOL]
error: str | None = None
conf = {**user_input, CONF_MODE: MODE_ROUTER}
api = AsusWrtBridge.get_bridge(self.hass, conf)
try:
await api.async_connect()
except OSError:
_LOGGER.error("Error connecting to the AsusWrt router at %s", host)
return RESULT_CONN_ERROR, None
except (AsusWrtError, OSError):
_LOGGER.error(
"Error connecting to the AsusWrt router at %s using protocol %s",
host,
protocol,
)
error = RESULT_CONN_ERROR
except Exception: # pylint: disable=broad-except
_LOGGER.exception(
"Unknown error connecting with AsusWrt router at %s", host
"Unknown error connecting with AsusWrt router at %s using protocol %s",
host,
protocol,
)
return RESULT_UNKNOWN, None
error = RESULT_UNKNOWN
if not api.is_connected:
_LOGGER.error("Error connecting to the AsusWrt router at %s", host)
return RESULT_CONN_ERROR, None
if error is None:
if not api.is_connected:
_LOGGER.error(
"Error connecting to the AsusWrt router at %s using protocol %s",
host,
protocol,
)
error = RESULT_CONN_ERROR
if error is not None:
return error, None
_LOGGER.info(
"Successfully connected to the AsusWrt router at %s using protocol %s",
host,
protocol,
)
unique_id = api.label_mac
await api.async_disconnect()
@@ -182,51 +237,59 @@ class AsusWrtFlowHandler(ConfigFlow, domain=DOMAIN):
return self.async_abort(reason="no_unique_id")
if user_input is None:
return self._show_setup_form(user_input)
errors: dict[str, str] = {}
host: str = user_input[CONF_HOST]
return self._show_setup_form()
self._config_data = user_input
pwd: str | None = user_input.get(CONF_PASSWORD)
ssh: str | None = user_input.get(CONF_SSH_KEY)
protocol: str = user_input[CONF_PROTOCOL]
if not pwd and protocol != PROTOCOL_SSH:
return self._show_setup_form(error="pwd_required")
if not (pwd or ssh):
errors["base"] = "pwd_or_ssh"
elif ssh:
if pwd:
errors["base"] = "pwd_and_ssh"
return self._show_setup_form(error="pwd_or_ssh")
if ssh and not await self.hass.async_add_executor_job(_is_file, ssh):
return self._show_setup_form(error="ssh_not_file")
host: str = user_input[CONF_HOST]
if not await self.hass.async_add_executor_job(_get_ip, host):
return self._show_setup_form(error="invalid_host")
result, unique_id = await self._async_check_connection(user_input)
if result == RESULT_SUCCESS:
if unique_id:
await self.async_set_unique_id(unique_id)
# we allow to configure a single instance without unique id
elif self._async_current_entries():
return self.async_abort(reason="invalid_unique_id")
else:
isfile = await self.hass.async_add_executor_job(_is_file, ssh)
if not isfile:
errors["base"] = "ssh_not_file"
if not errors:
ip_address = await self.hass.async_add_executor_job(_get_ip, host)
if not ip_address:
errors["base"] = "invalid_host"
if not errors:
result, unique_id = await self._async_check_connection(user_input)
if result == RESULT_SUCCESS:
if unique_id:
await self.async_set_unique_id(unique_id)
# we allow configure a single instance without unique id
elif self._async_current_entries():
return self.async_abort(reason="invalid_unique_id")
else:
_LOGGER.warning(
"This device does not provide a valid Unique ID."
" Configuration of multiple instance will not be possible"
)
return self.async_create_entry(
title=host,
data=user_input,
_LOGGER.warning(
"This device does not provide a valid Unique ID."
" Configuration of multiple instance will not be possible"
)
errors["base"] = result
if protocol in [PROTOCOL_SSH, PROTOCOL_TELNET]:
return await self.async_step_legacy()
return await self._async_save_entry()
return self._show_setup_form(user_input, errors)
return self._show_setup_form(error=result)
async def async_step_legacy(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Handle a flow for legacy settings."""
if user_input is None:
return self.async_show_form(step_id="legacy", data_schema=LEGACY_SCHEMA)
self._config_data.update(user_input)
return await self._async_save_entry()
async def _async_save_entry(self) -> FlowResult:
"""Save entry data if unique id is valid."""
return self.async_create_entry(
title=self._config_data[CONF_HOST],
data=self._config_data,
)
@staticmethod
@callback

View File

@@ -20,6 +20,8 @@ KEY_SENSORS = "sensors"
MODE_AP = "ap"
MODE_ROUTER = "router"
PROTOCOL_HTTP = "http"
PROTOCOL_HTTPS = "https"
PROTOCOL_SSH = "ssh"
PROTOCOL_TELNET = "telnet"

View File

@@ -36,7 +36,7 @@ async def async_get_config_entry_diagnostics(
device_registry = dr.async_get(hass)
entity_registry = er.async_get(hass)
hass_device = device_registry.async_get_device(
identifiers=router.device_info["identifiers"]
identifiers=router.device_info[ATTR_IDENTIFIERS]
)
if not hass_device:
return data

View File

@@ -7,5 +7,5 @@
"integration_type": "hub",
"iot_class": "local_polling",
"loggers": ["aioasuswrt", "asyncssh"],
"requirements": ["aioasuswrt==1.4.0"]
"requirements": ["aioasuswrt==1.4.0", "pyasuswrt==0.1.20"]
}

View File

@@ -6,6 +6,8 @@ from datetime import datetime, timedelta
import logging
from typing import Any
from pyasuswrt import AsusWrtError
from homeassistant.components.device_tracker import (
CONF_CONSIDER_HOME,
DEFAULT_CONSIDER_HOME,
@@ -219,7 +221,7 @@ class AsusWrtRouter:
"""Set up a AsusWrt router."""
try:
await self._api.async_connect()
except OSError as exc:
except (AsusWrtError, OSError) as exc:
raise ConfigEntryNotReady from exc
if not self._api.is_connected:
raise ConfigEntryNotReady

View File

@@ -2,25 +2,31 @@
"config": {
"step": {
"user": {
"title": "AsusWRT",
"description": "Set required parameter to connect to your router",
"data": {
"host": "[%key:common::config_flow::data::host%]",
"name": "[%key:common::config_flow::data::name%]",
"username": "[%key:common::config_flow::data::username%]",
"password": "[%key:common::config_flow::data::password%]",
"ssh_key": "Path to your SSH key file (instead of password)",
"protocol": "Communication protocol to use",
"port": "Port (leave empty for protocol default)",
"mode": "[%key:common::config_flow::data::mode%]"
"port": "Port (leave empty for protocol default)"
},
"data_description": {
"host": "The hostname or IP address of your ASUSWRT router."
}
},
"legacy": {
"description": "Set required parameters to connect to your router",
"data": {
"mode": "Router operating mode"
}
}
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_host": "[%key:common::config_flow::error::invalid_host%]",
"pwd_and_ssh": "Only provide password or SSH key file",
"pwd_or_ssh": "Please provide password or SSH key file",
"pwd_required": "Password is required for selected protocol",
"ssh_not_file": "SSH key file not found",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
@@ -32,7 +38,6 @@
"options": {
"step": {
"init": {
"title": "AsusWRT Options",
"data": {
"consider_home": "Seconds to wait before considering a device away",
"track_unknown": "Track unknown / unnamed devices",
@@ -79,5 +84,15 @@
"name": "CPU Temperature"
}
}
},
"selector": {
"protocols": {
"options": {
"https": "HTTPS",
"http": "HTTP",
"ssh": "SSH",
"telnet": "Telnet"
}
}
}
}

View File

@@ -2,10 +2,13 @@
"config": {
"step": {
"user": {
"title": "Connect to the device",
"description": "Connect to the device",
"data": {
"host": "[%key:common::config_flow::data::host%]",
"port": "[%key:common::config_flow::data::port%]"
},
"data_description": {
"host": "The hostname or IP address of the Atag device."
}
}
},

View File

@@ -2,10 +2,12 @@
from abc import abstractmethod
from yalexs.doorbell import Doorbell
from yalexs.lock import Lock
from yalexs.lock import Lock, LockDetail
from yalexs.util import get_configuration_url
from homeassistant.const import ATTR_CONNECTIONS
from homeassistant.core import callback
from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity import Entity
@@ -26,15 +28,18 @@ class AugustEntityMixin(Entity):
super().__init__()
self._data = data
self._device = device
detail = self._detail
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, self._device_id)},
manufacturer=MANUFACTURER,
model=self._detail.model,
model=detail.model,
name=device.device_name,
sw_version=self._detail.firmware_version,
sw_version=detail.firmware_version,
suggested_area=_remove_device_types(device.device_name, DEVICE_TYPES),
configuration_url=get_configuration_url(data.brand),
)
if isinstance(detail, LockDetail) and (mac := detail.mac_address):
self._attr_device_info[ATTR_CONNECTIONS] = {(dr.CONNECTION_BLUETOOTH, mac)}
@property
def _device_id(self):

View File

@@ -12,13 +12,14 @@
import logging
from aurorapy.client import AuroraSerialClient
from aurorapy.client import AuroraError, AuroraSerialClient, AuroraTimeoutError
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_ADDRESS, CONF_PORT, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from .const import DOMAIN
from .const import DOMAIN, SCAN_INTERVAL
PLATFORMS = [Platform.SENSOR]
@@ -30,8 +31,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
comport = entry.data[CONF_PORT]
address = entry.data[CONF_ADDRESS]
ser_client = AuroraSerialClient(address, comport, parity="N", timeout=1)
hass.data.setdefault(DOMAIN, {})[entry.entry_id] = ser_client
coordinator = AuroraAbbDataUpdateCoordinator(hass, comport, address)
await coordinator.async_config_entry_first_refresh()
hass.data.setdefault(DOMAIN, {})[entry.entry_id] = coordinator
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
return True
@@ -47,3 +50,58 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
hass.data[DOMAIN].pop(entry.entry_id)
return unload_ok
class AuroraAbbDataUpdateCoordinator(DataUpdateCoordinator[dict[str, float]]):
"""Class to manage fetching AuroraAbbPowerone data."""
def __init__(self, hass: HomeAssistant, comport: str, address: int) -> None:
"""Initialize the data update coordinator."""
self.available_prev = False
self.available = False
self.client = AuroraSerialClient(address, comport, parity="N", timeout=1)
super().__init__(hass, _LOGGER, name=DOMAIN, update_interval=SCAN_INTERVAL)
def _update_data(self) -> dict[str, float]:
"""Fetch new state data for the sensor.
This is the only function that should fetch new data for Home Assistant.
"""
data: dict[str, float] = {}
self.available_prev = self.available
try:
self.client.connect()
# read ADC channel 3 (grid power output)
power_watts = self.client.measure(3, True)
temperature_c = self.client.measure(21)
energy_wh = self.client.cumulated_energy(5)
except AuroraTimeoutError:
self.available = False
_LOGGER.debug("No response from inverter (could be dark)")
except AuroraError as error:
self.available = False
raise error
else:
data["instantaneouspower"] = round(power_watts, 1)
data["temp"] = round(temperature_c, 1)
data["totalenergy"] = round(energy_wh / 1000, 2)
self.available = True
finally:
if self.available != self.available_prev:
if self.available:
_LOGGER.info("Communication with %s back online", self.name)
else:
_LOGGER.warning(
"Communication with %s lost",
self.name,
)
if self.client.serline.isOpen():
self.client.close()
return data
async def _async_update_data(self) -> dict[str, float]:
"""Update inverter data in the executor."""
return await self.hass.async_add_executor_job(self._update_data)

View File

@@ -1,57 +0,0 @@
"""Top level class for AuroraABBPowerOneSolarPV inverters and sensors."""
from __future__ import annotations
from collections.abc import Mapping
import logging
from typing import Any
from aurorapy.client import AuroraSerialClient
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity import Entity
from .const import (
ATTR_DEVICE_NAME,
ATTR_FIRMWARE,
ATTR_MODEL,
ATTR_SERIAL_NUMBER,
DEFAULT_DEVICE_NAME,
DOMAIN,
MANUFACTURER,
)
_LOGGER = logging.getLogger(__name__)
class AuroraEntity(Entity):
"""Representation of an Aurora ABB PowerOne device."""
def __init__(self, client: AuroraSerialClient, data: Mapping[str, Any]) -> None:
"""Initialise the basic device."""
self._data = data
self.type = "device"
self.client = client
self._available = True
@property
def unique_id(self) -> str | None:
"""Return the unique id for this device."""
if (serial := self._data.get(ATTR_SERIAL_NUMBER)) is None:
return None
return f"{serial}_{self.entity_description.key}"
@property
def available(self) -> bool:
"""Return True if entity is available."""
return self._available
@property
def device_info(self) -> DeviceInfo:
"""Return device specific attributes."""
return DeviceInfo(
identifiers={(DOMAIN, self._data[ATTR_SERIAL_NUMBER])},
manufacturer=MANUFACTURER,
model=self._data[ATTR_MODEL],
name=self._data.get(ATTR_DEVICE_NAME, DEFAULT_DEVICE_NAME),
sw_version=self._data[ATTR_FIRMWARE],
)

View File

@@ -1,5 +1,7 @@
"""Constants for the Aurora ABB PowerOne integration."""
from datetime import timedelta
DOMAIN = "aurora_abb_powerone"
# Min max addresses and default according to here:
@@ -8,6 +10,7 @@ DOMAIN = "aurora_abb_powerone"
MIN_ADDRESS = 2
MAX_ADDRESS = 63
DEFAULT_ADDRESS = 2
SCAN_INTERVAL = timedelta(seconds=30)
DEFAULT_INTEGRATION_TITLE = "PhotoVoltaic Inverters"
DEFAULT_DEVICE_NAME = "Solar Inverter"

View File

@@ -5,8 +5,6 @@ from collections.abc import Mapping
import logging
from typing import Any
from aurorapy.client import AuroraError, AuroraSerialClient, AuroraTimeoutError
from homeassistant.components.sensor import (
SensorDeviceClass,
SensorEntity,
@@ -21,10 +19,21 @@ from homeassistant.const import (
UnitOfTemperature,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import StateType
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .aurora_device import AuroraEntity
from .const import DOMAIN
from . import AuroraAbbDataUpdateCoordinator
from .const import (
ATTR_DEVICE_NAME,
ATTR_FIRMWARE,
ATTR_MODEL,
ATTR_SERIAL_NUMBER,
DEFAULT_DEVICE_NAME,
DOMAIN,
MANUFACTURER,
)
_LOGGER = logging.getLogger(__name__)
@@ -61,70 +70,40 @@ async def async_setup_entry(
"""Set up aurora_abb_powerone sensor based on a config entry."""
entities = []
client = hass.data[DOMAIN][config_entry.entry_id]
coordinator = hass.data[DOMAIN][config_entry.entry_id]
data = config_entry.data
for sens in SENSOR_TYPES:
entities.append(AuroraSensor(client, data, sens))
entities.append(AuroraSensor(coordinator, data, sens))
_LOGGER.debug("async_setup_entry adding %d entities", len(entities))
async_add_entities(entities, True)
class AuroraSensor(AuroraEntity, SensorEntity):
"""Representation of a Sensor on a Aurora ABB PowerOne Solar inverter."""
class AuroraSensor(CoordinatorEntity[AuroraAbbDataUpdateCoordinator], SensorEntity):
"""Representation of a Sensor on an Aurora ABB PowerOne Solar inverter."""
_attr_has_entity_name = True
def __init__(
self,
client: AuroraSerialClient,
coordinator: AuroraAbbDataUpdateCoordinator,
data: Mapping[str, Any],
entity_description: SensorEntityDescription,
) -> None:
"""Initialize the sensor."""
super().__init__(client, data)
super().__init__(coordinator)
self.entity_description = entity_description
self.available_prev = True
self._attr_unique_id = f"{data[ATTR_SERIAL_NUMBER]}_{entity_description.key}"
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, data[ATTR_SERIAL_NUMBER])},
manufacturer=MANUFACTURER,
model=data[ATTR_MODEL],
name=data.get(ATTR_DEVICE_NAME, DEFAULT_DEVICE_NAME),
sw_version=data[ATTR_FIRMWARE],
)
def update(self) -> None:
"""Fetch new state data for the sensor.
This is the only method that should fetch new data for Home Assistant.
"""
try:
self.available_prev = self._attr_available
self.client.connect()
if self.entity_description.key == "instantaneouspower":
# read ADC channel 3 (grid power output)
power_watts = self.client.measure(3, True)
self._attr_native_value = round(power_watts, 1)
elif self.entity_description.key == "temp":
temperature_c = self.client.measure(21)
self._attr_native_value = round(temperature_c, 1)
elif self.entity_description.key == "totalenergy":
energy_wh = self.client.cumulated_energy(5)
self._attr_native_value = round(energy_wh / 1000, 2)
self._attr_available = True
except AuroraTimeoutError:
self._attr_state = None
self._attr_native_value = None
self._attr_available = False
_LOGGER.debug("No response from inverter (could be dark)")
except AuroraError as error:
self._attr_state = None
self._attr_native_value = None
self._attr_available = False
raise error
finally:
if self._attr_available != self.available_prev:
if self._attr_available:
_LOGGER.info("Communication with %s back online", self.name)
else:
_LOGGER.warning(
"Communication with %s lost",
self.name,
)
if self.client.serline.isOpen():
self.client.close()
@property
def native_value(self) -> StateType:
"""Get the value of the sensor from previously collected data."""
return self.coordinator.data.get(self.entity_description.key)

View File

@@ -71,14 +71,14 @@ from __future__ import annotations
from collections.abc import Callable
from http import HTTPStatus
from ipaddress import ip_address
from typing import TYPE_CHECKING, Any
from typing import TYPE_CHECKING, Any, cast
from aiohttp import web
import voluptuous as vol
import voluptuous_serialize
from homeassistant import data_entry_flow
from homeassistant.auth import AuthManagerFlowManager
from homeassistant.auth import AuthManagerFlowManager, InvalidAuthError
from homeassistant.auth.models import Credentials
from homeassistant.components import onboarding
from homeassistant.components.http.auth import async_user_not_allowed_do_auth
@@ -90,10 +90,16 @@ from homeassistant.components.http.ban import (
from homeassistant.components.http.data_validator import RequestDataValidator
from homeassistant.components.http.view import HomeAssistantView
from homeassistant.core import HomeAssistant
from homeassistant.helpers.network import is_cloud_connection
from homeassistant.util.network import is_local
from . import indieauth
if TYPE_CHECKING:
from homeassistant.auth.providers.trusted_networks import (
TrustedNetworksAuthProvider,
)
from . import StoreResultType
@@ -146,12 +152,61 @@ class AuthProvidersView(HomeAssistantView):
message_code="onboarding_required",
)
return self.json(
[
{"name": provider.name, "id": provider.id, "type": provider.type}
for provider in hass.auth.auth_providers
]
)
try:
remote_address = ip_address(request.remote) # type: ignore[arg-type]
except ValueError:
return self.json_message(
message="Invalid remote IP",
status_code=HTTPStatus.BAD_REQUEST,
message_code="invalid_remote_ip",
)
cloud_connection = is_cloud_connection(hass)
providers = []
for provider in hass.auth.auth_providers:
additional_data = {}
if provider.type == "trusted_networks":
if cloud_connection:
# Skip quickly as trusted networks are not available on cloud
continue
try:
cast("TrustedNetworksAuthProvider", provider).async_validate_access(
remote_address
)
except InvalidAuthError:
# Not a trusted network, so we don't expose that trusted_network authenticator is setup
continue
elif (
provider.type == "homeassistant"
and not cloud_connection
and is_local(remote_address)
and "person" in hass.config.components
):
# We are local, return user id and username
users = await provider.store.async_get_users()
additional_data["users"] = {
user.id: credentials.data["username"]
for user in users
for credentials in user.credentials
if (
credentials.auth_provider_type == provider.type
and credentials.auth_provider_id == provider.id
)
}
providers.append(
{
"name": provider.name,
"id": provider.id,
"type": provider.type,
**additional_data,
}
)
return self.json(providers)
def _prepare_result_json(
@@ -235,7 +290,7 @@ class LoginFlowBaseView(HomeAssistantView):
f"Login blocked: {user_access_error}", HTTPStatus.FORBIDDEN
)
await process_success_login(request)
process_success_login(request)
result["result"] = self._store_result(client_id, result_obj)
return self.json(result)

View File

@@ -31,5 +31,11 @@
"invalid_code": "Invalid code, please try again."
}
}
},
"issues": {
"deprecated_legacy_api_password": {
"title": "The legacy API password is deprecated",
"description": "The legacy API password authentication provider is deprecated and will be removed. Please remove it from your YAML configuration and use the default Home Assistant authentication provider instead."
}
}
}

View File

@@ -1,5 +1,6 @@
"""Helpers for automation integration."""
from homeassistant.components import blueprint
from homeassistant.const import SERVICE_RELOAD
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.singleton import singleton
@@ -15,8 +16,17 @@ def _blueprint_in_use(hass: HomeAssistant, blueprint_path: str) -> bool:
return len(automations_with_blueprint(hass, blueprint_path)) > 0
async def _reload_blueprint_automations(
hass: HomeAssistant, blueprint_path: str
) -> None:
"""Reload all automations that rely on a specific blueprint."""
await hass.services.async_call(DOMAIN, SERVICE_RELOAD)
@singleton(DATA_BLUEPRINTS)
@callback
def async_get_blueprints(hass: HomeAssistant) -> blueprint.DomainBlueprints:
"""Get automation blueprints."""
return blueprint.DomainBlueprints(hass, DOMAIN, LOGGER, _blueprint_in_use)
return blueprint.DomainBlueprints(
hass, DOMAIN, LOGGER, _blueprint_in_use, _reload_blueprint_automations
)

View File

@@ -3,12 +3,16 @@
"flow_title": "{name} ({host})",
"step": {
"user": {
"title": "Set up Axis device",
"description": "Set up an Axis device",
"data": {
"host": "[%key:common::config_flow::data::host%]",
"username": "[%key:common::config_flow::data::username%]",
"password": "[%key:common::config_flow::data::password%]",
"port": "[%key:common::config_flow::data::port%]"
},
"data_description": {
"host": "The hostname or IP address of the Axis device.",
"username": "The user name you set up on your Axis device. It is recommended to create a user specifically for Home Assistant."
}
}
},

View File

@@ -93,8 +93,6 @@ class BAFFan(BAFEntity, FanEntity):
async def async_set_preset_mode(self, preset_mode: str) -> None:
"""Set the preset mode of the fan."""
if preset_mode != PRESET_MODE_AUTO:
raise ValueError(f"Invalid preset mode: {preset_mode}")
self._device.fan_mode = OffOnAuto.AUTO
async def async_set_direction(self, direction: str) -> None:

View File

@@ -47,31 +47,27 @@ class BalboaBinarySensorEntityDescription(
):
"""A class that describes Balboa binary sensor entities."""
# BalboaBinarySensorEntity does not support UNDEFINED or None,
# restrict the type to str.
name: str = ""
FILTER_CYCLE_ICONS = ("mdi:sync", "mdi:sync-off")
BINARY_SENSOR_DESCRIPTIONS = (
BalboaBinarySensorEntityDescription(
key="filter_cycle_1",
name="Filter1",
key="Filter1",
translation_key="filter_1",
device_class=BinarySensorDeviceClass.RUNNING,
is_on_fn=lambda spa: spa.filter_cycle_1_running,
on_off_icons=FILTER_CYCLE_ICONS,
),
BalboaBinarySensorEntityDescription(
key="filter_cycle_2",
name="Filter2",
key="Filter2",
translation_key="filter_2",
device_class=BinarySensorDeviceClass.RUNNING,
is_on_fn=lambda spa: spa.filter_cycle_2_running,
on_off_icons=FILTER_CYCLE_ICONS,
),
)
CIRCULATION_PUMP_DESCRIPTION = BalboaBinarySensorEntityDescription(
key="circulation_pump",
name="Circ Pump",
key="Circ Pump",
translation_key="circ_pump",
device_class=BinarySensorDeviceClass.RUNNING,
is_on_fn=lambda spa: (pump := spa.circulation_pump) is not None and pump.state > 0,
on_off_icons=("mdi:pump", "mdi:pump-off"),
@@ -87,7 +83,7 @@ class BalboaBinarySensorEntity(BalboaEntity, BinarySensorEntity):
self, spa: SpaClient, description: BalboaBinarySensorEntityDescription
) -> None:
"""Initialize a Balboa binary sensor entity."""
super().__init__(spa, description.name)
super().__init__(spa, description.key)
self.entity_description = description
@property

View File

@@ -59,6 +59,7 @@ class BalboaClimateEntity(BalboaEntity, ClimateEntity):
ClimateEntityFeature.TARGET_TEMPERATURE | ClimateEntityFeature.PRESET_MODE
)
_attr_translation_key = DOMAIN
_attr_name = None
def __init__(self, client: SpaClient) -> None:
"""Initialize the climate entity."""

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