Compare commits

...

857 Commits

Author SHA1 Message Date
Franck Nijhof
85fb4a27a3 Bump version to 2024.4.0b6 2024-04-02 17:35:01 +02:00
Bram Kragten
8cbedbe26b Update frontend to 20240402.1 (#114646) 2024-04-02 17:34:29 +02:00
Steven B
5bd52da13a Bump ring_doorbell integration to 0.8.9 (#114631) 2024-04-02 17:33:24 +02:00
dotvav
d53848aae4 Fix Overkiz Hitachi OVP air-to-air heat pump (#114611) 2024-04-02 17:23:51 +02:00
puddly
4e0d6f287e Reduce ZHA OTA logbook entries and extraneous updates (#114591) 2024-04-02 17:23:45 +02:00
Franck Nijhof
5af5f3694e Bump version to 2024.4.0b5 2024-04-02 12:28:20 +02:00
Bram Kragten
b539b25682 Update frontend to 20240402.0 (#114627) 2024-04-02 12:28:07 +02:00
Fexiven
ca31479d29 Fix Starlink integration startup issue (#114615) 2024-04-02 12:28:04 +02:00
Franck Nijhof
92dfec3c98 Add floor selector (#114614) 2024-04-02 12:28:00 +02:00
max2697
230c29edbe Bump opower to 0.4.2 (#114608) 2024-04-02 12:27:57 +02:00
Jack Boswell
559fe65471 Catch potential ValueError when getting or setting Starlink sleep values (#114607) 2024-04-02 12:27:54 +02:00
mkmer
384d10a51d Add diagnostic platform to Whirlpool (#114578)
* Add diagnostic platform and tests

* lowercase variable

* Correc doc string
2024-04-02 12:27:50 +02:00
Brett Adams
e5a620545c Fix battery heater in Tessie (#114568) 2024-04-02 12:27:47 +02:00
Maciej Bieniek
7b84e86f89 Improve Shelly RPC device update progress (#114566)
Co-authored-by: Shay Levy <levyshay1@gmail.com>
Co-authored-by: Maciej Bieniek <478555+bieniu@users.noreply.github.com>
2024-04-02 12:27:44 +02:00
Joost Lekkerkerker
18b6de567d Bump roombapy to 1.8.1 (#114478)
* Bump roombapy to 1.7.0

* Bump

* Bump

* Fix
2024-04-02 12:27:40 +02:00
Pete Sage
a6076a0d33 Display sonos album title with URL encoding (#113693)
* unescape the title

When extracting the title from the item_id, it needs to be unescaped.

* sort imports
2024-04-02 12:27:36 +02:00
Paulus Schoutsen
7164993562 Bump version to 2024.4.0b4 2024-04-02 01:51:42 +00:00
mkmer
bc21836e7e Bump whirlpool-sixth-sense to 0.18.7 (#114606)
Bump sixth-sense to 0.18.7
2024-04-02 01:51:35 +00:00
J. Nick Koston
52612b10fd Avoid storing raw extracted traceback in system_log (#114603)
This is never actually used and takes up quite a bit of ram
2024-04-02 01:51:35 +00:00
J. Nick Koston
623d85ecaa Fix memory leak when importing a platform fails (#114602)
* Fix memory leak when importing a platform fails

re-raising ImportError would trigger a memory leak

* fixes, coverage

* Apply suggestions from code review
2024-04-02 01:51:33 +00:00
J. Nick Koston
43631d5944 Add missing platforms_exist guard to check_config (#114600)
* Add missing platforms_exist guard to check_config

related issue #112811

When the exception hits, the config will end up being saved in the traceback
so the memory is never released.

This matches the check_config code to homeassistant.config to avoid having
the exception thrown.

* patch

* merge branch
2024-04-02 01:51:33 +00:00
J. Nick Koston
112aab47fb Bump zeroconf to 0.132.0 (#114596)
changelog: https://github.com/python-zeroconf/python-zeroconf/compare/0.131.0...0.132.0
2024-04-02 01:51:32 +00:00
Martin Hjelmare
ea13f102e0 Fix reolink media source data access (#114593)
* Add test

* Fix reolink media source data access
2024-04-02 01:51:31 +00:00
jjlawren
bb33725e7f Bump plexapi to 4.15.11 (#114581) 2024-04-02 01:51:31 +00:00
Michael
bd6890ab83 Filter out ignored entries in ssdp step of AVM Fritz!SmartHome (#114574)
filter out ignored entries in ssdp step
2024-04-02 01:51:30 +00:00
Michael
25c611ffc4 Reduce usage of executer threads in AVM Fritz!Tools (#114570)
* call entity state update calls in one executer task

* remove not needed wrapping

* mark as "non-public" method

* add guard against changes on _entity_update_functions
2024-04-02 01:51:29 +00:00
Maikel Punie
fc24b61859 Bump velbusaio to 2024.4.0 (#114569)
Bump valbusaio to 2024.4.0
2024-04-02 01:51:28 +00:00
Joost Lekkerkerker
71588b5c22 Fix wrong icons (#114567)
* Fix wrong icons

* Fix wrong icons
2024-04-02 01:51:27 +00:00
Robert Svensson
14dfb6a255 Bump axis to v60 (#114544)
* Improve Axis MQTT support

* Bump axis to v60
2024-04-02 01:51:27 +00:00
G Johansson
ef97255d9c Fix server update from breaking setup in Speedtest.NET (#114524) 2024-04-02 01:51:26 +00:00
J. Nick Koston
e8afdd67d0 Fix workday doing blocking I/O in the event loop (#114492) 2024-04-02 01:51:25 +00:00
J. Nick Koston
008e4413b5 Fix late load of anyio doing blocking I/O in the event loop (#114491)
* Fix late load of anyio doing blocking I/O in the event loop

httpx loads anyio which loads the asyncio backend in the event loop
as soon as httpx makes the first request

* tweak
2024-04-02 01:51:24 +00:00
dotvav
c373d40e34 Fix Overkiz Hitachi OVP air-to-air heat pump (#114487)
Unpack command parameters instead of passing a list
2024-04-02 01:51:24 +00:00
J. Nick Koston
bdf51553ef Improve sonos test synchronization (#114468) 2024-04-02 01:51:23 +00:00
Michael Hansen
f2edc15687 Add initial support for floors to intents (#114456)
* Add initial support for floors to intents

* Fix climate intent

* More tests

* No return value

* Add requested changes

* Reuse event handler
2024-04-02 01:51:22 +00:00
J. Nick Koston
286a09d737 Mark executor jobs as background unless created from a tracked task (#114450)
* Mark executor jobs as background unless created from a tracked task

If the current task is not tracked the executor job should not
be a background task to avoid delaying startup and shutdown.

Currently any executor job created in a untracked task or
background task would end up being tracked and delaying
startup/shutdown

* import exec has the same issue

* Avoid tracking import executor jobs

There is no reason to track these jobs as they are always awaited
and we do not want to support fire and forget import executor jobs

* fix xiaomi_miio

* lots of fire time changed without background await

* revert changes moved to other PR

* more

* more

* more

* m

* m

* p

* fix fire and forget tests

* scrape

* sonos

* system

* more

* capture callback before block

* coverage

* more

* more races

* more races

* more

* missed some

* more fixes

* missed some more

* fix

* remove unneeded

* one more race

* two
2024-04-02 01:51:21 +00:00
Shay Levy
e8ee2fd25c Cleanup Shelly RGBW light entities (#114410) 2024-04-02 01:51:21 +00:00
Franck Nijhof
11b8b01cde Bump version to 2024.4.0b3 2024-03-29 22:22:45 +01:00
Paul Bottein
4f761c25d8 Update frontend to 20240329.1 (#114459) 2024-03-29 22:22:37 +01:00
J. Nick Koston
953ceb0d8d Avoid tracking import executor jobs (#114453) 2024-03-29 22:22:33 +01:00
Franck Nijhof
e53672250f Bump version to 2024.4.0b2 2024-03-29 19:35:52 +01:00
Paul Bottein
84901f1983 Update frontend to 20240329.0 (#114452) 2024-03-29 19:35:44 +01:00
Steven Looman
e4d973e8a2 Bump async-upnp-client to 0.38.3 (#114447) 2024-03-29 19:35:40 +01:00
epenet
cdd7ce435a Log warnings in Renault initialisation (#114445) 2024-03-29 19:35:37 +01:00
Mick Vleeshouwer
c7ce53cc49 Bump pyoverkiz to 1.13.9 (#114442) 2024-03-29 19:35:33 +01:00
Steven B
db7d0a0ee9 Bump python-ring-doorbell to 0.8.8 (#114431)
* Bump ring_doorbell to 0.8.8

* Fix intercom history test for new library version

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2024-03-29 19:35:30 +01:00
J. Nick Koston
906febadef Cleanup some plex tasks that delayed startup (#114418) 2024-03-29 19:35:27 +01:00
J. Nick Koston
bc740f95c9 Avoid concurrent radio operations with powerview hubs (#114399)
Co-authored-by: kingy444 <toddlesking4@hotmail.com>
2024-03-29 19:35:23 +01:00
Alexey ALERT Rubashёff
bf4e527f44 Add overkiz bottom tank water temperature and core control water temperature for Atlantic Water Heater (#114186)
* Adds bottom tank water temperature and core conrol water temperature sensors for Atlantic water heater

* Update homeassistant/components/overkiz/sensor.py

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

* Update homeassistant/components/overkiz/sensor.py

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

---------

Co-authored-by: TheJulianJES <TheJulianJES@users.noreply.github.com>
2024-03-29 19:35:20 +01:00
Alexey ALERT Rubashёff
35e582a240 Add overkiz water targets temperature numbers for Atlantic water heater (#114185)
* Adds water targets temperature numbers for Atlantic water heater

* Update homeassistant/components/overkiz/number.py

Co-authored-by: Mick Vleeshouwer <mick@imick.nl>

* Update homeassistant/components/overkiz/number.py

Co-authored-by: Mick Vleeshouwer <mick@imick.nl>

* ruff formatting reverted

* Update homeassistant/components/overkiz/number.py

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

* Update homeassistant/components/overkiz/number.py

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

* changed command hardcode to a constant

---------

Co-authored-by: Mick Vleeshouwer <mick@imick.nl>
Co-authored-by: TheJulianJES <TheJulianJES@users.noreply.github.com>
2024-03-29 19:35:17 +01:00
Alexey ALERT Rubashёff
65d25bd780 Add overkiz heating status, absence mode, and boost mode binary sensors for Atlantic Water Heater (#114184)
* Adds heating status, absense mode, and boost mode binary sensors for Atlantic water heater

* Renamed absence mode and boost mode binary sensors

* Update homeassistant/components/overkiz/binary_sensor.py

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

* Update homeassistant/components/overkiz/binary_sensor.py

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

* Update homeassistant/components/overkiz/binary_sensor.py

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

---------

Co-authored-by: TheJulianJES <TheJulianJES@users.noreply.github.com>
2024-03-29 19:35:13 +01:00
Jeremy TRUFIER
b8a2c14813 Follow real AtlanticPassAPCZoneControlZone physical mode on Overkiz (HEAT, COOL or HEAT_COOL) (#111830)
* Support HEAT_COOL when mode is Auto on overkiz AtlanticPassAPCZoneControlZone

* Refactor ZoneControlZone to simplify usic by only using a single hvac mode

* Fix linting issues

* Makes more sense to use halves there

* Fix PR feedback
2024-03-29 19:35:09 +01:00
Franck Nijhof
612988cf3e Bump version to 2024.4.0b1 2024-03-28 20:43:23 +01:00
Scott K Logan
7a53ea4b92 Bump aioraven to 0.5.3 (#114397) 2024-03-28 20:43:10 +01:00
Paul Bottein
8e4cf4e4a7 Update frontend to 20240328.0 (#114396) 2024-03-28 20:43:07 +01:00
Franck Nijhof
53ba732ed0 Fix area search for entities of devices (#114394) 2024-03-28 20:43:03 +01:00
Michael Hansen
c81e9447f9 Filter preferred TTS format options if not supported (#114392)
Filter preferred format options if not supported
2024-03-28 20:43:00 +01:00
Franck Nijhof
8cd8718855 Fix hassfest service icons check for custom integrations (#114389) 2024-03-28 20:42:58 +01:00
Maciej Bieniek
aa30194249 Adapt Tractive integration the latest API changes (#114380)
Co-authored-by: Maciej Bieniek <478555+bieniu@users.noreply.github.com>
2024-03-28 20:42:55 +01:00
Joost Lekkerkerker
80273b4873 Fix Lupusec feedback (#114374) 2024-03-28 20:42:52 +01:00
Joost Lekkerkerker
99282d27c6 Fix Swiss public transport feedback (#114373) 2024-03-28 20:42:48 +01:00
Joost Lekkerkerker
ba12652cbc Fix Suez water feedback (#114372) 2024-03-28 20:42:42 +01:00
Joost Lekkerkerker
5e0a0718e3 Fix streamlabswater feedback (#114371) 2024-03-28 20:42:39 +01:00
Marc Mueller
1c6689be41 Update pytile to 2023.12.0 (#114370) 2024-03-28 20:42:36 +01:00
Erik Montnemery
b143390d88 Improve device class of utility meter (#114368) 2024-03-28 20:42:33 +01:00
Erik Montnemery
42580a1113 Improve utility meter restore state tests (#114356) 2024-03-28 20:42:30 +01:00
Robert Resch
21bff95bd7 Fix script for checking on existing translations (#114354) 2024-03-28 20:42:27 +01:00
Christopher Bailey
737e5e70ec Bump pyunifiprotect to 5.1.2 (#114348) 2024-03-28 20:42:24 +01:00
J. Nick Koston
f204faf202 Fix empty delays in script helper (#114346)
fixes
```
Logger: homeassistant.components.automation.kamermaster_knop_4_acties_licht
Bron: components/automation/__init__.py:726
integratie: Automatisering (documentatie, problemen)
Eerst voorgekomen: 22:17:29 (5 gebeurtenissen)
Laatst gelogd: 22:59:24

While executing automation automation.kamermaster_knop_4_acties_licht
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/automation/__init__.py", line 726, in async_trigger
    return await self.action_script.async_run(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1645, in async_run
    return await asyncio.shield(create_eager_task(run.async_run()))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 454, in async_run
    await self._async_step(log_exceptions=False)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 506, in _async_step
    self._handle_exception(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 536, in _handle_exception
    raise exception
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 504, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 626, in _async_delay_step
    if timeout_future.done():
       ^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'done'
```
2024-03-28 20:42:21 +01:00
Joakim Plate
f141be73c7 Bump fjaraskupan to 2.3.0 (#114344)
Update fjarakupen to 2.3.0

- Support delayed disconnection
- Speed up on/off transitions
2024-03-28 20:42:18 +01:00
Michael Hansen
04bfb1de3c Add more Ollama models (#114339)
Add more models
2024-03-28 20:42:15 +01:00
J. Nick Koston
541a6c5f64 Revert velocity change in powerview (#114337) 2024-03-28 20:42:12 +01:00
Robert Resch
824d6afa24 Remove checked in translations (#114336) 2024-03-28 20:42:09 +01:00
Robert Resch
53cc4b8c37 Download translations only once in the build pipeline (#114335) 2024-03-28 20:42:06 +01:00
Erik Montnemery
a91c03b164 Don't access States.last_reported_ts before it's added (#114333) 2024-03-28 20:42:03 +01:00
Øyvind Matheson Wergeland
f8edab0c12 Avoid changing local time on Nobø Ecohub (#114332)
nobo_hub: Pass timezone to avoid changing local time on Nobø Ecohub in handshake
2024-03-28 20:42:00 +01:00
Marcel van der Veldt
00993a6be3 Fix Matter airconditioner discovery of climate platform (#114326)
* Discover Thermostat platform for Room Airconditioner device

* add test

* Adjust docstring

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

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: TheJulianJES <TheJulianJES@users.noreply.github.com>
2024-03-28 20:41:57 +01:00
Maikel Punie
a18184a4c0 Bump pyduotecno to 2024.3.2 (#114320) 2024-03-28 20:41:54 +01:00
TheJulianJES
e2710184cb Bump zha-quirks to 0.0.113 (#114311) 2024-03-28 20:41:51 +01:00
Martin Hjelmare
9319528e0e Use fallback voice for selected language in cloud (#114246)
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2024-03-28 20:41:47 +01:00
Franck Nijhof
b2e7808114 Bump version to 2024.4.0b0 2024-03-27 18:27:38 +01:00
Bram Kragten
6af0ccfa8d Update frontend to 20240327.0 (#114322) 2024-03-27 18:21:45 +01:00
puddly
fc34453caa Support the Home Assistant Connect ZBT-1 (#114213) 2024-03-27 18:20:48 +01:00
Marc Mueller
63e28f958d Use SignalType to improve typing [homekit] (#114297) 2024-03-27 18:05:01 +01:00
Joost Lekkerkerker
e626cd12aa Fix feedback in ROVA (#114308) 2024-03-27 18:01:07 +01:00
Lenn
6f1b4fad01 Fix icons for Motionblinds BLE integration (#114321)
Remove icon.json and add to icons.json
2024-03-27 18:00:18 +01:00
Joost Lekkerkerker
544215a609 Handle TypeError in Spotify (#114317) 2024-03-27 17:56:22 +01:00
David F. Mulcahey
c518acfef3 Defensively validate ZHA quirks v2 supplied entity metadata (#112643) 2024-03-27 17:48:43 +01:00
G Johansson
65230908c6 Remove deprecated forecast attribute from WeatherEntity (#110761)
* Remove deprecated forecast attribute from WeatherEntity

* Fix some

* Ruff

* ipma

* buienradar

* some more

* Some more

* More and more

* strings

* attr_forecast

* Fix nws

* Fix

* remove from coverage

* Remove recorder test

* Review comments
2024-03-27 16:51:29 +01:00
Jan Bouwhuis
1269031d11 Change min and max humidity for MQTT climate and humidifier (#114292)
Allow floats for humidity on mqtt platforms
2024-03-27 16:46:42 +01:00
Michael Hansen
e4d2985589 Bump intents to 2024.3.27 (#114312) 2024-03-27 16:43:15 +01:00
Joost Lekkerkerker
5aabb2a920 Finish ROVA init tests (#114315)
* Finish ROVA init tests

* Finish ROVA init tests

* Finish ROVA init tests
2024-03-27 16:36:42 +01:00
Jeef
fc596cde44 Version Bump for WeatherFlow Cloud Backing Lib (#114302)
Version bump to support stations going offline for some time
2024-03-27 16:24:18 +01:00
Joost Lekkerkerker
6289082dab Migrate Rova to has entity name (#114303) 2024-03-27 16:20:51 +01:00
YogevBokobza
4d27f4be51 Refactor switcher kis (#114281)
* switcher: small refactoring

* swithcer: Update switch.py

* more refactoring

* fix ruff
2024-03-27 17:15:49 +02:00
G Johansson
c21d508c2d Start deprecation of auxiliary heater in ClimateEntity (#112532)
* Start deprecation of auxiliary heater in ClimateEntity

* No issue for core integrations

* Remove unneded strings

* Move report to state_attributes
2024-03-27 16:10:32 +01:00
MarkGodwin
834f45397d Add support for PoE control of TP-Link Omada Gateways (#114138)
Co-authored-by: Robert Resch <robert@resch.dev>
Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-27 16:05:14 +01:00
Erik Montnemery
23e9be756d Fix exception when logging out from cloud (#114306)
* Fix exception when logging out from cloud

* Add test
2024-03-27 16:02:47 +01:00
Joost Lekkerkerker
a9fd4e45cd Raise issue if not Rova area anymore (#114309) 2024-03-27 15:51:49 +01:00
Tereza Tomcova
a00c1fa241 Bump pyprusalink to 2.1.1 and support Prusa MK3 (#114210)
Co-authored-by: Robert Resch <robert@resch.dev>
Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-27 15:26:44 +01:00
Robert Resch
1a64be6da6 Fix version_bump --set-nightly-version (#114304) 2024-03-27 14:45:28 +01:00
J. Nick Koston
ce022a1793 Fix missing powerview shade data when initial refresh fails (#113033) 2024-03-27 03:38:57 -10:00
Jan-Philipp Benecke
5316b94705 Use setup_test_component_platform helper for alarm_control_panel entity component tests instead of hass.components (#114301) 2024-03-27 14:36:31 +01:00
Marc Mueller
911a31f860 Use SignalType to improve typing [core] (#114298) 2024-03-27 14:25:02 +01:00
Jan-Philipp Benecke
6313571fbc Use setup_test_component_platform helper for binary_sensor entity component tests instead of hass.components (#114293) 2024-03-27 14:24:02 +01:00
Joost Lekkerkerker
c222cfd692 Add coordinator to Rova (#114288)
* Add coordinator to Rova

* Add coordinator to Rova

* Fix

* Update homeassistant/components/rova/sensor.py

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

* Fix

---------

Co-authored-by: Jan-Philipp Benecke <github@bnck.me>
2024-03-27 14:14:49 +01:00
Robert Resch
aaecbbdc40 Update bump_version.py to append also the time to nightlies and add possibility to set manual a nightly version (#114300) 2024-03-27 14:12:45 +01:00
Marc Mueller
9ea666b5e1 Use SignalType to improve typing [bthome] (#114295) 2024-03-27 08:22:44 -04:00
Marc Mueller
09ebca9630 Use SignalType to improve typing [esphome] (#114296) 2024-03-27 08:22:10 -04:00
Joost Lekkerkerker
45da6f8f2c Add tests to Rova (#114285) 2024-03-27 13:00:02 +01:00
Erik Montnemery
a3059fe504 Record state.last_reported (#114201)
* Record state.last_reported

* Include last_reported in parts of the history API

* Use a bulk update

* fix refactoring error

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-27 12:48:06 +01:00
Marc Mueller
24168dfba7 Update mypy-dev to 1.10.0a3 (#114289)
* Update mypy-dev to 1.10.0a3

* Allow TypedDict init from Type
2024-03-27 12:32:29 +01:00
Jan-Philipp Benecke
34cf0c5721 Use setup_test_component_platform func for cover entity component tests instead of hass.components (#114010)
* Use `mock_platform` for cover entity component tests instead of `hass.components`

* Remove setup fixture and use helper function

* Remove is_on from MockCover

* Run ruff

* Do not override state in `MockCover` in cover tests

* Remove is_on from MockCover
2024-03-27 12:20:19 +01:00
Marc Mueller
3929273b41 Allow float for int argument type [pylint plugin] (#114105) 2024-03-27 11:51:27 +01:00
Jan-Philipp Benecke
5c97049f2e Do not override state property in MockEntity (#114231)
Do not override state in `MockEntity`
2024-03-27 11:36:00 +01:00
Marc Mueller
44eeb2eb5e Allow Humidifier.current_humidity to be a float (#111297)
* Allow Humidifier.current_humidity to be a float

* Code review

* Allow climate humidity values to be float

* Update demo integration
2024-03-27 11:19:20 +01:00
G Johansson
b190cdceaf Remove hourly weather entity from metoffice (#112452) 2024-03-27 11:06:31 +01:00
Shai Ungar
69356300f0 Address late review of 17track config flow (#114283)
* some fixes for 17track

* remove await

* fix test
2024-03-27 11:06:13 +01:00
Lenn
6423501498 Add buttons to Motionblinds BLE integration (#114227)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
Co-authored-by: Robert Resch <robert@resch.dev>
2024-03-27 11:05:26 +01:00
Lenn
7b56643278 Add select to Motionblinds BLE integration (#114228)
Co-authored-by: Robert Resch <robert@resch.dev>
2024-03-27 10:50:04 +01:00
J. Nick Koston
2421b42f10 Refactor yeelight scanner to avoid creating tasks to wait for scanner start (#113919) 2024-03-27 10:17:35 +01:00
J. Nick Koston
13d6ebaabf Avoid delaying automation/script startup for sample blueprints (#114277)
Avoid delaying automation/script startup to check if the blueprint folder exists

automations and script both populate sample blueprints if none exist

The check to see if the blueprint folder exists always had to create
an executor job which would delay startup a bit if the executor was
busy. Since we do not need the sample blueprints to be populated
until the start event, we can run this in a task.
2024-03-27 09:55:59 +01:00
Franck Nijhof
da78dbb61f Merge branch 'master' into dev 2024-03-27 09:43:52 +01:00
Robert Svensson
03ec1798e4 Bump aiounifi to v73 (#114278) 2024-03-27 09:43:08 +01:00
Franck Nijhof
dd2d79b77e Refactor/fix search component, including labels & floors support (#114206)
Co-authored-by: TheJulianJES <TheJulianJES@users.noreply.github.com>
Co-authored-by: Robert Resch <robert@resch.dev>
2024-03-27 09:39:05 +01:00
J. Nick Koston
d8acd90370 Run recorder shutdown tasks eagerly (#113018) 2024-03-26 22:25:45 -10:00
Marc Mueller
1d2c2d2055 Move SignalTypes to util (#114236) 2024-03-27 08:41:44 +01:00
JeromeHXP
fbb590ea1f Bump ondilo_ico to 0.4.0 (#114022) 2024-03-27 08:41:11 +01:00
dependabot[bot]
4d7da61e99 Bump actions/setup-python from 5.0.0 to 5.1.0 (#114276)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-27 08:39:56 +01:00
Lenn
480b2ec84a Add Motionblinds brand (#114235) 2024-03-27 08:02:25 +01:00
J. Nick Koston
1697b116e4 Combine tts cache init executor jobs (#114271) 2024-03-26 23:58:46 -04:00
tronikos
a6fabdc115 Fix Opower accounts that report cost less regularly than usage (#114034)
* Update coordinator.py

* Update coordinator.py
2024-03-26 17:20:16 -04:00
Michael Hansen
72fed878b4 Add Ollama conversation agent (#113962)
* Add ollama conversation agent

* Change iot class

* Much better default template

* Slight adjustment to prompt

* Make casing consistent

* Switch to ollama Python fork

* Add prompt to tests

* Rename to "ollama"

* Download models in config flow

* Update homeassistant/components/ollama/config_flow.py

---------

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2024-03-26 16:15:20 -05:00
Jan-Philipp Benecke
f94f1fb826 Use setup_test_component_platform func for number entity component tests instead of hass.components (#114017)
* Use `setup_test_component_platform` fixture for number entity component tests instead of `hass.components`

* Now function

* Ruff format
2024-03-26 21:56:38 +01:00
Jan-Philipp Benecke
e80d73783c Do not late import config_entry in setup_test_component_platform test helper (#114260) 2024-03-26 21:54:09 +01:00
J. Nick Koston
a0d43aeba2 Remove unused code in ESPHome entry_data (#114263) 2024-03-26 10:32:16 -10:00
J. Nick Koston
6599b9a36d Restore scapy pin to >=2.5.0 (#114253) 2024-03-26 10:31:52 -10:00
J. Nick Koston
2649dfaa11 Fix ruff-format on energy sensor (#114261) 2024-03-26 10:05:55 -10:00
Mr. Bubbles
8955ef7fc6 Bump bring-api to 0.5.7 (#114252) 2024-03-26 20:53:45 +01:00
J. Nick Koston
f982473e53 Small performance improvements to energy sensors (#114149) 2024-03-26 09:40:06 -10:00
Franck Nijhof
9a32d1bbd5 Add label selector (#111029)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2024-03-26 20:31:06 +01:00
Jan-Philipp Benecke
dce3bde0ab Use setup_test_component_platform helper for update entity component tests instead of hass.components (#114203)
* Use `setup_test_component_platform` helper for update entity component tests instead of `hass.components`

* Run ruff format
2024-03-26 20:20:08 +01:00
Franck Nijhof
9a1906322b Allow numeric state trigger/condition against zone entities (#114221) 2024-03-26 19:41:46 +01:00
Ron Weikamp
e1036b3af0 Refactor Riemann sum integral sensor to prepare for time based trigger (#113932)
* Refactor Integration sensor.

* Use local simple function to verify the State is numeric.

* Merge two methods to one.

* Method renaming: _handle_state_change

* Move async_write_ha_state to the caller.

* Add comment on why attr_icon is set to None

* Remove possible None type of State in validation methods.

* Use a dict to map method name to method class.

* Explain derived unit after integration.

* Renaming to _multiply_unit_with_time and elaborate in docstring.

* Set integral unit_of_measurement explicitly to None if source unit_of_measurement is None

* One function for unit of measurement related steps.

* Improve docstring of _multiply_unit_with_time

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

* Apply f-string suggestions from code review

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

* Be more clear in comment about removing the sensors icon default.

* Apply suggestions from code review

Co-authored-by: Diogo Gomes <diogogomes@gmail.com>

* Update homeassistant/components/integration/sensor.py

* Update homeassistant/components/integration/sensor.py

* Update homeassistant/components/integration/sensor.py

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
Co-authored-by: Diogo Gomes <diogogomes@gmail.com>
2024-03-26 19:09:48 +01:00
Franck Nijhof
c247534731 Default floor level to None (and allow unsetting it) (#114249) 2024-03-26 18:58:25 +01:00
Marc Mueller
c8260a5966 Remove test cases for task eager_start <3.12 (#114243) 2024-03-26 15:52:38 +01:00
Lenn
53944b260c Bump motionblindsble to 0.0.9 (#114232) 2024-03-26 08:17:29 -04:00
Franck Nijhof
2388e2dda9 Drop Python 3.11 support (#114220) 2024-03-26 12:51:14 +01:00
Marc Mueller
31f5576b6e Add ruff commit to git-blame-ignore-revs (#114229) 2024-03-26 12:16:55 +01:00
Marc Mueller
eb81a4204e Allow string formatting for dispatcher SignalType (#114174) 2024-03-26 10:38:29 +01:00
Erik Montnemery
dd43947ca0 Add test to ensure non callback event filter is rejected (#114182) 2024-03-26 10:36:08 +01:00
Erik Montnemery
bac527f289 Don't allow listening to state_reported in event triggers (#114191)
Co-authored-by: Robert Svensson <Kane610@users.noreply.github.com>
2024-03-26 10:35:47 +01:00
Duco Sebel
788813aad6 Implement Identify button and Cloud connection toggle for HomeWizard Watermeter (#113814) 2024-03-26 10:34:36 +01:00
Franck Nijhof
5c69e0d2c6 Add label template functions (#111024) 2024-03-26 10:32:29 +01:00
Cyrill Raccaud
e136847b89 Add more timestamp sensors to swiss_public_transport (#107916)
* add more timestamp sensors

* more generic definition for future sensors

* add entity descriptor

* use enable property to prevent sensors from getting added

* set legacy attribute flag for first sensor

* remove departure from extra attributes

* remove breaking changes again and keep for next pr

* fix multiline statements

* outsource the multiline ifs into function

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2024-03-26 10:17:25 +01:00
Robert Resch
0338aaf577 Allow pre-releases for "Adjust nightly version" only (#114219) 2024-03-26 10:05:13 +01:00
Joost Lekkerkerker
ddee999843 Fix motion blinds formatting (#114222) 2024-03-26 09:57:19 +01:00
Lenn
70c4fa8475 Add Motionblinds BLE integration (#109497)
* initial fork

* intial tests

* Initial test coverage

* extra coverage

* complete config flow tests

* fix generated

* Update CODEOWNERS

* Move logic to PyPi library and update to pass config_flow test and pre-commit

* Remove Button, Select and Sensor platform for initial PR

* Update manifest.json

* Change info logs to debug in cover

* Use _abort_if_unique_id_configured instead of custom loop checking existing entries

* Change platforms list to PLATFORMS global

Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>

* Remove VERSION from ConfigFlow

Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>

* Replace all info logs by debug

* Use instance attributes in ConfigFlow

Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>

* Add return type and docstring to init in ConfigFlow

* Add recovery to tests containing errors

* Make NoBluetoothAdapter and NoDevicesFound abort instead of show error

* Change info logs to debug

* Add and change integration type from hub to device

* Use CONF_ADDRESS from homeassistant.const

* Move cover attributes initialization out of constructor

* Change CONF_ADDRESS in tests from const to homeassistant.const

* Remove unused part of tests

* Change 'not motion_device' to 'motion_device is None'

* Change _attr_connection_type to _connection_type

* Add connections to DeviceInfo

* Add model to DeviceInfo and change MotionBlindType values

* Remove identifiers from DeviceInfo

* Move constants from const to library

* Move calibration and running to library, re-add all platforms

* Remove platforms from init

* Remove button platform

* Remove select platform

* Remove sensor platform

* Bump motionblindsble to 0.0.4

* Remove closed, opening and closing attribute default values

Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>

* Remove CONFIG_SCHEMA from init

Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>

* Remove unused platform attributes and icons

* Re-add _attr_is_closed to GenericBlind to fix error

* Use entry.async_create_background_task for library instead of entry.async_create_task

* Move updating of position on disconnect to library

* Remove type hints, keep for _attr_is_closed

* Use DISPLAY_NAME constant from library for display name

* Add TYPE_CHECKING condition to assert in config_flow

* Re-add CONFIG_SCHEMA to __init__ to pass hassfest

* Change FlowResult type to ConfigFlowResult

* Fix import in tests

* Fix ruff import

* Fix tests by using value of enum

* Use lowercase name of MotionBlindType enum for data schema selector and translation

* Fix using name instead of value for MotionBlindType

* Improve position None handling

Co-authored-by: starkillerOG <starkiller.og@gmail.com>

* Improve tilt None handling

Co-authored-by: starkillerOG <starkiller.og@gmail.com>

* Change BLIND_TO_ENTITY_TYPE name

* Set entity name of cover to None and use DeviceInfo name

* Add base entity

* Move async_update to base entity

* Move unique ID with suffix to base class

* Add entity.py to .coveragerc

* Remove extra state attribute connection type

* Remove separate line hass.data.setdefault(DOMAIN, {})

* Remove use of field for key and translation_key in MotionCoverEntityDescription

* Remove entity translation with extra state_attributes from strings.json

* Use super().__init__(device, entry)

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

* Change if block in async_update_running

* Use if blocks in async_update_position

* Add additional scanner check before show_form

* Remove default value of device_class in MotionCoverEntityDescription

* Fix entry.data[CONF_BLIND_TYPE] uppercase

* Fix device info model name

* Bump motionblindsble to 0.0.5

* Fix tests

* Move entity_description to MotionblindsBLEEntity

* Change double roller blind name

* Bump motionblindsble to 0.0.6

* Fix ruff

* Use status_query for async_update

* Bump motionblindsble to 0.0.7

* Change bluetooth local name

* Set kw_only=True for dataclass

* Change name of GenericBlind

* Change scanner_count conditional

* Wrap async_register_callback in entry.async_on_unload

* Bump motionblindsble to 0.0.8

* Use set_create_task_factory and set_call_later_factory

* Update bluetooth.py generated

* Simplify COVER_TYPES dictionary

* Move registering callbacks to async_added_to_hass

* Remove check for ATTR_POSITION and ATTR_TILT_POSITION in kwargs

* Add naming consistency for device and entry

* Use if block instead of ternary for _attr_unique_id

* Improve errors ternary in config_flow

* Use set instead of list for running_type

* Improve errors ternary in config_flow

* Remove init from MotionblindsBLECoverEntity and move debug log to async_added_to_hass

* Update debug log create cover

* Fix ruff

* Use identity check instead of equals

* Use identity check instead of equals

* Change MotionblindsBLECoverEntityDescription name

* Change debug log text

* Remove ATTR_CONNECTION from const

* Add types for variables in async_setup_entry

* Add types for variables in async_setup_entry

* Change PositionBlind class name to PositionCover etc

* Improve docstrings

* Improve docstrings

---------

Co-authored-by: starkillerOG <starkiller.og@gmail.com>
Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2024-03-26 09:52:04 +01:00
Arie Catsman
b9fdd56f01 Bump pyenphase to 1.20.1 (#114218) 2024-03-25 22:42:19 -10:00
Matrix
63b4fd09c1 Add YoLink Water Meter Support (#114148)
* Add YS-5006/5007/5008 Water Meter Support

* Add YoLink Water Meter Support

* Update .coveragerc

* fix as suggestion
2024-03-26 09:29:14 +01:00
J. Nick Koston
54a69a2687 Remove async_get_device_class_lookup from entity_registry (#114212)
This function was only ever used in homekit, and since there is
now an index of devices in the entity registry, homekit no longer
uses it.

I searched github code for all references to async_get_device_class_lookup
and the only think I could find using it were forks of core. It seems
unlikely that any custom components are affected by removing this
function
2024-03-26 09:22:53 +01:00
Robert Svensson
3f545cb3d3 Rework Axis entity loader to have a better internal storage structure (#114114)
* Make one single subscribe containing all topics at once

* Update homeassistant/components/axis/hub/entity_loader.py

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

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-26 07:55:07 +01:00
Marc Mueller
d0ecad78ac Revert "Update typing-extensions to 4.11.0rc1 (#114116)" (#114216) 2024-03-25 20:44:57 -10:00
J. Nick Koston
cabc4f797a Preload storage for integrations we know we are going to setup (#114192) 2024-03-25 15:49:54 -10:00
J. Nick Koston
345fa75562 Bump SQLAlchemy to 2.0.29 (#114208) 2024-03-25 14:39:16 -10:00
Jan-Philipp Benecke
9580adfde9 Use new setup_test_component_platform helper instead of test fixture for light platform (#114200) 2024-03-26 00:17:16 +01:00
Joost Lekkerkerker
6bb4e7d62c Bump ruff to 0.3.4 (#112690)
Co-authored-by: Sid <27780930+autinerd@users.noreply.github.com>
Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-26 00:02:16 +01:00
J. Nick Koston
27219b6962 Bump anyio to 4.3.0 (#114198) 2024-03-25 23:52:28 +01:00
Jan-Philipp Benecke
2f0cfc8b61 Remove deprecated hass.components from system_health tests (#114207) 2024-03-26 00:39:31 +02:00
Jan Bouwhuis
18174ad47d Improve test coverage mqtt discovery test (#114188) 2024-03-25 22:41:11 +01:00
Shay Levy
121182167f Fix Shelly reauth flow (#114180)
* Fix Shelly reauth flow

* Rename shutdown_device to async_shutdown_device
2024-03-25 23:27:44 +02:00
Jan-Philipp Benecke
9b682388f5 Add generic test component platform setup function (#114016)
* Add generic entity platform setup fixture

* rename fixture

* No need for passing hass

* Make function instead of fixture

* Improve typing

* Use Sequence instead

* Migrate flux to use the new helper

* Use list instead

* Use Sequence instead
2024-03-25 21:36:17 +01:00
Jim
6ceeb1e41f Telegram bot proxy params deprecation (#112778)
* Add strings for issues to raise in telegram integration startup

* Allow proxy_params to be passed empty

Allows migration away from proxy_params whilst retaining a configured proxy.

* Raise issues for removing proxy_params config option

* Add types to initialize_bot function

* Add PR link for learn more URL

Update issue message to leave a comment on the PR instead

* Apply suggestions from code review

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

* hass should always be first argument

* Update issues strings to give domain and better direction.

* Update breaks_in_ha_version to something saner

* Apply strings.json suggestions from code review

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

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2024-03-25 21:09:34 +01:00
Erik Montnemery
e2ee623d23 Add restrictions for listening to event_reported events (#114183)
* Add restrictions for listening to event_reported events

* Update homeassistant/core.py

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

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2024-03-25 19:16:50 +01:00
J. Nick Koston
c3f4aca4e3 Add reauth support to NUT (#114131) 2024-03-25 07:59:46 -10:00
Robert Resch
135c40cad8 Add Ecovacs last job event entity (#113826)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2024-03-25 18:31:04 +01:00
G Johansson
5e70faca5f Refactor options flow in dnsip (#114058)
* Refactor options flow in dnsip

* Mods
2024-03-25 17:38:02 +01:00
Robert Svensson
71a6653f60 Fix Axis not generate unique IDs (#114115) 2024-03-25 12:21:21 -04:00
Robert Svensson
c1e1db9863 Adapt to Axis library file structure changes (#114181)
* Adapt to axis library file structure changes

* Bump axis to v59
2024-03-25 12:16:41 -04:00
Thomas55555
b71cbeff51 Bump aioautomower to 2024.3.4 (#114127)
* Bump aioautomower to 2024.3.4

* Update homeassistant/components/husqvarna_automower/sensor.py

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

* adjust imports

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2024-03-25 16:11:12 +01:00
Kevin Stillhammer
3d6600364b Bump pywaze to 1.0.0 (#108613) 2024-03-25 16:08:57 +01:00
Max von Webel
7b2166243b Updated temp offset logging in tado component (#106308)
* Updated temp offset logging in tado component

The logging is a bit confusing because it's trimming the digits from the value. Hopefully this makes it a bit more clear.

* Update homeassistant/components/tado/climate.py

Co-authored-by: Jorim Tielemans <tielemans.jorim@gmail.com>

---------

Co-authored-by: Jorim Tielemans <tielemans.jorim@gmail.com>
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2024-03-25 15:10:16 +01:00
Manuel Dipolt
e2a26f6470 Add base entity to romy integration (#113750)
* cherry picked base entity changes from the branches romy_binary_sensor & romy_sensor

* Update homeassistant/components/romy/entity.py

Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>

* Update homeassistant/components/romy/vacuum.py

Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>

* Update homeassistant/components/romy/entity.py

Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>

* Update homeassistant/components/romy/vacuum.py

Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>

* Update homeassistant/components/romy/vacuum.py

Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>

* code review changes, base entity/coordinator cleanup

---------

Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>
2024-03-25 14:28:07 +01:00
Joost Lekkerkerker
d398eb1f2c Add Withings webhook manager (#106311) 2024-03-25 13:59:36 +01:00
J. Nick Koston
3acb505456 Refactor homekit device linking to use the device index (#114145)
Now that we have an index of devices in the entity registry
we can avoid generating a lookup for devices we do
not care about
2024-03-25 08:28:56 -04:00
Matthias Lohr
95ddade83c Use enums to define choices in tolo (#113992)
* use enums defined in HA to define choices

* move enums to .const
2024-03-25 12:47:56 +01:00
Marc Mueller
49a4fe41c6 Update codespell to 2.2.6 (#114167) 2024-03-25 12:33:25 +01:00
Marc Mueller
56e13ef3fc Update pytest-unordered to 0.6.0 (#114162) 2024-03-25 11:45:07 +01:00
Marc Mueller
81c34ac952 Fix spelling [docstrings + comments] (#114168) 2024-03-25 11:33:00 +01:00
Marc Mueller
9b7cc088be Fix spelling [runtime] (#114169) 2024-03-25 11:32:50 +01:00
Marc Mueller
8ae2fefcf3 Update types packages (#114164) 2024-03-25 11:32:38 +01:00
G Johansson
3ba1b82723 Remove hourly weather entity from met_eireann (#112449) 2024-03-25 11:30:50 +01:00
J. Nick Koston
ada781025b Avoid homekit random id generation for existing entries (#114144) 2024-03-25 11:28:26 +01:00
Marc Mueller
188dbfbd2a Update typing-extensions to 4.11.0rc1 (#114116) 2024-03-25 11:27:47 +01:00
Jan Bouwhuis
e88ade716d Allow debugging tests by default in vscode (#114065) 2024-03-25 11:25:46 +01:00
Marc Mueller
1b6d1d58ec Update pytest-cov to 5.0.0 (#114160)
* Update pytest-cov to 5.0.0

* Update warnings filter
2024-03-25 11:23:26 +01:00
Marc Mueller
5d293f92b2 Update yamllint to 1.35.1 (#114166) 2024-03-25 11:22:55 +01:00
Marc Mueller
18bb33e2d7 Update pyOpenSSL to 24.1.0 (#114165) 2024-03-25 11:15:47 +01:00
Bouwe Westerdijk
ace21c876c Bump plugwise to v0.37.1 (#113245) 2024-03-25 11:15:33 +01:00
Marc Mueller
3643b324c0 Update pipdeptree to 2.16.1 (#114159) 2024-03-25 11:13:25 +01:00
Marc Mueller
b2da780044 Update respx to 0.21.0 (#114163) 2024-03-25 11:05:30 +01:00
Marc Mueller
ac0dc946d3 Update pytest-timeout to 2.3.1 (#114161) 2024-03-25 11:02:20 +01:00
Marc Mueller
36fdf65782 Update coverage to 7.4.4 (#114158) 2024-03-25 11:00:22 +01:00
Álvaro Fernández Rojas
33d9947a70 Add climate fan modes for Airzone Cloud Aidoo devices (#103574)
* airzone_cloud: climate: add Aidoo speeds support

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

* Add suggested changes

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

* airzone_cloud: climate: rename _set_fan_speeds()

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

* airzone_cloud: climate: drop BASE_FAN_SPEEDS

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

* airzone_cloud: climate: refactor FAN_AUTO speed

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

* airzone_cloud: climate: document standard speeds replacement

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

* airzone_cloud: climate: fix Homekit comment

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

* airzone_cloud: climate: consistent fan speed names

Instead of mixing "low", "medium" and "high" with percentages, let's use only
percentages if there are more speeds.

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

---------

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2024-03-25 10:50:04 +01:00
Jan Bouwhuis
19fa39d556 Generate ConfigValidationError message from English translations (#113844)
* Fetch ConfigValidationError message from translation cache

* Sync error logmessages with translation cache

* More sync

* Cleanup

* Remove unrelated change

* Follow up comments

* Rebase and improve contructor

* Improve name

* Rename to MULTIPLE_INTEGRATION_CONFIG_ERRORS
2024-03-25 10:39:30 +01:00
Marc Mueller
a58049554d Update pytest-asyncio to 0.23.6 (#114155) 2024-03-25 10:10:37 +01:00
Robert Resch
c8948e3b1c Use uv and sort jobs in builder.yml (#114153) 2024-03-25 09:50:06 +01:00
Marc Mueller
04bc31a799 Update pre-commit to 3.7.0 (#114154) 2024-03-25 09:35:27 +01:00
Emanuel Winblad
8f0f8f9469 Bump vilfo-api-client to 0.5.0 (#114082) 2024-03-25 09:00:06 +01:00
dependabot[bot]
5c0888ba28 Bump Wandalen/wretry.action from 2.0.0 to 2.1.0 (#114150) 2024-03-25 08:56:33 +01:00
dependabot[bot]
aa1179ccc4 Bump github/codeql-action from 3.24.8 to 3.24.9 (#114151) 2024-03-25 08:55:35 +01:00
Christopher Bailey
3e01085c91 Add repair for UniFi Protect if RTSP is disabled on camera (#114088)
Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-24 17:30:52 -10:00
J. Nick Koston
a5128c2148 Covert system_log services to be callbacks (#114143) 2024-03-24 15:55:40 -10:00
J. Nick Koston
e8fe3d349b Bump aionut to 4.3.2 (#114142) 2024-03-24 15:55:13 -10:00
Matrix
517826fe48 Bump yolink-api to 0.4.1 fix water depth sensor error when device is not initialize (#113994) 2024-03-24 15:37:39 -10:00
J. Nick Koston
04b3049a7b Bump aionut to 4.2.1 (#114132) 2024-03-24 12:57:58 -10:00
Yuxin Wang
76052a5385 Implement diagnostics platform for APCUPSD (#112284)
* Implement diagnostic platform for APCUPSd

* Put APCUPSd in gold quality scale

* Revert quality scale update

* Use snapshot testing for apcupsd

* Prettify the code
2024-03-24 23:40:41 +01:00
J. Nick Koston
17378ce408 Bump aionut to 4.1.0 (#114125)
Handles auth errors after the password has been sent
This means we will be able to have some decent error
reporting and reauth support in the future

changelog: https://github.com/bdraco/aionut/compare/v4.0.0...v4.1.0
2024-03-24 20:50:32 +01:00
J. Nick Koston
d0dc820ced Cancel config entry setup retry at shutdown (#114124) 2024-03-24 09:09:24 -10:00
Jan Bouwhuis
c94d8c541b Fix google assistant diagnostics test (#114111)
Improve google assistant diagnostics test
2024-03-24 19:05:47 +01:00
Marc Mueller
d779333bef Use TypeVarTuple for add_job and run_job methods (#114122) 2024-03-24 18:52:39 +01:00
Jan Bouwhuis
67ab49b825 Fetch ServiceNotFound message from translation cache and fix super (#114084)
* Fetch ServiceNotFound message from translation cache and fix super

* Fix tests trace component

* Fix script errors
2024-03-24 07:41:13 -10:00
J. Nick Koston
6371b344b9 Ensure discovery can setup legacy device tracker platforms (#114101) 2024-03-24 07:38:05 -10:00
Ernst Klamer
c5893f22bf Bump xiaomi-ble to 0.28.0 (#114120) 2024-03-24 07:37:25 -10:00
Marc Mueller
11faf4adcb Replace if in range check (#114107) 2024-03-24 15:20:00 +01:00
Lars Stegman
3a3fb95454 Fix launch library translation keys (#114093)
Fix translation keys
2024-03-24 15:12:25 +01:00
Niels Perfors
db3eeec78c Tado: fix 113982 (#114109)
fix-113982
2024-03-24 13:28:09 +01:00
J. Nick Koston
d4b180cf75 Fix flapping device_tracker test_bad_platform test (#114102)
https://github.com/home-assistant/core/actions/runs/8408079861/job/23023835074
2024-03-24 13:23:12 +01:00
Robert Svensson
2e2b40f77e Add reconfigure flow to Axis integration (#114067) 2024-03-24 12:48:19 +01:00
Dave T
579084a21e Add more sensors to aurora_abb_powerone (part 2) (#114097) 2024-03-24 11:04:12 +00:00
Floris272
d14a442ac3 Improve blue current integration code (#114004) 2024-03-23 22:35:53 -10:00
Brett Adams
ba5a4a17c4 Add vehicle config to coordinator to fix bug in Teslemetry (#113850) 2024-03-23 22:29:10 -10:00
MarkGodwin
925efe0a92 Bump tplink_omada to 1.3.12 for ER7212PC support (#114077) 2024-03-23 22:27:54 -10:00
Allen Porter
2f84183ccd Bump gcal-sync to 6.0.4 (#114085) 2024-03-23 22:24:44 -10:00
J. Nick Koston
e8cb6a8e29 Optimize loading of translations (#114089) 2024-03-23 22:22:09 -10:00
J. Nick Koston
de831b6e87 Small performance improvement to template expand (#114086)
* Small performance improvement to template expand

- Avoid fetching entity sources each loop
- Skip already found entities
- Avoid startswith in favor of equality check

* unneeded changes
2024-03-24 00:24:52 -04:00
Brett Adams
f079c1c236 Allow retry during Config Flow in Advantage Air (#114083) 2024-03-23 12:40:42 -10:00
J. Nick Koston
4ac439ef88 Migrate nut to use aionut (#114078) 2024-03-23 12:02:02 -10:00
G Johansson
d4f158d079 Add reconfigure step to holiday (#114057) 2024-03-23 22:55:05 +01:00
Dave T
c82c295eed Add more sensors to aurora_abb_powerone (#114074) 2024-03-23 21:52:22 +00:00
J. Nick Koston
1c1d8d0317 Avoid creating inner function in EntityComponent setup (#114050) 2024-03-23 11:31:23 -10:00
Robert Svensson
4e03d9cd47 Centralize loading Axis entities (#114018)
Centralize platform loading
2024-03-23 21:52:00 +01:00
Shay Levy
ef3ab54f1d Fix Shelly WallDisplay device power (#114071) 2024-03-23 22:44:53 +02:00
Joost Lekkerkerker
ce12d45b50 Catch Mill timeout error (#114068)
* Catch Mill timeout error

* Catch Mill timeout error

* Catch Mill timeout error
2024-03-23 20:57:22 +01:00
J. Nick Koston
82016ff528 Refactor recorder states tests (#114073)
https://github.com/home-assistant/core/pull/113985#discussion_r1536596573
2024-03-23 15:41:12 -04:00
J. Nick Koston
4f18f0d902 Fix setup timings when config entry platform loads are not awaited (#113959)
* Move setup time logging into the context manager

We were fetching the time twice but since the context
manager already has the timing, move it there

* remove log setup assertions from integration test

* tweak logging to give us better data for tracking issues

* redundant

* adjust

* preen

* fixes

* adjust

* make api change internal so nobody uses it

* coverage

* fix test

* fix more tests

* coverage

* more tests assuming internal calls

* fix more

* adjust

* adjust

* fix axis tests

* fix broadlink -- it does not call async_forward_entry_setup

* missed some

* remove useless patch

* rename, detect it both ways

* clear

* debug

* try to fix

* handle phase finishing out while paused

* where its set does not need to know its late as that is an implemenation detail of setup

* where its set does not need to know its late as that is an implemenation detail of setup

* tweak

* simplify

* reduce complexity

* revert order change as it makes review harder

* revert naming changes as it makes review harder

* improve comment

* improve debug

* late dispatch test

* test the other way as well

* Update setup.py

* Update setup.py

* Update setup.py

* simplify

* reduce
2024-03-23 15:26:38 -04:00
Jan Bouwhuis
a4f52cc622 Use a constant to reference homeassistant domain (#113889)
* Use CONF_CORE to reference `homeassistant` domain

* Just use DOMAIN

* USE DOMAIN for `homeasistant` domain in config_schema.py

* Use DOMAIN_HA as constant for homeassistant domain

* Rename CONF_CORE to DOMAIN_HA

* Rename DOMAIN_HA to HA_DOMAIN

* Use relative import

* Use direct imports
2024-03-23 19:58:39 +01:00
On Freund
c661622332 Add Risco system binary sensors (#114062)
* Add Risco system binary sensors

* Remove leading underscore

* Address code review commments
2024-03-23 19:35:12 +01:00
Jiaqi Wu
d75315f225 Add Lutron Serena tilt only wood blinds (#113791) 2024-03-23 07:48:24 -10:00
Brian Rogers
dbb4cf0ee7 Add Rachio smart hose timer support (#107901)
Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-23 07:36:03 -10:00
G Johansson
3c13a28357 Bump holidays to 0.45 (#114069) 2024-03-23 17:24:34 +01:00
Greg Dowling
3ec9312f0e Fix bug in roon media player to use correct 'seek position' while playing a track. (#113999)
Chance source of 'seek position' to be the one that roon updates while playing!
2024-03-23 14:53:40 +01:00
On Freund
1a6ff5c2d5 Bump pyrisco to 0.6.0 (#114063) 2024-03-23 14:45:17 +01:00
Mick Vleeshouwer
ebda0d832c Enable turn_on / turn_off features for HitachiAirToAirHeatPump in Overkiz (#112990)
Enable turn_on / turn_off features
2024-03-23 14:27:00 +01:00
Robert Resch
8d51ff0f2c Create registry matrix to run publishing for images in parallel (#114060) 2024-03-23 13:29:29 +01:00
Dave T
9451a14e5c Migrate UpdateCoordinator to its own file in aurora_abb_powerone (#114053)
Migrate *UpdateCoordinator to its own file.
2024-03-23 12:30:38 +01:00
J. Nick Koston
de62b7774f Reduce sqlalchemy reflection overhead at recorder setup time (#113989) 2024-03-23 11:25:05 +01:00
G Johansson
7b0abb00aa Show correct ipv6 address in System Monitor (#114024) 2024-03-23 11:24:17 +01:00
Robert Resch
ce48e6e574 Fix building images for nightlies (#114054) 2024-03-23 11:22:38 +01:00
J. Nick Koston
31fb02a71d Fix after deps not being considered for integrations before stage 1 (#114045) 2024-03-23 11:21:56 +01:00
J. Nick Koston
ac80d38871 Fix flakey stream hls test (#114046) 2024-03-23 11:11:42 +01:00
G Johansson
ebe6c35b4c Smhi add reconfigure step to config flow (#114044)
* Add reconfigure step to SMHI

* Check location

* Add test

* Add test entity and device
2024-03-23 11:01:59 +01:00
J. Nick Koston
900e0c07bf Load light profiles in a task to avoid delaying platform setup (#114038) 2024-03-23 10:51:03 +01:00
Jeremy TRUFIER
4f22c85e39 Fix missing linked device on Overkiz integration (#114006)
* Fix missing linked device (#112731)

* Update homeassistant/components/overkiz/executor.py

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

---------

Co-authored-by: Robert Svensson <Kane610@users.noreply.github.com>
2024-03-23 10:21:20 +01:00
J. Nick Koston
39c44ad5b7 Move setup of legacy device_tracker see service to legacy setup task (#114043)
* Move setup of legacy device_tracker see service to legacy setup task

device_tracker can setup synchronously now if there are no legacy
platforms that have to be import to validate the config

The see service is not useful until at least one legacy platform
is loaded so there is no reason to wait for it in the base
setup.

* collapse
2024-03-23 09:40:34 +01:00
kingy444
c2771791a3 Add Powerview Type 11 (#114047) 2024-03-22 17:09:36 -10:00
J. Nick Koston
952f47ab18 Combine recorder and frontend bootstrap step (#113985) 2024-03-22 13:50:39 -10:00
Robert Svensson
bf8d880e5f Improve axis tests (#114035)
* Combine binary sensor tests into more logical groups

* Improve light tests

* Clean up switch tests

* Improve typing in conftest

* Add typing to camera

* Improve binary sensor

* Improve light

* Improve switch
2024-03-23 00:44:06 +01:00
kingy444
26b6bd83fc Move powerview timeout logic to the upstream api (#113984) 2024-03-22 13:38:33 -10:00
Marc Mueller
efc54971d3 Update empty line formatting after module docstring (#114040) 2024-03-23 00:27:57 +01:00
Marc Mueller
1dbc94162d Update byte string formatting (2) (#114039) 2024-03-23 00:22:15 +01:00
Marc Mueller
596ddbb6eb Update pytest warnings filter (#114036) 2024-03-22 23:58:27 +01:00
alexsydell
9e86f82a1b Add ecobee indefinite away preset, remove unusable/broken presets (#108636)
* Add ecobee indefinite away preset, remove unusable/broken presets

* Revert cleanup of presets which no longer work
2024-03-22 22:45:54 +01:00
Robert Svensson
d3c68303b0 Improve deCONZ test_non_color_light_reports_color (#114021) 2024-03-22 22:18:22 +01:00
kingy444
7d9fa64a66 Add missing is_closed property to powerview tilt only entities (#113792)
* add tilt closed

* add current positioning
2024-03-22 20:34:00 +01:00
Arie Catsman
205c457a77 Add home battery storage entities for enphase_envoy (#114015) 2024-03-22 08:46:39 -10:00
Robert Svensson
817d931df0 Define and use entity description in Axis entity base class (#114007)
Define and use entity description in entity base class
2024-03-22 13:59:07 -04:00
Franck Nijhof
25909f2ebd 2024.3.3 (#114005) 2024-03-22 18:47:59 +01:00
J. Nick Koston
68e170284f Speed up recorder startup by making schema query read only (#113987) 2024-03-22 18:29:46 +01:00
Robert Svensson
bbb80caed3 Tweak marking private methods in UniFi, no need to mark inner functio… (#113964) 2024-03-22 18:10:07 +01:00
Robert Svensson
6800034d5a Rename device to api in Axis integration (#113965) 2024-03-22 18:07:33 +01:00
Robert Svensson
2d2249386e Bump axis to v58 (#114008) 2024-03-22 17:53:17 +01:00
Robert Svensson
c6f2ff8e88 Bump axis to v58 (#114008) 2024-03-22 17:52:45 +01:00
Jan-Philipp Benecke
cd0c9e1c4f Remove deprecated hass.components from conversation tests and use light setup fixture (#114012) 2024-03-22 17:52:10 +01:00
Jan-Philipp Benecke
01acbc8bba Remove deprecated hass.components from zeroconf tests (#114013) 2024-03-22 17:51:39 +01:00
Jan-Philipp Benecke
edc19328c0 Remove deprecated hass.components from scene tests (#114014) 2024-03-22 17:48:53 +01:00
Jan-Philipp Benecke
08529b3806 Remove deprecated hass.components from frontend tests (#114011) 2024-03-22 17:35:43 +01:00
Robert Resch
c282172252 Use uv instead of pip on production images (#112496) 2024-03-22 16:50:07 +01:00
Duco Sebel
cad3be8213 Add new HomeWizard Energy Socket to tests (#113406) 2024-03-22 16:48:27 +01:00
Franck Nijhof
32b4814f2a Bump version to 2024.3.3 2024-03-22 16:35:21 +01:00
Franck Nijhof
d1644f3713 Update cosign to 2.2.3 (#113996) 2024-03-22 16:35:05 +01:00
G Johansson
7df0d3b140 Remove hourly weather entity from NWS (#112503) 2024-03-22 16:32:29 +01:00
G Johansson
4fb11dc4f3 Remove hourly weather entity from Aemet (#110764) 2024-03-22 16:31:43 +01:00
Duco Sebel
48553ece68 Remember entered IP when error happend while setting up HomeWizard (#113815) 2024-03-22 16:10:03 +01:00
Robert Svensson
a9e857202d Axis use entity descripton binary sensor platform (#113705) 2024-03-22 15:49:51 +01:00
Federico D'Amico
5b6361080c Add cover platform to microBees (#111135) 2024-03-22 14:31:09 +01:00
Aarni Koskela
29cdac381c Add reformatting commits to .git-blame-ignore-revs (#110481) 2024-03-22 14:29:49 +01:00
Joost Lekkerkerker
8aa6447a4f Add icon translations to Wiz (#112358) 2024-03-22 14:04:13 +01:00
Federico D'Amico
aae85edb73 Add binary sensor platform to microBees (#111190) 2024-03-22 14:01:36 +01:00
Massimo Savazzi
16283aad49 Update JVC Projector polling time to be more responsive for automations (#113765) 2024-03-22 14:00:10 +01:00
Jan Bouwhuis
9ca253213c Correct HomeAssistantError __str__ implementation and test (#113991)
Correct HomeAssistant sub class implementation and test
2024-03-22 13:39:36 +01:00
Franck Nijhof
ee2e98b475 Update cosign to 2.2.3 (#113996) 2024-03-22 13:27:06 +01:00
Joakim Sørensen
a2143a7c1a Return default repairs flow for cloud TTS issues (#113981)
* Set TTS repairs as not fixable

* Return default confirm flow for fixable cloud issues

* Depend on repairs

* Test default repair flow

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2024-03-22 11:20:47 +01:00
Paulus Schoutsen
7b431a91b3 2024.3.2 - fix (#113978) 2024-03-21 22:35:16 -04:00
dependabot[bot]
93289c9f09 Bump home-assistant/builder from 2024.01.0 to 2024.03.5 (#113887)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 22:20:49 -04:00
J. Nick Koston
abb217086f Group wemo platform forwards to reduce overhead (#113972) 2024-03-21 21:59:50 -04:00
Paulus Schoutsen
f10d924e8b 2024.3.2 (#113973)
* Streamline Notion config entry updates (refresh token and user ID) (#112832)

* Bump aioautomower to 2024.3.2 (#113162)

* Bump aioautomower to 2024.3.3 (#113430)

* Check for EA release channel for UniFi Protect (#113432)

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

* Bump `pysnmp-lextudio` to version `6.0.11` (#113463)

* Tado fix water heater (#113464)

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

* Bump aiodhcpwatcher to 0.8.2 (#113466)

* Bump axis to v55 (#113479)

* Bump croniter to 2.0.2 (#113494)

* Revert setting communication delay in Risco init (#113497)

* Bump pyrisco to 0.5.10 (#113505)

* Fix missing context when running script from template entity (#113523)

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

* Bump ical to 7.0.3 to fix local-todo persisted with invalid DTSTART values (#113526)

* Fix Airthings BLE illuminance sensor name (#113560)

* Ignore Shelly block update with cfgChanged None (#113587)

* Catch `TimeoutError` in `Brother` config flow (#113593)

* Catch TimeoutError in Brother config flow

* Update tests

* Remove unnecessary parentheses

---------

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

* Bump axis to v56 (#113608)

* Bump pyunifiprotect to 5.0.1 (#113630)

* Bump pyunifiprotect to 5.0.2 (#113651)

* Add removal condition to Shelly battery sensor (#113703)

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

* Bump aioraven to 0.5.2 (#113714)

* Fix unknown values in onewire (#113731)

* Fix unknown values in onewire

* Update tests

* Bump pymodbus v3.6.6 (#113796)

* Catch API errors in cast media_player service handlers (#113839)

* Catch API errors in cast media_player service handlers

* Remove left over debug code

* Fix wrapping of coroutine function with api_error

* Bump pychromecast to 14.0.1 (#113841)

* Fix startup race in cast (#113843)

* Redact the area of traccar server geofences (#113861)

* Bump pytedee_async to 0.2.17 (#113933)

* Bump axis to v57 (#113952)

* Bump version to 2024.3.2

---------

Co-authored-by: Aaron Bach <bachya1208@gmail.com>
Co-authored-by: Thomas55555 <59625598+Thomas55555@users.noreply.github.com>
Co-authored-by: Christopher Bailey <cbailey@mort.is>
Co-authored-by: J. Nick Koston <nick@koston.org>
Co-authored-by: Lex Li <425130+lextm@users.noreply.github.com>
Co-authored-by: Erwin Douna <e.douna@gmail.com>
Co-authored-by: Joostlek <joostlek@outlook.com>
Co-authored-by: Robert Svensson <Kane610@users.noreply.github.com>
Co-authored-by: Diogo Gomes <diogogomes@gmail.com>
Co-authored-by: On Freund <onfreund@gmail.com>
Co-authored-by: Erik Montnemery <erik@montnemery.com>
Co-authored-by: Allen Porter <allen@thebends.org>
Co-authored-by: Shay Levy <levyshay1@gmail.com>
Co-authored-by: Maciej Bieniek <bieniu@users.noreply.github.com>
Co-authored-by: Maciej Bieniek <478555+bieniu@users.noreply.github.com>
Co-authored-by: Scott K Logan <logans@cottsay.net>
Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>
Co-authored-by: jan iversen <jancasacondor@gmail.com>
Co-authored-by: Joakim Sørensen <ludeeus@ludeeus.dev>
Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>
2024-03-21 21:57:36 -04:00
Erik Montnemery
79f2eaaf41 Deprecate the panel_iframe integration (#113410)
* Deprecate the panel_iframe integration

* Address review comments

* Customize issue text

* Update test
2024-03-22 02:48:52 +01:00
J. Nick Koston
5b9f40b0f0 Pre import mobile app platforms to avoid having to wait on them (#113966) 2024-03-22 02:40:15 +01:00
Paul Chanvin
b2cab70cc0 Fix argument name in async_update_ha_state warning message (#113969)
Fixed warning message using async_update_ha_state
2024-03-22 02:26:11 +01:00
Paulus Schoutsen
91bb321d8f Bump version to 2024.3.2 2024-03-21 20:25:19 -04:00
Robert Svensson
19ef92735c Bump axis to v57 (#113952) 2024-03-21 20:25:11 -04:00
Josef Zweck
6c274abc50 Bump pytedee_async to 0.2.17 (#113933) 2024-03-21 20:25:10 -04:00
Joakim Sørensen
1e57f52ba2 Redact the area of traccar server geofences (#113861) 2024-03-21 20:25:09 -04:00
Erik Montnemery
8056886c66 Fix startup race in cast (#113843) 2024-03-21 20:25:08 -04:00
Erik Montnemery
14c4cdc089 Bump pychromecast to 14.0.1 (#113841) 2024-03-21 20:25:07 -04:00
Erik Montnemery
4132a3d2ea Catch API errors in cast media_player service handlers (#113839)
* Catch API errors in cast media_player service handlers

* Remove left over debug code

* Fix wrapping of coroutine function with api_error
2024-03-21 20:25:07 -04:00
jan iversen
d67cd2af0c Bump pymodbus v3.6.6 (#113796) 2024-03-21 20:25:06 -04:00
epenet
33678ff5a4 Fix unknown values in onewire (#113731)
* Fix unknown values in onewire

* Update tests
2024-03-21 20:25:05 -04:00
Scott K Logan
6859bae0b1 Bump aioraven to 0.5.2 (#113714) 2024-03-21 20:25:04 -04:00
Maciej Bieniek
368586c9d1 Add removal condition to Shelly battery sensor (#113703)
Co-authored-by: Maciej Bieniek <478555+bieniu@users.noreply.github.com>
2024-03-21 20:25:03 -04:00
Christopher Bailey
eb8a8424a5 Bump pyunifiprotect to 5.0.2 (#113651) 2024-03-21 20:25:03 -04:00
Christopher Bailey
686487e59c Bump pyunifiprotect to 5.0.1 (#113630) 2024-03-21 20:25:02 -04:00
Robert Svensson
fa9f5bd647 Bump axis to v56 (#113608) 2024-03-21 20:25:00 -04:00
Maciej Bieniek
2e2d303291 Catch TimeoutError in Brother config flow (#113593)
* Catch TimeoutError in Brother config flow

* Update tests

* Remove unnecessary parentheses

---------

Co-authored-by: Maciej Bieniek <478555+bieniu@users.noreply.github.com>
2024-03-21 20:24:59 -04:00
Shay Levy
0a64ae2f7a Ignore Shelly block update with cfgChanged None (#113587) 2024-03-21 20:24:58 -04:00
Joost Lekkerkerker
a7908d8250 Fix Airthings BLE illuminance sensor name (#113560) 2024-03-21 20:24:58 -04:00
Allen Porter
4a620e015f Bump ical to 7.0.3 to fix local-todo persisted with invalid DTSTART values (#113526) 2024-03-21 20:24:57 -04:00
Erik Montnemery
d5864a40a8 Fix missing context when running script from template entity (#113523)
Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-21 20:24:56 -04:00
On Freund
05b900321b Bump pyrisco to 0.5.10 (#113505) 2024-03-21 20:24:55 -04:00
On Freund
5163b5f888 Revert setting communication delay in Risco init (#113497) 2024-03-21 20:24:27 -04:00
Diogo Gomes
8bae8fdd75 Bump croniter to 2.0.2 (#113494) 2024-03-21 20:22:08 -04:00
Robert Svensson
de966b0eb1 Bump axis to v55 (#113479) 2024-03-21 20:22:07 -04:00
J. Nick Koston
099c228169 Bump aiodhcpwatcher to 0.8.2 (#113466) 2024-03-21 20:21:32 -04:00
Erwin Douna
a5994d1d5f Tado fix water heater (#113464)
Co-authored-by: Joostlek <joostlek@outlook.com>
2024-03-21 20:16:26 -04:00
Lex Li
26b26a3b1f Bump pysnmp-lextudio to version 6.0.11 (#113463) 2024-03-21 20:16:25 -04:00
Christopher Bailey
273d01c0f4 Check for EA release channel for UniFi Protect (#113432)
Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-21 20:16:24 -04:00
Thomas55555
a167b0acaf Bump aioautomower to 2024.3.3 (#113430) 2024-03-21 20:16:23 -04:00
Thomas55555
8b00229868 Bump aioautomower to 2024.3.2 (#113162) 2024-03-21 20:15:49 -04:00
Aaron Bach
10fc40e415 Streamline Notion config entry updates (refresh token and user ID) (#112832) 2024-03-21 20:10:42 -04:00
Arie Catsman
5f5d40ed52 Bump pyenphase to 1.20.0 (#113963) 2024-03-21 13:56:31 -10:00
Jan Bouwhuis
4da701a8e9 Add guard to HomeAssistantError __str__ method to prevent a recursive loop (#113913)
* Add guard to HomeAssistantError `__str__` method to prevent a recursive loop

* Use repr of class instance instead

* Apply suggestion to explain __str__ method is missing

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-21 23:12:25 +01:00
Dave T
a6d98c1857 Improve user error messages for generic camera (#112814)
* Generic camera: Insufficient error message when configuration fails
Fixes #112279

* Add tests

* Fix typo in string

* Add new error strings to options flow.

* Group and improve error strings following PR review
2024-03-21 21:54:45 +00:00
Robert Svensson
0c791051b8 Bump axis to v57 (#113952) 2024-03-21 21:42:42 +01:00
J. Nick Koston
9a863638f6 Avoid writing HomeKit state to disk unless its missing (#111970) 2024-03-21 09:19:55 -10:00
J. Nick Koston
d0708b5b32 Fix grammar in async_get_platform comment (#113948)
https://github.com/home-assistant/core/pull/113917#pullrequestreview-1951203739
2024-03-21 15:10:47 -04:00
Shay Levy
63275d61a5 Add Shelly RGB/RGBW profiles support (#113808)
* Add Shelly RGB/RGBW profiles support

* Update homeassistant/components/shelly/light.py

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

* Use walrus in rgbw_key_ids

* Use walrus in light_key_ids

---------

Co-authored-by: Robert Svensson <Kane610@users.noreply.github.com>
2024-03-21 21:04:50 +02:00
Simone Chemelli
8728057b1b Add support for Shelly RPC devices custom TCP port (#110860)
* First coding

* add port to config_entry + gen1 not supported msg

* fix async_step_credentials

* strings

* fix reauth

* fix visit device link

* increased MINOR_VERSION

* apply review comments

* align to latest aioshelly

* missing tests

* introduce port parameter

* update tests

* remove leftover

* remove "port" data_description key

* missing key

* apply review comments

* apply more review comments

* Add tests

* apply review comment

* apply review comment (part 2)

* description update

* fine tuning description

* fix test patching

---------

Co-authored-by: Shay Levy <levyshay1@gmail.com>
2024-03-21 19:58:56 +01:00
J. Nick Koston
8141a246b0 Remove unrelated patching from scrape test (#113951)
https://github.com/home-assistant/core/pull/105516#discussion_r1534459365

The fixture already is designed to go unavailable on the 3rd update
2024-03-21 19:54:24 +01:00
Thomas55555
63221356f6 Add select platform to Husqvarna Automower (#113816)
* Add select platform to Husqvarna Automower

* docstring

* address review

* pin headlight_modes list

* Apply suggestions from code review

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

* Apply review

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2024-03-21 17:07:09 +01:00
Josef Zweck
b4c36d4676 Bump pytedee_async to 0.2.17 (#113933) 2024-03-21 15:27:51 +01:00
G Johansson
9289fa23a1 Add availability to Scrape config flow (#105516) 2024-03-21 13:13:25 +01:00
Josef Zweck
e5fa6f0176 Add Bluetooth support to La Marzocco integration (#108287)
* init

* init tests

* linting

* checks

* tests, linting

* pylint

* add tests

* switch tests

* add water heater tests

* change icons

* extra args cleanup

* moar tests

* services tests

* remove extra platforms

* test for unique id

* back to single instance

* add diagnostics

* remove extra platforms

* test for unique id

* back to single instance

* Add better connection management for Idasen Desk (#102135)

* Return 'None' for light attributes when off instead of removing them (#101946)

* Bump home-assistant-bluetooth to 1.10.4 (#102268)

* Bump orjson to 3.9.9 (#102267)

* Bump opower to 0.0.37 (#102265)

* Bump Python-Roborock to 0.35.0 (#102275)

* Add CodeQL CI Job (#102273)

* Remove unused dsmr sensors (#102223)

* rebase messed up conftest

* more tests for init

* add client to coveragerc

* add client to coveragerc

* next lmcloud version

* strict typing

* more typing

* allow multiple machines

* remove unneeded var

* Update homeassistant/components/lamarzocco/coordinator.py

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

* Update homeassistant/components/lamarzocco/diagnostics.py

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

* Update homeassistant/components/lamarzocco/__init__.py

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

* PR suggestions

* remove base exception

* Update manifest.json

* update lmcloud

* update lmcloud

* remove ignore

* selection bugfix for machines with space in name

* bugfix temps

* add options flow

* send out full user input

* remove options flow

* split the tests to avoid timeouts

* use selectoptionsdict for selection

* removing rccoleman

* improve test coverage to 100%

* Update config_flow.py

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

* Update config_flow.py

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

* Update config_flow.py

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

* autoselect cloud machine for discovered machine

* move default values to 3rd party lib

* bring property changes from lmcloud

* moving things to lmcloud

* move validation to method

* move more things to lmcloud

* remove unused const

* Update homeassistant/components/lamarzocco/coordinator.py

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

* Update homeassistant/components/lamarzocco/coordinator.py

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

* Update homeassistant/components/lamarzocco/__init__.py

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

* Update homeassistant/components/lamarzocco/__init__.py

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

* remove callback from coordinator

* remove waterheater, add switch

* improvement to background task

* next lmcloud

* adapt to lib changes

* Update homeassistant/components/lamarzocco/strings.json

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

* Update homeassistant/components/lamarzocco/entity.py

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

* Update homeassistant/components/lamarzocco/entity.py

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

* Update homeassistant/components/lamarzocco/switch.py

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

* Update homeassistant/components/lamarzocco/switch.py

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

* Update homeassistant/components/lamarzocco/entity.py

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

* Update homeassistant/components/lamarzocco/strings.json

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

* requested changes

* Update homeassistant/components/lamarzocco/switch.py

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

* Update homeassistant/components/lamarzocco/entity.py

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

* Update tests/components/lamarzocco/test_config_flow.py

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

* Update tests/components/lamarzocco/test_config_flow.py

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

* some requested changes

* changes

* requested changes

* move steam boiler to controls

* fix: remove entities from GS3MP model + tests

* remove dataclass decorator

* next lmcloud version

* improvements

* move reauth to user step

* improve config flow

* remove asserts in favor of runtimeerrors

* undo conftest comment

* make duc return none

* Update homeassistant/components/lamarzocco/switch.py

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

* Update homeassistant/components/lamarzocco/entity.py

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

* Update homeassistant/components/lamarzocco/config_flow.py

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

* remove diagnostics, changes

* refine config flow

* remove runtimeerrors in favor of asserts

* move initialization of lm_client to coordinator

* remove things from lmclient

* remove lm_client

* remove lm_client

* bump lm version

* correctly set initialized for tests

* move exception handling inside init + tests

* add test for switch without bluetooth on

* bump lmcloud

* pass httpx client to LMLocalAPI

* add call function to reduce code

* switch to snapshot testing

* remove bluetooth

* bump version

* cleanup import

* remove unused const

* set correct integration_type

* correct default selection in CF

* reduce unnecessary tests by fixture change

* use other json loads helpers

* move prebrew/infusion to select entity

* bump lmcloud

* Update coordinator.py

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

* Update coordinator.py

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

* Update coordinator.py

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

* Update entity.py

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

* Update entity.py

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

* requested feedback

* step description, bump lmcloud

* create init integration functino

* revert

* ruff

* remove leftover BT test

* make main switch main entity

* bump lmcloud

* re-add bluetooth

* improve

* bump firmware (again)

* correct test

* Update homeassistant/components/lamarzocco/coordinator.py

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

* Update homeassistant/components/lamarzocco/entity.py

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

* Update homeassistant/components/lamarzocco/strings.json

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

* separate device test

* add BT to entites

* fix import

* docstring

* minor

* fix rebase

* get device from discovered devices

* tweak

* change tests

* switch to dict

* switch to options

* fix

* fix

---------

Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
Co-authored-by: Paul Bottein <paul.bottein@gmail.com>
Co-authored-by: J. Nick Koston <nick@koston.org>
Co-authored-by: tronikos <tronikos@users.noreply.github.com>
Co-authored-by: Luke Lashley <conway220@gmail.com>
Co-authored-by: Franck Nijhof <git@frenck.dev>
Co-authored-by: dupondje <jean-louis@dupond.be>
Co-authored-by: Robert Resch <robert@resch.dev>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2024-03-21 13:08:11 +01:00
Jan-Philipp Benecke
e23943debf Remove deprecated hass.components from flux switch tests and use fixture (#113875) 2024-03-21 11:44:05 +01:00
dependabot[bot]
ccfe0ba036 Bump Wandalen/wretry.action from 1.4.10 to 2.0.0 (#113888)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-21 11:43:11 +01:00
starkillerOG
cd934c21f9 Add Reolink hdd/sd card storage sensor (#110961) 2024-03-21 11:41:32 +01:00
Erik Montnemery
25fe74aec5 Remove AUX heating from demo climate (#113929) 2024-03-21 11:35:27 +01:00
Ingmar Delsink
67a14d0463 Add transmission-integration path and protocol (#104334)
This updates the config_flow migration from v1.1 to v1.2
including migration tests
2024-03-21 11:05:36 +01:00
Jan-Philipp Benecke
ff6812a798 Split light fixture from implementation to only import when fixture is actually used (#113892)
* Split light fixture from implementation to only import when fixture is actually used

* Non-local import
2024-03-21 10:49:32 +01:00
jan iversen
e1897906cc modbus: Remove PARALLEL_UPDATES from base_platform (#113928)
Remove PARALLEL_UPDATES from base_platform.
2024-03-21 10:43:58 +01:00
Thomas55555
80c8b94021 Add diagnostics to Husqvarna Automower (#111857) 2024-03-21 10:06:40 +01:00
jan iversen
59c4c85089 Upgrade Modbus quality scale to platinum (#113482)
Quality scale: Platinum.
2024-03-21 09:49:37 +01:00
Sid
8e1f57f663 Enable Ruff PT023, disable PT011, PT012, PT018 (#113900)
* Enable Ruff PT023

* Set mark parantheses to False

* Disable PT011, PT012, PT018
2024-03-21 09:43:27 +01:00
J. Nick Koston
3b66328591 Add a fast path for async_get_platform (#113917) 2024-03-21 09:34:33 +01:00
J. Nick Koston
f662e7e3cf Only calculate native value once per update in systemmonitor (#113921) 2024-03-21 09:33:36 +01:00
J. Nick Koston
0b0d3a2091 Add run_immediately to the trace stop listener (#113922) 2024-03-21 09:32:43 +01:00
J. Nick Koston
7758f41c5a Load system info with base functionality (#113923) 2024-03-21 09:24:39 +01:00
Jan Bouwhuis
dc38d152df Fetch ServiceNotFound message from translation cache (#113893) 2024-03-21 06:54:29 +01:00
Jan Bouwhuis
8edbf88da1 Fetch MaxLengthExceeded exception mesage from the translation cache (#113904)
* Fetch MaxLengthExceeded exception mesage from the translation cache

* Update homeassistant/components/homeassistant/strings.json

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

* Add case without homeassistant integration

* Fix test

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-21 06:53:26 +01:00
Jesse Hills
6ddef7bbff ESPHome: Add Time Entity support (#113852) 2024-03-21 16:59:43 +13:00
J. Nick Koston
aebc95b1d2 Reduce overhead to construct and validate entity service schema (#113920) 2024-03-20 16:07:17 -10:00
J. Nick Koston
e015fd2440 Use intersection for determine_script_action (#113915) 2024-03-20 16:06:59 -10:00
J. Nick Koston
b574220247 Refactor rate limit helper to track time in seconds (#113898)
* Refactor rate limit helper to track time in seconds

Currently we created datetime and timedelta objects to enforce the
rate limit. When the rate limit was being hit hard, this got expensive.

We now use floats everywhere instead as they are much cheaper which
is important when we are running up against a rate limit, which is
by definition a hot path

The rate limit helper is currently only used for templates and
we do not have any code in the code base that directly passes
in a rate limit so the impact to custom components is expected
to be negligible if any

* misesd two
2024-03-20 19:49:37 -04:00
J. Nick Koston
b311fe2a0f Reduce overhead to clear cache in button state (#113895)
Same optimization as #113136
2024-03-20 19:41:24 -04:00
J. Nick Koston
1e54595084 Use faster time compare in history and live logbook (#113897) 2024-03-20 19:40:23 -04:00
J. Nick Koston
e9c1753f3a Cache parsing the url for the device registry (#113910)
* Cache parsing the url for the device registry

There are lots of hub integrations that use the same url for every
sub-device which results in a lot of url parsing at startup. The
logic can be simplified quite a bit here by only using yarl
for URLs

* fix onvif
2024-03-20 19:35:01 -04:00
J. Nick Koston
267fe3dc34 Fix system_info importing hassio in the event loop (#113903) 2024-03-20 12:06:40 -10:00
J. Nick Koston
ac175a4240 Fix flakey test_reading_yaml_config test (#113902) 2024-03-20 10:39:31 -10:00
J. Nick Koston
cf8455336c Small cleanup to unifiprotect subscriptions (#113901) 2024-03-20 10:09:42 -10:00
Erik Montnemery
426f73b1f4 Add State.last_reported (#113511)
* Add State.last_reported

* Update tests

* Update test snapshots

* Call state_reported listeners when firing state_changed event

* Add tests
2024-03-20 21:05:07 +01:00
J. Nick Koston
e74791083e Fix duplicate events in live history (#113896) 2024-03-20 20:14:17 +01:00
dependabot[bot]
dfbfdf781e Bump home-assistant/builder from 2024.01.0 to 2024.03.5 (#113887)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-20 20:13:44 +01:00
uchagani
15ac81aae9 Bump islamic_prayer_times to 0.0.12 (#113744) 2024-03-20 17:06:57 +01:00
Simone Chemelli
bd2ee161f3 Bump aioshelly to 8.2.0 (#113886)
aioshelly bump to 8.2.0
2024-03-20 17:06:16 +01:00
Matrix
3b0ac469d4 YoLink fix cover incorrect state (#104975)
* Fix cover incorrect state

* Change entity to unavailable
2024-03-20 16:45:21 +01:00
Joost Lekkerkerker
0e7e1cb34f Remove obsolete issue strings in WAQI (#113884) 2024-03-20 16:17:12 +01:00
Joakim Sørensen
83cf59e6a8 Provide better debug capabilities for the Traccar Server integration (#113868) 2024-03-20 15:40:46 +01:00
Martin Hjelmare
c5f6925948 Add matter device serial number (#113878) 2024-03-20 15:31:48 +01:00
Erik Montnemery
afa9517716 Catch API errors in cast media_player service handlers (#113839)
* Catch API errors in cast media_player service handlers

* Remove left over debug code

* Fix wrapping of coroutine function with api_error
2024-03-20 13:10:35 +01:00
Paul Bottein
eafb4190ef Change quotes in cloud translations (#113871)
* Escape quote in cloud translations

* Update homeassistant/components/cloud/strings.json

Co-authored-by: Joakim Sørensen <ludeeus@ludeeus.dev>

* Update homeassistant/components/cloud/strings.json

Co-authored-by: Joakim Sørensen <ludeeus@ludeeus.dev>

* Update homeassistant/components/cloud/strings.json

---------

Co-authored-by: Joakim Sørensen <ludeeus@ludeeus.dev>
2024-03-20 07:35:34 -04:00
Jonathan Sider
dc9f0a55a6 Update Amcrest services.yaml (#111161) 2024-03-20 11:59:44 +01:00
Alin Balutoiu
f8de214560 Make temperature a required parameter for tado climate service (#113872)
Make temperature a required parameter
2024-03-20 11:59:13 +01:00
Franck Nijhof
fc6a83559f Add floor template functions (#110847) 2024-03-20 11:58:04 +01:00
Henning Claßen
25be71e05b Bump numato-gpio to v0.13.0 (#113182) 2024-03-20 11:42:01 +01:00
Erwin Douna
42873cacf5 Tado fix water heater (#113464)
Co-authored-by: Joostlek <joostlek@outlook.com>
2024-03-20 11:29:15 +01:00
Floris272
249f708071 Bump bluecurrent-api to 1.2.2 (#110483) 2024-03-20 11:28:27 +01:00
Scott K Logan
6552e12161 Bump aioraven to 0.5.2 (#113714) 2024-03-20 10:57:37 +01:00
Joost Lekkerkerker
d2663347e9 Remove Amcrest camera unique id migration (#113870) 2024-03-20 10:36:02 +01:00
Martin Hjelmare
ac008a4c6d Deprecate cloud tts gender (#112256)
* Deprecate cloud tts gender option

* Update http api and prefs

* Test migration of prefs to minor version 4

* Adjust breaking date

* Add test for bad voice in http api

* Flatten tts info

* Fix comments

* Fix comment date

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

* Clarify voice validator

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2024-03-20 09:42:40 +01:00
Erik Montnemery
d31124d5d4 Avoid creating unneeded Context and Event objects when firing events (#113798)
* Avoid creating unneeded Context and Event objects when firing events

* Add test

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-20 09:40:06 +01:00
Jan-Philipp Benecke
638020f168 Remove deprecated hass.components from group light tests and use fixture (#113862) 2024-03-20 08:45:50 +01:00
J. Nick Koston
c5eacf55c2 Fix flapping stream hls test (#113858) 2024-03-20 08:27:05 +01:00
Joakim Sørensen
96694878fb Redact the area of traccar server geofences (#113861) 2024-03-20 08:23:16 +01:00
J. Nick Koston
fff590d738 Fix flapping device tracker test (#113859)
seen in https://github.com/home-assistant/core/actions/runs/8353028595/job/22864148890?pr=113854
2024-03-20 07:21:26 +01:00
Joost Lekkerkerker
23353812a9 Add icon translations to Github (#111614)
* Add icon translations to Github

* Fix
2024-03-20 07:06:34 +01:00
Jesse Hills
510e7ccf76 Bump aioesphomeapi to 23.2.0 (#113854) 2024-03-19 19:40:09 -10:00
J. Nick Koston
06f356a038 Avoid expensive db queries at startup to check if data is migrated (#113773) 2024-03-19 15:27:40 -10:00
J. Nick Koston
417b491b78 Reduce overhead to write dlna_dmr state (#113776)
* Reduce overhead to write dlna_dmr state

- Only update supported_features once per state write cycle
- Use a dict lookup for state

* useless dispatch

* fix tests

* remove unreachable code
2024-03-19 21:13:34 -04:00
Jessica Smith
02c1088596 Upgrade whirlpool integration to add shared appliances and allow brand selection (#111687)
* update to 1.18.5 and add Brand to config, required for getting shared appliances

* update version to 0.18.6

* start fixing tests

* fix typo

* check for falsy values instead of explicit None

* move CONF_BRAND from global constants to whirlpool constants

* add test for no brand, fix __init__ import

* add brand to string.json

* add brand to re-auth

* add title/description, add brand info to description

* add reauth strings

* pass already initialized data dict

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

* remove trailing comma

* Update strings again

* fix reauth tests to add brand

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2024-03-20 02:02:45 +01:00
Marc Mueller
9a38f0de0b Update actions/cache to 4.0.2 (#113817) 2024-03-20 01:16:21 +01:00
Jan-Philipp Benecke
9add4aea70 Remove deprecated hass.components from vilfo config flow tests (#113821) 2024-03-20 01:13:05 +01:00
Jan-Philipp Benecke
685468d845 Use mock_platform for light entity component tests instead of hass.components (#113845)
* Use `mock_platform` for light entity component tests instead of `hass.components`

* Move pytest_plugins to top

* Fix comment
2024-03-20 01:09:48 +01:00
J. Nick Koston
7b67a486bd Migrate legacy device_tracker shutdown to use run_immediately (#113835)
A call_soon is not needed here
2024-03-19 14:07:57 -10:00
J. Nick Koston
b26f0bc488 Only create one executor job to shutdown wemo (#113836)
Currently we created two but the work can be done in a single job
2024-03-19 19:59:37 -04:00
J. Nick Koston
ec3db0a6aa Migrate camera listeners to use run_immediately (#113840)
None of these need a call_soon
2024-03-19 19:58:59 -04:00
Erik Montnemery
8a9f69b22a Bump pychromecast to 14.0.1 (#113841) 2024-03-19 11:41:10 -10:00
Erik Montnemery
bf21553008 Fix startup race in cast (#113843) 2024-03-19 11:37:29 -10:00
J. Nick Koston
658bef5447 Migrate samsungtv stop to use run_immediately (#113834)
There is no need for a call_soon here
2024-03-19 22:01:23 +01:00
J. Nick Koston
6b5518b2bf Fix template sensor test relying on event bus debug logging (#113842) 2024-03-19 10:44:04 -10:00
J. Nick Koston
879e5bc961 Only wait for import flows in setup of there is a config flow (#113780) 2024-03-19 10:38:27 -10:00
Jan-Philipp Benecke
c52ee2a898 Remove deprecated hass.components from person test (#113822) 2024-03-19 22:33:40 +02:00
Jan-Philipp Benecke
ff03c9db19 Remove deprecated hass.components from cloud client test (#113820) 2024-03-19 22:33:11 +02:00
Jan-Philipp Benecke
f96bb6754b Remove deprecated hass.components from http test (#113823) 2024-03-19 22:32:27 +02:00
J. Nick Koston
32c64855b2 Fix duplicate events in live logbook (#113828) 2024-03-19 09:17:23 -10:00
J. Nick Koston
15c0422837 Fix flakey profiler object growth tests (#113825) 2024-03-19 09:17:12 -10:00
Jan-Philipp Benecke
b35b4e8bfd Do not patch asyncio.timeout in govee light local test (#113819) 2024-03-19 18:24:36 +01:00
Åke Strandberg
0fa395556d Revert get_model from myuplink lib (#113811) 2024-03-19 17:27:16 +01:00
Franck Nijhof
670bd97777 Find referenced labels in automations & scripts (#113812) 2024-03-19 16:28:37 +01:00
Thomas55555
ea443af557 Add device_tracker platform for husqvarna_automower (#111403)
* Add device_tracker platform for husqvarna_automower

* ruff

* Add snapshot test

* State test

* Fix description

* ruff

* Optimize some docstrings

* Update homeassistant/components/husqvarna_automower/device_tracker.py

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

* Adress review

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2024-03-19 15:46:35 +01:00
Thomas55555
3a8494cb88 Add binary sensor platform for Husqvarna Automower (#113248)
* Add binary sensor platform for Husqvarna Automower

* revert changes in sensor.py

* use == instead of is

* remove the parantheses

* Apply suggestions from code review

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

* Docstring

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2024-03-19 15:30:30 +01:00
Franck Nijhof
38d0854b70 Find referenced floors in automations & scripts (#113802) 2024-03-19 14:18:53 +01:00
Joost Lekkerkerker
44211dc761 Migrate Harmony to has entity name (#104737)
* Migrate Harmony to has entity name

* Fix tests

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-19 14:02:50 +01:00
Ernst Klamer
6106a66ed8 Bump bthome-ble to 3.8.1 (#113800) 2024-03-19 08:15:57 -04:00
Dave T
318b6e3a8b Allow retries on communication exceptions for Aurora ABB Powerone solar inverter (#104492)
* Allow retries on SerialException, AuroraError

* Add test to verify that retry is occuring

* Fix tests and indents

* Only log to info level for normal on/offline

* Review comment: don't log warning, debug and raise UpdateFailed

* Fix tests
2024-03-19 12:21:32 +01:00
Robert Resch
5230a8a210 Simplify UV install in CI (#113803) 2024-03-19 11:49:15 +01:00
Nalin Mahajan
18ef76a018 Add Room Audio Control to Control4 Integration (#87821)
* Add control4 room based media player (#13)

* update attribute names (#14)

* change to data class and set off to idle (#15)

Co-authored-by: nalin29 <nalin29@github.com>

---------

Co-authored-by: nalin29 <nalin29@github.com>
2024-03-19 11:44:52 +01:00
Erik Montnemery
4381780936 Add WS command cloud/remove_data (#109821) 2024-03-19 10:22:58 +01:00
Franck Nijhof
d0b4210de5 Update Home Assistant base image to 2024.03.0 (#113797) 2024-03-19 10:07:13 +01:00
jan iversen
c2538d5176 Bump pymodbus v3.6.6 (#113796) 2024-03-19 09:37:36 +01:00
Sid
00ec7f11f0 Enable Ruff rule PT007 (#113764)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2024-03-19 09:01:07 +01:00
Lucas Mindêllo de Andrade
089a3ab6d7 Bump sunweg to 2.1.1 (#113767) 2024-03-19 08:50:11 +01:00
J. Nick Koston
00f94feec9 Start energy load platform task eagerly (#113778) 2024-03-19 08:44:39 +01:00
J. Nick Koston
f51ac30b5a Call async task creation api in apple_tv (#113782) 2024-03-19 08:44:13 +01:00
J. Nick Koston
31a9c9451e Use async api in generic_thermostat to create tasks (#113783) 2024-03-19 08:43:49 +01:00
J. Nick Koston
3bb0d04452 Use async api in yamaha_musiccast to create tasks (#113785) 2024-03-19 08:43:27 +01:00
J. Nick Koston
2f88460b68 Use async api in template weather to create tasks (#113784) 2024-03-19 08:43:14 +01:00
J. Nick Koston
d740e4c3d7 Migrate restore_state shutdown to use run_immediately (#113786) 2024-03-19 08:42:49 +01:00
Simone Chemelli
ae55e8e1ba Align Comelit climate code to humidifier (#113747) 2024-03-19 08:42:07 +01:00
J. Nick Koston
2582172ad1 Create tasks eagerly with core create_task (#113781) 2024-03-19 08:41:39 +01:00
Joost Lekkerkerker
85e13bdb87 Require an icon for a service (#112373) 2024-03-19 08:29:29 +01:00
dependabot[bot]
ed9b5d843c Bump github/codeql-action from 3.24.7 to 3.24.8 (#113789)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-19 08:27:32 +01:00
dependabot[bot]
f680065664 Bump dawidd6/action-download-artifact from 3.1.3 to 3.1.4 (#113788) 2024-03-19 08:15:06 +01:00
J. Nick Koston
8b9a8a33f4 Start live history/logbook with eager tasks (#113779) 2024-03-18 21:00:51 -10:00
J. Nick Koston
e3ae66ca64 Bump PyMetno to 0.12.0 (#113777)
changelog: https://github.com/Danielhiversen/pyMetno/releases/tag/0.12.0
2024-03-19 06:57:14 +01:00
J. Nick Koston
c615b52840 Refactor integration startup time to show wall clock time (#113707)
* Refactor setup time tracking to exclude time waiting on other operations

We now exclude the import time and th time waiting on
base platforms to setup from the setup times

* tweak

* tweak

* tweak

* tweak

* adjust

* fixes

* fixes

* preen

* preen

* tweak

* tweak

* adjust

* tweak

* reduce

* do not count integrtion platforms against their parent integration

* handle legacy tts platforms

* stt as well

* one more wait

* use the same pattern in all the legacy

* fix tts and stt legacy

* fix

* fix

* reduce

* preen

* entity comp does not wait for platforms

* scene blocks as well

* fix test

* test fixes

* coverage

* coverage

* coverage

* fix test

* Update tests/test_setup.py

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

* Update tests/test_setup.py

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

* Update homeassistant/setup.py

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

* strip

* strip WAIT_PLATFORM_INTEGRATION

* strip WAIT_PLATFORM_INTEGRATION

* strip WAIT_PLATFORM_INTEGRATION

* strip WAIT_PLATFORM_INTEGRATION

* remove complexity

* Apply suggestions from code review

* no longer works that way

* fixes

* fixes

* fixes

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2024-03-18 21:45:34 -04:00
J. Nick Koston
9be5f3531f Run websocket shutdown listener with run_immediately (#113727) 2024-03-18 11:59:44 -10:00
Franck Nijhof
167e66d45c Add labels to service target (#113753) 2024-03-18 22:32:23 +01:00
Franck Nijhof
541d4b78ac Add WebSocket support for handling labels on areas registry (#113755) 2024-03-18 22:17:13 +01:00
Robert Svensson
506240be10 Streamline naming in deCONZ integration (#111977) 2024-03-18 22:08:06 +01:00
Franck Nijhof
e20cc4f8b9 Add WebSocket support for assigning labels to entities (#113757) 2024-03-18 22:03:37 +01:00
Franck Nijhof
51b8ffc69d Add WebSocket support for handling labels on device registry (#113758) 2024-03-18 21:19:27 +01:00
Jan-Philipp Benecke
f73f93913f Remove deprecated hass.components from netatmo webhook tests (#113691) 2024-03-18 19:31:13 +01:00
Robert Svensson
cb348ddbdb Axis use entity description light platform (#113602)
* Axis use entity description in light platform

* Clean up some old code

* Update homeassistant/components/axis/light.py

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

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2024-03-18 19:26:29 +01:00
Gido
1ed8232b02 Add config flow to Rova (#113596)
* Add Config Flow for Rova component

* Add tests for Rova config flow

* Fix data type

* Add rova to requirements for tests

* Removed seperate function for area check and global variable

* Add unique name and id to rova entities

* Add support for multiple rova entries

* Fix correct error after connection timeout or http error

* Revert SENSOR_TYPES update

* Add existing rova configuration from yaml as new entity

* Add tests for import configuration.yaml flow

* Cleanup code

* Update valid rova area check in config flow

* Changed abort keys and messages

* Updated using self.add_suggested_values_to_schema

* Update to pass tests

* Added missing strings

* Update sensor unique_ids

* Fix service name formatting

* Update tests for Rova entry

* Update tests to recover after error

* Update test name

* Apply suggestions from code review

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2024-03-18 18:00:54 +01:00
Max Holland
815d120645 Add support for Tuya dimmer module (#113741) 2024-03-18 16:59:49 +01:00
Joost Lekkerkerker
aba5dcb63e Patch Discovery timeout in govee light local (#113692) 2024-03-18 16:49:39 +01:00
Josef Zweck
eaf86ee1ea Log cannot connect exception in Tedee config flow (#113740)
log exception
2024-03-18 16:45:49 +01:00
Aidan Timson
8918eb6922 Add camera in use and pending reboot binary sensors to System Bridge (#104095)
* Add binary sensors

* Fix

* Fix

* Fix translations

* Add icons

* Fix attr

* Update string

* fix name

* Remove unnessasary check

* Remove unrelated changes

* Remove unrelated strings

* Apply suggestions from code review

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

* Update camera_in_use function and value_fn for binary sensors

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2024-03-18 16:21:52 +01:00
Xitee
7065625d28 Add additional buttons to OctoPrint (#103139)
* Add 3 new buttons

- System shutdown button
- System reboot button
- Octoprint restart button

* Enable buttons by default

* Add tests

* Fix tests

* Remove accidentally committed unused code

* Add RESTART device class to RestartOctoprint and RebootSystem buttons

* Apply suggestions to octoprint test_button

* Freeze time for OctoPrint button tests

* Make new button base class to prevent implementing the availability check multiple times
2024-03-18 16:20:22 +01:00
Jack Boswell
34b0ff40f3 Allow configuring Starlink sleep schedule (#103057)
* Expose sleep config getters and setters

* Add a switch for toggling sleep schedule

* Add Time platform

* Add frozen to dataclasses

* Update tests

* Add starlink time to coveragerc

* No more mixin

* Update time.py

* Update time.py

* Run data collectors asynchronously

* Fix timezone handling
2024-03-18 16:18:32 +01:00
Erwin Douna
e882d47cde Add Downloader config flow, including tests (#98722)
* Adding base line, including tests

* Adding validatge input and expanding tests

* Updating manifest

* Minor patch

* Revert minor patch, wrong nesting

* Adding proper translations

* Including abort message

* Update homeassistant/components/downloader/config_flow.py

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

* Rename exception class

* Refactor import

* Update strings

* Apply suggestions from code review

* Update homeassistant/components/downloader/__init__.py

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

* Update homeassistant/components/downloader/__init__.py

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

* Update homeassistant/components/downloader/__init__.py

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

* Update homeassistant/components/downloader/__init__.py

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

* Update homeassistant/components/downloader/__init__.py

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

* Update homeassistant/components/downloader/__init__.py

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

* Update homeassistant/components/downloader/__init__.py

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

* Reverting back filename and fix typing

* Reverting back mutex/lock

* Upgrade version

* Adding typing

* Removing coroutine

* Removing unload entry (for now)

* Removing comment

* Change type

* Putting download back in setup_entry

* Revert back code

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2024-03-18 16:16:24 +01:00
Chris Caron
7dc64a03ef Bump apprise to 1.7.4 (#113629)
Co-authored-by: jan iversen <jancasacondor@gmail.com>
2024-03-18 15:34:08 +01:00
J. Nick Koston
40ce2011be Run dhcp listeners with run_immediately (#113726)
Neither of these need a call_soon
2024-03-18 10:16:20 -04:00
Jan Bouwhuis
3dc8df2403 Get ServiceValidationError message from translation cache only (#113704)
* Get ServiceValidationError message from translation cache only

* Remove message for NotValidPresetModeError
2024-03-18 14:42:21 +01:00
Jan Bouwhuis
ec7aecef84 Get HomeAssistantError message from translation cache only (#113688)
Get HomeAssistant error message from translation cache only
2024-03-18 14:39:41 +01:00
Sid
727581eea3 Add first batch of Ruff PT rules (#113665)
* Add first batch of Ruff PT rules

* fix weather test

* Fix pilight test

* Update test_intent.py

* Update pilight test_init.py

* Update test_init.py
2024-03-18 13:26:14 +01:00
J. Nick Koston
8f33bad4ef Move legacy tts setup to use tracked tasks (#113717)
* Move legacy tts setup to a tracked task

* comment

* fix test

* fix test

* fix more tests

* tweak
2024-03-18 13:11:22 +01:00
J. Nick Koston
719d373bd7 Move legacy stt setup to use tracked tasks (#113718)
* Move legacy stt setup to use tracked tasks

* comment
2024-03-18 13:10:12 +01:00
J. Nick Koston
10f2d8b4b1 Move legacy notify setup to use tracked tasks (#113716)
* Move legacy notify setup to a tracked task

* fix test

* fix test

* comment
2024-03-18 13:09:21 +01:00
J. Nick Koston
264e023ab4 Run august stop listener with run_immediately (#113729)
There is no need for a call_soon here
2024-03-18 14:07:00 +02:00
J. Nick Koston
8a144d16f5 Move legacy device_tracker setup to a tracked task (#113715)
* Move legacy device_tracker setup to a tracked task

Legacy platforms are now loaded in a tracked task which
allows anything waiting on device_tracker (such as
a config entry that uses the device_tracker
platform) to proceed.

This also allows us to remove the workaround
of adding device_tracker to
hass.config.components in its setup

* tweak

* tweak

* fix tests
2024-03-18 10:39:59 +01:00
epenet
3844ade572 Fix unknown values in onewire (#113731)
* Fix unknown values in onewire

* Update tests
2024-03-18 10:12:46 +01:00
dependabot[bot]
20897e0a3a Bump dawidd6/action-download-artifact from 3.1.2 to 3.1.3 (#113720) 2024-03-18 08:28:10 +01:00
Ernst Klamer
e23ce42d3a Bump xiaomi-ble to 0.27.1 (#113686) 2024-03-17 19:40:03 -10:00
J. Nick Koston
fcdb7039f9 Migrate isy994 listeners to use run_immediately (#113661) 2024-03-17 17:38:48 -10:00
J. Nick Koston
9a6804b5d7 Adjust config flow pre-import comment in group (#113702) 2024-03-17 14:28:29 -10:00
Johnny Willemsen
0d279ccd13 Improve scaffold test_config_flow (#113229)
Update test_config_flow.py

Use DOMAIN constant
2024-03-18 00:47:11 +01:00
Sid
82a60fe8ad Enable Ruff RSE (#113695) 2024-03-18 00:40:38 +01:00
Jan Bouwhuis
685553d17d Cache late imported async_get_exception_message for HomeAssistantError (#113683)
* Cache late imported async_get_exception_message for HomeAssistantError

* Use a dict to store the function cache

* Update homeassistant/exceptions.py

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

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-17 21:23:46 +01:00
Maciej Bieniek
d8f74571a1 Add removal condition to Shelly battery sensor (#113703)
Co-authored-by: Maciej Bieniek <478555+bieniu@users.noreply.github.com>
2024-03-17 21:21:42 +01:00
J. Nick Koston
4d75940cd2 Start and stop template cache watcher to run_immediately (#113644) 2024-03-17 08:16:26 -10:00
J. Nick Koston
68320b1278 Migrate registry for labels and categories to run_immediately (#113645) 2024-03-17 08:16:11 -10:00
J. Nick Koston
93497dde8b Run registry cleanup listeners immediately (#113646) 2024-03-17 08:15:55 -10:00
J. Nick Koston
091199d24a Run entity registry write_unavailable_states immediately at start (#113647) 2024-03-17 08:15:41 -10:00
J. Nick Koston
dbbd6fff01 Move ESPHome disconnects to the close event (#113652) 2024-03-17 08:15:28 -10:00
J. Nick Koston
412fd3dc05 Add run_immediately to usb start/stop listeners (#113658) 2024-03-17 08:15:14 -10:00
Jan-Philipp Benecke
324c922c0d Remove deprecated hass.components from withings webhook tests (#113687)
* Remove deprecated `hass.components` from withings webhook tests

* Use patch.object
2024-03-17 17:48:58 +01:00
Jan-Philipp Benecke
681705394d Remove deprecated hass.components from network helper function (#113615)
* Remove deprecated `hass.components` from network helper function

* Remove deprecated use of `hass.components` in alexa camera tests
2024-03-17 17:42:48 +01:00
J. Nick Koston
d9bc09e93a Migrate stream listeners to use run_immediately and eager tasks (#113660)
None of these need to a call_soon and can shutdown a bit faster
2024-03-17 09:42:25 -07:00
Jan-Philipp Benecke
25c4ab070b Use mock_platform for event entity component tests instead of hass.components (#113667) 2024-03-17 17:32:16 +01:00
MarkGodwin
75a489deb9 Add WAN port connection control to TP-Link Omada gateways (#111431)
* Add gateway connection switches

* Add unit tests

* tplink_omada code review feedback

* Rebase and move icons and strings into json
2024-03-17 16:06:57 +01:00
Sid
295b4203a1 Re-ignore Ruff rule PLC1901 (#113675)
Re-ignore PLC1901
2024-03-17 16:04:40 +01:00
Jan Bouwhuis
81ab29a38e Freeze time on zwave_js update test (#113625)
Freeze time on jwave_js update test
2024-03-17 16:02:45 +01:00
Sid
929bcb92e2 Add Ruff LOG rules (#113677)
* Add Ruff LOG rules

* Address review comment

* Update const.py
2024-03-17 15:59:49 +01:00
Jan-Philipp Benecke
b8e1862746 Remove deprecated hass.components from image_processing platform (#113613)
* Remove deprecated `hass.components` from image_processing platform

* Add test and change log

* D'oh.. use updated error text
2024-03-17 15:59:29 +01:00
Michael
0643ff1cfe Improve debug logging in Tankerkoenig (#113674) 2024-03-17 13:44:32 +01:00
Sid
6113b99ddd Replace pylint pointless-statement with ruff B018 (#113582)
* Replace pylint pointless-statement with ruff B018

* fix occurrences of B018

* disable pylint expression-not-assigned as well

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-17 10:58:14 +01:00
Erik Montnemery
7b20641651 Add tests of homeworks __init__ (#113581) 2024-03-17 10:22:08 +01:00
Erik Montnemery
398c38b50d Add tests of homeworks button (#113578) 2024-03-17 10:06:57 +01:00
Sid
d5fd005db8 Add ruff rule PIE808 (#113621) 2024-03-17 09:56:26 +01:00
Erik Montnemery
1a70dbfd94 Add tests of homeworks light (#113579) 2024-03-17 09:46:36 +01:00
Erik Montnemery
8f6c4f8b33 Add tests of homeworks binary sensor (#113577) 2024-03-17 09:45:49 +01:00
J. Nick Koston
5e8265d8a4 Add run_immediately to bluetooth listeners (#113659) 2024-03-16 19:03:14 -10:00
J. Nick Koston
1f9c8694a8 Save bluetooth passive data eagerly at the stop event (#113648) 2024-03-16 19:02:57 -10:00
J. Nick Koston
6df3e9d7c0 Run bond shutdown listener with run_immediately (#113657) 2024-03-16 17:21:03 -10:00
J. Nick Koston
309fcb5c30 Eagerly shutdown homekit_controller at the stop event (#113650) 2024-03-16 17:15:46 -10:00
J. Nick Koston
4d430520a0 Run yalexs_ble shutdown with run_immediately (#113653) 2024-03-16 17:06:31 -10:00
J. Nick Koston
ba7ec4ac16 Eagerly shutdown unifiprotect at the stop event (#113655) 2024-03-16 17:04:04 -10:00
Sid
69564b1a17 Add ruff rule PIE800 (#113619)
Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-16 16:31:30 -10:00
Christopher Bailey
43652a4ace Deprecate UniFi Protect HDR switch and package sensor (#113636)
Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-16 16:15:32 -10:00
Christopher Bailey
0a26829ffc Bump pyunifiprotect to 5.0.2 (#113651) 2024-03-16 16:15:18 -10:00
J. Nick Koston
885abe2fda Cleanup sonos shutdown process (#113654) 2024-03-16 16:10:57 -10:00
luar123
26c1b7e72e Bump snapcast to 2.3.6 (#113606) 2024-03-16 21:16:26 -04:00
J. Nick Koston
6a6f3d46a9 Create config entry async_on_unload tasks eagerly (#113626) 2024-03-16 14:43:49 -10:00
J. Nick Koston
91fa612301 Run entity component shutdown immediately (#113635) 2024-03-16 14:42:36 -10:00
J. Nick Koston
fa68c5633c Fix zeroconf shutting down too early (#113638) 2024-03-16 14:42:27 -10:00
J. Nick Koston
513da0f71e Run functions from ssdp listeners immediately (#113634) 2024-03-16 13:52:01 -10:00
Sid
cede6af496 Consolidate ruff PL and Q rules (#113555) 2024-03-16 13:45:03 -10:00
J. Nick Koston
2f39187628 Shutdown homekit eagerly at the stop event (#113639) 2024-03-16 13:39:48 -10:00
J. Nick Koston
6e3e2d1693 Shutdown config entry manager immediately at the stop event (#113632) 2024-03-16 13:39:31 -10:00
J. Nick Koston
796f4deac2 Run shelly coordinator shutdown immediately at the stop event (#113633)
There is no need to use a call_soon here as we want to shutdown
right away
2024-03-16 19:36:02 -04:00
J. Nick Koston
44cac3c90a Run apple_tv shutdown eagerly at the stop event (#113637)
The shutdown can be done without having to schedule a task on the event loop
2024-03-16 19:34:27 -04:00
Christopher Bailey
e703baba0a Add new fields from UniFi Protect v3 (#113631) 2024-03-16 13:17:23 -10:00
Jan-Philipp Benecke
73f11064d7 Use mock_platform for button entity component tests instead of hass.components (#113627) 2024-03-16 12:47:59 -10:00
Sid
11c570ea7b Remove ignore for ruff PLC0208 (#113537) 2024-03-16 12:45:55 -10:00
Sid
fe9cc6705c Add ruff rule PIE804 (#113620)
Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-16 12:45:18 -10:00
Erik Montnemery
d0352ed91d Fix missing context when running script from template entity (#113523)
Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-16 12:37:24 -10:00
Christopher Bailey
0725ff34b1 Bump pyunifiprotect to 5.0.1 (#113630) 2024-03-16 23:26:56 +01:00
Allen Porter
a9da9ee443 Bump ical to 7.0.3 to fix local-todo persisted with invalid DTSTART values (#113526) 2024-03-16 12:03:26 -10:00
Robert Svensson
ab9b64729a Bump axis to v56 (#113608) 2024-03-16 12:02:52 -10:00
Jan Bouwhuis
554aefed42 Generate HomeAssistantError message from English translations (#113305)
* Fetch exception message from translation cache

* Improve tests

* Return translation key without path, cleanup

* Fetch translations when string variant is requested

* Move import

* revert changes ConfigValidationError

* mypy

* Remove _str__ method instead

* Type _message for mqtt template exception classes

* Revert changes made to test_config.py

* Undo changes TemplateError

* Follow up comments and test coverage
2024-03-16 22:56:48 +01:00
Lex Li
2bc4a5067d snmp: Better sensor support to resolve previous issues (#113624)
Co-authored-by: Christian Kühnel <christian.kuehnel@gmail.com>
Co-authored-by: jan iversen <jancasacondor@gmail.com>
2024-03-16 22:56:21 +01:00
J. Nick Koston
86ccb99f4c Fix race in removing modified devices from the entity registry (#113623) 2024-03-16 11:51:56 -10:00
Jan-Philipp Benecke
c58bba55bf Remove deprecated hass.components from legacy device tracker platform (#113612) 2024-03-16 11:19:29 -10:00
Sid
0b9c9aff62 Add ruff rules PIE790, PIE794, PIE807, PIE810 (#113617) 2024-03-16 11:04:58 -10:00
Antoni Czaplicki
cbe2a5883b Fix vulcan calendar offset (#113604)
* Fix offset on vulcan calendar

* Combine date, time and zone into one command in vulcan calendar
2024-03-16 13:59:24 -07:00
J. Nick Koston
7d58be1a6a Gather loading platforms in async_process_component_config (#113573) 2024-03-16 10:57:10 -10:00
J. Nick Koston
bb12d2e865 Avoid creating tasks in homeassistant_alerts when the debouncer will not fire (#113580) 2024-03-16 16:20:06 -04:00
J. Nick Koston
4174d88ad7 Add a guard to handle unhashable platforms in config (#113607)
Someone might set the platform to [fitbit] instead of fitbit

I have not seen anyone do this, but its good to guard against
it
2024-03-16 16:19:07 -04:00
Jan Bouwhuis
5dccd8204c Freeze time on profile test (#113618) 2024-03-16 21:16:18 +01:00
Jan-Philipp Benecke
4be9d3e7f6 Remove deprecated hass.components from mysensors (#113611) 2024-03-16 20:49:25 +01:00
Sid
6ee273a548 Clean up unneeded ruff noqa directives (#113616) 2024-03-16 09:48:37 -10:00
Robert Svensson
c57dcacade Axis use entity description in switch platform (#113595)
* Draft

* Make a generic register platform
2024-03-16 20:47:54 +01:00
Robert Svensson
00361f5293 Remove unnecessary method in UniFi entity loader (#113597) 2024-03-16 18:41:00 +01:00
Sid
ccd2e989c3 Enable ruff RUF005 and fix occurrences (#113589) 2024-03-16 07:37:20 -10:00
Massimo Savazzi
2a5c85a020 Add JVC Projector Sensors (#108949)
* Add JVC Projector Sensors - Power Status, Input

* Removed commented line, removed name in icons.json

* fixed icons.json file

* fixed tests

* Update homeassistant/components/jvc_projector/sensor.py

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

* Fixed as requested

* Fixed code as requested

* added fixes

* Fixed sensor creation

* fixed const

* fixed icons

* Added test for both sensors

* Added ha state stest

* fixed commented line and removed useless ones

* Changed time FAST - SLOW to be more responsive

* Rolled back to previous values 6/60

* Update sensor.py

removed off

* Update icons.json

* Removed the Input Sensor entity

* Update tests/components/jvc_projector/test_sensor.py

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

* Update tests/components/jvc_projector/test_sensor.py

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

* Update tests/components/jvc_projector/test_sensor.py

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

* Update tests/components/jvc_projector/test_sensor.py

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

* Update tests/components/jvc_projector/test_sensor.py

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

* Update tests/components/jvc_projector/test_sensor.py

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

* Updated unique id of sensor

Co-authored-by: Steve Easley <steve.easley@gmail.com>

* Added translation and string for Power Status

* Update homeassistant/components/jvc_projector/strings.json

Co-authored-by: Steve Easley <steve.easley@gmail.com>

* Update homeassistant/components/jvc_projector/strings.json

Co-authored-by: Steve Easley <steve.easley@gmail.com>

* Update strings.json

* Update strings.json

added missing ,

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Steve Easley <steve.easley@gmail.com>
2024-03-16 16:52:51 +01:00
Maciej Bieniek
6191b25563 Catch TimeoutError in Brother config flow (#113593)
* Catch TimeoutError in Brother config flow

* Update tests

* Remove unnecessary parentheses

---------

Co-authored-by: Maciej Bieniek <478555+bieniu@users.noreply.github.com>
2024-03-16 16:01:48 +01:00
J. Nick Koston
ef0c17749f Use async_create_task in recorder init tests (#113586) 2024-03-16 15:40:50 +01:00
Shay Levy
d17e397455 Ignore Shelly block update with cfgChanged None (#113587) 2024-03-16 16:18:41 +02:00
Shay Levy
a7fd1c278c Shelly config flow test wait for tasks to finish (#113588) 2024-03-16 16:18:13 +02:00
Christopher Fenner
1ffc514528 Add battery discharge sensor to ViCare integration (#113502)
Co-authored-by: jan iversen <jancasacondor@gmail.com>
2024-03-16 12:38:54 +01:00
Brett Adams
219cb7a788 Add additional sensors to Teslemetry (#112555)
* Add more sensors

* Fix coverage

* Dont do this rename yet

* Fix case

* Update snapshot

* Add icons

* Remove unused icons

* Update snapshot

* Remove last_value logic from TimeSensor

* Apply suggestions from code review

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

* Update constant case

* Remove useless test

* Add refresh test back

* Add assertion to post coordinator refresh

---------

Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2024-03-16 11:54:37 +01:00
Sid
470ef554d7 Fix freedompro tests for ruff B018 (#113583) 2024-03-16 00:03:25 -10:00
Sid
dd3101e161 Fix unifiprotect tests for ruff B018 (#113584) 2024-03-16 00:01:24 -10:00
J. Nick Koston
eb90c9a548 Reduce bottlenecks in bootstrap by ordering the setup of integrations (#113570) 2024-03-15 22:38:06 -10:00
J. Nick Koston
702488062b Move group config flow pre-import to its init (#113564) 2024-03-15 18:44:10 -10:00
Erik Montnemery
a5cde8a61e Improve typing of State.as_compressed_state (#113540) 2024-03-16 00:01:46 -04:00
Sid
27e844e3bf Add ruff B005, B015, B032 and fix occurrences (#113543)
Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-15 17:48:37 -10:00
J. Nick Koston
bb667abd51 Cleanup some circular imports in group (#113554) 2024-03-15 15:45:43 -10:00
Jan Bouwhuis
6e84dbde35 Fix lingering hassio issues test (#113569) 2024-03-15 15:10:24 -10:00
J. Nick Koston
b26928878f Remove group integration platforms that use the default states (#113562)
Remove group integration platforms that use the default

There is no need to register platforms that use the defaults
as the group code already uses STATE_ON/STATE_OFF when there
are no on/off states in the GroupIntegrationRegistry
2024-03-15 20:51:21 -04:00
J. Nick Koston
af06e03b71 Add profiler set_asyncio_debug service (#113447)
* Add profiler set_asyncio_debug service

Currently when a user has a problem with there event loop being blocked
the simplest way to enable asyncio debug is to add `debugpy:` to
`configuration.yaml`, however this approach slows the system which
makes the report less useful and harder to track down the problem.

We need a lightweight way to enable debug mode so users can report
problems with the event loop being blocked, and we have a better
chance of finding the source without side effects

* logging

* logging

* logging

* comments

* fix

* icon

* only if enabled

* coverage
2024-03-15 20:49:35 -04:00
On Freund
b644c03fa7 Send keep-alive frames in image proxy stream (#113542) 2024-03-15 14:00:33 -10:00
J. Nick Koston
51ece8b1ef Restore group config_flow pre-import (#113558) 2024-03-15 13:09:20 -10:00
Guido Schmitz
b96bceadfa Add translations for devolo Home Network exceptions (#105755)
* Add translations for devolo Home Network exceptions

* Add translations for ConfigEntryAuthFailed

* Update homeassistant/components/devolo_home_network/switch.py

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

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2024-03-15 23:53:16 +01:00
Joost Lekkerkerker
53a76fc792 Fix Airthings BLE illuminance sensor name (#113560) 2024-03-15 23:48:47 +01:00
Daniel Perna
2b04975332 Remove danielperna84 as codeowner (#109662)
* Remove danielperna84 as codeowner

* Update CODEOWNERS
2024-03-15 23:42:04 +01:00
J. Nick Koston
88f04bb3b4 Avoid calling entry.async_migrate in sonarr tests (#113557)
We should setup the the config entry instead of calling the
migrator directly

This fix was reverted out in #113553
2024-03-15 23:33:48 +01:00
J. Nick Koston
03bb791080 Add missing async_block_till_done to jellyfin test_invalid_auth test (#113556)
This fix was reverted out in #113553
2024-03-15 23:31:55 +01:00
G Johansson
e8de1a7031 Revert "Avoid pre-importing config_flows if the integration does not … (#113553)
Revert "Avoid pre-importing config_flows if the integration does not support …"

This reverts commit 9940f51b95.
2024-03-15 23:15:36 +01:00
J. Nick Koston
77a94ea515 Speed up loading sun (#113544)
* Speed up loading sun

* Speed up loading sun

* Speed up loading sun

* adjust

* tweak
2024-03-15 23:01:49 +01:00
Sid
d120993477 fix homekit test asserts (#113549) 2024-03-15 22:02:18 +01:00
Sid
b261f124d6 fix mqtt siren test asserts (#113550) 2024-03-15 21:59:30 +01:00
Erik Montnemery
397bde4652 Add missing continue in legacy recorder history function (#113535)
Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
2024-03-15 21:20:39 +01:00
Robert Svensson
3ba29c361a Remove old update of group unique id in deCONZ (#112533) 2024-03-15 21:09:44 +02:00
Robert Svensson
9c2c7f1a45 Remove old update of number unique id in deCONZ (#113524) 2024-03-15 21:08:18 +02:00
Robert Svensson
e90388afd1 Remove old update of sensor unique id in deCONZ (#113527) 2024-03-15 21:06:09 +02:00
J. Nick Koston
b7f7bed46c Import and create pyudev for usb in the executor (#113478) 2024-03-15 09:05:18 -10:00
Chris Talkington
29f07260f9 Use single_config_entry in jellyfin manifest (#113202) 2024-03-15 13:56:13 -05:00
jan iversen
02d4bf007d Do not allow modbus config without entities (#113516) 2024-03-15 19:49:29 +01:00
Joost Lekkerkerker
422d4ea5b3 Use Volume Flow Rate device class in Opentherm gw (#113531) 2024-03-15 19:12:38 +01:00
Joost Lekkerkerker
b6a06f49b7 Use Volume Flow Rate device class in DROP connect (#113528) 2024-03-15 19:12:04 +01:00
Robert Svensson
5b5ff92a05 Support configuring Axis to use HTTPS (#113271) 2024-03-15 18:58:49 +01:00
Joost Lekkerkerker
be7c4295dc Fix MyUplink tests (#113534) 2024-03-15 18:26:28 +01:00
Thomas55555
66aa2c038a Freeze timezone in bmw_connected_drive tests (#113533)
Freeze timezone in bmw_connected_drive
2024-03-15 18:22:17 +01:00
Joost Lekkerkerker
066594b25b Use Volume Flow Rate device class in BTHome (#113530) 2024-03-15 18:19:14 +01:00
dontinelli
98132d1cd3 Add Fyta integration (#110816)
* Initial commit for fyta integration

* Update __init__.py

Delete BinarySensor for first PR

* Update __init__.py

Rewind wrongful deletion of comma

* Delete homeassistant/components/fyta/binary_sensor.py

Delete binary_sensor for first pr of integration

* Update manifest.json

Updated requirement to new version of fyta_cli 0.2.1, where bug in import of modules has been resolved.

* Update requirements_test_all.txt

adjust to updated manifest

* Update requirements_all.txt

adjust to updated manifest

* Update test_config_flow.py

* Update config_flow.py

update file to correct error with _entry attribute

* Fyta integration - update initial PR based on review in initial PR #110816 (#2)

* adjustments to pass test for config_flow

* backport of changes in intitial PR to dev

* update text_config_flow

* changes based on review in initial PR #110816

* Update homeassistant/components/fyta/sensor.py

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

* Update homeassistant/components/fyta/config_flow.py

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

* Update homeassistant/components/fyta/config_flow.py

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

* Update homeassistant/components/fyta/sensor.py

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

* Update homeassistant/components/fyta/sensor.py

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

* Update homeassistant/components/fyta/coordinator.py

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

* Update homeassistant/components/fyta/config_flow.py

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

* Update homeassistant/components/fyta/strings.json

Co-authored-by: Sid <27780930+autinerd@users.noreply.github.com>

* Update homeassistant/components/fyta/strings.json

Co-authored-by: Sid <27780930+autinerd@users.noreply.github.com>

* Update homeassistant/components/fyta/manifest.json

Co-authored-by: Sid <27780930+autinerd@users.noreply.github.com>

* Adjustments based on PR-commet of Feb 19 (#3)

* add test for config_flow.validate_input

* update based on pr review

* update based on pr review

* further refinings based on PR review

* Update tests/components/fyta/test_config_flow.py

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

* Update test_config_flow.py

Update tests based on PR comment

* Update homeassistant/components/fyta/sensor.py

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

* Update homeassistant/components/fyta/sensor.py

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

* add handling and test for duplicate entry

* Update homeassistant/components/fyta/coordinator.py

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

* Update homeassistant/components/fyta/sensor.py

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

* Update homeassistant/components/fyta/entity.py

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

* Update test_config_flow.py

parametrize test for exceptions

* Update config_flow.py

Move _async_abort_entries_match, add arguments

* Update coordinator.py

* Update typing in coordinator.py

* Update coordinator.py

update typing

* Update coordinator.py

corrected typo

* Update coordinator.py

* Update entity.py

* Update sensor.py

* Update icons.json

* Update homeassistant/components/fyta/entity.py

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

* Update homeassistant/components/fyta/entity.py

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

* Update entity.py

* Update test_config_flow.py

* Update config_flow.py (change FlowResult to ConfigFlowResult)

* Update config_flow.py

* Update homeassistant/components/fyta/config_flow.py

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

* Update homeassistant/components/fyta/config_flow.py

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

* Update homeassistant/components/fyta/coordinator.py

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

* Update coordinator.py

* Update config_flow.py (typing FlowResult -> ConfigFlowResult)

* Update config_flow.py

* Aktualisieren von config_flow.py

* remove coordinator entities

* Update strings.json

remove plant_number

* Update icons.json

remove plant_number

* Update manifest.json

Update requirement to latest fyta_cli version

* Update requirements_all.txt

* Update requirements_test_all.txt

* Update homeassistant/components/fyta/sensor.py

* Update homeassistant/components/fyta/sensor.py

* Update homeassistant/components/fyta/coordinator.py

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

* Update homeassistant/components/fyta/coordinator.py

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

* Update homeassistant/components/fyta/coordinator.py

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

* Update homeassistant/components/fyta/entity.py

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

* Update homeassistant/components/fyta/strings.json

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

* Update homeassistant/components/fyta/strings.json

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

* Update tests/components/fyta/test_config_flow.py

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

* Update tests/components/fyta/test_config_flow.py

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

* move test-helpers into conftest.py, adjust import of coordinator.py

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
Co-authored-by: Sid <27780930+autinerd@users.noreply.github.com>
Co-authored-by: Robert Resch <robert@resch.dev>
2024-03-15 18:13:35 +01:00
soonsouth
cfc2f17f35 Remove repetitive words in comments and docstrings (#113529)
chore: remove repetitive words

Signed-off-by: soonsouth <cuibuwei@163.com>
2024-03-15 18:11:12 +01:00
Drew C
a73553581b Bump opower to 0.4.1 (#113509) 2024-03-15 18:10:58 +01:00
Mike Degatano
6ede1c543f Protect SupervisorIssues.update method (#113425) 2024-03-15 18:06:14 +01:00
Joost Lekkerkerker
38164c705e Add missing icon for Unifi protect service (#113508) 2024-03-15 16:40:48 +01:00
Joost Lekkerkerker
823481063e Add icon translations to Sonos (#112235) 2024-03-15 16:34:13 +01:00
cosimomeli
4107cd6ad8 Add Ring Intercom open door button (#113514)
* Add button

* Make Ruff happy

* Apply suggestions from code review

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

* Fix doc string

* Format

* Update tests/components/ring/test_button.py

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2024-03-15 15:31:51 +01:00
jan iversen
a9fb34d9c2 Remove modbus create_issue from init (#113510)
Create_issue only in check_config.
2024-03-15 15:16:06 +01:00
Erwin Douna
1ff049cc66 Add diagnostics platform to Fastdotcom (#111525) 2024-03-15 14:42:07 +01:00
Joost Lekkerkerker
4b4258881b Remove Sonos migrations (#113506) 2024-03-15 14:40:40 +01:00
Åke Strandberg
eb1f37ea9b Filter out irrelevant entities on SMO20 devices in myuplink (#113493) 2024-03-15 14:06:10 +01:00
J. Nick Koston
c69ab425c5 Speed up ffmpeg setup (#113496)
* Speed up ffmpeg setup

Only check for old versions of ffmpeg if is_official_image
is False

* Speed up ffmpeg setup

Only check for old versions of ffmpeg if is_official_image
is False

* Speed up ffmpeg setup

Only check for old versions of ffmpeg if is_official_image
is False

* Speed up ffmpeg setup

Only check for old versions of ffmpeg if is_official_image
is False

* Speed up ffmpeg setup

Only check for old versions of ffmpeg if is_official_image
is False

* Speed up ffmpeg setup

Only check for old versions of ffmpeg if is_official_image
is False

* adjust

* adjust

* twea

* Update homeassistant/components/ffmpeg/__init__.py

* forgot about the mock in conftest for comps
2024-03-15 09:05:42 -04:00
jan iversen
1c938f6422 create issues for modbus config errors (#113431) 2024-03-15 13:44:29 +01:00
On Freund
4181c62ec0 Bump pyrisco to 0.5.10 (#113505) 2024-03-15 13:38:39 +01:00
Franck Nijhof
0e2775667d Add category registry (#110897)
* Add category registry

* Add entity registry support

* Update homeassistant/components/config/entity_registry.py

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

* Use ulid instead

* Add tests for adding same name in different scopes

* Handle keyerror on update

* Lookup tweak

* Omit categories from entity registry snapshots

* Use base registry

* Update snapshots

* Update snapshots

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2024-03-15 13:25:16 +01:00
Franck Nijhof
436c83e8a7 Add theme color support to labels (#113404) 2024-03-15 13:22:06 +01:00
cosimomeli
360f7dea75 Add Ring Intercom support (#109819)
* Add button entity

* Add support for Ring intercom ("other" device type)

* description

* format

* - Tests
- Fallback when intercom devices arent inside response

* Fix ring button

* Update library

* Fix button after merge

* Move names to strings.json

* Remove button entity_category

* Add wifi sensors to other

* Add last_ sensors to other

* Fix tests

* Add button test

* Add new sensors tests

* Revert "Add last_ sensors to other"

This reverts commit 5c03bba5a1.

* Update library

* Revert "Revert "Add last_ sensors to other""

This reverts commit 27631978d0.

* Fix tests

* Remove default list for other

Co-authored-by: Steven B. <51370195+sdb9696@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: Steven B. <51370195+sdb9696@users.noreply.github.com>

* Copy mock to conftest

* Fix history test

* Change time skip

* Remove button

* Fix history test

---------

Co-authored-by: Martin Pham <tuyentq2009@gmail.com>
Co-authored-by: Steven B. <51370195+sdb9696@users.noreply.github.com>
2024-03-15 12:59:36 +01:00
Sebastian Noack
30d1f70468 Use on state icons by default in Balboa spa integration (#111911) 2024-03-15 12:52:21 +01:00
J. Nick Koston
9cc0006b92 Ensure TurboJPEG is imported in the executor (#113504)
The import was too late and it eneded up being imported
in the event loop
2024-03-15 12:23:53 +01:00
Shay Levy
e0b1531afa Remove OpenCV integration (#113455) 2024-03-15 12:23:30 +01:00
Matthias Alphart
7bcfa94b12 Use single_config_entry in KNX manifest (#112526) 2024-03-15 12:20:32 +01:00
dougiteixeira
13cd6eb00e Add icon translations to Moon (#111386) 2024-03-15 12:12:03 +01:00
Åke Strandberg
86607d2bbb Create more relevant names for myuplink DeviceInfo (#111502) 2024-03-15 12:11:13 +01:00
Robert Svensson
e41133e9f0 Remove old update unique id function from deCONZ binary sensor (#112536) 2024-03-15 12:05:45 +01:00
slyoldfox
ffe9b7801f Add missing mystrom sensor (#113225)
Co-authored-by: TheJulianJES <TheJulianJES@users.noreply.github.com>
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2024-03-15 12:05:10 +01:00
Thomas55555
309f554336 Address late review on adding an error sensor to Husqvarna Automower (#113242) 2024-03-15 12:04:33 +01:00
J. Nick Koston
45195d2ea9 Avoid multiple context switches to setup a sonos speaker (#113378) 2024-03-15 12:03:44 +01:00
Erik Montnemery
103b8b4dc5 Improve State docstring (#113501) 2024-03-15 12:01:11 +01:00
Diogo Gomes
3e3cf45a5d Bump croniter to 2.0.2 (#113494) 2024-03-15 12:00:08 +01:00
On Freund
99e29b75cc Revert setting communication delay in Risco init (#113497) 2024-03-15 11:42:53 +01:00
J. Nick Koston
c69495b64f Remove supports_encryption check from mobile_app (#113490)
helpers already ports nacl at top level so this check can never
be False

```
>>> import sys
>>> from nacl.secret import SecretBox
>>> assert nacl in sys.modules
>>>
```
2024-03-15 11:13:44 +01:00
J. Nick Koston
4df2398b9f Move loading of ha-av to the executor (#113485) 2024-03-15 11:02:10 +01:00
Robert Svensson
2b2b5a2b02 Bump axis to v55 (#113479) 2024-03-15 09:38:47 +01:00
Erik Montnemery
dd9fdac51e Remove unused tts fixture (#113480) 2024-03-14 22:25:10 -10:00
J. Nick Koston
bdede0e0da Start script runs eagerly (#113190) 2024-03-14 16:53:26 -10:00
Lex Li
92e73312ea Bump pysnmp-lextudio to version 6.0.11 (#113463) 2024-03-14 16:19:18 -10:00
J. Nick Koston
3528cc86d7 Fix delayed registry check to only using the short delay at running (#113471) 2024-03-14 15:11:09 -10:00
J. Nick Koston
052d7d1e19 Fix scene integration doing blocking I/O in the event loop to import platforms (#113391) 2024-03-14 14:56:57 -10:00
J. Nick Koston
09934d44c4 Reduce script overhead by avoiding creation of many tasks (#113183)
* Reduce script overhead by avoiding creation of many tasks

* no eager stop

* reduce

* make sure wait being cancelled is handled

* make sure wait being cancelled is handled

* make sure wait being cancelled is handled

* preen

* preen

* result already raises cancelled error, remove redundant code

* no need to raise it into the future

* will never set an exception

* Simplify long action script implementation

* comment

* preen

* dry

* dry

* preen

* dry

* preen

* no need to access protected

* no need to access protected

* dry

* name

* dry

* dry

* dry

* dry

* reduce name changes

* drop one more task

* stale comment

* stale comment
2024-03-14 20:28:27 -04:00
J. Nick Koston
e293afe46e Bump aiodhcpwatcher to 1.0.0 (#113469) 2024-03-14 14:16:19 -10:00
J. Nick Koston
4fb127e5af Avoid creating another ssl context in cert_expiry (#113467)
Creating an ssl context does blocking I/O as it has to
read the certs from disk
2024-03-14 19:58:11 -04:00
J. Nick Koston
5b80eb4c3d Reduce overhead to save the larger registries (#113462)
We save the device and entity registry to disk quite often, and
the cost of serializing them to the storage can block the event
loop for >100ms. Add a cache to reduce the change the loop is blocked
at an inopportune time at run time. The first write after startup
will still be a little slow but we do have to serialize the
bulk of it at least once as there is no way to avoid this

```
2024-03-14 11:28:19.765 WARNING (MainThread) [homeassistant.helpers.storage] Writing data with data_func: core.device_registry
2024-03-14 11:28:20.020 WARNING (MainThread) [homeassistant.helpers.storage] Writing data with data_func: core.entity_registry
2024-03-14 11:28:20.178 WARNING (MainThread) [asyncio] Executing <TimerHandle cancelled when=2319925.760294916 Store._async_schedule_callback_delayed_write() created at /Users/bdraco/home-assistant/homeassistant/helpers/storage.py:328> took 0.159 seconds
```
2024-03-14 19:54:43 -04:00
J. Nick Koston
28836be3eb Construct storage data in the executor to avoid blocking the event loop (#113465)
Construct storage data in the executor

Constructing storage data can be expensive for large files and can block the event
loop. While ideally we optimize the construction of the data, there are some places
we cannot make it any faster. To avoid blocking the loop, the construction of
the data is now done in the executor by running the data_func in the executor.

2024-03-14 11:28:20.178 WARNING (MainThread) [asyncio] Executing <TimerHandle cancelled when=2319925.760294916 Store._async_schedule_callback_delayed_write() created at /Users/bdraco/home-assistant/homeassistant/helpers/storage.py:328> took 0.159 seconds

There is some risk that the data_func is not thread-safe and needs to be run in
the event loop, but I could not find any cases in our existing code where it
would be a problem
2024-03-14 19:53:11 -04:00
Åke Strandberg
f95d649f44 Add icon translations to myuplink (#111466) 2024-03-15 00:47:10 +01:00
Pete Sage
7cdec9aeeb Bump aiooncue to 0.3.7 (#113451) 2024-03-15 01:42:13 +02:00
J. Nick Koston
5a62be571d Bump aiodhcpwatcher to 0.8.2 (#113466) 2024-03-14 13:09:58 -10:00
Joost Lekkerkerker
ba2d382eb6 Add service icons to Image processing (#113416)
Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
2024-03-14 23:49:05 +01:00
Joost Lekkerkerker
cd52f0f243 Add service icons to Notify (#113417)
Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
2024-03-14 23:48:53 +01:00
jan iversen
7cba34b2e6 Change modbus integration to use async library calls (#113450) 2024-03-14 23:19:52 +01:00
wilburCforce
28ef898775 Support lutron transition time and flash for lights (#109185)
* support transition time for lights

* bug fix and support for FLASH

* updated to flash() to match changes coming in pylutron

* bumped pylutron version in anticipation of next release

* Update manifest.json

* Update requirements_all.txt

* Update requirements_test_all.txt

* Update requirements_test_all.txt

* nits and code improves
2024-03-14 23:07:16 +01:00
Franck Nijhof
221893c1d7 Add aliases support to floor registry WebSocket API (#113401) 2024-03-14 23:07:07 +01:00
Jan Bouwhuis
b1c636c886 Fix hassfest icons check for notify and image_processing (#113446) 2024-03-14 22:51:18 +01:00
Jan Bouwhuis
3ed7a7166d Revert "Remove unused test helper mock_area_registry" (#113453) 2024-03-14 22:11:44 +01:00
Matthias Lohr
566cbc71a5 Add aroma therapy select entity for tolo integration (#113442)
* add select entity to allow aroma therapy slot selection

* improved translation readability
2024-03-14 21:03:41 +01:00
Joost Lekkerkerker
3f2a51bcff Add service icons to Climate (#113409) 2024-03-14 20:45:21 +01:00
Christopher Bailey
1ada10299a Check for EA release channel for UniFi Protect (#113432)
Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-14 09:07:54 -10:00
J. Nick Koston
5512e8b789 Deprecate async_run_job and async_add_job (#113260) 2024-03-14 09:06:55 -10:00
J. Nick Koston
aaac879c83 Fix calling sync api in counter/ffmpeg/device_tracker tests (#113441) 2024-03-14 19:34:44 +01:00
Joost Lekkerkerker
2b3f0a9459 Add icon translations to ZHA (#112368) 2024-03-14 19:28:54 +01:00
Joost Lekkerkerker
5c59b4d846 Add service icons to Abode (#113411) 2024-03-14 19:26:01 +01:00
Joost Lekkerkerker
87767a58fc Fix alarm control panel icons (#113413) 2024-03-14 19:25:33 +01:00
Joost Lekkerkerker
e68c27ec12 Add service icons to Fan (#113415) 2024-03-14 19:25:22 +01:00
Joost Lekkerkerker
36123717be Allow entity platforms without entity_component in icon validation (#113422)
* Allow entity platforms without entity_component

* Rename variable

---------

Co-authored-by: jbouwh <jan@jbsoft.nl>
2024-03-14 19:10:52 +01:00
Matthias Lohr
7359d66d32 add switch platform for tolo (#113440)
* upgrade tololib dependency to v1.0.0

* add switch to enable/disable aroma therapy

* aroma therapy and salt bath switch

* Update homeassistant/components/tolo/strings.json

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

* removed key from specific property list, it's required by default

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2024-03-14 19:10:29 +01:00
Franck Nijhof
2aadd643ed Add floors to service target (#110850) 2024-03-14 19:02:23 +01:00
Joost Lekkerkerker
20626947db Add icon translations to Unifi protect (#112332) 2024-03-14 18:43:09 +01:00
Christopher Bailey
2bf6170a6b Add UniFi Protect service to remove privacy zones (#111292) 2024-03-14 07:34:45 -10:00
Joost Lekkerkerker
02521c9da3 Add service icons to ADS (#113412) 2024-03-14 17:54:55 +01:00
Thomas55555
f1374503c3 Bump aioautomower to 2024.3.3 (#113430) 2024-03-14 17:51:24 +01:00
Joost Lekkerkerker
8a8546579c Add service icons to Scene (#113418) 2024-03-14 17:28:17 +01:00
Jeef
0867ace44a Bump weatherflow_cloud backing lib v0.2.13 (#113181)
* bump backing lib - and switch to rest models

* ci fix
2024-03-14 16:55:25 +01:00
Franck Nijhof
f7972ce9b2 2024.3.1 (#113249) 2024-03-14 16:53:07 +01:00
Joost Lekkerkerker
0316681615 Add service icons to Demo (#113414) 2024-03-14 16:49:17 +01:00
Joost Lekkerkerker
796d0381cc Add service icons to Utility meter (#113419)
* Add service icons to Utility meter

* Add service icons to Utility meter

* Update homeassistant/components/utility_meter/icons.json

Co-authored-by: Diogo Gomes <diogogomes@gmail.com>

* Update homeassistant/components/utility_meter/icons.json

Co-authored-by: Diogo Gomes <diogogomes@gmail.com>

---------

Co-authored-by: Diogo Gomes <diogogomes@gmail.com>
2024-03-14 16:48:13 +01:00
Joost Lekkerkerker
70286b38ec Fix icon mistakes (#113420) 2024-03-14 14:49:20 +01:00
Joost Lekkerkerker
606ee3c379 Enable PERF ruff rules (#113408) 2024-03-14 14:10:02 +01:00
Erik Montnemery
a16ea3d7bd Deprecate the map integration (#113215)
* Deprecate the map integration

* Revert changes in DashboardsCollection._async_load_data

* Add option to allow single word in dashboard URL

* Update tests

* Translate title

* Add icon

* Improve test coverage
2024-03-14 14:04:41 +01:00
Joost Lekkerkerker
fef2d7ddd4 Add service icons to Persistent Notification (#113340) 2024-03-14 14:02:15 +01:00
Joost Lekkerkerker
020b75d5de Add service icons to Blackbird (#113280) 2024-03-14 14:02:01 +01:00
Joost Lekkerkerker
21a2871014 Add service icons to Amcrest (#113276) 2024-03-14 14:01:51 +01:00
Joost Lekkerkerker
1191032b08 Add service icons to REST (#113346) 2024-03-14 14:01:41 +01:00
Joost Lekkerkerker
774b2800bf Add service icons to Group (#113302) 2024-03-14 14:01:30 +01:00
Joost Lekkerkerker
d81053a695 Add service icons to History Stats (#113306) 2024-03-14 14:01:20 +01:00
Joost Lekkerkerker
467a6f3ed0 Add service icons to Bluetooth Tracker (#113282) 2024-03-14 14:01:13 +01:00
Joost Lekkerkerker
265ecc141d Add service icons to Bayesian (#113278) 2024-03-14 14:01:04 +01:00
Joost Lekkerkerker
d10a244eaa Add service icons to Backup (#113277) 2024-03-14 14:00:57 +01:00
Joost Lekkerkerker
20c2bac32e Add service icons to Modbus (#113332) 2024-03-14 14:00:50 +01:00
Joost Lekkerkerker
09be817f76 Add service icons to Channels (#113284)
* Add service icons to Channels

* Update homeassistant/components/channels/icons.json

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

---------

Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
2024-03-14 13:56:02 +01:00
Joost Lekkerkerker
645e780445 Add service icons to Advantage air (#113272) 2024-03-14 13:55:47 +01:00
Matthias Lohr
6a1913b372 Bump tololib to 1.1.0 (#113268)
* upgrade tololib dependency to v1.0.0

* use latest available patch version

* fixed tolo tests

* fixed test cases
2024-03-14 13:55:16 +01:00
Joost Lekkerkerker
1fd447f65b Add service icons to Agent DVR (#113273) 2024-03-14 13:54:45 +01:00
Joost Lekkerkerker
816d984cac Add service icons to DuckDNS (#113290)
* Add service icons to DuckDNS

* Update homeassistant/components/duckdns/icons.json

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

---------

Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
2024-03-14 13:53:35 +01:00
Joost Lekkerkerker
500dd9330a Add service icons to Conversation (#113286) 2024-03-14 13:53:14 +01:00
Joost Lekkerkerker
85473b80ca Add service icons to Input Datetime (#113314) 2024-03-14 13:52:59 +01:00
Joost Lekkerkerker
43d4f10582 Add service icons to Logger (#113325)
* Add service icons to Logger

* Update homeassistant/components/logger/icons.json

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

---------

Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
2024-03-14 13:52:45 +01:00
Joost Lekkerkerker
a3a1647256 Add service icons to Logbook (#113324) 2024-03-14 13:52:27 +01:00
Joost Lekkerkerker
c1b05ce93d Add service icons to Dominos (#113288) 2024-03-14 13:52:10 +01:00
Joost Lekkerkerker
40566c3b68 Add service icons to Downloader (#113289) 2024-03-14 13:51:59 +01:00
Joost Lekkerkerker
02a07a3d15 Add service icons to Ebusd (#113291) 2024-03-14 13:51:24 +01:00
Joost Lekkerkerker
064491b915 Add service icons to HDMI CEC (#113304)
* Add service icons to HDMI CEC

* Update homeassistant/components/hdmi_cec/icons.json

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

---------

Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
2024-03-14 13:49:18 +01:00
Joost Lekkerkerker
141bdf33df Add service icons to Envisalink (#113292) 2024-03-14 13:48:58 +01:00
Joost Lekkerkerker
423a4dfc33 Add service icons to Foursquare (#113296) 2024-03-14 13:48:31 +01:00
Joost Lekkerkerker
ed91ccbfd4 Add service icons to Evohome (#113293) 2024-03-14 13:48:18 +01:00
Joost Lekkerkerker
5e04653431 Add service icons to Ffmpeg (#113294) 2024-03-14 13:47:11 +01:00
Joost Lekkerkerker
0eda6e86c5 Add service icons to Freebox (#113298) 2024-03-14 13:46:33 +01:00
Joost Lekkerkerker
dcd56e4ba7 Add service icons to Frontend (#113299) 2024-03-14 13:46:13 +01:00
Joost Lekkerkerker
8fa08c2fd8 Add service icons to Generic Thermostat (#113300) 2024-03-14 13:46:00 +01:00
Joost Lekkerkerker
4d98267cd9 Add service icons to Geniushub (#113301) 2024-03-14 13:45:03 +01:00
Joost Lekkerkerker
46ec25b2ef Add service icons to Habitica (#113303) 2024-03-14 13:44:52 +01:00
Joost Lekkerkerker
d88bebc255 Add service icons to Home Assistant (#113307) 2024-03-14 13:43:17 +01:00
Joost Lekkerkerker
3326fe6357 Add service icons to Homematic (#113308) 2024-03-14 13:40:24 +01:00
Joost Lekkerkerker
223e63b2d3 Add service icons to HTML5 (#113309) 2024-03-14 13:39:41 +01:00
Joost Lekkerkerker
95f269ef70 Add service icons to IHC (#113311) 2024-03-14 13:39:09 +01:00
Joost Lekkerkerker
41be0487c6 Add service icons to Input Number (#113315) 2024-03-14 13:38:56 +01:00
Joost Lekkerkerker
5573dbc5a7 Add service icons to Input button (#113313) 2024-03-14 13:38:47 +01:00
Joost Lekkerkerker
b6906d963b Add service icons to Input Select (#113316) 2024-03-14 13:36:30 +01:00
Joost Lekkerkerker
645a108e78 Add service icons to Input Text (#113317) 2024-03-14 13:36:03 +01:00
Joost Lekkerkerker
d79a8393de Add service icons to Intent Script (#113318) 2024-03-14 13:35:43 +01:00
Joost Lekkerkerker
be36626910 Add service icons to Iperf3 (#113319) 2024-03-14 13:35:14 +01:00
Joost Lekkerkerker
557e389159 Add service icons to Keba (#113320) 2024-03-14 13:34:42 +01:00
Joost Lekkerkerker
58f216fc89 Add service icons to Kef (#113321) 2024-03-14 13:33:53 +01:00
Joost Lekkerkerker
ca34fb3fbb Add service icons to Keyboard (#113322) 2024-03-14 13:33:01 +01:00
Joost Lekkerkerker
246ec0476f Add service icons to Local file (#113323) 2024-03-14 13:32:30 +01:00
Joost Lekkerkerker
c94fb8f660 Add service icons to Logi circle (#113326) 2024-03-14 13:29:22 +01:00
Joost Lekkerkerker
f9c1ed42a9 Add service icons to Lovelace (#113327) 2024-03-14 13:29:10 +01:00
Joost Lekkerkerker
03e6e2577a Add service icons to Matrix (#113328)
* Add service icons to Matrix

* Update homeassistant/components/matrix/icons.json
2024-03-14 13:27:38 +01:00
Joost Lekkerkerker
bb97063c48 Add service icons to Ness alarm (#113333) 2024-03-14 13:25:54 +01:00
Joost Lekkerkerker
75b4cd2733 Add service icons to Minio (#113331) 2024-03-14 13:25:45 +01:00
Joost Lekkerkerker
e303a6dae9 Add service icons to Microsoft Face (#113330) 2024-03-14 13:25:37 +01:00
Joost Lekkerkerker
6442d13a71 Add service icons to Media Extractor (#113329) 2024-03-14 13:25:27 +01:00
Joost Lekkerkerker
bac5a4d867 Add service icons to Netatmo (#113335) 2024-03-14 13:20:36 +01:00
Joost Lekkerkerker
d58ab85919 Add service icons to Nissan Leaf (#113336) 2024-03-14 13:20:28 +01:00
Joost Lekkerkerker
353b1cd08f Add service icons to nx584 (#113338) 2024-03-14 13:18:04 +01:00
Joost Lekkerkerker
2f16774f66 Add service icons to Pilight (#113341) 2024-03-14 13:16:58 +01:00
Joost Lekkerkerker
415402e7dc Add service icons to Python Scripts (#113342) 2024-03-14 13:16:12 +01:00
Joost Lekkerkerker
821a235c59 Add service icons to QVR Pro (#113343) 2024-03-14 13:15:25 +01:00
Joost Lekkerkerker
8c13b817ea Add service icons to Xiaomi Miio (#113364) 2024-03-14 13:15:11 +01:00
Joost Lekkerkerker
bfe6d0873a Add service icons to Remember the milk (#113345) 2024-03-14 13:14:48 +01:00
Joost Lekkerkerker
98c250b910 Add service icons to RFLink (#113348)
* Add service icons to RFLink

* Update homeassistant/components/rflink/icons.json
2024-03-14 13:14:15 +01:00
Joost Lekkerkerker
b8d232ab7f Add service icons to Route53 (#113349) 2024-03-14 13:12:51 +01:00
Joost Lekkerkerker
2a2f95ce8e Add service icons to Telegram (#113356) 2024-03-14 13:12:43 +01:00
Joost Lekkerkerker
ca1c247574 Add service icons to Toon (#113359) 2024-03-14 13:12:20 +01:00
Joost Lekkerkerker
13a2db0348 Add service icons to Telegram bot (#113357) 2024-03-14 13:12:03 +01:00
Joost Lekkerkerker
5f48083eca Add service icons to Wemo (#113363) 2024-03-14 13:11:55 +01:00
Joost Lekkerkerker
ffe6810769 Add service icons to Yamaha (#113365) 2024-03-14 13:05:43 +01:00
Franck Nijhof
064f96f8fa Add floor support to areas WebSocket API (#113402) 2024-03-14 12:55:31 +01:00
Joakim Sørensen
a6594f8860 Bump hass-nabucasa from 0.78.0 to 0.79.0 (#113405) 2024-03-14 12:54:43 +01:00
jan iversen
7696973932 Move modbus check_config to setup, to have access to hass (#112828) 2024-03-14 12:54:01 +01:00
Joost Lekkerkerker
77a67191de Add service icons to Ombi (#113339) 2024-03-14 11:42:40 +01:00
Joost Lekkerkerker
1c56c7b136 Add service icons to Snips (#113352) 2024-03-14 11:42:12 +01:00
Joost Lekkerkerker
374695bfa6 Add service icons to Recorder (#113344) 2024-03-14 11:41:43 +01:00
Joost Lekkerkerker
4f120ea223 Add service icons to Schedule (#113350) 2024-03-14 11:41:09 +01:00
Joost Lekkerkerker
eeaf8ddd69 Add service icons to SMTP (#113351) 2024-03-14 11:40:46 +01:00
Joost Lekkerkerker
11e69f6baa Add service icons to Timer (#113358) 2024-03-14 11:40:22 +01:00
Joost Lekkerkerker
4c3943e264 Add service icons to System Bridge (#113354) 2024-03-14 11:35:43 +01:00
Chris Talkington
05c0416644 Bump pyipp to 0.15.0 (#113204)
update pyipp to 0.15.0
2024-03-14 11:05:33 +01:00
Joost Lekkerkerker
246017b3fa Add service icons to Alert (#113274) 2024-03-14 11:03:13 +01:00
Joost Lekkerkerker
cd902c917c Add service icons to Universal (#113361) 2024-03-14 11:00:27 +01:00
Joost Lekkerkerker
73af5f5be1 Add service icons to Statistics (#113353) 2024-03-14 10:59:49 +01:00
Joost Lekkerkerker
ca916bcc98 Add service icons to System Log (#113355) 2024-03-14 10:59:28 +01:00
Joost Lekkerkerker
fc85b4f123 Add service icons to Wake on LAN (#113362) 2024-03-14 10:59:01 +01:00
Thomas55555
63e3da1aca Add loggers to Husqvarna Automower (#113381) 2024-03-14 10:58:24 +01:00
Mike Degatano
6ca837b4e1 Supervisor issues update retries on failure (#113373) 2024-03-14 10:57:27 +01:00
Mike Degatano
45ef5a3edf Apply suggestion failures fail supervisor repair (#113372) 2024-03-14 10:57:24 +01:00
Chris Talkington
297c7c11fc Add diagnostics for IPP (#113205) 2024-03-14 10:57:21 +01:00
J. Nick Koston
cda9bf7051 Fix failing google diagnostics test (#113095) 2024-03-14 10:57:17 +01:00
Jonny Bergdahl
eb04365590 Fix Twitch auth token refresh (#112833)
* Fix for expired token

* Add auth token refresh.

* Eliminate extra auth call

* Fixed mock client

---------

Co-authored-by: Jonny Bergdahl <bergdahl@users.noreply.github.com>
2024-03-14 10:57:13 +01:00
Mike Degatano
5a25349cf7 Supervisor issues update retries on failure (#113373) 2024-03-14 10:55:04 +01:00
Mike Degatano
6d903300be Apply suggestion failures fail supervisor repair (#113372) 2024-03-14 10:53:55 +01:00
J. Nick Koston
6832611550 Fix smartthings doing blocking I/O in the event loop to import platforms (#113382) 2024-03-14 10:47:18 +01:00
Joost Lekkerkerker
972efada75 Add service icons to Zoneminder (#113366) 2024-03-14 10:46:52 +01:00
J. Nick Koston
c466008fb4 Migrate sun to use single_config_entry (#113370) 2024-03-14 10:45:59 +01:00
J. Nick Koston
c122e32d20 Fix telegram_bot doing blocking I/O in the event loop to import platforms (#113383) 2024-03-14 10:45:11 +01:00
J. Nick Koston
4341b21a61 Migrate auth to use async_import_module to avoid blocking I/O in the event loop (#113387) 2024-03-14 10:44:36 +01:00
Steven B
4aec48d358 Update ring integration imports (#113397)
Update ring imports for patching where library is created
2024-03-14 10:44:17 +01:00
Erik Montnemery
9eea786411 Remove old migration from lovelace (#113388) 2024-03-14 10:43:55 +01:00
Joost Lekkerkerker
7ae852e5ed Enable ISC ruff rule (#113270) 2024-03-14 10:43:03 +01:00
Joost Lekkerkerker
05172d8e4d Improve loops and lists (#113269)
* Enable PERF

* Enable PERF rule

* Enable PERF rule

* Don't enable flag yet
2024-03-14 10:22:20 +01:00
Joost Lekkerkerker
8a98fb7cfd Add service icons to Filter (#113295) 2024-03-14 10:21:38 +01:00
tronikos
de726d0e6e Add virtual integration Sacramento Municipal Utility District (SMUD) (#113389)
smud
2024-03-14 09:55:37 +01:00
Joost Lekkerkerker
fd9cc3a53e Add service icons to Debug py (#113287) 2024-03-14 09:50:53 +01:00
dependabot[bot]
e9e5712c31 Bump docker/login-action from 3.0.0 to 3.1.0 (#113384)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-14 09:48:46 +01:00
tronikos
bc6917552f Bump gassist-text to 0.0.11 (#113386)
Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-13 22:47:09 -10:00
tronikos
438215f220 Bump opower to 0.4.0 (#113390) 2024-03-13 22:46:44 -10:00
Thomas55555
33c75bfd36 Add loggers to Husqvarna Automower (#113381) 2024-03-14 09:29:11 +01:00
Joost Lekkerkerker
34b1f848c1 Add service icons to Unifi (#113360) 2024-03-14 07:04:39 +01:00
Chris Talkington
fe99d80054 Add diagnostics for IPP (#113205) 2024-03-14 00:44:07 -05:00
J. Nick Koston
c1f5c7c4b7 Remove usage of async_add_job in tests (#113259) 2024-03-13 19:33:33 -10:00
J. Nick Koston
c3b5e819c5 Fix group loading too late resulting in incorrect state (#113262) 2024-03-13 19:18:15 -10:00
Joost Lekkerkerker
4ed3ea3b02 Add service icons to REST command (#113347) 2024-03-14 06:10:48 +01:00
J. Nick Koston
4f326df088 Remove async_add_job calls from qwikswitch (#113258) 2024-03-13 18:34:37 -10:00
J. Nick Koston
cfe14bca8f Add a helper to import modules from the event loop (#113169)
* Add a helper to import modules in the event loop

Replaces the one used for triggers with a more generic helper
that can be reused and uses a future to avoid importing concurrently

* Add a helper to import modules in the event loop

Replaces the one used for triggers with a more generic helper
that can be reused and uses a future to avoid importing concurrently

* coverage

* make sure we do not retry

* coverage
2024-03-14 00:26:33 -04:00
J. Nick Koston
4f113f256f Migrate script integration to create eager tasks (#113189)
Along with #113183 the script execution may be able to
synchronously without having to be scheduled on the event loop
2024-03-14 00:23:25 -04:00
J. Nick Koston
9d1c683a70 Remove async_add_job calls from configurator (#113256)
The plan is to deprecate `async_add_job` to reduce the number of job APIs we have to maintain.

See #113179 for additional history.

This one got the smallest change possible since its likely to go away as
well at some point
2024-03-14 00:22:40 -04:00
J. Nick Koston
7f37732e71 Migrate solax away from using async_add_job (#113257)
The plan is to deprecate `async_add_job` to reduce the number of job APIs we have to maintain.

See #113179 for additional history.

`async_add_job` was not being used as expected here
2024-03-14 00:22:15 -04:00
J. Nick Koston
9ef0a8cb95 Add default_config to the bootstrap pre-imports (#113263)
This does not make default_config a requirement, it only preloads
the python code for the integration so it does not have to be loaded
when the import executor is busy. While its a tiny init file, it always
ends up at the end of the line and delays startup
2024-03-14 00:15:19 -04:00
J. Nick Koston
870caf90c1 Bump ha-ffmpeg to 3.2.0 (#113297)
No longer needs to use the executor to run subprocesses

changelog: https://github.com/home-assistant-libs/ha-ffmpeg/compare/3.1.0...3.2.0
2024-03-14 00:14:13 -04:00
J. Nick Koston
9940f51b95 Avoid pre-importing config_flows if the integration does not support migration (#113369)
* Avoid pre-importing config_flows if the integration does support migration

Currently we pre-import the config flow module if it exists since
setting up the config entry required comparing the versions found
in the config_flow.py. We can avoid the pre-import if the integration
does not support async_migrate_entry which means we avoid loading
many config flows in memory at startup.

* cover

* fix missing block

* do not call directly

* its too fast now, the test gets more along

* Update homeassistant/loader.py
2024-03-14 00:13:40 -04:00
Marc Mueller
d1d28dbfb8 Fix uv cache dir env [ci] (#113312) 2024-03-14 05:01:57 +01:00
J. Nick Koston
6338c8d86e Bump aiodiscover to 2.0.0 (#113337) 2024-03-13 17:24:33 -10:00
J. Nick Koston
3d1a65a1c3 Bump bluetooth-auto-recovery to 1.4.0 (#113368) 2024-03-13 17:13:22 -10:00
J. Nick Koston
9e645e1b00 Bump aiodns to 3.1.1 (#113371) 2024-03-13 16:46:40 -10:00
J. Nick Koston
e0828f1efc Ensure apple_tv setup retries later on timeout (#113367) 2024-03-13 15:12:13 -10:00
Joost Lekkerkerker
1abb448106 Add service icons to Command line (#113285) 2024-03-13 14:07:52 -10:00
Franck Nijhof
b88cdd78bc Hotfix import error in ZHA for 2024.3.1 patch release (#113250) 2024-03-13 19:35:43 +01:00
Franck Nijhof
525b20ca8e Bump version to 2024.3.1 2024-03-13 19:15:13 +01:00
Maciej Bieniek
5769ba023c Bump brother library to version 4.0.2 (#113235)
Co-authored-by: Maciej Bieniek <478555+bieniu@users.noreply.github.com>
2024-03-13 19:14:09 +01:00
Chris Talkington
f7da6b5e81 Bump rokuecp to 0.19.2 (#113198) 2024-03-13 19:14:05 +01:00
Ståle Storø Hauknes
6fdfc554a6 Bump airthings_ble to 0.7.1 (#113172)
Co-authored-by: Ståle Storø Hauknes <LaStrada@users.noreply.github.com>
2024-03-13 19:14:01 +01:00
Michael Hansen
962e5ec92a Bump intents to 2023.3.12 (#113160)
Bump intents
2024-03-13 19:13:57 +01:00
Stefan Agner
095d0d0779 Add message from Bad Request errors to HassioAPIError (#113144)
Co-authored-by: Mike Degatano <michael.degatano@gmail.com>
2024-03-13 19:13:50 +01:00
Josef Zweck
d010df7116 bump pytedee_async to 0.2.16 (#113135) 2024-03-13 19:13:07 +01:00
J. Nick Koston
a63bf74886 Bump aiodhcpwatcher to 0.8.1 (#113096) 2024-03-13 19:12:19 +01:00
Robert Svensson
cac22154a8 Bump axis to v54 (#113091)
Co-authored-by: J. Nick Koston <nick@koston.org>
2024-03-13 19:12:15 +01:00
Marcel van der Veldt
0b2322c466 Fix colormode attribute on grouped Hue light (#113071) 2024-03-13 19:12:12 +01:00
Lukas de Boer
66cd6c0d23 Bump rova to 0.4.1 (#113066) 2024-03-13 19:12:08 +01:00
Marcel van der Veldt
a2e9ecfcde Fix for controlling Hue switch entities (#113064) 2024-03-13 19:12:05 +01:00
Alistair Francis
8ac5da95f8 components/gardena_bluetooth: Improve avaliability reliability (#113056)
* components/gardena_bluetooth: Improve avaliability reliability

The available() function incorrectly returns false even though the device
is accessible.

The last_update_success property should correctly indicate if the device
isn't contactable, so we don't need to call async_address_present().
This is confirmed by seeing that no other users are calling
async_address_present() in the available() function.

This commit removes the call to async_address_present() to help fix the
sensor being unavailable when using a ESPHome BLE proxy.

Signed-off-by: Alistair Francis <alistair@alistair23.me>

---------

Signed-off-by: Alistair Francis <alistair@alistair23.me>
Co-authored-by: Joakim Plate <elupus@ecce.se>
2024-03-13 19:12:01 +01:00
Folke Lemaitre
911b39666d Fix hvac_mode for viessmann devices with heatingCooling mode (#113054) 2024-03-13 19:11:56 +01:00
Scott K Logan
2dbc63809d Fix some handle leaks in rainforest_raven (#113035)
There were leaks when
* The component was shutdown
* There was a timeout during the initial device opening

Additionally, the device was not closed/reopened when there was a
timeout reading regular data.
2024-03-13 19:10:59 +01:00
Allen Porter
a448c904d3 Bump ical to 7.0.1 and always use home assistant timezone for local todo dtstart (#113034) 2024-03-13 19:09:15 +01:00
Maciej Bieniek
7b5f879305 Fix availability for GIOS index sensors (#113021)
* Fix availability for index sensors

* Improve test_availability()

---------

Co-authored-by: Maciej Bieniek <478555+bieniu@users.noreply.github.com>
2024-03-13 19:08:24 +01:00
Robert Svensson
76cf25228f Bump axis to v53 (#113019) 2024-03-13 19:07:18 +01:00
Ernst Klamer
bbe88c2a5e Bump bthome-ble to 3.8.0 (#113008)
Bump bthome-ble
2024-03-13 19:07:14 +01:00
David Knowles
def4f3cb09 Add missing translation placeholder in Hydrawise (#113007)
Add missing translation placeholder
2024-03-13 19:07:11 +01:00
星野SKY
0d262ea9d4 Bump boschshcpy to 0.2.82 (#112890) 2024-03-13 19:07:08 +01:00
J. Nick Koston
fc2ca1646a Fix MJPEG fallback when still image URL is missing with basic auth (#112861)
* Fix MJPEG fallback when still image URL is missing with basic auth

I picked up an old DCS-930L (circa 2010) camera to test with
to fix #94877

* Fix MJPEG fallback when still image URL is missing with basic auth

I picked up an old DCS-930L (circa 2010) camera to test with
to fix #94877

* Fix MJPEG fallback when still image URL is missing with basic auth

I picked up an old DCS-930L (circa 2010) camera to test with
to fix #94877

* Fix MJPEG fallback when still image URL is missing with basic auth

I picked up an old DCS-930L (circa 2010) camera to test with
to fix #94877
2024-03-13 19:07:04 +01:00
Jan Bouwhuis
2d7de216a7 Fix google_asssistant sensor state reporting (#112838)
* Fix post google_assistant sensor values as float not string

* Fix aqi reporting and improve tests

* Fix _air_quality_description_for_aqi and  test
2024-03-13 19:07:01 +01:00
mrchi
8f2f9b8184 Bump openwrt-luci-rpc version to 1.1.17 (#112796) 2024-03-13 19:06:58 +01:00
Lex Li
93a01938a4 Upgrade pysnmp-lextudio to version 6.0.9 (#112795) 2024-03-13 19:06:55 +01:00
Shay Levy
70389521bf Bump bthome-ble to 3.7.0 (#112783) 2024-03-13 19:06:52 +01:00
Arie Catsman
3f22ad4eac Bump pyenphase to 1.19.2 (#112747) 2024-03-13 19:06:48 +01:00
Allen Porter
d99b9f7a70 Fix local calendar handling of empty recurrence ids (#112745)
* Fix handling of empty recurrence ids

* Revert logging changes
2024-03-13 19:06:45 +01:00
J. Nick Koston
5a125bf379 Guard against db corruption when renaming entities (#112718) 2024-03-13 19:06:41 +01:00
jan iversen
f7b64244b8 Allow duplicate names in different modbus entities (#112701)
Allow duplicate names in different entities.
2024-03-13 19:05:36 +01:00
Maciej Bieniek
c2543289b7 Downgrade pysnmp-lextudio to version 5.0.34 (#112696)
Downgrade pysnmp-lextudio to version 5.0.34

Co-authored-by: Maciej Bieniek <478555+bieniu@users.noreply.github.com>
2024-03-13 19:03:51 +01:00
Alin Balutoiu
9e977f2c70 Fix tado climate service (#112686) 2024-03-13 19:03:47 +01:00
Aaron Bach
e95ce2d390 Make sure Notion saves new refresh token upon startup (#112676)
* Make sure Notion saves new refresh token upon startup

* Code review

* Typing

* Smoother syntax

* Fix tests

* Fix tests for real
2024-03-13 19:03:42 +01:00
Aaron Bach
503fbfc038 Bump aionotion to 2024.03.0 (#112675) 2024-03-13 19:03:39 +01:00
Jeef
23fee438a9 Bump weatherflow4py to 0.1.17 (#112661) 2024-03-13 19:03:36 +01:00
Mike Woudenberg
1f9e369b73 Update Loqed helper for more logging (#112646)
Updates Loqed helper for more logging
2024-03-13 19:03:33 +01:00
Robert Svensson
403013b7bd Bump axis to v52 (#112632)
* Bump axis to v51

* Bump to v52
2024-03-13 19:03:30 +01:00
jan iversen
e348c7b043 Bump pymodbus to v3.6.5 (#112629) 2024-03-13 19:03:25 +01:00
Thomas55555
4db36d5ea9 Bump aioautomower to 2024.3.0 (#112627)
Fix error in Husqvarna automower in Zones dataclass
2024-03-13 19:02:32 +01:00
Erik Montnemery
aebbee681c Make hass-nabucasa a core requirement (#112623) 2024-03-13 18:50:48 +01:00
Bram Kragten
2985ab3922 Update frontend to 20240307.0 (#112620) 2024-03-13 18:47:04 +01:00
jan iversen
aa374944a1 modbus scan_interval: 0 is correct configuration (#112619) 2024-03-13 18:46:59 +01:00
jan iversen
84d14cad7f Issue warning modbus configuration when modbus configuration is empty (#112618) 2024-03-13 18:45:53 +01:00
Josef Zweck
b9a14d5eb5 Include pytedee_async logger in tedee integration (#112590)
add pytedee logger
2024-03-13 18:42:02 +01:00
Mr. Bubbles
4514f08a42 Fix incorrect filtering of unsupported locales in bring-api (#112589) 2024-03-13 18:40:54 +01:00
Erik Montnemery
2689f78925 Restore the juicenet integration (#112578) 2024-03-13 18:39:46 +01:00
Jeef
85b63c16e9 Bump weatherflow4py to 0.1.14 (#112554)
adding missing rain states
2024-03-13 18:35:59 +01:00
Jeef
4b387b5d77 Weatherflow_cloud backing lib bump (#112262)
Backing lib bump
2024-03-13 18:35:53 +01:00
Michael Hansen
fba6e5f065 Bump intents to 2024.3.6 (#112515) 2024-03-13 18:33:28 +01:00
puddly
095aab5f9d Disable updating ZHA coordinator path from discovery info (#112415)
* Never update the device path from config flows

* Bring coverage up to 100%

* Update tests/components/zha/test_config_flow.py

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

---------

Co-authored-by: TheJulianJES <TheJulianJES@users.noreply.github.com>
2024-03-13 18:33:25 +01:00
Henning Claßen
c60f203aab Update the numato-gpio dependency of the numato integration to v0.12.0 (#112272)
* Update the numato-gpio dependency of the numato integration to v0.12.0

* Augment numato integration manifest with integration_type

Fulfills a requirement in the PR checklist.
2024-03-13 18:33:22 +01:00
Steven Looman
57c8d47ff3 Improve discovering upnp/igd device by always using the SSDP-discovery for the Unique Device Name (#111487)
* Always use the UDN found in the SSDP discovery, instead of the device description

* Ensure existing DeviceEntries are still matched
2024-03-13 18:33:19 +01:00
On Freund
e087ea5345 Use friendly name for camera media source (#110882) 2024-03-13 18:33:15 +01:00
FieldofClay
3c4bdebcda Ignore AussieBroadband services that don't support usage information (#110253) 2024-03-13 18:33:12 +01:00
mattmccormack
6f6f37ca24 Add auto fan mode icon (#110185) 2024-03-13 18:33:09 +01:00
Jan Stienstra
649dd433d5 Fix optional Jellyfin RunTimeTicks (#108254) 2024-03-13 18:33:00 +01:00
2957 changed files with 89688 additions and 45627 deletions

View File

@@ -202,6 +202,7 @@ omit =
homeassistant/components/control4/__init__.py
homeassistant/components/control4/director_utils.py
homeassistant/components/control4/light.py
homeassistant/components/control4/media_player.py
homeassistant/components/coolmaster/coordinator.py
homeassistant/components/cppm_tracker/device_tracker.py
homeassistant/components/crownstone/__init__.py
@@ -250,7 +251,7 @@ omit =
homeassistant/components/dormakaba_dkey/lock.py
homeassistant/components/dormakaba_dkey/sensor.py
homeassistant/components/dovado/*
homeassistant/components/downloader/*
homeassistant/components/downloader/__init__.py
homeassistant/components/dsmr_reader/__init__.py
homeassistant/components/dsmr_reader/definitions.py
homeassistant/components/dsmr_reader/sensor.py
@@ -461,6 +462,10 @@ omit =
homeassistant/components/frontier_silicon/browse_media.py
homeassistant/components/frontier_silicon/media_player.py
homeassistant/components/futurenow/light.py
homeassistant/components/fyta/__init__.py
homeassistant/components/fyta/coordinator.py
homeassistant/components/fyta/entity.py
homeassistant/components/fyta/sensor.py
homeassistant/components/garadget/cover.py
homeassistant/components/garages_amsterdam/__init__.py
homeassistant/components/garages_amsterdam/binary_sensor.py
@@ -545,10 +550,6 @@ omit =
homeassistant/components/homematic/notify.py
homeassistant/components/homematic/sensor.py
homeassistant/components/homematic/switch.py
homeassistant/components/homeworks/__init__.py
homeassistant/components/homeworks/binary_sensor.py
homeassistant/components/homeworks/button.py
homeassistant/components/homeworks/light.py
homeassistant/components/horizon/media_player.py
homeassistant/components/hp_ilo/sensor.py
homeassistant/components/huawei_lte/__init__.py
@@ -747,7 +748,6 @@ omit =
homeassistant/components/lyric/climate.py
homeassistant/components/lyric/sensor.py
homeassistant/components/mailgun/notify.py
homeassistant/components/map/*
homeassistant/components/mastodon/notify.py
homeassistant/components/matrix/__init__.py
homeassistant/components/matrix/notify.py
@@ -776,9 +776,11 @@ omit =
homeassistant/components/microbees/__init__.py
homeassistant/components/microbees/api.py
homeassistant/components/microbees/application_credentials.py
homeassistant/components/microbees/binary_sensor.py
homeassistant/components/microbees/button.py
homeassistant/components/microbees/const.py
homeassistant/components/microbees/coordinator.py
homeassistant/components/microbees/cover.py
homeassistant/components/microbees/entity.py
homeassistant/components/microbees/light.py
homeassistant/components/microbees/sensor.py
@@ -804,6 +806,11 @@ omit =
homeassistant/components/motion_blinds/cover.py
homeassistant/components/motion_blinds/entity.py
homeassistant/components/motion_blinds/sensor.py
homeassistant/components/motionblinds_ble/__init__.py
homeassistant/components/motionblinds_ble/button.py
homeassistant/components/motionblinds_ble/cover.py
homeassistant/components/motionblinds_ble/entity.py
homeassistant/components/motionblinds_ble/select.py
homeassistant/components/motionmount/__init__.py
homeassistant/components/motionmount/binary_sensor.py
homeassistant/components/motionmount/entity.py
@@ -927,7 +934,6 @@ omit =
homeassistant/components/onvif/sensor.py
homeassistant/components/onvif/util.py
homeassistant/components/open_meteo/weather.py
homeassistant/components/opencv/*
homeassistant/components/openevse/sensor.py
homeassistant/components/openexchangerates/__init__.py
homeassistant/components/openexchangerates/coordinator.py
@@ -950,7 +956,9 @@ omit =
homeassistant/components/openuv/binary_sensor.py
homeassistant/components/openuv/coordinator.py
homeassistant/components/openuv/sensor.py
homeassistant/components/openweathermap/__init__.py
homeassistant/components/openweathermap/sensor.py
homeassistant/components/openweathermap/weather.py
homeassistant/components/openweathermap/weather_update_coordinator.py
homeassistant/components/opnsense/__init__.py
homeassistant/components/opower/__init__.py
@@ -1061,6 +1069,7 @@ omit =
homeassistant/components/rabbitair/fan.py
homeassistant/components/rachio/__init__.py
homeassistant/components/rachio/binary_sensor.py
homeassistant/components/rachio/coordinator.py
homeassistant/components/rachio/device.py
homeassistant/components/rachio/entity.py
homeassistant/components/rachio/switch.py
@@ -1133,6 +1142,7 @@ omit =
homeassistant/components/rocketchat/notify.py
homeassistant/components/romy/__init__.py
homeassistant/components/romy/coordinator.py
homeassistant/components/romy/entity.py
homeassistant/components/romy/vacuum.py
homeassistant/components/roomba/__init__.py
homeassistant/components/roomba/binary_sensor.py
@@ -1147,7 +1157,6 @@ omit =
homeassistant/components/roon/media_player.py
homeassistant/components/roon/server.py
homeassistant/components/route53/*
homeassistant/components/rova/sensor.py
homeassistant/components/rpi_camera/*
homeassistant/components/rtorrent/sensor.py
homeassistant/components/ruuvi_gateway/__init__.py
@@ -1286,6 +1295,7 @@ omit =
homeassistant/components/starlink/device_tracker.py
homeassistant/components/starlink/sensor.py
homeassistant/components/starlink/switch.py
homeassistant/components/starlink/time.py
homeassistant/components/starline/__init__.py
homeassistant/components/starline/account.py
homeassistant/components/starline/binary_sensor.py
@@ -1430,6 +1440,7 @@ omit =
homeassistant/components/tolo/number.py
homeassistant/components/tolo/select.py
homeassistant/components/tolo/sensor.py
homeassistant/components/tolo/switch.py
homeassistant/components/toon/__init__.py
homeassistant/components/toon/binary_sensor.py
homeassistant/components/toon/climate.py
@@ -1681,6 +1692,7 @@ omit =
homeassistant/components/yolink/services.py
homeassistant/components/yolink/siren.py
homeassistant/components/yolink/switch.py
homeassistant/components/yolink/valve.py
homeassistant/components/youless/__init__.py
homeassistant/components/youless/sensor.py
homeassistant/components/zabbix/*

View File

@@ -21,6 +21,7 @@
],
// Please keep this file in sync with settings in home-assistant/.vscode/settings.default.json
"settings": {
"python.experiments.optOutFrom": ["pythonTestAdapter"],
"python.pythonPath": "/usr/local/bin/python",
"python.testing.pytestArgs": ["--no-cov"],
"editor.formatOnPaste": false,

14
.git-blame-ignore-revs Normal file
View File

@@ -0,0 +1,14 @@
# Black
4de97abc3aa83188666336ce0a015a5bab75bc8f
# Switch formatting from black to ruff-format (#102893)
706add4a57120a93d7b7fe40e722b00d634c76c2
# Prettify json (component test fixtures) (#68892)
053c4428a933c3c04c22642f93c93fccba3e8bfd
# Prettify json (tests) (#68888)
496d90bf00429d9d924caeb0155edc0bf54e86b9
# Bump ruff to 0.3.4 (#112690)
6bb4e7d62c60389608acf4a7d7dacd8f029307dd

View File

@@ -12,6 +12,8 @@ env:
BUILD_TYPE: core
DEFAULT_PYTHON: "3.12"
PIP_TIMEOUT: 60
UV_HTTP_TIMEOUT: 60
UV_SYSTEM_PYTHON: "true"
jobs:
init:
@@ -30,7 +32,7 @@ jobs:
fetch-depth: 0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v5.0.0
uses: actions/setup-python@v5.1.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
@@ -49,41 +51,29 @@ jobs:
with:
ignore-dev: true
build_python:
name: Build PyPi package
environment: ${{ needs.init.outputs.channel }}
needs: ["init", "build_base"]
runs-on: ubuntu-latest
if: github.repository_owner == 'home-assistant' && needs.init.outputs.publish == 'true'
steps:
- name: Checkout the repository
uses: actions/checkout@v4.1.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v5.0.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Fail if translations files are checked in
run: |
if [ -n "$(find homeassistant/components/*/translations -type f)" ]; then
echo "Translations files are checked in, please remove the following files:"
find homeassistant/components/*/translations -type f
exit 1
fi
- name: Download Translations
run: python3 -m script.translations download
env:
LOKALISE_TOKEN: ${{ secrets.LOKALISE_TOKEN }}
- name: Build package
- name: Archive translations
shell: bash
run: |
# Remove dist, build, and homeassistant.egg-info
# when build locally for testing!
pip install twine build
python -m build
run: find ./homeassistant/components/*/translations -name "*.json" | tar zcvf translations.tar.gz -T -
- name: Upload package
shell: bash
run: |
export TWINE_USERNAME="__token__"
export TWINE_PASSWORD="${{ secrets.TWINE_TOKEN }}"
twine upload dist/* --skip-existing
- name: Upload translations
uses: actions/upload-artifact@v4.3.1
with:
name: translations
path: translations.tar.gz
if-no-files-found: error
build_base:
name: Build ${{ matrix.arch }} base core image
@@ -95,6 +85,7 @@ jobs:
packages: write
id-token: write
strategy:
fail-fast: false
matrix:
arch: ${{ fromJson(needs.init.outputs.architectures) }}
steps:
@@ -103,7 +94,7 @@ jobs:
- name: Download nightly wheels of frontend
if: needs.init.outputs.channel == 'dev'
uses: dawidd6/action-download-artifact@v3.1.2
uses: dawidd6/action-download-artifact@v3.1.4
with:
github_token: ${{secrets.GITHUB_TOKEN}}
repo: home-assistant/frontend
@@ -114,7 +105,7 @@ jobs:
- name: Download nightly wheels of intents
if: needs.init.outputs.channel == 'dev'
uses: dawidd6/action-download-artifact@v3.1.2
uses: dawidd6/action-download-artifact@v3.1.4
with:
github_token: ${{secrets.GITHUB_TOKEN}}
repo: home-assistant/intents-package
@@ -125,17 +116,20 @@ jobs:
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
if: needs.init.outputs.channel == 'dev'
uses: actions/setup-python@v5.0.0
uses: actions/setup-python@v5.1.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Adjust nightly version
if: needs.init.outputs.channel == 'dev'
shell: bash
env:
UV_PRERELEASE: allow
run: |
python3 -m pip install packaging tomli
python3 -m pip install .
version="$(python3 script/version_bump.py nightly)"
python3 -m pip install "$(grep '^uv' < requirements_test.txt)"
uv pip install packaging tomli
uv pip install .
python3 script/version_bump.py nightly --set-nightly-version "${{ needs.init.outputs.version }}"
if [[ "$(ls home_assistant_frontend*.whl)" =~ ^home_assistant_frontend-(.*)-py3-none-any.whl$ ]]; then
echo "Found frontend wheel, setting version to: ${BASH_REMATCH[1]}"
@@ -147,7 +141,7 @@ jobs:
sed -i "s|home-assistant-frontend==.*|home-assistant-frontend==${BASH_REMATCH[1]}|" \
homeassistant/package_constraints.txt
python -m script.gen_requirements_all
sed -i "s|home-assistant-frontend==.*||" requirements_all.txt
fi
if [[ "$(ls home_assistant_intents*.whl)" =~ ^home_assistant_intents-(.*)-py3-none-any.whl$ ]]; then
@@ -165,7 +159,7 @@ jobs:
sed -i "s|home-assistant-intents==.*|home-assistant-intents==${BASH_REMATCH[1]}|" \
homeassistant/package_constraints.txt
python -m script.gen_requirements_all
sed -i "s|home-assistant-intents==.*||" requirements_all.txt
fi
- name: Adjustments for armhf
@@ -189,10 +183,15 @@ jobs:
# are not available.
sed -i "s|aiohttp-zlib-ng|aiohttp-zlib-ng\[isal\]|g" requirements_all.txt
- name: Download Translations
run: python3 -m script.translations download
env:
LOKALISE_TOKEN: ${{ secrets.LOKALISE_TOKEN }}
- name: Download translations
uses: actions/download-artifact@v4.1.4
with:
name: translations
- name: Extract translations
run: |
tar xvf translations.tar.gz
rm translations.tar.gz
- name: Write meta info file
shell: bash
@@ -200,14 +199,14 @@ jobs:
echo "${{ github.sha }};${{ github.ref }};${{ github.event_name }};${{ github.actor }}" > rootfs/OFFICIAL_IMAGE
- name: Login to GitHub Container Registry
uses: docker/login-action@v3.0.0
uses: docker/login-action@v3.1.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build base image
uses: home-assistant/builder@2024.01.0
uses: home-assistant/builder@2024.03.5
with:
args: |
$BUILD_ARGS \
@@ -216,17 +215,6 @@ jobs:
--target /data \
--generic ${{ needs.init.outputs.version }}
- name: Archive translations
shell: bash
run: find ./homeassistant/components/*/translations -name "*.json" | tar zcvf translations.tar.gz -T -
- name: Upload translations
uses: actions/upload-artifact@v3
with:
name: translations
path: translations.tar.gz
if-no-files-found: error
build_machine:
name: Build ${{ matrix.machine }} machine core image
if: github.repository_owner == 'home-assistant'
@@ -277,14 +265,14 @@ jobs:
fi
- name: Login to GitHub Container Registry
uses: docker/login-action@v3.0.0
uses: docker/login-action@v3.1.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build base image
uses: home-assistant/builder@2024.01.0
uses: home-assistant/builder@2024.03.5
with:
args: |
$BUILD_ARGS \
@@ -336,6 +324,9 @@ jobs:
contents: read
packages: write
id-token: write
strategy:
matrix:
registry: ["ghcr.io/home-assistant", "docker.io/homeassistant"]
steps:
- name: Checkout the repository
uses: actions/checkout@v4.1.2
@@ -343,16 +334,18 @@ jobs:
- name: Install Cosign
uses: sigstore/cosign-installer@v3.4.0
with:
cosign-release: "v2.0.2"
cosign-release: "v2.2.3"
- name: Login to DockerHub
uses: docker/login-action@v3.0.0
if: matrix.registry == 'docker.io/homeassistant'
uses: docker/login-action@v3.1.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v3.0.0
if: matrix.registry == 'ghcr.io/home-assistant'
uses: docker/login-action@v3.1.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
@@ -366,41 +359,37 @@ jobs:
function create_manifest() {
local tag_l=${1}
local tag_r=${2}
local registry=${{ matrix.registry }}
for registry in "ghcr.io/home-assistant" "docker.io/homeassistant"
do
docker manifest create "${registry}/home-assistant:${tag_l}" \
"${registry}/amd64-homeassistant:${tag_r}" \
"${registry}/i386-homeassistant:${tag_r}" \
"${registry}/armhf-homeassistant:${tag_r}" \
"${registry}/armv7-homeassistant:${tag_r}" \
"${registry}/aarch64-homeassistant:${tag_r}"
docker manifest create "${registry}/home-assistant:${tag_l}" \
"${registry}/amd64-homeassistant:${tag_r}" \
"${registry}/i386-homeassistant:${tag_r}" \
"${registry}/armhf-homeassistant:${tag_r}" \
"${registry}/armv7-homeassistant:${tag_r}" \
"${registry}/aarch64-homeassistant:${tag_r}"
docker manifest annotate "${registry}/home-assistant:${tag_l}" \
"${registry}/amd64-homeassistant:${tag_r}" \
--os linux --arch amd64
docker manifest annotate "${registry}/home-assistant:${tag_l}" \
"${registry}/amd64-homeassistant:${tag_r}" \
--os linux --arch amd64
docker manifest annotate "${registry}/home-assistant:${tag_l}" \
"${registry}/i386-homeassistant:${tag_r}" \
--os linux --arch 386
docker manifest annotate "${registry}/home-assistant:${tag_l}" \
"${registry}/i386-homeassistant:${tag_r}" \
--os linux --arch 386
docker manifest annotate "${registry}/home-assistant:${tag_l}" \
"${registry}/armhf-homeassistant:${tag_r}" \
--os linux --arch arm --variant=v6
docker manifest annotate "${registry}/home-assistant:${tag_l}" \
"${registry}/armhf-homeassistant:${tag_r}" \
--os linux --arch arm --variant=v6
docker manifest annotate "${registry}/home-assistant:${tag_l}" \
"${registry}/armv7-homeassistant:${tag_r}" \
--os linux --arch arm --variant=v7
docker manifest annotate "${registry}/home-assistant:${tag_l}" \
"${registry}/armv7-homeassistant:${tag_r}" \
--os linux --arch arm --variant=v7
docker manifest annotate "${registry}/home-assistant:${tag_l}" \
"${registry}/aarch64-homeassistant:${tag_r}" \
--os linux --arch arm64 --variant=v8
docker manifest annotate "${registry}/home-assistant:${tag_l}" \
"${registry}/aarch64-homeassistant:${tag_r}" \
--os linux --arch arm64 --variant=v8
docker manifest push --purge "${registry}/home-assistant:${tag_l}"
cosign sign --yes "${registry}/home-assistant:${tag_l}"
done
docker manifest push --purge "${registry}/home-assistant:${tag_l}"
cosign sign --yes "${registry}/home-assistant:${tag_l}"
}
function validate_image() {
@@ -433,12 +422,14 @@ jobs:
validate_image "ghcr.io/home-assistant/armv7-homeassistant:${{ needs.init.outputs.version }}"
validate_image "ghcr.io/home-assistant/aarch64-homeassistant:${{ needs.init.outputs.version }}"
# Upload images to dockerhub
push_dockerhub "amd64-homeassistant" "${{ needs.init.outputs.version }}"
push_dockerhub "i386-homeassistant" "${{ needs.init.outputs.version }}"
push_dockerhub "armhf-homeassistant" "${{ needs.init.outputs.version }}"
push_dockerhub "armv7-homeassistant" "${{ needs.init.outputs.version }}"
push_dockerhub "aarch64-homeassistant" "${{ needs.init.outputs.version }}"
if [[ "${{ matrix.registry }}" == "docker.io/homeassistant" ]]; then
# Upload images to dockerhub
push_dockerhub "amd64-homeassistant" "${{ needs.init.outputs.version }}"
push_dockerhub "i386-homeassistant" "${{ needs.init.outputs.version }}"
push_dockerhub "armhf-homeassistant" "${{ needs.init.outputs.version }}"
push_dockerhub "armv7-homeassistant" "${{ needs.init.outputs.version }}"
push_dockerhub "aarch64-homeassistant" "${{ needs.init.outputs.version }}"
fi
# Create version tag
create_manifest "${{ needs.init.outputs.version }}" "${{ needs.init.outputs.version }}"
@@ -459,3 +450,44 @@ jobs:
v="${{ needs.init.outputs.version }}"
create_manifest "${v%.*}" "${{ needs.init.outputs.version }}"
fi
build_python:
name: Build PyPi package
environment: ${{ needs.init.outputs.channel }}
needs: ["init", "build_base"]
runs-on: ubuntu-latest
if: github.repository_owner == 'home-assistant' && needs.init.outputs.publish == 'true'
steps:
- name: Checkout the repository
uses: actions/checkout@v4.1.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v5.1.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Download translations
uses: actions/download-artifact@v4.1.4
with:
name: translations
- name: Extract translations
run: |
tar xvf translations.tar.gz
rm translations.tar.gz
- name: Build package
shell: bash
run: |
# Remove dist, build, and homeassistant.egg-info
# when build locally for testing!
pip install twine build
python -m build
- name: Upload package
shell: bash
run: |
export TWINE_USERNAME="__token__"
export TWINE_PASSWORD="${{ secrets.TWINE_TOKEN }}"
twine upload dist/* --skip-existing

View File

@@ -225,13 +225,13 @@ jobs:
uses: actions/checkout@v4.1.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.0.0
uses: actions/setup-python@v5.1.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v4.0.1
uses: actions/cache@v4.0.2
with:
path: venv
key: >-
@@ -243,11 +243,11 @@ jobs:
python -m venv venv
. venv/bin/activate
python --version
pip install "$(cat requirements_test.txt | grep uv)"
pip install "$(grep '^uv' < requirements_test.txt)"
uv pip install "$(cat requirements_test.txt | grep pre-commit)"
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v4.0.1
uses: actions/cache@v4.0.2
with:
path: ${{ env.PRE_COMMIT_CACHE }}
lookup-only: true
@@ -270,14 +270,14 @@ jobs:
- name: Check out code from GitHub
uses: actions/checkout@v4.1.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v5.0.0
uses: actions/setup-python@v5.1.0
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache/restore@v4.0.1
uses: actions/cache/restore@v4.0.2
with:
path: venv
fail-on-cache-miss: true
@@ -286,7 +286,7 @@ jobs:
needs.info.outputs.pre-commit_cache_key }}
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache/restore@v4.0.1
uses: actions/cache/restore@v4.0.2
with:
path: ${{ env.PRE_COMMIT_CACHE }}
fail-on-cache-miss: true
@@ -310,14 +310,14 @@ jobs:
- name: Check out code from GitHub
uses: actions/checkout@v4.1.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v5.0.0
uses: actions/setup-python@v5.1.0
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache/restore@v4.0.1
uses: actions/cache/restore@v4.0.2
with:
path: venv
fail-on-cache-miss: true
@@ -326,7 +326,7 @@ jobs:
needs.info.outputs.pre-commit_cache_key }}
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache/restore@v4.0.1
uses: actions/cache/restore@v4.0.2
with:
path: ${{ env.PRE_COMMIT_CACHE }}
fail-on-cache-miss: true
@@ -349,14 +349,14 @@ jobs:
- name: Check out code from GitHub
uses: actions/checkout@v4.1.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v5.0.0
uses: actions/setup-python@v5.1.0
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache/restore@v4.0.1
uses: actions/cache/restore@v4.0.2
with:
path: venv
fail-on-cache-miss: true
@@ -365,7 +365,7 @@ jobs:
needs.info.outputs.pre-commit_cache_key }}
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache/restore@v4.0.1
uses: actions/cache/restore@v4.0.2
with:
path: ${{ env.PRE_COMMIT_CACHE }}
fail-on-cache-miss: true
@@ -444,7 +444,7 @@ jobs:
uses: actions/checkout@v4.1.2
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v5.0.0
uses: actions/setup-python@v5.1.0
with:
python-version: ${{ matrix.python-version }}
check-latest: true
@@ -455,7 +455,7 @@ jobs:
env.HA_SHORT_VERSION }}-$(date -u '+%Y-%m-%dT%H:%M:%s')" >> $GITHUB_OUTPUT
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v4.0.1
uses: actions/cache@v4.0.2
with:
path: venv
lookup-only: true
@@ -464,9 +464,9 @@ jobs:
needs.info.outputs.python_cache_key }}
- name: Restore uv wheel cache
if: steps.cache-venv.outputs.cache-hit != 'true'
uses: actions/cache@v4.0.1
uses: actions/cache@v4.0.2
with:
path: ${{ env.UV_CACHE }}
path: ${{ env.UV_CACHE_DIR }}
key: >-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
steps.generate-uv-key.outputs.key }}
@@ -493,7 +493,7 @@ jobs:
python -m venv venv
. venv/bin/activate
python --version
pip install "$(cat requirements_test.txt | grep uv)"
pip install "$(grep '^uv' < requirements_test.txt)"
uv pip install -U "pip>=21.3.1" setuptools wheel
uv pip install -r requirements_all.txt
uv pip install -r requirements_test.txt
@@ -513,13 +513,13 @@ jobs:
uses: actions/checkout@v4.1.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.0.0
uses: actions/setup-python@v5.1.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore full Python ${{ env.DEFAULT_PYTHON }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.0.1
uses: actions/cache/restore@v4.0.2
with:
path: venv
fail-on-cache-miss: true
@@ -545,13 +545,13 @@ jobs:
uses: actions/checkout@v4.1.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.0.0
uses: actions/setup-python@v5.1.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache/restore@v4.0.1
uses: actions/cache/restore@v4.0.2
with:
path: venv
fail-on-cache-miss: true
@@ -578,13 +578,13 @@ jobs:
uses: actions/checkout@v4.1.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.0.0
uses: actions/setup-python@v5.1.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
- name: Restore full Python ${{ env.DEFAULT_PYTHON }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.0.1
uses: actions/cache/restore@v4.0.2
with:
path: venv
fail-on-cache-miss: true
@@ -622,7 +622,7 @@ jobs:
uses: actions/checkout@v4.1.2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.0.0
uses: actions/setup-python@v5.1.0
with:
python-version: ${{ env.DEFAULT_PYTHON }}
check-latest: true
@@ -635,7 +635,7 @@ jobs:
env.HA_SHORT_VERSION }}-$(date -u '+%Y-%m-%dT%H:%M:%s')" >> $GITHUB_OUTPUT
- name: Restore full Python ${{ env.DEFAULT_PYTHON }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.0.1
uses: actions/cache/restore@v4.0.2
with:
path: venv
fail-on-cache-miss: true
@@ -643,7 +643,7 @@ jobs:
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.info.outputs.python_cache_key }}
- name: Restore mypy cache
uses: actions/cache@v4.0.1
uses: actions/cache@v4.0.2
with:
path: .mypy_cache
key: >-
@@ -704,13 +704,13 @@ jobs:
uses: actions/checkout@v4.1.2
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v5.0.0
uses: actions/setup-python@v5.1.0
with:
python-version: ${{ matrix.python-version }}
check-latest: true
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.0.1
uses: actions/cache/restore@v4.0.2
with:
path: venv
fail-on-cache-miss: true
@@ -851,13 +851,13 @@ jobs:
uses: actions/checkout@v4.1.2
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v5.0.0
uses: actions/setup-python@v5.1.0
with:
python-version: ${{ matrix.python-version }}
check-latest: true
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.0.1
uses: actions/cache/restore@v4.0.2
with:
path: venv
fail-on-cache-miss: true
@@ -973,13 +973,13 @@ jobs:
uses: actions/checkout@v4.1.2
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v5.0.0
uses: actions/setup-python@v5.1.0
with:
python-version: ${{ matrix.python-version }}
check-latest: true
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.0.1
uses: actions/cache/restore@v4.0.2
with:
path: venv
fail-on-cache-miss: true
@@ -1070,7 +1070,7 @@ jobs:
pattern: coverage-*
- name: Upload coverage to Codecov (full coverage)
if: needs.info.outputs.test_full_suite == 'true'
uses: Wandalen/wretry.action@v1.4.10
uses: Wandalen/wretry.action@v2.1.0
with:
action: codecov/codecov-action@v3.1.3
with: |
@@ -1081,7 +1081,7 @@ jobs:
attempt_delay: 30000
- name: Upload coverage to Codecov (partial coverage)
if: needs.info.outputs.test_full_suite == 'false'
uses: Wandalen/wretry.action@v1.4.10
uses: Wandalen/wretry.action@v2.1.0
with:
action: codecov/codecov-action@v3.1.3
with: |

View File

@@ -24,11 +24,11 @@ jobs:
uses: actions/checkout@v4.1.2
- name: Initialize CodeQL
uses: github/codeql-action/init@v3.24.7
uses: github/codeql-action/init@v3.24.9
with:
languages: python
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3.24.7
uses: github/codeql-action/analyze@v3.24.9
with:
category: "/language:python"

View File

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

View File

@@ -1,6 +1,6 @@
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.2.1
rev: v0.3.4
hooks:
- id: ruff
args:
@@ -8,11 +8,11 @@ repos:
- id: ruff-format
files: ^((homeassistant|pylint|script|tests)/.+)?[^/]+\.py$
- repo: https://github.com/codespell-project/codespell
rev: v2.2.2
rev: v2.2.6
hooks:
- id: codespell
args:
- --ignore-words-list=additionals,alle,alot,bund,currenty,datas,farenheit,falsy,fo,haa,hass,iif,incomfort,ines,ist,nam,nd,pres,pullrequests,resset,rime,ser,serie,te,technik,ue,unsecure,withing,zar
- --ignore-words-list=additionals,alle,alot,astroid,bund,caf,convencional,currenty,datas,farenheit,falsy,fo,frequence,haa,hass,iif,incomfort,ines,ist,nam,nd,pres,pullrequests,resset,rime,ser,serie,te,technik,ue,unsecure,vor,withing,zar
- --skip="./.*,*.csv,*.json,*.ambr"
- --quiet-level=2
exclude_types: [csv, json]
@@ -30,7 +30,7 @@ repos:
- --branch=master
- --branch=rc
- repo: https://github.com/adrienverge/yamllint.git
rev: v1.32.0
rev: v1.35.1
hooks:
- id: yamllint
- repo: https://github.com/pre-commit/mirrors-prettier

View File

@@ -309,6 +309,8 @@ build.json @home-assistant/supervisor
/tests/components/doorbird/ @oblogic7 @bdraco @flacjacket
/homeassistant/components/dormakaba_dkey/ @emontnemery
/tests/components/dormakaba_dkey/ @emontnemery
/homeassistant/components/downloader/ @erwindouna
/tests/components/downloader/ @erwindouna
/homeassistant/components/dremel_3d_printer/ @tkdrob
/tests/components/dremel_3d_printer/ @tkdrob
/homeassistant/components/drop_connect/ @ChandlerSystems @pfrazer
@@ -453,6 +455,8 @@ build.json @home-assistant/supervisor
/tests/components/frontier_silicon/ @wlcrs
/homeassistant/components/fully_kiosk/ @cgarwood
/tests/components/fully_kiosk/ @cgarwood
/homeassistant/components/fyta/ @dontinelli
/tests/components/fyta/ @dontinelli
/homeassistant/components/garages_amsterdam/ @klaasnicolaas
/tests/components/garages_amsterdam/ @klaasnicolaas
/homeassistant/components/gardena_bluetooth/ @elupus
@@ -568,8 +572,8 @@ build.json @home-assistant/supervisor
/tests/components/homekit/ @bdraco
/homeassistant/components/homekit_controller/ @Jc2k @bdraco
/tests/components/homekit_controller/ @Jc2k @bdraco
/homeassistant/components/homematic/ @pvizeli @danielperna84
/tests/components/homematic/ @pvizeli @danielperna84
/homeassistant/components/homematic/ @pvizeli
/tests/components/homematic/ @pvizeli
/homeassistant/components/homewizard/ @DCSBL
/tests/components/homewizard/ @DCSBL
/homeassistant/components/honeywell/ @rdfurman @mkmer
@@ -837,6 +841,8 @@ build.json @home-assistant/supervisor
/tests/components/mopeka/ @bdraco
/homeassistant/components/motion_blinds/ @starkillerOG
/tests/components/motion_blinds/ @starkillerOG
/homeassistant/components/motionblinds_ble/ @LennP @jerrybboy
/tests/components/motionblinds_ble/ @LennP @jerrybboy
/homeassistant/components/motioneye/ @dermotduffy
/tests/components/motioneye/ @dermotduffy
/homeassistant/components/motionmount/ @RJPoelstra
@@ -927,6 +933,8 @@ build.json @home-assistant/supervisor
/homeassistant/components/octoprint/ @rfleming71
/tests/components/octoprint/ @rfleming71
/homeassistant/components/ohmconnect/ @robbiet480
/homeassistant/components/ollama/ @synesthesiam
/tests/components/ollama/ @synesthesiam
/homeassistant/components/ombi/ @larssont
/homeassistant/components/omnilogic/ @oliver84 @djtimca @gentoosu
/tests/components/omnilogic/ @oliver84 @djtimca @gentoosu

View File

@@ -6,47 +6,47 @@ FROM ${BUILD_FROM}
# Synchronize with homeassistant/core.py:async_stop
ENV \
S6_SERVICES_GRACETIME=240000
S6_SERVICES_GRACETIME=240000 \
UV_SYSTEM_PYTHON=true
ARG QEMU_CPU
# Install uv
RUN pip3 install uv==0.1.24
WORKDIR /usr/src
## Setup Home Assistant Core dependencies
COPY requirements.txt homeassistant/
COPY homeassistant/package_constraints.txt homeassistant/homeassistant/
RUN \
pip3 install \
--only-binary=:all: \
uv pip install \
--no-build \
-r homeassistant/requirements.txt
COPY requirements_all.txt home_assistant_frontend-* home_assistant_intents-* homeassistant/
RUN \
if ls homeassistant/home_assistant_frontend*.whl 1> /dev/null 2>&1; then \
pip3 install homeassistant/home_assistant_frontend-*.whl; \
fi \
&& if ls homeassistant/home_assistant_intents*.whl 1> /dev/null 2>&1; then \
pip3 install homeassistant/home_assistant_intents-*.whl; \
if ls homeassistant/home_assistant_*.whl 1> /dev/null 2>&1; then \
uv pip install homeassistant/home_assistant_*.whl; \
fi \
&& if [ "${BUILD_ARCH}" = "i386" ]; then \
LD_PRELOAD="/usr/local/lib/libjemalloc.so.2" \
MALLOC_CONF="background_thread:true,metadata_thp:auto,dirty_decay_ms:20000,muzzy_decay_ms:20000" \
linux32 pip3 install \
--only-binary=:all: \
linux32 uv pip install \
--no-build \
-r homeassistant/requirements_all.txt; \
else \
LD_PRELOAD="/usr/local/lib/libjemalloc.so.2" \
MALLOC_CONF="background_thread:true,metadata_thp:auto,dirty_decay_ms:20000,muzzy_decay_ms:20000" \
pip3 install \
--only-binary=:all: \
uv pip install \
--no-build \
-r homeassistant/requirements_all.txt; \
fi
## Setup Home Assistant Core
COPY . homeassistant/
RUN \
pip3 install \
--only-binary=:all: \
uv pip install \
-e ./homeassistant \
&& python3 -m compileall \
homeassistant/homeassistant

View File

@@ -1,10 +1,10 @@
image: ghcr.io/home-assistant/{arch}-homeassistant
build_from:
aarch64: ghcr.io/home-assistant/aarch64-homeassistant-base:2024.02.1
armhf: ghcr.io/home-assistant/armhf-homeassistant-base:2024.02.1
armv7: ghcr.io/home-assistant/armv7-homeassistant-base:2024.02.1
amd64: ghcr.io/home-assistant/amd64-homeassistant-base:2024.02.1
i386: ghcr.io/home-assistant/i386-homeassistant-base:2024.02.1
aarch64: ghcr.io/home-assistant/aarch64-homeassistant-base:2024.03.0
armhf: ghcr.io/home-assistant/armhf-homeassistant-base:2024.03.0
armv7: ghcr.io/home-assistant/armv7-homeassistant-base:2024.03.0
amd64: ghcr.io/home-assistant/amd64-homeassistant-base:2024.03.0
i386: ghcr.io/home-assistant/i386-homeassistant-base:2024.03.0
codenotary:
signer: notary@home-assistant.io
base_image: notary@home-assistant.io

View File

@@ -2,7 +2,6 @@
from __future__ import annotations
import importlib
import logging
import types
from typing import Any
@@ -15,6 +14,7 @@ from homeassistant.const import CONF_ID, CONF_NAME, CONF_TYPE
from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResult
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.importlib import async_import_module
from homeassistant.util.decorator import Registry
MULTI_FACTOR_AUTH_MODULES: Registry[str, type[MultiFactorAuthModule]] = Registry()
@@ -149,7 +149,7 @@ async def _load_mfa_module(hass: HomeAssistant, module_name: str) -> types.Modul
module_path = f"homeassistant.auth.mfa_modules.{module_name}"
try:
module = importlib.import_module(module_path)
module = await async_import_module(hass, module_path)
except ImportError as err:
_LOGGER.error("Unable to load mfa module %s: %s", module_name, err)
raise HomeAssistantError(

View File

@@ -58,10 +58,7 @@ def _merge_policies(sources: list[CategoryType]) -> CategoryType:
continue
seen.add(key)
key_sources = []
for src in sources:
if isinstance(src, dict):
key_sources.append(src.get(key))
key_sources = [src.get(key) for src in sources if isinstance(src, dict)]
policy[key] = _merge_policies(key_sources)

View File

@@ -3,7 +3,6 @@
from __future__ import annotations
from collections.abc import Mapping
import importlib
import logging
import types
from typing import Any
@@ -15,6 +14,7 @@ from homeassistant import data_entry_flow, requirements
from homeassistant.const import CONF_ID, CONF_NAME, CONF_TYPE
from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.importlib import async_import_module
from homeassistant.util import dt as dt_util
from homeassistant.util.decorator import Registry
@@ -157,7 +157,9 @@ async def load_auth_provider_module(
) -> types.ModuleType:
"""Load an auth provider."""
try:
module = importlib.import_module(f"homeassistant.auth.providers.{provider}")
module = await async_import_module(
hass, f"homeassistant.auth.providers.{provider}"
)
except ImportError as err:
_LOGGER.error("Unable to load auth provider %s: %s", provider, err)
raise HomeAssistantError(

View File

@@ -41,12 +41,10 @@ class cached_property(Generic[_T]):
)
@overload
def __get__(self, instance: None, owner: type[Any] | None = None) -> Self:
...
def __get__(self, instance: None, owner: type[Any] | None = None) -> Self: ...
@overload
def __get__(self, instance: Any, owner: type[Any] | None = None) -> _T:
...
def __get__(self, instance: Any, owner: type[Any] | None = None) -> _T: ...
def __get__(
self, instance: Any | None, owner: type[Any] | None = None

View File

@@ -3,11 +3,13 @@
from __future__ import annotations
import asyncio
from collections import defaultdict
import contextlib
from datetime import timedelta
from functools import partial
from itertools import chain
import logging
import logging.handlers
from operator import itemgetter
from operator import contains, itemgetter
import os
import platform
import sys
@@ -32,9 +34,11 @@ from .components import (
api as api_pre_import, # noqa: F401
auth as auth_pre_import, # noqa: F401
config as config_pre_import, # noqa: F401
default_config as default_config_pre_import, # noqa: F401
device_automation as device_automation_pre_import, # noqa: F401
diagnostics as diagnostics_pre_import, # noqa: F401
file_upload as file_upload_pre_import, # noqa: F401
group as group_pre_import, # noqa: F401
history as history_pre_import, # noqa: F401
http, # not named pre_import since it has requirements
image_upload as image_upload_import, # noqa: F401 - not named pre_import since it has requirements
@@ -60,6 +64,7 @@ from .const import (
from .exceptions import HomeAssistantError
from .helpers import (
area_registry,
category_registry,
config_validation as cv,
device_registry,
entity,
@@ -73,11 +78,13 @@ from .helpers import (
translation,
)
from .helpers.dispatcher import async_dispatcher_send
from .helpers.storage import get_internal_store_manager
from .helpers.system_info import async_get_system_info
from .helpers.typing import ConfigType
from .setup import (
BASE_PLATFORMS,
DATA_SETUP_STARTED,
DATA_SETUP_TIME,
async_get_setup_timings,
async_notify_setup_error,
async_set_domains_to_be_loaded,
async_setup_component,
@@ -86,11 +93,19 @@ from .util.async_ import create_eager_task
from .util.logging import async_activate_log_queue_handler
from .util.package import async_get_user_site, is_virtual_env
with contextlib.suppress(ImportError):
# Ensure anyio backend is imported to avoid it being imported in the event loop
from anyio._backends import _asyncio # noqa: F401
if TYPE_CHECKING:
from .runner import RuntimeConfig
_LOGGER = logging.getLogger(__name__)
SETUP_ORDER_SORT_KEY = partial(contains, BASE_PLATFORMS)
ERROR_LOG_FILENAME = "home-assistant.log"
# hass.data key for logging information.
@@ -185,16 +200,35 @@ CRITICAL_INTEGRATIONS = {
"frontend",
}
SETUP_ORDER = {
SETUP_ORDER = (
# Load logging as soon as possible
"logging": LOGGING_INTEGRATIONS,
# Setup frontend
"frontend": FRONTEND_INTEGRATIONS,
# Setup recorder
"recorder": RECORDER_INTEGRATIONS,
("logging", LOGGING_INTEGRATIONS),
# Setup frontend and recorder
("frontend, recorder", {*FRONTEND_INTEGRATIONS, *RECORDER_INTEGRATIONS}),
# Start up debuggers. Start these first in case they want to wait.
"debugger": DEBUGGER_INTEGRATIONS,
}
("debugger", DEBUGGER_INTEGRATIONS),
)
#
# Storage keys we are likely to load during startup
# in order of when we expect to load them.
#
# If they do not exist they will not be loaded
#
PRELOAD_STORAGE = [
"core.network",
"http.auth",
"image",
"lovelace_dashboards",
"lovelace_resources",
"core.uuid",
"lovelace.map",
"bluetooth.passive_update_processor",
"bluetooth.remote_scanners",
"assist_pipeline.pipelines",
"core.analytics",
"auth_module.totp",
]
async def async_setup_hass(
@@ -332,14 +366,16 @@ async def async_load_base_functionality(hass: core.HomeAssistant) -> None:
asyncio event loop. By primeing the cache of uname we can
avoid the blocking call in the event loop.
"""
platform.uname().processor # pylint: disable=expression-not-assigned
_ = platform.uname().processor
# Load the registries and cache the result of platform.uname().processor
translation.async_setup(hass)
entity.async_setup(hass)
template.async_setup(hass)
await asyncio.gather(
create_eager_task(get_internal_store_manager(hass).async_initialize()),
create_eager_task(area_registry.async_load(hass)),
create_eager_task(category_registry.async_load(hass)),
create_eager_task(device_registry.async_load(hass)),
create_eager_task(entity_registry.async_load(hass)),
create_eager_task(floor_registry.async_load(hass)),
@@ -349,6 +385,7 @@ async def async_load_base_functionality(hass: core.HomeAssistant) -> None:
create_eager_task(template.async_load_custom_templates(hass)),
create_eager_task(restore_state.async_load(hass)),
create_eager_task(hass.config_entries.async_initialize()),
create_eager_task(async_get_system_info(hass)),
)
@@ -588,7 +625,9 @@ class _WatchPendingSetups:
"""Periodic log and dispatch of setups that are pending."""
def __init__(
self, hass: core.HomeAssistant, setup_started: dict[str, float]
self,
hass: core.HomeAssistant,
setup_started: dict[tuple[str, str | None], float],
) -> None:
"""Initialize the WatchPendingSetups class."""
self._hass = hass
@@ -603,10 +642,11 @@ class _WatchPendingSetups:
now = monotonic()
self._duration_count += SLOW_STARTUP_CHECK_INTERVAL
remaining_with_setup_started = {
domain: (now - start_time)
for domain, start_time in self._setup_started.items()
}
remaining_with_setup_started: defaultdict[str, float] = defaultdict(float)
for integration_group, start_time in self._setup_started.items():
domain, _ = integration_group
remaining_with_setup_started[domain] += now - start_time
if remaining_with_setup_started:
_LOGGER.debug("Integration remaining: %s", remaining_with_setup_started)
elif waiting_tasks := self._hass._active_tasks: # pylint: disable=protected-access
@@ -620,7 +660,7 @@ class _WatchPendingSetups:
# once we take over LOG_SLOW_STARTUP_INTERVAL (60s) to start up
_LOGGER.warning(
"Waiting on integrations to complete setup: %s",
", ".join(self._setup_started),
self._setup_started,
)
_LOGGER.debug("Running timeout Zones: %s", self._hass.timeout.zones)
@@ -660,13 +700,18 @@ async def async_setup_multi_components(
"""Set up multiple domains. Log on failure."""
# Avoid creating tasks for domains that were setup in a previous stage
domains_not_yet_setup = domains - hass.config.components
# Create setup tasks for base platforms first since everything will have
# to wait to be imported, and the sooner we can get the base platforms
# loaded the sooner we can start loading the rest of the integrations.
futures = {
domain: hass.async_create_task(
async_setup_component(hass, domain, config),
f"setup component {domain}",
eager_start=True,
)
for domain in domains_not_yet_setup
for domain in sorted(
domains_not_yet_setup, key=SETUP_ORDER_SORT_KEY, reverse=True
)
}
results = await asyncio.gather(*futures.values(), return_exceptions=True)
for idx, domain in enumerate(futures):
@@ -683,29 +728,53 @@ async def _async_resolve_domains_to_setup(
hass: core.HomeAssistant, config: dict[str, Any]
) -> tuple[set[str], dict[str, loader.Integration]]:
"""Resolve all dependencies and return list of domains to set up."""
base_platforms_loaded = False
domains_to_setup = _get_domains(hass, config)
needed_requirements: set[str] = set()
platform_integrations = conf_util.extract_platform_integrations(
config, BASE_PLATFORMS
)
# Ensure base platforms that have platform integrations are added to
# to `domains_to_setup so they can be setup first instead of
# discovering them when later when a config entry setup task
# notices its needed and there is already a long line to use
# the import executor.
#
# For example if we have
# sensor:
# - platform: template
#
# `template` has to be loaded to validate the config for sensor
# so we want to start loading `sensor` as soon as we know
# it will be needed. The more platforms under `sensor:`, the longer
# it will take to finish setup for `sensor` because each of these
# platforms has to be imported before we can validate the config.
#
# Thankfully we are migrating away from the platform pattern
# so this will be less of a problem in the future.
domains_to_setup.update(platform_integrations)
# Load manifests for base platforms and platform based integrations
# that are defined under base platforms right away since we do not require
# the manifest to list them as dependencies and we want to avoid the lock
# contention when multiple integrations try to load them at once
additional_manifests_to_load = {
*BASE_PLATFORMS,
*chain.from_iterable(platform_integrations.values()),
}
translations_to_load = additional_manifests_to_load.copy()
# Resolve all dependencies so we know all integrations
# that will have to be loaded and start rightaway
# that will have to be loaded and start right-away
integration_cache: dict[str, loader.Integration] = {}
to_resolve: set[str] = domains_to_setup
while to_resolve:
while to_resolve or additional_manifests_to_load:
old_to_resolve: set[str] = to_resolve
to_resolve = set()
if not base_platforms_loaded:
# Load base platforms right away since
# we do not require the manifest to list
# them as dependencies and we want
# to avoid the lock contention when multiple
# integrations try to resolve them at once
base_platforms_loaded = True
to_get = {*old_to_resolve, *BASE_PLATFORMS, *platform_integrations}
if additional_manifests_to_load:
to_get = {*old_to_resolve, *additional_manifests_to_load}
additional_manifests_to_load.clear()
else:
to_get = old_to_resolve
@@ -718,6 +787,17 @@ async def _async_resolve_domains_to_setup(
continue
integration_cache[domain] = itg
needed_requirements.update(itg.requirements)
# Make sure manifests for dependencies are loaded in the next
# loop to try to group as many as manifest loads in a single
# call to avoid the creating one-off executor jobs later in
# the setup process
additional_manifests_to_load.update(
dep
for dep in chain(itg.dependencies, itg.after_dependencies)
if dep not in integration_cache
)
if domain not in old_to_resolve:
continue
@@ -766,6 +846,12 @@ async def _async_resolve_domains_to_setup(
"check installed requirements",
eager_start=True,
)
#
# Only add the domains_to_setup after we finish resolving
# as new domains are likely to added in the process
#
translations_to_load.update(domains_to_setup)
# Start loading translations for all integrations we are going to set up
# in the background so they are ready when we need them. This avoids a
# lot of waiting for the translation load lock and a thundering herd of
@@ -777,13 +863,22 @@ async def _async_resolve_domains_to_setup(
# wait for the translation load lock, loading will be done by the
# time it gets to it.
hass.async_create_background_task(
translation.async_load_integrations(
hass, {*BASE_PLATFORMS, *platform_integrations, *domains_to_setup}
),
translation.async_load_integrations(hass, translations_to_load),
"load translations",
eager_start=True,
)
# Preload storage for all integrations we are going to set up
# so we do not have to wait for it to be loaded when we need it
# in the setup process.
hass.async_create_background_task(
get_internal_store_manager(hass).async_preload(
[*PRELOAD_STORAGE, *domains_to_setup]
),
"preload storage",
eager_start=True,
)
return domains_to_setup, integration_cache
@@ -791,10 +886,8 @@ async def _async_set_up_integrations(
hass: core.HomeAssistant, config: dict[str, Any]
) -> None:
"""Set up all the integrations."""
setup_started: dict[str, float] = {}
setup_started: dict[tuple[str, str | None], float] = {}
hass.data[DATA_SETUP_STARTED] = setup_started
setup_time: dict[str, timedelta] = hass.data.setdefault(DATA_SETUP_TIME, {})
watcher = _WatchPendingSetups(hass, setup_started)
watcher.async_start()
@@ -806,10 +899,9 @@ async def _async_set_up_integrations(
if "recorder" in domains_to_setup:
recorder.async_initialize_recorder(hass)
pre_stage_domains: dict[str, set[str]] = {
name: domains_to_setup & domain_group
for name, domain_group in SETUP_ORDER.items()
}
pre_stage_domains = [
(name, domains_to_setup & domain_group) for name, domain_group in SETUP_ORDER
]
# calculate what components to setup in what stage
stage_1_domains: set[str] = set()
@@ -835,10 +927,18 @@ async def _async_set_up_integrations(
stage_2_domains = domains_to_setup - stage_1_domains
for name, domain_group in pre_stage_domains.items():
for name, domain_group in pre_stage_domains:
if domain_group:
stage_2_domains -= domain_group
_LOGGER.info("Setting up %s: %s", name, domain_group)
to_be_loaded = domain_group.copy()
to_be_loaded.update(
dep
for domain in domain_group
if (integration := integration_cache.get(domain)) is not None
for dep in integration.all_dependencies
)
async_set_domains_to_be_loaded(hass, to_be_loaded)
await async_setup_multi_components(hass, domain_group, config)
# Enables after dependencies when setting up stage 1 domains
@@ -887,7 +987,9 @@ async def _async_set_up_integrations(
watcher.async_stop()
_LOGGER.debug(
"Integration setup times: %s",
dict(sorted(setup_time.items(), key=itemgetter(1))),
)
if _LOGGER.isEnabledFor(logging.DEBUG):
setup_time = async_get_setup_timings(hass)
_LOGGER.debug(
"Integration setup times: %s",
dict(sorted(setup_time.items(), key=itemgetter(1), reverse=True)),
)

View File

@@ -0,0 +1,5 @@
{
"domain": "motionblinds",
"name": "Motionblinds",
"integrations": ["motion_blinds", "motionblinds_ble"]
}

View File

@@ -5,5 +5,10 @@
"default": "mdi:robot"
}
}
},
"services": {
"capture_image": "mdi:camera",
"change_setting": "mdi:cog",
"trigger_automation": "mdi:play"
}
}

View File

@@ -52,7 +52,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
# Remove ozone sensors from registry if they exist
ent_reg = er.async_get(hass)
for day in range(0, 5):
for day in range(5):
unique_id = f"{coordinator.location_key}-ozone-{day}"
if entity_id := ent_reg.async_get_entity_id(SENSOR_PLATFORM, DOMAIN, unique_id):
_LOGGER.debug("Removing ozone sensor entity %s", entity_id)
@@ -135,4 +135,4 @@ class AccuWeatherDataUpdateCoordinator(DataUpdateCoordinator[dict[str, Any]]):
) as error:
raise UpdateFailed(error) from error
_LOGGER.debug("Requests remaining: %d", self.accuweather.requests_remaining)
return {**current, **{ATTR_FORECAST: forecast}}
return {**current, ATTR_FORECAST: forecast}

View File

@@ -146,9 +146,9 @@ class AccuWeatherEntity(
"""Return the UV index."""
return cast(float, self.coordinator.data["UVIndex"])
@property
def forecast(self) -> list[Forecast] | None:
"""Return the forecast array."""
@callback
def _async_forecast_daily(self) -> list[Forecast] | None:
"""Return the daily forecast in native units."""
if not self.coordinator.forecast:
return None
# remap keys from library to keys understood by the weather component
@@ -177,8 +177,3 @@ class AccuWeatherEntity(
}
for item in self.coordinator.data[ATTR_FORECAST]
]
@callback
def _async_forecast_daily(self) -> list[Forecast] | None:
"""Return the daily forecast in native units."""
return self.forecast

View File

@@ -9,7 +9,7 @@ from typing import Final
LEASES_REGEX: Final[re.Pattern[str]] = re.compile(
r"(?P<ip>([0-9]{1,3}[\.]){3}[0-9]{1,3})"
+ r"\smac:\s(?P<mac>([0-9a-f]{2}[:-]){5}([0-9a-f]{2}))"
+ r"\svalid\sfor:\s(?P<timevalid>(-?\d+))"
+ r"\ssec"
r"\smac:\s(?P<mac>([0-9a-f]{2}[:-]){5}([0-9a-f]{2}))"
r"\svalid\sfor:\s(?P<timevalid>(-?\d+))"
r"\ssec"
)

View File

@@ -44,7 +44,7 @@ class AdGuardHomeEntity(Entity):
async def _adguard_update(self) -> None:
"""Update AdGuard Home entity."""
raise NotImplementedError()
raise NotImplementedError
@property
def device_info(self) -> DeviceInfo:

View File

@@ -0,0 +1,5 @@
{
"services": {
"write_data_by_name": "mdi:pencil"
}
}

View File

@@ -58,7 +58,7 @@ HVAC_MODES = [
HVACMode.FAN_ONLY,
HVACMode.DRY,
]
HVAC_MODES_MYAUTO = HVAC_MODES + [HVACMode.HEAT_COOL]
HVAC_MODES_MYAUTO = [*HVAC_MODES, HVACMode.HEAT_COOL]
SUPPORTED_FEATURES = (
ClimateEntityFeature.FAN_MODE
| ClimateEntityFeature.TURN_OFF

View File

@@ -45,7 +45,7 @@ class AdvantageAirConfigFlow(ConfigFlow, domain=DOMAIN):
port=port,
session=async_get_clientsession(self.hass),
retry=ADVANTAGE_AIR_RETRY,
).async_get(1)
).async_get()
except ApiError:
errors["base"] = "cannot_connect"
else:

View File

@@ -0,0 +1,5 @@
{
"services": {
"set_time_to": "mdi:timer-cog"
}
}

View File

@@ -121,8 +121,3 @@ FORECAST_MAP = {
AOD_WIND_SPEED: ATTR_FORECAST_NATIVE_WIND_SPEED,
},
}
WEATHER_FORECAST_MODES = {
AOD_FORECAST_DAILY: "daily",
AOD_FORECAST_HOURLY: "hourly",
}

View File

@@ -14,7 +14,6 @@ from aemet_opendata.const import (
)
from homeassistant.components.weather import (
DOMAIN as WEATHER_DOMAIN,
Forecast,
SingleCoordinatorWeatherEntity,
WeatherEntityFeature,
@@ -27,7 +26,6 @@ from homeassistant.const import (
UnitOfTemperature,
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import entity_registry as er
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import (
@@ -36,7 +34,6 @@ from .const import (
DOMAIN,
ENTRY_NAME,
ENTRY_WEATHER_COORDINATOR,
WEATHER_FORECAST_MODES,
)
from .coordinator import WeatherUpdateCoordinator
from .entity import AemetEntity
@@ -51,31 +48,14 @@ async def async_setup_entry(
domain_data = hass.data[DOMAIN][config_entry.entry_id]
weather_coordinator = domain_data[ENTRY_WEATHER_COORDINATOR]
entities = []
entity_registry = er.async_get(hass)
# Add daily + hourly entity for legacy config entries, only add daily for new
# config entries. This can be removed in HA Core 2024.3
if entity_registry.async_get_entity_id(
WEATHER_DOMAIN,
DOMAIN,
f"{config_entry.unique_id} {WEATHER_FORECAST_MODES[AOD_FORECAST_HOURLY]}",
):
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(
async_add_entities(
[
AemetWeather(
domain_data[ENTRY_NAME],
config_entry.unique_id,
weather_coordinator,
AOD_FORECAST_DAILY,
domain_data[ENTRY_NAME], config_entry.unique_id, weather_coordinator
)
)
async_add_entities(entities, False)
],
False,
)
class AemetWeather(
@@ -98,14 +78,9 @@ class AemetWeather(
name,
unique_id,
coordinator: WeatherUpdateCoordinator,
forecast_mode,
) -> None:
"""Initialize the sensor."""
super().__init__(coordinator)
self._forecast_mode = forecast_mode
self._attr_entity_registry_enabled_default = (
self._forecast_mode == AOD_FORECAST_DAILY
)
self._attr_name = name
self._attr_unique_id = unique_id
@@ -115,11 +90,6 @@ class AemetWeather(
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.get_aemet_forecast(self._forecast_mode)
@callback
def _async_forecast_daily(self) -> list[Forecast]:
"""Return the daily forecast in native units."""

View File

@@ -0,0 +1,9 @@
{
"services": {
"start_recording": "mdi:record-rec",
"stop_recording": "mdi:stop",
"enable_alerts": "mdi:bell-alert",
"disable_alerts": "mdi:bell-off",
"snapshot": "mdi:camera"
}
}

View File

@@ -17,6 +17,8 @@ from homeassistant.helpers.entity import Entity
from homeassistant.helpers.entity_component import EntityComponent
from homeassistant.helpers.typing import ConfigType, StateType
from . import group as group_pre_import # noqa: F401
_LOGGER: Final = logging.getLogger(__name__)
ATTR_AQI: Final = "air_quality_index"
@@ -81,7 +83,7 @@ class AirQualityEntity(Entity):
@property
def particulate_matter_2_5(self) -> StateType:
"""Return the particulate matter 2.5 level."""
raise NotImplementedError()
raise NotImplementedError
@property
def particulate_matter_10(self) -> StateType:

View File

@@ -1,12 +1,16 @@
"""Describe group states."""
from homeassistant.components.group import GroupIntegrationRegistry
from typing import TYPE_CHECKING
from homeassistant.core import HomeAssistant, callback
if TYPE_CHECKING:
from homeassistant.components.group import GroupIntegrationRegistry
@callback
def async_describe_on_off_states(
hass: HomeAssistant, registry: GroupIntegrationRegistry
hass: HomeAssistant, registry: "GroupIntegrationRegistry"
) -> None:
"""Describe group on off states."""
registry.exclude_domain()

View File

@@ -108,6 +108,7 @@ SENSORS_MAPPING_TEMPLATE: dict[str, SensorEntityDescription] = {
),
"illuminance": SensorEntityDescription(
key="illuminance",
translation_key="illuminance",
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
),

View File

@@ -33,6 +33,9 @@
},
"radon_longterm_level": {
"name": "Radon longterm level"
},
"illuminance": {
"name": "[%key:component::sensor::entity_component::illuminance::name%]"
}
}
}

View File

@@ -27,7 +27,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
try:
await client.connect_and_stay_connected()
except TimeoutError as t:
raise ConfigEntryNotReady() from t
raise ConfigEntryNotReady from t
# Store an API object for your platforms to access
hass.data[DOMAIN][entry.entry_id] = client

View File

@@ -162,13 +162,13 @@ def _standardize_geography_config_entry(
# about, infer it from the data we have:
entry_updates["data"] = {**entry.data}
if CONF_CITY in entry.data:
entry_updates["data"][
CONF_INTEGRATION_TYPE
] = INTEGRATION_TYPE_GEOGRAPHY_NAME
entry_updates["data"][CONF_INTEGRATION_TYPE] = (
INTEGRATION_TYPE_GEOGRAPHY_NAME
)
else:
entry_updates["data"][
CONF_INTEGRATION_TYPE
] = INTEGRATION_TYPE_GEOGRAPHY_COORDS
entry_updates["data"][CONF_INTEGRATION_TYPE] = (
INTEGRATION_TYPE_GEOGRAPHY_COORDS
)
if not entry_updates:
return

View File

@@ -54,7 +54,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
try:
await node.async_connect()
except NodeProError as err:
raise ConfigEntryNotReady() from err
raise ConfigEntryNotReady from err
reload_task: asyncio.Task | None = None

View File

@@ -44,7 +44,7 @@ class AirzoneEntity(CoordinatorEntity[AirzoneUpdateCoordinator]):
def get_airzone_value(self, key: str) -> Any:
"""Return Airzone entity value by key."""
raise NotImplementedError()
raise NotImplementedError
class AirzoneSystemEntity(AirzoneEntity):

View File

@@ -11,6 +11,7 @@ from aioairzone_cloud.const import (
API_PARAMS,
API_POWER,
API_SETPOINT,
API_SPEED_CONF,
API_UNITS,
API_VALUE,
AZD_ACTION,
@@ -24,6 +25,8 @@ from aioairzone_cloud.const import (
AZD_NUM_DEVICES,
AZD_NUM_GROUPS,
AZD_POWER,
AZD_SPEED,
AZD_SPEEDS,
AZD_TEMP,
AZD_TEMP_SET,
AZD_TEMP_SET_MAX,
@@ -34,6 +37,10 @@ from aioairzone_cloud.const import (
from homeassistant.components.climate import (
ATTR_HVAC_MODE,
FAN_AUTO,
FAN_HIGH,
FAN_LOW,
FAN_MEDIUM,
ClimateEntity,
ClimateEntityFeature,
HVACAction,
@@ -55,6 +62,22 @@ from .entity import (
AirzoneZoneEntity,
)
FAN_SPEED_AUTO: dict[int, str] = {
0: FAN_AUTO,
}
FAN_SPEED_MAPS: Final[dict[int, dict[int, str]]] = {
2: {
1: FAN_LOW,
2: FAN_HIGH,
},
3: {
1: FAN_LOW,
2: FAN_MEDIUM,
3: FAN_HIGH,
},
}
HVAC_ACTION_LIB_TO_HASS: Final[dict[OperationAction, HVACAction]] = {
OperationAction.COOLING: HVACAction.COOLING,
OperationAction.DRYING: HVACAction.DRYING,
@@ -275,6 +298,9 @@ class AirzoneDeviceGroupClimate(AirzoneClimate):
class AirzoneAidooClimate(AirzoneAidooEntity, AirzoneDeviceClimate):
"""Define an Airzone Cloud Aidoo climate."""
_speeds: dict[int, str]
_speeds_reverse: dict[str, int]
def __init__(
self,
coordinator: AirzoneUpdateCoordinator,
@@ -291,9 +317,52 @@ class AirzoneAidooClimate(AirzoneAidooEntity, AirzoneDeviceClimate):
]
if HVACMode.OFF not in self._attr_hvac_modes:
self._attr_hvac_modes += [HVACMode.OFF]
if (
self.get_airzone_value(AZD_SPEED) is not None
and self.get_airzone_value(AZD_SPEEDS) is not None
):
self._initialize_fan_speeds()
self._async_update_attrs()
def _initialize_fan_speeds(self) -> None:
"""Initialize Aidoo fan speeds."""
azd_speeds: dict[int, int] = self.get_airzone_value(AZD_SPEEDS)
max_speed = max(azd_speeds)
fan_speeds: dict[int, str]
if speeds_map := FAN_SPEED_MAPS.get(max_speed):
fan_speeds = speeds_map
else:
fan_speeds = {}
for speed in azd_speeds:
if speed != 0:
fan_speeds[speed] = f"{int(round((speed * 100) / max_speed, 0))}%"
if 0 in azd_speeds:
fan_speeds = FAN_SPEED_AUTO | fan_speeds
self._speeds = {}
for key, value in fan_speeds.items():
_key = azd_speeds.get(key)
if _key is not None:
self._speeds[_key] = value
self._speeds_reverse = {v: k for k, v in self._speeds.items()}
self._attr_fan_modes = list(self._speeds_reverse)
self._attr_supported_features |= ClimateEntityFeature.FAN_MODE
async def async_set_fan_mode(self, fan_mode: str) -> None:
"""Set Aidoo fan mode."""
params: dict[str, Any] = {
API_SPEED_CONF: {
API_VALUE: self._speeds_reverse.get(fan_mode),
}
}
await self._async_update_params(params)
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
"""Set hvac mode."""
params: dict[str, Any] = {}
@@ -311,6 +380,14 @@ class AirzoneAidooClimate(AirzoneAidooEntity, AirzoneDeviceClimate):
}
await self._async_update_params(params)
@callback
def _async_update_attrs(self) -> None:
"""Update Aidoo climate attributes."""
super()._async_update_attrs()
if self.supported_features & ClimateEntityFeature.FAN_MODE:
self._attr_fan_mode = self._speeds.get(self.get_airzone_value(AZD_SPEED))
class AirzoneGroupClimate(AirzoneGroupEntity, AirzoneDeviceGroupClimate):
"""Define an Airzone Cloud Group climate."""

View File

@@ -33,6 +33,7 @@ from homeassistant.helpers.entity import Entity, EntityDescription
from homeassistant.helpers.entity_component import EntityComponent
from homeassistant.helpers.typing import ConfigType
from . import group as group_pre_import # noqa: F401
from .const import ( # noqa: F401
_DEPRECATED_FORMAT_NUMBER,
_DEPRECATED_FORMAT_TEXT,
@@ -172,7 +173,7 @@ class AlarmControlPanelEntity(Entity, cached_properties=CACHED_PROPERTIES_WITH_A
def alarm_disarm(self, code: str | None = None) -> None:
"""Send disarm command."""
raise NotImplementedError()
raise NotImplementedError
async def async_alarm_disarm(self, code: str | None = None) -> None:
"""Send disarm command."""
@@ -180,7 +181,7 @@ class AlarmControlPanelEntity(Entity, cached_properties=CACHED_PROPERTIES_WITH_A
def alarm_arm_home(self, code: str | None = None) -> None:
"""Send arm home command."""
raise NotImplementedError()
raise NotImplementedError
async def async_alarm_arm_home(self, code: str | None = None) -> None:
"""Send arm home command."""
@@ -188,7 +189,7 @@ class AlarmControlPanelEntity(Entity, cached_properties=CACHED_PROPERTIES_WITH_A
def alarm_arm_away(self, code: str | None = None) -> None:
"""Send arm away command."""
raise NotImplementedError()
raise NotImplementedError
async def async_alarm_arm_away(self, code: str | None = None) -> None:
"""Send arm away command."""
@@ -196,7 +197,7 @@ class AlarmControlPanelEntity(Entity, cached_properties=CACHED_PROPERTIES_WITH_A
def alarm_arm_night(self, code: str | None = None) -> None:
"""Send arm night command."""
raise NotImplementedError()
raise NotImplementedError
async def async_alarm_arm_night(self, code: str | None = None) -> None:
"""Send arm night command."""
@@ -204,7 +205,7 @@ class AlarmControlPanelEntity(Entity, cached_properties=CACHED_PROPERTIES_WITH_A
def alarm_arm_vacation(self, code: str | None = None) -> None:
"""Send arm vacation command."""
raise NotImplementedError()
raise NotImplementedError
async def async_alarm_arm_vacation(self, code: str | None = None) -> None:
"""Send arm vacation command."""
@@ -212,7 +213,7 @@ class AlarmControlPanelEntity(Entity, cached_properties=CACHED_PROPERTIES_WITH_A
def alarm_trigger(self, code: str | None = None) -> None:
"""Send alarm trigger command."""
raise NotImplementedError()
raise NotImplementedError
async def async_alarm_trigger(self, code: str | None = None) -> None:
"""Send alarm trigger command."""
@@ -220,7 +221,7 @@ class AlarmControlPanelEntity(Entity, cached_properties=CACHED_PROPERTIES_WITH_A
def alarm_arm_custom_bypass(self, code: str | None = None) -> None:
"""Send arm custom bypass command."""
raise NotImplementedError()
raise NotImplementedError
async def async_alarm_arm_custom_bypass(self, code: str | None = None) -> None:
"""Send arm custom bypass command."""

View File

@@ -1,6 +1,7 @@
"""Describe group states."""
from homeassistant.components.group import GroupIntegrationRegistry
from typing import TYPE_CHECKING
from homeassistant.const import (
STATE_ALARM_ARMED_AWAY,
STATE_ALARM_ARMED_CUSTOM_BYPASS,
@@ -12,10 +13,13 @@ from homeassistant.const import (
)
from homeassistant.core import HomeAssistant, callback
if TYPE_CHECKING:
from homeassistant.components.group import GroupIntegrationRegistry
@callback
def async_describe_on_off_states(
hass: HomeAssistant, registry: GroupIntegrationRegistry
hass: HomeAssistant, registry: "GroupIntegrationRegistry"
) -> None:
"""Describe group on off states."""
registry.on_off_states(

View File

@@ -18,9 +18,9 @@
"alarm_arm_away": "mdi:shield-lock",
"alarm_arm_home": "mdi:shield-home",
"alarm_arm_night": "mdi:shield-moon",
"alarm_custom_bypass": "mdi:security",
"alarm_arm_custom_bypass": "mdi:security",
"alarm_disarm": "mdi:shield-off",
"alarm_trigger": "mdi:bell-ring",
"arlam_arm_vacation": "mdi:shield-airplane"
"alarm_arm_vacation": "mdi:shield-airplane"
}
}

View File

@@ -0,0 +1,7 @@
{
"services": {
"toggle": "mdi:bell-ring",
"turn_off": "mdi:bell-off",
"turn_on": "mdi:bell-alert"
}
}

View File

@@ -1584,7 +1584,7 @@ class AlexaModeController(AlexaCapability):
)
modes += 1
# Alexa requiers at least 2 modes
# Alexa requires at least 2 modes
if modes == 1:
self._resource.add_mode(f"state.{PRESET_MODE_NA}", [PRESET_MODE_NA])

View File

@@ -50,7 +50,6 @@ async def async_setup_intents(hass: HomeAssistant) -> None:
Right now this module does not expose any, but the intent component breaks
without it.
"""
pass # pylint: disable=unnecessary-pass
class UnknownRequest(HomeAssistantError):

View File

@@ -224,7 +224,7 @@ class AlexaCapabilityResource:
Return ModeResources, PresetResources friendlyNames serialized.
"""
raise NotImplementedError()
raise NotImplementedError
def serialize_labels(self, resources: list[str]) -> dict[str, list[dict[str, Any]]]:
"""Return serialized labels for an API response.

View File

@@ -98,16 +98,16 @@ async def async_setup_entry(
_LOGGER.error("No devices found")
return
tasks = []
for heater in data_connection.get_devices():
tasks.append(asyncio.create_task(heater.update_device_info()))
tasks = [
asyncio.create_task(heater.update_device_info())
for heater in data_connection.get_devices()
]
await asyncio.wait(tasks)
devs = []
for heater in data_connection.get_devices():
devs.append(AmbiclimateEntity(heater, store))
async_add_entities(devs, True)
async_add_entities(
(AmbiclimateEntity(heater, store) for heater in data_connection.get_devices()),
True,
)
async def send_comfort_feedback(service: ServiceCall) -> None:
"""Send comfort feedback."""

View File

@@ -211,9 +211,10 @@ class AmcrestChecker(ApiWrapper):
self, *args: Any, **kwargs: Any
) -> AsyncIterator[httpx.Response]:
"""amcrest.ApiWrapper.command wrapper to catch errors."""
async with self._async_command_wrapper(), super().async_stream_command(
*args, **kwargs
) as ret:
async with (
self._async_command_wrapper(),
super().async_stream_command(*args, **kwargs) as ret,
):
yield ret
@asynccontextmanager

View File

@@ -13,15 +13,11 @@ from amcrest import AmcrestError
from haffmpeg.camera import CameraMjpeg
import voluptuous as vol
from homeassistant.components.camera import (
DOMAIN as CAMERA_DOMAIN,
Camera,
CameraEntityFeature,
)
from homeassistant.components.camera import Camera, CameraEntityFeature
from homeassistant.components.ffmpeg import FFmpegManager, get_ffmpeg_manager
from homeassistant.const import ATTR_ENTITY_ID, CONF_NAME, STATE_OFF, STATE_ON
from homeassistant.core import HomeAssistant
from homeassistant.helpers import config_validation as cv, entity_registry as er
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.aiohttp_client import (
async_aiohttp_proxy_stream,
async_aiohttp_proxy_web,
@@ -37,7 +33,6 @@ from .const import (
COMM_TIMEOUT,
DATA_AMCREST,
DEVICES,
DOMAIN,
RESOLUTION_TO_STREAM,
SERVICE_UPDATE,
SNAPSHOT_TIMEOUT,
@@ -141,18 +136,6 @@ async def async_setup_platform(
device = hass.data[DATA_AMCREST][DEVICES][name]
entity = AmcrestCam(name, device, get_ffmpeg_manager(hass))
# 2021.9.0 introduced unique id's for the camera entity, but these were not
# unique for different resolution streams. If any cameras were configured
# with this version, update the old entity with the new unique id.
serial_number = await device.api.async_serial_number
serial_number = serial_number.strip()
registry = er.async_get(hass)
entity_id = registry.async_get_entity_id(CAMERA_DOMAIN, DOMAIN, serial_number)
if entity_id is not None:
_LOGGER.debug("Updating unique id for camera %s", entity_id)
new_unique_id = f"{serial_number}-{device.resolution}-{device.channel}"
registry.async_update_entity(entity_id, new_unique_id=new_unique_id)
async_add_entities([entity], True)

View File

@@ -0,0 +1,15 @@
{
"services": {
"enable_recording": "mdi:record-rec",
"disable_recording": "mdi:stop",
"enable_audio": "mdi:volume-high",
"disable_audio": "mdi:volume-off",
"enable_motion_recording": "mdi:motion-sensor",
"disable_motion_recording": "mdi:motion-sensor-off",
"goto_preset": "mdi:pan",
"set_color_bw": "mdi:palette",
"start_tour": "mdi:panorama",
"stop_tour": "mdi:panorama-outline",
"ptz_control": "mdi:pan"
}
}

View File

@@ -108,21 +108,21 @@ class AmcrestSensor(SensorEntity):
elif sensor_type == SENSOR_SDCARD:
storage = await self._api.async_storage_all
try:
self._attr_extra_state_attributes[
"Total"
] = f"{storage['total'][0]:.2f} {storage['total'][1]}"
self._attr_extra_state_attributes["Total"] = (
f"{storage['total'][0]:.2f} {storage['total'][1]}"
)
except ValueError:
self._attr_extra_state_attributes[
"Total"
] = f"{storage['total'][0]} {storage['total'][1]}"
self._attr_extra_state_attributes["Total"] = (
f"{storage['total'][0]} {storage['total'][1]}"
)
try:
self._attr_extra_state_attributes[
"Used"
] = f"{storage['used'][0]:.2f} {storage['used'][1]}"
self._attr_extra_state_attributes["Used"] = (
f"{storage['used'][0]:.2f} {storage['used'][1]}"
)
except ValueError:
self._attr_extra_state_attributes[
"Used"
] = f"{storage['used'][0]} {storage['used'][1]}"
self._attr_extra_state_attributes["Used"] = (
f"{storage['used'][0]} {storage['used'][1]}"
)
try:
self._attr_native_value = f"{storage['used_percent']:.2f}"
except ValueError:

View File

@@ -3,46 +3,59 @@ enable_recording:
entity_id:
example: "camera.house_front"
selector:
text:
entity:
integration: amcrest
domain: camera
disable_recording:
fields:
entity_id:
example: "camera.house_front"
selector:
text:
entity:
integration: amcrest
domain: camera
enable_audio:
fields:
entity_id:
example: "camera.house_front"
selector:
text:
entity:
integration: amcrest
domain: camera
disable_audio:
fields:
entity_id:
example: "camera.house_front"
selector:
text:
entity:
integration: amcrest
domain: camera
enable_motion_recording:
fields:
entity_id:
example: "camera.house_front"
selector:
text:
entity:
integration: amcrest
domain: camera
disable_motion_recording:
fields:
entity_id:
example: "camera.house_front"
selector:
text:
entity:
integration: amcrest
domain: camera
goto_preset:
fields:
entity_id:
example: "camera.house_front"
selector:
entity:
integration: amcrest
@@ -59,7 +72,9 @@ set_color_bw:
entity_id:
example: "camera.house_front"
selector:
text:
entity:
integration: amcrest
domain: camera
color_bw:
selector:
select:
@@ -73,21 +88,27 @@ start_tour:
entity_id:
example: "camera.house_front"
selector:
text:
entity:
integration: amcrest
domain: camera
stop_tour:
fields:
entity_id:
example: "camera.house_front"
selector:
text:
entity:
integration: amcrest
domain: camera
ptz_control:
fields:
entity_id:
example: "camera.house_front"
selector:
text:
entity:
integration: amcrest
domain: camera
movement:
required: true
selector:

View File

@@ -52,7 +52,7 @@ class IPWebcamBinarySensor(AndroidIPCamBaseEntity, BinarySensorEntity):
@property
def available(self) -> bool:
"""Return avaibility if setting is enabled."""
"""Return availability if setting is enabled."""
return MOTION_ACTIVE in self.cam.enabled_sensors and super().available
@property

View File

@@ -132,7 +132,7 @@ async def async_setup_entry(
sensor
for sensor in SENSOR_TYPES
if sensor.key
in coordinator.cam.enabled_sensors + ["audio_connections", "video_connections"]
in [*coordinator.cam.enabled_sensors, "audio_connections", "video_connections"]
]
async_add_entities(
IPWebcamSensor(coordinator, description) for description in sensor_types

View File

@@ -235,7 +235,7 @@ class OptionsFlowHandler(OptionsFlowWithConfigEntry):
apps = [SelectOptionDict(value=APPS_NEW_ID, label="Add new")] + [
SelectOptionDict(value=k, label=v) for k, v in apps_list.items()
]
rules = [RULES_NEW_ID] + list(self._state_det_rules)
rules = [RULES_NEW_ID, *self._state_det_rules]
options = self.options
data_schema = vol.Schema(

View File

@@ -56,7 +56,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
entry,
data={
**entry.data,
**{CONF_DEVICES: serialize_device_list(devices)},
CONF_DEVICES: serialize_device_list(devices),
},
)
coordinators = [AnovaCoordinator(hass, device) for device in devices]

View File

@@ -0,0 +1,23 @@
"""Diagnostics support for APCUPSD."""
from __future__ import annotations
from typing import Any
from homeassistant.components.diagnostics import async_redact_data
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from .const import DOMAIN
from .coordinator import APCUPSdCoordinator, APCUPSdData
TO_REDACT = {"SERIALNO", "HOSTNAME"}
async def async_get_config_entry_diagnostics(
hass: HomeAssistant, entry: ConfigEntry
) -> dict[str, Any]:
"""Return diagnostics for a config entry."""
coordinator: APCUPSdCoordinator = hass.data[DOMAIN][entry.entry_id]
data: APCUPSdData = coordinator.data
return async_redact_data(data, TO_REDACT)

View File

@@ -137,7 +137,7 @@ class APIEventStream(HomeAssistantView):
restrict: list[str] | None = None
if restrict_str := request.query.get("restrict"):
restrict = restrict_str.split(",") + [EVENT_HOMEASSISTANT_STOP]
restrict = [*restrict_str.split(","), EVENT_HOMEASSISTANT_STOP]
async def forward_events(event: Event) -> None:
"""Forward events to the open request."""
@@ -413,7 +413,7 @@ class APIDomainServicesView(HomeAssistantView):
)
)
except (vol.Invalid, ServiceNotFound) as ex:
raise HTTPBadRequest() from ex
raise HTTPBadRequest from ex
finally:
cancel_listen()

View File

@@ -54,6 +54,25 @@ SIGNAL_DISCONNECTED = "apple_tv_disconnected"
PLATFORMS = [Platform.MEDIA_PLAYER, Platform.REMOTE]
AUTH_EXCEPTIONS = (
exceptions.AuthenticationError,
exceptions.InvalidCredentialsError,
exceptions.NoCredentialsError,
)
CONNECTION_TIMEOUT_EXCEPTIONS = (
asyncio.CancelledError,
TimeoutError,
exceptions.ConnectionLostError,
exceptions.ConnectionFailedError,
)
DEVICE_EXCEPTIONS = (
exceptions.ProtocolError,
exceptions.NoServiceError,
exceptions.PairingError,
exceptions.BackOffError,
exceptions.DeviceIdMissingError,
)
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up a config entry for Apple TV."""
@@ -64,27 +83,13 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
try:
await manager.async_first_connect()
except (
exceptions.AuthenticationError,
exceptions.InvalidCredentialsError,
exceptions.NoCredentialsError,
) as ex:
except AUTH_EXCEPTIONS as ex:
raise ConfigEntryAuthFailed(
f"{address}: Authentication failed, try reconfiguring device: {ex}"
) from ex
except (
asyncio.CancelledError,
exceptions.ConnectionLostError,
exceptions.ConnectionFailedError,
) as ex:
except CONNECTION_TIMEOUT_EXCEPTIONS as ex:
raise ConfigEntryNotReady(f"{address}: {ex}") from ex
except (
exceptions.ProtocolError,
exceptions.NoServiceError,
exceptions.PairingError,
exceptions.BackOffError,
exceptions.DeviceIdMissingError,
) as ex:
except DEVICE_EXCEPTIONS as ex:
_LOGGER.debug(
"Error setting up apple_tv at %s: %s", address, ex, exc_info=ex
)
@@ -97,7 +102,9 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
await manager.disconnect()
entry.async_on_unload(
hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, on_hass_stop)
hass.bus.async_listen_once(
EVENT_HOMEASSISTANT_STOP, on_hass_stop, run_immediately=True
)
)
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)

View File

@@ -341,7 +341,7 @@ class AppleTVConfigFlow(ConfigFlow, domain=DOMAIN):
self.hass, self.scan_filter, self.hass.loop
)
if not self.atv:
raise DeviceNotFound()
raise DeviceNotFound
# Protocols supported by the device are prospects for pairing
self.protocols_to_pair = deque(
@@ -384,7 +384,7 @@ class AppleTVConfigFlow(ConfigFlow, domain=DOMAIN):
self.hass.config_entries.async_reload(entry.entry_id)
)
if not allow_exist:
raise DeviceAlreadyConfigured()
raise DeviceAlreadyConfigured
async def async_step_confirm(
self, user_input: dict[str, str] | None = None

View File

@@ -153,7 +153,9 @@ class AppleTvMediaPlayer(
atv.audio.listener = self
if atv.features.in_state(FeatureState.Available, FeatureName.AppList):
self.hass.create_task(self._update_app_list())
self.manager.config_entry.async_create_task(
self.hass, self._update_app_list(), eager_start=True
)
async def _update_app_list(self) -> None:
_LOGGER.debug("Updating app list")

View File

@@ -5,5 +5,5 @@
"documentation": "https://www.home-assistant.io/integrations/apprise",
"iot_class": "cloud_push",
"loggers": ["apprise"],
"requirements": ["apprise==1.7.2"]
"requirements": ["apprise==1.7.4"]
}

View File

@@ -51,7 +51,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
coordinator.stop_listen()
raise ConfigEntryNotReady()
raise ConfigEntryNotReady
await coordinator.wait_for_ready(ready_callback)

View File

@@ -33,14 +33,14 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
address = entry.unique_id
assert address is not None
coordinator = hass.data.setdefault(DOMAIN, {})[
entry.entry_id
] = PassiveBluetoothProcessorCoordinator(
hass,
_LOGGER,
address=address,
mode=BluetoothScanningMode.PASSIVE,
update_method=_service_info_to_adv,
coordinator = hass.data.setdefault(DOMAIN, {})[entry.entry_id] = (
PassiveBluetoothProcessorCoordinator(
hass,
_LOGGER,
address=address,
mode=BluetoothScanningMode.PASSIVE,
update_method=_service_info_to_adv,
)
)
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
entry.async_on_unload(

View File

@@ -23,8 +23,8 @@ _LOGGER = logging.getLogger(__name__)
_DEVICES_REGEX = re.compile(
r"(?P<name>([^\s]+)?)\s+"
+ r"(?P<ip>([0-9]{1,3}[\.]){3}[0-9]{1,3})\s+"
+ r"(?P<mac>([0-9a-f]{2}[:-]){5}([0-9a-f]{2}))\s+"
r"(?P<ip>([0-9]{1,3}[\.]){3}[0-9]{1,3})\s+"
r"(?P<mac>([0-9a-f]{2}[:-]){5}([0-9a-f]{2}))\s+"
)
PLATFORM_SCHEMA = PARENT_PLATFORM_SCHEMA.extend(

View File

@@ -754,9 +754,9 @@ class PipelineRun:
raise DuplicateWakeUpDetectedError(result.wake_word_phrase)
# Record last wake up time to block duplicate detections
self.hass.data[DATA_LAST_WAKE_UP][
result.wake_word_phrase
] = time.monotonic()
self.hass.data[DATA_LAST_WAKE_UP][result.wake_word_phrase] = (
time.monotonic()
)
if result.queued_audio:
# Add audio that was pending at detection.
@@ -1375,9 +1375,9 @@ class PipelineInput:
raise DuplicateWakeUpDetectedError(self.wake_word_phrase)
# Record last wake up time to block duplicate detections
self.run.hass.data[DATA_LAST_WAKE_UP][
self.wake_word_phrase
] = time.monotonic()
self.run.hass.data[DATA_LAST_WAKE_UP][self.wake_word_phrase] = (
time.monotonic()
)
stt_input_stream = stt_processed_stream

View File

@@ -101,9 +101,9 @@ class AsusWrtDevice(ScannerEntity):
self._device = self._router.devices[self._device.mac]
self._attr_extra_state_attributes = {}
if self._device.last_activity:
self._attr_extra_state_attributes[
ATTR_LAST_TIME_REACHABLE
] = self._device.last_activity.isoformat(timespec="seconds")
self._attr_extra_state_attributes[ATTR_LAST_TIME_REACHABLE] = (
self._device.last_activity.isoformat(timespec="seconds")
)
self.async_write_ha_state()
async def async_added_to_hass(self) -> None:

View File

@@ -141,9 +141,9 @@ class AugustLock(AugustEntityMixin, RestoreEntity, LockEntity):
ATTR_BATTERY_LEVEL: self._detail.battery_level
}
if self._detail.keypad is not None:
self._attr_extra_state_attributes[
"keypad_battery_level"
] = self._detail.keypad.battery_level
self._attr_extra_state_attributes["keypad_battery_level"] = (
self._detail.keypad.battery_level
)
async def async_added_to_hass(self) -> None:
"""Restore ATTR_CHANGED_BY on startup since it is likely no longer in the activity log."""

View File

@@ -66,7 +66,9 @@ class AugustSubscriberMixin:
self._unsub_interval()
self._stop_interval = self._hass.bus.async_listen(
EVENT_HOMEASSISTANT_STOP, _async_cancel_update_interval
EVENT_HOMEASSISTANT_STOP,
_async_cancel_update_interval,
run_immediately=True,
)
@callback

View File

@@ -12,14 +12,12 @@
import logging
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, SCAN_INTERVAL
from .const import DOMAIN
from .coordinator import AuroraAbbDataUpdateCoordinator
PLATFORMS = [Platform.SENSOR]
@@ -50,60 +48,3 @@ 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]]): # pylint: disable=hass-enforce-coordinator-module
"""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)
[alarm, *_] = self.client.alarms()
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)
data["alarm"] = alarm
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

@@ -0,0 +1,94 @@
"""DataUpdateCoordinator for the aurora_abb_powerone integration."""
import logging
from time import sleep
from aurorapy.client import AuroraError, AuroraSerialClient, AuroraTimeoutError
from serial import SerialException
from homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import DOMAIN, SCAN_INTERVAL
_LOGGER = logging.getLogger(__name__)
class AuroraAbbDataUpdateCoordinator(DataUpdateCoordinator[dict[str, float]]): # pylint: disable=hass-enforce-coordinator-module
"""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 sensors.
This is the only function that should fetch new data for Home Assistant.
"""
data: dict[str, float] = {}
self.available_prev = self.available
retries: int = 3
while retries > 0:
try:
self.client.connect()
# See command 59 in the protocol manual linked in __init__.py
grid_voltage = self.client.measure(1, True)
grid_current = self.client.measure(2, True)
power_watts = self.client.measure(3, True)
frequency = self.client.measure(4)
i_leak_dcdc = self.client.measure(6)
i_leak_inverter = self.client.measure(7)
temperature_c = self.client.measure(21)
r_iso = self.client.measure(30)
energy_wh = self.client.cumulated_energy(5)
[alarm, *_] = self.client.alarms()
except AuroraTimeoutError:
self.available = False
_LOGGER.debug("No response from inverter (could be dark)")
retries = 0
except (SerialException, AuroraError) as error:
self.available = False
retries -= 1
if retries <= 0:
raise UpdateFailed(error) from error
_LOGGER.debug(
"Exception: %s occurred, %d retries remaining",
repr(error),
retries,
)
sleep(1)
else:
data["grid_voltage"] = round(grid_voltage, 1)
data["grid_current"] = round(grid_current, 1)
data["instantaneouspower"] = round(power_watts, 1)
data["grid_frequency"] = round(frequency, 1)
data["i_leak_dcdc"] = i_leak_dcdc
data["i_leak_inverter"] = i_leak_inverter
data["temp"] = round(temperature_c, 1)
data["r_iso"] = r_iso
data["totalenergy"] = round(energy_wh / 1000, 2)
data["alarm"] = alarm
self.available = True
retries = 0
finally:
if self.available != self.available_prev:
if self.available:
_LOGGER.info("Communication with %s back online", self.name)
else:
_LOGGER.info(
"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

@@ -0,0 +1,12 @@
{
"entity": {
"sensor": {
"r_iso": {
"default": "mdi:omega"
},
"alarm": {
"default": "mdi:alert-octagon"
}
}
}
}

View File

@@ -18,7 +18,10 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
ATTR_SERIAL_NUMBER,
EntityCategory,
UnitOfElectricCurrent,
UnitOfElectricPotential,
UnitOfEnergy,
UnitOfFrequency,
UnitOfPower,
UnitOfTemperature,
)
@@ -42,6 +45,50 @@ _LOGGER = logging.getLogger(__name__)
ALARM_STATES = list(AuroraMapping.ALARM_STATES.values())
SENSOR_TYPES = [
SensorEntityDescription(
key="grid_voltage",
device_class=SensorDeviceClass.VOLTAGE,
entity_category=EntityCategory.DIAGNOSTIC,
native_unit_of_measurement=UnitOfElectricPotential.VOLT,
state_class=SensorStateClass.MEASUREMENT,
translation_key="grid_voltage",
entity_registry_enabled_default=False,
),
SensorEntityDescription(
key="grid_current",
device_class=SensorDeviceClass.CURRENT,
entity_category=EntityCategory.DIAGNOSTIC,
native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
state_class=SensorStateClass.MEASUREMENT,
translation_key="grid_current",
entity_registry_enabled_default=False,
),
SensorEntityDescription(
key="grid_frequency",
device_class=SensorDeviceClass.FREQUENCY,
entity_category=EntityCategory.DIAGNOSTIC,
native_unit_of_measurement=UnitOfFrequency.HERTZ,
state_class=SensorStateClass.MEASUREMENT,
entity_registry_enabled_default=False,
),
SensorEntityDescription(
key="i_leak_dcdc",
device_class=SensorDeviceClass.CURRENT,
entity_category=EntityCategory.DIAGNOSTIC,
native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
state_class=SensorStateClass.MEASUREMENT,
translation_key="i_leak_dcdc",
entity_registry_enabled_default=False,
),
SensorEntityDescription(
key="i_leak_inverter",
device_class=SensorDeviceClass.CURRENT,
entity_category=EntityCategory.DIAGNOSTIC,
native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
state_class=SensorStateClass.MEASUREMENT,
translation_key="i_leak_inverter",
entity_registry_enabled_default=False,
),
SensorEntityDescription(
key="alarm",
device_class=SensorDeviceClass.ENUM,
@@ -63,6 +110,14 @@ SENSOR_TYPES = [
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
state_class=SensorStateClass.MEASUREMENT,
),
SensorEntityDescription(
key="r_iso",
entity_category=EntityCategory.DIAGNOSTIC,
native_unit_of_measurement="MOhms",
state_class=SensorStateClass.MEASUREMENT,
translation_key="r_iso",
entity_registry_enabled_default=False,
),
SensorEntityDescription(
key="totalenergy",
device_class=SensorDeviceClass.ENERGY,

View File

@@ -21,14 +21,29 @@
},
"entity": {
"sensor": {
"grid_voltage": {
"name": "Grid voltage"
},
"grid_current": {
"name": "Grid current"
},
"alarm": {
"name": "Alarm status"
},
"power_output": {
"name": "Power output"
},
"i_leak_dcdc": {
"name": "DC-DC leak current"
},
"i_leak_inverter": {
"name": "Inverter leak current"
},
"total_energy": {
"name": "Total energy"
},
"r_iso": {
"name": "Isolation resistance"
}
}
}

View File

@@ -33,15 +33,15 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
)
# Ignore services that don't support usage data
ignore_types = FETCH_TYPES + ["Hardware"]
ignore_types = [*FETCH_TYPES, "Hardware"]
try:
await client.login()
services = await client.get_services(drop_types=ignore_types)
except AuthenticationException as exc:
raise ConfigEntryAuthFailed() from exc
raise ConfigEntryAuthFailed from exc
except ClientError as exc:
raise ConfigEntryNotReady() from exc
raise ConfigEntryNotReady from exc
# Create an appropriate refresh function
def update_data_factory(service_id):

View File

@@ -92,9 +92,10 @@ async def fetch_redirect_uris(hass: HomeAssistant, url: str) -> list[str]:
parser = LinkTagParser("redirect_uri")
chunks = 0
try:
async with aiohttp.ClientSession() as session, session.get(
url, timeout=5
) as resp:
async with (
aiohttp.ClientSession() as session,
session.get(url, timeout=5) as resp,
):
async for data in resp.content.iter_chunked(1024):
parser.feed(data.decode())
chunks += 1
@@ -158,7 +159,7 @@ def _parse_client_id(client_id: str) -> ParseResult:
# Client identifier URLs
# MUST have either an https or http scheme
if parts.scheme not in ("http", "https"):
raise ValueError()
raise ValueError
# MUST contain a path component
# Handled by url canonicalization.
@@ -183,7 +184,7 @@ def _parse_client_id(client_id: str) -> ParseResult:
# MAY contain a port
try:
# parts raises ValueError when port cannot be parsed as int
parts.port
_ = parts.port
except ValueError as ex:
raise ValueError("Client ID contains invalid port") from ex

View File

@@ -233,6 +233,30 @@ def areas_in_automation(hass: HomeAssistant, entity_id: str) -> list[str]:
return _x_in_automation(hass, entity_id, "referenced_areas")
@callback
def automations_with_floor(hass: HomeAssistant, floor_id: str) -> list[str]:
"""Return all automations that reference the floor."""
return _automations_with_x(hass, floor_id, "referenced_floors")
@callback
def floors_in_automation(hass: HomeAssistant, entity_id: str) -> list[str]:
"""Return all floors in an automation."""
return _x_in_automation(hass, entity_id, "referenced_floors")
@callback
def automations_with_label(hass: HomeAssistant, label_id: str) -> list[str]:
"""Return all automations that reference the label."""
return _automations_with_x(hass, label_id, "referenced_labels")
@callback
def labels_in_automation(hass: HomeAssistant, entity_id: str) -> list[str]:
"""Return all labels in an automation."""
return _x_in_automation(hass, entity_id, "referenced_labels")
@callback
def automations_with_blueprint(hass: HomeAssistant, blueprint_path: str) -> list[str]:
"""Return all automations that reference the blueprint."""
@@ -274,8 +298,13 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
await _async_process_config(hass, config, component)
# Add some default blueprints to blueprints/automation, does nothing
# if blueprints/automation already exists
await async_get_blueprints(hass).async_populate()
# if blueprints/automation already exists but still has to create
# an executor job to check if the folder exists so we run it in a
# separate task to avoid waiting for it to finish setting up
# since a tracked task will be waited at the end of startup
hass.async_create_task(
async_get_blueprints(hass).async_populate(), eager_start=True
)
async def trigger_service_handler(
entity: BaseAutomationEntity, service_call: ServiceCall
@@ -341,6 +370,16 @@ class BaseAutomationEntity(ToggleEntity, ABC):
return {CONF_ID: self.unique_id}
return None
@cached_property
@abstractmethod
def referenced_labels(self) -> set[str]:
"""Return a set of referenced labels."""
@cached_property
@abstractmethod
def referenced_floors(self) -> set[str]:
"""Return a set of referenced floors."""
@cached_property
@abstractmethod
def referenced_areas(self) -> set[str]:
@@ -374,7 +413,7 @@ class BaseAutomationEntity(ToggleEntity, ABC):
class UnavailableAutomationEntity(BaseAutomationEntity):
"""A non-functional automation entity with its state set to unavailable.
This class is instatiated when an automation fails to validate.
This class is instantiated when an automation fails to validate.
"""
_attr_should_poll = False
@@ -396,6 +435,16 @@ class UnavailableAutomationEntity(BaseAutomationEntity):
"""Return the name of the entity."""
return self._name
@cached_property
def referenced_labels(self) -> set[str]:
"""Return a set of referenced labels."""
return set()
@cached_property
def referenced_floors(self) -> set[str]:
"""Return a set of referenced floors."""
return set()
@cached_property
def referenced_areas(self) -> set[str]:
"""Return a set of referenced areas."""
@@ -483,6 +532,16 @@ class AutomationEntity(BaseAutomationEntity, RestoreEntity):
"""Return True if entity is on."""
return self._async_detach_triggers is not None or self._is_enabled
@property
def referenced_labels(self) -> set[str]:
"""Return a set of referenced labels."""
return self.action_script.referenced_labels
@property
def referenced_floors(self) -> set[str]:
"""Return a set of referenced floors."""
return self.action_script.referenced_floors
@cached_property
def referenced_areas(self) -> set[str]:
"""Return a set of referenced areas."""

View File

@@ -122,9 +122,9 @@ class AwairFlowHandler(ConfigFlow, domain=DOMAIN):
for flow in self._async_in_progress():
if flow["context"]["source"] == SOURCE_ZEROCONF:
info = flow["context"]["title_placeholders"]
entries[
flow["context"]["host"]
] = f"{info['model']} ({info['device_id']})"
entries[flow["context"]["host"]] = (
f"{info['model']} ({info['device_id']})"
)
return entries
async def async_step_local(

View File

@@ -230,15 +230,14 @@ class AWSSQS(AWSNotify):
async with self.session.create_client(
self.service, **self.aws_config
) as client:
tasks = []
for target in kwargs.get(ATTR_TARGET, []):
tasks.append(
client.send_message(
QueueUrl=target,
MessageBody=json_body,
MessageAttributes=message_attributes,
)
tasks = [
client.send_message(
QueueUrl=target,
MessageBody=json_body,
MessageAttributes=message_attributes,
)
for target in kwargs.get(ATTR_TARGET, [])
]
if tasks:
await asyncio.gather(*tasks)

View File

@@ -3,46 +3,175 @@
from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
from datetime import datetime, timedelta
from axis.models.event import Event, EventGroup, EventOperation, EventTopic
from axis.vapix.interfaces.applications.fence_guard import FenceGuardHandler
from axis.vapix.interfaces.applications.loitering_guard import LoiteringGuardHandler
from axis.vapix.interfaces.applications.motion_guard import MotionGuardHandler
from axis.vapix.interfaces.applications.vmd4 import Vmd4Handler
from axis.interfaces.applications.fence_guard import FenceGuardHandler
from axis.interfaces.applications.loitering_guard import LoiteringGuardHandler
from axis.interfaces.applications.motion_guard import MotionGuardHandler
from axis.interfaces.applications.vmd4 import Vmd4Handler
from axis.models.event import Event, EventTopic
from homeassistant.components.binary_sensor import (
BinarySensorDeviceClass,
BinarySensorEntity,
BinarySensorEntityDescription,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.event import async_call_later
from .entity import AxisEventEntity
from .entity import AxisEventDescription, AxisEventEntity
from .hub import AxisHub
DEVICE_CLASS = {
EventGroup.INPUT: BinarySensorDeviceClass.CONNECTIVITY,
EventGroup.LIGHT: BinarySensorDeviceClass.LIGHT,
EventGroup.MOTION: BinarySensorDeviceClass.MOTION,
EventGroup.SOUND: BinarySensorDeviceClass.SOUND,
}
EVENT_TOPICS = (
EventTopic.DAY_NIGHT_VISION,
EventTopic.FENCE_GUARD,
EventTopic.LOITERING_GUARD,
EventTopic.MOTION_DETECTION,
EventTopic.MOTION_DETECTION_3,
EventTopic.MOTION_DETECTION_4,
EventTopic.MOTION_GUARD,
EventTopic.OBJECT_ANALYTICS,
EventTopic.PIR,
EventTopic.PORT_INPUT,
EventTopic.PORT_SUPERVISED_INPUT,
EventTopic.SOUND_TRIGGER_LEVEL,
@dataclass(frozen=True, kw_only=True)
class AxisBinarySensorDescription(AxisEventDescription, BinarySensorEntityDescription):
"""Axis binary sensor entity description."""
@callback
def event_id_is_int(event_id: str) -> bool:
"""Make sure event ID is int."""
try:
_ = int(event_id)
except ValueError:
return False
return True
@callback
def guard_suite_supported_fn(hub: AxisHub, event: Event) -> bool:
"""Validate event ID is int."""
_, _, profile_id = event.id.partition("Profile")
return event_id_is_int(profile_id)
@callback
def object_analytics_supported_fn(hub: AxisHub, event: Event) -> bool:
"""Validate event ID is int."""
_, _, profile_id = event.id.partition("Scenario")
return event_id_is_int(profile_id)
@callback
def guard_suite_name_fn(
handler: FenceGuardHandler
| LoiteringGuardHandler
| MotionGuardHandler
| Vmd4Handler,
event: Event,
event_type: str,
) -> str:
"""Get guard suite item name."""
if handler.initialized and (profiles := handler["0"].profiles):
for profile_id, profile in profiles.items():
camera_id = profile.camera
if event.id == f"Camera{camera_id}Profile{profile_id}":
return f"{event_type} {profile.name}"
return ""
@callback
def fence_guard_name_fn(hub: AxisHub, event: Event) -> str:
"""Fence guard name."""
return guard_suite_name_fn(hub.api.vapix.fence_guard, event, "Fence Guard")
@callback
def loitering_guard_name_fn(hub: AxisHub, event: Event) -> str:
"""Loitering guard name."""
return guard_suite_name_fn(hub.api.vapix.loitering_guard, event, "Loitering Guard")
@callback
def motion_guard_name_fn(hub: AxisHub, event: Event) -> str:
"""Motion guard name."""
return guard_suite_name_fn(hub.api.vapix.motion_guard, event, "Motion Guard")
@callback
def motion_detection_4_name_fn(hub: AxisHub, event: Event) -> str:
"""Motion detection 4 name."""
return guard_suite_name_fn(hub.api.vapix.vmd4, event, "VMD4")
@callback
def object_analytics_name_fn(hub: AxisHub, event: Event) -> str:
"""Get object analytics name."""
if hub.api.vapix.object_analytics.initialized and (
scenarios := hub.api.vapix.object_analytics["0"].scenarios
):
for scenario_id, scenario in scenarios.items():
device_id = scenario.devices[0]["id"]
if event.id == f"Device{device_id}Scenario{scenario_id}":
return f"Object Analytics {scenario.name}"
return ""
ENTITY_DESCRIPTIONS = (
AxisBinarySensorDescription(
key="Input port state",
device_class=BinarySensorDeviceClass.CONNECTIVITY,
event_topic=(EventTopic.PORT_INPUT, EventTopic.PORT_SUPERVISED_INPUT),
name_fn=lambda hub, event: hub.api.vapix.ports[event.id].name,
supported_fn=lambda hub, event: event_id_is_int(event.id),
),
AxisBinarySensorDescription(
key="Day/Night vision state",
device_class=BinarySensorDeviceClass.LIGHT,
event_topic=EventTopic.DAY_NIGHT_VISION,
),
AxisBinarySensorDescription(
key="Sound trigger state",
device_class=BinarySensorDeviceClass.SOUND,
event_topic=EventTopic.SOUND_TRIGGER_LEVEL,
),
AxisBinarySensorDescription(
key="Motion sensors state",
device_class=BinarySensorDeviceClass.MOTION,
event_topic=(
EventTopic.PIR,
EventTopic.MOTION_DETECTION,
EventTopic.MOTION_DETECTION_3,
),
),
AxisBinarySensorDescription(
key="Motion detection 4 state",
device_class=BinarySensorDeviceClass.MOTION,
event_topic=EventTopic.MOTION_DETECTION_4,
name_fn=motion_detection_4_name_fn,
supported_fn=guard_suite_supported_fn,
),
AxisBinarySensorDescription(
key="Fence guard state",
device_class=BinarySensorDeviceClass.MOTION,
event_topic=EventTopic.FENCE_GUARD,
name_fn=fence_guard_name_fn,
supported_fn=guard_suite_supported_fn,
),
AxisBinarySensorDescription(
key="Loitering guard state",
device_class=BinarySensorDeviceClass.MOTION,
event_topic=EventTopic.LOITERING_GUARD,
name_fn=loitering_guard_name_fn,
supported_fn=guard_suite_supported_fn,
),
AxisBinarySensorDescription(
key="Motion guard state",
device_class=BinarySensorDeviceClass.MOTION,
event_topic=EventTopic.MOTION_GUARD,
name_fn=motion_guard_name_fn,
supported_fn=guard_suite_supported_fn,
),
AxisBinarySensorDescription(
key="Object analytics state",
device_class=BinarySensorDeviceClass.MOTION,
event_topic=EventTopic.OBJECT_ANALYTICS,
name_fn=object_analytics_name_fn,
supported_fn=object_analytics_supported_fn,
),
)
@@ -52,32 +181,24 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up a Axis binary sensor."""
hub = AxisHub.get_hub(hass, config_entry)
@callback
def async_create_entity(event: Event) -> None:
"""Create Axis binary sensor entity."""
async_add_entities([AxisBinarySensor(event, hub)])
hub.api.event.subscribe(
async_create_entity,
topic_filter=EVENT_TOPICS,
operation_filter=EventOperation.INITIALIZED,
AxisHub.get_hub(hass, config_entry).entity_loader.register_platform(
async_add_entities, AxisBinarySensor, ENTITY_DESCRIPTIONS
)
class AxisBinarySensor(AxisEventEntity, BinarySensorEntity):
"""Representation of a binary Axis event."""
def __init__(self, event: Event, hub: AxisHub) -> None:
entity_description: AxisBinarySensorDescription
def __init__(
self, hub: AxisHub, description: AxisBinarySensorDescription, event: Event
) -> None:
"""Initialize the Axis binary sensor."""
super().__init__(event, hub)
self.cancel_scheduled_update: Callable[[], None] | None = None
super().__init__(hub, description, event)
self._attr_device_class = DEVICE_CLASS.get(event.group)
self._attr_is_on = event.is_tripped
self._set_name(event)
self.cancel_scheduled_update: Callable[[], None] | None = None
@callback
def async_event_callback(self, event: Event) -> None:
@@ -103,45 +224,3 @@ class AxisBinarySensor(AxisEventEntity, BinarySensorEntity):
timedelta(seconds=self.hub.config.trigger_time),
scheduled_update,
)
@callback
def _set_name(self, event: Event) -> None:
"""Set binary sensor name."""
if (
event.group == EventGroup.INPUT
and event.id in self.hub.api.vapix.ports
and self.hub.api.vapix.ports[event.id].name
):
self._attr_name = self.hub.api.vapix.ports[event.id].name
elif event.group == EventGroup.MOTION:
event_data: FenceGuardHandler | LoiteringGuardHandler | MotionGuardHandler | Vmd4Handler | None = None
if event.topic_base == EventTopic.FENCE_GUARD:
event_data = self.hub.api.vapix.fence_guard
elif event.topic_base == EventTopic.LOITERING_GUARD:
event_data = self.hub.api.vapix.loitering_guard
elif event.topic_base == EventTopic.MOTION_GUARD:
event_data = self.hub.api.vapix.motion_guard
elif event.topic_base == EventTopic.MOTION_DETECTION_4:
event_data = self.hub.api.vapix.vmd4
if (
event_data
and event_data.initialized
and (profiles := event_data["0"].profiles)
):
for profile_id, profile in profiles.items():
camera_id = profile.camera
if event.id == f"Camera{camera_id}Profile{profile_id}":
self._attr_name = f"{self._event_type} {profile.name}"
return
if (
event.topic_base == EventTopic.OBJECT_ANALYTICS
and self.hub.api.vapix.object_analytics.initialized
and (scenarios := self.hub.api.vapix.object_analytics["0"].scenarios)
):
for scenario_id, scenario in scenarios.items():
device_id = scenario.devices[0]["id"]
if event.id == f"Device{device_id}Scenario{scenario_id}":
self._attr_name = f"{self._event_type} {scenario.name}"
break

View File

@@ -25,6 +25,7 @@ from homeassistant.const import (
CONF_NAME,
CONF_PASSWORD,
CONF_PORT,
CONF_PROTOCOL,
CONF_USERNAME,
)
from homeassistant.core import callback
@@ -42,7 +43,9 @@ from .errors import AuthenticationRequired, CannotConnect
from .hub import AxisHub, get_axis_api
AXIS_OUI = {"00:40:8c", "ac:cc:8e", "b8:a4:4f"}
DEFAULT_PORT = 80
DEFAULT_PORT = 443
DEFAULT_PROTOCOL = "https"
PROTOCOL_CHOICES = ["https", "http"]
class AxisFlowHandler(ConfigFlow, domain=AXIS_DOMAIN):
@@ -74,11 +77,19 @@ class AxisFlowHandler(ConfigFlow, domain=AXIS_DOMAIN):
try:
api = await get_axis_api(self.hass, MappingProxyType(user_input))
except AuthenticationRequired:
errors["base"] = "invalid_auth"
except CannotConnect:
errors["base"] = "cannot_connect"
else:
serial = api.vapix.serial_number
await self.async_set_unique_id(format_mac(serial))
self._abort_if_unique_id_configured(
updates={
CONF_PROTOCOL: user_input[CONF_PROTOCOL],
CONF_HOST: user_input[CONF_HOST],
CONF_PORT: user_input[CONF_PORT],
CONF_USERNAME: user_input[CONF_USERNAME],
@@ -87,6 +98,7 @@ class AxisFlowHandler(ConfigFlow, domain=AXIS_DOMAIN):
)
self.config = {
CONF_PROTOCOL: user_input[CONF_PROTOCOL],
CONF_HOST: user_input[CONF_HOST],
CONF_PORT: user_input[CONF_PORT],
CONF_USERNAME: user_input[CONF_USERNAME],
@@ -96,13 +108,8 @@ class AxisFlowHandler(ConfigFlow, domain=AXIS_DOMAIN):
return await self._create_entry(serial)
except AuthenticationRequired:
errors["base"] = "invalid_auth"
except CannotConnect:
errors["base"] = "cannot_connect"
data = self.discovery_schema or {
vol.Required(CONF_PROTOCOL): vol.In(PROTOCOL_CHOICES),
vol.Required(CONF_HOST): str,
vol.Required(CONF_USERNAME): str,
vol.Required(CONF_PASSWORD): str,
@@ -139,6 +146,14 @@ class AxisFlowHandler(ConfigFlow, domain=AXIS_DOMAIN):
title = f"{model} - {serial}"
return self.async_create_entry(title=title, data=self.config)
async def async_step_reconfigure(
self, user_input: Mapping[str, Any] | None = None
) -> ConfigFlowResult:
"""Trigger a reconfiguration flow."""
entry = self.hass.config_entries.async_get_entry(self.context["entry_id"])
assert entry
return await self._redo_configuration(entry.data, keep_password=True)
async def async_step_reauth(
self, entry_data: Mapping[str, Any]
) -> ConfigFlowResult:
@@ -147,11 +162,22 @@ class AxisFlowHandler(ConfigFlow, domain=AXIS_DOMAIN):
CONF_NAME: entry_data[CONF_NAME],
CONF_HOST: entry_data[CONF_HOST],
}
return await self._redo_configuration(entry_data, keep_password=False)
async def _redo_configuration(
self, entry_data: Mapping[str, Any], keep_password: bool
) -> ConfigFlowResult:
"""Re-run configuration step."""
self.discovery_schema = {
vol.Required(
CONF_PROTOCOL, default=entry_data.get(CONF_PROTOCOL, "http")
): str,
vol.Required(CONF_HOST, default=entry_data[CONF_HOST]): str,
vol.Required(CONF_USERNAME, default=entry_data[CONF_USERNAME]): str,
vol.Required(CONF_PASSWORD): str,
vol.Required(
CONF_PASSWORD,
default=entry_data[CONF_PASSWORD] if keep_password else "",
): str,
vol.Required(CONF_PORT, default=entry_data[CONF_PORT]): int,
}
@@ -166,7 +192,7 @@ class AxisFlowHandler(ConfigFlow, domain=AXIS_DOMAIN):
CONF_HOST: discovery_info.ip,
CONF_MAC: format_mac(discovery_info.macaddress),
CONF_NAME: discovery_info.hostname,
CONF_PORT: DEFAULT_PORT,
CONF_PORT: 80,
}
)
@@ -210,10 +236,7 @@ class AxisFlowHandler(ConfigFlow, domain=AXIS_DOMAIN):
await self.async_set_unique_id(discovery_info[CONF_MAC])
self._abort_if_unique_id_configured(
updates={
CONF_HOST: discovery_info[CONF_HOST],
CONF_PORT: discovery_info[CONF_PORT],
}
updates={CONF_HOST: discovery_info[CONF_HOST]}
)
self.context.update(
@@ -227,10 +250,11 @@ class AxisFlowHandler(ConfigFlow, domain=AXIS_DOMAIN):
)
self.discovery_schema = {
vol.Required(CONF_PROTOCOL): vol.In(PROTOCOL_CHOICES),
vol.Required(CONF_HOST, default=discovery_info[CONF_HOST]): str,
vol.Required(CONF_USERNAME): str,
vol.Required(CONF_PASSWORD): str,
vol.Required(CONF_PORT, default=discovery_info[CONF_PORT]): int,
vol.Required(CONF_PORT, default=DEFAULT_PORT): int,
}
return await self.async_step_user()

View File

@@ -1,16 +1,23 @@
"""Base classes for Axis entities."""
from __future__ import annotations
from abc import abstractmethod
from collections.abc import Callable
from dataclasses import dataclass
from typing import TYPE_CHECKING
from axis.models.event import Event, EventTopic
from homeassistant.core import callback
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity import Entity
from homeassistant.helpers.entity import Entity, EntityDescription
from .const import DOMAIN as AXIS_DOMAIN
from .hub import AxisHub
if TYPE_CHECKING:
from .hub import AxisHub
TOPIC_TO_EVENT_TYPE = {
EventTopic.DAY_NIGHT_VISION: "DayNight",
@@ -32,6 +39,18 @@ TOPIC_TO_EVENT_TYPE = {
}
@dataclass(frozen=True, kw_only=True)
class AxisEventDescription(EntityDescription):
"""Axis event based entity description."""
event_topic: tuple[EventTopic, ...] | EventTopic
"""Event topic that provides state updates."""
name_fn: Callable[[AxisHub, Event], str] = lambda hub, event: ""
"""Function providing the corresponding name to the event ID."""
supported_fn: Callable[[AxisHub, Event], bool] = lambda hub, event: True
"""Function validating if event is supported."""
class AxisEntity(Entity):
"""Base common to all Axis entities."""
@@ -66,21 +85,26 @@ class AxisEntity(Entity):
class AxisEventEntity(AxisEntity):
"""Base common to all Axis entities from event stream."""
entity_description: AxisEventDescription
_attr_should_poll = False
def __init__(self, event: Event, hub: AxisHub) -> None:
def __init__(
self, hub: AxisHub, description: AxisEventDescription, event: Event
) -> None:
"""Initialize the Axis event."""
super().__init__(hub)
self.entity_description = description
self._event_id = event.id
self._event_topic = event.topic_base
self._event_type = TOPIC_TO_EVENT_TYPE[event.topic_base]
self._attr_name = f"{self._event_type} {event.id}"
event_type = TOPIC_TO_EVENT_TYPE[event.topic_base]
self._attr_name = description.name_fn(hub, event) or f"{event_type} {event.id}"
self._attr_unique_id = f"{hub.unique_id}-{event.topic}-{event.id}"
self._attr_device_class = event.group.value
@callback
@abstractmethod
def async_event_callback(self, event: Event) -> None:

View File

@@ -5,9 +5,15 @@ from types import MappingProxyType
from typing import Any
import axis
from axis.configuration import Configuration
from axis.models.configuration import Configuration
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT, CONF_USERNAME
from homeassistant.const import (
CONF_HOST,
CONF_PASSWORD,
CONF_PORT,
CONF_PROTOCOL,
CONF_USERNAME,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.httpx_client import get_async_client
@@ -22,21 +28,20 @@ async def get_axis_api(
"""Create a Axis device API."""
session = get_async_client(hass, verify_ssl=False)
device = axis.AxisDevice(
api = axis.AxisDevice(
Configuration(
session,
config[CONF_HOST],
port=config[CONF_PORT],
username=config[CONF_USERNAME],
password=config[CONF_PASSWORD],
web_proto=config.get(CONF_PROTOCOL, "http"),
)
)
try:
async with timeout(30):
await device.vapix.initialize()
return device
await api.vapix.initialize()
except axis.Unauthorized as err:
LOGGER.warning(
@@ -51,3 +56,5 @@ async def get_axis_api(
except axis.AxisException as err:
LOGGER.exception("Unknown Axis communication error occurred")
raise AuthenticationRequired from err
return api

View File

@@ -0,0 +1,83 @@
"""Axis network device entity loader.
Central point to load entities for the different platforms.
"""
from __future__ import annotations
from typing import TYPE_CHECKING
from axis.models.event import Event, EventOperation, EventTopic
from homeassistant.core import callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from ..entity import AxisEventDescription, AxisEventEntity
if TYPE_CHECKING:
from .hub import AxisHub
class AxisEntityLoader:
"""Axis network device integration handling platforms for entity registration."""
def __init__(self, hub: AxisHub) -> None:
"""Initialize the Axis entity loader."""
self.hub = hub
self.registered_events: set[tuple[str, EventTopic, str]] = set()
self.topic_to_entity: dict[
EventTopic,
list[
tuple[
AddEntitiesCallback,
type[AxisEventEntity],
AxisEventDescription,
]
],
] = {}
@callback
def register_platform(
self,
async_add_entities: AddEntitiesCallback,
entity_class: type[AxisEventEntity],
descriptions: tuple[AxisEventDescription, ...],
) -> None:
"""Register Axis entity platforms."""
topics: tuple[EventTopic, ...]
for description in descriptions:
if isinstance(description.event_topic, EventTopic):
topics = (description.event_topic,)
else:
topics = description.event_topic
for topic in topics:
self.topic_to_entity.setdefault(topic, []).append(
(async_add_entities, entity_class, description)
)
@callback
def _create_entities_from_event(self, event: Event) -> None:
"""Create Axis entities from event."""
event_id = (event.topic, event.topic_base, event.id)
if event_id in self.registered_events:
# Device has restarted and all events are initialized anew
return
self.registered_events.add(event_id)
for (
async_add_entities,
entity_class,
description,
) in self.topic_to_entity[event.topic_base]:
if not description.supported_fn(self.hub, event):
continue
async_add_entities([entity_class(self.hub, description, event)])
@callback
def initialize_platforms(self) -> None:
"""Prepare event listener that can populate platform entities."""
self.hub.api.event.subscribe(
self._create_entities_from_event,
topic_filter=tuple(self.topic_to_entity.keys()),
operation_filter=EventOperation.INITIALIZED,
)

View File

@@ -6,9 +6,9 @@ from typing import Any
import axis
from axis.errors import Unauthorized
from axis.interfaces.mqtt import mqtt_json_to_event
from axis.models.mqtt import ClientState
from axis.stream_manager import Signal, State
from axis.vapix.interfaces.mqtt import mqtt_json_to_event
from axis.vapix.models.mqtt import ClientState
from homeassistant.components import mqtt
from homeassistant.components.mqtt import DOMAIN as MQTT_DOMAIN
@@ -22,6 +22,7 @@ from homeassistant.setup import async_when_setup
from ..const import ATTR_MANUFACTURER, DOMAIN as AXIS_DOMAIN
from .config import AxisConfig
from .entity_loader import AxisEntityLoader
class AxisHub:
@@ -33,6 +34,7 @@ class AxisHub:
"""Initialize the device."""
self.hass = hass
self.config = AxisConfig.from_config_entry(config_entry)
self.entity_loader = AxisEntityLoader(self)
self.api = api
self.available = True
@@ -114,7 +116,7 @@ class AxisHub:
if status.status.state == ClientState.ACTIVE:
self.config.entry.async_on_unload(
await mqtt.async_subscribe(
hass, f"{self.api.vapix.serial_number}/#", self.mqtt_message
hass, f"{status.config.device_topic_prefix}/#", self.mqtt_message
)
)
@@ -122,7 +124,8 @@ class AxisHub:
def mqtt_message(self, message: ReceiveMessage) -> None:
"""Receive Axis MQTT message."""
self.disconnect_from_stream()
if message.topic.endswith("event/connection"):
return
event = mqtt_json_to_event(message.payload)
self.api.event.handler(event)
@@ -131,6 +134,8 @@ class AxisHub:
@callback
def setup(self) -> None:
"""Set up the device events."""
self.entity_loader.initialize_platforms()
self.api.stream.connection_status_callback.append(
self.connection_status_callback
)

View File

@@ -1,75 +1,88 @@
"""Support for Axis lights."""
from dataclasses import dataclass
from typing import Any
from axis.models.event import Event, EventOperation, EventTopic
from axis.models.event import Event, EventTopic
from homeassistant.components.light import ATTR_BRIGHTNESS, ColorMode, LightEntity
from homeassistant.components.light import (
ATTR_BRIGHTNESS,
ColorMode,
LightEntity,
LightEntityDescription,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .entity import AxisEventEntity
from .entity import TOPIC_TO_EVENT_TYPE, AxisEventDescription, AxisEventEntity
from .hub import AxisHub
@callback
def light_name_fn(hub: AxisHub, event: Event) -> str:
"""Provide Axis light entity name."""
event_type = TOPIC_TO_EVENT_TYPE[event.topic_base]
light_id = f"led{event.id}"
light_type = hub.api.vapix.light_control[light_id].light_type
return f"{light_type} {event_type} {event.id}"
@dataclass(frozen=True, kw_only=True)
class AxisLightDescription(AxisEventDescription, LightEntityDescription):
"""Axis light entity description."""
ENTITY_DESCRIPTIONS = (
AxisLightDescription(
key="Light state control",
event_topic=EventTopic.LIGHT_STATUS,
name_fn=light_name_fn,
supported_fn=lambda hub, event: len(hub.api.vapix.light_control) > 0,
),
)
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up a Axis light."""
hub = AxisHub.get_hub(hass, config_entry)
if hub.api.vapix.light_control is None or len(hub.api.vapix.light_control) == 0:
return
@callback
def async_create_entity(event: Event) -> None:
"""Create Axis light entity."""
async_add_entities([AxisLight(event, hub)])
hub.api.event.subscribe(
async_create_entity,
topic_filter=EventTopic.LIGHT_STATUS,
operation_filter=EventOperation.INITIALIZED,
"""Set up the Axis light platform."""
AxisHub.get_hub(hass, config_entry).entity_loader.register_platform(
async_add_entities, AxisLight, ENTITY_DESCRIPTIONS
)
class AxisLight(AxisEventEntity, LightEntity):
"""Representation of a light Axis event."""
"""Representation of an Axis light."""
entity_description: AxisLightDescription
_attr_should_poll = True
_attr_color_mode = ColorMode.BRIGHTNESS
_attr_supported_color_modes = {ColorMode.BRIGHTNESS}
def __init__(self, event: Event, hub: AxisHub) -> None:
def __init__(
self, hub: AxisHub, description: AxisLightDescription, event: Event
) -> None:
"""Initialize the Axis light."""
super().__init__(event, hub)
super().__init__(hub, description, event)
self._attr_is_on = event.is_tripped
self._light_id = f"led{event.id}"
self.current_intensity = 0
self.max_intensity = 0
light_type = hub.api.vapix.light_control[self._light_id].light_type
self._attr_name = f"{light_type} {self._event_type} {event.id}"
self._attr_is_on = event.is_tripped
self._attr_supported_color_modes = {ColorMode.BRIGHTNESS}
self._attr_color_mode = ColorMode.BRIGHTNESS
async def async_added_to_hass(self) -> None:
"""Subscribe lights events."""
await super().async_added_to_hass()
current_intensity = (
self.current_intensity = (
await self.hub.api.vapix.light_control.get_current_intensity(self._light_id)
)
self.current_intensity = current_intensity
max_intensity = await self.hub.api.vapix.light_control.get_valid_intensity(
self._light_id
)
self.max_intensity = max_intensity.high
self.max_intensity = (
await self.hub.api.vapix.light_control.get_valid_intensity(self._light_id)
).high
@callback
def async_event_callback(self, event: Event) -> None:
@@ -100,7 +113,6 @@ class AxisLight(AxisEventEntity, LightEntity):
async def async_update(self) -> None:
"""Update brightness."""
current_intensity = (
self.current_intensity = (
await self.hub.api.vapix.light_control.get_current_intensity(self._light_id)
)
self.current_intensity = current_intensity

View File

@@ -26,7 +26,7 @@
"iot_class": "local_push",
"loggers": ["axis"],
"quality_scale": "platinum",
"requirements": ["axis==54"],
"requirements": ["axis==60"],
"ssdp": [
{
"manufacturer": "AXIS"

View File

@@ -1,46 +1,63 @@
"""Support for Axis switches."""
from dataclasses import dataclass
from typing import Any
from axis.models.event import Event, EventOperation, EventTopic
from axis.models.event import Event, EventTopic
from homeassistant.components.switch import SwitchEntity
from homeassistant.components.switch import (
SwitchDeviceClass,
SwitchEntity,
SwitchEntityDescription,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .entity import AxisEventEntity
from .entity import AxisEventDescription, AxisEventEntity
from .hub import AxisHub
@dataclass(frozen=True, kw_only=True)
class AxisSwitchDescription(AxisEventDescription, SwitchEntityDescription):
"""Axis switch entity description."""
ENTITY_DESCRIPTIONS = (
AxisSwitchDescription(
key="Relay state control",
device_class=SwitchDeviceClass.OUTLET,
entity_category=EntityCategory.CONFIG,
event_topic=EventTopic.RELAY,
supported_fn=lambda hub, event: isinstance(int(event.id), int),
name_fn=lambda hub, event: hub.api.vapix.ports[event.id].name,
),
)
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up a Axis switch."""
hub = AxisHub.get_hub(hass, config_entry)
@callback
def async_create_entity(event: Event) -> None:
"""Create Axis switch entity."""
async_add_entities([AxisSwitch(event, hub)])
hub.api.event.subscribe(
async_create_entity,
topic_filter=EventTopic.RELAY,
operation_filter=EventOperation.INITIALIZED,
"""Set up the Axis switch platform."""
AxisHub.get_hub(hass, config_entry).entity_loader.register_platform(
async_add_entities, AxisSwitch, ENTITY_DESCRIPTIONS
)
class AxisSwitch(AxisEventEntity, SwitchEntity):
"""Representation of a Axis switch."""
def __init__(self, event: Event, hub: AxisHub) -> None:
entity_description: AxisSwitchDescription
def __init__(
self, hub: AxisHub, description: AxisSwitchDescription, event: Event
) -> None:
"""Initialize the Axis switch."""
super().__init__(event, hub)
if event.id and hub.api.vapix.ports[event.id].name:
self._attr_name = hub.api.vapix.ports[event.id].name
super().__init__(hub, description, event)
self._attr_is_on = event.is_tripped
@callback

View File

@@ -0,0 +1,5 @@
{
"services": {
"create": "mdi:cloud-upload"
}
}

View File

@@ -2,21 +2,21 @@
"entity": {
"binary_sensor": {
"filter_1": {
"default": "mdi:sync-off",
"default": "mdi:sync",
"state": {
"on": "mdi:sync"
"off": "mdi:sync-off"
}
},
"filter_2": {
"default": "mdi:sync-off",
"default": "mdi:sync",
"state": {
"on": "mdi:sync"
"off": "mdi:sync-off"
}
},
"circ_pump": {
"default": "mdi:pump-off",
"default": "mdi:pump",
"state": {
"on": "mdi:pump"
"off": "mdi:pump-off"
}
}
},

View File

@@ -0,0 +1,5 @@
{
"services": {
"reload": "mdi:reload"
}
}

View File

@@ -1,13 +0,0 @@
"""Describe group states."""
from homeassistant.components.group import GroupIntegrationRegistry
from homeassistant.const import STATE_OFF, STATE_ON
from homeassistant.core import HomeAssistant, callback
@callback
def async_describe_on_off_states(
hass: HomeAssistant, registry: GroupIntegrationRegistry
) -> None:
"""Describe group on off states."""
registry.on_off_states({STATE_ON}, STATE_OFF)

View File

@@ -0,0 +1,5 @@
{
"services": {
"set_all_zones": "mdi:home-sound-in"
}
}

View File

@@ -4,7 +4,6 @@ from __future__ import annotations
import asyncio
from contextlib import suppress
from datetime import datetime
from typing import Any
from bluecurrent_api import Client
@@ -16,24 +15,17 @@ from bluecurrent_api.exceptions import (
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
ATTR_NAME,
CONF_API_TOKEN,
EVENT_HOMEASSISTANT_STOP,
Platform,
)
from homeassistant.core import Event, HomeAssistant
from homeassistant.const import ATTR_NAME, CONF_API_TOKEN, Platform
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady
from homeassistant.helpers.dispatcher import async_dispatcher_send
from homeassistant.helpers.event import async_call_later
from .const import DOMAIN, EVSE_ID, LOGGER, MODEL_TYPE
PLATFORMS = [Platform.SENSOR]
CHARGE_POINTS = "CHARGE_POINTS"
DATA = "data"
SMALL_DELAY = 1
LARGE_DELAY = 20
DELAY = 5
GRID = "GRID"
OBJECT = "object"
@@ -48,26 +40,19 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> b
connector = Connector(hass, config_entry, client)
try:
await connector.connect(api_token)
await client.validate_api_token(api_token)
except InvalidApiToken as err:
raise ConfigEntryAuthFailed("Invalid API token.") from err
except BlueCurrentException as err:
raise ConfigEntryNotReady from err
config_entry.async_create_background_task(
hass, connector.run_task(), "blue_current-websocket"
)
hass.async_create_background_task(connector.start_loop(), "blue_current-websocket")
await client.get_charge_points()
await client.wait_for_response()
await client.wait_for_charge_points()
hass.data[DOMAIN][config_entry.entry_id] = connector
await hass.config_entries.async_forward_entry_setups(config_entry, PLATFORMS)
config_entry.async_on_unload(connector.disconnect)
async def _async_disconnect_websocket(_: Event) -> None:
await connector.disconnect()
hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, _async_disconnect_websocket)
return True
@@ -95,12 +80,6 @@ class Connector:
self.client = client
self.charge_points: dict[str, dict] = {}
self.grid: dict[str, Any] = {}
self.available = False
async def connect(self, token: str) -> None:
"""Register on_data and connect to the websocket."""
await self.client.connect(token)
self.available = True
async def on_data(self, message: dict) -> None:
"""Handle received data."""
@@ -132,9 +111,9 @@ class Connector:
entry[EVSE_ID], entry[MODEL_TYPE], entry[ATTR_NAME]
)
for entry in charge_points_data
)
),
self.client.get_grid_status(charge_points_data[0][EVSE_ID]),
)
await self.client.get_grid_status(charge_points_data[0][EVSE_ID])
async def handle_charge_point(self, evse_id: str, model: str, name: str) -> None:
"""Add the chargepoint and request their data."""
@@ -148,44 +127,53 @@ class Connector:
def update_charge_point(self, evse_id: str, data: dict) -> None:
"""Update the charge point data."""
self.charge_points[evse_id].update(data)
self.dispatch_value_update_signal(evse_id)
self.dispatch_charge_point_update_signal(evse_id)
def dispatch_value_update_signal(self, evse_id: str) -> None:
"""Dispatch a value signal."""
async_dispatcher_send(self.hass, f"{DOMAIN}_value_update_{evse_id}")
def dispatch_charge_point_update_signal(self, evse_id: str) -> None:
"""Dispatch a charge point update signal."""
async_dispatcher_send(self.hass, f"{DOMAIN}_charge_point_update_{evse_id}")
def dispatch_grid_update_signal(self) -> None:
"""Dispatch a grid signal."""
"""Dispatch a grid update signal."""
async_dispatcher_send(self.hass, f"{DOMAIN}_grid_update")
async def start_loop(self) -> None:
async def on_open(self) -> None:
"""Fetch data when connection is established."""
await self.client.get_charge_points()
async def run_task(self) -> None:
"""Start the receive loop."""
try:
await self.client.start_loop(self.on_data)
except BlueCurrentException as err:
LOGGER.warning(
"Disconnected from the Blue Current websocket. Retrying to connect in background. %s",
err,
)
while True:
try:
await self.client.connect(self.on_data, self.on_open)
except RequestLimitReached:
LOGGER.warning(
"Request limit reached. reconnecting at 00:00 (Europe/Amsterdam)"
)
delay = self.client.get_next_reset_delta().seconds
except WebsocketError:
LOGGER.debug("Disconnected, retrying in background")
delay = DELAY
async_call_later(self.hass, SMALL_DELAY, self.reconnect)
self._on_disconnect()
await asyncio.sleep(delay)
finally:
await self._disconnect()
async def reconnect(self, _event_time: datetime | None = None) -> None:
"""Keep trying to reconnect to the websocket."""
try:
await self.connect(self.config.data[CONF_API_TOKEN])
LOGGER.debug("Reconnected to the Blue Current websocket")
self.hass.async_create_task(self.start_loop())
except RequestLimitReached:
self.available = False
async_call_later(
self.hass, self.client.get_next_reset_delta(), self.reconnect
)
except WebsocketError:
self.available = False
async_call_later(self.hass, LARGE_DELAY, self.reconnect)
def _on_disconnect(self) -> None:
"""Dispatch signals to update entity states."""
for evse_id in self.charge_points:
self.dispatch_charge_point_update_signal(evse_id)
self.dispatch_grid_update_signal()
async def disconnect(self) -> None:
async def _disconnect(self) -> None:
"""Disconnect from the websocket."""
with suppress(WebsocketError):
await self.client.disconnect()
self._on_disconnect()
@property
def connected(self) -> bool:
"""Returns the connection status."""
return self.client.is_connected()

View File

@@ -40,7 +40,7 @@ class BlueCurrentEntity(Entity):
@property
def available(self) -> bool:
"""Return entity availability."""
return self.connector.available and self.has_value
return self.connector.connected and self.has_value
@callback
@abstractmethod
@@ -53,7 +53,7 @@ class ChargepointEntity(BlueCurrentEntity):
def __init__(self, connector: Connector, evse_id: str) -> None:
"""Initialize the entity."""
super().__init__(connector, f"{DOMAIN}_value_update_{evse_id}")
super().__init__(connector, f"{DOMAIN}_charge_point_update_{evse_id}")
chargepoint_name = connector.charge_points[evse_id][ATTR_NAME]

View File

@@ -5,5 +5,6 @@
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/blue_current",
"iot_class": "cloud_push",
"requirements": ["bluecurrent-api==1.0.6"]
"loggers": ["bluecurrent_api"],
"requirements": ["bluecurrent-api==1.2.3"]
}

View File

@@ -26,14 +26,14 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
address = entry.unique_id
assert address is not None
data = BlueMaestroBluetoothDeviceData()
coordinator = hass.data.setdefault(DOMAIN, {})[
entry.entry_id
] = PassiveBluetoothProcessorCoordinator(
hass,
_LOGGER,
address=address,
mode=BluetoothScanningMode.PASSIVE,
update_method=data.update,
coordinator = hass.data.setdefault(DOMAIN, {})[entry.entry_id] = (
PassiveBluetoothProcessorCoordinator(
hass,
_LOGGER,
address=address,
mode=BluetoothScanningMode.PASSIVE,
update_method=data.update,
)
)
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
entry.async_on_unload(

View File

@@ -366,7 +366,7 @@ class BluesoundPlayer(MediaPlayerEntity):
data = None
elif response.status == 595:
_LOGGER.info("Status 595 returned, treating as timeout")
raise BluesoundPlayer._TimeoutException()
raise BluesoundPlayer._TimeoutException
else:
_LOGGER.error("Error %s on %s", response.status, url)
return None
@@ -432,7 +432,7 @@ class BluesoundPlayer(MediaPlayerEntity):
self.async_write_ha_state()
elif response.status == 595:
_LOGGER.info("Status 595 returned, treating as timeout")
raise BluesoundPlayer._TimeoutException()
raise BluesoundPlayer._TimeoutException
else:
_LOGGER.error(
"Error %s on %s. Trying one more time", response.status, url

View File

@@ -166,7 +166,9 @@ async def _async_start_adapter_discovery(
"""Shutdown debouncer."""
discovery_debouncer.async_shutdown()
hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, _async_shutdown_debouncer)
hass.bus.async_listen_once(
EVENT_HOMEASSISTANT_STOP, _async_shutdown_debouncer, run_immediately=True
)
async def _async_call_debouncer(now: datetime.datetime) -> None:
"""Call the debouncer at a later time."""
@@ -197,7 +199,9 @@ async def _async_start_adapter_discovery(
cancel = usb.async_register_scan_request_callback(hass, _async_trigger_discovery)
hass.bus.async_listen_once(
EVENT_HOMEASSISTANT_STOP, hass_callback(lambda event: cancel())
EVENT_HOMEASSISTANT_STOP,
hass_callback(lambda event: cancel()),
run_immediately=True,
)

View File

@@ -135,9 +135,11 @@ class HomeAssistantBluetoothManager(BluetoothManager):
self._bluetooth_adapters, self.storage
)
self._cancel_logging_listener = self.hass.bus.async_listen(
EVENT_LOGGING_CHANGED, self._async_logging_changed
EVENT_LOGGING_CHANGED, self._async_logging_changed, run_immediately=True
)
self.hass.bus.async_listen_once(
EVENT_HOMEASSISTANT_STOP, self.async_stop, run_immediately=True
)
self.hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, self.async_stop)
seen: set[str] = set()
for address, service_info in itertools.chain(
self._connectable_history.items(), self._all_history.items()

View File

@@ -17,7 +17,7 @@
"bleak==0.21.1",
"bleak-retry-connector==3.4.0",
"bluetooth-adapters==0.18.0",
"bluetooth-auto-recovery==1.3.0",
"bluetooth-auto-recovery==1.4.0",
"bluetooth-data-tools==1.19.0",
"dbus-fast==2.21.1",
"habluetooth==2.4.2"

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