Compare commits

..

842 Commits

Author SHA1 Message Date
Franck Nijhof
8bdcdfb8e6 Merge pull request #48782 from home-assistant/rc 2021-04-07 19:07:10 +02:00
Franck Nijhof
341531146d Bumped version to 2021.4.0 2021-04-07 18:31:01 +02:00
Bram Kragten
49178d6865 Update frontend to 20210407.1 (#48778) 2021-04-07 18:17:15 +02:00
Erik Montnemery
b4636f17fb Reject nan, inf from generic_thermostat sensor (#48771) 2021-04-07 18:17:11 +02:00
Franck Nijhof
0fb4f31bde Bumped version to 2021.4.0b6 2021-04-07 12:43:04 +02:00
Bram Kragten
b382de96c6 Update frontend to 20210407.0 (#48765) 2021-04-07 12:40:14 +02:00
Erik Montnemery
c9f8861303 Fix whitespace error in cast (#48763) 2021-04-07 12:40:08 +02:00
Erik Montnemery
32511409a9 Remove login details before logging SQL errors (#48758) 2021-04-07 12:40:04 +02:00
Daniel Hjelseth Høyer
e366961ddb Met.no - only update data if coordinates changed (#48756) 2021-04-07 12:40:00 +02:00
J. Nick Koston
bfb8141f55 Solve cast delaying startup when discovered devices are slow to setup (#48755)
* Solve cast delaying startup when devices are slow to setup

* Update homeassistant/components/cast/media_player.py

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

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2021-04-07 12:39:57 +02:00
Joakim Sørensen
537d6412dd Add custom integrations to analytics (#48753) 2021-04-07 12:39:54 +02:00
Stefan Agner
a093cd8ac2 Use microsecond precision for datetime values on MariaDB/MySQL (#48749)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-04-07 12:39:51 +02:00
Franck Nijhof
322458ee49 Rename hassio config entry title to Supervisor (#48748) 2021-04-07 12:39:48 +02:00
Joakim Sørensen
b573fb49b7 Generate a seperate UUID for the analytics integration (#48742) 2021-04-07 12:39:45 +02:00
Franck Nijhof
15e00b8d18 Do not activate Met.no without setting a Home coordinates (#48741) 2021-04-07 12:39:41 +02:00
Paulus Schoutsen
2db60a3c56 Bumped version to 2021.4.0b5 2021-04-06 19:12:33 +00:00
Paulus Schoutsen
ed90e22421 Updated frontend to 20210406.0 (#48734) 2021-04-06 19:12:28 +00:00
Paulus Schoutsen
d61780dbac Allow reloading top-level template entities (#48733) 2021-04-06 19:12:27 +00:00
Justin Paupore
315e910bfe Fix infinite recursion in LazyState (#48719)
If LazyState cannot parse the attributes of its row as JSON, it prints
a message to the logger. Unfortunately, it passes `self` as a format
argument to that message, which causes its `__repr__` method to be
called, which then tries to retrieve `self.attributes` in order to
display them. This leads to an infinite recursion and a crash of the
entire core.

To fix, send the database row to be printed in the log message, rather
than the LazyState object that wraps around it.
2021-04-06 19:12:26 +00:00
Erik Montnemery
a7523777ba Flag brightness support for MQTT RGB lights (#48718) 2021-04-06 19:12:25 +00:00
Erik Montnemery
7ae65832eb Bump pychromecast to 9.1.2 (#48714) 2021-04-06 19:12:24 +00:00
Erik Montnemery
0df9a8ec38 Improve warnings on undefined template errors (#48713) 2021-04-06 19:12:23 +00:00
J. Nick Koston
5f2a666e76 Abort discovery for unsupported doorbird accessories (#48710) 2021-04-06 19:12:23 +00:00
Paulus Schoutsen
26b9017905 Fix verisure deadlock (#48691) 2021-04-06 19:12:22 +00:00
Raman Gupta
bdd68cd413 Bump zwave_js dependency to 0.23.1 (#48682) 2021-04-06 19:12:21 +00:00
Alexei Chetroi
c512ab7ec9 Implement Ignore list for poll control configuration on Ikea devices (#48667)
Co-authored-by: Hmmbob <33529490+hmmbob@users.noreply.github.com>
2021-04-06 19:12:21 +00:00
mburget
edf41e8425 Fix Raspi GPIO binary_sensor produces unreliable responses (#48170)
* Fix for issue #10498 Raspi GPIO binary_sensor produces unreliable responses ("Doorbell Scenario")

Changes overtaken from PR#31788 which was somehow never finished

* Fix for issue #10498 Raspi GPIO binary_sensor produces unreliable response. Changes taken over from PR31788 which was somehow never finished

* Remove unused code (pylint warning)
2021-04-06 19:12:20 +00:00
Paulus Schoutsen
1850b92b36 Bumped version to 2021.4.0b4 2021-04-04 00:36:15 +00:00
J. Nick Koston
7b1ea46653 Prevent config entry retry from blocking startup (#48660)
- If there are two integrations doing long retries async_block_till_done() will never be done
2021-04-04 00:36:07 +00:00
Álvaro Fernández Rojas
a8cd6228cf Fix AEMET town timestamp format (#48647)
Datetime should be converted to ISO format.

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2021-04-04 00:36:07 +00:00
J. Nick Koston
9eb4397837 Only listen for zeroconf when the esphome device cannot connect (#48645) 2021-04-04 00:36:06 +00:00
J. Nick Koston
311f624adc Bump aiodiscover to 1.3.3 for dhcp (#48644)
fixes #48615
2021-04-04 00:36:05 +00:00
Paulus Schoutsen
dcb43b474f Bumped version to 2021.4.0b3 2021-04-03 00:05:20 +00:00
Bram Kragten
396a8a3a10 Updated frontend to 20210402.1 (#48639) 2021-04-02 23:57:55 +00:00
Paulus Schoutsen
2a1f6d7e8f Support modern config for the trigger based template entity (#48635) 2021-04-02 23:57:55 +00:00
Paulus Schoutsen
da31328150 Fix trigger template entities without a unique ID (#48631) 2021-04-02 23:57:54 +00:00
Shay Levy
cec80210a3 Bump aioshelly to 0.6.2 (#48620) 2021-04-02 23:57:53 +00:00
Paulus Schoutsen
74357d9760 Bumped version to 2021.4.0b2 2021-04-01 23:33:37 +00:00
Erik Montnemery
231a55d416 Include blueprint input in automation trace (#48575) 2021-04-01 23:33:04 +00:00
Erik Montnemery
e760c23f37 Include script script_execution in script and automation traces (#48576) 2021-04-01 23:32:47 +00:00
Paulus Schoutsen
39f68de5fa Bumped version to 2021.4.0b1 2021-04-01 23:23:47 +00:00
Robert Svensson
68b189cf9f Increase time out for http requests done in Axis integration (#48610) 2021-04-01 23:23:31 +00:00
Bram Kragten
8d0941ba65 Update frontend to 20210402.0 (#48609) 2021-04-01 23:23:29 +00:00
Paulus Schoutsen
d1a48c7c5c Clean up mobile app (#48607)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-04-01 23:23:28 +00:00
Franck Nijhof
f0f8b79be0 Fix websocket search for related (#48603)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-04-01 23:23:26 +00:00
Franck Nijhof
c2d17a72b7 Allow templatable service target to support scripts (#48600) 2021-04-01 23:23:25 +00:00
Franck Nijhof
f0bd3c577f Upgrade numpy to 1.20.2 (#48597) 2021-04-01 23:23:24 +00:00
Erik Montnemery
947ac514b9 Return config entry details for 1-step config flows (#48585) 2021-04-01 23:23:22 +00:00
epenet
5df90b32fc Cleanup orphan devices in onewire integration (#48581)
* Cleanup orphan devices (https://github.com/home-assistant/core/issues/47438)

* Refactor unit testing

* Filter device entries for this config entry

* Update logging

* Cleanup check
2021-04-01 23:23:20 +00:00
Robert Svensson
f08e7dccdf Don't care about DPI entries when looking for clients to be restored from UniFi (#48579)
* DPI switches shouldnt be restored, they're not part of clients to be restored

* Only care about Block and POE switch entries
2021-04-01 23:23:20 +00:00
Aaron Bach
3982849275 Fix incorrect constant import in Ambient PWS (#48574) 2021-04-01 23:23:17 +00:00
Joakim Sørensen
07827ca55d Remove analytics from default_config (#48566) 2021-04-01 23:23:16 +00:00
youknowjack0
16da181692 Fix timer.finish to cancel callback (#48549)
Timer.finish doesn't cancel the callback, which can lead to incorrect early cancellation of the timer if it is subsequently restarted. 

Bug reported here: https://community.home-assistant.io/t/timer-component-timer-stops-before-time-is-up/96038
2021-04-01 23:23:15 +00:00
Franck Nijhof
75908f38f3 Bumped version to 2021.4.0b0 2021-03-31 21:32:05 +02:00
Robert Svensson
bc5d828554 Provide the improved service UX with deCONZ services (#48382)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2021-03-31 20:14:26 +02:00
Erik Montnemery
c06ac9e12b Improve automation trace tests (#48542) 2021-03-31 10:51:29 -07:00
J. Nick Koston
6cf57da89f Use SOURCE_REAUTH constant for starting reauth flows (#48553) 2021-03-31 19:48:32 +02:00
arturdobo
68801ae5f7 Add Qingping Air Monitor Lite support support (#48181)
* Add cgllc.airm.cgdn1 support

* review remarks

* removed unnecessary lambdas
2021-03-31 19:47:42 +02:00
Ruslan Sayfutdinov
a6759d731d Use Mapping[str, Any] instead of dict in Entity (#48421) 2021-03-31 19:34:00 +02:00
Simone Chemelli
bb7f64596c Add operation sensor to Shelly Gas (#48462) 2021-03-31 09:46:39 -07:00
jjlawren
be71d626c8 Improve Plex device handling (#48369) 2021-03-31 09:37:16 -07:00
Bram Kragten
2f37a5727c Update frontend to 20210331.0 (#48552) 2021-03-31 09:23:12 -07:00
J. Nick Koston
9790f3f609 Create homekit locks according to spec (#48453)
Any accessories, regardless of transport, that enable physical access to the home, such as door locks, must not be bridged.
2021-03-31 09:22:30 -07:00
Franck Nijhof
3acacf435a Merge branch 'master' into dev 2021-03-31 17:54:27 +02:00
LJU
93920704d0 Remove Hass.io terms in strings.json (#48541)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2021-03-31 17:19:18 +02:00
Michael
949cd4714a Fix update of surveillance_station data in Synology DSM (#47966) 2021-03-31 17:18:58 +02:00
Mario Limonciello
9fd6980144 Avoid divide by zero errors in tplink light integration (#48235) 2021-03-31 17:16:24 +02:00
Marvin Wichmann
9e1a17c62e Update xknx to version 0.17.5 (#48522)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2021-03-31 17:04:22 +02:00
jjlawren
7dfe63e06f Set Plex sensor availability properly (#48546) 2021-03-31 17:02:23 +02:00
Erik Montnemery
e2f8bce0a0 Improve error handling for WS API trace/get (#48502) 2021-03-31 15:58:36 +02:00
Philip Allgaier
6fe04f40a2 Ensure HA script and Python script services have a name (#47204)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-03-31 15:09:45 +02:00
J. Nick Koston
bee55a0494 Prevent ping integration from delaying startup (#43869) 2021-03-31 15:06:49 +02:00
Erik Montnemery
b26779a27a Add id to automation triggers (#48464) 2021-03-31 14:56:04 +02:00
Philip Allgaier
450f3740cd Use consolidated constant for "description" (#48490) 2021-03-31 14:12:15 +02:00
jjlawren
d62297a28b Add Plex library count sensors (#48339) 2021-03-31 13:57:16 +02:00
Vincent Le Bourlot
93498ec831 Add missing neato error status (#48508) 2021-03-31 13:48:04 +02:00
Joakim Sørensen
4d8ef115a3 Bump pyhaversion from 3.4.2 to 21.3.0 (#48537) 2021-03-31 12:46:14 +02:00
Nicolas Braem
96857b7466 Add vicare fuelcell (#47167) 2021-03-31 11:29:24 +02:00
Erik Montnemery
c7584a1f92 Add color_mode support to MQTT JSON light (#47993) 2021-03-31 11:28:45 +02:00
jan iversen
64d5dd1f6b Remove if/else from modbus test cases (#48514) 2021-03-31 11:20:14 +02:00
Franck Nijhof
d4d8f74858 Deprecate SolarEdge YAML configuration (#48533) 2021-03-31 10:31:12 +02:00
Robert Svensson
c80f34a754 Add support for ZHADoorLock locks to deCONZ integration(#48516) 2021-03-31 09:36:06 +02:00
Anders Melchiorsen
96c391af09 Fix Sonos Line-in favorites (#48524) 2021-03-31 07:22:54 +02:00
uvjustin
379843eb54 Shield async httpx call in generic (#47852)
* Shield async httpx call

* Don't set last_url/last_image on cancellation

* Add test
2021-03-31 12:46:10 +08:00
Steven Looman
7a6c88feeb Bump async_upnp_client to 0.16.0 (#48521) 2021-03-30 15:36:18 -10:00
Quentame
c1ff4197d1 Bump Freebox to 0.0.10 (#48526) 2021-03-30 15:21:11 -10:00
Quentame
7f9c5d7a13 Bump Météo-France to 1.0.2 (#48527) 2021-03-30 15:20:46 -10:00
Quentame
bae337554f Bump Synology DSM to 1.0.2 (#48528) 2021-03-31 02:13:56 +02:00
HomeAssistant Azure
919247f256 [ci skip] Translation update 2021-03-31 00:04:33 +00:00
Joakim Sørensen
52974e1f64 Add target version to log about missing version (#48520)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-03-31 01:08:59 +02:00
Bram Kragten
d1a1e70726 Search for areas used in automations and scripts (#48499)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-03-30 15:01:56 -07:00
Michael
309c3a8d82 Fix init for first added shelly device (#48411) 2021-03-30 23:52:02 +02:00
David F. Mulcahey
aa0292974a support feedback for ZHA device reconfiguration (#48447) 2021-03-30 16:35:51 -04:00
Joakim Sørensen
78cff36f96 Remove analytics from updater (#48518) 2021-03-30 22:22:03 +02:00
jugla
76d9c62900 Evaluate AirVisual interval on reboot (#48392)
* Reevaluate interval on reboot (and periodically)

* AirVisual update interval periodically

* AirVisual : update periodically interval request

* AirVisual : update sever request interval periodically

* AirVisual : periodically update interval for server requests

* AirVisual : periodic update for server interval

* Airvisual : periodic update of server interval

* AirVisual : periodic update of server interval

* AirVisual : periodic update of interval request

* Periodic interval update of server request

* AirVisual : periodic update of interval request

* Reassess interval request on periodic event

* ReAssess interval between 2 requests during update

* ReAssess interval between 2 requests periodically

* Reassess interval of server requests periodically

* Reassess the interval between 2 server requests

* Reassess interval between 2 server requests

* Reassess server requests interval periodically

* Assess interval request after inserting instance
2021-03-30 11:03:35 -06:00
Jacob Shufro
f5d9713bd5 Add regex-based filters to logger component (#48439)
* Add regex-based filters to logger component

* Switch logger filter tests to use caplog for more coverage, add a scoping test
2021-03-30 06:53:02 -10:00
Ruslan Sayfutdinov
82c94826fb Enable strict typing for zeroconf (#48450)
* Enable strict typing for zeroconf

* Fix lutron_caseta

* Fix pylint warning

* Fix tests

* Fix xiaomi_aqara test

* Add __init__.py in homeassistant.generated module

* Restore add_job with type: ignore
2021-03-30 06:48:04 -10:00
Matthias Alphart
338be8c70b KNX passive group addresses (#48009) 2021-03-30 18:14:38 +02:00
J. Nick Koston
e9f2062f1b Fix duplicates and unexpected failures during roomba discovery (#48492) 2021-03-30 17:54:36 +02:00
Franck Nijhof
cdd0624629 Correct FAA Delays integration domain in manifest (#48512) 2021-03-30 17:52:29 +02:00
Ruslan Sayfutdinov
575a460c65 Fix local mypy workflow (#48433)
* Fix local mypy workflow

* Run mypy directly
2021-03-30 17:18:29 +02:00
David F. Mulcahey
4dc885dcc3 Add discovery for Tube's Zigbee coordinators to ZHA (#48420)
* add discovery for tube zigbee gateways

* update discovery

* add test

* another test

* develop translations

* review comments
2021-03-30 11:13:26 -04:00
Philip Allgaier
9043a1f5aa Raise Spotify exception if no active device found (#48486) 2021-03-30 16:54:33 +02:00
Erik Montnemery
9d8521169b Add 'for' to lock device triggers (#48504)
* Add 'for' to lock device triggers

* Update tests/components/lock/test_device_trigger.py

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

* Update test_device_trigger.py

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-30 16:40:57 +02:00
Erik Montnemery
04a09d9215 Add 'for' to media_player device triggers (#48505)
* Add 'for' to media_player device triggers

* Update tests/components/media_player/test_device_trigger.py

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

* Update test_device_trigger.py

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-30 16:40:26 +02:00
Erik Montnemery
225d79c216 Add 'for' to vacuum device triggers (#48506)
* Add 'for' to vacuum device triggers

* Apply suggestions from code review

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

* Update test_device_trigger.py

* Update test_device_trigger.py

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-30 16:40:08 +02:00
J. Nick Koston
f91de1c8b9 Add support for capturing renewals to dhcp discovery (#48242) 2021-03-30 15:41:12 +02:00
Erik Montnemery
b3b0904b94 Simplify device trigger code (#48507) 2021-03-30 13:54:27 +02:00
Erik Montnemery
9526701e57 Add 'for' to alarm device triggers (#48503) 2021-03-30 13:49:23 +02:00
Marc Mueller
ee55657ae9 Update pylint to 2.7.4 (#48500) 2021-03-30 12:23:59 +02:00
Joakim Sørensen
f98ce2dd71 Add myself as codeowner to analytics (#48498) 2021-03-30 11:40:11 +02:00
Raman Gupta
bc3881db29 Add zwave_js.set_value service (#48487)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-30 11:13:48 +02:00
J. Nick Koston
f8265f44be Include platform only integrations in analytics (#48493) 2021-03-30 10:46:02 +02:00
David McClosky
e47d576ee7 Use MAX_VOLUME constant in vlc_telnet (#48491)
We also don't need to call `int()` anymore due to underlying fixes in
the python-vlc-telnet library.

I believe this is the last item extracted from PR #44776.
2021-03-30 09:57:53 +02:00
J. Nick Koston
0082eca932 Bump yalexs to 1.1.10 for august (#48494)
- Remove workaround for broken reconnect logic in pubnub
2021-03-30 09:37:19 +02:00
Martidjen
99ab084cdd Add opentherm_gw option for setpoint override mode (#48465)
* Adding option for setpoint override mode

Temporary setpoint override mode can now be set on or off. 'Constant' setpoint override mode will be used when Temporary is set to off

* Changes after review comment

Added default value for the setpoint override mode
2021-03-30 09:35:29 +02:00
Niccolo Zapponi
fc8dc038e2 Fixed auth issue for non-2FA iCloud accounts (#48455) 2021-03-29 19:09:27 -10:00
Guido Schmitz
2fbe352ad5 Make devolo home control more robust against connection losts (#48328) 2021-03-29 19:08:08 -10:00
Alan Tse
984fb12fa4 Create new websession if more than one entry in Tesla (#47886)
* Create new websession if more than one entry
closes #47506

* Remove extraneous count

* Always create new session

* Update docs
2021-03-30 06:50:41 +02:00
Marc Mueller
2956eb0902 Update pylint to 2.7.3 (#48488)
* Update pylint to 2.7.3

* Add class-const-naming-style

* Remove unused-import message

* Additional cleanup
2021-03-29 18:02:56 -10:00
Raman Gupta
9a75019a65 Add zwave_js.bulk_set_partial_config_parameters service (#48306)
* Add zwave_js.bulk_set_partial_config_parameters service

* update to handle command status

* add test for awake node

* test using a device in service call
2021-03-29 23:07:55 -04:00
Paulus Schoutsen
114a97bf52 Bump frontend to 20210329.0 2021-03-30 00:33:17 +00:00
Tobias Sauerwein
467bd91c80 Add image proxy to Kodi media browser (#47315) 2021-03-29 17:30:51 -07:00
Joakim Sørensen
09c51da3a2 Add analytics integration (#48256)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-29 17:20:11 -07:00
J. Nick Koston
6b7bcbbc96 Bump aiodiscoer to 1.3.2 for dhcp (#48489)
- Removes unused code in the library
- Cleanup a small slow memory leak
2021-03-29 17:18:54 -07:00
HomeAssistant Azure
a1472b174c [ci skip] Translation update 2021-03-30 00:03:46 +00:00
Kevin Worrel
42a060ad33 Add asyncio locks to screenlogic api access points (#48457) 2021-03-29 13:27:17 -10:00
Franck Nijhof
c1d5638739 Remove HomeAssistantType alias from entity components - Part 2 (#48468) 2021-03-29 13:24:56 -10:00
Franck Nijhof
855b68faa1 Remove HomeAssistantType alias from entity components - Part 1 (#48467) 2021-03-29 13:24:36 -10:00
Franck Nijhof
bb9da22a84 Clean up superfluous integration setup - part 3 (#48484) 2021-03-29 13:23:44 -10:00
Franck Nijhof
6ec3234ccc Clean up superfluous integration setup - part 2 (#48478) 2021-03-29 13:23:07 -10:00
Franck Nijhof
8393a215e9 Clean up superfluous integration setup - part 1 (#48476) 2021-03-29 13:22:33 -10:00
J. Nick Koston
a851bff95a Create async_config_entry_first_refresh to reduce coordinator boilerplate (#48451) 2021-03-29 12:51:39 -10:00
J. Nick Koston
569c536a8e Bump aiodiscover to 1.3.0 to improve performance (#48482) 2021-03-30 00:37:38 +02:00
Erik Montnemery
fe4ca18881 Refactor fan device triggers to use ToggleEntity triggers (#48321) 2021-03-30 00:09:41 +02:00
Erik Montnemery
8ad3c65645 Allow MQTT entities to be disabled by default (#48284)
* Allow MQTT entities to be disabled by default

* Tweak
2021-03-30 00:09:14 +02:00
Franck Nijhof
0805467c47 Clean up icons & device classes for Toon (#48471) 2021-03-29 14:17:25 -07:00
Erik Montnemery
7534b54e4e Merge condition and action traces (#48461) 2021-03-29 14:06:49 -07:00
Erik Montnemery
c459789c09 Add 'for' to cover device triggers (#48324) 2021-03-29 13:57:30 -07:00
Franck Nijhof
52475c108f Make integration setup optional (#48381) 2021-03-29 13:53:47 -07:00
Raman Gupta
dda9f957b6 Bump zwave-js-server-python to 0.23.0 to support zwave-js 7 (#48094)
* Bump zwave-js-server-python to 0.23.0 and update integration to support schema changes

* refactor notification evenets a bit

* fix tests and bug fixes

* additional changes due to new PR

* add command class and command name

* use new event names so we can retain event property names

* handle command status being returned from async_set_config_parameter

* bump dependency version

* adjust log message to be consistent

* disable pylint warning

* Update homeassistant/components/zwave_js/services.py

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

* add test for awake node

* switch async_get_registry to async_get

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-29 16:28:55 -04:00
Bram Kragten
cf6352e93c Add screenshot to manifest (#48475) 2021-03-29 13:13:42 -07:00
Jan Bouwhuis
d8a4cf63f4 Command template support for MQTT fan (#48413)
* Command template support

* Fix typo in abbreviations

* Update homeassistant/components/mqtt/fan.py

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

* Fix initialize templates

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2021-03-29 20:41:51 +02:00
Bram Kragten
03b7b1305c Cloud: Expose if google is registered in status + check on login (#48260)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-03-29 19:26:51 +02:00
Paulus Schoutsen
022f56f54d Allow specifying template entities based on triggers (#48169)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-29 09:57:51 -07:00
David McClosky
f815ebe9cd Fix unmute bug in vlc_telnet (#48441)
If volume was muted and media_player.volume_up is fired, VLC would still
show up as muted.

PR extracted from #44776.
2021-03-29 18:23:26 +02:00
Franck Nijhof
81ae0ee451 Add support for Selectors in Script service fields (#48469) 2021-03-29 18:05:45 +02:00
J. Nick Koston
6023105c6a Do not load ignored or disabled integrations at startup (#48355)
config_entries.async_setup will skip ignored and disabled integrations
but bootstrap would still load them in memory even though they would
never be setup.
2021-03-29 13:06:44 +02:00
J. Nick Koston
1fb9008488 Include platform only integrations in the manifest list api (#48269) 2021-03-29 12:51:48 +02:00
Pim
e2d3c0ea8f Don't write 0 to next modbus register (#48378) 2021-03-29 12:45:44 +02:00
J. Nick Koston
cb1b45d31a Log the reason a config entry failed to setup (#48449)
If we pass a string to ConfigEntryNotReady or raise it from
another exception we now log the string passed or the
string generated by the original exception.

With #47201 this makes it easy for developers to still show
the reason why setup failed without having to worry about log
spam from additional attempts by rasing ConfigEntryNotReady
from the original exception.
2021-03-29 12:25:40 +02:00
mptei
dd538bd291 Fix knx tests (#48407) 2021-03-29 12:17:54 +02:00
Erik Montnemery
0c6a1c29ec Fix broken trace tests (#48458) 2021-03-29 10:06:22 +02:00
J. Nick Koston
564688af25 Fix template fan default speed count (#48389)
* Fix template fan default speed count

The default speed count was defaulting to 3 when percentage
was implemented instead of the documented value of 100

* Increase coverage

* remove unreachable code
2021-03-29 09:33:56 +02:00
J. Nick Koston
7063306cd8 Bump aiodiscover to 1.2.0 in for dhcp (#48456)
- Additional optimizations
2021-03-29 09:17:30 +02:00
J. Nick Koston
2796a58ead Speed up bond setup with gather (#48454) 2021-03-29 08:58:48 +02:00
Erik Montnemery
14ef0531f0 Address review comments from trace refactoring PRs (#48288) 2021-03-29 08:09:14 +02:00
Paulus Schoutsen
ee81869c05 Bump frontend to 20210328.0 2021-03-29 03:14:29 +00:00
HomeAssistant Azure
357dedf5ef [ci skip] Translation update 2021-03-29 00:04:31 +00:00
SukramJ
cc38db6a89 Remove myself as codeowner of HomematicIP Cloud (#48437) 2021-03-28 19:18:59 -04:00
J. Nick Koston
47156151ab Bump aiodiscover to 1.1.2 for dhcp (#48445) 2021-03-28 13:12:31 -10:00
J. Nick Koston
a7d0fc2f86 Bump HAP-python to 3.4.1 for homekit (#48444) 2021-03-28 11:57:39 -10:00
Raman Gupta
08db248983 Fallback to current temperature unit for zwave_js climate (#48347)
* Fallback to current temperature unit for zwave_js climate

* don't use unit for N/A setpoint

* update comment

* add tests
2021-03-28 22:18:17 +02:00
J. Nick Koston
2ff94c8ed9 Add additional data source to dhcp (#48430) 2021-03-28 09:47:28 -10:00
David McClosky
23c7c4c977 Fallback to filename for title in vlc_telnet (#48438)
PR extracted from #44776.
2021-03-28 19:39:36 +02:00
David McClosky
48c0cfb25c Detect when media position is stale in vlc_telnet (#48434)
PR extracted from #44776.
2021-03-28 18:19:05 +02:00
Robert Delpeut
4487565232 Add dsmr monthly and yearly totals (#48253)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-28 16:37:27 +02:00
David McClosky
70e3fc430c Fix bug in vlc_telnet seeking (#48425)
Seems the code assumed a different `vlc_telnet` API.

Note that this doesn't address issues in `update()`, which will be
handled in a different PR.

PR extracted from #44776.
2021-03-28 11:58:11 +02:00
J. Nick Koston
958c4764f7 Handle routers that convert hostnames to lowercase in dhcp (#48429)
Some routers will lowercase all the hostnames. Since we
already lowercase hostnames for matching purposes, we now
pass the lowercased hostname to the integration.

Currently only roomba cared about this, and has been adjusted.
2021-03-28 11:23:06 +02:00
HomeAssistant Azure
ce3e00d018 [ci skip] Translation update 2021-03-28 00:05:04 +00:00
Unai
0706ae70dc Simplify maxcube integration (#48403)
* Simplify maxcube integration

Device objects returned by maxcube-api dependency are stable, so
we do not need to resolve from the device address every time.

Also, refactor and unify how maxcube integration sets temperature & mode.

* Raise ValueError if missing parameters for set_temperature method

Raise a ValueError exception If set_temperature does not receive
a temperature parameter.

Also, document properly _set_target method.

* Use Type | None instead of Optional[Type] annotation

* Protect set_hvac_mode and set_preset_mode from unsupported parameters
2021-03-28 00:21:20 +01:00
jan iversen
ffdfc521b9 Allow discovery configuration of modbus platforms (#46591)
* Change modbus configuration to new style.

The old (frozen) configuration is still supported, but when detected a big
warning is issued that it will soon be removed. This allows users to change
their configuration at their pace.

Clean configuration SCHEMAs and move common modbus parts
to MODBUS_SCHEMA (renamed from BASE_SCHEMA).

Add BASE_COMPONENT_SCHEMA to ensure common configuration of components.
All component define e.g. NAME, move these to a common schema.
change components (binary_sensor, sensor, switch) to new config

Add test set for modbus itself (old config and discovery_info).
Add test of devices discovery_info configuration

* Update discovery_info configuration for binary_sensor.

* Update discovery_info configuration for sensor.

* Update discovery_info configuration for switch.

* Review comments.

* update due to change in core

* flake8 problem.

* Correct log message.

* add should_poll property.

* Fix polling for Modbus binary sensor

* Fix polling for Modbus sensor

* Fix polling for Modbus switch

* Fix switch.

* Fix pytest errors.

* Update homeassistant/components/modbus/binary_sensor.py

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

* Update homeassistant/components/modbus/binary_sensor.py

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

* Update homeassistant/components/modbus/modbus.py

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

* Update homeassistant/components/modbus/sensor.py

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

* Update homeassistant/components/modbus/sensor.py

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

* Update homeassistant/components/modbus/sensor.py

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

* Update homeassistant/components/modbus/switch.py

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

* Update homeassistant/components/modbus/switch.py

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

* Update homeassistant/components/modbus/switch.py

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

* ToogleEntity -> SwitchEntity and add abastract

* Update homeassistant/components/modbus/switch.py

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

* Update tests/components/modbus/test_init.py

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

* removed if/else in test.

* Remove other if.

Co-authored-by: Vladimir Zahradnik <vladimir@zahradnik.io>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-27 22:48:06 +01:00
Álvaro Fernández Rojas
23d7330a2f Discard outdated data reported by AEMET stations (#48417)
* aemet: achieve 100% test coverage

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

* aemet: discard outdated station data

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

* aemet: fix AemetSensor/AemetForecastSensor inheritance

AbstractAemetSensor already inherits SensorEntity.

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2021-03-27 22:33:24 +01:00
Matthias Alphart
051f29f9b6 Remove KNX type alias for homeassistant.core types (#48422) 2021-03-27 22:20:11 +01:00
David F. Mulcahey
3aa2591b0a Bump ZHA quirks to 0.0.55 (#48418)
* bump quirks version

* call new setup method in quirks
2021-03-27 15:59:31 -04:00
J. Nick Koston
35a5f110bd Update mac address in broadlink test to match mocked device (#48415)
* Update mac address in broadlink test to match mocked device

* Update tests/components/broadlink/test_config_flow.py
2021-03-27 20:47:47 +01:00
Jesse Campbell
67791fa4df ZHA lock code services and events (#47208)
* ZHA lock code services and events

* ZHA Locks: A few more services, use the library functions

* Catch exception when command id is not in command list

* Add tests for lock code services

* Add tests for enable/disable

* Better document code slot ID shifting

* Simplify cluster commands
2021-03-27 15:23:40 -04:00
Christian Soltenborn
955804bf58 Add template support for remaining attributes of weather entity (#47736)
* added template support for remaining attributes of weather entity

* wind bearing is now angle (number)
2021-03-27 18:53:35 +00:00
J. Nick Koston
388815b81a Add broadlink dhcp discovery (#48408) 2021-03-27 08:40:19 -10:00
Raman Gupta
fbc3f97097 Add support for selective config parameter entity discovery (#48336)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-27 18:14:06 +01:00
conflipper
56abe25c1f Add Ambient Station PM25 indoor sensor (#47970) 2021-03-27 18:01:33 +01:00
Jonathan Keslin
11596afdfc Address late review of vesync light (#48130) 2021-03-27 17:50:35 +01:00
J. Nick Koston
938a4cc1b6 Bump yalexs to 1.1.9 (#48383)
* Bump yalexs to workaround pubnub reconnect bug

* bump to 1.1.9 to loosen version requirement for pubnub
2021-03-27 15:55:18 +01:00
Franck Nijhof
cebcd7a202 Fix entity service calls on WLED master light (#48402) 2021-03-27 13:04:30 +01:00
Franck Nijhof
02182bfa86 Fix ability to ignore AdGuard hassio discovery (#48401) 2021-03-27 12:59:22 +01:00
Franck Nijhof
38d14702fa Remove HomeAssistantType alias from helpers (#48400) 2021-03-27 12:55:24 +01:00
Unai
4a353efdfb Add Maxcube unit tests (#47872)
* Simplify maxcube integration

Device objects returned by maxcube-api dependency are stable, so
we do not need to resolve from the device address every time.

Also, refactor and unify how maxcube integration sets temperature & mode.

* Add tests for maxcube component

* Use homeassistant.util.utcnow to retrieve current time

* Revert "Simplify maxcube integration"

This reverts commit 84d231d5bd.

* Make test pass again after rolling back integration changes
2021-03-27 12:42:23 +01:00
Franck Nijhof
0d595a2845 Merge of nested IF-IF cases - E-G (#48367) 2021-03-27 12:39:37 +01:00
Franck Nijhof
786023fce4 Merge of nested IF-IF cases - H-J (#48368) 2021-03-27 11:30:29 +01:00
Franck Nijhof
db355f9b23 Merge of nested IF-IF cases - A-C (#48365) 2021-03-27 10:58:38 +01:00
Franck Nijhof
8d5ce53098 Merge of nested IF-IF cases - S-W (#48372) 2021-03-27 10:54:59 +01:00
Franck Nijhof
3aed84560f Merge of nested IF-IF cases - O-R (#48371) 2021-03-27 10:38:57 +01:00
Ville Skyttä
3cd52b695d Upgrade flake8 and dependencies, enable flake8-noqa (#48393)
* Upgrade flake8 to 3.9.0

https://flake8.pycqa.org/en/latest/release-notes/3.9.0.html

* Upgrade pydocstyle to 6.0.0

https://www.pydocstyle.org/en/latest/release_notes.html#september-13th-2020
https://www.pydocstyle.org/en/latest/release_notes.html#march-18th-2021

* Upgrade flake8-docstrings to 1.6.0, enable flake8-noqa

https://gitlab.com/pycqa/flake8-docstrings/-/blob/1.6.0/HISTORY.rst
https://github.com/plinss/flake8-noqa/issues/1

* Upgrade/pin pyflakes to 2.3.1

https://github.com/PyCQA/pyflakes/blob/2.3.1/NEWS.rst

* Pin pycodestyle to 2.7.0
2021-03-27 10:22:11 +01:00
Franck Nijhof
86212db71d Merge of nested IF-IF cases - K-N (#48370) 2021-03-27 10:03:15 +01:00
J. Nick Koston
9737480742 Lazy load broadlink storage (#48391)
With many broadlink devices, the storage load overwhelmed the
executor at startup. Delay loading storage until it is needed.
2021-03-27 09:32:30 +01:00
Franck Nijhof
45f77ccccf Merge of nested IF-IF cases - Core (#48364) 2021-03-27 09:23:32 +01:00
Franck Nijhof
ad13a9295e Merge multiple context managers in tests (#48146) 2021-03-27 09:17:15 +01:00
J. Nick Koston
79af18a8ab Bump httpx to 0.17.1 (#48388)
* Bump httpx to 0.17.1

* git add

* typing

* add test

* tweak
2021-03-27 09:02:01 +01:00
J. Nick Koston
b50dcef94f Block detectable I/O in the event loop (#48387)
We added a warning when this happens last April and gave developers
a year to fix the instability. We now prevent the instability by
raising RuntimeError when code attempts to do known I/O in the
event loop instead of the executor.

We now provide a suggestion on how to fix the code that is causing
the issue.
2021-03-27 08:54:49 +01:00
Paulus Schoutsen
63e3012380 Fix script default trace (#48390) 2021-03-26 23:56:40 -07:00
Franck Nijhof
387e166447 Remove HomeAssistantType alias from AdGuard integration (#48377) 2021-03-26 18:52:01 -10:00
HomeAssistant Azure
99874cd993 [ci skip] Translation update 2021-03-27 00:03:21 +00:00
Erik Montnemery
374dcde487 Return config entry details after creation (#48316) 2021-03-26 18:31:29 +01:00
Erik Montnemery
c6a20d0fc1 Improve traces for nested script runs (#48366) 2021-03-26 10:14:01 -07:00
Franck Nijhof
bbbc3a5f50 Merge of nested IF-IF case in elkm1 test (#48374) 2021-03-26 06:54:16 -10:00
Paulus Schoutsen
00683d3caa Create FUNDING.yml (#48375) 2021-03-26 09:48:02 -07:00
Franck Nijhof
f4cc4a0896 Merge of nested IF-IF cases - X-Z (#48373) 2021-03-26 17:08:05 +01:00
Matthias Alphart
8fa935234a Type check KNX integration __init__ and knx_entity (#48044) 2021-03-26 16:10:55 +01:00
Franck Nijhof
d2d78d6205 Extend typing on scaffold templates (#48232) 2021-03-26 15:19:44 +01:00
Tobias Sauerwein
3bc6497cbd Add Netatmo schedule event handling (#46573)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2021-03-26 15:08:41 +01:00
mptei
02b0a4ca1f Xknx unneeded expose (#48311) 2021-03-26 14:51:36 +01:00
J. Nick Koston
ae8afb69e7 Improve august reconnect logic when service become unreachable (#48349)
This is a different error than internet down.
2021-03-26 13:47:32 +01:00
J. Nick Koston
c4f98a3084 Small speed up to adding entities (#48353) 2021-03-26 12:05:19 +01:00
D3v01dZA
8f40c87069 Bump snapcast to 2.1.2 (#48343) 2021-03-26 12:03:38 +01:00
Tobias Sauerwein
1ba54ac2bb Refactor Netatmo tests (#48277) 2021-03-26 11:13:27 +01:00
Erik Montnemery
4fbc3da196 Validate device action schemas once (#48351) 2021-03-26 08:46:26 +01:00
Jan Bouwhuis
5b17aaf9d5 Percentage and preset mode support for MQTT fan (#47944)
* git push --all origin

* Fix percentage to ordered list conversion

* Tests for mqtt fan and fixes

* Improve tests and error handling base config

* Additional tests

* Tests completed, small fixes

* Allow preset mode and percentages combined

* Remove raise in setup and update tests

* Alignment with fan entity mode

* Fix pylint for len-as-condition

* Remove python binary cache file from PR

* Additional tests on async_turn_on and fix

* Added comments for deprecation of speeds

* Schema checks before init

* Optimize pre schema checks

* Correct schema checks

* Update homeassistant/components/mqtt/abbreviations.py

Comment speeds for mqtt fan are deprecated not needed here

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

* Update homeassistant/components/mqtt/fan.py

Comment speeds for mqtt fan are deprecated not needed here

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

* Update homeassistant/components/mqtt/fan.py

Comment speeds for mqtt fan are deprecated not needed here

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

* Update homeassistant/components/mqtt/fan.py

Comment speeds for mqtt fan are deprecated not needed here

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

* Update homeassistant/components/mqtt/fan.py

Comment speeds for mqtt fan are deprecated not needed here

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

* Warnings for exceptions - testing speed_range

* Update homeassistant/components/mqtt/abbreviations.py

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

* Update homeassistant/components/mqtt/fan.py

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

* Update homeassistant/components/mqtt/fan.py

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

* Update homeassistant/components/mqtt/fan.py

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

* Update homeassistant/components/mqtt/fan.py

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

* Update homeassistant/components/mqtt/fan.py

* Save with black

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2021-03-26 08:37:47 +01:00
Franck Nijhof
da2fecb312 Pre-calculate Verisure alarm states (#48340)
* Pre-calculate Verisure alarm states

* Correct super call
2021-03-26 08:21:11 +01:00
Erik Montnemery
72281f4718 Validate device trigger schemas once (#48319) 2021-03-26 08:09:21 +01:00
Matthias Alphart
de1fa706a0 xknx 0.17.4 (#48350) 2021-03-26 08:07:57 +01:00
Simone Chemelli
2b24f8b735 Remove timedate manipulation from Neato attributes (#48150)
* Remove timedate manipulation to get timezone back

* Updated camera to new format
2021-03-26 05:11:08 +01:00
Garrett
a019f076c0 Subaru integration code quality changes (#48193)
* Apply changes from code review

* Update sensor tests

* Fix pylint error

* Apply suggestions from code review

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

Co-authored-by: Brandon Rothweiler <brandonrothweiler@gmail.com>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-26 04:24:37 +01:00
Franck Nijhof
24dee01599 Use async with in Acmeda config flow (#48291) 2021-03-26 04:21:27 +01:00
Franck Nijhof
b90c620c5e Address huisbaasje review comments (#48313)
* Address huisbaasje review comments

* Update homeassistant/components/huisbaasje/config_flow.py

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

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-26 04:18:46 +01:00
starkillerOG
b4d39d517f Update in 1 minute on unavailable Motion blinds (#47800)
* if unavailable request update in 1 minute

* fix styling

* improve changing update interval

* remove unused import

* try to fix

* remove unused pass

* add const

* fix missing timedelta

* update to motionblinds 0.4.10

* improve update coordinator

* fix linting errors

* remove unused import

* move update functions within the DataUpdateCoordinator

* fix white space
2021-03-25 20:06:40 -07:00
HomeAssistant Azure
d5afd0afb3 [ci skip] Translation update 2021-03-26 00:04:15 +00:00
Marc Mueller
1dc25a5864 Bump python-typing-update to 0.3.2 (#48303)
* Bump python-version-update to 0.3.2
* Changes after update
* Fix pylint issues
2021-03-25 21:09:06 +01:00
Robert Svensson
88b5eff726 Fix late comment to PR adding percentage support to deCONZ fan platform (#48333) 2021-03-25 20:02:17 +01:00
Alexey Kustov
056f7d493c Support overriding token in notifify.event service (#47133)
* Add opportunity to define token for each message

* Update homeassistant/components/notify_events/notify.py

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

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2021-03-25 19:15:24 +01:00
jjlawren
e42ca35c94 Bump plexwebsocket to 0.0.13 (#48330) 2021-03-25 19:12:12 +01:00
Tobias Sauerwein
ec1334099e Add tests for Netatmo data handler (#46373)
* Add tests for Netatmo data handler

* Clean up coveragerc

* Move block to fixture

* Minor update

* Remove tests of implementation details for data handler

* Update homeassistant/components/netatmo/data_handler.py

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

* Update homeassistant/components/netatmo/data_handler.py

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

* Import callback

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-25 19:07:45 +01:00
Franck Nijhof
f0e5e616a7 Fix device discovery of OAuth2 config flows (#48326) 2021-03-25 10:35:01 -07:00
William Scanlon
4f4a6fd6a5 Add econet thermostat support and use getattr for sensors (#45564)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-25 17:06:51 +01:00
Martin Hjelmare
9f07ca069d Fix zha manual flow test (#48317) 2021-03-25 09:19:32 -04:00
chemaaa
1b60c8efb8 Add Homepluscontrol integration (#46783)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-25 14:12:31 +01:00
Erik Montnemery
3188f796f9 Add allowed UUIDs and ignore CEC to Google Cast options flow (#47269) 2021-03-25 14:06:01 +01:00
Matthias Alphart
6b2a2740f1 Type check KNX integration climate (#48054) 2021-03-25 09:47:49 +01:00
Zixuan Wang
21c72fa559 Fix missing glances temperature sensors (#46086)
* Fix missing glances temperature sensors (#44899)

* Revert matching rules for Glances

* Shorter if statement

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

* Revert long-line if statement

* Update if statement

Co-authored-by: J. Nick Koston <nick@koston.org>
2021-03-25 09:19:11 +01:00
Boris Gulay
642bb91a9a Add metrics upload by UDP to graphite (#43751) 2021-03-25 09:18:10 +01:00
jjlawren
20485eb132 Bump plexapi to 4.5.1 (#48307) 2021-03-25 08:41:21 +01:00
J. Nick Koston
da7fd8a294 Listen on the default interface by default for zeroconf (#48302) 2021-03-24 15:04:55 -10:00
Raman Gupta
058d232c57 Determine zwave_js sensor device class during initialization (#48304) 2021-03-24 20:08:16 -04:00
HomeAssistant Azure
6660fb7478 [ci skip] Translation update 2021-03-25 00:03:36 +00:00
J. Nick Koston
c340a39275 Handle range conversions that do not start at 1 (#48298) 2021-03-24 12:33:44 -10:00
djtimca
cc12d29f6d Bump omnilogic to 0.4.3 to fix API certificate issue (#48296)
* Bump omnilogic to 0.4.3 to fix API certificate issue.

* Updated requirements files.
2021-03-24 22:58:03 +01:00
Marc Mueller
6fc3406c93 Ignore python-typing-update for pre-commit requirements (#48292) 2021-03-24 20:05:53 +01:00
scyto
a9ccba44ed Add support for Roomba 980 discovery (#47696)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-03-24 08:46:11 -10:00
Erik Montnemery
8896ae0d56 Add support for tracing script execution (#48276)
* Add support for tracing script execution

* Tweak
2021-03-24 17:56:22 +01:00
Franck Nijhof
0be6a868e0 Fix Core bug report issue form (#48279) 2021-03-24 10:20:49 +01:00
Matt Zimmerman
5265aabf92 Clean up SmartTub reminders (#48033)
* remove "date" state attribute

* remove unused constant
2021-03-24 08:39:23 +01:00
jjlawren
879c82ebf8 Improve Plex GDM client connections (#48272) 2021-03-24 07:57:45 +01:00
Tobias Sauerwein
0d699bb768 Add tests for Netatmo sensor (#46393)
* Add tests for Netatmo sensor

* Fix coveragerc

* Remove freezegun dependency

* Use f-strings instead of string concatenation

* Update tests/components/netatmo/test_sensor.py

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

* Address comment on config options test

* Replace deprecated call to async_get_registry()

* Fix public weather sensor update test

* Clean up

* Prevent division by zero

Co-authored-by: Erik Montnemery <erik@montnemery.com>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-24 07:17:51 +01:00
Paulus Schoutsen
3dec394cad Migrate template to register reload service on async_setup (#48273) 2021-03-23 20:35:15 -07:00
Paulus Schoutsen
b58dd7d047 Bump frontend to 20210324.0 2021-03-24 00:23:29 +00:00
HomeAssistant Azure
c4e5af8081 [ci skip] Translation update 2021-03-24 00:03:09 +00:00
Bram Kragten
b1d0b37d2c Google assistant: disconnect user agent when not found in google (#48233) 2021-03-23 15:04:32 -07:00
Erik Montnemery
9f8b697e64 Refactor tracing: Prepare for tracing of scripts (#48231) 2021-03-23 14:53:38 -07:00
jjlawren
195d4de6cd Bump plexapi to 4.5.0 (#48264) 2021-03-23 22:47:00 +01:00
Robert Svensson
70d9e8a582 Add proper percentage support to deCONZ fan integration (#48187)
* Add proper percentage support to deCONZ fan integration

* Properly convert speed to percentage

* Remove disabled method

* Replace convert_speed with a dict
2021-03-23 22:29:55 +01:00
Joakim Sørensen
49b47fe648 Install requirements.txt while building dev Dockerfile (#48268) 2021-03-23 14:04:15 -07:00
Diogo Gomes
fd5916e067 datetime must be a string (#47809) 2021-03-23 20:19:47 +01:00
Fredrik Erlandsson
d129b8e1e1 Update pypoint to 2.1.0 (#48223)
* update pypoint to 2.1.0

* Add properties and device_classes to constant

* Fix unique_ids for binary_sensors

* Update device icon

* Fallback to device_class icon.

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

* Just use known events

* Use DEVICE_CLASS_SOUND

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2021-03-23 20:03:54 +01:00
Franck Nijhof
cc73cbcace Update issue form to use latest changes (#48250) 2021-03-23 18:45:40 +01:00
Alexei Chetroi
269608d1af Bump up ZHA dependencies (#48257) 2021-03-23 11:03:16 -04:00
Erik Montnemery
a09c8eecb7 Fix some sensor classes (#48254)
* Fix some sensor classes

* Tweak

* Tweak
2021-03-23 15:56:33 +01:00
Franck Nijhof
6932cf9534 Use contextlib.suppress where possible (#48189) 2021-03-23 14:36:43 +01:00
Tobias Sauerwein
9656f260a4 Add tests for Netatmo (#46372)
Co-authored-by: Erik Montnemery <erik@montnemery.com>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-23 14:28:35 +01:00
Robert Svensson
1095d93892 Increase test coverage of deCONZ device triggers (#48126)
* Increase test coverage of deCONZ device triggers

* Revert removed new line

* Found a way to explicitly assert that exceptions are raised

* Remove unnecessary block till done

* Fix unnecessary elif

* Fix review comments

* Remove helper tests
2021-03-23 13:49:44 +01:00
Fabian Affolter
e0e3495849 Upgrade pylast to 4.2.0 (#48245) 2021-03-23 12:18:03 +01:00
J. Nick Koston
7bd876beaf Add dhcp discovery support to blink (#48243) 2021-03-23 12:00:06 +01:00
J. Nick Koston
6e07279257 Add august doorbells to dhcp discovery (#48244) 2021-03-23 11:59:04 +01:00
David Keijser
95370ac84b Change nanoleaf name to configured name instead of hostname (#46407)
* nanoleaf: Key config by device id

Rather than host which is not stable

* nanoleaf: Use pretty name instead of hostname
2021-03-23 10:28:19 +01:00
Kevin Fronczak
8900b38c7f Add Blink config migration (#46671) 2021-03-23 09:24:42 +01:00
Dewet Diener
fb03d79daf Bump nanoleaf to 0.1.0, add unique IDs (#48135)
* bump pynanoleaf and expose model/serial as unique_id

* addressed PR feedback
2021-03-23 09:18:48 +01:00
uvjustin
cd455e296e Remove login details before logging stream source (#45398)
* Remove login details before logging stream source

* Convert to str before re

* Use compiled RE

* Add tests and filter log message in worker

* Update import

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

* isort

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2021-03-23 07:30:45 +01:00
HomeAssistant Azure
55b689b464 [ci skip] Translation update 2021-03-23 00:03:29 +00:00
Paulus Schoutsen
19ab7306ec Clean up AsusWRT (#48012) 2021-03-22 23:21:33 +01:00
Erik Montnemery
9e9ba53f0e Move SensorEntity last in the inheritance tree (#48230) 2021-03-22 20:05:13 +01:00
plomosits
18e6816373 Improve Docker and Kubernetes support for KNX (#48065)
Co-authored-by: Matthias Alphart <farmio@alphart.net>
2021-03-22 20:03:57 +01:00
Erik Montnemery
fdf97eaca3 Migrate integrations i-m to extend SensorEntity (#48213) 2021-03-22 19:59:03 +01:00
Erik Montnemery
64bc9a8196 Migrate integrations r-s to extend SensorEntity (#48215) 2021-03-22 19:54:14 +01:00
Erik Montnemery
0c086b5067 Migrate integrations w-z to extend SensorEntity (#48217) 2021-03-22 19:50:29 +01:00
Erik Montnemery
783b453bbe Migrate integrations t-v to extend SensorEntity (#48216) 2021-03-22 19:47:44 +01:00
Erik Montnemery
c900e3030b Migrate integrations n-q to extend SensorEntity (#48214) 2021-03-22 19:46:46 +01:00
Erik Montnemery
339a56e434 Migrate integrations f-h to extend SensorEntity (#48212) 2021-03-22 19:45:17 +01:00
Erik Montnemery
a49989241a Refactor tracing: Move trace support to its own integration (#48224) 2021-03-22 19:19:38 +01:00
Dermot Duffy
781084880b Add an option to hide selected Hyperion effects (#45689) 2021-03-22 15:59:12 +01:00
Philip Allgaier
286217f771 Fix condition extra fields for climate and humidifier (#48184) 2021-03-22 14:59:40 +01:00
MatsNl
53a9c117ee Add jobstate parser to Onvif integration (#46589) 2021-03-22 14:43:46 +01:00
starkillerOG
a583f56bd8 Add identification for YAML imports (#48162) 2021-03-22 14:35:24 +01:00
Franck Nijhof
dc15f243e6 Upgrade pyupgrade to v2.11.0 (#48220) 2021-03-22 13:29:39 +01:00
Erik Montnemery
272dffc384 Improve script tracing (#48100)
* Improve script tracing

* Fix test
2021-03-22 13:15:45 +01:00
unaiur
3fb323b745 Fix maxcube temperature for thermostat auto mode (#48047)
maxcube-api dependency now supports using None as the
target temperature: in that case, it uses the scheduled
temperature in auto mode and current temperature in all
other modes.

We will use that feature when changing hvac_mode to auto and
selecting PRESET_NONE.
2021-03-22 13:13:06 +01:00
Franck Nijhof
b7ad5ff032 Upgrade pre-commit to 2.11.1 (#48219) 2021-03-22 13:11:06 +01:00
Franck Nijhof
6cead320de Bump colorlog to 4.8.0 (#48218) 2021-03-22 13:10:01 +01:00
Erik Montnemery
23b562386f Migrate integrations d-e to extend SensorEntity (#48211) 2021-03-22 12:52:29 +01:00
Erik Montnemery
e0cd7072d6 Migrate integrations a-c to extend SensorEntity (#48210) 2021-03-22 12:37:16 +01:00
Sean Wilson
1bb29bffbb Update aqualogic library to v2.6 (#48119) 2021-03-22 12:12:14 +01:00
Greg Dowling
834fc1ae14 Remove vera should_poll (#48209) 2021-03-22 12:01:17 +01:00
J. Nick Koston
136ac88bed Bump yalexs to 1.1.5 for august (#48205)
Turns on auto-reconnect support
2021-03-22 11:19:05 +01:00
Paulus Schoutsen
f67e8b4369 Populate trigger variable when manually triggering automation (#48202)
* Populate trigger variable when manually triggering automation

* Update tests/components/automation/test_init.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2021-03-22 08:22:32 +01:00
J. Nick Koston
6b93c4073d Ensure homekit yaml config works when there is an ignored config entry (#48175) 2021-03-21 21:17:04 -10:00
J. Nick Koston
a2c4b438ea Convert august to be push instead of poll (#47544) 2021-03-21 22:35:12 -07:00
J. Nick Koston
8e4c0e3ff7 Increase config entries test coverage (#48203) 2021-03-21 19:29:48 -10:00
J. Nick Koston
7a447c4209 Exclude homekit accessories created by the homekit integration from homekit_controller (#48201) 2021-03-21 22:18:24 -07:00
jjlawren
e5893ca42c Trigger Plex GDM scans regularly (#48041) 2021-03-21 22:14:09 -07:00
Erik Montnemery
40ce25800c Test that homeassistant stop and restart do not block WS (#48081) 2021-03-21 22:12:56 -07:00
Erik Montnemery
73e546e2b8 Improve condition trace tests (#48152) 2021-03-21 22:09:59 -07:00
Emily Mills
8557b856a4 Fix Kulersky and Zerproc config unloading (#47572) 2021-03-21 22:08:09 -07:00
J. Nick Koston
f35641ae8e Make sure include_ignore=False always works with _async_current_entries (#48196)
If the step was anything other than SOURCE_USER,
include_ignore=False would not be honored
2021-03-21 21:57:49 -07:00
J. Nick Koston
fd310e1f41 Update homekit to improve representation of activity based remotes (#47261) 2021-03-21 21:55:20 -07:00
J. Nick Koston
3f2ca16ad7 Index config entries by id (#48199) 2021-03-21 21:44:29 -07:00
HomeAssistant Azure
6fab4a2c82 [ci skip] Translation update 2021-03-22 00:08:34 +00:00
Nate Clark
2912db84d7 Handle switch state updates from Konnected device (#48167)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-22 00:16:34 +01:00
xonestonex
9739707f62 Preset support for MOES thermostat valves (#48178) 2021-03-21 18:03:23 -04:00
Ikko Ashimine
7473f25afd Fix typo in homekit strings.json (#48176)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-03-21 12:39:33 +01:00
Kevin Worrel
fb48fd7d10 ScreenLogic cleanups (#48136)
* ScreenLogic cleanup.
Bump screenlogicpy to 0.2.0.
Move heating functions from water_heater to climate platform.
Address notes from original PR.

* Fix temperature attribute

* Addressing notes.
Bump screenlogicpy to 0.2.1.
Made device_types constants.
Made (known) equipment flags constants.
Used dict.get() in places where None is the default.
Return fast with good _last_preset.

* Update homeassistant/components/screenlogic/climate.py

Let base entity handle state property.

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

* Patch integration setup functions.

* Exception, ATTR_TEMPERATURE notes

Co-authored-by: J. Nick Koston <nick@koston.org>
2021-03-21 11:56:46 +01:00
Erik Montnemery
346a724ac3 Mark base components' state_attribute @final, rename others to extra_state_attributes (#48161)
* Mark base state_attributes @final, rename others to extra_state_attributes

* Fix calendar, update tests
2021-03-21 10:38:24 +01:00
javicalle
668d018e9c Make Rflink handle set_level command for dimmable devices (#46499)
* Added handle_event for set_level command in dimmable devices

* refactor common code for dimmable devices

* Force tests

Silly change to force tests execution

* fix super()

* add rflink dim utils
2021-03-21 08:43:38 +01:00
Franck Nijhof
87499989a0 Small code styling tweaks for HomeKit (#48163) 2021-03-20 17:08:49 -10:00
javicalle
99d2d72d13 Update RFLink tests (#48149) 2021-03-21 03:27:24 +01:00
Otto Winter
0193f16ae9 ESPHome trigger reconnect immediately when mDNS record received (#48129) 2021-03-20 14:49:03 -10:00
HomeAssistant Azure
46a3b80a2d [ci skip] Translation update 2021-03-21 00:05:03 +00:00
Philip Allgaier
3ae9460131 Use domain const in config_flow (#48168) 2021-03-21 00:34:46 +01:00
David F. Mulcahey
01fcc41aa0 only block coord removal if it is active (#48147) 2021-03-20 17:26:23 -04:00
Franck Nijhof
08870690a6 Fix a collection of tests with missing asserts (#48127)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-20 17:23:55 +01:00
Erik Montnemery
f8755a52c2 Warn on undefined variables in templates (#48140)
* Warn on undefined variables in templates

* Add test

* fix tests

* fix tests
2021-03-20 15:16:04 +01:00
Robert Svensson
863f75e65e Improve test coverage of deconz_device (#48141) 2021-03-20 14:22:01 +01:00
Franck Nijhof
5a2b5fe7c5 Yoda assertion style removed is (#48142) 2021-03-20 13:55:10 +01:00
Tobias Sauerwein
365e8a74ee Add tests for Netatmo webhook handler (#46396)
* Add tests for Netatmo webhook handler

* Add async prefix

* Remove freezegun dependency

* Clean up
2021-03-20 08:26:11 +01:00
Jonathan Keslin
0f16d4f1e7 Update pyvesync to 1.3.1 (#48128) 2021-03-19 19:50:52 -05:00
Franck Nijhof
fb849b81b5 Rewrite of not a == b occurances (#48132) 2021-03-20 01:27:04 +01:00
Thiago Oliveira
26bceae99d Set zwave_js climate precision to tenths for F (#48133) 2021-03-20 01:20:09 +01:00
HomeAssistant Azure
098c53e8b5 [ci skip] Translation update 2021-03-20 00:04:10 +00:00
Franck Nijhof
e47d8da3b4 Remove defunct test from percentage util (#48125) 2021-03-19 17:16:45 -05:00
Matthias Alphart
70bebc51f2 Type check KNX integration cover (#48046) 2021-03-19 22:25:20 +01:00
Matthias Alphart
16a4f05e27 Type check KNX integration fan (#48056) 2021-03-19 20:55:08 +01:00
Greg Dowling
b03c97cdd0 Make Vera should_poll static rather than dynamic (#47854)
* Make should_poll static.

* Address review comments.

* Fix black error.
2021-03-19 20:27:56 +01:00
Robert Svensson
24e067782a Improve sensor coverage by verifying daylight sensor attributes (#48090) 2021-03-19 16:51:44 +01:00
sycx2
bc0eb9bf32 Improve uvc test camera (#41438)
* Improve uvc test camera

* Clean setup full config

* Clean setup partial config

* Set more camera defaults

* Clean setup partial config v31x

* Clean setup incomplete config

* Clean setup nvr errors during indexing

* Clean setup nvr errors during initialization

* Clean properties

* Fix motion recording mode properties

* Clean stream

* Clean login

* Clean login v31x

* Clean login tries both addres and caches

* Clean login fails both properly

* Remove not needed test

* Clean camera image error

* Test snapshot login retry

* Clean up

* Test enable and disable motion detection

* Times must be UTC

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-19 15:54:07 +01:00
javicalle
e798f415a4 Wait for switch startup in generic_thermostat (#45253)
* Better status control on restore

* Better status control on restore

* fix code coverage

* Rollback hvac_mode initialization

I think I have better understood the handling of the `hvac_mode`.
I change the approach. Now the thermostat doesn't initialize until the switch is available.

* fix pyupgrade

* fix black

* Delete test_turn_on_while_restarting

HVAC mode should not be modified by the switch.
IMHO, this test does not make sense because if the switch is turned on the thermostat is not turning on (and not changing HVAC_MODE)

* Re add turn off if HVAC is off

If HVAC_MODE is off thermostat will not control heater switch. This can be because `initial_hvac_mode`, because state defaults to or because old_state.
IMHO it is preferable to be excessively cautious.

* Update climate.py

* Change warning message

* Fix black

* Fix black
2021-03-19 15:42:45 +01:00
J. Nick Koston
c820dd4cb5 Have pylint warn when user visible log messages do not start with capital letter or end with a period (#48064)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-19 09:26:36 -05:00
Martin Hjelmare
3742f175ad Add missing oauth2 error abort reason (#48112) 2021-03-19 14:27:26 +01:00
Franck Nijhof
8a56dbf587 Add flake8 comprehensions checks to pre-commit & CI (#48111) 2021-03-19 13:41:09 +01:00
Robert Svensson
fa5ce70af1 Improve test coverage of deCONZ config flow (#48091) 2021-03-19 13:37:22 +01:00
Franck Nijhof
6e0c0afde2 Upgrade RPi.GPIO to 0.7.1a4 (#48106) 2021-03-19 13:36:44 +01:00
Erik Montnemery
703c073e53 Improve websocket debug log 2021-03-19 13:30:16 +01:00
Michael Cicogna
b1626f0091 Fix Homematic transition function on light devices with multiple channels (#45725)
* Update light.py

Fix Transition function on devices with multiple channels

* Update light.py

fix Flake8 Warning W293 blank line contains whitespace
2021-03-19 12:36:03 +01:00
Andreas Brett
993261e7f5 Add "timestamp" attribute to seventeentrack (#47960)
* bump py17track to 3.0.1

* Make aiohttp ClientSession optional

as introduced in py17track v3.0.0 (https://github.com/bachya/py17track/releases/tag/3.0.0)

* Update manifest.json

* add new attribute timestamp

introduced in 3.1.0

* Update requirements.txt

* Update requirements_all.txt

* Update requirements.txt

* Update requirements_test_all.txt

* Update sensor.py

* Update sensor.py

* Update manifest.json

* provide timezone configuration

user config to pre-define timezone of package status timestamps

* Update requirements_all.txt

* Update requirements_test_all.txt

* linting

* use hass.config.time_zone

* Update sensor.py

* Update test_sensor.py

* Update test_sensor.py

* black

* Update manifest.json

* adjust changes to session param

* added test against latest dev branch

* make isort happy

* make black happy

* make flake8 happy

* make black happy

* bump to 3.2.1

* 3.2.1

* Update typing 15
2021-03-19 12:34:06 +01:00
Tobias Sauerwein
4ee4d674d8 Add tests for Netatmo camera (#46380)
* Add test for Netatmo camera

* Improve docstrings

* Remove light tests

* Remove freezegun from tests

* Update camera tests

* Remove freezegun dependency

* Update tests/components/netatmo/test_camera.py

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

* Update tests/components/netatmo/test_camera.py

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

* Deduplication of the fake webhook payload

* Mock pyatmo instead of checking the logs

* Clean up

* Further deduplication

* Assert function arguments

* Rename mocked functions

* Update .coveragerc

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2021-03-19 12:19:57 +01:00
Tobias Sauerwein
aaafe399a1 Add tests for Netatmo light (#46381)
* Add tests for Netatmo light

* Improve docstring

* Register the camera data class for the light platform

* Remove freezegun dependency

* Update tests

* Update tests/components/netatmo/test_light.py

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

* Deduplicate webhook test data

* Mock pytest to verify it is called

* Don't test internals

* Rename

* Assert light still on with erroneous event data

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2021-03-19 12:19:27 +01:00
Maciej Bieniek
7858b59944 Use device class voltage in NUT integration (#48096) 2021-03-19 10:25:17 +01:00
Matthias Alphart
66b537c0e3 Type check KNX integration factory and schema (#48045)
these are used non-optional anyway
get them per config[] notation
2021-03-19 10:23:50 +01:00
Matthias Alphart
e522b311ce Type check KNX integration binary_sensor, sensor and switch (#48050) 2021-03-19 10:22:18 +01:00
Matthias Alphart
fb1e76db8c Type check KNX integration light (#48053)
* type check light

* review changes
2021-03-19 10:21:06 +01:00
Matthias Alphart
943ce8afaf Type check KNX integration weather, notify and scene (#48051) 2021-03-19 10:16:27 +01:00
Matthias Alphart
987c2d1612 Type check KNX integration expose (#48055) 2021-03-19 10:12:55 +01:00
Tobias Sauerwein
2f15957707 Refactor Netatmo test (#48097)
* Refactor webhook simulate

* Update test_climate.py
2021-03-19 09:57:11 +01:00
HomeAssistant Azure
d77a28b8a1 [ci skip] Translation update 2021-03-19 00:03:03 +00:00
Martidjen
8a37b616bf Add Opentherm Gateway current and setpoint precision (#47484)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-19 00:47:59 +01:00
Marc Mueller
7def367467 Update pyupgrade to v2.10.1 (#48089) 2021-03-19 00:03:27 +01:00
Marc Mueller
314a5518f1 Add python-typing-update to pre-commit-config (#48088) 2021-03-18 23:20:25 +01:00
Marc Mueller
4cb7718192 Update typing 16 (#48087) 2021-03-18 22:58:19 +01:00
Maciej Bieniek
0f5efca76b Fix Shelly sleeping device initialization after reconfiguration (#48076) 2021-03-18 13:26:20 -07:00
Erik Montnemery
7b717bc437 Correct trace for repeat script actions (#48031) 2021-03-18 13:14:06 -07:00
bestlibre
98d7e6b898 Add images support to matrix notify (#37625)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-03-18 11:30:38 -07:00
Dan Klaffenbach
5174f63fd8 Add definitions for grouping media players (#41193)
* Add definitions for grouping media players

See https://github.com/home-assistant/architecture/issues/364

* Fix Google Assistant tests

* Define sync versions of async_join_players/async_unjoin

* Don't use async API in synchronous test methods

* Fix tests and make pylint happy

The method name `unjoin` is used by another component, so let's use
`unjoin_player` instead.

* Fix emulated_hue tests

The new media player entity in the `demo` component requires a tiny
adjustment in the emulated_hue tests.

* Use "target:" in service description

* Also use "name:" in service descriptions

Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-03-18 18:19:28 +01:00
Raman Gupta
9fca001eed Bump zwave-js-server-python to 0.22.0 (#48085) 2021-03-18 18:12:33 +01:00
elyobelyob
53687c766d Add URL input for Prowl (#46427)
Co-authored-by: Joakim Sørensen <hi@ludeeus.dev>
2021-03-18 17:02:38 +01:00
Marc Mueller
54d1e9985f Update typing 15 (#48079) 2021-03-18 15:13:22 +01:00
Marc Mueller
dcca29ef68 Update typing 14 (#48078) 2021-03-18 15:08:35 +01:00
Tobias Sauerwein
7d196abc4a Add tests for Netatmo oauth2 api (#46375)
* Add Netatmo tests for api

* Update tests/components/netatmo/test_api.py

* Update .coveragerc

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2021-03-18 14:55:39 +01:00
Marc Mueller
b67b9b94f9 Update typing 13 (#48077) 2021-03-18 14:43:52 +01:00
Marc Mueller
a3cd1854f6 Update typing 12 (#48073) 2021-03-18 14:31:38 +01:00
Berni Moses
6cd6ad6904 Ignore not implemented lg_soundbar source/equaliser. (#45868) 2021-03-18 14:06:17 +01:00
Marc Mueller
3d2b81a401 Update typing 11 (#48072) 2021-03-18 13:21:46 +01:00
Raj Laud
99f9f8dec0 Allow hdmi_cec to recover from lost connection to adapter without restart (#40714)
* Only update CecDevice state when there is new data

* Replace CecDevice with CecEntity

* Support for losing and reconnecting to pycec TcpAdapter

* Register listener in async_added_to_hass

* Rename hdmi_cec watchdog

* Only update CecDevice state when there is new data

* Fix flake8 docstring error

* Fix linter error

* Bump pycec version to 0.5.0

* Bump pycec version to 0.5.1

* Fixe merge mistake

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2021-03-18 13:07:35 +01:00
Marc Mueller
25a13d1554 Update typing 10 (#48071) 2021-03-18 13:07:04 +01:00
Andreas
00dca88024 Amcrest add support for CrossLineDetection (#44582)
Co-authored-by: andreas-amlabs <andreas-amlabs@users.noreply.github.com>
2021-03-18 12:32:08 +01:00
javicalle
c8950870a2 Propagate RFLink 'send_command' event (#43588)
* propagate send_command event

* propagate send_command event
2021-03-18 12:25:00 +01:00
Robert Svensson
8b8a54b367 Improve deCONZ services and scenes tests (#47829)
Use patch.dict rather than deep copy to change DECONZ_WEB_REQUEST
2021-03-18 11:57:56 +01:00
Robert Svensson
ad5dbebc03 Use websocket fixture in deCONZ switch tests (#47831)
Localize test data
Improve asserts
2021-03-18 11:44:52 +01:00
Robert Svensson
a4b2dff58d Use websocket fixture in deCONZ sensor tests (#47830)
Localize test data
Improve asserts
2021-03-18 11:41:27 +01:00
Robert Svensson
a21d0cadf8 Use websocket fixture in deCONZ lock tests (#47827)
Localize test data
Improve asserts
2021-03-18 11:06:44 +01:00
Robert Svensson
3f2d3bd1b2 Use websocket fixture in deCONZ light tests (#47826)
Localize test data
Improve asserts#
2021-03-18 11:01:32 +01:00
Robert Svensson
7350215b4e Use websocket fixture in deCONZ fan tests (#47824)
Localize test data
Improve asserts
2021-03-18 10:49:48 +01:00
Robert Svensson
7ff9610e67 Use websocket fixture in deCONZ event related tests (#47823)
Localize test data
Improve asserts
2021-03-18 10:44:31 +01:00
Robert Svensson
a57d340037 Use websocket fixture in deCONZ cover tests (#47822)
Localize test data
Improve asserts
2021-03-18 10:07:11 +01:00
Marc Mueller
283b4abe67 Update typing 09 (#48059) 2021-03-18 10:02:00 +01:00
Robert Svensson
2ab640aaef Use websocket fixture in deCONZ climate tests (#47821)
Localize test data
Improve asserts
2021-03-18 09:57:27 +01:00
J. Nick Koston
fea0e39fa0 Reduce rest setup code (#48062)
- Switch to storing each platform config/rest data in a list
2021-03-18 09:55:38 +01:00
Robert Svensson
333f5da036 Use websocket fixture in deCONZ binary sensor tests (#47820)
Localize test data
Improve asserts
2021-03-18 09:51:42 +01:00
Marc Mueller
5cdd945f44 Update typing 08 (#48058) 2021-03-18 09:25:40 +01:00
Marc Mueller
9e1a6610dc Update typing 07 (#48057) 2021-03-18 08:02:55 +01:00
J. Nick Koston
08db262972 Add a service to reload config entries that can easily be called though automations (#46762) 2021-03-17 21:27:21 -07:00
corneyl
6fb0e49335 Upgraded aiopylgtv to v0.4.0 (#47014)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-03-17 20:59:48 -07:00
Tobias Haber
f785cc7d9a Google has deprecated a comma separated list for modes changed it to array (#48029) 2021-03-17 20:59:06 -07:00
HomeAssistant Azure
f625e324dd [ci skip] Translation update 2021-03-18 00:07:07 +00:00
Marc Mueller
91df3fa904 Update typing 06 (#48039) 2021-03-17 23:49:01 +01:00
Marc Mueller
7c0734bdd5 Update typing 05 (#48038) 2021-03-17 23:43:55 +01:00
Marc Mueller
76199c0eb2 Update typing 04 (#48037) 2021-03-17 23:34:25 +01:00
Guillermo Ruffino
02619ca2cd Add service schema for ESPHome api services (#47426) 2021-03-17 22:50:21 +01:00
J. Nick Koston
dd56cc8010 Fix rest sensor data misalignment with multiple sensors (#48043)
If there were multiple rest data sources, the index needed
to be incremented by type instead of by data source/type
2021-03-17 22:47:42 +01:00
Marc Mueller
fabd73f08b Update typing 03 (#48015) 2021-03-17 21:46:07 +01:00
Marc Mueller
6fb2e63e49 Update typing 02 (#48014) 2021-03-17 18:34:19 +01:00
Hans Kröner
86d3baa34e Improve OWM Precipitation sensors (#47945) 2021-03-17 17:39:47 +01:00
Marc Mueller
e55702d635 Update typing 01 (#48013) 2021-03-17 17:34:55 +01:00
Matthew Donoughe
9011a54e7f Switch history tests to pytest (#42318)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-17 15:32:44 +01:00
schiermi
6a24ec7a30 Fix workday sensor to honor timezone (#47927) 2021-03-17 15:32:18 +01:00
Marc Mueller
a1ff45cbf2 Update metadata license string (#46899) 2021-03-17 14:32:13 +01:00
sycx2
009e44ed9b Rewrite tests for Template Light (#41163) 2021-03-17 11:30:44 +01:00
Nathan Tilley
6f7f4955a3 Add Logger Check Before Adding Another (#47954) 2021-03-17 11:11:39 +01:00
dependabot[bot]
4f3b7f917f Bump codecov/codecov-action from v1.2.2 to v1.3.1 (#48020)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from v1.2.2 to v1.3.1.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/master/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v1.2.2...fcebab03f26c7530a22baa63f06b3e0515f0c7cd)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-03-17 09:52:17 +01:00
Jim Ekman
ecf93e09e8 Add support for percentage based fan model in esphome (#46712) 2021-03-17 08:50:34 +01:00
Nathan Spencer
bdc8a2878f Fix issue with setting sleep mode during DST (#48001) 2021-03-17 08:23:54 +01:00
Philip Allgaier
470b0b8b87 Fix historic attributes for input_datetime (#45208) 2021-03-16 22:40:20 -07:00
HomeAssistant Azure
4306c8fbb4 [ci skip] Translation update 2021-03-17 00:03:55 +00:00
Paulus Schoutsen
529b23d8af Bump frontend to 20210316.0 2021-03-16 23:43:16 +00:00
Kevin Worrel
d21d9951ba Add Pentair ScreenLogic integration (#47933)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-03-16 13:32:02 -10:00
J. Nick Koston
f605a3c149 Remove YAML support from August (#47615) 2021-03-16 13:22:07 -10:00
Abílio Costa
d49a436573 Delay ZHA group updates to ensure all members are updated first (#46861)
* Delay ZHA group updates to ensure all members are updated first

After turning off a group, when the first device reports "off", the
other devices may still be "on". If HA processes the group state update
quickly enough, the group will see that some devices are on, so the
state of the group will revert back to "on", and then "off" when the
remaining devices all report "off". That would cause the UI toggle to go
back and forward quickly, and automations that trigger with "state: on"
to fire when the user turns the group off.

This PR fixes that by delaying the group state update, giving time for
all the devices to report their states first.

* Fix zha group tests

* Reorder sleeping.

* Update tests/components/zha/common.py

Co-authored-by: Alexei Chetroi <lexoid@gmail.com>
2021-03-16 17:38:16 -04:00
Paulus Schoutsen
f1c274b3dd Add run_id to automation logbook event (#47980) 2021-03-16 14:37:26 -07:00
Matthias Alphart
a4075d9e11 KNX sensor: float no longer valid for type (#48005) 2021-03-16 21:33:56 +01:00
Joakim Plate
d39aa9f80b Bump philips_js with backported fixes (#47959) 2021-03-16 21:24:01 +01:00
Alan Tse
f86e7535e0 Add location details to deprecation warning (#47155) 2021-03-16 21:16:07 +01:00
chpego
f3c74948c3 Upgrade youtube_dl to version 2021.03.14 (#48000) 2021-03-16 21:02:05 +01:00
Kevin Eifinger
14d3e29e64 Add missing "pin" field in step "pair" for philips_js (#47802) 2021-03-16 20:56:49 +01:00
billsq
55db855f91 Add support for Xiaomi Air Purifier Pro H (#47601) 2021-03-16 20:54:13 +01:00
Matt Zimmerman
73c6728e98 Add binary_sensor entities for SmartTub reminders (#47583) 2021-03-16 17:38:09 +01:00
Alexei Chetroi
6a66ccef1b Bump up ZHA dependencies (#47997) 2021-03-16 12:21:08 -04:00
Ron Heft
bbd98e196b Fix withings InvalidParamsException (#47975)
* Bump withings_api to 2.3.1 (fixes #47329)

* Fix NotifyAppli calls to be compatible with withings_api 2.3.1

* Fix errors with withings_api 2.2+ using pydantic

* Bump withings_api to 2.3.2
2021-03-16 17:15:22 +01:00
Klaas Schoute
0097169dd3 Add aliases to actions in automation blueprints (#47940) 2021-03-16 17:14:07 +01:00
Erik Montnemery
389891d13d Improve JSONEncoder test coverage (#47935) 2021-03-16 17:12:51 +01:00
Matthias Alphart
7ed9e5b2c2 Update xknx to 0.17.3 (#47996) 2021-03-16 16:43:11 +01:00
Franck Nijhof
f695155af5 Add device classes to Verisure sensors (#47990) 2021-03-16 16:30:04 +01:00
Antoine Meillet
4dc0cdbb5f Ignore STATE_UNKNOWN in prometheus (#47840)
Giving a value of 0 by default can lead to erroneous
data being exported. For example, if a MQTT temperature
sensor is in `STATE_UNKNOWN` (which can happen after a
HASS restart), a temperature of 0°C will be exported.
Some user might prefer no value rather than a wrong one.
2021-03-16 16:11:51 +01:00
David F. Mulcahey
673ebe2911 Guard extra call in ZHA lights (#47832)
* add flag to prevent sending an on command

* fix condition

* add constant for default transition

* make groups work with new force on flag

* reorder light entity creation

* rearrange logic

* update test

* remove failed attempt at group light flag

* fix flag
2021-03-16 10:02:26 -04:00
Erik Montnemery
9647eeb2e0 Add custom JSONEncoder for automation traces (#47942)
* Add custom JSONEncoder for automation traces

* Add tests

* Update default case to include type

* Tweak

* Refactor

* Tweak

* Lint

* Update websocket_api.py
2021-03-16 14:21:05 +01:00
Erik Montnemery
5f2326fb57 Add support for light color modes (#47720)
* Add support for light color modes

* Update tests

* Update comments

* Fix bugs, add tests

* Suppress lint errors

* Don't suppress brightness when state is ambiguous

* Improve reproduce_state + add tests

* Add comment

* Change COLOR_MODE_* constants, rename COLOR_MODE_DIMMER to COLOR_MODE_BRIGHTNESS

* Fix tests

* Tweaks
2021-03-16 12:51:39 +01:00
Erik Montnemery
333e6a215a Add execute_script WS API (#47964)
* Add execute_script WS API

* Improve tests
2021-03-16 08:51:00 +01:00
Erik Montnemery
1cde1074c9 Correct trace for choose and repeat script actions (#47973)
* Correct trace for choose and repeat script actions

* only choose-wrap the choices

* Update tests

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-03-16 08:49:16 +01:00
Franck Nijhof
354c0a7fd1 Add reauthentication to Verisure (#47972)
* Add reauthentication to Verisure

* Update translations

* Correct translation step key

* Address pylint warning

* = is not :
2021-03-16 08:41:41 +01:00
Guido Schmitz
2230b03888 Add voltage device class to devolo Home Control (#47967) 2021-03-16 08:13:03 +01:00
SoCalix
0e368df023 Fix xmpp notify for muc rooms (#46715) 2021-03-16 02:07:54 +01:00
HomeAssistant Azure
c11b85af2f [ci skip] Translation update 2021-03-16 00:04:36 +00:00
Erik Montnemery
f82e59c32a Make it possible to list debug traces for a specific automation (#47744) 2021-03-15 16:51:04 -07:00
Franck Nijhof
5f627df6f8 Add devices to Verisure integration (#47913)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-03-15 23:59:41 +01:00
Franck Nijhof
9fd973d8e8 Move Verisure services to entity services (#47905) 2021-03-15 22:50:28 +01:00
Martin Hjelmare
40c12997ed Add zwave_js sensor humidity device class (#47953) 2021-03-15 20:51:24 +01:00
Franck Nijhof
059e9e8307 Add config flow to Verisure (#47880)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-03-15 12:30:44 -07:00
RadekHvizdos
9f4c2f6260 Add suggested_area to MQTT discovery (#47903)
* Add suggested_area to MQTT Discovery

This adds suggested_area to MQTT discovery, so that the discovered devices could be automatically added to the proper area.

* Add abbreviation for MQTT suggested_area

* Remove extra whitespace

* Remove extra whitespace #2

* Added tests for MQTT Dicovery of suggested_area

* Fix test for MQTT suggested_area

* Better tests of MQTT suggested_area

Changes made as per feedback from @emontnemery
2021-03-15 20:02:02 +01:00
Michael
07c197687f improve debug logging (#47858) 2021-03-15 19:42:13 +01:00
Joakim Sørensen
8b3dccb1b4 Use ClientTimeout for hassio send_command (#47957) 2021-03-15 11:31:34 -07:00
J. Nick Koston
28c80c1133 Ensure recorder purge tests can handle multiple purge cycle (#47956)
Since a purge can generate another purge task, we now wait for
three recorder queue completions by default.
2021-03-15 11:19:19 -07:00
Mick Vleeshouwer
9e05aa2d1f Update state translation strings for water_heater (#46588) 2021-03-15 18:20:10 +01:00
Nathan Tilley
93c38551d3 Implement Wake On Lan Dummy State (#47719)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-15 17:20:47 +01:00
Maciej Bieniek
8239fb76d1 Bump brother library (#47949) 2021-03-15 16:42:28 +01:00
Franck Nijhof
5d5a110a20 None optional hass typing in base entity and notify (#47528) 2021-03-15 15:11:41 +01:00
Martin Hjelmare
b9a26cf539 Add zwave_js dev docs readme (#47621) 2021-03-15 15:08:45 +01:00
David McClosky
37c53e0a04 Sort supported features in vlc_telnet (#46800) 2021-03-15 15:07:36 +01:00
Franck Nijhof
48808dc2ad Upgrade vsure to 1.7.3 (#47946) 2021-03-15 14:43:32 +01:00
Andre Lengwenus
50b7b1cc7a Migrate LCN configuration to ConfigEntry (Part 1) (#44090) 2021-03-15 13:45:13 +01:00
Aidan Timson
fb34d1a56e Clean up Lyric (#47899) 2021-03-15 13:06:57 +01:00
Colin O'Dell
b645dabd66 Upgrade qnapstats library to 0.3.1 (#47907)
Fixes #47674
2021-03-15 12:53:45 +01:00
Bram Kragten
87d62cbbb8 Fix target of WLED services (#47938) 2021-03-15 12:50:19 +01:00
Tobias Sauerwein
6b98583bc1 Add tests for Netatmo climate (#46392)
* Add tests for Netatmo climate

* Add comments and fake webhook events

* Split tests

* Split tests

* Clean up

* Fix coveragerc

* Fix requirements

* Remove freezegun dependency

* Move async_block_till_done to

* Call async_handle_webhook directly

* Use async_handle_webhook directly p2

* Exclude helper.py from

* Remove assertion of implementation details

* Use the webhook integration handler

* Extract function
2021-03-15 12:45:36 +01:00
Khole
cfeb8eb06a Add Hive config flow (#47300)
* Add Hive UI

* Fix tests and review updates

* Slimmed down config_flow

* Fix tests

* Updated Services.yaml with extra ui attributes

* cleanup config flow

* Update config entry

* Remove ATTR_AVAILABLE

* Fix Re-Auth  Test

* Added more tests.

* Update tests
2021-03-15 12:27:10 +01:00
starkillerOG
1aa4fd4cc9 Make Xiaomi Miio unavailable device independent (#47795)
* make unavailable independent

* fix data is None

* process review comments
2021-03-15 12:25:11 +01:00
starkillerOG
b2efcb3c22 Support all Xiaomi Miio gateway switches (#46657)
* Support all gateway switches

* fix checks

* process revieuw

* Update homeassistant/components/xiaomi_miio/switch.py

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

* generilize variable matching

* fix styling

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-15 12:15:34 +01:00
Drzony
99d1e3e71d MQTT Light: Use flash attribute in async_turn_off (#47919) 2021-03-15 11:24:07 +01:00
Paulus Schoutsen
7fe3c472e9 Improve bad JSON data reporting (#47932)
* Improve bad data reporting

* Fix tests

Co-authored-by: Erik <erik@montnemery.com>
2021-03-15 10:41:25 +01:00
Patrick Decat
9ec4c07753 Update openwrt-luci-rpc from 1.1.6 to 1.1.8 (#47848) 2021-03-14 22:57:56 -07:00
Brandon Rothweiler
fbf3225234 Address review comments and minor fix for Mazda integration (#47702)
* Address comments from code review

* Fix handling of missing sensor values

* Use default timeout for get_vehicles

* Fix test_update_auth_failure
2021-03-15 06:57:39 +01:00
Allen Porter
bcadccf7aa Invalidate HLS Stream on nest url refresh failure (#47869)
This will ensure that the HLS stream is re-created and fetches a new url.
2021-03-14 22:49:21 -07:00
unaiur
e91be3f9f5 Upgrade to maxcube-api-0.4.1 (#47910)
This new version implements a workaround for a hardware bug
that causes a factory reset of the full MAX! service.

See https://github.com/hackercowboy/python-maxcube-api/issues/12
for more details.
2021-03-14 22:45:14 -07:00
Maciej Bieniek
be2be4e867 Bump gios library (#47917) 2021-03-14 22:44:13 -07:00
Maciej Bieniek
0be1389cf4 Bump accuweather library (#47915) 2021-03-14 22:44:04 -07:00
J. Nick Koston
8795608ae3 Add suggested area support to august (#47930) 2021-03-14 22:42:49 -07:00
J. Nick Koston
15aa00d6cc Fix homekit checking for port cleanup too many times (#47836)
* Fix homekit checking for port cleanup too many times

The loop should have terminated as soon as the port was available

* coverage

* tweak homekit shutdown wait
2021-03-15 05:14:46 +01:00
J. Nick Koston
61a2460c87 Improve error reporting in recorder purge test (#47929) 2021-03-14 19:46:21 -07:00
Paulus Schoutsen
9dabc988fb Bump frontend to 20210314.0 2021-03-14 23:48:47 +00:00
Daniel Perna
d32c364d7f Update pyhomematic to 0.1.72 (#47906) 2021-03-14 18:52:47 +01:00
jugla
4d61f6f8c2 Reduce number of iqair request (#47890) 2021-03-14 09:04:08 -06:00
Daniel Hjelseth Høyer
fea944bcea Upgrade Tibber library to 0.16.2 (#47892) 2021-03-14 13:44:07 +01:00
starkillerOG
50b5fc4860 Add Xiaomi Miio subdevice lightbulb support (#46660)
* Xiaomi Miio: add subdevice lightbulb support

* fix tests

* process revieuw comments

* bump python-miio to 0.5.5

* bump python-miio to 0.5.5

* fix imports
2021-03-14 12:32:19 +01:00
Franck Nijhof
60838cf7ed Verisure: Remove JSONPath, unique IDs, small cleanups (#47870)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-14 10:38:09 +01:00
Aidan Timson
984f02882b Add HVAC action to Lyric climate platform (#47876) 2021-03-13 22:05:47 -10:00
Aidan Timson
47114c5f4f Update service config for lyric (#47857) 2021-03-13 22:04:49 -10:00
Martin Hjelmare
c53a462b3d Fix zwave_js preset mode lookup (#47851) 2021-03-13 22:27:05 +01:00
Alexei Chetroi
7d8eb49d88 Bump up ZHA dependency (#47873) 2021-03-13 16:06:07 -05:00
Pierre Ståhl
518c86a0ab Add device_info to Apple TV entities (#47837) 2021-03-13 10:39:04 -10:00
Aidan Timson
263023a152 Update aiolyric to v1.0.6 (#47871) 2021-03-13 10:32:38 -10:00
tdorsey
eddb97b6fd Fix spelling of automatically in roomba/lutron_caseta components (#47856) 2021-03-13 10:26:48 -10:00
Raman Gupta
c7b9a0715d Fix zwave_js preset supported feature (#47819) 2021-03-13 12:43:03 +01:00
Allen Porter
02a82d3f00 Add timeouts in stream tests to prevent possible hangs (#47545)
* Add timeouts on recving packets

Add a timeout when recving packets from the worker thread in case it hangs.
Add an exit condition just in case the while loop goes on forever.

* Add a timeout to recorder thread join.

* Wait for recorder thread to be invoked in tests

Remove the while loop and instead wait for segments to be produced by the background worker thread.

* Allow worker to resume before stopping to fix timeouts

* Lower test timeout further

* Remove test_stream_ended since it is flaky

This test doesn't really add additional value on top of other tests.
2021-03-13 01:53:26 -08:00
Raj Laud
30f99177c7 Fix missing integer cast in squeezebox config flow (#47846) 2021-03-13 08:34:20 +01:00
Paulus Schoutsen
eccdf85b29 Bump frontend to 20210313.0 (#47844) 2021-03-12 21:21:24 -08:00
David F. Mulcahey
547fd7d352 fix exception on device removal (#47803) 2021-03-12 21:06:37 -05:00
Erik Montnemery
2178e27fb4 Fix unclean shutdown of recorder test (#47791) 2021-03-12 14:17:27 -08:00
Paulus Schoutsen
6ed01463c3 Merge pull request #47835 from home-assistant/rc 2021-03-12 14:00:52 -08:00
Paulus Schoutsen
a024343a15 Bumped version to 2021.3.4 2021-03-12 21:01:15 +00:00
Tobias Sauerwein
926b0d8491 Fix Netatmo event handling (#47792) 2021-03-12 21:01:06 +00:00
J. Nick Koston
108d9eab1a Ensure homekit reset accessory service can target any entity (#47787) 2021-03-12 21:01:02 +00:00
jjlawren
72ef88693a Bump plexapi to 4.4.1 (#47766) 2021-03-12 21:00:59 +00:00
J. Nick Koston
81336809e8 Adjust insteon fan speed range to valid upper bound (#47765) 2021-03-12 21:00:55 +00:00
Chris
726eb69b40 Fix zwave_js target_temp_low (#47762) 2021-03-12 21:00:53 +00:00
mtl010957
544844d865 Cover Tilt Position Bugfix (#47682)
* Report tilt position properly when inverting using tilt_max < tilt_min

* Add warning per review comment

* Add test for inverted tilt position configuration

* Separate non-numeric and out of range warnings per review comment

* Fix out of range message and add tests for not numeric and out of range messages
2021-03-12 21:00:50 +00:00
Aaron Bach
ed37c31630 Write SimpliSafe alarm control panel state after arming/disarming (#47649)
* Write SimpliSafe alarm control panel state after arming/disarming

* Include locks
2021-03-12 21:00:49 +00:00
Tobias Sauerwein
07aeb8d160 Fix Netatmo event handling (#47792) 2021-03-12 12:57:02 -08:00
Hans Kröner
362e7226e9 Additional sensors for OpenWeatherMap (#47806) 2021-03-12 12:55:13 -08:00
Klaas Schoute
7826f6e3f8 Update cloud integration to 0.42.0 (#47818) 2021-03-12 12:52:43 -08:00
Robert Svensson
786cbcc1d6 Introduction of deCONZ websocket fixture (#47812) 2021-03-12 12:03:29 -08:00
Robert Svensson
6b03c8d126 Improve deCONZ init tests (#47825)
Use patch.dict rather than deep copy to change DECONZ_WEB_REQUEST
2021-03-12 12:02:15 -08:00
Robert Svensson
597bf67f5a UniFi has changed to not report uptime in epoch form (#47492) 2021-03-12 11:55:11 -08:00
Mick Vleeshouwer
9a98dcf432 Add HomeKit support for new CO / CO2 device class (#47737) 2021-03-12 09:03:47 -10:00
Charles Garwood
13cd2f52d8 Return property_key in zwave_js get_config_parameters websocket (#47808) 2021-03-12 13:49:59 -05:00
Erik Montnemery
3115bf9aab Add temperature sensor for gogogate2 wireless door sensor (#47754)
* Add temperature sensor for gogogate2 wireless door sensor

* Chain sensor generators
2021-03-12 19:04:56 +01:00
Michael
72cb1f5480 Add ambient sensors to nut integration (#47411) 2021-03-12 07:19:55 -10:00
Paulus Schoutsen
04b335afe9 Allow filtering the logbook by context_id (#47783) 2021-03-12 09:04:02 -08:00
Pierre Ståhl
bf5028df2b Bump pyatv to 0.7.7 (#47798)
* Bump pyatv to 0.7.7

* Change to assume name always exist in config entry
2021-03-12 16:19:14 +01:00
Erik Montnemery
514516bacc Remove unused COVER_SCHEMA from gogogate2 cover (#47170) 2021-03-12 13:52:46 +01:00
J. Nick Koston
40c28aa38a Ensure homekit reset accessory service can target any entity (#47787) 2021-03-12 11:41:01 +01:00
Guido Schmitz
6610e821bc Bump devolo_home_control_api to 0.17.0 (#47790) 2021-03-12 11:37:39 +01:00
Paulus Schoutsen
ff94e920e4 Do not use AsyncTrackStates (#47255) 2021-03-11 23:18:09 -08:00
Paulus Schoutsen
2a22c54fcb Store the correct context in the trace (#47785) 2021-03-12 08:12:26 +01:00
MatsNl
fa0c544bf5 Improve Atag integration and bump version to 0.3.5.3 (#47778)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-03-11 22:15:45 -08:00
J. Nick Koston
f4b775b125 Cleanup homekit and remove aid storage from hass.data (#47488) 2021-03-11 22:05:03 -08:00
J. Nick Koston
33c4eb3434 Log the full exception when the recorder fails to setup (#47770) 2021-03-11 21:52:04 -08:00
James Nimmo
7f60edd7e7 Bump pyIntesisHome to v1.7.6 (#47500) 2021-03-11 21:39:44 -08:00
J. Nick Koston
e2f0b18427 Adjust insteon fan speed range to valid upper bound (#47765) 2021-03-11 21:35:24 -08:00
Felipe Martins Diel
9ca0cd5464 Bump broadlink from 0.16.0 to 0.17.0 (#47779) 2021-03-11 21:34:56 -08:00
Marc Mueller
92852b9c10 Add apply_filter attribute to recorder.purge service (#45826) 2021-03-11 17:03:30 -10:00
Franck Nijhof
66605b5994 Upgrade adguardhome to v0.5.0 (#47774) 2021-03-12 00:37:34 +01:00
jjlawren
daab9f9810 Bump plexapi to 4.4.1 (#47766) 2021-03-12 00:35:11 +01:00
Chris
7ca5e969cc Fix zwave_js target_temp_low (#47762) 2021-03-12 00:28:38 +01:00
Henning Claßen
3ebc262b7f Upgrade numato-gpio to 0.10.0 (#47539)
This adds support for devices sending '\n\r' end-of-line sequences.
2021-03-11 22:54:27 +01:00
Philip Allgaier
4bafd03dff Consistent spelling of "PIN" (#47771) 2021-03-11 16:18:16 -05:00
Erik Montnemery
14ff6d4d1f Update integrations p-s to override extra_state_attributes() (#47759) 2021-03-11 21:23:20 +01:00
Erik Montnemery
1fc8e32d86 Update integrations t-z to override extra_state_attributes() (#47760) 2021-03-11 20:16:26 +01:00
Erik Montnemery
14a59d290a Update integrations j-o to override extra_state_attributes() (#47758) 2021-03-11 20:11:25 +01:00
Franck Nijhof
1095905f8c Add DataUpdateCoordinator to Verisure (#47574) 2021-03-11 19:41:01 +01:00
Marc Mueller
10848b9bdf Recorder improvements (#47739) 2021-03-11 07:52:07 -10:00
Erik Montnemery
af4d06b12e Update integrations f-i to override extra_state_attributes() (#47757) 2021-03-11 16:57:47 +01:00
Erik Montnemery
6c084ae6ce Update integrations a-e to override extra_state_attributes() (#47756) 2021-03-11 16:51:03 +01:00
Aaron Bach
f92b75cbb2 Write SimpliSafe alarm control panel state after arming/disarming (#47649)
* Write SimpliSafe alarm control panel state after arming/disarming

* Include locks
2021-03-11 15:22:35 +01:00
starkillerOG
cf4954fead Add Xiaomi Miio light config flow (#47161)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-11 14:09:21 +01:00
mtl010957
b162c45e0a Cover Tilt Position Bugfix (#47682)
* Report tilt position properly when inverting using tilt_max < tilt_min

* Add warning per review comment

* Add test for inverted tilt position configuration

* Separate non-numeric and out of range warnings per review comment

* Fix out of range message and add tests for not numeric and out of range messages
2021-03-11 13:49:10 +01:00
Kristian Heljas
9e487eb260 Hoist mqtt name property and add icon support to MqttEntity (#47165)
* hoist common MqttEntity properties

* remove default name for MqttEntity

Default naming is sensible enough

* disable overriding common MqttEntity schema

* merge common MqttEntity schemas into MQTT_ENTITY_COMMON_SCHEMA
2021-03-11 13:42:13 +01:00
starkillerOG
724574d336 Add Xiaomi Miio sensor config flow (#46964)
* add config flow

* fix styling

* Add air_quality platform

* fix imports

* fix black

* Update homeassistant/components/xiaomi_miio/sensor.py

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

* Update homeassistant/components/xiaomi_miio/air_quality.py

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

* process revieuw feedback

* remove unused import

* fix formatting

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-11 11:48:48 +01:00
Erik Montnemery
b9c2f80cab Fix light brightness_step on multiple entities (#47746)
* Fix light brightness_step on multiple entities

* Fix comment

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-11 11:46:32 +01:00
Philip Allgaier
7e615cb7fd Fixed string typos in Lutron and Roomba (#47745) 2021-03-11 10:16:52 +01:00
J. Nick Koston
9a686d148e Ensure startup can proceed when there is package metadata cruft (#47706)
If a package fails to install or partially installed importlib
version can return None. We now try pkg_resources first, then
try importlib, and handle the case where version unexpectedly
returns None
2021-03-10 21:12:02 -10:00
Paulus Schoutsen
00bd591238 Verify get_zones webhook works (#47741) 2021-03-11 01:08:12 +01:00
Erik Montnemery
a9a9e1f199 Tweak automation tracing (#47721) 2021-03-10 14:42:13 -08:00
hung2kgithub
15da1c4785 Add missing clear-night weather condition (#47666) 2021-03-10 10:48:06 -10:00
Matthias Alphart
54a9b69ecb Update xknx to 0.17.2 (#47732) 2021-03-10 10:32:22 -10:00
Álvaro Fernández Rojas
ff09643b33 Add Tado weather support (#44807) 2021-03-10 10:31:37 -10:00
Franck Nijhof
10535018cc Improve HomeKit discovered Hue config flow (#47729) 2021-03-10 11:20:51 -08:00
Paulus Schoutsen
3ad4c26f98 Allow SSDP discovery modern Hue hubs (#47725) 2021-03-10 19:21:51 +01:00
Mike Keesey
78c974d527 Refactor Harmony tests to better follow Home Assistant conventions (#47141) 2021-03-10 08:19:04 -10:00
CurrentThread
7c8851264f Use LONGTEXT column instead of TEXT for MySQL/MariaDB and migrate existing databases (#47026) 2021-03-10 08:12:58 -10:00
David Bonnes
2103335323 Bump incomfort client to 0.4.4 (#47718)
* bump incomfort client

* bump client to 0.4.4

* restore launch.json
2021-03-10 18:58:37 +01:00
David Bonnes
d53f1e98ac bump client library (#47722) 2021-03-10 18:58:04 +01:00
Mick Vleeshouwer
461e766a93 Add device class CO2 to various integrations (#47676)
* Add device class CO2 to Fibaro

* Add device class CO2 to Awair

* Add device class CO2 to Tasmota

* Add device class CO2 to Netatmo

* Add device class CO2 to Ambient Station

* Update Tasmota tests

* Remove icon
2021-03-10 12:52:55 +01:00
Álvaro Fernández Rojas
5bc0e9a50f Fix aemet temperatures with a value of 0 (#47680)
* aemet: catch TypeError exceptions

format_float() and format_int() should also catch possible TypeError
exceptions.

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

* aemet: correctly parse temperatures with a value of 0

Right now, when a temperature with a value of 0 is provided by the API, the if
condition isn't satisfied, return None instead of 0.

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

* aemet: group format int/float exceptions

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2021-03-10 10:25:04 +01:00
dependabot[bot]
5c70dd8ab4 Bump codecov/codecov-action from v1.2.1 to v1.2.2 (#47707)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from v1.2.1 to v1.2.2.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/master/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v1.2.1...1f8f3abcccf7960749744fd13547965f0e7d1bdd)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-03-10 09:40:03 +01:00
Paulus Schoutsen
a50e9812cb Fix automations with traces. (#47705) 2021-03-09 22:40:17 -08:00
Erik Montnemery
704000c049 Add support for breakpoints in scripts (#47632) 2021-03-09 21:23:11 -08:00
Sam Steele
bf64421be9 Use the local timezone when parsing Todoist due dates (#45994) 2021-03-09 20:52:32 -08:00
Franck Nijhof
62e49e545b Add confirm only for Elgato (#47684) 2021-03-10 01:53:00 +01:00
Matt Zimmerman
7840db0598 Restore switch.turn_on and switch.turn_off functionality for SmartTub pumps (#47586)
Revert "Remove turn_on and turn_off from SmartTub pump switches (#47184)"

This reverts commit bab66a5cb9.
2021-03-10 01:26:54 +01:00
J. Nick Koston
a060acc2b1 Fix recorder with MSSQL (#46678)
Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
2021-03-09 11:16:19 -10:00
Paulus Schoutsen
46e593485e Handle zeroconf updated events (#47683) 2021-03-09 10:14:00 -10:00
Paulus Schoutsen
ed679b263b Improve logging elgato (#47681) 2021-03-09 19:52:53 +01:00
Erik Montnemery
fd1add8f15 Rename AutomationTrace.runid to AutomationTrace.run_id (#47669) 2021-03-09 15:49:41 +01:00
Marc Mueller
0c61cb555c Add TYPE_CHECKING to coverage excludes (#47668) 2021-03-09 14:57:44 +01:00
Erik Montnemery
84226da404 Update tests i-o to use async_get() instead of async_get_registry() (#47653) 2021-03-09 14:32:08 +01:00
Erik Montnemery
87e7cebd36 Update tests c-h to use registry async_get (#47652) 2021-03-09 14:31:17 +01:00
Erik Montnemery
ba2978c693 Update tests p-s to use async_get() instead of async_get_registry() (#47654) 2021-03-09 14:28:32 +01:00
Erik Montnemery
b3fecb1c95 Update tests t-z to use async_get() instead of async_get_registry() (#47655) 2021-03-09 14:25:03 +01:00
Erik Montnemery
78b21b1ad1 Update tests a-b to use async_get() instead of async_get_registry() (#47651) 2021-03-09 14:24:34 +01:00
Erik Montnemery
3a054c3be7 Replace Entity.device_state_attributes with Entity.extra_state_attributes (#47304) 2021-03-09 13:58:43 +01:00
Shay Levy
19f67335ec Revert Shelly temperature sensor name change (#47664) 2021-03-09 13:45:58 +01:00
Paulus Schoutsen
34b9e6f6fc Shelly: set confirm only (#47608) 2021-03-09 13:13:43 +01:00
Michael
8e58c3aa7b Add error message to options flow if connection fails for nut integration (#46972) 2021-03-08 14:12:52 -10:00
J. Nick Koston
5d7b53603f Harmony: set confirm only (#47617) 2021-03-08 15:44:55 -08:00
J. Nick Koston
1dd35ff059 Catch dhcp setup permission errors sooner (#47639)
This solves an unexpected thread exception on macs when running as
a user intead of root
2021-03-08 15:15:22 -08:00
unaiur
10eca5b986 Fix maxcube thermostat transition from off to heat mode (#47643)
Transition from HVAC_MODE_OFF to HVAC_MODE_HEAT are not executed because
target temperature is kept at OFF_TEMPERATURE, turning it into a no-op.

This change ensures that we increase the target temperature to at least
the minimum temperature when transitioning to HVAC_MODE_HEAT mode.
2021-03-08 15:14:24 -08:00
Raman Gupta
797ee81fc9 Update zwave_js supported features list to be static (#47623) 2021-03-08 15:11:54 -08:00
J. Nick Koston
d9ffb65898 Fix insteon fan speeds (#47603) 2021-03-08 14:20:21 -08:00
J. Nick Koston
6af754a7d3 Fix turning off scene in homekit (#47604) 2021-03-08 14:19:05 -08:00
Franck Nijhof
efe415f225 Upgrade aiohttp to 3.7.4.post0 (#47627) 2021-03-08 23:18:55 +01:00
Franck Nijhof
fbf8b68488 Upgrade sentry-sdk to 1.0.0 (#47626) 2021-03-08 23:13:18 +01:00
Diogo Gomes
ee25723468 Add option to reverse switch behaviour in KMTronic (#47532) 2021-03-08 22:56:24 +01:00
Oliver
520c4a8ee3 Update attrs to 20.3.0 (#47642) 2021-03-08 11:49:54 -10:00
Erik Montnemery
ea4f3e31d5 Include changed variables in automation trace (#47549)
* Include changed variables in automation trace

* Deduplicate some code

* Tweak

* Apply suggestions from code review

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

* Fix format

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-03-08 22:48:36 +01:00
Philip Allgaier
665e2c3473 Ensure bond light follows proper typing (#47641) 2021-03-08 21:53:44 +01:00
Shay Levy
215ab5fd40 Add type hints to LightEntity (#47024) 2021-03-08 21:21:45 +01:00
Erik Montnemery
a243adc551 Add WS command to get a summary of automation traces (#47557)
* Add WS command to get a summary of automation traces

* Update tests

* Correct rebase mistake, update tests
2021-03-08 20:30:52 +01:00
uvjustin
d9bf63103f Fix I-frame interval in stream test video (#47638) 2021-03-08 11:23:57 -08:00
Paulus Schoutsen
67effbc8c4 Config flow to allow marking itself as confirm only (#47607) 2021-03-08 10:54:51 -08:00
J. Nick Koston
573c40cb11 Ensure bond devices recover when wifi disconnects and reconnects (#47591) 2021-03-08 10:44:28 -08:00
J. Nick Koston
b315fcab11 Fix turn on without speed in homekit controller (#47597) 2021-03-08 10:43:22 -08:00
ollo69
32476a3fed Fix AsusWRT wrong api call (#47522) 2021-03-08 10:34:12 -08:00
Tony Roman
f9e33a4a0d Allow running and restarting with both ozw and zwave active (#47566)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-08 10:26:08 -08:00
J. Nick Koston
65776ef980 Remove self as code owner for mylink (#46242)
Sadly these devices turn out to be so unreliable that I
gave up on them and replaced them with bond (bondhome.io)
devices which have been rock solid
2021-03-08 07:40:39 -10:00
J. Nick Koston
9d14ff8105 Add suggested_area support to Apple TV (#47015) 2021-03-08 07:39:57 -10:00
Czapla
8018097c54 Add title key to allow mobile app title translation to other languages (#46593) 2021-03-08 18:37:37 +01:00
J. Nick Koston
53952b9662 Ensure template fan value_template always determines on state (#47598) 2021-03-08 18:34:34 +01:00
Erik Montnemery
8fe51b8ea7 Store automation traces indexed by run_id (#47509)
* Store traces indexed by run_id

* Format

* Add test

* Add test

* Clarify comment
2021-03-08 18:04:41 +01:00
B-Hartley
ee2658f9e6 Add (some) of ZCL concentration clusters to ZHA component (#47590)
* Update registries.py

Add concentration clusters recently added to zigpy

* Update measurement.py

Add concentration clusters recently added to ZigPy

* Update sensor.py

Add concentration clusters recently added to ZigPy

* Update sensor.py

remove unnecessary tabs

* Update measurement.py

remove unnecessary tabs

* Update sensor.py

Just adding CO and CO2 for now.

* Update registries.py

Just adding CO2 and CO for now.

* Update measurement.py

Just adding CO2 and CO for now

* Update sensor.py

import const CONCENTRATION_PARTS_PER_MILLION

* Update registries.py

removed trailing whitespace

* Update sensor.py

added extra blank lines and removed trailing whitespace

* Update measurement.py

added extra blank lines and removed trailing whitespace

* Update sensor.py

add device classes for CO and CO2
2021-03-08 11:22:13 -05:00
Shay Levy
24db0ff956 Fix Shelly logbook exception when missing COAP (#47620) 2021-03-08 15:59:54 +01:00
Franck Nijhof
197687399d Upgrade pillow to 8.1.2 (#47619) 2021-03-08 14:26:52 +01:00
Matt Zimmerman
9774ada4aa Code cleanup for SmartTub integration (#47584) 2021-03-08 14:05:39 +01:00
Evgeny
cf507b51cb Add feels like temperature sensor to OpenWeatherMap (#47559) 2021-03-08 13:51:26 +01:00
Alexei Chetroi
f3c71a69f0 Allow 10mV precision for ZHA battery sensor entities (#47520) 2021-03-08 07:37:33 -05:00
Adam Ernst
ad86eb4be3 Add support for Flo "pucks" (#47074)
So far the Flo integration only supports shutoff valves. Add support for Flo leak detector pucks, which measure temperature and humidity in addition to providing leak alerts.
2021-03-08 07:36:03 -05:00
Franck Nijhof
d37fb7d88d Upgrade pre-commit to 2.11.0 (#47618) 2021-03-08 13:03:39 +01:00
Franck Nijhof
457db1d0c3 Upgrade elgato to 2.0.1 (#47616) 2021-03-08 12:57:27 +01:00
Chris Talkington
597d8eaa4c Update rokuecp to 0.8.1 (#47589) 2021-03-08 12:15:08 +01:00
dependabot[bot]
629700c97c Bump actions/stale from v3.0.17 to v3.0.18 (#47612)
Bumps [actions/stale](https://github.com/actions/stale) from v3.0.17 to v3.0.18.
- [Release notes](https://github.com/actions/stale/releases)
- [Commits](https://github.com/actions/stale/compare/v3.0.17...3b3c3f03cd4d8e2b61e179ef744a0d20efbe90b4)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-03-08 10:37:42 +01:00
Raman Gupta
1d387e12cc Add fallback zwave_js entity name using node ID (#47582)
* add fallback zwave_js entity name using node ID

* add new fixture and test for name that was failing
2021-03-08 09:08:17 +01:00
Bram Kragten
683425876f Update frontend to 20210302.6 (#47592) 2021-03-07 21:45:15 -08:00
Alex
a066f84828 Remove @newAM from hdmi_cec codeowners (#47542) 2021-03-07 12:49:13 -05:00
Austin Mroczek
7050c71524 Round miles in myChevy sensors (#46879) 2021-03-07 07:46:14 -10:00
Diogo Gomes
d3bd2378ba Correct weather entities forecast time (#47565) 2021-03-07 16:07:02 +01:00
Martin Hjelmare
d85d1a65a7 Fix mysensors unload clean up (#47541) 2021-03-07 14:20:21 +01:00
tkdrob
13d4d7039e Clean up kmtronic (#47537) 2021-03-07 14:15:43 +01:00
tkdrob
07fd1b3b43 Clean up Lutron Caseta (#47534) 2021-03-07 14:14:15 +01:00
Jan-Philipp Litza
4018d0a152 Correctly close lacrosse on homeassistant stop (#47555)
Since lacrosse.close() takes no arguments, but was directly added as a
listener to EVENT_HOMEASSISTANT_STOP, the following occured on shutdown:

Traceback (most recent call last):
  File "/usr/lib/python/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
TypeError: close() takes 1 positional argument but 2 were given
2021-03-07 13:53:48 +01:00
Robert Svensson
48f1a55a28 Improve common structure in UniFi device tracker tests (#47526) 2021-03-07 13:20:04 +01:00
Anders Melchiorsen
c8c394ef91 Increase ESPHome log level on first connection failure (#47547) 2021-03-07 11:36:28 +01:00
J. Nick Koston
0d07dae3bc Change default homekit ports to 21063 and 21064 (#47491)
We previously used a value in the linux default ephemerial port range
which meant that if something else happened to use that port HomeKit
would not start up.  We now use a value below 32768 to ensure that
the port is not randomly unavailable
2021-03-06 21:41:56 -10:00
J. Nick Koston
2e89f152ba Bump HAP-python to 3.4.0 (#47476)
* Bump HAP-python to 3.3.3

* bump

* fix mocking
2021-03-07 01:30:57 +01:00
Alexei Chetroi
79b5ca9415 Add device classes for CO and CO2 measurements (#47487) 2021-03-07 00:52:43 +01:00
N1c093
9101ed2732 Add precipitation probability forecast to owm (#47284)
* Add precipitation probability forecast to owm

* Update weather_update_coordinator.py

Reformat the code based on black
2021-03-07 00:48:22 +01:00
Martin Hjelmare
f542b360d5 Fix mysensors device tracker (#47536) 2021-03-06 23:41:43 +01:00
Franck Nijhof
b01a6367cc Complete typing on AdGuard Home integration (#47477) 2021-03-06 23:19:03 +01:00
Martin Hjelmare
d944bbbc52 Bump pymysensors to 0.21.0 (#47530) 2021-03-06 23:06:50 +01:00
Martin Hjelmare
1600207f5c Fix mysensors notify platform (#47517) 2021-03-06 18:33:55 +01:00
Nathan Spencer
e9052233a6 Adjust litterrobot tests and code to match guidelines (#47060)
* Use SwitchEntity instead of ToggleEntity and adjust test patches as recommended

* Move async_create_entry out of try block in config_flow

* Patch pypi package instead of HA code

* Bump pylitterbot to 2021.2.6, fix tests, and implement other code review suggestions

* Bump pylitterbot to 2021.2.8, remove sleep mode start/end time from vacuum, adjust and add sensors for sleep mode start/end time

* Move icon helper back to Litter-Robot component and isoformat times on time sensors
2021-03-06 17:28:33 +01:00
uvjustin
14f85d8731 Disable audio stream when ADTS AAC detected (#47441)
* Disable audio stream when ADTS AAC detected

* Use context manager for memoryview

* Fix tests

* Add test

* Fix tests

* Change FakePacket bytearray size to 3
2021-03-06 16:40:49 +01:00
Erik Montnemery
2f9d03d115 Merge action and condition traces (#47373)
* Merge action and condition traces

* Update __init__.py

* Add typing to AutomationTrace

* Make trace_get prepare a new trace by default

* Correct typing of trace_cv

* Fix tests
2021-03-06 12:57:21 +01:00
Ville Skyttä
022184176a Upgrade upcloud-api to 1.0.1 (#47501)
https://github.com/UpCloudLtd/upcloud-python-api/releases/tag/0.4.6
https://github.com/UpCloudLtd/upcloud-python-api/releases/tag/v1.0.0
https://github.com/UpCloudLtd/upcloud-python-api/releases/tag/v1.0.1
2021-03-06 12:36:20 +01:00
FidgetyRat
4cade4b736 Add OPENING & CLOSING state to MySensors cover (#47285)
* Added OPENING & CLOSING State Support

Added support for OPENING and CLOSING states using a combination of
the required V_ variables. Simplified the determination of the
cover's state by use of a new enumeration and single method allowing
the state to be used by all three HomeAssistant query methods.

* Fixes for HomeAssistant Style

Corrections to style to allow flake8, isort, and black to pass.

* Peer Review Changes

Added @unique to the main enumeration. Removed unnecessary parens from
door state logic. Reordered CLOSING and CLOSED in the enumeration.
2021-03-06 10:26:04 +01:00
Anders Melchiorsen
c7718f2b3b Fix Sonos polling mode (#47498) 2021-03-06 10:21:00 +01:00
Franck Nijhof
10dae253e5 Complete typing on Verisure integration (#47482) 2021-03-05 15:37:56 -08:00
Paulus Schoutsen
4c181bbfe5 Raise error instead of crashing when template passed to call service target (#47467) 2021-03-05 15:34:18 -08:00
Franck Nijhof
8f31b09b55 Complete typing on TwenteMilieu integration (#47480) 2021-03-05 15:33:26 -08:00
Phil Bruckner
2472dad1fa Bump amcrest package version to 1.7.1 (#47483) 2021-03-05 15:05:36 -08:00
ollo69
292f4262aa Move AsusWrt sensors update logic in router module (#46606) 2021-03-05 23:40:04 +01:00
Alexei Chetroi
a12b98e30e Update ZHA dependencies (#47479) 2021-03-05 17:01:54 -05:00
Robert Svensson
50d3aae418 Improve restoring UniFi POE entity state (#47148)
* Improve restoring data and better handling when the restore data is empty
Improve readability of some logic related to POE clients

* There is no need to check clients_all in Switch platform

* Add better tests when restoring state

* Port except handling shouldn't be needed anymore

* Walrusify get_last_state
2021-03-05 22:09:05 +01:00
Franck Nijhof
02e723f206 Typing tweak to the Elgato integration (#47471) 2021-03-05 21:48:02 +01:00
Tobias Sauerwein
b3c33fc1be Fix issue at Netatmo startup (#47452) 2021-03-05 21:41:55 +01:00
Robert Svensson
793929f2ea Increase test coverage of UniFi integration (#46347)
* Increase coverage of init

* Increase coverage of config_flow

* Improve coverage of controller

* Minor improvement to switch test

* Fix review comment

* Mock websocket class

* Replace the rest of the old websocket event tests

* Improve websocket fixture for cleaner tests

* Fix typing

* Improve connection state signalling based on Martins feedback

* Improve tests of reconnection_mechanisms based on Martins review comments

* Fix unload entry

* Fix isort issue after rebase

* Fix martins comment on not using caplog

* Fix wireless clients test

* Fix martins comments on wireless clients test
2021-03-05 21:28:41 +01:00
Emily Mills
7c08592b5a Convert kulersky to use new async backend (#47403) 2021-03-05 14:24:55 -06:00
Raman Gupta
6debf52e9b Update zwave_js.refresh_value service description (#47469) 2021-03-05 20:57:06 +01:00
Franck Nijhof
61be29117d Deprecate HomeKit auto start (#47470) 2021-03-05 11:51:49 -08:00
mvn23
ab0a5bccab Update pyotgw to 1.1b1 (#47446) 2021-03-05 20:22:40 +01:00
functionpointer
a2ee7d598b Use conn_made callback in MySensors (#47463) 2021-03-05 20:21:24 +01:00
Emily Mills
a547d0fea2 Prevent Zerproc leaving open unnecessary connections (#47401)
* Zerproc: Prevent leaving open unnecessary connections

* Fix config entry unloading
2021-03-05 13:14:03 -06:00
tkdrob
3baeed3684 Clean up constants (#47323) 2021-03-05 19:08:04 +01:00
Franck Nijhof
cc99fd5e32 Fix Hue scene overriding Hue default transition times (#47454) 2021-03-05 09:43:26 -08:00
Joakim Plate
f2a2dbb561 Bump version with fix for v1 (#47458) 2021-03-05 09:42:20 -08:00
Bram Kragten
a6c5e79de2 Update frontend to 20210302.5 (#47462) 2021-03-05 09:42:08 -08:00
Raman Gupta
cad5e67588 Bump zwave-js-server-python to 0.21.1 (#47464) 2021-03-05 09:41:36 -08:00
Anders Melchiorsen
79ebe930e3 Limit log spam by ESPHome (#47456) 2021-03-05 16:16:07 +01:00
uvjustin
864380e77c Add allenporter to stream codeowners (#47431) 2021-03-05 15:51:07 +01:00
Paul Dee
6a4b755faf Spellcheck on Synology component (#47451) 2021-03-05 15:36:07 +01:00
Martin Hjelmare
0350a6ed21 Only create snapshot if add-on update will be done (#47424) 2021-03-04 16:38:33 -08:00
Raman Gupta
ee69e93b46 Bump zwave-js-server-python to 0.21.0 (#47408)
Co-authored-by: Tobias Sauerwein <cgtobi@users.noreply.github.com>
2021-03-04 16:15:50 -08:00
Christophe Painchaud
a1faba29f0 Fix RFLink TCP KeepAlive error log (#47395) 2021-03-05 01:09:54 +01:00
Cooper Dale
35d5522e79 Fix typo in docs link for forked_daapd (#47413)
corrected link to existing site
2021-03-05 00:58:42 +01:00
Tobias Sauerwein
c3bddc0fa6 Update browse_media.py (#47414) 2021-03-04 23:35:39 +01:00
Martin Hjelmare
682943511a Make zwave_js add-on manager more flexible (#47356) 2021-03-04 14:14:24 -08:00
Petru Paler
7ed80d6c39 Update Solax library to 0.2.6 (#47384) 2021-03-04 22:29:19 +01:00
Franck Nijhof
6f7179dce9 Fix older Roborock models (#47412) 2021-03-04 13:27:59 -08:00
Raman Gupta
74746125ce Fix Climacell timezone issue with daily forecasts (#47402) 2021-03-04 13:21:56 -08:00
Aaron Bach
fa8ded5ad8 Fix AirVisual exception when config entry contains old integration type (#47405) 2021-03-04 13:20:08 -08:00
Raman Gupta
972baa2ce4 Don't convert Climacell forecast temperatures to celsius because platform does it automatically (#47406) 2021-03-04 13:15:27 -08:00
Sebastian Muszynski
541e166317 Fix measurement unit (Closes: #47390) (#47398) 2021-03-04 13:12:04 -08:00
Martin Hjelmare
5ced7395f3 Fix access of missing zwave_js climate unit value (#47380) 2021-03-04 13:11:38 -08:00
Martin Hjelmare
d64fe6ea32 Fix zwave_js manual reconfiguration of add-on managed entry (#47364) 2021-03-04 13:11:07 -08:00
Bram Kragten
cea4808db8 Update frontend to 20210302.4 (#47383) 2021-03-04 13:09:51 -08:00
Franck Nijhof
7a8b7224c8 Don't raise on known non-matching states in numeric state condition (#47378) 2021-03-04 13:09:08 -08:00
Eric Severance
f05f60c4c4 Revert "Speed-up wemo discovery (#46821)" (#47392)
This reverts commit 6e52b26c06.
2021-03-04 13:07:42 -08:00
J. Nick Koston
62d8e47c51 Map silent as a preset mode for fan backcompat (#47396)
The original change did not map silent as a preset mode
because it was not clear if it was a speed or a preset.
2021-03-04 13:02:50 -08:00
starkillerOG
b58f9ce33a Fix Xiaomi Miio setup of switch entity for lumi.acpartner.v3 (#47345) 2021-03-04 21:53:09 +01:00
Anders Melchiorsen
b49a672fd5 Catch ConditionError in generic_thermostat climate (#47359) 2021-03-04 21:47:24 +01:00
Franck Nijhof
208a104e96 Fix secrets in files included via include_dir_list (#47350) 2021-03-04 09:33:35 -08:00
Erik Montnemery
17401cbc29 Initial automation tracing (#46755)
* Initial prototype of automation tracing

* Small fixes

* Lint

* Move trace helpers to its own file

* Improve trace for state and numeric_state conditions

* Tweaks + apply suggestions from code review

* Index traces by automation_id, trace while script is running

* Refactor condition tracing

* Improve WS API to get traces for single automation

* Add tests

* Fix imports

* Fix imports

* Address review comments

* Cap logging of loops

* Remove unused ContextVar action_config
2021-03-04 14:16:24 +01:00
Chris
6d478804e7 Add LZW36 device schema to zwave_js discovery (#47314)
* Add LZW26 device schema to discovery

Co-authored-by: @kpine

* Update homeassistant/components/zwave_js/discovery.py

Co-authored-by: kpine <keith.pine@gmail.com>

* Add tests

* Fix test

Co-authored-by: kpine <keith.pine@gmail.com>
2021-03-04 00:32:37 +01:00
tkdrob
53e62a897b Fix grammar in pi_hole logs (#47324) 2021-03-04 00:20:35 +01:00
Paulus Schoutsen
e6a6b2a680 Simplify switch light (#47317) 2021-03-03 10:13:04 -08:00
Erik Montnemery
504e5b77ca Improve behaviour when disabling or enabling config entries (#47301) 2021-03-03 10:12:37 -08:00
Joakim Plate
7626aa5c94 Philips JS correct post review comments (#47247) 2021-03-03 18:51:58 +01:00
Martin Hjelmare
099c9c59cb Fix Supervisor platform coordinator data lookup (#47308) 2021-03-03 14:37:36 +01:00
Bram Kragten
c192a44e87 Update frontend to 20210302.3 (#47310) 2021-03-03 14:35:58 +01:00
Nick Adams
cc72cf0c0d Update izone services.yaml and remove entity_id from schema. (#47305)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2021-03-03 11:51:40 +01:00
Erik Montnemery
b147ba1377 Correct gogogate2 battery sensor attributes (#47302) 2021-03-03 10:20:48 +01:00
Milan Meulemans
8f3c2573e2 Remove name from keenetic-ndms2 strings (#47113) 2021-03-03 10:12:26 +01:00
Matt Zimmerman
9022b90945 bump python-smarttub to 0.0.19 (#47294) 2021-03-03 07:04:17 +01:00
J. Nick Koston
32fe4fa378 Add activity properties to remote entity model (#47237) 2021-03-02 17:57:36 -10:00
Raman Gupta
6019bcf9d1 Correct climacell device info (#47292) 2021-03-03 01:55:10 +01:00
Matthias Alphart
ce8871ef59 KNX remove custom deprecation warnings (#47238) 2021-03-03 00:50:40 +01:00
Martin Hjelmare
d3721bcf26 Add zwave_js add-on manager (#47251)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-03-02 14:22:42 -08:00
Raman Gupta
e443597b46 Bump zwave-js-server-python to 0.20.1 (#47289) 2021-03-02 23:09:50 +01:00
Raman Gupta
c327f3fc42 Convert climacell forecast timestamp to isoformat so that UI shows the right times (#47286) 2021-03-02 13:25:09 -08:00
Raman Gupta
42af775f53 Add raw values to zwave_js value notification event (#47258)
* add value_raw to value notification event that always shows the untranslated state value

* add property key and property to event params
2021-03-02 16:10:30 -05:00
Tobias Sauerwein
d20659d2ee Fix issue when setting boost preset for a turned off Netatmo thermostat (#47275) 2021-03-02 13:02:59 -08:00
Franck Nijhof
1926941d8e Upgrade pillow to 8.1.1 (#47223) 2021-03-02 13:02:41 -08:00
Paulus Schoutsen
2df644c6cc Clean up secret loading (#47034) 2021-03-02 12:58:53 -08:00
Simone Chemelli
17444e2f2f Limit log spam by ConfigEntryNotReady (#47201) 2021-03-02 12:50:28 -08:00
Quentame
198ecb0945 Uniformize platform setup (#47101)
* A platform is not a component

* Fix dynalite

* SUPPORTED_PLATFORMS --> PLATFORMS

* In tests

* In tests 2

* Fix SmartThings

* Fix ZHA test

* Fix Z-Wave

* Revert Z-Wave

* Use PLATFORMS const in ambient_station

* Fix ihc comment
2021-03-02 21:43:59 +01:00
Quentame
ca54de095d Add disk sensor to Freebox (#46689)
* Add disk sensor to Freebox

* Add debug logging into sensors

* Remove useless sensor[X] assignement in disk sensor
2021-03-02 21:23:02 +01:00
Ville Skyttä
b0c873dd34 Upgrade isort to 5.7.0 (#47279)
https://pycqa.github.io/isort/CHANGELOG/#570-december-30th-2020
2021-03-02 21:16:11 +01:00
Alexei Chetroi
7ef174fb5e Update ZHA dependencies (#47282) 2021-03-02 21:12:30 +01:00
Aaron Bach
112b039107 Bump simplisafe-python to 9.6.9 (#47273) 2021-03-02 12:19:04 -07:00
Bram Kragten
8e80e428d0 Update frontend to 20210302.0 (#47278) 2021-03-02 20:15:09 +01:00
Rene Lehfeld
2272925699 Add force_update to tasmota sensors (#47052)
* Add force update also to non-binary sensors as e.g. POWER Measurement agerage cannot be calculated otherwise. This is the same behavior as set with the obsolete tasmota detection

* add tests in binary_sensor and test_sensor for force_update flag

* satisfy flake8

* next try for force_update test but this time on the entity object which is the correct level

* once again satisfy flake8

* one more try for a test

* fix typo

* satisfy black
2021-03-02 18:57:14 +01:00
Franck Nijhof
4904207f77 Fix izone flake8 error (#47276) 2021-03-02 16:58:02 +01:00
Paulus Schoutsen
2ebca88950 Fix Alexa doorbells (#47257) 2021-03-02 15:13:45 +01:00
Erik Montnemery
959181a2e9 Make MQTT number respect retain setting (#47270) 2021-03-02 14:28:31 +01:00
Nick Adams
027d125617 Add services for izone airflow min/max (#45727)
* Create airflow_min and airflow_max services for the izone component
* Bump pizone library requirement
2021-03-02 20:58:41 +08:00
Quentame
6b9abfc2c6 Add init test to Freebox (#46998)
* Add init test to Freebox

* Review : more readable conftest

* Expect 2 blank lines between defs

* Review : Not I/O in the event loop

* Fix test_setup test

* remove useless const

* Review : mock setup methods

* Add service test

* Add import test
2021-03-02 13:37:33 +01:00
tkdrob
ab53b49d3f Clean up constants (#46948)
* Clean up constants

* clean up humidifier constants

* fix tests

* fix prometheus tests

Co-authored-by: Tobias Sauerwein <cgtobi@users.noreply.github.com>
2021-03-02 12:52:00 +01:00
Ville Skyttä
dc880118a4 Lint suppression cleanups (#47248)
* Unused pylint suppression cleanups

* Remove outdated pylint bug references

* Add flake8-noqa config and note to run it every now and then

* Add codes to noqa's

* Unused noqa cleanups
2021-03-02 09:02:04 +01:00
J. Nick Koston
38a2f196b8 Fix typing on fan percentage (#47259) 2021-03-02 08:32:24 +01:00
Erik Montnemery
7e71050669 Add battery sensor for gogogate2 wireless door sensor (#47145)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-03-01 17:34:37 -10:00
Marcel van der Veldt
853d9ac4a9 Update color logic for zwave_js light platform (#47110)
Co-authored-by: Raman Gupta <7243222+raman325@users.noreply.github.com>
2021-03-01 17:12:49 -08:00
stephan192
7bc2328802 Remove rounding from The Things Network (#47157) 2021-03-01 17:00:42 -08:00
J. Nick Koston
d02218ff30 Fix harmony failing to switch activities when a switch is in progress (#47212)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-03-01 16:56:42 -08:00
Milan Meulemans
cb99969845 Fix typo in plaato strings (#47245) 2021-03-01 16:34:39 -08:00
Franck Nijhof
d1afef843b Deprecate LIFX Legacy integration (#47235) 2021-03-01 16:34:14 -08:00
Franck Nijhof
4f9f870e7d Fix duplicate template handling in Persistent Notifications (#47217) 2021-03-01 16:27:26 -08:00
Paulus Schoutsen
cc6293623f Revert "Fix the updater schema (#47128)" (#47254)
This reverts commit 98be703d90.
2021-03-01 16:12:48 -08:00
Aaron Bach
3ee589d973 Bump simplisafe-python to 9.6.8 (#47241) 2021-03-01 17:08:36 -07:00
Bram Kragten
036ce55bea Update frontend to 20210301.0 (#47252) 2021-03-01 15:32:39 -08:00
Raman Gupta
3e34bb3e89 Add suggested area for zwave_js devices (#47250) 2021-03-01 15:24:55 -08:00
Joakim Plate
c6cfcc2abb Add remote control support to philips_js (#47249) 2021-03-01 15:21:10 -08:00
J. Nick Koston
2e65a60624 Fix lutron caseta fan handling of speed off (#47244) 2021-03-01 15:18:47 -08:00
Erik Montnemery
96cc17b462 Add support for a list of known hosts to Google Cast (#47232) 2021-03-01 15:18:18 -08:00
Erik Montnemery
dd9e926689 Pass variables to initial evaluation of template trigger (#47236)
* Pass variables to initial evaluation of template trigger

* Add test

* Clarify test
2021-03-01 23:34:26 +01:00
Matthias Alphart
3fda9fd0c6 KNX address constant (#47196) 2021-03-01 21:59:36 +01:00
Raman Gupta
3c290c9a44 Address late hassio review (#47229)
* hassio code cleanup to address comments in #46342

* fix code
2021-03-01 12:10:51 -05:00
Dermot Duffy
61f509bdd8 Minor Hyperion mypy cleanups (#45765) 2021-03-01 18:10:28 +01:00
Shay Levy
adad4a7785 Fix Shelly Polling (#47224) 2021-03-01 17:27:43 +01:00
Dermot Duffy
be8584c0bc Overhaul command_line tests (#46682) 2021-03-01 17:27:04 +01:00
jdeath
3ebd5aff98 Bump mcstatus to 5.1.1 (#47169) 2021-03-01 16:35:47 +01:00
Franck Nijhof
5cb2fdb6f7 Upgrade spotipy to 2.17.1 (#47228) 2021-03-01 16:02:55 +01:00
Franck Nijhof
93d4e46bb6 Upgrade coverage to 5.5 (#47227) 2021-03-01 15:37:03 +01:00
Matt Zimmerman
947f6ea51e Parameterize SmartTub tests (#47189)
* Parameterize SmartTub tests

* parameterize light service calls

* remove stray print()

* add comment
2021-03-01 13:53:57 +01:00
Franck Nijhof
a2b13785c2 Restore pylint concurrency (#47221) 2021-03-01 13:40:46 +01:00
starkillerOG
084cfa4a1d Fix Xiaomi Miio flow unique_id for non discovery flows (#47222) 2021-03-01 12:46:02 +01:00
Erik Montnemery
003fee2a35 Fix race when disabling config entries (#47210)
* Fix race when disabling config entries

* Remove unused constant
2021-03-01 12:38:49 +01:00
Matthias Alphart
dadc99dbd3 Deprecate knx config_file (#46874)
* deprecate config_file

* removed cv.deprecated for now, added persistent notification

* Update homeassistant/components/knx/__init__.py

Co-authored-by: Philip Allgaier <philip.allgaier@gmx.de>

* remove notification, add cv.deprecated again

* Update homeassistant/components/knx/__init__.py

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

* remove cv.deprecated again

Co-authored-by: Philip Allgaier <philip.allgaier@gmx.de>
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2021-03-01 11:55:55 +01:00
Matthias Alphart
92afcb6b4b KNX services send and event_register accept multiple group addresses (#46908)
* send and event_register service accept lists of group addresses

* remove lambda

* object selector for lists

* knx.read takes lists too
2021-03-01 11:51:59 +01:00
Max Chodorowski
4c42e469b3 Fix number of reported issues by github integration (#47203) 2021-03-01 10:38:07 +01:00
J. Nick Koston
2de01ddaeb Remove griddy integration (#47218) 2021-03-01 10:35:23 +01:00
Tobias Sauerwein
732db3b67c Revert const replacement in fritzbox_callmonitor (#47211) 2021-03-01 10:31:13 +01:00
Marc Mueller
e1d24c69b8 Improve CI workflow (#46696) 2021-03-01 10:28:41 +01:00
Raman Gupta
0592309b65 Add hassio addon_update service and hassio config entry with addon and OS devices and entities (#46342)
* add addon_update service, use config flow to set up config entry, create disabled sensors

* move most of entity logic to common entity class, improve device info, get rid of config_flow user step

* fix setup logic

* additional refactor

* fix refactored logic

* fix config flow tests

* add test for addon_update service and get_addons_info

* add entry setup and unload test and fix update coordinator

* handle if entry setup calls unload

* return nothing for coordinator if entry is being reloaded because coordinator will get recreated anyway

* remove entry when HA instance is no longer hassio and add corresponding test

* handle adding and removing device registry entries

* better config entry reload logic

* fix comment

* bugfix

* fix flake error

* switch pass to return

* use repository attribute for model and fallback to url

* use custom 'system' source since hassio source is misleading

* Update homeassistant/components/hassio/entity.py

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

* update remove addons function name

* Update homeassistant/components/hassio/__init__.py

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

* fix import

* pop coordinator after unload

* additional fixes

* always pass in sensor name when creating entity

* prefix one more function with async and fix tests

* use supervisor info for addons since list is already filtered on what's installed

* remove unused service

* update sensor names

* remove added handler function

* use walrus

* add OS device and sensors

* fix

* re-add addon_update service schema

* add more test coverage and exclude entities from tests

* check if instance is using hass OS in order to create OS entities

Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2021-03-01 09:41:04 +01:00
Stefan Agner
d2db58d138 Fix generic-x86-64 build (#47214)
Replace the wrong Docker Hub repository slipped in during testing.
2021-03-01 09:17:41 +01:00
Marc Mueller
16dcbf1467 Update pylint (#47205) 2021-02-28 22:09:01 -10:00
J. Nick Koston
cb94e7949b Bump HAP-python to 3.3.2 to fix unavailable condition on restart (#47213)
Fixes

https://github.com/ikalchev/HAP-python/compare/v3.3.1...v3.3.2
2021-02-28 22:00:31 -10:00
J. Nick Koston
853da40e70 Increment the homekit config version when restarting (#47209)
If an entity changes between restart the iOS/controller
device may have cached the old chars for the accessory.
To force the iOS/controller to reload the chars, we
increment the config version when Home Assistant restarts
2021-02-28 20:42:09 -08:00
Aaron Bach
0e9f2dc272 Bump simplisafe-python to 9.6.7 (#47206) 2021-02-28 20:41:09 -08:00
J. Nick Koston
5784e14d0c Enforce typing in bond (#47187)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-03-01 03:16:30 +01:00
Allen Porter
715a254913 Handle stream failures in recorder (#47151)
* Handle stream failures in recorder

Fail gracefully with an error message when the recorder is invoked with no segments due to a stream failure.

* Update homeassistant/components/stream/recorder.py

Co-authored-by: uvjustin <46082645+uvjustin@users.noreply.github.com>

Co-authored-by: uvjustin <46082645+uvjustin@users.noreply.github.com>
2021-02-28 18:01:28 -08:00
HomeAssistant Azure
44ed6cda40 [ci skip] Translation update 2021-03-01 00:09:01 +00:00
Matt Zimmerman
277c3cb661 Cleanup SmartTub filtration cycles (#47192) 2021-02-28 13:53:57 -10:00
Eric Severance
1d7660f071 Explain why should_pool is True initially for wemo (#47191) 2021-02-28 13:51:43 -10:00
Matt Zimmerman
c6223873f4 Move SmartTub climate constants to module level (#47190) 2021-02-28 13:49:25 -10:00
Matt Zimmerman
bab66a5cb9 Remove turn_on and turn_off from SmartTub pump switches (#47184) 2021-02-28 13:48:30 -10:00
AJ Schmidt
b8c8fe0820 Update AlarmDecoder dependency (#46841) 2021-02-28 13:21:04 -10:00
starkillerOG
1c9a9be197 Fix Xiaomi Miio discovery (#47134) 2021-02-28 12:25:40 -08:00
Erik Montnemery
72b82449d8 Update MQTT device triggers with support for templates (#47142) 2021-02-28 12:20:09 -08:00
Erik Montnemery
19cd29affa Fix MQTT trigger where wanted payload may be parsed as an integer (#47162) 2021-02-28 12:19:27 -08:00
J. Nick Koston
6ff3eb0569 Update HAP-python to 3.3.1 (#47180)
Fixes disconnect when setting a single char fails
https://github.com/ikalchev/HAP-python/compare/v3.3.0...v3.3.1
2021-02-28 19:27:36 +01:00
Allen Porter
5cc8302e6a Fix flaky hls keepalive test (#47186)
Remove a call to stream.start() which is issued before the test is fully
setup (e.g. keepalive is not set to True, and mock calls are not registered)
2021-02-28 10:25:07 -08:00
Michael
261d86f06b Apply recommendations to synology_dsm (#47178) 2021-02-28 19:19:50 +01:00
Erik Montnemery
da5902e4f8 Tweak Tasmota fan typing (#47175) 2021-02-28 17:48:23 +01:00
David F. Mulcahey
4853a81366 Bump ZHA quirks to 0.0.54 (#47172) 2021-02-28 10:55:14 -05:00
Paulus Schoutsen
98be703d90 Fix the updater schema (#47128) 2021-02-28 14:41:06 +01:00
Stefan Agner
f4189510e9 Bump builder to get generic-x86-64 nightly builds (#47164) 2021-02-28 14:33:48 +01:00
tkdrob
fa1d91d1fe Clean up mqtt_room (#46882) 2021-02-28 14:16:37 +01:00
Maciej Bieniek
66027bcef5 Bump airly library to version 1.1.0 (#47163) 2021-02-28 12:53:13 +01:00
HomeAssistant Azure
eb7220ff26 [ci skip] Translation update 2021-02-28 00:07:08 +00:00
Robert Svensson
da309ce342 Change device class of window covers to shade (#47129) 2021-02-27 14:09:25 -06:00
Allen Porter
97b59023d1 Improve handling for recording start of nest cam stream (#47144)
* Improve handling for start of nest cam stream

Add negative_cts_offsets to segment container options in order to better handle recording at the start of a stream. Nest streams start off with a negative offset, and if the segment container does not support it, then it adjusts the timestamps making it out of order with the next segment as described in issue #46968

* Update homeassistant/components/stream/__init__.py

Co-authored-by: uvjustin <46082645+uvjustin@users.noreply.github.com>

Co-authored-by: uvjustin <46082645+uvjustin@users.noreply.github.com>
2021-02-27 11:20:58 -08:00
J. Nick Koston
49315a90d9 Handle lutron_caseta fan speed being none (#47120) 2021-02-26 16:33:31 -08:00
J. Nick Koston
86f8cd8037 Provide a human readable exception for the percentage util (#47121) 2021-02-26 16:33:13 -08:00
Bram Kragten
84e01baa5a Update frontend to 20210226.0 (#47123) 2021-02-26 16:32:51 -08:00
HomeAssistant Azure
43621091b7 [ci skip] Translation update 2021-02-27 00:05:45 +00:00
Shay Levy
e9b8e035b4 Fix Shelly RGBW (#47116) 2021-02-26 14:28:16 -08:00
Paulus Schoutsen
7c2545af6e Use async_capture_events to avoid running in executor (#47111) 2021-02-26 13:28:52 -08:00
Allen Porter
b1898cc176 Bump google-nest-sdm to v0.2.12 to improve API call error messages (#47108) 2021-02-26 11:20:32 -08:00
Marcel van der Veldt
7ca148f65d Fix Z-Wave JS discovery schema for thermostat devices (#47087)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-26 11:19:23 -08:00
Simone Chemelli
8971ab2edc Bump aioshelly to 0.6.1 (#47088) 2021-02-26 11:07:53 -08:00
Joakim Plate
e12eba1989 Add support for v6 features to philips js integration (#46422) 2021-02-26 09:34:40 -08:00
J. Nick Koston
7ab2d91bf0 Add suggested area to hue (#47056) 2021-02-26 10:35:09 -06:00
Charles Garwood
d8633f94f6 Guard zwave_js missing nodes in websocket api (#47096) 2021-02-26 16:07:50 +01:00
Stefan Agner
6e77ca70fc Add new machine generic-x86-64 to build matrix (#47095)
The Intel NUC machine runs on most UEFI capable x86-64 machines today.
Lets start a new machine generic-x86-64 which will replace intel-nuc
over time.
2021-02-26 15:49:33 +01:00
Guido Schmitz
71cf982a28 Add suggested_area support to devolo Home Control (#47063) 2021-02-26 08:48:36 -06:00
rikroe
9c67f83f4e Bump bimmer_connected to 0.7.15 and fix bugs (#47066)
Co-authored-by: rikroe <rikroe@users.noreply.github.com>
2021-02-26 13:57:47 +01:00
Raman Gupta
56673f7edf Remove flaky climacell test (#47080) 2021-02-26 13:45:21 +01:00
Erik Montnemery
dfbb653107 Bump pychromecast to 9.0.0 (#47086)
* Adapt to Pychromecast 9.0.0

* Bump pychromecast to 9.0.0

* Fix lint issues
2021-02-26 13:43:53 +01:00
CurrentThread
d5ee49cd4e Add support for Shelly SHBTN-2 device triggers (#46644) 2021-02-26 11:52:47 +01:00
Erik Montnemery
5780615251 Bump pychromecast to 8.1.2 (#47085) 2021-02-26 10:47:22 +01:00
chpego
afb6e31393 Upgrade youtube_dl to version 2021.02.22 (#47078)
* Upgrade youtube_dl to version 2021.02.22

* Update requirements_all.txt
2021-02-26 10:39:31 +01:00
Paulus Schoutsen
3a3c12bb17 Upgrade aiohttp to 3.7.4 (#47077) 2021-02-26 09:16:11 +01:00
Paulus Schoutsen
6bd253094f Bump Z-Wave JS Server Python to 0.20.0 (#47076) 2021-02-25 22:01:08 -08:00
J. Nick Koston
6af67c9558 Ensure hue options show the defaults when the config options have not yet been saved (#47067) 2021-02-25 21:58:35 -08:00
Charles Garwood
8ab163eda8 Fix Z-Wave JS API docstrings (#47061) 2021-02-25 21:11:06 -08:00
Raman Gupta
7118b7169c catch ValueError when unique ID update fails because its taken and remove the duplicate entity (#47072) 2021-02-25 20:41:54 -05:00
HomeAssistant Azure
989d3e5c87 [ci skip] Translation update 2021-02-26 00:06:13 +00:00
Bram Kragten
e3105c7eb1 Revert CORS changes for my home assistant (#47064)
* Revert CORS changes for my home assistant

* Update test_init.py

* Update test_init.py
2021-02-25 15:28:22 -08:00
Bram Kragten
d084291055 Updated frontend to 20210225.0 (#47059) 2021-02-25 21:34:04 +01:00
Joakim Sørensen
7d90cdea1e Use dispatch instead of eventbus for supervisor events (#46986)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-02-25 19:52:11 +01:00
J. Nick Koston
f4db74fe73 Fix bond typing in config flow (#47055) 2021-02-25 18:08:04 +01:00
Ron Klinkien
3a82917400 Bump python-garminconnect to 0.1.19 to fix broken api (#47020) 2021-02-25 17:39:57 +01:00
Tobias Sauerwein
4e09d7ee0f Clean up Netatmo webhook handler (#47037) 2021-02-25 16:53:59 +01:00
Quentame
125206adbf Add zeroconf discovery to Freebox (#47045)
* Add zeroconf discovery to Freebox

- remove deprecated discovery
- tried with SSDP too but the presentation URL is not the same (*.fbxos.fr for zeroconf, http://mafreebox.freebox.fr/ for SSDP)
- so config entry unique_id should be the MAC (included into SSDP, but not zeroconf, can be retrieve from `fbx.system.get_config()`)
- DHCP discovery might be added in the future too

* host and port are required on zeroconf

* cleanup in other PR
2021-02-25 16:50:58 +01:00
Johan Josua Storm
5bba532dd4 Replace wrong domain returned from xbox api 2.0 (#47021)
* Change solution to use yarl lib

* Add check if base url needs changing

* Actively remove padding query instead of omitting

* Fixed popping the wrong query

* Change explaination about removing mode query
2021-02-25 09:38:45 -05:00
Maciej Bieniek
09bafafee2 Bump gios library to version 0.2.0 (#47050) 2021-02-25 15:26:00 +01:00
João Gabriel
372ed2db91 Add remote control platform to Panasonic Viera (#42450)
* Adding remote platform

* Update homeassistant/components/panasonic_viera/remote.py

Simplify entity creation

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

* Use Pytest fixture

* Use Pytest fixtures and assert service calls

* Adding conftest.py and organizing tests

* Reorganizing tests

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-25 13:40:01 +01:00
Fabian Affolter
c9d7a2be88 Upgrade sendgrid to 6.6.0 (#47041) 2021-02-25 13:09:52 +01:00
Fabian Affolter
5ec4360ac1 Upgrade pyowm to 3.2.0 (#47042) 2021-02-25 13:08:44 +01:00
Paulus Schoutsen
1989b8c07d Clean up discovery integration (#47022)
* Clean up discovery integration

* Fix tests

* Remove discovery step from freebox
2021-02-25 12:19:21 +01:00
Fabian Affolter
7a691f9d26 Upgrade icmplib to 2.0.2 (#47039) 2021-02-25 11:11:40 +01:00
Robert Svensson
6b0c569a70 Normally there should only be one battery sensor per device from deCONZ. (#46761)
With these Danfoss devices each endpoint can report its own battery state.
2021-02-25 09:54:46 +01:00
Simone Chemelli
65a2f07a01 Fix missing Shelly external input (#47028)
* Add support for external input (Shelly 1/1pm add-on)

* Make external sensor naming consistent

* Fix case consistency
2021-02-25 09:51:18 +01:00
Florian Heilmann
47938a1355 hm climate: Return PRESET_NONE instead of None (#47003)
Signed-off-by: Florian Heilmann <Florian.Heilmann@gmx.net>
2021-02-25 09:49:52 +01:00
Paulus Schoutsen
633a7aeb22 Remove deprecated credstash + keyring (#47033) 2021-02-25 09:48:19 +01:00
J. Nick Koston
72263abfa9 Ensure doorbird events are re-registered when changing options (#46860)
- Fixed the update listener not being unsubscribed

- DRY up some of the code

- Fix sync code being called in async

- Reduce executor jumps
2021-02-24 23:16:20 -08:00
Raman Gupta
a43f3c1a0c Fix zwave_js unique ID migration logic (#47031) 2021-02-24 23:14:32 -08:00
starkillerOG
7dc9071776 Add Xiaomi Miio fan config flow (#46866)
* Miio fan config flow

* fix styling and imports

* Update homeassistant/components/xiaomi_miio/fan.py

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

* Update homeassistant/components/xiaomi_miio/fan.py

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

* Update homeassistant/components/xiaomi_miio/fan.py

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

* Update homeassistant/components/xiaomi_miio/fan.py

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

* Update homeassistant/components/xiaomi_miio/fan.py

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

* rename device -> entity

* fix indent

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-02-25 04:25:06 +01:00
Fabian Affolter
7e35af5d4e Upgrade TwitterAPI to 2.6.8 (#47019) 2021-02-24 19:09:33 -05:00
HomeAssistant Azure
bb7f1b748f [ci skip] Translation update 2021-02-25 00:05:20 +00:00
Paulus Schoutsen
557ec374f1 Convert discovery helper to use dispatcher (#47008) 2021-02-24 13:37:31 -08:00
Franck Nijhof
5ab11df551 Bump version to 2021.4.0dev0 (#47017) 2021-02-24 22:28:02 +01:00
4719 changed files with 92766 additions and 31954 deletions

View File

@@ -221,6 +221,7 @@ omit =
homeassistant/components/ecobee/weather.py
homeassistant/components/econet/__init__.py
homeassistant/components/econet/binary_sensor.py
homeassistant/components/econet/climate.py
homeassistant/components/econet/const.py
homeassistant/components/econet/sensor.py
homeassistant/components/econet/water_heater.py
@@ -314,7 +315,6 @@ omit =
homeassistant/components/foscam/camera.py
homeassistant/components/foursquare/*
homeassistant/components/free_mobile/notify.py
homeassistant/components/freebox/__init__.py
homeassistant/components/freebox/device_tracker.py
homeassistant/components/freebox/router.py
homeassistant/components/freebox/sensor.py
@@ -377,6 +377,9 @@ omit =
homeassistant/components/harmony/data.py
homeassistant/components/harmony/remote.py
homeassistant/components/harmony/util.py
homeassistant/components/hassio/binary_sensor.py
homeassistant/components/hassio/entity.py
homeassistant/components/hassio/sensor.py
homeassistant/components/haveibeenpwned/sensor.py
homeassistant/components/hdmi_cec/*
homeassistant/components/heatmiser/climate.py
@@ -384,7 +387,13 @@ omit =
homeassistant/components/hikvisioncam/switch.py
homeassistant/components/hisense_aehw4a1/*
homeassistant/components/hitron_coda/device_tracker.py
homeassistant/components/hive/*
homeassistant/components/hive/__init__.py
homeassistant/components/hive/climate.py
homeassistant/components/hive/binary_sensor.py
homeassistant/components/hive/light.py
homeassistant/components/hive/sensor.py
homeassistant/components/hive/switch.py
homeassistant/components/hive/water_heater.py
homeassistant/components/hlk_sw16/__init__.py
homeassistant/components/hlk_sw16/switch.py
homeassistant/components/home_connect/*
@@ -392,6 +401,9 @@ omit =
homeassistant/components/homematic/climate.py
homeassistant/components/homematic/cover.py
homeassistant/components/homematic/notify.py
homeassistant/components/home_plus_control/api.py
homeassistant/components/home_plus_control/helpers.py
homeassistant/components/home_plus_control/switch.py
homeassistant/components/homeworks/*
homeassistant/components/honeywell/climate.py
homeassistant/components/horizon/media_player.py
@@ -497,7 +509,18 @@ omit =
homeassistant/components/lastfm/sensor.py
homeassistant/components/launch_library/const.py
homeassistant/components/launch_library/sensor.py
homeassistant/components/lcn/*
homeassistant/components/lcn/__init__.py
homeassistant/components/lcn/binary_sensor.py
homeassistant/components/lcn/climate.py
homeassistant/components/lcn/const.py
homeassistant/components/lcn/cover.py
homeassistant/components/lcn/helpers.py
homeassistant/components/lcn/light.py
homeassistant/components/lcn/scene.py
homeassistant/components/lcn/schemas.py
homeassistant/components/lcn/sensor.py
homeassistant/components/lcn/services.py
homeassistant/components/lcn/switch.py
homeassistant/components/lg_netcast/media_player.py
homeassistant/components/lg_soundbar/media_player.py
homeassistant/components/life360/*
@@ -540,7 +563,6 @@ omit =
homeassistant/components/map/*
homeassistant/components/mastodon/notify.py
homeassistant/components/matrix/*
homeassistant/components/maxcube/*
homeassistant/components/mcp23017/*
homeassistant/components/media_extractor/*
homeassistant/components/mediaroom/media_player.py
@@ -624,17 +646,6 @@ omit =
homeassistant/components/nederlandse_spoorwegen/sensor.py
homeassistant/components/nello/lock.py
homeassistant/components/nest/legacy/*
homeassistant/components/netatmo/__init__.py
homeassistant/components/netatmo/api.py
homeassistant/components/netatmo/camera.py
homeassistant/components/netatmo/climate.py
homeassistant/components/netatmo/const.py
homeassistant/components/netatmo/data_handler.py
homeassistant/components/netatmo/helper.py
homeassistant/components/netatmo/light.py
homeassistant/components/netatmo/netatmo_entity_base.py
homeassistant/components/netatmo/sensor.py
homeassistant/components/netatmo/webhook.py
homeassistant/components/netdata/sensor.py
homeassistant/components/netgear/device_tracker.py
homeassistant/components/netgear_lte/*
@@ -723,12 +734,14 @@ omit =
homeassistant/components/pencom/switch.py
homeassistant/components/philips_js/__init__.py
homeassistant/components/philips_js/media_player.py
homeassistant/components/philips_js/remote.py
homeassistant/components/pi_hole/sensor.py
homeassistant/components/pi4ioe5v9xxxx/binary_sensor.py
homeassistant/components/pi4ioe5v9xxxx/switch.py
homeassistant/components/picotts/tts.py
homeassistant/components/piglow/light.py
homeassistant/components/pilight/*
homeassistant/components/ping/__init__.py
homeassistant/components/ping/const.py
homeassistant/components/ping/binary_sensor.py
homeassistant/components/ping/device_tracker.py
@@ -782,6 +795,7 @@ omit =
homeassistant/components/raspyrfm/*
homeassistant/components/recollect_waste/__init__.py
homeassistant/components/recollect_waste/sensor.py
homeassistant/components/recorder/repack.py
homeassistant/components/recswitch/switch.py
homeassistant/components/reddit/*
homeassistant/components/rejseplanen/sensor.py
@@ -823,6 +837,11 @@ omit =
homeassistant/components/satel_integra/*
homeassistant/components/schluter/*
homeassistant/components/scrape/sensor.py
homeassistant/components/screenlogic/__init__.py
homeassistant/components/screenlogic/binary_sensor.py
homeassistant/components/screenlogic/climate.py
homeassistant/components/screenlogic/sensor.py
homeassistant/components/screenlogic/switch.py
homeassistant/components/scsgate/*
homeassistant/components/scsgate/cover.py
homeassistant/components/sendgrid/notify.py
@@ -1045,7 +1064,14 @@ omit =
homeassistant/components/velbus/switch.py
homeassistant/components/velux/*
homeassistant/components/venstar/climate.py
homeassistant/components/verisure/*
homeassistant/components/verisure/__init__.py
homeassistant/components/verisure/alarm_control_panel.py
homeassistant/components/verisure/binary_sensor.py
homeassistant/components/verisure/camera.py
homeassistant/components/verisure/coordinator.py
homeassistant/components/verisure/lock.py
homeassistant/components/verisure/sensor.py
homeassistant/components/verisure/switch.py
homeassistant/components/versasense/*
homeassistant/components/vesync/__init__.py
homeassistant/components/vesync/common.py
@@ -1164,3 +1190,6 @@ exclude_lines =
# Don't complain if tests don't hit defensive assertion code:
raise AssertionError
raise NotImplementedError
# TYPE_CHECKING block is never executed during pytest run
if TYPE_CHECKING:

2
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,2 @@
custom: https://www.nabucasa.com
github: balloob

View File

@@ -1,5 +1,5 @@
name: Report an issue with Home Assistant Core
about: Report an issue with Home Assistant Core.
description: Report an issue with Home Assistant Core.
title: ""
issue_body: true
body:
@@ -26,6 +26,7 @@ body:
value: |
## Environment
- type: input
id: version
validations:
required: true
attributes:
@@ -52,11 +53,13 @@ body:
- Home Assistant Supervised
- Home Assistant Core
- type: input
id: integration_name
attributes:
label: Integration causing the issue
description: >
The name of the integration, for example, Automation or Philips Hue.
- type: input
id: integration_link
attributes:
label: Link to integration documentation on our website
placeholder: "https://www.home-assistant.io/integrations/..."
@@ -76,20 +79,12 @@ body:
description: |
If this issue has an example piece of YAML that can help reproducing this problem, please provide.
This can be an piece of YAML from, e.g., an automation, script, scene or configuration.
value: |
```yaml
# Put your YAML below this line
```
render: yaml
- type: textarea
attributes:
label: Anything in the logs that might be useful for us?
description: For example, error message, or stack traces.
value: |
```txt
# Put your logs below this line
```
render: txt
- type: markdown
attributes:
value: |

View File

@@ -12,7 +12,7 @@ on:
env:
CACHE_VERSION: 1
DEFAULT_PYTHON: 3.8
PRE_COMMIT_HOME: ~/.cache/pre-commit
PRE_COMMIT_CACHE: ~/.cache/pre-commit
jobs:
# Separate job to pre-populate the base dependency cache
@@ -20,6 +20,9 @@ jobs:
prepare-base:
name: Prepare base dependencies
runs-on: ubuntu-latest
outputs:
python-key: ${{ steps.generate-python-key.outputs.key }}
pre-commit-key: ${{ steps.generate-pre-commit-key.outputs.key }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
@@ -28,21 +31,25 @@ jobs:
uses: actions/setup-python@v2.2.1
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Generate partial Python venv restore key
id: generate-python-key
run: >-
echo "::set-output name=key::base-venv-${{ env.CACHE_VERSION }}-${{
hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}"
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v2.1.4
with:
path: venv
key: >-
${{ env.CACHE_VERSION}}-${{ runner.os }}-base-venv-${{
steps.python.outputs.python-version }}-${{
hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
steps.generate-python-key.outputs.key }}
restore-keys: |
${{ env.CACHE_VERSION}}-${{ runner.os }}-base-venv-${{ steps.python.outputs.python-version }}-${{ hashFiles('requirements.txt') }}-${{ hashFiles('requirements_test.txt') }}-
${{ env.CACHE_VERSION}}-${{ runner.os }}-base-venv-${{ steps.python.outputs.python-version }}-${{ hashFiles('requirements.txt') }}
${{ env.CACHE_VERSION}}-${{ runner.os }}-base-venv-${{ steps.python.outputs.python-version }}-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-base-venv-${{ env.CACHE_VERSION }}-${{ hashFiles('requirements.txt') }}-${{ hashFiles('requirements_test.txt') }}-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-base-venv-${{ env.CACHE_VERSION }}-${{ hashFiles('requirements.txt') }}-
${{ runner.os }}-${{ steps.python.outputs.python-version }}-base-venv-${{ env.CACHE_VERSION }}-
- name: Create Python virtual environment
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
@@ -50,15 +57,20 @@ jobs:
. venv/bin/activate
pip install -U "pip<20.3" setuptools
pip install -r requirements.txt -r requirements_test.txt
- name: Generate partial pre-commit restore key
id: generate-pre-commit-key
run: >-
echo "::set-output name=key::pre-commit-${{ env.CACHE_VERSION }}-${{
hashFiles('.pre-commit-config.yaml') }}"
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v2.1.4
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ env.CACHE_VERSION}}-${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
path: ${{ env.PRE_COMMIT_CACHE }}
key: >-
${{ runner.os }}-${{ steps.generate-pre-commit-key.outputs.key }}
restore-keys: |
${{ env.CACHE_VERSION}}-${{ runner.os }}-pre-commit-
${{ runner.os }}-pre-commit-${{ env.CACHE_VERSION }}-
- name: Install pre-commit dependencies
if: steps.cache-precommit.outputs.cache-hit != 'true'
run: |
@@ -82,12 +94,8 @@ jobs:
uses: actions/cache@v2.1.4
with:
path: venv
key: >-
${{ env.CACHE_VERSION}}-${{ runner.os }}-base-venv-${{
steps.python.outputs.python-version }}-${{
hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
key: ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.prepare-base.outputs.python-key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
@@ -97,13 +105,12 @@ jobs:
id: cache-precommit
uses: actions/cache@v2.1.4
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ env.CACHE_VERSION}}-${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Fail job if cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
path: ${{ env.PRE_COMMIT_CACHE }}
key: ${{ runner.os }}-${{ needs.prepare-base.outputs.pre-commit-key }}
- name: Fail job if pre-commit cache restore failed
if: steps.cache-precommit.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
echo "Failed to restore pre-commit environment from cache"
exit 1
- name: Run bandit
run: |
@@ -127,12 +134,8 @@ jobs:
uses: actions/cache@v2.1.4
with:
path: venv
key: >-
${{ env.CACHE_VERSION}}-${{ runner.os }}-base-venv-${{
steps.python.outputs.python-version }}-${{
hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
key: ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.prepare-base.outputs.python-key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
@@ -142,13 +145,12 @@ jobs:
id: cache-precommit
uses: actions/cache@v2.1.4
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ env.CACHE_VERSION}}-${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Fail job if cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
path: ${{ env.PRE_COMMIT_CACHE }}
key: ${{ runner.os }}-${{ needs.prepare-base.outputs.pre-commit-key }}
- name: Fail job if pre-commit cache restore failed
if: steps.cache-precommit.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
echo "Failed to restore pre-commit environment from cache"
exit 1
- name: Run black
run: |
@@ -172,12 +174,8 @@ jobs:
uses: actions/cache@v2.1.4
with:
path: venv
key: >-
${{ env.CACHE_VERSION}}-${{ runner.os }}-base-venv-${{
steps.python.outputs.python-version }}-${{
hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
key: ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.prepare-base.outputs.python-key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
@@ -187,13 +185,12 @@ jobs:
id: cache-precommit
uses: actions/cache@v2.1.4
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ env.CACHE_VERSION}}-${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Fail job if cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
path: ${{ env.PRE_COMMIT_CACHE }}
key: ${{ runner.os }}-${{ needs.prepare-base.outputs.pre-commit-key }}
- name: Fail job if pre-commit cache restore failed
if: steps.cache-precommit.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
echo "Failed to restore pre-commit environment from cache"
exit 1
- name: Register codespell problem matcher
run: |
@@ -239,12 +236,8 @@ jobs:
uses: actions/cache@v2.1.4
with:
path: venv
key: >-
${{ env.CACHE_VERSION}}-${{ runner.os }}-base-venv-${{
steps.python.outputs.python-version }}-${{
hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
key: ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.prepare-base.outputs.python-key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
@@ -254,13 +247,12 @@ jobs:
id: cache-precommit
uses: actions/cache@v2.1.4
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ env.CACHE_VERSION}}-${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Fail job if cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
path: ${{ env.PRE_COMMIT_CACHE }}
key: ${{ runner.os }}-${{ needs.prepare-base.outputs.pre-commit-key }}
- name: Fail job if pre-commit cache restore failed
if: steps.cache-precommit.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
echo "Failed to restore pre-commit environment from cache"
exit 1
- name: Register check executables problem matcher
run: |
@@ -287,12 +279,8 @@ jobs:
uses: actions/cache@v2.1.4
with:
path: venv
key: >-
${{ env.CACHE_VERSION}}-${{ runner.os }}-base-venv-${{
steps.python.outputs.python-version }}-${{
hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
key: ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.prepare-base.outputs.python-key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
@@ -302,13 +290,12 @@ jobs:
id: cache-precommit
uses: actions/cache@v2.1.4
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ env.CACHE_VERSION}}-${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Fail job if cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
path: ${{ env.PRE_COMMIT_CACHE }}
key: ${{ runner.os }}-${{ needs.prepare-base.outputs.pre-commit-key }}
- name: Fail job if pre-commit cache restore failed
if: steps.cache-precommit.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
echo "Failed to restore pre-commit environment from cache"
exit 1
- name: Register flake8 problem matcher
run: |
@@ -335,12 +322,8 @@ jobs:
uses: actions/cache@v2.1.4
with:
path: venv
key: >-
${{ env.CACHE_VERSION}}-${{ runner.os }}-base-venv-${{
steps.python.outputs.python-version }}-${{
hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
key: ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.prepare-base.outputs.python-key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
@@ -350,13 +333,12 @@ jobs:
id: cache-precommit
uses: actions/cache@v2.1.4
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ env.CACHE_VERSION}}-${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Fail job if cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
path: ${{ env.PRE_COMMIT_CACHE }}
key: ${{ runner.os }}-${{ needs.prepare-base.outputs.pre-commit-key }}
- name: Fail job if pre-commit cache restore failed
if: steps.cache-precommit.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
echo "Failed to restore pre-commit environment from cache"
exit 1
- name: Run isort
run: |
@@ -380,12 +362,8 @@ jobs:
uses: actions/cache@v2.1.4
with:
path: venv
key: >-
${{ env.CACHE_VERSION}}-${{ runner.os }}-base-venv-${{
steps.python.outputs.python-version }}-${{
hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
key: ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.prepare-base.outputs.python-key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
@@ -395,13 +373,12 @@ jobs:
id: cache-precommit
uses: actions/cache@v2.1.4
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ env.CACHE_VERSION}}-${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Fail job if cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
path: ${{ env.PRE_COMMIT_CACHE }}
key: ${{ runner.os }}-${{ needs.prepare-base.outputs.pre-commit-key }}
- name: Fail job if pre-commit cache restore failed
if: steps.cache-precommit.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
echo "Failed to restore pre-commit environment from cache"
exit 1
- name: Register check-json problem matcher
run: |
@@ -428,12 +405,8 @@ jobs:
uses: actions/cache@v2.1.4
with:
path: venv
key: >-
${{ env.CACHE_VERSION}}-${{ runner.os }}-base-venv-${{
steps.python.outputs.python-version }}-${{
hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
key: ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.prepare-base.outputs.python-key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
@@ -443,13 +416,12 @@ jobs:
id: cache-precommit
uses: actions/cache@v2.1.4
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ env.CACHE_VERSION}}-${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Fail job if cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
path: ${{ env.PRE_COMMIT_CACHE }}
key: ${{ runner.os }}-${{ needs.prepare-base.outputs.pre-commit-key }}
- name: Fail job if pre-commit cache restore failed
if: steps.cache-precommit.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
echo "Failed to restore pre-commit environment from cache"
exit 1
- name: Run pyupgrade
run: |
@@ -484,12 +456,8 @@ jobs:
uses: actions/cache@v2.1.4
with:
path: venv
key: >-
${{ env.CACHE_VERSION}}-${{ runner.os }}-base-venv-${{
steps.python.outputs.python-version }}-${{
hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
key: ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.prepare-base.outputs.python-key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
@@ -499,13 +467,12 @@ jobs:
id: cache-precommit
uses: actions/cache@v2.1.4
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ env.CACHE_VERSION}}-${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Fail job if cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
path: ${{ env.PRE_COMMIT_CACHE }}
key: ${{ runner.os }}-${{ needs.prepare-base.outputs.pre-commit-key }}
- name: Fail job if pre-commit cache restore failed
if: steps.cache-precommit.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
echo "Failed to restore pre-commit environment from cache"
exit 1
- name: Register yamllint problem matcher
run: |
@@ -531,11 +498,8 @@ jobs:
uses: actions/cache@v2.1.4
with:
path: venv
key: >-
${{ env.CACHE_VERSION}}-${{ runner.os }}-venv-${{
matrix.python-version }}-${{ hashFiles('requirements_test.txt')
}}-${{ hashFiles('requirements_all.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
key: ${{ runner.os }}-${{ matrix.python-version }}-${{
needs.prepare-tests.outputs.python-key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
@@ -563,12 +527,8 @@ jobs:
uses: actions/cache@v2.1.4
with:
path: venv
key: >-
${{ env.CACHE_VERSION}}-${{ runner.os }}-base-venv-${{
steps.python.outputs.python-version }}-${{
hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
key: ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
needs.prepare-base.outputs.python-key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
@@ -585,24 +545,31 @@ jobs:
strategy:
matrix:
python-version: [3.8, 3.9]
outputs:
python-key: ${{ steps.generate-python-key.outputs.key }}
container: homeassistant/ci-azure:${{ matrix.python-version }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name: Generate partial Python venv restore key
id: generate-python-key
run: >-
echo "::set-output name=key::venv-${{ env.CACHE_VERSION }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('requirements_all.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}"
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache@v2.1.4
with:
path: venv
key: >-
${{ env.CACHE_VERSION}}-${{ runner.os }}-venv-${{
matrix.python-version }}-${{ hashFiles('requirements_test.txt')
}}-${{ hashFiles('requirements_all.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
${{ runner.os }}-${{ matrix.python-version }}-${{
steps.generate-python-key.outputs.key }}
restore-keys: |
${{ env.CACHE_VERSION}}-${{ runner.os }}-venv-${{ matrix.python-version }}-${{ hashFiles('requirements_test.txt') }}-${{ hashFiles('requirements_all.txt') }}
${{ env.CACHE_VERSION}}-${{ runner.os }}-venv-${{ matrix.python-version }}-${{ hashFiles('requirements_test.txt') }}
${{ env.CACHE_VERSION}}-${{ runner.os }}-venv-${{ matrix.python-version }}-
${{ runner.os }}-${{ matrix.python-version }}-venv-${{ env.CACHE_VERSION }}-${{ hashFiles('requirements_test.txt') }}-${{ hashFiles('requirements_all.txt') }}-
${{ runner.os }}-${{ matrix.python-version }}-venv-${{ env.CACHE_VERSION }}-${{ hashFiles('requirements_test.txt') }}-
${{ runner.os }}-${{ matrix.python-version }}-venv-${{ env.CACHE_VERSION }}-
- name: Create full Python ${{ matrix.python-version }} virtual environment
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
@@ -633,11 +600,8 @@ jobs:
uses: actions/cache@v2.1.4
with:
path: venv
key: >-
${{ env.CACHE_VERSION}}-${{ runner.os }}-venv-${{
matrix.python-version }}-${{ hashFiles('requirements_test.txt')
}}-${{ hashFiles('requirements_all.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
key: ${{ runner.os }}-${{ matrix.python-version }}-${{
needs.prepare-tests.outputs.python-key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
@@ -667,11 +631,8 @@ jobs:
uses: actions/cache@v2.1.4
with:
path: venv
key: >-
${{ env.CACHE_VERSION}}-${{ runner.os }}-venv-${{
matrix.python-version }}-${{ hashFiles('requirements_test.txt')
}}-${{ hashFiles('requirements_all.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
key: ${{ runner.os }}-${{ matrix.python-version }}-${{
needs.prepare-tests.outputs.python-key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
@@ -689,6 +650,7 @@ jobs:
runs-on: ubuntu-latest
needs: prepare-tests
strategy:
fail-fast: false
matrix:
group: [1, 2, 3, 4]
python-version: [3.8, 3.9]
@@ -703,11 +665,8 @@ jobs:
uses: actions/cache@v2.1.4
with:
path: venv
key: >-
${{ env.CACHE_VERSION}}-${{ runner.os }}-venv-${{
matrix.python-version }}-${{ hashFiles('requirements_test.txt')
}}-${{ hashFiles('requirements_all.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
key: ${{ runner.os }}-${{ matrix.python-version }}-${{
needs.prepare-tests.outputs.python-key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
@@ -735,6 +694,7 @@ jobs:
--test-group-count 4 \
--test-group=${{ matrix.group }} \
--cov homeassistant \
--cov-report= \
-o console_output_style=count \
-p no:sugar \
tests
@@ -750,7 +710,7 @@ jobs:
coverage:
name: Process test coverage
runs-on: ubuntu-latest
needs: pytest
needs: ["prepare-tests", "pytest"]
strategy:
matrix:
python-version: [3.8]
@@ -763,11 +723,8 @@ jobs:
uses: actions/cache@v2.1.4
with:
path: venv
key: >-
${{ env.CACHE_VERSION}}-${{ runner.os }}-venv-${{
matrix.python-version }}-${{ hashFiles('requirements_test.txt')
}}-${{ hashFiles('requirements_all.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
key: ${{ runner.os }}-${{ matrix.python-version }}-${{
needs.prepare-tests.outputs.python-key }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
@@ -782,4 +739,4 @@ jobs:
coverage report --fail-under=94
coverage xml
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v1.2.1
uses: codecov/codecov-action@v1.3.1

View File

@@ -16,7 +16,7 @@ jobs:
# - No PRs marked as no-stale
# - No issues marked as no-stale or help-wanted
- name: 90 days stale issues & PRs policy
uses: actions/stale@v3.0.17
uses: actions/stale@v3.0.18
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
days-before-stale: 90
@@ -53,7 +53,7 @@ jobs:
# - No PRs marked as no-stale or new-integrations
# - No issues (-1)
- name: 30 days stale PRs policy
uses: actions/stale@v3.0.17
uses: actions/stale@v3.0.18
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
days-before-stale: 30
@@ -78,7 +78,7 @@ jobs:
# - No Issues marked as no-stale or help-wanted
# - No PRs (-1)
- name: Needs more information stale issues policy
uses: actions/stale@v3.0.17
uses: actions/stale@v3.0.18
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
only-labels: "needs-more-information"

View File

@@ -1,6 +1,6 @@
repos:
- repo: https://github.com/asottile/pyupgrade
rev: v2.7.2
rev: v2.11.0
hooks:
- id: pyupgrade
args: [--py38-plus]
@@ -23,12 +23,16 @@ repos:
exclude_types: [csv, json]
exclude: ^tests/fixtures/
- repo: https://gitlab.com/pycqa/flake8
rev: 3.8.4
rev: 3.9.0
hooks:
- id: flake8
additional_dependencies:
- flake8-docstrings==1.5.0
- pydocstyle==5.1.1
- pycodestyle==2.7.0
- pyflakes==2.3.1
- flake8-docstrings==1.6.0
- pydocstyle==6.0.0
- flake8-comprehensions==3.4.0
- flake8-noqa==1.1.0
files: ^(homeassistant|script|tests)/.+\.py$
- repo: https://github.com/PyCQA/bandit
rev: 1.7.0
@@ -40,7 +44,7 @@ repos:
- --configfile=tests/bandit.yaml
files: ^(homeassistant|script|tests)/.+\.py$
- repo: https://github.com/PyCQA/isort
rev: 5.5.3
rev: 5.7.0
hooks:
- id: isort
- repo: https://github.com/pre-commit/pre-commit-hooks
@@ -64,6 +68,19 @@ repos:
hooks:
- id: prettier
stages: [manual]
- repo: https://github.com/cdce8p/python-typing-update
rev: v0.3.2
hooks:
# Run `python-typing-update` hook manually from time to time
# to update python typing syntax.
# Will require manual work, before submitting changes!
- id: python-typing-update
stages: [manual]
args:
- --py38-plus
- --force
- --keep-updates
files: ^(homeassistant|tests|script)/.+\.py$
- repo: local
hooks:
# Run mypy through our wrapper script in order to get the possible

View File

@@ -36,6 +36,7 @@ homeassistant/components/alpha_vantage/* @fabaff
homeassistant/components/ambiclimate/* @danielhiversen
homeassistant/components/ambient_station/* @bachya
homeassistant/components/amcrest/* @pnbruckner
homeassistant/components/analytics/* @home-assistant/core @ludeeus
homeassistant/components/androidtv/* @JeffLIrion
homeassistant/components/apache_kafka/* @bachya
homeassistant/components/api/* @home-assistant/core
@@ -180,14 +181,12 @@ homeassistant/components/google_cloud/* @lufton
homeassistant/components/gpsd/* @fabaff
homeassistant/components/gree/* @cmroche
homeassistant/components/greeneye_monitor/* @jkeljo
homeassistant/components/griddy/* @bdraco
homeassistant/components/group/* @home-assistant/core
homeassistant/components/growatt_server/* @indykoning
homeassistant/components/guardian/* @bachya
homeassistant/components/habitica/* @ASMfreaK @leikoilja
homeassistant/components/harmony/* @ehendrix23 @bramkragten @bdraco @mkeesey
homeassistant/components/hassio/* @home-assistant/supervisor
homeassistant/components/hdmi_cec/* @newAM
homeassistant/components/heatmiser/* @andylockran
homeassistant/components/heos/* @andrewsayre
homeassistant/components/here_travel_time/* @eifinger
@@ -198,11 +197,11 @@ homeassistant/components/history/* @home-assistant/core
homeassistant/components/hive/* @Rendili @KJonline
homeassistant/components/hlk_sw16/* @jameshilliard
homeassistant/components/home_connect/* @DavidMStraub
homeassistant/components/home_plus_control/* @chemaaa
homeassistant/components/homeassistant/* @home-assistant/core
homeassistant/components/homekit/* @bdraco
homeassistant/components/homekit_controller/* @Jc2k
homeassistant/components/homematic/* @pvizeli @danielperna84
homeassistant/components/homematicip_cloud/* @SukramJ
homeassistant/components/http/* @home-assistant/core
homeassistant/components/huawei_lte/* @scop @fphammerle
homeassistant/components/huawei_router/* @abmantis
@@ -403,6 +402,7 @@ homeassistant/components/samsungtv/* @escoand
homeassistant/components/scene/* @home-assistant/core
homeassistant/components/schluter/* @prairieapps
homeassistant/components/scrape/* @fabaff
homeassistant/components/screenlogic/* @dieselrabbit
homeassistant/components/script/* @home-assistant/core
homeassistant/components/search/* @home-assistant/core
homeassistant/components/sense/* @kbickar
@@ -433,12 +433,12 @@ homeassistant/components/smarttub/* @mdz
homeassistant/components/smarty/* @z0mbieprocess
homeassistant/components/sms/* @ocalvo
homeassistant/components/smtp/* @fabaff
homeassistant/components/solaredge/* @frenck
homeassistant/components/solaredge_local/* @drobtravels @scheric
homeassistant/components/solarlog/* @Ernst79
homeassistant/components/solax/* @squishykid
homeassistant/components/soma/* @ratsept
homeassistant/components/somfy/* @tetienne
homeassistant/components/somfy_mylink/* @bdraco
homeassistant/components/sonarr/* @ctalkington
homeassistant/components/songpal/* @rytilahti @shenxn
homeassistant/components/sonos/* @cgtobi
@@ -454,7 +454,7 @@ homeassistant/components/starline/* @anonym-tsk
homeassistant/components/statistics/* @fabaff
homeassistant/components/stiebel_eltron/* @fucm
homeassistant/components/stookalert/* @fwestenberg
homeassistant/components/stream/* @hunterjm @uvjustin
homeassistant/components/stream/* @hunterjm @uvjustin @allenporter
homeassistant/components/stt/* @pvizeli
homeassistant/components/subaru/* @G-Two
homeassistant/components/suez_water/* @ooii
@@ -492,6 +492,7 @@ homeassistant/components/toon/* @frenck
homeassistant/components/totalconnect/* @austinmroczek
homeassistant/components/tplink/* @rytilahti @thegardenmonkey
homeassistant/components/traccar/* @ludeeus
homeassistant/components/trace/* @home-assistant/core
homeassistant/components/trafikverket_train/* @endor-force
homeassistant/components/trafikverket_weatherstation/* @endor-force
homeassistant/components/transmission/* @engrbm87 @JPHutchins
@@ -512,7 +513,7 @@ homeassistant/components/usgs_earthquakes_feed/* @exxamalte
homeassistant/components/utility_meter/* @dgomes
homeassistant/components/velbus/* @Cereal2nd @brefra
homeassistant/components/velux/* @Julius2342
homeassistant/components/vera/* @vangorra
homeassistant/components/vera/* @pavoni
homeassistant/components/verisure/* @frenck
homeassistant/components/versasense/* @flamm3blemuff1n
homeassistant/components/version/* @fabaff @ludeeus
@@ -524,6 +525,7 @@ homeassistant/components/vizio/* @raman325
homeassistant/components/vlc_telnet/* @rodripf @dmcc
homeassistant/components/volkszaehler/* @fabaff
homeassistant/components/volumio/* @OnFreund
homeassistant/components/wake_on_lan/* @ntilley905
homeassistant/components/waqi/* @andrey-git
homeassistant/components/watson_tts/* @rutkai
homeassistant/components/weather/* @fabaff

View File

@@ -28,10 +28,11 @@ RUN git clone --depth 1 https://github.com/home-assistant/hass-release \
WORKDIR /workspaces
# Install Python dependencies from requirements
COPY requirements_test.txt requirements_test_pre_commit.txt ./
COPY requirements.txt requirements_test.txt requirements_test_pre_commit.txt ./
COPY homeassistant/package_constraints.txt homeassistant/package_constraints.txt
RUN pip3 install -r requirements_test.txt \
&& rm -rf requirements_test.txt requirements_test_pre_commit.txt homeassistant/
RUN pip3 install -r requirements.txt \
&& pip3 install -r requirements_test.txt \
&& rm -rf requirements.txt requirements_test.txt requirements_test_pre_commit.txt homeassistant/
# Set the default shell to bash instead of sh
ENV SHELL /bin/bash

View File

@@ -1,11 +1,12 @@
"""Start Home Assistant."""
from __future__ import annotations
import argparse
import os
import platform
import subprocess
import sys
import threading
from typing import List
from homeassistant.const import REQUIRED_PYTHON_VER, RESTART_EXIT_CODE, __version__
@@ -206,7 +207,7 @@ def closefds_osx(min_fd: int, max_fd: int) -> None:
pass
def cmdline() -> List[str]:
def cmdline() -> list[str]:
"""Collect path and arguments to re-execute the current hass instance."""
if os.path.basename(sys.argv[0]) == "__main__.py":
modulepath = os.path.dirname(sys.argv[0])

View File

@@ -4,7 +4,7 @@ from __future__ import annotations
import asyncio
from collections import OrderedDict
from datetime import timedelta
from typing import Any, Dict, List, Optional, Tuple, cast
from typing import Any, Dict, Optional, Tuple, cast
import jwt
@@ -36,8 +36,8 @@ class InvalidProvider(Exception):
async def auth_manager_from_config(
hass: HomeAssistant,
provider_configs: List[Dict[str, Any]],
module_configs: List[Dict[str, Any]],
provider_configs: list[dict[str, Any]],
module_configs: list[dict[str, Any]],
) -> AuthManager:
"""Initialize an auth manager from config.
@@ -87,8 +87,8 @@ class AuthManagerFlowManager(data_entry_flow.FlowManager):
self,
handler_key: Any,
*,
context: Optional[Dict[str, Any]] = None,
data: Optional[Dict[str, Any]] = None,
context: dict[str, Any] | None = None,
data: dict[str, Any] | None = None,
) -> data_entry_flow.FlowHandler:
"""Create a login flow."""
auth_provider = self.auth_manager.get_auth_provider(*handler_key)
@@ -97,8 +97,8 @@ class AuthManagerFlowManager(data_entry_flow.FlowManager):
return await auth_provider.async_login_flow(context)
async def async_finish_flow(
self, flow: data_entry_flow.FlowHandler, result: Dict[str, Any]
) -> Dict[str, Any]:
self, flow: data_entry_flow.FlowHandler, result: dict[str, Any]
) -> dict[str, Any]:
"""Return a user as result of login flow."""
flow = cast(LoginFlow, flow)
@@ -157,22 +157,22 @@ class AuthManager:
self.login_flow = AuthManagerFlowManager(hass, self)
@property
def auth_providers(self) -> List[AuthProvider]:
def auth_providers(self) -> list[AuthProvider]:
"""Return a list of available auth providers."""
return list(self._providers.values())
@property
def auth_mfa_modules(self) -> List[MultiFactorAuthModule]:
def auth_mfa_modules(self) -> list[MultiFactorAuthModule]:
"""Return a list of available auth modules."""
return list(self._mfa_modules.values())
def get_auth_provider(
self, provider_type: str, provider_id: Optional[str]
) -> Optional[AuthProvider]:
self, provider_type: str, provider_id: str | None
) -> AuthProvider | None:
"""Return an auth provider, None if not found."""
return self._providers.get((provider_type, provider_id))
def get_auth_providers(self, provider_type: str) -> List[AuthProvider]:
def get_auth_providers(self, provider_type: str) -> list[AuthProvider]:
"""Return a List of auth provider of one type, Empty if not found."""
return [
provider
@@ -180,30 +180,30 @@ class AuthManager:
if p_type == provider_type
]
def get_auth_mfa_module(self, module_id: str) -> Optional[MultiFactorAuthModule]:
def get_auth_mfa_module(self, module_id: str) -> MultiFactorAuthModule | None:
"""Return a multi-factor auth module, None if not found."""
return self._mfa_modules.get(module_id)
async def async_get_users(self) -> List[models.User]:
async def async_get_users(self) -> list[models.User]:
"""Retrieve all users."""
return await self._store.async_get_users()
async def async_get_user(self, user_id: str) -> Optional[models.User]:
async def async_get_user(self, user_id: str) -> models.User | None:
"""Retrieve a user."""
return await self._store.async_get_user(user_id)
async def async_get_owner(self) -> Optional[models.User]:
async def async_get_owner(self) -> models.User | None:
"""Retrieve the owner."""
users = await self.async_get_users()
return next((user for user in users if user.is_owner), None)
async def async_get_group(self, group_id: str) -> Optional[models.Group]:
async def async_get_group(self, group_id: str) -> models.Group | None:
"""Retrieve all groups."""
return await self._store.async_get_group(group_id)
async def async_get_user_by_credentials(
self, credentials: models.Credentials
) -> Optional[models.User]:
) -> models.User | None:
"""Get a user by credential, return None if not found."""
for user in await self.async_get_users():
for creds in user.credentials:
@@ -213,7 +213,7 @@ class AuthManager:
return None
async def async_create_system_user(
self, name: str, group_ids: Optional[List[str]] = None
self, name: str, group_ids: list[str] | None = None
) -> models.User:
"""Create a system user."""
user = await self._store.async_create_user(
@@ -225,10 +225,10 @@ class AuthManager:
return user
async def async_create_user(
self, name: str, group_ids: Optional[List[str]] = None
self, name: str, group_ids: list[str] | None = None
) -> models.User:
"""Create a user."""
kwargs: Dict[str, Any] = {
kwargs: dict[str, Any] = {
"name": name,
"is_active": True,
"group_ids": group_ids or [],
@@ -294,12 +294,12 @@ class AuthManager:
async def async_update_user(
self,
user: models.User,
name: Optional[str] = None,
is_active: Optional[bool] = None,
group_ids: Optional[List[str]] = None,
name: str | None = None,
is_active: bool | None = None,
group_ids: list[str] | None = None,
) -> None:
"""Update a user."""
kwargs: Dict[str, Any] = {}
kwargs: dict[str, Any] = {}
if name is not None:
kwargs["name"] = name
if group_ids is not None:
@@ -362,9 +362,9 @@ class AuthManager:
await module.async_depose_user(user.id)
async def async_get_enabled_mfa(self, user: models.User) -> Dict[str, str]:
async def async_get_enabled_mfa(self, user: models.User) -> dict[str, str]:
"""List enabled mfa modules for user."""
modules: Dict[str, str] = OrderedDict()
modules: dict[str, str] = OrderedDict()
for module_id, module in self._mfa_modules.items():
if await module.async_is_user_setup(user.id):
modules[module_id] = module.name
@@ -373,12 +373,12 @@ class AuthManager:
async def async_create_refresh_token(
self,
user: models.User,
client_id: Optional[str] = None,
client_name: Optional[str] = None,
client_icon: Optional[str] = None,
token_type: Optional[str] = None,
client_id: str | None = None,
client_name: str | None = None,
client_icon: str | None = None,
token_type: str | None = None,
access_token_expiration: timedelta = ACCESS_TOKEN_EXPIRATION,
credential: Optional[models.Credentials] = None,
credential: models.Credentials | None = None,
) -> models.RefreshToken:
"""Create a new refresh token for a user."""
if not user.is_active:
@@ -432,13 +432,13 @@ class AuthManager:
async def async_get_refresh_token(
self, token_id: str
) -> Optional[models.RefreshToken]:
) -> models.RefreshToken | None:
"""Get refresh token by id."""
return await self._store.async_get_refresh_token(token_id)
async def async_get_refresh_token_by_token(
self, token: str
) -> Optional[models.RefreshToken]:
) -> models.RefreshToken | None:
"""Get refresh token by token."""
return await self._store.async_get_refresh_token_by_token(token)
@@ -450,7 +450,7 @@ class AuthManager:
@callback
def async_create_access_token(
self, refresh_token: models.RefreshToken, remote_ip: Optional[str] = None
self, refresh_token: models.RefreshToken, remote_ip: str | None = None
) -> str:
"""Create a new access token."""
self.async_validate_refresh_token(refresh_token, remote_ip)
@@ -471,7 +471,7 @@ class AuthManager:
@callback
def _async_resolve_provider(
self, refresh_token: models.RefreshToken
) -> Optional[AuthProvider]:
) -> AuthProvider | None:
"""Get the auth provider for the given refresh token.
Raises an exception if the expected provider is no longer available or return
@@ -492,7 +492,7 @@ class AuthManager:
@callback
def async_validate_refresh_token(
self, refresh_token: models.RefreshToken, remote_ip: Optional[str] = None
self, refresh_token: models.RefreshToken, remote_ip: str | None = None
) -> None:
"""Validate that a refresh token is usable.
@@ -504,7 +504,7 @@ class AuthManager:
async def async_validate_access_token(
self, token: str
) -> Optional[models.RefreshToken]:
) -> models.RefreshToken | None:
"""Return refresh token if an access token is valid."""
try:
unverif_claims = jwt.decode(token, verify=False)
@@ -535,7 +535,7 @@ class AuthManager:
@callback
def _async_get_auth_provider(
self, credentials: models.Credentials
) -> Optional[AuthProvider]:
) -> AuthProvider | None:
"""Get auth provider from a set of credentials."""
auth_provider_key = (
credentials.auth_provider_type,

View File

@@ -1,10 +1,12 @@
"""Storage for auth models."""
from __future__ import annotations
import asyncio
from collections import OrderedDict
from datetime import timedelta
import hmac
from logging import getLogger
from typing import Any, Dict, List, Optional
from typing import Any
from homeassistant.auth.const import ACCESS_TOKEN_EXPIRATION
from homeassistant.core import HomeAssistant, callback
@@ -34,15 +36,15 @@ class AuthStore:
def __init__(self, hass: HomeAssistant) -> None:
"""Initialize the auth store."""
self.hass = hass
self._users: Optional[Dict[str, models.User]] = None
self._groups: Optional[Dict[str, models.Group]] = None
self._perm_lookup: Optional[PermissionLookup] = None
self._users: dict[str, models.User] | None = None
self._groups: dict[str, models.Group] | None = None
self._perm_lookup: PermissionLookup | None = None
self._store = hass.helpers.storage.Store(
STORAGE_VERSION, STORAGE_KEY, private=True
)
self._lock = asyncio.Lock()
async def async_get_groups(self) -> List[models.Group]:
async def async_get_groups(self) -> list[models.Group]:
"""Retrieve all users."""
if self._groups is None:
await self._async_load()
@@ -50,7 +52,7 @@ class AuthStore:
return list(self._groups.values())
async def async_get_group(self, group_id: str) -> Optional[models.Group]:
async def async_get_group(self, group_id: str) -> models.Group | None:
"""Retrieve all users."""
if self._groups is None:
await self._async_load()
@@ -58,7 +60,7 @@ class AuthStore:
return self._groups.get(group_id)
async def async_get_users(self) -> List[models.User]:
async def async_get_users(self) -> list[models.User]:
"""Retrieve all users."""
if self._users is None:
await self._async_load()
@@ -66,7 +68,7 @@ class AuthStore:
return list(self._users.values())
async def async_get_user(self, user_id: str) -> Optional[models.User]:
async def async_get_user(self, user_id: str) -> models.User | None:
"""Retrieve a user by id."""
if self._users is None:
await self._async_load()
@@ -76,12 +78,12 @@ class AuthStore:
async def async_create_user(
self,
name: Optional[str],
is_owner: Optional[bool] = None,
is_active: Optional[bool] = None,
system_generated: Optional[bool] = None,
credentials: Optional[models.Credentials] = None,
group_ids: Optional[List[str]] = None,
name: str | None,
is_owner: bool | None = None,
is_active: bool | None = None,
system_generated: bool | None = None,
credentials: models.Credentials | None = None,
group_ids: list[str] | None = None,
) -> models.User:
"""Create a new user."""
if self._users is None:
@@ -97,7 +99,7 @@ class AuthStore:
raise ValueError(f"Invalid group specified {group_id}")
groups.append(group)
kwargs: Dict[str, Any] = {
kwargs: dict[str, Any] = {
"name": name,
# Until we get group management, we just put everyone in the
# same group.
@@ -146,9 +148,9 @@ class AuthStore:
async def async_update_user(
self,
user: models.User,
name: Optional[str] = None,
is_active: Optional[bool] = None,
group_ids: Optional[List[str]] = None,
name: str | None = None,
is_active: bool | None = None,
group_ids: list[str] | None = None,
) -> None:
"""Update a user."""
assert self._groups is not None
@@ -203,15 +205,15 @@ class AuthStore:
async def async_create_refresh_token(
self,
user: models.User,
client_id: Optional[str] = None,
client_name: Optional[str] = None,
client_icon: Optional[str] = None,
client_id: str | None = None,
client_name: str | None = None,
client_icon: str | None = None,
token_type: str = models.TOKEN_TYPE_NORMAL,
access_token_expiration: timedelta = ACCESS_TOKEN_EXPIRATION,
credential: Optional[models.Credentials] = None,
credential: models.Credentials | None = None,
) -> models.RefreshToken:
"""Create a new token for a user."""
kwargs: Dict[str, Any] = {
kwargs: dict[str, Any] = {
"user": user,
"client_id": client_id,
"token_type": token_type,
@@ -244,7 +246,7 @@ class AuthStore:
async def async_get_refresh_token(
self, token_id: str
) -> Optional[models.RefreshToken]:
) -> models.RefreshToken | None:
"""Get refresh token by id."""
if self._users is None:
await self._async_load()
@@ -259,7 +261,7 @@ class AuthStore:
async def async_get_refresh_token_by_token(
self, token: str
) -> Optional[models.RefreshToken]:
) -> models.RefreshToken | None:
"""Get refresh token by token."""
if self._users is None:
await self._async_load()
@@ -276,7 +278,7 @@ class AuthStore:
@callback
def async_log_refresh_token_usage(
self, refresh_token: models.RefreshToken, remote_ip: Optional[str] = None
self, refresh_token: models.RefreshToken, remote_ip: str | None = None
) -> None:
"""Update refresh token last used information."""
refresh_token.last_used_at = dt_util.utcnow()
@@ -309,9 +311,9 @@ class AuthStore:
self._set_defaults()
return
users: Dict[str, models.User] = OrderedDict()
groups: Dict[str, models.Group] = OrderedDict()
credentials: Dict[str, models.Credentials] = OrderedDict()
users: dict[str, models.User] = OrderedDict()
groups: dict[str, models.Group] = OrderedDict()
credentials: dict[str, models.Credentials] = OrderedDict()
# Soft-migrating data as we load. We are going to make sure we have a
# read only group and an admin group. There are two states that we can
@@ -328,7 +330,7 @@ class AuthStore:
# was added.
for group_dict in data.get("groups", []):
policy: Optional[PolicyType] = None
policy: PolicyType | None = None
if group_dict["id"] == GROUP_ID_ADMIN:
has_admin_group = True
@@ -489,7 +491,7 @@ class AuthStore:
self._store.async_delay_save(self._data_to_save, 1)
@callback
def _data_to_save(self) -> Dict:
def _data_to_save(self) -> dict:
"""Return the data to store."""
assert self._users is not None
assert self._groups is not None
@@ -508,7 +510,7 @@ class AuthStore:
groups = []
for group in self._groups.values():
g_dict: Dict[str, Any] = {
g_dict: dict[str, Any] = {
"id": group.id,
# Name not read for sys groups. Kept here for backwards compat
"name": group.name,
@@ -567,7 +569,7 @@ class AuthStore:
"""Set default values for auth store."""
self._users = OrderedDict()
groups: Dict[str, models.Group] = OrderedDict()
groups: dict[str, models.Group] = OrderedDict()
admin_group = _system_admin_group()
groups[admin_group.id] = admin_group
user_group = _system_user_group()

View File

@@ -4,7 +4,7 @@ from __future__ import annotations
import importlib
import logging
import types
from typing import Any, Dict, Optional
from typing import Any
import voluptuous as vol
from voluptuous.humanize import humanize_error
@@ -38,7 +38,7 @@ class MultiFactorAuthModule:
DEFAULT_TITLE = "Unnamed auth module"
MAX_RETRY_TIME = 3
def __init__(self, hass: HomeAssistant, config: Dict[str, Any]) -> None:
def __init__(self, hass: HomeAssistant, config: dict[str, Any]) -> None:
"""Initialize an auth module."""
self.hass = hass
self.config = config
@@ -87,7 +87,7 @@ class MultiFactorAuthModule:
"""Return whether user is setup."""
raise NotImplementedError
async def async_validate(self, user_id: str, user_input: Dict[str, Any]) -> bool:
async def async_validate(self, user_id: str, user_input: dict[str, Any]) -> bool:
"""Return True if validation passed."""
raise NotImplementedError
@@ -104,14 +104,14 @@ class SetupFlow(data_entry_flow.FlowHandler):
self._user_id = user_id
async def async_step_init(
self, user_input: Optional[Dict[str, str]] = None
) -> Dict[str, Any]:
self, user_input: dict[str, str] | None = None
) -> dict[str, Any]:
"""Handle the first step of setup flow.
Return self.async_show_form(step_id='init') if user_input is None.
Return self.async_create_entry(data={'result': result}) if finish.
"""
errors: Dict[str, str] = {}
errors: dict[str, str] = {}
if user_input:
result = await self._auth_module.async_setup_user(self._user_id, user_input)
@@ -125,7 +125,7 @@ class SetupFlow(data_entry_flow.FlowHandler):
async def auth_mfa_module_from_config(
hass: HomeAssistant, config: Dict[str, Any]
hass: HomeAssistant, config: dict[str, Any]
) -> MultiFactorAuthModule:
"""Initialize an auth module from a config."""
module_name = config[CONF_TYPE]

View File

@@ -1,5 +1,7 @@
"""Example auth module."""
from typing import Any, Dict
from __future__ import annotations
from typing import Any
import voluptuous as vol
@@ -28,7 +30,7 @@ class InsecureExampleModule(MultiFactorAuthModule):
DEFAULT_TITLE = "Insecure Personal Identify Number"
def __init__(self, hass: HomeAssistant, config: Dict[str, Any]) -> None:
def __init__(self, hass: HomeAssistant, config: dict[str, Any]) -> None:
"""Initialize the user data store."""
super().__init__(hass, config)
self._data = config["data"]
@@ -75,17 +77,11 @@ class InsecureExampleModule(MultiFactorAuthModule):
async def async_is_user_setup(self, user_id: str) -> bool:
"""Return whether user is setup."""
for data in self._data:
if data["user_id"] == user_id:
return True
return False
return any(data["user_id"] == user_id for data in self._data)
async def async_validate(self, user_id: str, user_input: Dict[str, Any]) -> bool:
async def async_validate(self, user_id: str, user_input: dict[str, Any]) -> bool:
"""Return True if validation passed."""
for data in self._data:
if data["user_id"] == user_id:
# user_input has been validate in caller
if data["pin"] == user_input["pin"]:
return True
return False
return any(
data["user_id"] == user_id and data["pin"] == user_input["pin"]
for data in self._data
)

View File

@@ -2,10 +2,12 @@
Sending HOTP through notify service
"""
from __future__ import annotations
import asyncio
from collections import OrderedDict
import logging
from typing import Any, Dict, List, Optional
from typing import Any, Dict
import attr
import voluptuous as vol
@@ -79,8 +81,8 @@ class NotifySetting:
secret: str = attr.ib(factory=_generate_secret) # not persistent
counter: int = attr.ib(factory=_generate_random) # not persistent
notify_service: Optional[str] = attr.ib(default=None)
target: Optional[str] = attr.ib(default=None)
notify_service: str | None = attr.ib(default=None)
target: str | None = attr.ib(default=None)
_UsersDict = Dict[str, NotifySetting]
@@ -92,10 +94,10 @@ class NotifyAuthModule(MultiFactorAuthModule):
DEFAULT_TITLE = "Notify One-Time Password"
def __init__(self, hass: HomeAssistant, config: Dict[str, Any]) -> None:
def __init__(self, hass: HomeAssistant, config: dict[str, Any]) -> None:
"""Initialize the user data store."""
super().__init__(hass, config)
self._user_settings: Optional[_UsersDict] = None
self._user_settings: _UsersDict | None = None
self._user_store = hass.helpers.storage.Store(
STORAGE_VERSION, STORAGE_KEY, private=True
)
@@ -146,7 +148,7 @@ class NotifyAuthModule(MultiFactorAuthModule):
)
@callback
def aync_get_available_notify_services(self) -> List[str]:
def aync_get_available_notify_services(self) -> list[str]:
"""Return list of notify services."""
unordered_services = set()
@@ -198,7 +200,7 @@ class NotifyAuthModule(MultiFactorAuthModule):
return user_id in self._user_settings
async def async_validate(self, user_id: str, user_input: Dict[str, Any]) -> bool:
async def async_validate(self, user_id: str, user_input: dict[str, Any]) -> bool:
"""Return True if validation passed."""
if self._user_settings is None:
await self._async_load()
@@ -258,7 +260,7 @@ class NotifyAuthModule(MultiFactorAuthModule):
)
async def async_notify(
self, code: str, notify_service: str, target: Optional[str] = None
self, code: str, notify_service: str, target: str | None = None
) -> None:
"""Send code by notify service."""
data = {"message": self._message_template.format(code)}
@@ -276,23 +278,23 @@ class NotifySetupFlow(SetupFlow):
auth_module: NotifyAuthModule,
setup_schema: vol.Schema,
user_id: str,
available_notify_services: List[str],
available_notify_services: list[str],
) -> None:
"""Initialize the setup flow."""
super().__init__(auth_module, setup_schema, user_id)
# to fix typing complaint
self._auth_module: NotifyAuthModule = auth_module
self._available_notify_services = available_notify_services
self._secret: Optional[str] = None
self._count: Optional[int] = None
self._notify_service: Optional[str] = None
self._target: Optional[str] = None
self._secret: str | None = None
self._count: int | None = None
self._notify_service: str | None = None
self._target: str | None = None
async def async_step_init(
self, user_input: Optional[Dict[str, str]] = None
) -> Dict[str, Any]:
self, user_input: dict[str, str] | None = None
) -> dict[str, Any]:
"""Let user select available notify services."""
errors: Dict[str, str] = {}
errors: dict[str, str] = {}
hass = self._auth_module.hass
if user_input:
@@ -306,7 +308,7 @@ class NotifySetupFlow(SetupFlow):
if not self._available_notify_services:
return self.async_abort(reason="no_available_service")
schema: Dict[str, Any] = OrderedDict()
schema: dict[str, Any] = OrderedDict()
schema["notify_service"] = vol.In(self._available_notify_services)
schema["target"] = vol.Optional(str)
@@ -315,10 +317,10 @@ class NotifySetupFlow(SetupFlow):
)
async def async_step_setup(
self, user_input: Optional[Dict[str, str]] = None
) -> Dict[str, Any]:
self, user_input: dict[str, str] | None = None
) -> dict[str, Any]:
"""Verify user can receive one-time password."""
errors: Dict[str, str] = {}
errors: dict[str, str] = {}
hass = self._auth_module.hass
if user_input:

View File

@@ -1,7 +1,9 @@
"""Time-based One Time Password auth module."""
from __future__ import annotations
import asyncio
from io import BytesIO
from typing import Any, Dict, Optional, Tuple
from typing import Any
import voluptuous as vol
@@ -50,7 +52,7 @@ def _generate_qr_code(data: str) -> str:
)
def _generate_secret_and_qr_code(username: str) -> Tuple[str, str, str]:
def _generate_secret_and_qr_code(username: str) -> tuple[str, str, str]:
"""Generate a secret, url, and QR code."""
import pyotp # pylint: disable=import-outside-toplevel
@@ -69,10 +71,10 @@ class TotpAuthModule(MultiFactorAuthModule):
DEFAULT_TITLE = "Time-based One Time Password"
MAX_RETRY_TIME = 5
def __init__(self, hass: HomeAssistant, config: Dict[str, Any]) -> None:
def __init__(self, hass: HomeAssistant, config: dict[str, Any]) -> None:
"""Initialize the user data store."""
super().__init__(hass, config)
self._users: Optional[Dict[str, str]] = None
self._users: dict[str, str] | None = None
self._user_store = hass.helpers.storage.Store(
STORAGE_VERSION, STORAGE_KEY, private=True
)
@@ -100,7 +102,7 @@ class TotpAuthModule(MultiFactorAuthModule):
"""Save data."""
await self._user_store.async_save({STORAGE_USERS: self._users})
def _add_ota_secret(self, user_id: str, secret: Optional[str] = None) -> str:
def _add_ota_secret(self, user_id: str, secret: str | None = None) -> str:
"""Create a ota_secret for user."""
import pyotp # pylint: disable=import-outside-toplevel
@@ -145,7 +147,7 @@ class TotpAuthModule(MultiFactorAuthModule):
return user_id in self._users # type: ignore
async def async_validate(self, user_id: str, user_input: Dict[str, Any]) -> bool:
async def async_validate(self, user_id: str, user_input: dict[str, Any]) -> bool:
"""Return True if validation passed."""
if self._users is None:
await self._async_load()
@@ -181,13 +183,13 @@ class TotpSetupFlow(SetupFlow):
# to fix typing complaint
self._auth_module: TotpAuthModule = auth_module
self._user = user
self._ota_secret: Optional[str] = None
self._ota_secret: str | None = None
self._url = None # type Optional[str]
self._image = None # type Optional[str]
async def async_step_init(
self, user_input: Optional[Dict[str, str]] = None
) -> Dict[str, Any]:
self, user_input: dict[str, str] | None = None
) -> dict[str, Any]:
"""Handle the first step of setup flow.
Return self.async_show_form(step_id='init') if user_input is None.
@@ -195,7 +197,7 @@ class TotpSetupFlow(SetupFlow):
"""
import pyotp # pylint: disable=import-outside-toplevel
errors: Dict[str, str] = {}
errors: dict[str, str] = {}
if user_input:
verified = await self.hass.async_add_executor_job(

View File

@@ -1,7 +1,9 @@
"""Auth models."""
from __future__ import annotations
from datetime import datetime, timedelta
import secrets
from typing import Dict, List, NamedTuple, Optional
from typing import NamedTuple
import uuid
import attr
@@ -21,7 +23,7 @@ TOKEN_TYPE_LONG_LIVED_ACCESS_TOKEN = "long_lived_access_token"
class Group:
"""A group."""
name: Optional[str] = attr.ib()
name: str | None = attr.ib()
policy: perm_mdl.PolicyType = attr.ib()
id: str = attr.ib(factory=lambda: uuid.uuid4().hex)
system_generated: bool = attr.ib(default=False)
@@ -31,24 +33,24 @@ class Group:
class User:
"""A user."""
name: Optional[str] = attr.ib()
name: str | None = attr.ib()
perm_lookup: perm_mdl.PermissionLookup = attr.ib(eq=False, order=False)
id: str = attr.ib(factory=lambda: uuid.uuid4().hex)
is_owner: bool = attr.ib(default=False)
is_active: bool = attr.ib(default=False)
system_generated: bool = attr.ib(default=False)
groups: List[Group] = attr.ib(factory=list, eq=False, order=False)
groups: list[Group] = attr.ib(factory=list, eq=False, order=False)
# List of credentials of a user.
credentials: List["Credentials"] = attr.ib(factory=list, eq=False, order=False)
credentials: list[Credentials] = attr.ib(factory=list, eq=False, order=False)
# Tokens associated with a user.
refresh_tokens: Dict[str, "RefreshToken"] = attr.ib(
refresh_tokens: dict[str, RefreshToken] = attr.ib(
factory=dict, eq=False, order=False
)
_permissions: Optional[perm_mdl.PolicyPermissions] = attr.ib(
_permissions: perm_mdl.PolicyPermissions | None = attr.ib(
init=False,
eq=False,
order=False,
@@ -89,10 +91,10 @@ class RefreshToken:
"""RefreshToken for a user to grant new access tokens."""
user: User = attr.ib()
client_id: Optional[str] = attr.ib()
client_id: str | None = attr.ib()
access_token_expiration: timedelta = attr.ib()
client_name: Optional[str] = attr.ib(default=None)
client_icon: Optional[str] = attr.ib(default=None)
client_name: str | None = attr.ib(default=None)
client_icon: str | None = attr.ib(default=None)
token_type: str = attr.ib(
default=TOKEN_TYPE_NORMAL,
validator=attr.validators.in_(
@@ -104,12 +106,12 @@ class RefreshToken:
token: str = attr.ib(factory=lambda: secrets.token_hex(64))
jwt_key: str = attr.ib(factory=lambda: secrets.token_hex(64))
last_used_at: Optional[datetime] = attr.ib(default=None)
last_used_ip: Optional[str] = attr.ib(default=None)
last_used_at: datetime | None = attr.ib(default=None)
last_used_ip: str | None = attr.ib(default=None)
credential: Optional["Credentials"] = attr.ib(default=None)
credential: Credentials | None = attr.ib(default=None)
version: Optional[str] = attr.ib(default=__version__)
version: str | None = attr.ib(default=__version__)
@attr.s(slots=True)
@@ -117,7 +119,7 @@ class Credentials:
"""Credentials for a user on an auth provider."""
auth_provider_type: str = attr.ib()
auth_provider_id: Optional[str] = attr.ib()
auth_provider_id: str | None = attr.ib()
# Allow the auth provider to store data to represent their auth.
data: dict = attr.ib()
@@ -129,5 +131,5 @@ class Credentials:
class UserMeta(NamedTuple):
"""User metadata."""
name: Optional[str]
name: str | None
is_active: bool

View File

@@ -1,6 +1,8 @@
"""Permissions for Home Assistant."""
from __future__ import annotations
import logging
from typing import Any, Callable, Optional
from typing import Any, Callable
import voluptuous as vol
@@ -19,7 +21,7 @@ _LOGGER = logging.getLogger(__name__)
class AbstractPermissions:
"""Default permissions class."""
_cached_entity_func: Optional[Callable[[str, str], bool]] = None
_cached_entity_func: Callable[[str, str], bool] | None = None
def _entity_func(self) -> Callable[[str, str], bool]:
"""Return a function that can test entity access."""

View File

@@ -1,6 +1,8 @@
"""Entity permissions."""
from __future__ import annotations
from collections import OrderedDict
from typing import Callable, Optional
from typing import Callable
import voluptuous as vol
@@ -43,14 +45,14 @@ ENTITY_POLICY_SCHEMA = vol.Any(
def _lookup_domain(
perm_lookup: PermissionLookup, domains_dict: SubCategoryDict, entity_id: str
) -> Optional[ValueType]:
) -> ValueType | None:
"""Look up entity permissions by domain."""
return domains_dict.get(entity_id.split(".", 1)[0])
def _lookup_area(
perm_lookup: PermissionLookup, area_dict: SubCategoryDict, entity_id: str
) -> Optional[ValueType]:
) -> ValueType | None:
"""Look up entity permissions by area."""
entity_entry = perm_lookup.entity_registry.async_get(entity_id)
@@ -67,7 +69,7 @@ def _lookup_area(
def _lookup_device(
perm_lookup: PermissionLookup, devices_dict: SubCategoryDict, entity_id: str
) -> Optional[ValueType]:
) -> ValueType | None:
"""Look up entity permissions by device."""
entity_entry = perm_lookup.entity_registry.async_get(entity_id)
@@ -79,7 +81,7 @@ def _lookup_device(
def _lookup_entity_id(
perm_lookup: PermissionLookup, entities_dict: SubCategoryDict, entity_id: str
) -> Optional[ValueType]:
) -> ValueType | None:
"""Look up entity permission by entity id."""
return entities_dict.get(entity_id)

View File

@@ -1,13 +1,15 @@
"""Merging of policies."""
from typing import Dict, List, Set, cast
from __future__ import annotations
from typing import cast
from .types import CategoryType, PolicyType
def merge_policies(policies: List[PolicyType]) -> PolicyType:
def merge_policies(policies: list[PolicyType]) -> PolicyType:
"""Merge policies."""
new_policy: Dict[str, CategoryType] = {}
seen: Set[str] = set()
new_policy: dict[str, CategoryType] = {}
seen: set[str] = set()
for policy in policies:
for category in policy:
if category in seen:
@@ -20,7 +22,7 @@ def merge_policies(policies: List[PolicyType]) -> PolicyType:
return new_policy
def _merge_policies(sources: List[CategoryType]) -> CategoryType:
def _merge_policies(sources: list[CategoryType]) -> CategoryType:
"""Merge a policy."""
# When merging policies, the most permissive wins.
# This means we order it like this:
@@ -34,7 +36,7 @@ def _merge_policies(sources: List[CategoryType]) -> CategoryType:
# merge each key in the source.
policy: CategoryType = None
seen: Set[str] = set()
seen: set[str] = set()
for source in sources:
if source is None:
continue

View File

@@ -1,11 +1,12 @@
"""Models for permissions."""
from __future__ import annotations
from typing import TYPE_CHECKING
import attr
if TYPE_CHECKING:
# pylint: disable=unused-import
from homeassistant.helpers import ( # noqa: F401
from homeassistant.helpers import (
device_registry as dev_reg,
entity_registry as ent_reg,
)
@@ -15,5 +16,5 @@ if TYPE_CHECKING:
class PermissionLookup:
"""Class to hold data for permission lookups."""
entity_registry: "ent_reg.EntityRegistry" = attr.ib()
device_registry: "dev_reg.DeviceRegistry" = attr.ib()
entity_registry: ent_reg.EntityRegistry = attr.ib()
device_registry: dev_reg.DeviceRegistry = attr.ib()

View File

@@ -1,6 +1,8 @@
"""Helpers to deal with permissions."""
from __future__ import annotations
from functools import wraps
from typing import Callable, Dict, List, Optional, cast
from typing import Callable, Dict, Optional, cast
from .const import SUBCAT_ALL
from .models import PermissionLookup
@@ -45,7 +47,7 @@ def compile_policy(
assert isinstance(policy, dict)
funcs: List[Callable[[str, str], Optional[bool]]] = []
funcs: list[Callable[[str, str], bool | None]] = []
for key, lookup_func in subcategories.items():
lookup_value = policy.get(key)
@@ -80,10 +82,10 @@ def compile_policy(
def _gen_dict_test_func(
perm_lookup: PermissionLookup, lookup_func: LookupFunc, lookup_dict: SubCategoryDict
) -> Callable[[str, str], Optional[bool]]:
) -> Callable[[str, str], bool | None]:
"""Generate a lookup function."""
def test_value(object_id: str, key: str) -> Optional[bool]:
def test_value(object_id: str, key: str) -> bool | None:
"""Test if permission is allowed based on the keys."""
schema: ValueType = lookup_func(perm_lookup, lookup_dict, object_id)

View File

@@ -4,7 +4,7 @@ from __future__ import annotations
import importlib
import logging
import types
from typing import Any, Dict, List, Optional
from typing import Any
import voluptuous as vol
from voluptuous.humanize import humanize_error
@@ -42,7 +42,7 @@ class AuthProvider:
DEFAULT_TITLE = "Unnamed auth provider"
def __init__(
self, hass: HomeAssistant, store: AuthStore, config: Dict[str, Any]
self, hass: HomeAssistant, store: AuthStore, config: dict[str, Any]
) -> None:
"""Initialize an auth provider."""
self.hass = hass
@@ -50,7 +50,7 @@ class AuthProvider:
self.config = config
@property
def id(self) -> Optional[str]:
def id(self) -> str | None:
"""Return id of the auth provider.
Optional, can be None.
@@ -72,7 +72,7 @@ class AuthProvider:
"""Return whether multi-factor auth supported by the auth provider."""
return True
async def async_credentials(self) -> List[Credentials]:
async def async_credentials(self) -> list[Credentials]:
"""Return all credentials of this provider."""
users = await self.store.async_get_users()
return [
@@ -86,7 +86,7 @@ class AuthProvider:
]
@callback
def async_create_credentials(self, data: Dict[str, str]) -> Credentials:
def async_create_credentials(self, data: dict[str, str]) -> Credentials:
"""Create credentials."""
return Credentials(
auth_provider_type=self.type, auth_provider_id=self.id, data=data
@@ -94,7 +94,7 @@ class AuthProvider:
# Implement by extending class
async def async_login_flow(self, context: Optional[Dict]) -> LoginFlow:
async def async_login_flow(self, context: dict | None) -> LoginFlow:
"""Return the data flow for logging in with auth provider.
Auth provider should extend LoginFlow and return an instance.
@@ -102,7 +102,7 @@ class AuthProvider:
raise NotImplementedError
async def async_get_or_create_credentials(
self, flow_result: Dict[str, str]
self, flow_result: dict[str, str]
) -> Credentials:
"""Get credentials based on the flow result."""
raise NotImplementedError
@@ -121,7 +121,7 @@ class AuthProvider:
@callback
def async_validate_refresh_token(
self, refresh_token: RefreshToken, remote_ip: Optional[str] = None
self, refresh_token: RefreshToken, remote_ip: str | None = None
) -> None:
"""Verify a refresh token is still valid.
@@ -131,7 +131,7 @@ class AuthProvider:
async def auth_provider_from_config(
hass: HomeAssistant, store: AuthStore, config: Dict[str, Any]
hass: HomeAssistant, store: AuthStore, config: dict[str, Any]
) -> AuthProvider:
"""Initialize an auth provider from a config."""
provider_name = config[CONF_TYPE]
@@ -188,17 +188,17 @@ class LoginFlow(data_entry_flow.FlowHandler):
def __init__(self, auth_provider: AuthProvider) -> None:
"""Initialize the login flow."""
self._auth_provider = auth_provider
self._auth_module_id: Optional[str] = None
self._auth_module_id: str | None = None
self._auth_manager = auth_provider.hass.auth
self.available_mfa_modules: Dict[str, str] = {}
self.available_mfa_modules: dict[str, str] = {}
self.created_at = dt_util.utcnow()
self.invalid_mfa_times = 0
self.user: Optional[User] = None
self.credential: Optional[Credentials] = None
self.user: User | None = None
self.credential: Credentials | None = None
async def async_step_init(
self, user_input: Optional[Dict[str, str]] = None
) -> Dict[str, Any]:
self, user_input: dict[str, str] | None = None
) -> dict[str, Any]:
"""Handle the first step of login flow.
Return self.async_show_form(step_id='init') if user_input is None.
@@ -207,8 +207,8 @@ class LoginFlow(data_entry_flow.FlowHandler):
raise NotImplementedError
async def async_step_select_mfa_module(
self, user_input: Optional[Dict[str, str]] = None
) -> Dict[str, Any]:
self, user_input: dict[str, str] | None = None
) -> dict[str, Any]:
"""Handle the step of select mfa module."""
errors = {}
@@ -232,8 +232,8 @@ class LoginFlow(data_entry_flow.FlowHandler):
)
async def async_step_mfa(
self, user_input: Optional[Dict[str, str]] = None
) -> Dict[str, Any]:
self, user_input: dict[str, str] | None = None
) -> dict[str, Any]:
"""Handle the step of mfa validation."""
assert self.credential
assert self.user
@@ -273,7 +273,7 @@ class LoginFlow(data_entry_flow.FlowHandler):
if not errors:
return await self.async_finish(self.credential)
description_placeholders: Dict[str, Optional[str]] = {
description_placeholders: dict[str, str | None] = {
"mfa_module_name": auth_module.name,
"mfa_module_id": auth_module.id,
}
@@ -285,6 +285,6 @@ class LoginFlow(data_entry_flow.FlowHandler):
errors=errors,
)
async def async_finish(self, flow_result: Any) -> Dict:
async def async_finish(self, flow_result: Any) -> dict:
"""Handle the pass of login flow."""
return self.async_create_entry(title=self._auth_provider.name, data=flow_result)

View File

@@ -1,10 +1,11 @@
"""Auth provider that validates credentials via an external command."""
from __future__ import annotations
import asyncio.subprocess
import collections
import logging
import os
from typing import Any, Dict, Optional, cast
from typing import Any, cast
import voluptuous as vol
@@ -51,9 +52,9 @@ class CommandLineAuthProvider(AuthProvider):
attributes provided by external programs.
"""
super().__init__(*args, **kwargs)
self._user_meta: Dict[str, Dict[str, Any]] = {}
self._user_meta: dict[str, dict[str, Any]] = {}
async def async_login_flow(self, context: Optional[dict]) -> LoginFlow:
async def async_login_flow(self, context: dict | None) -> LoginFlow:
"""Return a flow to login."""
return CommandLineLoginFlow(self)
@@ -82,7 +83,7 @@ class CommandLineAuthProvider(AuthProvider):
raise InvalidAuthError
if self.config[CONF_META]:
meta: Dict[str, str] = {}
meta: dict[str, str] = {}
for _line in stdout.splitlines():
try:
line = _line.decode().lstrip()
@@ -99,7 +100,7 @@ class CommandLineAuthProvider(AuthProvider):
self._user_meta[username] = meta
async def async_get_or_create_credentials(
self, flow_result: Dict[str, str]
self, flow_result: dict[str, str]
) -> Credentials:
"""Get credentials based on the flow result."""
username = flow_result["username"]
@@ -125,8 +126,8 @@ class CommandLineLoginFlow(LoginFlow):
"""Handler for the login flow."""
async def async_step_init(
self, user_input: Optional[Dict[str, str]] = None
) -> Dict[str, Any]:
self, user_input: dict[str, str] | None = None
) -> dict[str, Any]:
"""Handle the step of the form."""
errors = {}
@@ -143,7 +144,7 @@ class CommandLineLoginFlow(LoginFlow):
user_input.pop("password")
return await self.async_finish(user_input)
schema: Dict[str, type] = collections.OrderedDict()
schema: dict[str, type] = collections.OrderedDict()
schema["username"] = str
schema["password"] = str

View File

@@ -5,7 +5,7 @@ import asyncio
import base64
from collections import OrderedDict
import logging
from typing import Any, Dict, List, Optional, Set, cast
from typing import Any, cast
import bcrypt
import voluptuous as vol
@@ -21,7 +21,7 @@ STORAGE_VERSION = 1
STORAGE_KEY = "auth_provider.homeassistant"
def _disallow_id(conf: Dict[str, Any]) -> Dict[str, Any]:
def _disallow_id(conf: dict[str, Any]) -> dict[str, Any]:
"""Disallow ID in config."""
if CONF_ID in conf:
raise vol.Invalid("ID is not allowed for the homeassistant auth provider.")
@@ -62,7 +62,7 @@ class Data:
self._store = hass.helpers.storage.Store(
STORAGE_VERSION, STORAGE_KEY, private=True
)
self._data: Optional[Dict[str, Any]] = None
self._data: dict[str, Any] | None = None
# Legacy mode will allow usernames to start/end with whitespace
# and will compare usernames case-insensitive.
# Remove in 2020 or when we launch 1.0.
@@ -83,7 +83,7 @@ class Data:
if data is None:
data = {"users": []}
seen: Set[str] = set()
seen: set[str] = set()
for user in data["users"]:
username = user["username"]
@@ -121,7 +121,7 @@ class Data:
self._data = data
@property
def users(self) -> List[Dict[str, str]]:
def users(self) -> list[dict[str, str]]:
"""Return users."""
return self._data["users"] # type: ignore
@@ -220,7 +220,7 @@ class HassAuthProvider(AuthProvider):
def __init__(self, *args: Any, **kwargs: Any) -> None:
"""Initialize an Home Assistant auth provider."""
super().__init__(*args, **kwargs)
self.data: Optional[Data] = None
self.data: Data | None = None
self._init_lock = asyncio.Lock()
async def async_initialize(self) -> None:
@@ -233,7 +233,7 @@ class HassAuthProvider(AuthProvider):
await data.async_load()
self.data = data
async def async_login_flow(self, context: Optional[Dict]) -> LoginFlow:
async def async_login_flow(self, context: dict | None) -> LoginFlow:
"""Return a flow to login."""
return HassLoginFlow(self)
@@ -277,7 +277,7 @@ class HassAuthProvider(AuthProvider):
await self.data.async_save()
async def async_get_or_create_credentials(
self, flow_result: Dict[str, str]
self, flow_result: dict[str, str]
) -> Credentials:
"""Get credentials based on the flow result."""
if self.data is None:
@@ -318,8 +318,8 @@ class HassLoginFlow(LoginFlow):
"""Handler for the login flow."""
async def async_step_init(
self, user_input: Optional[Dict[str, str]] = None
) -> Dict[str, Any]:
self, user_input: dict[str, str] | None = None
) -> dict[str, Any]:
"""Handle the step of the form."""
errors = {}
@@ -335,7 +335,7 @@ class HassLoginFlow(LoginFlow):
user_input.pop("password")
return await self.async_finish(user_input)
schema: Dict[str, type] = OrderedDict()
schema: dict[str, type] = OrderedDict()
schema["username"] = str
schema["password"] = str

View File

@@ -1,7 +1,9 @@
"""Example auth provider."""
from __future__ import annotations
from collections import OrderedDict
import hmac
from typing import Any, Dict, Optional, cast
from typing import Any, cast
import voluptuous as vol
@@ -33,7 +35,7 @@ class InvalidAuthError(HomeAssistantError):
class ExampleAuthProvider(AuthProvider):
"""Example auth provider based on hardcoded usernames and passwords."""
async def async_login_flow(self, context: Optional[Dict]) -> LoginFlow:
async def async_login_flow(self, context: dict | None) -> LoginFlow:
"""Return a flow to login."""
return ExampleLoginFlow(self)
@@ -60,7 +62,7 @@ class ExampleAuthProvider(AuthProvider):
raise InvalidAuthError
async def async_get_or_create_credentials(
self, flow_result: Dict[str, str]
self, flow_result: dict[str, str]
) -> Credentials:
"""Get credentials based on the flow result."""
username = flow_result["username"]
@@ -94,8 +96,8 @@ class ExampleLoginFlow(LoginFlow):
"""Handler for the login flow."""
async def async_step_init(
self, user_input: Optional[Dict[str, str]] = None
) -> Dict[str, Any]:
self, user_input: dict[str, str] | None = None
) -> dict[str, Any]:
"""Handle the step of the form."""
errors = {}
@@ -111,7 +113,7 @@ class ExampleLoginFlow(LoginFlow):
user_input.pop("password")
return await self.async_finish(user_input)
schema: Dict[str, type] = OrderedDict()
schema: dict[str, type] = OrderedDict()
schema["username"] = str
schema["password"] = str

View File

@@ -3,8 +3,10 @@ Support Legacy API password auth provider.
It will be removed when auth system production ready
"""
from __future__ import annotations
import hmac
from typing import Any, Dict, Optional, cast
from typing import Any, cast
import voluptuous as vol
@@ -40,7 +42,7 @@ class LegacyApiPasswordAuthProvider(AuthProvider):
"""Return api_password."""
return str(self.config[CONF_API_PASSWORD])
async def async_login_flow(self, context: Optional[Dict]) -> LoginFlow:
async def async_login_flow(self, context: dict | None) -> LoginFlow:
"""Return a flow to login."""
return LegacyLoginFlow(self)
@@ -55,7 +57,7 @@ class LegacyApiPasswordAuthProvider(AuthProvider):
raise InvalidAuthError
async def async_get_or_create_credentials(
self, flow_result: Dict[str, str]
self, flow_result: dict[str, str]
) -> Credentials:
"""Return credentials for this login."""
credentials = await self.async_credentials()
@@ -79,8 +81,8 @@ class LegacyLoginFlow(LoginFlow):
"""Handler for the login flow."""
async def async_step_init(
self, user_input: Optional[Dict[str, str]] = None
) -> Dict[str, Any]:
self, user_input: dict[str, str] | None = None
) -> dict[str, Any]:
"""Handle the step of the form."""
errors = {}

View File

@@ -3,6 +3,8 @@
It shows list of users if access from trusted network.
Abort login flow if not access from trusted network.
"""
from __future__ import annotations
from ipaddress import (
IPv4Address,
IPv4Network,
@@ -11,7 +13,7 @@ from ipaddress import (
ip_address,
ip_network,
)
from typing import Any, Dict, List, Optional, Union, cast
from typing import Any, Dict, List, Union, cast
import voluptuous as vol
@@ -68,12 +70,12 @@ class TrustedNetworksAuthProvider(AuthProvider):
DEFAULT_TITLE = "Trusted Networks"
@property
def trusted_networks(self) -> List[IPNetwork]:
def trusted_networks(self) -> list[IPNetwork]:
"""Return trusted networks."""
return cast(List[IPNetwork], self.config[CONF_TRUSTED_NETWORKS])
@property
def trusted_users(self) -> Dict[IPNetwork, Any]:
def trusted_users(self) -> dict[IPNetwork, Any]:
"""Return trusted users per network."""
return cast(Dict[IPNetwork, Any], self.config[CONF_TRUSTED_USERS])
@@ -82,7 +84,7 @@ class TrustedNetworksAuthProvider(AuthProvider):
"""Trusted Networks auth provider does not support MFA."""
return False
async def async_login_flow(self, context: Optional[Dict]) -> LoginFlow:
async def async_login_flow(self, context: dict | None) -> LoginFlow:
"""Return a flow to login."""
assert context is not None
ip_addr = cast(IPAddress, context.get("ip_address"))
@@ -111,7 +113,7 @@ class TrustedNetworksAuthProvider(AuthProvider):
if (
user.id in user_list
or any(
[group.id in flattened_group_list for group in user.groups]
group.id in flattened_group_list for group in user.groups
)
)
]
@@ -125,7 +127,7 @@ class TrustedNetworksAuthProvider(AuthProvider):
)
async def async_get_or_create_credentials(
self, flow_result: Dict[str, str]
self, flow_result: dict[str, str]
) -> Credentials:
"""Get credentials based on the flow result."""
user_id = flow_result["user"]
@@ -169,7 +171,7 @@ class TrustedNetworksAuthProvider(AuthProvider):
@callback
def async_validate_refresh_token(
self, refresh_token: RefreshToken, remote_ip: Optional[str] = None
self, refresh_token: RefreshToken, remote_ip: str | None = None
) -> None:
"""Verify a refresh token is still valid."""
if remote_ip is None:
@@ -186,7 +188,7 @@ class TrustedNetworksLoginFlow(LoginFlow):
self,
auth_provider: TrustedNetworksAuthProvider,
ip_addr: IPAddress,
available_users: Dict[str, Optional[str]],
available_users: dict[str, str | None],
allow_bypass_login: bool,
) -> None:
"""Initialize the login flow."""
@@ -196,8 +198,8 @@ class TrustedNetworksLoginFlow(LoginFlow):
self._allow_bypass_login = allow_bypass_login
async def async_step_init(
self, user_input: Optional[Dict[str, str]] = None
) -> Dict[str, Any]:
self, user_input: dict[str, str] | None = None
) -> dict[str, Any]:
"""Handle the step of the form."""
try:
cast(

View File

@@ -1,4 +1,6 @@
"""Provide methods to bootstrap a Home Assistant instance."""
from __future__ import annotations
import asyncio
import contextlib
from datetime import datetime
@@ -8,7 +10,7 @@ import os
import sys
import threading
from time import monotonic
from typing import TYPE_CHECKING, Any, Dict, Optional, Set
from typing import TYPE_CHECKING, Any
import voluptuous as vol
import yarl
@@ -28,7 +30,6 @@ from homeassistant.setup import (
from homeassistant.util.async_ import gather_with_concurrency
from homeassistant.util.logging import async_activate_log_queue_handler
from homeassistant.util.package import async_get_user_site, is_virtual_env
from homeassistant.util.yaml import clear_secret_cache
if TYPE_CHECKING:
from .runner import RuntimeConfig
@@ -75,8 +76,8 @@ STAGE_1_INTEGRATIONS = {
async def async_setup_hass(
runtime_config: "RuntimeConfig",
) -> Optional[core.HomeAssistant]:
runtime_config: RuntimeConfig,
) -> core.HomeAssistant | None:
"""Set up Home Assistant."""
hass = core.HomeAssistant()
hass.config.config_dir = runtime_config.config_dir
@@ -122,8 +123,6 @@ async def async_setup_hass(
basic_setup_success = (
await async_from_config_dict(config_dict, hass) is not None
)
finally:
clear_secret_cache()
if config_dict is None:
safe_mode = True
@@ -191,7 +190,7 @@ def open_hass_ui(hass: core.HomeAssistant) -> None:
async def async_from_config_dict(
config: ConfigType, hass: core.HomeAssistant
) -> Optional[core.HomeAssistant]:
) -> core.HomeAssistant | None:
"""Try to configure Home Assistant from a configuration dictionary.
Dynamically loads required components and its dependencies.
@@ -258,8 +257,8 @@ async def async_from_config_dict(
def async_enable_logging(
hass: core.HomeAssistant,
verbose: bool = False,
log_rotate_days: Optional[int] = None,
log_file: Optional[str] = None,
log_rotate_days: int | None = None,
log_file: str | None = None,
log_no_color: bool = False,
) -> None:
"""Set up the logging.
@@ -365,7 +364,7 @@ async def async_mount_local_lib_path(config_dir: str) -> str:
@core.callback
def _get_domains(hass: core.HomeAssistant, config: Dict[str, Any]) -> Set[str]:
def _get_domains(hass: core.HomeAssistant, config: dict[str, Any]) -> set[str]:
"""Get domains of components to set up."""
# Filter out the repeating and common config section [homeassistant]
domains = {key.split(" ")[0] for key in config if key != core.DOMAIN}
@@ -382,7 +381,7 @@ def _get_domains(hass: core.HomeAssistant, config: Dict[str, Any]) -> Set[str]:
async def _async_log_pending_setups(
hass: core.HomeAssistant, domains: Set[str], setup_started: Dict[str, datetime]
hass: core.HomeAssistant, domains: set[str], setup_started: dict[str, datetime]
) -> None:
"""Periodic log of setups that are pending for longer than LOG_SLOW_STARTUP_INTERVAL."""
while True:
@@ -399,9 +398,9 @@ async def _async_log_pending_setups(
async def async_setup_multi_components(
hass: core.HomeAssistant,
domains: Set[str],
config: Dict[str, Any],
setup_started: Dict[str, datetime],
domains: set[str],
config: dict[str, Any],
setup_started: dict[str, datetime],
) -> None:
"""Set up multiple domains. Log on failure."""
futures = {
@@ -425,7 +424,7 @@ async def async_setup_multi_components(
async def _async_set_up_integrations(
hass: core.HomeAssistant, config: Dict[str, Any]
hass: core.HomeAssistant, config: dict[str, Any]
) -> None:
"""Set up all the integrations."""
setup_started = hass.data[DATA_SETUP_STARTED] = {}
@@ -433,7 +432,7 @@ async def _async_set_up_integrations(
# Resolve all dependencies so we know all integrations
# that will have to be loaded and start rightaway
integration_cache: Dict[str, loader.Integration] = {}
integration_cache: dict[str, loader.Integration] = {}
to_resolve = domains_to_setup
while to_resolve:
old_to_resolve = to_resolve

View File

@@ -66,7 +66,7 @@ CAPTURE_IMAGE_SCHEMA = vol.Schema({ATTR_ENTITY_ID: cv.entity_ids})
AUTOMATION_SCHEMA = vol.Schema({ATTR_ENTITY_ID: cv.entity_ids})
ABODE_PLATFORMS = [
PLATFORMS = [
"alarm_control_panel",
"binary_sensor",
"lock",
@@ -138,7 +138,7 @@ async def async_setup_entry(hass, config_entry):
hass.data[DOMAIN] = AbodeSystem(abode, polling)
for platform in ABODE_PLATFORMS:
for platform in PLATFORMS:
hass.async_create_task(
hass.config_entries.async_forward_entry_setup(config_entry, platform)
)
@@ -158,7 +158,7 @@ async def async_unload_entry(hass, config_entry):
tasks = []
for platform in ABODE_PLATFORMS:
for platform in PLATFORMS:
tasks.append(
hass.config_entries.async_forward_entry_unload(config_entry, platform)
)
@@ -363,7 +363,7 @@ class AbodeDevice(AbodeEntity):
return self._device.name
@property
def device_state_attributes(self):
def extra_state_attributes(self):
"""Return the state attributes."""
return {
ATTR_ATTRIBUTION: ATTRIBUTION,
@@ -411,7 +411,7 @@ class AbodeAutomation(AbodeEntity):
return self._automation.name
@property
def device_state_attributes(self):
def extra_state_attributes(self):
"""Return the state attributes."""
return {ATTR_ATTRIBUTION: ATTRIBUTION, "type": "CUE automation"}

View File

@@ -69,7 +69,7 @@ class AbodeAlarm(AbodeDevice, alarm.AlarmControlPanelEntity):
self._device.set_away()
@property
def device_state_attributes(self):
def extra_state_attributes(self):
"""Return the state attributes."""
return {
ATTR_ATTRIBUTION: ATTRIBUTION,

View File

@@ -8,7 +8,7 @@ import voluptuous as vol
from homeassistant import config_entries
from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, HTTP_BAD_REQUEST
from .const import DEFAULT_CACHEDB, DOMAIN, LOGGER # pylint: disable=unused-import
from .const import DEFAULT_CACHEDB, DOMAIN, LOGGER
CONF_MFA = "mfa_code"
CONF_POLLING = "polling"
@@ -163,7 +163,7 @@ class AbodeFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
async def async_step_import(self, import_config):
"""Import a config entry from configuration.yaml."""
if self._async_current_entries():
LOGGER.warning("Already configured. Only a single configuration possible.")
LOGGER.warning("Already configured; Only a single configuration possible")
return self.async_abort(reason="single_instance_allowed")
self._polling = import_config.get(CONF_POLLING, False)

View File

@@ -1,6 +1,7 @@
"""Support for Abode Security System sensors."""
import abodepy.helpers.constants as CONST
from homeassistant.components.sensor import SensorEntity
from homeassistant.const import (
DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_ILLUMINANCE,
@@ -33,7 +34,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
async_add_entities(entities)
class AbodeSensor(AbodeDevice):
class AbodeSensor(AbodeDevice, SensorEntity):
"""A sensor implementation for Abode devices."""
def __init__(self, data, device, sensor_type):

View File

@@ -0,0 +1,12 @@
{
"config": {
"step": {
"user": {
"data": {
"password": "\u06a9\u0644\u0645\u0647 \u0639\u0628\u0648\u0631",
"username": "\u0627\u06cc\u0645\u06cc\u0644"
}
}
}
}
}

View File

@@ -0,0 +1,11 @@
{
"config": {
"step": {
"user": {
"data": {
"username": "\u05e9\u05dd \u05de\u05e9\u05ea\u05de\u05e9"
}
}
}
}
}

View File

@@ -1,16 +1,25 @@
{
"config": {
"abort": {
"single_instance_allowed": "Csak egyetlen Abode konfigur\u00e1ci\u00f3 enged\u00e9lyezett."
"reauth_successful": "Az \u00fajrahiteles\u00edt\u00e9s sikeres volt",
"single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges."
},
"error": {
"cannot_connect": "Sikertelen csatlakoz\u00e1s",
"invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s",
"invalid_mfa_code": "\u00c9rv\u00e9nytelen MFA k\u00f3d"
},
"step": {
"mfa": {
"data": {
"mfa_code": "MFA k\u00f3d (6 jegy\u0171)"
},
"title": "Add meg az Abode MFA k\u00f3dj\u00e1t"
},
"reauth_confirm": {
"data": {
"password": "Jelsz\u00f3",
"username": "E-mail"
}
},
"user": {

View File

@@ -0,0 +1,35 @@
{
"config": {
"abort": {
"reauth_successful": "Autentikasi ulang berhasil",
"single_instance_allowed": "Sudah dikonfigurasi. Hanya satu konfigurasi yang diizinkan."
},
"error": {
"cannot_connect": "Gagal terhubung",
"invalid_auth": "Autentikasi tidak valid",
"invalid_mfa_code": "Kode MFA tidak valid"
},
"step": {
"mfa": {
"data": {
"mfa_code": "Kode MFA (6 digit)"
},
"title": "Masukkan kode MFA Anda untuk Abode"
},
"reauth_confirm": {
"data": {
"password": "Kata Sandi",
"username": "Email"
},
"title": "Masukkan informasi masuk Abode Anda"
},
"user": {
"data": {
"password": "Kata Sandi",
"username": "Email"
},
"title": "Masukkan informasi masuk Abode Anda"
}
}
}
}

View File

@@ -2,18 +2,26 @@
"config": {
"abort": {
"reauth_successful": "\uc7ac\uc778\uc99d\uc5d0 \uc131\uacf5\ud588\uc2b5\ub2c8\ub2e4",
"single_instance_allowed": "\uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ud558\ub098\uc758 \uad6c\uc131\ub9cc \uac00\ub2a5\ud569\ub2c8\ub2e4."
"single_instance_allowed": "\uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ud558\ub098\uc758 \uc778\uc2a4\ud134\uc2a4\ub9cc \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."
},
"error": {
"cannot_connect": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4",
"invalid_auth": "\uc778\uc99d\uc774 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4"
"invalid_auth": "\uc778\uc99d\uc774 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4",
"invalid_mfa_code": "MFA \ucf54\ub4dc\uac00 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4"
},
"step": {
"mfa": {
"data": {
"mfa_code": "MFA \ucf54\ub4dc (6\uc790\ub9ac)"
},
"title": "Abode\uc5d0 \ub300\ud55c MFA \ucf54\ub4dc\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694"
},
"reauth_confirm": {
"data": {
"password": "\ube44\ubc00\ubc88\ud638",
"username": "\uc774\uba54\uc77c"
}
},
"title": "Abode \ub85c\uadf8\uc778 \uc815\ubcf4 \uc785\ub825\ud558\uae30"
},
"user": {
"data": {

View File

@@ -8,8 +8,6 @@ from aiohttp.client_exceptions import ClientConnectorError
from async_timeout import timeout
from homeassistant.const import CONF_API_KEY
from homeassistant.core import Config, HomeAssistant
from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
@@ -26,12 +24,6 @@ _LOGGER = logging.getLogger(__name__)
PLATFORMS = ["sensor", "weather"]
async def async_setup(hass: HomeAssistant, config: Config) -> bool:
"""Set up configured AccuWeather."""
hass.data.setdefault(DOMAIN, {})
return True
async def async_setup_entry(hass, config_entry) -> bool:
"""Set up AccuWeather as config entry."""
api_key = config_entry.data[CONF_API_KEY]
@@ -45,21 +37,18 @@ async def async_setup_entry(hass, config_entry) -> bool:
coordinator = AccuWeatherDataUpdateCoordinator(
hass, websession, api_key, location_key, forecast
)
await coordinator.async_refresh()
if not coordinator.last_update_success:
raise ConfigEntryNotReady
await coordinator.async_config_entry_first_refresh()
undo_listener = config_entry.add_update_listener(update_listener)
hass.data[DOMAIN][config_entry.entry_id] = {
hass.data.setdefault(DOMAIN, {})[config_entry.entry_id] = {
COORDINATOR: coordinator,
UNDO_UPDATE_LISTENER: undo_listener,
}
for component in PLATFORMS:
for platform in PLATFORMS:
hass.async_create_task(
hass.config_entries.async_forward_entry_setup(config_entry, component)
hass.config_entries.async_forward_entry_setup(config_entry, platform)
)
return True
@@ -70,8 +59,8 @@ async def async_unload_entry(hass, config_entry):
unload_ok = all(
await asyncio.gather(
*[
hass.config_entries.async_forward_entry_unload(config_entry, component)
for component in PLATFORMS
hass.config_entries.async_forward_entry_unload(config_entry, platform)
for platform in PLATFORMS
]
)
)

View File

@@ -13,7 +13,7 @@ from homeassistant.core import callback
from homeassistant.helpers.aiohttp_client import async_get_clientsession
import homeassistant.helpers.config_validation as cv
from .const import CONF_FORECAST, DOMAIN # pylint:disable=unused-import
from .const import CONF_FORECAST, DOMAIN
class AccuWeatherFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):

View File

@@ -2,7 +2,7 @@
"domain": "accuweather",
"name": "AccuWeather",
"documentation": "https://www.home-assistant.io/integrations/accuweather/",
"requirements": ["accuweather==0.1.0"],
"requirements": ["accuweather==0.1.1"],
"codeowners": ["@bieniu"],
"config_flow": true,
"quality_scale": "platinum"

View File

@@ -1,4 +1,5 @@
"""Support for the AccuWeather service."""
from homeassistant.components.sensor import SensorEntity
from homeassistant.const import (
ATTR_ATTRIBUTION,
ATTR_DEVICE_CLASS,
@@ -48,7 +49,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
async_add_entities(sensors, False)
class AccuWeatherSensor(CoordinatorEntity):
class AccuWeatherSensor(CoordinatorEntity, SensorEntity):
"""Define an AccuWeather entity."""
def __init__(self, name, kind, coordinator, forecast_day=None):
@@ -141,7 +142,7 @@ class AccuWeatherSensor(CoordinatorEntity):
return SENSOR_TYPES[self.kind][self._unit_system]
@property
def device_state_attributes(self):
def extra_state_attributes(self):
"""Return the state attributes."""
if self.forecast_day is not None:
if self.kind in ["WindDay", "WindNight", "WindGustDay", "WindGustNight"]:

View File

@@ -5,7 +5,8 @@
},
"error": {
"cannot_connect": "Verbindung fehlgeschlagen",
"invalid_api_key": "Ung\u00fcltiger API-Schl\u00fcssel"
"invalid_api_key": "Ung\u00fcltiger API-Schl\u00fcssel",
"requests_exceeded": "Die zul\u00e4ssige Anzahl von Anforderungen an die Accuweather-API wurde \u00fcberschritten. Sie m\u00fcssen warten oder den API-Schl\u00fcssel \u00e4ndern."
},
"step": {
"user": {

View File

@@ -0,0 +1,11 @@
{
"config": {
"step": {
"user": {
"data": {
"longitude": "\u05e7\u05d5 \u05d0\u05d5\u05e8\u05da"
}
}
}
}
}

View File

@@ -0,0 +1,29 @@
{
"config": {
"abort": {
"single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges."
},
"error": {
"cannot_connect": "Sikertelen csatlakoz\u00e1s",
"invalid_api_key": "\u00c9rv\u00e9nytelen API kulcs"
},
"step": {
"user": {
"data": {
"api_key": "API kulcs",
"latitude": "Sz\u00e9less\u00e9g",
"longitude": "Hossz\u00fas\u00e1g",
"name": "N\u00e9v"
},
"title": "AccuWeather"
}
}
},
"options": {
"step": {
"user": {
"title": "AccuWeather be\u00e1ll\u00edt\u00e1sok"
}
}
}
}

View File

@@ -0,0 +1,41 @@
{
"config": {
"abort": {
"single_instance_allowed": "Sudah dikonfigurasi. Hanya satu konfigurasi yang diizinkan."
},
"error": {
"cannot_connect": "Gagal terhubung",
"invalid_api_key": "Kunci API tidak valid",
"requests_exceeded": "Jumlah permintaan yang diizinkan ke API Accuweather telah terlampaui. Anda harus menunggu atau mengubah Kunci API."
},
"step": {
"user": {
"data": {
"api_key": "Kunci API",
"latitude": "Lintang",
"longitude": "Bujur",
"name": "Nama"
},
"description": "Jika Anda memerlukan bantuan tentang konfigurasi, baca di sini: https://www.home-assistant.io/integrations/accuweather/\n\nBeberapa sensor tidak diaktifkan secara default. Anda dapat mengaktifkannya di registri entitas setelah konfigurasi integrasi.\nPrakiraan cuaca tidak diaktifkan secara default. Anda dapat mengaktifkannya di opsi integrasi.",
"title": "AccuWeather"
}
}
},
"options": {
"step": {
"user": {
"data": {
"forecast": "Prakiraan cuaca"
},
"description": "Karena keterbatasan versi gratis kunci API AccuWeather, ketika Anda mengaktifkan prakiraan cuaca, pembaruan data akan dilakukan setiap 80 menit, bukan setiap 40 menit.",
"title": "Opsi AccuWeather"
}
}
},
"system_health": {
"info": {
"can_reach_server": "Keterjangkauan server AccuWeather",
"remaining_requests": "Sisa permintaan yang diizinkan"
}
}
}

View File

@@ -1,11 +1,12 @@
{
"config": {
"abort": {
"single_instance_allowed": "\uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ud558\ub098\uc758 \uad6c\uc131\ub9cc \uac00\ub2a5\ud569\ub2c8\ub2e4."
"single_instance_allowed": "\uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ud558\ub098\uc758 \uc778\uc2a4\ud134\uc2a4\ub9cc \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."
},
"error": {
"cannot_connect": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4",
"invalid_api_key": "API \ud0a4\uac00 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4"
"invalid_api_key": "API \ud0a4\uac00 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4",
"requests_exceeded": "Accuweather API\uc5d0 \ud5c8\uc6a9\ub41c \uc694\uccad \uc218\uac00 \ucd08\uacfc\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uae30\ub2e4\ub9ac\uac70\ub098 API \ud0a4\ub97c \ubcc0\uacbd\ud574\uc57c \ud569\ub2c8\ub2e4."
},
"step": {
"user": {
@@ -15,15 +16,26 @@
"longitude": "\uacbd\ub3c4",
"name": "\uc774\ub984"
},
"description": "\uad6c\uc131\uc5d0 \ub300\ud55c \ub3c4\uc6c0\uc774 \ud544\uc694\ud55c \uacbd\uc6b0 \ub2e4\uc74c\uc744 \ucc38\uc870\ud574\uc8fc\uc138\uc694:\nhttps://www.home-assistant.io/integrations/accuweather/\n\n\uc77c\ubd80 \uc13c\uc11c\ub294 \uae30\ubcf8\uc801\uc73c\ub85c \ud65c\uc131\ud654\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc5f0\ub3d9 \uad6c\uc131 \ud6c4 \uad6c\uc131\uc694\uc18c \ub808\uc9c0\uc2a4\ud2b8\ub9ac\uc5d0\uc11c \ud65c\uc131\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\uc77c\uae30\uc608\ubcf4\ub294 \uae30\ubcf8\uc801\uc73c\ub85c \ud65c\uc131\ud654\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc5f0\ub3d9 \uc635\uc158\uc5d0\uc11c \ud65c\uc131\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."
"description": "\uad6c\uc131\uc5d0 \ub300\ud55c \ub3c4\uc6c0\uc774 \ud544\uc694\ud55c \uacbd\uc6b0 \ub2e4\uc74c\uc744 \ucc38\uc870\ud574\uc8fc\uc138\uc694: https://www.home-assistant.io/integrations/accuweather/\n\n\uc77c\ubd80 \uc13c\uc11c\ub294 \uae30\ubcf8\uc801\uc73c\ub85c \ud65c\uc131\ud654\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ud1b5\ud569 \uad6c\uc131\uc694\uc18c \uad6c\uc131 \ud6c4 \uad6c\uc131\uc694\uc18c \ub808\uc9c0\uc2a4\ud2b8\ub9ac\uc5d0\uc11c \ud65c\uc131\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\uc77c\uae30\uc608\ubcf4\ub294 \uae30\ubcf8\uc801\uc73c\ub85c \ud65c\uc131\ud654\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ud1b5\ud569 \uad6c\uc131\uc694\uc18c \uc635\uc158\uc5d0\uc11c \ud65c\uc131\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",
"title": "AccuWeather"
}
}
},
"options": {
"step": {
"user": {
"description": "\ubb34\ub8cc \ubc84\uc804\uc758 AccuWeather API \ud0a4\ub85c \uc77c\uae30\uc608\ubcf4\ub97c \ud65c\uc131\ud654\ud55c \uacbd\uc6b0 \uc81c\ud55c\uc0ac\ud56d\uc73c\ub85c \uc778\ud574 \uc5c5\ub370\uc774\ud2b8\ub294 40 \ubd84\uc774 \uc544\ub2cc 80 \ubd84\ub9c8\ub2e4 \uc218\ud589\ub429\ub2c8\ub2e4."
"data": {
"forecast": "\ub0a0\uc528 \uc608\ubcf4"
},
"description": "\ubb34\ub8cc \ubc84\uc804\uc758 AccuWeather API \ud0a4\ub85c \uc77c\uae30\uc608\ubcf4\ub97c \ud65c\uc131\ud654\ud55c \uacbd\uc6b0 \uc81c\ud55c\uc0ac\ud56d\uc73c\ub85c \uc778\ud574 \uc5c5\ub370\uc774\ud2b8\ub294 40 \ubd84\uc774 \uc544\ub2cc 80 \ubd84\ub9c8\ub2e4 \uc218\ud589\ub429\ub2c8\ub2e4.",
"title": "AccuWeather \uc635\uc158"
}
}
},
"system_health": {
"info": {
"can_reach_server": "AccuWeather \uc11c\ubc84 \uc5f0\uacb0",
"remaining_requests": "\ub0a8\uc740 \ud5c8\uc6a9 \uc694\uccad \ud69f\uc218"
}
}
}

View File

@@ -31,5 +31,11 @@
"title": "AccuWeather-opties"
}
}
},
"system_health": {
"info": {
"can_reach_server": "Kan AccuWeather server bereiken",
"remaining_requests": "Resterende toegestane verzoeken"
}
}
}

View File

@@ -0,0 +1,9 @@
{
"state": {
"accuweather__pressure_tendency": {
"falling": "Cs\u00f6kken\u0151",
"rising": "Emelked\u0151",
"steady": "\u00c1lland\u00f3"
}
}
}

View File

@@ -0,0 +1,9 @@
{
"state": {
"accuweather__pressure_tendency": {
"falling": "Turun",
"rising": "Naik",
"steady": "Tetap"
}
}
}

View File

@@ -0,0 +1,9 @@
{
"state": {
"accuweather__pressure_tendency": {
"falling": "\ud558\uac15",
"rising": "\uc0c1\uc2b9",
"steady": "\uc548\uc815"
}
}
}

View File

@@ -132,7 +132,7 @@ class AcerSwitch(SwitchEntity):
return self._state
@property
def state_attributes(self):
def extra_state_attributes(self):
"""Return state attributes."""
return self._attributes

View File

@@ -11,11 +11,6 @@ CONF_HUBS = "hubs"
PLATFORMS = ["cover", "sensor"]
async def async_setup(hass: core.HomeAssistant, config: dict):
"""Set up the Rollease Acmeda Automate component."""
return True
async def async_setup_entry(
hass: core.HomeAssistant, config_entry: config_entries.ConfigEntry
):
@@ -28,9 +23,9 @@ async def async_setup_entry(
hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN][config_entry.entry_id] = hub
for component in PLATFORMS:
for platform in PLATFORMS:
hass.async_create_task(
hass.config_entries.async_forward_entry_setup(config_entry, component)
hass.config_entries.async_forward_entry_setup(config_entry, platform)
)
return True
@@ -45,8 +40,8 @@ async def async_unload_entry(
unload_ok = all(
await asyncio.gather(
*[
hass.config_entries.async_forward_entry_unload(config_entry, component)
for component in PLATFORMS
hass.config_entries.async_forward_entry_unload(config_entry, platform)
for platform in PLATFORMS
]
)
)

View File

@@ -1,6 +1,8 @@
"""Config flow for Rollease Acmeda Automate Pulse Hub."""
from __future__ import annotations
import asyncio
from typing import Dict, Optional
from contextlib import suppress
import aiopulse
import async_timeout
@@ -8,7 +10,7 @@ import voluptuous as vol
from homeassistant import config_entries
from .const import DOMAIN # pylint: disable=unused-import
from .const import DOMAIN
class AcmedaFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
@@ -19,7 +21,7 @@ class AcmedaFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
def __init__(self):
"""Initialize the config flow."""
self.discovered_hubs: Optional[Dict[str, aiopulse.Hub]] = None
self.discovered_hubs: dict[str, aiopulse.Hub] | None = None
async def async_step_user(self, user_input=None):
"""Handle a flow initialized by the user."""
@@ -36,15 +38,13 @@ class AcmedaFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
}
hubs = []
try:
with async_timeout.timeout(5):
with suppress(asyncio.TimeoutError):
async with async_timeout.timeout(5):
async for hub in aiopulse.Hub.discover():
if hub.id not in already_configured:
hubs.append(hub)
except asyncio.TimeoutError:
pass
if len(hubs) == 0:
if not hubs:
return self.async_abort(reason="no_devices_found")
if len(hubs) == 1:

View File

@@ -1,6 +1,7 @@
"""Code to handle a Pulse Hub."""
from __future__ import annotations
import asyncio
from typing import Optional
import aiopulse
@@ -17,7 +18,7 @@ class PulseHub:
"""Initialize the system."""
self.config_entry = config_entry
self.hass = hass
self.api: Optional[aiopulse.Hub] = None
self.api: aiopulse.Hub | None = None
self.tasks = []
self.current_rollers = {}
self.cleanup_callbacks = []

View File

@@ -1,4 +1,5 @@
"""Support for Acmeda Roller Blind Batteries."""
from homeassistant.components.sensor import SensorEntity
from homeassistant.const import DEVICE_CLASS_BATTERY, PERCENTAGE
from homeassistant.core import callback
from homeassistant.helpers.dispatcher import async_dispatcher_connect
@@ -29,7 +30,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
)
class AcmedaBattery(AcmedaBase):
class AcmedaBattery(AcmedaBase, SensorEntity):
"""Representation of a Acmeda cover device."""
device_class = DEVICE_CLASS_BATTERY

View File

@@ -0,0 +1,7 @@
{
"config": {
"abort": {
"no_devices_found": "Nem tal\u00e1lhat\u00f3 eszk\u00f6z a h\u00e1l\u00f3zaton"
}
}
}

View File

@@ -0,0 +1,15 @@
{
"config": {
"abort": {
"no_devices_found": "Tidak ada perangkat yang ditemukan di jaringan"
},
"step": {
"user": {
"data": {
"id": "ID Host"
},
"title": "Pilih hub untuk ditambahkan"
}
}
}
}

View File

@@ -53,7 +53,7 @@ class ActiontecDeviceScanner(DeviceScanner):
self.last_results = []
data = self.get_actiontec_data()
self.success_init = data is not None
_LOGGER.info("canner initialized")
_LOGGER.info("Scanner initialized")
def scan_devices(self):
"""Scan for new devices and return a list with found device IDs."""

View File

@@ -1,6 +1,8 @@
"""Support for AdGuard Home."""
from __future__ import annotations
import logging
from typing import Any, Dict
from typing import Any
from adguardhome import AdGuardHome, AdGuardHomeConnectionError, AdGuardHomeError
import voluptuous as vol
@@ -27,11 +29,11 @@ from homeassistant.const import (
CONF_USERNAME,
CONF_VERIFY_SSL,
)
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.entity import Entity
from homeassistant.helpers.typing import ConfigType, HomeAssistantType
_LOGGER = logging.getLogger(__name__)
@@ -43,13 +45,10 @@ SERVICE_REFRESH_SCHEMA = vol.Schema(
{vol.Optional(CONF_FORCE, default=False): cv.boolean}
)
async def async_setup(hass: HomeAssistantType, config: ConfigType) -> bool:
"""Set up the AdGuard Home components."""
return True
PLATFORMS = ["sensor", "switch"]
async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry) -> bool:
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up AdGuard Home from a config entry."""
session = async_get_clientsession(hass, entry.data[CONF_VERIFY_SSL])
adguard = AdGuardHome(
@@ -69,32 +68,36 @@ async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry) -> bool
except AdGuardHomeConnectionError as exception:
raise ConfigEntryNotReady from exception
for component in "sensor", "switch":
for platform in PLATFORMS:
hass.async_create_task(
hass.config_entries.async_forward_entry_setup(entry, component)
hass.config_entries.async_forward_entry_setup(entry, platform)
)
async def add_url(call) -> None:
"""Service call to add a new filter subscription to AdGuard Home."""
await adguard.filtering.add_url(
call.data.get(CONF_NAME), call.data.get(CONF_URL)
allowlist=False, name=call.data.get(CONF_NAME), url=call.data.get(CONF_URL)
)
async def remove_url(call) -> None:
"""Service call to remove a filter subscription from AdGuard Home."""
await adguard.filtering.remove_url(call.data.get(CONF_URL))
await adguard.filtering.remove_url(allowlist=False, url=call.data.get(CONF_URL))
async def enable_url(call) -> None:
"""Service call to enable a filter subscription in AdGuard Home."""
await adguard.filtering.enable_url(call.data.get(CONF_URL))
await adguard.filtering.enable_url(allowlist=False, url=call.data.get(CONF_URL))
async def disable_url(call) -> None:
"""Service call to disable a filter subscription in AdGuard Home."""
await adguard.filtering.disable_url(call.data.get(CONF_URL))
await adguard.filtering.disable_url(
allowlist=False, url=call.data.get(CONF_URL)
)
async def refresh(call) -> None:
"""Service call to refresh the filter subscriptions in AdGuard Home."""
await adguard.filtering.refresh(call.data.get(CONF_FORCE))
await adguard.filtering.refresh(
allowlist=False, force=call.data.get(CONF_FORCE)
)
hass.services.async_register(
DOMAIN, SERVICE_ADD_URL, add_url, schema=SERVICE_ADD_URL_SCHEMA
@@ -115,7 +118,7 @@ async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry) -> bool
return True
async def async_unload_entry(hass: HomeAssistantType, entry: ConfigType) -> bool:
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Unload AdGuard Home config entry."""
hass.services.async_remove(DOMAIN, SERVICE_ADD_URL)
hass.services.async_remove(DOMAIN, SERVICE_REMOVE_URL)
@@ -123,8 +126,8 @@ async def async_unload_entry(hass: HomeAssistantType, entry: ConfigType) -> bool
hass.services.async_remove(DOMAIN, SERVICE_DISABLE_URL)
hass.services.async_remove(DOMAIN, SERVICE_REFRESH)
for component in "sensor", "switch":
await hass.config_entries.async_forward_entry_unload(entry, component)
for platform in PLATFORMS:
await hass.config_entries.async_forward_entry_unload(entry, platform)
del hass.data[DOMAIN]
@@ -189,7 +192,7 @@ class AdGuardHomeDeviceEntity(AdGuardHomeEntity):
"""Defines a AdGuard Home device entity."""
@property
def device_info(self) -> Dict[str, Any]:
def device_info(self) -> dict[str, Any]:
"""Return device information about this AdGuard Home instance."""
return {
"identifiers": {

View File

@@ -1,9 +1,12 @@
"""Config flow to configure the AdGuard Home integration."""
from __future__ import annotations
from typing import Any
from adguardhome import AdGuardHome, AdGuardHomeConnectionError
import voluptuous as vol
from homeassistant import config_entries
from homeassistant.components.adguard.const import DOMAIN
from homeassistant.config_entries import ConfigFlow
from homeassistant.const import (
CONF_HOST,
@@ -15,9 +18,10 @@ from homeassistant.const import (
)
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from .const import DOMAIN
@config_entries.HANDLERS.register(DOMAIN)
class AdGuardHomeFlowHandler(ConfigFlow):
class AdGuardHomeFlowHandler(ConfigFlow, domain=DOMAIN):
"""Handle a AdGuard Home config flow."""
VERSION = 1
@@ -25,7 +29,9 @@ class AdGuardHomeFlowHandler(ConfigFlow):
_hassio_discovery = None
async def _show_setup_form(self, errors=None):
async def _show_setup_form(
self, errors: dict[str, str] | None = None
) -> dict[str, Any]:
"""Show the setup form to the user."""
return self.async_show_form(
step_id="user",
@@ -42,7 +48,9 @@ class AdGuardHomeFlowHandler(ConfigFlow):
errors=errors or {},
)
async def _show_hassio_form(self, errors=None):
async def _show_hassio_form(
self, errors: dict[str, str] | None = None
) -> dict[str, Any]:
"""Show the Hass.io confirmation form to the user."""
return self.async_show_form(
step_id="hassio_confirm",
@@ -51,7 +59,9 @@ class AdGuardHomeFlowHandler(ConfigFlow):
errors=errors or {},
)
async def async_step_user(self, user_input=None):
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> dict[str, Any]:
"""Handle a flow initiated by the user."""
if self._async_current_entries():
return self.async_abort(reason="single_instance_allowed")
@@ -91,7 +101,7 @@ class AdGuardHomeFlowHandler(ConfigFlow):
},
)
async def async_step_hassio(self, discovery_info):
async def async_step_hassio(self, discovery_info: dict[str, Any]) -> dict[str, Any]:
"""Prepare configuration for a Hass.io AdGuard Home add-on.
This flow is triggered by the discovery component.
@@ -100,6 +110,7 @@ class AdGuardHomeFlowHandler(ConfigFlow):
if not entries:
self._hassio_discovery = discovery_info
await self._async_handle_discovery_without_unique_id()
return await self.async_step_hassio_confirm()
cur_entry = entries[0]
@@ -129,7 +140,9 @@ class AdGuardHomeFlowHandler(ConfigFlow):
return self.async_abort(reason="existing_instance_updated")
async def async_step_hassio_confirm(self, user_input=None):
async def async_step_hassio_confirm(
self, user_input: dict[str, Any] | None = None
) -> dict[str, Any]:
"""Confirm Hass.io discovery."""
if user_input is None:
return await self._show_hassio_form()

View File

@@ -3,6 +3,6 @@
"name": "AdGuard Home",
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/adguard",
"requirements": ["adguardhome==0.4.2"],
"requirements": ["adguardhome==0.5.0"],
"codeowners": ["@frenck"]
}

View File

@@ -1,25 +1,29 @@
"""Support for AdGuard Home sensors."""
from __future__ import annotations
from datetime import timedelta
from typing import Callable
from adguardhome import AdGuardHomeConnectionError
from adguardhome import AdGuardHome, AdGuardHomeConnectionError
from homeassistant.components.adguard import AdGuardHomeDeviceEntity
from homeassistant.components.adguard.const import (
DATA_ADGUARD_CLIENT,
DATA_ADGUARD_VERION,
DOMAIN,
)
from homeassistant.components.sensor import SensorEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import PERCENTAGE, TIME_MILLISECONDS
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import PlatformNotReady
from homeassistant.helpers.typing import HomeAssistantType
from homeassistant.helpers.entity import Entity
from . import AdGuardHomeDeviceEntity
from .const import DATA_ADGUARD_CLIENT, DATA_ADGUARD_VERION, DOMAIN
SCAN_INTERVAL = timedelta(seconds=300)
PARALLEL_UPDATES = 4
async def async_setup_entry(
hass: HomeAssistantType, entry: ConfigEntry, async_add_entities
hass: HomeAssistant,
entry: ConfigEntry,
async_add_entities: Callable[[list[Entity], bool], None],
) -> None:
"""Set up AdGuard Home sensor based on a config entry."""
adguard = hass.data[DOMAIN][DATA_ADGUARD_CLIENT]
@@ -45,12 +49,12 @@ async def async_setup_entry(
async_add_entities(sensors, True)
class AdGuardHomeSensor(AdGuardHomeDeviceEntity):
class AdGuardHomeSensor(AdGuardHomeDeviceEntity, SensorEntity):
"""Defines a AdGuard Home sensor."""
def __init__(
self,
adguard,
adguard: AdGuardHome,
name: str,
icon: str,
measurement: str,
@@ -78,12 +82,12 @@ class AdGuardHomeSensor(AdGuardHomeDeviceEntity):
)
@property
def state(self):
def state(self) -> str | None:
"""Return the state of the sensor."""
return self._state
@property
def unit_of_measurement(self) -> str:
def unit_of_measurement(self) -> str | None:
"""Return the unit this state is expressed in."""
return self._unit_of_measurement
@@ -91,7 +95,7 @@ class AdGuardHomeSensor(AdGuardHomeDeviceEntity):
class AdGuardHomeDNSQueriesSensor(AdGuardHomeSensor):
"""Defines a AdGuard Home DNS Queries sensor."""
def __init__(self, adguard):
def __init__(self, adguard: AdGuardHome) -> None:
"""Initialize AdGuard Home sensor."""
super().__init__(
adguard, "AdGuard DNS Queries", "mdi:magnify", "dns_queries", "queries"
@@ -105,7 +109,7 @@ class AdGuardHomeDNSQueriesSensor(AdGuardHomeSensor):
class AdGuardHomeBlockedFilteringSensor(AdGuardHomeSensor):
"""Defines a AdGuard Home blocked by filtering sensor."""
def __init__(self, adguard):
def __init__(self, adguard: AdGuardHome) -> None:
"""Initialize AdGuard Home sensor."""
super().__init__(
adguard,
@@ -124,7 +128,7 @@ class AdGuardHomeBlockedFilteringSensor(AdGuardHomeSensor):
class AdGuardHomePercentageBlockedSensor(AdGuardHomeSensor):
"""Defines a AdGuard Home blocked percentage sensor."""
def __init__(self, adguard):
def __init__(self, adguard: AdGuardHome) -> None:
"""Initialize AdGuard Home sensor."""
super().__init__(
adguard,
@@ -143,7 +147,7 @@ class AdGuardHomePercentageBlockedSensor(AdGuardHomeSensor):
class AdGuardHomeReplacedParentalSensor(AdGuardHomeSensor):
"""Defines a AdGuard Home replaced by parental control sensor."""
def __init__(self, adguard):
def __init__(self, adguard: AdGuardHome) -> None:
"""Initialize AdGuard Home sensor."""
super().__init__(
adguard,
@@ -161,7 +165,7 @@ class AdGuardHomeReplacedParentalSensor(AdGuardHomeSensor):
class AdGuardHomeReplacedSafeBrowsingSensor(AdGuardHomeSensor):
"""Defines a AdGuard Home replaced by safe browsing sensor."""
def __init__(self, adguard):
def __init__(self, adguard: AdGuardHome) -> None:
"""Initialize AdGuard Home sensor."""
super().__init__(
adguard,
@@ -179,7 +183,7 @@ class AdGuardHomeReplacedSafeBrowsingSensor(AdGuardHomeSensor):
class AdGuardHomeReplacedSafeSearchSensor(AdGuardHomeSensor):
"""Defines a AdGuard Home replaced by safe search sensor."""
def __init__(self, adguard):
def __init__(self, adguard: AdGuardHome) -> None:
"""Initialize AdGuard Home sensor."""
super().__init__(
adguard,
@@ -197,7 +201,7 @@ class AdGuardHomeReplacedSafeSearchSensor(AdGuardHomeSensor):
class AdGuardHomeAverageProcessingTimeSensor(AdGuardHomeSensor):
"""Defines a AdGuard Home average processing time sensor."""
def __init__(self, adguard):
def __init__(self, adguard: AdGuardHome) -> None:
"""Initialize AdGuard Home sensor."""
super().__init__(
adguard,
@@ -216,7 +220,7 @@ class AdGuardHomeAverageProcessingTimeSensor(AdGuardHomeSensor):
class AdGuardHomeRulesCountSensor(AdGuardHomeSensor):
"""Defines a AdGuard Home rules count sensor."""
def __init__(self, adguard):
def __init__(self, adguard: AdGuardHome) -> None:
"""Initialize AdGuard Home sensor."""
super().__init__(
adguard,
@@ -229,4 +233,4 @@ class AdGuardHomeRulesCountSensor(AdGuardHomeSensor):
async def _adguard_update(self) -> None:
"""Update AdGuard Home entity."""
self._state = await self.adguard.filtering.rules_count()
self._state = await self.adguard.filtering.rules_count(allowlist=False)

View File

@@ -13,8 +13,8 @@
}
},
"hassio_confirm": {
"title": "AdGuard Home via Hass.io add-on",
"description": "Do you want to configure Home Assistant to connect to the AdGuard Home provided by the Hass.io add-on: {addon}?"
"title": "AdGuard Home via Home Assistant add-on",
"description": "Do you want to configure Home Assistant to connect to the AdGuard Home provided by the add-on: {addon}?"
}
},
"error": {

View File

@@ -1,19 +1,20 @@
"""Support for AdGuard Home switches."""
from __future__ import annotations
from datetime import timedelta
import logging
from typing import Callable
from adguardhome import AdGuardHomeConnectionError, AdGuardHomeError
from adguardhome import AdGuardHome, AdGuardHomeConnectionError, AdGuardHomeError
from homeassistant.components.adguard import AdGuardHomeDeviceEntity
from homeassistant.components.adguard.const import (
DATA_ADGUARD_CLIENT,
DATA_ADGUARD_VERION,
DOMAIN,
)
from homeassistant.components.switch import SwitchEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import PlatformNotReady
from homeassistant.helpers.typing import HomeAssistantType
from homeassistant.helpers.entity import Entity
from . import AdGuardHomeDeviceEntity
from .const import DATA_ADGUARD_CLIENT, DATA_ADGUARD_VERION, DOMAIN
_LOGGER = logging.getLogger(__name__)
@@ -22,7 +23,9 @@ PARALLEL_UPDATES = 1
async def async_setup_entry(
hass: HomeAssistantType, entry: ConfigEntry, async_add_entities
hass: HomeAssistant,
entry: ConfigEntry,
async_add_entities: Callable[[list[Entity], bool], None],
) -> None:
"""Set up AdGuard Home switch based on a config entry."""
adguard = hass.data[DOMAIN][DATA_ADGUARD_CLIENT]
@@ -49,8 +52,13 @@ class AdGuardHomeSwitch(AdGuardHomeDeviceEntity, SwitchEntity):
"""Defines a AdGuard Home switch."""
def __init__(
self, adguard, name: str, icon: str, key: str, enabled_default: bool = True
):
self,
adguard: AdGuardHome,
name: str,
icon: str,
key: str,
enabled_default: bool = True,
) -> None:
"""Initialize AdGuard Home switch."""
self._state = False
self._key = key
@@ -96,7 +104,7 @@ class AdGuardHomeSwitch(AdGuardHomeDeviceEntity, SwitchEntity):
class AdGuardHomeProtectionSwitch(AdGuardHomeSwitch):
"""Defines a AdGuard Home protection switch."""
def __init__(self, adguard) -> None:
def __init__(self, adguard: AdGuardHome) -> None:
"""Initialize AdGuard Home switch."""
super().__init__(
adguard, "AdGuard Protection", "mdi:shield-check", "protection"
@@ -118,7 +126,7 @@ class AdGuardHomeProtectionSwitch(AdGuardHomeSwitch):
class AdGuardHomeParentalSwitch(AdGuardHomeSwitch):
"""Defines a AdGuard Home parental control switch."""
def __init__(self, adguard) -> None:
def __init__(self, adguard: AdGuardHome) -> None:
"""Initialize AdGuard Home switch."""
super().__init__(
adguard, "AdGuard Parental Control", "mdi:shield-check", "parental"
@@ -140,7 +148,7 @@ class AdGuardHomeParentalSwitch(AdGuardHomeSwitch):
class AdGuardHomeSafeSearchSwitch(AdGuardHomeSwitch):
"""Defines a AdGuard Home safe search switch."""
def __init__(self, adguard) -> None:
def __init__(self, adguard: AdGuardHome) -> None:
"""Initialize AdGuard Home switch."""
super().__init__(
adguard, "AdGuard Safe Search", "mdi:shield-check", "safesearch"
@@ -162,7 +170,7 @@ class AdGuardHomeSafeSearchSwitch(AdGuardHomeSwitch):
class AdGuardHomeSafeBrowsingSwitch(AdGuardHomeSwitch):
"""Defines a AdGuard Home safe search switch."""
def __init__(self, adguard) -> None:
def __init__(self, adguard: AdGuardHome) -> None:
"""Initialize AdGuard Home switch."""
super().__init__(
adguard, "AdGuard Safe Browsing", "mdi:shield-check", "safebrowsing"
@@ -184,7 +192,7 @@ class AdGuardHomeSafeBrowsingSwitch(AdGuardHomeSwitch):
class AdGuardHomeFilteringSwitch(AdGuardHomeSwitch):
"""Defines a AdGuard Home filtering switch."""
def __init__(self, adguard) -> None:
def __init__(self, adguard: AdGuardHome) -> None:
"""Initialize AdGuard Home switch."""
super().__init__(adguard, "AdGuard Filtering", "mdi:shield-check", "filtering")
@@ -204,7 +212,7 @@ class AdGuardHomeFilteringSwitch(AdGuardHomeSwitch):
class AdGuardHomeQueryLogSwitch(AdGuardHomeSwitch):
"""Defines a AdGuard Home query log switch."""
def __init__(self, adguard) -> None:
def __init__(self, adguard: AdGuardHome) -> None:
"""Initialize AdGuard Home switch."""
super().__init__(
adguard,

View File

@@ -6,8 +6,8 @@
},
"step": {
"hassio_confirm": {
"description": "\u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u0442\u0435 Home Assistant \u0434\u0430 \u0441\u0435 \u0441\u0432\u044a\u0440\u0437\u0432\u0430 \u0441 AdGuard Home, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0435\u043d \u043e\u0442 Hass.io \u0434\u043e\u0431\u0430\u0432\u043a\u0430\u0442\u0430: {addon} ?",
"title": "AdGuard Home \u0447\u0440\u0435\u0437 Hass.io \u0434\u043e\u0431\u0430\u0432\u043a\u0430"
"description": "\u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u0442\u0435 Home Assistant \u0434\u0430 \u0441\u0435 \u0441\u0432\u044a\u0440\u0437\u0432\u0430 \u0441 AdGuard Home, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0435\u043d \u043e\u0442 Supervisor \u0434\u043e\u0431\u0430\u0432\u043a\u0430\u0442\u0430: {addon} ?",
"title": "AdGuard Home \u0447\u0440\u0435\u0437 Supervisor \u0434\u043e\u0431\u0430\u0432\u043a\u0430"
},
"user": {
"data": {

View File

@@ -10,7 +10,7 @@
"step": {
"hassio_confirm": {
"description": "Vols configurar Home Assistant perqu\u00e8 es connecti amb l'AdGuard Home proporcionat pel complement de Hass.io: {addon}?",
"title": "AdGuard Home (complement de Hass.io)"
"title": "AdGuard Home via complement de Hass.io"
},
"user": {
"data": {

View File

@@ -9,8 +9,8 @@
},
"step": {
"hassio_confirm": {
"description": "Chcete nakonfigurovat slu\u017ebu Home Assistant pro p\u0159ipojen\u00ed k AddGuard pomoc\u00ed hass.io {addon}?",
"title": "AdGuard prost\u0159ednictv\u00edm dopl\u0148ku Hass.io"
"description": "Chcete nakonfigurovat slu\u017ebu Home Assistant pro p\u0159ipojen\u00ed k AddGuard pomoc\u00ed Supervisor {addon}?",
"title": "AdGuard prost\u0159ednictv\u00edm dopl\u0148ku Supervisor"
},
"user": {
"data": {

View File

@@ -6,8 +6,8 @@
},
"step": {
"hassio_confirm": {
"description": "Vil du konfigurere Home Assistant til at oprette forbindelse til AdGuard Home leveret af Hass.io-tilf\u00f8jelsen: {addon}?",
"title": "AdGuard Home via Hass.io-tilf\u00f8jelse"
"description": "Vil du konfigurere Home Assistant til at oprette forbindelse til AdGuard Home leveret af Supervisor-tilf\u00f8jelsen: {addon}?",
"title": "AdGuard Home via Supervisor-tilf\u00f8jelse"
},
"user": {
"data": {

View File

@@ -9,8 +9,8 @@
},
"step": {
"hassio_confirm": {
"description": "M\u00f6chtest du Home Assistant so konfigurieren, dass eine Verbindung mit AdGuard Home als Hass.io-Add-On hergestellt wird: {addon}?",
"title": "AdGuard Home \u00fcber das Hass.io Add-on"
"description": "M\u00f6chtest du Home Assistant so konfigurieren, dass eine Verbindung mit AdGuard Home als Supervisor-Add-On hergestellt wird: {addon}?",
"title": "AdGuard Home \u00fcber das Supervisor Add-on"
},
"user": {
"data": {

View File

@@ -6,8 +6,8 @@
},
"step": {
"hassio_confirm": {
"description": "\u00bfDesea configurar Home Assistant para conectarse a la p\u00e1gina principal de AdGuard proporcionada por el complemento Hass.io: {addon}?",
"title": "AdGuard Home a trav\u00e9s del complemento Hass.io"
"description": "\u00bfDesea configurar Home Assistant para conectarse a la p\u00e1gina principal de AdGuard proporcionada por el complemento Supervisor: {addon}?",
"title": "AdGuard Home a trav\u00e9s del complemento Supervisor"
},
"user": {
"data": {

View File

@@ -9,8 +9,8 @@
},
"step": {
"hassio_confirm": {
"description": "\u00bfDesea configurar Home Assistant para conectarse al AdGuard Home proporcionado por el complemento Hass.io: {addon} ?",
"title": "AdGuard Home a trav\u00e9s del complemento Hass.io"
"description": "\u00bfDesea configurar Home Assistant para conectarse al AdGuard Home proporcionado por el complemento Supervisor: {addon} ?",
"title": "AdGuard Home a trav\u00e9s del complemento Supervisor"
},
"user": {
"data": {

View File

@@ -10,7 +10,7 @@
"step": {
"hassio_confirm": {
"description": "Kas soovid seadistada Home Assistant-i \u00fchenduse AdGuard Home'iga mida pakub Hass.io lisandmoodul: {addon} ?",
"title": "AdGuard Home Hass.io pistikprogrammi kaudu"
"title": "AdGuard Home Hass.io lisandmooduli abil"
},
"user": {
"data": {

View File

@@ -4,6 +4,7 @@
"user": {
"data": {
"host": "Host",
"password": "\u05e1\u05d9\u05e1\u05de\u05d4",
"port": "\u05e4\u05d5\u05e8\u05d8"
}
}

View File

@@ -1,5 +1,8 @@
{
"config": {
"abort": {
"single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges."
},
"error": {
"cannot_connect": "Sikertelen csatlakoz\u00e1s"
},
@@ -9,7 +12,9 @@
"host": "Hoszt",
"password": "Jelsz\u00f3",
"port": "Port",
"username": "Felhaszn\u00e1l\u00f3n\u00e9v"
"ssl": "SSL tan\u00fas\u00edtv\u00e1ny haszn\u00e1lata",
"username": "Felhaszn\u00e1l\u00f3n\u00e9v",
"verify_ssl": "SSL-tan\u00fas\u00edtv\u00e1ny ellen\u0151rz\u00e9se"
}
}
}

View File

@@ -1,10 +1,27 @@
{
"config": {
"abort": {
"existing_instance_updated": "Memperbarui konfigurasi yang ada.",
"single_instance_allowed": "Sudah dikonfigurasi. Hanya satu konfigurasi yang diizinkan."
},
"error": {
"cannot_connect": "Gagal terhubung"
},
"step": {
"hassio_confirm": {
"description": "Ingin mengonfigurasi Home Assistant untuk terhubung ke AdGuard Home yang disediakan oleh add-on Supervisor {addon}?",
"title": "AdGuard Home melalui add-on Home Assistant"
},
"user": {
"data": {
"password": "Kata sandi"
}
"host": "Host",
"password": "Kata Sandi",
"port": "Port",
"ssl": "Menggunakan sertifikat SSL",
"username": "Nama Pengguna",
"verify_ssl": "Verifikasi sertifikat SSL"
},
"description": "Siapkan instans AdGuard Home Anda untuk pemantauan dan kontrol."
}
}
}

View File

@@ -9,7 +9,7 @@
},
"step": {
"hassio_confirm": {
"description": "Vuoi configurare Home Assistant per connettersi alla AdGuard Home fornita dal componente aggiuntivo di Hass.io: {addon}?",
"description": "Vuoi configurare Home Assistant per connettersi ad AdGuard Home fornito dal componente aggiuntivo di Hass.io: {addon}?",
"title": "AdGuard Home tramite il componente aggiuntivo di Hass.io"
},
"user": {

View File

@@ -2,14 +2,14 @@
"config": {
"abort": {
"existing_instance_updated": "\uae30\uc874 \uad6c\uc131\uc744 \uc5c5\ub370\uc774\ud2b8\ud588\uc2b5\ub2c8\ub2e4.",
"single_instance_allowed": "\uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ud558\ub098\uc758 \uad6c\uc131\ub9cc \uac00\ub2a5\ud569\ub2c8\ub2e4."
"single_instance_allowed": "\uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ud558\ub098\uc758 \uc778\uc2a4\ud134\uc2a4\ub9cc \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."
},
"error": {
"cannot_connect": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4"
},
"step": {
"hassio_confirm": {
"description": "Hass.io {addon} \uc560\ub4dc\uc628\uc73c\ub85c AdGuard Home \uc5d0 \uc5f0\uacb0\ud558\ub3c4\ub85d Home Assistant \ub97c \uad6c\uc131\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
"description": "Hass.io {addon} \uc560\ub4dc\uc628\uc73c\ub85c AdGuard Home\uc5d0 \uc5f0\uacb0\ud558\ub3c4\ub85d Home Assistant\ub97c \uad6c\uc131\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
"title": "Hass.io \uc560\ub4dc\uc628\uc758 AdGuard Home"
},
"user": {

View File

@@ -9,8 +9,8 @@
},
"step": {
"hassio_confirm": {
"description": "W\u00ebllt dir Home Assistant konfigur\u00e9iere fir sech mam AdGuard Home ze verbannen dee vum hass.io add-on {addon} bereet gestallt g\u00ebtt?",
"title": "AdGuard Home via Hass.io add-on"
"description": "W\u00ebllt dir Home Assistant konfigur\u00e9iere fir sech mam AdGuard Home ze verbannen dee vum Supervisor add-on {addon} bereet gestallt g\u00ebtt?",
"title": "AdGuard Home via Supervisor add-on"
},
"user": {
"data": {

View File

@@ -9,8 +9,8 @@
},
"step": {
"hassio_confirm": {
"description": "Wilt u Home Assistant configureren om verbinding te maken met AdGuard Home van de Hass.io-add-on: {addon}?",
"title": "AdGuard Home via Hass.io add-on"
"description": "Wilt u Home Assistant configureren om verbinding te maken met AdGuard Home van de Supervisor-add-on: {addon}?",
"title": "AdGuard Home via Supervisor add-on"
},
"user": {
"data": {

View File

@@ -9,7 +9,7 @@
},
"step": {
"hassio_confirm": {
"description": "Vil du konfigurere Home Assistant til \u00e5 koble til AdGuard Home gitt av Hass.io-tillegg {addon}?",
"description": "Vil du konfigurere Home Assistant for \u00e5 koble til AdGuard Home levert av Hass.io-tillegget: {addon} ?",
"title": "AdGuard Home via Hass.io-tillegg"
},
"user": {

View File

@@ -9,7 +9,7 @@
},
"step": {
"hassio_confirm": {
"description": "Czy chcesz skonfigurowa\u0107 Home Assistanta, aby po\u0142\u0105czy\u0142 si\u0119 z AdGuard Home przez dodatek Hass.io {addon}?",
"description": "Czy chcesz skonfigurowa\u0107 Home Assistanta, aby po\u0142\u0105czy\u0142 si\u0119 z AdGuard Home przez dodatek Hass.io: {addon}?",
"title": "AdGuard Home przez dodatek Hass.io"
},
"user": {

View File

@@ -6,8 +6,8 @@
},
"step": {
"hassio_confirm": {
"description": "Deseja configurar o Home Assistant para se conectar ao AdGuard Home fornecido pelo complemento Hass.io: {addon} ?",
"title": "AdGuard Home via add-on Hass.io"
"description": "Deseja configurar o Home Assistant para se conectar ao AdGuard Home fornecido pelo complemento Supervisor: {addon} ?",
"title": "AdGuard Home via add-on Supervisor"
},
"user": {
"data": {

View File

@@ -8,7 +8,7 @@
},
"step": {
"hassio_confirm": {
"title": "AdGuard Home via Hass.io add-on"
"title": "AdGuard Home via Supervisor add-on"
},
"user": {
"data": {

View File

@@ -18,7 +18,7 @@
"password": "\u041f\u0430\u0440\u043e\u043b\u044c",
"port": "\u041f\u043e\u0440\u0442",
"ssl": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 SSL",
"username": "\u041b\u043e\u0433\u0438\u043d",
"username": "\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f",
"verify_ssl": "\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 SSL"
},
"description": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 Home Assistant \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f AdGuard Home."

View File

@@ -6,8 +6,8 @@
},
"step": {
"hassio_confirm": {
"description": "\u017delite konfigurirati Home Assistant-a za povezavo z AdGuard Home, ki ga ponuja Hass.io add-on {addon} ?",
"title": "AdGuard Home preko dodatka Hass.io"
"description": "\u017delite konfigurirati Home Assistant-a za povezavo z AdGuard Home, ki ga ponuja Supervisor add-on {addon} ?",
"title": "AdGuard Home preko dodatka Supervisor"
},
"user": {
"data": {

View File

@@ -6,8 +6,8 @@
},
"step": {
"hassio_confirm": {
"description": "Vill du konfigurera Home Assistant f\u00f6r att ansluta till AdGuard Home som tillhandah\u00e5lls av Hass.io Add-on: {addon}?",
"title": "AdGuard Home via Hass.io-till\u00e4gget"
"description": "Vill du konfigurera Home Assistant f\u00f6r att ansluta till AdGuard Home som tillhandah\u00e5lls av Supervisor Add-on: {addon}?",
"title": "AdGuard Home via Supervisor-till\u00e4gget"
},
"user": {
"data": {

View File

@@ -9,8 +9,8 @@
},
"step": {
"hassio_confirm": {
"description": "\u0412\u0438 \u0432\u043f\u0435\u0432\u043d\u0435\u043d\u0456, \u0449\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u043d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u0442\u0438 \u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044f \u0434\u043e AdGuard Home (\u0434\u043e\u0434\u0430\u0442\u043e\u043a \u0434\u043b\u044f Hass.io \"{addon}\")?",
"title": "AdGuard Home (\u0434\u043e\u0434\u0430\u0442\u043e\u043a \u0434\u043b\u044f Hass.io)"
"description": "\u0412\u0438 \u0432\u043f\u0435\u0432\u043d\u0435\u043d\u0456, \u0449\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u043d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u0442\u0438 \u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044f \u0434\u043e AdGuard Home (\u0434\u043e\u0434\u0430\u0442\u043e\u043a \u0434\u043b\u044f Supervisor \"{addon}\")?",
"title": "AdGuard Home (\u0434\u043e\u0434\u0430\u0442\u043e\u043a \u0434\u043b\u044f Supervisor)"
},
"user": {
"data": {

View File

@@ -9,8 +9,8 @@
},
"step": {
"hassio_confirm": {
"description": "\u662f\u5426\u8981\u8a2d\u5b9a Home Assistant \u4ee5\u4f7f\u7528 Hass.io \u9644\u52a0\u7d44\u4ef6\uff1a{addon} \u9023\u7dda\u81f3 AdGuard Home\uff1f",
"title": "\u4f7f\u7528 Hass.io \u9644\u52a0\u7d44\u4ef6 AdGuard Home"
"description": "\u662f\u5426\u8981\u8a2d\u5b9a Home Assistant \u4ee5\u4f7f\u7528 Hass.io \u9644\u52a0\u5143\u4ef6\uff1a{addon} \u9023\u7dda\u81f3 AdGuard Home\uff1f",
"title": "\u4f7f\u7528 Hass.io \u9644\u52a0\u5143\u4ef6 AdGuard Home"
},
"user": {
"data": {

View File

@@ -2,7 +2,7 @@
import voluptuous as vol
from homeassistant.components import ads
from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.components.sensor import PLATFORM_SCHEMA, SensorEntity
from homeassistant.const import CONF_NAME, CONF_UNIT_OF_MEASUREMENT
import homeassistant.helpers.config_validation as cv
@@ -43,7 +43,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
add_entities([entity])
class AdsSensor(AdsEntity):
class AdsSensor(AdsEntity, SensorEntity):
"""Representation of an ADS sensor entity."""
def __init__(self, ads_hub, ads_var, ads_type, name, unit_of_measurement, factor):

View File

@@ -7,24 +7,17 @@ import logging
from advantage_air import ApiError, advantage_air
from homeassistant.const import CONF_IP_ADDRESS, CONF_PORT
from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import ADVANTAGE_AIR_RETRY, DOMAIN
ADVANTAGE_AIR_SYNC_INTERVAL = 15
ADVANTAGE_AIR_PLATFORMS = ["climate", "cover", "binary_sensor", "sensor", "switch"]
PLATFORMS = ["climate", "cover", "binary_sensor", "sensor", "switch"]
_LOGGER = logging.getLogger(__name__)
async def async_setup(hass, config):
"""Set up Advantage Air integration."""
hass.data[DOMAIN] = {}
return True
async def async_setup_entry(hass, entry):
"""Set up Advantage Air config."""
ip_address = entry.data[CONF_IP_ADDRESS]
@@ -57,17 +50,15 @@ async def async_setup_entry(hass, entry):
except ApiError as err:
_LOGGER.warning(err)
await coordinator.async_refresh()
if not coordinator.data:
raise ConfigEntryNotReady
await coordinator.async_config_entry_first_refresh()
hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN][entry.entry_id] = {
"coordinator": coordinator,
"async_change": async_change,
}
for platform in ADVANTAGE_AIR_PLATFORMS:
for platform in PLATFORMS:
hass.async_create_task(
hass.config_entries.async_forward_entry_setup(entry, platform)
)
@@ -80,8 +71,8 @@ async def async_unload_entry(hass, entry):
unload_ok = all(
await asyncio.gather(
*[
hass.config_entries.async_forward_entry_unload(entry, component)
for component in ADVANTAGE_AIR_PLATFORMS
hass.config_entries.async_forward_entry_unload(entry, platform)
for platform in PLATFORMS
]
)
)

View File

@@ -1,6 +1,7 @@
"""Sensor platform for Advantage Air integration."""
import voluptuous as vol
from homeassistant.components.sensor import SensorEntity
from homeassistant.const import PERCENTAGE
from homeassistant.helpers import config_validation as cv, entity_platform
@@ -40,7 +41,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
)
class AdvantageAirTimeTo(AdvantageAirEntity):
class AdvantageAirTimeTo(AdvantageAirEntity, SensorEntity):
"""Representation of Advantage Air timer control."""
def __init__(self, instance, ac_key, action):
@@ -82,7 +83,7 @@ class AdvantageAirTimeTo(AdvantageAirEntity):
await self.async_change({self.ac_key: {"info": {self._time_key: value}}})
class AdvantageAirZoneVent(AdvantageAirEntity):
class AdvantageAirZoneVent(AdvantageAirEntity, SensorEntity):
"""Representation of Advantage Air Zone Vent Sensor."""
@property
@@ -115,7 +116,7 @@ class AdvantageAirZoneVent(AdvantageAirEntity):
return "mdi:fan-off"
class AdvantageAirZoneSignal(AdvantageAirEntity):
class AdvantageAirZoneSignal(AdvantageAirEntity, SensorEntity):
"""Representation of Advantage Air Zone wireless signal sensor."""
@property

View File

@@ -1,5 +1,8 @@
{
"config": {
"abort": {
"already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van"
},
"error": {
"cannot_connect": "Sikertelen csatlakoz\u00e1s"
},

View File

@@ -0,0 +1,20 @@
{
"config": {
"abort": {
"already_configured": "Perangkat sudah dikonfigurasi"
},
"error": {
"cannot_connect": "Gagal terhubung"
},
"step": {
"user": {
"data": {
"ip_address": "Alamat IP",
"port": "Port"
},
"description": "Hubungkan ke API tablet dinding Advantage Air.",
"title": "Hubungkan"
}
}
}
}

View File

@@ -11,7 +11,9 @@
"data": {
"ip_address": "IP \uc8fc\uc18c",
"port": "\ud3ec\ud2b8"
}
},
"description": "\ubcbd\uc5d0 \ubd80\ucc29\ub41c Advantage Air \ud0dc\ube14\ub9bf\uc758 API\uc5d0 \uc5f0\uacb0\ud558\uae30",
"title": "\uc5f0\uacb0\ud558\uae30"
}
}
}

View File

@@ -8,18 +8,12 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME
from homeassistant.core import HomeAssistant
from .const import COMPONENTS, DOMAIN, ENTRY_NAME, ENTRY_WEATHER_COORDINATOR
from .const import DOMAIN, ENTRY_NAME, ENTRY_WEATHER_COORDINATOR, PLATFORMS
from .weather_update_coordinator import WeatherUpdateCoordinator
_LOGGER = logging.getLogger(__name__)
async def async_setup(hass: HomeAssistant, config: dict) -> bool:
"""Set up the AEMET OpenData component."""
hass.data.setdefault(DOMAIN, {})
return True
async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry):
"""Set up AEMET OpenData as config entry."""
name = config_entry.data[CONF_NAME]
@@ -30,16 +24,17 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry):
aemet = AEMET(api_key)
weather_coordinator = WeatherUpdateCoordinator(hass, aemet, latitude, longitude)
await weather_coordinator.async_refresh()
await weather_coordinator.async_config_entry_first_refresh()
hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN][config_entry.entry_id] = {
ENTRY_NAME: name,
ENTRY_WEATHER_COORDINATOR: weather_coordinator,
}
for component in COMPONENTS:
for platform in PLATFORMS:
hass.async_create_task(
hass.config_entries.async_forward_entry_setup(config_entry, component)
hass.config_entries.async_forward_entry_setup(config_entry, platform)
)
return True
@@ -50,8 +45,8 @@ async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry):
unload_ok = all(
await asyncio.gather(
*[
hass.config_entries.async_forward_entry_unload(config_entry, component)
for component in COMPONENTS
hass.config_entries.async_forward_entry_unload(config_entry, platform)
for platform in PLATFORMS
]
)
)

View File

@@ -1,4 +1,5 @@
"""Abstraction form AEMET OpenData sensors."""
from homeassistant.components.sensor import SensorEntity
from homeassistant.const import ATTR_ATTRIBUTION
from homeassistant.helpers.update_coordinator import CoordinatorEntity
@@ -6,7 +7,7 @@ from .const import ATTRIBUTION, SENSOR_DEVICE_CLASS, SENSOR_NAME, SENSOR_UNIT
from .weather_update_coordinator import WeatherUpdateCoordinator
class AbstractAemetSensor(CoordinatorEntity):
class AbstractAemetSensor(CoordinatorEntity, SensorEntity):
"""Abstract class for an AEMET OpenData sensor."""
def __init__(
@@ -52,6 +53,6 @@ class AbstractAemetSensor(CoordinatorEntity):
return self._unit_of_measurement
@property
def device_state_attributes(self):
def extra_state_attributes(self):
"""Return the state attributes."""
return {ATTR_ATTRIBUTION: ATTRIBUTION}

View File

@@ -6,8 +6,7 @@ from homeassistant import config_entries
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME
import homeassistant.helpers.config_validation as cv
from .const import DEFAULT_NAME
from .const import DOMAIN # pylint:disable=unused-import
from .const import DEFAULT_NAME, DOMAIN
class AemetConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):

View File

@@ -34,7 +34,7 @@ from homeassistant.const import (
)
ATTRIBUTION = "Powered by AEMET OpenData"
COMPONENTS = ["sensor", "weather"]
PLATFORMS = ["sensor", "weather"]
DEFAULT_NAME = "AEMET"
DOMAIN = "aemet"
ENTRY_NAME = "name"

View File

@@ -106,9 +106,10 @@ class AemetForecastSensor(AbstractAemetSensor):
@property
def state(self):
"""Return the state of the device."""
forecast = None
forecasts = self._weather_coordinator.data.get(
FORECAST_MODE_ATTR_API[self._forecast_mode]
)
if forecasts:
return forecasts[0].get(self._sensor_type)
return None
forecast = forecasts[0].get(self._sensor_type)
return forecast

View File

@@ -11,8 +11,11 @@
"data": {
"api_key": "API-Schl\u00fcssel",
"latitude": "Breitengrad",
"longitude": "L\u00e4ngengrad"
}
"longitude": "L\u00e4ngengrad",
"name": "Name der Integration"
},
"description": "Richte die AEMET OpenData Integration ein. Um den API-Schl\u00fcssel zu generieren, besuche https://opendata.aemet.es/centrodedescargas/altaUsuario",
"title": "[void]"
}
}
}

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