Compare commits

..

764 Commits

Author SHA1 Message Date
Paulus Schoutsen
b110a5bbfc Merge pull request #57355 from home-assistant/rc 2021-10-08 15:47:54 -07:00
Paulus Schoutsen
3c2f3f2ade Bumped version to 2021.10.2 2021-10-08 14:58:39 -07:00
Paulus Schoutsen
1ea0891602 Guard for bad last reset (#57344) 2021-10-08 14:58:34 -07:00
Steven Looman
54acc5bade Fix multiple upnp/ssdp issues (#57314) 2021-10-08 14:58:19 -07:00
Erik Montnemery
0c886e2990 Improve state of cover groups (#57313)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-10-08 14:51:11 -07:00
Milan Meulemans
f10a469d4f Upgrade aionanoleaf to 0.0.3 to fix deadlock (#57312) 2021-10-08 14:51:10 -07:00
J. Nick Koston
0358a13536 Migrate tplink hosts that were previously imported from yaml (#57308) 2021-10-08 14:51:10 -07:00
Milan Meulemans
1a78c461a0 Fix Nanoleaf light turn_off transition (#57305) 2021-10-08 14:51:09 -07:00
starkillerOG
c6d506cb4f Netgear fix port and device model beeing overwritten (#57277)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-10-08 14:51:08 -07:00
Paulus Schoutsen
5bb4bc3d13 Merge pull request #57294 from home-assistant/rc 2021-10-07 20:57:08 -07:00
Paulus Schoutsen
387249b593 Bumped version to 2021.10.1 2021-10-07 20:19:53 -07:00
J. Nick Koston
1a376b25af Bump yeelight to 0.7.7 (#57290) 2021-10-07 20:19:46 -07:00
Teemu R
ed4b44c126 Stopgap fix for inconsistent upstream API of tplink dimmers (#57285) 2021-10-07 20:19:45 -07:00
J. Nick Koston
ef7f1ffddc Bump HAP-python to 4.30 (#57284) 2021-10-07 20:19:44 -07:00
Teemu R
e3e64130f1 Fix transition handling for tplink lights (#57272)
* Fix transition handling for tplink light

* Apply suggestions from code review

* Test that all transitions are passed correctly

* Fix linting

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-10-07 20:19:44 -07:00
Bram Kragten
4e49e3a3fb Update frontend to 20211007.0 (#57268) 2021-10-07 20:19:43 -07:00
J. Nick Koston
fd371f2887 Fix RGB only (no color temp) devices with tplink (#57267) 2021-10-07 20:19:42 -07:00
Daniel Hjelseth Høyer
ec0256e27f Bump Mill library to 0.6.1 (#57261) 2021-10-07 20:19:41 -07:00
Erik Montnemery
425015eb8b Validate initial value for input_datetime (#57256) 2021-10-07 20:19:41 -07:00
Martin Hjelmare
0b26b15749 Fix netgear config flow import (#57253) 2021-10-07 20:19:40 -07:00
Erik Montnemery
06befe906b Correct SQL query generated by get_metadata_with_session (#57225)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-10-07 20:19:39 -07:00
J. Nick Koston
bf4a3d8d35 Discover tplink devices periodically (#57221)
- These devices sometimes do not respond on the first try
  or may be subject to transient broadcast failures, or
  overloads. We now try discovery periodically once the
  integration has been loaded.

- We used to try this 4x at startup, but that solution
  seemed to aggressive as we want to be sure we pickup
  the devices after startup as well since the network
  will likely be more calm after startup.
2021-10-07 20:19:15 -07:00
Raman Gupta
691d8d6b80 Convert val to str when needed while calling zwave_js.set_value (#57216) 2021-10-07 20:16:20 -07:00
Maciej Bieniek
7f49e02a4d Update led brightness select state only if valid data is available, Xiaomi Miio integration (#57197)
* Update state if there is valid data

* Add comment
2021-10-07 20:16:19 -07:00
J. Nick Koston
7544ec2399 Recreate the powerwall session/object when attempting relogin (#56935) 2021-10-07 20:16:19 -07:00
Franck Nijhof
32889dbfbe Merge pull request #57179 from home-assistant/rc 2021-10-06 16:36:51 +02:00
Franck Nijhof
46394b50d8 Bumped version to 2021.10.0 2021-10-06 15:53:41 +02:00
Erik Montnemery
25fc479cd4 Correct migration to recorder schema 18 (#57165) 2021-10-06 15:52:20 +02:00
Bram Kragten
9636799dfb Update frontend to 20211006.0 (#57164) 2021-10-06 15:52:14 +02:00
Thomas Schamm
e01e575092 Skip link local addresses in bosch_shc discovery step (#57074) 2021-10-06 15:52:11 +02:00
Fredrik Erlandsson
2fc9cdbe68 Update Daikin config_flow with better error handling (#57069) 2021-10-06 15:52:07 +02:00
starkillerOG
72b3bc13e4 Remove Netgear tracker link_rate check on Orbi (#57032)
* Netgear tracker: remove link_rate check on Orbi

* fix debug message

* Add orbi models

* check start of model in V2 check

* fix black
2021-10-06 15:52:04 +02:00
Jean-Yves Avenard
9e755fcc49 Change energy state class to STATE_CLASS_TOTAL (#56974) 2021-10-06 15:52:00 +02:00
Paulus Schoutsen
a692d4de64 Bumped version to 2021.10.0b9 2021-10-05 21:34:22 -07:00
Paulus Schoutsen
bb617d7b89 Bump netdisco to 3.0.0 (#56903) 2021-10-05 21:34:18 -07:00
Paulus Schoutsen
790a61cfae Bumped version to 2021.10.0b8 2021-10-05 21:32:11 -07:00
Paulus Schoutsen
8e02ea1936 Guard upnp create device (#57156) 2021-10-05 21:32:06 -07:00
Simone Chemelli
7502956d2b Fix SamsungTV shutdown race condition (#57149) 2021-10-05 21:32:06 -07:00
Simone Chemelli
8394157c0a Fix Fritz shutdown race condition (#57148) 2021-10-05 21:32:05 -07:00
Lawrence
76a6edb4ed Updated amberelectic attributes to reflect unit change to $/kWh (#57109) 2021-10-05 21:32:04 -07:00
Paulus Schoutsen
73bf538736 Bumped version to 2021.10.0b7 2021-10-05 13:45:52 -07:00
Raman Gupta
dbde2f1b92 Bump zwave-js-server-python to 0.31.3 (#57143) 2021-10-05 13:45:42 -07:00
Paulus Schoutsen
78bb2f5b73 Reinstate asking for country in Tuya flow (#57142) 2021-10-05 13:45:41 -07:00
J. Nick Koston
657037553a Fix yeelight connection when bulb stops responding to SSDP (#57138) 2021-10-05 13:45:40 -07:00
Paulus Schoutsen
0e00075628 Bump aiohue to 2.6.3 (#57125) 2021-10-05 13:45:39 -07:00
jrester
ecdbb5ff17 Update tesla_powerwall to 0.3.11 (#57112) 2021-10-05 13:45:38 -07:00
Franck Nijhof
a13a6bc9c9 Bump tuya-iot-py-sdk to 0.5.0 (#57110)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-10-05 13:45:38 -07:00
Paulus Schoutsen
5b550689e0 Update Tuya code owners (#57078) 2021-10-05 13:45:37 -07:00
Otto Winter
c5992e2967 Bump aioesphomeapi from 9.1.4 to 9.1.5 (#57106) 2021-10-05 13:43:48 -07:00
Franck Nijhof
b76e19c8c2 Remove Python shebang line from Tuya integration files (#57103) 2021-10-05 13:43:47 -07:00
Franck Nijhof
d1f790fab0 Small code styling tweaks for Tuya (#57102) 2021-10-05 13:43:47 -07:00
Franck Nijhof
4d44beb938 Prevent Tuya from accidentally logging credentials in debug mode (#57100) 2021-10-05 13:43:46 -07:00
indykoning
70a6930a8a Fix Growatt login invalid auth response (#57071) 2021-10-05 13:43:45 -07:00
Paulus Schoutsen
b289bb2f57 Bumped version to 2021.10.0b6 2021-10-04 21:07:16 -07:00
GitHub Action
a457bb7446 [ci skip] Translation update 2021-10-04 21:07:12 -07:00
Paulus Schoutsen
f0b22e2f40 Fix energy gas price validation (#57075) 2021-10-04 21:06:47 -07:00
Bram Kragten
d42350f986 Update frontend to 20211004.0 (#57073) 2021-10-04 21:06:47 -07:00
Shay Levy
74aa57e764 Fix: Shelly Gen2 - filter unsupported sensors (#57065) 2021-10-04 21:06:46 -07:00
J. Nick Koston
fb9a119fc7 Update esphome reconnect logic to use newer RecordUpdateListener logic (#57057) 2021-10-04 21:06:45 -07:00
Erik Montnemery
f82fe9d8bb Improve sensor statistics validation (#56892) 2021-10-04 21:06:44 -07:00
Paulus Schoutsen
b086266508 [ci skip] Translation update 2021-10-04 08:38:35 -07:00
Paulus Schoutsen
491abf0608 Bumped version to 2021.10.0b5 2021-10-04 08:35:42 -07:00
GitHub Action
da61696566 [ci skip] Translation update 2021-10-04 08:35:37 -07:00
GitHub Action
688884ccfe [ci skip] Translation update 2021-10-04 08:35:28 -07:00
Joakim Sørensen
62390b9531 Rewrite tuya config flow (#57043)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-10-04 08:30:00 -07:00
Erik Montnemery
7ddb399178 Prevent opening of sockets in watttime tests (#57040) 2021-10-04 08:30:00 -07:00
Otto Winter
1fe4e08003 Bump aioesphomeapi from 9.1.2 to 9.1.4 (#57036) 2021-10-04 08:29:59 -07:00
Otto Winter
b106dab916 ESPHome fix zeroconf add_listener issue (#57031) 2021-10-04 08:29:58 -07:00
Chris Browet
36bac936d1 Universal media player: consider unknown as inactive child state (#57029) 2021-10-04 08:29:57 -07:00
Raman Gupta
4ca0c0d3a9 Bump zwave-js-server-python to 0.31.2 (#57007) 2021-10-04 08:29:56 -07:00
Paulus Schoutsen
cdaa7b7db7 Mark auth voluptuous schema fields as required (#57003) 2021-10-04 08:29:56 -07:00
Oliver Ou
d1f3602732 Fix Tuya v2 login issue (#56973)
* fix login issue

* fix:login error

* update COUNTRY_CODE_CHINA line location

* added one blank line

* feat:added line #L88 was not covered by tests

* ci build errors

Co-authored-by: erchuan <jie.zheng@tuya.com>
2021-10-04 08:29:55 -07:00
Erik Montnemery
8ee8aade86 Evict purged states from recorder's old_state cache (#56877)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-10-04 08:29:54 -07:00
Paulus Schoutsen
6aad751056 Bumped version to 2021.10.0b4 2021-10-03 22:01:21 -07:00
jjlawren
2d8684283f Shorten album titles when browsing artist (#57027) 2021-10-03 22:01:13 -07:00
J. Nick Koston
779ae6c801 Add DHCP support for TPLink KP400 (#57023) 2021-10-03 22:01:13 -07:00
Tobias Sauerwein
48fecc916a Fix camera tests (#57020) 2021-10-03 22:01:12 -07:00
Oncleben31
0084db3ad2 Meteofrance fix #56975 (#57016) 2021-10-03 22:01:11 -07:00
Tobias Sauerwein
ea2113d5d2 Bump pyatmo to v6.1.0 (#57014) 2021-10-03 22:01:10 -07:00
Diogo Gomes
c22ec32726 Ignore utility_meter restore state if state is invalid (#57010)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-10-03 22:01:09 -07:00
J. Nick Koston
645cb53284 Bump yeelight to 0.7.6 (#57009)
- Fixes compat with Lamp15 model

- May improvment Monob model drops seen in #56646

Changes: 0b94e5214e
2021-10-03 22:01:09 -07:00
J. Nick Koston
5237817109 Round tplink energy sensors to prevent insignificant updates (#56999)
- These sensors wobble quite a bit and the precision did
  not have sensible limits which generated a massive amount
  of data in the database which was not very useful
2021-10-03 22:01:08 -07:00
Phil Cole
45b7922a6a Use pycarwings2.12 for Nissan Leaf integration (#56996) 2021-10-03 22:01:07 -07:00
Steven Looman
6f39632583 Bump async-upnp-client to 0.22.5 (#56989) 2021-10-03 22:01:06 -07:00
Steven Looman
757c5b9201 Fix upnp invalid key in ssdp discovery_info (#56986) 2021-10-03 22:01:06 -07:00
Shay Levy
7203f58b69 Bump aioshelly to 1.0.2 (#56980) 2021-10-03 22:01:05 -07:00
Aaron Bach
a527c451c3 Fix incorrect handling of hass.data in WattTime setup (#56971) 2021-10-03 22:01:04 -07:00
J. Nick Koston
201be1a59d Fix yeelight state when controlled outside of Home Assistant (#56964) 2021-10-03 22:01:03 -07:00
Oliver Ou
e454c6628a Fix Tuya v2 fan percentage (#56954)
* fix:Some fans do not have a fan_speed_percent key

* fix comment format issue

Co-authored-by: erchuan <jie.zheng@tuya.com>
2021-10-03 22:01:03 -07:00
Michael Chisholm
2dac92df0c Disable discovery for dlna_dmr until it is more selective (#56950) 2021-10-03 22:01:02 -07:00
Bram Kragten
fc373563bd Update frontend to 20211002.0 (#56963) 2021-10-02 23:17:04 +02:00
Paulus Schoutsen
180316026b Bumped version to 2021.10.0b3 2021-10-02 13:54:13 -07:00
J. Nick Koston
e4d295c80a Add dhcp discovery for TPLink EP10 (#56955) 2021-10-02 13:54:07 -07:00
Simone Chemelli
14cddc75c2 Add sleep_period to log for easier debugging (#56949) 2021-10-02 13:54:06 -07:00
J. Nick Koston
427200e258 Bump PyFlume to 0.6.5 to fix compat with new JWT (#56936)
Changelog: 5476fd67cf...v0.6.5
2021-10-02 13:54:06 -07:00
Fredrik Erlandsson
4438fc55e0 Update pypoint to use v5 of backend API (#56934) 2021-10-02 13:54:05 -07:00
J. Nick Koston
8ecf03569d Add DHCP support for TPLink KL430, KP115 (#56932) 2021-10-02 13:54:04 -07:00
Maciej Bieniek
7a75506b02 Fix Unable to serialize to JSON error in Xiaomi Miio (#56929) 2021-10-02 13:54:04 -07:00
RenierM26
b1b23ef67d Fix Switchbot unsupported SB types (#56928) 2021-10-02 13:54:03 -07:00
MatthewFlamm
baae7089ed Bump pynws: fix unit code bug (#56923) 2021-10-02 13:54:02 -07:00
Aaron Bach
5f68192109 Address beta review comments for WattTime (#56919) 2021-10-02 13:54:01 -07:00
Michael
3579d638a8 Set unique id while SSDP discovery of Synology DSM (#56914) 2021-10-02 13:54:01 -07:00
Martin
75b6526cdc Fix vicare binary sensor (#56912) 2021-10-02 13:54:00 -07:00
GitHub Action
94b8877e2a [ci skip] Translation update 2021-10-02 13:50:58 -07:00
Paulus Schoutsen
d6357bcbbe Bumped version to 2021.10.0b2 2021-10-01 09:31:17 -07:00
Robert Svensson
9a218ff241 CLIPGenericFlag should be deCONZ sensor not binary sensor (#56901) 2021-10-01 09:30:44 -07:00
Robert Svensson
f102bf3850 Use native unit of measurement in deCONZ sensors (#56897) 2021-10-01 09:30:43 -07:00
Simone Chemelli
c9346e9af1 Revert fritz pref_disable_new_entities handling (#56891) 2021-10-01 09:30:43 -07:00
Marc Mueller
2856355c28 Fix bmw_connected_drive battery icon (#56884) 2021-10-01 09:30:42 -07:00
Otto Winter
91b8d5fcd1 Bump aioesphomeapi from 9.1.0 to 9.1.2 (#56879) 2021-10-01 09:30:41 -07:00
Marc Mueller
666fbc9877 Fix check_control_message short description (#56876) 2021-10-01 09:30:40 -07:00
Daniel Hjelseth Høyer
1f1f2a6811 Opengarage bug fix (#56869)
* Opengarage bug fix

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* Opengarage bug fix

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* Deprecated open garage config

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* Deprecated open garage config

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>
2021-10-01 09:30:40 -07:00
Ricardo Steijn
74a1f60441 Handle missing serial extended parameters in crownstone (#56864) 2021-10-01 09:30:39 -07:00
Erik Montnemery
d97286bcd6 Adjust state class of solarlog yield and consumption sensors (#56824) 2021-10-01 09:30:39 -07:00
Paulus Schoutsen
21aa635ad8 Bumped version to 2021.10.0b1 2021-09-30 14:11:43 -07:00
Erik Montnemery
a70daabcea Correct database migration to schema version 22 (#56848) 2021-09-30 14:11:35 -07:00
Milan Meulemans
baad8100f9 Upgrade aionanoleaf to 0.0.2 (#56845) 2021-09-30 14:11:35 -07:00
Raman Gupta
6ed46bf549 Add strings for new zwave_js config flow keys (#56844) 2021-09-30 14:11:34 -07:00
Franck Nijhof
0c765a40ae Bumped version to 2021.10.0b0 2021-09-30 18:48:14 +02:00
Daniel Hjelseth Høyer
4a2ed97e0d Add locking state to surepetcare locks (#56830) 2021-09-30 08:16:35 -07:00
Erik Montnemery
6af1a835e6 Optimize statistics generation (#56821)
* Optimize statistics generation

* pylint
2021-09-30 17:14:36 +02:00
Daniel Hjelseth Høyer
d5bda3ac14 Surepetcare reauthorize (#56402)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-30 10:11:45 -05:00
Daniel Hjelseth Høyer
08719af794 Bump Mill library (#56833) 2021-09-30 16:59:00 +02:00
Erik Montnemery
6954614e62 Warn if total_increasing sensor has negative states (#56564) 2021-09-30 07:49:16 -07:00
Niels Mündler
3a56e3a823 Correctly handle offline and unsupported printers during setup (#55894) 2021-09-30 16:29:51 +02:00
Bram Kragten
8196a84538 Update frontend to 20210930.0 (#56827) 2021-09-30 16:22:36 +02:00
Robert Svensson
d61a9e8b72 Service to remove clients from UniFi Controller (#56717) 2021-09-30 14:38:29 +02:00
Daniel Hjelseth Høyer
e729339538 Bump surepy to 0.7.2 (#56828) 2021-09-30 14:33:21 +02:00
Daniel Hjelseth Høyer
53e130d9a8 Deprecated open garage yaml config (#56829) 2021-09-30 14:19:46 +02:00
Erik Montnemery
55328d2c6f Adjust state class of growatt_server lifetime energy sensors (#56826) 2021-09-30 13:48:01 +02:00
Erik Montnemery
942db3fcbc Adjust state class of solaredge lifetime energy sensor (#56825) 2021-09-30 13:38:33 +02:00
Sean Vig
f18e4bab60 Add resolution to Amcrest camera unique id (#56207)
Co-authored-by: Joakim Sørensen <hi@ludeeus.dev>
2021-09-30 13:38:18 +02:00
Kevin Stillhammer
dd52ec78c7 Add Kraken delay after first update to avoid limit (#55736)
* Add delay after first update to avoid limit

* Apply suggestions
2021-09-30 13:23:46 +02:00
Fabrizio Tarizzo
ef4b6d7bdf Update viaggiatreno component due to API changes (#56463) 2021-09-30 13:22:43 +02:00
Marko Korhonen
c9e1a03fe2 Remove webostv service description github link (#53502)
Co-authored-by: Shay Levy <levyshay1@gmail.com>
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-09-30 13:03:38 +02:00
deosrc
d4ed0f9637 Fix OVO Energy reporting consumption as cost (#55856) 2021-09-30 12:31:06 +02:00
logan893
cf6398a949 Fix hue turning on eWeLink switch (#56318) 2021-09-30 12:22:42 +02:00
Simone Chemelli
ee28dd57c1 Rename var to compliant name in August integration (#56812) 2021-09-30 12:15:17 +02:00
Oxan van Leeuwen
c6f48056fd Remove dead code from ESPHome light entity (#55519) 2021-09-30 12:12:37 +02:00
Oliver Ou
d3b1ccb668 Tuya v2 Integration Release (#56820)
Co-authored-by: 乾启 <18442047+tsutsuku@users.noreply.github.com>
Co-authored-by: dengweijun <dengweijunben@gmail.com>
Co-authored-by: dengweijun <mengzi.deng@tuya.com>
Co-authored-by: erchuan <jie.zheng@tuya.com>
Co-authored-by: erchuan <erchuan365@outlook.com>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-09-30 12:02:56 +02:00
Julian Löhr
26042bdad7 Add Fritz!DECT 440 humidity sensor (#54597)
Co-authored-by: Michael <35783820+mib1185@users.noreply.github.com>
2021-09-30 11:56:38 +02:00
acshef
4ae887ad34 Correct unit of measurement for qbittorrent data rate sensors (#55758) 2021-09-30 11:52:21 +02:00
Mas2112
1f5720199c Add DC voltage and current to Kostal inverter (#54878) 2021-09-30 11:41:55 +02:00
Tim Niemueller
0c1c1f7845 Fix Onvif PTZ for Imou cameras (#56592) 2021-09-30 11:36:49 +02:00
Greg
6a266ae3c0 Change state_class so older Envoys can use Energy Dashboard (#55383) 2021-09-30 11:34:41 +02:00
Ville Skyttä
4c854a06d9 Add some huawei_lte sensor state classifications (#55601) 2021-09-30 11:27:52 +02:00
Chris Talkington
a035615016 Use entity descriptions for sonarr (#55818) 2021-09-30 11:25:42 +02:00
Aaron Bach
4b68700763 Add long-term statistics for Ambient PWS sensors (#55412) 2021-09-30 11:20:14 +02:00
Simone Chemelli
8993ff0377 Fritz new binary sensor for link and firmware status + code cleanup (#55446) 2021-09-30 11:18:04 +02:00
ehendrix23
a6a3745413 Handle UpnpError exceptions when getting WAN status and external IP address (#56744) 2021-09-30 10:41:28 +02:00
Ian Foster
2e02945833 Add keyboard event type to keyboard_remote (#56668)
* added keyboard event type to keyboard_remote

* fix emulated hold event

* Update homeassistant/components/keyboard_remote/__init__.py

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

* removed event value

* set key_hold to use string constant

* don't use dict.get() for keyboard event type

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2021-09-30 09:17:57 +02:00
Marc Mueller
54abd80462 Use EntityDescription - smappee (#56747) 2021-09-30 09:15:09 +02:00
Rami Mosleh
51addfc164 Add device_info to Speedtestdotnet and some code cleanup (#56612)
* Apply code cleanup suggestions from previous PRs

* Update homeassistant/components/speedtestdotnet/const.py

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

* fix native_value, and ping value in test

* use self._state instead of _attr_native_value

* update identifiers and add more tests

Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-09-30 08:28:04 +02:00
J. Nick Koston
2ed35debdc Fix dhcp discovery matching due to deferred imports (#56814) 2021-09-29 23:50:21 -05:00
David F. Mulcahey
a7f554e6da Bump ZHA quirks module to 0.0.62 (#56809) 2021-09-29 22:47:15 -04:00
Raman Gupta
e9d25974b8 Switch to using constants wherever possible in zwave_js (#56518) 2021-09-30 02:21:53 +02:00
jjlawren
2ff1fc83bc Add latest added media as Plex library sensor attribute (#56235) 2021-09-29 17:11:53 -07:00
João Pedro Hickmann
a967a1d1df Get the currency from the api (#56806) 2021-09-29 16:25:07 -07:00
Martin Hjelmare
12b2076351 Fix zwave_js config flow import step (#56808) 2021-09-30 01:15:05 +02:00
Simone Chemelli
b9d81c3a7e Handle Fritz portmapping with same name (#56398) 2021-09-29 15:11:22 -07:00
Martin Hjelmare
fa716d92ad Manage s2 keys in zwave_js (#56783) 2021-09-29 15:04:24 -07:00
Erik Montnemery
8c3fc95fb8 Fallback to state machine in statistics (#56785) 2021-09-29 14:57:16 -07:00
Martin Hjelmare
7dfcccd43e Bump holidays to 0.11.3.1 (#56804) 2021-09-29 23:57:07 +02:00
RDFurman
f8903e11e0 Fix honeywell connection error (#56757)
* Catch ConnectionError and retry

* Add unload and reload functionality

* Update listener on retry

* Call reload directly and await

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

Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-29 16:10:22 -05:00
Raman Gupta
18340b2fd9 Bump zwave-js-server-python to 0.31.1 (#56517) 2021-09-29 22:33:35 +02:00
Robert Svensson
f224ab6d67 Use isinstance to verify class in deCONZ integration (#56794)
* Don't enable any variants of the daylight sensor entities by default

* Use isinstance rather than doing ZHATYPE compare

* Accidentally removed an import
2021-09-29 21:19:21 +02:00
Maciej Bieniek
0463007050 Add switch platform to Tractive integration (#55517) 2021-09-29 21:06:11 +02:00
J. Nick Koston
23cbd9075a Wait for yeelight internal state to change before update after on/off (#56795) 2021-09-29 13:49:33 -05:00
Franck Nijhof
25ce7f951a Merge branch 'master' into dev 2021-09-29 20:47:34 +02:00
Erik Montnemery
a966714032 Minor cleanup of recorder statistics code (#55339) 2021-09-29 11:42:39 -07:00
jjlawren
8f4ba564d4 Plex media browser improvements (#56312) 2021-09-29 11:17:55 -07:00
Erik Montnemery
ef13e473cf Warn if template functions fail and no default is specified (#56453)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-09-29 20:16:02 +02:00
Aaron Bach
ae00c221e0 Add long-term statistics for Guardian sensors (#55413)
* Add long-term statistics for Guardian sensors

* Code review
2021-09-29 12:06:48 -06:00
J. Nick Koston
f7ef973c68 Bump aiodiscover to 1.4.4 to fix mac matching with leading 0s (#56791) 2021-09-29 13:18:13 -04:00
Alexei Chetroi
dbba2c4afe Add "Summation Delivered" Sensor for SmartEnergy metering ZHA channel (#56666) 2021-09-29 09:35:20 -07:00
Daniel Hjelseth Høyer
60eb426451 Add Surepetcare locks (#56396)
* Surepetcare, add lock

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* Fix tests

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* Surepetcare, lock name

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* surepetcare_id

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* typing

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* Fix review comment

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* Fix review comment

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* Fix review comment

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* add more tests

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* Fix review comment

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>
2021-09-29 09:17:12 -07:00
Martin Hjelmare
50fffe48f8 Add zwave to zwave_js migration (#56159)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-09-29 08:55:27 -07:00
Daniel Hjelseth Høyer
d5c3d234ec Open garage, add config flow (#55290) 2021-09-29 09:43:51 -06:00
Erik Montnemery
40ecf22bac Remove automatic splitting of net meters from statistics (#56772) 2021-09-29 17:20:17 +02:00
Andre Richter
d13c3e3917 Migrate Vallox to new fan entity model (#56663)
* Migrate Vallox to new fan entity model

* Review comments 1

* Minor corrections

* Review comments 2
2021-09-29 17:14:41 +02:00
Erik Montnemery
00651a4055 Optimize _get_states_with_session (#56734)
* Optimize _get_states_with_session

* Move custom filters to derived table

* Remove useless derived table

* Filter old states after grouping

* Split query

* Add comments

* Simplify state update period criteria

* Only apply custom filters if we didn't get an include list of entities

Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-29 17:08:27 +02:00
avee87
daebc34f4d Add code_format to template alarm (#56700)
* Added code_format to template alarm

* review comment

* review comment

* use constant

* back to enum

* none -> no_code
2021-09-29 16:59:46 +02:00
Marc Mueller
77ee72cbb9 Import Callable from collections.abc (1) (#56775) 2021-09-29 16:32:11 +02:00
Marc Mueller
d51487f82a Import Callable from collections.abc (3) (#56777) 2021-09-29 16:19:06 +02:00
Marc Mueller
364767ff22 Import Callable from collections.abc (4) (#56778) 2021-09-29 16:15:36 +02:00
jan iversen
19685ecff0 Set strict typing for modbus. (#56779) 2021-09-29 16:15:55 +03:00
Marc Mueller
565a9fea6b Import Callable from collections.abc (2) (#56776) 2021-09-29 14:06:51 +02:00
Franck Nijhof
41e5f05d99 Fix energy validation when not tracking costs (#56768) 2021-09-29 13:24:34 +02:00
Maciej Bieniek
d3df6f26f9 Add missing voltage sensor in Shelly integration (#56773)
* Disable voltage sensor by default

* Add voltage sensor for Shelly 2/2.5

* Enable emeter voltage by default
2021-09-29 14:22:42 +03:00
Erik Montnemery
52e9f76f94 Tweak DB migration to schema version 21 (#56767) 2021-09-29 11:25:50 +02:00
Fabian Affolter
be34a2ddea Upgrade beautifulsoup4 to 4.10.0 (#56764) 2021-09-29 11:25:29 +02:00
Fabian Affolter
deb0cc4116 Upgrade holidays to 0.11.3 (#56762) 2021-09-29 11:25:06 +02:00
Joakim Sørensen
6a9b484f2d Remove timeout for backup services (#56763) 2021-09-29 09:46:05 +02:00
Regev Brody
115bb39c10 Fix cover group to handle unknown state properly (#56739)
* fix cover group unknown state

* fix cover grup state

* fix cover group issue
2021-09-29 08:37:16 +02:00
Simone Chemelli
34ef47db55 Fritz honor sys option pref_disable_new_entities (#56740) 2021-09-28 20:59:03 -07:00
João Pedro Hickmann
4513a46248 Add zeroconf support for yeelight (#56758) 2021-09-28 20:53:43 -05:00
Myles Eftos
8e91e6e97e Adding price spike binary sensor to the Amber electric integration (#56736) 2021-09-28 18:01:35 -07:00
J. Nick Koston
cf36d0966d Add coverage to verify tplink unique ids (#56746) 2021-09-28 17:57:22 -07:00
Michael Chisholm
f7d95588f8 Provide most media metadata in DlnaDmrEntity (#56728)
Co-authored-by: Steven Looman <steven.looman@gmail.com>
2021-09-28 19:37:23 -05:00
Marc Mueller
718f8d8bf7 Use NamedTuple for xbox media type details (#56753) 2021-09-28 17:00:19 -07:00
Marc Mueller
15aafc8db6 Use NamedTuple for discovery service details (#56751) 2021-09-28 16:59:40 -07:00
Marc Mueller
a91fbec198 Use NamedTuple for esphome service metadata (#56754) 2021-09-28 16:58:36 -07:00
Marc Mueller
160571888c Use NamedTuple for intesishome swing settings (#56752) 2021-09-28 16:56:58 -07:00
Raman Gupta
e76ddb4b27 Add proper S2 support for adding zwave_js nodes (#56516)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-09-28 15:37:45 -07:00
Milan Meulemans
db30c27455 Clean up Nanoleaf (#56732) 2021-09-28 15:39:54 -05:00
J. Nick Koston
bc59387437 Explictly close the TPLink SmartDevice protocol on unload (#56743)
* Explictly close the TPLink SmartDevice protocol on unload

- There is a destructor that will eventually do this when
  the object gets gc. Its better to explictly do it at
  unload.

* fix coro mock
2021-09-28 18:36:45 +02:00
J. Nick Koston
c95f7a5ba6 Add network support to tplink for discovery across subnets (#56721) 2021-09-28 09:58:25 -05:00
Maciej Bieniek
0044fa9fb9 Add support for pedestal MIOT fans to Xiaomi Miio integration (#56555)
* Add initial support for Xiaomi Fan ZA5

* Add sensor, number and switch platform

* Addionizer switch

* Improve ionizer icon

* Fix parent of XiaomiFanMiot class

* Add another MIOT models

* Fix consts

* Add powersupply attached binary sensor

* Simplify async_create_miio_device_and_coordinator

* Simplify XiaomiGenericFan

* Fix XiaomiFanZA5 parent

* Remove pass

* Remove unused _available variable

* 1C doesn't support direction

* Suggested change

* Use elif

* Clean up oscillation angle

* Fix typo
2021-09-28 10:21:14 +02:00
Joakim Sørensen
b179301152 Adjust lock configuration (#56731) 2021-09-28 10:15:45 +02:00
Adrian Huber
b64b926e13 Add raid monitoring to glances (#56623) 2021-09-28 10:04:08 +02:00
gjong
495e5cb1c0 Update YouLess library for support for PVOutput firmware (#55784) 2021-09-28 09:59:40 +02:00
Maciej Bieniek
2581a3a735 Add binary sensor platform to Tractive integration (#56635)
* Add binary sensor platform

* Update .coveragerc file

* Create battery charging sensor only if tracker supports it

* Improve async_setup_entry

* Add TRAXL1 model
2021-09-28 09:56:06 +02:00
jjlawren
0d6aa89fd4 Refactor Sonos alarms and favorites updating (#55529) 2021-09-28 09:49:32 +02:00
Diogo Gomes
922d4c42a3 Inherit Filter sensor state_class from source sensor (#56407) 2021-09-28 09:30:21 +02:00
Regev Brody
9d89e1ae00 Bump WazeRouteCalculator to 0.13 (#56718) 2021-09-28 09:25:34 +02:00
dependabot[bot]
8dc4824aac Bump dessant/lock-threads from 2.1.2 to 3 (#56727)
Bumps [dessant/lock-threads](https://github.com/dessant/lock-threads) from 2.1.2 to 3.
- [Release notes](https://github.com/dessant/lock-threads/releases)
- [Changelog](https://github.com/dessant/lock-threads/blob/master/CHANGELOG.md)
- [Commits](https://github.com/dessant/lock-threads/compare/v2.1.2...v3)

---
updated-dependencies:
- dependency-name: dessant/lock-threads
  dependency-type: direct:production
  update-type: version-update:semver-major
...

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-28 10:19:57 +03:00
Raman Gupta
e690d4b006 Add support for zwave_js device actions (#53038)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-09-28 09:06:02 +02:00
Erik Montnemery
552485bb05 Tweak list_statistic_ids (#55845)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-09-28 00:05:26 -07:00
Oscar Calvo
c48527858d Activate fault handler (#56550) 2021-09-28 00:05:06 -07:00
Myles Eftos
412ecacca3 Amberelectric (#56448)
* Add Amber Electric integration

* Linting

* Fixing some type hinting

* Adding docstrings

* Removing files that shouldn't have been changed

* Splitting out test helpers

* Testing the price sensor

* Testing Controlled load and feed in channels

* Refactoring mocks

* switching state for native_value and unit_of_measurement for native_unit_of_measurement

* Fixing docstrings

* Fixing requiremennts_all.txt

* isort fixes

* Fixing pylint errors

* Omitting __init__.py from test coverage

* Add missing config_flow tests

* Adding more sensor tests

* Applying suggested changes to __init.py__

* Refactor coordinator to return the data object with all of the relevent data already setup

* Another coordinator refactor - Better use the dictionary for when we build the sensors

* Removing first function

* Refactoring sensor files to use entity descriptions, remove factory

* Rounding renewable percentage, return icons correctly

* Cleaning up translation strings

* Fixing relative path, removing TODO

* Coordintator tests now accept new (more accurate) fixtures

* Using a description placeholder

* Putting missing translations strings back in

* tighten up the no site error logic - self._site_id should never be None at the point of loading async_step_site

* Removing DEVICE_CLASS, replacing the units with AUD/kWh

* Settings _attr_unique_id

* Removing icon function (it's already the default)

* Apply suggestions from code review

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

* Adding strings.json

* Tighter wrapping for try/except

* Generating translations

* Removing update_method - not needed as it's being overriden

* Apply suggestions from code review

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

* Fixing tests

* Add missing description placeholder

* Fix warning

* changing name from update to update_data to match async_update_data

* renaming [async_]update_data => [async_]update_price_data to avoid confusion

* Creating too man renewable sensors

* Override update method

* Coordinator tests use _async_update_data

* Using $/kWh as the units

* Using isinstance instead of __class__ test. Removing a zero len check

* Asserting self._sites in second step

* Linting

* Remove useless tests

Co-authored-by: jan iversen <jancasacondor@gmail.com>
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-09-28 00:03:51 -07:00
J. Nick Koston
f93539ef4c Add api to the network integration to get ipv4 broadcast addresses (#56722) 2021-09-27 21:43:39 -07:00
J. Nick Koston
aea754df5d Add dhcp support for TPLink KL60 and EP40 (#56726) 2021-09-27 22:45:53 -05:00
Erik Montnemery
8ef123259e Add WS API for updating unit_of_measurement in statistics metadata (#56184)
* Add WS API for updating statistics metadata

* Update homeassistant/components/recorder/websocket_api.py

Co-authored-by: Bram Kragten <mail@bramkragten.nl>

* Update homeassistant/components/recorder/websocket_api.py

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

* Fix typo

Co-authored-by: Bram Kragten <mail@bramkragten.nl>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-09-28 00:43:29 +02:00
Diogo Gomes
ec9fc0052d Define unit_of_measurement of all utility_meter sensors on HA start (#56112)
* define unit_of_measurement on hass start

* delay utility_meter state

* check state

* store siblings

* don't check unit_of_measurement
2021-09-28 00:42:27 +02:00
Erik Montnemery
5976f898da Add WS API for removing statistics for a list of statistic_ids (#55078)
* Add WS API for removing statistics for a list of statistic_ids

* Refactor according to code review, enable foreign keys support for sqlite

* Adjust tests

* Move clear_statistics WS API to recorder

* Adjust tests after rebase

* Update docstring

* Update homeassistant/components/recorder/websocket_api.py

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

* Adjust tests after rebase

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-09-27 23:30:13 +02:00
tube0013
0653693dff Add usb discovery for tubeszb ch340B serial devices (#56719) 2021-09-27 16:19:42 -05:00
Michael Chisholm
a28fd7d61b Config-flow for DLNA-DMR integration (#55267)
* Modernize dlna_dmr component: configflow, test, types

* Support config-flow with ssdp discovery
* Add unit tests
* Enforce strict typing
* Gracefully handle network devices (dis)appearing

* Fix Aiohttp mock response headers type to match actual response class

* Fixes from code review

* Fixes from code review

* Import device config in flow if unavailable at hass start

* Support SSDP advertisements

* Ignore bad BOOTID, fix ssdp:byebye handling

* Only listen for events on interface connected to device

* Release all listeners when entities are removed

* Warn about deprecated dlna_dmr configuration

* Use sublogger for dlna_dmr.config_flow for easier filtering

* Tests for dlna_dmr.data module

* Rewrite DMR tests for HA style

* Fix DMR strings: "Digital Media *Renderer*"

* Update DMR entity state and device info when changed

* Replace deprecated async_upnp_client State with TransportState

* supported_features are dynamic, based on current device state

* Cleanup fully when subscription fails

* Log warnings when device connection fails unexpectedly

* Set PARALLEL_UPDATES to unlimited

* Fix spelling

* Fixes from code review

* Simplify has & can checks to just can, which includes has

* Treat transitioning state as playing (not idle) to reduce UI jerking

* Test if device is usable

* Handle ssdp:update messages properly

* Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances

* Fix tests for transitioning state

* Mock DmrDevice.is_profile_device (added to support embedded devices)

* Use ST & NT SSDP headers to find DMR devices, not deviceType

The deviceType is extracted from the device's description XML, and will not
be what we want when dealing with embedded devices.

* Use UDN from SSDP headers, not device description, as unique_id

The SSDP headers have the UDN of the embedded device that we're interested
in, whereas the device description (`ATTR_UPNP_UDN`) field will always be
for the root device.

* Fix DMR string English localization

* Test config flow with UDN from SSDP headers

* Bump async-upnp-client==0.22.1, fix flake8 error

* fix test for remapping

* DMR HA Device connections based on root and embedded UDN

* DmrDevice's UpnpDevice is now named profile_device

* Use device type from SSDP headers, not device description

* Mark dlna_dmr constants as Final

* Use embedded device UDN and type for unique ID when connected via URL

* More informative connection error messages

* Also match SSDP messages on NT headers

The NT header is to ssdp:alive messages what ST is to M-SEARCH responses.

* Bump async-upnp-client==0.22.2

* fix merge

* Bump async-upnp-client==0.22.3

Co-authored-by: Steven Looman <steven.looman@gmail.com>
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 15:47:01 -05:00
RenierM26
b15f11f46a Discover Switchbot MAC in config flow (#56616)
* Update config_flow.py

* Switchbot Config_flow discover mac instead of needing to type it.

* Do not show already configured devices in config flow, abort if no unconfigured devices.

* Apply suggestions from code review

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

* Move MAC to top of config flow form dict.

* Update homeassistant/components/switchbot/config_flow.py

Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 15:12:40 -05:00
Teemu R
b40d229369 Rework TPLink integration to use python-kasa (#56701)
Co-authored-by: J. Nick Koston <nick@koston.org>
Co-authored-by: Teemu R. <tpr@iki.fi>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-09-27 14:11:55 -05:00
Hung Nguyen
7a2bc130b7 Bump elkm1-lib to 1.0.0 (#56703) 2021-09-27 14:10:09 -05:00
Bastien Gautier
806fdc0095 Patch coinbase (#56426)
* Add Clover Finance coin to coinbase

* Add Fetch.ai coin to coinbase

* Fix typo
2021-09-27 20:39:43 +02:00
Marc Mueller
2f4e992662 Use EntityDescription - daikin (#55929) 2021-09-27 20:26:10 +02:00
Raman Gupta
f0e0b41f77 Use entity attributes for vizio integration (#56093) 2021-09-27 20:20:15 +02:00
Marc Mueller
0dcd8b32ab Use EntityDescription - meteo_france (#55677) 2021-09-27 19:40:55 +02:00
Marc Mueller
71ce858378 Use EntityDescription - toon (#55035) 2021-09-27 19:37:12 +02:00
Erik Montnemery
fe66d6295c Improve migration to recorder schema version 21 (#56204) 2021-09-27 19:31:40 +02:00
Steffen Zimmermann
e5642a8648 Add state_class measurements in wiffi integration (#54279)
* add support for state_class measurements in wiffi integration

* use new STATE_CLASS_TOTAL_INCREASING for metered entities

like
- amount of rainfall per hour/day
- rainfall hours per day
- sunshine hours per day

* Update homeassistant/components/wiffi/sensor.py

Co-authored-by: Greg <greg.diehl.gtd@gmail.com>

Co-authored-by: Greg <greg.diehl.gtd@gmail.com>
2021-09-27 18:28:20 +02:00
Erik Montnemery
4d7e3cde5a Minor cleanup and test coverage improvement for MQTT (#55265) 2021-09-27 17:45:52 +02:00
Franck Nijhof
eae828a15a Upgrade lupupy to 0.0.21 (#56636) 2021-09-27 17:42:13 +02:00
Michael Chisholm
805e73f78c Add UPNP device connection for Sonos (#56702) 2021-09-27 17:36:47 +02:00
Marc Mueller
70cc6295b5 Use EntityDescription - hydrawise (#55924) 2021-09-27 17:35:09 +02:00
Fredrik Oterholt
4d433e18ac Add more sensor types for airthings devices (#56706)
* add additional sensor types for airthings devices

* remove "out of ten" unit

* change unit on rssi

* remove device class for light

* disable by default
2021-09-27 13:27:02 +02:00
Marius
4ce7166afd Add node sensor status icons (#56137)
Co-authored-by: kpine <keith.pine@gmail.com>
Co-authored-by: Raman Gupta <7243222+raman325@users.noreply.github.com>
2021-09-27 12:50:14 +02:00
Marc Mueller
83b1b3e92c Use EntityDescription - tellduslive (#55928) 2021-09-27 12:28:58 +02:00
Michael
f2debf5c01 Remove unnecessary extra attribute from Pi-hole sensors (#56076) 2021-09-27 12:27:03 +02:00
jan iversen
6da548b56a Strictly type modbus cover.py (#56381) 2021-09-27 12:26:25 +02:00
jan iversen
50f97b26eb Strictly type modbus climate.py (#56380) 2021-09-27 12:25:05 +02:00
Simone Chemelli
b612e16120 Add current and latest firmware info to Synology_dsm (#56460) 2021-09-27 12:23:26 +02:00
Erik Montnemery
58f465f271 Don't reset meter when last_reset is set to None (#56609) 2021-09-27 12:17:09 +02:00
jjlawren
931cf4eaab Improve Sonos handling of TuneIn stations (#56479) 2021-09-27 12:07:14 +02:00
Robert Svensson
ca6b53c16d Remove UniFi config entry reference from device when removing last entity of said device (#56501) 2021-09-27 12:04:29 +02:00
Erik Montnemery
efe467217a Don't round in energy cost sensor (#56258) 2021-09-27 12:01:17 +02:00
Aaron Bach
56b94d6809 Simplify native value property for WattTime (#56664) 2021-09-27 11:58:51 +02:00
Franck Nijhof
4f5d6b8ba1 Upgrade sentry-sdk to 1.4.1 (#56707) 2021-09-27 11:20:43 +02:00
Erik Montnemery
14a1bb423c Add is_number template filter and function (#56705) 2021-09-27 10:47:57 +02:00
Fabian Affolter
e4dc646237 Upgrade praw to 7.4.0 (#56682) 2021-09-27 08:48:21 +02:00
Michael Chisholm
6c2674734a SSDP starts config flow only for alive devices (#56551)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 08:39:22 +02:00
dependabot[bot]
0f313ec73c Bump home-assistant/builder from 2021.07.0 to 2021.09.0 (#56704)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-27 08:37:54 +02:00
J. Nick Koston
0fce9f39b3 Avoid checking if a package is installed if it already failed (#56698) 2021-09-26 22:32:25 -07:00
Fabian Affolter
01bd3ff138 Upgrade sendgrid to 6.8.2 (#56688) 2021-09-27 07:03:29 +02:00
Fabian Affolter
8884e9691e Upgrade TwitterAPI to 2.7.5 (#56687) 2021-09-27 07:03:09 +02:00
Fabian Affolter
55c9abc58d Upgrade discord.py to 1.7.3 (#56686) 2021-09-27 07:02:46 +02:00
Fabian Affolter
44a4507b51 Upgrade requests to 2.26.0 (#56683)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-26 21:44:28 -05:00
Fabian Affolter
115d34f55a Set certifi to >=2021.5.30 (#56679)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-26 21:19:30 -05:00
J. Nick Koston
7ab6c82ad2 Drop defusedxml dep from ssdp manifest (#56699) 2021-09-26 19:49:43 -05:00
J. Nick Koston
26e031984b Ensure sonos always gets ssdp callbacks from searches (#56591) 2021-09-26 17:16:03 -05:00
J. Nick Koston
6399730d2f Optimize SSDP matching (#56622)
* Optimize SSDP matching

* tweak

* remove

* remove dupe
2021-09-26 16:30:39 -05:00
J. Nick Koston
f268227d64 Implement retry and backoff strategy for requirements install (#56580)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-09-26 14:47:03 -05:00
Raman Gupta
8716aa011a Add support for multilevel switch CC select entities (#56656)
* Add support for multilevel switch CC select entities

* Use state names from docs and include more device identifiers from device DB

* black

* pylint

* type fix

* Add failure scenario test

* Update homeassistant/components/zwave_js/select.py

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

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-09-26 14:22:41 -04:00
Fabian Affolter
2326e3ed94 Upgrade voluptuous to 0.12.2 (#56680) 2021-09-26 18:59:00 +02:00
J. Nick Koston
52410ff0d7 Ensure yeelight can be unloaded when device is offline (#56464) 2021-09-26 09:54:43 -07:00
J. Nick Koston
26f73779cc Avoid enabling ipv6 dual stack for zeroconf on unsupported platforms (#56584) 2021-09-26 09:51:34 -07:00
J. Nick Koston
f74291ccb6 Expose the ability to move an entity/device between config entries (#56661) 2021-09-26 09:50:57 -07:00
Marc Mueller
e35e584b60 Use EntityDescription - sht31 (#56435)
* Use EntityDescription - sht31

* Add device_class for humidity

* Fix monitored conditions

* Add pylint disable
2021-09-26 18:19:36 +02:00
Fabian Affolter
65bce33a63 Upgrade emoji to 1.5.0 (#56684) 2021-09-26 15:09:13 +02:00
Franck Nijhof
bfefe82605 Upgrade pre-commit to 2.15.0 (#56677) 2021-09-26 14:47:47 +02:00
Fabian Affolter
a0a359e2ef Upgrade ciso8601 to 2.2.0 (#56678) 2021-09-26 14:47:29 +02:00
Daniel Hjelseth Høyer
d8387744ec Correct the device name for Airthings (#56655) 2021-09-26 12:48:27 +02:00
Aaron Bach
01e03a223b Simplify native value and attributes properties for Flu Near You (#56665) 2021-09-26 11:12:54 +02:00
Aaron Bach
aeba3a703f Revert "Simplify state update for Flu Near You (#56650)" (#56662)
This reverts commit d4ebcf2ba5.
2021-09-25 17:19:17 -06:00
Robert Svensson
8db0bd3c0e Fix state_class for deCONZ power sensors (#56586)
* Fix state_class for power sensors
Rewrite entity descriptions for binary sensor and sensor platforms

* Remove icon if device_class is specified
2021-09-25 20:54:55 +02:00
Aaron Bach
d4ebcf2ba5 Simplify state update for Flu Near You (#56650) 2021-09-25 20:22:51 +02:00
Franck Nijhof
fabf5204be Ignore config directory symlink in development (#56639) 2021-09-25 12:53:41 +02:00
Franck Nijhof
83f1116432 Upgrade numpy to 1.21.2 (#56640) 2021-09-25 12:39:21 +02:00
Franck Nijhof
23e1c663d4 Upgrade pytest-xdist to 2.4.0 (#56606) 2021-09-25 12:07:29 +02:00
Matt Zimmerman
754ff7e3cb Update python-smarttub to 0.0.27 (#56626) 2021-09-25 12:06:41 +02:00
MatthewFlamm
8bc8081e81 Add state_class_measurement to nws (#56629) 2021-09-25 11:58:07 +02:00
Franck Nijhof
917254e956 Upgrade pyupgrade to v2.27.0 (#56638) 2021-09-25 11:48:47 +02:00
Franck Nijhof
57aaf55678 Upgrade pipdeptree to 2.1.0 (#56637) 2021-09-25 11:48:31 +02:00
Daniel Hjelseth Høyer
f0de6dc21a Use SurePetcareEntity for surepetcare binary sensor (#56601)
* Use SurePetcareEntity for surepetcare binary sensor

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* tests

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>
2021-09-25 11:17:55 +02:00
Joakim Plate
5c1f55ffa4 Bump fjäråskupan to 1.0.1 (#56628) 2021-09-25 11:17:26 +02:00
Raman Gupta
b1f4ccfd6b Reuse zwave_js device when replacing removed node with same node (#56599)
* Reuse zwave_js device when a removed node is replaced with the same node

* Ensure change is backwards compatible with servers that don't include replaced

* Remove lambda

* Add assertions to remove type ignores

* fix tests by always copying state and setting manufacturer/label attributes
2021-09-25 10:43:37 +02:00
Michaël Arnauts
5d3d6fa1cd Add state_class and use SensorEntityDescription for comfoconnect (#54066)
* Add state_class=measurement and use SensorEntityDescriptions

* Use attributes from entity_description

* Improvements

* Adress remarks

* Revert changes to fan

* move method

* Fix tests

* Revert fan/__init__.py

* Revert key change

* Set default percentage in turn_on
2021-09-24 22:26:56 +02:00
Aaron Bach
0ea5f25594 Add ability to re-auth Notion (#55616) 2021-09-24 11:23:19 -07:00
Robert Hillis
a7d56d1c3f Bump goalzero to 0.2.0 (#56613)
* Bump goalzero to 0.1.8

* bump

* recheck

* bump
2021-09-24 12:18:14 -06:00
Eduard van Valkenburg
ac576a2bc6 update SIA package (#56615) 2021-09-24 12:15:21 -06:00
RenierM26
3c80e05100 Set Switchbot _attr_is_closed on init (#56611)
* self._attr_is_closed needs to be set initially.

* Set _attr_is_closed on init.
2021-09-24 12:13:45 -06:00
Maikel Punie
8aff51042b Bump velbus-aio to 2021.9.4 (#56478)
* Bump version, move the cache-dir to the home-assistant config

* Moved the cahce into the storage dir

* Bump version, 2021.9.3 will use pathlib

* Bump version to 2021.9.4

* Clean config path

* Remove leading slash

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-09-24 20:09:44 +02:00
Robert Hillis
e078f4ce14 Move efergy api to pyefergy (#56594)
* Move efergy api to pyefergy

* fix permissions

* tweak

* tweak
2021-09-24 12:54:15 +02:00
Franck Nijhof
d7e121f3e8 Upgrade pytest to 6.2.5 (#56603) 2021-09-24 10:11:36 +02:00
Daniel Hjelseth Høyer
aca00667df Add device info to Surepetcare (#56600) 2021-09-24 09:21:47 +02:00
Erik Montnemery
64393b462d Add migration for 5-minute statistics (#56585)
* Add migration for 5-minute statistics

* Tweaks
2021-09-24 09:19:22 +02:00
Erik Montnemery
7452998081 Convert last_reset timestamps to UTC (#56561)
* Convert last_reset timestamps to UTC

* Add test

* Apply suggestion from code review
2021-09-24 09:16:50 +02:00
Maciej Bieniek
e62c9d338e Rework Tractive integration init (#55741)
* Rework integration init

* Suggested chancge

* Use Trackables class

* Use try..except for trackable_objects

* Check that the pet has tracker linked
2021-09-24 08:45:03 +02:00
Jan Bouwhuis
e73ca9bd18 Alexa fix Fan support and cleanup (#56053)
* del PowerLevelController, ena fan PowerController

* Use AlexaRangeContoller for speed or default

* Update tests

* no-else-return

* Avoid cases with only one preset_mode

* Only report ghost_mode to Alexa - fix bug

* Add some tests for patched code

* pylint

* pylint and tests with one preset_mode

* correct ghost preset mode check in test

* add tests for RangeController

* ghost preset_mode locale agnostic

* isort

* Update homeassistant/components/alexa/capabilities.py

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

* Update homeassistant/components/alexa/entities.py

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

* Update homeassistant/components/alexa/entities.py

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

* Update homeassistant/components/alexa/entities.py

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

* Update homeassistant/components/alexa/entities.py

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

* Update entities.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2021-09-24 08:14:45 +02:00
J. Nick Koston
0363c22dd8 Fix Sonos going offline with 13.3 firmware (#56590) 2021-09-23 20:39:20 -07:00
RenierM26
915afedcfc Add binary_sensor to switchbot (#56415)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-23 17:10:34 -05:00
Milan Meulemans
0b53f73fe2 Convert Nanoleaf integration to use Async library aionanoleaf (#56548) 2021-09-23 15:37:37 -05:00
Michael
7ece35cd6f Assume Fritz!Smarthome device as unavailable (#56542) 2021-09-23 13:29:12 -07:00
RenierM26
972db29c88 Add sensor to switchbot platform (#56416)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-23 15:27:34 -05:00
Daniel Hjelseth Høyer
6e7bc65e2e Airthings (#56578) 2021-09-23 13:20:30 -07:00
Daniel Hjelseth Høyer
a94514b00d Add Surepetcare entity class (#56430) 2021-09-23 13:19:46 -07:00
Rami Mosleh
4c40d1767a Remove config for Speedtest.net (#55642) 2021-09-23 20:44:59 +02:00
Franck Nijhof
7fc0717ab1 Upgrade debugpy to 1.4.3 (#56576) 2021-09-23 11:12:19 -07:00
Franck Nijhof
750a1b84ad Add date device_class to Twente Milieu sensors (#56579) 2021-09-23 11:09:00 -07:00
Marc Mueller
fed5f5e3b9 Use EntityDescription - fitbit (#55925) 2021-09-23 20:08:47 +02:00
Franck Nijhof
60bb3121b6 Upgrade apprise to 0.9.5.1 (#56577) 2021-09-23 11:00:45 -07:00
Kevin Worrel
b43d377b53 Create but disable-by-default RPM and GPM sensors (#56549) 2021-09-23 11:00:33 -07:00
Andre Richter
a5c6a65161 Activate mypy for Vallox (#55874) 2021-09-23 10:59:28 -07:00
Franck Nijhof
2fe8c78811 Fix Toon push updates (#56583) 2021-09-23 19:50:30 +02:00
jan iversen
1cc850877f strictly type: fan.py, light.py, switch.py. (#56379) 2021-09-23 18:35:50 +01:00
Brian O'Connor
cce906f968 Fix OpenWeatherMap dewpoint conversion (#56303) 2021-09-23 10:14:15 -07:00
Marc Mueller
70f10338cc Use EntityDescription - solaredge_local (#56434) 2021-09-23 18:29:58 +02:00
Joakim Sørensen
98d0c84468 Enable strict typing for the tautulli integration (#55448) 2021-09-23 16:56:21 +02:00
Aaron Bach
1a47fcc4e3 Add long-term statistics for OpenUV sensors (#55417) 2021-09-23 16:54:06 +02:00
Marc Mueller
b634bd26d0 Use EntityDescription - kraken (#56436) 2021-09-23 16:42:55 +02:00
Franck Nijhof
c1df49e9fc Upgrade black to 21.9b0 (#56575) 2021-09-23 16:33:24 +02:00
Jc2k
442d850fc9 Bump aiohomekit to 0.6.3 (#56574) 2021-09-23 16:30:15 +02:00
Franck Nijhof
237efcf6b1 Upgrade colorlog to 6.4.1 (#56573) 2021-09-23 16:12:13 +02:00
Franck Nijhof
bdef131294 Upgrade watchdog to 2.1.5 (#56572) 2021-09-23 16:11:47 +02:00
Franck Nijhof
71ab24f350 Upgrade pre-commit to 2.14.1 (#56569) 2021-09-23 16:11:29 +02:00
Franck Nijhof
655dc890e4 Upgrade PyTurboJPEG to 1.6.1 (#56571) 2021-09-23 15:34:34 +02:00
J. Nick Koston
a6ccb1821e Update zeroconf to 0.36.7 (#56553) 2021-09-23 08:00:17 -05:00
Erik Montnemery
f0a4a89d21 Add comments to recorder statistics code (#56545)
* Add comments to recorder statistics code

* Revert accidental change of list_statistic_ids
2021-09-23 13:14:45 +02:00
Ricardo Steijn
63610eadc9 Address Crownstone review comments (#56485) 2021-09-23 09:23:45 +02:00
Oscar Calvo
ea8f624f28 Fix an issue where core process crashes when an SMS is received (#56552) 2021-09-22 21:49:08 -07:00
Erik Montnemery
83156fb9ec Energy validation: Require last_reset attribute to be set for state_class measurement energy and cost sensors (#56254)
* Require last_reset attribute to be set for measurement state_class

* Tweak

* Improve tests

* Lint

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-09-22 21:48:37 -07:00
Paulus Schoutsen
974376a8de Bump frontend to 20210922.0 (#56546) 2021-09-22 16:20:58 -07:00
Paulus Schoutsen
677abcd484 Allow confirming local push notifications (#54947)
* Allow confirming local push notifications

* Fix from Zac

* Add tests
2021-09-22 23:17:04 +02:00
Erik Montnemery
f77e93ceeb Fix validation of cost entities for energy dashboard (#56219) 2021-09-22 13:57:58 -07:00
Sian
351ef0ab44 Register Google assistant energy storage trait (#56520) 2021-09-22 13:36:03 -07:00
Erik Montnemery
92253f5192 Minor refactoring of periodic statistics (#56492) 2021-09-22 13:31:33 -07:00
Ville Skyttä
d8d34fdd3b Prefer HTTPStatus over int in HA view JSON functions (#56504)
* Prefer HTTPStatus over int in HA view JSON functions

* Update zwave tests to not expect a fixed typo
2021-09-22 21:59:52 +03:00
Paulus Schoutsen
39aaa383b3 Fix flaky srp energy test (#56536) 2021-09-22 17:41:10 +02:00
Alexei Chetroi
a5d405700c ZHA channel ZCL attributes initialization (#56476)
* Add dict of attributes to initialize

* Refactor get_attributes() method

Read 5 attributes at the time.

* Add ZCL_INIT_ATTRS attribute to base Zigbee channel

* Update tests and general clusters

* Update channels to use ZCL_INIT_ATTRS

* Update channels to use ZCL_INIT_ATTRS

* Fix tests

* Refactor async_initialize() to be a retryable request

* Maky pylint happy again
2021-09-22 11:34:30 -04:00
Tobias Sauerwein
2478ec887a Allow camera usage with HA cloud (#56533) 2021-09-22 16:54:12 +02:00
Paulus Schoutsen
e34c985534 Simplify cloud request connection handling (#56243)
Co-authored-by: Pascal Vizeli <pascal.vizeli@syshack.ch>
2021-09-22 07:51:31 -07:00
Erik Montnemery
ac053388b4 Convert image_processing tests to pytest (#56451)
* Convert image_processing tests to pytest

* Use existing fixtures and test helpers

* Remove useless code
2021-09-22 15:00:28 +02:00
Tobias Sauerwein
26d310fc8a Split Netatmo camera persons by home (#55598)
* Split persons by home
* Bump pyatmo to 6.0.0
* Check is person exists
* Extract method for fetching person ids
2021-09-22 14:32:30 +02:00
Roel van der Ark
aab4b5ec06 Add extra power meter for YouLess (#56528)
* #55535 added extra power meter

* Update sensor.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2021-09-22 14:08:23 +02:00
Niklas Åström
783cc1eacd Optimise requests to the tado servers (#56261)
This avoids calling the tado servers unnecessarily many times, especially for bigger homes. This is done by calling aggregating endpoints instead of iterating over the zones and devices and calling endpoints over and over.
2021-09-22 14:01:30 +02:00
Robert Hillis
a653da137c Use EntityDescription - efergy (#54210) 2021-09-21 16:53:35 -05:00
Bas Nijholt
b7a758bd0c raise PlatformNotReady when speakers unreachable (#56508)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-09-21 14:35:51 -07:00
J. Nick Koston
9831ff0487 Avoid deadlock on shutdown when a task is shielded from cancelation (#56499) 2021-09-21 14:35:14 -07:00
Erik Montnemery
d494b3539d Prevent 3rd party lib from opening sockets in google_assistant tests (#56346) 2021-09-21 11:27:10 -07:00
Ville Skyttä
1aa7c87151 Remove redundant aiohttp response status=200 kwargs (#56417)
* Remove redundant aiohttp response status=200 kwargs

* Remove some more in h.c.auth

* Restore explicit status=HTTP_OK for auth and webhook per review request
2021-09-21 10:51:12 -07:00
RenierM26
26e9590927 Add cover platform to switchbot (#56414)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-21 12:35:47 -05:00
jan iversen
34de74d869 Strictly type tradfri config_flow.py (#56391)
* Strictly type config_flow.py.

* Review comments.
2021-09-21 16:23:10 +02:00
Justin Goette
56b66d5124 typo (#56477) 2021-09-21 15:09:21 +01:00
jan iversen
c7c789f618 Strictly type modbus __init__.py, validator.py (#56378)
* strictly type: __init__.py, validator.py
2021-09-21 13:43:41 +02:00
jan iversen
518c99c8b7 Strictly type tradfri cover.py (#56390)
* Strictly type cover.py.

* Review comments from other PR.

* Update homeassistant/components/tradfri/cover.py

Co-authored-by: Ruslan Sayfutdinov <ruslan@sayfutdinov.com>

* Update homeassistant/components/tradfri/cover.py

Co-authored-by: Ruslan Sayfutdinov <ruslan@sayfutdinov.com>

* Update homeassistant/components/tradfri/cover.py

Co-authored-by: Ruslan Sayfutdinov <ruslan@sayfutdinov.com>

* Update homeassistant/components/tradfri/cover.py

Co-authored-by: Ruslan Sayfutdinov <ruslan@sayfutdinov.com>
2021-09-21 12:15:45 +01:00
Pascal Vizeli
7698c179ac Upgrade cryptography to 3.4.8 (#56481)
* Upgrade cryptography to 3.4.8

* Fix file
2021-09-21 11:06:52 +02:00
Oscar Calvo
f9fde7f7a1 Support unicode in SMS messages (#56468) 2021-09-21 10:07:14 +02:00
Elliot Morales Solé
097fae0348 Correct Alexa scene activation (#56469)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-09-20 22:51:17 -07:00
Paulus Schoutsen
d4864f5750 Deprecate passing template to notify (#56069) 2021-09-20 21:49:02 -07:00
Aaron Bach
aabc8cd2d5 Add WattTime integration (#56149) 2021-09-20 21:10:24 -07:00
Paulus Schoutsen
9059ee6604 Merge pull request #56472 from home-assistant/shelly-gen2 2021-09-20 20:19:19 -07:00
Marcin Ciupak
b9ffd74db5 Fix recorder Oracle DB models (#55564)
* Fix recorder models for Oracle DB

* Fix StatisticsRuns

* Update migration for Oracle Identity columns.

* Update migration logic

Migration to schema version 22 done only for engine dialect oracle

* Add missing table check in schema 22 migration
2021-09-21 00:38:42 +02:00
Marc Mueller
20ddd092f6 Remove xiaomi_aqara entity_description property (#56456) 2021-09-21 00:14:33 +02:00
Shay Levy
47340802b3 Add Shelly RPC device trigger and logbook platforms (#56428)
* Add RPC device trigger and logbook platforms

* Single input event for Block and RPC

* Add device generation to shelly.click
2021-09-21 00:09:44 +03:00
jan iversen
df56953c98 Strictly type tradfri light.py (#56389)
* Strictly type light.py.
2021-09-20 21:54:50 +02:00
Shay Levy
542f637ac4 Improve Shelly light application/consumption type handling (#56461) 2021-09-20 11:12:18 -07:00
J. Nick Koston
9e2a29dc37 Improve yeelight stability by moving timeout handling to upstream library (#56432) 2021-09-20 12:32:01 -05:00
jan iversen
f3ad4ca0cc Strictly type modbus.py. (#56375) 2021-09-20 18:47:05 +02:00
Marc Mueller
4c4bd740f3 Use EntityDescription - flume (#56433) 2021-09-20 11:13:09 -05:00
Erik Montnemery
6f36419c6f Improve statistics validation (#56457) 2021-09-20 17:54:25 +02:00
Erik Montnemery
fc4bb40a63 Prevent opening sockets in panasonic_viera tests (#56441) 2021-09-20 15:01:49 +02:00
jan iversen
a84e86ff13 Strictly type modbus base_platform.py (#56343) 2021-09-20 14:59:30 +02:00
Maciej Bieniek
bb6f97c4d3 Rework Xiaomi Miio fan platform (#55846) 2021-09-20 14:49:39 +02:00
jan iversen
93e9a67d7d Make tradfri base_class.py strictly typed (#56341)
* Make base_class.py strictly typed.
2021-09-20 14:33:50 +02:00
Erik Montnemery
5c717cbb1d Prevent opening of sockets in onboarding tests (#56443) 2021-09-20 13:56:50 +02:00
Otto Winter
a54854d129 ESPHome Noise Transport Encryption support (#56216) 2021-09-20 09:02:17 +02:00
mbo18
be19c676fa Add missing generic-x86-64 image (#56424) 2021-09-20 08:55:07 +02:00
jan iversen
ddd31951bc Strictly type sensor.py. (#56377) 2021-09-20 07:35:11 +02:00
Diogo Gomes
b05c1b516e restore float and not string (#56406) 2021-09-20 07:31:58 +02:00
J. Nick Koston
b060c025ce Bump zeroconf to 0.36.6 (#56438)
- Performance improvements (faster HomeKit startup)

Changelog: https://github.com/jstasiak/python-zeroconf/compare/0.36.5...0.36.6
2021-09-20 07:00:46 +02:00
Daniel Hjelseth Høyer
00f7548fa0 Surepetcare, strict typing (#56425)
* Surepetcare, strict typing

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* Surepetcare, strict typing

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>
2021-09-19 20:57:28 +02:00
Milan Meulemans
d76163e5be Add tests for Rituals Perfume Genie number, select and binary_sensor platforms (#55224) 2021-09-19 08:51:57 -10:00
Maciej Bieniek
ea189f930a Use attrs in Xiaomi Miio humidifier platform (#56371)
* Use attrs in humidifier platform

* Cleanup min/max humidity attrs
2021-09-19 17:04:33 +02:00
Joakim Sørensen
713d294627 Use _attr_* for the GitHub integration (#56419) 2021-09-19 15:10:51 +02:00
J. Nick Koston
88e42a540e Remove leftover debug prints in tests (#56409) 2021-09-19 12:43:02 +02:00
Erik Montnemery
ec52763706 Prevent 3rd party lib from opening sockets in samsungtv tests (#56334) 2021-09-18 22:24:27 -10:00
Erik Montnemery
80a57f5118 Prevent 3rd party lib from opening sockets in smhi tests (#56335) 2021-09-19 10:18:45 +02:00
J. Nick Koston
75c029c56b Bump zeroconf to 0.36.5 (#56413) 2021-09-18 21:52:09 -10:00
Daniel Hjelseth Høyer
a57d7717a8 Improve Surepetcare set_pet_location service (#56401)
* Surepetcare, improve set_pet_location

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* Surepetcare, improve set_pet_location

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* Surepetcare, improve set_pet_location

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* Surepetcare, improve set_pet_location

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* Surepetcare, improve set_pet_location

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>
2021-09-19 08:38:43 +02:00
Aidan Timson
53d4c0ce2d Increase Lyric update interval to 300 seconds (#56393) 2021-09-18 13:34:28 -10:00
Marc Mueller
7af67d34cf Use assignment expressions 01 (#56394) 2021-09-18 13:31:35 -10:00
Marc Mueller
a4f6c3336f Use EntityDescription - august (#56395) 2021-09-18 13:10:15 -10:00
jan iversen
9b710cad5d Add strict typing to tradfri __init__ and switch (#56002)
* Add strict typing to __init__ and switch.

* Review comments.

* Review comments.

* Corrected switch.
2021-09-18 23:24:35 +02:00
Erik Montnemery
f6526de7b6 Use hass_client_no_auth test fixture in nest tests (#56326) 2021-09-18 23:17:09 +02:00
Daniel Hjelseth Høyer
8b64cd7e7d Bump pyTibber to 0.19.1 (#56405)
Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>
2021-09-18 23:15:39 +02:00
Erik Montnemery
43b5dcff76 Use hass_client_no_auth test fixture in withings tests (#56337) 2021-09-18 23:12:02 +02:00
Robert Svensson
bf7c2753d5 deCONZ use siren platform (#56397)
* Add siren.py

* Working siren platform with 100% test coverage

* Also add test file...

* Add test to verify that switch platform cleans up legacy entities now that sirens are their own platform

* Update homeassistant/components/deconz/siren.py

Co-authored-by: jjlawren <jjlawren@users.noreply.github.com>
2021-09-18 21:59:04 +02:00
jan iversen
6b6e26c96d Strictly type binary_sensor.py. (#56376) 2021-09-18 20:54:11 +01:00
jan iversen
5c19368ce3 Strictly type sensor.py (#56388) 2021-09-18 20:49:47 +01:00
RenierM26
3ce8109e5e Add config flow to Switchbot (#50653)
Co-authored-by: Daniel Hjelseth Høyer <mail@dahoiv.net>
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-18 09:25:05 -10:00
jjlawren
f31b9eae61 Fix creating cert_expiry configs during runtime (#56298)
* Fix creating cert_expiry configs during runtime

* Address review feedback on tests

* Improve delayed startup test
2021-09-18 19:54:54 +02:00
Ashley 'DrToxic' Devine
312a9e5df2 Add Shiba Inu coin to coinbase (#56304)
Added SHIB coin
2021-09-18 18:49:29 +02:00
Daniel Hjelseth Høyer
f97cce6f57 Surepetcare, service to set pet location (#56198)
* Surepetcare, add handle_set_pet_location

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* Surepetcare, add handle_set_pet_location

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* Surepetcare, add handle_set_pet_location

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>
2021-09-18 17:48:58 +02:00
Paulus Schoutsen
9ffdc2594f Merge pull request #56366 from home-assistant/rc 2021-09-18 08:29:25 -07:00
Maciej Bieniek
0a5948dc8b Fetch the data a second time when -9999 error occurs in Xiaomi Miio integration (#56288) 2021-09-18 07:39:28 -07:00
Marc Mueller
811feb69ba Fix dangerous brackets (#56384) 2021-09-18 16:08:22 +02:00
Simone Chemelli
0a5fdb2e68 Address late review of samsungtv (#56382) 2021-09-18 15:42:36 +02:00
Marc Mueller
48bada5a18 Update pylint to 2.11.1 (#56364) 2021-09-18 13:52:59 +02:00
jan iversen
476d04e2fb Activate mypy. (#55965) 2021-09-18 10:02:24 +01:00
Erik Montnemery
39bc127dd6 Prevent 3rd party lib from opening sockets in glances tests (#56345) 2021-09-17 22:22:44 -10:00
Erik Montnemery
be0819b456 Mock out network.util.async_get_source_ip in tests (#56339) 2021-09-17 21:40:58 -10:00
J. Nick Koston
0830100df1 Do not reload the isy994 on ip change since there is already a reload listener (#54602) 2021-09-17 21:22:14 -10:00
Robert Svensson
539ef31046 Reflect changes to pydeconz v84 (#56361)
Mostly snake case conversions and typing
But also a change in retry mechanism
Added a more complete set_* call to most types to remove the direct relation to rest API of deCONZ
2021-09-18 09:05:08 +02:00
jan iversen
6947912fa9 Modbus entity update does not occur until after scan_interval (#56221)
* Secure update is called when integration is started.

* Review comments.

* Update homeassistant/components/modbus/base_platform.py

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

* Update homeassistant/components/modbus/base_platform.py

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

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-09-18 08:57:27 +02:00
Sean Vig
02ba3c6089 Update amcrest version to 1.9.3 (#56348)
This version fixes a bug that affects the current non-async Home Assistant integration
2021-09-18 08:34:51 +02:00
Paulus Schoutsen
f8d62866e5 Bumped version to 2021.9.7 2021-09-17 22:48:16 -07:00
J. Nick Koston
3046adf3b2 Fix yeelight nightlight mode (#56363) 2021-09-17 22:48:09 -07:00
Shay Levy
22307066bb Bump aioswitcher to 2.0.6 (#56358) 2021-09-17 22:48:08 -07:00
Joakim Plate
8c936b320e Avoid sending Standby when already off (#56306) 2021-09-17 22:48:07 -07:00
Erik Montnemery
9c4d6afb3c Bump pychromecast to 9.2.1 (#56296) 2021-09-17 22:48:06 -07:00
Aaron Bach
0442ed54e8 Bump pyopenuv to 2.2.1 (#56270) 2021-09-17 22:48:06 -07:00
J. Nick Koston
3224fc8710 Fix HomeKit requests with hvac mode and temperature in the same call (#56239) 2021-09-17 22:48:05 -07:00
Joakim Sørensen
6f40759ed0 Update docker base image to 2021.09.0 (#56191) 2021-09-17 22:48:04 -07:00
jjlawren
07ba24ac5a Bump plexapi to 4.7.1 (#56163) 2021-09-17 22:48:03 -07:00
Martin Ilievski
c0c85a6641 Bump pykodi to 0.2.6 (#56148) 2021-09-17 22:48:03 -07:00
J. Nick Koston
162fab91b2 Ensure rainmachine device name is a string (#56121) 2021-09-17 22:48:02 -07:00
muppet3000
6e80d27770 Bump growattServer to 1.1.0 (#56084) 2021-09-17 22:48:01 -07:00
Brian Egge
2b58a266cc Fix generic thermostat switch state initialization (#56073) 2021-09-17 22:48:00 -07:00
Oscar Calvo
bd17da0524 Support incoming SMS messages via polling (#54237)
* Add support to incomming SMS via polling

* Update dependencies

* Only send notification for unread messages

* Only inform if callback is not getting used

* Update gateway.py

* Apply PR feedback

* Update homeassistant/components/sms/gateway.py

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

* Apply PR comments

* Make black happy

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-09-17 22:47:59 -07:00
J. Nick Koston
7524daad86 Fix HomeKit requests with hvac mode and temperature in the same call (#56239) 2021-09-17 22:47:06 -07:00
Shay Levy
aaadd42539 Bump aioswitcher to 2.0.6 (#56358) 2021-09-17 22:42:58 -07:00
J. Nick Koston
b6763c7245 Fix yeelight nightlight mode (#56363) 2021-09-17 22:26:25 -07:00
J. Nick Koston
eb98ac9415 Allow IntegrationNotFound when checking config in safe mode (#56283)
Co-authored-by: Joakim Sørensen <hi@ludeeus.dev>
2021-09-17 22:25:50 -07:00
J. Nick Koston
bad6b2f7f5 Standardize yeelight exception handling (#56362) 2021-09-17 22:25:19 -07:00
Simone Chemelli
4160a5ee3b Strict typing for SamsungTV (#53585)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-17 18:51:07 -10:00
Alexei Chetroi
f5dd71d1e0 Bump up ZHA dependencies (#56359) 2021-09-17 19:52:49 -04:00
jan iversen
c4195c547c Update template/test_init.py to use pytest (#56336) 2021-09-17 15:13:17 -07:00
Milan Meulemans
f64aa0f8df Fix netgear strings (#56351) 2021-09-17 22:43:23 +02:00
J. Nick Koston
e880f1c8f9 Index config entries by domain (#56316) 2021-09-17 10:39:00 -10:00
Alexei Chetroi
5b0e00a74b Refactor ZHA HVAC thermostat channel (#56238)
* Refactor HVAC channel to use zigpy cached attributes

* Allow named attributes in ZHA test attribute reports

* Let attribute write to update cache

* WIP Update tests

* Cleanup
2021-09-17 15:17:34 -04:00
Daniel Hjelseth Høyer
16832bc35b AutomationTriggerInfo as type in rfxtrx (#56353)
* AutomationTriggerInfo as type in rfxtrx

* style

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>
2021-09-17 20:01:00 +02:00
Erik Montnemery
45046941c6 Avoid creating sockets in homekit port available tests (#56342) 2021-09-17 04:16:57 -10:00
Joakim Plate
9b00e0cb7a Rfxtrx device triggers and actions (#47909)
* Add helper

* Add device actions

* Add trigger

* Just make use of standard command

* Generalize code a bit

* Switch tests to currently existing features

* Add tests for capabilities

* Don't check schema asserted value

* Adjust strings somewhat

* Directly expose action subtypes

* Add a status event test

* Switch to modern typing

* Drop chime that is now part of command

* Adjust strings a bit

* Drop ability to set custom value

* Adjust changed base schema

* Validate triggers

* Try fix typing for 3.8
2021-09-17 15:28:43 +02:00
Erik Montnemery
ecf4a7813a Prevent 3rd party lib from opening sockets in wilight tests (#56310) 2021-09-17 15:27:26 +02:00
Shay Levy
5249c89c3f Add Shelly RPC sensor and binary sensor platforms (#56253) 2021-09-17 15:53:39 +03:00
Erik Montnemery
797b68b42d Prevent 3rd party lib from opening sockets in rfxtrx tests (#56331) 2021-09-17 12:51:40 +02:00
Erik Montnemery
55a77b2ba2 Prevent 3rd party lib from opening sockets in ps4 tests (#56330) 2021-09-17 12:51:25 +02:00
Erik Montnemery
327bf24940 Prevent 3rd party lib from opening sockets in cloud tests (#56328) 2021-09-17 12:50:59 +02:00
Erik Montnemery
e0a232aa36 Prevent 3rd party lib from opening sockets in wallbox tests (#56308) 2021-09-17 12:50:11 +02:00
Erik Montnemery
a793fd4134 Prevent 3rd party lib from opening sockets in ping tests (#56329) 2021-09-16 23:41:19 -10:00
Erik Montnemery
bce4c5eb11 Prevent 3rd party lib from opening sockets in zeroconf tests (#56324) 2021-09-16 23:19:32 -10:00
Erik Montnemery
fce7f0873e Prevent 3rd party lib from opening sockets in sia tests (#56325) 2021-09-16 23:19:19 -10:00
J. Nick Koston
8814c53504 Bump zeroconf to 0.36.4 (#56314) 2021-09-16 21:04:54 -10:00
Sean Vig
6d99a7a730 Add unique id to amcrest sensors (#55243)
* Add unique id to amcrest sensors

* Change 'unique_id' to 'serial_number' on api wrapper

* Update unique id's with channel value that can be used in future changes and remove unrelated camera changes
2021-09-17 07:48:17 +02:00
Joakim Plate
175f207d28 Avoid sending Standby when already off (#56306) 2021-09-17 06:50:46 +02:00
Erik Montnemery
8341ae12d3 Mock out zeroconf in homekit_controller tests (#56307) 2021-09-16 11:29:41 -10:00
jan iversen
70eb519f76 Update template/test_light.py to use pytest (#56300) 2021-09-16 11:05:00 -07:00
jan iversen
94f06f86cf Activate mypy for gpmdp. (#55967) 2021-09-16 20:05:08 +03:00
Erik Montnemery
15a7fe219d Bump pychromecast to 9.2.1 (#56296) 2021-09-16 20:01:02 +03:00
Maciej Bieniek
41bf1eb610 Fetch the data a second time when -9999 error occurs in Xiaomi Miio integration (#56288) 2021-09-16 09:19:41 -07:00
Shay Levy
8418d4ade2 Address Switcher late review comments (#56264)
* Address Switcher late review comments

* Rename wrapper to coordinator
2021-09-16 17:06:58 +02:00
Chris Browet
1609d069bb Fix Meteoalarm expired alerts (#56255) 2021-09-16 16:07:53 +02:00
Paul Owen
28b4b5407b Fix return value of preset_mode in hive climate (#56247) 2021-09-16 13:57:42 +02:00
jjlawren
0438c9308c Delay startup for cert_expiry to allow for self checks (#56266)
* Delay startup of cert_expiry

* Update tests
2021-09-16 13:31:36 +02:00
Erik Montnemery
c668dcb1ac Allow smaller step size for input number (#56211)
* Allow smaller step size for input number

* Tweak

* Tweak
2021-09-16 11:07:14 +02:00
Erik Montnemery
8c5efafdd8 Add 5-minute statistics for sensors (#56006)
* Add 5-minute statistics for sensors

* Address pylint issues

* Black

* Apply suggestion from code review

* Apply suggestions from code review

* Improve tests
2021-09-16 10:57:15 +02:00
Malachi Soord
0656407561 Upgrade pylast from 4.2.0 to 4.2.1 (#56015)
* Upgrade pylast from 4.2.0 to 4.2.1

* Fix test

* Use MockNetwork

* Tidy

* Fix lint
2021-09-16 07:00:25 +02:00
Sean Vig
69ff7a968a Bump amcrest version to 1.9.2 (#56281) 2021-09-16 06:53:40 +02:00
Daniel Hjelseth Høyer
4eb656d5d9 Fix Surepetcare string reference (#56262)
Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>
2021-09-15 22:18:35 +02:00
Aaron Bach
ecd827722b Bump pyopenuv to 2.2.1 (#56270) 2021-09-15 21:05:12 +02:00
Daniel Hjelseth Høyer
c5544550b4 Deprecate Surepetcare yaml config (#56209) 2021-09-15 10:43:39 +02:00
muppet3000
19054e1ffe Bump growattServer to 1.1.0 (#56084) 2021-09-15 10:08:15 +02:00
jjlawren
0619069ae6 Avoid a zeroconf race condition (#56240) 2021-09-14 22:07:31 -10:00
jan iversen
53d5a59257 Activate mypy for directv (#55963)
* Activate mypy for directv.

* Activate mypy for directv.
2021-09-15 07:58:04 +02:00
Shulyaka
ddfe94187e generic_hygrostat: enable tests (#56193) 2021-09-15 07:55:43 +02:00
epenet
0d842a8f01 Adjust charging_power unit (#56167) 2021-09-15 07:54:56 +02:00
Steven Looman
30c25d4448 Clean up upnp YAML config (#56200)
* Put back local_ip option to config schema + deprecate config schema

* More cleanup

* Remove log

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-09-15 06:57:02 +02:00
Paulus Schoutsen
0a426b5686 Bump aiohue to 2.6.2 (#56234) 2021-09-15 06:23:19 +02:00
J. Nick Koston
98cf34c7c3 Bump zeroconf to 0.36.3 (#56233) 2021-09-14 13:02:37 -10:00
jan iversen
692f611109 Update template/test_fan.py to use pytest (#56215) 2021-09-14 13:51:46 -07:00
Aaron Bach
bbc75b5c00 Add long-term statistics for Flu Near You sensors (#55416) 2021-09-14 22:09:45 +02:00
Aaron Bach
441e99b439 Add long-term statistics for AirVisual sensors (#55415) 2021-09-14 22:08:54 +02:00
jan iversen
96a9af8cc4 Update template/test_weather.py to use pytest (#56223) 2021-09-14 13:06:55 -07:00
Aaron Bach
2c348dd2d7 Add long-term statistics for RainMachine sensors (#55418)
* Add long-term statistics for RainMachine sensors

* Code review
2021-09-14 22:06:40 +02:00
jan iversen
4b2ff0a0ba Update template/alarm_control_panel.py to use pytest (#56229) 2021-09-14 13:06:29 -07:00
Marc Mueller
2b51896d7a Use EntityDescription - vicare (#55932)
* Use EntityDescription - vicare binary_sensor

* Use EntityDescription - vicare sensor

* Fix typing

* Remove default values

* Fix pylint
2021-09-14 22:06:06 +02:00
Aaron Bach
0364922d80 Add long-term statistics for AirNow sensors (#56230) 2021-09-14 22:04:55 +02:00
Ricardo Steijn
2a51bb5bba Add Crownstone integration (#50677) 2021-09-14 09:46:52 -10:00
Erik Montnemery
bac55b78fe Enforce device class for gas and energy sensors used by energy dashboard (#56218)
* Enforce device class for gas and energy sensors used by energy dashboard

* Adjust tests
2021-09-14 16:56:36 +02:00
jan iversen
aaa62dadec Add service to stop/restart modbus (#55599)
* Add service to stop/restart modbus.

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-09-14 09:42:50 +02:00
dependabot[bot]
31623368c8 Bump codecov/codecov-action from 2.0.3 to 2.1.0 (#56210)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 2.0.3 to 2.1.0.
- [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/v2.0.3...v2.1.0)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-14 08:50:29 +02:00
Daniel Hjelseth Høyer
dba2998e8c Clean up Surepetcare binary sensor (#56070) 2021-09-14 08:44:20 +02:00
Alexei Chetroi
fe1311ba34 Bump up zha dependencies (#56206) 2021-09-13 21:27:29 -04:00
Robert Hillis
14aa9c91eb Add Config Flow to Modem Caller ID integration (#46677)
* Add phone_modem integration

* Use original domain

* Add init tests for Modem Caller ID

* Clean up tests

* Clean up tests

* apply suggestions

* Fix tests

* Make only one instance possible

* Allow more than 1 device and remove hangup service

* simplify already configured

* Update sensor.py

* Update config_flow.py

* Fix manifest

* More cleanup

* Fix tests

* Ue target

* Clean up sensor.py

* Minor tweaks

* Close modem on restart and unload

* Update requirements

* fix tests

* Bump phone_modem

* rework

* add typing

* use async_setup_platform

* typing

* tweak

* cleanup

* fix init

* preserve original name

* remove callback line

* use list of serial devices on host

* tweak

* rework

* Rework for usb dicsovery

* Update requirements_test_all.txt

* Update config_flow.py

* tweaks

* tweak

* move api out of try statement

* suggested tweaks

* clean up

* typing

* tweak

* tweak

* async name the service
2021-09-13 14:22:54 -10:00
tube0013
9bb9f0e070 Add description to match TubesZB Coordinators for USB Discovery (#56201) 2021-09-13 11:22:55 -10:00
Brian Egge
8d87f4148b Fix generic thermostat switch state initialization (#56073) 2021-09-13 22:27:06 +02:00
Abílio Costa
c869b78ac1 Add Whirlpool integration (#48346)
* Add Whirlpool integration

* Apply suggestions from code review

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

* Apply suggestions from code review

* Fix lint

* Fix lint and tests

* Apply suggestions from code review

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

* Use dict lookups

* Lint

* Apply code changes from PR review

* Do real integration setup in tests

* Apply suggestions from review & fix test

* Replace get with array operator

* Add suggestions from code review

* Rename test var

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-13 10:02:34 -10:00
Martin Ilievski
f023ec24d7 Bump pykodi to 0.2.6 (#56148) 2021-09-13 10:00:10 -10:00
Daniel Hjelseth Høyer
f9de8fb49a Surepetcare config flow (#56127)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-13 09:57:06 -10:00
Michael
d661a76462 Use entity description and set state class to all System Monitor sensors (#56140) 2021-09-13 09:55:33 -10:00
Joakim Sørensen
20d96ef4ef Update docker base image to 2021.09.0 (#56191) 2021-09-13 21:11:10 +02:00
Erik Montnemery
17efafb2ea Do not set assumed state for binary sensor groups (#56190) 2021-09-13 10:40:24 -07:00
Bram Kragten
86d24bec75 Update icons for MDI 6 (#56170) 2021-09-13 19:29:38 +02:00
starkillerOG
5f86388f1c Netgear config flow (#54479)
* Original work from Quentame

* Small adjustments

* Add properties and method_version

* fix unknown name

* add consider_home functionality

* fix typo

* fix key

* swao setup order

* use formatted mac

* add tracked_list option

* add options flow

* add config flow

* add config flow

* clean up registries

* only remove if no other integration has that device

* tracked_list formatting

* convert tracked list

* add import

* move imports

* use new tracked list on update

* use update_device instead of remove

* add strings

* initialize already known devices

* Update router.py

* Update router.py

* Update router.py

* small fixes

* styling

* fix typing

* fix spelling

* Update router.py

* get model of router

* add router device info

* fix api

* add listeners

* update router device info

* remove method version option

* Update __init__.py

* fix styling

* ignore typing

* remove typing

* fix mypy config

* Update mypy.ini

* add options flow tests

* Update .coveragerc

* fix styling

* Update homeassistant/components/netgear/__init__.py

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

* Update homeassistant/components/netgear/__init__.py

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

* Update homeassistant/components/netgear/__init__.py

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

* Update homeassistant/components/netgear/config_flow.py

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

* Update homeassistant/components/netgear/router.py

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

* add ConfigEntryNotReady

* Update router.py

* use entry.async_on_unload

* Update homeassistant/components/netgear/device_tracker.py

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

* use cv.ensure_list_csv

* add hostname property

* Update device_tracker.py

* fix typo

* fix isort

* add myself to codeowners

* clean config flow

* further clean config flow

* deprecate old netgear discovery

* split out _async_remove_untracked_registries

* Update homeassistant/components/netgear/config_flow.py

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

* Update homeassistant/components/netgear/config_flow.py

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

* cleanup

* fix rename

* fix typo

* remove URL option

* fixes

* add sensor platform

* fixes

* fix removing multiple entities

* remove extra attributes

* initialize sensors correctly

* extra sensors disabled by default

* fix styling and unused imports

* fix tests

* Update .coveragerc

* fix requirements

* remove tracked list

* remove tracked registry editing

* fix styling

* fix discovery test

* simplify unload

* Update homeassistant/components/netgear/router.py

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

* add typing

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

* add typing

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

* add typing

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

* condense NetgearSensorEntities

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

* Update homeassistant/components/netgear/router.py

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

* Update homeassistant/components/netgear/router.py

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

* Update homeassistant/components/netgear/router.py

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

* Update homeassistant/components/netgear/router.py

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

* add typing

* styling

* add typing

* use ForwardRefrence for typing

* Update homeassistant/components/netgear/device_tracker.py

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

* add typing

* Apply suggestions from code review

Thanks!

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

* process review comments

* fix styling

* fix devicename not available on all models

* ensure DeviceName is not needed

* Update homeassistant/components/netgear/config_flow.py

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

* Update homeassistant/components/netgear/config_flow.py

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

* Update __init__.py

* fix styling

Co-authored-by: J. Nick Koston <nick@koston.org>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-09-13 18:18:21 +02:00
jjlawren
37f263e2ac Bump plexapi to 4.7.1 (#56163) 2021-09-13 15:46:54 +02:00
Brian Egge
e638e5bb42 Add component for binary sensor groups (#55365)
* Add component for binary sensor groups
https://github.com/home-assistant/home-assistant.io/pull/19239

* Accidental push over prior commit

* Add test for any case

* Add unavailable attribute and tests for unique_id

* Added tests for attributes

link to documentation: https://github.com/home-assistant/home-assistant.io/pull/19297
2021-09-13 15:28:37 +02:00
Vilppu Vuorinen
ee616ed992 Support hvac mode in melcloud climate.set_temperature service (#56082)
Setting the HVAC_MODE via the set_temperature service has not been
possible before this change.
2021-09-13 14:14:47 +02:00
epenet
5ccc3c17d9 Use list comprehension in onewire entity descriptions (#56168)
* Use list comprehension in onewire binary sensors

* Use list comprehension in onewire switches
2021-09-13 13:46:21 +02:00
Erik Montnemery
d899d15a1e Add statistics validation (#56020)
* Add statistics validation

* Remove redundant None-check

* Move validate_statistics WS API to recorder

* Apply suggestion from code review
2021-09-13 13:44:22 +02:00
Erik Montnemery
d2a9f7904a Include end time of statistics data points in API response (#56063)
* Include end time of statistics data points in API response

* Correct typing

* Update tests
2021-09-13 10:02:24 +02:00
Shay Levy
e9eb76c7db Add switch support for RPC device (#56153)
* Add switch support for RPC device

* Apply review comments

* Apply review comments
2021-09-13 09:31:35 +03:00
Maikel Punie
7472fb2049 Switch velbus from python-velbus to velbusaio (#54032)
* initial commit

* use new release

* Update for sensors

* big update

* pylint fixes, bump dependancy to 2021.8.2

* New version to try to fix the tests

* Fix a lot of errors, bump version

* more work

* Bump version

* Adde dimmer support

* Make sure the counters are useable in the energy dashboard

* bump version

* Fix testcases

* Update after review

* Bump version to be able to have some decent exception catches, add the temperature device class

* Readd the import of the platform from config file, but add a deprecation warning

* More comments updated

* Fix lefover index

* Fix unique id to be backwards compatible

* Fix small bug in covers

* Fix testcases

* Changes for theenery dashboard

* Fixed services

* Fix memo text

* Make the interface for a service the port string instead of the device selector

* Fix set_memo_text

* added an async scan task, more comments

* Accidently disabled some paltforms

* More comments, bump version

* Bump version, add extra attributes, enable mypy

* Removed new features

* More comments

* Bump version

* Update homeassistant/components/velbus/__init__.py

Co-authored-by: brefra <frank_van_breugel@hotmail.com>

* Readd the import step

Co-authored-by: brefra <frank_van_breugel@hotmail.com>
2021-09-13 08:22:46 +02:00
jan iversen
1f997fcd58 Update pymodbus fixtures to use autospec (#55686) 2021-09-12 21:16:48 -07:00
Sean Vig
a180c3f813 Fix polling on online Amcrest binary sensor (#56106) 2021-09-12 20:45:52 -07:00
Paulus Schoutsen
32212651fe Add zeroconf discovery to Hue (#55358)
* Add zeroconf discovery to Hue

* Add coverage for already exists case

Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-12 20:00:51 -07:00
joshs85
41b25a765c Changed wording of bond state belief feature from belief to tracked state (#56147)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-12 15:46:43 -10:00
jan iversen
990d474d02 use fixtures. (#56130) 2021-09-12 15:08:46 -07:00
J. Nick Koston
673519f6bf Prefer more targeted matchers in USB discovery (#56142)
- If there is a more targeted match it should win discovery
2021-09-12 15:07:40 -07:00
J. Nick Koston
0fc89780e9 Fix listener leak in HomeKit on reload (#56143)
* Fix listener leak in HomeKit on reload

* Fix mocking
2021-09-12 15:06:03 -07:00
Aaron Bach
4e8db7173a Use EntityDescription - iqvia (#55218) 2021-09-12 09:34:44 -06:00
Greg Thornton
f1556ead6d Don't cache HomeKit camera stream source from entity (#56136) 2021-09-12 08:09:09 -07:00
Marc Mueller
2b019b0911 Use EntityDescription - xiaomi_aqara (#55931)
* Use EntityDescription - xiaomi_aqara

* Remove default values

* Add missing SENSOR_TYPES
2021-09-12 12:48:02 +02:00
cdheiser
ec28f7eef2 Don't return a unique_id if Lutron doesn't have a UUID for the device. (#56113)
This is a workaround for https://github.com/thecynic/pylutron/issues/70

Co-authored-by: cdheiser <cdheiser@users.noreply.github.com>
2021-09-12 09:24:02 +02:00
Daniel Hjelseth Høyer
4a449902a5 Surepetcare, upgrade library (#56067)
Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>
2021-09-12 08:12:32 +02:00
J. Nick Koston
2b7cdb70a8 Ensure rainmachine device name is a string (#56121) 2021-09-11 21:38:34 -06:00
Greg Thornton
371aa03bca Add audio support option to HomeKit camera UI config flow (#56107) 2021-09-11 16:41:30 -10:00
J. Nick Koston
eff59e8b00 Use the same server name for all HomeKit bridges (#55860) 2021-09-11 19:00:26 -07:00
J. Nick Koston
459bc55e32 Bump HAP-python to 4.2.1 (#55804) 2021-09-11 18:58:19 -07:00
Steven Looman
73260c5b88 Move parts of ssdp to async_upnp_client (#55540)
* Move parts of ssdp to async_upnp_client

* Fix test for environments with multiple sources

* Fix sonos tests

* More fixes/changes

* More fixes

* Use async_upnp_client==0.21.0

* Pylint/test fixes

* More changes after review

* Fix tests

* Improve testing

* Fix mypy

* Fix yamaha_musiccast tests?

* Changes after review

* Pylint

* Reduce calls to combined_headers

* Update to async_upnp_client==0.21.1

* Update to async_upnp_client==0.21.2

* use as_dict

Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-11 13:38:16 -10:00
Shay Levy
f1a88f0563 Add config flow support for RPC device (#56118) 2021-09-11 23:28:33 +03:00
Paulus Schoutsen
ddb0a6092f Merge pull request #56116 from home-assistant/rc 2021-09-11 13:02:14 -07:00
Jaroslav Hanslík
a4a6bf8a85 New icon names based on MDI 6.1.95 (#56085) 2021-09-11 12:34:31 -07:00
Joakim Sørensen
bcb3c426f4 Blank out discovery info (#56097) 2021-09-11 12:34:19 -07:00
Paulus Schoutsen
64fd496932 Bump frontend to 20210911.0 (#56115) 2021-09-11 12:34:01 -07:00
Paulus Schoutsen
292c05ab9f Bumped version to 2021.9.6 2021-09-11 12:02:44 -07:00
ehendrix23
a900c02c10 Bump pymyq to 3.1.4 (#56089) 2021-09-11 12:02:39 -07:00
Paulus Schoutsen
0cfbff3ff9 Fix singleton not working with falsey values (#56072) 2021-09-11 12:02:38 -07:00
Sean Vig
ee892beceb Bump amcrest version to 1.8.1 (#56058)
The current version of the `amcrest` package has a bug in exposing if
the video stream is enabled, which leads to the substream status being
used to set if the camera is on or off.  The updated version of
`amcrest` fixes this bug.

Fixes #55661
2021-09-11 12:02:37 -07:00
micha91
fe713b943f Fix UDP message handling by upgrading aiomusiccast to 0.9.2 (#56041) 2021-09-11 12:02:36 -07:00
Erik Montnemery
2079956350 Suppress last_reset deprecation warning for energy cost sensor (#56037) 2021-09-11 12:02:36 -07:00
Erik Montnemery
c424f99aab Correct confusing log message in sensor statistics (#56016) 2021-09-11 12:02:35 -07:00
Paulus Schoutsen
8a611eb640 Fix singleton not working with falsey values (#56072) 2021-09-11 12:02:01 -07:00
Oxan van Leeuwen
6e7ce89c64 Fix attribute access on None on startup in ESPHome (#56105) 2021-09-11 20:53:29 +02:00
jan iversen
cb8c0cb123 Update template/test_lock.py to use pytest (#56102) 2021-09-11 11:48:25 -07:00
Ruslan Sayfutdinov
a9ed4fa405 Bump awesomeversion to 21.8.1 (#55817) 2021-09-11 11:40:46 -07:00
Aaron Bach
ed9b271fd0 Enforce strict typing for IQVIA (#53408)
* Enforce strict typing for IQVIA

* Cleanup

* Code review

* Ignore untyped numpy function
2021-09-11 12:27:13 -06:00
Joakim Sørensen
1b46190a0c Add view to get installation type during onboarding (#56095) 2021-09-11 15:38:38 +02:00
Vilppu Vuorinen
ec21c5f4a9 Update pymelcloud to 2.5.4 (#56096) 2021-09-11 12:51:04 +02:00
Brent Petit
97f28878bb Add state_class to Ecobee sensors (#55996) 2021-09-10 22:00:24 -07:00
Michael
b11db0b1d7 Remove unnecessary extra attribute from NUT sensors (#56078) 2021-09-10 19:17:46 -07:00
ehendrix23
bd18bc9f3a Bump pymyq to 3.1.4 (#56089) 2021-09-10 19:09:54 -07:00
Raman Gupta
c785983cce Handle entity creation on new added zwave_js value (#55987)
* Handle new entity creation when a new value is added

* spacing

* Update homeassistant/components/zwave_js/__init__.py

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

* change variable name and use asyncio.gather

* Centralized where discovered value IDs gets managed

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-09-10 23:49:31 +02:00
Shay Levy
8c3c2ad8e3 Updated changes for aioshelly 1.0.0 (#56083) 2021-09-11 00:48:55 +03:00
jan iversen
ac1251c52b Update template/test_trigger.py to use pytest (#55950) 2021-09-10 09:55:51 -07:00
Paulus Schoutsen
dec7877671 Handle logout prefs update for Google/Alexa (#56045) 2021-09-10 09:08:43 -07:00
Erik Montnemery
443147e132 Wait for entities when updating energy preferences (#56057) 2021-09-10 09:07:52 -07:00
Joakim Sørensen
c59540cfc7 Revert "Bump pillow to 8.3.2 (#55970)" (#56048)
This reverts commit ee7202d10a.
2021-09-10 17:01:51 +02:00
Daniel Hjelseth Høyer
aa39e582c3 Surepetcare, fix late review (#56065)
Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>
2021-09-10 16:49:42 +02:00
Sean Vig
03df48af9c Bump amcrest version to 1.8.1 (#56058)
The current version of the `amcrest` package has a bug in exposing if
the video stream is enabled, which leads to the substream status being
used to set if the camera is on or off.  The updated version of
`amcrest` fixes this bug.

Fixes #55661
2021-09-10 15:38:01 +02:00
micha91
948a942a0d Fix UDP message handling by upgrading aiomusiccast to 0.9.2 (#56041) 2021-09-10 15:03:34 +02:00
Erik Montnemery
d5a8f1af1d Revert "Suppress last_reset deprecation warning for energy cost sensor (#56037)" (#56042)
This reverts commit e990ef249d.
2021-09-10 11:27:47 +02:00
J. Nick Koston
ff1b39cda6 Fix circular import of scapy in dhcp (#56040)
* Fix circular import of scapy in dhcp

* Tweak import, add comment

* Tweak import, add comment

* pylint
2021-09-10 10:04:54 +02:00
Oxan van Leeuwen
970a7f9662 Fix compounds in sensor device class comments (#55900) 2021-09-10 09:46:21 +02:00
Erik Montnemery
78909b5227 Add support for state class total to energy cost sensor (#55955)
* Add support for all state classes to energy cost sensor

* Fix bug, adjust tests

* Fix rebase mistake
2021-09-10 09:05:32 +02:00
Erik Montnemery
e990ef249d Suppress last_reset deprecation warning for energy cost sensor (#56037) 2021-09-10 08:59:23 +02:00
Daniel Hjelseth Høyer
c27ad3078a Surepetcare, use DataUpdateCoordinator (#55982)
* Surepetcare, use dataupdater

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* Review comment

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>

* Apply suggestions from code review

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

* style

Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-10 08:37:00 +02:00
Erik Montnemery
89281a273c Correct confusing log message in sensor statistics (#56016) 2021-09-09 23:26:29 -07:00
wranglatang
e3a7a253ea Add nut Watts datapoint (#55491)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-10 06:02:06 +02:00
J. Nick Koston
5709640453 Report integrations that block startup wrap up (#56003) 2021-09-09 20:39:22 -07:00
Erik Montnemery
2a8121bdcd Really change character set of statistics_meta table to utf8 (#56029) 2021-09-09 22:55:51 +02:00
Raman Gupta
1fd3faf766 Fix state class for zwave_js energy entities (#56026) 2021-09-09 16:19:28 -04:00
Erik Montnemery
3af4b2639b Exclude @overload from coverage (#56021) 2021-09-09 21:24:23 +02:00
popoviciri
f79de2a5bc Bump pysma to 0.6.6 & Fix Unit Checks (#56018) 2021-09-09 20:19:49 +02:00
Raman Gupta
113288cb1f Fix zwave_js/node_state WS API command (#55979)
* Fix zwave_js/node_state WS API command

* Add negative assertion check to avoid regression

* Update tests/components/zwave_js/test_api.py

Co-authored-by: jan iversen <jancasacondor@gmail.com>

* use constant

Co-authored-by: jan iversen <jancasacondor@gmail.com>
2021-09-09 14:04:27 -04:00
Erik Montnemery
88dbc6373f Make sure character set of events, states tables is utf8 (#56012)
* Make sure character set of events, states tables is utf8

* Pylint

* Apply suggestions from code review
2021-09-09 19:26:28 +02:00
Oscar Calvo
1b0e014783 Support incoming SMS messages via polling (#54237)
* Add support to incomming SMS via polling

* Update dependencies

* Only send notification for unread messages

* Only inform if callback is not getting used

* Update gateway.py

* Apply PR feedback

* Update homeassistant/components/sms/gateway.py

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

* Apply PR comments

* Make black happy

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-09-09 18:29:11 +02:00
Erik Montnemery
a47532c69b Change character set of statistics_meta table to utf8 (#56011) 2021-09-09 17:24:20 +02:00
uvjustin
dd9bfe7aa0 Add package constraint anyio>=3.3.1 (#55997) 2021-09-09 15:33:09 +02:00
Jean-Yves Avenard
556dcf6abb Add iotawatt high-accuracy energy readout sensors (#55512) 2021-09-09 15:32:43 +02:00
joshs85
011817b122 Add state belief services to bond integration (#54735)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-09 15:32:32 +02:00
Adam Feldman
cbbbc3c4f0 Add state class to Smart Meter Texas sensor (#55665) 2021-09-09 15:32:03 +02:00
jan iversen
9d2861afe3 Add mypy to elkm1. (#55964) 2021-09-09 13:14:28 +02:00
cnico
065e858a03 Address post merge review of flipr binary sensor (#55983) 2021-09-09 09:45:58 +02:00
Erik Montnemery
80fd330479 Add sum_decrease and sum_increase statistics (#55850) 2021-09-08 23:35:53 -07:00
Joakim Plate
a8cbb949fa Rfxtrx drop yaml configuration (#54173) 2021-09-08 22:17:02 -07:00
Alan Tse
98ecf2888c Remove tesla integration (#55988)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-09-08 22:12:03 -07:00
GitHub Action
675426dc25 [ci skip] Translation update 2021-09-09 00:11:32 +00:00
Erik Montnemery
a1aca20818 Address review comment from #55833 (#55985) 2021-09-08 13:48:31 -07:00
Paulus Schoutsen
5cc54618c5 Merge pull request #55969 from home-assistant/rc 2021-09-08 13:42:09 -07:00
Philip Allgaier
4d2432cffb Consistent lower-case spelling of "optional" (#55976) 2021-09-08 22:16:12 +02:00
Erik Montnemery
8f344252c4 Add significant change support to AQI type sensors (#55833) 2021-09-08 12:47:59 -07:00
Erik Montnemery
232943c93d Add significant change support to AQI type sensors (#55833) 2021-09-08 12:47:48 -07:00
Erik Montnemery
cbe4b2dc1d Add support for state class measurement to energy cost sensor (#55962) 2021-09-08 12:46:43 -07:00
Erik Montnemery
bb6c2093a2 Add support for state class measurement to energy cost sensor (#55962) 2021-09-08 12:46:28 -07:00
Paulus Schoutsen
a17d2d7c71 Fix gas validation (#55886) 2021-09-08 12:45:41 -07:00
Paulus Schoutsen
ee7202d10a Bump pillow to 8.3.2 (#55970) 2021-09-08 12:06:30 -07:00
Ruslan Sayfutdinov
e3815c6c2e Pin setuptools<58 2021-09-08 12:04:32 -07:00
Paulus Schoutsen
5cba7932f3 Bumped version to 2021.9.5 2021-09-08 08:22:38 -07:00
Erik Montnemery
413430bdba Fix handling of imperial units in long term statistics (#55959) 2021-09-08 08:22:34 -07:00
Erik Montnemery
81462d8655 Do not allow inf or nan sensor states in statistics (#55943) 2021-09-08 08:22:33 -07:00
Erik Montnemery
8ee4b49aa9 Do not let one bad statistic spoil the bunch (#55942) 2021-09-08 08:22:32 -07:00
Shay Levy
19d7cb4439 Bump aioswitcher to 2.0.5 (#55934) 2021-09-08 08:22:31 -07:00
Raman Gupta
21ebf4f3e6 Allow multiple template.select platform entries (#55908) 2021-09-08 08:22:31 -07:00
Maciej Bieniek
980fcef36f Fix available property for Xiaomi Miio fan platform (#55889)
* Fix available

* Suggested change
2021-09-08 08:22:30 -07:00
Diogo Gomes
e7fd24eade Integration Sensor Initial State (#55875)
* initial state is UNAVAILABLE

* update tests
2021-09-08 08:22:08 -07:00
Pascal Winters
9ecb75dc70 Edit unit of measurement for gas/electricity supplier prices (#55771)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-09-08 08:20:49 -07:00
RDFurman
7f3adce675 Try to avoid rate limiting in honeywell (#55304)
* Limit parallel update and sleep loop

* Use asyncio sleep instead

* Extract sleep to const for testing

* Make loop sleep 0 in test
2021-09-08 08:20:48 -07:00
Erik Montnemery
27764e9985 Fix handling of imperial units in long term statistics (#55959) 2021-09-08 08:08:48 -07:00
Erik Montnemery
9f1e503784 Do not allow inf or nan sensor states in statistics (#55943) 2021-09-08 08:05:16 -07:00
Erik Montnemery
22e6ddf8df Do not let one bad statistic spoil the bunch (#55942) 2021-09-08 07:55:40 -07:00
Shay Levy
c514f72c70 Bump aioswitcher to 2.0.5 (#55934) 2021-09-08 07:54:44 -07:00
Diogo Gomes
84140a547b deprecated unit_of_measurement (#55876) 2021-09-08 16:33:53 +02:00
Marc Mueller
0b23ce658e Use EntityDescription - konnected (#55923) 2021-09-08 15:14:03 +02:00
Marc Mueller
32b8be5a6e Use EntityDescription - repetier (#55926) 2021-09-08 14:28:04 +02:00
Marc Mueller
69d6d5ffce Use EntityDescription - incomfort (#55930) 2021-09-08 08:51:17 +02:00
Marc Mueller
5429a67877 Use EntityDescription - zoneminder (#55922) 2021-09-08 08:48:55 +02:00
Ruslan Sayfutdinov
7195b8222b Bump PyJWT to 2.1.0 (#55911) 2021-09-07 20:59:02 -07:00
Pascal Winters
a764c79b6f Edit unit of measurement for gas/electricity supplier prices (#55771)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-09-07 20:54:40 -07:00
Paulus Schoutsen
ec337101dd Fix gas validation (#55886) 2021-09-07 20:53:43 -07:00
Fuzzy
efafe82799 Remove Trackr integration (API removed) (#55917)
* Delete Trackr component directory

* Update .coverage.rc to remove Trackr

* Update requirements_all.txt
2021-09-08 05:01:58 +02:00
GitHub Action
f9e6e616f4 [ci skip] Translation update 2021-09-08 00:10:52 +00:00
Paulus Schoutsen
f0649855f9 Merge pull request #55870 from home-assistant/rc 2021-09-06 16:05:08 -07:00
Paulus Schoutsen
823c3735ce Bumped version to 2021.9.4 2021-09-06 13:41:39 -07:00
Diogo Gomes
68131a5c00 Integration Sensor unit of measurement overwrite (#55869) 2021-09-06 13:41:33 -07:00
J. Nick Koston
be0f767c34 Fix exception during rediscovery of ignored zha config entries (#55859)
Fixes #55709
2021-09-06 13:41:33 -07:00
Maciej Bieniek
450652a501 Fix target humidity step for Xiaomi MJJSQ humidifiers (#55858) 2021-09-06 13:41:32 -07:00
Daniel Hjelseth Høyer
8523f569c0 Surepetcare, bug fix (#55842) 2021-09-06 13:41:31 -07:00
mrwhite31
5f289434d3 Fix typo in in rfxtrx Barometer sensor (#55839)
Fix typo in sensor.py to fix barometer unavailability
2021-09-06 13:41:31 -07:00
Maciej Bieniek
3df6dfecab Fix a lazy preset mode update for Xiaomi Miio fans (#55837) 2021-09-06 13:41:30 -07:00
Martin Hjelmare
d6eda65302 Bump zwave-js-server-python to 0.30.0 (#55831) 2021-09-06 13:41:29 -07:00
Brandon Rothweiler
7a5bc2784a Upgrade pymazda to 0.2.1 (#55820) 2021-09-06 13:41:28 -07:00
David Bonnes
00878467cc Fix incomfort min/max temperatures (#55806) 2021-09-06 13:41:28 -07:00
Maciej Bieniek
899d8164b0 Fix xiaomi miio Air Quality Monitor initialization (#55773) 2021-09-06 13:41:27 -07:00
jan iversen
823fd60991 Allow same address different register types in modbus (#55767) 2021-09-06 13:41:26 -07:00
jan iversen
a6bb0eadca Allow same IP if ports are different on modbus (#55766) 2021-09-06 13:41:25 -07:00
Tatham Oddie
eb70354ee7 Fix logbook entity_matches_only query mode (#55761)
The string matching template needs to match the same compact JSON format
as the data is now written in.
2021-09-06 13:41:25 -07:00
Joshi
bd53185bed Fix switch name attribute for thinkingcleaner (#55730) 2021-09-06 13:41:24 -07:00
Paulus Schoutsen
df9a899bbd Merge pull request #55753 from home-assistant/rc 2021-09-04 14:51:15 -07:00
Paulus Schoutsen
37cf295e20 Bumped version to 2021.9.3 2021-09-04 14:13:37 -07:00
Simone Chemelli
04816fe26d Fix SamsungTV sendkey when not connected (#55723) 2021-09-04 14:13:34 -07:00
Anders Melchiorsen
eb48e75fc5 Fix LIFX firmware version information (#55713) 2021-09-04 14:13:33 -07:00
Simone Chemelli
9d5431fba1 Handle Fritz InternalError (#55711) 2021-09-04 14:13:32 -07:00
Erik Montnemery
a4f2c5583d Handle negative numbers in sensor long term statistics (#55708)
* Handle negative numbers in sensor long term statistics

* Use negative states in tests
2021-09-04 14:13:32 -07:00
Paulus Schoutsen
a37c3af2b4 better detect legacy eagly devices (#55706) 2021-09-04 14:13:31 -07:00
Paulus Schoutsen
33047d7260 Merge pull request #55673 from home-assistant/rc 2021-09-03 10:53:16 -07:00
Paulus Schoutsen
e3405d226a Bumped version to 2021.9.2 2021-09-03 10:16:36 -07:00
Paulus Schoutsen
3008ff03b2 Guard for doRollover failing (#55669) 2021-09-03 10:16:31 -07:00
Joakim Sørensen
8592d94a3c Fix hdmi_cec switches (#55666) 2021-09-03 10:16:30 -07:00
Nikolay Vasilchuk
b36e86d95c Fix Starline sensor state AttributeError (#55654)
* Fix starline sensors state

* Black
2021-09-03 10:16:29 -07:00
Paulus Schoutsen
f61a1ecae7 Guard for unexpected exceptions in device automation (#55639)
* Guard for unexpected exceptions in device automation

* merge

Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-03 10:16:28 -07:00
Paulus Schoutsen
80c074ca82 Better handle invalid trigger config (#55637) 2021-09-03 10:16:28 -07:00
Paulus Schoutsen
ff91ff4cd2 Fix template sensor availability (#55635) 2021-09-03 10:16:27 -07:00
J. Nick Koston
93c2a7dd70 Narrow zwave_js USB discovery (#55613)
- Avoid triggering discovery when we can know in advance the
  device is not a Z-Wave stick
2021-09-03 10:16:26 -07:00
Michael
da3ee9ed4b Fix CONFIG_SCHEMA validation in Speedtest.net (#55612) 2021-09-03 10:16:25 -07:00
Pascal Vizeli
2ef607651d Disable observer for USB on containers (#55570)
* Disable observer for USB on containers

* remove operating system test

Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-03 10:16:24 -07:00
J. Nick Koston
88ca83a30b Ignore missing devices when in ssdp unsee (#55553) 2021-09-03 10:16:24 -07:00
Paulus Schoutsen
f883fa9eef Merge pull request #55608 from home-assistant/rc 2021-09-02 13:35:47 -07:00
Paulus Schoutsen
5b705dba36 Bumped version to 2021.9.1 2021-09-02 12:50:56 -07:00
Pascal Vizeli
1592408a4b Downgrade sqlite-libs on docker image (#55591) 2021-09-02 12:50:48 -07:00
jan iversen
89b7be52af Correct duplicate address. (#55578) 2021-09-02 12:50:47 -07:00
Alexei Chetroi
8f85472df3 Pick right coordinator (#55555) 2021-09-02 12:50:45 -07:00
Teemu R
6aa771e5e8 xiaomi_miio: bump python-miio dependency (#55549) 2021-09-02 12:50:44 -07:00
Joakim Sørensen
7193e82963 Bump pyuptimerobot to 21.9.0 (#55546) 2021-09-02 12:50:43 -07:00
Paulus Schoutsen
245eec7041 Merge pull request #55532 from home-assistant/rc 2021-09-01 11:28:21 -07:00
Bram Kragten
493309daa7 Bumped version to 2021.9.0 2021-09-01 19:40:48 +02:00
Paulus Schoutsen
af68802c17 Tweaks for the iotawatt integration (#55510) 2021-09-01 19:37:43 +02:00
Brian Egge
576cece7a9 Fix None support_color_modes TypeError (#55497)
* Fix None support_color_modes TypeError 

https://github.com/home-assistant/core/issues/55451

* Update __init__.py
2021-09-01 19:37:43 +02:00
Otto Winter
3b9859940f ESPHome light color mode use capabilities (#55206)
Co-authored-by: Oxan van Leeuwen <oxan@oxanvanleeuwen.nl>
2021-09-01 19:37:41 +02:00
Paulus Schoutsen
a315fd059a Bumped version to 2021.9.0b7 2021-08-31 22:57:33 -07:00
Brett Adams
ba9ef004c8 Add missing device class for temperature sensor in Advantage Air (#55508) 2021-08-31 22:57:13 -07:00
Felipe Martins Diel
22f745b17c Fix BroadlinkSwitch._attr_assumed_state (#55505) 2021-08-31 22:57:12 -07:00
muppet3000
05cf223146 Added trailing slash to US growatt URL (#55504) 2021-08-31 22:57:12 -07:00
Erik Montnemery
d4aadd8af0 Improve log for sum statistics (#55502) 2021-08-31 22:56:28 -07:00
Erik Montnemery
4045eee2e5 Correct sum statistics when only last_reset has changed (#55498)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-08-31 22:53:58 -07:00
Joakim Sørensen
83a51f7f30 Add cache-control headers to supervisor entrypoint (#55493) 2021-08-31 22:52:05 -07:00
gjong
29110fe157 Remove Youless native unit of measurement (#55492) 2021-08-31 22:52:05 -07:00
gjong
e87b7e24b4 Increase YouLess polling interval (#55490) 2021-08-31 22:52:04 -07:00
uvjustin
d9056c01a6 Fix ArestSwitchBase missing is on attribute (#55483) 2021-08-31 22:52:03 -07:00
Matthew Garrett
a724bc21b6 Assistant sensors (#55480) 2021-08-31 22:52:03 -07:00
Paulus Schoutsen
ef00178339 Add Eagle 200 name back (#55477)
* Add Eagle 200 name back

* add comment

* update tests
2021-08-31 22:52:02 -07:00
Erik Montnemery
b8770c3958 Make new cycles for sensor sum statistics start with 0 as zero-point (#55473) 2021-08-31 22:52:01 -07:00
Eric Severance
f0c0cfcac0 Wemo Insight devices need polling when off (#55348) 2021-08-31 22:52:00 -07:00
Bram Kragten
4c48ad9108 Bumped version to Bumped version to 2021.9.0b6 2021-08-30 23:35:50 +02:00
Bram Kragten
92b0453749 Update frontend to 20210830.0 (#55472) 2021-08-30 23:33:47 +02:00
Raman Gupta
8ab801a7b4 Fix area_id and area_name template functions (#55470) 2021-08-30 23:33:46 +02:00
Aaron Bach
f92c7b1aea Bump aioambient to 1.3.0 (#55468) 2021-08-30 23:33:45 +02:00
Aaron Bach
0d9fbf864f Bump pyiqvia to 1.1.0 (#55466) 2021-08-30 23:33:44 +02:00
Aaron Bach
275f9c8a28 Bump pyopenuv to 2.2.0 (#55464) 2021-08-30 23:33:43 +02:00
Erik Montnemery
84f3b1514f Fix race in MQTT sensor when last_reset_topic is configured (#55463) 2021-08-30 23:33:43 +02:00
Greg
802f5613c4 Add IoTaWatt integration (#55364)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-08-30 23:33:42 +02:00
Paulus Schoutsen
8be40cbb00 Bumped version to 2021.9.0b5 2021-08-30 09:41:51 -07:00
Raman Gupta
46ce4e92f6 Bump zwave-js-server-python to 0.29.1 (#55460) 2021-08-30 09:41:42 -07:00
J. Nick Koston
39f11bb46d Bump zeroconf to 0.36.2 (#55459)
- Now sends NSEC records when requesting non-existent address types
  Implements RFC6762 sec 6.2 (http://datatracker.ietf.org/doc/html/rfc6762#section-6.2)

- This solves a case where a HomeKit bridge can take a while to update
  because it is waiting to see if an AAAA (IPv6) address is available
2021-08-30 09:41:42 -07:00
Erik Montnemery
3b0fe9adde Revert "Deprecate last_reset options in MQTT sensor" (#55457)
This reverts commit f9fa5fa804.
2021-08-30 09:41:41 -07:00
Simone Chemelli
707778229b Fix noise/attenuation units to UI display for Fritz (#55447) 2021-08-30 09:41:40 -07:00
Erik Montnemery
a474534c08 Fix exception when shutting down DSMR (#55441)
* Fix exception when shutting down DSMR

* Update homeassistant/components/dsmr/sensor.py

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

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-08-30 09:41:39 -07:00
Erik Montnemery
65ad99d51c Fix crash in buienradar sensor due to self.hass not set (#55438) 2021-08-30 09:41:39 -07:00
Erik Montnemery
4052a0db89 Improve statistics error messages when sensor's unit is changing (#55436)
* Improve error messages when sensor's unit is changing

* Improve test coverage
2021-08-30 09:41:38 -07:00
Raman Gupta
b546fc5067 Don't set zwave_js sensor device class to energy when unit is wrong (#55434) 2021-08-30 09:41:37 -07:00
Christopher Kochan
5dcc760755 Add Sense energy sensors (#54833)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-08-30 09:41:36 -07:00
Paulus Schoutsen
fb06acf39d Bumped version to 2021.9.0b4 2021-08-29 20:45:45 -07:00
Raman Gupta
948f191f16 Make zwave_js discovery log message more descriptive (#55432) 2021-08-29 20:45:33 -07:00
Klaas Schoute
2c0d9105ac Update entity names for P1 Monitor integration (#55430) 2021-08-29 20:45:32 -07:00
J. Nick Koston
10df9f3542 Bump zeroconf to 0.36.1 (#55425)
- Fixes duplicate records in the cache

- Changelog: https://github.com/jstasiak/python-zeroconf/compare/0.36.0...0.36.1
2021-08-29 20:45:32 -07:00
Aaron Bach
6cf799459b Ensure ReCollect Waste shows pickups for midnight on the actual day (#55424) 2021-08-29 20:44:57 -07:00
Marc Mueller
47e2d1caa5 Fix device_class - qnap drive_temp sensor (#55409) 2021-08-29 20:41:25 -07:00
J. Nick Koston
69d8f94e3b Show device_id in HomeKit when the device registry entry is missing a name (#55391)
- Reported at: https://community.home-assistant.io/t/homekit-unknown-error-occurred/333385
2021-08-29 20:41:24 -07:00
Aaron Bach
4b7803ed03 Bump simplisafe-python to 11.0.6 (#55385) 2021-08-29 20:41:24 -07:00
J. Nick Koston
ff6015ff89 Implement import of consider_home in nmap_tracker to avoid breaking change (#55379) 2021-08-29 20:41:23 -07:00
Matt Krasowski
fbd144de46 Handle incorrect values reported by some Shelly devices (#55042) 2021-08-29 20:41:22 -07:00
Paulus Schoutsen
adaebdeea8 Bumped version to 2021.9.0b3 2021-08-28 08:59:25 -07:00
Maciej Bieniek
910cb5865a Address late review for Tractive integration (#55371) 2021-08-28 08:58:38 -07:00
Joakim Sørensen
baf0d9b2d9 Pin regex to 2021.8.28 (#55368) 2021-08-28 08:58:37 -07:00
Jason Hunter
c1bce68549 close connection on connection retry, bump onvif lib (#55363) 2021-08-28 08:58:36 -07:00
Nathan Spencer
bde4c0e46f Bump pylitterbot to 2021.8.1 (#55360) 2021-08-28 08:58:35 -07:00
Paulus Schoutsen
a275e7aa67 Fix wolflink super call (#55359) 2021-08-28 08:58:35 -07:00
Aaron Bach
d96e416d26 Ensure ReCollect Waste starts up even if no future pickup is found (#55349) 2021-08-28 08:58:34 -07:00
Paulus Schoutsen
efc3894303 Convert solarlog to coordinator (#55345) 2021-08-28 08:58:33 -07:00
Daniel Hjelseth Høyer
06b47ee2f5 Tractive name (#55342) 2021-08-28 08:58:33 -07:00
Raman Gupta
08ca43221f Listen to node events in the zwave_js node status sensor (#55341) 2021-08-28 08:58:32 -07:00
J. Nick Koston
8641740ed8 Ensure yeelights resync state if they are busy on first connect (#55333) 2021-08-28 08:58:31 -07:00
Paulus Schoutsen
d0ada6c6e2 Bumped version to 2021.9.0b2 2021-08-27 10:00:20 -07:00
Anders Melchiorsen
76bb036968 Upgrade aiolifx to 0.6.10 (#55344) 2021-08-27 10:00:00 -07:00
J. Nick Koston
d8b64be41c Retrigger config flow when the ssdp location changes for a UDN (#55343)
Fixes #55229
2021-08-27 09:59:59 -07:00
jan iversen
b3e0b7b86e Add modbus name to log_error (#55336) 2021-08-27 09:59:59 -07:00
Chris Talkington
e097e4c1c2 Fix reauth for sonarr (#55329)
* fix reauth for sonarr

* Update config_flow.py

* Update config_flow.py

* Update config_flow.py

* Update test_config_flow.py

* Update config_flow.py

* Update test_config_flow.py

* Update config_flow.py
2021-08-27 09:59:58 -07:00
Robert Hillis
34f0fecef8 Fix sonos alarm schema (#55318) 2021-08-27 09:59:57 -07:00
Erik Montnemery
f53a10d39a Handle statistics for sensor with changing state class (#55316) 2021-08-27 09:59:56 -07:00
J. Nick Koston
5b993129d6 Fix lifx model to be a string (#55309)
Fixes #55307
2021-08-27 09:59:56 -07:00
J. Nick Koston
865656d436 Always send powerview move command in case shade is out of sync (#55308) 2021-08-27 09:59:55 -07:00
Aaron Bach
fb25c6c115 Bump simplisafe-python to 11.0.5 (#55306) 2021-08-27 09:59:54 -07:00
Aaron Bach
c963cf8743 Bump aiorecollect to 1.0.8 (#55300) 2021-08-27 09:59:54 -07:00
rikroe
ddb28db21a Bump bimmer_connected to 0.7.20 (#55299) 2021-08-27 09:59:53 -07:00
J. Nick Koston
bfc98b444f Fix creation of new nmap tracker entities (#55297) 2021-08-27 09:59:52 -07:00
realPy
f9a0f44137 Correct flash light livarno when use hue (#55294)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-08-27 09:59:51 -07:00
J. Nick Koston
93750d71ce Gracefully handle pyudev failing to filter on WSL (#55286)
* Gracefully handle pyudev failing to filter on WSL

* add debug message

* add mocks so we reach the new check
2021-08-27 09:59:51 -07:00
Paulus Schoutsen
06e4003640 Bump ring to 0.7.1 (#55282) 2021-08-27 09:59:50 -07:00
J. Nick Koston
97ff5e2085 Set yeelight capabilities from external discovery (#55280) 2021-08-27 09:59:49 -07:00
J. Nick Koston
8a2c07ce19 Ensure yeelight model is set in the config entry (#55281)
* Ensure yeelight model is set in the config entry

- If the model was not set in the config entry the light could
  be sent commands it could not handle

* update tests

* fix test
2021-08-27 09:59:21 -07:00
J. Nick Koston
9f7398e0df Fix yeelight brightness when nightlight switch is disabled (#55278) 2021-08-27 09:57:07 -07:00
J. Nick Koston
7df84dadad Fix some yeelights showing wrong state after on/off (#55279) 2021-08-27 09:56:22 -07:00
Chris
2a1e943b18 Fix unique_id conflict in smarttthings (#55235) 2021-08-27 09:54:26 -07:00
prwood80
e6e72bfa82 Improve performance of ring camera still images (#53803)
Co-authored-by: Pat Wood <prwood80@users.noreply.github.com>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-08-27 09:54:25 -07:00
Paulus Schoutsen
219868b308 Bumped version to 2021.9.0b1 2021-08-26 09:37:25 -07:00
Maciej Bieniek
67dd861d8c Fix AttributeError for non-MIOT Xiaomi Miio purifiers (#55271) 2021-08-26 09:37:20 -07:00
Florian Gareis
f2765ba320 Don't create DSL sensor for devices that don't support DSL (#55269) 2021-08-26 09:37:19 -07:00
Erik Montnemery
aefd3df914 Warn if a sensor with state_class_total has a decreasing value twice (#55251) 2021-08-26 09:37:18 -07:00
Franck Nijhof
3658eeb8d1 Fix MQTT add-on discovery to be ignorable (#55250) 2021-08-26 09:37:07 -07:00
Erik Montnemery
080cb6b6e9 Fix double precision float for postgresql (#55249) 2021-08-26 09:37:06 -07:00
Joakim Sørensen
20796303da Only postfix image name for container (#55248) 2021-08-26 09:37:06 -07:00
J. Nick Koston
dff6151ff4 Abort zha usb discovery if deconz is setup (#55245)
* Abort zha usb discovery if deconz is setup

* Update tests/components/zha/test_config_flow.py

* add deconz domain const

* Update homeassistant/components/zha/config_flow.py

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

Co-authored-by: Robert Svensson <Kane610@users.noreply.github.com>
2021-08-26 09:37:05 -07:00
Alexei Chetroi
6f24f4e302 Bump up ZHA dependencies (#55242)
* Bump up ZHA dependencies

* Bump up zha-device-handlers
2021-08-26 09:37:04 -07:00
J. Nick Koston
175febe635 Defer zha auto configure probe until after clicking configure (#55239) 2021-08-26 09:37:03 -07:00
J. Nick Koston
aa907f4d10 Only warn once per entity when the async_camera_image signature needs to be updated (#55238) 2021-08-26 09:37:02 -07:00
J. Nick Koston
3d09478aea Limit USB discovery to specific manufacturer/description/serial_number matches (#55236)
* Limit USB discovery to specific manufacturer/description/serial_number matches

* test for None case
2021-08-26 09:37:01 -07:00
Marc Mueller
05df9b4b8b Remove temperature conversion - tado (#55231) 2021-08-26 09:37:01 -07:00
jjlawren
1865a28083 Set up polling task with subscriptions in Sonos (#54355) 2021-08-26 09:37:00 -07:00
Franck Nijhof
f78d57515a Bumped version to 2021.9.0b0 2021-08-25 22:11:21 +02:00
1937 changed files with 59355 additions and 25812 deletions

View File

@@ -36,6 +36,8 @@ omit =
homeassistant/components/agent_dvr/helpers.py
homeassistant/components/airnow/__init__.py
homeassistant/components/airnow/sensor.py
homeassistant/components/airthings/__init__.py
homeassistant/components/airthings/sensor.py
homeassistant/components/airtouch4/__init__.py
homeassistant/components/airtouch4/climate.py
homeassistant/components/airtouch4/const.py
@@ -49,6 +51,7 @@ omit =
homeassistant/components/alarmdecoder/sensor.py
homeassistant/components/alpha_vantage/sensor.py
homeassistant/components/amazon_polly/*
homeassistant/components/amberelectric/__init__.py
homeassistant/components/ambiclimate/climate.py
homeassistant/components/ambient_station/*
homeassistant/components/amcrest/*
@@ -171,6 +174,13 @@ omit =
homeassistant/components/coolmaster/const.py
homeassistant/components/cppm_tracker/device_tracker.py
homeassistant/components/cpuspeed/sensor.py
homeassistant/components/crownstone/__init__.py
homeassistant/components/crownstone/const.py
homeassistant/components/crownstone/listeners.py
homeassistant/components/crownstone/helpers.py
homeassistant/components/crownstone/devices.py
homeassistant/components/crownstone/entry_manager.py
homeassistant/components/crownstone/light.py
homeassistant/components/cups/sensor.py
homeassistant/components/currencylayer/sensor.py
homeassistant/components/daikin/*
@@ -203,7 +213,6 @@ omit =
homeassistant/components/dlib_face_detect/image_processing.py
homeassistant/components/dlib_face_identify/image_processing.py
homeassistant/components/dlink/switch.py
homeassistant/components/dlna_dmr/media_player.py
homeassistant/components/dnsip/sensor.py
homeassistant/components/dominos/*
homeassistant/components/doods/*
@@ -368,7 +377,6 @@ omit =
homeassistant/components/garages_amsterdam/sensor.py
homeassistant/components/gc100/*
homeassistant/components/geniushub/*
homeassistant/components/generic_hygrostat/*
homeassistant/components/github/sensor.py
homeassistant/components/gitlab_ci/sensor.py
homeassistant/components/gitter/sensor.py
@@ -687,7 +695,6 @@ omit =
homeassistant/components/nad/media_player.py
homeassistant/components/nanoleaf/__init__.py
homeassistant/components/nanoleaf/light.py
homeassistant/components/nanoleaf/util.py
homeassistant/components/neato/__init__.py
homeassistant/components/neato/api.py
homeassistant/components/neato/camera.py
@@ -699,7 +706,10 @@ omit =
homeassistant/components/nello/lock.py
homeassistant/components/nest/legacy/*
homeassistant/components/netdata/sensor.py
homeassistant/components/netgear/__init__.py
homeassistant/components/netgear/device_tracker.py
homeassistant/components/netgear/router.py
homeassistant/components/netgear/sensor.py
homeassistant/components/netgear_lte/*
homeassistant/components/netio/switch.py
homeassistant/components/neurio_energy/sensor.py
@@ -754,6 +764,7 @@ omit =
homeassistant/components/opencv/*
homeassistant/components/openevse/sensor.py
homeassistant/components/openexchangerates/sensor.py
homeassistant/components/opengarage/__init__.py
homeassistant/components/opengarage/cover.py
homeassistant/components/openhome/__init__.py
homeassistant/components/openhome/media_player.py
@@ -864,9 +875,6 @@ omit =
homeassistant/components/rest/switch.py
homeassistant/components/ring/camera.py
homeassistant/components/ripple/sensor.py
homeassistant/components/rituals_perfume_genie/binary_sensor.py
homeassistant/components/rituals_perfume_genie/number.py
homeassistant/components/rituals_perfume_genie/select.py
homeassistant/components/rocketchat/notify.py
homeassistant/components/roomba/__init__.py
homeassistant/components/roomba/binary_sensor.py
@@ -990,7 +998,6 @@ omit =
homeassistant/components/squeezebox/__init__.py
homeassistant/components/squeezebox/browse_media.py
homeassistant/components/squeezebox/media_player.py
homeassistant/components/ssdp/util.py
homeassistant/components/starline/*
homeassistant/components/starlingbank/sensor.py
homeassistant/components/steam_online/sensor.py
@@ -1001,12 +1008,20 @@ omit =
homeassistant/components/suez_water/*
homeassistant/components/supervisord/sensor.py
homeassistant/components/surepetcare/__init__.py
homeassistant/components/surepetcare/entity.py
homeassistant/components/surepetcare/binary_sensor.py
homeassistant/components/surepetcare/sensor.py
homeassistant/components/swiss_hydrological_data/sensor.py
homeassistant/components/swiss_public_transport/sensor.py
homeassistant/components/swisscom/device_tracker.py
homeassistant/components/switchbot/switch.py
homeassistant/components/switchbot/binary_sensor.py
homeassistant/components/switchbot/__init__.py
homeassistant/components/switchbot/const.py
homeassistant/components/switchbot/entity.py
homeassistant/components/switchbot/cover.py
homeassistant/components/switchbot/sensor.py
homeassistant/components/switchbot/coordinator.py
homeassistant/components/switchmate/switch.py
homeassistant/components/syncthing/__init__.py
homeassistant/components/syncthing/sensor.py
@@ -1049,14 +1064,6 @@ omit =
homeassistant/components/telnet/switch.py
homeassistant/components/temper/sensor.py
homeassistant/components/tensorflow/image_processing.py
homeassistant/components/tesla/__init__.py
homeassistant/components/tesla/binary_sensor.py
homeassistant/components/tesla/climate.py
homeassistant/components/tesla/const.py
homeassistant/components/tesla/device_tracker.py
homeassistant/components/tesla/lock.py
homeassistant/components/tesla/sensor.py
homeassistant/components/tesla/switch.py
homeassistant/components/tfiac/climate.py
homeassistant/components/thermoworks_smoke/sensor.py
homeassistant/components/thethingsnetwork/*
@@ -1090,16 +1097,15 @@ omit =
homeassistant/components/totalconnect/binary_sensor.py
homeassistant/components/totalconnect/const.py
homeassistant/components/touchline/climate.py
homeassistant/components/tplink/common.py
homeassistant/components/tplink/switch.py
homeassistant/components/tplink_lte/*
homeassistant/components/traccar/device_tracker.py
homeassistant/components/traccar/const.py
homeassistant/components/trackr/device_tracker.py
homeassistant/components/tractive/__init__.py
homeassistant/components/tractive/binary_sensor.py
homeassistant/components/tractive/device_tracker.py
homeassistant/components/tractive/entity.py
homeassistant/components/tractive/sensor.py
homeassistant/components/tractive/switch.py
homeassistant/components/tradfri/*
homeassistant/components/trafikverket_train/sensor.py
homeassistant/components/trafikverket_weatherstation/sensor.py
@@ -1109,9 +1115,9 @@ omit =
homeassistant/components/transmission/errors.py
homeassistant/components/travisci/sensor.py
homeassistant/components/tuya/__init__.py
homeassistant/components/tuya/base.py
homeassistant/components/tuya/climate.py
homeassistant/components/tuya/const.py
homeassistant/components/tuya/cover.py
homeassistant/components/tuya/fan.py
homeassistant/components/tuya/light.py
homeassistant/components/tuya/scene.py
@@ -1179,6 +1185,8 @@ omit =
homeassistant/components/waterfurnace/*
homeassistant/components/watson_iot/*
homeassistant/components/watson_tts/tts.py
homeassistant/components/watttime/__init__.py
homeassistant/components/watttime/sensor.py
homeassistant/components/waze_travel_time/__init__.py
homeassistant/components/waze_travel_time/helpers.py
homeassistant/components/waze_travel_time/sensor.py
@@ -1285,5 +1293,6 @@ exclude_lines =
raise AssertionError
raise NotImplementedError
# TYPE_CHECKING block is never executed during pytest run
# TYPE_CHECKING and @overload blocks are never executed during pytest run
if TYPE_CHECKING:
@overload

View File

@@ -133,7 +133,7 @@ jobs:
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build base image
uses: home-assistant/builder@2021.07.0
uses: home-assistant/builder@2021.09.0
with:
args: |
$BUILD_ARGS \
@@ -186,7 +186,7 @@ jobs:
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build base image
uses: home-assistant/builder@2021.07.0
uses: home-assistant/builder@2021.09.0
with:
args: |
$BUILD_ARGS \

View File

@@ -10,7 +10,7 @@ on:
pull_request: ~
env:
CACHE_VERSION: 2
CACHE_VERSION: 3
DEFAULT_PYTHON: 3.8
PRE_COMMIT_CACHE: ~/.cache/pre-commit
SQLALCHEMY_WARN_20: 1
@@ -740,4 +740,4 @@ jobs:
coverage report --fail-under=94
coverage xml
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v2.0.3
uses: codecov/codecov-action@v2.1.0

View File

@@ -9,12 +9,12 @@ jobs:
lock:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v2.1.2
- uses: dessant/lock-threads@v3
with:
github-token: ${{ github.token }}
issue-lock-inactive-days: "30"
issue-exclude-created-before: "2020-10-01T00:00:00Z"
issue-inactive-days: "30"
exclude-issue-created-before: "2020-10-01T00:00:00Z"
issue-lock-reason: ""
pr-lock-inactive-days: "1"
pr-exclude-created-before: "2020-11-01T00:00:00Z"
pr-inactive-days: "1"
exclude-pr-created-before: "2020-11-01T00:00:00Z"
pr-lock-reason: ""

View File

@@ -89,7 +89,7 @@ jobs:
wheels-key: ${{ secrets.WHEELS_KEY }}
wheels-user: wheels
env-file: true
apk: "build-base;cmake;git;linux-headers;bluez-dev;libffi-dev;openssl-dev;glib-dev;eudev-dev;libxml2-dev;libxslt-dev"
apk: "build-base;cmake;git;linux-headers;bluez-dev;libffi-dev;openssl-dev;glib-dev;eudev-dev;libxml2-dev;libxslt-dev;cargo"
pip: "Cython;numpy"
skip-binary: aiohttp
constraints: "homeassistant/package_constraints.txt"
@@ -158,7 +158,7 @@ jobs:
wheels-key: ${{ secrets.WHEELS_KEY }}
wheels-user: wheels
env-file: true
apk: "build-base;cmake;git;linux-headers;libexecinfo-dev;bluez-dev;libffi-dev;openssl-dev;glib-dev;eudev-dev;libxml2-dev;libxslt-dev;libpng-dev;libjpeg-turbo-dev;tiff-dev;autoconf;automake;cups-dev;gmp-dev;mpfr-dev;mpc1-dev;ffmpeg-dev;gammu-dev"
apk: "build-base;cmake;git;linux-headers;libexecinfo-dev;bluez-dev;libffi-dev;openssl-dev;glib-dev;eudev-dev;libxml2-dev;libxslt-dev;libpng-dev;libjpeg-turbo-dev;tiff-dev;autoconf;automake;cups-dev;gmp-dev;mpfr-dev;mpc1-dev;ffmpeg-dev;gammu-dev;cargo"
pip: "Cython;numpy;scikit-build"
skip-binary: aiohttp
constraints: "homeassistant/package_constraints.txt"

2
.gitignore vendored
View File

@@ -1,4 +1,4 @@
config/*
/config
config2/*
tests/testing_config/deps

View File

@@ -1,11 +1,11 @@
repos:
- repo: https://github.com/asottile/pyupgrade
rev: v2.23.3
rev: v2.27.0
hooks:
- id: pyupgrade
args: [--py38-plus]
- repo: https://github.com/psf/black
rev: 21.7b0
rev: 21.9b0
hooks:
- id: black
args:

View File

@@ -27,9 +27,11 @@ homeassistant.components.calendar.*
homeassistant.components.camera.*
homeassistant.components.canary.*
homeassistant.components.cover.*
homeassistant.components.crownstone.*
homeassistant.components.device_automation.*
homeassistant.components.device_tracker.*
homeassistant.components.devolo_home_control.*
homeassistant.components.dlna_dmr.*
homeassistant.components.dnsip.*
homeassistant.components.dsmr.*
homeassistant.components.dunehd.*
@@ -54,6 +56,7 @@ homeassistant.components.huawei_lte.*
homeassistant.components.hyperion.*
homeassistant.components.image_processing.*
homeassistant.components.integration.*
homeassistant.components.iqvia.*
homeassistant.components.knx.*
homeassistant.components.kraken.*
homeassistant.components.lcn.*
@@ -62,6 +65,7 @@ homeassistant.components.local_ip.*
homeassistant.components.lock.*
homeassistant.components.mailbox.*
homeassistant.components.media_player.*
homeassistant.components.modbus.*
homeassistant.components.mysensors.*
homeassistant.components.nam.*
homeassistant.components.neato.*
@@ -85,6 +89,7 @@ homeassistant.components.recorder.statistics
homeassistant.components.remote.*
homeassistant.components.renault.*
homeassistant.components.rituals_perfume_genie.*
homeassistant.components.samsungtv.*
homeassistant.components.scene.*
homeassistant.components.select.*
homeassistant.components.sensor.*
@@ -95,18 +100,23 @@ homeassistant.components.sonos.media_player
homeassistant.components.ssdp.*
homeassistant.components.stream.*
homeassistant.components.sun.*
homeassistant.components.surepetcare.*
homeassistant.components.switch.*
homeassistant.components.switcher_kis.*
homeassistant.components.synology_dsm.*
homeassistant.components.systemmonitor.*
homeassistant.components.tag.*
homeassistant.components.tautulli.*
homeassistant.components.tcp.*
homeassistant.components.tile.*
homeassistant.components.tplink.*
homeassistant.components.tradfri.*
homeassistant.components.tts.*
homeassistant.components.upcloud.*
homeassistant.components.uptime.*
homeassistant.components.uptimerobot.*
homeassistant.components.vacuum.*
homeassistant.components.vallox.*
homeassistant.components.water_heater.*
homeassistant.components.weather.*
homeassistant.components.websocket_api.*

View File

@@ -29,6 +29,7 @@ homeassistant/components/aemet/* @noltari
homeassistant/components/agent_dvr/* @ispysoftware
homeassistant/components/airly/* @bieniu
homeassistant/components/airnow/* @asymworks
homeassistant/components/airthings/* @danielhiversen
homeassistant/components/airtouch4/* @LonePurpleWolf
homeassistant/components/airvisual/* @bachya
homeassistant/components/alarmdecoder/* @ajschmidt8
@@ -36,6 +37,7 @@ homeassistant/components/alexa/* @home-assistant/cloud @ochlocracy
homeassistant/components/almond/* @gcampax @balloob
homeassistant/components/alpha_vantage/* @fabaff
homeassistant/components/ambee/* @frenck
homeassistant/components/amberelectric/* @madpilot
homeassistant/components/ambiclimate/* @danielhiversen
homeassistant/components/ambient_station/* @bachya
homeassistant/components/amcrest/* @flacjacket
@@ -73,7 +75,7 @@ homeassistant/components/blink/* @fronzbot
homeassistant/components/blueprint/* @home-assistant/core
homeassistant/components/bmp280/* @belidzs
homeassistant/components/bmw_connected_drive/* @gerard33 @rikroe
homeassistant/components/bond/* @prystupa
homeassistant/components/bond/* @prystupa @joshs85
homeassistant/components/bosch_shc/* @tschamm
homeassistant/components/braviatv/* @bieniu @Drafteed
homeassistant/components/broadlink/* @danielhiversen @felipediel
@@ -104,6 +106,7 @@ homeassistant/components/coronavirus/* @home-assistant/core
homeassistant/components/counter/* @fabaff
homeassistant/components/cover/* @home-assistant/core
homeassistant/components/cpuspeed/* @fabaff
homeassistant/components/crownstone/* @Crownstone @RicArch97
homeassistant/components/cups/* @fabaff
homeassistant/components/daikin/* @fredrike
homeassistant/components/darksky/* @fabaff
@@ -120,6 +123,7 @@ homeassistant/components/dhcp/* @bdraco
homeassistant/components/dht/* @thegardenmonkey
homeassistant/components/digital_ocean/* @fabaff
homeassistant/components/discogs/* @thibmaek
homeassistant/components/dlna_dmr/* @StevenLooman @chishm
homeassistant/components/doorbird/* @oblogic7 @bdraco
homeassistant/components/dsmr/* @Robbie1221 @frenck
homeassistant/components/dsmr_reader/* @depl0y
@@ -132,6 +136,7 @@ homeassistant/components/ecobee/* @marthoc
homeassistant/components/econet/* @vangorra @w1ll1am23
homeassistant/components/ecovacs/* @OverloadUT
homeassistant/components/edl21/* @mtdcr
homeassistant/components/efergy/* @tkdrob
homeassistant/components/egardia/* @jeroenterheerdt
homeassistant/components/eight_sleep/* @mezz64
homeassistant/components/elgato/* @frenck
@@ -248,7 +253,7 @@ homeassistant/components/integration/* @dgomes
homeassistant/components/intent/* @home-assistant/core
homeassistant/components/intesishome/* @jnimmo
homeassistant/components/ios/* @robbiet480
homeassistant/components/iotawatt/* @gtdiehl
homeassistant/components/iotawatt/* @gtdiehl @jyavenard
homeassistant/components/iperf3/* @rohankapoorcom
homeassistant/components/ipma/* @dgomes @abmantis
homeassistant/components/ipp/* @ctalkington
@@ -263,7 +268,7 @@ homeassistant/components/kaiterra/* @Michsior14
homeassistant/components/keba/* @dannerph
homeassistant/components/keenetic_ndms2/* @foxel
homeassistant/components/kef/* @basnijholt
homeassistant/components/keyboard_remote/* @bendavid
homeassistant/components/keyboard_remote/* @bendavid @lanrat
homeassistant/components/kmtronic/* @dgomes
homeassistant/components/knx/* @Julius2342 @farmio @marvin-w
homeassistant/components/kodi/* @OnFreund @cgtobi
@@ -312,6 +317,7 @@ homeassistant/components/minecraft_server/* @elmurato
homeassistant/components/minio/* @tkislan
homeassistant/components/mobile_app/* @robbiet480
homeassistant/components/modbus/* @adamchengtkc @janiversen @vzahradnik
homeassistant/components/modem_callerid/* @tkdrob
homeassistant/components/modern_forms/* @wonderslug
homeassistant/components/monoprice/* @etsinko @OnFreund
homeassistant/components/moon/* @fabaff
@@ -335,6 +341,7 @@ homeassistant/components/ness_alarm/* @nickw444
homeassistant/components/nest/* @allenporter
homeassistant/components/netatmo/* @cgtobi
homeassistant/components/netdata/* @fabaff
homeassistant/components/netgear/* @hacf-fr @Quentame @starkillerOG
homeassistant/components/nexia/* @bdraco
homeassistant/components/nextbus/* @vividboarder
homeassistant/components/nextcloud/* @meichthys
@@ -500,7 +507,7 @@ homeassistant/components/supla/* @mwegrzynek
homeassistant/components/surepetcare/* @benleb @danielhiversen
homeassistant/components/swiss_hydrological_data/* @fabaff
homeassistant/components/swiss_public_transport/* @fabaff
homeassistant/components/switchbot/* @danielhiversen
homeassistant/components/switchbot/* @danielhiversen @RenierM26
homeassistant/components/switcher_kis/* @tomerfi @thecode
homeassistant/components/switchmate/* @danielhiversen
homeassistant/components/syncthing/* @zhulik
@@ -518,7 +525,6 @@ homeassistant/components/tasmota/* @emontnemery
homeassistant/components/tautulli/* @ludeeus
homeassistant/components/tellduslive/* @fredrike
homeassistant/components/template/* @PhracturedBlue @tetienne @home-assistant/core
homeassistant/components/tesla/* @zabuldon @alandtse
homeassistant/components/tfiac/* @fredrike @mellado
homeassistant/components/thethingsnetwork/* @fabaff
homeassistant/components/threshold/* @fabaff
@@ -538,7 +544,7 @@ homeassistant/components/trafikverket_train/* @endor-force
homeassistant/components/trafikverket_weatherstation/* @endor-force
homeassistant/components/transmission/* @engrbm87 @JPHutchins
homeassistant/components/tts/* @pvizeli
homeassistant/components/tuya/* @ollo69
homeassistant/components/tuya/* @Tuya @zlinoliver @METISU
homeassistant/components/twentemilieu/* @frenck
homeassistant/components/twinkly/* @dr1rrb
homeassistant/components/ubus/* @noltari
@@ -572,10 +578,12 @@ homeassistant/components/wake_on_lan/* @ntilley905
homeassistant/components/wallbox/* @hesselonline
homeassistant/components/waqi/* @andrey-git
homeassistant/components/watson_tts/* @rutkai
homeassistant/components/watttime/* @bachya
homeassistant/components/weather/* @fabaff
homeassistant/components/webostv/* @bendavid @thecode
homeassistant/components/websocket_api/* @home-assistant/core
homeassistant/components/wemo/* @esev
homeassistant/components/whirlpool/* @abmantis
homeassistant/components/wiffi/* @mampfes
homeassistant/components/wilight/* @leofig-rj
homeassistant/components/wirelesstag/* @sergeymaysak

View File

@@ -2,11 +2,11 @@
"image": "homeassistant/{arch}-homeassistant",
"shadow_repository": "ghcr.io/home-assistant",
"build_from": {
"aarch64": "ghcr.io/home-assistant/aarch64-homeassistant-base:2021.08.0",
"armhf": "ghcr.io/home-assistant/armhf-homeassistant-base:2021.08.0",
"armv7": "ghcr.io/home-assistant/armv7-homeassistant-base:2021.08.0",
"amd64": "ghcr.io/home-assistant/amd64-homeassistant-base:2021.08.0",
"i386": "ghcr.io/home-assistant/i386-homeassistant-base:2021.08.0"
"aarch64": "ghcr.io/home-assistant/aarch64-homeassistant-base:2021.09.0",
"armhf": "ghcr.io/home-assistant/armhf-homeassistant-base:2021.09.0",
"armv7": "ghcr.io/home-assistant/armv7-homeassistant-base:2021.09.0",
"amd64": "ghcr.io/home-assistant/amd64-homeassistant-base:2021.09.0",
"i386": "ghcr.io/home-assistant/i386-homeassistant-base:2021.09.0"
},
"labels": {
"io.hass.type": "core",
@@ -19,4 +19,4 @@
"org.opencontainers.image.licenses": "Apache License 2.0"
},
"version_tag": true
}
}

View File

@@ -2,6 +2,7 @@
from __future__ import annotations
import argparse
import faulthandler
import os
import platform
import subprocess
@@ -10,6 +11,8 @@ import threading
from homeassistant.const import REQUIRED_PYTHON_VER, RESTART_EXIT_CODE, __version__
FAULT_LOG_FILENAME = "home-assistant.log.fault"
def validate_python() -> None:
"""Validate that the right Python version is running."""
@@ -132,16 +135,14 @@ def get_arguments() -> argparse.Namespace:
def daemonize() -> None:
"""Move current process to daemon process."""
# Create first fork
pid = os.fork()
if pid > 0:
if os.fork() > 0:
sys.exit(0)
# Decouple fork
os.setsid()
# Create second fork
pid = os.fork()
if pid > 0:
if os.fork() > 0:
sys.exit(0)
# redirect standard file descriptors to devnull
@@ -311,7 +312,15 @@ def main() -> int:
open_ui=args.open_ui,
)
exit_code = runner.run(runtime_conf)
fault_file_name = os.path.join(config_dir, FAULT_LOG_FILENAME)
with open(fault_file_name, mode="a", encoding="utf8") as fault_file:
faulthandler.enable(fault_file)
exit_code = runner.run(runtime_conf)
faulthandler.disable()
if os.path.getsize(fault_file_name) == 0:
os.remove(fault_file_name)
if exit_code == RESTART_EXIT_CODE and not args.runner:
try_to_restart()

View File

@@ -341,8 +341,7 @@ class AuthManager:
"System generated users cannot enable multi-factor auth module."
)
module = self.get_auth_mfa_module(mfa_module_id)
if module is None:
if (module := self.get_auth_mfa_module(mfa_module_id)) is None:
raise ValueError(f"Unable find multi-factor auth module: {mfa_module_id}")
await module.async_setup_user(user.id, data)
@@ -356,8 +355,7 @@ class AuthManager:
"System generated users cannot disable multi-factor auth module."
)
module = self.get_auth_mfa_module(mfa_module_id)
if module is None:
if (module := self.get_auth_mfa_module(mfa_module_id)) is None:
raise ValueError(f"Unable find multi-factor auth module: {mfa_module_id}")
await module.async_depose_user(user.id)
@@ -466,7 +464,7 @@ class AuthManager:
},
refresh_token.jwt_key,
algorithm="HS256",
).decode()
)
@callback
def _async_resolve_provider(
@@ -498,8 +496,7 @@ class AuthManager:
Will raise InvalidAuthError on errors.
"""
provider = self._async_resolve_provider(refresh_token)
if provider:
if provider := self._async_resolve_provider(refresh_token):
provider.async_validate_refresh_token(refresh_token, remote_ip)
async def async_validate_access_token(
@@ -507,7 +504,9 @@ class AuthManager:
) -> models.RefreshToken | None:
"""Return refresh token if an access token is valid."""
try:
unverif_claims = jwt.decode(token, verify=False)
unverif_claims = jwt.decode(
token, algorithms=["HS256"], options={"verify_signature": False}
)
except jwt.InvalidTokenError:
return None

View File

@@ -96,8 +96,7 @@ class AuthStore:
groups = []
for group_id in group_ids or []:
group = self._groups.get(group_id)
if group is None:
if (group := self._groups.get(group_id)) is None:
raise ValueError(f"Invalid group specified {group_id}")
groups.append(group)
@@ -160,8 +159,7 @@ class AuthStore:
if group_ids is not None:
groups = []
for grid in group_ids:
group = self._groups.get(grid)
if group is None:
if (group := self._groups.get(grid)) is None:
raise ValueError("Invalid group specified.")
groups.append(group)
@@ -446,16 +444,14 @@ class AuthStore:
)
continue
token_type = rt_dict.get("token_type")
if token_type is None:
if (token_type := rt_dict.get("token_type")) is None:
if rt_dict["client_id"] is None:
token_type = models.TOKEN_TYPE_SYSTEM
else:
token_type = models.TOKEN_TYPE_NORMAL
# old refresh_token don't have last_used_at (pre-0.78)
last_used_at_str = rt_dict.get("last_used_at")
if last_used_at_str:
if last_used_at_str := rt_dict.get("last_used_at"):
last_used_at = dt_util.parse_datetime(last_used_at_str)
else:
last_used_at = None

View File

@@ -38,12 +38,12 @@ class InsecureExampleModule(MultiFactorAuthModule):
@property
def input_schema(self) -> vol.Schema:
"""Validate login flow input data."""
return vol.Schema({"pin": str})
return vol.Schema({vol.Required("pin"): str})
@property
def setup_schema(self) -> vol.Schema:
"""Validate async_setup_user input data."""
return vol.Schema({"pin": str})
return vol.Schema({vol.Required("pin"): str})
async def async_setup_flow(self, user_id: str) -> SetupFlow:
"""Return a data entry flow handler for setup module.

View File

@@ -110,7 +110,7 @@ class NotifyAuthModule(MultiFactorAuthModule):
@property
def input_schema(self) -> vol.Schema:
"""Validate login flow input data."""
return vol.Schema({INPUT_FIELD_CODE: str})
return vol.Schema({vol.Required(INPUT_FIELD_CODE): str})
async def _async_load(self) -> None:
"""Load stored data."""
@@ -118,9 +118,7 @@ class NotifyAuthModule(MultiFactorAuthModule):
if self._user_settings is not None:
return
data = await self._user_store.async_load()
if data is None:
if (data := await self._user_store.async_load()) is None:
data = {STORAGE_USERS: {}}
self._user_settings = {
@@ -207,8 +205,7 @@ class NotifyAuthModule(MultiFactorAuthModule):
await self._async_load()
assert self._user_settings is not None
notify_setting = self._user_settings.get(user_id)
if notify_setting is None:
if (notify_setting := self._user_settings.get(user_id)) is None:
return False
# user_input has been validate in caller
@@ -225,8 +222,7 @@ class NotifyAuthModule(MultiFactorAuthModule):
await self._async_load()
assert self._user_settings is not None
notify_setting = self._user_settings.get(user_id)
if notify_setting is None:
if (notify_setting := self._user_settings.get(user_id)) is None:
raise ValueError("Cannot find user_id")
def generate_secret_and_one_time_password() -> str:

View File

@@ -84,7 +84,7 @@ class TotpAuthModule(MultiFactorAuthModule):
@property
def input_schema(self) -> vol.Schema:
"""Validate login flow input data."""
return vol.Schema({INPUT_FIELD_CODE: str})
return vol.Schema({vol.Required(INPUT_FIELD_CODE): str})
async def _async_load(self) -> None:
"""Load stored data."""
@@ -92,9 +92,7 @@ class TotpAuthModule(MultiFactorAuthModule):
if self._users is not None:
return
data = await self._user_store.async_load()
if data is None:
if (data := await self._user_store.async_load()) is None:
data = {STORAGE_USERS: {}}
self._users = data.get(STORAGE_USERS, {})
@@ -163,8 +161,7 @@ class TotpAuthModule(MultiFactorAuthModule):
"""Validate two factor authentication code."""
import pyotp # pylint: disable=import-outside-toplevel
ota_secret = self._users.get(user_id) # type: ignore
if ota_secret is None:
if (ota_secret := self._users.get(user_id)) is None: # type: ignore
# even we cannot find user, we still do verify
# to make timing the same as if user was found.
pyotp.TOTP(DUMMY_SECRET).verify(code, valid_window=1)

View File

@@ -1,8 +1,9 @@
"""Permissions for Home Assistant."""
from __future__ import annotations
from collections.abc import Callable
import logging
from typing import Any, Callable
from typing import Any
import voluptuous as vol
@@ -33,9 +34,7 @@ class AbstractPermissions:
def check_entity(self, entity_id: str, key: str) -> bool:
"""Check if we can access entity."""
entity_func = self._cached_entity_func
if entity_func is None:
if (entity_func := self._cached_entity_func) is None:
entity_func = self._cached_entity_func = self._entity_func()
return entity_func(entity_id, key)

View File

@@ -2,7 +2,7 @@
from __future__ import annotations
from collections import OrderedDict
from typing import Callable
from collections.abc import Callable
import voluptuous as vol

View File

@@ -72,8 +72,7 @@ def compile_policy(
def apply_policy_funcs(object_id: str, key: str) -> bool:
"""Apply several policy functions."""
for func in funcs:
result = func(object_id, key)
if result is not None:
if (result := func(object_id, key)) is not None:
return result
return False

View File

@@ -169,9 +169,7 @@ async def load_auth_provider_module(
if hass.config.skip_pip or not hasattr(module, "REQUIREMENTS"):
return module
processed = hass.data.get(DATA_REQS)
if processed is None:
if (processed := hass.data.get(DATA_REQS)) is None:
processed = hass.data[DATA_REQS] = set()
elif provider in processed:
return module

View File

@@ -2,7 +2,6 @@
from __future__ import annotations
import asyncio
import collections
from collections.abc import Mapping
import logging
import os
@@ -148,10 +147,13 @@ class CommandLineLoginFlow(LoginFlow):
user_input.pop("password")
return await self.async_finish(user_input)
schema: dict[str, type] = collections.OrderedDict()
schema["username"] = str
schema["password"] = str
return self.async_show_form(
step_id="init", data_schema=vol.Schema(schema), errors=errors
step_id="init",
data_schema=vol.Schema(
{
vol.Required("username"): str,
vol.Required("password"): str,
}
),
errors=errors,
)

View File

@@ -3,7 +3,6 @@ from __future__ import annotations
import asyncio
import base64
from collections import OrderedDict
from collections.abc import Mapping
import logging
from typing import Any, cast
@@ -82,9 +81,7 @@ class Data:
async def async_load(self) -> None:
"""Load stored data."""
data = await self._store.async_load()
if data is None:
if (data := await self._store.async_load()) is None:
data = {"users": []}
seen: set[str] = set()
@@ -93,9 +90,7 @@ class Data:
username = user["username"]
# check if we have duplicates
folded = username.casefold()
if folded in seen:
if (folded := username.casefold()) in seen:
self.is_legacy = True
logging.getLogger(__name__).warning(
@@ -339,10 +334,13 @@ class HassLoginFlow(LoginFlow):
user_input.pop("password")
return await self.async_finish(user_input)
schema: dict[str, type] = OrderedDict()
schema["username"] = str
schema["password"] = str
return self.async_show_form(
step_id="init", data_schema=vol.Schema(schema), errors=errors
step_id="init",
data_schema=vol.Schema(
{
vol.Required("username"): str,
vol.Required("password"): str,
}
),
errors=errors,
)

View File

@@ -1,7 +1,6 @@
"""Example auth provider."""
from __future__ import annotations
from collections import OrderedDict
from collections.abc import Mapping
import hmac
from typing import Any, cast
@@ -117,10 +116,13 @@ class ExampleLoginFlow(LoginFlow):
user_input.pop("password")
return await self.async_finish(user_input)
schema: dict[str, type] = OrderedDict()
schema["username"] = str
schema["password"] = str
return self.async_show_form(
step_id="init", data_schema=vol.Schema(schema), errors=errors
step_id="init",
data_schema=vol.Schema(
{
vol.Required("username"): str,
vol.Required("password"): str,
}
),
errors=errors,
)

View File

@@ -102,5 +102,7 @@ class LegacyLoginFlow(LoginFlow):
return await self.async_finish({})
return self.async_show_form(
step_id="init", data_schema=vol.Schema({"password": str}), errors=errors
step_id="init",
data_schema=vol.Schema({vol.Required("password"): str}),
errors=errors,
)

View File

@@ -244,5 +244,7 @@ class TrustedNetworksLoginFlow(LoginFlow):
return self.async_show_form(
step_id="init",
data_schema=vol.Schema({"user": vol.In(self._available_users)}),
data_schema=vol.Schema(
{vol.Required("user"): vol.In(self._available_users)}
),
)

View File

@@ -109,9 +109,8 @@ async def async_setup_hass(
config_dict = None
basic_setup_success = False
safe_mode = runtime_config.safe_mode
if not safe_mode:
if not (safe_mode := runtime_config.safe_mode):
await hass.async_add_executor_job(conf_util.process_ha_config_upgrade, hass)
try:
@@ -368,8 +367,7 @@ async def async_mount_local_lib_path(config_dir: str) -> str:
This function is a coroutine.
"""
deps_dir = os.path.join(config_dir, "deps")
lib_dir = await async_get_user_site(deps_dir)
if lib_dir not in sys.path:
if (lib_dir := await async_get_user_site(deps_dir)) not in sys.path:
sys.path.insert(0, lib_dir)
return deps_dir
@@ -494,17 +492,13 @@ async def _async_set_up_integrations(
_LOGGER.info("Domains to be set up: %s", domains_to_setup)
logging_domains = domains_to_setup & LOGGING_INTEGRATIONS
# Load logging as soon as possible
if logging_domains:
if logging_domains := domains_to_setup & LOGGING_INTEGRATIONS:
_LOGGER.info("Setting up logging: %s", logging_domains)
await async_setup_multi_components(hass, logging_domains, config)
# Start up debuggers. Start these first in case they want to wait.
debuggers = domains_to_setup & DEBUGGER_INTEGRATIONS
if debuggers:
if debuggers := domains_to_setup & DEBUGGER_INTEGRATIONS:
_LOGGER.debug("Setting up debuggers: %s", debuggers)
await async_setup_multi_components(hass, debuggers, config)
@@ -524,9 +518,7 @@ async def _async_set_up_integrations(
stage_1_domains.add(domain)
dep_itg = integration_cache.get(domain)
if dep_itg is None:
if (dep_itg := integration_cache.get(domain)) is None:
continue
deps_promotion.update(dep_itg.all_dependencies)
@@ -564,6 +556,14 @@ async def _async_set_up_integrations(
except asyncio.TimeoutError:
_LOGGER.warning("Setup timed out for stage 2 - moving forward")
# Wrap up startup
_LOGGER.debug("Waiting for startup to wrap up")
try:
async with hass.timeout.async_timeout(WRAP_UP_TIMEOUT, cool_down=COOLDOWN_TIME):
await hass.async_block_till_done()
except asyncio.TimeoutError:
_LOGGER.warning("Setup timed out for bootstrap - moving forward")
watch_task.cancel()
async_dispatcher_send(hass, SIGNAL_BOOTSTRAP_INTEGRATONS, {})
@@ -576,11 +576,3 @@ async def _async_set_up_integrations(
)
},
)
# Wrap up startup
_LOGGER.debug("Waiting for startup to wrap up")
try:
async with hass.timeout.async_timeout(WRAP_UP_TIMEOUT, cool_down=COOLDOWN_TIME):
await hass.async_block_till_done()
except asyncio.TimeoutError:
_LOGGER.warning("Setup timed out for bootstrap - moving forward")

View File

@@ -6,7 +6,7 @@
"error": {
"cannot_connect": "Sikertelen csatlakoz\u00e1s",
"invalid_api_key": "\u00c9rv\u00e9nytelen API kulcs",
"requests_exceeded": "T\u00fall\u00e9pt\u00e9k az Accuweather API-hoz beny\u00fajtott k\u00e9relmek megengedett sz\u00e1m\u00e1t. Meg kell v\u00e1rnia vagy m\u00f3dos\u00edtania kell az API-kulcsot."
"requests_exceeded": "Accuweather API-hoz enged\u00e9lyezett lek\u00e9r\u00e9sek sz\u00e1ma t\u00fal lett l\u00e9pve. Meg kell v\u00e1rnia m\u00edg a tilt\u00e1s lej\u00e1r vagy m\u00f3dos\u00edtania kell az API-kulcsot."
},
"step": {
"user": {

View File

@@ -1,10 +1,17 @@
{
"config": {
"abort": {
"already_configured": "El dispositivo ya est\u00e1 configurado"
},
"error": {
"cannot_connect": "No se pudo conectar",
"invalid_auth": "Autenticaci\u00f3n no v\u00e1lida"
},
"step": {
"user": {
"data": {
"account_id": "ID de la cuenta",
"host": "Anfitri\u00f3n",
"host": "Host",
"password": "Contrase\u00f1a"
}
}

View File

@@ -11,7 +11,7 @@
"user": {
"data": {
"account_id": "Fi\u00f3k ID",
"host": "Gazdag\u00e9p",
"host": "C\u00edm",
"password": "Jelsz\u00f3"
}
}

View File

@@ -0,0 +1,20 @@
{
"config": {
"abort": {
"already_configured": "Perangkat sudah dikonfigurasi"
},
"error": {
"cannot_connect": "Gagal terhubung",
"invalid_auth": "Autentikasi tidak valid"
},
"step": {
"user": {
"data": {
"account_id": "ID Akun",
"host": "Host",
"password": "Kata Sandi"
}
}
}
}
}

View File

@@ -7,6 +7,9 @@
"cannot_connect": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4"
},
"step": {
"hassio_confirm": {
"title": "AdGuard Home \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea \u05d4\u05e8\u05d7\u05d1\u05ea Assistant Assistant"
},
"user": {
"data": {
"host": "\u05de\u05d0\u05e8\u05d7",

View File

@@ -9,12 +9,12 @@
},
"step": {
"hassio_confirm": {
"description": "Be szeretn\u00e9 \u00e1ll\u00edtani a Home Assistant-ot, hogy csatlakozzon az AdGuard Home-hoz, amelyet a kieg\u00e9sz\u00edt\u0151 biztos\u00edt: {addon} ?",
"description": "Szeretn\u00e9 be\u00e1ll\u00edtani Home Assistantot AdGuard Home-hoz val\u00f3 csatlakoz\u00e1shoz, {addon} kieg\u00e9sz\u00edt\u0151 \u00e1ltal?",
"title": "Az AdGuard Home a Home Assistant kieg\u00e9sz\u00edt\u0151 seg\u00edts\u00e9g\u00e9vel"
},
"user": {
"data": {
"host": "Hoszt",
"host": "C\u00edm",
"password": "Jelsz\u00f3",
"port": "Port",
"ssl": "SSL tan\u00fas\u00edtv\u00e1ny haszn\u00e1lata",

View File

@@ -9,7 +9,7 @@
},
"step": {
"hassio_confirm": {
"description": "Ingin mengonfigurasi Home Assistant untuk terhubung ke AdGuard Home yang disediakan oleh add-on Supervisor {addon}?",
"description": "Ingin mengonfigurasi Home Assistant untuk terhubung ke AdGuard Home yang disediakan oleh add-on: {addon}?",
"title": "AdGuard Home melalui add-on Home Assistant"
},
"user": {

View File

@@ -4,13 +4,13 @@
"already_configured": "Az eszk\u00f6z m\u00e1r konfigur\u00e1lva van"
},
"error": {
"already_in_progress": "A konfigur\u00e1ci\u00f3 m\u00e1r folyamatban van.",
"already_in_progress": "A konfigur\u00e1l\u00e1s m\u00e1r folyamatban van.",
"cannot_connect": "Sikertelen csatlakoz\u00e1s"
},
"step": {
"user": {
"data": {
"host": "Hoszt",
"host": "C\u00edm",
"port": "Port"
},
"title": "\u00c1ll\u00edtsa be az Agent DVR-t"

View File

@@ -1,8 +1,9 @@
"""Support for the Airly sensor service."""
from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
from typing import Any, Callable, cast
from typing import Any, cast
from homeassistant.components.sensor import (
STATE_CLASS_MEASUREMENT,

View File

@@ -1,7 +1,11 @@
"""Support for the AirNow sensor service."""
from __future__ import annotations
from homeassistant.components.sensor import SensorEntity, SensorEntityDescription
from homeassistant.components.sensor import (
STATE_CLASS_MEASUREMENT,
SensorEntity,
SensorEntityDescription,
)
from homeassistant.const import (
ATTR_ATTRIBUTION,
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
@@ -31,18 +35,21 @@ SENSOR_TYPES: tuple[SensorEntityDescription, ...] = (
icon="mdi:blur",
name=ATTR_API_AQI,
native_unit_of_measurement="aqi",
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=ATTR_API_PM25,
icon="mdi:blur",
name=ATTR_API_PM25,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=ATTR_API_O3,
icon="mdi:blur",
name=ATTR_API_O3,
native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION,
state_class=STATE_CLASS_MEASUREMENT,
),
)

View File

@@ -0,0 +1,61 @@
"""The Airthings integration."""
from __future__ import annotations
from datetime import timedelta
import logging
from airthings import Airthings, AirthingsError
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import CONF_ID, CONF_SECRET, DOMAIN
_LOGGER = logging.getLogger(__name__)
PLATFORMS: list[str] = ["sensor"]
SCAN_INTERVAL = timedelta(minutes=6)
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up Airthings from a config entry."""
hass.data.setdefault(DOMAIN, {})
airthings = Airthings(
entry.data[CONF_ID],
entry.data[CONF_SECRET],
async_get_clientsession(hass),
)
async def _update_method():
"""Get the latest data from Airthings."""
try:
return await airthings.update_devices()
except AirthingsError as err:
raise UpdateFailed(f"Unable to fetch data: {err}") from err
coordinator = DataUpdateCoordinator(
hass,
_LOGGER,
name=DOMAIN,
update_method=_update_method,
update_interval=SCAN_INTERVAL,
)
await coordinator.async_config_entry_first_refresh()
hass.data[DOMAIN][entry.entry_id] = coordinator
hass.config_entries.async_setup_platforms(entry, PLATFORMS)
return True
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Unload a config entry."""
unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
if unload_ok:
hass.data[DOMAIN].pop(entry.entry_id)
return unload_ok

View File

@@ -0,0 +1,67 @@
"""Config flow for Airthings integration."""
from __future__ import annotations
import logging
from typing import Any
import airthings
import voluptuous as vol
from homeassistant import config_entries
from homeassistant.data_entry_flow import FlowResult
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from .const import CONF_ID, CONF_SECRET, DOMAIN
_LOGGER = logging.getLogger(__name__)
STEP_USER_DATA_SCHEMA = vol.Schema(
{
vol.Required(CONF_ID): str,
vol.Required(CONF_SECRET): str,
}
)
class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
"""Handle a config flow for Airthings."""
VERSION = 1
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Handle the initial step."""
if user_input is None:
return self.async_show_form(
step_id="user",
data_schema=STEP_USER_DATA_SCHEMA,
description_placeholders={
"url": "https://dashboard.airthings.com/integrations/api-integration",
},
)
errors = {}
try:
await airthings.get_token(
async_get_clientsession(self.hass),
user_input[CONF_ID],
user_input[CONF_SECRET],
)
except airthings.AirthingsConnectionError:
errors["base"] = "cannot_connect"
except airthings.AirthingsAuthError:
errors["base"] = "invalid_auth"
except Exception: # pylint: disable=broad-except
_LOGGER.exception("Unexpected exception")
errors["base"] = "unknown"
else:
await self.async_set_unique_id(user_input[CONF_ID])
self._abort_if_unique_id_configured()
return self.async_create_entry(title="Airthings", data=user_input)
return self.async_show_form(
step_id="user", data_schema=STEP_USER_DATA_SCHEMA, errors=errors
)

View File

@@ -0,0 +1,6 @@
"""Constants for the Airthings integration."""
DOMAIN = "airthings"
CONF_ID = "id"
CONF_SECRET = "secret"

View File

@@ -0,0 +1,11 @@
{
"domain": "airthings",
"name": "Airthings",
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/airthings",
"requirements": ["airthings_cloud==0.0.1"],
"codeowners": [
"@danielhiversen"
],
"iot_class": "cloud_polling"
}

View File

@@ -0,0 +1,164 @@
"""Support for Airthings sensors."""
from __future__ import annotations
from airthings import AirthingsDevice
from homeassistant.components.sensor import (
STATE_CLASS_MEASUREMENT,
SensorEntity,
SensorEntityDescription,
StateType,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
CONCENTRATION_PARTS_PER_BILLION,
CONCENTRATION_PARTS_PER_MILLION,
DEVICE_CLASS_BATTERY,
DEVICE_CLASS_CO2,
DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_PM1,
DEVICE_CLASS_PM25,
DEVICE_CLASS_PRESSURE,
DEVICE_CLASS_SIGNAL_STRENGTH,
DEVICE_CLASS_TEMPERATURE,
PERCENTAGE,
PRESSURE_MBAR,
SIGNAL_STRENGTH_DECIBELS,
TEMP_CELSIUS,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import (
CoordinatorEntity,
DataUpdateCoordinator,
)
from .const import DOMAIN
SENSORS: dict[str, SensorEntityDescription] = {
"radonShortTermAvg": SensorEntityDescription(
key="radonShortTermAvg",
native_unit_of_measurement="Bq/m³",
name="Radon",
),
"temp": SensorEntityDescription(
key="temp",
device_class=DEVICE_CLASS_TEMPERATURE,
native_unit_of_measurement=TEMP_CELSIUS,
name="Temperature",
),
"humidity": SensorEntityDescription(
key="humidity",
device_class=DEVICE_CLASS_HUMIDITY,
native_unit_of_measurement=PERCENTAGE,
name="Humidity",
),
"pressure": SensorEntityDescription(
key="pressure",
device_class=DEVICE_CLASS_PRESSURE,
native_unit_of_measurement=PRESSURE_MBAR,
name="Pressure",
),
"battery": SensorEntityDescription(
key="battery",
device_class=DEVICE_CLASS_BATTERY,
native_unit_of_measurement=PERCENTAGE,
name="Battery",
),
"co2": SensorEntityDescription(
key="co2",
device_class=DEVICE_CLASS_CO2,
native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION,
name="CO2",
),
"voc": SensorEntityDescription(
key="voc",
native_unit_of_measurement=CONCENTRATION_PARTS_PER_BILLION,
name="VOC",
),
"light": SensorEntityDescription(
key="light",
native_unit_of_measurement=PERCENTAGE,
name="Light",
),
"virusRisk": SensorEntityDescription(
key="virusRisk",
name="Virus Risk",
),
"mold": SensorEntityDescription(
key="mold",
name="Mold",
),
"rssi": SensorEntityDescription(
key="rssi",
native_unit_of_measurement=SIGNAL_STRENGTH_DECIBELS,
device_class=DEVICE_CLASS_SIGNAL_STRENGTH,
name="RSSI",
entity_registry_enabled_default=False,
),
"pm1": SensorEntityDescription(
key="pm1",
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
device_class=DEVICE_CLASS_PM1,
name="PM1",
),
"pm25": SensorEntityDescription(
key="pm25",
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
device_class=DEVICE_CLASS_PM25,
name="PM25",
),
}
async def async_setup_entry(
hass: HomeAssistant,
entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the Airthings sensor."""
coordinator: DataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
entities = [
AirthingsHeaterEnergySensor(
coordinator,
airthings_device,
SENSORS[sensor_types],
)
for airthings_device in coordinator.data.values()
for sensor_types in airthings_device.sensor_types
if sensor_types in SENSORS
]
async_add_entities(entities)
class AirthingsHeaterEnergySensor(CoordinatorEntity, SensorEntity):
"""Representation of a Airthings Sensor device."""
_attr_state_class = STATE_CLASS_MEASUREMENT
def __init__(
self,
coordinator: DataUpdateCoordinator,
airthings_device: AirthingsDevice,
entity_description: SensorEntityDescription,
) -> None:
"""Initialize the sensor."""
super().__init__(coordinator)
self.entity_description = entity_description
self._attr_name = f"{airthings_device.name} {entity_description.name}"
self._attr_unique_id = f"{airthings_device.device_id}_{entity_description.key}"
self._id = airthings_device.device_id
self._attr_device_info = {
"identifiers": {(DOMAIN, airthings_device.device_id)},
"name": airthings_device.name,
"manufacturer": "Airthings",
}
@property
def native_value(self) -> StateType:
"""Return the value reported by the sensor."""
return self.coordinator.data[self._id].sensors[self.entity_description.key]

View File

@@ -0,0 +1,21 @@
{
"config": {
"step": {
"user": {
"data": {
"id": "ID",
"secret": "Secret",
"description": "Login at {url} to find your credentials"
}
}
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_account%]"
}
}
}

View File

@@ -0,0 +1,21 @@
{
"config": {
"abort": {
"already_configured": "El compte ja est\u00e0 configurat"
},
"error": {
"cannot_connect": "Ha fallat la connexi\u00f3",
"invalid_auth": "Autenticaci\u00f3 inv\u00e0lida",
"unknown": "Error inesperat"
},
"step": {
"user": {
"data": {
"description": "Inicia sessi\u00f3 a {url} per obtenir les credencials",
"id": "ID",
"secret": "Secret"
}
}
}
}
}

View File

@@ -0,0 +1,21 @@
{
"config": {
"abort": {
"already_configured": "Konto wurde bereits konfiguriert"
},
"error": {
"cannot_connect": "Verbindung fehlgeschlagen",
"invalid_auth": "Ung\u00fcltige Authentifizierung",
"unknown": "Unerwarteter Fehler"
},
"step": {
"user": {
"data": {
"description": "Melde dich unter {url} an, um deine Zugangsdaten zu finden",
"id": "ID",
"secret": "Geheimnis"
}
}
}
}
}

View File

@@ -0,0 +1,21 @@
{
"config": {
"abort": {
"already_configured": "Account is already configured"
},
"error": {
"cannot_connect": "Failed to connect",
"invalid_auth": "Invalid authentication",
"unknown": "Unexpected error"
},
"step": {
"user": {
"data": {
"description": "Login at {url} to find your credentials",
"id": "ID",
"secret": "Secret"
}
}
}
}
}

View File

@@ -0,0 +1,21 @@
{
"config": {
"abort": {
"already_configured": "Konto on juba h\u00e4\u00e4lestatud"
},
"error": {
"cannot_connect": "\u00dchendamine nurjus",
"invalid_auth": "Tuvastamise t\u00f5rge",
"unknown": "Ootamatu t\u00f5rge"
},
"step": {
"user": {
"data": {
"description": "Logi sisse aadressil {url}, et leida oma mandaadid",
"id": "Kasutajatunnus",
"secret": "Salas\u00f5na"
}
}
}
}
}

View File

@@ -0,0 +1,20 @@
{
"config": {
"abort": {
"already_configured": "\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d7\u05e9\u05d1\u05d5\u05df \u05db\u05d1\u05e8 \u05e0\u05e7\u05d1\u05e2\u05d4"
},
"error": {
"cannot_connect": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4",
"invalid_auth": "\u05d0\u05d9\u05de\u05d5\u05ea \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9",
"unknown": "\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05dc\u05ea\u05d9 \u05e6\u05e4\u05d5\u05d9\u05d4"
},
"step": {
"user": {
"data": {
"id": "\u05de\u05d6\u05d4\u05d4",
"secret": "\u05e1\u05d5\u05d3"
}
}
}
}
}

View File

@@ -0,0 +1,21 @@
{
"config": {
"abort": {
"already_configured": "A fi\u00f3k m\u00e1r konfigur\u00e1lva van"
},
"error": {
"cannot_connect": "Sikertelen csatlakoz\u00e1s",
"invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s",
"unknown": "V\u00e1ratlan hiba t\u00f6rt\u00e9nt"
},
"step": {
"user": {
"data": {
"description": "Jelentkezzen be a {url} c\u00edmen hogy megkapja hiteles\u00edt\u0151 adatait",
"id": "Azonos\u00edt\u00f3",
"secret": "Titok"
}
}
}
}
}

View File

@@ -0,0 +1,21 @@
{
"config": {
"abort": {
"already_configured": "L'account \u00e8 gi\u00e0 configurato"
},
"error": {
"cannot_connect": "Impossibile connettersi",
"invalid_auth": "Autenticazione non valida",
"unknown": "Errore imprevisto"
},
"step": {
"user": {
"data": {
"description": "Accedi a {url} per trovare le tue credenziali",
"id": "ID",
"secret": "Segreto"
}
}
}
}
}

View File

@@ -0,0 +1,21 @@
{
"config": {
"abort": {
"already_configured": "Account is al geconfigureerd"
},
"error": {
"cannot_connect": "Kan geen verbinding maken",
"invalid_auth": "Ongeldige authenticatie",
"unknown": "Onverwachte fout"
},
"step": {
"user": {
"data": {
"description": "Log in op {url} om uw inloggegevens te vinden",
"id": "ID",
"secret": "Geheim"
}
}
}
}
}

View File

@@ -0,0 +1,21 @@
{
"config": {
"abort": {
"already_configured": "Kontoen er allerede konfigurert"
},
"error": {
"cannot_connect": "Tilkobling mislyktes",
"invalid_auth": "Ugyldig godkjenning",
"unknown": "Uventet feil"
},
"step": {
"user": {
"data": {
"description": "Logg p\u00e5 {url} \u00e5 finne legitimasjonen din",
"id": "ID",
"secret": "Hemmelig"
}
}
}
}
}

View File

@@ -0,0 +1,21 @@
{
"config": {
"abort": {
"already_configured": "\u042d\u0442\u0430 \u0443\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 Home Assistant."
},
"error": {
"cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f.",
"invalid_auth": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.",
"unknown": "\u041d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430."
},
"step": {
"user": {
"data": {
"description": "\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435: {url}",
"id": "ID",
"secret": "\u0421\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043e\u0434"
}
}
}
}
}

View File

@@ -0,0 +1,21 @@
{
"config": {
"abort": {
"already_configured": "\u5e33\u865f\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210"
},
"error": {
"cannot_connect": "\u9023\u7dda\u5931\u6557",
"invalid_auth": "\u9a57\u8b49\u78bc\u7121\u6548",
"unknown": "\u672a\u9810\u671f\u932f\u8aa4"
},
"step": {
"user": {
"data": {
"description": "\u767b\u5165 {url} \u4ee5\u53d6\u5f97\u6191\u8b49",
"id": "ID",
"secret": "\u5bc6\u78bc"
}
}
}
}
}

View File

@@ -1,12 +1,16 @@
{
"config": {
"abort": {
"already_configured": "El dispositivo ya est\u00e1 configurado"
},
"error": {
"cannot_connect": "No se pudo conectar",
"no_units": "No se pudo encontrar ning\u00fan grupo AirTouch 4."
},
"step": {
"user": {
"data": {
"host": "Anfitri\u00f3n"
"host": "Host"
},
"title": "Configura los detalles de conexi\u00f3n de tu AirTouch 4."
}

View File

@@ -10,7 +10,7 @@
"step": {
"user": {
"data": {
"host": "Gazdag\u00e9p"
"host": "C\u00edm"
},
"title": "\u00c1ll\u00edtsa be az AirTouch 4 csatlakoz\u00e1si adatait."
}

View File

@@ -0,0 +1,17 @@
{
"config": {
"abort": {
"already_configured": "Perangkat sudah dikonfigurasi"
},
"error": {
"cannot_connect": "Gagal terhubung"
},
"step": {
"user": {
"data": {
"host": "Host"
}
}
}
}
}

View File

@@ -1,7 +1,11 @@
"""Support for AirVisual air quality sensors."""
from __future__ import annotations
from homeassistant.components.sensor import SensorEntity, SensorEntityDescription
from homeassistant.components.sensor import (
STATE_CLASS_MEASUREMENT,
SensorEntity,
SensorEntityDescription,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
ATTR_LATITUDE,
@@ -76,6 +80,7 @@ GEOGRAPHY_SENSOR_DESCRIPTIONS = (
name="Air Quality Index",
device_class=DEVICE_CLASS_AQI,
native_unit_of_measurement="AQI",
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=SENSOR_KIND_POLLUTANT,
@@ -92,6 +97,7 @@ NODE_PRO_SENSOR_DESCRIPTIONS = (
name="Air Quality Index",
device_class=DEVICE_CLASS_AQI,
native_unit_of_measurement="AQI",
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=SENSOR_KIND_BATTERY_LEVEL,
@@ -104,6 +110,7 @@ NODE_PRO_SENSOR_DESCRIPTIONS = (
name="C02",
device_class=DEVICE_CLASS_CO2,
native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=SENSOR_KIND_HUMIDITY,
@@ -116,30 +123,35 @@ NODE_PRO_SENSOR_DESCRIPTIONS = (
name="PM 0.1",
device_class=DEVICE_CLASS_PM1,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=SENSOR_KIND_PM_1_0,
name="PM 1.0",
device_class=DEVICE_CLASS_PM10,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=SENSOR_KIND_PM_2_5,
name="PM 2.5",
device_class=DEVICE_CLASS_PM25,
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=SENSOR_KIND_TEMPERATURE,
name="Temperature",
device_class=DEVICE_CLASS_TEMPERATURE,
native_unit_of_measurement=TEMP_CELSIUS,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=SENSOR_KIND_VOC,
name="VOC",
device_class=DEVICE_CLASS_VOLATILE_ORGANIC_COMPOUNDS,
native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION,
state_class=STATE_CLASS_MEASUREMENT,
),
)

View File

@@ -32,7 +32,7 @@
},
"node_pro": {
"data": {
"ip_address": "Hoszt",
"ip_address": "C\u00edm",
"password": "Jelsz\u00f3"
},
"description": "Szem\u00e9lyes AirVisual egys\u00e9g figyel\u00e9se. A jelsz\u00f3 lek\u00e9rhet\u0151 a k\u00e9sz\u00fcl\u00e9k felhaszn\u00e1l\u00f3i fel\u00fclet\u00e9r\u0151l.",

View File

@@ -14,7 +14,7 @@
"data": {
"device_baudrate": "Eszk\u00f6z \u00e1tviteli sebess\u00e9ge",
"device_path": "Eszk\u00f6z el\u00e9r\u00e9si \u00fatja",
"host": "Hoszt",
"host": "C\u00edm",
"port": "Port"
},
"title": "Konfigur\u00e1lja a csatlakoz\u00e1si be\u00e1ll\u00edt\u00e1sokat"

View File

@@ -48,6 +48,7 @@ from .const import (
API_THERMOSTAT_MODES,
API_THERMOSTAT_PRESETS,
DATE_FORMAT,
PRESET_MODE_NA,
Inputs,
)
from .errors import UnsupportedProperty
@@ -391,6 +392,8 @@ class AlexaPowerController(AlexaCapability):
if self.entity.domain == climate.DOMAIN:
is_on = self.entity.state != climate.HVAC_MODE_OFF
elif self.entity.domain == fan.DOMAIN:
is_on = self.entity.state == fan.STATE_ON
elif self.entity.domain == vacuum.DOMAIN:
is_on = self.entity.state == vacuum.STATE_CLEANING
elif self.entity.domain == timer.DOMAIN:
@@ -1155,9 +1158,6 @@ class AlexaPowerLevelController(AlexaCapability):
if name != "powerLevel":
raise UnsupportedProperty(name)
if self.entity.domain == fan.DOMAIN:
return self.entity.attributes.get(fan.ATTR_PERCENTAGE) or 0
class AlexaSecurityPanelController(AlexaCapability):
"""Implements Alexa.SecurityPanelController.
@@ -1354,10 +1354,17 @@ class AlexaModeController(AlexaCapability):
self._resource = AlexaModeResource(
[AlexaGlobalCatalog.SETTING_PRESET], False
)
for preset_mode in self.entity.attributes.get(fan.ATTR_PRESET_MODES, []):
preset_modes = self.entity.attributes.get(fan.ATTR_PRESET_MODES, [])
for preset_mode in preset_modes:
self._resource.add_mode(
f"{fan.ATTR_PRESET_MODE}.{preset_mode}", [preset_mode]
)
# Fans with a single preset_mode completely break Alexa discovery, add a
# fake preset (see issue #53832).
if len(preset_modes) == 1:
self._resource.add_mode(
f"{fan.ATTR_PRESET_MODE}.{PRESET_MODE_NA}", [PRESET_MODE_NA]
)
return self._resource.serialize_capability_resources()
# Cover Position Resources
@@ -1491,6 +1498,13 @@ class AlexaRangeController(AlexaCapability):
if self.instance == f"{cover.DOMAIN}.tilt":
return self.entity.attributes.get(cover.ATTR_CURRENT_TILT_POSITION)
# Fan speed percentage
if self.instance == f"{fan.DOMAIN}.{fan.ATTR_PERCENTAGE}":
supported = self.entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
if supported and fan.SUPPORT_SET_SPEED:
return self.entity.attributes.get(fan.ATTR_PERCENTAGE)
return 100 if self.entity.state == fan.STATE_ON else 0
# Input Number Value
if self.instance == f"{input_number.DOMAIN}.{input_number.ATTR_VALUE}":
return float(self.entity.state)
@@ -1517,28 +1531,16 @@ class AlexaRangeController(AlexaCapability):
def capability_resources(self):
"""Return capabilityResources object."""
# Fan Speed Resources
if self.instance == f"{fan.DOMAIN}.{fan.ATTR_SPEED}":
speed_list = self.entity.attributes[fan.ATTR_SPEED_LIST]
max_value = len(speed_list) - 1
# Fan Speed Percentage Resources
if self.instance == f"{fan.DOMAIN}.{fan.ATTR_PERCENTAGE}":
percentage_step = self.entity.attributes.get(fan.ATTR_PERCENTAGE_STEP)
self._resource = AlexaPresetResource(
labels=[AlexaGlobalCatalog.SETTING_FAN_SPEED],
labels=["Percentage", AlexaGlobalCatalog.SETTING_FAN_SPEED],
min_value=0,
max_value=max_value,
precision=1,
max_value=100,
precision=percentage_step if percentage_step else 100,
unit=AlexaGlobalCatalog.UNIT_PERCENT,
)
for index, speed in enumerate(speed_list):
labels = []
if isinstance(speed, str):
labels.append(speed.replace("_", " "))
if index == 1:
labels.append(AlexaGlobalCatalog.VALUE_MINIMUM)
if index == max_value:
labels.append(AlexaGlobalCatalog.VALUE_MAXIMUM)
if len(labels) > 0:
self._resource.add_preset(value=index, labels=labels)
return self._resource.serialize_capability_resources()
# Cover Position Resources
@@ -1651,6 +1653,20 @@ class AlexaRangeController(AlexaCapability):
)
return self._semantics.serialize_semantics()
# Fan Speed Percentage
if self.instance == f"{fan.DOMAIN}.{fan.ATTR_PERCENTAGE}":
lower_labels = [AlexaSemantics.ACTION_LOWER]
raise_labels = [AlexaSemantics.ACTION_RAISE]
self._semantics = AlexaSemantics()
self._semantics.add_action_to_directive(
lower_labels, "SetRangeValue", {"rangeValue": 0}
)
self._semantics.add_action_to_directive(
raise_labels, "SetRangeValue", {"rangeValue": 100}
)
return self._semantics.serialize_semantics()
return None

View File

@@ -78,6 +78,9 @@ API_THERMOSTAT_MODES = OrderedDict(
API_THERMOSTAT_MODES_CUSTOM = {climate.HVAC_MODE_DRY: "DEHUMIDIFY"}
API_THERMOSTAT_PRESETS = {climate.PRESET_ECO: "ECO"}
# AlexaModeController does not like a single mode for the fan preset, we add PRESET_MODE_NA if a fan has only one preset_mode
PRESET_MODE_NA = "-"
class Cause:
"""Possible causes for property changes.

View File

@@ -60,11 +60,9 @@ from .capabilities import (
AlexaLockController,
AlexaModeController,
AlexaMotionSensor,
AlexaPercentageController,
AlexaPlaybackController,
AlexaPlaybackStateReporter,
AlexaPowerController,
AlexaPowerLevelController,
AlexaRangeController,
AlexaSceneController,
AlexaSecurityPanelController,
@@ -530,23 +528,32 @@ class FanCapabilities(AlexaEntity):
def interfaces(self):
"""Yield the supported interfaces."""
yield AlexaPowerController(self.entity)
force_range_controller = True
supported = self.entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
if supported & fan.SUPPORT_SET_SPEED:
yield AlexaPercentageController(self.entity)
yield AlexaPowerLevelController(self.entity)
if supported & fan.SUPPORT_OSCILLATE:
yield AlexaToggleController(
self.entity, instance=f"{fan.DOMAIN}.{fan.ATTR_OSCILLATING}"
)
force_range_controller = False
if supported & fan.SUPPORT_PRESET_MODE:
yield AlexaModeController(
self.entity, instance=f"{fan.DOMAIN}.{fan.ATTR_PRESET_MODE}"
)
force_range_controller = False
if supported & fan.SUPPORT_DIRECTION:
yield AlexaModeController(
self.entity, instance=f"{fan.DOMAIN}.{fan.ATTR_DIRECTION}"
)
force_range_controller = False
# AlexaRangeController controls the Fan Speed Percentage.
# For fans which only support on/off, no controller is added. This makes the
# fan impossible to turn on or off through Alexa, most likely due to a bug in Alexa.
# As a workaround, we add a range controller which can only be set to 0% or 100%.
if force_range_controller or supported & fan.SUPPORT_SET_SPEED:
yield AlexaRangeController(
self.entity, instance=f"{fan.DOMAIN}.{fan.ATTR_PERCENTAGE}"
)
yield AlexaEndpointHealth(self.hass, self.entity)
yield Alexa(self.hass)

View File

@@ -54,6 +54,8 @@ from .const import (
API_THERMOSTAT_MODES,
API_THERMOSTAT_MODES_CUSTOM,
API_THERMOSTAT_PRESETS,
DATE_FORMAT,
PRESET_MODE_NA,
Cause,
Inputs,
)
@@ -122,6 +124,8 @@ async def async_api_turn_on(hass, config, directive, context):
service = SERVICE_TURN_ON
if domain == cover.DOMAIN:
service = cover.SERVICE_OPEN_COVER
elif domain == fan.DOMAIN:
service = fan.SERVICE_TURN_ON
elif domain == vacuum.DOMAIN:
supported = entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
if not supported & vacuum.SUPPORT_TURN_ON and supported & vacuum.SUPPORT_START:
@@ -156,6 +160,8 @@ async def async_api_turn_off(hass, config, directive, context):
service = SERVICE_TURN_OFF
if entity.domain == cover.DOMAIN:
service = cover.SERVICE_CLOSE_COVER
elif domain == fan.DOMAIN:
service = fan.SERVICE_TURN_OFF
elif domain == vacuum.DOMAIN:
supported = entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
if (
@@ -318,7 +324,7 @@ async def async_api_activate(hass, config, directive, context):
payload = {
"cause": {"type": Cause.VOICE_INTERACTION},
"timestamp": f"{dt_util.utcnow().replace(tzinfo=None).isoformat()}Z",
"timestamp": dt_util.utcnow().strftime(DATE_FORMAT),
}
return directive.response(
@@ -342,7 +348,7 @@ async def async_api_deactivate(hass, config, directive, context):
payload = {
"cause": {"type": Cause.VOICE_INTERACTION},
"timestamp": f"{dt_util.utcnow().replace(tzinfo=None).isoformat()}Z",
"timestamp": dt_util.utcnow().strftime(DATE_FORMAT),
}
return directive.response(
@@ -825,48 +831,6 @@ async def async_api_reportstate(hass, config, directive, context):
return directive.response(name="StateReport")
@HANDLERS.register(("Alexa.PowerLevelController", "SetPowerLevel"))
async def async_api_set_power_level(hass, config, directive, context):
"""Process a SetPowerLevel request."""
entity = directive.entity
service = None
data = {ATTR_ENTITY_ID: entity.entity_id}
if entity.domain == fan.DOMAIN:
service = fan.SERVICE_SET_PERCENTAGE
percentage = int(directive.payload["powerLevel"])
data[fan.ATTR_PERCENTAGE] = percentage
await hass.services.async_call(
entity.domain, service, data, blocking=False, context=context
)
return directive.response()
@HANDLERS.register(("Alexa.PowerLevelController", "AdjustPowerLevel"))
async def async_api_adjust_power_level(hass, config, directive, context):
"""Process an AdjustPowerLevel request."""
entity = directive.entity
percentage_delta = int(directive.payload["powerLevelDelta"])
service = None
data = {ATTR_ENTITY_ID: entity.entity_id}
if entity.domain == fan.DOMAIN:
service = fan.SERVICE_SET_PERCENTAGE
current = entity.attributes.get(fan.ATTR_PERCENTAGE) or 0
# set percentage
percentage = min(100, max(0, percentage_delta + current))
data[fan.ATTR_PERCENTAGE] = percentage
await hass.services.async_call(
entity.domain, service, data, blocking=False, context=context
)
return directive.response()
@HANDLERS.register(("Alexa.SecurityPanelController", "Arm"))
async def async_api_arm(hass, config, directive, context):
"""Process a Security Panel Arm request."""
@@ -961,7 +925,9 @@ async def async_api_set_mode(hass, config, directive, context):
# Fan preset_mode
elif instance == f"{fan.DOMAIN}.{fan.ATTR_PRESET_MODE}":
preset_mode = mode.split(".")[1]
if preset_mode in entity.attributes.get(fan.ATTR_PRESET_MODES):
if preset_mode != PRESET_MODE_NA and preset_mode in entity.attributes.get(
fan.ATTR_PRESET_MODES
):
service = fan.SERVICE_SET_PRESET_MODE
data[fan.ATTR_PRESET_MODE] = preset_mode
else:
@@ -1113,6 +1079,19 @@ async def async_api_set_range(hass, config, directive, context):
service = cover.SERVICE_SET_COVER_TILT_POSITION
data[cover.ATTR_TILT_POSITION] = range_value
# Fan Speed
elif instance == f"{fan.DOMAIN}.{fan.ATTR_PERCENTAGE}":
range_value = int(range_value)
if range_value == 0:
service = fan.SERVICE_TURN_OFF
else:
supported = entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
if supported and fan.SUPPORT_SET_SPEED:
service = fan.SERVICE_SET_PERCENTAGE
data[fan.ATTR_PERCENTAGE] = range_value
else:
service = fan.SERVICE_TURN_ON
# Input Number Value
elif instance == f"{input_number.DOMAIN}.{input_number.ATTR_VALUE}":
range_value = float(range_value)
@@ -1200,6 +1179,25 @@ async def async_api_adjust_range(hass, config, directive, context):
else:
data[cover.ATTR_TILT_POSITION] = tilt_position
# Fan speed percentage
elif instance == f"{fan.DOMAIN}.{fan.ATTR_PERCENTAGE}":
percentage_step = entity.attributes.get(fan.ATTR_PERCENTAGE_STEP) or 20
range_delta = (
int(range_delta * percentage_step)
if range_delta_default
else int(range_delta)
)
service = fan.SERVICE_SET_PERCENTAGE
current = entity.attributes.get(fan.ATTR_PERCENTAGE)
if not current:
msg = f"Unable to determine {entity.entity_id} current fan speed"
raise AlexaInvalidValueError(msg)
percentage = response_value = min(100, max(0, range_delta + current))
if percentage:
data[fan.ATTR_PERCENTAGE] = percentage
else:
service = fan.SERVICE_TURN_OFF
# Input Number Value
elif instance == f"{input_number.DOMAIN}.{input_number.ATTR_VALUE}":
range_delta = float(range_delta)

View File

@@ -13,7 +13,7 @@ from homeassistant.core import HomeAssistant, State, callback
from homeassistant.helpers.significant_change import create_checker
import homeassistant.util.dt as dt_util
from .const import API_CHANGE, DOMAIN, Cause
from .const import API_CHANGE, DATE_FORMAT, DOMAIN, Cause
from .entities import ENTITY_ADAPTERS, AlexaEntity, generate_alexa_id
from .messages import AlexaResponse
@@ -252,7 +252,7 @@ async def async_send_doorbell_event_message(hass, config, alexa_entity):
namespace="Alexa.DoorbellEventSource",
payload={
"cause": {"type": Cause.PHYSICAL_INTERACTION},
"timestamp": f"{dt_util.utcnow().replace(tzinfo=None).isoformat()}Z",
"timestamp": dt_util.utcnow().strftime(DATE_FORMAT),
},
)

View File

@@ -2,14 +2,14 @@
"config": {
"abort": {
"cannot_connect": "Sikertelen csatlakoz\u00e1s",
"missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rlek, k\u00f6vesd a dokument\u00e1ci\u00f3t.",
"missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t.",
"no_url_available": "Nincs el\u00e9rhet\u0151 URL. A hib\u00e1r\u00f3l tov\u00e1bbi inform\u00e1ci\u00f3t [a s\u00fag\u00f3ban]({docs_url}) tal\u00e1lsz.",
"single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges."
},
"step": {
"hassio_confirm": {
"description": "Be szeretn\u00e9 \u00e1ll\u00edtani a Home Assistant alkalmaz\u00e1st az Almondhoz val\u00f3 csatlakoz\u00e1shoz, amelyet a Supervisor kieg\u00e9sz\u00edt\u0151 biztos\u00edt: {addon} ?",
"title": "Almond a Supervisor kieg\u00e9sz\u00edt\u0151n kereszt\u00fcl"
"description": "Szeretn\u00e9 be\u00e1ll\u00edtani Home Assistantot Almondhoz val\u00f3 csatlakoz\u00e1shoz, {addon} kieg\u00e9sz\u00edt\u0151 \u00e1ltal?",
"title": "Almond - Home Assistant kieg\u00e9sz\u00edt\u0151 \u00e1ltal"
},
"pick_implementation": {
"title": "V\u00e1lassz hiteles\u00edt\u00e9si m\u00f3dszert"

View File

@@ -8,7 +8,7 @@
},
"step": {
"hassio_confirm": {
"description": "Ingin mengonfigurasi Home Assistant untuk terhubung ke Almond yang disediakan oleh add-on Supervisor {addon}?",
"description": "Ingin mengonfigurasi Home Assistant untuk terhubung ke Almond yang disediakan oleh add-on: {addon}?",
"title": "Almond melalui add-on Home Assistant"
},
"pick_implementation": {

View File

@@ -1,12 +1,26 @@
{
"config": {
"abort": {
"reauth_successful": "La reautenticaci\u00f3n se realiz\u00f3 correctamente"
},
"error": {
"cannot_connect": "No se pudo conectar",
"invalid_api_key": "Clave API no v\u00e1lida"
},
"step": {
"reauth_confirm": {
"data": {
"api_key": "Clave API",
"description": "Vuelva a autenticarse con su cuenta de Ambee."
}
},
"user": {
"data": {
"api_key": "Clave API",
"latitude": "Latitud",
"longitude": "Longitud",
"name": "Nombre"
},
"description": "Configure Ambee para que se integre con Home Assistant."
}
}

View File

@@ -21,7 +21,7 @@
"longitude": "Hossz\u00fas\u00e1g",
"name": "N\u00e9v"
},
"description": "\u00c1ll\u00edtsa be az Ambee-t a Homeassistanttal val\u00f3 integr\u00e1ci\u00f3hoz."
"description": "Integr\u00e1lja \u00f6ssze Ambeet Home Assistanttal."
}
}
}

View File

@@ -10,7 +10,8 @@
"step": {
"reauth_confirm": {
"data": {
"api_key": "Kunci API"
"api_key": "Kunci API",
"description": "Autentikasi ulang dengan akun Ambee Anda."
}
},
"user": {
@@ -19,7 +20,8 @@
"latitude": "Lintang",
"longitude": "Bujur",
"name": "Nama"
}
},
"description": "Siapkan Ambee Anda untuk diintegrasikan dengan Home Assistant."
}
}
}

View File

@@ -0,0 +1,9 @@
{
"state": {
"ambee__risk": {
"high": "Tinggi",
"low": "Rendah",
"moderate": "Sedang"
}
}
}

View File

@@ -0,0 +1,32 @@
"""Support for Amber Electric."""
from amberelectric import Configuration
from amberelectric.api import amber_api
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from .const import CONF_API_TOKEN, CONF_SITE_ID, DOMAIN, PLATFORMS
from .coordinator import AmberUpdateCoordinator
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up Amber Electric from a config entry."""
configuration = Configuration(access_token=entry.data[CONF_API_TOKEN])
api_instance = amber_api.AmberApi.create(configuration)
site_id = entry.data[CONF_SITE_ID]
coordinator = AmberUpdateCoordinator(hass, api_instance, site_id)
await coordinator.async_config_entry_first_refresh()
hass.data.setdefault(DOMAIN, {})[entry.entry_id] = coordinator
hass.config_entries.async_setup_platforms(entry, PLATFORMS)
return True
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Unload a config entry."""
unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
if unload_ok:
hass.data[DOMAIN].pop(entry.entry_id)
return unload_ok

View File

@@ -0,0 +1,88 @@
"""Amber Electric Binary Sensor definitions."""
from __future__ import annotations
from collections.abc import Mapping
from typing import Any
from homeassistant.components.binary_sensor import (
BinarySensorEntity,
BinarySensorEntityDescription,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ATTR_ATTRIBUTION
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import ATTRIBUTION, DOMAIN
from .coordinator import AmberUpdateCoordinator
PRICE_SPIKE_ICONS = {
"none": "mdi:power-plug",
"potential": "mdi:power-plug-outline",
"spike": "mdi:power-plug-off",
}
class AmberPriceGridSensor(CoordinatorEntity, BinarySensorEntity):
"""Sensor to show single grid binary values."""
def __init__(
self,
coordinator: AmberUpdateCoordinator,
description: BinarySensorEntityDescription,
) -> None:
"""Initialize the Sensor."""
super().__init__(coordinator)
self.site_id = coordinator.site_id
self.entity_description = description
self._attr_unique_id = f"{coordinator.site_id}-{description.key}"
self._attr_device_state_attributes = {ATTR_ATTRIBUTION: ATTRIBUTION}
@property
def is_on(self) -> bool | None:
"""Return true if the binary sensor is on."""
return self.coordinator.data["grid"][self.entity_description.key]
class AmberPriceSpikeBinarySensor(AmberPriceGridSensor):
"""Sensor to show single grid binary values."""
@property
def icon(self):
"""Return the sensor icon."""
status = self.coordinator.data["grid"]["price_spike"]
return PRICE_SPIKE_ICONS[status]
@property
def is_on(self) -> bool | None:
"""Return true if the binary sensor is on."""
return self.coordinator.data["grid"]["price_spike"] == "spike"
@property
def device_state_attributes(self) -> Mapping[str, Any] | None:
"""Return additional pieces of information about the price spike."""
spike_status = self.coordinator.data["grid"]["price_spike"]
return {
"spike_status": spike_status,
ATTR_ATTRIBUTION: ATTRIBUTION,
}
async def async_setup_entry(
hass: HomeAssistant,
entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up a config entry."""
coordinator: AmberUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
entities: list = []
price_spike_description = BinarySensorEntityDescription(
key="price_spike",
name=f"{entry.title} - Price Spike",
)
entities.append(AmberPriceSpikeBinarySensor(coordinator, price_spike_description))
async_add_entities(entities)

View File

@@ -0,0 +1,120 @@
"""Config flow for the Amber Electric integration."""
from __future__ import annotations
from typing import Any
import amberelectric
from amberelectric.api import amber_api
from amberelectric.model.site import Site
import voluptuous as vol
from homeassistant import config_entries
from homeassistant.const import CONF_API_TOKEN
from .const import CONF_SITE_ID, CONF_SITE_NAME, CONF_SITE_NMI, DOMAIN
API_URL = "https://app.amber.com.au/developers"
class AmberElectricConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
"""Handle a config flow."""
VERSION = 1
def __init__(self) -> None:
"""Initialize the config flow."""
self._errors: dict[str, str] = {}
self._sites: list[Site] | None = None
self._api_token: str | None = None
def _fetch_sites(self, token: str) -> list[Site] | None:
configuration = amberelectric.Configuration(access_token=token)
api = amber_api.AmberApi.create(configuration)
try:
sites = api.get_sites()
if len(sites) == 0:
self._errors[CONF_API_TOKEN] = "no_site"
return None
return sites
except amberelectric.ApiException as api_exception:
if api_exception.status == 403:
self._errors[CONF_API_TOKEN] = "invalid_api_token"
else:
self._errors[CONF_API_TOKEN] = "unknown_error"
return None
async def async_step_user(self, user_input: dict[str, Any] | None = None):
"""Step when user initializes a integration."""
self._errors = {}
self._sites = None
self._api_token = None
if user_input is not None:
token = user_input[CONF_API_TOKEN]
self._sites = await self.hass.async_add_executor_job(
self._fetch_sites, token
)
if self._sites is not None:
self._api_token = token
return await self.async_step_site()
else:
user_input = {CONF_API_TOKEN: ""}
return self.async_show_form(
step_id="user",
description_placeholders={"api_url": API_URL},
data_schema=vol.Schema(
{
vol.Required(
CONF_API_TOKEN, default=user_input[CONF_API_TOKEN]
): str,
}
),
errors=self._errors,
)
async def async_step_site(self, user_input: dict[str, Any] = None):
"""Step to select site."""
self._errors = {}
assert self._sites is not None
api_token = self._api_token
if user_input is not None:
site_nmi = user_input[CONF_SITE_NMI]
sites = [site for site in self._sites if site.nmi == site_nmi]
site = sites[0]
site_id = site.id
name = user_input.get(CONF_SITE_NAME, site_id)
return self.async_create_entry(
title=name,
data={
CONF_SITE_ID: site_id,
CONF_API_TOKEN: api_token,
CONF_SITE_NMI: site.nmi,
},
)
user_input = {
CONF_API_TOKEN: api_token,
CONF_SITE_NMI: "",
CONF_SITE_NAME: "",
}
return self.async_show_form(
step_id="site",
data_schema=vol.Schema(
{
vol.Required(
CONF_SITE_NMI, default=user_input[CONF_SITE_NMI]
): vol.In([site.nmi for site in self._sites]),
vol.Optional(
CONF_SITE_NAME, default=user_input[CONF_SITE_NAME]
): str,
}
),
errors=self._errors,
)

View File

@@ -0,0 +1,13 @@
"""Amber Electric Constants."""
import logging
DOMAIN = "amberelectric"
CONF_API_TOKEN = "api_token"
CONF_SITE_NAME = "site_name"
CONF_SITE_ID = "site_id"
CONF_SITE_NMI = "site_nmi"
ATTRIBUTION = "Data provided by Amber Electric"
LOGGER = logging.getLogger(__package__)
PLATFORMS = ["sensor", "binary_sensor"]

View File

@@ -0,0 +1,111 @@
"""Amber Electric Coordinator."""
from __future__ import annotations
from datetime import timedelta
from typing import Any
from amberelectric import ApiException
from amberelectric.api import amber_api
from amberelectric.model.actual_interval import ActualInterval
from amberelectric.model.channel import ChannelType
from amberelectric.model.current_interval import CurrentInterval
from amberelectric.model.forecast_interval import ForecastInterval
from homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import LOGGER
def is_current(interval: ActualInterval | CurrentInterval | ForecastInterval) -> bool:
"""Return true if the supplied interval is a CurrentInterval."""
return isinstance(interval, CurrentInterval)
def is_forecast(interval: ActualInterval | CurrentInterval | ForecastInterval) -> bool:
"""Return true if the supplied interval is a ForecastInterval."""
return isinstance(interval, ForecastInterval)
def is_general(interval: ActualInterval | CurrentInterval | ForecastInterval) -> bool:
"""Return true if the supplied interval is on the general channel."""
return interval.channel_type == ChannelType.GENERAL
def is_controlled_load(
interval: ActualInterval | CurrentInterval | ForecastInterval,
) -> bool:
"""Return true if the supplied interval is on the controlled load channel."""
return interval.channel_type == ChannelType.CONTROLLED_LOAD
def is_feed_in(interval: ActualInterval | CurrentInterval | ForecastInterval) -> bool:
"""Return true if the supplied interval is on the feed in channel."""
return interval.channel_type == ChannelType.FEED_IN
class AmberUpdateCoordinator(DataUpdateCoordinator):
"""AmberUpdateCoordinator - In charge of downloading the data for a site, which all the sensors read."""
def __init__(
self, hass: HomeAssistant, api: amber_api.AmberApi, site_id: str
) -> None:
"""Initialise the data service."""
super().__init__(
hass,
LOGGER,
name="amberelectric",
update_interval=timedelta(minutes=1),
)
self._api = api
self.site_id = site_id
def update_price_data(self) -> dict[str, dict[str, Any]]:
"""Update callback."""
result: dict[str, dict[str, Any]] = {
"current": {},
"forecasts": {},
"grid": {},
}
try:
data = self._api.get_current_price(self.site_id, next=48)
except ApiException as api_exception:
raise UpdateFailed("Missing price data, skipping update") from api_exception
current = [interval for interval in data if is_current(interval)]
forecasts = [interval for interval in data if is_forecast(interval)]
general = [interval for interval in current if is_general(interval)]
if len(general) == 0:
raise UpdateFailed("No general channel configured")
result["current"]["general"] = general[0]
result["forecasts"]["general"] = [
interval for interval in forecasts if is_general(interval)
]
result["grid"]["renewables"] = round(general[0].renewables)
result["grid"]["price_spike"] = general[0].spike_status.value
controlled_load = [
interval for interval in current if is_controlled_load(interval)
]
if controlled_load:
result["current"]["controlled_load"] = controlled_load[0]
result["forecasts"]["controlled_load"] = [
interval for interval in forecasts if is_controlled_load(interval)
]
feed_in = [interval for interval in current if is_feed_in(interval)]
if feed_in:
result["current"]["feed_in"] = feed_in[0]
result["forecasts"]["feed_in"] = [
interval for interval in forecasts if is_feed_in(interval)
]
LOGGER.debug("Fetched new Amber data: %s", data)
return result
async def _async_update_data(self) -> dict[str, Any]:
"""Async update wrapper."""
return await self.hass.async_add_executor_job(self.update_price_data)

View File

@@ -0,0 +1,13 @@
{
"domain": "amberelectric",
"name": "Amber Electric",
"documentation": "https://www.home-assistant.io/integrations/amberelectric",
"config_flow": true,
"codeowners": [
"@madpilot"
],
"requirements": [
"amberelectric==1.0.3"
],
"iot_class": "cloud_polling"
}

View File

@@ -0,0 +1,234 @@
"""Amber Electric Sensor definitions."""
# There are three types of sensor: Current, Forecast and Grid
# Current and forecast will create general, controlled load and feed in as required
# At the moment renewables in the only grid sensor.
from __future__ import annotations
from collections.abc import Mapping
from typing import Any
from amberelectric.model.channel import ChannelType
from amberelectric.model.current_interval import CurrentInterval
from amberelectric.model.forecast_interval import ForecastInterval
from homeassistant.components.sensor import (
STATE_CLASS_MEASUREMENT,
SensorEntity,
SensorEntityDescription,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ATTR_ATTRIBUTION, CURRENCY_DOLLAR, ENERGY_KILO_WATT_HOUR
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import ATTRIBUTION, DOMAIN
from .coordinator import AmberUpdateCoordinator
ICONS = {
"general": "mdi:transmission-tower",
"controlled_load": "mdi:clock-outline",
"feed_in": "mdi:solar-power",
}
UNIT = f"{CURRENCY_DOLLAR}/{ENERGY_KILO_WATT_HOUR}"
def format_cents_to_dollars(cents: float) -> float:
"""Return a formatted conversion from cents to dollars."""
return round(cents / 100, 2)
def friendly_channel_type(channel_type: str) -> str:
"""Return a human readable version of the channel type."""
if channel_type == "controlled_load":
return "Controlled Load"
if channel_type == "feed_in":
return "Feed In"
return "General"
class AmberSensor(CoordinatorEntity, SensorEntity):
"""Amber Base Sensor."""
def __init__(
self,
coordinator: AmberUpdateCoordinator,
description: SensorEntityDescription,
channel_type: ChannelType,
) -> None:
"""Initialize the Sensor."""
super().__init__(coordinator)
self.site_id = coordinator.site_id
self.entity_description = description
self.channel_type = channel_type
self._attr_unique_id = (
f"{self.site_id}-{self.entity_description.key}-{self.channel_type}"
)
class AmberPriceSensor(AmberSensor):
"""Amber Price Sensor."""
@property
def native_value(self) -> float | None:
"""Return the current price in $/kWh."""
interval = self.coordinator.data[self.entity_description.key][self.channel_type]
if interval.channel_type == ChannelType.FEED_IN:
return format_cents_to_dollars(interval.per_kwh) * -1
return format_cents_to_dollars(interval.per_kwh)
@property
def device_state_attributes(self) -> Mapping[str, Any] | None:
"""Return additional pieces of information about the price."""
interval = self.coordinator.data[self.entity_description.key][self.channel_type]
data: dict[str, Any] = {ATTR_ATTRIBUTION: ATTRIBUTION}
if interval is None:
return data
data["duration"] = interval.duration
data["date"] = interval.date.isoformat()
data["per_kwh"] = format_cents_to_dollars(interval.per_kwh)
if interval.channel_type == ChannelType.FEED_IN:
data["per_kwh"] = data["per_kwh"] * -1
data["nem_date"] = interval.nem_time.isoformat()
data["spot_per_kwh"] = format_cents_to_dollars(interval.spot_per_kwh)
data["start_time"] = interval.start_time.isoformat()
data["end_time"] = interval.end_time.isoformat()
data["renewables"] = round(interval.renewables)
data["estimate"] = interval.estimate
data["spike_status"] = interval.spike_status.value
data["channel_type"] = interval.channel_type.value
if interval.range is not None:
data["range_min"] = format_cents_to_dollars(interval.range.min)
data["range_max"] = format_cents_to_dollars(interval.range.max)
return data
class AmberForecastSensor(AmberSensor):
"""Amber Forecast Sensor."""
@property
def native_value(self) -> float | None:
"""Return the first forecast price in $/kWh."""
intervals = self.coordinator.data[self.entity_description.key].get(
self.channel_type
)
if not intervals:
return None
interval = intervals[0]
if interval.channel_type == ChannelType.FEED_IN:
return format_cents_to_dollars(interval.per_kwh) * -1
return format_cents_to_dollars(interval.per_kwh)
@property
def device_state_attributes(self) -> Mapping[str, Any] | None:
"""Return additional pieces of information about the price."""
intervals = self.coordinator.data[self.entity_description.key].get(
self.channel_type
)
if not intervals:
return None
data = {
"forecasts": [],
"channel_type": intervals[0].channel_type.value,
ATTR_ATTRIBUTION: ATTRIBUTION,
}
for interval in intervals:
datum = {}
datum["duration"] = interval.duration
datum["date"] = interval.date.isoformat()
datum["nem_date"] = interval.nem_time.isoformat()
datum["per_kwh"] = format_cents_to_dollars(interval.per_kwh)
if interval.channel_type == ChannelType.FEED_IN:
datum["per_kwh"] = datum["per_kwh"] * -1
datum["spot_per_kwh"] = format_cents_to_dollars(interval.spot_per_kwh)
datum["start_time"] = interval.start_time.isoformat()
datum["end_time"] = interval.end_time.isoformat()
datum["renewables"] = round(interval.renewables)
datum["spike_status"] = interval.spike_status.value
if interval.range is not None:
datum["range_min"] = format_cents_to_dollars(interval.range.min)
datum["range_max"] = format_cents_to_dollars(interval.range.max)
data["forecasts"].append(datum)
return data
class AmberGridSensor(CoordinatorEntity, SensorEntity):
"""Sensor to show single grid specific values."""
def __init__(
self,
coordinator: AmberUpdateCoordinator,
description: SensorEntityDescription,
) -> None:
"""Initialize the Sensor."""
super().__init__(coordinator)
self.site_id = coordinator.site_id
self.entity_description = description
self._attr_device_state_attributes = {ATTR_ATTRIBUTION: ATTRIBUTION}
self._attr_unique_id = f"{coordinator.site_id}-{description.key}"
@property
def native_value(self) -> str | None:
"""Return the value of the sensor."""
return self.coordinator.data["grid"][self.entity_description.key]
async def async_setup_entry(
hass: HomeAssistant,
entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up a config entry."""
coordinator: AmberUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
current: dict[str, CurrentInterval] = coordinator.data["current"]
forecasts: dict[str, list[ForecastInterval]] = coordinator.data["forecasts"]
entities: list = []
for channel_type in current:
description = SensorEntityDescription(
key="current",
name=f"{entry.title} - {friendly_channel_type(channel_type)} Price",
native_unit_of_measurement=UNIT,
state_class=STATE_CLASS_MEASUREMENT,
icon=ICONS[channel_type],
)
entities.append(AmberPriceSensor(coordinator, description, channel_type))
for channel_type in forecasts:
description = SensorEntityDescription(
key="forecasts",
name=f"{entry.title} - {friendly_channel_type(channel_type)} Forecast",
native_unit_of_measurement=UNIT,
state_class=STATE_CLASS_MEASUREMENT,
icon=ICONS[channel_type],
)
entities.append(AmberForecastSensor(coordinator, description, channel_type))
renewables_description = SensorEntityDescription(
key="renewables",
name=f"{entry.title} - Renewables",
native_unit_of_measurement="%",
state_class=STATE_CLASS_MEASUREMENT,
icon="mdi:solar-power",
)
entities.append(AmberGridSensor(coordinator, renewables_description))
async_add_entities(entities)

View File

@@ -0,0 +1,22 @@
{
"config": {
"step": {
"user": {
"data": {
"api_token": "API Token",
"site_id": "Site ID"
},
"title": "Amber Electric",
"description": "Go to {api_url} to generate an API key"
},
"site": {
"data": {
"site_nmi": "Site NMI",
"site_name": "Site Name"
},
"title": "Amber Electric",
"description": "Select the NMI of the site you would like to add"
}
}
}
}

View File

@@ -0,0 +1,22 @@
{
"config": {
"step": {
"site": {
"data": {
"site_name": "Nom del lloc",
"site_nmi": "NMI del lloc"
},
"description": "Selecciona l'NMI del lloc que vulguis afegir",
"title": "Amber Electric"
},
"user": {
"data": {
"api_token": "Token d'API",
"site_id": "ID del lloc"
},
"description": "Ves a {api_url} per generar una clau API",
"title": "Amber Electric"
}
}
}
}

View File

@@ -0,0 +1,22 @@
{
"config": {
"step": {
"site": {
"data": {
"site_name": "Name des Standorts",
"site_nmi": "Standort NMI"
},
"description": "W\u00e4hle die NMI des Standorts, den du hinzuf\u00fcgen m\u00f6chtest",
"title": "Amber Electric"
},
"user": {
"data": {
"api_token": "API-Token",
"site_id": "Site-ID"
},
"description": "Gehe zu {api_url}, um einen API-Schl\u00fcssel zu generieren",
"title": "Amber Electric"
}
}
}
}

View File

@@ -0,0 +1,22 @@
{
"config": {
"step": {
"site": {
"data": {
"site_name": "Site Name",
"site_nmi": "Site NMI"
},
"description": "Select the NMI of the site you would like to add",
"title": "Amber Electric"
},
"user": {
"data": {
"api_token": "API Token",
"site_id": "Site ID"
},
"description": "Go to {api_url} to generate an API key",
"title": "Amber Electric"
}
}
}
}

View File

@@ -0,0 +1,22 @@
{
"config": {
"step": {
"site": {
"data": {
"site_name": "Saidi nimi",
"site_nmi": "Saidi NMI"
},
"description": "Vali lisatava saidi NMI",
"title": "Amber Electric"
},
"user": {
"data": {
"api_token": "API v\u00f5ti",
"site_id": "Saidi ID"
},
"description": "API-v\u00f5tme saamiseks ava {api_url}.",
"title": "Amber Electric"
}
}
}
}

View File

@@ -0,0 +1,22 @@
{
"config": {
"step": {
"site": {
"data": {
"site_name": "Hely neve",
"site_nmi": "Hely NMI"
},
"description": "V\u00e1lassza ki a hozz\u00e1adni k\u00edv\u00e1nt hely NMI-j\u00e9t.",
"title": "Amber Electric"
},
"user": {
"data": {
"api_token": "API Token",
"site_id": "Hely ID"
},
"description": "API-kulcs gener\u00e1l\u00e1s\u00e1hoz l\u00e1togasson el ide: {api_url}",
"title": "Amber Electric"
}
}
}
}

View File

@@ -0,0 +1,22 @@
{
"config": {
"step": {
"site": {
"data": {
"site_name": "Nome del sito",
"site_nmi": "Sito NMI"
},
"description": "Seleziona l'NMI del sito che desideri aggiungere",
"title": "Amber Electric"
},
"user": {
"data": {
"api_token": "Token API",
"site_id": "ID sito"
},
"description": "Vai su {api_url} per generare una chiave API",
"title": "Amber Electric"
}
}
}
}

View File

@@ -0,0 +1,22 @@
{
"config": {
"step": {
"site": {
"data": {
"site_name": "Sitenaam",
"site_nmi": "Site NMI"
},
"description": "Selecteer de NMI van de site die u wilt toevoegen",
"title": "Amber Electric"
},
"user": {
"data": {
"api_token": "API Token",
"site_id": "Site ID"
},
"description": "Ga naar {api_url} om een API sleutel aan te maken",
"title": "Amber Electric"
}
}
}
}

View File

@@ -0,0 +1,22 @@
{
"config": {
"step": {
"site": {
"data": {
"site_name": "Side navn",
"site_nmi": "Nettsted NMI"
},
"description": "Velg NMI for nettstedet du vil legge til",
"title": "Amber Electric"
},
"user": {
"data": {
"api_token": "API-token",
"site_id": "Nettsted -ID"
},
"description": "G\u00e5 til {api_url} \u00e5 generere en API -n\u00f8kkel",
"title": "Amber Electric"
}
}
}
}

View File

@@ -0,0 +1,22 @@
{
"config": {
"step": {
"site": {
"data": {
"site_name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0430",
"site_nmi": "NMI \u0443\u0447\u0430\u0441\u0442\u043a\u0430"
},
"description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 NMI \u0443\u0447\u0430\u0441\u0442\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c",
"title": "Amber Electric"
},
"user": {
"data": {
"api_token": "\u0422\u043e\u043a\u0435\u043d API",
"site_id": "ID \u0443\u0447\u0430\u0441\u0442\u043a\u0430"
},
"description": "\u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 {api_url} \u0447\u0442\u043e\u0431\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447 API.",
"title": "Amber Electric"
}
}
}
}

View File

@@ -0,0 +1,22 @@
{
"config": {
"step": {
"site": {
"data": {
"site_name": "\u4f4d\u5740\u540d\u7a31",
"site_nmi": "\u4f4d\u5740 NMI"
},
"description": "\u9078\u64c7\u6240\u8981\u65b0\u589e\u7684\u4f4d\u5740 NMI",
"title": "Amber Electric"
},
"user": {
"data": {
"api_token": "API \u6b0a\u6756",
"site_id": "\u4f4d\u5740 ID"
},
"description": "\u9023\u7dda\u81f3 {api_url} \u4ee5\u7522\u751f API \u5bc6\u9470",
"title": "Amber Electric"
}
}
}
}

View File

@@ -142,6 +142,7 @@ class AmbiclimateAuthCallbackView(HomeAssistantView):
async def get(self, request: web.Request) -> str:
"""Receive authorization token."""
# pylint: disable=no-self-use
code = request.query.get("code")
if code is None:
return "No code"

View File

@@ -2,7 +2,7 @@
"config": {
"abort": {
"access_token": "S'ha produ\u00eft un error desconegut al generat un token d'acc\u00e9s.",
"already_configured": "El compte ja ha estat configurat",
"already_configured": "El compte ja est\u00e0 configurat",
"missing_configuration": "El component no est\u00e0 configurat. Mira'n la documentaci\u00f3."
},
"create_entry": {

View File

@@ -3,18 +3,18 @@
"abort": {
"access_token": "Ismeretlen hiba a hozz\u00e1f\u00e9r\u00e9si token gener\u00e1l\u00e1s\u00e1ban.",
"already_configured": "A fi\u00f3k m\u00e1r konfigur\u00e1lva van",
"missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rlek, k\u00f6vesd a dokument\u00e1ci\u00f3t."
"missing_configuration": "A komponens nincs konfigur\u00e1lva. K\u00e9rem, k\u00f6vesse a dokument\u00e1ci\u00f3t."
},
"create_entry": {
"default": "Sikeres hiteles\u00edt\u00e9s"
},
"error": {
"follow_link": "K\u00e9rlek, k\u00f6vesd a hivatkoz\u00e1st \u00e9s hiteles\u00edtsd magad miel\u0151tt megnyomod a K\u00fcld\u00e9s gombot",
"follow_link": "K\u00e9rem, k\u00f6vesse a hivatkoz\u00e1st \u00e9s hiteles\u00edtse mag\u00e1t miel\u0151tt megnyomn\u00e1 a K\u00fcld\u00e9s gombot",
"no_token": "Nem hiteles\u00edtett Ambiclimate"
},
"step": {
"auth": {
"description": "K\u00e9rj\u00fck, k\u00f6vesse ezt a [link] ({authorization_url} Author_url}) \u00e9s ** Enged\u00e9lyezze ** a hozz\u00e1f\u00e9r\u00e9st Ambiclimate -fi\u00f3kj\u00e1hoz, majd t\u00e9rjen vissza, \u00e9s nyomja meg az al\u00e1bbi ** K\u00fcld\u00e9s ** gombot.\n (Gy\u0151z\u0151dj\u00f6n meg arr\u00f3l, hogy a megadott visszah\u00edv\u00e1si URL {cb_url})",
"description": "K\u00e9rj\u00fck, k\u00f6vesse ezt a [link]({authorization_url}}) \u00e9s ** Enged\u00e9lyezze ** a hozz\u00e1f\u00e9r\u00e9st Ambiclimate -fi\u00f3kj\u00e1hoz, majd t\u00e9rjen vissza, \u00e9s nyomja meg az al\u00e1bbi ** K\u00fcld\u00e9s ** gombot.\n(Gy\u0151z\u0151dj\u00f6n meg arr\u00f3l, hogy a megadott visszah\u00edv\u00e1si URL {cb_url})",
"title": "Ambiclimate hiteles\u00edt\u00e9se"
}
}

View File

@@ -178,9 +178,7 @@ class AmbientStation:
def on_subscribed(data: dict) -> None:
"""Define a handler to fire when the subscription is set."""
for station in data["devices"]:
mac = station["macAddress"]
if mac in self.stations:
if (mac := station["macAddress"]) in self.stations:
continue
LOGGER.debug("New station subscription: %s", data)
@@ -226,7 +224,7 @@ class AmbientWeatherEntity(Entity):
station_name: str,
description: EntityDescription,
) -> None:
"""Initialize the sensor."""
"""Initialize the entity."""
self._ambient = ambient
self._attr_device_info = {
"identifiers": {(DOMAIN, mac_address)},

View File

@@ -1,7 +1,12 @@
"""Support for Ambient Weather Station sensors."""
from __future__ import annotations
from homeassistant.components.sensor import SensorEntity, SensorEntityDescription
from homeassistant.components.sensor import (
STATE_CLASS_MEASUREMENT,
STATE_CLASS_TOTAL_INCREASING,
SensorEntity,
SensorEntityDescription,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
ATTR_NAME,
@@ -25,9 +30,15 @@ from homeassistant.const import (
TEMP_FAHRENHEIT,
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity import EntityDescription
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import TYPE_SOLARRADIATION, TYPE_SOLARRADIATION_LX, AmbientWeatherEntity
from . import (
TYPE_SOLARRADIATION,
TYPE_SOLARRADIATION_LX,
AmbientStation,
AmbientWeatherEntity,
)
from .const import ATTR_LAST_DATA, DATA_CLIENT, DOMAIN
TYPE_24HOURRAININ = "24hourrainin"
@@ -109,54 +120,63 @@ SENSOR_DESCRIPTIONS = (
name="24 Hr Rain",
icon="mdi:water",
native_unit_of_measurement=PRECIPITATION_INCHES,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
SensorEntityDescription(
key=TYPE_BAROMABSIN,
name="Abs Pressure",
native_unit_of_measurement=PRESSURE_INHG,
device_class=DEVICE_CLASS_PRESSURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_BAROMRELIN,
name="Rel Pressure",
native_unit_of_measurement=PRESSURE_INHG,
device_class=DEVICE_CLASS_PRESSURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_CO2,
name="co2",
native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION,
device_class=DEVICE_CLASS_CO2,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_DAILYRAININ,
name="Daily Rain",
icon="mdi:water",
native_unit_of_measurement=PRECIPITATION_INCHES,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
SensorEntityDescription(
key=TYPE_DEWPOINT,
name="Dew Point",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_EVENTRAININ,
name="Event Rain",
icon="mdi:water",
native_unit_of_measurement=PRECIPITATION_INCHES,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_FEELSLIKE,
name="Feels Like",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_HOURLYRAININ,
name="Hourly Rain Rate",
icon="mdi:water",
native_unit_of_measurement=PRECIPITATION_INCHES_PER_HOUR,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
SensorEntityDescription(
key=TYPE_HUMIDITY10,
@@ -241,12 +261,14 @@ SENSOR_DESCRIPTIONS = (
name="Max Gust",
icon="mdi:weather-windy",
native_unit_of_measurement=SPEED_MILES_PER_HOUR,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_MONTHLYRAININ,
name="Monthly Rain",
icon="mdi:water",
native_unit_of_measurement=PRECIPITATION_INCHES,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_PM25_24H,
@@ -259,6 +281,7 @@ SENSOR_DESCRIPTIONS = (
name="PM25 Indoor",
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
device_class=DEVICE_CLASS_PM25,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_PM25_IN_24H,
@@ -271,6 +294,7 @@ SENSOR_DESCRIPTIONS = (
name="PM25",
native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
device_class=DEVICE_CLASS_PM25,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_SOILHUM10,
@@ -337,162 +361,189 @@ SENSOR_DESCRIPTIONS = (
name="Soil Temp 10",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_SOILTEMP1F,
name="Soil Temp 1",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_SOILTEMP2F,
name="Soil Temp 2",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_SOILTEMP3F,
name="Soil Temp 3",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_SOILTEMP4F,
name="Soil Temp 4",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_SOILTEMP5F,
name="Soil Temp 5",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_SOILTEMP6F,
name="Soil Temp 6",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_SOILTEMP7F,
name="Soil Temp 7",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_SOILTEMP8F,
name="Soil Temp 8",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_SOILTEMP9F,
name="Soil Temp 9",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_SOLARRADIATION,
name="Solar Rad",
native_unit_of_measurement=IRRADIATION_WATTS_PER_SQUARE_METER,
device_class=DEVICE_CLASS_ILLUMINANCE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_SOLARRADIATION_LX,
name="Solar Rad (lx)",
name="Solar Rad",
native_unit_of_measurement=LIGHT_LUX,
device_class=DEVICE_CLASS_ILLUMINANCE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_TEMP10F,
name="Temp 10",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_TEMP1F,
name="Temp 1",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_TEMP2F,
name="Temp 2",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_TEMP3F,
name="Temp 3",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_TEMP4F,
name="Temp 4",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_TEMP5F,
name="Temp 5",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_TEMP6F,
name="Temp 6",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_TEMP7F,
name="Temp 7",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_TEMP8F,
name="Temp 8",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_TEMP9F,
name="Temp 9",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_TEMPF,
name="Temp",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_TEMPINF,
name="Inside Temp",
native_unit_of_measurement=TEMP_FAHRENHEIT,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_TOTALRAININ,
name="Lifetime Rain",
icon="mdi:water",
native_unit_of_measurement=PRECIPITATION_INCHES,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_UV,
name="UV Index",
native_unit_of_measurement="Index",
device_class=DEVICE_CLASS_ILLUMINANCE,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_WEEKLYRAININ,
name="Weekly Rain",
icon="mdi:water",
native_unit_of_measurement=PRECIPITATION_INCHES,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_WINDDIR,
@@ -510,7 +561,7 @@ SENSOR_DESCRIPTIONS = (
key=TYPE_WINDDIR_AVG2M,
name="Wind Dir Avg 2m",
icon="mdi:weather-windy",
native_unit_of_measurement=SPEED_MILES_PER_HOUR,
native_unit_of_measurement=DEGREE,
),
SensorEntityDescription(
key=TYPE_WINDGUSTDIR,
@@ -523,6 +574,7 @@ SENSOR_DESCRIPTIONS = (
name="Wind Gust",
icon="mdi:weather-windy",
native_unit_of_measurement=SPEED_MILES_PER_HOUR,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_WINDSPDMPH_AVG10M,
@@ -541,12 +593,14 @@ SENSOR_DESCRIPTIONS = (
name="Wind Speed",
icon="mdi:weather-windy",
native_unit_of_measurement=SPEED_MILES_PER_HOUR,
state_class=STATE_CLASS_MEASUREMENT,
),
SensorEntityDescription(
key=TYPE_YEARLYRAININ,
name="Yearly Rain",
icon="mdi:water",
native_unit_of_measurement=PRECIPITATION_INCHES,
state_class=STATE_CLASS_TOTAL_INCREASING,
),
)
@@ -570,6 +624,22 @@ async def async_setup_entry(
class AmbientWeatherSensor(AmbientWeatherEntity, SensorEntity):
"""Define an Ambient sensor."""
def __init__(
self,
ambient: AmbientStation,
mac_address: str,
station_name: str,
description: EntityDescription,
) -> None:
"""Initialize the sensor."""
super().__init__(ambient, mac_address, station_name, description)
if description.key == TYPE_SOLARRADIATION_LX:
# Since TYPE_SOLARRADIATION and TYPE_SOLARRADIATION_LX will have the same
# name in the UI, we influence the entity ID of TYPE_SOLARRADIATION_LX here
# to differentiate them:
self.entity_id = f"sensor.{station_name}_solar_rad_lx"
@callback
def update_from_latest_data(self) -> None:
"""Fetch new state data for the sensor."""

View File

@@ -1,12 +1,13 @@
"""Support for Amcrest IP cameras."""
from __future__ import annotations
from collections.abc import Callable
from contextlib import suppress
from dataclasses import dataclass
from datetime import datetime, timedelta
import logging
import threading
from typing import Any, Callable
from typing import Any
import aiohttp
from amcrest import AmcrestError, ApiWrapper, LoginError
@@ -379,3 +380,4 @@ class AmcrestDevice:
stream_source: str
resolution: int
control_light: bool
channel: int = 0

View File

@@ -1,11 +1,12 @@
"""Support for Amcrest IP camera binary sensors."""
from __future__ import annotations
from collections.abc import Callable
from contextlib import suppress
from dataclasses import dataclass
from datetime import timedelta
import logging
from typing import TYPE_CHECKING, Callable
from typing import TYPE_CHECKING
from amcrest import AmcrestError
import voluptuous as vol
@@ -111,6 +112,7 @@ BINARY_SENSORS: tuple[AmcrestSensorEntityDescription, ...] = (
key=_ONLINE_KEY,
name="Online",
device_class=DEVICE_CLASS_CONNECTIVITY,
should_poll=True,
),
)
BINARY_SENSOR_KEYS = [description.key for description in BINARY_SENSORS]
@@ -168,6 +170,7 @@ class AmcrestBinarySensor(BinarySensorEntity):
"""Initialize entity."""
self._signal_name = name
self._api = device.api
self._channel = device.channel
self.entity_description: AmcrestSensorEntityDescription = entity_description
self._attr_name = f"{name} {entity_description.name}"
@@ -191,12 +194,14 @@ class AmcrestBinarySensor(BinarySensorEntity):
if not (self._api.available or self.is_on):
return
_LOGGER.debug(_UPDATE_MSG, self.name)
if self._api.available:
# Send a command to the camera to test if we can still communicate with it.
# Override of Http.command() in __init__.py will set self._api.available
# accordingly.
with suppress(AmcrestError):
self._api.current_time # pylint: disable=pointless-statement
self._update_unique_id()
self._attr_is_on = self._api.available
def _update_others(self) -> None:
@@ -204,6 +209,12 @@ class AmcrestBinarySensor(BinarySensorEntity):
return
_LOGGER.debug(_UPDATE_MSG, self.name)
try:
self._update_unique_id()
except AmcrestError as error:
log_update_error(_LOGGER, "update", self.name, "binary sensor", error)
return
event_code = self.entity_description.event_code
if event_code is None:
_LOGGER.error("Binary sensor %s event code not set", self.name)
@@ -213,6 +224,16 @@ class AmcrestBinarySensor(BinarySensorEntity):
self._attr_is_on = len(self._api.event_channels_happened(event_code)) > 0
except AmcrestError as error:
log_update_error(_LOGGER, "update", self.name, "binary sensor", error)
return
def _update_unique_id(self) -> None:
"""Set the unique id."""
if self._attr_unique_id is None:
serial_number = self._api.serial_number
if serial_number:
self._attr_unique_id = (
f"{serial_number}-{self.entity_description.key}-{self._channel}"
)
async def async_on_demand_update(self) -> None:
"""Update state."""

View File

@@ -2,10 +2,11 @@
from __future__ import annotations
import asyncio
from collections.abc import Callable
from datetime import timedelta
from functools import partial
import logging
from typing import TYPE_CHECKING, Any, Callable
from typing import TYPE_CHECKING, Any
from aiohttp import web
from amcrest import AmcrestError
@@ -13,9 +14,11 @@ from haffmpeg.camera import CameraMjpeg
import voluptuous as vol
from homeassistant.components.camera import SUPPORT_ON_OFF, SUPPORT_STREAM, Camera
from homeassistant.components.camera.const import DOMAIN as CAMERA_DOMAIN
from homeassistant.components.ffmpeg import DATA_FFMPEG, FFmpegManager
from homeassistant.const import ATTR_ENTITY_ID, CONF_NAME, STATE_OFF, STATE_ON
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry
from homeassistant.helpers.aiohttp_client import (
async_aiohttp_proxy_stream,
async_aiohttp_proxy_web,
@@ -32,6 +35,7 @@ from .const import (
COMM_TIMEOUT,
DATA_AMCREST,
DEVICES,
DOMAIN,
SERVICE_UPDATE,
SNAPSHOT_TIMEOUT,
)
@@ -132,7 +136,21 @@ async def async_setup_platform(
name = discovery_info[CONF_NAME]
device = hass.data[DATA_AMCREST][DEVICES][name]
async_add_entities([AmcrestCam(name, device, hass.data[DATA_FFMPEG])], True)
entity = AmcrestCam(name, device, hass.data[DATA_FFMPEG])
# 2021.9.0 introduced unique id's for the camera entity, but these were not
# unique for different resolution streams. If any cameras were configured
# with this version, update the old entity with the new unique id.
serial_number = await hass.async_add_executor_job(lambda: device.api.serial_number) # type: ignore[no-any-return]
serial_number = serial_number.strip()
registry = entity_registry.async_get(hass)
entity_id = registry.async_get_entity_id(CAMERA_DOMAIN, DOMAIN, serial_number)
if entity_id is not None:
_LOGGER.debug("Updating unique id for camera %s", entity_id)
new_unique_id = f"{serial_number}-{device.resolution}-{device.channel}"
registry.async_update_entity(entity_id, new_unique_id=new_unique_id)
async_add_entities([entity], True)
class CannotSnapshot(Exception):
@@ -155,6 +173,7 @@ class AmcrestCam(Camera):
self._ffmpeg_arguments = device.ffmpeg_arguments
self._stream_source = device.stream_source
self._resolution = device.resolution
self._channel = device.channel
self._token = self._auth = device.authentication
self._control_light = device.control_light
self._is_recording: bool = False
@@ -375,8 +394,8 @@ class AmcrestCam(Camera):
if self._brand is None:
resp = self._api.vendor_information.strip()
_LOGGER.debug("Assigned brand=%s", resp)
if resp.startswith("vendor="):
self._brand = resp.split("=")[-1]
if resp:
self._brand = resp
else:
self._brand = "unknown"
if self._model is None:
@@ -387,8 +406,12 @@ class AmcrestCam(Camera):
else:
self._model = "unknown"
if self._attr_unique_id is None:
self._attr_unique_id = self._api.serial_number.strip()
_LOGGER.debug("Assigned unique_id=%s", self._attr_unique_id)
serial_number = self._api.serial_number.strip()
if serial_number:
self._attr_unique_id = (
f"{serial_number}-{self._resolution}-{self._channel}"
)
_LOGGER.debug("Assigned unique_id=%s", self._attr_unique_id)
self.is_streaming = self._get_video()
self._is_recording = self._get_recording()
self._motion_detection_enabled = self._get_motion_detection()

View File

@@ -2,7 +2,7 @@
"domain": "amcrest",
"name": "Amcrest",
"documentation": "https://www.home-assistant.io/integrations/amcrest",
"requirements": ["amcrest==1.8.0"],
"requirements": ["amcrest==1.9.3"],
"dependencies": ["ffmpeg"],
"codeowners": ["@flacjacket"],
"iot_class": "local_polling"

View File

@@ -1,9 +1,10 @@
"""Support for Amcrest IP camera sensors."""
from __future__ import annotations
from collections.abc import Callable
from datetime import timedelta
import logging
from typing import TYPE_CHECKING, Callable
from typing import TYPE_CHECKING
from amcrest import AmcrestError
@@ -77,6 +78,7 @@ class AmcrestSensor(SensorEntity):
self.entity_description = description
self._signal_name = name
self._api = device.api
self._channel = device.channel
self._unsub_dispatcher: Callable[[], None] | None = None
self._attr_name = f"{name} {description.name}"
@@ -94,7 +96,19 @@ class AmcrestSensor(SensorEntity):
_LOGGER.debug("Updating %s sensor", self.name)
sensor_type = self.entity_description.key
if self._attr_unique_id is None:
serial_number = self._api.serial_number
if serial_number:
self._attr_unique_id = f"{serial_number}-{sensor_type}-{self._channel}"
try:
if self._attr_unique_id is None:
serial_number = self._api.serial_number
if serial_number:
self._attr_unique_id = (
f"{serial_number}-{sensor_type}-{self._channel}"
)
if sensor_type == SENSOR_PTZ_PRESET:
self._attr_native_value = self._api.ptz_presets_count

View File

@@ -358,6 +358,7 @@ def adb_decorator(override_available=False):
@functools.wraps(func)
async def _adb_exception_catcher(self, *args, **kwargs):
"""Call an ADB-related method and catch exceptions."""
# pylint: disable=protected-access
if not self.available and not override_available:
return None

View File

@@ -1,6 +1,6 @@
"""Rest API for Home Assistant."""
import asyncio
from contextlib import suppress
from http import HTTPStatus
import json
import logging
@@ -15,10 +15,6 @@ from homeassistant.components.http import HomeAssistantView
from homeassistant.const import (
EVENT_HOMEASSISTANT_STOP,
EVENT_TIME_CHANGED,
HTTP_BAD_REQUEST,
HTTP_CREATED,
HTTP_NOT_FOUND,
HTTP_OK,
MATCH_ALL,
URL_API,
URL_API_COMPONENTS,
@@ -30,15 +26,12 @@ from homeassistant.const import (
URL_API_STATES,
URL_API_STREAM,
URL_API_TEMPLATE,
__version__,
)
import homeassistant.core as ha
from homeassistant.exceptions import ServiceNotFound, TemplateError, Unauthorized
from homeassistant.helpers import template
from homeassistant.helpers.json import JSONEncoder
from homeassistant.helpers.network import NoURLAvailableError, get_url
from homeassistant.helpers.service import async_get_all_descriptions
from homeassistant.helpers.system_info import async_get_system_info
_LOGGER = logging.getLogger(__name__)
@@ -97,6 +90,7 @@ class APIEventStream(HomeAssistantView):
async def get(self, request):
"""Provide a streaming interface for the event bus."""
# pylint: disable=no-self-use
if not request["hass_user"].is_admin:
raise Unauthorized()
hass = request.app["hass"]
@@ -173,7 +167,11 @@ class APIConfigView(HomeAssistantView):
class APIDiscoveryView(HomeAssistantView):
"""View to provide Discovery information."""
"""
View to provide Discovery information.
DEPRECATED: To be removed in 2022.1
"""
requires_auth = False
url = URL_API_DISCOVERY_INFO
@@ -181,32 +179,18 @@ class APIDiscoveryView(HomeAssistantView):
async def get(self, request):
"""Get discovery information."""
hass = request.app["hass"]
uuid = await hass.helpers.instance_id.async_get()
system_info = await async_get_system_info(hass)
data = {
ATTR_UUID: uuid,
ATTR_BASE_URL: None,
ATTR_EXTERNAL_URL: None,
ATTR_INTERNAL_URL: None,
ATTR_LOCATION_NAME: hass.config.location_name,
ATTR_INSTALLATION_TYPE: system_info[ATTR_INSTALLATION_TYPE],
# always needs authentication
ATTR_REQUIRES_API_PASSWORD: True,
ATTR_VERSION: __version__,
}
with suppress(NoURLAvailableError):
data["external_url"] = get_url(hass, allow_internal=False)
with suppress(NoURLAvailableError):
data["internal_url"] = get_url(hass, allow_external=False)
# Set old base URL based on external or internal
data["base_url"] = data["external_url"] or data["internal_url"]
return self.json(data)
return self.json(
{
ATTR_UUID: "",
ATTR_BASE_URL: "",
ATTR_EXTERNAL_URL: "",
ATTR_INTERNAL_URL: "",
ATTR_LOCATION_NAME: "",
ATTR_INSTALLATION_TYPE: "",
ATTR_REQUIRES_API_PASSWORD: True,
ATTR_VERSION: "",
}
)
class APIStatesView(HomeAssistantView):
@@ -244,7 +228,7 @@ class APIEntityStateView(HomeAssistantView):
state = request.app["hass"].states.get(entity_id)
if state:
return self.json(state)
return self.json_message("Entity not found.", HTTP_NOT_FOUND)
return self.json_message("Entity not found.", HTTPStatus.NOT_FOUND)
async def post(self, request, entity_id):
"""Update state of entity."""
@@ -254,12 +238,12 @@ class APIEntityStateView(HomeAssistantView):
try:
data = await request.json()
except ValueError:
return self.json_message("Invalid JSON specified.", HTTP_BAD_REQUEST)
return self.json_message("Invalid JSON specified.", HTTPStatus.BAD_REQUEST)
new_state = data.get("state")
if new_state is None:
return self.json_message("No state specified.", HTTP_BAD_REQUEST)
return self.json_message("No state specified.", HTTPStatus.BAD_REQUEST)
attributes = data.get("attributes")
force_update = data.get("force_update", False)
@@ -272,7 +256,7 @@ class APIEntityStateView(HomeAssistantView):
)
# Read the state back for our response
status_code = HTTP_CREATED if is_new_state else HTTP_OK
status_code = HTTPStatus.CREATED if is_new_state else HTTPStatus.OK
resp = self.json(hass.states.get(entity_id), status_code)
resp.headers.add("Location", f"/api/states/{entity_id}")
@@ -286,7 +270,7 @@ class APIEntityStateView(HomeAssistantView):
raise Unauthorized(entity_id=entity_id)
if request.app["hass"].states.async_remove(entity_id):
return self.json_message("Entity removed.")
return self.json_message("Entity not found.", HTTP_NOT_FOUND)
return self.json_message("Entity not found.", HTTPStatus.NOT_FOUND)
class APIEventListenersView(HomeAssistantView):
@@ -316,12 +300,12 @@ class APIEventView(HomeAssistantView):
event_data = json.loads(body) if body else None
except ValueError:
return self.json_message(
"Event data should be valid JSON.", HTTP_BAD_REQUEST
"Event data should be valid JSON.", HTTPStatus.BAD_REQUEST
)
if event_data is not None and not isinstance(event_data, dict):
return self.json_message(
"Event data should be a JSON object", HTTP_BAD_REQUEST
"Event data should be a JSON object", HTTPStatus.BAD_REQUEST
)
# Special case handling for event STATE_CHANGED
@@ -368,7 +352,9 @@ class APIDomainServicesView(HomeAssistantView):
try:
data = json.loads(body) if body else None
except ValueError:
return self.json_message("Data should be valid JSON.", HTTP_BAD_REQUEST)
return self.json_message(
"Data should be valid JSON.", HTTPStatus.BAD_REQUEST
)
context = self.context(request)
@@ -416,7 +402,7 @@ class APITemplateView(HomeAssistantView):
return tpl.async_render(variables=data.get("variables"), parse_result=False)
except (ValueError, TemplateError) as ex:
return self.json_message(
f"Error rendering template: {ex}", HTTP_BAD_REQUEST
f"Error rendering template: {ex}", HTTPStatus.BAD_REQUEST
)
@@ -428,6 +414,7 @@ class APIErrorLog(HomeAssistantView):
async def get(self, request):
"""Retrieve API error log."""
# pylint: disable=no-self-use
if not request["hass_user"].is_admin:
raise Unauthorized()
return web.FileResponse(request.app["hass"].data[DATA_LOGGING])

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