Compare commits

...

941 Commits

Author SHA1 Message Date
Paulus Schoutsen
076227acbe Merge pull request #52043 from home-assistant/rc 2021-06-20 22:37:31 -07:00
Paulus Schoutsen
34f266bfa6 Bumped version to 2021.6.6 2021-06-20 21:49:17 -07:00
jjlawren
0d351e4a0e Catch unexpected battery update payloads on Sonos (#52040) 2021-06-20 21:49:12 -07:00
Paulus Schoutsen
79cfd444d9 Fix double subscriptions for local push notifications (#52039) 2021-06-20 21:49:11 -07:00
Maciej Bieniek
67699e3c1f Fix AccuWeather sensors updates (#52031)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-06-20 21:49:10 -07:00
Fredrik Erlandsson
47560006b8 Bump pydaikin to 2.4.3 (#51926) 2021-06-20 21:49:09 -07:00
Rob Bierbooms
d6fd41bd03 Bump pyRFXtrx to 0.27.0 (#51911)
* Bump version

* Fix test
2021-06-20 21:49:08 -07:00
djtimca
c8e678a2c6 Add Omnilogic switch defaults for max_speed and min_speed (#51889) 2021-06-20 21:49:08 -07:00
Konstantin Antselovich
398fca3b9d Fix whois expiration date (#51868) 2021-06-20 21:49:07 -07:00
Franck Nijhof
f2bc69a653 Merge pull request #51902 from home-assistant/rc 2021-06-15 20:37:40 +02:00
Franck Nijhof
fcb2c26a24 Bumped version to 2021.6.5 2021-06-15 19:45:33 +02:00
Ludovico de Nittis
ee7a2b29ad Bump pyialarm to 1.9.0 (#51804) 2021-06-15 19:44:48 +02:00
Joakim Sørensen
dcc7bc10e8 Add httpcore with version 0.13.3 (#51799) 2021-06-15 19:44:45 +02:00
Fredrik Erlandsson
8f34d1cf32 Bump pydaikin, fix airbase issues (#51797) 2021-06-15 19:44:42 +02:00
Ron Klinkien
fcc66139f8 Replace garminconnect_aio with garminconnect_ha (#51730)
* Fixed config_flow for multiple account creation

* Replaced python package to fix multiple accounts

* Replaced python package to fix multiple accounts

* Implemented config entries user

* Config entries user

* Fixed test code config flow

* Fixed patch
2021-06-15 19:44:35 +02:00
Paulus Schoutsen
2535f5c155 Merge pull request #51768 from home-assistant/rc 2021-06-11 22:18:37 -07:00
Paulus Schoutsen
97e36cd3c4 Bumped version to 2021.6.4 2021-06-11 21:42:27 -07:00
J. Nick Koston
548e847453 Fix race condition in samsungtv turn off (#51716)
- The state would flip flop if the update happened before the TV had fully shutdown
2021-06-11 21:42:15 -07:00
J. Nick Koston
60b89101e5 Ensure samsungtv reloads after reauth (#51714)
* Ensure samsungtv reloads after reauth

- Fixes a case of I/O in the event loop

* Ensure config entry is reloaded
2021-06-11 21:42:14 -07:00
Pawel
90d28e911c Fix Onvif get_time_zone from device (#51620)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-06-11 21:42:13 -07:00
Maciej Bieniek
cfea8a9ad1 Do not configure Shelly config entry created by custom component (#51616) 2021-06-11 21:42:12 -07:00
blastoise186
880fe82337 Reduce ovo_energy polling rate to be less aggressive (#51613)
* Reduce polling rate to be less aggressive

The current polling rate is too aggressive for the purpose, this commit reduces it to 12 hours to play nice with OVO.

* tweak polling to hourly
2021-06-11 21:42:11 -07:00
jjlawren
3a5f51ed7d Handle missing section ID for Plex clips (#51598) 2021-06-11 21:42:10 -07:00
jjlawren
cca1b426bb Fix Sonos battery sensors on S1 firmware (#51585) 2021-06-11 21:42:09 -07:00
Paulus Schoutsen
e5028d285c Merge pull request #51595 from home-assistant/rc 2021-06-07 14:47:50 -07:00
Paulus Schoutsen
6b38480caf Bumped version to 2021.6.3 2021-06-07 14:15:39 -07:00
Erik Montnemery
4dd875199f Fix deprecated value_template for MQTT light (#51587) 2021-06-07 14:15:31 -07:00
Pascal Vizeli
70f4907414 Update builder to 2021.06.2 (#51582) 2021-06-07 14:15:30 -07:00
jjlawren
bd24431930 Fix Sonos restore calls (#51565) 2021-06-07 14:15:29 -07:00
J. Nick Koston
03f10333c4 Increase isy setup timeout to 60s (#51559)
- Ensure errors are displayed in the UI
2021-06-07 14:15:28 -07:00
stephan192
619e37b600 Bump dwdwfsapi to 1.0.4 (#51556) 2021-06-07 14:15:27 -07:00
Ron Klinkien
5016fd9fa8 Fix garmin_connect config flow multiple account creation (#51542) 2021-06-07 14:15:27 -07:00
Aaron Bach
45d94c7fc8 Bump aiorecollect to 1.0.5 (#51538) 2021-06-07 14:15:26 -07:00
J. Nick Koston
b807b8754b Ensure host is always set with samsungtv SSDP discovery (#51527)
There was a case where self._host could have been None
before _async_set_unique_id_from_udn was called

Fixes #51186
2021-06-07 14:15:25 -07:00
Malte Franken
8818df0663 Improve log message when zone missing in geolocation trigger (#51522)
* log warning message if zone cannot be found

* improve log message

* add test case
2021-06-07 14:15:24 -07:00
Ludovico de Nittis
b06558fa0a Bump pyialarm to 1.8.1 (#51519) 2021-06-07 14:15:23 -07:00
Ron Klinkien
b21076c599 Bump garminconnect_aio to 0.1.4 (#51507) 2021-06-07 14:15:22 -07:00
Daniel Hjelseth Høyer
ed68a268ad Fix missing Tibber power production (#51505)
Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>
2021-06-07 14:15:22 -07:00
J. Nick Koston
89db8d4519 Handle missing options in foreign_key for MSSQL (#51503) 2021-06-07 14:15:21 -07:00
Aidan Timson
96ade688d5 AsusWRT fix keyerror when firmver is missing from info (#51499)
Co-authored-by: Franck Nijhof <git@frenck.dev>
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-06-07 14:15:20 -07:00
J. Nick Koston
703b088f86 Fix loop in tod binary sensor (#51491)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-06-07 14:15:19 -07:00
Felipe Martins Diel
0f3b73e75f Use a single job to ping all devices in the Broadlink integration (#51466) 2021-06-07 14:15:18 -07:00
Paulus Schoutsen
1da9ac38e8 Merge pull request #51488 from home-assistant/rc 2021-06-04 10:50:36 -07:00
Paulus Schoutsen
eb2f5c28a9 Bumped version to 2021.6.2 2021-06-04 10:07:09 -07:00
Paulus Schoutsen
f5dd838409 Protect our user agent (#51486)
* Protect our user agent

* Fix expected error
2021-06-04 10:07:05 -07:00
Franck Nijhof
8f741e0c6f Upgrade elgato to 2.1.1 (#51483) 2021-06-04 10:07:04 -07:00
Simone Chemelli
6dcde1b2a6 Improve logging for SamsungTV (#51477) 2021-06-04 10:07:03 -07:00
Aidan Timson
d9c6c3719c Bump aiolyric to 1.0.7 (#51473) 2021-06-04 10:07:03 -07:00
Matthias Alphart
e10a4c2a91 Update xknx to version 0.18.4 (#51459) 2021-06-04 10:07:02 -07:00
Matthias Alphart
c8655c8e37 xknx 0.18.3 (#51277) 2021-06-04 10:07:01 -07:00
J. Nick Koston
42c74c1e14 Retry isy994 setup later if isy.initialize times out (#51453)
Maybe fixes https://forum.universal-devices.com/topic/26633-home-assistant-isy-component/?do=findComment&comment=312147
2021-06-04 10:06:13 -07:00
Florent Thoumie
756a4c2ea6 Update to iaqualink 0.3.90 (#51452) 2021-06-04 10:06:12 -07:00
Paulus Schoutsen
6f4302ff70 Hot fix version of Apply modbus interval patch (#51487) 2021-06-04 19:02:42 +02:00
Paulus Schoutsen
1aa6266fb4 Merge pull request #51449 from home-assistant/rc 2021-06-03 17:09:29 -07:00
Paulus Schoutsen
a3c5022956 Bumped version to 2021.6.1 2021-06-03 15:45:09 -07:00
Bram Kragten
eb45714c16 Update frontend to 20210603.0 (#51442) 2021-06-03 15:44:37 -07:00
Raman Gupta
e8aa578acc Bump zwave-js-server-python to 0.26.1 (#51425) 2021-06-03 15:44:37 -07:00
Jc2k
08e58e9f7d Bump aiohomekit to 0.2.67 (fixes #51391) (#51418) 2021-06-03 15:44:36 -07:00
Philip Allgaier
46ad5eeb63 Fix shopping list "complete all" service name (#51406) 2021-06-03 15:44:35 -07:00
Daniel Hjelseth Høyer
3bbf1e7c83 Fix Tibber Pulse device name and sensor update (#51402) 2021-06-03 15:44:34 -07:00
Raman Gupta
4cf2f49d7e Fix no value error for heatit climate entities (#51392) 2021-06-03 15:44:34 -07:00
jjlawren
10a64f17ce Handle Sonos connection issues better when polling (#51376) 2021-06-03 15:44:06 -07:00
Michael
768d49d7a6 Fix last activity consideration for AVM Fritz!Tools device tracker (#51375) 2021-06-03 15:43:22 -07:00
Franck Nijhof
51704d151d Merge pull request #51370 from home-assistant/rc 2021-06-02 18:31:46 +02:00
Franck Nijhof
e3994e8029 Bumped version to 2021.6.0 2021-06-02 17:29:50 +02:00
Daniel Hjelseth Høyer
7938f69dc5 Fix Tibber timestamps parsing (#51368) 2021-06-02 17:29:20 +02:00
gadgetmobile
089374b7e2 Fix BleBox wLightBoxS and gateBox support (#51367)
Co-authored-by: bbx-jp <83213200+bbx-jp@users.noreply.github.com>
2021-06-02 17:29:17 +02:00
Aaron Bach
b7153fe25f Bump pyiqvia to 1.0.0 (#51357) 2021-06-02 17:29:14 +02:00
Erik Montnemery
f8d68e47b8 Do not attempt to unload non loaded config entries (#51356) 2021-06-02 17:29:10 +02:00
Paulus Schoutsen
dc17d664eb Bumped version to 2021.6.0b5 2021-06-01 13:39:48 -07:00
Bram Kragten
e4e3d5f814 Update frontend to 20210601.1 (#51354) 2021-06-01 13:39:16 -07:00
jjlawren
fc24b34408 Handle incomplete Sonos alarm event payloads (#51353) 2021-06-01 13:39:15 -07:00
Paulus Schoutsen
f93acfc4c0 Merge system options into pref properties (#51347)
* Make system options future proof

* Update tests

* Add types
2021-06-01 13:39:14 -07:00
Martin Hjelmare
89a374057d Bump zwave-js-server-python to 0.26.0 (#51341) 2021-06-01 13:39:13 -07:00
definitio
5ea798462f Fix Snapcast state after restoring snapshot (#51340) 2021-06-01 13:39:13 -07:00
Eduard van Valkenburg
464c66f97f Fix SIA event data func (#51339) 2021-06-01 13:39:11 -07:00
Tobias Sauerwein
941b02b73e Fix Netatmo sensor logic (#51338) 2021-06-01 13:39:10 -07:00
Franck Nijhof
d78694c9b8 Fix time condition microsecond offset when using input helpers (#51337) 2021-06-01 13:39:10 -07:00
Erik Montnemery
bbd7433686 Improve time condition trace (#51335) 2021-06-01 13:39:09 -07:00
Franck Nijhof
f54cbff223 Always load middle to handle forwarded proxy data (#51332) 2021-06-01 13:38:10 -07:00
Joakim Sørensen
6031f7ce99 Add arch to payload (#51330) 2021-06-01 13:35:57 -07:00
AJ Schmidt
fac5b23b86 update adext dependency (#51315) 2021-06-01 13:35:56 -07:00
Bram Kragten
76527ab79a Bumped version to 2021.6.0b4 2021-06-01 13:13:34 +02:00
Bram Kragten
42bf29856e Update frontend to 20210601.0 (#51329) 2021-06-01 13:10:32 +02:00
Maciej Bieniek
96191c07c9 Fix exception after removing Shelly config entry and stopping HA (#51321)
* Fix device shutdown twice

* Change if logic
2021-06-01 13:10:30 +02:00
Eugenio Panadero
0856232ea6 Bump aiopvpc to apply quickfix for new electricity price tariff (#51320)
Since 2021-06-01, the three PVPC price tariffs become one and only: '2.0 TD',
and the JSON schema from the official API (data source of this integration)
is slightly different.

This patch allows a no-pain jump between the old tariffs and the new one.
2021-06-01 13:10:29 +02:00
Paulus Schoutsen
413fd1b255 Trusted networks auth provider warns if detects a requests with x-forwarded-for header while the http integration is not configured for reverse proxies (#51319)
* Trusted networks auth provider to require http integration configured for proxies to allow logging in with requests with x-forwarded-for header

* Make it a warning
2021-06-01 13:09:16 +02:00
Paulus Schoutsen
bd279786bb Bumped version to 2021.6.0b3 2021-05-31 16:43:14 -07:00
Paulus Schoutsen
837efaf29b Updated frontend to 20210531.1 (#51314) 2021-05-31 16:43:08 -07:00
Paulus Schoutsen
a904b1e37f Set up cloud semi-dependencies at start (#51313) 2021-05-31 16:43:07 -07:00
Joakim Sørensen
14db5a0999 Move version validation to resolver (#51311) 2021-05-31 16:43:07 -07:00
Jc2k
cbc75ffe8a Bump aiohomekit to 0.2.66 (#51310) 2021-05-31 16:43:06 -07:00
Robert Svensson
1e2913ad4c Fix stream profiles not available as expected (#51305) 2021-05-31 16:43:05 -07:00
Paulus Schoutsen
127a230703 Add system option to disable polling (#51299) 2021-05-31 16:43:04 -07:00
Pascal Vizeli
b3ccc44ee9 Revert "GRPC is fixed, don't need a workaround" (#51289)
This reverts commit 9d174e8a05.
2021-05-31 16:43:03 -07:00
Joakim Sørensen
c4a98755a3 Resolve addon repository slug for device registry (#51287)
* Resolve addon repository slug for device registry

* typo

* Adjust onboarding test

* Use /store
2021-05-31 16:43:03 -07:00
J. Nick Koston
273f57261c Upgrade HAP-python to 3.5.0 (#51261)
* Upgrade HAP-python to 3.4.2

- Fixes for malformed event sending

- Performance improvements

* Bump

* update tests to point to async
2021-05-31 16:43:02 -07:00
Ron Klinkien
a08fffea17 Fix Garmin Connect integration with python-garminconnect-aio (#50865) 2021-05-31 16:43:01 -07:00
Paulus Schoutsen
792d7bb3f5 Bumped version to 2021.6.0b2 2021-05-30 21:13:41 -07:00
Paulus Schoutsen
c20ac0efb2 Updated frontend to 20210531.0 (#51281) 2021-05-30 21:13:34 -07:00
Tobias Sauerwein
9dfd578b65 Fix unnecessary API calls in Netatmo (#51260) 2021-05-30 21:13:33 -07:00
Erik Montnemery
8fd3761893 Fix flaky statistics tests (#51242) 2021-05-30 21:13:33 -07:00
Ludovico de Nittis
99fd5be369 Bump pyialarm to 1.7 (#51233) 2021-05-30 21:13:32 -07:00
jjlawren
d236e07046 Skip processed Sonos alarm updates (#51217)
* Skip processed Sonos alarm updates

* Fix bad conflict merge
2021-05-30 21:13:31 -07:00
jjlawren
835a9efc64 Reorganize SonosSpeaker class for readability (#51222) 2021-05-30 21:13:08 -07:00
Tobias Sauerwein
51d98bb9c8 Fix Netatmo data class update (#51215)
* Catch if data class entry is None

* Guard
2021-05-30 21:11:58 -07:00
Erik Montnemery
b75f4b1f4d Fix flaky statistics tests (#51214)
* Fix flaky statistics tests

* Tweak
2021-05-30 21:11:57 -07:00
jjlawren
fa7837bb12 Improve Sonos alarm logging (#51212) 2021-05-30 21:11:32 -07:00
jjlawren
f32309273b Fix use of async in Sonos switch (#51210)
* Fix use of async in Sonos switch

* Simplify

* Convert to callback
2021-05-30 21:10:39 -07:00
J. Nick Koston
b37932e163 Fix samsungtv yaml import without configured name (#51204) 2021-05-30 21:09:05 -07:00
jjlawren
a0696fe923 Centralize Sonos subscription logic (#51172)
* Centralize Sonos subscription logic

* Clean up mocked Sonos Service instances, use subscription callback

* Use existing mocked attributes

* Use event dispatcher dict, move methods together, make update_alarms sync

* Create dispatcher dict once
2021-05-30 21:09:04 -07:00
Aaron David Schneider
e980365a9c Add tests for sonos switch platform (#51142)
* add tests

* refactor async_added_to_hass

* fix tests and race condition

* use async_get

* typo
2021-05-30 21:09:03 -07:00
Vilppu Vuorinen
215869b3df Update to pymelcloud 2.5.3 (#51043)
Previous version of pymelcloud performs requests that are not permitted
for guest users. Bypassing these requests results only in less detailed
device info.
2021-05-30 21:04:59 -07:00
Franck Nijhof
0de8604631 Bumped version to 2021.6.0b1 2021-05-28 14:51:21 +02:00
Bram Kragten
0c9c113528 Update frontend to 20210528.0 (#51199) 2021-05-28 14:50:59 +02:00
Pascal Vizeli
de575fdb7b Update base image to 2021.05.0 (#51198) 2021-05-28 14:50:56 +02:00
Joakim Plate
ae914be44f Only run philips_js notify service while TV is turned on (#51196)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-05-28 14:50:53 +02:00
Tobias Sauerwein
fe84d060d6 Fix Netatmo sensor initialization (#51195) 2021-05-28 14:50:50 +02:00
Joakim Sørensen
3e57b6178d Use get with default for consider home (#51194) 2021-05-28 14:50:46 +02:00
Tobias Sauerwein
6388203f73 Fix Netatmo data class update (#51177) 2021-05-28 14:50:41 +02:00
jjlawren
a6a18effee Improve Sonos polling (#51170)
* Improve Sonos polling

Warn user if polling is being used
Provide callback IP:port to help user fix networking
Fix radio handling when polling (no event payload)
Clarify dispatch target to reflect polling action

* Lint

* Revert method removal
2021-05-28 14:50:38 +02:00
Greg Dowling
e86e70f327 Bump pyroon to 0.0.37 (#51164) 2021-05-28 14:50:35 +02:00
Erik Montnemery
27e32bbb19 Weight sensor average statistics by state durations (#51150)
* Weight sensor average statistics by state durations

* Fix test
2021-05-28 14:50:32 +02:00
Erik Montnemery
b92db104dc Add deprecated backwards compatible history.LazyState (#51144) 2021-05-28 14:50:29 +02:00
jjlawren
f3639c60e2 Fix Sonos media position with radio sources (#51137) 2021-05-28 14:50:26 +02:00
jjlawren
74e397dc73 Fix Sonos TV source attribute (#51131) 2021-05-28 14:50:23 +02:00
Joakim Sørensen
4ebc0d97bc Handle blank string in location name for mobile app (#51130) 2021-05-28 14:50:20 +02:00
Raman Gupta
c2c760eb8b Fix zwave_js.set_value schema (#51114)
* fix zwave_js.set_value schema

* wrap all schemas in vol.Schema

* readd removed assertions
2021-05-28 14:50:17 +02:00
Eduard van Valkenburg
255577436e Followup PR for SIA integration (#51108)
* Updates based on Martin's review

* fix strings and cleaned up constants
2021-05-28 14:50:13 +02:00
Franck Nijhof
762f15a0d3 Bumped version to 2021.6.0b0 2021-05-26 19:44:48 +02:00
Greg Dowling
09b9218511 Handle updating config entries in Vera (#49605)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-05-26 09:54:02 -07:00
Austin Mroczek
22dd7df66c Improve totalconnect config flow user experience (#47926) 2021-05-26 09:48:44 -07:00
Franck Nijhof
67536b52c4 Use entity class vars in Flo (#50991) 2021-05-26 09:47:04 -07:00
ollo69
daff62f42d Add AsusWRT model and firmware information for device (#51102) 2021-05-26 09:46:06 -07:00
Barry Williams
5ac81ccb4c Openhome component now uses asyncio and handles unavailability (#49574) 2021-05-26 09:39:44 -07:00
Bram Kragten
42b92748f6 Update frontend to 20210526.0 (#51110) 2021-05-26 09:31:46 -07:00
Paulus Schoutsen
bcd91cc2bd Drop certificate filling in for cloudmqtt (#51112) 2021-05-26 09:31:35 -07:00
Klaas Schoute
31c07e710a bump garage_amsterdam lib to v2.1.1 (#51111) 2021-05-26 09:31:23 -07:00
Matt Zimmerman
ffb9ab21c1 Add binary sensor for smarttub errors (#49364) 2021-05-26 09:25:47 -07:00
J. Nick Koston
64661ee2b7 Add network configuration integration (#50874)
Co-authored-by: Ruslan Sayfutdinov <ruslan@sayfutdinov.com>
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-26 09:06:30 -07:00
Erik Montnemery
16e90f12ca Add last_reset property to Tasmota energy sensors (#51107)
* Add last_reset property to Tasmota energy sensors

* Correct device class for energy sensors
2021-05-26 17:58:06 +02:00
Franck Nijhof
19c505c0f0 Add Supervisor discovery to motionEye (#50901)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-26 17:40:07 +02:00
Raman Gupta
18e6ae8750 Add WS API commands to check for and install zwave_js config updates (#51106) 2021-05-26 08:39:08 -07:00
Raman Gupta
6d9b67ddb2 Add zwave_js heal node and network WS API commands (#51047)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-26 08:38:02 -07:00
Raman Gupta
8edf7f0407 Don't enforce uniqueness requirements for Waze and Google Travel Time (#50254)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-05-26 08:32:26 -07:00
Brandon Rothweiler
a36935dcee Add services for Mazda integration (#51016) 2021-05-26 16:36:36 +02:00
Franck Nijhof
a8a13da793 Fix discovery without uid aborts on completing user flow (#51105)
* Fix discovery without uid aborts on completing user flow

* Fix comment
2021-05-26 16:29:52 +02:00
Franck Nijhof
bf13af34b4 Use entity class vars in WLED (#50975) 2021-05-26 14:08:09 +02:00
Massimiliano Cannarozzo
5a5a145778 Make all MQTT cover payloads optional (#50579)
* Remove unused constant

* Make payload_close optional

* Make payload_open optional

* Compute supported features based on config
2021-05-26 13:50:44 +03:00
Raman Gupta
1de0d20a76 Bump zwave-js-server-python to 0.25.1 (#51097)
* Bump zwave-js-server-python to 0.25.1

* update fixtures
2021-05-26 12:37:24 +02:00
Erik Montnemery
789a14fc44 Add support for last_reset to MQTT sensor (#51036)
* Add support for last_reset to MQTT sensor

* Update abbreviations

* Improve test coverage
2021-05-26 11:50:29 +02:00
Matthias Alphart
4f9b7254d2 Initialize KNX expose value (#49623)
* simplify value extraction

* allow 0/1 and "True" / "False" for binary exposes

* initialize ExposeSensor value

* handle binary states

* use default for initialization
2021-05-26 11:21:11 +02:00
chpego
19c9675d4a Bump youtube-dl to 2021.04.26 (#50037) 2021-05-26 10:32:43 +02:00
Raj Laud
b3607343fc Fix error in Squeezebox DHCP discovery flow (#50771)
* Map data from dhcp to squeezebox discovery flow

* Add tests for squeezebox dhcp discovery
2021-05-26 10:30:15 +02:00
Andrey Kupreychik
5ee0df29d4 Remove old Keenetic NDMS2 entities when some interfaces are unselected (#47311)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-26 10:26:23 +02:00
uvjustin
c6f108f7c3 Refactor stream to use bytes (#51066)
* Refactor stream to use bytes
2021-05-26 16:19:09 +08:00
Franck Nijhof
58586d5e1f Use entity class vars in Elgato (#50973) 2021-05-26 10:18:26 +02:00
Maciej Bieniek
41a940f644 Add state class to Nettigo Air Monitor sensors (#50959) 2021-05-26 09:36:37 +02:00
ollo69
d5a9419fb7 Fix AsusWRT sensor test (#50956)
* Fix AsusWRT sensor test

* Revert use of utcnow

* Add MockDevice class

* Proper initialize static member

* Added mock_device fixture
2021-05-26 09:19:30 +02:00
Raman Gupta
5f7964b54b Add firmware updates support for zwave_js (#50390)
* Add WS API support for zwave_js firmware updates

* move file to fixture

* review comments

* fix logic and test based on upstream changes

* handle failure scenario

* handle failure scenario

* fix tests and adjust message

* Update homeassistant/components/zwave_js/api.py

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

* remove return from firmware upload view because client will raise an exception if not successful

* raise if user is not an admin

* raise bad request exception if firmware command fails

* incorporate #50923

* Add test for failed command

* add event name to messages

* change error to not found

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-05-26 02:57:00 -04:00
Matt Zimmerman
c1d5dd7141 Remove unneeded **kwargs from SmartTub reminders snooze service (#51093) 2021-05-26 08:13:26 +02:00
Erik Montnemery
154c849eac Filter unsupported parameters from light service calls (#51084)
* Filter unsupported parameters from light service calls

* Silence pylint

* Fix deconz tests

* Fix mqtt tests

* Fix scene tests

* Fix trådfri emulated CT

* Fix mqtt tests
2021-05-26 08:02:59 +02:00
Johan Josua Storm
9b13350b01 Replace wrong domain returned from xbox api revisited (#51074)
* Added replacement http to https

Somehow the fix of replacing the domain doesn't work on android, so explicit replacement of http to https protocol is needed.

* Update homeassistant/components/xbox/base_sensor.py

Co-authored-by: Jason Hunter <hunterjm@gmail.com>

Co-authored-by: Jason Hunter <hunterjm@gmail.com>
2021-05-26 02:01:35 -04:00
GitHub Action
c302b5d4eb [ci skip] Translation update 2021-05-26 00:16:09 +00:00
Franck Nijhof
affc8e0f0b Fix unique ID Verisure alarm control panel (#51087) 2021-05-26 00:21:53 +02:00
Franck Nijhof
997a847b5c Add support for Sensor state class to ESPHome (#51090)
* Add support for Sensor state class to ESPHome

* Bump aioesphome to 2.8.0
2021-05-26 00:21:18 +02:00
J. Nick Koston
deb9135707 Handle clamped fan maxValue in homekit_controller (#51088) 2021-05-25 16:06:17 -05:00
Daniel Hjelseth Høyer
3a6a1a4d6b Tibber, state class (#50951) 2021-05-25 13:53:16 -07:00
Anaïs Betts
d82f6abbe4 Consider Continuous Mode on Nuki Opener to be "unlocked" (#49557)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-05-25 21:05:56 +02:00
Matthias Alphart
8b21a652ba Create KNX sensor entity directly from config (#49642)
* create sensor entities directly from config

* move staticmethod to module level

* remove factory call
2021-05-25 20:16:54 +02:00
Nathan Spencer
9ec0b0a8da Fix for invalid value error when using UI editor for Litter-Robot's set_wait_time service (#50269) 2021-05-25 20:15:37 +02:00
Franck Nijhof
6a2d6e2046 Merge branch 'master' into dev 2021-05-25 20:10:10 +02:00
Raman Gupta
58e37435b3 Make more max lengths constants and add additional MaxLengthExceeded checks (#50337)
* Add more MaxLengthExceeded checks

* remove some validations to reduce performance impact

* check length of generated entity ID

* dont check entity ID twice and use single context id length constant

* fix test

* add missing test
2021-05-25 19:58:01 +02:00
Erik Montnemery
abd6f739e8 Pylint fix (#51083) 2021-05-25 10:53:18 -07:00
J. Nick Koston
023c094b01 Add v3 smartthings hub to discovery (#51051)
- I recently switched to a v3 hub, and it has a new OUI
2021-05-25 12:40:05 -05:00
jjlawren
fe75a1bb9d Set Fahrenheit reporting precision to tenths for Homekit Controller climate entities (#50415) 2021-05-25 19:32:59 +02:00
Simone Chemelli
3d41a66673 Bump aioshelly to 0.6.4 (#51081) 2021-05-25 19:28:12 +02:00
J. Nick Koston
9f22509a4b Recover fast when homekit_controller sees a zeroconf announcment for a device that is offline (#51038) 2021-05-25 11:47:45 -05:00
J. Nick Koston
98535c9e6c Set homekit controller available state at startup (#51013) 2021-05-25 11:47:28 -05:00
jjlawren
1e86818f85 Add battery support for Sonos S1 speakers (#50864) 2021-05-25 18:39:31 +02:00
Matt Zimmerman
aa18ad2abf Add service to snooze SmartTub reminders (#51012)
* Add service to snooze SmartTub reminders

* minimum is 10 days

* 0->10 in services.yaml as well

* Update homeassistant/components/smarttub/services.yaml

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

* Update homeassistant/components/smarttub/services.yaml

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

Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2021-05-25 18:37:00 +02:00
Aaron David Schneider
9bf6ea60db Add Sonos alarm to sonos component (#50719)
* add sonos_alarm

* bug fix for _update_device

* fix pylint and black and co

* small bug fix in speaker.available_alarms

* cleanup and add _LOGGER.debug statements, fix pylint

* fix pylint

* _alarm_id to alarm_id

* fixed rare bug due to raceconditions

* Part 2 of raceconditionfix

* address review suggestions

* readd check for not yet subscribed

* - platforms_ready fix
- add alarmClock to pytest mock

* fixture for ListAlarms

* cleanup mock and match UUID for test

* add simple tests for sonos_alarm

* extend test for attributes

* typhint fix

* typo

* use get_alarms() directly

* refactor available_alarms

* fix attributes

* some cleanup

* change logic of fetch_alarms_for_speaker and rename to update_alarms_for_speaker

* update_alarms_for_speaker is now a method

* Update homeassistant/components/sonos/switch.py

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

* Update homeassistant/components/sonos/speaker.py

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

Co-authored-by: jjlawren <jjlawren@users.noreply.github.com>
2021-05-25 11:32:25 -05:00
brucemiranda
1de4971d54 Add ebusd boiler StateNumber and Modulation Percentage sensors (#49732)
* Added Boiler StateNumber and ModulationPercentage

* Update const.py

* Clean whitespace

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-25 18:25:12 +02:00
Paul Bottein
fb61ef500c Add TV channel trait to google assistant (#49676) 2021-05-25 09:12:42 -07:00
Erik Montnemery
7b5e63132c Prevent parallel reload of automations (#50008) 2021-05-25 08:50:50 -07:00
Erik Montnemery
d2804433d3 Select onoff and brightness color modes last for light groups (#51054) 2021-05-25 08:49:24 -07:00
Raman Gupta
c0234df136 Remove device_registry fixture from zwave_js tests (#51072) 2021-05-25 08:48:21 -07:00
András Rutkai
727ca79b93 Updating IBM Watson SDK, replacing TTS API endpoint (#50909) 2021-05-25 17:38:09 +02:00
Raman Gupta
4875035ff8 Add zwave_js WS API commands for node ping and metadata (#51049) 2021-05-25 17:37:12 +02:00
starkillerOG
e9ff4b1342 Fix alexa not discovering devices when sound mode device present (#49628)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-05-25 08:35:40 -07:00
Bram Kragten
f4dc72c0bd Add statistics websocket endpoint (#51044)
Co-authored-by: Erik <erik@montnemery.com>
2021-05-25 08:14:43 -07:00
Bram Kragten
c98f961959 Add statistics websocket endpoint (#51044)
Co-authored-by: Erik <erik@montnemery.com>
2021-05-25 08:06:24 -07:00
Bram Kragten
5d79a8fb05 Add statistics websocket endpoint (#51044)
Co-authored-by: Erik <erik@montnemery.com>
2021-05-25 08:05:57 -07:00
Bram Kragten
26563e3ea4 Add statistics websocket endpoint (#51044)
Co-authored-by: Erik <erik@montnemery.com>
2021-05-25 08:03:37 -07:00
Martin Hjelmare
de74028958 Disable ee_brightbox integration (#51069) 2021-05-25 16:09:23 +02:00
Franck Nijhof
9a208e3761 Upgrade pre-commit to 2.13.0 (#51068) 2021-05-25 15:51:42 +02:00
Erik Montnemery
ae8652217c Change utility_meter last_reset timestamps to UTC (#51067) 2021-05-25 15:46:54 +02:00
Jeroen Peters
67804ee5df Bump yeelight to 0.6.3 (#51065) 2021-05-25 15:36:19 +02:00
Andrey Kupreychik
cbe4df1893 SSDP Discovery for NDMS2 routers (#47312)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2021-05-25 15:36:03 +02:00
Daniel Hjelseth Høyer
7c9d8cfdec Miflora, add STATE_CLASS_MEASUREMENT (#50971)
* Miflora, add STATE_CLASS_MEASUREMENT

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

* Miflora, add STATE_CLASS_MEASUREMENT

Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>
2021-05-25 14:47:09 +02:00
tkdrob
028a07d86f Wrap up selectors (#50794)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-05-25 14:45:17 +02:00
Martin Hjelmare
9319fc6263 Update zwave_js stored add-on options (#51063)
* Update zwave_js entry data if add-on data changed

* Fix tests

* Add test
2021-05-25 08:37:34 -04:00
Andre Lengwenus
c868353459 Code cleanup in LCN (#48074) 2021-05-25 14:17:36 +02:00
Martin Hjelmare
bdb8cdf717 Fix zwave_js None color value (#50926) 2021-05-25 13:40:22 +02:00
Daniel Hjelseth Høyer
e9c787a5eb Use entity class vars in Tibber (#50977)
* Use entity class vars in Tibber

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

* Update homeassistant/components/tibber/sensor.py

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

* Update homeassistant/components/tibber/sensor.py

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

* Use entity class vars in Tibber

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

* Use entity class vars in Tibber

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

Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-05-25 13:35:18 +02:00
Michael
be0a54edb1 Add strict type annotations to bluetooth_tracker (#50999) 2021-05-25 12:29:35 +01:00
Philip Allgaier
d8ff52e55b Add support for custom themes to use dark mode (#46532) 2021-05-25 13:26:24 +02:00
Adrián Moreno
fe34f42aa5 Add new Meteoclimatic integration (#36906)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-05-25 13:11:48 +02:00
Raman Gupta
3573249720 Bump zwave-js-server-python to 0.25.0 (#51053) 2021-05-25 13:10:42 +02:00
Simone Chemelli
ef33bbe9bc Fix dispatcher for Fritz integration (#51061) 2021-05-25 12:43:50 +02:00
Franck Nijhof
c5383219f1 Remove stale debug statements from tests (#51059) 2021-05-25 11:52:20 +02:00
uvjustin
2eb87b8806 Combine StreamBuffer into SegmentBuffer in stream (#51041)
* Combine StreamBuffer into SegmentBuffer in stream

* Use new style type hint in comment
Remove unused member self._segment

* Change reset_av to static helper function

* Change make_new_av to only return OutputContainer
2021-05-24 22:57:07 -07:00
GitHub Action
0fb2504e0c [ci skip] Translation update 2021-05-25 00:12:25 +00:00
Xuefer
2a47805b4a Close onvif device cleanly (#49659)
* onvif: close device cleanly

Signed-off-by: Xuefer <xuefer@gmail.com>

* onvif: Too many nested blocks

Signed-off-by: Xuefer <xuefer@gmail.com>

* update tests to cover onvif config_flow

Signed-off-by: Xuefer <xuefer@gmail.com>
2021-05-24 15:27:40 -04:00
Xuefer
a7eedeeaba onvif: more debug info (#49658)
Signed-off-by: Xuefer <xuefer@gmail.com>
2021-05-24 15:24:56 -04:00
Maciej Bieniek
12e2c59a4c Improve typing in DuneHD integration (#51025)
* Improve typing

* One more typing fix

* Run hassfest

* Fix test

* Fix return from constructor

* Add missing Final

* Improve long string format

* Use bool for mute

* Remove unnecessary str type

* Fix host type

* Add missing Final

* Increase test coverage

* Suggested change

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

Co-authored-by: Ruslan Sayfutdinov <ruslan@sayfutdinov.com>
2021-05-24 20:09:57 +01:00
Franck Nijhof
394e044c66 Add state classes to Toon (#50978) 2021-05-24 11:15:41 -07:00
jan iversen
8721675218 Use BaseSwitch class in modbus switch/fan/light (#51031) 2021-05-24 20:13:25 +02:00
uvjustin
1ec4332e25 Use ConfigType instead of Config in async_setup type hint (#51037) 2021-05-24 10:23:16 -07:00
Raman Gupta
ebf6e3d985 Add zwave_js WS API commands to replace and remove failed nodes (#51018)
* Add zwave_js WS API commands to replace and remove failed nodes

* no need to manually add node to driver in test
2021-05-24 13:11:09 -04:00
Paulus Schoutsen
6a7968593d Make camera source check faster (#51035) 2021-05-24 17:27:13 +01:00
Matt Zimmerman
e964c607a3 jinja2.contextfilter decorator renamed to pass_context (#51007)
* jinja2.contextfilter decorator renamed to pass_context

* bump jinja2 dependency
2021-05-24 17:38:37 +02:00
Simone Chemelli
987e8ed5ed Add consider_home option to Fritz device_tracker (#50741)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-05-24 09:54:57 -05:00
Nash Kaminski
2ae91bf0ea Correct humidifier detection in venstar component and add tests (#50439)
As of version 0.14, the venstar_colortouch lib always initializes hum_setpoint to None. When a thermostat actually reports a humidifier state, this value is replaced with the integer value of the setpoint. This changeset corrects the humidifier detection as well as adds basic test cases for the Venstar component.
2021-05-24 16:41:37 +02:00
jan iversen
c74e65ac2d Streamline modbus test_init (#50990)
* Streamline test_init.

* Review comments.

* Remove hub name.
2021-05-24 14:53:54 +02:00
jan iversen
1546dbbf25 Add restore temperature to modbus climate (#50963)
* Add restore temperature to climate.

* please mypy.

* Review 2.
2021-05-24 14:03:44 +02:00
J. Nick Koston
60e65a4bc2 Bump async-upnp-client to 0.18.0 (#51017)
- Adds support for a long running SSDP listener
2021-05-24 13:50:40 +02:00
jacekpaszkowski
85495c08b0 Add support for effects, transition/brightness parameters to template light, min_mireds and max_mireds templates (#43850)
* Add support for effects, transition/brightness parameters to template light, min_mireds and max_mireds templates

* code fixes

* min_mireds, max_mireds fixes

* test fixes

* more fixes

* format fix

* style fix

* _update_effect_list change

* style fix

* Fixes after review

* additional fixes

* duplicated lines removed

* fixes after CI run

* test fixes

* code and test fixes

* supports transition change, added test cases
2021-05-24 13:31:57 +02:00
hesselonline
c497c0eadd Add wallbox integration (#48082)
* Wallbox component added

* resolved mergeconflicts from upstream

* fixed an incorrect removal in CODEOWNERS file

* fixes for pullrequest automatic test

* clean up code after PR tests

* fixed strings.json

* fix config_flow error > wallbox

* fixed some formatting issues

* fix pylint warnings

* fixed error in number.py > set value

* pylint warnings fixed

* some more pylint fixes

* isort fixes

* fix unused_import pylint

* remove tests

* remove test requirements

* config flow test

* test errors resolved

* test file formatting

* isort on test file

* sensor test

* isort on test

* isort test const

* remove not working sensor test

* remove test const

* add switch, number and lock test

* docstrings for test classes

* sort test_number, create test_sensor

* additional tests

* fix test error

* reduced PR to 1 component

* newline in const

* ignore test coverage -> dependency on external device (wallbox)

* do not ignore config_flow

* add test for validate_input

* remove obsolete import

* additional test config flow

* change test sensor

* docstring

* add additional test for exceptions

* fix test_config

* more tests

* fix test_config_flow

* fixed http error test

* catch connectionerror and introduce testing for this error

* remove .coveragefile

* change comment

* Update homeassistant/components/wallbox/__init__.py

review suggestion by janiversen

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

* Update homeassistant/components/wallbox/__init__.py

review suggestion by janiversen (format only)

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

* Processed review comments, include more testing for sensor component

* Isolated the async_add_executor_job to make the solution more async

* add a config flow test

* Revert "add a config flow test"

This reverts commit 9c1af82fffeb0b46f11ada1000e19b66fd5fd0f1.

* Revert "Isolated the async_add_executor_job to make the solution more async"

This reverts commit 0bf034c3318f27e649389830d4ad7a7e10eb2d6f.

* Make component more async and add config flow tests

* Changes based on review comments

* made _ methods in WallboxHub for the 'non-async' call to the API and try-catch. Stored the wallbox in the class.

* moved the coordinator to __init__ and pass it as part of the WallboxHub class

* removed obsolete function in __init__

* removed CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_POLL

* fixed spelling and imports on test files

* did isort on component files

Co-authored-by: jan iversen <jancasacondor@gmail.com>
2021-05-24 13:08:24 +02:00
jan iversen
be13a73db8 Allow manual scan and add delay in switch verify. (#50974) 2021-05-24 12:59:55 +02:00
Erik Montnemery
2583e4bdc9 Add support for RGBW color to blebox light (#49562) 2021-05-24 12:24:07 +02:00
Michael
51c8b1eb0b Improve code quality of TCP platform (#51000)
* Improve code placements

* Fix entity inheritance

* fix tests

* Improve PLATFORM_SCHEMA handling

* Apply suggestions
2021-05-24 11:03:43 +01:00
Erik Montnemery
870c61a622 Add color_mode support to MQTT light with basic schema (#50464)
* Add color_mode support to MQTT light with basic schema

* Update abbreviations

* Silence pylint

* Improve test coverage

* Apply suggestions from code review
2021-05-24 11:37:02 +02:00
Erik Montnemery
b169a8dbda Mark battery, humidity and pressure sensors as STATE_CLASS_MEASUREMENT (#50924)
* Mark battery, humidity and pressure sensors as STATE_CLASS_MEASUREMENT

* Fix deconz battery sensor
2021-05-24 11:36:42 +02:00
Erik Montnemery
ec4a47d1db Fix sia pylint errors (#51022) 2021-05-24 11:36:04 +02:00
Matthias Alphart
331cb3b74d Fix KNX light: turn on color light with only brightness (#50979)
* fix turn on color light with only brightness

* fix comment

* fix individual_color address assignment

* python 3.8 compatibility
2021-05-24 09:51:33 +02:00
Eduard van Valkenburg
0bba0f07ac Add SIA Alarm systems (#36625)
* initial commit of SIA integration

* translations

* moved reactions to file, typed everything

* fixed no-else-return 3 times

* refactored config and fix coverage of test

* fix requirements_test

* elimated another platform

* forgot some mentions of sensor

* updated config flow steps, fixed restore and small edits

* fixed pylint

* updated config_flow with better schema, small fixes from review

* final comment and small legibility enhancements

* small fix for pylint

* fixed init

* fixes for botched rebase

* fixed port string

* updated common strings

* rebuild component with eventbus

* fixed pylint and tests

* updates based on review by @bdraco

* updates based on new version of package and reviews

* small updates with latest package

* added raise from

* deleted async_setup from test

* fixed tests

* removed unused code from addititional account step

* fixed typo in strings

* clarification and update to update_data func

* added iot_class to manifest

* fixed entity and unique id setup

* small fix in tests

* improved unique_id semantics and load/unload functions

* added typing in order to fix mypy

* further fixes for typing

* final fixes for mypy

* adding None return types

* fix hub DR identifier

* rebased, added DeviceInfo

* rewrite to clean up and make it easier to read

* replaced functions with format for id and name

* renamed tracker remover small fix in state.setter

* improved readibility of state.setter

* no more state.setter and small updates

* mypy fix

* fixed and improved config flow

* added fixtures to test and other cleaner test code

* removed timeband from config, will reintro in a options flow

* removed timeband from tests

* added options flow for zones and timestamps

* removed type ignore

* replaced mapping with collections.abc
2021-05-24 08:48:28 +02:00
Matt Zimmerman
d7da32cbb9 Add refresh when changing SmartTub filtration settings (#51014) 2021-05-23 20:27:54 -05:00
Matt Zimmerman
121349f866 Bump python-smarttub to 0.0.25 (#51015) 2021-05-23 20:27:25 -05:00
GitHub Action
e920afd4d8 [ci skip] Translation update 2021-05-24 00:12:23 +00:00
Maciej Bieniek
c91f89260e Add state_class to entities coming from battery powered devices in Shelly integration (#51009)
* Fix sensor state_class

* Remove state class from total work time sensor

* Add state_class restore mechanism

* Remove commented code

* Remove unnecessary code
2021-05-23 23:10:22 +03:00
Niels Mündler
f0cd87e031 Reduce precision in returned values to meaningful digits (#49382) 2021-05-23 21:06:58 +02:00
J. Nick Koston
3cef96e78a Update aiohomekit to subscribe more like iOS (#50997) 2021-05-23 13:39:22 -05:00
Andrew Hayworth
4d527c5cd2 Update pylutron-caseta to 0.10.0 (#51005)
This update adds support for:
- PD-15OUT outdoor switch
- RA2 Select fan controller
2021-05-23 12:51:51 -05:00
HighOnMikey
c1a1a38ffc Improve legacy support for Hunter Douglas PowerView (#50918)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-05-23 12:47:19 -05:00
Michael
dbefa8fac0 Add strict type annotations to alarm_control_panel (#50945)
* Add strict type annotations

* Apply suggestions

* Type code as optional string
2021-05-23 16:51:40 +01:00
jan iversen
f55213d8b1 Update modbus cover to 100% coverage (#50996) 2021-05-23 10:18:35 -05:00
J. Nick Koston
4b0b0f5db7 Allow user to override insecure setup codes and pair with homekit_controller (#50986)
* Allow user to override invalid setup codes and pair with homekit_controller

* adjust from manual testing

* invalid -> insecure
2021-05-23 10:15:38 -05:00
Matt Zimmerman
87438dd401 Add services to SmartTub for changing filtration settings (#46980)
Co-authored-by: J. Nick Koston <nick@koston.org>
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2021-05-23 09:00:24 -05:00
J. Nick Koston
e1b6385b4d Add support for doorbell buttons to homekit_controller (#50983) 2021-05-23 08:56:16 -05:00
jjlawren
29205a9239 Sonos use common firmware version (#50861) 2021-05-23 08:43:49 -05:00
Ruslan Sayfutdinov
44bbd9396d Fix typing in config flow helper (#50994) 2021-05-23 14:08:21 +02:00
Daniel Hjelseth Høyer
9b02fd86c5 Update mill library, fix consumption data (#50992)
Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>
2021-05-23 13:11:48 +02:00
Eugenio Panadero
ecb24f01a3 Bump aiopvpc from 2.0.2 to 2.1.1 (#50989)
* Remove pytz dependency and handle timezones with zoneinfo, and adapt to use input timezone as a time zone object or a string identifier
* Fix prices being badly assigned in Canary Islands timezone
* Fix sensor attributes in month changes
2021-05-23 12:48:33 +02:00
Matthias Alphart
5ca5b9ac89 Improve KNX config validation (#50980)
* remove dict repacking

* check binary_sensor device_class

* check cover device_class

* check sensor_type
2021-05-23 10:42:17 +02:00
Malte Franken
3141535d69 Bump geojson_client to 0.6 (#50985)
* bump geojson_client library to version 0.6

* add myself as codeowner
2021-05-23 08:55:02 +02:00
J. Nick Koston
e4c77fd336 Bump aiohomekit to 0.2.62 (#50981)
- Discovery is now instant when a ServiceBrowser is running

Changelog: https://github.com/Jc2k/aiohomekit/compare/0.2.61...0.2.62
2021-05-22 22:22:56 -07:00
Joakim Sørensen
7ff14b47a8 Use whoami for location lookup (#50934) 2021-05-22 20:34:48 -07:00
Franck Nijhof
0cbcb9e0d6 Fix Hue overriding property methods, remove ignored typing (#50976) 2021-05-22 20:32:41 -07:00
Marcin Ciupak
caad125b44 Add support for Oracle DB in recorder (#50090) 2021-05-22 21:10:27 -05:00
GitHub Action
460092ec9a [ci skip] Translation update 2021-05-23 00:13:25 +00:00
Shay Levy
c7ada1e8f6 Fix flaky Shelly config flow test (#50982) 2021-05-23 02:11:02 +03:00
J. Nick Koston
45897b59f2 Turn on samsungtv with wakeonlan (#50964)
If we have the mac address from discovery, we can use it to wake
the TV.  Currently the TV goes unavailable when you turn it off
as the only way to turn it back on is wake on lan or via the remote.

Users who are not using host networking can use a script instead.
2021-05-22 15:33:37 -05:00
Franck Nijhof
f4289b3fca Improve supported_color_modes typing in Light (#50969) 2021-05-22 18:48:58 +01:00
Franck Nijhof
4948bec8d5 Fix is_on attr not being used in binary sensor (#50968) 2021-05-22 19:45:05 +02:00
victorclaessen
a03ee1e528 Fix Volvo On Call lock state (#50832)
* Fix Volvo On Call: Locked shows as Unlocked #43260 and #49224

* Update binary_sensor.py

Black changed 'Door lock' to "Door lock" (double quotes)

* Update homeassistant/components/volvooncall/binary_sensor.py

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

* Update binary_sensor.py

Amend code to pass pylint test

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-22 19:33:02 +02:00
Lén
99e58f3c18 Fix coinbase response pagination (#50890)
* Fix issue #50500

* next is a python keyword
2021-05-22 19:31:49 +02:00
Matej Plavevski
b9086b5e39 Fix Documentation leading to a 404 Page (#50962) 2021-05-22 19:31:00 +02:00
Franck Nijhof
3c8707f912 Fix tcp typing, fixing CI (#50965) 2021-05-22 19:16:11 +02:00
Franck Nijhof
e64b5afa58 Typing improvements for Sentry (#50787)
* Typing improvements for Sentry

* Fix event tags access

* Fix tests
2021-05-22 19:09:19 +02:00
Franck Nijhof
cad4ec867b Define light entity attributes as class variables (#50941) 2021-05-22 09:21:31 -07:00
Franck Nijhof
d3bc2bc47f Define binary_sensor entity attribute as class variables (#50940) 2021-05-22 09:20:34 -07:00
Franck Nijhof
f7bc456bd2 Define sensor entity attributes as class variables (#50942) 2021-05-22 18:17:35 +02:00
Franck Nijhof
38d095aa18 Define entity attributes as entity class variables (#50925)
* Define entity attributes as entity class variables

* Example coronavirus integration

* Example verisure

* Cleanup/typing fixes

* Fix Coronavirus

* Revert "Fix Coronavirus"

This reverts commit 060843860fe300f8448d0d2476de8963d5ddf5a2.

* Revert "Cleanup/typing fixes"

This reverts commit 659b79e75a97007f7181064e446c3e988c2d54bb.

* Define entity attributes as entity class variables (attr alternative)

* Example coronavirus

* Example nut

* Example verisure

* Mark private

* Cleanup after all reverting/cherrypicking/merging

* Implement all entity properties

* Update coronavirus example

* Update nut example

* Update verisure example

* Lets not talk about this one...

* Fix multiple class attribute
2021-05-22 09:13:50 -07:00
Simone Chemelli
b9a0fb93eb Add samsungtv dhcp and zeroconf discovery (#48022)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-05-22 10:41:18 -05:00
PeteBa
aa9b99713c Add purge_entities service call to recorder (#48069) 2021-05-22 10:30:05 -05:00
carstenschroeder
9f04c7ea23 Add Openweathermap cloud coverage forecast (#50961) 2021-05-22 16:54:47 +02:00
Michael
4a64f7a696 Add strict type annotations to tcp (#50877)
* add strict type annotations

* apply suggestions

* rename to TCP_PLATFORM_SCHEMA

* Replace DiscoveryInfoType
2021-05-22 15:45:18 +01:00
Franck Nijhof
560dd0a0cc Typing improvements for TPLink (#50947)
* Typing improvements for TPLink

* Update homeassistant/components/tplink/common.py

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

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-22 13:47:26 +01:00
Maciej Bieniek
afb372a680 Add Final type for constants in sensor component (#50955) 2021-05-22 13:00:53 +01:00
jan iversen
59ae78e5f0 Add restore_state to modbus binary_sensor (#50922)
* Add restore_state to binary_sensor.

* Update return value in State.
2021-05-22 13:38:05 +02:00
Ruslan Sayfutdinov
016abda12e Pylint plugin to check that relative imports are used (#50937)
* Pylint plugin to check that relative imports are used

* Fix existing sites

* Update description message

* Fix typo
2021-05-22 09:15:30 +01:00
Ruslan Sayfutdinov
b704f0e729 Add strict typing to device_tracker (#50930)
* Add strict typing to device_tracker

* Update homeassistant/components/device_tracker/legacy.py

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

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-22 09:15:15 +01:00
Michael
2e316f6fd5 Add strict type annotations to canary (#50943)
* Add strict type annotations

* Add missing futur import

* Apply suggestions

* Apply suggestions
2021-05-22 09:14:59 +01:00
Erik Montnemery
15e2c6d7dc Fix typing for dt_util as_timestamp (#50886)
* Fix typing for dt_util::as_timestamp

* Apply suggestions from code review
2021-05-22 09:34:49 +02:00
Raman Gupta
92d1871de5 Fix flaky vizio test and add comments to explain logic (#50948) 2021-05-22 08:57:30 +02:00
GitHub Action
78be237447 [ci skip] Translation update 2021-05-22 00:12:02 +00:00
Milan Meulemans
5491040693 Fix missing link in scaffold comment (#50936) 2021-05-21 21:21:26 +02:00
Bram Kragten
752a4b9d2c Fix version bump script (#50932) 2021-05-21 19:31:04 +02:00
Ruslan Sayfutdinov
42ff687c32 Add missing type hints to websocket_api (#50915) 2021-05-21 09:39:18 -07:00
Erik Montnemery
dc65f279a7 Add support for state_class to MQTT sensor (#50927) 2021-05-21 17:37:26 +02:00
Shay Levy
6e087039f4 Add min/max/step to MQTT number (#50869) 2021-05-21 18:35:27 +03:00
Michael
8c5c8ed153 Add strict type annotations to fitbit (#50740)
* add strict type annotations

* cast json_load()

* apply suggestions

* move SCAN_INTERVAL back to platform file

* apply suggestion

* apply suggestion

* apply suggestions

* rename to PARENT_PLATFORM_SCHEMA
2021-05-21 13:33:54 +01:00
Martin Hjelmare
b4bb7c38ce Fix zwave_js api typing (#50923) 2021-05-21 14:20:58 +02:00
Martin Hjelmare
07e2f53b37 Add zwave_js add-on info dataclass (#50776) 2021-05-21 13:47:37 +02:00
Erik Montnemery
0c40f37336 Set device_class and state_class for utility_meter (#50921)
* Set device_class and state_class for utility_meter

* Update test

* Tweak tests according to review comments
2021-05-21 13:23:20 +02:00
Ruslan Sayfutdinov
00208ff0d8 Use type safe import for device_tracker.PLATFORM_SCHEMA (#50860) 2021-05-21 13:08:40 +02:00
Erik Montnemery
73d7a754e8 Mark temperature sensors as STATE_CLASS_MEASUREMENT (#50889)
* Mark temperature sensors as STATE_CLASS_MEASUREMENT

* Fix broadlink tests

* Tweak Hue changes
2021-05-21 11:44:34 +02:00
Erik Montnemery
6f26687aa7 Compile statistics for battery, humidity and pressure sensors (#50920) 2021-05-21 10:48:11 +02:00
Vladimír Záhradník
c979101a02 Add Modbus fan integration (#48558)
* Add Modbus fan entity

* Update to PR.

* Pylint.

Co-authored-by: jan Iversen <jancasacondor@gmail.com>
2021-05-21 09:56:47 +02:00
Vladimír Záhradník
80d172140f Add Modbus light integration (#42120)
* Add  Modbus Light and add unit tests

* Update to original PR.

* Review comments.

* Review 2.

Co-authored-by: jan Iversen <jancasacondor@gmail.com>
2021-05-21 08:57:17 +02:00
J. Nick Koston
19aee19efd Resolve race condition in powerview when discovered by zeroconf and dhcp (#50908)
Set the host in the context before checking to ensure
that the second discovery aborts. Seen when testing
on a very fast system only
2021-05-21 07:40:55 +02:00
J. Nick Koston
d9769900bb Bump aiodiscover to 1.4.2 (#50917) 2021-05-21 07:27:52 +02:00
GitHub Action
25bf884156 [ci skip] Translation update 2021-05-21 00:12:09 +00:00
Matthias Alphart
3e1f51883e Create KNX weather entity directly from config (#49640)
* create climate entities directly from config

* deprecate create_sensors

* move create staticmethod to module level

* add comment for deprecation date
2021-05-21 01:30:37 +02:00
J. Nick Koston
eddc1ab778 Handle threads exiting unexpected during shutdown (#50907)
If a thread exits right when we are trying to force an exception
to shut it down, setting the exception will fail with SystemError.
At this point in the shutdown process we want to move on as this
will cause the shutdown to abort
2021-05-21 01:06:37 +02:00
Tobias Sauerwein
0623648309 Clean up Netatmo integration (#50904) 2021-05-20 19:28:21 +02:00
Ville Skyttä
19d25cd901 Change config entry state to an enum (#49654)
* Change config entry state to an enum

* Allow but deprecate EntryState str equality comparison

* Test fixes

* Rename to ConfigEntryState

* Remove str comparability backcompat

* Update new occurrences of strs cropped up during review
2021-05-20 19:19:20 +02:00
Ruslan Sayfutdinov
0e7409e617 Pylint plugin to check __init__ return type (#50868)
* Pylint plugin to check __init__ return type

* Support *args add **kwargs, type hints

* Use 'in' instead of 'any()'

* Fix last few places
2021-05-20 18:00:10 +01:00
Daniel Hjelseth Høyer
fd2e640c74 Use sensor constants in recorder (#50906)
Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>
2021-05-20 18:23:00 +02:00
Ruslan Sayfutdinov
391b2f8ccd Add missing return type in Core constructors (#50884) 2021-05-20 18:53:29 +03:00
Shay Levy
cf228e3fe5 Add constructor return type in integrations A-D (#50903) 2021-05-20 18:51:39 +03:00
Michael
b1138b1aab Add constructor return type in integrations E-K (#50902) 2021-05-20 18:47:30 +03:00
epenet
d7c0da90c5 Add support for DS2405 (#50148) 2021-05-20 17:02:25 +02:00
Michael
9eecd90afc Add constructor return type in integrations T-Z (#50899) 2021-05-20 17:00:19 +02:00
jan iversen
c650deef98 Add base class for all modbus platforms (#50878)
* Add base for all platforms.

* Please pylint.
2021-05-20 16:56:11 +02:00
Maciej Bieniek
f212049fc2 Add constructor return type in integrations O-S (#50896) 2021-05-20 15:58:17 +02:00
Fredrik Tuomas
a65d3868cb Add support for EDS0066 (#50035)
* Add support for EDS0066

* Added a test

* Corrected entity_ids

* Added missing part of sensor entity id

* Add type hint

* Update tests/components/onewire/const.py

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

* Update tests/components/onewire/const.py

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

* Revert "Update tests/components/onewire/const.py"

This reverts commit 4a01b89868bb692bb2911ca5b9f9939611a5ff2f.

* Revert "Update tests/components/onewire/const.py"

This reverts commit 151eb9c0d3303b6bd3b3dc49a1eccd7c1a1b31b8.

Co-authored-by: jan iversen <jancasacondor@gmail.com>
2021-05-20 15:39:34 +02:00
Klaas Schoute
61ef58aa16 bump garage_amsterdam lib to v2.0.5 (#50891) 2021-05-20 15:14:34 +02:00
Tobias Sauerwein
ceec871340 Make Netatmo use async pyatmo (#49717)
* Split initialization from data retrival

* Await class initialization

* Async camera

* More async

* Remove stale code

* Clean up

* Update tests

* Fix test

* Improve error handling

* Bump pyatmo version to 5.0.0

* Add tests

* Add cloudhook test

* Increase coverage

* Add test with no camera devices

* Add test for ApiError

* Add test for timeout

* Clean up

* Catch pyatmo ApiError

* Fix PublicData

* Fix media source bug

* Increase coverage for light

* Test webhook with delayed start

* Increase coverage

* Clean up leftover data classes

* Make nonprivate

* Review comments

* Clean up stale code

* Increase cov

* Clean up code

* Code clean up

* Revert delay

* Update homeassistant/components/netatmo/climate.py

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

* Update homeassistant/components/netatmo/sensor.py

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

* Address comment

* Raise cov

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-20 14:59:19 +02:00
Maciej Bieniek
e06a2a53c4 Add constructor return type in integrations L-N (#50888)
* Add constructor return type in integrations L-N

* Small fix
2021-05-20 13:06:44 +01:00
Artem Draft
f3db819548 Add play_media channel support to LG Netcast (#49527) 2021-05-20 14:03:27 +02:00
Erik Montnemery
e16a8063a5 Compile statistics for energy sensors (#50829)
* Compile statistics for energy sensors

* Update tests

* Rename abs_value to state

* Tweak

* Recreate statistics table

* Pylint

* Try to fix test

* Fix statistics for multiple energy sensors

* Fix energy statistics when last_reset is not set
2021-05-20 13:05:15 +02:00
Maciej Bieniek
aaae4cfc8f Use constants with TypedDict in Nettigo Air Monitor integration (#50883)
* Use constants with TypedDict

* Sensor names as consts
2021-05-20 11:38:46 +01:00
Matthias Alphart
be6a1bf096 Create KNX climate entity directly from config (#49638)
* create climate entities directly from config

* deprecate create_temperature_sensors

* move create staticmethod to module level

* use get() fro optional CONF_SETPOINT_SHIFT_MODE

* Fix deprecated version comment

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-20 12:23:41 +02:00
Maciej Bieniek
953e6ebe62 Use constants with TypedDict (#50880) 2021-05-20 10:36:23 +01:00
Maciej Bieniek
3bdefc5da7 Use constants with TypedDict (#50879) 2021-05-20 10:34:32 +01:00
Maciej Bieniek
ccd8e1332c Address late review comments for AccuWeather integration (#50866)
* Remove unnecessary converting datetime to str

* Address late comments
2021-05-20 09:29:10 +02:00
Erik Montnemery
d4d335fb9c Fix MQTT debug info for removed triggers (#50859) 2021-05-20 10:27:38 +03:00
Martin
623baa7964 Fix zamg station check (#49367) 2021-05-20 09:25:31 +02:00
Paulus Schoutsen
2976bbbbdd Store Hue bridge in hass.data before setting up platforms (#50703)
* Store bridge in hass.data before setting up platforms

* Self
2021-05-20 09:08:23 +02:00
Felipe Martins Diel
7350942e9e Implement heartbeat in the Broadlink integration (#43878)
* Implement heartbeat in the Broadlink integration

* Rename INTERVAL to HEARTBEAT_INTERVAL

* Test that we log an error message when the heartbeat fails
2021-05-20 08:10:13 +02:00
GitHub Action
a021fe301c [ci skip] Translation update 2021-05-20 00:11:53 +00:00
shbatm
a49d5c4266 Add ISY994 System Health Info (#50840)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-05-19 19:10:09 -05:00
shbatm
cdf18bd4b1 Add Z-Wave Parameter and Node Rename Services to ISY994 (#50844) 2021-05-19 19:08:35 -05:00
Franck Nijhof
f44efb1eea Upgrade watchdog to 2.1.2 (#50863) 2021-05-20 00:12:27 +02:00
Franck Nijhof
ab9aa4466e Fix SolarEdge active check on entry setup (#50873) 2021-05-19 23:15:00 +02:00
Charles Garwood
9f754f1643 bump envoy_reader to 0.19.0 (#50827) 2021-05-19 22:30:31 +02:00
Erik Montnemery
5ee362bc34 Store sensor last_reset attribute as a string, not a datetime (#50851)
* Store last_reset attribute as a string, not a datetime

* Update tests
2021-05-19 12:28:00 -07:00
Maciej Bieniek
7573adda7f Add Final type for all core constants (#50858)
* Add Final type for all constants

* Add Final for one missing const

* Suggested change
2021-05-19 19:31:38 +03:00
Franck Nijhof
ae561542c3 Merge pull request #50862 from home-assistant/rc 2021-05-19 17:30:25 +02:00
Franck Nijhof
163d2788b6 Bumped version to 2021.5.5 2021-05-19 16:54:05 +02:00
Tobias Sauerwein
f141ed6977 Bump pyatmo to 4.2.3 (#50801)
* Bump pyatmo to 4.2.3

* Fix typo and update test fixture
2021-05-19 16:53:27 +02:00
jjlawren
7603bf8145 Bump pysonos to 0.0.47 (#50792) 2021-05-19 16:53:03 +02:00
Erik Montnemery
9a8317db1d Bump hatasmota to 0.2.13 (#50662)
* Bump hatasmota to 0.2.13

* Process review comment

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

* Tweak brightness compensation, improve tests

Co-authored-by: Franck Nijhof <git@frenck.dev>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-19 16:50:55 +02:00
jjlawren
b86cb7a072 Backport Sonos handle subscription failures (#50796) 2021-05-19 16:47:43 +02:00
jan iversen
892a2a0372 Push modbus switch to 100% test coverage (#50324)
push modbus switch to 100% test coverage.
2021-05-19 15:05:29 +02:00
Michael Klamminger
7c7432a582 Add entity_id to mqtt sensor templates (#50773)
* Add entity_id to mqtt sensor

* update test comment
2021-05-19 14:38:18 +02:00
Shay Levy
109b08bb57 Remove MQTT cover deprecated options (#50263)
* Remove MQTT cover deprecated options

* Fix pylint
2021-05-19 14:34:20 +02:00
Maciej Bieniek
f192702648 Add Nettigo Air Monitor uptime sensor (#50834) 2021-05-19 13:20:11 +02:00
Shay Levy
c4ced2b351 Bump aioshelly to 0.6.3 (#50857) 2021-05-19 13:53:26 +03:00
Franck Nijhof
bcd022ff34 Upgrade freesms to 0.2.0 (#50853) 2021-05-19 12:48:00 +02:00
dependabot[bot]
d9a5e2cb68 Bump actions/stale from 3.0.18 to 3.0.19 (#50810)
Bumps [actions/stale](https://github.com/actions/stale) from 3.0.18 to 3.0.19.
- [Release notes](https://github.com/actions/stale/releases)
- [Commits](https://github.com/actions/stale/compare/v3.0.18...v3.0.19)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-19 12:38:29 +02:00
RogerSelwyn
456c600617 Correct positioning of except statement in speedtestdotnet (#50852) 2021-05-19 11:43:41 +02:00
David Bonnes
28e9b9e01d Add evohome water_heater service calls, bump client to 0.3.15 (#50803) 2021-05-19 11:41:20 +02:00
jan iversen
b7fc537cd5 Remove non pymodbus_call from modbus.py. (#50813) 2021-05-19 11:39:53 +02:00
dependabot[bot]
f14f7134b3 Bump home-assistant/wheels from 2021.05.3 to 2021.05.4 (#50809)
Bumps [home-assistant/wheels](https://github.com/home-assistant/wheels) from 2021.05.3 to 2021.05.4.
- [Release notes](https://github.com/home-assistant/wheels/releases)
- [Commits](https://github.com/home-assistant/wheels/compare/2021.05.3...2021.05.4)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-19 12:12:20 +03:00
Maciej Bieniek
bce5f8ee05 Improve AccuWeather type annotations (#50616)
* Improve type annotations

* Remove unused argument

* Simplify state logic

* Fix uvindex state

* Fix type for logger

* Increase tests coverage

* Fix pylint arguments-differ error

* Suggested change

* Suggested change

* Remove unnecessary variable

* Remove unnecessary conditions

* Use int instead of list for forecast days

* Add enabled to sensor types dicts

* Fix request_remaining conversion and tests

* Run hassfest

* Suggested change

* Suggested change

* Do not use StateType
2021-05-19 09:37:16 +01:00
Ruslan Sayfutdinov
62386c8676 Enable type checks for device_tracker (#50805)
* Enable type checks for device_tracker

* Fix MQTT test
2021-05-19 09:36:26 +01:00
jan iversen
4c7fcae536 Small bug fixes in modbus due to async (#50812)
* Small bug fixes due to async.

* _available is true in turn_on/turn_off

* Remove double update.

* Set _available.
2021-05-19 10:13:48 +02:00
Franck Nijhof
ebe1059c34 Move SolarEdge API init and add unload (#50823)
* SolarEdge: Move API init, add unload

* Slim down try-except block
2021-05-19 10:09:47 +02:00
Tobias Sauerwein
3ed416ed4c Bump pyatmo to 4.2.3 (#50801)
* Bump pyatmo to 4.2.3

* Fix typo and update test fixture
2021-05-19 08:47:06 +02:00
Ville Skyttä
a2363f0243 Upgrade huawei-lte-api to 1.4.18 (#50828)
https://github.com/Salamek/huawei-lte-api/releases/tag/1.4.18

Closes https://github.com/home-assistant/core/issues/50777
2021-05-19 08:24:04 +02:00
J. Nick Koston
f1d02bb137 Expand homekit zeroconf matching to use fnmatch (#50381) 2021-05-19 00:20:56 -05:00
J. Nick Koston
e37256570c Add missing return type in zeroconf (#50847) 2021-05-18 22:49:10 -05:00
Maciej Bieniek
a58eae1bf1 Bump brother library version (#50833) 2021-05-18 22:32:11 -05:00
jjlawren
ab86c7a135 Clean up Sonos resubscription failure logic and logging (#50831) 2021-05-18 22:15:16 -05:00
jjlawren
3d5b354def Bump pysonos to 0.0.49 (#50841) 2021-05-18 20:31:38 -05:00
RogerSelwyn
26a99df0ea Capture error when speedtest module fails to identify best server (#50821)
* Capture error when speediest module fails to identify best server

* Fix pylint error

* Fix formatting with black.

Co-authored-by: Rohan Kapoor <rohan@rohankapoor.com>
2021-05-18 17:33:37 -07:00
GitHub Action
0a49de75d9 [ci skip] Translation update 2021-05-19 00:11:31 +00:00
Paulus Schoutsen
c890966ce4 Updated frontend to 20210518.0 (#50842) 2021-05-18 15:54:14 -07:00
Michael
2cd2e46d73 Disable AVM FRITZ!Box Tools device_tracker entities by default (#50791) 2021-05-18 22:16:49 +02:00
shbatm
775af9d2c5 Update PyISY to v3.0.0 and ISY994 to use Async IO (#50806) 2021-05-18 14:15:47 -05:00
Aaron David Schneider
1d174a1f6f Bump pysonos to 0.0.48 (#50798) 2021-05-18 08:40:51 +02:00
Jan Bouwhuis
9abf43f95f Mqtt fan feature for resetting current speed percentage or preset_mode (#50565)
* Mqtt fan resetting speed percentage or preset_mode

* tests reset payload is working with val templates

* Remove duplicate line for CONF_PAYLOAD_HIGH_SPEED
2021-05-18 08:24:42 +02:00
J. Nick Koston
5da0191fe3 Bump zeroconf to 0.31.0 (#50807) 2021-05-17 20:52:08 -07:00
J. Nick Koston
3cc3cacd08 Start ServiceBrowser as soon as possible in zeroconf (#50784)
Co-authored-by: Ruslan Sayfutdinov <ruslan@sayfutdinov.com>
2021-05-17 20:51:05 -07:00
Shay Levy
7a60d0eae4 Enable back free-mobile (#50802) 2021-05-17 20:41:56 -07:00
Dermot Duffy
2e1037005c Allow camera stream to fail safely (#50728) 2021-05-17 20:34:25 -07:00
GitHub Action
1f80defe3a [ci skip] Translation update 2021-05-18 00:12:13 +00:00
Erik Montnemery
1ea0d8ae02 Correct trace of condition actions (#50800) 2021-05-17 16:54:17 -07:00
Paulus Schoutsen
781524ee36 Updated frontend to 20210517.0 (#50804) 2021-05-17 16:54:06 -07:00
J. Nick Koston
a43561e3e6 Ensure startup can proceed if async_get_integration raises (#50799)
* Ensure startup can proceed if async_get_integration raises

There were cases where the event would never get set and
startup would deadlock because the second attempt to load
the integration would block forever

* pylint

* reorder
2021-05-17 17:32:05 -05:00
jjlawren
8129db1cfe Handle Sonos subscription renewal failures (#50793) 2021-05-17 17:26:48 -05:00
Erik Montnemery
9e681cd214 Refactor MQTT basic light pt5: Add RGB color helpers (#50780)
* Refactor MQTT basic light pt5: Add RGB color helpers

* Revert change of rounding instead of truncating RGB
2021-05-17 23:50:12 +02:00
J. Nick Koston
e7f7e61e88 Ensure a wal checkpoint is scheduled nightly (#50746) 2021-05-17 16:27:51 -05:00
jjlawren
b1ff9dc45e Bump pysonos to 0.0.47 (#50792) 2021-05-17 16:06:13 -05:00
G Johansson
6f7ae3727b Bump yalesmartalarmclient to 0.3.3 (#50613) 2021-05-17 22:39:56 +02:00
jan iversen
ba827db8ec Update remaining modbus platforms to use pymodbus_call (#50768) 2021-05-17 22:12:18 +02:00
Paulus Schoutsen
f762d3c748 Fire time changed event in Hue tests (#50783) 2021-05-17 22:03:47 +02:00
Ruslan Sayfutdinov
5ad71b5e45 Define sync hass.create_task function (#50788) 2021-05-17 14:54:06 -05:00
Paulus Schoutsen
1e10772497 Add support for local push channels to mobile_app (#50750) 2021-05-17 11:06:42 -07:00
J. Nick Koston
72288710ca Increase the sqlite cache size from ~2MiB to 8MiB (#50747) 2021-05-17 19:42:12 +02:00
Michael Klamminger
3554316f3f Update MQTT cover template handling (#50236)
* flake 8

* Implement feedback from PR

* update warning message

* added and updated tests

* remove _has_tilt_topic variable

* flake 8

* Implement feedback from PR

* update warning message

* added and updated tests

* remove _has_tilt_topic variable

* renamed _tilt_message_received to _tilt_payload_received

* merged with latesed upstream/dev

* converted if to try except for type check

* Implemented the suggestions of @emontnemery

* Tweak tests

* logger info to debug

Co-authored-by: Shay Levy <levyshay1@gmail.com>

* cast tilt payload as int; combine exceptions to one line

* Add test for JSONDecodeError

* Update homeassistant/components/mqtt/cover.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>
Co-authored-by: Shay Levy <levyshay1@gmail.com>
2021-05-17 19:31:11 +02:00
Ruslan Sayfutdinov
72dfa8606e Enable strict typing for air_quality component (#50722) 2021-05-17 08:20:05 -07:00
Paulus Schoutsen
56774a9f63 Hue: unique ID for groups + remote events (#50748) 2021-05-17 08:07:25 -07:00
Joakim Sørensen
c8486879ae Update devcontainer to Python 3.9 (#50778) 2021-05-17 07:54:14 -07:00
dependabot[bot]
8dc8e885c8 Bump home-assistant/builder from 2021.04.2 to 2021.05.0 (#50754)
Bumps [home-assistant/builder](https://github.com/home-assistant/builder) from 2021.04.2 to 2021.05.0.
- [Release notes](https://github.com/home-assistant/builder/releases)
- [Commits](https://github.com/home-assistant/builder/compare/2021.04.2...2021.05.0)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-17 16:43:18 +02:00
Erik Montnemery
848ab5c2bc Deduplicate code in MQTT basic light pt4: Add set_optimistic helper (#50774) 2021-05-17 16:28:30 +02:00
Joakim Sørensen
2f10f59717 Block custom integrations with missing or invalid version (#49916) 2021-05-17 15:48:41 +02:00
Matthias Alphart
ac6d99d434 Create KNX binary_sensor entities directly from config (#50708) 2021-05-17 15:33:09 +02:00
Franck Nijhof
9afa7df3c1 Upgrade apprise to 0.9.3 (#50769) 2021-05-17 15:06:36 +02:00
Erik Montnemery
8c6f4a8c71 Refactor MQTT basic light pt3: Add publish helper (#50767) 2021-05-17 14:54:19 +02:00
Erik Montnemery
b36021b4fd Deduplicate code in MQTT basic light pt2: Add restore_state helper (#50766)
* Refactor MQTT basic light pt2: Add restore_state helper

* Update homeassistant/components/mqtt/light/schema_basic.py

Co-authored-by: Shay Levy <levyshay1@gmail.com>

Co-authored-by: Shay Levy <levyshay1@gmail.com>
2021-05-17 14:53:48 +02:00
Martin Hjelmare
add594a44b Clean up smhi redundant code (#50765) 2021-05-17 14:34:58 +02:00
jan iversen
6b34ba012c Fix missing await in modbus platforms (followup on async PR) (#50710) 2021-05-17 14:20:51 +02:00
Maciej Bieniek
97559087b5 Allow some failures before setting Xiaomi Miio MIOT air purifiers unavailable (#50755) 2021-05-17 14:13:01 +02:00
nikito7
0fac3ccebc Change Modbus error message to bytes (#50725) 2021-05-17 14:12:17 +02:00
Michael
df6862a519 Add strict type annotations to amazon_polly (#50697)
* add strict type annotations

* apply suggestions

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2021-05-17 14:09:52 +02:00
Simone Chemelli
9e86602950 Fix strings for UPNP (#50762) 2021-05-17 14:07:01 +02:00
Franck Nijhof
eccefd154a Extend targets for entity component services (#50760) 2021-05-17 14:06:50 +02:00
Erik Montnemery
ee4e14e45e Hoist ATTR_LAST_RESET from utility_meter to SensorEntity (#50757) 2021-05-17 13:51:09 +02:00
Austin Mroczek
a9c73ac264 Fix armed_night logic in totalconnect alarm and add tests (#50694)
* Fix armed_night, add tests for alarm

* end assertions with expected values
2021-05-17 13:18:50 +02:00
Erik Montnemery
3ab14d452c Refactor MQTT basic light pt1: Add add_topic helper (#50759) 2021-05-17 12:50:54 +02:00
Franck Nijhof
74c20cdaa1 Upgrade geopy to 2.1.0 (#50714) 2021-05-17 12:26:44 +02:00
CantankerousBullMoose
9316f566c9 Rescan static wemo (#49934)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-05-17 12:18:14 +02:00
Matthias Alphart
1c7242a37a Create KNX cover entities directly from config (#50707) 2021-05-17 12:17:19 +02:00
Franck Nijhof
9ee3b77135 Remove discovery from iCloud (#50751) 2021-05-17 12:14:54 +02:00
Franck Nijhof
ecac574eb0 Upgrade pyupgrade to v2.16.0 (#50756) 2021-05-17 11:27:09 +02:00
jan iversen
ff856a9bba Simplify calls to pymodbus (#50717)
* simplify pymodbus_call.

Do not call with a function object and a check attribute, call instead
with CALL_TYPE*.

Avoid if <type> call x else call y.
Call async_pymodbus_call directly, instead of unpacking/packing.

* Declare call type in __init__.

* Modbus.py back to 100% test coverage.
2021-05-17 11:20:12 +02:00
Matthias Alphart
7b18860dcd Update xknx to version 0.18.2 (#50491)
* xknx 0.18.2

* individual colors without switch

* make `setpoint_shift_mode` optional

* Update homeassistant/components/knx/schema.py
2021-05-17 11:18:13 +02:00
Michael
f9c7474a78 Add strict type annotations to ampio (#50699) 2021-05-17 11:14:47 +02:00
mountainsandcode
2d29959a52 Add control of hardware buttons to Sonos (#49977) 2021-05-17 11:12:01 +02:00
Álvaro Fernández Rojas
4357d2dc84 Update AEMET library to latest version (#50222)
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2021-05-17 11:07:53 +02:00
Franck Nijhof
059e7c925d Remove side effects from Watson TTS init (#50716) 2021-05-17 10:46:58 +02:00
Franck Nijhof
a414cad3b2 Upgrade aiodns to 3.0.0 (#50712) 2021-05-17 10:46:37 +02:00
David Nielsen
636528dd2e Update bravia-tv to 1.0.11 (#50726) 2021-05-17 09:37:13 +02:00
Paulus Schoutsen
5ea2dd8ce3 Alexa: Set Equalizer property to retrievable (#50730) 2021-05-17 09:26:37 +02:00
Kevin Eifinger
663c0374ab Add full typing to kraken (#50718)
* Add full typing to kraken

* Let device_info return DeviceInfo

* Replace unsub_listeners with entry.async_on_unload

* Raise TypeError on end of _try_get_state

* Assert Coordinator is not none

* Add class SensorType

* Add strict typing to kraken

* Add changes from code review

* Revert typed dict creation
2021-05-17 10:12:04 +03:00
Michael
120bf8aed7 fix annotation in actiontec (#50727) 2021-05-17 09:28:22 +03:00
Paulus Schoutsen
1b74359ddb Disable free-mobile because requirement breaks setuptools (#50749) 2021-05-17 08:12:23 +02:00
GitHub Action
877cb43c06 [ci skip] Translation update 2021-05-17 05:17:18 +00:00
starkillerOG
db7331847f AlexaEqualizerController fix wrong class beeing used (#50724) 2021-05-16 20:49:48 -07:00
Michael
22d8f9519e Fix configflow strings for step user in fritz (#50742) 2021-05-16 20:49:31 -07:00
Ruslan Sayfutdinov
6b38adaa3d Downgrade setuptools to fix CI (#50734) 2021-05-16 20:36:23 -07:00
Matthias Alphart
05c6f3ca1d Create KNX light entities directly from config (#50700)
* create light entities directly from config

* review changes
2021-05-16 22:45:28 +02:00
Erik Montnemery
89dd3292ba Initial draft of statistics (#49852) 2021-05-16 10:23:37 -07:00
Ruslan Sayfutdinov
703456abea Better errors handling in mypy hassfest plugin (#50689) 2021-05-16 07:04:09 -07:00
Matthias Alphart
3200b0150a Create KNX notify entities directly from config (#50709) 2021-05-16 12:07:44 +02:00
Mickaël Le Baillif
c2e2b046d9 Add new voices for Watson TTS (#48722)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-05-16 11:12:05 +02:00
jjlawren
b84cf915f3 Centralize storage and updating of Sonos favorites (#50581)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-16 11:11:35 +02:00
jan iversen
224cc779c4 Correct Modbus platform cover restore state (#50421)
* Correct cover restore state.

* Change mock usage.

* Add states to convert.
2021-05-16 08:40:19 +02:00
Matthias Alphart
1e11bfae05 Create KNX fan entities directly from config (#50702) 2021-05-16 08:34:14 +02:00
Dror Eiger
0556c35e24 Set zwave_js cover device_class for shutters and blinds (#50643)
* Set device_class for shutters and blinds

* Add missing. imports

* Add tests for device class setting

* Clean up

* Avoid storing the node in an unused variable

* Fix entity name

* Extend qubino shutter discovery

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-16 08:26:16 +02:00
Matthias Alphart
222336a1db Create KNX scene entities directly from config (#50686) 2021-05-16 08:14:28 +02:00
Andre Lengwenus
a92acdb528 Fix selectors and defaults in LCN service.yaml (#50705) 2021-05-16 08:06:28 +02:00
Zac West
b8713774c8 Make confirmable notification blueprint use unique actions (#50706) 2021-05-15 22:50:24 -07:00
Michael
edccb7eb58 Add strict type annotations to actiontect (#50672)
* add strict type annotations

* fix pylint, add coverage omit

* apply suggestions

* fix rebase conflict

* import PLATFORM_SCHEMA as BASE_PLATFORM_SCHEMA

* correct get_device_name() return annotation
2021-05-16 00:59:57 +03:00
Kevin Eifinger
256a2de7ce Add kraken code review changes (#50683) 2021-05-15 22:55:50 +02:00
Michael
7f6b8bbd1e Add strict type annotations to aladdin_connect (#50693)
* add strict type annotations

* add missing return type annotation
2021-05-15 23:53:42 +03:00
Michael
bc006c9ecc Add strict type annotations to aftership (#50692)
* add strict type annotations

* import PLATFORM_SCHEMA as BASE_PLATFORM_SCHEMA

* bring needed return back
2021-05-15 23:53:10 +03:00
Franck Nijhof
e293d35ac9 Clean up WLED tests (#50685)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-15 22:14:56 +02:00
Simone Chemelli
8bc75e91a0 Add color effect to Shelly's color devices (#48052)
* Add color effect

* Final commit based on updated firmware

* Update homeassistant/components/shelly/light.py

Co-authored-by: Shay Levy <levyshay1@gmail.com>

* Update homeassistant/components/shelly/light.py

Co-authored-by: Shay Levy <levyshay1@gmail.com>

* Update homeassistant/components/shelly/light.py

* Fix flake

Co-authored-by: Shay Levy <levyshay1@gmail.com>
2021-05-15 22:43:06 +03:00
jan iversen
ca558545a1 Use mock_restore_state in testing of modbus sensor (#50455) 2021-05-15 21:39:41 +02:00
Martin Hjelmare
5da64d01e2 Fix smhi typing (#50690) 2021-05-15 21:38:12 +02:00
Franck Nijhof
cad41cd4ed Clean up unused method from SolarEdge tests (#50684) 2021-05-15 21:27:04 +02:00
jjlawren
1afb0a0841 Sonos improve radio metadata handling (#50493) 2021-05-15 21:19:16 +02:00
Klaas Schoute
e1dd479e15 Add Garages Amsterdam integration (#43157)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Franck Nijhof <git@frenck.dev>
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2021-05-15 20:43:12 +02:00
Filipe Pina
0c37effc72 Add SSL support to TCP integration (#48060)
Co-authored-by: Michael <35783820+mib1185@users.noreply.github.com>
2021-05-15 20:29:11 +02:00
Martin Hjelmare
dab66a58ce Clean smhi tests (#50681) 2021-05-15 20:22:32 +02:00
Michael
562e0d785d Add strict type annotations to acer_projector (#50657) 2021-05-15 19:55:28 +02:00
jan iversen
ad7be91b6a Fix modbus blocking threads (#50619)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-15 19:54:17 +02:00
Franck Nijhof
990b7c371f Upgrade PyTurboJPEG to 1.5.0 (#50670) 2021-05-15 19:41:48 +02:00
Franck Nijhof
aa6b26c9ff Upgrade defusedxml to 0.7.1 (#50671) 2021-05-15 19:41:34 +02:00
Franck Nijhof
de77e0be8c Upgrade pylint to 2.8.2 (#50669) 2021-05-15 19:41:17 +02:00
Erik Montnemery
97d7037d12 Bump hatasmota to 0.2.13 (#50662)
* Bump hatasmota to 0.2.13

* Process review comment

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

* Tweak brightness compensation, improve tests

Co-authored-by: Franck Nijhof <git@frenck.dev>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-15 19:36:08 +02:00
Sascha Sander
f142f29255 Add PV3 / DC3 sensors to Kostal Plenticore (#50614)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-05-15 18:54:12 +02:00
Franck Nijhof
c1be4cbd79 Upgrade numpy to 1.20.3 (#50660) 2021-05-15 12:28:03 -04:00
tkdrob
7b5fff357e Add targets and selectors for services (X-Z) (#50639)
* Add targets and selectors for services (X-Z)

* Adjustments
2021-05-15 12:24:52 -04:00
Martin Hjelmare
d84962bada Fix smhi retry (#50673) 2021-05-15 18:24:34 +02:00
J. Nick Koston
8e38f26978 Add support for asair brand to nexia (#50504) 2021-05-15 16:24:36 +02:00
Franck Nijhof
bdeeb54d2d Deprecate PVPC YAML configuration (#50656) 2021-05-15 16:09:44 +02:00
Franck Nijhof
64a6a75330 Upgrade pyupgrade to v2.15.0 (#50666) 2021-05-15 16:04:08 +02:00
Franck Nijhof
71c21693ef Upgrade flake8-comprehensions to 3.5.0 (#50665) 2021-05-15 16:02:10 +02:00
Franck Nijhof
5ce07e689a Upgrade flake8 to 3.9.2 (#50664) 2021-05-15 15:55:45 +02:00
David De Sloovere
bdc1ab2b88 Flic bump lib to 2.0.3 (#50483) 2021-05-15 15:55:07 +02:00
Franck Nijhof
4025443b67 Upgrade black to 21.5b1 (#50661) 2021-05-15 15:39:45 +02:00
Pascal Vizeli
f84ceee7b7 Bump OpenCV 4.4.0.42 (#50640) 2021-05-15 15:00:03 +02:00
Franck Nijhof
7ae050c5ac Upgrade watchdog to 2.1.1 (#50659) 2021-05-15 14:56:49 +02:00
Franck Nijhof
8a135ce0f6 Deprecate Meteo-France YAML configuration (#50658) 2021-05-15 14:56:28 +02:00
Franck Nijhof
c6860dc999 Deprecate JuiceNet YAML configuration (#50655) 2021-05-15 14:13:20 +02:00
Franck Nijhof
00e90736bd Deprecate Islamic Prayer Times YAML configuration (#50654) 2021-05-15 14:12:40 +02:00
Franck Nijhof
b2c0bebbf0 Deprecate VeSync YAML configuration (#50652) 2021-05-15 13:56:23 +02:00
Franck Nijhof
625e6ceff3 Deprecate Soma Connect YAML configuration (#50651) 2021-05-15 13:46:16 +02:00
Franck Nijhof
d72a10a5e9 Deprecate Plum Lightpad YAML configuration (#50650) 2021-05-15 13:45:54 +02:00
Franck Nijhof
599db742a3 Deprecate Mikrotik YAML configuration (#50649) 2021-05-15 13:45:25 +02:00
Franck Nijhof
c9b25fe2a2 Remove YAML configuration from Local IP (#50642) 2021-05-15 13:45:10 +02:00
Franck Nijhof
117860f13b Update Hue IoT Class to Local Push (#50637) 2021-05-15 13:30:23 +02:00
Franck Nijhof
8d551e3f7b Deprecate Transmission YAML configuration (#50648) 2021-05-15 13:25:00 +02:00
Franck Nijhof
704a996956 Deprecate Tibber YAML configuration (#50646) 2021-05-15 13:17:10 +02:00
Franck Nijhof
e7392609e3 Deprecate Jandy iAqualink YAML configuration (#50644) 2021-05-15 13:09:45 +02:00
Franck Nijhof
f2f64348e7 Deprecate MELCloud YAML configuration (#50645) 2021-05-15 13:09:18 +02:00
tkdrob
77bed66a4d Fix roon services.yaml (#50638) 2021-05-15 11:41:43 +02:00
tkdrob
a9660d5788 Add targets and selectors for services (L-M) (#50543) 2021-05-15 11:06:34 +02:00
tkdrob
5d6f4068d3 Add targets and selectors for services (U-W) (#50630)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-05-15 10:49:10 +02:00
tkdrob
bd443af6a2 Add targets and selectors for services (N-O) (#50608) 2021-05-15 10:30:18 +02:00
tkdrob
0eca26607d Add targets and selectors for services (D-E) (#50190) 2021-05-15 09:25:19 +02:00
Michael
25b2fd0cee Add strict typing to fritzbox (#50486)
* enable strict typing

* apply suggestions

* set defaults for FritzboxConfigFlow

* improvements and suggestions

* another suggestion

* tweaks

* tweaks
2021-05-15 07:54:11 +02:00
tkdrob
d37a3cded0 Add targets and selectors for services (S-T) (#50629) 2021-05-14 22:30:41 -07:00
tkdrob
2d5f5bfa9f Add targets and selectors for services (P-R) (#50628) 2021-05-14 22:07:17 -07:00
Ville Skyttä
ed10856cc4 UpCloud API and typing update (#50624) 2021-05-14 21:49:41 -07:00
Franck Nijhof
7221b1e09d Sort effect lists in light groups (#50620) 2021-05-14 21:43:43 -07:00
Paulus Schoutsen
7a0f245f92 Merge pull request #50627 from home-assistant/rc 2021-05-14 14:56:50 -07:00
Martin Hjelmare
e32dc306e1 Fix oauth2 helper user step typing (#50618) 2021-05-14 23:39:14 +02:00
Paulus Schoutsen
77a6d7317f Bumped version to 2021.5.4 2021-05-14 14:25:39 -07:00
Erik Montnemery
2a949cff0e Update light intents to check supported_color_modes (#50625) 2021-05-14 14:25:32 -07:00
Aaron Bach
57d8e7483d Fix IQVIA failing to start if any API call fails (#50615)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-05-14 14:25:31 -07:00
Erik Montnemery
728bead3b7 Update light device actions to check supported_color_modes (#50611) 2021-05-14 14:25:30 -07:00
Joakim Sørensen
0b5a077d55 Bump pyhaversion from 21.3.0 to 21.5.0 (#50540) 2021-05-14 14:25:29 -07:00
jjlawren
3e8d840905 Skip adding battery on S1 Sonos devices (#50536) 2021-05-14 14:25:28 -07:00
kennedyshead
8e3894a441 Bumps aioasuswrt to 1.3.4 (#50414) 2021-05-14 14:23:52 -07:00
Tobias Sauerwein
d8379c57b4 Fix battery attribute (#50405) 2021-05-14 14:23:51 -07:00
Erik Montnemery
bcd8f43e7b Update light intents to check supported_color_modes (#50625) 2021-05-14 14:23:29 -07:00
Aaron Bach
9c5f1b4406 Fix IQVIA failing to start if any API call fails (#50615)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-05-14 14:23:16 -07:00
Erik Montnemery
960ed13f94 Update light device actions to check supported_color_modes (#50611) 2021-05-14 22:58:37 +02:00
Paulus Schoutsen
646af533f0 Add support for Hue push updates (#50591) 2021-05-14 13:39:57 -07:00
Pascal Vizeli
7fd2f8090d Fix grpc Alpine 3.13 / i386 (#50623) 2021-05-14 22:22:35 +02:00
Raphael
2334e98806 Add Etekcity VeSync light bulbs to Homeassistant (#50272) 2021-05-14 14:41:13 -05:00
tkdrob
1160a5f239 Add targets and selectors for services (I-K) (#50542)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-05-14 20:34:59 +02:00
tkdrob
40993f3ebb Add DHCP support to goalzero (#50425) 2021-05-14 13:12:46 -05:00
Simone Chemelli
4d55290932 Fritz code quality improvements from #48287 and #50055 (#50479)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-05-14 11:46:37 -05:00
tkdrob
77e6fc6f93 Add missing requirements and target to sonos services (#50552) 2021-05-14 17:40:30 +02:00
Kevin Eifinger
c220e70008 Add integration kraken (#31114)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-05-14 08:02:11 -07:00
Franck Nijhof
a8e1a68d1f Deprecate NZBGet YAML configuration (#50603) 2021-05-14 15:51:25 +02:00
Franck Nijhof
20a39ab7e1 Remove unused config schema & logger from totalconnect (#50604) 2021-05-14 15:49:18 +02:00
Charles Garwood
f33b45ec82 Add interview feedback for Z-Wave JS add node websocket (#50384)
* Add interview feedback for add node websocket

* cleanup leftover logging

* add tests

* test interview failed event

* fix event type

* include manufacturer & model from device registry

* update test
2021-05-14 09:47:09 -04:00
Franck Nijhof
f5c31b89f8 Deprecate SmartHab YAML configuration (#50602) 2021-05-14 15:46:49 +02:00
Thomas Schamm
8fcf06a2a9 Add bosch_shc supporting Bosch Smart Home Controller (#34063)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-14 15:03:26 +02:00
Pascal Vizeli
9d174e8a05 GRPC is fixed, don't need a workaround (#50605)
* GRPC is fixed, don't need a workaround

* Update gen_requirements_all.py
2021-05-14 14:30:48 +02:00
Pascal Vizeli
404188d005 Update wheel action to 2021.05.3 (#50607) 2021-05-14 14:04:53 +02:00
tkdrob
6f5629cf14 Add targets and selectors for services (B-C) (#50189) 2021-05-14 13:38:41 +02:00
Álvaro Fernández Rojas
9247a157d8 Add AEMET conditional station updates (#50227) 2021-05-14 13:28:48 +02:00
Franck Nijhof
42df6750e2 Refactor AdGuard config flow tests (#50566) 2021-05-14 13:19:24 +02:00
Franck Nijhof
ca2b3fcc9e Upgrade evdev to 1.4.0 (#50601) 2021-05-14 12:15:15 +02:00
jan iversen
19cdff10c3 Add "close_comm_on_error" to modbus configuration (#50583) 2021-05-14 10:54:23 +02:00
djtimca
7ea23533cf Address late review for Omnilogic Switch (#50404)
* Address previous PR comments.

* Update all instances of async_schedule_update_ha_state to async_write_ha_state.
2021-05-14 10:02:54 +02:00
muppet3000
207ee39d00 Bump growattServer library (#50588) 2021-05-14 09:50:41 +02:00
Maciej Bieniek
4c68518b18 Bump accuweather library (#50573) 2021-05-14 09:38:44 +02:00
Ruslan Sayfutdinov
de5472403b Use mypy-friendly conditional import for zoneinfo (#50444) 2021-05-13 22:36:49 -07:00
Paulus Schoutsen
aef24a807e Yeelight: Do not log errors when cannot connect (#50592) 2021-05-13 22:33:18 -07:00
Brandon Rothweiler
122741b914 Add lock platform to the Mazda integration (#50548) 2021-05-13 22:52:52 -05:00
jjlawren
c52a33478e Fix Sonos favorites race condition v2 (#50575) 2021-05-13 20:32:34 -07:00
uvjustin
e8d7d96231 Roll back #47852 (shield httpx in generic) (#50562) 2021-05-13 20:32:06 -07:00
jan iversen
dbf7430003 Bump pymodbus to v2.5.2 (#50582)
Solves a serial - rs-485 adapter issue.
2021-05-13 20:31:48 -07:00
Franck Nijhof
d6e9f094c4 Cleanup unused CONFIG_SCHEMA from kmtronic (#50567) 2021-05-13 20:30:15 -07:00
J. Nick Koston
42d1ec753d Small tweaks to improve homekit_controller startup time (#50590) 2021-05-13 20:16:20 -05:00
Franck Nijhof
a16629601a Add support for tracking entity attributes in ESPHome (#50528) 2021-05-13 15:39:53 -07:00
Ruslan Sayfutdinov
35f304450c Enable type checks for stream component (#50527)
* Enable type checks for stream component

* Fix pylint
2021-05-13 23:26:11 +02:00
tkdrob
e956a726a0 Fix SonarrEntity docstring (#50568) 2021-05-13 14:43:52 -05:00
Maciej Bieniek
6adbc702eb Bump brother library (#50572) 2021-05-13 13:14:00 -05:00
Pascal Vizeli
47d4928d62 Revert "Use requirements for constraints" (#50576)
This reverts commit 136b34af20.
2021-05-13 19:35:58 +02:00
J. Nick Koston
52edf9ac35 Ensure isy994 is only discovered once (#50577)
The formatting of the mac was different between dhcp and ssdp
2021-05-13 19:35:24 +02:00
Barry Quiel
c079803fcb Powerwall add Current attribute (#50550) 2021-05-13 11:12:48 -05:00
Pascal Vizeli
136b34af20 Use requirements for constraints (#50558) 2021-05-13 08:07:13 -07:00
Joakim Sørensen
e991b61c12 Fix issue with quotes (#50571) 2021-05-13 16:20:01 +02:00
LJU
7224012016 Fix spelling in Cast and Growatt (#50555) 2021-05-13 11:15:02 +02:00
J. Nick Koston
1c2692c3c3 Drop nuheat code owner (#50319)
- I no longer have this device
2021-05-13 08:18:37 +02:00
Kevin Anthony
3b3d6e0da5 Add vesync Core200S air purifier (#50216) 2021-05-12 23:02:24 -05:00
jjlawren
ca09027914 Bump pysonos to 0.0.46 (#50544) 2021-05-12 16:16:29 -05:00
Joakim Sørensen
ce87fc902b Bump pyhaversion from 21.3.0 to 21.5.0 (#50540) 2021-05-12 21:12:58 +02:00
tkdrob
4ce3038b29 Add targets and selectors for services (G-H) (#50524)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-05-12 20:49:04 +02:00
jjlawren
db82808466 Skip adding battery on S1 Sonos devices (#50536) 2021-05-12 20:40:10 +02:00
Daniel Hjelseth Høyer
2945c79c5a Tibber sensors (#50418)
* Tibber, split attribute to sensors

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

* Tibber, split attribute to sensors

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

* Tibber, split attribute to sensors

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

* Update homeassistant/components/tibber/sensor.py

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

* fix review comments

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

* fix review comments

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

* fix review comments

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

* fix review comments

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

* fix review comments

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

* fix review comments

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

* fix review comments

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

* fix review comments

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

* Update homeassistant/components/tibber/sensor.py

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

* fix review comments

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

* migrate to new device ids

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

* Update homeassistant/components/tibber/sensor.py

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

* Update homeassistant/components/tibber/sensor.py

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

* Migrate entity id

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

* Migrate entity id

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

* Update homeassistant/components/tibber/sensor.py

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

* Update homeassistant/components/tibber/sensor.py

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

* Update homeassistant/components/tibber/sensor.py

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

* move registers out of looå

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

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-12 20:07:44 +02:00
Erik Montnemery
216b0df908 Set state_class for demo sensor (#50523) 2021-05-12 18:38:26 +02:00
Franck Nijhof
38a0cf6650 Refactor SolarEdge config flow tests (#50467)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-12 17:43:27 +02:00
Ruslan Sayfutdinov
0cb08f9516 Add missing type hints in entity_platform (#50453) 2021-05-12 16:28:44 +02:00
J. Nick Koston
70961c79a0 Migrate emulate_hue to use storage to fix I/O in event loop (#50473) 2021-05-12 16:10:28 +02:00
Franck Nijhof
72f342aa5b Upgrade aioesphomeapi to 2.7.0 (#50522) 2021-05-12 15:21:54 +02:00
Pascal Vizeli
6ef3de464c Update wheels builder to 2021.05.2 (#50520) 2021-05-12 15:13:24 +02:00
J. Nick Koston
a4ea9b3cd3 Update usage of async_entries to use _async_current_entries (#50187) 2021-05-12 12:47:06 +02:00
Joakim Sørensen
c3eee9800a Move translations from Azure to GitHub action (#50518) 2021-05-12 12:03:13 +02:00
Joakim Sørensen
2918929cf0 Remove azure-pipelines-ci.yml (#50519) 2021-05-12 11:55:31 +02:00
tkdrob
9e0730c97f Add targets and selectors for services (F) (#50191) 2021-05-12 11:00:32 +02:00
dependabot[bot]
e6b4b803e3 Bump docker/login-action from 1 to 1.9.0 (#50509)
Bumps [docker/login-action](https://github.com/docker/login-action) from 1 to 1.9.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v1...v1.9.0)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-12 10:43:38 +02:00
definitio
e090581e3c Add stop for demo players (#50485) 2021-05-12 10:26:12 +02:00
Pascal Vizeli
c79e864394 Ditch secret to wheels server (#50516) 2021-05-12 10:03:27 +02:00
Joakim Sørensen
41f3c67be9 Pin wheels build version (#50515) 2021-05-12 10:03:15 +02:00
dependabot[bot]
34cd68bdf6 Bump actions/checkout from 2 to 2.3.4 (#50510)
Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 2.3.4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v2...v2.3.4)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-12 09:41:30 +02:00
Paulus Schoutsen
2cdf075f95 Only return empty string if non-fixable errors (#50508) 2021-05-12 08:54:04 +02:00
Paulus Schoutsen
88adc8801c Merge pull request #50507 from home-assistant/rc 2021-05-11 22:59:33 -07:00
Paulus Schoutsen
421e1b9956 Bumped version to 2021.5.3 2021-05-11 22:27:42 -07:00
Paulus Schoutsen
c477c31190 Bump aiohue to 2.3.1 (#50506) 2021-05-11 22:27:27 -07:00
Oliver
8a3514ed44 update denonavr version 0.10.8 (#50476) 2021-05-11 22:27:27 -07:00
Erik Montnemery
99044f5454 Include _StopScript.__cause__ in trace (#50441)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-05-11 22:27:26 -07:00
Erik Montnemery
b35f229674 Include _StopScript.__cause__ in trace (#50441)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-05-11 22:27:11 -07:00
Paulus Schoutsen
5ed252ebfa Bump aiohue to 2.3.1 (#50506) 2021-05-11 22:15:36 -07:00
Raman Gupta
6cb283d36b Fix vizio integration (#50436) 2021-05-11 22:05:45 -07:00
jjlawren
17c1031973 Hotfix for Sonos favorites race condition (#50495) 2021-05-11 21:55:32 -07:00
J. Nick Koston
2c492d71f7 Handle transport errors when updating media via events (#50480)
Co-authored-by: Jason Lawrence <jjlawren@users.noreply.github.com>
2021-05-11 21:55:10 -07:00
Jesse Hills
b8d468717a Bump python-juicenet package to 1.0.2 (#50505) 2021-05-11 21:52:22 -07:00
J. Nick Koston
dd3965e4e2 Ensure zeroconf does not generate config flows when matching attributes are missing (#50208)
If macaddress, name, or manufacturer were missing from the
discovery info, the matcher would accept instead of reject.
2021-05-11 21:24:42 -07:00
J. Nick Koston
c037ebb27c Add discovery to yeelight (#50385) 2021-05-11 19:55:50 -05:00
J. Nick Koston
4e08d22a74 Fix dhcp generated conflict (#50498) 2021-05-11 19:23:09 -05:00
HomeAssistant Azure
7df47664e8 [ci skip] Translation update 2021-05-12 00:04:03 +00:00
Simone Chemelli
8d7318430c Fix mypy for Fritz after #50056, #50327 conflict (#50497) 2021-05-11 18:47:02 -05:00
karliemeads
e9f8b3e7ef Remove unused py_noaa dependency (#50494) 2021-05-12 00:44:17 +02:00
Tobias Sauerwein
e2f497ceba Fix Netatmo selector for setting persons being at home (#50373) 2021-05-12 00:22:07 +02:00
J. Nick Koston
7314247ce3 Add dhcp support to iSmartGate (#50309) 2021-05-12 00:20:03 +02:00
J. Nick Koston
3b272ec54c Add dhcp discovery to smartthings (#50306) 2021-05-12 00:10:33 +02:00
Oliver
dc39edd090 update denonavr version 0.10.8 (#50476) 2021-05-12 00:09:22 +02:00
J. Nick Koston
c1cf07768b Add dhcp discovery support to isy994 (#50488)
- SSDP may not be enabled by default
2021-05-12 00:06:55 +02:00
Artem Draft
d29e812033 New overrides in universal media player (#48611)
* Update media_player.py

fix missing overrides in universal

* Update media_player.py

Black

* add tests and allow overrides for missing services

* switch sync to async

* Update tests/components/universal/test_media_player.py

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

* setup component after modifying config

* switch test to sync

* fix black

* fix test

* rework tests, disable override media_seek

Co-authored-by: raman325 <7243222+raman325@users.noreply.github.com>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-11 23:44:26 +02:00
karliemeads
3a93151aa2 Improve light tests for brightness step and profiles (#49887) 2021-05-11 23:31:36 +02:00
jjlawren
afe02a4ad2 Fix Sonos const comparison (#50482)
* Fix Sonos const comparison

* Use constants for playback states
2021-05-11 16:06:51 -05:00
jjlawren
897dd012cd Handle transport errors when updating media via events (#50481) 2021-05-11 16:00:56 -05:00
Simone Chemelli
d877c0c1ff Add Fritz services (#50056) 2021-05-11 15:56:52 -05:00
Pascal Vizeli
214fd41bb6 Add fail-fast for wheel (#50487) 2021-05-11 22:18:18 +02:00
J. Nick Koston
34c84a6bbb Reduce boilerplate to abort for matching config entries (#50186)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-05-11 22:00:12 +02:00
jjlawren
d6a202bd74 Move core Sonos functionality out of entities (#50277) 2021-05-11 10:36:40 -07:00
J. Nick Koston
0fdc50408a Remove unused ignore in fritz (#50469) 2021-05-11 19:08:13 +02:00
J. Nick Koston
909a20b36d Use async zeroconf registration functions (#50168) 2021-05-11 11:03:36 -05:00
Simone Chemelli
e616583bad Improve types for Fritz (#50327)
Co-authored-by: Ruslan Sayfutdinov <ruslan@sayfutdinov.com>
Co-authored-by: Maciej Bieniek <bieniu@users.noreply.github.com>
2021-05-11 10:41:27 -05:00
epenet
d6c99a3db9 Enable strict type checks for onewire (#50422) 2021-05-11 17:28:17 +02:00
Paul Ganssle
efa5c59559 Replace hand-rolled binary search with bisect_left (#50410)
The `bisect` module exposes a `bisect_left` function which does
basically what the bulk of `_lower_bound` does. From my tests, it is
slightly faster (~5%) in the probably common ideal case where `arr` is short.
In the worst case scenario, `bisect.bisect_left` is *much* faster.

```
>>> arr = list(range(60))
>>> cmp = 59
>>> %timeit _lower_bound(arr, cmp)
736 ns ± 6.24 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
>>> %timeit bisect_lower_bound(arr, cmp)
290 ns ± 7.77 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
```

I doubt this is a huge bottleneck or anything, but I think it's a bit
more readable, and it's more efficient, so it seems like it's mostly a
win.

This commit *will* add a new unconditional import for `bisect` when
importing `util.dt`, and `bisect` is not currently imported for any of
the standard library modules. It is possible to make this conditional by
placing `import bisect` in the _lower_bound function, or in the function
it's nested in.
2021-05-11 08:18:20 -07:00
Maciej Bieniek
f5541a468e Improve type annotations for GIOS integration (#50454) 2021-05-11 07:57:24 -07:00
Martin Hjelmare
7c4893cbb1 Fix event action return value typing (#50353)
Co-authored-by: Ruslan Sayfutdinov <ruslan@sayfutdinov.com>
2021-05-11 16:23:59 +02:00
Martin Hjelmare
f71eb4d34d Clean somfy config flow tests (#50461) 2021-05-11 16:19:07 +02:00
Simone Chemelli
4e24640ff7 Remove pytest-mock dependency (#50400) 2021-05-11 17:17:00 +03:00
Daniel Hjelseth Høyer
ca65cdd450 pyTibber revert (#50462)
Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>
2021-05-11 16:14:32 +02:00
Martin Hjelmare
48b5ef0bac Clean twentemilieu config flow tests (#50460) 2021-05-11 15:53:36 +02:00
Ruslan Sayfutdinov
1538271555 Don't generate mypy.ini if errors are found (#50456) 2021-05-11 14:29:14 +02:00
Joakim Sørensen
236f138ab7 Fix compare syntax (#50451) 2021-05-11 13:23:56 +02:00
Pawel
bc9f0caf4a Add configuration.yaml deprecation warning to Epson (#50403)
* add deprecation warning

* Break long string

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-11 12:45:03 +02:00
Joakim Sørensen
50a88eb6c0 Use empty requirements_diff for schedule and workflow_dispatch (#50450) 2021-05-11 12:29:13 +02:00
Joakim Sørensen
ef67a2659e Add ignore_diff to workflow_dispatch trigger (#50449) 2021-05-11 12:15:57 +02:00
Joakim Sørensen
d6dcf95235 Fix .env_file name (#50447) 2021-05-11 11:54:02 +02:00
Joakim Sørensen
56d1e0a99d Migrate wheels builder to GitHub actions (#50445) 2021-05-11 11:46:51 +02:00
Erik Montnemery
973f59e423 Refactor history component (#50287)
* Refactor history component

* Update tests

* Address review comments

* Correct deprecated functions
2021-05-11 09:21:57 +02:00
J. Nick Koston
d5e39e8748 Remove redundant names from config flow titles (#50380) 2021-05-10 22:14:33 -07:00
Ville Skyttä
44a790ab47 Entity.device_info typing fixes (#49974) 2021-05-10 22:11:51 -07:00
J. Nick Koston
34320ef617 Include mac address in rainmachine device info (#50438) 2021-05-10 22:06:49 -07:00
J. Nick Koston
d4cdb8e7e8 Include mac address in roomba device info when available (#50437) 2021-05-10 22:06:29 -07:00
J. Nick Koston
b36c840909 Add dhcp support to guardian (#50378) 2021-05-10 21:26:15 -05:00
HomeAssistant Azure
887ec2d9b5 [ci skip] Translation update 2021-05-11 00:04:41 +00:00
Ruslan Sayfutdinov
ce15f28642 Add missing type hints in http component (#50411) 2021-05-10 14:30:47 -07:00
indykoning
85f758380a Add Growatt Server Config flow (#41303)
* Growatt Server Config flow

* Use reference strings

Co-authored-by: SNoof85 <snoof85@gmail.com>

* Remove configuration.yaml import logic

* Removed import test

* Re-added PLATFORM_SCHEMA validation

* Import yaml from old yaml configuration

* Apply suggestions from code review

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

* Feedback

* Use Executor for IO only

* Fix imports

* update requirements

* Fix flake8

* Run every section of fetching devices in single executor

* Config flow feedback

* Clean up

* Fix plan step

* Fix config flow test

* Remove duplicate test

* Test import step

* Test already configured entry

* Clean up tests

* Add asserts

* Mock out entry setup

* Add warning if set up via yaml

Co-authored-by: SNoof85 <snoof85@gmail.com>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-10 22:46:50 +02:00
Tobias Sauerwein
12342437e2 Fix battery attribute (#50405) 2021-05-10 20:40:44 +02:00
Khole
84984b0223 Bump Pyhiveapi (#50368) 2021-05-10 20:38:35 +02:00
kennedyshead
baacf1b787 Bumps aioasuswrt to 1.3.4 (#50414) 2021-05-10 20:35:32 +02:00
Julien "_FrnchFrgg_" Rivaud
24a46d91d3 Fix amcrest detection of sensor reset (#50249)
Co-authored-by: Pascal Vizeli <pascal.vizeli@syshack.ch>
2021-05-10 10:49:08 -07:00
Colin Robbins
a404c138fa Support multiple disks in systemmonitor (#50362)
* Fix #50158 - add support for multiple disks

* Rework as a tuple
2021-05-10 10:48:00 -07:00
jan iversen
70b09ed9a1 Handle relation between scan_interval and pymodbus timeout in modbus (#50363)
* Control scan_interval compared to pymodbus timeout.

add MINIMUM_SCAN_INTERVAL=5 seconds and validata with Voluptous.
Keep modbus.py 100% coverage.

* Please pylint.

* Review comments.

* pylint.
2021-05-10 19:28:38 +02:00
jjlawren
9ae021a284 Bump pysonos to 0.0.45 (#50407) 2021-05-10 08:56:18 -07:00
Paulus Schoutsen
f8584c3ded Use zoneinfo instead of dateutil (#50387)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-05-10 08:32:29 -07:00
Ville Skyttä
3fab21ebc7 Skip Huawei LTE device registry setup with no identifiers or connections (#50261)
Closes https://github.com/home-assistant/core/issues/50182
2021-05-10 08:27:09 -07:00
Christer Vestermark
fca56993c6 Add smhi wind gust speed and thunder probability (#50328)
* Added some extra attributes

Added the extra attributes
wind_gust_speed and
thunder_probability
that were already implemented in the underlaying library (joysoftware
/
pypi_smhi).

Also for the existing extra attribute cloudiness, it is added if "is not None" instead of just "if self.cloudiness" which would make it False (and therefore not available) if cloudiness = 0.

* Trying to solve the style issues

Removed white spaces and changed order of list as suggested by the tests.

* New try to solve the style issues

Removed some more white spaces...

* Changed dictionary handling as suggested

Changed dictionary handling as suggested by MartinHjelmare.

* Updated test

Updated test_weather.py to include the new attributes wind_gust_speed and thunder_probability.

* Added missing imports

Added the missing imports
ATTR_SMHI_THUNDER_PROBABILITY,
ATTR_SMHI_WIND_GUST_SPEED,

* Renaming self.thunder to self.thunder_probability and correcting test valuesfor

Renamed the new internal attribute
thunder to thunder_probability, same as the exposed attribute for improved consistency.
Corrected test values according to smhi.json.

* Forgot to change to self.thunder_probability in one place.

sorry.
2021-05-10 16:44:08 +02:00
Ruslan Sayfutdinov
8e2b3aab44 Enable strict type checks for camera platform (#50395) 2021-05-10 15:12:15 +02:00
jjlawren
0cdb8ad892 Fix location of current_play_mode (#50386) 2021-05-10 14:49:11 +02:00
Ruslan Sayfutdinov
3a192896df Enable some strict mypy checks globally (#50398)
* Enable some strict mypy checks globally

* Update mypy.ini
2021-05-10 14:20:25 +02:00
Ruslan Sayfutdinov
b745d01877 Fix synology_dsm typing (#50399) 2021-05-10 13:43:43 +02:00
Ville Skyttä
b89c53f759 Type hint device registry identifiers as set of str 2-tuples (#50355)
* Type hint device registry identifiers as set of str 2-tuples

* Fix airly test

* Really fix airly test, add another migration test
2021-05-10 12:13:45 +02:00
Franck Nijhof
1c98df5d18 Remove YAML configuration from Somfy MyLink (#50359)
* Remove YAML configuration from Somfy MyLink

* Keep deprecation warning
2021-05-10 11:53:37 +02:00
J. Nick Koston
f581616064 Loosen flume dhcp discovery matching (#50379) 2021-05-09 19:32:00 -05:00
HomeAssistant Azure
dfe8ab6666 [ci skip] Translation update 2021-05-10 00:04:47 +00:00
Jeff Irion
65fb852e03 Bump androidtv to 0.0.59 (#50367) 2021-05-09 18:52:24 -05:00
Steven Looman
e284a14ccd Upgrade async_upnp_client to 0.17.0 (#50371) 2021-05-09 17:06:47 -05:00
Alan Tse
c1a316b2ec Increase httpx timeout for Tesla (#50376) 2021-05-09 16:30:38 -05:00
Franck Nijhof
041838bdd7 Upgrade requests-mock to 1.9.2 (#50377) 2021-05-09 16:30:03 -05:00
Michael
042822e35e Improve typing for synology_dsm (#49656) 2021-05-09 22:44:55 +02:00
Franck Nijhof
717f4e69d5 Remove defunct Spot Crime integration (#50361) 2021-05-09 22:23:52 +02:00
Franck Nijhof
3745056751 Upgrade attrs to 21.2.0 (#50374) 2021-05-09 22:13:09 +02:00
Erik Montnemery
e57634b1e0 Bump hatasmota to 0.2.12 (#50372) 2021-05-09 22:57:27 +03:00
tkdrob
ee58f6105e Add selectors to webostv services (#50239) 2021-05-09 21:45:24 +02:00
Raman Gupta
1b81849271 Add zwave_js support for HeatIt Z-TRM2fx (#50317)
* Add zwave_js support for HeatIt Z-TRM2fx

* fix docstring

* use AwesomeVersion to support firmware version ranges

* add guard against empty firmware range

* switch guard approach to raise exception sooner

* make post init more generic

* Set up firmware range schema as AwesomeVersion during initialization

* Update homeassistant/components/zwave_js/discovery.py

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

* Allow min_ver and max_ver to be None

* fix docstring

* reduce import scope

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-09 15:28:35 -04:00
Franck Nijhof
ba31d7d1b4 Upgrade sentry-sdk to 1.1.0 (#50349) 2021-05-09 14:30:34 -04:00
Franck Nijhof
0eeb147eda Upgrade watchdog to 1.1.0 (#50351) 2021-05-09 14:29:27 -04:00
Franck Nijhof
43adba4aff Deprecate Synology DSM YAML configuration (#50366) 2021-05-09 14:28:24 -04:00
Franck Nijhof
3f463f22a1 Deprecate Luftdaten YAML configuration (#50365) 2021-05-09 14:27:56 -04:00
Franck Nijhof
b2cee2e602 Remove YAML configuration from Tuya (#50360)
* Remove YAML configuration from Tuya

* Keep deprecation warning
2021-05-09 14:26:26 -04:00
jan iversen
ec08256ff0 Do not use async_* in a modbus sync function (#50343) 2021-05-09 19:50:23 +02:00
Shay Levy
be73067f9c Fix Shelly type hints (#50322) 2021-05-09 19:46:53 +02:00
Dermot Duffy
4e4042a869 Fix types for WLED (#50001) 2021-05-09 19:34:21 +02:00
Franck Nijhof
2ca0eb61dc Deprecate Pi-hole YAML configuration (#50358) 2021-05-09 19:23:55 +02:00
Franck Nijhof
0a95aa282c Upgrade debugpy to 1.3.0 (#50356) 2021-05-09 11:29:28 -05:00
Ruslan Sayfutdinov
9b058551f7 Enable type checks for camera platform (#50179) 2021-05-09 18:04:57 +02:00
EddyK69
e9709d4449 Add LastTrip sensors for BMW Connected Drive (#45906) 2021-05-09 17:51:58 +02:00
Franck Nijhof
ce02614780 Deprecate Hive YAML configuration (#50357) 2021-05-09 17:43:56 +02:00
J. Nick Koston
a74aa9272c Add dhcp discovery to tplink (#50303) 2021-05-09 10:03:41 -05:00
gabrialdestruir
f814a7a8ae Add tplink light setting ignore default (#50334)
This fixes issue #50115 by allowing color, brightness, and temperature to be set from an off state. This adds code to allow "ignore_default=1" to be sent to bulb letting it know to power on with the parameters set.
2021-05-09 16:27:49 +02:00
Franck Nijhof
cbf4632895 Remove YAML configuration from SolarEdge (#50105)
* Remove YAML configuration from SolarEdge

* Restore already setup tests
2021-05-09 12:03:41 +02:00
J. Nick Koston
2bff7f8020 Remove YAML support from gogogate2/ismartgate (#50312) 2021-05-09 11:46:07 +02:00
J. Nick Koston
29cd5f20b9 Add zeroconf discovery to powerview (#50308) 2021-05-09 11:41:27 +02:00
J. Nick Koston
9cab8a19cd Add iCloud discovery (#50304)
Since homekit requires iCloud keychains to be enabled, if they
have a homekit hub, they must have iCloud.
2021-05-09 11:19:26 +02:00
jjlawren
85d782808c Fix Sonos polling bug (#50265) 2021-05-09 11:09:56 +02:00
hubbergit
4d9d565ecc Fix unit of measurement from Pa to hPa (#49664)
The unit of measurement should be hPa instead of Pa for the air pressure.
2021-05-09 10:07:51 +02:00
Brian Rogers
07a93be176 Revert Rachio to seconds instead of total_seconds (#50307)
* revert seconds

* Add comment

* Update comment to include max runtime
2021-05-09 05:09:31 +02:00
Aidan Timson
9059ce1c0f Additional System Bridge Sensors (#50274)
* Update systembridge to 1.1.4

* Update systembridge to 1.1.5

* Names

* Add memory sensors

* Set icons

* Add bios version sensor

* Memory used percentage sensor

* Add types

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

* Disable by default

* Typing

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-09 05:07:13 +02:00
tkdrob
e92516c072 Add targets and selectors to services (A) (#49818) 2021-05-09 02:21:00 +02:00
HomeAssistant Azure
6665a62557 [ci skip] Translation update 2021-05-09 00:04:11 +00:00
Gleb Sinyavskiy
52b1a416d9 Remove the N26 integration (#50292) 2021-05-09 00:58:23 +02:00
Joakim Plate
10afbe4279 Bump ha-philipsjs to 2.7.3 (#50293) 2021-05-08 20:33:55 +02:00
Franck Nijhof
61b0e66405 Fix ESPHome timestamp sensor (#50305) 2021-05-08 19:37:09 +02:00
J. Nick Koston
4853fb7966 Fix tplink unloading when no switches are present (#50301) 2021-05-08 19:20:22 +02:00
Gleb Sinyavskiy
97eb4c6c62 Add syncthing integration (#38331)
* Scaffold the integration

* Add config flow data schema

* Handle configuration errors

* Get folder states

* Support https

* Fix translations

* Listen to syncthing events in a separate thread

* Bump syncthing

* Automatically reconnect to the syncthing server

* Renames

* Improve loading and unloading

* Update folder states from events

* Refactoring, handle FolderPaused event

* Dynamic folder icons

* Refactoring

* Mark folders as unavailable when senrver is unavailable

* Update folder satus when server is available

* Raise PlatformNotReady

* Implement additional polling

* Stop polling when the server is not available

* Minor fixes

* Remove logging

* Check name uniqueness

* Refactoring

* Minor refactorings

* Bump python-syncthing

* Migrate to aiosyncthing

* Minor fixes

* Update .coveragerc

* Set quality scale

* Bump aiosyncthing, properly handle invalid token

* Fix logging

* Fix logging

* Use CONF_VERIFY_SSL from homeassistant.const

* Bump aiosyncthing. Add Syncthing device

* Fix device name

* Bump aiosyncthing

* Bump aiosyncthing

* Extract SyncthingClient

* Add folder to device_state_attributes

* Do not pass the loop

* Cover config_flow.py

* Move self.async_create_entry outside of the try block

* Raise ConfigEntryNotReady if syncthing server is not reachable

* Fix already configured error message

* Change default name to Syncthing

* Bump aiosyncthing

* Fix formatting

* Fix formatting

* Fix tests

* Fix typo, use lis comprehension

* Fix typo, remove unused CONFIG_SCHEMA

* Bump aiosyncthing

* Remove periods from log messages W0001

* Fix tests

* Black, isort

* Remove empty items from manifest.json

* Fix variable naming

* Remove async_setup

* Use SensorEntity

* Use asyncio.create_task instead of self._hass.loop.create_task

* Do not pass hass to FolderSensor initializer

* Rename device_state_attributes to extra_state_attributes

* Use callbacks

* Simplify tests

* Refactor _listen()

* Use url for the title

* Use the url instead of the name to identify the config entry

* Explicitly set sensor attributes, extract _filter_state

* Use server url instead of name in device_info

* Use server url instead of name in logs

* User server id as a device identifier

* Use URL instead of name to identify config entry

* Use shortened server id instead of name to build entity name and unique id

* Do not use CONF_NAME

* Cleanup unused strings

* Cleanup unused strings

* Add IOT class

* Scaffold the integration

* Add config flow data schema

* Handle configuration errors

* Get folder states

* Support https

* Fix translations

* Listen to syncthing events in a separate thread

* Bump syncthing

* Automatically reconnect to the syncthing server

* Renames

* Improve loading and unloading

* Update folder states from events

* Refactoring, handle FolderPaused event

* Dynamic folder icons

* Refactoring

* Mark folders as unavailable when senrver is unavailable

* Update folder satus when server is available

* Raise PlatformNotReady

* Implement additional polling

* Stop polling when the server is not available

* Minor fixes

* Remove logging

* Check name uniqueness

* Refactoring

* Minor refactorings

* Bump python-syncthing

* Migrate to aiosyncthing

* Minor fixes

* Update .coveragerc

* Set quality scale

* Bump aiosyncthing, properly handle invalid token

* Fix logging

* Fix logging

* Use CONF_VERIFY_SSL from homeassistant.const

* Bump aiosyncthing. Add Syncthing device

* Fix device name

* Bump aiosyncthing

* Bump aiosyncthing

* Extract SyncthingClient

* Add folder to device_state_attributes

* Do not pass the loop

* Cover config_flow.py

* Move self.async_create_entry outside of the try block

* Raise ConfigEntryNotReady if syncthing server is not reachable

* Fix already configured error message

* Change default name to Syncthing

* Bump aiosyncthing

* Fix formatting

* Fix formatting

* Fix tests

* Fix typo, use lis comprehension

* Fix typo, remove unused CONFIG_SCHEMA

* Bump aiosyncthing

* Remove periods from log messages W0001

* Fix tests

* Black, isort

* Remove empty items from manifest.json

* Fix variable naming

* Remove async_setup

* Use SensorEntity

* Use asyncio.create_task instead of self._hass.loop.create_task

* Do not pass hass to FolderSensor initializer

* Rename device_state_attributes to extra_state_attributes

* Use callbacks

* Simplify tests

* Refactor _listen()

* Use url for the title

* Use the url instead of the name to identify the config entry

* Explicitly set sensor attributes, extract _filter_state

* Use server url instead of name in device_info

* Use server url instead of name in logs

* User server id as a device identifier

* Use URL instead of name to identify config entry

* Use shortened server id instead of name to build entity name and unique id

* Do not use CONF_NAME

* Cleanup unused strings

* Cleanup unused strings

* Add IOT class

* Apply suggestions from code review

* Clean up

* Fix dict comprehension

* Clean sensor

* Use the server ID as a config entry unique ID

* Remove the AlreadyConfigured exception

* Clean up old error string

* Format json

* Convert sensor attributes to snake case

* Force CI

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-08 19:12:14 +02:00
Oliver
7374b844d7 Update denonavr to version 0.10.7 (#50288) 2021-05-08 10:53:08 -05:00
jan iversen
29eb31e9da Add configurable delay between connect and first request in modbus (#50124)
* Activate startup delay.

* Add removal of call_later if HA is stopped.

This is unlikely to happen, but just security measure.

* Removing timing interval.

async_fire_time_changed() needs to be called twice, first time the delay is
ended and second time update() is executed.

* Variable naming.
2021-05-08 13:28:35 +02:00
Vladimír Záhradník
e0de6752af Fix incorrect attribute checks in Modbus hub (#50241) 2021-05-08 13:26:31 +02:00
Leonardo Figueiro
e3bc9eaf5f pywilight update (#50207) 2021-05-08 04:26:13 -05:00
J. Nick Koston
bf2d40adfe Migrate from pytz to python-dateutil (#49643)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-05-07 22:46:26 -07:00
Brian Rogers
13fe837fd2 Add service target to Rachio (#49913) 2021-05-07 22:24:37 -05:00
Simone Chemelli
c85f70b639 Small code cleanup for Shelly (#50270) 2021-05-07 22:14:41 -05:00
Aidan Timson
a32dc56153 Update ovoenergy to 1.1.12 (#50268) 2021-05-07 22:05:09 -05:00
HomeAssistant Azure
f32e15da36 [ci skip] Translation update 2021-05-08 00:03:19 +00:00
Pawel
57d3342137 Fix Epson config flow unique_id (#45434)
* switch Epson from HTTP to TCP communication

* fix tests

* add asyncio websession

* fix manifest

* fix config flow

* fix manifest

* fix logger warnings

* switch Epson from HTTP to TCP communication

* fix tests

* add asyncio websession

* fix config flow

* fix manifest

* fix logger warnings

* add already configured to import yaml

* remove neccessary projector on on config.yaml

* remove check import None

* reload integration if no unique_id

* async_migrate_entry

* add async_migrate_entry

* add init tests

* media player migration uid

* unifi config flow

* Update homeassistant/components/epson/media_player.py

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

* Update homeassistant/components/epson/media_player.py

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

* Apply suggestions from code review

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

* review

* remove unnecessary try except

* add import test

* Apply suggestions from code review

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

* revert PORT option from config yaml

* fix tests

* remove port from config flow

* fix CONFIG_SCHEMA

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-07 23:05:59 +02:00
Erik Montnemery
ba284c0d27 Add sensor state_class property (#50063)
* Add sensor state_class property

* STATE_CLASS_LATEST -> STATE_CLASS_MEASUREMENT

* Export sensor.state_class in capability_attributes

* Add STATE_CLASS_UNKNOWN

* Fix typing

* Update tests

* STATE_CLASS_UNKNOWN -> STATE_CLASS_OTHER

* Update homeassistant/components/sensor/__init__.py

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

* Remove STATE_CLASS_OTHER

* Update tests

* Revert test changes

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-05-07 23:04:00 +02:00
Simone Chemelli
cf96d86985 Add yaml key to Shelly to allow CoAP port customization (#48729)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-05-07 13:23:29 -07:00
jan iversen
552ca1c57b Fix modbus switch problems (#50117) 2021-05-07 22:12:13 +02:00
Erik Montnemery
934d241b70 Improve Google Cast options flow (#50028) 2021-05-07 12:59:51 -07:00
J. Nick Koston
3a36a976ee Small cleanups to rainmachine get_client_controller (#50250) 2021-05-07 13:07:06 -05:00
Erik Montnemery
80b05c39cc Fix light turn_on color conversion (#50251) 2021-05-07 17:08:46 +02:00
Maciej Bieniek
6df0190aeb Improve type annotations for Airly integration (#49898) 2021-05-07 09:47:52 -05:00
Simone Chemelli
4d0955bae1 Add Fritz sensors (#50055)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-05-07 09:05:16 -05:00
Maciej Bieniek
0587f834df Add Nettigo Air Monitor integration (#49099) 2021-05-07 08:59:29 -05:00
epenet
dc29087416 Deprecate onewire YAML configuration (#50151) 2021-05-07 15:46:23 +02:00
Aaron Bach
d4601e00fd Remove simplisafe websocket (#50213) 2021-05-07 15:41:37 +02:00
Tobias Sauerwein
86393bdbba Fix Netatmo climate (#50238) 2021-05-07 15:10:46 +02:00
Felipe Martins Diel
a7ef3ec947 Fix RM pro temperature sensor (#50098) 2021-05-07 14:47:51 +02:00
David F. Mulcahey
55050bdd2a support more alarm panels (#50235) 2021-05-07 08:31:16 -04:00
Paulus Schoutsen
17fc962a87 Bump aiohue to 2.3.0 (#50217)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-05-07 14:24:47 +02:00
epenet
5d5122c2a4 Fix unique_id issue on onewire config entries (#50161) 2021-05-07 14:21:03 +02:00
Martin Hjelmare
0c288bcabb Fix mysensors default persistence file on import (#48410) 2021-05-07 13:37:38 +02:00
Jan Bouwhuis
7ab505633d Ignore empty output from MQTT fan's value template (#50122)
* Allow empty payload

* Add tests for ignoring empty payload

* logging on empty state and osccilation with tests

* Improve warning log when invalid value is received
2021-05-07 13:22:08 +02:00
Maciej Bieniek
7a87846146 Bump gios library (#50145)
* Bump gios library

* Use consts for API strings

* Do not store data locally

* Use API_TIMEOUT const
2021-05-07 13:03:11 +02:00
J. Nick Koston
64851dbac3 Add optimistic closing/opening to gogogate2 (#42048)
* Add optimistic closing/opening to gogogate2

* package rename

* update test

* Update homeassistant/components/gogogate2/cover.py
2021-05-07 11:13:51 +02:00
Erik Montnemery
c2663d61d7 Add color_mode support to group light (#50165)
* Add color_mode support to group light

* Lint

* Update tests
2021-05-06 22:34:51 -07:00
Fabian Affolter
47c4c681f4 Upgrade sendgrid to 6.7.0 (#50194) 2021-05-07 07:29:55 +02:00
Sezer K
316f6ba397 Only initialize Nuki configurations (#49747)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-05-06 22:29:37 -07:00
Fabian Affolter
93628554cb Upgrade slixmpp to 1.7.1 (#50192) 2021-05-07 07:28:58 +02:00
Fabian Affolter
084f139a4d Upgrade praw to 7.2.0 (#50197) 2021-05-07 07:26:21 +02:00
Fabian Affolter
1c4a44dc5c Upgrade discord.py to 1.7.2 (#50201) 2021-05-07 07:24:54 +02:00
Raman Gupta
9f1b1c6c56 Add value map for Climacell V3 pollen sensors (#50200) 2021-05-06 21:12:51 -07:00
J. Nick Koston
7b07bc2d65 Bump netdisco to 2.8.3 for compat with latest zeroconf (#50212) 2021-05-06 22:26:03 -05:00
Oliver
0cf07ee2d8 Denonavr bugfixes (#49984) 2021-05-06 22:23:46 -05:00
Aaron Bach
fec02c88af Allow SimpliSafe startup to retry on failure (#50211)
* Allow SimpliSafe startup to retry on failure

* Update __init__.py

* Black

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-05-06 20:03:35 -06:00
Martin Hjelmare
5ec09eab42 Move not loaded websocket constant to zwave_js (#50188) 2021-05-06 17:59:03 -07:00
J. Nick Koston
89811fcbaa Ensure tesla setup is retried on timeout (#50202) 2021-05-06 17:58:44 -07:00
HomeAssistant Azure
623a9c99fe [ci skip] Translation update 2021-05-07 00:04:03 +00:00
Fabian Affolter
0bfc386be3 Upgrade TwitterAPI to 2.7.3 (#50195) 2021-05-06 19:23:11 -04:00
Tobias Sauerwein
33e044431e Bump PyRMVtransport to 0.2.3 (#50183) 2021-05-06 23:34:50 +02:00
J. Nick Koston
ce692afead Add rainmachine discovery (#49970)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-05-06 09:50:28 -05:00
Martin Hjelmare
38d7652176 Fix zwave_js websocket api KeyError on unloaded entry (#50154) 2021-05-06 16:43:14 +02:00
Franck Nijhof
177317a345 Allow passing options in config flow entry creation (#49912) 2021-05-05 22:14:01 -07:00
Franck Nijhof
465161b38c Deprecate Canary YAML configuration (#50078) 2021-05-05 22:04:32 -07:00
Franck Nijhof
e3e9239798 Strictly type Twente Milieu integration (#50062) 2021-05-05 22:04:09 -07:00
J. Nick Koston
af832e5434 Use shared httpx client in gogogate2 (#45575) 2021-05-05 21:47:44 -07:00
Erik Montnemery
7dec23d58b Improve translation strings for MQTT config and option flows (#50018)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-05-05 21:25:28 -07:00
tkdrob
d6c300aeb1 Fix group selector (#50088) 2021-05-05 20:15:21 -07:00
Pascal Vizeli
23a2417c42 Adjust GRPC wheel build (#50119) 2021-05-05 20:12:06 -07:00
J. Nick Koston
60b90c4546 Bump zeroconf to 0.30.0 to fix thread safety race (#50130) 2021-05-05 20:11:06 -07:00
J. Nick Koston
906de23087 Bump sqlalchemy to 1.4.13 (#50138) 2021-05-05 20:08:48 -07:00
Teemu R
0ed31b0ba7 Bump python-miio dependency (#50129) 2021-05-05 17:19:52 -07:00
HomeAssistant Azure
7dad5e8a4c [ci skip] Translation update 2021-05-06 00:03:11 +00:00
Franck Nijhof
ae692a003f Add support for Elgato Light Strip (#49988)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-05-05 16:41:32 -07:00
Aidan Timson
e4ef06d6b1 System Bridge Integration (#48156)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-06 01:33:32 +02:00
epenet
5dd59415a8 Drop OWFS support in onewire (#50121) 2021-05-05 21:14:20 +02:00
Erik Montnemery
4136f9f203 Fix Tasmota color scaling and RGBW lights (#50120) 2021-05-05 17:59:26 +02:00
Ben
40a18c10a0 Remove surepetcare usage of deprecated config options (#50113) 2021-05-05 17:13:06 +02:00
Joakim Sørensen
65cf138360 Allign error handling for restart for hassio with core (#50114)
* Allign error handling for restart for hassio with core

* Reuse HASS_DOMAIN

* Address comments
2021-05-05 17:09:18 +02:00
Erik Montnemery
93572bfe02 Add color_mode support to tasmota light (#49599) 2021-05-05 13:04:37 +02:00
Franck Nijhof
e55be3c89a Deprecate Freebox YAML configuration (#50084) 2021-05-05 09:52:32 +02:00
Franck Nijhof
6cb5bf2b88 Deprecate Denon HEOS YAML configuration (#50104) 2021-05-05 09:52:11 +02:00
Franck Nijhof
084fe1fb68 Deprecate Glances YAML configuration (#50085) 2021-05-05 09:51:43 +02:00
Franck Nijhof
26b5a067bd Remove YAML configuration from Verisure (#50076) 2021-05-05 09:51:05 +02:00
Franck Nijhof
b7cd75b134 Upgrade pyupgrade to v2.14.0 (#50059) 2021-05-05 09:28:47 +02:00
Vincent Le Bourlot
219ad5cd9e Fix fitbit RuntimeError: I/O must be done in the executor (#50058) 2021-05-05 09:19:51 +02:00
Franck Nijhof
f88eea5275 Upgrade luftdaten to 0.6.5 (#50103) 2021-05-05 09:12:35 +02:00
Franck Nijhof
373236e588 Upgrade black to 21.5b0 (#50102) 2021-05-05 09:09:34 +02:00
Rob Bierbooms
2b461073ff Improve buienradar tests (#50101) 2021-05-05 09:05:46 +02:00
Franck Nijhof
44383f25ce Clean up pylint comments (#49334) 2021-05-05 08:56:50 +02:00
Dermot Duffy
b0eb2afa65 Bump motioneye-client to v0.3.6 . (#50096) 2021-05-05 07:58:20 +02:00
Franck Nijhof
301d642ad8 Clean up deprecation message & config schema from Cloudflare (#50079) 2021-05-05 07:56:50 +02:00
Franck Nijhof
cc21de569d Upgrade yamllint to 1.26.1 (#50060) 2021-05-04 19:27:23 -10:00
HomeAssistant Azure
469d9123fe [ci skip] Translation update 2021-05-05 00:04:27 +00:00
jan iversen
2f89ba24b6 Cleanup modbus binary_sensor signature (#49809)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-05 00:29:18 +02:00
Bram Kragten
98edd58c55 Update frontend to 20210504.0 (#50093) 2021-05-04 15:11:03 -07:00
Matthias Alphart
13a27eec90 Fix KNX climate unque_id (#50054) 2021-05-04 14:45:25 -07:00
Ruslan Sayfutdinov
004fa63dbe Use AddEntitiesCallback type, pt.3 (#49953) 2021-05-04 23:36:48 +02:00
Bram Kragten
4d939486a9 Fix updating owner user/auth (#50087)
Check if `is_active` is in update msg
2021-05-04 14:26:48 -07:00
Franck Nijhof
2273bda44a Deprecate Abode YAML configuration (#50075) 2021-05-04 14:26:21 -07:00
Franck Nijhof
34eb1627e0 Remove deprecated LIFX Legacy integration (#50069) 2021-05-04 14:25:59 -07:00
Franck Nijhof
4907764367 Remove YAML configuration from Daikin (#50080) 2021-05-04 14:23:59 -07:00
Paulus Schoutsen
4cf910affc Guard logbook assuming entity ID is a string (#50047) 2021-05-04 14:23:22 -07:00
Franck Nijhof
98ef1e1e82 Remove stale config schema from ESPHome integration (#50083) 2021-05-04 22:18:46 +02:00
Franck Nijhof
4af6e505b3 Deprecate speedtest.net YAML config (#50072) 2021-05-04 22:18:22 +02:00
puddly
e5ef171077 Bump zigpy-znp from 0.4.0 to 0.5.1 (#50086)
* Bump zigpy-znp from 0.4.0 to 0.5.0

* Add zigpy-znp to ZHA debug logging config

* Bump zigpy-znp from 0.5.0 to 0.5.1
2021-05-04 16:06:14 -04:00
Franck Nijhof
fb2cb469e2 Remove YAML configuration from DoorBird (#50082) 2021-05-04 21:10:17 +02:00
Franck Nijhof
13ba4d7572 Upgrade pytest to 6.2.4 (#50077) 2021-05-04 20:43:41 +02:00
Franck Nijhof
96f69fb9fb Finalize clean up connection classes (#49895) 2021-05-04 20:08:51 +02:00
Franck Nijhof
ee5f955fd8 Clean up stale config schema from deCONZ (#50081) 2021-05-04 20:06:54 +02:00
Shay Levy
c21add195a Catch Shelly set state exceptions when device is inaccessible (#50064) 2021-05-04 09:10:28 -07:00
Ruslan Sayfutdinov
786c5db5be Use AddEntitiesCallback type, pt.4 (#49955) 2021-05-04 14:50:06 +02:00
Milan Meulemans
a0feee083c Fix and enable type checks in Rituals Perfume Genie (#49947) 2021-05-04 14:47:17 +02:00
Rob Bierbooms
c063f14c24 Add configuration flow for Buienradar integration (#37796)
* Add configuration flow for Buienradar integration

* Update buienradar camera tests to work with config flow

* Update buienradar weather tests to work with config flow

* Update buienradar sensor tests to work with config flow

* Remove buienradar config_flow tests to pass tests

* Add config flow tests for buienradar integration

* Increase test coverage for buienradar config_flow tests

* Move data into domain

* Remove forecast option

* Move data to options

* Remove options from config flow

* Adjust tests

* Adjust string

* Fix pylint issues

* Rework review comments

* Handle import

* Change config flow to setup camera or weather

* Fix tests

* Remove translated file

* Fix pylint

* Fix flake8

* Fix unload

* Minor name changes

* Update homeassistant/components/buienradar/config_flow.py

Co-authored-by: Ties de Kock <ties@tiesdekock.nl>

* Remove asynctest

* Add translation

* Disable sensors by default

* Remove integration name from translations

* Remove import method

* Drop  selection between platforms, disable camera by default

* Minor fix in configured_instances

* Bugfix in weather

* Rework import

* Change unique ids of camera

* Fix in import

* Fix camera tests

* Fix sensor test

* Fix sensor test 2

* Fix config flow tests

* Add option flow

* Add tests for option flow

* Add import tests

* Some cleanups

* Apply suggestions from code review

Apply code suggestions

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

* Fix isort,black,mypy

* Small tweaks and added typing to new parts

* Fix review comments (1)

* Apply suggestions from code review

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

* Fix review comments (2)

* Fix issues

* Fix unique id

* Improve tests

* Extend tests

* Fix issue with unload

* Address review comments

* Add warning when loading platform

* Add load/unload test

Co-authored-by: Ties de Kock <ties@tiesdekock.nl>
Co-authored-by: Franck Nijhof <git@frenck.dev>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-04 13:49:16 +02:00
dependabot[bot]
6931478688 Bump codecov/codecov-action from v1.4.1 to v1.5.0 (#50061)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from v1.4.1 to v1.5.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/v1.4.1...a1ed4b322b4b38cb846afb5a0ebfa17086917d27)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-04 10:57:44 +02:00
Robert Svensson
d579e3427f Use last_step marker on UniFi options flow (#50053) 2021-05-04 08:54:45 +02:00
J. Nick Koston
016a4433d2 Handle missing transport_state on media update in sonos (#50051) 2021-05-04 08:54:31 +02:00
Niels Mündler
2eae87fb1b Add SyncThru binary sensors (#48114)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-04 08:28:45 +02:00
Dermot Duffy
809c1394d4 Enable mypy for motionEye (aye aye!) (#49738) 2021-05-04 08:19:41 +02:00
Simone Chemelli
55c96ae86f Create Fritz device and connectivity sensor (#49699)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-05-03 17:11:21 -10:00
HomeAssistant Azure
0df9454310 [ci skip] Translation update 2021-05-04 00:03:46 +00:00
jan iversen
f0ec9c38b0 Fix modbus typing (#49938)
Add changes needed to please mypy and follow the coding rules
of the project.
2021-05-03 22:45:21 +02:00
Daniel Hjelseth Høyer
c69eeddc7b Upgrade Tibber library, new grid prices for Glitre Energi (#50029)
Signed-off-by: Daniel Hjelseth Høyer <github@dahoiv.net>
2021-05-03 10:50:39 -07:00
J. Nick Koston
302cab185d Add reauth support to flume (#49991) 2021-05-03 10:30:22 -07:00
bsmappee
c49fa6f1ed Bump pysmappee to 0.2.25 (#50031) 2021-05-03 18:51:23 +02:00
Ruslan Sayfutdinov
5fd8e7008e Create separate entries for each component in mypy.ini (#50030) 2021-05-03 18:45:38 +02:00
Franck Nijhof
982c12bcc9 Restore dictionary constants in Elgato device info (#50013) 2021-05-03 09:42:45 -07:00
Franck Nijhof
d4565c0e27 Fix Genius Hub entity service schema (#50024) 2021-05-03 09:41:59 -07:00
Franck Nijhof
9ce00018be Fix Harmony entity service schema (#50025) 2021-05-03 09:41:16 -07:00
Franck Nijhof
2818df7aa9 Fix Nexia entity service schema (#50027) 2021-05-03 09:40:49 -07:00
Franck Nijhof
a2d12f9a51 Fix ELKM1 entity service schema (#50020) 2021-05-03 09:40:01 -07:00
Franck Nijhof
2ed386f9e6 Migrate to async_get_current_platform everywhere (#50034) 2021-05-03 09:34:28 -07:00
Bram Kragten
672d2e332f Update frontend to 20210503.0 (#50036) 2021-05-03 09:32:45 -07:00
Franck Nijhof
0627b316e3 Add Identify service to Elgato integration (#49990) 2021-05-03 17:32:10 +02:00
Marius
13dee0f028 Mitigate NMBS key errors (#50026)
on Liveboard and connections as documented in issue #48824
2021-05-03 17:06:46 +02:00
Franck Nijhof
efb1bb08a4 Add small async_get_current_platform helper method (#50014) 2021-05-03 16:46:42 +02:00
Maciej Bieniek
6e98b020ac Improve type annotations in Brother integration (#49989) 2021-05-03 15:10:20 +02:00
Franck Nijhof
e5bfef719f Fix Blink entity service schema (#50019) 2021-05-03 14:57:11 +02:00
Joakim Sørensen
9b89acea97 Handle Timeout exceptions in system_health (#50017) 2021-05-03 14:26:25 +02:00
Franck Nijhof
378cee01b4 Add typing to async_register_entity_service (#50015) 2021-05-03 14:22:38 +02:00
Simone Chemelli
1ad9f1d714 Title and internal descriptions updates for Fritzbox (#49047) 2021-05-03 12:52:22 +02:00
J. Nick Koston
779f34a8ed Add dhcp discovery to hunterdouglas_powerview (#49993)
* Add dhcp discovery to hunterdouglas_powerview

* avoid dupe flow

* cleanup

* cleanup
2021-05-03 11:41:20 +02:00
Austin Mroczek
f8d82bbf80 Add unique_id to TotalConnect alarm_control_panel (#49961)
* add unique_id to alarm_control_panel

* Update homeassistant/components/totalconnect/alarm_control_panel.py

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

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-03 11:38:59 +02:00
Matthias Alphart
cfabb06a7a Add color modes to KNX light (#49883)
* color_modes support

* return brightness for color lights

even when no brightness address is set

* apply brightness for color lights

* remove unneeded constants
2021-05-03 11:28:02 +02:00
Matthias Alphart
0a6f981b4c Fix KNX light unique_id (#49967)
* migrate light unique_id

* review changes
2021-05-03 11:12:06 +02:00
Dermot Duffy
e8446cb4d9 Fix types for shell command (#50004) 2021-05-03 10:43:23 +02:00
Unai
9d08178ed1 Upgrade maxcube-api dependency to 0.4.3 (#49982)
This new version only contains improvements in logs
to try to debug issue #49482
2021-05-03 10:22:47 +02:00
Tomas Hellström
a29dfe0bf5 Update smhi package to 1.0.15 (#49987) 2021-05-03 10:21:57 +02:00
Shay Levy
0a38827544 Fix Shelly battery operated devices value rounding (#49966) 2021-05-02 23:49:13 -07:00
J. Nick Koston
a4432557d3 Defer writing http config until after startup has calmed down (#50000) 2021-05-02 19:48:49 -10:00
Bram Kragten
301d4b0657 Fix saving a scene (#49980)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2021-05-02 22:11:57 -07:00
J. Nick Koston
42c48e8cf9 Add reauth support to myq (#49998) 2021-05-02 21:52:48 -07:00
Paulus Schoutsen
8e0e1405e8 Make hassfest service validation faster (#50003) 2021-05-02 21:49:51 -07:00
Bram Kragten
8ca6b8394c Correct the selector for frontend.set_theme service (#49952) 2021-05-02 21:07:26 -07:00
Shay Levy
7c7a56f704 Fix Shelly external sensors invalid 999 value (#49994) 2021-05-02 20:58:14 -07:00
J. Nick Koston
1c8d9ca68b Check exception causes for matching strings during recorder migration (#49999) 2021-05-02 20:57:42 -07:00
HomeAssistant Azure
04266301e9 [ci skip] Translation update 2021-05-03 00:05:16 +00:00
Milan Meulemans
6967fd184b Abstract Rituals API data processing to PyPI (#49872) 2021-05-02 13:18:29 -10:00
J. Nick Koston
26fd7fc15b Add dhcp discovery to tado (#49992) 2021-05-02 12:43:59 -10:00
Florian Gareis
93b668a6f9 Upgrade yeelight to 0.6.2 (#49995) 2021-05-03 00:05:40 +02:00
Franck Nijhof
6c4448a272 Upgrade elgato to 2.1.0 (#49975) 2021-05-02 17:18:36 +02:00
J. Nick Koston
f7fafa6b8b Add zeroconf discovery to rachio (#49973) 2021-05-02 17:09:12 +02:00
Diogo Gomes
24b9d73392 Improves UX of Utility Meter services (#48556) 2021-05-02 10:53:35 +02:00
jan iversen
8adbc62a6e Enable homeassistant.update_entity service for all modbus platforms (#49918)
* Rename _update() to update()

A platform neeed a function update(), even though
polling is false, this is due to the service:
homeassistant.update_entity, which calls update()

* Update test harnesss to script testing.

Test homeassistant.update_entity in all platforms.
This call calls update() in the platform to get
a new reading.

* Add reuse parameter.

* Move service call from helper to tests.

* Change run_service_update --> prepare_service_update.

* Remove entity_id parameter.
2021-05-02 10:41:36 +02:00
Paulus Schoutsen
1bd9826684 Handle different entity_id formats (#49969) 2021-05-01 20:30:28 -07:00
Alan Tse
3546ff2da2 Bump Tesla dependency teslajsonpy to 0.18.3 (#49939)
Co-authored-by: J. Nick Koston <nick@koston.org>
2021-05-01 17:04:37 -07:00
HomeAssistant Azure
796f9cad1f [ci skip] Translation update 2021-05-02 00:04:24 +00:00
Aaron Bach
91e41a0cc2 Fix KeyError in IQVIA (#49968) 2021-05-01 16:56:50 -07:00
Milan Meulemans
29d72714f3 Replace dict with DeviceInfo (#49950)
* Replace dict with DeviceInfo

* Clean up

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-05-02 00:37:19 +02:00
Ville Skyttä
ddd7e79ee9 Improve device registry internal typing (#49924) 2021-05-01 12:33:31 -10:00
J. Nick Koston
4bebedb658 Bump pysonos to 0.0.44 to fix client session race (#49964)
Fixes #49954
2021-05-01 12:26:10 -10:00
Franck Nijhof
1b5596b4c2 Remove ServiceCallType alias from codebase (#49844) 2021-05-02 00:15:27 +02:00
jan iversen
7ac05110ca Catch non payload modbus messages (#49910) 2021-05-02 00:03:52 +02:00
Aaron Bach
9e43239240 Bump simplisafe-python to 9.6.10 (#49962) 2021-05-01 11:18:36 -10:00
J. Nick Koston
002b068c0a Remove YAML support from sense (#49935) 2021-05-01 11:17:52 -10:00
Alexei Chetroi
ef2b8bbca8 Bump up ZHA dependencies (#49959) 2021-05-01 15:55:04 -04:00
jan iversen
ebee5f7808 Fix ihc typing (#49946) 2021-05-01 21:01:56 +02:00
Shay Levy
2440f25aaf Shelly light color mode bugfix (#49948) 2021-05-01 07:43:03 -07:00
jan iversen
60ae230499 Please mypy (axis). (#49949)
* Please mypy (axis).

* Update homeassistant/components/axis/config_flow.py

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

Co-authored-by: Robert Svensson <Kane610@users.noreply.github.com>
2021-05-01 16:13:43 +02:00
Shay Levy
20152313db Fix light services descriptions (#49951) 2021-05-01 15:00:40 +02:00
Artem Draft
e597202b24 Update LG Netcast to use new backend library (#49927)
* Update LG Netcast to use new backend library

Bump lgnetcast to 0.3.3

* Add codeowner in LG Netcast
2021-05-01 07:49:17 -04:00
J. Nick Koston
671aabf9f4 Remove unused imports in fritz, nest, and somfy to fix CI (#49940) 2021-04-30 21:58:48 -10:00
Franck Nijhof
8eb27374c6 Clean up connection classes in integrations P-S (#49893) 2021-04-30 21:04:44 -10:00
Franck Nijhof
64c7d84108 Clean up connection classes in integrations T-Z (#49894) 2021-04-30 21:04:05 -10:00
Franck Nijhof
a6206b2819 Clean up connection classes in integrations M-O (#49892) 2021-04-30 21:03:37 -10:00
Franck Nijhof
10d6dfd4ae Clean up connection classes in integrations H-L (#49891) 2021-04-30 21:02:53 -10:00
Franck Nijhof
e652ff3a6a Clean up connection classes in integrations D-G (#49890) 2021-04-30 21:02:21 -10:00
Franck Nijhof
d4d0b93d3b Clean up connection classes in integrations A-C (#49888) 2021-04-30 21:01:52 -10:00
Dermot Duffy
184602e267 Repair elgato types (#49936) 2021-04-30 17:51:53 -10:00
HomeAssistant Azure
0efd061255 [ci skip] Translation update 2021-05-01 00:03:44 +00:00
J. Nick Koston
71545f2a68 Avoid writing esphome data if its already up to date on disk (#49933) 2021-04-30 12:19:27 -10:00
Ville Skyttä
77d5244577 Use device registry CONNECTION_* constants (#49923) 2021-04-30 23:58:50 +02:00
J. Nick Koston
7ead482082 Reduce homekit executor calls at start (#49925)
- We do not need to load/persist since we do it in setup
2021-04-30 23:54:54 +02:00
Franck Nijhof
e1a3ef3d69 Clean up config entry handlers decorator from config flows (#49932) 2021-04-30 23:28:25 +02:00
Ville Skyttä
59f32f7c9c Make device info a TypedDict (#49670) 2021-04-30 23:21:39 +02:00
jjlawren
37e8571fe8 Use header URI in Plex config flow (#49915) 2021-04-30 23:15:59 +02:00
Paulus Schoutsen
a2138a7642 Iqvia to check bad fetch during setup (#49931) 2021-04-30 14:04:59 -07:00
jan iversen
aa8ce07e35 Start Modbus cover timer independent if there is a state to restore (#49919)
* Start timer independent if there is a state to restore.

* Update test cases, that now start working.
2021-04-30 22:36:55 +02:00
Jason Hunter
2b46c6bcda Bump xbox-webapi to 2.0.11 (#49929) 2021-04-30 13:34:46 -07:00
Bram Kragten
5e27358590 Update frontend to 20210430.0 (#49928) 2021-04-30 13:25:57 -07:00
Ruslan Sayfutdinov
f53284b200 Make CoordinatorEntity generic (#49854) 2021-04-30 13:24:27 -07:00
Franck Nijhof
dc46a213a7 Enable strict typing for the Elgato integration (#49920) 2021-04-30 13:21:30 -07:00
Ruslan Sayfutdinov
cbaeec2a4e Use AddEntitiesCallback type, pt.2 (#49921) 2021-04-30 20:38:59 +02:00
David F. Mulcahey
4ed74cd2f5 Move ZHA config panel section translations to the backend (#49816) 2021-04-30 09:29:34 -07:00
jan iversen
684ea9e49b Restructure modbus switch, and solve read/write conflicts (#49386)
Remove old style configuration from switch.
- The old style configuration allowed a number of illegal
  configurations, instead of adding if...log. in setup we
  only support the new configuration style.

Add new/changed configuration switch.

Removed verify_state and cleaned configuration to avoid possible
illegal configurations.
2021-04-30 16:47:18 +02:00
Maciej Bieniek
39e8a92596 Remove unused code from Brother config flow (#49889) 2021-04-30 16:41:55 +02:00
Raman Gupta
fdc29d6a80 Add device specific discovery for Heatit Z-TRM3 thermostat (#49804)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-04-30 16:10:25 +02:00
Maciej Bieniek
37dad92bf7 Split long string in DuneHD test (#49900)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-04-30 15:30:21 +02:00
Franck Nijhof
98b305285f Upgrade pytest-xdist to 2.2.1 (#49904) 2021-04-30 14:35:30 +02:00
David F. Mulcahey
20cffc30de Small ZHA code cleanup (#49908) 2021-04-30 13:48:11 +02:00
Erik Montnemery
956c972e72 Add color_mode support to zwave_js light (#49588) 2021-04-30 13:46:25 +02:00
Franck Nijhof
0d3d2edbff Fix unexpected data in Waze config flow import (#49902) 2021-04-30 11:12:31 +02:00
Franck Nijhof
2e9bf8ab4e Fix unexpected data in Google Travel Time config flow import (#49903) 2021-04-30 11:12:13 +02:00
Franck Nijhof
9b863324c5 Update frontend to 20210429.0 (#49896) 2021-04-30 10:26:56 +02:00
Ville Skyttä
a19f757120 Allow str 1..n-tuples in device registry identifier type hints (#49864)
This reflects current practice, but the intent has been to have them as
2-tuples, and a future change is likely to start enforcing that (again).

Refs https://github.com/home-assistant/core/pull/49670#discussion_r622344872
2021-04-30 08:56:55 +02:00
Raman Gupta
1b6cd9e0f3 Don't validate inputs on platform setup for Google/Waze travel time (#49886)
* Don't validate inputs on platform setup for Google/Waze travel time

* feedback from other PR
2021-04-30 08:33:15 +02:00
Tom Toor
dcaefe9f5a Reduced polling interval for mutesync integration (#49884) 2021-04-30 07:55:51 +02:00
jjlawren
adba82de8b Do not pass hass.data to Sonos entities (#49881) 2021-04-30 07:01:09 +02:00
Aaron Bach
73714eba4b Remove no-longer-functioning SimpliSafe websocket support (#49876)
* Remove no-longer-functioning SimpliSafe websocket support

* Linting
2021-04-29 19:02:45 -06:00
HomeAssistant Azure
38a03009ae [ci skip] Translation update 2021-04-30 00:04:58 +00:00
Bram Kragten
55b5a1ed9c Update frontend to 20210407.1 (#49882) 2021-04-29 14:31:51 -07:00
Franck Nijhof
b2c1da54aa Fix jumpy Verisure Wallplug state (#49880) 2021-04-29 14:31:34 -07:00
Franck Nijhof
c68b259bd3 Cleanup of unused connection_class logic (#49865)
Co-authored-by: Joakim Sørensen <joasoe@gmail.com>
2021-04-29 23:12:58 +02:00
jjlawren
db886ef03a Add additional Sonos codeowner (#49879) 2021-04-29 13:50:16 -07:00
karliemeads
2dedf3dd07 Apply default light profile only when light is toggled from off to on (#49376)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2021-04-29 22:06:09 +02:00
Raman Gupta
042099de14 Fix options flow bugs in Google/Waze Time Travel (#49866) 2021-04-29 12:57:48 -07:00
Ville Skyttä
22bda640b0 Restore missing Huawei LTE cleanup on HA stop (#49871)
Refs https://github.com/home-assistant/core/pull/49788#discussion_r623071013
2021-04-29 20:45:25 +02:00
Aaron David Schneider
0421c55bf1 Fix Fritz device tracker multiple routers (#49808)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2021-04-29 11:10:36 -07:00
Paulus Schoutsen
f5e4b13814 Add auto_off to binary sensor template entity (#49615) 2021-04-29 09:25:34 -07:00
Shay Levy
87a595d928 Add color modes to Shelly light (#49867) 2021-04-29 09:13:58 -07:00
jan iversen
760caeed85 Complete modbus device response tests (#49633)
* Prepare test harness for new pymodbus return types.

Use pytest.fixture to mock pymodbus.
Use pytest.fixture to load modbus using mocked pymodbus
Add test of Exception/IllegalResponse/ExceptionResponse from pymodbus.

* Modbus.py is back at 100% test coverage.

* Added assert mock.called.

* add mock reset.
2021-04-29 18:06:56 +02:00
Maciej Bieniek
0379dee47e Fix host_valid() logic in Vilfo config flow (#49862) 2021-04-29 17:11:22 +02:00
Ruslan Sayfutdinov
a4db35a16e Rename FlowResultDict in scaffold template (#49858) 2021-04-29 17:10:31 +02:00
Raman Gupta
4a95f6c2a3 Improve Google Travel Time import and naming logic (#49839) 2021-04-29 17:10:03 +02:00
Raman Gupta
5d421c9715 Use EVENT_HOMEASSISTANT_STARTED instead of EVENT_HOMEASSISTANT_START (#49861) 2021-04-29 17:06:27 +02:00
Maciej Bieniek
61991572d7 Fix host_valid() logic in DuneHD config flow (#49860) 2021-04-29 17:05:09 +02:00
Maciej Bieniek
3210c086ef Improve type annotations for the Brother integration (#49771) 2021-04-29 16:59:31 +02:00
djtimca
f7cf82be6d Add Omnilogic Switch platform (#42116)
* Bump omnilogic dependency to 0.4.4 to fix Lights key error.

* Bumped dependency to 0.4.5.

* Fixed pump type issue for unique pool structure.

* Create full platform bundle for final testing and PR to Home Assistant dev.

* Removed logger instances not required.

* Fixed lint issues.

* Fixed pylint issues.

* Fix pylint issues. Fix issue with pH sensor offset.

* Stripped light, water_heater platform for PR submit.

* Correct pH and ORP sensor report to unknown with offset if pump is off.

* Moving guard condition check to helper function.

* Update to asyncio.sleep to wait for switch status delay in Hayward API status.

* Removed sleep, added state delay to handle slow Hayward API state update response.

* Fix flake8 issue.

* Fix flake8 issue.

* Fix isort issue.

* Addressed PR Comments.

* Addressed PR comments. Corrected Unit of Measure for sensor where pump speed is not variable.

* Fix pylint issue.

* Address pylint issue.

* Update homeassistant/components/omnilogic/switch.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2021-04-29 16:46:04 +02:00
Angelo Gagliano
7c28262bee Add codeowners for DHT (#49855) 2021-04-29 16:11:56 +02:00
Maciej Bieniek
9588e0d35a Fix host_valid() logic in BraviaTV config flow (#49857) 2021-04-29 16:09:59 +02:00
jan iversen
5b6d2edb48 Catch missing/unavailable response from modbus (#49632)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-04-29 15:59:17 +02:00
Ruslan Sayfutdinov
02764c2f46 Disable strict type checks for tests (#49851) 2021-04-29 15:57:02 +02:00
Raman Gupta
6f36fcc427 Improve Waze Travel Time import and naming logic (#49838) 2021-04-29 15:49:16 +02:00
Ruslan Sayfutdinov
183220008d Rename FlowResultDict to FlowResult (#49847) 2021-04-29 13:40:51 +02:00
Franck Nijhof
8be6605be9 Remove example entry from PR template (#49842) 2021-04-29 13:37:55 +02:00
Ruslan Sayfutdinov
0301706fc6 Define AddEntitiesCallback type (#49812) 2021-04-29 12:28:14 +02:00
Franck Nijhof
de6c9e67b1 Upgrade black to 21.4b2 (#49841) 2021-04-29 11:50:29 +02:00
Franck Nijhof
52f3a7249f hassfest detect built-in domain override for custom integrations (#49845) 2021-04-29 11:43:23 +02:00
Joakim Sørensen
b7184b669f Add onboarded key to analytics WS command (#49751) 2021-04-29 11:11:23 +02:00
Erik Montnemery
bf57c77d5c Add color_mode to demo light (#49694)
* Update demo light with color mode support

* Add rgbw and rgbww color properties

* Update demo light

* Tweak

* Remove unneeded _clear_colors
2021-04-29 10:45:17 +02:00
Fabian Affolter
25d257b631 Upgrade py-cpuinfo to 8.0.0 (#49833) 2021-04-29 08:39:03 +02:00
Ruslan Sayfutdinov
5008c27e7a Relax type annotation for DataUpdateCoordinator data (#49827) 2021-04-28 18:31:08 -10:00
Ruslan Sayfutdinov
a0bf95d4b5 Validate if modules in mypy config exist (#49810) 2021-04-29 06:29:53 +02:00
Mike Keesey
1c0fd61075 Remove references to hass.data in harmony tests (#49836)
Instead, just use the mocks directly.
2021-04-28 18:27:57 -10:00
HomeAssistant Azure
27816aa4d5 [ci skip] Translation update 2021-04-29 00:03:34 +00:00
Franck Nijhof
16e096de0c Bump version to 2021.6.0dev0 (#49830) 2021-04-28 23:48:48 +02:00
Franck Nijhof
14af6d3884 Remove DHT from Raspberry Pi machine builds (#49829) 2021-04-28 22:43:40 +02:00
Raman Gupta
105504cb89 Set ClimaCell API limit to 500 requests/day (#49828) 2021-04-28 13:43:07 -07:00
Anders Melchiorsen
21872c42fe Fix color setting in LIFX services (#49822) 2021-04-28 13:31:40 -07:00
Simone Chemelli
ff137fe186 Add service target to Neato (#49803)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2021-04-28 22:18:00 +02:00
Aaron Bach
d749015b96 Bump pyairvisual to 5.0.8 (#49823) 2021-04-28 21:34:19 +02:00
tkdrob
74f95ac338 Add switch platform to goalzero (#48612)
* Add switch platform to goalzero

* fix update interval

* Apply some suggested changes

* pass device class to parent

* Drop passing device_class

* Tweaks

* Drop underscore prefix
2021-04-28 21:24:56 +02:00
3698 changed files with 69988 additions and 26751 deletions

View File

@@ -8,8 +8,10 @@ omit =
homeassistant/scripts/*.py
# omit pieces of code that rely on external devices being present
homeassistant/components/acer_projector/switch.py
homeassistant/components/acer_projector/*
homeassistant/components/actiontec/const.py
homeassistant/components/actiontec/device_tracker.py
homeassistant/components/actiontec/model.py
homeassistant/components/acmeda/__init__.py
homeassistant/components/acmeda/base.py
homeassistant/components/acmeda/const.py
@@ -23,9 +25,8 @@ omit =
homeassistant/components/adguard/sensor.py
homeassistant/components/adguard/switch.py
homeassistant/components/ads/*
homeassistant/components/aemet/abstract_aemet_sensor.py
homeassistant/components/aemet/weather_update_coordinator.py
homeassistant/components/aftership/sensor.py
homeassistant/components/aftership/*
homeassistant/components/agent_dvr/__init__.py
homeassistant/components/agent_dvr/alarm_control_panel.py
homeassistant/components/agent_dvr/camera.py
@@ -36,14 +37,14 @@ omit =
homeassistant/components/airvisual/__init__.py
homeassistant/components/airvisual/air_quality.py
homeassistant/components/airvisual/sensor.py
homeassistant/components/aladdin_connect/cover.py
homeassistant/components/aladdin_connect/*
homeassistant/components/alarmdecoder/__init__.py
homeassistant/components/alarmdecoder/alarm_control_panel.py
homeassistant/components/alarmdecoder/binary_sensor.py
homeassistant/components/alarmdecoder/const.py
homeassistant/components/alarmdecoder/sensor.py
homeassistant/components/alpha_vantage/sensor.py
homeassistant/components/amazon_polly/tts.py
homeassistant/components/amazon_polly/*
homeassistant/components/ambiclimate/climate.py
homeassistant/components/ambient_station/*
homeassistant/components/amcrest/*
@@ -113,6 +114,10 @@ omit =
homeassistant/components/bmw_connected_drive/lock.py
homeassistant/components/bmw_connected_drive/notify.py
homeassistant/components/bmw_connected_drive/sensor.py
homeassistant/components/bosch_shc/__init__.py
homeassistant/components/bosch_shc/const.py
homeassistant/components/bosch_shc/binary_sensor.py
homeassistant/components/bosch_shc/entity.py
homeassistant/components/braviatv/__init__.py
homeassistant/components/braviatv/const.py
homeassistant/components/braviatv/media_player.py
@@ -304,7 +309,7 @@ omit =
homeassistant/components/firmata/pin.py
homeassistant/components/firmata/sensor.py
homeassistant/components/firmata/switch.py
homeassistant/components/fitbit/sensor.py
homeassistant/components/fitbit/*
homeassistant/components/fixer/sensor.py
homeassistant/components/fleetgo/device_tracker.py
homeassistant/components/flexit/climate.py
@@ -330,9 +335,12 @@ omit =
homeassistant/components/freebox/sensor.py
homeassistant/components/freebox/switch.py
homeassistant/components/fritz/__init__.py
homeassistant/components/fritz/binary_sensor.py
homeassistant/components/fritz/common.py
homeassistant/components/fritz/const.py
homeassistant/components/fritz/device_tracker.py
homeassistant/components/fritz/sensor.py
homeassistant/components/fritz/services.py
homeassistant/components/fritzbox_callmonitor/__init__.py
homeassistant/components/fritzbox_callmonitor/const.py
homeassistant/components/fritzbox_callmonitor/base.py
@@ -342,6 +350,9 @@ omit =
homeassistant/components/frontier_silicon/media_player.py
homeassistant/components/futurenow/light.py
homeassistant/components/garadget/cover.py
homeassistant/components/garages_amsterdam/__init__.py
homeassistant/components/garages_amsterdam/binary_sensor.py
homeassistant/components/garages_amsterdam/sensor.py
homeassistant/components/garmin_connect/__init__.py
homeassistant/components/garmin_connect/const.py
homeassistant/components/garmin_connect/sensor.py
@@ -358,6 +369,7 @@ omit =
homeassistant/components/goalfeed/*
homeassistant/components/goalzero/__init__.py
homeassistant/components/goalzero/binary_sensor.py
homeassistant/components/goalzero/switch.py
homeassistant/components/google/*
homeassistant/components/google_cloud/tts.py
homeassistant/components/google_maps/device_tracker.py
@@ -371,6 +383,7 @@ omit =
homeassistant/components/greenwave/light.py
homeassistant/components/group/notify.py
homeassistant/components/growatt_server/sensor.py
homeassistant/components/growatt_server/__init__.py
homeassistant/components/gstreamer/media_player.py
homeassistant/components/gtfs/sensor.py
homeassistant/components/guardian/__init__.py
@@ -545,7 +558,6 @@ omit =
homeassistant/components/life360/*
homeassistant/components/lifx/*
homeassistant/components/lifx_cloud/scene.py
homeassistant/components/lifx_legacy/light.py
homeassistant/components/lightwave/*
homeassistant/components/limitlessled/light.py
homeassistant/components/linksys_smart/device_tracker.py
@@ -599,6 +611,9 @@ omit =
homeassistant/components/meteo_france/sensor.py
homeassistant/components/meteo_france/weather.py
homeassistant/components/meteoalarm/*
homeassistant/components/meteoclimatic/__init__.py
homeassistant/components/meteoclimatic/const.py
homeassistant/components/meteoclimatic/weather.py
homeassistant/components/metoffice/sensor.py
homeassistant/components/metoffice/weather.py
homeassistant/components/microsoft/tts.py
@@ -618,9 +633,6 @@ omit =
homeassistant/components/mjpeg/camera.py
homeassistant/components/mochad/*
homeassistant/components/modbus/climate.py
homeassistant/components/modbus/cover.py
homeassistant/components/modbus/modbus.py
homeassistant/components/modbus/switch.py
homeassistant/components/modem_callerid/sensor.py
homeassistant/components/motion_blinds/__init__.py
homeassistant/components/motion_blinds/const.py
@@ -656,7 +668,7 @@ omit =
homeassistant/components/mystrom/binary_sensor.py
homeassistant/components/mystrom/light.py
homeassistant/components/mystrom/switch.py
homeassistant/components/n26/*
homeassistant/components/myq/__init__.py
homeassistant/components/nad/media_player.py
homeassistant/components/nanoleaf/light.py
homeassistant/components/neato/__init__.py
@@ -703,6 +715,7 @@ omit =
homeassistant/components/omnilogic/__init__.py
homeassistant/components/omnilogic/common.py
homeassistant/components/omnilogic/sensor.py
homeassistant/components/omnilogic/switch.py
homeassistant/components/ondilo_ico/__init__.py
homeassistant/components/ondilo_ico/api.py
homeassistant/components/ondilo_ico/const.py
@@ -862,6 +875,7 @@ omit =
homeassistant/components/russound_rnet/media_player.py
homeassistant/components/sabnzbd/*
homeassistant/components/saj/sensor.py
homeassistant/components/samsungtv/bridge.py
homeassistant/components/satel_integra/*
homeassistant/components/schluter/*
homeassistant/components/scrape/sensor.py
@@ -905,6 +919,11 @@ omit =
homeassistant/components/skybeacon/sensor.py
homeassistant/components/skybell/*
homeassistant/components/slack/notify.py
homeassistant/components/sia/__init__.py
homeassistant/components/sia/alarm_control_panel.py
homeassistant/components/sia/const.py
homeassistant/components/sia/hub.py
homeassistant/components/sia/utils.py
homeassistant/components/sinch/*
homeassistant/components/slide/*
homeassistant/components/sma/__init__.py
@@ -931,7 +950,12 @@ omit =
homeassistant/components/soma/__init__.py
homeassistant/components/soma/cover.py
homeassistant/components/soma/sensor.py
homeassistant/components/somfy/*
homeassistant/components/somfy/__init__.py
homeassistant/components/somfy/api.py
homeassistant/components/somfy/climate.py
homeassistant/components/somfy/cover.py
homeassistant/components/somfy/sensor.py
homeassistant/components/somfy/switch.py
homeassistant/components/somfy_mylink/__init__.py
homeassistant/components/somfy_mylink/cover.py
homeassistant/components/sonos/*
@@ -940,7 +964,6 @@ omit =
homeassistant/components/speedtestdotnet/*
homeassistant/components/spider/*
homeassistant/components/splunk/*
homeassistant/components/spotcrime/sensor.py
homeassistant/components/spotify/__init__.py
homeassistant/components/spotify/media_player.py
homeassistant/components/spotify/system_health.py
@@ -964,6 +987,10 @@ omit =
homeassistant/components/switchbot/switch.py
homeassistant/components/switcher_kis/switch.py
homeassistant/components/switchmate/switch.py
homeassistant/components/syncthing/__init__.py
homeassistant/components/syncthing/sensor.py
homeassistant/components/syncthru/__init__.py
homeassistant/components/syncthru/binary_sensor.py
homeassistant/components/syncthru/sensor.py
homeassistant/components/synology_chat/notify.py
homeassistant/components/synology_dsm/__init__.py
@@ -973,6 +1000,10 @@ omit =
homeassistant/components/synology_dsm/switch.py
homeassistant/components/synology_srm/device_tracker.py
homeassistant/components/syslog/notify.py
homeassistant/components/system_bridge/__init__.py
homeassistant/components/system_bridge/const.py
homeassistant/components/system_bridge/binary_sensor.py
homeassistant/components/system_bridge/sensor.py
homeassistant/components/systemmonitor/sensor.py
homeassistant/components/tado/*
homeassistant/components/tado/device_tracker.py
@@ -1033,7 +1064,6 @@ omit =
homeassistant/components/toon/switch.py
homeassistant/components/torque/sensor.py
homeassistant/components/totalconnect/__init__.py
homeassistant/components/totalconnect/alarm_control_panel.py
homeassistant/components/totalconnect/binary_sensor.py
homeassistant/components/totalconnect/const.py
homeassistant/components/touchline/climate.py
@@ -1206,7 +1236,6 @@ omit =
homeassistant/components/supla/*
homeassistant/components/zwave/util.py
homeassistant/components/zwave_js/discovery.py
homeassistant/components/zwave_js/light.py
homeassistant/components/zwave_js/sensor.py
[report]

View File

@@ -36,19 +36,6 @@
- [ ] Breaking change (fix/feature causing existing functionality to break)
- [ ] Code quality improvements to existing code or addition of tests
## Example entry for `configuration.yaml`:
<!--
Supplying a configuration snippet, makes it easier for a maintainer to test
your PR. Furthermore, for new integrations, it gives an impression of how
the configuration would look like.
Note: Remove this section if this PR does not have an example entry.
-->
```yaml
# Example configuration.yaml
```
## Additional information
<!--
Details are important, and help maintainers processing your PR.

View File

@@ -23,7 +23,7 @@ jobs:
publish: ${{ steps.version.outputs.publish }}
steps:
- name: Checkout the repository
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
with:
fetch-depth: 0
@@ -54,7 +54,7 @@ jobs:
if: needs.init.outputs.publish == 'true'
steps:
- name: Checkout the repository
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.2.2
@@ -84,7 +84,7 @@ jobs:
arch: ${{ fromJson(needs.init.outputs.architectures) }}
steps:
- name: Checkout the repository
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
if: needs.init.outputs.channel == 'dev'
@@ -102,20 +102,20 @@ jobs:
version="$(python setup.py -V)"
- name: Login to DockerHub
uses: docker/login-action@v1
uses: docker/login-action@v1.9.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v1
uses: docker/login-action@v1.9.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build base image
uses: home-assistant/builder@2021.04.2
uses: home-assistant/builder@2021.06.2
with:
args: |
$BUILD_ARGS \
@@ -151,23 +151,23 @@ jobs:
- tinker
steps:
- name: Checkout the repository
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Login to DockerHub
uses: docker/login-action@v1
uses: docker/login-action@v1.9.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v1
uses: docker/login-action@v1.9.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build base image
uses: home-assistant/builder@2021.04.2
uses: home-assistant/builder@2021.06.2
with:
args: |
$BUILD_ARGS \
@@ -182,7 +182,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout the repository
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Initialize git
uses: home-assistant/actions/helpers/git-init@master
@@ -214,16 +214,16 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout the repository
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Login to DockerHub
uses: docker/login-action@v1
uses: docker/login-action@v1.9.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v1
uses: docker/login-action@v1.9.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}

View File

@@ -26,7 +26,7 @@ jobs:
pre-commit-key: ${{ steps.generate-pre-commit-key.outputs.key }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v2.2.2
@@ -84,7 +84,7 @@ jobs:
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.2.2
id: python
@@ -124,7 +124,7 @@ jobs:
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.2.2
id: python
@@ -164,7 +164,7 @@ jobs:
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.2.2
id: python
@@ -207,7 +207,7 @@ jobs:
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Register hadolint problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/hadolint.json"
@@ -226,7 +226,7 @@ jobs:
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.2.2
id: python
@@ -269,7 +269,7 @@ jobs:
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.2.2
id: python
@@ -312,7 +312,7 @@ jobs:
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.2.2
id: python
@@ -352,7 +352,7 @@ jobs:
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.2.2
id: python
@@ -395,7 +395,7 @@ jobs:
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.2.2
id: python
@@ -436,7 +436,7 @@ jobs:
# needs: prepare-base
# steps:
# - name: Check out code from GitHub
# uses: actions/checkout@v2
# uses: actions/checkout@v2.3.4
# - name: Run ShellCheck
# uses: ludeeus/action-shellcheck@0.3.0
@@ -446,7 +446,7 @@ jobs:
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.2.2
id: python
@@ -493,7 +493,7 @@ jobs:
container: homeassistant/ci-azure:${{ matrix.python-version }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache@v2.1.5
@@ -517,7 +517,7 @@ jobs:
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.2.2
id: python
@@ -551,7 +551,7 @@ jobs:
container: homeassistant/ci-azure:${{ matrix.python-version }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Generate partial Python venv restore key
id: generate-python-key
run: >-
@@ -595,7 +595,7 @@ jobs:
container: homeassistant/ci-azure:${{ matrix.python-version }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache@v2.1.5
@@ -626,7 +626,7 @@ jobs:
container: homeassistant/ci-azure:${{ matrix.python-version }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache@v2.1.5
@@ -660,7 +660,7 @@ jobs:
container: homeassistant/ci-azure:${{ matrix.python-version }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache@v2.1.5
@@ -718,7 +718,7 @@ jobs:
container: homeassistant/ci-azure:${{ matrix.python-version }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache@v2.1.5
@@ -740,4 +740,4 @@ jobs:
coverage report --fail-under=94
coverage xml
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v1.4.1
uses: codecov/codecov-action@v1.5.0

View File

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

64
.github/workflows/translations.yaml vendored Normal file
View File

@@ -0,0 +1,64 @@
name: Translations
# yamllint disable-line rule:truthy
on:
workflow_dispatch:
schedule:
- cron: "0 0 * * *"
push:
branches:
- dev
paths:
- "**strings.json"
env:
DEFAULT_PYTHON: 3.8
jobs:
upload:
name: Upload
runs-on: ubuntu-latest
steps:
- name: Checkout the repository
uses: actions/checkout@v2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.2.2
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Upload Translations
run: |
export LOKALISE_TOKEN="${{ secrets.LOKALISE_TOKEN }}"
python3 -m script.translations upload
download:
name: Download
needs: upload
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
steps:
- name: Checkout the repository
uses: actions/checkout@v2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.2.2
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Download Translations
run: |
export LOKALISE_TOKEN="${{ secrets.LOKALISE_TOKEN }}"
python3 -m script.translations download
- name: Initialize git
uses: home-assistant/actions/helpers/git-init@master
with:
name: GitHub Action
email: github-action@users.noreply.github.com
- name: Update translation
run: |
git add homeassistant
git commit -am "[ci skip] Translation update"
git push

168
.github/workflows/wheels.yml vendored Normal file
View File

@@ -0,0 +1,168 @@
name: Build wheels
# yamllint disable-line rule:truthy
on:
workflow_dispatch:
schedule:
- cron: "0 4 * * *"
push:
branches:
- dev
- rc
paths:
- "requirements.txt"
- "requirements_all.txt"
jobs:
init:
name: Initialize wheels builder
runs-on: ubuntu-latest
outputs:
architectures: ${{ steps.info.outputs.architectures }}
steps:
- name: Checkout the repository
uses: actions/checkout@v2.3.4
- name: Get information
id: info
uses: home-assistant/actions/helpers/info@master
- name: Create requirements_diff file
run: |
if [[ ${{ github.event_name }} =~ (schedule|workflow_dispatch) ]]; then
touch requirements_diff.txt
else
curl -s -o requirements_diff.txt https://raw.githubusercontent.com/home-assistant/core/master/requirements.txt
fi
- name: Write env-file
run: |
(
echo "GRPC_BUILD_WITH_BORING_SSL_ASM=false"
echo "GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=true"
echo "GRPC_PYTHON_BUILD_WITH_CYTHON=true"
echo "GRPC_PYTHON_DISABLE_LIBC_COMPATIBILITY=true"
) > .env_file
- name: Upload env_file
uses: actions/upload-artifact@v2
with:
name: env_file
path: ./.env_file
- name: Upload requirements_diff
uses: actions/upload-artifact@v2
with:
name: requirements_diff
path: ./requirements_diff.txt
core:
name: Build wheels with ${{ matrix.tag }} (${{ matrix.arch }}) for core
needs: init
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
arch: ${{ fromJson(needs.init.outputs.architectures) }}
tag:
- "3.8-alpine3.12"
- "3.9-alpine3.13"
steps:
- name: Checkout the repository
uses: actions/checkout@v2.3.4
- name: Download env_file
uses: actions/download-artifact@v2
with:
name: env_file
- name: Download requirements_diff
uses: actions/download-artifact@v2
with:
name: requirements_diff
- name: Build wheels
uses: home-assistant/wheels@2021.05.4
with:
tag: ${{ matrix.tag }}
arch: ${{ matrix.arch }}
wheels-host: wheels.hass.io
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"
pip: "Cython;numpy"
skip-binary: aiohttp
constraints: "homeassistant/package_constraints.txt"
requirements-diff: 'requirements_diff.txt'
requirements: "requirements.txt"
integrations:
name: Build wheels with ${{ matrix.tag }} (${{ matrix.arch }}) for integrations
needs: init
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
arch: ${{ fromJson(needs.init.outputs.architectures) }}
tag:
- "3.8-alpine3.12"
- "3.9-alpine3.13"
steps:
- name: Checkout the repository
uses: actions/checkout@v2.3.4
- name: Download env_file
uses: actions/download-artifact@v2
with:
name: env_file
- name: Download requirements_diff
uses: actions/download-artifact@v2
with:
name: requirements_diff
- name: Uncomment packages
run: |
requirement_files="requirements_all.txt requirements_diff.txt"
for requirement_file in ${requirement_files}; do
sed -i "s|# pybluez|pybluez|g" ${requirement_file}
sed -i "s|# bluepy|bluepy|g" ${requirement_file}
sed -i "s|# beacontools|beacontools|g" ${requirement_file}
sed -i "s|# RPi.GPIO|RPi.GPIO|g" ${requirement_file}
sed -i "s|# raspihats|raspihats|g" ${requirement_file}
sed -i "s|# rpi-rf|rpi-rf|g" ${requirement_file}
sed -i "s|# blinkt|blinkt|g" ${requirement_file}
sed -i "s|# fritzconnection|fritzconnection|g" ${requirement_file}
sed -i "s|# pyuserinput|pyuserinput|g" ${requirement_file}
sed -i "s|# evdev|evdev|g" ${requirement_file}
sed -i "s|# smbus-cffi|smbus-cffi|g" ${requirement_file}
sed -i "s|# i2csense|i2csense|g" ${requirement_file}
sed -i "s|# python-eq3bt|python-eq3bt|g" ${requirement_file}
sed -i "s|# pycups|pycups|g" ${requirement_file}
sed -i "s|# homekit|homekit|g" ${requirement_file}
sed -i "s|# decora_wifi|decora_wifi|g" ${requirement_file}
sed -i "s|# decora|decora|g" ${requirement_file}
sed -i "s|# avion|avion|g" ${requirement_file}
sed -i "s|# PySwitchbot|PySwitchbot|g" ${requirement_file}
sed -i "s|# pySwitchmate|pySwitchmate|g" ${requirement_file}
sed -i "s|# face_recognition|face_recognition|g" ${requirement_file}
sed -i "s|# bme680|bme680|g" ${requirement_file}
sed -i "s|# python-gammu|python-gammu|g" ${requirement_file}
done
- name: Build wheels
uses: home-assistant/wheels@2021.05.4
with:
tag: ${{ matrix.tag }}
arch: ${{ matrix.arch }}
wheels-host: wheels.hass.io
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"
pip: "Cython;numpy;scikit-build"
skip-binary: aiohttp
constraints: "homeassistant/package_constraints.txt"
requirements-diff: 'requirements_diff.txt'
requirements: "requirements_all.txt"

View File

@@ -1,11 +1,11 @@
repos:
- repo: https://github.com/asottile/pyupgrade
rev: v2.12.0
rev: v2.16.0
hooks:
- id: pyupgrade
args: [--py38-plus]
- repo: https://github.com/psf/black
rev: 21.4b0
rev: 21.5b1
hooks:
- id: black
args:
@@ -17,13 +17,13 @@ repos:
hooks:
- id: codespell
args:
- --ignore-words-list=hass,alot,datas,dof,dur,ether,farenheit,hist,iff,ines,ist,lightsensor,mut,nd,pres,referer,ser,serie,te,technik,ue,uint,visability,wan,wanna,withing,iam,incomfort
- --ignore-words-list=hass,alot,datas,dof,dur,ether,farenheit,hist,iff,ines,ist,lightsensor,mut,nd,pres,referer,ser,serie,te,technik,ue,uint,visability,wan,wanna,withing,iam,incomfort,ba
- --skip="./.*,*.csv,*.json"
- --quiet-level=2
exclude_types: [csv, json]
exclude: ^tests/fixtures/
- repo: https://gitlab.com/pycqa/flake8
rev: 3.9.1
rev: 3.9.2
hooks:
- id: flake8
additional_dependencies:
@@ -31,7 +31,7 @@ repos:
- pyflakes==2.3.1
- flake8-docstrings==1.6.0
- pydocstyle==6.0.0
- flake8-comprehensions==3.4.0
- flake8-comprehensions==3.5.0
- flake8-noqa==1.1.0
- mccabe==0.6.1
files: ^(homeassistant|script|tests)/.+\.py$
@@ -61,7 +61,7 @@ repos:
- --branch=master
- --branch=rc
- repo: https://github.com/adrienverge/yamllint.git
rev: v1.24.2
rev: v1.26.1
hooks:
- id: yamllint
- repo: https://github.com/pre-commit/mirrors-prettier

View File

@@ -3,14 +3,34 @@
# to enable strict mypy checks.
homeassistant.components
homeassistant.components.acer_projector.*
homeassistant.components.accuweather.*
homeassistant.components.actiontec.*
homeassistant.components.aftership.*
homeassistant.components.air_quality.*
homeassistant.components.airly.*
homeassistant.components.aladdin_connect.*
homeassistant.components.alarm_control_panel.*
homeassistant.components.amazon_polly.*
homeassistant.components.ampio.*
homeassistant.components.automation.*
homeassistant.components.binary_sensor.*
homeassistant.components.bluetooth_tracker.*
homeassistant.components.bond.*
homeassistant.components.brother.*
homeassistant.components.calendar.*
homeassistant.components.camera.*
homeassistant.components.canary.*
homeassistant.components.cover.*
homeassistant.components.device_automation.*
homeassistant.components.device_tracker.*
homeassistant.components.dunehd.*
homeassistant.components.elgato.*
homeassistant.components.fitbit.*
homeassistant.components.fritzbox.*
homeassistant.components.frontend.*
homeassistant.components.geo_location.*
homeassistant.components.gios.*
homeassistant.components.group.*
homeassistant.components.history.*
homeassistant.components.http.*
@@ -19,16 +39,21 @@ homeassistant.components.hyperion.*
homeassistant.components.image_processing.*
homeassistant.components.integration.*
homeassistant.components.knx.*
homeassistant.components.kraken.*
homeassistant.components.light.*
homeassistant.components.lock.*
homeassistant.components.mailbox.*
homeassistant.components.media_player.*
homeassistant.components.nam.*
homeassistant.components.network.*
homeassistant.components.notify.*
homeassistant.components.number.*
homeassistant.components.onewire.*
homeassistant.components.persistent_notification.*
homeassistant.components.proximity.*
homeassistant.components.recorder.purge
homeassistant.components.recorder.repack
homeassistant.components.recorder.statistics
homeassistant.components.remote.*
homeassistant.components.scene.*
homeassistant.components.sensor.*
@@ -36,8 +61,11 @@ homeassistant.components.slack.*
homeassistant.components.sonos.media_player
homeassistant.components.sun.*
homeassistant.components.switch.*
homeassistant.components.synology_dsm.*
homeassistant.components.systemmonitor.*
homeassistant.components.tcp.*
homeassistant.components.tts.*
homeassistant.components.upcloud.*
homeassistant.components.vacuum.*
homeassistant.components.water_heater.*
homeassistant.components.weather.*

View File

@@ -64,19 +64,20 @@ homeassistant/components/azure_service_bus/* @hfurubotten
homeassistant/components/beewi_smartclim/* @alemuro
homeassistant/components/bitcoin/* @fabaff
homeassistant/components/bizkaibus/* @UgaitzEtxebarria
homeassistant/components/blebox/* @gadgetmobile
homeassistant/components/blebox/* @bbx-a @bbx-jp
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/bosch_shc/* @tschamm
homeassistant/components/braviatv/* @bieniu
homeassistant/components/broadlink/* @danielhiversen @felipediel
homeassistant/components/brother/* @bieniu
homeassistant/components/brunt/* @eavanvalkenburg
homeassistant/components/bsblan/* @liudger
homeassistant/components/bt_smarthub/* @jxwolstenholme
homeassistant/components/buienradar/* @mjj4791 @ties
homeassistant/components/buienradar/* @mjj4791 @ties @Robbie1221
homeassistant/components/cast/* @emontnemery
homeassistant/components/cert_expiry/* @Cereal2nd @jjlawren
homeassistant/components/circuit/* @braam
@@ -111,6 +112,7 @@ homeassistant/components/device_automation/* @home-assistant/core
homeassistant/components/devolo_home_control/* @2Fake @Shutgun
homeassistant/components/dexcom/* @gagebenne
homeassistant/components/dhcp/* @bdraco
homeassistant/components/dht/* @thegardenmonkey
homeassistant/components/digital_ocean/* @fabaff
homeassistant/components/directv/* @ctalkington
homeassistant/components/discogs/* @thibmaek
@@ -168,9 +170,11 @@ homeassistant/components/fritz/* @mammuth @AaronDavidSchneider @chemelli74
homeassistant/components/fritzbox/* @mib1185
homeassistant/components/fronius/* @nielstron
homeassistant/components/frontend/* @home-assistant/frontend
homeassistant/components/garages_amsterdam/* @klaasnicolaas
homeassistant/components/garmin_connect/* @cyberjunky
homeassistant/components/gdacs/* @exxamalte
homeassistant/components/geniushub/* @zxdavb
homeassistant/components/geo_json_events/* @exxamalte
homeassistant/components/geo_rss_events/* @exxamalte
homeassistant/components/geonetnz_quakes/* @exxamalte
homeassistant/components/geonetnz_volcano/* @exxamalte
@@ -178,7 +182,7 @@ homeassistant/components/gios/* @bieniu
homeassistant/components/gitter/* @fabaff
homeassistant/components/glances/* @fabaff @engrbm87
homeassistant/components/goalzero/* @tkdrob
homeassistant/components/gogogate2/* @vangorra
homeassistant/components/gogogate2/* @vangorra @bdraco
homeassistant/components/google_assistant/* @home-assistant/cloud
homeassistant/components/google_cloud/* @lufton
homeassistant/components/gpsd/* @fabaff
@@ -203,7 +207,7 @@ homeassistant/components/home_connect/* @DavidMStraub
homeassistant/components/home_plus_control/* @chemaaa
homeassistant/components/homeassistant/* @home-assistant/core
homeassistant/components/homekit/* @bdraco
homeassistant/components/homekit_controller/* @Jc2k
homeassistant/components/homekit_controller/* @Jc2k @bdraco
homeassistant/components/homematic/* @pvizeli @danielperna84
homeassistant/components/http/* @home-assistant/core
homeassistant/components/huawei_lte/* @scop @fphammerle
@@ -253,10 +257,12 @@ homeassistant/components/knx/* @Julius2342 @farmio @marvin-w
homeassistant/components/kodi/* @OnFreund @cgtobi
homeassistant/components/konnected/* @heythisisnate @kit-klein
homeassistant/components/kostal_plenticore/* @stegm
homeassistant/components/kraken/* @eifinger
homeassistant/components/kulersky/* @emlove
homeassistant/components/lametric/* @robbiet480
homeassistant/components/launch_library/* @ludeeus
homeassistant/components/lcn/* @alengwenus
homeassistant/components/lg_netcast/* @Drafteed
homeassistant/components/life360/* @pnbruckner
homeassistant/components/linux_battery/* @fabaff
homeassistant/components/litejet/* @joncar
@@ -284,6 +290,7 @@ homeassistant/components/met/* @danielhiversen @thimic
homeassistant/components/met_eireann/* @DylanGore
homeassistant/components/meteo_france/* @hacf-fr @oncleben31 @Quentame
homeassistant/components/meteoalarm/* @rolfberkenbosch
homeassistant/components/meteoclimatic/* @adrianmo
homeassistant/components/metoffice/* @MrHarcombe
homeassistant/components/miflora/* @danielhiversen @basnijholt
homeassistant/components/mikrotik/* @engrbm87
@@ -306,6 +313,7 @@ homeassistant/components/my/* @home-assistant/core
homeassistant/components/myq/* @bdraco
homeassistant/components/mysensors/* @MartinHjelmare @functionpointer
homeassistant/components/mystrom/* @fabaff
homeassistant/components/nam/* @bieniu
homeassistant/components/neato/* @dshokouhi @Santobert
homeassistant/components/nederlandse_spoorwegen/* @YarmoM
homeassistant/components/nello/* @pschmitt
@@ -327,7 +335,6 @@ homeassistant/components/notify_events/* @matrozov @papajojo
homeassistant/components/notion/* @bachya
homeassistant/components/nsw_fuel_station/* @nickw444
homeassistant/components/nsw_rural_fire_service_feed/* @exxamalte
homeassistant/components/nuheat/* @bdraco
homeassistant/components/nuki/* @pschmitt @pvizeli @pree
homeassistant/components/numato/* @clssn
homeassistant/components/number/* @home-assistant/core @Shulyaka
@@ -407,7 +414,7 @@ homeassistant/components/rpi_power/* @shenxn @swetoast
homeassistant/components/ruckus_unleashed/* @gabe565
homeassistant/components/safe_mode/* @home-assistant/core
homeassistant/components/saj/* @fredericvl
homeassistant/components/samsungtv/* @escoand
homeassistant/components/samsungtv/* @escoand @chemelli74
homeassistant/components/scene/* @home-assistant/core
homeassistant/components/schluter/* @prairieapps
homeassistant/components/scrape/* @fabaff
@@ -425,6 +432,7 @@ homeassistant/components/shell_command/* @home-assistant/core
homeassistant/components/shelly/* @balloob @bieniu @thecode @chemelli74
homeassistant/components/shiftr/* @fabaff
homeassistant/components/shodan/* @fabaff
homeassistant/components/sia/* @eavanvalkenburg
homeassistant/components/sighthound/* @robmarkcole
homeassistant/components/signal_messenger/* @bbernhard
homeassistant/components/simplisafe/* @bachya
@@ -450,7 +458,7 @@ homeassistant/components/soma/* @ratsept
homeassistant/components/somfy/* @tetienne
homeassistant/components/sonarr/* @ctalkington
homeassistant/components/songpal/* @rytilahti @shenxn
homeassistant/components/sonos/* @cgtobi
homeassistant/components/sonos/* @cgtobi @jjlawren
homeassistant/components/spaceapi/* @fabaff
homeassistant/components/speedtestdotnet/* @rohankapoorcom @engrbm87
homeassistant/components/spider/* @peternijssen
@@ -475,10 +483,12 @@ homeassistant/components/swiss_public_transport/* @fabaff
homeassistant/components/switchbot/* @danielhiversen
homeassistant/components/switcher_kis/* @tomerfi
homeassistant/components/switchmate/* @danielhiversen
homeassistant/components/syncthing/* @zhulik
homeassistant/components/syncthru/* @nielstron
homeassistant/components/synology_dsm/* @hacf-fr @Quentame @mib1185
homeassistant/components/synology_srm/* @aerialls
homeassistant/components/syslog/* @fabaff
homeassistant/components/system_bridge/* @timmo001
homeassistant/components/tado/* @michaelarnauts @bdraco @noltari
homeassistant/components/tag/* @balloob @dmulcahey
homeassistant/components/tahoma/* @philklei
@@ -535,6 +545,7 @@ homeassistant/components/vlc_telnet/* @rodripf @dmcc
homeassistant/components/volkszaehler/* @fabaff
homeassistant/components/volumio/* @OnFreund
homeassistant/components/wake_on_lan/* @ntilley905
homeassistant/components/wallbox/* @hesselonline
homeassistant/components/waqi/* @andrey-git
homeassistant/components/watson_tts/* @rutkai
homeassistant/components/weather/* @fabaff
@@ -554,6 +565,7 @@ homeassistant/components/xiaomi_aqara/* @danielhiversen @syssi
homeassistant/components/xiaomi_miio/* @rytilahti @syssi @starkillerOG
homeassistant/components/xiaomi_tv/* @simse
homeassistant/components/xmpp/* @fabaff @flowolf
homeassistant/components/yale_smart_alarm/* @gjohansson-ST
homeassistant/components/yamaha_musiccast/* @jalmeroth
homeassistant/components/yandex_transport/* @rishatik92 @devbis
homeassistant/components/yeelight/* @rytilahti @zewelor @shenxn

View File

@@ -1,4 +1,4 @@
FROM mcr.microsoft.com/vscode/devcontainers/python:0-3.8
FROM mcr.microsoft.com/vscode/devcontainers/python:0-3.9
SHELL ["/bin/bash", "-o", "pipefail", "-c"]

View File

@@ -1,232 +0,0 @@
# https://dev.azure.com/home-assistant
trigger:
batch: true
branches:
include:
- rc
- dev
- master
pr:
- rc
- dev
- master
resources:
containers:
- container: 38
image: homeassistant/ci-azure:3.8
repositories:
- repository: azure
type: github
name: "home-assistant/ci-azure"
endpoint: "home-assistant"
variables:
- name: PythonMain
value: "38"
- name: versionHadolint
value: "v1.17.6"
stages:
- stage: "Overview"
jobs:
- job: "Lint"
pool:
vmImage: "ubuntu-latest"
container: $[ variables['PythonMain'] ]
steps:
- template: templates/azp-step-cache.yaml@azure
parameters:
keyfile: "requirements_test.txt | homeassistant/package_constraints.txt"
build: |
python -m venv venv
. venv/bin/activate
pip install -r requirements_test.txt
pre-commit install-hooks
- script: |
. venv/bin/activate
pre-commit run --hook-stage manual check-executables-have-shebangs --all-files
displayName: "Run executables check"
- script: |
. venv/bin/activate
pre-commit run codespell --all-files
displayName: "Run codespell"
- script: |
. venv/bin/activate
pre-commit run flake8 --all-files
displayName: "Run flake8"
- script: |
. venv/bin/activate
pre-commit run bandit --all-files
displayName: "Run bandit"
- script: |
. venv/bin/activate
pre-commit run isort --all-files --show-diff-on-failure
displayName: "Run isort"
- script: |
. venv/bin/activate
pre-commit run check-json --all-files
displayName: "Run check-json"
- script: |
. venv/bin/activate
pre-commit run yamllint --all-files
displayName: "Run yamllint"
- script: |
. venv/bin/activate
pre-commit run pyupgrade --all-files --show-diff-on-failure
displayName: "Run pyupgrade"
# Prettier seems to hang on Azure, unknown why yet.
# Temporarily disable the check to no block PRs
# - script: |
# . venv/bin/activate
# pre-commit run prettier --all-files --show-diff-on-failure
# displayName: 'Run prettier'
- job: "Validate"
pool:
vmImage: "ubuntu-latest"
container: $[ variables['PythonMain'] ]
steps:
- template: templates/azp-step-cache.yaml@azure
parameters:
keyfile: "homeassistant/package_constraints.txt"
build: |
python -m venv venv
. venv/bin/activate
pip install -e .
- script: |
. venv/bin/activate
python -m script.hassfest --action validate
displayName: "Validate manifests"
- script: |
. venv/bin/activate
./script/gen_requirements_all.py validate
displayName: "requirements_all validate"
- job: "CheckFormat"
pool:
vmImage: "ubuntu-latest"
container: $[ variables['PythonMain'] ]
steps:
- template: templates/azp-step-cache.yaml@azure
parameters:
keyfile: "requirements_test.txt | homeassistant/package_constraints.txt"
build: |
python -m venv venv
. venv/bin/activate
pip install -r requirements_test.txt
pre-commit install-hooks
- script: |
. venv/bin/activate
pre-commit run black --all-files --show-diff-on-failure
displayName: "Check Black formatting"
- job: "Docker"
pool:
vmImage: "ubuntu-latest"
steps:
- script: sudo docker pull hadolint/hadolint:$(versionHadolint)
displayName: "Install Hadolint"
- script: |
set -e
for dockerfile in Dockerfile Dockerfile.dev
do
echo "Linting: $dockerfile"
docker run --rm -i \
-v "$(pwd)/.hadolint.yaml:/.hadolint.yaml:ro" \
hadolint/hadolint:$(versionHadolint) < "$dockerfile"
done
displayName: "Run Hadolint"
- stage: "Tests"
dependsOn:
- "Overview"
jobs:
- job: "PyTest"
pool:
vmImage: "ubuntu-latest"
strategy:
maxParallel: 3
matrix:
Python38:
python.container: "38"
container: $[ variables['python.container'] ]
steps:
- template: templates/azp-step-cache.yaml@azure
parameters:
keyfile: "requirements_test_all.txt | requirements_test.txt | homeassistant/package_constraints.txt"
build: |
set -e
python -m venv venv
. venv/bin/activate
pip install -U pip setuptools pytest-azurepipelines pytest-xdist -c homeassistant/package_constraints.txt
pip install -r requirements_test_all.txt
- script: |
. venv/bin/activate
pip install -e .
displayName: "Install Home Assistant"
- script: |
set -e
. venv/bin/activate
pytest --timeout=9 --durations=10 -n auto --dist=loadfile -qq -o console_output_style=count -p no:sugar tests
script/check_dirty
displayName: "Run pytest for python $(python.container)"
condition: and(succeeded(), ne(variables['python.container'], variables['PythonMain']))
- script: |
set -e
. venv/bin/activate
pytest --timeout=9 --durations=10 -n auto --dist=loadfile --cov homeassistant --cov-report html -qq -o console_output_style=count -p no:sugar tests
codecov --token $(codecovToken)
script/check_dirty
displayName: "Run pytest for python $(python.container) / coverage"
condition: and(succeeded(), eq(variables['python.container'], variables['PythonMain']))
- stage: "FullCheck"
dependsOn:
- "Overview"
jobs:
- job: "Pylint"
pool:
vmImage: "ubuntu-latest"
container: $[ variables['PythonMain'] ]
steps:
- template: templates/azp-step-cache.yaml@azure
parameters:
keyfile: "requirements_all.txt | requirements_test.txt | homeassistant/package_constraints.txt"
build: |
set -e
python -m venv venv
. venv/bin/activate
pip install -U pip setuptools wheel
pip install -r requirements_all.txt
pip install -r requirements_test.txt
- script: |
. venv/bin/activate
pip install -e .
displayName: "Install Home Assistant"
- script: |
. venv/bin/activate
pylint homeassistant
displayName: "Run pylint"
- job: "Mypy"
pool:
vmImage: "ubuntu-latest"
container: $[ variables['PythonMain'] ]
steps:
- template: templates/azp-step-cache.yaml@azure
parameters:
keyfile: "requirements_test.txt | setup.py | homeassistant/package_constraints.txt"
build: |
python -m venv venv
. venv/bin/activate
pip install -e . -r requirements_test.txt
pre-commit install-hooks
- script: |
. venv/bin/activate
pre-commit run mypy --all-files
displayName: "Run mypy"

View File

@@ -1,65 +0,0 @@
# https://dev.azure.com/home-assistant
trigger:
batch: true
branches:
include:
- dev
pr: none
schedules:
- cron: "0 0 * * *"
displayName: "translation update"
branches:
include:
- dev
always: true
variables:
- group: translation
resources:
repositories:
- repository: azure
type: github
name: 'home-assistant/ci-azure'
endpoint: 'home-assistant'
jobs:
- job: 'Upload'
pool:
vmImage: 'ubuntu-latest'
steps:
- task: UsePythonVersion@0
displayName: 'Use Python 3.8'
inputs:
versionSpec: '3.8'
- script: |
export LOKALISE_TOKEN="$(lokaliseToken)"
export AZURE_BRANCH="$(Build.SourceBranchName)"
python3 -m script.translations upload
displayName: 'Upload Translation'
- job: 'Download'
dependsOn:
- 'Upload'
condition: or(eq(variables['Build.Reason'], 'Schedule'), eq(variables['Build.Reason'], 'Manual'))
pool:
vmImage: 'ubuntu-latest'
steps:
- task: UsePythonVersion@0
displayName: 'Use Python 3.7'
inputs:
versionSpec: '3.7'
- template: templates/azp-step-git-init.yaml@azure
- script: |
export LOKALISE_TOKEN="$(lokaliseToken)"
python3 -m script.translations download
displayName: 'Download Translation'
- script: |
git checkout dev
git add homeassistant
git commit -am "[ci skip] Translation update"
git push
displayName: 'Update translation'

View File

@@ -1,100 +0,0 @@
# https://dev.azure.com/home-assistant
trigger:
branches:
include:
- dev
- rc
paths:
include:
- requirements_all.txt
pr: none
schedules:
- cron: '0 */4 * * *'
displayName: 'daily builds'
branches:
include:
- dev
variables:
- name: versionWheels
value: '1.13.0-3.8-alpine3.12'
resources:
repositories:
- repository: azure
type: github
name: 'home-assistant/ci-azure'
endpoint: 'home-assistant'
jobs:
- template: templates/azp-job-wheels.yaml@azure
parameters:
builderVersion: '$(versionWheels)'
builderApk: 'build-base;cmake;git;linux-headers;bluez-dev;libffi-dev;openssl-dev;glib-dev;eudev-dev;libxml2-dev;libxslt-dev'
builderPip: 'Cython;numpy'
skipBinary: 'aiohttp'
wheelsRequirement: 'requirements.txt'
wheelsRequirementDiff: 'requirements_diff.txt'
wheelsConstraint: 'homeassistant/package_constraints.txt'
jobName: 'Wheels_Core'
preBuild:
- script: |
if [[ "$(Build.Reason)" =~ (Schedule|Manual) ]]; then
exit 0
else
curl -s -o requirements_diff.txt https://raw.githubusercontent.com/home-assistant/core/master/requirements.txt
fi
displayName: 'Prepare requirements files for Home Assistant Core wheels'
- template: templates/azp-job-wheels.yaml@azure
parameters:
builderVersion: '$(versionWheels)'
builderApk: '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'
builderPip: 'Cython;numpy;scikit-build'
builderEnvFile: true
skipBinary: 'aiohttp'
wheelsRequirement: 'requirements_wheels.txt'
wheelsRequirementDiff: 'requirements_diff.txt'
wheelsConstraint: 'homeassistant/package_constraints.txt'
jobName: 'Wheels_Integrations'
preBuild:
- script: |
cp requirements_all.txt requirements_wheels.txt
if [[ "$(Build.Reason)" =~ (Schedule|Manual) ]]; then
touch requirements_diff.txt
else
curl -s -o requirements_diff.txt https://raw.githubusercontent.com/home-assistant/core/master/requirements_all.txt
fi
requirement_files="requirements_wheels.txt requirements_diff.txt"
for requirement_file in ${requirement_files}; do
sed -i "s|# pybluez|pybluez|g" ${requirement_file}
sed -i "s|# bluepy|bluepy|g" ${requirement_file}
sed -i "s|# beacontools|beacontools|g" ${requirement_file}
sed -i "s|# RPi.GPIO|RPi.GPIO|g" ${requirement_file}
sed -i "s|# raspihats|raspihats|g" ${requirement_file}
sed -i "s|# rpi-rf|rpi-rf|g" ${requirement_file}
sed -i "s|# blinkt|blinkt|g" ${requirement_file}
sed -i "s|# fritzconnection|fritzconnection|g" ${requirement_file}
sed -i "s|# pyuserinput|pyuserinput|g" ${requirement_file}
sed -i "s|# evdev|evdev|g" ${requirement_file}
sed -i "s|# smbus-cffi|smbus-cffi|g" ${requirement_file}
sed -i "s|# i2csense|i2csense|g" ${requirement_file}
sed -i "s|# python-eq3bt|python-eq3bt|g" ${requirement_file}
sed -i "s|# pycups|pycups|g" ${requirement_file}
sed -i "s|# homekit|homekit|g" ${requirement_file}
sed -i "s|# decora_wifi|decora_wifi|g" ${requirement_file}
sed -i "s|# decora|decora|g" ${requirement_file}
sed -i "s|# avion|avion|g" ${requirement_file}
sed -i "s|# PySwitchbot|PySwitchbot|g" ${requirement_file}
sed -i "s|# pySwitchmate|pySwitchmate|g" ${requirement_file}
sed -i "s|# face_recognition|face_recognition|g" ${requirement_file}
sed -i "s|# py_noaa|py_noaa|g" ${requirement_file}
sed -i "s|# bme680|bme680|g" ${requirement_file}
sed -i "s|# python-gammu|python-gammu|g" ${requirement_file}
done
# Write env for build settings
(
echo "GRPC_BUILD_WITH_BORING_SSL_ASM="
echo "GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1"
) > .env_file
displayName: 'Prepare requirements files for Home Assistant wheels'

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.04.3",
"armhf": "ghcr.io/home-assistant/armhf-homeassistant-base:2021.04.3",
"armv7": "ghcr.io/home-assistant/armv7-homeassistant-base:2021.04.3",
"amd64": "ghcr.io/home-assistant/amd64-homeassistant-base:2021.04.3",
"i386": "ghcr.io/home-assistant/i386-homeassistant-base:2021.04.3"
"aarch64": "ghcr.io/home-assistant/aarch64-homeassistant-base:2021.05.0",
"armhf": "ghcr.io/home-assistant/armhf-homeassistant-base:2021.05.0",
"armv7": "ghcr.io/home-assistant/armv7-homeassistant-base:2021.05.0",
"amd64": "ghcr.io/home-assistant/amd64-homeassistant-base:2021.05.0",
"i386": "ghcr.io/home-assistant/i386-homeassistant-base:2021.05.0"
},
"labels": {
"io.hass.type": "core",

View File

@@ -9,13 +9,12 @@ from typing import Any, Dict, Mapping, Optional, Tuple, cast
import jwt
from homeassistant import data_entry_flow
from homeassistant.auth.const import ACCESS_TOKEN_EXPIRATION
from homeassistant.core import HomeAssistant, callback
from homeassistant.data_entry_flow import FlowResult
from homeassistant.util import dt as dt_util
from . import auth_store, models
from .const import GROUP_ID_ADMIN
from .const import ACCESS_TOKEN_EXPIRATION, GROUP_ID_ADMIN
from .mfa_modules import MultiFactorAuthModule, auth_mfa_module_from_config
from .providers import AuthProvider, LoginFlow, auth_provider_from_config
@@ -79,7 +78,7 @@ async def auth_manager_from_config(
class AuthManagerFlowManager(data_entry_flow.FlowManager):
"""Manage authentication flows."""
def __init__(self, hass: HomeAssistant, auth_manager: AuthManager):
def __init__(self, hass: HomeAssistant, auth_manager: AuthManager) -> None:
"""Init auth manager flows."""
super().__init__(hass)
self.auth_manager = auth_manager

View File

@@ -95,31 +95,29 @@ class TrustedNetworksAuthProvider(AuthProvider):
user for user in users if not user.system_generated and user.is_active
]
for ip_net, user_or_group_list in self.trusted_users.items():
if ip_addr in ip_net:
user_list = [
user_id
for user_id in user_or_group_list
if isinstance(user_id, str)
]
group_list = [
group[CONF_GROUP]
for group in user_or_group_list
if isinstance(group, dict)
]
flattened_group_list = [
group for sublist in group_list for group in sublist
]
available_users = [
user
for user in available_users
if (
user.id in user_list
or any(
group.id in flattened_group_list for group in user.groups
)
)
]
break
if ip_addr not in ip_net:
continue
user_list = [
user_id for user_id in user_or_group_list if isinstance(user_id, str)
]
group_list = [
group[CONF_GROUP]
for group in user_or_group_list
if isinstance(group, dict)
]
flattened_group_list = [
group for sublist in group_list for group in sublist
]
available_users = [
user
for user in available_users
if (
user.id in user_list
or any(group.id in flattened_group_list for group in user.groups)
)
]
break
return TrustedNetworksLoginFlow(
self,
@@ -136,13 +134,22 @@ class TrustedNetworksAuthProvider(AuthProvider):
users = await self.store.async_get_users()
for user in users:
if not user.system_generated and user.is_active and user.id == user_id:
for credential in await self.async_credentials():
if credential.data["user_id"] == user_id:
return credential
cred = self.async_create_credentials({"user_id": user_id})
await self.store.async_link_user(user, cred)
return cred
if user.id != user_id:
continue
if user.system_generated:
continue
if not user.is_active:
continue
for credential in await self.async_credentials():
if credential.data["user_id"] == user_id:
return credential
cred = self.async_create_credentials({"user_id": user_id})
await self.store.async_link_user(user, cred)
return cred
# We only allow login as exist user
raise InvalidUserError

View File

@@ -45,15 +45,19 @@ ATTR_EVENT_BY = "event_by"
ATTR_VALUE = "value"
CONFIG_SCHEMA = vol.Schema(
{
DOMAIN: vol.Schema(
{
vol.Required(CONF_USERNAME): cv.string,
vol.Required(CONF_PASSWORD): cv.string,
vol.Optional(CONF_POLLING, default=False): cv.boolean,
}
)
},
vol.All(
# Deprecated in Home Assistant 2021.6
cv.deprecated(DOMAIN),
{
DOMAIN: vol.Schema(
{
vol.Required(CONF_USERNAME): cv.string,
vol.Required(CONF_PASSWORD): cv.string,
vol.Optional(CONF_POLLING, default=False): cv.boolean,
}
)
},
),
extra=vol.ALLOW_EXTRA,
)

View File

@@ -18,7 +18,6 @@ class AbodeFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
"""Config flow for Abode."""
VERSION = 1
CONNECTION_CLASS = config_entries.CONN_CLASS_LOCAL_POLL
def __init__(self):
"""Initialize."""

View File

@@ -1,21 +1,44 @@
capture_image:
name: Capture image
description: Request a new image capture from a camera device.
fields:
entity_id:
name: Entity
description: Entity id of the camera to request an image.
example: camera.downstairs_motion_camera
required: true
selector:
entity:
integration: abode
domain: camera
change_setting:
name: Change setting
description: Change an Abode system setting.
fields:
setting:
name: Setting
description: Setting to change.
required: true
example: beeper_mute
selector:
text:
value:
name: Value
description: Value of the setting.
required: true
example: "1"
selector:
text:
trigger_automation:
name: Trigger automation
description: Trigger an Abode automation.
fields:
entity_id:
name: Entity
description: Entity id of the automation to trigger.
example: switch.my_automation
required: true
selector:
entity:
integration: abode
domain: switch

View File

@@ -1,12 +1,18 @@
"""The AccuWeather component."""
from __future__ import annotations
from datetime import timedelta
import logging
from typing import Any, Dict
from accuweather import AccuWeather, ApiError, InvalidApiKeyError, RequestsExceededError
from aiohttp import ClientSession
from aiohttp.client_exceptions import ClientConnectorError
from async_timeout import timeout
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_API_KEY
from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
@@ -23,11 +29,12 @@ _LOGGER = logging.getLogger(__name__)
PLATFORMS = ["sensor", "weather"]
async def async_setup_entry(hass, config_entry) -> bool:
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up AccuWeather as config entry."""
api_key = config_entry.data[CONF_API_KEY]
location_key = config_entry.unique_id
forecast = config_entry.options.get(CONF_FORECAST, False)
api_key: str = entry.data[CONF_API_KEY]
assert entry.unique_id is not None
location_key = entry.unique_id
forecast: bool = entry.options.get(CONF_FORECAST, False)
_LOGGER.debug("Using location_key: %s, get forecast: %s", location_key, forecast)
@@ -38,41 +45,46 @@ async def async_setup_entry(hass, config_entry) -> bool:
)
await coordinator.async_config_entry_first_refresh()
undo_listener = config_entry.add_update_listener(update_listener)
undo_listener = entry.add_update_listener(update_listener)
hass.data.setdefault(DOMAIN, {})[config_entry.entry_id] = {
hass.data.setdefault(DOMAIN, {})[entry.entry_id] = {
COORDINATOR: coordinator,
UNDO_UPDATE_LISTENER: undo_listener,
}
hass.config_entries.async_setup_platforms(config_entry, PLATFORMS)
hass.config_entries.async_setup_platforms(entry, PLATFORMS)
return True
async def async_unload_entry(hass, config_entry):
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Unload a config entry."""
unload_ok = await hass.config_entries.async_unload_platforms(
config_entry, PLATFORMS
)
unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
hass.data[DOMAIN][config_entry.entry_id][UNDO_UPDATE_LISTENER]()
hass.data[DOMAIN][entry.entry_id][UNDO_UPDATE_LISTENER]()
if unload_ok:
hass.data[DOMAIN].pop(config_entry.entry_id)
hass.data[DOMAIN].pop(entry.entry_id)
return unload_ok
async def update_listener(hass, config_entry):
async def update_listener(hass: HomeAssistant, entry: ConfigEntry) -> None:
"""Update listener."""
await hass.config_entries.async_reload(config_entry.entry_id)
await hass.config_entries.async_reload(entry.entry_id)
class AccuWeatherDataUpdateCoordinator(DataUpdateCoordinator):
class AccuWeatherDataUpdateCoordinator(DataUpdateCoordinator[Dict[str, Any]]):
"""Class to manage fetching AccuWeather data API."""
def __init__(self, hass, session, api_key, location_key, forecast: bool):
def __init__(
self,
hass: HomeAssistant,
session: ClientSession,
api_key: str,
location_key: str,
forecast: bool,
) -> None:
"""Initialize."""
self.location_key = location_key
self.forecast = forecast
@@ -91,7 +103,7 @@ class AccuWeatherDataUpdateCoordinator(DataUpdateCoordinator):
super().__init__(hass, _LOGGER, name=DOMAIN, update_interval=update_interval)
async def _async_update_data(self):
async def _async_update_data(self) -> dict[str, Any]:
"""Update data via library."""
try:
async with timeout(10):
@@ -108,5 +120,5 @@ class AccuWeatherDataUpdateCoordinator(DataUpdateCoordinator):
RequestsExceededError,
) as error:
raise UpdateFailed(error) from error
_LOGGER.debug("Requests remaining: %s", self.accuweather.requests_remaining)
_LOGGER.debug("Requests remaining: %d", self.accuweather.requests_remaining)
return {**current, **{ATTR_FORECAST: forecast}}

View File

@@ -1,5 +1,8 @@
"""Adds config flow for AccuWeather."""
from __future__ import annotations
import asyncio
from typing import Any
from accuweather import AccuWeather, ApiError, InvalidApiKeyError, RequestsExceededError
from aiohttp import ClientError
@@ -8,8 +11,10 @@ from async_timeout import timeout
import voluptuous as vol
from homeassistant import config_entries
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME
from homeassistant.core import callback
from homeassistant.data_entry_flow import FlowResult
from homeassistant.helpers.aiohttp_client import async_get_clientsession
import homeassistant.helpers.config_validation as cv
@@ -20,9 +25,10 @@ class AccuWeatherFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
"""Config flow for AccuWeather."""
VERSION = 1
CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_POLL
async def async_step_user(self, user_input=None):
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Handle a flow initialized by the user."""
# Under the terms of use of the API, one user can use one free API key. Due to
# the small number of requests allowed, we only allow one integration instance.
@@ -78,7 +84,9 @@ class AccuWeatherFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
@staticmethod
@callback
def async_get_options_flow(config_entry):
def async_get_options_flow(
config_entry: ConfigEntry,
) -> AccuWeatherOptionsFlowHandler:
"""Options callback for AccuWeather."""
return AccuWeatherOptionsFlowHandler(config_entry)
@@ -86,15 +94,19 @@ class AccuWeatherFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
class AccuWeatherOptionsFlowHandler(config_entries.OptionsFlow):
"""Config flow options for AccuWeather."""
def __init__(self, config_entry):
def __init__(self, entry: ConfigEntry) -> None:
"""Initialize AccuWeather options flow."""
self.config_entry = config_entry
self.config_entry = entry
async def async_step_init(self, user_input=None):
async def async_step_init(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Manage the options."""
return await self.async_step_user()
async def async_step_user(self, user_input=None):
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Handle a flow initialized by the user."""
if user_input is not None:
return self.async_create_entry(title="", data=user_input)

View File

@@ -1,4 +1,8 @@
"""Constants for AccuWeather integration."""
from __future__ import annotations
from typing import Final
from homeassistant.components.weather import (
ATTR_CONDITION_CLEAR_NIGHT,
ATTR_CONDITION_CLOUDY,
@@ -33,18 +37,25 @@ from homeassistant.const import (
UV_INDEX,
)
ATTRIBUTION = "Data provided by AccuWeather"
ATTR_FORECAST = CONF_FORECAST = "forecast"
ATTR_LABEL = "label"
ATTR_UNIT_IMPERIAL = "Imperial"
ATTR_UNIT_METRIC = "Metric"
COORDINATOR = "coordinator"
DOMAIN = "accuweather"
MANUFACTURER = "AccuWeather, Inc."
NAME = "AccuWeather"
UNDO_UPDATE_LISTENER = "undo_update_listener"
from .model import SensorDescription
CONDITION_CLASSES = {
API_IMPERIAL: Final = "Imperial"
API_METRIC: Final = "Metric"
ATTRIBUTION: Final = "Data provided by AccuWeather"
ATTR_ENABLED: Final = "enabled"
ATTR_FORECAST: Final = "forecast"
ATTR_LABEL: Final = "label"
ATTR_UNIT_IMPERIAL: Final = "unit_imperial"
ATTR_UNIT_METRIC: Final = "unit_metric"
CONF_FORECAST: Final = "forecast"
COORDINATOR: Final = "coordinator"
DOMAIN: Final = "accuweather"
MANUFACTURER: Final = "AccuWeather, Inc."
MAX_FORECAST_DAYS: Final = 4
NAME: Final = "AccuWeather"
UNDO_UPDATE_LISTENER: Final = "undo_update_listener"
CONDITION_CLASSES: Final[dict[str, list[int]]] = {
ATTR_CONDITION_CLEAR_NIGHT: [33, 34, 37],
ATTR_CONDITION_CLOUDY: [7, 8, 38],
ATTR_CONDITION_EXCEPTIONAL: [24, 30, 31],
@@ -61,15 +72,14 @@ CONDITION_CLASSES = {
ATTR_CONDITION_WINDY: [32],
}
FORECAST_DAYS = [0, 1, 2, 3, 4]
FORECAST_SENSOR_TYPES = {
FORECAST_SENSOR_TYPES: Final[dict[str, SensorDescription]] = {
"CloudCoverDay": {
ATTR_DEVICE_CLASS: None,
ATTR_ICON: "mdi:weather-cloudy",
ATTR_LABEL: "Cloud Cover Day",
ATTR_UNIT_METRIC: PERCENTAGE,
ATTR_UNIT_IMPERIAL: PERCENTAGE,
ATTR_ENABLED: False,
},
"CloudCoverNight": {
ATTR_DEVICE_CLASS: None,
@@ -77,6 +87,7 @@ FORECAST_SENSOR_TYPES = {
ATTR_LABEL: "Cloud Cover Night",
ATTR_UNIT_METRIC: PERCENTAGE,
ATTR_UNIT_IMPERIAL: PERCENTAGE,
ATTR_ENABLED: False,
},
"Grass": {
ATTR_DEVICE_CLASS: None,
@@ -84,6 +95,7 @@ FORECAST_SENSOR_TYPES = {
ATTR_LABEL: "Grass Pollen",
ATTR_UNIT_METRIC: CONCENTRATION_PARTS_PER_CUBIC_METER,
ATTR_UNIT_IMPERIAL: CONCENTRATION_PARTS_PER_CUBIC_METER,
ATTR_ENABLED: False,
},
"HoursOfSun": {
ATTR_DEVICE_CLASS: None,
@@ -91,6 +103,7 @@ FORECAST_SENSOR_TYPES = {
ATTR_LABEL: "Hours Of Sun",
ATTR_UNIT_METRIC: TIME_HOURS,
ATTR_UNIT_IMPERIAL: TIME_HOURS,
ATTR_ENABLED: True,
},
"Mold": {
ATTR_DEVICE_CLASS: None,
@@ -98,6 +111,7 @@ FORECAST_SENSOR_TYPES = {
ATTR_LABEL: "Mold Pollen",
ATTR_UNIT_METRIC: CONCENTRATION_PARTS_PER_CUBIC_METER,
ATTR_UNIT_IMPERIAL: CONCENTRATION_PARTS_PER_CUBIC_METER,
ATTR_ENABLED: False,
},
"Ozone": {
ATTR_DEVICE_CLASS: None,
@@ -105,6 +119,7 @@ FORECAST_SENSOR_TYPES = {
ATTR_LABEL: "Ozone",
ATTR_UNIT_METRIC: None,
ATTR_UNIT_IMPERIAL: None,
ATTR_ENABLED: False,
},
"Ragweed": {
ATTR_DEVICE_CLASS: None,
@@ -112,6 +127,7 @@ FORECAST_SENSOR_TYPES = {
ATTR_LABEL: "Ragweed Pollen",
ATTR_UNIT_METRIC: CONCENTRATION_PARTS_PER_CUBIC_METER,
ATTR_UNIT_IMPERIAL: CONCENTRATION_PARTS_PER_CUBIC_METER,
ATTR_ENABLED: False,
},
"RealFeelTemperatureMax": {
ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
@@ -119,6 +135,7 @@ FORECAST_SENSOR_TYPES = {
ATTR_LABEL: "RealFeel Temperature Max",
ATTR_UNIT_METRIC: TEMP_CELSIUS,
ATTR_UNIT_IMPERIAL: TEMP_FAHRENHEIT,
ATTR_ENABLED: True,
},
"RealFeelTemperatureMin": {
ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
@@ -126,6 +143,7 @@ FORECAST_SENSOR_TYPES = {
ATTR_LABEL: "RealFeel Temperature Min",
ATTR_UNIT_METRIC: TEMP_CELSIUS,
ATTR_UNIT_IMPERIAL: TEMP_FAHRENHEIT,
ATTR_ENABLED: True,
},
"RealFeelTemperatureShadeMax": {
ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
@@ -133,6 +151,7 @@ FORECAST_SENSOR_TYPES = {
ATTR_LABEL: "RealFeel Temperature Shade Max",
ATTR_UNIT_METRIC: TEMP_CELSIUS,
ATTR_UNIT_IMPERIAL: TEMP_FAHRENHEIT,
ATTR_ENABLED: False,
},
"RealFeelTemperatureShadeMin": {
ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
@@ -140,6 +159,7 @@ FORECAST_SENSOR_TYPES = {
ATTR_LABEL: "RealFeel Temperature Shade Min",
ATTR_UNIT_METRIC: TEMP_CELSIUS,
ATTR_UNIT_IMPERIAL: TEMP_FAHRENHEIT,
ATTR_ENABLED: False,
},
"ThunderstormProbabilityDay": {
ATTR_DEVICE_CLASS: None,
@@ -147,6 +167,7 @@ FORECAST_SENSOR_TYPES = {
ATTR_LABEL: "Thunderstorm Probability Day",
ATTR_UNIT_METRIC: PERCENTAGE,
ATTR_UNIT_IMPERIAL: PERCENTAGE,
ATTR_ENABLED: True,
},
"ThunderstormProbabilityNight": {
ATTR_DEVICE_CLASS: None,
@@ -154,6 +175,7 @@ FORECAST_SENSOR_TYPES = {
ATTR_LABEL: "Thunderstorm Probability Night",
ATTR_UNIT_METRIC: PERCENTAGE,
ATTR_UNIT_IMPERIAL: PERCENTAGE,
ATTR_ENABLED: True,
},
"Tree": {
ATTR_DEVICE_CLASS: None,
@@ -161,6 +183,7 @@ FORECAST_SENSOR_TYPES = {
ATTR_LABEL: "Tree Pollen",
ATTR_UNIT_METRIC: CONCENTRATION_PARTS_PER_CUBIC_METER,
ATTR_UNIT_IMPERIAL: CONCENTRATION_PARTS_PER_CUBIC_METER,
ATTR_ENABLED: False,
},
"UVIndex": {
ATTR_DEVICE_CLASS: None,
@@ -168,6 +191,7 @@ FORECAST_SENSOR_TYPES = {
ATTR_LABEL: "UV Index",
ATTR_UNIT_METRIC: UV_INDEX,
ATTR_UNIT_IMPERIAL: UV_INDEX,
ATTR_ENABLED: True,
},
"WindGustDay": {
ATTR_DEVICE_CLASS: None,
@@ -175,6 +199,7 @@ FORECAST_SENSOR_TYPES = {
ATTR_LABEL: "Wind Gust Day",
ATTR_UNIT_METRIC: SPEED_KILOMETERS_PER_HOUR,
ATTR_UNIT_IMPERIAL: SPEED_MILES_PER_HOUR,
ATTR_ENABLED: False,
},
"WindGustNight": {
ATTR_DEVICE_CLASS: None,
@@ -182,6 +207,7 @@ FORECAST_SENSOR_TYPES = {
ATTR_LABEL: "Wind Gust Night",
ATTR_UNIT_METRIC: SPEED_KILOMETERS_PER_HOUR,
ATTR_UNIT_IMPERIAL: SPEED_MILES_PER_HOUR,
ATTR_ENABLED: False,
},
"WindDay": {
ATTR_DEVICE_CLASS: None,
@@ -189,6 +215,7 @@ FORECAST_SENSOR_TYPES = {
ATTR_LABEL: "Wind Day",
ATTR_UNIT_METRIC: SPEED_KILOMETERS_PER_HOUR,
ATTR_UNIT_IMPERIAL: SPEED_MILES_PER_HOUR,
ATTR_ENABLED: True,
},
"WindNight": {
ATTR_DEVICE_CLASS: None,
@@ -196,37 +223,18 @@ FORECAST_SENSOR_TYPES = {
ATTR_LABEL: "Wind Night",
ATTR_UNIT_METRIC: SPEED_KILOMETERS_PER_HOUR,
ATTR_UNIT_IMPERIAL: SPEED_MILES_PER_HOUR,
ATTR_ENABLED: True,
},
}
OPTIONAL_SENSORS = (
"ApparentTemperature",
"CloudCover",
"CloudCoverDay",
"CloudCoverNight",
"DewPoint",
"Grass",
"Mold",
"Ozone",
"Ragweed",
"RealFeelTemperatureShade",
"RealFeelTemperatureShadeMax",
"RealFeelTemperatureShadeMin",
"Tree",
"WetBulbTemperature",
"WindChillTemperature",
"WindGust",
"WindGustDay",
"WindGustNight",
)
SENSOR_TYPES = {
SENSOR_TYPES: Final[dict[str, SensorDescription]] = {
"ApparentTemperature": {
ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_ICON: None,
ATTR_LABEL: "Apparent Temperature",
ATTR_UNIT_METRIC: TEMP_CELSIUS,
ATTR_UNIT_IMPERIAL: TEMP_FAHRENHEIT,
ATTR_ENABLED: False,
},
"Ceiling": {
ATTR_DEVICE_CLASS: None,
@@ -234,6 +242,7 @@ SENSOR_TYPES = {
ATTR_LABEL: "Cloud Ceiling",
ATTR_UNIT_METRIC: LENGTH_METERS,
ATTR_UNIT_IMPERIAL: LENGTH_FEET,
ATTR_ENABLED: True,
},
"CloudCover": {
ATTR_DEVICE_CLASS: None,
@@ -241,6 +250,7 @@ SENSOR_TYPES = {
ATTR_LABEL: "Cloud Cover",
ATTR_UNIT_METRIC: PERCENTAGE,
ATTR_UNIT_IMPERIAL: PERCENTAGE,
ATTR_ENABLED: False,
},
"DewPoint": {
ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
@@ -248,6 +258,7 @@ SENSOR_TYPES = {
ATTR_LABEL: "Dew Point",
ATTR_UNIT_METRIC: TEMP_CELSIUS,
ATTR_UNIT_IMPERIAL: TEMP_FAHRENHEIT,
ATTR_ENABLED: False,
},
"RealFeelTemperature": {
ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
@@ -255,6 +266,7 @@ SENSOR_TYPES = {
ATTR_LABEL: "RealFeel Temperature",
ATTR_UNIT_METRIC: TEMP_CELSIUS,
ATTR_UNIT_IMPERIAL: TEMP_FAHRENHEIT,
ATTR_ENABLED: True,
},
"RealFeelTemperatureShade": {
ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
@@ -262,6 +274,7 @@ SENSOR_TYPES = {
ATTR_LABEL: "RealFeel Temperature Shade",
ATTR_UNIT_METRIC: TEMP_CELSIUS,
ATTR_UNIT_IMPERIAL: TEMP_FAHRENHEIT,
ATTR_ENABLED: False,
},
"Precipitation": {
ATTR_DEVICE_CLASS: None,
@@ -269,6 +282,7 @@ SENSOR_TYPES = {
ATTR_LABEL: "Precipitation",
ATTR_UNIT_METRIC: LENGTH_MILLIMETERS,
ATTR_UNIT_IMPERIAL: LENGTH_INCHES,
ATTR_ENABLED: True,
},
"PressureTendency": {
ATTR_DEVICE_CLASS: "accuweather__pressure_tendency",
@@ -276,6 +290,7 @@ SENSOR_TYPES = {
ATTR_LABEL: "Pressure Tendency",
ATTR_UNIT_METRIC: None,
ATTR_UNIT_IMPERIAL: None,
ATTR_ENABLED: True,
},
"UVIndex": {
ATTR_DEVICE_CLASS: None,
@@ -283,6 +298,7 @@ SENSOR_TYPES = {
ATTR_LABEL: "UV Index",
ATTR_UNIT_METRIC: UV_INDEX,
ATTR_UNIT_IMPERIAL: UV_INDEX,
ATTR_ENABLED: True,
},
"WetBulbTemperature": {
ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
@@ -290,6 +306,7 @@ SENSOR_TYPES = {
ATTR_LABEL: "Wet Bulb Temperature",
ATTR_UNIT_METRIC: TEMP_CELSIUS,
ATTR_UNIT_IMPERIAL: TEMP_FAHRENHEIT,
ATTR_ENABLED: False,
},
"WindChillTemperature": {
ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
@@ -297,6 +314,7 @@ SENSOR_TYPES = {
ATTR_LABEL: "Wind Chill Temperature",
ATTR_UNIT_METRIC: TEMP_CELSIUS,
ATTR_UNIT_IMPERIAL: TEMP_FAHRENHEIT,
ATTR_ENABLED: False,
},
"Wind": {
ATTR_DEVICE_CLASS: None,
@@ -304,6 +322,7 @@ SENSOR_TYPES = {
ATTR_LABEL: "Wind",
ATTR_UNIT_METRIC: SPEED_KILOMETERS_PER_HOUR,
ATTR_UNIT_IMPERIAL: SPEED_MILES_PER_HOUR,
ATTR_ENABLED: True,
},
"WindGust": {
ATTR_DEVICE_CLASS: None,
@@ -311,5 +330,6 @@ SENSOR_TYPES = {
ATTR_LABEL: "Wind Gust",
ATTR_UNIT_METRIC: SPEED_KILOMETERS_PER_HOUR,
ATTR_UNIT_IMPERIAL: SPEED_MILES_PER_HOUR,
ATTR_ENABLED: False,
},
}

View File

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

View File

@@ -0,0 +1,15 @@
"""Type definitions for AccuWeather integration."""
from __future__ import annotations
from typing import TypedDict
class SensorDescription(TypedDict):
"""Sensor description class."""
device_class: str | None
icon: str | None
label: str
unit_metric: str | None
unit_imperial: str | None
enabled: bool

View File

@@ -1,44 +1,62 @@
"""Support for the AccuWeather service."""
from __future__ import annotations
from typing import Any, cast
from homeassistant.components.sensor import SensorEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
ATTR_ATTRIBUTION,
ATTR_DEVICE_CLASS,
ATTR_ICON,
CONF_NAME,
DEVICE_CLASS_TEMPERATURE,
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import StateType
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from . import AccuWeatherDataUpdateCoordinator
from .const import (
API_IMPERIAL,
API_METRIC,
ATTR_ENABLED,
ATTR_FORECAST,
ATTR_ICON,
ATTR_LABEL,
ATTR_UNIT_IMPERIAL,
ATTR_UNIT_METRIC,
ATTRIBUTION,
COORDINATOR,
DOMAIN,
FORECAST_DAYS,
FORECAST_SENSOR_TYPES,
MANUFACTURER,
MAX_FORECAST_DAYS,
NAME,
OPTIONAL_SENSORS,
SENSOR_TYPES,
)
PARALLEL_UPDATES = 1
async def async_setup_entry(hass, config_entry, async_add_entities):
async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Add AccuWeather entities from a config_entry."""
name = config_entry.data[CONF_NAME]
name: str = entry.data[CONF_NAME]
coordinator = hass.data[DOMAIN][config_entry.entry_id][COORDINATOR]
coordinator: AccuWeatherDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
COORDINATOR
]
sensors = []
sensors: list[AccuWeatherSensor] = []
for sensor in SENSOR_TYPES:
sensors.append(AccuWeatherSensor(name, sensor, coordinator))
if coordinator.forecast:
for sensor in FORECAST_SENSOR_TYPES:
for day in FORECAST_DAYS:
for day in range(MAX_FORECAST_DAYS + 1):
# Some air quality/allergy sensors are only available for certain
# locations.
if sensor in coordinator.data[ATTR_FORECAST][0]:
@@ -46,38 +64,51 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
AccuWeatherSensor(name, sensor, coordinator, forecast_day=day)
)
async_add_entities(sensors, False)
async_add_entities(sensors)
class AccuWeatherSensor(CoordinatorEntity, SensorEntity):
"""Define an AccuWeather entity."""
def __init__(self, name, kind, coordinator, forecast_day=None):
coordinator: AccuWeatherDataUpdateCoordinator
def __init__(
self,
name: str,
kind: str,
coordinator: AccuWeatherDataUpdateCoordinator,
forecast_day: int | None = None,
) -> None:
"""Initialize."""
super().__init__(coordinator)
self._sensor_data = _get_sensor_data(coordinator.data, forecast_day, kind)
if forecast_day is None:
self._description = SENSOR_TYPES[kind]
else:
self._description = FORECAST_SENSOR_TYPES[kind]
self._unit_system = API_METRIC if coordinator.is_metric else API_IMPERIAL
self._name = name
self.kind = kind
self._device_class = None
self._attrs = {ATTR_ATTRIBUTION: ATTRIBUTION}
self._unit_system = "Metric" if self.coordinator.is_metric else "Imperial"
self.forecast_day = forecast_day
@property
def name(self):
def name(self) -> str:
"""Return the name."""
if self.forecast_day is not None:
return f"{self._name} {FORECAST_SENSOR_TYPES[self.kind][ATTR_LABEL]} {self.forecast_day}d"
return f"{self._name} {SENSOR_TYPES[self.kind][ATTR_LABEL]}"
return f"{self._name} {self._description[ATTR_LABEL]} {self.forecast_day}d"
return f"{self._name} {self._description[ATTR_LABEL]}"
@property
def unique_id(self):
def unique_id(self) -> str:
"""Return a unique_id for this entity."""
if self.forecast_day is not None:
return f"{self.coordinator.location_key}-{self.kind}-{self.forecast_day}".lower()
return f"{self.coordinator.location_key}-{self.kind}".lower()
@property
def device_info(self):
def device_info(self) -> DeviceInfo:
"""Return the device info."""
return {
"identifiers": {(DOMAIN, self.coordinator.location_key)},
@@ -87,72 +118,54 @@ class AccuWeatherSensor(CoordinatorEntity, SensorEntity):
}
@property
def state(self):
def state(self) -> StateType:
"""Return the state."""
if self.forecast_day is not None:
if (
FORECAST_SENSOR_TYPES[self.kind][ATTR_DEVICE_CLASS]
== DEVICE_CLASS_TEMPERATURE
):
return self.coordinator.data[ATTR_FORECAST][self.forecast_day][
self.kind
]["Value"]
if self.kind in ["WindDay", "WindNight", "WindGustDay", "WindGustNight"]:
return self.coordinator.data[ATTR_FORECAST][self.forecast_day][
self.kind
]["Speed"]["Value"]
if self.kind in ["Grass", "Mold", "Ragweed", "Tree", "UVIndex", "Ozone"]:
return self.coordinator.data[ATTR_FORECAST][self.forecast_day][
self.kind
]["Value"]
return self.coordinator.data[ATTR_FORECAST][self.forecast_day][self.kind]
if self._description["device_class"] == DEVICE_CLASS_TEMPERATURE:
return cast(float, self._sensor_data["Value"])
if self.kind == "UVIndex":
return cast(int, self._sensor_data["Value"])
if self.kind in ["Grass", "Mold", "Ragweed", "Tree", "Ozone"]:
return cast(int, self._sensor_data["Value"])
if self.kind == "Ceiling":
return round(self.coordinator.data[self.kind][self._unit_system]["Value"])
return round(self._sensor_data[self._unit_system]["Value"])
if self.kind == "PressureTendency":
return self.coordinator.data[self.kind]["LocalizedText"].lower()
if SENSOR_TYPES[self.kind][ATTR_DEVICE_CLASS] == DEVICE_CLASS_TEMPERATURE:
return self.coordinator.data[self.kind][self._unit_system]["Value"]
return cast(str, self._sensor_data["LocalizedText"].lower())
if self._description["device_class"] == DEVICE_CLASS_TEMPERATURE:
return cast(float, self._sensor_data[self._unit_system]["Value"])
if self.kind == "Precipitation":
return self.coordinator.data["PrecipitationSummary"][self.kind][
self._unit_system
]["Value"]
return cast(float, self._sensor_data[self._unit_system]["Value"])
if self.kind in ["Wind", "WindGust"]:
return self.coordinator.data[self.kind]["Speed"][self._unit_system]["Value"]
return self.coordinator.data[self.kind]
return cast(float, self._sensor_data["Speed"][self._unit_system]["Value"])
if self.kind in ["WindDay", "WindNight", "WindGustDay", "WindGustNight"]:
return cast(StateType, self._sensor_data["Speed"]["Value"])
return cast(StateType, self._sensor_data)
@property
def icon(self):
def icon(self) -> str | None:
"""Return the icon."""
if self.forecast_day is not None:
return FORECAST_SENSOR_TYPES[self.kind][ATTR_ICON]
return SENSOR_TYPES[self.kind][ATTR_ICON]
return self._description[ATTR_ICON]
@property
def device_class(self):
def device_class(self) -> str | None:
"""Return the device_class."""
if self.forecast_day is not None:
return FORECAST_SENSOR_TYPES[self.kind][ATTR_DEVICE_CLASS]
return SENSOR_TYPES[self.kind][ATTR_DEVICE_CLASS]
return self._description[ATTR_DEVICE_CLASS]
@property
def unit_of_measurement(self):
def unit_of_measurement(self) -> str | None:
"""Return the unit the value is expressed in."""
if self.forecast_day is not None:
return FORECAST_SENSOR_TYPES[self.kind][self._unit_system]
return SENSOR_TYPES[self.kind][self._unit_system]
if self.coordinator.is_metric:
return self._description[ATTR_UNIT_METRIC]
return self._description[ATTR_UNIT_IMPERIAL]
@property
def extra_state_attributes(self):
def extra_state_attributes(self) -> dict[str, Any]:
"""Return the state attributes."""
if self.forecast_day is not None:
if self.kind in ["WindDay", "WindNight", "WindGustDay", "WindGustNight"]:
self._attrs["direction"] = self.coordinator.data[ATTR_FORECAST][
self.forecast_day
][self.kind]["Direction"]["English"]
self._attrs["direction"] = self._sensor_data["Direction"]["English"]
elif self.kind in ["Grass", "Mold", "Ragweed", "Tree", "UVIndex", "Ozone"]:
self._attrs["level"] = self.coordinator.data[ATTR_FORECAST][
self.forecast_day
][self.kind]["Category"]
self._attrs["level"] = self._sensor_data["Category"]
return self._attrs
if self.kind == "UVIndex":
self._attrs["level"] = self.coordinator.data["UVIndexText"]
@@ -161,6 +174,27 @@ class AccuWeatherSensor(CoordinatorEntity, SensorEntity):
return self._attrs
@property
def entity_registry_enabled_default(self):
def entity_registry_enabled_default(self) -> bool:
"""Return if the entity should be enabled when first added to the entity registry."""
return bool(self.kind not in OPTIONAL_SENSORS)
return self._description[ATTR_ENABLED]
@callback
def _handle_coordinator_update(self) -> None:
"""Handle data update."""
self._sensor_data = _get_sensor_data(
self.coordinator.data, self.forecast_day, self.kind
)
self.async_write_ha_state()
def _get_sensor_data(
sensors: dict[str, Any], forecast_day: int | None, kind: str
) -> Any:
"""Get sensor data."""
if forecast_day is not None:
return sensors[ATTR_FORECAST][forecast_day][kind]
if kind == "Precipitation":
return sensors["PrecipitationSummary"][kind]
return sensors[kind]

View File

@@ -1,4 +1,8 @@
"""Provide info to system health."""
from __future__ import annotations
from typing import Any
from accuweather.const import ENDPOINT
from homeassistant.components import system_health
@@ -15,7 +19,7 @@ def async_register(
register.async_register_info(system_health_info)
async def system_health_info(hass):
async def system_health_info(hass: HomeAssistant) -> dict[str, Any]:
"""Get info for the info page."""
remaining_requests = list(hass.data[DOMAIN].values())[0][
COORDINATOR

View File

@@ -1,5 +1,8 @@
"""Support for the AccuWeather service."""
from __future__ import annotations
from statistics import mean
from typing import Any, cast
from homeassistant.components.weather import (
ATTR_FORECAST_CONDITION,
@@ -12,11 +15,18 @@ from homeassistant.components.weather import (
ATTR_FORECAST_WIND_SPEED,
WeatherEntity,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_NAME, TEMP_CELSIUS, TEMP_FAHRENHEIT
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from homeassistant.util.dt import utc_from_timestamp
from . import AccuWeatherDataUpdateCoordinator
from .const import (
API_IMPERIAL,
API_METRIC,
ATTR_FORECAST,
ATTRIBUTION,
CONDITION_CLASSES,
@@ -29,42 +39,49 @@ from .const import (
PARALLEL_UPDATES = 1
async def async_setup_entry(hass, config_entry, async_add_entities):
async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Add a AccuWeather weather entity from a config_entry."""
name = config_entry.data[CONF_NAME]
name: str = entry.data[CONF_NAME]
coordinator = hass.data[DOMAIN][config_entry.entry_id][COORDINATOR]
coordinator: AccuWeatherDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
COORDINATOR
]
async_add_entities([AccuWeatherEntity(name, coordinator)], False)
async_add_entities([AccuWeatherEntity(name, coordinator)])
class AccuWeatherEntity(CoordinatorEntity, WeatherEntity):
"""Define an AccuWeather entity."""
def __init__(self, name, coordinator):
coordinator: AccuWeatherDataUpdateCoordinator
def __init__(
self, name: str, coordinator: AccuWeatherDataUpdateCoordinator
) -> None:
"""Initialize."""
super().__init__(coordinator)
self._name = name
self._attrs = {}
self._unit_system = "Metric" if self.coordinator.is_metric else "Imperial"
self._unit_system = API_METRIC if self.coordinator.is_metric else API_IMPERIAL
@property
def name(self):
def name(self) -> str:
"""Return the name."""
return self._name
@property
def attribution(self):
def attribution(self) -> str:
"""Return the attribution."""
return ATTRIBUTION
@property
def unique_id(self):
def unique_id(self) -> str:
"""Return a unique_id for this entity."""
return self.coordinator.location_key
@property
def device_info(self):
def device_info(self) -> DeviceInfo:
"""Return the device info."""
return {
"identifiers": {(DOMAIN, self.coordinator.location_key)},
@@ -74,7 +91,7 @@ class AccuWeatherEntity(CoordinatorEntity, WeatherEntity):
}
@property
def condition(self):
def condition(self) -> str | None:
"""Return the current condition."""
try:
return [
@@ -86,52 +103,60 @@ class AccuWeatherEntity(CoordinatorEntity, WeatherEntity):
return None
@property
def temperature(self):
def temperature(self) -> float:
"""Return the temperature."""
return self.coordinator.data["Temperature"][self._unit_system]["Value"]
return cast(
float, self.coordinator.data["Temperature"][self._unit_system]["Value"]
)
@property
def temperature_unit(self):
def temperature_unit(self) -> str:
"""Return the unit of measurement."""
return TEMP_CELSIUS if self.coordinator.is_metric else TEMP_FAHRENHEIT
@property
def pressure(self):
def pressure(self) -> float:
"""Return the pressure."""
return self.coordinator.data["Pressure"][self._unit_system]["Value"]
return cast(
float, self.coordinator.data["Pressure"][self._unit_system]["Value"]
)
@property
def humidity(self):
def humidity(self) -> int:
"""Return the humidity."""
return self.coordinator.data["RelativeHumidity"]
return cast(int, self.coordinator.data["RelativeHumidity"])
@property
def wind_speed(self):
def wind_speed(self) -> float:
"""Return the wind speed."""
return self.coordinator.data["Wind"]["Speed"][self._unit_system]["Value"]
return cast(
float, self.coordinator.data["Wind"]["Speed"][self._unit_system]["Value"]
)
@property
def wind_bearing(self):
def wind_bearing(self) -> int:
"""Return the wind bearing."""
return self.coordinator.data["Wind"]["Direction"]["Degrees"]
return cast(int, self.coordinator.data["Wind"]["Direction"]["Degrees"])
@property
def visibility(self):
def visibility(self) -> float:
"""Return the visibility."""
return self.coordinator.data["Visibility"][self._unit_system]["Value"]
return cast(
float, self.coordinator.data["Visibility"][self._unit_system]["Value"]
)
@property
def ozone(self):
def ozone(self) -> int | None:
"""Return the ozone level."""
# We only have ozone data for certain locations and only in the forecast data.
if self.coordinator.forecast and self.coordinator.data[ATTR_FORECAST][0].get(
"Ozone"
):
return self.coordinator.data[ATTR_FORECAST][0]["Ozone"]["Value"]
return cast(int, self.coordinator.data[ATTR_FORECAST][0]["Ozone"]["Value"])
return None
@property
def forecast(self):
def forecast(self) -> list[dict[str, Any]] | None:
"""Return the forecast array."""
if not self.coordinator.forecast:
return None
@@ -161,7 +186,7 @@ class AccuWeatherEntity(CoordinatorEntity, WeatherEntity):
return forecast
@staticmethod
def _calc_precipitation(day: dict) -> float:
def _calc_precipitation(day: dict[str, Any]) -> float:
"""Return sum of the precipitation."""
precip_sum = 0
precip_types = ["Rain", "Snow", "Ice"]

View File

@@ -0,0 +1,34 @@
"""Use serial protocol of Acer projector to obtain state of the projector."""
from __future__ import annotations
from typing import Final
from homeassistant.const import STATE_OFF, STATE_ON
CONF_WRITE_TIMEOUT: Final = "write_timeout"
DEFAULT_NAME: Final = "Acer Projector"
DEFAULT_TIMEOUT: Final = 1
DEFAULT_WRITE_TIMEOUT: Final = 1
ECO_MODE: Final = "ECO Mode"
ICON: Final = "mdi:projector"
INPUT_SOURCE: Final = "Input Source"
LAMP: Final = "Lamp"
LAMP_HOURS: Final = "Lamp Hours"
MODEL: Final = "Model"
# Commands known to the projector
CMD_DICT: Final[dict[str, str]] = {
LAMP: "* 0 Lamp ?\r",
LAMP_HOURS: "* 0 Lamp\r",
INPUT_SOURCE: "* 0 Src ?\r",
ECO_MODE: "* 0 IR 052\r",
MODEL: "* 0 IR 035\r",
STATE_ON: "* 0 IR 001\r",
STATE_OFF: "* 0 IR 002\r",
}

View File

@@ -1,6 +1,9 @@
"""Use serial protocol of Acer projector to obtain state of the projector."""
from __future__ import annotations
import logging
import re
from typing import Any
import serial
import voluptuous as vol
@@ -14,39 +17,26 @@ from homeassistant.const import (
STATE_ON,
STATE_UNKNOWN,
)
from homeassistant.core import HomeAssistant
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from .const import (
CMD_DICT,
CONF_WRITE_TIMEOUT,
DEFAULT_NAME,
DEFAULT_TIMEOUT,
DEFAULT_WRITE_TIMEOUT,
ECO_MODE,
ICON,
INPUT_SOURCE,
LAMP,
LAMP_HOURS,
)
_LOGGER = logging.getLogger(__name__)
CONF_WRITE_TIMEOUT = "write_timeout"
DEFAULT_NAME = "Acer Projector"
DEFAULT_TIMEOUT = 1
DEFAULT_WRITE_TIMEOUT = 1
ECO_MODE = "ECO Mode"
ICON = "mdi:projector"
INPUT_SOURCE = "Input Source"
LAMP = "Lamp"
LAMP_HOURS = "Lamp Hours"
MODEL = "Model"
# Commands known to the projector
CMD_DICT = {
LAMP: "* 0 Lamp ?\r",
LAMP_HOURS: "* 0 Lamp\r",
INPUT_SOURCE: "* 0 Src ?\r",
ECO_MODE: "* 0 IR 052\r",
MODEL: "* 0 IR 035\r",
STATE_ON: "* 0 IR 001\r",
STATE_OFF: "* 0 IR 002\r",
}
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
{
vol.Required(CONF_FILENAME): cv.isdevice,
@@ -59,7 +49,12 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
)
def setup_platform(hass, config, add_entities, discovery_info=None):
def setup_platform(
hass: HomeAssistant,
config: ConfigType,
add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType,
) -> None:
"""Connect with serial port and return Acer Projector."""
serial_port = config[CONF_FILENAME]
name = config[CONF_NAME]
@@ -72,10 +67,16 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
class AcerSwitch(SwitchEntity):
"""Represents an Acer Projector as a switch."""
def __init__(self, serial_port, name, timeout, write_timeout, **kwargs):
def __init__(
self,
serial_port: str,
name: str,
timeout: int,
write_timeout: int,
) -> None:
"""Init of the Acer projector."""
self.ser = serial.Serial(
port=serial_port, timeout=timeout, write_timeout=write_timeout, **kwargs
port=serial_port, timeout=timeout, write_timeout=write_timeout
)
self._serial_port = serial_port
self._name = name
@@ -87,7 +88,7 @@ class AcerSwitch(SwitchEntity):
ECO_MODE: STATE_UNKNOWN,
}
def _write_read(self, msg):
def _write_read(self, msg: str) -> str:
"""Write to the projector and read the return."""
ret = ""
# Sometimes the projector won't answer for no reason or the projector
@@ -96,8 +97,7 @@ class AcerSwitch(SwitchEntity):
try:
if not self.ser.is_open:
self.ser.open()
msg = msg.encode("utf-8")
self.ser.write(msg)
self.ser.write(msg.encode("utf-8"))
# Size is an experience value there is no real limit.
# AFAIK there is no limit and no end character so we will usually
# need to wait for timeout
@@ -107,7 +107,7 @@ class AcerSwitch(SwitchEntity):
self.ser.close()
return ret
def _write_read_format(self, msg):
def _write_read_format(self, msg: str) -> str:
"""Write msg, obtain answer and format output."""
# answers are formatted as ***\answer\r***
awns = self._write_read(msg)
@@ -117,29 +117,33 @@ class AcerSwitch(SwitchEntity):
return STATE_UNKNOWN
@property
def available(self):
def available(self) -> bool:
"""Return if projector is available."""
return self._available
@property
def name(self):
def name(self) -> str:
"""Return name of the projector."""
return self._name
@property
def is_on(self):
def icon(self) -> str:
"""Return the icon."""
return ICON
@property
def is_on(self) -> bool:
"""Return if the projector is turned on."""
return self._state
@property
def extra_state_attributes(self):
def extra_state_attributes(self) -> dict[str, str]:
"""Return state attributes."""
return self._attributes
def update(self):
def update(self) -> None:
"""Get the latest state from the projector."""
msg = CMD_DICT[LAMP]
awns = self._write_read_format(msg)
awns = self._write_read_format(CMD_DICT[LAMP])
if awns == "Lamp 1":
self._state = True
self._available = True
@@ -155,14 +159,14 @@ class AcerSwitch(SwitchEntity):
awns = self._write_read_format(msg)
self._attributes[key] = awns
def turn_on(self, **kwargs):
def turn_on(self, **kwargs: Any) -> None:
"""Turn the projector on."""
msg = CMD_DICT[STATE_ON]
self._write_read(msg)
self._state = STATE_ON
self._state = True
def turn_off(self, **kwargs):
def turn_off(self, **kwargs: Any) -> None:
"""Turn the projector off."""
msg = CMD_DICT[STATE_OFF]
self._write_read(msg)
self._state = STATE_OFF
self._state = False

View File

@@ -13,7 +13,7 @@ from .const import ACMEDA_ENTITY_REMOVE, DOMAIN, LOGGER
class AcmedaBase(entity.Entity):
"""Base representation of an Acmeda roller."""
def __init__(self, roller: aiopulse.Roller):
def __init__(self, roller: aiopulse.Roller) -> None:
"""Initialize the roller."""
self.roller = roller

View File

@@ -17,7 +17,6 @@ class AcmedaFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
"""Handle a Acmeda config flow."""
VERSION = 1
CONNECTION_CLASS = config_entries.CONN_CLASS_LOCAL_POLL
def __init__(self):
"""Initialize the config flow."""

View File

@@ -0,0 +1,12 @@
"""Support for Actiontec MI424WR (Verizon FIOS) routers."""
from __future__ import annotations
import re
from typing import Final
LEASES_REGEX: Final[re.Pattern] = re.compile(
r"(?P<ip>([0-9]{1,3}[\.]){3}[0-9]{1,3})"
+ r"\smac:\s(?P<mac>([0-9a-f]{2}[:-]){5}([0-9a-f]{2}))"
+ r"\svalid\sfor:\s(?P<timevalid>(-?\d+))"
+ r"\ssec"
)

View File

@@ -1,30 +1,28 @@
"""Support for Actiontec MI424WR (Verizon FIOS) routers."""
from collections import namedtuple
from __future__ import annotations
import logging
import re
import telnetlib
from typing import Final
import voluptuous as vol
from homeassistant.components.device_tracker import (
DOMAIN,
PLATFORM_SCHEMA,
PLATFORM_SCHEMA as BASE_PLATFORM_SCHEMA,
DeviceScanner,
)
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME
from homeassistant.core import HomeAssistant
import homeassistant.helpers.config_validation as cv
import homeassistant.util.dt as dt_util
from homeassistant.helpers.typing import ConfigType
_LOGGER = logging.getLogger(__name__)
from .const import LEASES_REGEX
from .model import Device
_LEASES_REGEX = re.compile(
r"(?P<ip>([0-9]{1,3}[\.]){3}[0-9]{1,3})"
+ r"\smac:\s(?P<mac>([0-9a-f]{2}[:-]){5}([0-9a-f]{2}))"
+ r"\svalid\sfor:\s(?P<timevalid>(-?\d+))"
+ r"\ssec"
)
_LOGGER: Final = logging.getLogger(__name__)
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
PLATFORM_SCHEMA: Final = BASE_PLATFORM_SCHEMA.extend(
{
vol.Required(CONF_HOST): cv.string,
vol.Required(CONF_PASSWORD): cv.string,
@@ -33,43 +31,38 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
)
def get_scanner(hass, config):
def get_scanner(hass: HomeAssistant, config: ConfigType) -> DeviceScanner | None:
"""Validate the configuration and return an Actiontec scanner."""
scanner = ActiontecDeviceScanner(config[DOMAIN])
return scanner if scanner.success_init else None
Device = namedtuple("Device", ["mac", "ip", "last_update"])
class ActiontecDeviceScanner(DeviceScanner):
"""This class queries an actiontec router for connected devices."""
def __init__(self, config):
def __init__(self, config: ConfigType) -> None:
"""Initialize the scanner."""
self.host = config[CONF_HOST]
self.username = config[CONF_USERNAME]
self.password = config[CONF_PASSWORD]
self.last_results = []
self.host: str = config[CONF_HOST]
self.username: str = config[CONF_USERNAME]
self.password: str = config[CONF_PASSWORD]
self.last_results: list[Device] = []
data = self.get_actiontec_data()
self.success_init = data is not None
_LOGGER.info("Scanner initialized")
def scan_devices(self):
def scan_devices(self) -> list[str]:
"""Scan for new devices and return a list with found device IDs."""
self._update_info()
return [client.mac for client in self.last_results]
return [client.mac_address for client in self.last_results]
def get_device_name(self, device):
def get_device_name(self, device: str) -> str | None:
"""Return the name of the given device or None if we don't know."""
if not self.last_results:
return None
for client in self.last_results:
if client.mac == device:
return client.ip
if client.mac_address == device:
return client.ip_address
return None
def _update_info(self):
def _update_info(self) -> bool:
"""Ensure the information from the router is up to date.
Return boolean if scanning successful.
@@ -78,19 +71,16 @@ class ActiontecDeviceScanner(DeviceScanner):
if not self.success_init:
return False
now = dt_util.now()
actiontec_data = self.get_actiontec_data()
if not actiontec_data:
if actiontec_data is None:
return False
self.last_results = [
Device(data["mac"], name, now)
for name, data in actiontec_data.items()
if data["timevalid"] > -60
device for device in actiontec_data if device.timevalid > -60
]
_LOGGER.info("Scan successful")
return True
def get_actiontec_data(self):
def get_actiontec_data(self) -> list[Device] | None:
"""Retrieve data from Actiontec MI424WR and return parsed result."""
try:
telnet = telnetlib.Telnet(self.host)
@@ -106,18 +96,20 @@ class ActiontecDeviceScanner(DeviceScanner):
telnet.write(b"exit\n")
except EOFError:
_LOGGER.exception("Unexpected response from router")
return
return None
except ConnectionRefusedError:
_LOGGER.exception("Connection refused by router. Telnet enabled?")
return None
devices = {}
devices: list[Device] = []
for lease in leases_result:
match = _LEASES_REGEX.search(lease.decode("utf-8"))
match = LEASES_REGEX.search(lease.decode("utf-8"))
if match is not None:
devices[match.group("ip")] = {
"ip": match.group("ip"),
"mac": match.group("mac").upper(),
"timevalid": int(match.group("timevalid")),
}
devices.append(
Device(
match.group("ip"),
match.group("mac").upper(),
int(match.group("timevalid")),
)
)
return devices

View File

@@ -0,0 +1,11 @@
"""Model definitions for Actiontec MI424WR (Verizon FIOS) routers."""
from dataclasses import dataclass
@dataclass
class Device:
"""Actiontec device class."""
ip_address: str
mac_address: str
timevalid: int

View File

@@ -2,22 +2,10 @@
from __future__ import annotations
import logging
from typing import Any
from adguardhome import AdGuardHome, AdGuardHomeConnectionError, AdGuardHomeError
import voluptuous as vol
from homeassistant.components.adguard.const import (
CONF_FORCE,
DATA_ADGUARD_CLIENT,
DATA_ADGUARD_VERSION,
DOMAIN,
SERVICE_ADD_URL,
SERVICE_DISABLE_URL,
SERVICE_ENABLE_URL,
SERVICE_REFRESH,
SERVICE_REMOVE_URL,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
CONF_HOST,
@@ -33,7 +21,19 @@ from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.entity import Entity
from homeassistant.helpers.entity import DeviceInfo, Entity
from .const import (
CONF_FORCE,
DATA_ADGUARD_CLIENT,
DATA_ADGUARD_VERSION,
DOMAIN,
SERVICE_ADD_URL,
SERVICE_DISABLE_URL,
SERVICE_ENABLE_URL,
SERVICE_REFRESH,
SERVICE_REMOVE_URL,
)
_LOGGER = logging.getLogger(__name__)
@@ -194,7 +194,7 @@ class AdGuardHomeDeviceEntity(AdGuardHomeEntity):
"""Defines a AdGuard Home device entity."""
@property
def device_info(self) -> dict[str, Any]:
def device_info(self) -> DeviceInfo:
"""Return device information about this AdGuard Home instance."""
return {
"identifiers": {

View File

@@ -6,7 +6,6 @@ from typing import Any
from adguardhome import AdGuardHome, AdGuardHomeConnectionError
import voluptuous as vol
from homeassistant import config_entries
from homeassistant.config_entries import ConfigFlow
from homeassistant.const import (
CONF_HOST,
@@ -26,7 +25,6 @@ class AdGuardHomeFlowHandler(ConfigFlow, domain=DOMAIN):
"""Handle a AdGuard Home config flow."""
VERSION = 1
CONNECTION_CLASS = config_entries.CONN_CLASS_LOCAL_POLL
_hassio_discovery = None
@@ -67,13 +65,9 @@ class AdGuardHomeFlowHandler(ConfigFlow, domain=DOMAIN):
if user_input is None:
return await self._show_setup_form(user_input)
entries = self._async_current_entries()
for entry in entries:
if (
entry.data[CONF_HOST] == user_input[CONF_HOST]
and entry.data[CONF_PORT] == user_input[CONF_PORT]
):
return self.async_abort(reason="already_configured")
self._async_abort_entries_match(
{CONF_HOST: user_input[CONF_HOST], CONF_PORT: user_input[CONF_PORT]}
)
errors = {}

View File

@@ -2,7 +2,6 @@
from __future__ import annotations
from datetime import timedelta
from typing import Callable
from adguardhome import AdGuardHome, AdGuardHomeConnectionError
@@ -11,7 +10,7 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.const import PERCENTAGE, TIME_MILLISECONDS
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import PlatformNotReady
from homeassistant.helpers.entity import Entity
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import AdGuardHomeDeviceEntity
from .const import DATA_ADGUARD_CLIENT, DATA_ADGUARD_VERSION, DOMAIN
@@ -23,7 +22,7 @@ PARALLEL_UPDATES = 4
async def async_setup_entry(
hass: HomeAssistant,
entry: ConfigEntry,
async_add_entities: Callable[[list[Entity], bool], None],
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up AdGuard Home sensor based on a config entry."""
adguard = hass.data[DOMAIN][entry.entry_id][DATA_ADGUARD_CLIENT]

View File

@@ -1,37 +1,65 @@
add_url:
name: Add url
description: Add a new filter subscription to AdGuard Home.
fields:
name:
name: Name
description: The name of the filter subscription.
required: true
example: Example
selector:
text:
url:
name: Url
description: The filter URL to subscribe to, containing the filter rules.
required: true
example: https://www.example.com/filter/1.txt
selector:
text:
remove_url:
name: Remove url
description: Removes a filter subscription from AdGuard Home.
fields:
url:
name: Url
description: The filter subscription URL to remove.
required: true
example: https://www.example.com/filter/1.txt
selector:
text:
enable_url:
name: Enable url
description: Enables a filter subscription in AdGuard Home.
fields:
url:
name: Url
description: The filter subscription URL to enable.
required: true
example: https://www.example.com/filter/1.txt
selector:
text:
disable_url:
name: Disable url
description: Disables a filter subscription in AdGuard Home.
fields:
url:
name: Url
description: The filter subscription URL to disable.
required: true
example: https://www.example.com/filter/1.txt
selector:
text:
refresh:
name: Refresh
description: Refresh all filter subscriptions in AdGuard Home.
fields:
force:
description: Force update (by passes AdGuard Home throttling).
example: '"true" to force, "false" or omit for a regular refresh.'
name: Force
description: Force update (bypasses AdGuard Home throttling). "true" to force, or "false" to omit for a regular refresh.
default: false
selector:
boolean:

View File

@@ -3,7 +3,6 @@ from __future__ import annotations
from datetime import timedelta
import logging
from typing import Callable
from adguardhome import AdGuardHome, AdGuardHomeConnectionError, AdGuardHomeError
@@ -11,7 +10,7 @@ from homeassistant.components.switch import SwitchEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import PlatformNotReady
from homeassistant.helpers.entity import Entity
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import AdGuardHomeDeviceEntity
from .const import DATA_ADGUARD_CLIENT, DATA_ADGUARD_VERSION, DOMAIN
@@ -25,7 +24,7 @@ PARALLEL_UPDATES = 1
async def async_setup_entry(
hass: HomeAssistant,
entry: ConfigEntry,
async_add_entities: Callable[[list[Entity], bool], None],
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up AdGuard Home switch based on a config entry."""
adguard = hass.data[DOMAIN][entry.entry_id][DATA_ADGUARD_CLIENT]

View File

@@ -1,8 +1,7 @@
{
"config": {
"abort": {
"existing_instance_updated": "\u0410\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0441\u044a\u0449\u0435\u0441\u0442\u0432\u0443\u0432\u0430\u0449\u0430\u0442\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f.",
"single_instance_allowed": "\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0430 \u0435 \u0441\u0430\u043c\u043e \u0435\u0434\u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043d\u0430 AdGuard Home."
"existing_instance_updated": "\u0410\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0441\u044a\u0449\u0435\u0441\u0442\u0432\u0443\u0432\u0430\u0449\u0430\u0442\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f."
},
"step": {
"hassio_confirm": {

View File

@@ -2,8 +2,7 @@
"config": {
"abort": {
"already_configured": "El servei ja est\u00e0 configurat",
"existing_instance_updated": "S'ha actualitzat la configuraci\u00f3 existent.",
"single_instance_allowed": "Ja configurat. Nom\u00e9s \u00e9s possible una sola configuraci\u00f3."
"existing_instance_updated": "S'ha actualitzat la configuraci\u00f3 existent."
},
"error": {
"cannot_connect": "Ha fallat la connexi\u00f3"

View File

@@ -2,8 +2,7 @@
"config": {
"abort": {
"already_configured": "Slu\u017eba je ji\u017e nastavena",
"existing_instance_updated": "St\u00e1vaj\u00edc\u00ed nastaven\u00ed aktualizov\u00e1no.",
"single_instance_allowed": "Ji\u017e nastaveno. Je mo\u017en\u00e1 pouze jedin\u00e1 konfigurace."
"existing_instance_updated": "St\u00e1vaj\u00edc\u00ed nastaven\u00ed aktualizov\u00e1no."
},
"error": {
"cannot_connect": "Nepoda\u0159ilo se p\u0159ipojit"

View File

@@ -1,8 +1,7 @@
{
"config": {
"abort": {
"existing_instance_updated": "Opdaterede eksisterende konfiguration.",
"single_instance_allowed": "Kun en enkelt konfiguration af AdGuard Home er tilladt."
"existing_instance_updated": "Opdaterede eksisterende konfiguration."
},
"step": {
"hassio_confirm": {

View File

@@ -1,8 +1,8 @@
{
"config": {
"abort": {
"existing_instance_updated": "Bestehende Konfiguration wurde aktualisiert.",
"single_instance_allowed": "Bereits konfiguriert. Nur eine einzige Konfiguration m\u00f6glich."
"already_configured": "Der Dienst ist bereits konfiguriert",
"existing_instance_updated": "Bestehende Konfiguration wurde aktualisiert."
},
"error": {
"cannot_connect": "Verbindung fehlgeschlagen"

View File

@@ -2,8 +2,7 @@
"config": {
"abort": {
"already_configured": "Service is already configured",
"existing_instance_updated": "Updated existing configuration.",
"single_instance_allowed": "Already configured. Only a single configuration possible."
"existing_instance_updated": "Updated existing configuration."
},
"error": {
"cannot_connect": "Failed to connect"

View File

@@ -1,8 +1,7 @@
{
"config": {
"abort": {
"existing_instance_updated": "Se actualiz\u00f3 la configuraci\u00f3n existente.",
"single_instance_allowed": "Solo se permite una \u00fanica configuraci\u00f3n de AdGuard Home."
"existing_instance_updated": "Se actualiz\u00f3 la configuraci\u00f3n existente."
},
"step": {
"hassio_confirm": {

View File

@@ -2,8 +2,7 @@
"config": {
"abort": {
"already_configured": "El servicio ya est\u00e1 configurado",
"existing_instance_updated": "Se ha actualizado la configuraci\u00f3n existente.",
"single_instance_allowed": "S\u00f3lo se permite una \u00fanica configuraci\u00f3n de AdGuard Home."
"existing_instance_updated": "Se ha actualizado la configuraci\u00f3n existente."
},
"error": {
"cannot_connect": "No se pudo conectar"

View File

@@ -2,8 +2,7 @@
"config": {
"abort": {
"already_configured": "Teenus on juba seadistatud",
"existing_instance_updated": "Olemasolevad seaded v\u00e4rskendatud.",
"single_instance_allowed": "Juba seadistatud. V\u00f5imalik on ainult \u00fcks seadistamine."
"existing_instance_updated": "Olemasolevad seaded v\u00e4rskendatud."
},
"error": {
"cannot_connect": "\u00dchendamine nurjus"

View File

@@ -1,8 +1,8 @@
{
"config": {
"abort": {
"existing_instance_updated": "La configuration existante a \u00e9t\u00e9 mise \u00e0 jour.",
"single_instance_allowed": "Une seule configuration d'AdGuard Home est autoris\u00e9e."
"already_configured": "Le service est d\u00e9j\u00e0 configur\u00e9",
"existing_instance_updated": "La configuration existante a \u00e9t\u00e9 mise \u00e0 jour."
},
"error": {
"cannot_connect": "\u00c9chec de connexion"

View File

@@ -1,8 +1,5 @@
{
"config": {
"abort": {
"single_instance_allowed": "M\u00e1r konfigur\u00e1lva van. Csak egy konfigur\u00e1ci\u00f3 lehets\u00e9ges."
},
"error": {
"cannot_connect": "Sikertelen csatlakoz\u00e1s"
},

View File

@@ -1,8 +1,7 @@
{
"config": {
"abort": {
"existing_instance_updated": "Memperbarui konfigurasi yang ada.",
"single_instance_allowed": "Sudah dikonfigurasi. Hanya satu konfigurasi yang diizinkan."
"existing_instance_updated": "Memperbarui konfigurasi yang ada."
},
"error": {
"cannot_connect": "Gagal terhubung"

View File

@@ -2,8 +2,7 @@
"config": {
"abort": {
"already_configured": "Il servizio \u00e8 gi\u00e0 configurato",
"existing_instance_updated": "Configurazione esistente aggiornata.",
"single_instance_allowed": "Gi\u00e0 configurato. \u00c8 possibile una sola configurazione."
"existing_instance_updated": "Configurazione esistente aggiornata."
},
"error": {
"cannot_connect": "Impossibile connettersi"

View File

@@ -2,8 +2,7 @@
"config": {
"abort": {
"already_configured": "\uc11c\ube44\uc2a4\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4",
"existing_instance_updated": "\uae30\uc874 \uad6c\uc131\uc744 \uc5c5\ub370\uc774\ud2b8\ud588\uc2b5\ub2c8\ub2e4.",
"single_instance_allowed": "\uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ud558\ub098\uc758 \uc778\uc2a4\ud134\uc2a4\ub9cc \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."
"existing_instance_updated": "\uae30\uc874 \uad6c\uc131\uc744 \uc5c5\ub370\uc774\ud2b8\ud588\uc2b5\ub2c8\ub2e4."
},
"error": {
"cannot_connect": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4"

View File

@@ -1,8 +1,7 @@
{
"config": {
"abort": {
"existing_instance_updated": "D\u00e9i bestehend Konfiguratioun ass ge\u00e4nnert.",
"single_instance_allowed": "Scho konfigur\u00e9iert. N\u00ebmmen eng eenzeg Konfiguratioun m\u00e9iglech."
"existing_instance_updated": "D\u00e9i bestehend Konfiguratioun ass ge\u00e4nnert."
},
"error": {
"cannot_connect": "Feeler beim verbannen"

View File

@@ -2,8 +2,7 @@
"config": {
"abort": {
"already_configured": "Service is al geconfigureerd",
"existing_instance_updated": "Bestaande configuratie bijgewerkt.",
"single_instance_allowed": "Slechts \u00e9\u00e9n configuratie van AdGuard Home is toegestaan."
"existing_instance_updated": "Bestaande configuratie bijgewerkt."
},
"error": {
"cannot_connect": "Kan geen verbinding maken"

View File

@@ -2,8 +2,7 @@
"config": {
"abort": {
"already_configured": "Tjenesten er allerede konfigurert",
"existing_instance_updated": "Oppdatert eksisterende konfigurasjon.",
"single_instance_allowed": "Allerede konfigurert. Bare \u00e9n enkelt konfigurasjon er mulig."
"existing_instance_updated": "Oppdatert eksisterende konfigurasjon."
},
"error": {
"cannot_connect": "Tilkobling mislyktes"

View File

@@ -2,8 +2,7 @@
"config": {
"abort": {
"already_configured": "Us\u0142uga jest ju\u017c skonfigurowana",
"existing_instance_updated": "Zaktualizowano istniej\u0105c\u0105 konfiguracj\u0119",
"single_instance_allowed": "Ju\u017c skonfigurowano. Mo\u017cliwa jest tylko jedna konfiguracja."
"existing_instance_updated": "Zaktualizowano istniej\u0105c\u0105 konfiguracj\u0119"
},
"error": {
"cannot_connect": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia"

View File

@@ -1,8 +1,7 @@
{
"config": {
"abort": {
"existing_instance_updated": "Configura\u00e7\u00e3o existente atualizada.",
"single_instance_allowed": "Apenas uma \u00fanica configura\u00e7\u00e3o do AdGuard Home \u00e9 permitida."
"existing_instance_updated": "Configura\u00e7\u00e3o existente atualizada."
},
"step": {
"hassio_confirm": {

View File

@@ -1,8 +1,5 @@
{
"config": {
"abort": {
"single_instance_allowed": "J\u00e1 configurado. Apenas uma \u00fanica configura\u00e7\u00e3o \u00e9 poss\u00edvel."
},
"error": {
"cannot_connect": "Falha na liga\u00e7\u00e3o"
},

View File

@@ -2,8 +2,7 @@
"config": {
"abort": {
"already_configured": "\u042d\u0442\u0430 \u0441\u043b\u0443\u0436\u0431\u0430 \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 Home Assistant.",
"existing_instance_updated": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430.",
"single_instance_allowed": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e."
"existing_instance_updated": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430."
},
"error": {
"cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f."

View File

@@ -1,8 +1,7 @@
{
"config": {
"abort": {
"existing_instance_updated": "Posodobljena obstoje\u010da konfiguracija.",
"single_instance_allowed": "Dovoljena je samo ena konfiguracija AdGuard Home."
"existing_instance_updated": "Posodobljena obstoje\u010da konfiguracija."
},
"step": {
"hassio_confirm": {

View File

@@ -1,8 +1,7 @@
{
"config": {
"abort": {
"existing_instance_updated": "Uppdaterade existerande konfiguration.",
"single_instance_allowed": "Endast en enda konfiguration av AdGuard Home \u00e4r till\u00e5ten."
"existing_instance_updated": "Uppdaterade existerande konfiguration."
},
"step": {
"hassio_confirm": {

View File

@@ -1,8 +1,5 @@
{
"config": {
"abort": {
"single_instance_allowed": "Zaten yap\u0131land\u0131r\u0131lm\u0131\u015f. Yaln\u0131zca tek bir konfig\u00fcrasyon m\u00fcmk\u00fcnd\u00fcr."
},
"error": {
"cannot_connect": "Ba\u011flanma hatas\u0131"
},

View File

@@ -1,8 +1,7 @@
{
"config": {
"abort": {
"existing_instance_updated": "\u041a\u043e\u043d\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u044f \u043e\u043d\u043e\u0432\u043b\u0435\u043d\u0430.",
"single_instance_allowed": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0432\u0436\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e. \u041c\u043e\u0436\u043d\u0430 \u0434\u043e\u0434\u0430\u0442\u0438 \u043b\u0438\u0448\u0435 \u043e\u0434\u043d\u0443 \u043a\u043e\u043d\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u044e."
"existing_instance_updated": "\u041a\u043e\u043d\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u044f \u043e\u043d\u043e\u0432\u043b\u0435\u043d\u0430."
},
"error": {
"cannot_connect": "\u041d\u0435 \u0432\u0434\u0430\u043b\u043e\u0441\u044f \u043f\u0456\u0434'\u0454\u0434\u043d\u0430\u0442\u0438\u0441\u044f"

View File

@@ -2,8 +2,7 @@
"config": {
"abort": {
"already_configured": "\u670d\u52d9\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210",
"existing_instance_updated": "\u5df2\u66f4\u65b0\u73fe\u6709\u8a2d\u5b9a\u3002",
"single_instance_allowed": "\u50c5\u80fd\u8a2d\u5b9a\u4e00\u7d44\u88dd\u7f6e\u3002"
"existing_instance_updated": "\u5df2\u66f4\u65b0\u73fe\u6709\u8a2d\u5b9a\u3002"
},
"error": {
"cannot_connect": "\u9023\u7dda\u5931\u6557"

View File

@@ -1,15 +1,34 @@
# Describes the format for available ADS services
write_data_by_name:
name: Write data by name
description: Write a value to the connected ADS device.
fields:
adsvar:
name: ADS variable
description: The name of the variable to write to.
required: true
example: ".global_var"
selector:
text:
adstype:
name: ADS type
description: The data type of the variable to write to.
example: "int"
required: true
selector:
select:
options:
- 'bool'
- 'byte'
- 'dint'
- 'int'
- 'udint'
- 'uint'
value:
name: Value
description: The value to write to the variable.
example: 1
required: true
selector:
number:
min: 0
max: 10000

View File

@@ -70,7 +70,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
entities.append(AdvantageAirZone(instance, ac_key, zone_key))
async_add_entities(entities)
platform = entity_platform.current_platform.get()
platform = entity_platform.async_get_current_platform()
platform.async_register_entity_service(
ADVANTAGE_AIR_SERVICE_SET_MYZONE,
{},

View File

@@ -22,7 +22,7 @@ class AdvantageAirConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
"""Config Advantage Air API connection."""
VERSION = 1
CONNECTION_CLASS = config_entries.CONN_CLASS_LOCAL_POLL
DOMAIN = DOMAIN
async def async_step_user(self, user_input=None):

View File

@@ -33,7 +33,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
entities.append(AdvantageAirZoneSignal(instance, ac_key, zone_key))
async_add_entities(entities)
platform = entity_platform.current_platform.get()
platform = entity_platform.async_get_current_platform()
platform.async_register_entity_service(
ADVANTAGE_AIR_SERVICE_SET_TIME_TO,
{vol.Required("minutes"): cv.positive_int},

View File

@@ -7,8 +7,15 @@ set_time_to:
domain: sensor
fields:
minutes:
name: Minutes
description: Minutes until action
example: "60"
required: true
selector:
number:
min: 0
max: 1440
unit_of_measurement: minutes
set_myzone:
name: Set MyZone
description: Change which zone is set as the reference for temperature control

View File

@@ -12,6 +12,7 @@
"ip_address": "IP Adresse",
"port": "Port"
},
"description": "Anschluss an die API Ihres Advantage Air Wandtabletts.",
"title": "Verbinden"
}
}

View File

@@ -7,7 +7,13 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME
from homeassistant.core import HomeAssistant
from .const import DOMAIN, ENTRY_NAME, ENTRY_WEATHER_COORDINATOR, PLATFORMS
from .const import (
CONF_STATION_UPDATES,
DOMAIN,
ENTRY_NAME,
ENTRY_WEATHER_COORDINATOR,
PLATFORMS,
)
from .weather_update_coordinator import WeatherUpdateCoordinator
_LOGGER = logging.getLogger(__name__)
@@ -19,9 +25,12 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry):
api_key = config_entry.data[CONF_API_KEY]
latitude = config_entry.data[CONF_LATITUDE]
longitude = config_entry.data[CONF_LONGITUDE]
station_updates = config_entry.options.get(CONF_STATION_UPDATES, True)
aemet = AEMET(api_key)
weather_coordinator = WeatherUpdateCoordinator(hass, aemet, latitude, longitude)
weather_coordinator = WeatherUpdateCoordinator(
hass, aemet, latitude, longitude, station_updates
)
await weather_coordinator.async_config_entry_first_refresh()
@@ -33,9 +42,16 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry):
hass.config_entries.async_setup_platforms(config_entry, PLATFORMS)
config_entry.async_on_unload(config_entry.add_update_listener(async_update_options))
return True
async def async_update_options(hass: HomeAssistant, config_entry: ConfigEntry) -> None:
"""Update options."""
await hass.config_entries.async_reload(config_entry.entry_id)
async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry):
"""Unload a config entry."""
unload_ok = await hass.config_entries.async_unload_platforms(

View File

@@ -1,58 +0,0 @@
"""Abstraction form AEMET OpenData sensors."""
from homeassistant.components.sensor import SensorEntity
from homeassistant.const import ATTR_ATTRIBUTION
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import ATTRIBUTION, SENSOR_DEVICE_CLASS, SENSOR_NAME, SENSOR_UNIT
from .weather_update_coordinator import WeatherUpdateCoordinator
class AbstractAemetSensor(CoordinatorEntity, SensorEntity):
"""Abstract class for an AEMET OpenData sensor."""
def __init__(
self,
name,
unique_id,
sensor_type,
sensor_configuration,
coordinator: WeatherUpdateCoordinator,
):
"""Initialize the sensor."""
super().__init__(coordinator)
self._name = name
self._unique_id = unique_id
self._sensor_type = sensor_type
self._sensor_name = sensor_configuration[SENSOR_NAME]
self._unit_of_measurement = sensor_configuration.get(SENSOR_UNIT)
self._device_class = sensor_configuration.get(SENSOR_DEVICE_CLASS)
@property
def name(self):
"""Return the name of the sensor."""
return f"{self._name} {self._sensor_name}"
@property
def unique_id(self):
"""Return a unique_id for this entity."""
return self._unique_id
@property
def attribution(self):
"""Return the attribution."""
return ATTRIBUTION
@property
def device_class(self):
"""Return the device_class."""
return self._device_class
@property
def unit_of_measurement(self):
"""Return the unit of measurement of this entity, if any."""
return self._unit_of_measurement
@property
def extra_state_attributes(self):
"""Return the state attributes."""
return {ATTR_ATTRIBUTION: ATTRIBUTION}

View File

@@ -4,16 +4,15 @@ import voluptuous as vol
from homeassistant import config_entries
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME
from homeassistant.core import callback
import homeassistant.helpers.config_validation as cv
from .const import DEFAULT_NAME, DOMAIN
from .const import CONF_STATION_UPDATES, DEFAULT_NAME, DOMAIN
class AemetConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
"""Config flow for AEMET OpenData."""
CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_POLL
async def async_step_user(self, user_input=None):
"""Handle a flow initialized by the user."""
errors = {}
@@ -49,6 +48,35 @@ class AemetConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
return self.async_show_form(step_id="user", data_schema=schema, errors=errors)
@staticmethod
@callback
def async_get_options_flow(config_entry):
"""Get the options flow for this handler."""
return OptionsFlowHandler(config_entry)
class OptionsFlowHandler(config_entries.OptionsFlow):
"""Handle a option flow for AEMET."""
def __init__(self, config_entry: config_entries.ConfigEntry) -> None:
"""Initialize options flow."""
self.config_entry = config_entry
async def async_step_init(self, user_input=None):
"""Handle options flow."""
if user_input is not None:
return self.async_create_entry(title="", data=user_input)
data_schema = vol.Schema(
{
vol.Required(
CONF_STATION_UPDATES,
default=self.config_entry.options.get(CONF_STATION_UPDATES),
): bool,
}
)
return self.async_show_form(step_id="init", data_schema=data_schema)
async def _is_aemet_api_online(hass, api_key):
aemet = AEMET(api_key)

View File

@@ -34,12 +34,12 @@ from homeassistant.const import (
)
ATTRIBUTION = "Powered by AEMET OpenData"
CONF_STATION_UPDATES = "station_updates"
PLATFORMS = ["sensor", "weather"]
DEFAULT_NAME = "AEMET"
DOMAIN = "aemet"
ENTRY_NAME = "name"
ENTRY_WEATHER_COORDINATOR = "weather_coordinator"
UPDATE_LISTENER = "update_listener"
SENSOR_NAME = "sensor_name"
SENSOR_UNIT = "sensor_unit"
SENSOR_DEVICE_CLASS = "sensor_device_class"

View File

@@ -3,7 +3,7 @@
"name": "AEMET OpenData",
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/aemet",
"requirements": ["AEMET-OpenData==0.1.8"],
"requirements": ["AEMET-OpenData==0.2.1"],
"codeowners": ["@noltari"],
"iot_class": "cloud_polling"
}

View File

@@ -1,6 +1,10 @@
"""Support for the AEMET OpenData service."""
from .abstract_aemet_sensor import AbstractAemetSensor
from homeassistant.components.sensor import SensorEntity
from homeassistant.const import ATTR_ATTRIBUTION
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import (
ATTRIBUTION,
DOMAIN,
ENTRY_NAME,
ENTRY_WEATHER_COORDINATOR,
@@ -10,6 +14,9 @@ from .const import (
FORECAST_MONITORED_CONDITIONS,
FORECAST_SENSOR_TYPES,
MONITORED_CONDITIONS,
SENSOR_DEVICE_CLASS,
SENSOR_NAME,
SENSOR_UNIT,
WEATHER_SENSOR_TYPES,
)
from .weather_update_coordinator import WeatherUpdateCoordinator
@@ -56,6 +63,52 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
async_add_entities(entities)
class AbstractAemetSensor(CoordinatorEntity, SensorEntity):
"""Abstract class for an AEMET OpenData sensor."""
def __init__(
self,
name,
unique_id,
sensor_type,
sensor_configuration,
coordinator: WeatherUpdateCoordinator,
):
"""Initialize the sensor."""
super().__init__(coordinator)
self._name = name
self._unique_id = unique_id
self._sensor_type = sensor_type
self._sensor_name = sensor_configuration[SENSOR_NAME]
self._unit_of_measurement = sensor_configuration.get(SENSOR_UNIT)
self._device_class = sensor_configuration.get(SENSOR_DEVICE_CLASS)
@property
def name(self):
"""Return the name of the sensor."""
return f"{self._name} {self._sensor_name}"
@property
def unique_id(self):
"""Return a unique_id for this entity."""
return self._unique_id
@property
def device_class(self):
"""Return the device_class."""
return self._device_class
@property
def unit_of_measurement(self):
"""Return the unit of measurement of this entity, if any."""
return self._unit_of_measurement
@property
def extra_state_attributes(self):
"""Return the state attributes."""
return {ATTR_ATTRIBUTION: ATTRIBUTION}
class AemetSensor(AbstractAemetSensor):
"""Implementation of an AEMET OpenData sensor."""

View File

@@ -18,5 +18,14 @@
"title": "AEMET OpenData"
}
}
},
"options": {
"step": {
"init": {
"data": {
"station_updates": "Gather data from AEMET weather stations"
}
}
}
}
}

View File

@@ -18,5 +18,14 @@
"title": "AEMET OpenData"
}
}
},
"options": {
"step": {
"init": {
"data": {
"station_updates": "Obt\u00e9 les dades de les estacions meteorol\u00f2giques d'AEMET"
}
}
}
}
}

View File

@@ -18,5 +18,14 @@
"title": "AEMET OpenData"
}
}
},
"options": {
"step": {
"init": {
"data": {
"station_updates": "Gather data from AEMET weather stations"
}
}
}
}
}

View File

@@ -18,5 +18,14 @@
"title": "AEMET OpenData"
}
}
},
"options": {
"step": {
"init": {
"data": {
"station_updates": "Obtener datos de las estaciones meteorol\u00f3gicas de AEMET"
}
}
}
}
}

View File

@@ -18,5 +18,14 @@
"title": "AEMET OpenData"
}
}
},
"options": {
"step": {
"init": {
"data": {
"station_updates": "Koguandmeid AEMETi ilmajaamadest"
}
}
}
}
}

View File

@@ -18,5 +18,14 @@
"title": "AEMET OpenData"
}
}
},
"options": {
"step": {
"init": {
"data": {
"station_updates": "Raccogli i dati dalle stazioni meteorologiche AEMET"
}
}
}
}
}

View File

@@ -18,5 +18,14 @@
"title": "AEMET OpenData"
}
}
},
"options": {
"step": {
"init": {
"data": {
"station_updates": "Verzamel gegevens van AEMET-weerstations"
}
}
}
}
}

View File

@@ -18,5 +18,14 @@
"title": "AEMET OpenData"
}
}
},
"options": {
"step": {
"init": {
"data": {
"station_updates": "Samle inn data fra AEMET v\u00e6rstasjoner"
}
}
}
}
}

View File

@@ -18,5 +18,14 @@
"title": "AEMET OpenData"
}
}
},
"options": {
"step": {
"init": {
"data": {
"station_updates": "\u0421\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043c\u0435\u0442\u0435\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u0439 AEMET"
}
}
}
}
}

View File

@@ -18,5 +18,14 @@
"title": "AEMET OpenData"
}
}
},
"options": {
"step": {
"init": {
"data": {
"station_updates": "\u81ea AEMET \u6c23\u8c61\u7ad9\u7372\u5f97\u8cc7\u6599"
}
}
}
}
}

View File

@@ -118,7 +118,7 @@ class TownNotFound(UpdateFailed):
class WeatherUpdateCoordinator(DataUpdateCoordinator):
"""Weather data update coordinator."""
def __init__(self, hass, aemet, latitude, longitude):
def __init__(self, hass, aemet, latitude, longitude, station_updates):
"""Initialize coordinator."""
super().__init__(
hass, _LOGGER, name=DOMAIN, update_interval=WEATHER_UPDATE_INTERVAL
@@ -129,6 +129,7 @@ class WeatherUpdateCoordinator(DataUpdateCoordinator):
self._town = None
self._latitude = latitude
self._longitude = longitude
self._station_updates = station_updates
self._data = {
"daily": None,
"hourly": None,
@@ -210,7 +211,7 @@ class WeatherUpdateCoordinator(DataUpdateCoordinator):
)
station = None
if self._get_weather_station():
if self._station_updates and self._get_weather_station():
station = self._aemet.get_conventional_observation_station_data(
self._station[AEMET_ATTR_IDEMA]
)

View File

@@ -1,2 +1,42 @@
"""Constants for the Aftership integration."""
DOMAIN = "aftership"
from __future__ import annotations
from datetime import timedelta
from typing import Final
import voluptuous as vol
import homeassistant.helpers.config_validation as cv
DOMAIN: Final = "aftership"
ATTRIBUTION: Final = "Information provided by AfterShip"
ATTR_TRACKINGS: Final = "trackings"
BASE: Final = "https://track.aftership.com/"
CONF_SLUG: Final = "slug"
CONF_TITLE: Final = "title"
CONF_TRACKING_NUMBER: Final = "tracking_number"
DEFAULT_NAME: Final = "aftership"
UPDATE_TOPIC: Final = f"{DOMAIN}_update"
ICON: Final = "mdi:package-variant-closed"
MIN_TIME_BETWEEN_UPDATES: Final = timedelta(minutes=15)
SERVICE_ADD_TRACKING: Final = "add_tracking"
SERVICE_REMOVE_TRACKING: Final = "remove_tracking"
ADD_TRACKING_SERVICE_SCHEMA: Final = vol.Schema(
{
vol.Required(CONF_TRACKING_NUMBER): cv.string,
vol.Optional(CONF_TITLE): cv.string,
vol.Optional(CONF_SLUG): cv.string,
}
)
REMOVE_TRACKING_SERVICE_SCHEMA: Final = vol.Schema(
{vol.Required(CONF_SLUG): cv.string, vol.Required(CONF_TRACKING_NUMBER): cv.string}
)

View File

@@ -1,53 +1,47 @@
"""Support for non-delivered packages recorded in AfterShip."""
from datetime import timedelta
from __future__ import annotations
import logging
from typing import Any, Final
from pyaftership.tracker import Tracking
import voluptuous as vol
from homeassistant.components.sensor import PLATFORM_SCHEMA, SensorEntity
from homeassistant.components.sensor import (
PLATFORM_SCHEMA as BASE_PLATFORM_SCHEMA,
SensorEntity,
)
from homeassistant.const import ATTR_ATTRIBUTION, CONF_API_KEY, CONF_NAME, HTTP_OK
from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.dispatcher import async_dispatcher_send
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.service import ServiceCall
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from homeassistant.util import Throttle
from .const import DOMAIN
_LOGGER = logging.getLogger(__name__)
ATTRIBUTION = "Information provided by AfterShip"
ATTR_TRACKINGS = "trackings"
BASE = "https://track.aftership.com/"
CONF_SLUG = "slug"
CONF_TITLE = "title"
CONF_TRACKING_NUMBER = "tracking_number"
DEFAULT_NAME = "aftership"
UPDATE_TOPIC = f"{DOMAIN}_update"
ICON = "mdi:package-variant-closed"
MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=15)
SERVICE_ADD_TRACKING = "add_tracking"
SERVICE_REMOVE_TRACKING = "remove_tracking"
ADD_TRACKING_SERVICE_SCHEMA = vol.Schema(
{
vol.Required(CONF_TRACKING_NUMBER): cv.string,
vol.Optional(CONF_TITLE): cv.string,
vol.Optional(CONF_SLUG): cv.string,
}
from .const import (
ADD_TRACKING_SERVICE_SCHEMA,
ATTR_TRACKINGS,
ATTRIBUTION,
BASE,
CONF_SLUG,
CONF_TITLE,
CONF_TRACKING_NUMBER,
DEFAULT_NAME,
DOMAIN,
ICON,
MIN_TIME_BETWEEN_UPDATES,
REMOVE_TRACKING_SERVICE_SCHEMA,
SERVICE_ADD_TRACKING,
SERVICE_REMOVE_TRACKING,
UPDATE_TOPIC,
)
REMOVE_TRACKING_SERVICE_SCHEMA = vol.Schema(
{vol.Required(CONF_SLUG): cv.string, vol.Required(CONF_TRACKING_NUMBER): cv.string}
)
_LOGGER: Final = logging.getLogger(__name__)
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
PLATFORM_SCHEMA: Final = BASE_PLATFORM_SCHEMA.extend(
{
vol.Required(CONF_API_KEY): cv.string,
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
@@ -55,7 +49,12 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
)
async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
async def async_setup_platform(
hass: HomeAssistant,
config: ConfigType,
async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None,
) -> None:
"""Set up the AfterShip sensor platform."""
apikey = config[CONF_API_KEY]
name = config[CONF_NAME]
@@ -75,7 +74,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info=
async_add_entities([instance], True)
async def handle_add_tracking(call):
async def handle_add_tracking(call: ServiceCall) -> None:
"""Call when a user adds a new Aftership tracking from Home Assistant."""
title = call.data.get(CONF_TITLE)
slug = call.data.get(CONF_SLUG)
@@ -91,7 +90,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info=
schema=ADD_TRACKING_SERVICE_SCHEMA,
)
async def handle_remove_tracking(call):
async def handle_remove_tracking(call: ServiceCall) -> None:
"""Call when a user removes an Aftership tracking from Home Assistant."""
slug = call.data[CONF_SLUG]
tracking_number = call.data[CONF_TRACKING_NUMBER]
@@ -110,39 +109,39 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info=
class AfterShipSensor(SensorEntity):
"""Representation of a AfterShip sensor."""
def __init__(self, aftership, name):
def __init__(self, aftership: Tracking, name: str) -> None:
"""Initialize the sensor."""
self._attributes = {}
self._name = name
self._state = None
self._attributes: dict[str, Any] = {}
self._name: str = name
self._state: int | None = None
self.aftership = aftership
@property
def name(self):
def name(self) -> str:
"""Return the name of the sensor."""
return self._name
@property
def state(self):
def state(self) -> int | None:
"""Return the state of the sensor."""
return self._state
@property
def unit_of_measurement(self):
def unit_of_measurement(self) -> str:
"""Return the unit of measurement of this entity, if any."""
return "packages"
@property
def extra_state_attributes(self):
def extra_state_attributes(self) -> dict[str, str]:
"""Return attributes for the sensor."""
return self._attributes
@property
def icon(self):
def icon(self) -> str:
"""Icon to use in the frontend."""
return ICON
async def async_added_to_hass(self):
async def async_added_to_hass(self) -> None:
"""Register callbacks."""
self.async_on_remove(
self.hass.helpers.dispatcher.async_dispatcher_connect(
@@ -150,13 +149,13 @@ class AfterShipSensor(SensorEntity):
)
)
async def _force_update(self):
async def _force_update(self) -> None:
"""Force update of data."""
await self.async_update(no_throttle=True)
self.async_write_ha_state()
@Throttle(MIN_TIME_BETWEEN_UPDATES)
async def async_update(self, **kwargs):
async def async_update(self, **kwargs: Any) -> None:
"""Get the latest data from the AfterShip API."""
await self.aftership.get_trackings()
@@ -170,7 +169,7 @@ class AfterShipSensor(SensorEntity):
return
status_to_ignore = {"delivered"}
status_counts = {}
status_counts: dict[str, int] = {}
trackings = []
not_delivered_count = 0

View File

@@ -1,24 +1,43 @@
# Describes the format for available aftership services
add_tracking:
description: Add new tracking to Aftership.
name: Add tracking
description: Add new tracking number to Aftership.
fields:
tracking_number:
name: Tracking number
description: Tracking number for the new tracking
required: true
example: "123456789"
selector:
text:
title:
name: Title
description: A custom title for the new tracking
example: "Laptop"
selector:
text:
slug:
name: Slug
description: Slug (carrier) of the new tracking
example: "USPS"
selector:
text:
remove_tracking:
description: Remove a tracking from Aftership.
name: Remove tracking
description: Remove a tracking number from Aftership.
fields:
tracking_number:
name: Tracking number
description: Tracking number of the tracking to remove
required: true
example: "123456789"
selector:
text:
slug:
name: Slug
description: Slug (carrier) of the tracking to remove
example: "USPS"
selector:
text:

View File

@@ -59,7 +59,7 @@ async def async_setup_entry(
async_add_entities(cameras)
platform = entity_platform.current_platform.get()
platform = entity_platform.async_get_current_platform()
for service, method in CAMERA_SERVICES.items():
platform.async_register_entity_service(service, {}, method)

View File

@@ -1,34 +1,39 @@
start_recording:
name: Start recording
description: Enable continuous recording.
fields:
entity_id:
description: "Name(s) of the entity to start recording."
example: "camera.camera_1"
target:
entity:
integration: agent_dvr
domain: camera
stop_recording:
name: Stop recording
description: Disable continuous recording.
fields:
entity_id:
description: "Name(s) of the entity to stop recording."
example: "camera.camera_1"
target:
entity:
integration: agent_dvr
domain: camera
enable_alerts:
name: Enable alerts
description: Enable alerts
fields:
entity_id:
description: "Name(s) of the entity to enable alerts."
example: "camera.camera_1"
target:
entity:
integration: agent_dvr
domain: camera
disable_alerts:
name: Disable alerts
description: Disable alerts
fields:
entity_id:
description: "Name(s) of the entity to disable alerts."
example: "camera.camera_1"
target:
entity:
integration: agent_dvr
domain: camera
snapshot:
name: Snapshot
description: Take a photo
fields:
entity_id:
description: "Name(s) of the entity to take a snapshot."
example: "camera.camera_1"
target:
entity:
integration: agent_dvr
domain: camera

View File

@@ -1,40 +1,45 @@
"""Component for handling Air Quality data for your location."""
from __future__ import annotations
from datetime import timedelta
import logging
from typing import final
from typing import Final, final
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
ATTR_ATTRIBUTION,
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.config_validation import ( # noqa: F401
PLATFORM_SCHEMA,
PLATFORM_SCHEMA_BASE,
)
from homeassistant.helpers.entity import Entity
from homeassistant.helpers.entity_component import EntityComponent
from homeassistant.helpers.typing import ConfigType, StateType
_LOGGER = logging.getLogger(__name__)
_LOGGER: Final = logging.getLogger(__name__)
ATTR_AQI = "air_quality_index"
ATTR_CO2 = "carbon_dioxide"
ATTR_CO = "carbon_monoxide"
ATTR_N2O = "nitrogen_oxide"
ATTR_NO = "nitrogen_monoxide"
ATTR_NO2 = "nitrogen_dioxide"
ATTR_OZONE = "ozone"
ATTR_PM_0_1 = "particulate_matter_0_1"
ATTR_PM_10 = "particulate_matter_10"
ATTR_PM_2_5 = "particulate_matter_2_5"
ATTR_SO2 = "sulphur_dioxide"
ATTR_AQI: Final = "air_quality_index"
ATTR_CO2: Final = "carbon_dioxide"
ATTR_CO: Final = "carbon_monoxide"
ATTR_N2O: Final = "nitrogen_oxide"
ATTR_NO: Final = "nitrogen_monoxide"
ATTR_NO2: Final = "nitrogen_dioxide"
ATTR_OZONE: Final = "ozone"
ATTR_PM_0_1: Final = "particulate_matter_0_1"
ATTR_PM_10: Final = "particulate_matter_10"
ATTR_PM_2_5: Final = "particulate_matter_2_5"
ATTR_SO2: Final = "sulphur_dioxide"
DOMAIN = "air_quality"
DOMAIN: Final = "air_quality"
ENTITY_ID_FORMAT = DOMAIN + ".{}"
ENTITY_ID_FORMAT: Final = DOMAIN + ".{}"
SCAN_INTERVAL = timedelta(seconds=30)
SCAN_INTERVAL: Final = timedelta(seconds=30)
PROP_TO_ATTR = {
PROP_TO_ATTR: Final[dict[str, str]] = {
"air_quality_index": ATTR_AQI,
"attribution": ATTR_ATTRIBUTION,
"carbon_dioxide": ATTR_CO2,
@@ -50,7 +55,7 @@ PROP_TO_ATTR = {
}
async def async_setup(hass, config):
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
"""Set up the air quality component."""
component = hass.data[DOMAIN] = EntityComponent(
_LOGGER, DOMAIN, hass, SCAN_INTERVAL
@@ -59,84 +64,86 @@ async def async_setup(hass, config):
return True
async def async_setup_entry(hass, entry):
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up a config entry."""
return await hass.data[DOMAIN].async_setup_entry(entry)
component: EntityComponent = hass.data[DOMAIN]
return await component.async_setup_entry(entry)
async def async_unload_entry(hass, entry):
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Unload a config entry."""
return await hass.data[DOMAIN].async_unload_entry(entry)
component: EntityComponent = hass.data[DOMAIN]
return await component.async_unload_entry(entry)
class AirQualityEntity(Entity):
"""ABC for air quality data."""
@property
def particulate_matter_2_5(self):
def particulate_matter_2_5(self) -> StateType:
"""Return the particulate matter 2.5 level."""
raise NotImplementedError()
@property
def particulate_matter_10(self):
def particulate_matter_10(self) -> StateType:
"""Return the particulate matter 10 level."""
return None
@property
def particulate_matter_0_1(self):
def particulate_matter_0_1(self) -> StateType:
"""Return the particulate matter 0.1 level."""
return None
@property
def air_quality_index(self):
def air_quality_index(self) -> StateType:
"""Return the Air Quality Index (AQI)."""
return None
@property
def ozone(self):
def ozone(self) -> StateType:
"""Return the O3 (ozone) level."""
return None
@property
def carbon_monoxide(self):
def carbon_monoxide(self) -> StateType:
"""Return the CO (carbon monoxide) level."""
return None
@property
def carbon_dioxide(self):
def carbon_dioxide(self) -> StateType:
"""Return the CO2 (carbon dioxide) level."""
return None
@property
def attribution(self):
def attribution(self) -> StateType:
"""Return the attribution."""
return None
@property
def sulphur_dioxide(self):
def sulphur_dioxide(self) -> StateType:
"""Return the SO2 (sulphur dioxide) level."""
return None
@property
def nitrogen_oxide(self):
def nitrogen_oxide(self) -> StateType:
"""Return the N2O (nitrogen oxide) level."""
return None
@property
def nitrogen_monoxide(self):
def nitrogen_monoxide(self) -> StateType:
"""Return the NO (nitrogen monoxide) level."""
return None
@property
def nitrogen_dioxide(self):
def nitrogen_dioxide(self) -> StateType:
"""Return the NO2 (nitrogen dioxide) level."""
return None
@final
@property
def state_attributes(self):
def state_attributes(self) -> dict[str, str | int | float]:
"""Return the state attributes."""
data = {}
data: dict[str, str | int | float] = {}
for prop, attr in PROP_TO_ATTR.items():
value = getattr(self, prop)
@@ -146,11 +153,11 @@ class AirQualityEntity(Entity):
return data
@property
def state(self):
def state(self) -> StateType:
"""Return the current state."""
return self.particulate_matter_2_5
@property
def unit_of_measurement(self):
def unit_of_measurement(self) -> str:
"""Return the unit of measurement of this entity."""
return CONCENTRATION_MICROGRAMS_PER_CUBIC_METER

View File

@@ -1,15 +1,21 @@
"""The Airly integration."""
from __future__ import annotations
from datetime import timedelta
import logging
from math import ceil
from aiohttp import ClientSession
from aiohttp.client_exceptions import ClientConnectorError
from airly import Airly
from airly.exceptions import AirlyError
import async_timeout
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE
from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.device_registry import async_get_registry
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from homeassistant.util import dt as dt_util
@@ -30,7 +36,7 @@ PLATFORMS = ["air_quality", "sensor"]
_LOGGER = logging.getLogger(__name__)
def set_update_interval(instances, requests_remaining):
def set_update_interval(instances_count: int, requests_remaining: int) -> timedelta:
"""
Return data update interval.
@@ -46,7 +52,7 @@ def set_update_interval(instances, requests_remaining):
interval = timedelta(
minutes=min(
max(
ceil(minutes_to_midnight / requests_remaining * instances),
ceil(minutes_to_midnight / requests_remaining * instances_count),
MIN_UPDATE_INTERVAL,
),
MAX_UPDATE_INTERVAL,
@@ -58,19 +64,39 @@ def set_update_interval(instances, requests_remaining):
return interval
async def async_setup_entry(hass, config_entry):
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up Airly as config entry."""
api_key = config_entry.data[CONF_API_KEY]
latitude = config_entry.data[CONF_LATITUDE]
longitude = config_entry.data[CONF_LONGITUDE]
use_nearest = config_entry.data.get(CONF_USE_NEAREST, False)
api_key = entry.data[CONF_API_KEY]
latitude = entry.data[CONF_LATITUDE]
longitude = entry.data[CONF_LONGITUDE]
use_nearest = entry.data.get(CONF_USE_NEAREST, False)
# For backwards compat, set unique ID
if config_entry.unique_id is None:
if entry.unique_id is None:
hass.config_entries.async_update_entry(
config_entry, unique_id=f"{latitude}-{longitude}"
entry, unique_id=f"{latitude}-{longitude}"
)
# identifiers in device_info should use tuple[str, str] type, but latitude and
# longitude are float, so we convert old device entries to use correct types
# We used to use a str 3-tuple here sometime, convert that to a 2-tuple too.
device_registry = await async_get_registry(hass)
old_ids = (DOMAIN, latitude, longitude)
for old_ids in (
(DOMAIN, latitude, longitude),
(
DOMAIN,
str(latitude),
str(longitude),
),
):
device_entry = device_registry.async_get_device({old_ids}) # type: ignore[arg-type]
if device_entry and entry.entry_id in device_entry.config_entries:
new_ids = (DOMAIN, f"{latitude}-{longitude}")
device_registry.async_update_device(
device_entry.id, new_identifiers={new_ids}
)
websession = async_get_clientsession(hass)
update_interval = timedelta(minutes=MIN_UPDATE_INTERVAL)
@@ -81,21 +107,19 @@ async def async_setup_entry(hass, config_entry):
await coordinator.async_config_entry_first_refresh()
hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN][config_entry.entry_id] = coordinator
hass.data[DOMAIN][entry.entry_id] = coordinator
hass.config_entries.async_setup_platforms(config_entry, PLATFORMS)
hass.config_entries.async_setup_platforms(entry, PLATFORMS)
return True
async def async_unload_entry(hass, config_entry):
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Unload a config entry."""
unload_ok = await hass.config_entries.async_unload_platforms(
config_entry, PLATFORMS
)
unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
if unload_ok:
hass.data[DOMAIN].pop(config_entry.entry_id)
hass.data[DOMAIN].pop(entry.entry_id)
return unload_ok
@@ -105,14 +129,14 @@ class AirlyDataUpdateCoordinator(DataUpdateCoordinator):
def __init__(
self,
hass,
session,
api_key,
latitude,
longitude,
update_interval,
use_nearest,
):
hass: HomeAssistant,
session: ClientSession,
api_key: str,
latitude: float,
longitude: float,
update_interval: timedelta,
use_nearest: bool,
) -> None:
"""Initialize."""
self.latitude = latitude
self.longitude = longitude
@@ -121,9 +145,9 @@ class AirlyDataUpdateCoordinator(DataUpdateCoordinator):
super().__init__(hass, _LOGGER, name=DOMAIN, update_interval=update_interval)
async def _async_update_data(self):
async def _async_update_data(self) -> dict[str, str | float | int]:
"""Update data via library."""
data = {}
data: dict[str, str | float | int] = {}
if self.use_nearest:
measurements = self.airly.create_measurements_session_nearest(
self.latitude, self.longitude, max_distance_km=5

View File

@@ -1,13 +1,22 @@
"""Support for the Airly air_quality service."""
from __future__ import annotations
from typing import Any
from homeassistant.components.air_quality import (
ATTR_AQI,
ATTR_PM_2_5,
ATTR_PM_10,
AirQualityEntity,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_NAME
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from . import AirlyDataUpdateCoordinator
from .const import (
ATTR_API_ADVICE,
ATTR_API_CAQI,
@@ -36,80 +45,72 @@ LABEL_PM_10_PERCENT = f"{ATTR_PM_10}_percent_of_limit"
PARALLEL_UPDATES = 1
async def async_setup_entry(hass, config_entry, async_add_entities):
async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up Airly air_quality entity based on a config entry."""
name = config_entry.data[CONF_NAME]
name = entry.data[CONF_NAME]
coordinator = hass.data[DOMAIN][config_entry.entry_id]
coordinator = hass.data[DOMAIN][entry.entry_id]
async_add_entities([AirlyAirQuality(coordinator, name)], False)
def round_state(func):
"""Round state."""
def _decorator(self):
res = func(self)
if isinstance(res, float):
return round(res)
return res
return _decorator
class AirlyAirQuality(CoordinatorEntity, AirQualityEntity):
"""Define an Airly air quality."""
def __init__(self, coordinator, name):
coordinator: AirlyDataUpdateCoordinator
def __init__(self, coordinator: AirlyDataUpdateCoordinator, name: str) -> None:
"""Initialize."""
super().__init__(coordinator)
self._name = name
self._icon = "mdi:blur"
@property
def name(self):
def name(self) -> str:
"""Return the name."""
return self._name
@property
def icon(self):
def icon(self) -> str:
"""Return the icon."""
return self._icon
@property
@round_state
def air_quality_index(self):
def air_quality_index(self) -> float | None:
"""Return the air quality index."""
return self.coordinator.data[ATTR_API_CAQI]
return round_state(self.coordinator.data[ATTR_API_CAQI])
@property
@round_state
def particulate_matter_2_5(self):
def particulate_matter_2_5(self) -> float | None:
"""Return the particulate matter 2.5 level."""
return self.coordinator.data.get(ATTR_API_PM25)
return round_state(self.coordinator.data.get(ATTR_API_PM25))
@property
@round_state
def particulate_matter_10(self):
def particulate_matter_10(self) -> float | None:
"""Return the particulate matter 10 level."""
return self.coordinator.data.get(ATTR_API_PM10)
return round_state(self.coordinator.data.get(ATTR_API_PM10))
@property
def attribution(self):
def attribution(self) -> str:
"""Return the attribution."""
return ATTRIBUTION
@property
def unique_id(self):
def unique_id(self) -> str:
"""Return a unique_id for this entity."""
return f"{self.coordinator.latitude}-{self.coordinator.longitude}"
@property
def device_info(self):
def device_info(self) -> DeviceInfo:
"""Return the device info."""
return {
"identifiers": {
(DOMAIN, self.coordinator.latitude, self.coordinator.longitude)
(
DOMAIN,
f"{self.coordinator.latitude}-{self.coordinator.longitude}",
)
},
"name": DEFAULT_NAME,
"manufacturer": MANUFACTURER,
@@ -117,7 +118,7 @@ class AirlyAirQuality(CoordinatorEntity, AirQualityEntity):
}
@property
def extra_state_attributes(self):
def extra_state_attributes(self) -> dict[str, Any]:
"""Return the state attributes."""
attrs = {
LABEL_AQI_DESCRIPTION: self.coordinator.data[ATTR_API_CAQI_DESCRIPTION],
@@ -135,3 +136,8 @@ class AirlyAirQuality(CoordinatorEntity, AirQualityEntity):
self.coordinator.data[ATTR_API_PM10_PERCENT]
)
return attrs
def round_state(state: float | None) -> float | None:
"""Round state."""
return round(state) if state else state

View File

@@ -1,4 +1,9 @@
"""Adds config flow for Airly."""
from __future__ import annotations
from typing import Any
from aiohttp import ClientSession
from airly import Airly
from airly.exceptions import AirlyError
import async_timeout
@@ -13,6 +18,7 @@ from homeassistant.const import (
HTTP_NOT_FOUND,
HTTP_UNAUTHORIZED,
)
from homeassistant.data_entry_flow import FlowResult
from homeassistant.helpers.aiohttp_client import async_get_clientsession
import homeassistant.helpers.config_validation as cv
@@ -23,9 +29,10 @@ class AirlyFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
"""Config flow for Airly."""
VERSION = 1
CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_POLL
async def async_step_user(self, user_input=None):
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Handle a flow initialized by the user."""
errors = {}
use_nearest = False
@@ -85,7 +92,13 @@ class AirlyFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
)
async def test_location(client, api_key, latitude, longitude, use_nearest=False):
async def test_location(
client: ClientSession,
api_key: str,
latitude: float,
longitude: float,
use_nearest: bool = False,
) -> bool:
"""Return true if location is valid."""
airly = Airly(api_key, client)
if use_nearest:

View File

@@ -1,29 +1,72 @@
"""Constants for Airly integration."""
from __future__ import annotations
ATTR_API_ADVICE = "ADVICE"
ATTR_API_CAQI = "CAQI"
ATTR_API_CAQI_DESCRIPTION = "DESCRIPTION"
ATTR_API_CAQI_LEVEL = "LEVEL"
ATTR_API_HUMIDITY = "HUMIDITY"
ATTR_API_PM1 = "PM1"
ATTR_API_PM10 = "PM10"
ATTR_API_PM10_LIMIT = "PM10_LIMIT"
ATTR_API_PM10_PERCENT = "PM10_PERCENT"
ATTR_API_PM25 = "PM25"
ATTR_API_PM25_LIMIT = "PM25_LIMIT"
ATTR_API_PM25_PERCENT = "PM25_PERCENT"
ATTR_API_PRESSURE = "PRESSURE"
ATTR_API_TEMPERATURE = "TEMPERATURE"
from typing import Final
ATTR_LABEL = "label"
ATTR_UNIT = "unit"
from homeassistant.const import (
ATTR_DEVICE_CLASS,
ATTR_ICON,
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
DEVICE_CLASS_HUMIDITY,
DEVICE_CLASS_PRESSURE,
DEVICE_CLASS_TEMPERATURE,
PERCENTAGE,
PRESSURE_HPA,
TEMP_CELSIUS,
)
ATTRIBUTION = "Data provided by Airly"
CONF_USE_NEAREST = "use_nearest"
DEFAULT_NAME = "Airly"
DOMAIN = "airly"
LABEL_ADVICE = "advice"
MANUFACTURER = "Airly sp. z o.o."
MAX_UPDATE_INTERVAL = 90
MIN_UPDATE_INTERVAL = 5
NO_AIRLY_SENSORS = "There are no Airly sensors in this area yet."
from .model import SensorDescription
ATTR_API_ADVICE: Final = "ADVICE"
ATTR_API_CAQI: Final = "CAQI"
ATTR_API_CAQI_DESCRIPTION: Final = "DESCRIPTION"
ATTR_API_CAQI_LEVEL: Final = "LEVEL"
ATTR_API_HUMIDITY: Final = "HUMIDITY"
ATTR_API_PM10: Final = "PM10"
ATTR_API_PM10_LIMIT: Final = "PM10_LIMIT"
ATTR_API_PM10_PERCENT: Final = "PM10_PERCENT"
ATTR_API_PM1: Final = "PM1"
ATTR_API_PM25: Final = "PM25"
ATTR_API_PM25_LIMIT: Final = "PM25_LIMIT"
ATTR_API_PM25_PERCENT: Final = "PM25_PERCENT"
ATTR_API_PRESSURE: Final = "PRESSURE"
ATTR_API_TEMPERATURE: Final = "TEMPERATURE"
ATTR_LABEL: Final = "label"
ATTR_UNIT: Final = "unit"
ATTRIBUTION: Final = "Data provided by Airly"
CONF_USE_NEAREST: Final = "use_nearest"
DEFAULT_NAME: Final = "Airly"
DOMAIN: Final = "airly"
LABEL_ADVICE: Final = "advice"
MANUFACTURER: Final = "Airly sp. z o.o."
MAX_UPDATE_INTERVAL: Final = 90
MIN_UPDATE_INTERVAL: Final = 5
NO_AIRLY_SENSORS: Final = "There are no Airly sensors in this area yet."
SENSOR_TYPES: dict[str, SensorDescription] = {
ATTR_API_PM1: {
ATTR_DEVICE_CLASS: None,
ATTR_ICON: "mdi:blur",
ATTR_LABEL: ATTR_API_PM1,
ATTR_UNIT: CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
},
ATTR_API_HUMIDITY: {
ATTR_DEVICE_CLASS: DEVICE_CLASS_HUMIDITY,
ATTR_ICON: None,
ATTR_LABEL: ATTR_API_HUMIDITY.capitalize(),
ATTR_UNIT: PERCENTAGE,
},
ATTR_API_PRESSURE: {
ATTR_DEVICE_CLASS: DEVICE_CLASS_PRESSURE,
ATTR_ICON: None,
ATTR_LABEL: ATTR_API_PRESSURE.capitalize(),
ATTR_UNIT: PRESSURE_HPA,
},
ATTR_API_TEMPERATURE: {
ATTR_DEVICE_CLASS: DEVICE_CLASS_TEMPERATURE,
ATTR_ICON: None,
ATTR_LABEL: ATTR_API_TEMPERATURE.capitalize(),
ATTR_UNIT: TEMP_CELSIUS,
},
}

View File

@@ -0,0 +1,13 @@
"""Type definitions for Airly integration."""
from __future__ import annotations
from typing import TypedDict
class SensorDescription(TypedDict):
"""Sensor description class."""
device_class: str | None
icon: str | None
label: str
unit: str

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