Compare commits

..

493 Commits

Author SHA1 Message Date
Franck Nijhof
c9380d4972 Merge pull request #38065 from home-assistant/rc 2020-07-22 17:45:03 +02:00
Franck Nijhof
c505bf2df2 Bumped version to 0.113.0 2020-07-22 15:48:28 +02:00
Joakim Plate
dfd956b083 Fix rfxtrx stop after first non light (#38057) 2020-07-22 15:44:16 +02:00
Paulus Schoutsen
a50cf1d00a Add MQTT to constraints file (#38049) 2020-07-22 15:36:25 +02:00
Alexei Chetroi
6617d676e5 ZHA dependencies bump bellows to 0.18.0 (#38043) 2020-07-22 15:36:22 +02:00
Erik Montnemery
9f12226b2b Use keywords for MQTT birth and will (#38040) 2020-07-22 15:36:19 +02:00
Erik Montnemery
d8d48b0a21 Correct arguments to MQTT will_set (#38036) 2020-07-22 15:36:16 +02:00
Daniel Shokouhi
0cd8dce9df Check if robot has boundaries to update (#38030) 2020-07-22 15:36:13 +02:00
Jesse Newland
34751fcd86 Fix notify.slack service calls using data_template (#37980) 2020-07-22 15:36:10 +02:00
Tom Harris
b003d9675c Fix issue with Insteon events not firing correctly (#37974) 2020-07-22 15:36:06 +02:00
michaeldavie
98dd56eed5 Make nested get() statements safe (#37965) 2020-07-22 15:36:02 +02:00
Joakim Plate
66e490e55f Rfxtrx fixup restore (#38039) 2020-07-22 15:27:04 +02:00
Paulus Schoutsen
0b32caa71f Bumped version to 0.113.0b3 2020-07-20 00:35:25 +00:00
David F. Mulcahey
9b46796969 Force updates for ZHA light group entity members (Part 2) (#37995) 2020-07-20 00:35:18 +00:00
Erik Montnemery
8409385fca Bump pychromecast to 7.1.2 (#37976) 2020-07-20 00:35:18 +00:00
Paulus Schoutsen
27859a2784 Bumped version to 0.113.0b2 2020-07-18 23:37:48 +00:00
David F. Mulcahey
28f78c0c67 Force updates for ZHA light group entity members (#37961)
* Force updates for ZHA light group entity members

* add a 3 second debouncer to the forced refresh

* lint
2020-07-18 23:37:48 +00:00
jjlawren
a3429848a2 Fix Sonos speaker lookup for Plex (#37942) 2020-07-18 23:37:48 +00:00
Tim Messerschmidt
757d05a74e Fix: Passes secure parameter when setting up Nuki (#36844) (#37932)
* Passes secure parameter when setting up Nuki (#36844)

* Adds an additional configuration option for soft bridges instead of passing True when setting up the bridge

* Revert "Adds an additional configuration option for soft bridges instead of passing True when setting up the bridge"

This reverts commit af1d839ab1.
2020-07-18 23:37:48 +00:00
Abílio Costa
253950f84f Change ZHA power unit from kW to W (#37896)
* Change ZHA power unit from kW to W

* Use POWER_WATT

* Move kW to W conversion; ignore unit for power
2020-07-18 23:37:48 +00:00
J. Nick Koston
af36a67b89 fix (#37889) 2020-07-18 23:37:47 +00:00
rajlaud
b784cc011d Fix bugs updating state of hdmi_cec switch (#37786) 2020-07-18 23:37:47 +00:00
Marcel van der Veldt
7c0a933452 Add ozw support for single setpoint thermostat devices (#37713)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-07-18 23:37:47 +00:00
Joakim Plate
8b207df819 Rfxtrx fixes for beta (#37957) 2020-07-18 16:34:50 -07:00
Paulus Schoutsen
d297be2698 Bumped version to 0.113.0b1 2020-07-17 00:51:53 +00:00
J. Nick Koston
de67135e86 Ensure a state change tracker setup from inside a state change listener does not fire immediately (#37924)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-07-17 00:51:37 +00:00
Anders Melchiorsen
b684007fbb Upgrade pysonos to 0.0.32 (#37923) 2020-07-17 00:51:37 +00:00
cgtobi
98347345d1 Fix unavailable when value is zero (#37918) 2020-07-17 00:51:36 +00:00
Alexei Chetroi
c0302e6eca Fix ZHA electrical measurement sensor initialization (#37915)
* Refactor cached ZHA channel reads.

If doing a cached ZCL attribute read, do "only_from_cache" read for
battery operated devices only. Mains operated devices will do a network
read in case of a cache miss.

* Use cached attributes for ZHA electrical measurement

* Bump up ZHA zigpy dependency.
2020-07-17 00:51:35 +00:00
Bram Kragten
06bc98a3a2 Updated frontend to 20200716.0 (#37910) 2020-07-17 00:51:34 +00:00
Phil Bruckner
32858bcea3 Fix automation & script restart mode bug (#37909) 2020-07-17 00:51:33 +00:00
Franck Nijhof
979260f4be Fix swapped variables deprecation in log message (#37901) 2020-07-17 00:51:33 +00:00
Bram Kragten
408b52de1b Update frontend to 20200715.1 (#37888) 2020-07-17 00:50:26 +00:00
Franck Nijhof
b81b57cdf7 Bumped version to 0.113.0b0 2020-07-15 21:29:28 +02:00
Pascal Vizeli
f4c3f5d074 Revert breaking change for Automation (#37885)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-07-15 20:38:29 +02:00
J. Nick Koston
abe3e3094e Provide workaround for missing/disabled/broken IPv6 (#37887) 2020-07-15 11:26:40 -07:00
Erik Montnemery
53d6f4948e Adapt MQTT config flow to default birth and will (#37875) 2020-07-15 11:16:03 -07:00
Bram Kragten
1b09c65e74 Updated frontend to 20200715.0 (#37884) 2020-07-15 07:41:39 -10:00
Phil
21649244e9 Update per review 3 2020-07-15 16:58:42 +00:00
Phil
741c702ff3 Add tests 2020-07-15 16:58:42 +00:00
Phil Bruckner
cf498b7beb Stop running scripts at shutdown (#37858) 2020-07-15 09:28:32 -07:00
Daniel Shokouhi
f24fe9c246 Improve Neato error logging by including device name (#37865) 2020-07-15 09:26:57 -07:00
Xiaonan Shen
d37a5cdde5 Fix yeelight flash (#37743)
* Fix yeelight flash

* Use cast instead of string comparison

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

Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2020-07-15 15:51:33 +02:00
Franck Nijhof
a3174a88f5 Don't reuse venv cache when Python version changes (#37881) 2020-07-15 15:08:38 +02:00
shker
c3724186cf Use supervisord "group:name" when get process info (#37678) 2020-07-15 13:45:29 +02:00
Paulus Schoutsen
633f9b2f01 Prefer external URLs because internal can't have valid SSL (#37872) 2020-07-15 09:23:16 +02:00
J. Nick Koston
1d7f3416d3 Switch async_track_state_change to the faster async_track_state_change_event part 7 (#37870)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-07-14 23:37:25 -07:00
J. Nick Koston
44fefb3216 Improve handling of template platforms when entity extraction fails (#37831)
Most of the the template platforms would check for
extract_entities failing to extract entities and avoid
setting up a state change listner for MATCH_ALL after
extract_entities had warned that it could not extract
the entities and updates would need to be done manually.
This protection has been extended to all template platforms.

Alter the behavior of extract_entities to return the
successfully extracted entities if one or more templates
fail extraction instead of returning MATCH_ALL
2020-07-14 22:34:35 -07:00
J. Nick Koston
e938dcfbda Switch universal media_player to use async_track_state_change_event (#37832)
async_track_state_change_event is faster than async_track_state_change
and since we do not care about the data being returned to the callback
this is a simple speedup
2020-07-14 22:32:03 -07:00
J. Nick Koston
20d5d3c162 Switch a few more async_track_state_change to the faster async_track_state_change_event (#37833)
async_track_state_change_event is faster than async_track_state_change
and since we do not care about the data being returned to the callback
this is a simple speedup
2020-07-14 22:31:34 -07:00
J. Nick Koston
b12566e265 Switch async_track_state_change to the faster async_track_state_change_event (#37834)
async_track_state_change_event is faster than async_track_state_change
2020-07-14 22:30:47 -07:00
J. Nick Koston
b430496b13 Switch async_track_state_change to the faster async_track_state_change_event part 4 (#37863)
* Switch async_track_state_change to the faster async_track_state_change_event part 4

Calling async_track_state_change_event directly is faster than async_track_state_change (see #37251) since async_track_state_change is a wrapper around async_track_state_change_event now

* pylint
2020-07-14 22:25:48 -07:00
J. Nick Koston
aed98a830f Switch async_track_state_change to the faster async_track_state_change_event part 5 (#37866)
Calling async_track_state_change_event directly is faster than async_track_state_change (see #37251) since async_track_state_change is a wrapper around async_track_state_change_event now
2020-07-14 22:25:12 -07:00
J. Nick Koston
e65235b207 Switch async_track_state_change to the faster async_track_state_change_event part 6 (#37869)
Calling async_track_state_change_event directly is faster than async_track_state_change (see #37251) since async_track_state_change is a wrapper around async_track_state_change_event now
2020-07-14 22:24:27 -07:00
J. Nick Koston
bf72e3c965 Update august manufacturer name (#37867)
* Update august manufacturer name

This allows homekit to link the accessories to the august app

* yeah.. update the test
2020-07-14 18:03:24 -10:00
Eugene Prystupa
b07d09f7dc Add support for fireplaces to bond integration (#37850) 2020-07-14 22:27:03 -05:00
J. Nick Koston
41cd90648e Have async_track_point_in_utc_time call async_run_job directly from call_at (#37790)
We do not need a nested function here since call_at
takes args
2020-07-14 17:24:36 -10:00
HomeAssistant Azure
e852a2eb9b [ci skip] Translation update 2020-07-15 00:02:40 +00:00
Bram Kragten
c62345b9a3 Updated frontend to 20200714.0 (#37862) 2020-07-14 13:50:19 -10:00
David F. Mulcahey
69d1faea35 bump zigpy and zha quirks (#37859) 2020-07-14 19:34:57 -04:00
Franck Nijhof
706eb8f36a Merge branch 'master' into dev 2020-07-14 23:08:43 +02:00
Daniel Shokouhi
ddfbeffd28 Fix zone cleaning and raise config entry not ready when needed (#37741) 2020-07-14 22:59:03 +02:00
Jannik Beyerstedt
d8c2732bcb Do no crash Luftdaten on additional data returned by the API (#37763) 2020-07-14 22:56:02 +02:00
Daniel Pervan
5b3d094a1e Fix Fibaro HC light switches not being configured as Light entities (#37690) 2020-07-14 22:47:05 +02:00
SukramJ
d119c96aee Add HmIP-FSI16 to HomematicIP Cloud (#37715) 2020-07-14 22:43:21 +02:00
J. Nick Koston
d4111617ca Ensure HomeKit does not throw when a linked motion sensor is removed (#37773) 2020-07-14 22:38:55 +02:00
J. Nick Koston
f8d547f2d3 Adjust history as all scripts can now be canceled (#37820) 2020-07-14 22:31:34 +02:00
Aidan Timson
36dde3ff68 Use size of camera in Agent DVR (#36375) 2020-07-14 22:25:34 +02:00
Franck Nijhof
209f9b6722 Always expose Toon gas sensors (#37829) 2020-07-14 22:22:44 +02:00
J. Nick Koston
f5cbae0cd5 Avoid homekit crash when temperature is clamped above max value (#37746) 2020-07-14 22:21:10 +02:00
Bram Kragten
9ecaa10e51 Adjust icons for MDI bump (#37730) 2020-07-14 22:17:14 +02:00
J. Nick Koston
5cd6370822 Switch async_track_state_change to the faster async_track_state_change_event part 3 (#37852)
async_track_state_change_event is faster than async_track_state_change
2020-07-14 09:40:01 -10:00
Bram Kragten
ea17d36cbb Frontend: deprecate extra_html_url (#37843) 2020-07-14 21:06:36 +02:00
Adam Liddell
c3f63e0739 Fix media_content_id attribute in Spotify integration (#37853)
Previously, the media_content_id field would contain the track name, which
appears was a regression when the Spotify integration was rewritten in
7e4b9adc. The media_content_id now reverts to containing the Spotify
track 'uri' field, which has the form 'spotify:track:...'
2020-07-14 20:37:08 +02:00
Bram Kragten
7d77fa92c2 Add mode info attributes to script and automation (#37815)
Co-authored-by: J. Nick Koston <nick@koston.org>
2020-07-14 10:47:59 -07:00
Ville Skyttä
ac0dbb17af Attrs cleanups (#37849) 2020-07-14 10:30:30 -07:00
Phil Bruckner
7e280e2b27 Add choose script action (#37818)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-07-14 10:22:54 -07:00
Eugene Prystupa
515ad6164d Add support for generic device (switch) to bond integration (#37837) 2020-07-14 08:54:33 -05:00
dependabot[bot]
f0916aeb86 Bump actions/upload-artifact from v2.0.1 to 2.1.0 (#37841)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from v2.0.1 to 2.1.0.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v2.0.1...ebad382c0953e8c6b4039e8d30dfd19ee7b2a862)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-07-14 10:39:58 +02:00
Ville Skyttä
22f17a1887 Travis CI improvements (#37840) 2020-07-14 09:29:56 +02:00
kennedyshead
81914258e9 Version bump for asuswrt (#37827)
Co-authored-by: magnusknutas <magnus@thefarm.se>
2020-07-14 09:27:07 +02:00
Paulus Schoutsen
ec1df9b427 Merge pull request #37836 from home-assistant/rc 2020-07-13 20:04:12 -07:00
Paulus Schoutsen
fb484e87c0 Bumped version to 0.112.5 2020-07-14 01:11:49 +00:00
Robert Svensson
5d1d113a25 deCONZ - don't let light "attr" events update group data (#37797) 2020-07-14 01:11:24 +00:00
Robert Svensson
738d3a13e1 UniFi - Handle session expiration (#37782) 2020-07-14 01:11:23 +00:00
Kevin Fronczak
2c58d860b6 Bump blinkpy version to fix connection errors (#37755)
* Bump blinkpy version to fix connection errors

* Bump blinkpy version to fix connection errors

* Rebased, re-ran gen_requirements_all
2020-07-14 01:11:23 +00:00
Rohan Kapoor
d0e26c3dee Add support for the DataUpdateCoordinator to not automatically update (#37734) 2020-07-14 01:11:22 +00:00
J. Nick Koston
6eca0b2a39 Fix homekit_controller discovery via zeroconf (#37725) 2020-07-14 01:11:21 +00:00
Erik Montnemery
502f0cd2ce Fix MQTT availability startup race (#37718) 2020-07-14 01:10:42 +00:00
Erik Montnemery
114fbb1278 Tweak MQTT availability (#37719) 2020-07-14 01:10:25 +00:00
Erik Montnemery
5d26f5d01d Support multiple MQTT availability topics (#37418)
* Support multiple MQTT availability topics

* Make availability list and availability_topic exclusive

* Make availability list and availability_topic exclusive

* Add missing abbreviation
2020-07-14 01:10:15 +00:00
Rami Mosleh
0d58048cea Properly set update_interval during Speedtest setup (#37708)
* Properly set update_interval during setup

* implement new update_interval method
2020-07-14 01:04:47 +00:00
bsmappee
39d5fb82e5 Smappee dependency update (#37680) 2020-07-14 01:04:47 +00:00
J. Nick Koston
bfbb2826bc Fix homekit_controller discovery via zeroconf (#37725) 2020-07-13 17:45:05 -07:00
HomeAssistant Azure
aabf0dab88 [ci skip] Translation update 2020-07-14 00:03:03 +00:00
Haemish Kyd
33eaf081cd Apply code review changes for poolsense (#37817) 2020-07-13 18:04:10 -05:00
Eugene Prystupa
95e72b4c4b Map bond fan speeds to standard HA speeds (#37808) 2020-07-13 18:00:05 -05:00
Ville Skyttä
9e8e5c37f4 Update Travis-CI to use Python 3.7.1 (#37830)
Refs 89a9634d35
2020-07-14 00:45:10 +02:00
Joakim Plate
1a64108eea Switch rfxtrx to config entries (#37794)
* Switch to config flow setup

* Add minimal test for config flow

* Add myself as codeowner and address some review concerns

* Address some further review comments
2020-07-13 23:24:28 +02:00
Eugene Prystupa
ed3f25489e Apply bond python related feedback from a prior PR (#37821) 2020-07-13 23:07:35 +02:00
tizzen33
4aaf7c5432 Convert Toon expires_in value to float (#37716)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2020-07-13 22:59:27 +02:00
Rami Mosleh
cd3e045e06 Properly set update_interval during Speedtest setup (#37708)
* Properly set update_interval during setup

* implement new update_interval method
2020-07-13 12:32:22 -07:00
Markus Bong
b152d59afe Add devolo binary sensor device class mapping (#37350)
* add device class mapping for binary sensors

* change if else statement to or
2020-07-13 08:56:22 -10:00
Paulus Schoutsen
9ac1475251 Simplify logger integration (#37780)
Co-authored-by: J. Nick Koston <nick@koston.org>
2020-07-13 10:20:18 -07:00
Paulus Schoutsen
8ed1a29c82 Drop white blacklist pt1 (#37816) 2020-07-13 17:43:11 +02:00
Joakim Plate
ccbc3b5e39 Add rfxtrx ability to send a raw command to device (#37793)
* Add the ability to send a raw command to device

* Add a test for new service

* Use async test

* Sort includes
2020-07-13 16:54:52 +02:00
Jakob Schlyter
dbcd5f4c2c Add urlencode template filter (#37753)
* add urlencode template filter

* fix flake8

* add test to string ang integer

* better test vectors
2020-07-13 16:48:29 +02:00
Paulus Schoutsen
34c2579507 Constraints pt3 (#37803) 2020-07-13 15:55:20 +02:00
Dermot Duffy
eb6fda8387 Allow an extra packet without dts (for Arlo camera streaming) (#37792)
* Allow 1 packet without dts. See https://github.com/twrecked/hass-aarlo/issues/151 .

* Reset boolean once a packet with dts is found.

* Fix no-else-continue lint error.
2020-07-13 09:47:33 -04:00
pnguyen-tyro
d8ec1d36b2 pydaikin version bump to 2.3.1: (#37682)
* Fix skyfi incorrect setting zone
* Add support for advanced modes for brp069 model
2020-07-13 08:40:16 +02:00
Joakim Plate
aaa073183c Drop dummy connection (#37805)
We now mock the module
2020-07-13 03:40:45 +02:00
Paulus Schoutsen
8e71559068 Bump aiokafka to 0.6.0 (#37778) 2020-07-12 19:39:01 -06:00
Joakim Plate
87f6b7cdd4 Replace rfxtrx entity events with integration events (#37565)
* Drop per entity events

* Correct linting error

* Drop keys()
2020-07-13 02:57:19 +02:00
HomeAssistant Azure
d3b47b6d89 [ci skip] Translation update 2020-07-13 00:02:52 +00:00
Eugene Prystupa
f32f73a7d1 Add basic support for lights in bond integration (#37802) 2020-07-12 18:45:47 -05:00
AJ Schmidt
b63f882c3f Fix Dockerfile.dev for VS Code devcontainer (#37801) 2020-07-12 16:18:08 -07:00
Robert Svensson
548e956670 deCONZ - don't let light "attr" events update group data (#37797) 2020-07-12 16:16:40 -07:00
jjlawren
5c28919fba Wrap possible I/O in executor (#37688) 2020-07-12 18:09:47 -04:00
Haemish Kyd
6fe54e31cc Apply code quality updates to poolsense (#37781)
* Created a binary sensor and corrected some review comments.

* Updated the poolsense class and its interface to handle credentials better

* Moved the client session to the PoolSense class.

* Apply suggestions from code review

* Update binary_sensor.py

* Update homeassistant/components/poolsense/__init__.py

* Update sensor.py

* Update binary_sensor.py

* Removed unnecessary class variable

* Correcting a merge error.

Co-authored-by: Chris Talkington <chris@talkingtontech.com>
2020-07-12 15:33:30 -05:00
Eugene Prystupa
e9440c49d5 Add support for fan direction in bond integration (#37789)
* Add support for fan direction in bond integration

* Add support for fan direction (PR feedback)
2020-07-12 15:30:24 -05:00
Joakim Plate
53844488d8 Switch rfxtrx to integration level config (#37742)
* Switch to integration level config

* Switch to per device config rather than per entity type

* All roller shutters should be added as covers

(there are non lighting types)

* Fixup tests that used invalid packets for platforms

* Avoid variable re-use

* Allow control events on sensors too

That way we get signal level sensors for these too

* Lint correction

* Don't filter sensors from config

Disable sensors from GUI if the entities are not wanted

* Correct usage of ATTR_ instead of CONF_

* Make sure the logging when a new entity is added includes the event
2020-07-12 22:03:22 +02:00
Eric Severance
16a947aa5f Add generic unavailable and last_updated metrics for prometheus (#37456)
* Add generic unavailable and last_updated metrics for prometheus

* Updated with feedback from the code review
2020-07-12 21:27:33 +02:00
Eugene Prystupa
c6ab2c5d0a Add Bond hub as a device for bond entities (#37772)
* Introduce Bond Hub concept

* Read Hub version information when setting up entry

* Link entities to Hub using via_device

* Add test to verify created Hub device properties
2020-07-12 11:31:53 -05:00
Robert Svensson
6826a8829c UniFi - Handle session expiration (#37782) 2020-07-12 09:47:26 +02:00
J. Nick Koston
f16090caf4 Significantly improve logging performance when no integrations are requesting debug level (#37776) 2020-07-11 22:33:25 -07:00
Alan Tse
401dd4a32a Bump teslajsonpy to 0.9.3. (#37771)
Fixes #37684
2020-07-11 20:07:20 -05:00
Eugene Prystupa
b7318b1914 Upgrade bond-home to 0.0.9 (#37764) 2020-07-11 20:04:07 -05:00
HomeAssistant Azure
f9ce3f3bc4 [ci skip] Translation update 2020-07-12 00:04:30 +00:00
Phil Bruckner
e5a081c7dd Fix script queued mode typo (#37759) 2020-07-11 13:34:53 -05:00
Paulus Schoutsen
690579749e Bump pyHS100 to 3.5.1 (#37749) 2020-07-11 18:02:08 +02:00
Kevin Fronczak
4d0c4ac5b3 Bump blinkpy version to fix connection errors (#37755)
* Bump blinkpy version to fix connection errors

* Bump blinkpy version to fix connection errors

* Rebased, re-ran gen_requirements_all
2020-07-11 17:50:18 +02:00
Paulus Schoutsen
0bcc8624b7 Reference constraint files from requirement files (#37751)
* Reference constraint files from requirement files

* Update azure-pipelines-wheels.yml

Co-authored-by: Pascal Vizeli <pvizeli@syshack.ch>
2020-07-11 06:20:14 -07:00
Paulus Schoutsen
0bf772b68b Bump ADS to 3.1.3 (#37748) 2020-07-10 23:50:28 -07:00
Haemish Kyd
8a2b34cc09 Updates to poolsense integration (#37613)
* Created a binary sensor and corrected some review comments.

* Updated the poolsense class and its interface to handle credentials better

* Moved the client session to the PoolSense class.

* Apply suggestions from code review

* Update binary_sensor.py

* Update homeassistant/components/poolsense/__init__.py

* Update sensor.py

* Update binary_sensor.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>
2020-07-10 21:53:34 -05:00
Eugene Prystupa
1e9bc278e0 Refactor Bond integration to remove duplication (#37740)
* Refactor Bond integration to remove duplication in Entity code and unit tests

* Refactor Bond integration to remove duplication in Entity code and unit tests (PR feedback)
2020-07-10 20:20:50 -05:00
Eugene Prystupa
0fbdb47dcf Fix incorrect comparison of speed "off" by identity instead of by value (#37738) 2020-07-10 19:45:12 -05:00
Eugene Prystupa
366354c90c Support Fan domain in Bond integration (#37703)
* Support Fan domain in Bond integration

* Support Fan domain in Bond integration

* Support Fan domain in Bond integration (apply PR feedback)

* Support Fan domain in Bond integration (apply PR feedback)
2020-07-10 19:23:35 -05:00
HomeAssistant Azure
2e72216a1c [ci skip] Translation update 2020-07-11 00:02:51 +00:00
Phil Bruckner
63e55bff52 Remove legacy script mode and simplify remaining modes (#37729) 2020-07-10 17:00:57 -07:00
Paulus Schoutsen
8a8289b1a4 Uninstall typing (#37735) 2020-07-10 15:57:40 -07:00
Rohan Kapoor
0db8140c13 Add support for the DataUpdateCoordinator to not automatically update (#37734) 2020-07-10 15:48:20 -07:00
J. Nick Koston
52939865fa Use the shared zeroconf instance for homekit_controller (#37691)
* Use the shared zeroconf instance for homekit_controller

* bump version

* Update for upstream changes. Thank you @Jc2k !

* naming

* bump version

* empty commit to reset CI as re-run is not working
2020-07-10 12:18:53 -10:00
Aaron Bach
e61da2fff3 Re-add ability to use remote files (by URL) in Slack messages (#37161)
* Re-add remote file support for Slack

* More work

* Ensure Slack can only upload files from whitelisted directories

* Cleanup

* Finish work

* Code review

* Messing around

* Final cleanup

* Add comment explaining why we use aiohttp for remote files

* Typo
2020-07-10 16:07:44 -06:00
Joakim Plate
5255bf20d3 Add rfxtrx device classes to known types (#37698)
* Add device classes to known types

* Update homeassistant/components/rfxtrx/sensor.py

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-07-10 21:47:37 +02:00
Phil Bruckner
91271f388c Add new repeat loop for scripts and automations (#37589) 2020-07-10 13:37:19 -05:00
Erik Montnemery
b187b17a4f Fix MQTT availability startup race (#37718) 2020-07-10 09:40:15 -07:00
Erik Montnemery
383db60dff Tweak MQTT availability (#37719) 2020-07-10 09:39:18 -07:00
Paulus Schoutsen
67b18aef5b Fix Hue homekit discovery (#37694)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2020-07-10 09:37:36 -07:00
Greg Dowling
405c1cdc86 Fix loopenergy callback updating HA before the object is initialised (#37650)
* Fix loopenergy callback updating HA before the object is initialised.

* Change to use async_added_to_hass.
2020-07-10 17:42:27 +02:00
Jakub Bednář
c260b7fa16 Update influxdb-client dependency to 1.8.0, fix test write for InfluxDB v2 (#37710)
* chore: updated influxdb-client dependency to 1.8.0, fixed testing write for InfluxDB v2

* fix: code style
2020-07-10 16:56:36 +02:00
Diefferson Koderer Môro
804cae02ee Fix get profiles checking if has ptz capabilities (#37176) 2020-07-10 10:13:16 -04:00
Paul Annekov
609bd6313a bump tuyaha 0.0.7 (#37709) 2020-07-10 14:56:21 +02:00
Joakim Plate
67038c6ba8 Rewrite rfxtrx init logic to do away with global object (#37699)
* Rewrite init logic to do away with global object

* Put constant at end

* Use a set instead of list for device_ids
2020-07-10 14:52:07 +02:00
Paulus Schoutsen
b45a952d61 Upgrade foobot-async (#37706) 2020-07-10 08:44:19 +02:00
mdegat01
e379bfe383 Revert "Updated influxdb-client dependency to 1.8.0" (#37396)" (#37697)
This reverts commit 9964bd40ed.
2020-07-10 05:05:55 +02:00
Aaron Bach
5f36023b9e Actually fix Guardian entity services (#37700)
* Actually fix Guardian entity services

* Bump aioguardian

* Remove upgrade_firmware defaults
2020-07-09 20:52:13 -06:00
HomeAssistant Azure
82739bac3b [ci skip] Translation update 2020-07-10 00:03:39 +00:00
Eugene Prystupa
69a8ba2af8 Add bond cover assumed state and local polling (#37666)
* Declare Bond covers as having assumed state, setup local polling for state updates

* Declare Bond covers as having assumed state, setup local polling for state updates (apply feedback from PR review)

* Declare Bond covers as having assumed state, setup local polling for state updates (apply feedback from PR review)

* Declare Bond covers as having assumed state, setup local polling for state updates (apply feedback from PR review)
2020-07-09 18:25:18 -05:00
Jelle Raaijmakers
ef254a1c3d Round time values in get_age() to better approximate the actual age (#37125) 2020-07-09 11:19:38 -07:00
Harryjholmes
511da9557b Change audio sample rate for apple watch homekit camera (#37637)
* Update type_cameras.py

* Apply suggestions from code review

Support both 24kHz and 16kHz sample rate

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

* Adjust formatting

* Reformat

Co-authored-by: J. Nick Koston <nick@koston.org>
2020-07-09 05:19:49 -10:00
Joakim Plate
bcd604eec2 Detect lingering threads after tests (#37270)
* Detect lingering threads after tests

* Make sure cast is setup before checking state

* Make sure we ask executors of old hass to shutdown

We are not waiting here, just hoping for the best

* Make sure all instances of hass and executors is stopped.

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

* Also apply hass stopping to scripts

* Adjust to changes how we set up executor

* Add new CoreState.stopped

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-07-09 16:15:14 +02:00
bsmappee
08fa701854 Smappee dependency update (#37680) 2020-07-09 13:03:23 +02:00
Pascal Vizeli
748ce05341 Python 3.8 on core Container (#37677) 2020-07-09 13:01:18 +02:00
Joakim Plate
a3310330f4 Split handling and application of event (#37665)
This way _handle_event can contain things available
when entity has been added to home assistant,
and _apply event can remain internal and used on init.
2020-07-09 11:40:37 +02:00
Paulus Schoutsen
aa39dede59 Merge pull request #37668 from home-assistant/rc 2020-07-08 22:50:16 -07:00
cgtobi
155a5f7c26 Add back Netatmo public weather sensors (#34401)
* Add public weather sensors back in

* Remove stale code

* Cleanup after before adding entities

* Fix pylint complaint

* Add test for options flow

* Change mode to listbox

* Update .coveragerc

* Address comments

* Don't process empty list

* Address comment

* Fix mistake

* Make signal unique

* Make string more unique

* Fix merge conflict
2020-07-09 06:39:33 +02:00
jduquennoy
af6a4bb6cf Refactor Enocean part 1 (#35927)
* First step of an EnOcean integration refactoring, including code reorganisation and support of a setup config flow

* Moved title to root of strings file

* Fixed pre-commit checks failures

* Fixed linter errors

* Updated formatted string format in logs

* Removed leftover comment

* Multiple changes after PR change requests.
Using an import flow for yaml config, removed unnecessary logs, added proper unload in __init__ and EnOceanDongle
Replaced config state machine by several flows.
Serial port validity check done in the EnOceanDongle class asynchronously, removed unique ID from config flow
Multiple cosmetic changes

* Multiple changes after PR change requests

* Added variable to store default value, as setdefault was caught returning None when the empty dict literal was passed as an argument

* Literal used directly

* Added tests for EnOcean config flows, changed static methods to bundle methods for bundle

* Updated variable name

* Added missing mock to test, replaced repeated magic strings by constants

* Changed imports to avoid an unused import warning from pylint on DOMAIN

* Adding pylint exception for unused import

* Added proper propagation of setup and unload to platforms, removed dead code, some syntax changes

* Removed setup_entry forwarding as the entities can only be configured using yaml

* Removed forwarding of unload

* Enabled code coverage for config flow only

* Clean up coveragerc

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2020-07-08 20:46:38 -04:00
Shulyaka
872140123d Add humidifier support to prometheus (#37112)
* Add humidifier support to promethease

* add humidifier dependency

* handle dependencies

* wrong place

* applied suggestions from code review

* fix typo

* Revert "wrong place"

This reverts commit 58e509d767.

* Revert "handle dependencies"

This reverts commit 74bd523e08.

* Revert "add humidifier dependency"

This reverts commit 8840b378e5.
2020-07-08 20:42:45 -04:00
Chris
3c7f729b15 OZW Usercodes update services.yaml with examples (#37667) 2020-07-08 17:33:04 -07:00
Paulus Schoutsen
81af0e2ada Bumped version to 0.112.4 2020-07-09 00:18:38 +00:00
J. Nick Koston
9be06d8be4 Increase slow setup logging to warning level (#37635)
When I fixed verbose logging in #36444, I did not
realize this would mean almost nobody would
see this now.
2020-07-09 00:18:31 +00:00
Robert Van Gorkom
2da64b03f3 Remove withings use of deprecated classes (#37611)
Adjusting in bed device class to occupancy.
2020-07-09 00:18:31 +00:00
Bas Nijholt
3ede54def9 Bump aiokef to v0.2.13 which fixes the device from becoming "Unavailable" (#37607) 2020-07-09 00:18:30 +00:00
Maciej Bieniek
3b56e75e1d Bump backend library for Dune HD integration (#37594) 2020-07-09 00:18:03 +00:00
starkillerOG
8f77cc2f7b Fix DenonAvr discovery of Denon DN-500AV (#37529)
* fix discovery of Denon DN-500AV

* fix discovery of Denon DN-500AV

* fix discovery of Denon DN-500AV

* fix typo

* bump denonavr to 0.9.4

* add ignored model test

* fix mistake in branch
2020-07-09 00:18:02 +00:00
bsmappee
cdb283319d Update Smappee integration with proper solar, voltage and reactive entities (#37407) 2020-07-09 00:18:01 +00:00
bsmappee
a30b5690f8 Place smappee supported configurations after device class (#37595) 2020-07-09 00:17:51 +00:00
therealryanbonham
aac65416ff Upgrade sonar to 0.2.3 (#37392)
Co-authored-by: Ryan Bonham <ryan@transparent-tech.com>
2020-07-09 00:16:44 +00:00
Sava Tshontikidis
af87168ca3 Add kwargs to send_magic_packet() service individually (#37387) 2020-07-09 00:16:43 +00:00
HomeAssistant Azure
251a1d6619 [ci skip] Translation update 2020-07-09 00:05:04 +00:00
Chris
fd65ce08c1 Add ozw usercode support (#37390) 2020-07-08 16:41:53 -07:00
Rami Mosleh
62477a3457 Use "next_state" attr instead of "post_pending" for ArmDisarm trait (#37325) 2020-07-08 16:38:42 -07:00
Ville Skyttä
a077c280c8 Convert syncthru to config flow and native SSDP discovery (#36690)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-07-08 16:38:16 -07:00
Erik Montnemery
fb3049d6a2 Set MQTT sensor to state unavailable when value expires (#36609) 2020-07-08 16:20:19 -07:00
Chris Talkington
fb420d5952 Apply more suggestions from bond code review (#37592)
* apply more suggestions from bond code review

* Update cover.py

* Update test_cover.py

* Update test_cover.py

* Update test_cover.py

* Update cover.py

* Update utils.py

* Update test_cover.py

* Update test_utils.py

* Delete test_utils.py

* Update cover.py

* Update test_cover.py

* Update test_cover.py
2020-07-08 16:28:53 -05:00
Sava Tshontikidis
c1de781a23 Add kwargs to send_magic_packet() service individually (#37387) 2020-07-08 14:25:21 -07:00
Aaron Bach
05f93f27df Fix missing Guardian service strings (#37659) 2020-07-08 14:51:42 -06:00
bsmappee
99c815bcbd Update Smappee integration with proper solar, voltage and reactive entities (#37407) 2020-07-08 13:45:01 -07:00
mdegat01
d60c52bbc7 Check buckets/dbs for validity during Influx sensor startup (#37391)
* Check buckets/dbs for validity during sensor startup

* Empty array instead of none
2020-07-08 15:37:43 -04:00
mdegat01
9964bd40ed Updated influxdb-client dependency to 1.8.0 (#37396) 2020-07-08 15:36:54 -04:00
Mikkel Pilehave Jensen
317bd8ffd2 Add preset modes to Touchline (#36054)
* Added preset modes.

* Flake8 passed.

* New and cleaner version.

* isort fixed?

* OrderedDict removed, constant OPERATION_LIST removed.

* ClimateDevice changed to ClimateEntity

* Two methods replaced with constants.

* Update homeassistant/components/touchline/climate.py

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

* Update homeassistant/components/touchline/climate.py

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

* Update homeassistant/components/touchline/climate.py

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

* All changes needed.

* Cleaned up

* Clean up

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2020-07-08 15:33:27 -04:00
Raman Gupta
572d5a09cd Vizio: when checking new host against existing config entry hosts, make check hostname aware (#37397)
* make ip check hostname aware

* add executor job for sync function doing IO and remove errant comma

* revert change to update new_data explicitly for options keys since it is already done later

* empty commit to retrigger CI
2020-07-08 15:31:41 -04:00
Alexander Hardwicke
368116d242 Give fan and remote components unique LED strings (#37605) 2020-07-08 15:29:51 -04:00
Erik Montnemery
550f9ba9b0 Modify cast tests to setup via cast integration (#37256)
* Improve tests

* Improve tests

* Don't start zeroconf from tests
2020-07-08 12:11:34 -07:00
Pascal Vizeli
b067e1deee Update azure-pipelines-wheels.yml for Azure Pipelines 2020-07-08 21:08:49 +02:00
Chris
aa8f3ad307 Add OZW support for set_config_parameter service (#37523)
* Add support for set_config_parameter service

* Adjusted elif to if

* More if/else cleanup

* More if/else cleanup

* Less nesting

* End loop properly

* Added byte type

* Convert break to return
2020-07-08 20:59:52 +02:00
Pascal Vizeli
03ce1f46f6 Update azure-pipelines-wheels.yml for Azure Pipelines 2020-07-08 18:30:34 +02:00
J. Nick Koston
4343e84ecf Increase slow setup logging to warning level (#37635)
When I fixed verbose logging in #36444, I did not
realize this would mean almost nobody would
see this now.
2020-07-08 15:57:07 +02:00
Raman Gupta
80890f0096 bump pyvizio version (#37644) 2020-07-08 07:24:31 -04:00
Pascal Vizeli
a58e428f48 Update azure-pipelines-wheels.yml for Azure Pipelines 2020-07-08 12:06:04 +02:00
Marcel van der Veldt
adc88deaa8 Fix ozw entities cleanup on node removal (#37630)
* fix hass cleanup on node removal

also detect removefailednode command to issue a full cleanup

* satisfy pylint
2020-07-08 09:52:03 +02:00
Paulus Schoutsen
ad025f0b3b Mark the example values as strings because that's what we expect (#37640) 2020-07-07 23:38:08 -07:00
Eugene Prystupa
90c308a393 fix erroneous dependency used by Bond integration (simplejson to json) (#37642) 2020-07-07 20:36:22 -05:00
HomeAssistant Azure
6fd756299e [ci skip] Translation update 2020-07-08 00:02:43 +00:00
Paulus Schoutsen
00182e7b9f Reduce log level of unknown discovered services (#37617) 2020-07-07 15:29:37 -07:00
J. Nick Koston
3871688dfb Fix homekit test mocking missed in loop changeover (#37628) 2020-07-07 15:14:58 -07:00
Pascal Vizeli
4c2b12d8f1 Update azure-pipelines-wheels.yml for Azure Pipelines 2020-07-07 23:39:51 +02:00
Jc2k
af7bf428d8 Bump aiohomekit to 0.2.41 (#37602) 2020-07-07 21:58:09 +01:00
Marcel van der Veldt
cbccf011e7 Ozw climate fixes (#37560)
* fix presets and mode conversion

* fix mapping issues in ozw climate

* build mapping table in advance

* Copying a dict to a list copies the keys by default
2020-07-07 16:20:57 -04:00
brefra
2b37cbe079 Change MediaPlayerDevice into MediaPlayerEntity (#37629) 2020-07-07 16:19:27 -04:00
Joakim Plate
d0983b69df Switch what is used for unique identifier (#37581)
* Switch what is used for device identifier

type_string can be changed if new device types are added based
on same driver.

* No need to slugify unique id
2020-07-07 21:50:19 +02:00
Franck Nijhof
d0632ab636 Fix sync/async override in sms (#37621) 2020-07-07 20:35:30 +02:00
Franck Nijhof
aeb0504c1c Fix acmeda syn/async cover methods (#37618) 2020-07-07 20:35:02 +02:00
Franck Nijhof
621c375a25 Remove dead code from cast (#37620) 2020-07-07 20:34:30 +02:00
Franck Nijhof
1499c0a563 Fix sync/async and small improvements to forked_daapd (#37619) 2020-07-07 20:08:22 +02:00
Robert Van Gorkom
09ee52c4cb Remove withings use of deprecated classes (#37611)
Adjusting in bed device class to occupancy.
2020-07-07 19:17:04 +02:00
Mateusz Soszyński
663acfe89f Add host names in esphome logs (#37587) 2020-07-07 19:15:45 +02:00
Franck Nijhof
07d7191db3 Add current temperature as separate sensor in Toon (#37336)
* Add current temperature as seperate sensor in Toon

* Set default enabled to False

* Trigger build
2020-07-07 10:06:24 -07:00
Franck Nijhof
c89c0d7824 Fix typos in Hue integration (#37597) 2020-07-07 09:33:37 -05:00
Franck Nijhof
0f5d300db4 Upgrade coverage to 5.2 (#37598) 2020-07-07 09:32:19 -05:00
Franck Nijhof
270e87166c Upgrade debugpy to 1.0.0b12 (#37599) 2020-07-07 09:31:33 -05:00
Bas Nijholt
50bb249a93 Bump aiokef to v0.2.13 which fixes the device from becoming "Unavailable" (#37607) 2020-07-07 09:30:20 -05:00
starkillerOG
3f1d25b9d0 Fix DenonAvr discovery of Denon DN-500AV (#37529)
* fix discovery of Denon DN-500AV

* fix discovery of Denon DN-500AV

* fix discovery of Denon DN-500AV

* fix typo

* bump denonavr to 0.9.4

* add ignored model test

* fix mistake in branch
2020-07-07 09:28:20 -05:00
bsmappee
6b97b4f5ac Place smappee supported configurations after device class (#37595) 2020-07-07 09:15:52 -05:00
J. Nick Koston
76be95d7e0 Make devices and activities visible as harmony attributes (#37559)
* Make devices and activities visibile as harmony attributes

* Allow restoring previous activity, add tests

* fix test

* Kill activity_notify with fire

* remove trailing ,
2020-07-07 09:02:22 -05:00
Pascal Vizeli
ae7d464878 Update azure-pipelines-wheels.yml for Azure Pipelines 2020-07-07 13:19:25 +02:00
Martin Eberhardt
a58e357cd5 Update Rejseplanen rjpl to 0.3.6 (#37215) 2020-07-07 10:07:50 +02:00
Maciej Bieniek
43c7a8a119 Bump backend library for Dune HD integration (#37594) 2020-07-07 09:09:13 +02:00
jjlawren
7128092139 Fix missing Plex account mocks in tests (#37591) 2020-07-06 22:58:43 -07:00
Paulus Schoutsen
16ccf0affd Bump voluptuous-serialize 2.4.0 (#37241)
* Bump voluptuous-serialize 2.4.0

* Add constant to demo

* gen reqs
2020-07-06 20:04:35 -07:00
Eugene Prystupa
e5872cc0e4 apply small feedback suggestions from a previous PR that is already merged (#37551) 2020-07-06 20:09:56 -05:00
J. Nick Koston
27ef8a1ced Ensure homekit accessory reset only affect the bridges with the accessory (#37588) 2020-07-06 17:27:25 -07:00
J. Nick Koston
bea3d841d2 Mock setup in plex test to prevent CI failure (#37590) 2020-07-06 17:25:22 -07:00
HomeAssistant Azure
0426b70046 [ci skip] Translation update 2020-07-07 00:17:49 +00:00
Paulus Schoutsen
c47fd90eb3 Fix loop exception handler 2020-07-07 00:00:46 +00:00
Paulus Schoutsen
a773534809 Merge pull request #37586 from home-assistant/rc 2020-07-06 16:42:07 -07:00
akloeckner
d0668d3a6c Add optimistic mode to template switch (#31637) 2020-07-06 16:32:33 -07:00
Paulus Schoutsen
f49ce5d1b4 Protect loop set default executor (#37438)
Co-authored-by: J. Nick Koston <nick@koston.org>
2020-07-06 15:58:53 -07:00
Paulus Schoutsen
e5a2b0d2d8 Bumped version to 0.112.3 2020-07-06 22:36:05 +00:00
Paulus Schoutsen
7ba9bcebed Fix CODEOWNERS 2020-07-06 22:35:38 +00:00
starkillerOG
3bd5d83c9c Ignore HEOS 1, 3, 5 and 7 for DenonAvr ssdp discovery (#37579) 2020-07-06 22:21:13 +00:00
jjlawren
0f3b7b73af Fix Plex client controls when connected via plex.tv resource (#37572) 2020-07-06 22:21:13 +00:00
J. Nick Koston
38d2410156 Ensure homekit tv names can be saved (#37571) 2020-07-06 22:21:12 +00:00
J. Nick Koston
82693d9dca Suppress spurious homekit warning about media player sources when the device is off (#37567) 2020-07-06 22:21:11 +00:00
Bram Kragten
a88ac1e1fc Update frontend to 20200702.1 (#37566) 2020-07-06 22:21:11 +00:00
Sean Mooney
37bef01f67 Fix default icon for Withings sleep sensor (#37502)
The icon for Withings sleep sensor was using `mdi:bed` (which is correct for MDI v5.0.45 and later). However Home Assistant still uses an older version of Material Design Icons (4.9.95), so this `mdi:bed` icon was not displaying at all.  It should be`mdi:hotel` instead, which you can see here: https://cdn.materialdesignicons.com/4.9.95/
2020-07-06 22:21:10 +00:00
David Nielsen
7c3e64673f Fix braviatv authentication refresh (#37482)
- Bumps bravia-tv lib to 1.0.6 which fixes is_connected() to actually
      return True only when API is connected, instead of just returning whether
      or not cookies are cached (regardless if they actually worked).
    - Wrap is_connected() because it now performs io.
    - Remove unnecessary logic to refresh cookies. Now that
      is_connected() works, the bravia instance only needs to be
      reconnected when is_connected is False and TV is not off.
2020-07-06 22:20:57 +00:00
Martin
16b59220f3 Fix base class for ViCare binary sensor to remove warning (#37478) 2020-07-06 22:19:58 +00:00
Erik Montnemery
050a558243 Fix base topic for 'topic' (#37475) 2020-07-06 22:19:57 +00:00
Rami Mosleh
ddb049e884 Stop Speedtest sensors update on startup if manual option is enabled (#37403)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-07-06 22:19:57 +00:00
J. Nick Koston
891640972b Ensure removed entities are not displayed in logbook (#37395) 2020-07-06 22:19:56 +00:00
J. Nick Koston
2e824f3fa5 Ensure logbook performs well when filtering is configured (#37292) 2020-07-06 22:19:55 +00:00
J. Nick Koston
4ca643342e Move logbook continuous domain filtering to sql (#37115)
* Move logbook continuous domain filtering to sql

sensors tend to generate a significant amount of states
that are filtered out by logbook.  In testing 75% of
states can be filtered away in sql to avoid the
sqlalchemy ORM overhead of creating objects that will
be discarded.

* remove un-needed nesting
2020-07-06 22:19:54 +00:00
Rami Mosleh
f8651d9faa Stop Speedtest sensors update on startup if manual option is enabled (#37403)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-07-06 15:18:56 -07:00
Erik Montnemery
b826970b16 Fix base topic for 'topic' (#37475) 2020-07-06 15:17:13 -07:00
jjlawren
ba356c41e0 Fix Plex client controls when connected via plex.tv resource (#37572) 2020-07-06 15:16:41 -07:00
starkillerOG
b9f97e64f8 Ignore HEOS 1, 3, 5 and 7 for DenonAvr ssdp discovery (#37579) 2020-07-06 15:16:21 -07:00
J. Nick Koston
89599bc3cf Ensure homekit tv names can be saved (#37571) 2020-07-06 14:28:55 -07:00
J. Nick Koston
c989f6dc09 Suppress spurious homekit warning about media player sources when the device is off (#37567) 2020-07-06 14:28:26 -07:00
Bram Kragten
706bc4c307 Update frontend to 20200702.1 (#37566) 2020-07-06 19:24:22 +02:00
Ville Skyttä
c9a97da0ef Strings capitalization consistency fixes (#37454) 2020-07-06 09:59:57 -07:00
Pascal Vizeli
b3d46aa074 Wheels for Python 3.8 / Alpine 3.12 2020-07-06 16:41:51 +02:00
dependabot[bot]
4a28133f11 Bump codecov/codecov-action from v1 to v1.0.10 (#37556)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from v1 to v1.0.10.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Commits](https://github.com/codecov/codecov-action/compare/v1...f3570723ef743f6942b6a480461ed0cd6c0f9baa)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-07-06 16:12:12 +02:00
dependabot[bot]
308421f1d6 Bump actions/upload-artifact from v1 to v2.0.1 (#37555)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from v1 to v2.0.1.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v1...97b7dace6c8d860ce9708aba808be6a2ee4cbc3a)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-07-06 16:11:43 +02:00
Franck Nijhof
03bfff3660 Add dependabot for automatic updates to GitHub Actions (#37550) 2020-07-06 15:05:58 +02:00
Joakim Sørensen
0fb73a6332 Add missing manifest object to the check (#37535) 2020-07-06 11:21:40 +02:00
J. Nick Koston
711b8e10a3 Switch homekit to use async_track_state_change_event (#37253)
* Switch homekit to use async_track_state_change_event

Calling async_track_state_change_event directly
is faster than async_track_state_change and has
slightly lower latency triggering state updates
in homekit

* check for deleted entities

* Update additional tests for linked sensor removals

* Ensure removing entities does not result in an exception
2020-07-05 19:05:13 -07:00
Eugene Prystupa
9b77e16ffc Add new integration for Bond hub (#37477)
* create foundation for Bond integration

* add Bond hub integration (fix lint)

* Update homeassistant/components/bond/__init__.py

adding async_unload_entry per PR review suggestion

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* add Bond hub integration (fix missing import after applying PR suggestion)

* Update tests/components/bond/test_init.py

add a unit for unloading per PR review suggestion

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update tests/components/bond/test_init.py

add unit test for unload per PR review suggestion

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update tests/components/bond/test_init.py

PR review suggestion

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update tests/components/bond/test_init.py

PR review suggestion

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update tests/components/bond/test_init.py

PR review suggestion

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* add Bond hub integration (fix formatting)

* Update homeassistant/components/bond/manifest.json

PR suggestion

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/bond/manifest.json

PR suggestion

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/bond/manifest.json

PR suggestion

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/bond/strings.json

PR suggestion

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/bond/manifest.json

PR suggestion

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update requirements_all.txt

PR suggestion

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/bond/manifest.json

PR suggestion

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update requirements_test_all.txt

PR suggestion

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* add Bond hub integration (remove friendly name from config per PR suggestion)

* Update homeassistant/components/bond/__init__.py

add per PR review feedback

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/bond/__init__.py

remove per PR review feedback

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update tests/components/bond/test_init.py

fix unit test

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

Co-authored-by: Chris Talkington <chris@talkingtontech.com>
2020-07-05 20:17:53 -05:00
HomeAssistant Azure
6749424508 [ci skip] Translation update 2020-07-06 00:02:55 +00:00
Phil Bruckner
f6f84fc201 Add Amcrest audio_detected binary sensor (#37486) 2020-07-05 18:54:17 -04:00
J. Nick Koston
34ccb6588c Cleanup async_track_state_change and augment docstring (#37251)
* Cleanup async_track_state_change and augment docstrings.

Skip from_state and to_state matching in
async_track_state_change when they are None

Optimize the state change listener for the most
common use case: no to_state and from_state
matching.

* Update benchmark to be more realistic (previously we assumed only one entity was present in the whole instance)

* Add more tests to ensure behavior is preserved

* Ensure new behavior matches test

* remove MATCH_ALL from zone automation since its the default anyways

* Might as well use async_track_state_change_event instead since MATCH_ALL is removed
2020-07-05 17:31:33 -05:00
Joakim Plate
2088092f7c Switch rfxtrx to dispatcher (#37271)
* Switch to dispatcher

* Adjust tests for dispatcher

* Store device in sensor

* Move state application into binary sensor entity class

* Move more specifics into per platform classes

* Should not apply event in init of sensor

* Switch to call_later

* Make apply_event public

* No point in slugifying debug logs

* Adjust error in off delay and event

* Make sure we match with masked id
2020-07-06 00:10:26 +02:00
Aaron Bach
0067b6a84d Transition Guardian to use a DataUpdateCoordinator (#37380)
* Migrate Guardian to use the DataUpdateCoordinator

* Finish work

* Cleanup

* Don't use UpdateFailed error

* Code cleanup

* Code cleanup

* Remove unnecessary change

* Code review

* Code review

* Use a subclass of DataUpdateCoordinator

* Make sure to pop client upon unload

* Adjust coverage
2020-07-05 16:09:40 -06:00
Franck Nijhof
80c108c25a Fix flake8 problem matcher to handle fatals as errors (#37536) 2020-07-05 23:25:18 +02:00
Franck Nijhof
53545c984b Log lines do not end with a full stop (#37527) 2020-07-05 23:04:19 +02:00
Joakim Plate
01fd33f173 Switch tests to use hass objects instead of direct (#37530)
* Switch tests to use hass objects instead of direct

* Make sure sensor update state

* Add some initial binary sensor tests

* Add initial binary sensor tests

* Add tests for pt2262

* Add test for off delay
2020-07-05 22:41:11 +02:00
starkillerOG
3ad59f877c Fix xiaomi_miio error when no sensors present (#37531) 2020-07-05 13:06:28 -07:00
J. Nick Koston
c1aaceebb6 Use async_track_state_change_event for automation numeric_state (#37255)
Calling async_track_state_change_event directly
is faster than async_track_state_change (see #37251) and has
slightly lower latency triggering state updates
2020-07-05 13:05:53 -07:00
jfearon
404b1f40d6 Tado climate entity timer service (#37472)
* New entity service to allow timer to be set on tado climate entities

* Add new line to end of yaml
2020-07-05 14:43:52 -05:00
Baptiste Candellier
3062312649 Add config flow + async support for SmartHab integration (#34387)
* Setup barebones SmartHab config flow

* Setup authentication flow

* Make setup async, add config flow receivers

* Add French translation

* Fix async issues

* Address review comments (thanks bdraco!)

* Fix unloading entries

* Migrate translations dir according to warning

* Create list of components

* Fix pylint false positive

* Fix bad copy-pastes 🤭

* Add async support to SmartHab component

* Address review comments (bdraco)

* Fix pylint

* Improve exception handling (bdraco)

* Apply suggestions from code review (bdraco)

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

* Don't log exceptions manually, fix error

* Reduce repeated lines in async_step_user (bdraco)

* Remove useless else (pylint)

* Remove broad exception handler

* Create strings.json + remove fr i18n

* Write tests for smarthab config flow

* Test import flow

* Fix import test

* Update homeassistant/components/smarthab/config_flow.py

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

Co-authored-by: J. Nick Koston <nick@koston.org>
2020-07-05 14:20:51 -05:00
Jeff Irion
10893f6246 Convert Android TV integration to async (#37510)
* Convert Android TV integration to async

* pylint

* Remove unused test code

* Require async versions of androidtv and adb-shell

* Cleanup

* Remove commented out code

* Use constants SHELL_RESPONSE_OFF and SHELL_RESPONSE_STANDBY
2020-07-05 14:13:08 -05:00
RogerSelwyn
e3aa4679a0 Standardis asuswrt error message level (#37515) 2020-07-05 13:21:21 -05:00
RogerSelwyn
d79067db7e Standardise geniusheub error levels (#37512) 2020-07-05 13:11:07 -05:00
J. Nick Koston
f0dda4f875 Fix flapping demo geo_location test (#37516) 2020-07-05 12:55:44 -05:00
Rick Sherman
b56f4bd9f8 Fix Datadog boolean metrics (#37273)
Explicitly cast boolean metrics to integers
2020-07-05 12:50:51 -05:00
starkillerOG
992793295c Add denonavr solution tip for connection_error (#37405)
* denonavr: add solution tip for connection_error

see https://github.com/home-assistant/core/issues/37351#issuecomment-653356452

* Update en.json

* Update strings.json
2020-07-05 12:46:46 -05:00
J. Nick Koston
debb928b30 Use the main event loop for homekit (#37441)
* use hass.loop for homekit

* update calls for upstream pr

* Bump HAP-python to 2.9.2
2020-07-05 12:27:07 -05:00
Anton Tolchanov
6ca476fe21 Add prometheus metric naming guidelines (#37149)
* Add prometheus metric naming guidelines.

* Update homeassistant/components/prometheus/README.md

Co-authored-by: Martin Weinelt <mweinelt@users.noreply.github.com>

Co-authored-by: Martin Weinelt <mweinelt@users.noreply.github.com>
2020-07-05 19:00:37 +02:00
J. Nick Koston
b64ae55c66 Prebake common history queries (#37496)
* Prebake common history queries

The python overhead of to construct
the queries exceeded the database overhead.  We now
prebake the queries that get frequently polled.

This reduces the time it takes to update history_stats
sensors and can make quite a difference if there
are a lot of them.

When using the mini-graph-card card, all the entities
on the card being graphed are queried every few seconds
for new states. Previously this would tie up the database if there
are lot of these graphs in the UI.

* Update homeassistant/components/history/__init__.py

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

* Update homeassistant/components/history/__init__.py

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

* cache entity_filter in the lambda

* switch to yield

* Revert "switch to yield"

This reverts commit f8386f4940.

* get_states always returns a list

* query wasnt actually reusable so revert part of the breakout

Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-07-05 11:03:23 -05:00
michaeldavie
8bc775dacc Bump env_canada to 0.1.0 (#37483) 2020-07-05 17:10:32 +02:00
Jürgen Haas
988a335e9d Do not count netdata cleared and undefined alarms as warnings (#37505)
* Add NetdataAlarms alarm sensor to additionally collect alarm information from the netdata host

* Incorporate suggested changes by @MartinHjelmare

* Change from pictures to icons

* Simplify API callbacks following home-assistant-ecosystem/python-netdata/pull/5 and home-assistant-ecosystem/python-netdata/pull/6

* Bring back lost empty line

* Update the library version in manifest.json

* Update the library version in requirements_all.txt

* Linting

* Linting

* Fix typo

* Do not count cleared and undefined alarms as warnings

* Do not count cleared, undefined and uninitialized alarms as warnings
2020-07-05 17:06:04 +02:00
Phil Bruckner
f7c4900d5c Enhance automation integration to use new features in script helper (#37479) 2020-07-05 09:25:15 -05:00
Franck Nijhof
c3b5bf7437 GitHub Actions: Add pytest problem matcher (#37508) 2020-07-05 14:10:42 +02:00
David Nielsen
a08cb2ca9d Fix braviatv authentication refresh (#37482)
- Bumps bravia-tv lib to 1.0.6 which fixes is_connected() to actually
      return True only when API is connected, instead of just returning whether
      or not cookies are cached (regardless if they actually worked).
    - Wrap is_connected() because it now performs io.
    - Remove unnecessary logic to refresh cookies. Now that
      is_connected() works, the bravia instance only needs to be
      reconnected when is_connected is False and TV is not off.
2020-07-05 12:02:45 +02:00
Sean Mooney
a882cfafb1 Fix default icon for Withings sleep sensor (#37502)
The icon for Withings sleep sensor was using `mdi:bed` (which is correct for MDI v5.0.45 and later). However Home Assistant still uses an older version of Material Design Icons (4.9.95), so this `mdi:bed` icon was not displaying at all.  It should be`mdi:hotel` instead, which you can see here: https://cdn.materialdesignicons.com/4.9.95/
2020-07-05 11:28:05 +02:00
Ville Skyttä
3d08601796 Use package constraints in tox lint (#37500)
Otherwise fails with
pip._vendor.pkg_resources.ContextualVersionConflict: (importlib-metadata
1.7.0 (.../.tox/lint/lib/python3.7/site-packages),
Requirement.parse('importlib-metadata==1.6.0'), {'homeassistant'})
2020-07-05 11:04:00 +02:00
Ville Skyttä
63af60c7e7 Upgrade flake8 to 3.8.3 (#37501)
https://flake8.pycqa.org/en/latest/release-notes/3.8.2.html
https://flake8.pycqa.org/en/latest/release-notes/3.8.3.html
2020-07-05 11:03:22 +02:00
J. Nick Koston
93df0a6d70 Fix flapping geonetnz_volcano test (#37497) 2020-07-04 19:06:42 -07:00
Franck Nijhof
ff3407ea25 GitHub Actions: Show diff on failure (#37461) 2020-07-04 17:19:46 -07:00
Franck Nijhof
79fb722657 GitHub Actions: Add flake8 problem matcher (#37465) 2020-07-04 17:19:00 -07:00
Franck Nijhof
3eb6e75d3e GitHub Actions: Add yamllint problem matcher (#37468)
* GitHub Actions: Add yamllint problem matcher

* Introduce YAML issue to test problem matcher

* Revert "Introduce YAML issue to test problem matcher"

This reverts commit fa88c9484e.
2020-07-04 17:05:14 -07:00
Franck Nijhof
6d6188e34d GitHub Actions: Add mypy problem matcher (#37485) 2020-07-04 17:04:39 -07:00
Franck Nijhof
fa6bd786d2 GitHub Actions: Add check executables problem matcher (#37488)
* GitHub Actions: Add check executables problem matcher

* Create a problem for testing

* Revert "Create a problem for testing"

This reverts commit 3532b3777f.
2020-07-04 17:04:25 -07:00
HomeAssistant Azure
c6ed7754c7 [ci skip] Translation update 2020-07-05 00:02:52 +00:00
Franck Nijhof
b4aa6f9f8b GitHub Actions: Add pylint problem matcher (#37463)
* GitHub Actions: Add pylint problem matcher

* Create a pylint issue to test

* Create another pylint issue to test

* Register problem matcher in same step

* Apply possible workaround

* Disable problem matcher to catch raw output

* Trying again with new CI containers

* Extend problem matcher with errors and warnings

* Improve matching, keep error code in message

* Revert "Create another pylint issue to test"

This reverts commit a90e23656e.

* Revert "Create a pylint issue to test"

This reverts commit 9dd5148eb4.

* Fix stable name in job description
2020-07-04 17:00:51 -07:00
Franck Nijhof
c71fcc8cbb GitHub Actions: Add json problem matcher (#37490)
* GitHub Actions: Add json problem matcher

* Create a problem for testing

* Revert "Create a problem for testing"

This reverts commit d7735e4af3.
2020-07-04 16:59:41 -07:00
Franck Nijhof
83b41897f8 GitHub Actions: Add codespell problem matcher (#37487)
* GitHub Actions: Add codespell problem matcher

* Add some spelling issues for test

* Disable color, might throw off matcher

* Revert "Add some spelling issues for test"

This reverts commit 3afb59c8d9.
2020-07-04 16:59:22 -07:00
Franck Nijhof
c630037f04 GitHub Actions: Add hadolint problem matcher (#37494) 2020-07-04 16:59:02 -07:00
Shulyaka
5ba38e5053 Add humidifier support to emulated_hue (#37110)
* Add humidifier support to emulated_hue

* add humidifier dependency

* move dependency to after_dependency

* move dependency to hassfest
2020-07-04 17:53:36 -05:00
Martin
95d980da4a Fix base class for ViCare binary sensor to remove warning (#37478) 2020-07-04 19:39:45 +02:00
Franck Nijhof
7b855927e2 Fix flapping google_assistant tests (#37480) 2020-07-04 19:33:26 +02:00
Erik Montnemery
b63655057c Publish birth and will messages by default (#37371)
* Publish birth and will messages by default

* Remove useless copy
2020-07-04 17:49:08 +02:00
Erik Montnemery
4b3ad0a1cd Support multiple MQTT availability topics (#37418)
* Support multiple MQTT availability topics

* Make availability list and availability_topic exclusive

* Make availability list and availability_topic exclusive

* Add missing abbreviation
2020-07-04 17:48:34 +02:00
Erik Montnemery
9ade1de3d5 Support empty output of MQTT binary_sensor value_template (#37420)
* Support empty output of MQTT binary_sensor value_template

* Strip white space

* Add test

* Add test
2020-07-04 17:48:02 +02:00
Tim van Cann
333c151955 Call sync function from async context (#37324) 2020-07-04 10:47:12 -05:00
Erik Montnemery
ebcee2eb35 Fix geonetnz_quakes test flapping (#37473) 2020-07-04 17:42:28 +02:00
Franck Nijhof
15b28bda14 Fix flapping geo_json_events tests (#37471) 2020-07-04 17:21:37 +02:00
J. Nick Koston
c03832da63 Fix entity_component test flapping (#37445) 2020-07-04 16:55:44 +02:00
starkillerOG
ffcdd85117 Xiaomi Gateway subdevice support & AqaraHT + SensorHT devices (#36539)
* Gateway subdevice support & AqaraHT + SensorHT devices

* Gateway subdevice support & AqaraHT + SensorHT devices

* Add starkillerOG to codeowners

as proposed by @rytilahti in this issue: https://github.com/home-assistant/core/issues/36516

* add starkillerOG to xiaomi_miio

* fix config flow tests

* Update CODEOWNERS

* Update manifest.json

* prosess revieuw comments

* fix missing import

* use proper pressure unit hPa

* subdevice --> sub_device

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

* subdevice --> sub_device

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

* use key acces instead of get

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

* subdevice --> sub_device

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

* subdevice --> sub_device

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

* subdevice --> sub_device

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

* subdevice --> sub_device

* use dataclass instead of namedtuple

* update to newest python-miio functions (not yet released)

* Move device info to entitie

* remove unused variable

* improve default names

* SensorHT does not support pressure

* bump python-miio to 0.5.2

* bump python-miio to 0.5.2

* bump python-miio to 0.5.2

* Fix missing brackets

Co-authored-by: Teemu R. <tpr@iki.fi>

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Teemu R. <tpr@iki.fi>
2020-07-04 14:56:16 +02:00
Tom
0b11fda017 Fix Plugwise zeroconf discovery formatting (#37457) 2020-07-04 11:12:05 +02:00
Ville Skyttä
3832c8efd9 Remove pytest-xdist from tox now that it's in requirements_test.txt (#37455) 2020-07-04 10:03:29 +02:00
Chris Talkington
6fd8a7a34e Use device class to isolate tesla battery icon (#37446) 2020-07-03 23:10:04 -07:00
J. Nick Koston
4b2ebf5487 Ensure removed entities are not displayed in logbook (#37395) 2020-07-03 23:08:46 -07:00
J. Nick Koston
045cdee30c Avoid selecting the states created column for history (#37450)
We never use the data for history.  We should
not select it as it created unneeded overhead.
2020-07-03 23:04:11 -07:00
Paulus Schoutsen
b76d7edf74 Merge pull request #37443 from home-assistant/rc 2020-07-03 22:14:46 -07:00
HomeAssistant Azure
146b5691e7 [ci skip] Translation update 2020-07-04 00:03:02 +00:00
Justin Berstler
fe5f8e041b Use a more detailed battery icon for Tesla cars (#37154)
Use the icon_for_battery_level helper to select a battery icon that indicates charge level and whether or not the battery is actively charging.
2020-07-03 18:36:26 -05:00
Nolan Gilley
13f634fa16 Upgrade python-join-api to allow user to specify actions (#37394) 2020-07-03 17:55:58 -05:00
RogerSelwyn
7c0d5526f3 Fix DarkSky spamming the log (#37421)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-07-03 15:49:45 -07:00
smugleafdev
780376e411 Fix extremely minor typo: Cosumption -> Consumption (#37322) 2020-07-03 17:47:19 -05:00
Paulus Schoutsen
18c16c464e Bumped version to 0.112.2 2020-07-03 22:43:02 +00:00
Alan Tse
30e980d389 Bump teslajsonpy to 0.9.2 (#37434)
* Bump teslajsonpy to 0.9.1
closes #37340

* Bump teslajsonpy to 0.9.2
2020-07-03 22:42:54 +00:00
Teemu R
e3d3b87f2e Bump python-miio to 0.5.2.1 (#37422) 2020-07-03 22:42:53 +00:00
Aaron Bach
032a6f3143 Bump pytile to 4.0.0 (#37398) 2020-07-03 22:42:52 +00:00
J. Nick Koston
d7ecbb8ebe Ensure logbook entries appear when the logbook.log (#37388)
service without a domain or entity_id
2020-07-03 22:42:51 +00:00
J. Nick Koston
ed086e5200 Handle index already existing on db migration with MySQLdb backend (#37384)
_create_index needed the same check as _add_columns since
the MySQLdb backend throws OperationalError instead
of InternalError in this case
2020-07-03 22:42:51 +00:00
Erik Montnemery
08ebc4ce62 Don't print MQTT credentials to log (#37364) 2020-07-03 22:42:50 +00:00
Chris Talkington
1879183b24 Apply some suggestions from poolsense code review (#37440) 2020-07-03 15:38:05 -07:00
J. Nick Koston
ccb77ba1e9 Handle index already existing on db migration with MySQLdb backend (#37384)
_create_index needed the same check as _add_columns since
the MySQLdb backend throws OperationalError instead
of InternalError in this case
2020-07-03 15:35:02 -07:00
Teemu R
7da3065de6 Bump python-miio to 0.5.2.1 (#37422) 2020-07-03 15:32:23 -07:00
Chris Talkington
813e60d31a Mock setup in directv config flow tests (#37439)
* mock setup in directv config flow tests

* Update test_config_flow.py
2020-07-03 17:31:57 -05:00
Alan Tse
1b70ea0c3f Bump teslajsonpy to 0.9.2 (#37434)
* Bump teslajsonpy to 0.9.1
closes #37340

* Bump teslajsonpy to 0.9.2
2020-07-03 17:29:11 -05:00
Bouwe Westerdijk
d57dbb4319 Add Plugwise zeroconf discovery (#37289)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
Co-authored-by: Tom Scholten <tom@sue.nl>
Co-authored-by: Tom <CoMPaTech@users.noreply.github.com>
2020-07-03 15:28:34 -07:00
Eugene Prystupa
80aebcc7d2 Add more unit tests for plum_lightpad (#37275)
* add more unit tests for plum_lightpad

* add more unit tests for plum_lightpad

* add more unit tests for plum_lightpad

* add more unit tests for plum_lightpad

* Update tests/components/plum_lightpad/test_init.py

apply suggested way to invoke async_setup_entry

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update tests/components/plum_lightpad/test_init.py

apply suggested way to invoke async_setup_entry

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update tests/components/plum_lightpad/test_init.py

apply suggested way to invoke async_setup_entry

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update tests/components/plum_lightpad/test_init.py

remove now unused import

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update tests/components/plum_lightpad/test_init.py

import Mock from tests.async_mock as suggested

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update tests/components/plum_lightpad/test_init.py

remove now unused import

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update tests/components/plum_lightpad/test_init.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* fix unit tests that were failing after suggested changes

Co-authored-by: Chris Talkington <chris@talkingtontech.com>
2020-07-03 16:40:17 -05:00
J. Nick Koston
76b956a969 Mock setup in sonarr config flow tests (#37432) 2020-07-03 16:20:17 -05:00
Franck Nijhof
1aafa459e5 Fix building of Python Wheels (#37433) 2020-07-03 21:33:35 +02:00
Paulus Schoutsen
e33a3bb94a Stub out ecobee aux heat services (#37423) 2020-07-03 21:04:13 +02:00
J. Nick Koston
07f3d6ebd8 Fix unmocked setup in ipp tests (#37430) 2020-07-03 11:43:13 -07:00
J. Nick Koston
c460b7abc9 Fix unmocked setup in garmin_connect test (#37429) 2020-07-03 11:42:56 -07:00
Paulus Schoutsen
5805fbb99f Merge remote-tracking branch 'origin/master' into dev 2020-07-03 18:39:38 +00:00
ktnrg45
a445ebdf3c Fix undesired power toggling (#37427) 2020-07-03 11:34:11 -07:00
J. Nick Koston
78e53e35c2 Prevent verisure lock from looping forever and sleeping in test (#37425) 2020-07-03 11:33:12 -07:00
Paulus Schoutsen
0c771f1c42 Replace asynctest with tests.async_mock (#37428) 2020-07-03 11:29:35 -07:00
Kevin Eifinger
eb66da6436 Add helpers.location.coordinates (#37234) 2020-07-03 11:28:44 -07:00
J. Nick Koston
3eb6a68d12 Ensure async_setup is mocked in geonetnz intergration tests (#37426)
* Ensure async_setup is mocked in geonetnz intergration tests

* s/asynctest/tests.async_mock/g
2020-07-03 11:14:19 -07:00
Erik Montnemery
cd5f6a0c56 Don't print MQTT credentials to log (#37364) 2020-07-03 11:01:22 -07:00
J. Nick Koston
ab6d6ac1ce Reduce time to run zha discover tests (#37424)
Most of the time was registering services and patching
the clusters which are never calls in these tests
2020-07-03 12:57:04 -05:00
Franck Nijhof
573134fcb4 Add GitHub Actions for CI (#37419)
* Add GitHub Actions for CI

* Add base/full to step descriptions
2020-07-03 19:18:01 +02:00
therealryanbonham
5ecb3f9be2 Upgrade sonar to 0.2.3 (#37392)
Co-authored-by: Ryan Bonham <ryan@transparent-tech.com>
2020-07-03 13:59:30 +02:00
Joakim Plate
ab4687d914 Convert rfxtrx tests to pytest async tests and re-enable (#37206)
* Rework and re-enable rfxtrx tests

* Add missed change to _signal_event

* Fixup the dummy serial that causes max cpu

* Make sure we cleanup thread here too

* Make sure we always wait for tasks before we check state

* Some more places we need to wait before checking
2020-07-03 10:22:02 +02:00
Robbie Trencheny
b859be8cea Remove my codeownership over things I dont use anymore (#37401) 2020-07-03 09:41:23 +02:00
Aaron Bach
187a20288b Bump pytile to 4.0.0 (#37398) 2020-07-02 23:07:54 -06:00
J. Nick Koston
7e664fbb3b Ensure logbook entries appear when the logbook.log (#37388)
service without a domain or entity_id
2020-07-02 19:53:28 -05:00
mdegat01
91799e2b52 Modified Influx tests to mock test queries with accurate output (#37315) 2020-07-02 17:52:46 -07:00
Martin Hjelmare
98bcf4f28d Fix ozw garage door methods (#37374) 2020-07-02 17:23:45 -07:00
HomeAssistant Azure
a6fb9e6100 [ci skip] Translation update 2020-07-03 00:03:38 +00:00
J. Nick Koston
f352c51990 Improve unifi device tracker performance (#37308)
* Improve unifi device tracker performance

The unifi websocket sends an update every second
which generates a significant amount of state
changed updates.

Avoid creating callback functions when they
are not going to be used.

* make _no_heartbeat/_make_disconnected instance methods

* remove extra empty line

* revert is_wired change

* remove extra line
2020-07-02 17:46:37 -05:00
Paulus Schoutsen
460bd2b3bb Merge pull request #37377 from home-assistant/rc 2020-07-02 14:46:19 -07:00
Paulus Schoutsen
ec690bb369 Bumped version to 0.112.1 2020-07-02 20:15:44 +00:00
starkillerOG
16dae8457a Add DenonAvr missing error message (#37370) 2020-07-02 20:11:54 +00:00
Bram Kragten
38599d2970 Update frontend to 20200702.0 (#37369) 2020-07-02 20:11:53 +00:00
Robert Van Gorkom
5013b7e049 Fix withings bug that grabbed oldest value instead of the newest (#37362)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-07-02 20:11:52 +00:00
uvjustin
b21c81656f Use entry.data.get() in forked_daapd config_flow as some entries miss… (#37359) 2020-07-02 20:11:52 +00:00
Robert Van Gorkom
69a5c63b71 Fix gogogate2 issue where non-admin users could not login (#37353) 2020-07-02 20:11:51 +00:00
Markus Bong
9b854bdcd3 Fix devolo sensor subscriber (#37337) 2020-07-02 20:11:50 +00:00
bsmappee
f335127750 Smappee dependency update (#37331) 2020-07-02 20:11:49 +00:00
Courtenay
9131f5fa69 Change log url in config check error notification (#37311) 2020-07-02 20:11:49 +00:00
John Hollowell
976d375a33 Update proxmoxve integration to correctly renew authentication (#37016) 2020-07-02 20:11:48 +00:00
starkillerOG
094f7ee718 Add DenonAvr missing error message (#37370) 2020-07-02 13:10:38 -07:00
Robert Van Gorkom
a7cf76491b Fix withings bug that grabbed oldest value instead of the newest (#37362)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-07-02 13:09:49 -07:00
Bram Kragten
58a9142f42 Update frontend to 20200702.0 (#37369) 2020-07-02 12:53:16 -07:00
Chris
f6df85f8ce Add ozw garage door barrier support (#37316) 2020-07-02 21:29:09 +02:00
Franck Nijhof
4679e670f1 Upgrade pre-commit to 2.6.0 (#37339) 2020-07-02 13:47:09 -05:00
J. Nick Koston
f3039f96ec Fix flapping gdacs tests (#37363) 2020-07-02 13:45:57 -05:00
Shulyaka
4ec71c58bd Add humidifier support to homekit (#37207)
* Add humidifier support to homekit

* spell

* dependencies

* lint

* add linked humidity sensor for humidifiers

* Apply suggestions from code review

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

* apply suggestions from code review

* pylint

* Fix tests

* Update homeassistant/components/homekit/type_humidifiers.py

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

* Update tests/components/homekit/test_homekit.py

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

* Apply suggestions from code review

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

* apply suggestions from code review

* lint

* pylint

* push

* test for unavailable linker sensor

* black

* valid values key case

* black

* Update homeassistant/components/homekit/type_humidifiers.py

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

* black

* coverage

* Set current humidity to 0 if linked sensor removed or unavailable

* use last known humidity instead

Co-authored-by: J. Nick Koston <nick@koston.org>
2020-07-02 12:53:11 -05:00
J. Nick Koston
8bce9be590 Fix flapping flux tests (#37346) 2020-07-02 10:51:31 -07:00
uvjustin
49bbdb3c21 Use entry.data.get() in forked_daapd config_flow as some entries miss… (#37359) 2020-07-02 10:51:13 -07:00
Robert Van Gorkom
e60b975b10 Fix gogogate2 issue where non-admin users could not login (#37353) 2020-07-02 10:49:26 -07:00
J. Nick Koston
a87c29b5d9 Ensure logbook performs well when filtering is configured (#37292) 2020-07-02 09:12:27 -07:00
mdegat01
0a982f6fab Fix Influx V1 test query (#37309) 2020-07-02 16:56:43 +02:00
Courtenay
0f8b934e68 Change log url in config check error notification (#37311) 2020-07-02 14:14:17 +02:00
Franck Nijhof
235298a1b2 Add Hue manual bridge config flow + options flow (#37268)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-07-02 14:12:24 +02:00
John Hollowell
cf3f755edc Update proxmoxve integration to correctly renew authentication (#37016) 2020-07-02 14:10:14 +02:00
bsmappee
0cc1a17d04 Smappee dependency update (#37331) 2020-07-02 13:57:43 +02:00
Markus Bong
f5fa7e4400 Fix devolo sensor subscriber (#37337) 2020-07-02 13:54:30 +02:00
Paulus Schoutsen
d08d00daa7 Limit entity platform entity service to same integration (#37313) 2020-07-02 11:39:53 +02:00
MatthewFlamm
a015e551eb Bump pynws-1.2.1 for NWS (#37304) 2020-07-01 18:36:32 -07:00
Gage Benne
bcabf6da91 Add Dexcom Integration (#33852)
* Initial commit for Dexcom integration

* Dexcom config flow testing

* Clarify errors during setup

* Resolve minor test issues

* Update sensor availability, resolve linting issues

* Add sensor tests

* Remove title due to 0.109, add abort

* >94.97% codecov/patch

* Move .translations/ to translations/

* Add constants for servers and unit of measurements

* Bump pydexcom version

* Updated domain schema, Dexcom creation

* Support for different units of measurement

* Update tests

* Remove empty items from manifest

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

* Raise UpdateFailed if fetching new session fails

* Switch everything over to required

* Simplify state information

* Simplify async_on_remove

* Pydexcom package now handles fetching new session

* Only allow config flow

* Remove ternary operator

* Bump version, pydexcom handling session refresh

* Using common strings

* Import from test.async_mock

* Shorten variable names

* Resolve tests after removing yaml support

* Return false if credentials are invalid

* Available seems to handle if data is empty

* Now using option flow, remove handling import

* Add fixture for JSON returned from API

* Overhaul testing

* Revise update options

* Bump pydexcom version

* Combat listener repetition

* Undo update listener using callback

* Change sensor availability to use last_update_success

* Update sensor availability and tests

* Rename test

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2020-07-02 02:14:54 +02:00
HomeAssistant Azure
3498882fe1 [ci skip] Translation update 2020-07-02 00:03:30 +00:00
mdegat01
52f3238e17 Add constant for PlatformNotReady wait time to use in tests (#37266) 2020-07-01 08:42:57 -07:00
Franck Nijhof
dc8bfb76dc Merge pull request #37280 from home-assistant/rc 2020-07-01 16:47:17 +02:00
jfearon
0a0b60566d Add a service for setting the timer to tado water heaters (#36533)
* Add service to support setting timer on water heater component

* Update water_heater.py

Remove info logging
Return if unsupported option used

* Added default temperature as it is optional

* Update homeassistant/components/tado/services.yaml

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

* Update homeassistant/components/tado/services.yaml

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

* Update homeassistant/components/tado/services.yaml

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

* Update homeassistant/components/tado/water_heater.py

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

* Fix to remove else statement, and fix lint error

* Reinstate entity id on schema, allow setting with temperature on devices that dont support it

* Remove entity id from schema as not required

Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2020-07-01 09:20:50 -05:00
Franck Nijhof
96d0ee3153 Bumped version to 0.112.0 2020-07-01 14:38:24 +02:00
Bram Kragten
20c66b1fa3 Updated frontend to 20200701.0 (#37279) 2020-07-01 14:37:20 +02:00
Bram Kragten
3c260c91c8 Revert "Update fritzconnection to 1.3.0" (#37278)
This reverts commit 2f46a81e3e.
2020-07-01 14:37:16 +02:00
Bram Kragten
247bc6f673 Updated frontend to 20200701.0 (#37279) 2020-07-01 14:34:36 +02:00
Bram Kragten
b9d957837e Revert "Update fritzconnection to 1.3.0" (#37278)
This reverts commit 2f46a81e3e.
2020-07-01 13:31:06 +02:00
Jeff Irion
f8d11c843d Clean up 'androidtv.learn_sendevent' service (#37276) 2020-07-01 08:48:06 +02:00
Andrey
431045f036 Add media_stop for volumio integration (#37211) 2020-07-01 00:55:31 -05:00
Haemish Kyd
10786bbe7f Create PoolSense integration (#35561)
* Created integration for PoolSense - a device to maintain your pool

* Updated poolsense integration with changes due to code review comments.

* Update poolsense with lint fix (logging-not-lazy)

* Update poolsense with lint fix (f string missing placeholders)

* Update homeassistant/components/poolsense/config_flow.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/sensor.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/sensor.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/sensor.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/sensor.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/sensor.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/sensor.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/sensor.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/sensor.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/sensor.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/strings.json

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/strings.json

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/strings.json

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/strings.json

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Added test for poolsense component. Updated config_flow to better follow the guidelines.

* Update tests/components/poolsense/test_config_flow.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update tests/components/poolsense/test_config_flow.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update tests/components/poolsense/test_config_flow.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update tests/components/poolsense/test_config_flow.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update tests/components/poolsense/test_config_flow.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update tests/components/poolsense/test_config_flow.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update tests/components/poolsense/test_config_flow.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update tests/components/poolsense/test_config_flow.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Removed uneccessary functions.

* Added local venv to gitignore

* Update homeassistant/components/poolsense/strings.json

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/strings.json

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/strings.json

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/strings.json

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/strings.json

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/strings.json

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update to strings to allow for translations. Also some coding convention updates.

* Removed space in icon return

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Removed space in icon return

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Removed space in icon return

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/__init__.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/__init__.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/__init__.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/poolsense/strings.json

Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Updated to include some error checks for pypi package

* Apply suggestions from code review

* Apply suggestions from code review

* Apply suggestions from code review

* Update tests/components/poolsense/test_config_flow.py

* Update homeassistant/components/poolsense/sensor.py

* Apply suggestions from code review

* Update homeassistant/components/poolsense/__init__.py

* Apply suggestions from code review

* Apply suggestions from code review

* Apply suggestions from code review

* Update homeassistant/components/poolsense/sensor.py

* Apply suggestions from code review

* Update homeassistant/components/poolsense/__init__.py

* Update homeassistant/components/poolsense/sensor.py

Co-authored-by: Chris Talkington <chris@talkingtontech.com>
2020-07-01 00:44:10 -05:00
HomeAssistant Azure
352c572e5d [ci skip] Translation update 2020-07-01 00:06:46 +00:00
guillempages
0edd7302d5 Improve support for homematic garage covers (#35350) 2020-06-30 14:39:20 -07:00
Shulyaka
06e977b444 Add humidifier support to google_assistant (#37157) 2020-06-30 14:32:23 -07:00
Quentame
01ba578016 Add missed call sensor to Freebox (#36895) 2020-06-30 12:55:46 -07:00
J. Nick Koston
c1ec8971ae Update myq for latest client version requirement (#37104) 2020-06-30 12:41:09 -07:00
J. Nick Koston
7746ecc9fb Cache checking for entity exposure in emulated_hue (#37260)
Since we now base all of exposure checks on data that
will not change, we can cache the result instead
of calculating it every loop.

This change complements the work done in #32718
2020-06-30 13:22:17 -05:00
mdegat01
24289d5dbb Refactor Influx logic to reduce V1 vs V2 code paths (#37232)
* refactoring to share logic and sensor startup error test

* Added handling for V1 InfluxDBServerError to start-up and runtime and test for it

* Added InfluxDBServerError test to sensor setup tests

* Raising PlatformNotReady exception from sensor for setup failure

* Proper testing of PlatformNotReady error
2020-06-30 20:02:25 +02:00
Phil Bruckner
38210ebbc6 Enhance script integration to use new features in script helper (#37201) 2020-06-30 10:22:26 -07:00
mdegat01
b78f163bb0 Changed FilterTest namedtuples to dataclasses (#37252) 2020-06-30 11:59:21 -05:00
Erik Montnemery
86c27b50f1 Bump pychromecast to 7.0.1 (#37225)
* Bump pychromecast to 7.0.1

* Fix tests

* Mark configuration via platform for removal in 0.116

* Fix uuid check
2020-06-30 16:35:10 +02:00
Franck Nijhof
333dccc7af Remove Hue configurator demo from demo integration (#37250) 2020-06-30 15:01:30 +02:00
Michał Mrozek
61475d0a0c Add support for window covers to ozw integration (#37217)
* feat: add cover to ozw

* fix: imports

* fix: formatting

* fix: improve code regarding comments

* add: cover tests

* fix: add position converting tests

* fix: convert cover position form zwave value

* fix: improve naming

* fix: increase coverage
2020-06-30 13:02:30 +02:00
Jeff Irion
4d17b18761 Register 'androidtv.learn_sendevent' service (#35707) 2020-06-29 18:17:04 -07:00
Sven-Hendrik Haase
2f46a81e3e Update fritzconnection to 1.3.0 (#37212)
This effectively fixes an important bug where the graph would go negative because 1.2.0 used the 32-bit counters and 1.3.0 uses 64-bit counters will not realistically go negative any time soon.
2020-06-29 17:49:22 -07:00
J. Nick Koston
fae47358b8 Use shared zeroconf for discovery netdisco (#37237)
* Use shared zeroconf for netdisco

* Update netdisco

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-06-29 19:34:38 -05:00
Aaron Bach
0f43476d03 Fix Tile location accuracy bug (#37233)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-06-29 17:25:01 -07:00
Aaron Bach
856f8fd6de Move Guardian services to entity platform services (#37189) 2020-06-29 17:24:42 -07:00
HomeAssistant Azure
bba47ad9b1 [ci skip] Translation update 2020-06-30 00:06:54 +00:00
Franck Nijhof
79f131066c Ensure recorder data integrity and MySQL lock error handling (#37228) 2020-06-29 16:23:11 -07:00
Paulus Schoutsen
ac237ee10f Updated frontend to 20200629.0 (#37240) 2020-06-29 15:54:02 -07:00
MatthewFlamm
11debb1568 Fix wind speed change in NWS (#37222) 2020-06-29 15:41:52 -07:00
David F. Mulcahey
b0942d86fe Bump ZHA Quirks to 0.0.41 (#37235) 2020-06-29 15:37:42 -07:00
definitio
12510b0c97 Fixes after PR #36479 (#37230) 2020-06-29 15:36:52 -07:00
Rami Mosleh
cc7bed5dab Fix updating ping sensor (#37220) 2020-06-29 12:45:28 -07:00
mdegat01
b0e2f5f375 Add mdegat01 as code owner for InfluxDB (#37227) 2020-06-29 20:21:21 +02:00
J. Nick Koston
89a9634d35 Use eventloop for scheduling (#37184)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-06-29 09:39:24 -07:00
J. Nick Koston
0f72008090 Ensure homekit state changed listeners are unsubscribed on reload (#37200)
* Ensure homekit state changed listeners are unsubscribed on reload

* fix mocking
2020-06-29 11:25:26 -05:00
Eugene Prystupa
7ef33a7219 Add first unit test to config flow for Plum Lightpad (#37183)
* add first unit test to config flow for Plum Lightpad

* add first unit test to config flow for Plum Lightpad (add changed requirements_test_all.txt)

* add first unit test to config flow for Plum Lightpad

* add first unit test to config flow for Plum Lightpad (bring coverage to 100%)

* add first unit test to config flow for Plum Lightpad

* add first unit test to config flow for Plum Lightpad (updated patch path as suggested)

* add first unit test to config flow for Plum Lightpad (add unit test for abort)
2020-06-29 18:07:43 +02:00
mdegat01
b96ce9c210 Additional testing for InfluxDB and some quality improvements (#37181)
* refactoring and added tests to sensor

* using caplog and not mocking main setup method in sensor tests
2020-06-29 17:31:49 +02:00
J. Nick Koston
7b4df98875 Silence spurious warning when HomeKit is already running (#37199)
If homekit.start is called when homekit is already running
we previous warned.  Downgrade the warning to a debug message
as nothing is actually wrong.
2020-06-29 13:37:56 +02:00
Dave T
5badbcb012 Correct typo in input_number UI text (#37208) 2020-06-29 10:57:23 +02:00
Joakim Plate
ca265966e7 Sensors sometimes are created without event (#37205) 2020-06-29 06:39:56 +02:00
HomeAssistant Azure
af5374d38b [ci skip] Translation update 2020-06-29 00:03:32 +00:00
Gleb Sinyavskiy
76fa581bb9 Move transmission limit and order config options to the options flow (#37198) 2020-06-28 22:51:18 +02:00
Gleb Sinyavskiy
4a374f0378 Limit and sort transmission torrents_info attribute (#35411) 2020-06-28 13:56:54 +02:00
Tom Harris
15165a3c93 Fix issue with Insteon devices not responding to device changes (#37160) 2020-06-28 11:46:44 +02:00
Phil Bruckner
584ce043e5 Add debug output for invalid service call data (#37171) 2020-06-27 22:19:54 -07:00
Aaron Bach
b0df223f5a Bump aioguardian (#37188)
* Bump aioguardian

* Fix tests
2020-06-27 23:16:42 -06:00
Joakim Plate
201dab93ff Attempt to set unique id of rfxtrx device (#37159) 2020-06-27 21:59:42 -07:00
Aaron Bach
10f296ba17 Fix bug where Tile session would expire (#37185) 2020-06-27 21:54:50 -07:00
Joakim Plate
464f17f182 Fixup rfxtrx tests to at least run (#37186) 2020-06-27 21:54:27 -07:00
J. Nick Koston
a63a11a11a Ensure all async_track_state_change_event callbacks run if one throws (#37179) 2020-06-27 17:48:27 -07:00
HomeAssistant Azure
c1194c90cb [ci skip] Translation update 2020-06-28 00:05:05 +00:00
J. Nick Koston
4acc6f333e Improve scalability of state change event routing (#37174) 2020-06-27 14:46:45 -07:00
Alan Tse
07aba74757 Bump teslajsonpy to 0.9.0 (#37162) 2020-06-27 11:45:34 -05:00
David F. Mulcahey
4fd27e879e add phillips remote cluster (#37172) 2020-06-27 12:40:34 -04:00
jjlawren
ec13eecc59 Update Plex tests to mock websockets (#37147)
* Update Plex tests to mock websockets

* Avoid unnecessary class mock
2020-06-27 10:03:51 +02:00
HomeAssistant Azure
e48bcd2070 [ci skip] Translation update 2020-06-27 00:05:54 +00:00
mdegat01
d454f85572 Add support for glob matching in InfluxDB filters (#37069)
* added support for glob filtering to influx

* removed print and using dataclass instead of namedtuple
2020-06-27 00:01:32 +02:00
Paulus Schoutsen
4e10ca3214 Fix speedtest blowing up (#37151) 2020-06-26 14:26:05 -07:00
Paulus Schoutsen
50dd6b69cd Fix OwnTracks race condition (#37152) 2020-06-26 14:25:50 -07:00
Paulus Schoutsen
8a9b19f327 Updated frontend to 20200626.1 (#37150) 2020-06-26 13:44:28 -07:00
bsmappee
680f8f8d5a Improve Smappee integration (#37087) 2020-06-26 10:46:14 -07:00
jjlawren
fe5bf96e5d Catch additional exception for Plex account login failures (#37143) 2020-06-26 10:30:44 -07:00
Franck Nijhof
7d74b74570 Fix recorder purging by batch processing purges (#37140) 2020-06-26 10:27:45 -07:00
J. Nick Koston
a4501b93c4 Fix repack when using pymysql (#37142) 2020-06-26 11:45:40 -05:00
Kdemontf
39a5f68914 Update remote_rpi_gpio switch parent (#37136)
* Update switch.py

Update to rename SwitchDevice to SwitchEntity, if appropriate.

* Update switch.py

* Update switch.py
2020-06-26 18:29:38 +02:00
Aaron Bach
3a2d4ac7fa Add optimistic Guardian switch updating (#37141) 2020-06-26 10:19:38 -06:00
J. Nick Koston
76db2b39b0 Move logbook continuous domain filtering to sql (#37115)
* Move logbook continuous domain filtering to sql

sensors tend to generate a significant amount of states
that are filtered out by logbook.  In testing 75% of
states can be filtered away in sql to avoid the
sqlalchemy ORM overhead of creating objects that will
be discarded.

* remove un-needed nesting
2020-06-26 09:12:50 -05:00
Franck Nijhof
fe1a7f6d69 Upgrade sqlalchemy to 1.3.18 (#37123) 2020-06-26 08:15:54 -05:00
J. Nick Koston
0eaa6045c1 Ensure doorbird events can be filtered by entity_id (#37116) 2020-06-25 23:29:22 -07:00
jjlawren
40573bf393 Plex tests cleanup and additions (#37117) 2020-06-25 23:24:58 -07:00
Paulus Schoutsen
56907392d3 Bump frontend (#37113) 2020-06-25 17:38:09 -07:00
J. Nick Koston
30df871787 Improve isoformat timestamp performance for full states (#37105) 2020-06-25 17:11:49 -07:00
jjlawren
fd1a8dd96c Fix Plex when using local tokenless authentication (#37096) 2020-06-25 17:10:40 -07:00
Franck Nijhof
f42eb0d5ca Fix missing service call context in multiple locations (#37094) 2020-06-25 17:09:52 -07:00
HomeAssistant Azure
98a388e65a [ci skip] Translation update 2020-06-26 00:04:23 +00:00
J. Nick Koston
6d9fa34f65 Migrate doorbird to use new logbook platform (#37097) 2020-06-25 15:17:05 -05:00
Franck Nijhof
2dd0a182ab Bump version to 0.113.0dev0 (#37071) 2020-06-25 11:42:33 -07:00
Indu Prakash
15773cb3e0 Add worldclock custom format (#36157) 2020-06-25 11:41:53 -07:00
Paulus Schoutsen
4aedafc73a Improve setup (#37075) 2020-06-25 11:34:47 -07:00
Alexei Chetroi
25b093e69e Use cached values for divisor/multiplier (#37070) 2020-06-25 09:35:48 -04:00
Franck Nijhof
140fc48ede Remove invalidation version from ZHA deprecated config options (#37089) 2020-06-25 08:17:31 -04:00
Eugene Prystupa
fea5d007fc Clean up plum_lightpad (#37077) 2020-06-25 13:20:42 +02:00
Phil Bruckner
c423501804 Add legacy polling option for Amcrest motion detection (#36955) 2020-06-24 23:20:39 -07:00
RogerSelwyn
9137957cf9 Fix geniushub spamming log with exceptions (#37067) 2020-06-24 23:20:00 -07:00
J. Nick Koston
f4528d0db2 Ensure history states can be copied (#37081)
The filter integration makes a copy of a
state object obtained from history.
2020-06-24 22:43:08 -05:00
Paulus Schoutsen
5bc6ed4cef Add logbook platforms (#37078)
* Add logbook platforms

* Fix logbook describe test
2020-06-24 18:14:50 -07:00
Aaron Bach
7968cd650a Add concept of allowed external URLs to config (#36988)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-06-24 17:37:01 -07:00
HomeAssistant Azure
cbb76be9d0 [ci skip] Translation update 2020-06-25 00:08:30 +00:00
Emily Mills
9f855c7d01 Zerproc cleanup (#37072) 2020-06-24 16:02:03 -07:00
Alexei Chetroi
bd42827d43 Don't reset multiplier/divisor on failures (#37066)
If SmartEnergy.Metering channels fails to get multiplier/divisor when
initializing, then keep the old values instead of resetting to 1.
2020-06-24 17:54:11 -04:00
Alexei Chetroi
47220ae4a6 Handle Centralite Pearl thermostat modes (#37065) 2020-06-24 17:52:56 -04:00
1275 changed files with 26934 additions and 8841 deletions

View File

@@ -214,7 +214,14 @@ omit =
homeassistant/components/emoncms_history/*
homeassistant/components/emulated_hue/upnp.py
homeassistant/components/enigma2/media_player.py
homeassistant/components/enocean/*
homeassistant/components/enocean/__init__.py
homeassistant/components/enocean/binary_sensor.py
homeassistant/components/enocean/const.py
homeassistant/components/enocean/device.py
homeassistant/components/enocean/dongle.py
homeassistant/components/enocean/light.py
homeassistant/components/enocean/sensor.py
homeassistant/components/enocean/switch.py
homeassistant/components/enphase_envoy/sensor.py
homeassistant/components/entur_public_transport/*
homeassistant/components/environment_canada/*
@@ -313,6 +320,7 @@ omit =
homeassistant/components/guardian/binary_sensor.py
homeassistant/components/guardian/sensor.py
homeassistant/components/guardian/switch.py
homeassistant/components/guardian/util.py
homeassistant/components/habitica/*
homeassistant/components/hangouts/*
homeassistant/components/hangouts/__init__.py
@@ -372,7 +380,6 @@ omit =
homeassistant/components/ihc/*
homeassistant/components/imap/sensor.py
homeassistant/components/imap_email_content/sensor.py
homeassistant/components/influxdb/sensor.py
homeassistant/components/insteon/*
homeassistant/components/incomfort/*
homeassistant/components/intesishome/*
@@ -531,6 +538,7 @@ omit =
homeassistant/components/netatmo/climate.py
homeassistant/components/netatmo/const.py
homeassistant/components/netatmo/sensor.py
homeassistant/components/netatmo/webhook.py
homeassistant/components/netdata/sensor.py
homeassistant/components/netgear/device_tracker.py
homeassistant/components/netgear_lte/*
@@ -621,9 +629,12 @@ omit =
homeassistant/components/plugwise/climate.py
homeassistant/components/plugwise/sensor.py
homeassistant/components/plugwise/switch.py
homeassistant/components/plum_lightpad/*
homeassistant/components/plum_lightpad/light.py
homeassistant/components/pocketcasts/sensor.py
homeassistant/components/point/*
homeassistant/components/poolsense/__init__.py
homeassistant/components/poolsense/sensor.py
homeassistant/components/poolsense/binary_sensor.py
homeassistant/components/prezzibenzina/sensor.py
homeassistant/components/proliphix/climate.py
homeassistant/components/prometheus/*
@@ -731,7 +742,9 @@ omit =
homeassistant/components/smappee/sensor.py
homeassistant/components/smappee/switch.py
homeassistant/components/smarty/*
homeassistant/components/smarthab/*
homeassistant/components/smarthab/__init__.py
homeassistant/components/smarthab/cover.py
homeassistant/components/smarthab/light.py
homeassistant/components/sms/*
homeassistant/components/smtp/notify.py
homeassistant/components/snapcast/*

8
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,8 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: daily
time: "06:00"
open-pull-requests-limit: 10

784
.github/workflows/ci.yaml vendored Normal file
View File

@@ -0,0 +1,784 @@
name: CI
# yamllint disable-line rule:truthy
on:
push:
branches:
- dev
- rc
- master
pull_request: ~
env:
DEFAULT_PYTHON: 3.7
PRE_COMMIT_HOME: ~/.cache/pre-commit
jobs:
# Separate job to pre-populate the base dependency cache
# This prevent upcoming jobs to do the same individually
prepare-base:
name: Prepare base dependencies
runs-on: ubuntu-latest
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v2
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v2
with:
path: venv
key: >-
${{ runner.os }}-base-venv-${{ steps.python.outputs.python-version
}}-${{ hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
restore-keys: |
${{ runner.os }}-base-venv-${{ steps.python.outputs.python-version }}-${{ hashFiles('requirements.txt') }}-${{ hashFiles('requirements_test.txt') }}-
${{ runner.os }}-base-venv-${{ steps.python.outputs.python-version }}-${{ hashFiles('requirements.txt') }}
${{ runner.os }}-base-venv-${{ steps.python.outputs.python-version }}-
- name: Create Python virtual environment
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
python -m venv venv
. venv/bin/activate
pip install -U pip setuptools
pip install -r requirements.txt -r requirements_test.txt
# Uninstalling typing as a workaround. Eventually we should make sure
# all our dependencies drop typing.
# Find offending deps with `pipdeptree -r -p typing`
pip uninstall -y typing
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v2
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
restore-keys: |
${{ runner.os }}-pre-commit-
- name: Install pre-commit dependencies
if: steps.cache-precommit.outputs.cache-hit != 'true'
run: |
. venv/bin/activate
pre-commit install-hooks
lint-bandit:
name: Check bandit
runs-on: ubuntu-latest
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v2
with:
path: venv
key: >-
${{ runner.os }}-base-venv-${{ steps.python.outputs.python-version
}}-${{ hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v2
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Fail job if cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Run bandit
run: |
. venv/bin/activate
pre-commit run --hook-stage manual bandit --all-files --show-diff-on-failure
lint-black:
name: Check black
runs-on: ubuntu-latest
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v2
with:
path: venv
key: >-
${{ runner.os }}-base-venv-${{ steps.python.outputs.python-version
}}-${{ hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v2
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Fail job if cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Run black
run: |
. venv/bin/activate
pre-commit run --hook-stage manual black --all-files --show-diff-on-failure
lint-codespell:
name: Check codespell
runs-on: ubuntu-latest
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v2
with:
path: venv
key: >-
${{ runner.os }}-base-venv-${{ steps.python.outputs.python-version
}}-${{ hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v2
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Fail job if cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Register codespell problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/codespell.json"
- name: Run codespell
run: |
. venv/bin/activate
pre-commit run --show-diff-on-failure --hook-stage manual codespell --all-files
lint-dockerfile:
name: Check Dockerfile
runs-on: ubuntu-latest
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name: Register hadolint problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/hadolint.json"
- name: Check Dockerfile
uses: docker://hadolint/hadolint:v1.18.0
with:
args: hadolint Dockerfile
- name: Check Dockerfile.dev
uses: docker://hadolint/hadolint:v1.18.0
with:
args: hadolint Dockerfile.dev
lint-executable-shebangs:
name: Check executables
runs-on: ubuntu-latest
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v2
with:
path: venv
key: >-
${{ runner.os }}-base-venv-${{ steps.python.outputs.python-version
}}-${{ hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v2
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Fail job if cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Register check executables problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/check-executables-have-shebangs.json"
- name: Run executables check
run: |
. venv/bin/activate
pre-commit run --hook-stage manual check-executables-have-shebangs --all-files
lint-flake8:
name: Check flake8
runs-on: ubuntu-latest
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v2
with:
path: venv
key: >-
${{ runner.os }}-base-venv-${{ steps.python.outputs.python-version
}}-${{ hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v2
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Fail job if cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Register flake8 problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/flake8.json"
- name: Run flake8
run: |
. venv/bin/activate
pre-commit run --hook-stage manual flake8 --all-files
lint-isort:
name: Check isort
runs-on: ubuntu-latest
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v2
with:
path: venv
key: >-
${{ runner.os }}-base-venv-${{ steps.python.outputs.python-version
}}-${{ hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v2
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Fail job if cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Run isort
run: |
. venv/bin/activate
pre-commit run --hook-stage manual isort --all-files --show-diff-on-failure
lint-json:
name: Check JSON
runs-on: ubuntu-latest
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v2
with:
path: venv
key: >-
${{ runner.os }}-base-venv-${{ steps.python.outputs.python-version
}}-${{ hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v2
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Fail job if cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Register check-json problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/check-json.json"
- name: Run check-json
run: |
. venv/bin/activate
pre-commit run --hook-stage manual check-json --all-files
lint-pyupgrade:
name: Check pyupgrade
runs-on: ubuntu-latest
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v2
with:
path: venv
key: >-
${{ runner.os }}-base-venv-${{ steps.python.outputs.python-version
}}-${{ hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v2
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Fail job if cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Run pyupgrade
run: |
. venv/bin/activate
pre-commit run --hook-stage manual pyupgrade --all-files --show-diff-on-failure
# Disabled until we have the existing issues fixed
# lint-shellcheck:
# name: Check ShellCheck
# runs-on: ubuntu-latest
# needs: prepare-base
# steps:
# - name: Check out code from GitHub
# uses: actions/checkout@v2
# - name: Run ShellCheck
# uses: ludeeus/action-shellcheck@0.3.0
lint-yaml:
name: Check YAML
runs-on: ubuntu-latest
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v2
with:
path: venv
key: >-
${{ runner.os }}-base-venv-${{ steps.python.outputs.python-version
}}-${{ hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v2
with:
path: ${{ env.PRE_COMMIT_HOME }}
key: |
${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Fail job if cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Register yamllint problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/yamllint.json"
- name: Run yamllint
run: |
. venv/bin/activate
pre-commit run --hook-stage manual yamllint --all-files --show-diff-on-failure
hassfest:
name: Check hassfest
runs-on: ubuntu-latest
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v2
with:
path: venv
key: >-
${{ runner.os }}-base-venv-${{ steps.python.outputs.python-version
}}-${{ hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Run hassfest
run: |
. venv/bin/activate
python -m script.hassfest --action validate
gen-requirements-all:
name: Check all requirements
runs-on: ubuntu-latest
needs: prepare-base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v2
with:
path: venv
key: >-
${{ runner.os }}-base-venv-${{ steps.python.outputs.python-version
}}-${{ hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Run gen_requirements_all.py
run: |
. venv/bin/activate
python -m script.gen_requirements_all validate
prepare-tests:
name: Prepare tests for Python ${{ matrix.python-version }}
runs-on: ubuntu-latest
strategy:
matrix:
python-version: [3.7, 3.8]
container: homeassistant/ci-azure:${{ matrix.python-version }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name:
Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache@v2
with:
path: venv
key: >-
${{ runner.os }}-venv-${{ matrix.python-version }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('requirements_all.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
restore-keys: |
${{ runner.os }}-venv-${{ matrix.python-version }}-${{ hashFiles('requirements_test.txt') }}-${{ hashFiles('requirements_all.txt') }}
${{ runner.os }}-venv-${{ matrix.python-version }}-${{ hashFiles('requirements_test.txt') }}
${{ runner.os }}-venv-${{ matrix.python-version }}-
- name:
Create full Python ${{ matrix.python-version }} virtual environment
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
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
# Uninstalling typing as a workaround. Eventually we should make sure
# all our dependencies drop typing.
# Find offending deps with `pipdeptree -r -p typing`
pip uninstall -y typing
pip install -e .
pylint:
name: Check pylint
runs-on: ubuntu-latest
needs: prepare-tests
strategy:
matrix:
python-version: [3.7]
container: homeassistant/ci-azure:${{ matrix.python-version }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name:
Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache@v2
with:
path: venv
key: >-
${{ runner.os }}-venv-${{ matrix.python-version }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('requirements_all.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Register pylint problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/pylint.json"
- name: Run pylint
run: |
. venv/bin/activate
pylint homeassistant
mypy:
name: Check mypy
runs-on: ubuntu-latest
needs: prepare-tests
strategy:
matrix:
python-version: [3.7]
container: homeassistant/ci-azure:${{ matrix.python-version }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name:
Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache@v2
with:
path: venv
key: >-
${{ runner.os }}-venv-${{ matrix.python-version }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('requirements_all.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Register mypy problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/mypy.json"
- name: Run mypy
run: |
. venv/bin/activate
mypy homeassistant
pytest:
runs-on: ubuntu-latest
needs: prepare-tests
strategy:
matrix:
group: [1, 2, 3, 4]
python-version: [3.7, 3.8]
name: >-
Run tests Python ${{ matrix.python-version }} (group ${{ matrix.group }})
container: homeassistant/ci-azure:${{ matrix.python-version }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name:
Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache@v2
with:
path: venv
key: >-
${{ runner.os }}-venv-${{ matrix.python-version }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('requirements_all.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Register Python problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/python.json"
- name: Install Pytest Annotation plugin
run: |
. venv/bin/activate
# Ideally this should be part of our dependencies
# However this plugin is fairly new and doesn't run correctly
# on a non-GitHub environment.
pip install pytest-github-actions-annotate-failures
- name: Run pytest
run: |
. venv/bin/activate
pytest \
-qq \
--timeout=9 \
--durations=10 \
-n auto \
--dist=loadfile \
--test-group-count 4 \
--test-group=${{ matrix.group }} \
--cov homeassistant \
-o console_output_style=count \
-p no:sugar \
tests
- name: Upload coverage artifact
uses: actions/upload-artifact@2.1.0
with:
name: coverage-${{ matrix.python-version }}-group${{ matrix.group }}
path: .coverage
- name: Check dirty
run: |
./script/check_dirty
coverage:
name: Process test coverage
runs-on: ubuntu-latest
needs: pytest
strategy:
matrix:
python-version: [3.7]
container: homeassistant/ci-azure:${{ matrix.python-version }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@v2
- name:
Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache@v2
with:
path: venv
key: >-
${{ runner.os }}-venv-${{ matrix.python-version }}-${{
hashFiles('requirements_test.txt') }}-${{
hashFiles('requirements_all.txt') }}-${{
hashFiles('homeassistant/package_constraints.txt') }}
- name: Fail job if Python cache restore failed
if: steps.cache-venv.outputs.cache-hit != 'true'
run: |
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Download all coverage artifacts
uses: actions/download-artifact@v2
- name: Combine coverage results
run: |
. venv/bin/activate
coverage combine coverage*/.coverage*
coverage report --fail-under=94
coverage xml
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v1.0.10

View File

@@ -0,0 +1,14 @@
{
"problemMatcher": [
{
"owner": "check-executables-have-shebangs",
"pattern": [
{
"regexp": "^(.+):\\s(.+)$",
"file": 1,
"message": 2
}
]
}
]
}

View File

@@ -0,0 +1,16 @@
{
"problemMatcher": [
{
"owner": "check-json",
"pattern": [
{
"regexp": "^(.+):\\s(.+\\sline\\s(\\d+)\\scolumn\\s(\\d+).+)$",
"file": 1,
"message": 2,
"line": 3,
"column": 4
}
]
}
]
}

View File

@@ -0,0 +1,16 @@
{
"problemMatcher": [
{
"owner": "codespell",
"severity": "warning",
"pattern": [
{
"regexp": "^(.+):(\\d+):\\s(.+)$",
"file": 1,
"line": 2,
"message": 3
}
]
}
]
}

30
.github/workflows/matchers/flake8.json vendored Normal file
View File

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

View File

@@ -0,0 +1,16 @@
{
"problemMatcher": [
{
"owner": "hadolint",
"pattern": [
{
"regexp": "^(.+):(\\d+)\\s+((DL\\d{4}).+)$",
"file": 1,
"line": 2,
"message": 3,
"code": 4
}
]
}
]
}

16
.github/workflows/matchers/mypy.json vendored Normal file
View File

@@ -0,0 +1,16 @@
{
"problemMatcher": [
{
"owner": "mypy",
"pattern": [
{
"regexp": "^(.+):(\\d+):\\s(error|warning):\\s(.+)$",
"file": 1,
"line": 2,
"severity": 3,
"message": 4
}
]
}
]
}

32
.github/workflows/matchers/pylint.json vendored Normal file
View File

@@ -0,0 +1,32 @@
{
"problemMatcher": [
{
"owner": "pylint-error",
"severity": "error",
"pattern": [
{
"regexp": "^(.+):(\\d+):(\\d+):\\s(([EF]\\d{4}):\\s.+)$",
"file": 1,
"line": 2,
"column": 3,
"message": 4,
"code": 5
}
]
},
{
"owner": "pylint-warning",
"severity": "warning",
"pattern": [
{
"regexp": "^(.+):(\\d+):(\\d+):\\s(([CRW]\\d{4}):\\s.+)$",
"file": 1,
"line": 2,
"column": 3,
"message": 4,
"code": 5
}
]
}
]
}

18
.github/workflows/matchers/python.json vendored Normal file
View File

@@ -0,0 +1,18 @@
{
"problemMatcher": [
{
"owner": "python",
"pattern": [
{
"regexp": "^\\s*File\\s\\\"(.*)\\\",\\sline\\s(\\d+),\\sin\\s(.*)$",
"file": 1,
"line": 2
},
{
"regexp": "^\\s*raise\\s(.*)\\(\\'(.*)\\'\\)$",
"message": 2
}
]
}
]
}

View File

@@ -0,0 +1,22 @@
{
"problemMatcher": [
{
"owner": "yamllint",
"pattern": [
{
"regexp": "^(.*\\.ya?ml)$",
"file": 1
},
{
"regexp": "^\\s{2}(\\d+):(\\d+)\\s+(error|warning)\\s+(.*?)\\s+\\((.*)\\)$",
"line": 1,
"column": 2,
"severity": 3,
"message": 4,
"code": 5,
"loop": true
}
]
}
]
}

View File

@@ -22,7 +22,7 @@ repos:
- --quiet-level=2
exclude_types: [csv, json]
- repo: https://gitlab.com/pycqa/flake8
rev: 3.8.1
rev: 3.8.3
hooks:
- id: flake8
additional_dependencies:

View File

@@ -1,4 +1,3 @@
sudo: false
dist: bionic
addons:
apt:
@@ -14,22 +13,30 @@ addons:
sources:
- sourceline: ppa:savoury1/ffmpeg4
matrix:
python:
- "3.7.1"
- "3.8"
env:
- TOX_ARGS="-- --test-group-count 4 --test-group 1"
- TOX_ARGS="-- --test-group-count 4 --test-group 2"
- TOX_ARGS="-- --test-group-count 4 --test-group 3"
- TOX_ARGS="-- --test-group-count 4 --test-group 4"
jobs:
fast_finish: true
include:
- python: "3.7.0"
- python: "3.7.1"
env: TOXENV=lint
- python: "3.7.0"
- python: "3.7.1"
env: TOXENV=pylint PYLINT_ARGS=--jobs=0 TRAVIS_WAIT=30
- python: "3.7.0"
- python: "3.7.1"
env: TOXENV=typing
- python: "3.7.0"
env: TOXENV=py37
cache:
pip: true
directories:
- $HOME/.cache/pre-commit
install: pip install -U tox
install: pip install -U tox tox-travis
language: python
script: ${TRAVIS_WAIT:+travis_wait $TRAVIS_WAIT} tox --develop
script: ${TRAVIS_WAIT:+travis_wait $TRAVIS_WAIT} tox --develop ${TOX_ARGS-}

4
.vscode/tasks.json vendored
View File

@@ -76,7 +76,7 @@
{
"label": "Install all Requirements",
"type": "shell",
"command": "pip3 install -r requirements_all.txt -c homeassistant/package_constraints.txt",
"command": "pip3 install -r requirements_all.txt",
"group": {
"kind": "build",
"isDefault": true
@@ -90,7 +90,7 @@
{
"label": "Install all Test Requirements",
"type": "shell",
"command": "pip3 install -r requirements_test_all.txt -c homeassistant/package_constraints.txt",
"command": "pip3 install -r requirements_test_all.txt",
"group": {
"kind": "build",
"isDefault": true

View File

@@ -23,7 +23,6 @@ homeassistant/components/alarmdecoder/* @ajschmidt8
homeassistant/components/alexa/* @home-assistant/cloud @ochlocracy
homeassistant/components/almond/* @gcampax @balloob
homeassistant/components/alpha_vantage/* @fabaff
homeassistant/components/amazon_polly/* @robbiet480
homeassistant/components/ambiclimate/* @danielhiversen
homeassistant/components/ambient_station/* @bachya
homeassistant/components/amcrest/* @pnbruckner
@@ -47,7 +46,7 @@ homeassistant/components/automation/* @home-assistant/core
homeassistant/components/avea/* @pattyland
homeassistant/components/avri/* @timvancann
homeassistant/components/awair/* @ahayworth @danielsjf
homeassistant/components/aws/* @awarecan @robbiet480
homeassistant/components/aws/* @awarecan
homeassistant/components/axis/* @Kane610
homeassistant/components/azure_event_hub/* @eavanvalkenburg
homeassistant/components/azure_service_bus/* @hfurubotten
@@ -59,7 +58,8 @@ homeassistant/components/blink/* @fronzbot
homeassistant/components/bmp280/* @belidzs
homeassistant/components/bmw_connected_drive/* @gerard33 @rikroe
homeassistant/components/bom/* @maddenp
homeassistant/components/braviatv/* @robbiet480 @bieniu
homeassistant/components/bond/* @prystupa
homeassistant/components/braviatv/* @bieniu
homeassistant/components/broadlink/* @danielhiversen @felipediel
homeassistant/components/brother/* @bieniu
homeassistant/components/brunt/* @eavanvalkenburg
@@ -94,6 +94,7 @@ homeassistant/components/denonavr/* @scarface-4711 @starkillerOG
homeassistant/components/derivative/* @afaucogney
homeassistant/components/device_automation/* @home-assistant/core
homeassistant/components/devolo_home_control/* @2Fake @Shutgun
homeassistant/components/dexcom/* @gagebenne
homeassistant/components/digital_ocean/* @fabaff
homeassistant/components/directv/* @ctalkington
homeassistant/components/discogs/* @thibmaek
@@ -127,7 +128,6 @@ homeassistant/components/ezviz/* @baqs
homeassistant/components/fastdotcom/* @rohankapoorcom
homeassistant/components/file/* @fabaff
homeassistant/components/filter/* @dgomes
homeassistant/components/fitbit/* @robbiet480
homeassistant/components/fixer/* @fabaff
homeassistant/components/flick_electric/* @ZephireNZ
homeassistant/components/flock/* @fabaff
@@ -136,7 +136,6 @@ homeassistant/components/flunearyou/* @bachya
homeassistant/components/forked_daapd/* @uvjustin
homeassistant/components/fortios/* @kimfrellsen
homeassistant/components/foscam/* @skgsergio
homeassistant/components/foursquare/* @robbiet480
homeassistant/components/freebox/* @snoof85 @Quentame
homeassistant/components/fronius/* @nielstron
homeassistant/components/frontend/* @home-assistant/frontend
@@ -149,18 +148,15 @@ homeassistant/components/geonetnz_volcano/* @exxamalte
homeassistant/components/gios/* @bieniu
homeassistant/components/gitter/* @fabaff
homeassistant/components/glances/* @fabaff @engrbm87
homeassistant/components/gntp/* @robbiet480
homeassistant/components/gogogate2/* @vangorra
homeassistant/components/google_assistant/* @home-assistant/cloud
homeassistant/components/google_cloud/* @lufton
homeassistant/components/google_translate/* @awarecan
homeassistant/components/google_travel_time/* @robbiet480
homeassistant/components/gpsd/* @fabaff
homeassistant/components/greeneye_monitor/* @jkeljo
homeassistant/components/griddy/* @bdraco
homeassistant/components/group/* @home-assistant/core
homeassistant/components/growatt_server/* @indykoning
homeassistant/components/gtfs/* @robbiet480
homeassistant/components/guardian/* @bachya
homeassistant/components/harmony/* @ehendrix23 @bramkragten @bdraco
homeassistant/components/hassio/* @home-assistant/hass-io
@@ -179,11 +175,10 @@ homeassistant/components/homekit_controller/* @Jc2k
homeassistant/components/homematic/* @pvizeli @danielperna84
homeassistant/components/homematicip_cloud/* @SukramJ
homeassistant/components/honeywell/* @zxdavb
homeassistant/components/html5/* @robbiet480
homeassistant/components/http/* @home-assistant/core
homeassistant/components/huawei_lte/* @scop @fphammerle
homeassistant/components/huawei_router/* @abmantis
homeassistant/components/hue/* @balloob
homeassistant/components/hue/* @balloob @frenck
homeassistant/components/humidifier/* @home-assistant/core @Shulyaka
homeassistant/components/hunterdouglas_powerview/* @bdraco
homeassistant/components/hvv_departures/* @vigonotion
@@ -193,7 +188,7 @@ homeassistant/components/iaqualink/* @flz
homeassistant/components/icloud/* @Quentame
homeassistant/components/ign_sismologia/* @exxamalte
homeassistant/components/incomfort/* @zxdavb
homeassistant/components/influxdb/* @fabaff
homeassistant/components/influxdb/* @fabaff @mdegat01
homeassistant/components/input_boolean/* @home-assistant/core
homeassistant/components/input_datetime/* @home-assistant/core
homeassistant/components/input_number/* @home-assistant/core
@@ -318,6 +313,7 @@ homeassistant/components/plex/* @jjlawren
homeassistant/components/plugwise/* @CoMPaTech @bouwew
homeassistant/components/plum_lightpad/* @ColinHarrington @prystupa
homeassistant/components/point/* @fredrike
homeassistant/components/poolsense/* @haemishkyd
homeassistant/components/powerwall/* @bdraco @jrester
homeassistant/components/prometheus/* @knyar
homeassistant/components/proxmoxve/* @k4ds3 @jhollowe
@@ -338,7 +334,7 @@ homeassistant/components/rainforest_eagle/* @gtdiehl @jcalbert
homeassistant/components/rainmachine/* @bachya
homeassistant/components/random/* @fabaff
homeassistant/components/repetier/* @MTrab
homeassistant/components/rfxtrx/* @danielhiversen
homeassistant/components/rfxtrx/* @danielhiversen @elupus
homeassistant/components/ring/* @balloob
homeassistant/components/rmvtransport/* @cgtobi
homeassistant/components/roku/* @ctalkington
@@ -431,8 +427,6 @@ homeassistant/components/transmission/* @engrbm87 @JPHutchins
homeassistant/components/tts/* @pvizeli
homeassistant/components/tuya/* @ollo69
homeassistant/components/twentemilieu/* @frenck
homeassistant/components/twilio_call/* @robbiet480
homeassistant/components/twilio_sms/* @robbiet480
homeassistant/components/ubee/* @mzdrale
homeassistant/components/unifi/* @Kane610
homeassistant/components/unifiled/* @florisvdk
@@ -478,7 +472,7 @@ homeassistant/components/yeelightsunflower/* @lindsaymarkward
homeassistant/components/yessssms/* @flowolf
homeassistant/components/yi/* @bachya
homeassistant/components/yr/* @danielhiversen
homeassistant/components/zeroconf/* @robbiet480 @Kane610
homeassistant/components/zeroconf/* @Kane610
homeassistant/components/zerproc/* @emlove
homeassistant/components/zha/* @dmulcahey @adminiuga
homeassistant/components/zone/* @home-assistant/core

View File

@@ -10,9 +10,10 @@ WORKDIR /usr/src
COPY . homeassistant/
RUN \
pip3 install --no-cache-dir --no-index --only-binary=:all: --find-links "${WHEELS_LINKS}" \
-r homeassistant/requirements_all.txt -c homeassistant/homeassistant/package_constraints.txt \
-r homeassistant/requirements_all.txt \
&& pip3 uninstall -y typing \
&& pip3 install --no-cache-dir --no-index --only-binary=:all: --find-links "${WHEELS_LINKS}" \
-e ./homeassistant \
-e ./homeassistant \
&& python3 -m compileall homeassistant/homeassistant
# Home Assistant S6-Overlay

View File

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

View File

@@ -44,7 +44,7 @@ stages:
python -m venv venv
. venv/bin/activate
pip install -r requirements_test.txt -c homeassistant/package_constraints.txt
pip install -r requirements_test.txt
pre-commit install-hooks
- script: |
. venv/bin/activate
@@ -117,7 +117,7 @@ stages:
python -m venv venv
. venv/bin/activate
pip install -r requirements_test.txt -c homeassistant/package_constraints.txt
pip install -r requirements_test.txt
pre-commit install-hooks
- script: |
. venv/bin/activate
@@ -165,7 +165,7 @@ stages:
. venv/bin/activate
pip install -U pip setuptools pytest-azurepipelines pytest-xdist -c homeassistant/package_constraints.txt
pip install -r requirements_test_all.txt -c homeassistant/package_constraints.txt
pip install -r requirements_test_all.txt
# This is a TEMP. Eventually we should make sure our 4 dependencies drop typing.
# Find offending deps with `pipdeptree -r -p typing`
pip uninstall -y typing
@@ -209,8 +209,8 @@ stages:
. venv/bin/activate
pip install -U pip setuptools wheel
pip install -r requirements_all.txt -c homeassistant/package_constraints.txt
pip install -r requirements_test.txt -c homeassistant/package_constraints.txt
pip install -r requirements_all.txt
pip install -r requirements_test.txt
# This is a TEMP. Eventually we should make sure our 4 dependencies drop typing.
# Find offending deps with `pipdeptree -r -p typing`
pip uninstall -y typing
@@ -234,7 +234,7 @@ stages:
python -m venv venv
. venv/bin/activate
pip install -e . -r requirements_test.txt -c homeassistant/package_constraints.txt
pip install -e . -r requirements_test.txt
pre-commit install-hooks
- script: |
. venv/bin/activate

View File

@@ -17,7 +17,7 @@ schedules:
- dev
variables:
- name: versionWheels
value: '1.10.1-3.7-alpine3.11'
value: '1.13.0-3.8-alpine3.12'
resources:
repositories:
- repository: azure

View File

@@ -1,11 +1,11 @@
{
"image": "homeassistant/{arch}-homeassistant",
"build_from": {
"aarch64": "homeassistant/aarch64-homeassistant-base:7.2.0",
"armhf": "homeassistant/armhf-homeassistant-base:7.2.0",
"armv7": "homeassistant/armv7-homeassistant-base:7.2.0",
"amd64": "homeassistant/amd64-homeassistant-base:7.2.0",
"i386": "homeassistant/i386-homeassistant-base:7.2.0"
"aarch64": "homeassistant/aarch64-homeassistant-base:8.0.0",
"armhf": "homeassistant/armhf-homeassistant-base:8.0.0",
"armv7": "homeassistant/armv7-homeassistant-base:8.0.0",
"amd64": "homeassistant/amd64-homeassistant-base:8.0.0",
"i386": "homeassistant/i386-homeassistant-base:8.0.0"
},
"labels": {
"io.hass.type": "core"

View File

@@ -1,6 +1,5 @@
"""Start Home Assistant."""
import argparse
import asyncio
import os
import platform
import subprocess
@@ -8,32 +7,9 @@ import sys
import threading
from typing import List
import yarl
from homeassistant.const import REQUIRED_PYTHON_VER, RESTART_EXIT_CODE, __version__
def set_loop() -> None:
"""Attempt to use different loop."""
# pylint: disable=import-outside-toplevel
from asyncio.events import BaseDefaultEventLoopPolicy
if sys.platform == "win32":
if hasattr(asyncio, "WindowsProactorEventLoopPolicy"):
# pylint: disable=no-member
policy = asyncio.WindowsProactorEventLoopPolicy()
else:
class ProactorPolicy(BaseDefaultEventLoopPolicy):
"""Event loop policy to create proactor loops."""
_loop_factory = asyncio.ProactorEventLoop
policy = ProactorPolicy()
asyncio.set_event_loop_policy(policy)
def validate_python() -> None:
"""Validate that the right Python version is running."""
if sys.version_info[:3] < REQUIRED_PYTHON_VER:
@@ -240,39 +216,6 @@ def cmdline() -> List[str]:
return [arg for arg in sys.argv if arg != "--daemon"]
async def setup_and_run_hass(config_dir: str, args: argparse.Namespace) -> int:
"""Set up Home Assistant and run."""
# pylint: disable=import-outside-toplevel
from homeassistant import bootstrap
hass = await bootstrap.async_setup_hass(
config_dir=config_dir,
verbose=args.verbose,
log_rotate_days=args.log_rotate_days,
log_file=args.log_file,
log_no_color=args.log_no_color,
skip_pip=args.skip_pip,
safe_mode=args.safe_mode,
)
if hass is None:
return 1
if args.open_ui:
import webbrowser # pylint: disable=import-outside-toplevel
if hass.config.api is not None:
scheme = "https" if hass.config.api.use_ssl else "http"
url = str(
yarl.URL.build(
scheme=scheme, host="127.0.0.1", port=hass.config.api.port
)
)
hass.add_job(webbrowser.open, url)
return await hass.async_run()
def try_to_restart() -> None:
"""Attempt to clean up state and start a new Home Assistant instance."""
# Things should be mostly shut down already at this point, now just try
@@ -319,8 +262,6 @@ def main() -> int:
"""Start Home Assistant."""
validate_python()
set_loop()
# Run a simple daemon runner process on Windows to handle restarts
if os.name == "nt" and "--runner" not in sys.argv:
nt_args = cmdline() + ["--runner"]
@@ -353,7 +294,22 @@ def main() -> int:
if args.pid_file:
write_pid(args.pid_file)
exit_code = asyncio.run(setup_and_run_hass(config_dir, args), debug=args.debug)
# pylint: disable=import-outside-toplevel
from homeassistant import runner
runtime_conf = runner.RuntimeConfig(
config_dir=config_dir,
verbose=args.verbose,
log_rotate_days=args.log_rotate_days,
log_file=args.log_file,
log_no_color=args.log_no_color,
skip_pip=args.skip_pip,
safe_mode=args.safe_mode,
debug=args.debug,
open_ui=args.open_ui,
)
exit_code = runner.run(runtime_conf)
if exit_code == RESTART_EXIT_CODE and not args.runner:
try_to_restart()

View File

@@ -77,10 +77,10 @@ def _verify_otp(secret: str, otp: str, count: int) -> bool:
class NotifySetting:
"""Store notify setting for one user."""
secret = attr.ib(type=str, factory=_generate_secret) # not persistent
counter = attr.ib(type=int, factory=_generate_random) # not persistent
notify_service = attr.ib(type=Optional[str], default=None)
target = attr.ib(type=Optional[str], default=None)
secret: str = attr.ib(factory=_generate_secret) # not persistent
counter: int = attr.ib(factory=_generate_random) # not persistent
notify_service: Optional[str] = attr.ib(default=None)
target: Optional[str] = attr.ib(default=None)
_UsersDict = Dict[str, NotifySetting]

View File

@@ -20,39 +20,35 @@ TOKEN_TYPE_LONG_LIVED_ACCESS_TOKEN = "long_lived_access_token"
class Group:
"""A group."""
name = attr.ib(type=Optional[str])
policy = attr.ib(type=perm_mdl.PolicyType)
id = attr.ib(type=str, factory=lambda: uuid.uuid4().hex)
system_generated = attr.ib(type=bool, default=False)
name: Optional[str] = attr.ib()
policy: perm_mdl.PolicyType = attr.ib()
id: str = attr.ib(factory=lambda: uuid.uuid4().hex)
system_generated: bool = attr.ib(default=False)
@attr.s(slots=True)
class User:
"""A user."""
name = attr.ib(type=Optional[str])
perm_lookup = attr.ib(type=perm_mdl.PermissionLookup, eq=False, order=False)
id = attr.ib(type=str, factory=lambda: uuid.uuid4().hex)
is_owner = attr.ib(type=bool, default=False)
is_active = attr.ib(type=bool, default=False)
system_generated = attr.ib(type=bool, default=False)
name: Optional[str] = attr.ib()
perm_lookup: perm_mdl.PermissionLookup = attr.ib(eq=False, order=False)
id: str = attr.ib(factory=lambda: uuid.uuid4().hex)
is_owner: bool = attr.ib(default=False)
is_active: bool = attr.ib(default=False)
system_generated: bool = attr.ib(default=False)
groups = attr.ib(type=List[Group], factory=list, eq=False, order=False)
groups: List[Group] = attr.ib(factory=list, eq=False, order=False)
# List of credentials of a user.
credentials = attr.ib(type=List["Credentials"], factory=list, eq=False, order=False)
credentials: List["Credentials"] = attr.ib(factory=list, eq=False, order=False)
# Tokens associated with a user.
refresh_tokens = attr.ib(
type=Dict[str, "RefreshToken"], factory=dict, eq=False, order=False
refresh_tokens: Dict[str, "RefreshToken"] = attr.ib(
factory=dict, eq=False, order=False
)
_permissions = attr.ib(
type=Optional[perm_mdl.PolicyPermissions],
init=False,
eq=False,
order=False,
default=None,
_permissions: Optional[perm_mdl.PolicyPermissions] = attr.ib(
init=False, eq=False, order=False, default=None,
)
@property
@@ -88,39 +84,38 @@ class User:
class RefreshToken:
"""RefreshToken for a user to grant new access tokens."""
user = attr.ib(type=User)
client_id = attr.ib(type=Optional[str])
access_token_expiration = attr.ib(type=timedelta)
client_name = attr.ib(type=Optional[str], default=None)
client_icon = attr.ib(type=Optional[str], default=None)
token_type = attr.ib(
type=str,
user: User = attr.ib()
client_id: Optional[str] = attr.ib()
access_token_expiration: timedelta = attr.ib()
client_name: Optional[str] = attr.ib(default=None)
client_icon: Optional[str] = attr.ib(default=None)
token_type: str = attr.ib(
default=TOKEN_TYPE_NORMAL,
validator=attr.validators.in_(
(TOKEN_TYPE_NORMAL, TOKEN_TYPE_SYSTEM, TOKEN_TYPE_LONG_LIVED_ACCESS_TOKEN)
),
)
id = attr.ib(type=str, factory=lambda: uuid.uuid4().hex)
created_at = attr.ib(type=datetime, factory=dt_util.utcnow)
token = attr.ib(type=str, factory=lambda: secrets.token_hex(64))
jwt_key = attr.ib(type=str, factory=lambda: secrets.token_hex(64))
id: str = attr.ib(factory=lambda: uuid.uuid4().hex)
created_at: datetime = attr.ib(factory=dt_util.utcnow)
token: str = attr.ib(factory=lambda: secrets.token_hex(64))
jwt_key: str = attr.ib(factory=lambda: secrets.token_hex(64))
last_used_at = attr.ib(type=Optional[datetime], default=None)
last_used_ip = attr.ib(type=Optional[str], default=None)
last_used_at: Optional[datetime] = attr.ib(default=None)
last_used_ip: Optional[str] = attr.ib(default=None)
@attr.s(slots=True)
class Credentials:
"""Credentials for a user on an auth provider."""
auth_provider_type = attr.ib(type=str)
auth_provider_id = attr.ib(type=Optional[str])
auth_provider_type: str = attr.ib()
auth_provider_id: Optional[str] = attr.ib()
# Allow the auth provider to store data to represent their auth.
data = attr.ib(type=dict)
data: dict = attr.ib()
id = attr.ib(type=str, factory=lambda: uuid.uuid4().hex)
is_new = attr.ib(type=bool, default=True)
id: str = attr.ib(factory=lambda: uuid.uuid4().hex)
is_new: bool = attr.ib(default=True)
class UserMeta(NamedTuple):

View File

@@ -13,5 +13,5 @@ if TYPE_CHECKING:
class PermissionLookup:
"""Class to hold data for permission lookups."""
entity_registry = attr.ib(type="ent_reg.EntityRegistry")
device_registry = attr.ib(type="dev_reg.DeviceRegistry")
entity_registry: "ent_reg.EntityRegistry" = attr.ib()
device_registry: "dev_reg.DeviceRegistry" = attr.ib()

View File

@@ -75,7 +75,7 @@ class CommandLineAuthProvider(AuthProvider):
if process.returncode != 0:
_LOGGER.error(
"User %r failed to authenticate, command exited with code %d.",
"User %r failed to authenticate, command exited with code %d",
username,
process.returncode,
)

View File

@@ -190,7 +190,7 @@ class TrustedNetworksLoginFlow(LoginFlow):
).async_validate_access(self._ip_address)
except InvalidAuthError:
return self.async_abort(reason="not_whitelisted")
return self.async_abort(reason="not_allowed")
if user_input is not None:
return await self.async_finish(user_input)

View File

@@ -7,10 +7,11 @@ import logging.handlers
import os
import sys
from time import monotonic
from typing import Any, Dict, Optional, Set
from typing import TYPE_CHECKING, Any, Dict, Optional, Set
from async_timeout import timeout
import voluptuous as vol
import yarl
from homeassistant import config as conf_util, config_entries, core, loader
from homeassistant.components import http
@@ -31,6 +32,9 @@ from homeassistant.util.logging import async_activate_log_queue_handler
from homeassistant.util.package import async_get_user_site, is_virtual_env
from homeassistant.util.yaml import clear_secret_cache
if TYPE_CHECKING:
from .runner import RuntimeConfig
_LOGGER = logging.getLogger(__name__)
ERROR_LOG_FILENAME = "home-assistant.log"
@@ -66,23 +70,22 @@ STAGE_1_INTEGRATIONS = {
async def async_setup_hass(
*,
config_dir: str,
verbose: bool,
log_rotate_days: int,
log_file: str,
log_no_color: bool,
skip_pip: bool,
safe_mode: bool,
runtime_config: "RuntimeConfig",
) -> Optional[core.HomeAssistant]:
"""Set up Home Assistant."""
hass = core.HomeAssistant()
hass.config.config_dir = config_dir
hass.config.config_dir = runtime_config.config_dir
async_enable_logging(hass, verbose, log_rotate_days, log_file, log_no_color)
async_enable_logging(
hass,
runtime_config.verbose,
runtime_config.log_rotate_days,
runtime_config.log_file,
runtime_config.log_no_color,
)
hass.config.skip_pip = skip_pip
if skip_pip:
hass.config.skip_pip = runtime_config.skip_pip
if runtime_config.skip_pip:
_LOGGER.warning(
"Skipping pip installation of required modules. This may cause issues"
)
@@ -91,10 +94,11 @@ async def async_setup_hass(
_LOGGER.error("Error getting configuration path")
return None
_LOGGER.info("Config directory: %s", config_dir)
_LOGGER.info("Config directory: %s", runtime_config.config_dir)
config_dict = None
basic_setup_success = False
safe_mode = runtime_config.safe_mode
if not safe_mode:
await hass.async_add_executor_job(conf_util.process_ha_config_upgrade, hass)
@@ -107,7 +111,7 @@ async def async_setup_hass(
)
else:
if not is_virtual_env():
await async_mount_local_lib_path(config_dir)
await async_mount_local_lib_path(runtime_config.config_dir)
basic_setup_success = (
await async_from_config_dict(config_dict, hass) is not None
@@ -137,6 +141,7 @@ async def async_setup_hass(
safe_mode = True
old_config = hass.config
hass = core.HomeAssistant()
hass.config.skip_pip = old_config.skip_pip
hass.config.internal_url = old_config.internal_url
@@ -153,9 +158,32 @@ async def async_setup_hass(
{"safe_mode": {}, "http": http_conf}, hass,
)
if runtime_config.open_ui:
hass.add_job(open_hass_ui, hass)
return hass
def open_hass_ui(hass: core.HomeAssistant) -> None:
"""Open the UI."""
import webbrowser # pylint: disable=import-outside-toplevel
if hass.config.api is None or "frontend" not in hass.config.components:
_LOGGER.warning("Cannot launch the UI because frontend not loaded")
return
scheme = "https" if hass.config.api.use_ssl else "http"
url = str(
yarl.URL.build(scheme=scheme, host="127.0.0.1", port=hass.config.api.port)
)
if not webbrowser.open(url):
_LOGGER.warning(
"Unable to open the Home Assistant UI in a browser. Open it yourself at %s",
url,
)
async def async_from_config_dict(
config: ConfigType, hass: core.HomeAssistant
) -> Optional[core.HomeAssistant]:
@@ -351,7 +379,7 @@ async def _async_log_pending_setups(
remaining = [domain for domain in domains if domain in setup_started]
if remaining:
_LOGGER.info(
_LOGGER.warning(
"Waiting on integrations to complete setup: %s", ", ".join(remaining),
)

View File

@@ -37,7 +37,7 @@ def is_on(hass, entity_id=None):
continue
if not hasattr(component, "is_on"):
_LOGGER.warning("Integration %s has no is_on method.", domain)
_LOGGER.warning("Integration %s has no is_on method", domain)
continue
if component.is_on(ent_id):

View File

@@ -61,7 +61,7 @@ class AcmedaCover(AcmedaBase, CoverEntity):
None is unknown, 0 is closed, 100 is fully open.
"""
position = None
if self.roller.type == 7 or self.roller.type == 10:
if self.roller.type in [7, 10]:
position = 100 - self.roller.closed_percent
return position
@@ -86,37 +86,36 @@ class AcmedaCover(AcmedaBase, CoverEntity):
@property
def is_closed(self):
"""Return if the cover is closed."""
is_closed = self.roller.closed_percent == 100
return is_closed
return self.roller.closed_percent == 100
async def close_cover(self, **kwargs):
async def async_close_cover(self, **kwargs):
"""Close the roller."""
await self.roller.move_down()
async def open_cover(self, **kwargs):
async def async_open_cover(self, **kwargs):
"""Open the roller."""
await self.roller.move_up()
async def stop_cover(self, **kwargs):
async def async_stop_cover(self, **kwargs):
"""Stop the roller."""
await self.roller.move_stop()
async def set_cover_position(self, **kwargs):
async def async_set_cover_position(self, **kwargs):
"""Move the roller shutter to a specific position."""
await self.roller.move_to(100 - kwargs[ATTR_POSITION])
async def close_cover_tilt(self, **kwargs):
async def async_close_cover_tilt(self, **kwargs):
"""Close the roller."""
await self.roller.move_down()
async def open_cover_tilt(self, **kwargs):
async def async_open_cover_tilt(self, **kwargs):
"""Open the roller."""
await self.roller.move_up()
async def stop_cover_tilt(self, **kwargs):
async def async_stop_cover_tilt(self, **kwargs):
"""Stop the roller."""
await self.roller.move_stop()
async def set_cover_tilt(self, **kwargs):
async def async_set_cover_tilt(self, **kwargs):
"""Tilt the roller shutter to a specific position."""
await self.roller.move_to(100 - kwargs[ATTR_POSITION])

View File

@@ -183,7 +183,7 @@ class AdGuardHomeEntity(Entity):
except AdGuardHomeError:
if self._available:
_LOGGER.debug(
"An error occurred while updating AdGuard Home sensor.",
"An error occurred while updating AdGuard Home sensor",
exc_info=True,
)
self._available = False

View File

@@ -73,7 +73,7 @@ class AdGuardHomeSwitch(AdGuardHomeDeviceEntity, SwitchEntity):
try:
await self._adguard_turn_off()
except AdGuardHomeError:
_LOGGER.error("An error occurred while turning off AdGuard Home switch.")
_LOGGER.error("An error occurred while turning off AdGuard Home switch")
self._available = False
async def _adguard_turn_off(self) -> None:
@@ -85,7 +85,7 @@ class AdGuardHomeSwitch(AdGuardHomeDeviceEntity, SwitchEntity):
try:
await self._adguard_turn_on()
except AdGuardHomeError:
_LOGGER.error("An error occurred while turning on AdGuard Home switch.")
_LOGGER.error("An error occurred while turning on AdGuard Home switch")
self._available = False
async def _adguard_turn_on(self) -> None:

View File

@@ -4,6 +4,14 @@
"hassio_confirm": {
"description": "Chcete nakonfigurovat slu\u017ebu Home Assistant pro p\u0159ipojen\u00ed k AddGuard pomoc\u00ed hass.io {addon}?",
"title": "AdGuard prost\u0159ednictv\u00edm dopl\u0148ku Hass.io"
},
"user": {
"data": {
"host": "Hostitel",
"password": "Heslo",
"port": "Port",
"username": "U\u017eivatelsk\u00e9 jm\u00e9no"
}
}
}
}

View File

@@ -1,10 +1,17 @@
{
"config": {
"error": {
"connection_error": "Falha na liga\u00e7\u00e3o"
},
"step": {
"hassio_confirm": {
"title": "AdGuard Home via Hass.io add-on"
},
"user": {
"data": {
"host": "Servidor",
"password": "Palavra-passe",
"port": "Porta",
"username": "Nome de Utilizador"
}
}

View File

@@ -2,6 +2,6 @@
"domain": "ads",
"name": "ADS",
"documentation": "https://www.home-assistant.io/integrations/ads",
"requirements": ["pyads==3.0.7"],
"requirements": ["pyads==3.1.3"],
"codeowners": []
}

View File

@@ -74,8 +74,8 @@ class AgentCamera(MjpegCamera):
device_info = {
CONF_NAME: device.name,
CONF_MJPEG_URL: f"{self.server_url}{device.mjpeg_image_url}&size=640x480",
CONF_STILL_IMAGE_URL: f"{self.server_url}{device.still_image_url}&size=640x480",
CONF_MJPEG_URL: f"{self.server_url}{device.mjpeg_image_url}&size={device.mjpegStreamWidth}x{device.mjpegStreamHeight}",
CONF_STILL_IMAGE_URL: f"{self.server_url}{device.still_image_url}&size={device.mjpegStreamWidth}x{device.mjpegStreamHeight}",
}
self.device = device
self._removed = False

View File

@@ -2,7 +2,7 @@
"domain": "agent_dvr",
"name": "Agent DVR",
"documentation": "https://www.home-assistant.io/integrations/agent_dvr/",
"requirements": ["agent-py==0.0.20"],
"requirements": ["agent-py==0.0.23"],
"config_flow": true,
"codeowners": ["@ispysoftware"]
}

View File

@@ -0,0 +1,12 @@
{
"config": {
"step": {
"user": {
"data": {
"host": "Hostitel",
"port": "Port"
}
}
}
}
}

View File

@@ -10,7 +10,7 @@
"step": {
"user": {
"data": {
"host": "H\u00f4te",
"host": "Nom d'h\u00f4te ou adresse IP",
"port": "Port"
},
"title": "Configurer l'agent DVR"

View File

@@ -0,0 +1,11 @@
{
"config": {
"step": {
"user": {
"data": {
"api_key": "Kl\u00ed\u010d API"
}
}
}
}
}

View File

@@ -0,0 +1,16 @@
{
"config": {
"step": {
"geography": {
"data": {
"api_key": "Kl\u00ed\u010d API"
}
},
"node_pro": {
"data": {
"password": "Heslo"
}
}
}
}
}

View File

@@ -0,0 +1,11 @@
{
"config": {
"step": {
"node_pro": {
"data": {
"password": "Palavra-passe"
}
}
}
}
}

View File

@@ -8,7 +8,7 @@ alarm_disarm:
example: "alarm_control_panel.downstairs"
code:
description: An optional code to disarm the alarm control panel with.
example: 1234
example: "1234"
alarm_arm_custom_bypass:
description: Send arm custom bypass command.
@@ -18,7 +18,7 @@ alarm_arm_custom_bypass:
example: "alarm_control_panel.downstairs"
code:
description: An optional code to arm custom bypass the alarm control panel with.
example: 1234
example: "1234"
alarm_arm_home:
description: Send the alarm the command for arm home.
@@ -28,7 +28,7 @@ alarm_arm_home:
example: "alarm_control_panel.downstairs"
code:
description: An optional code to arm home the alarm control panel with.
example: 1234
example: "1234"
alarm_arm_away:
description: Send the alarm the command for arm away.
@@ -38,7 +38,7 @@ alarm_arm_away:
example: "alarm_control_panel.downstairs"
code:
description: An optional code to arm away the alarm control panel with.
example: 1234
example: "1234"
alarm_arm_night:
description: Send the alarm the command for arm night.
@@ -48,7 +48,7 @@ alarm_arm_night:
example: "alarm_control_panel.downstairs"
code:
description: An optional code to arm night the alarm control panel with.
example: 1234
example: "1234"
alarm_trigger:
description: Send the alarm the command for trigger.
@@ -58,4 +58,4 @@ alarm_trigger:
example: "alarm_control_panel.downstairs"
code:
description: An optional code to trigger the alarm control panel with.
example: 1234
example: "1234"

View File

@@ -18,7 +18,7 @@
"armed_away": "{entity_name} armada ausente",
"armed_home": "{entity_name} armada en casa",
"armed_night": "{entity_name} armada noche",
"disarmed": "{entity_name} desarmado",
"disarmed": "{entity_name} desarmada",
"triggered": "{entity_name} activado"
}
},

View File

@@ -162,7 +162,7 @@ def setup(hass, config):
if not restart:
return
restart = False
_LOGGER.warning("AlarmDecoder unexpectedly lost connection.")
_LOGGER.warning("AlarmDecoder unexpectedly lost connection")
hass.add_job(open_connection)
def handle_message(sender, message):

View File

@@ -199,8 +199,8 @@ class Alert(ToggleEntity):
self._send_done_message = False
self.entity_id = f"{DOMAIN}.{entity_id}"
event.async_track_state_change(
hass, watched_entity_id, self.watched_entity_change
event.async_track_state_change_event(
hass, [watched_entity_id], self.watched_entity_change
)
@property
@@ -222,9 +222,12 @@ class Alert(ToggleEntity):
return STATE_ON
return STATE_IDLE
async def watched_entity_change(self, entity, from_state, to_state):
async def watched_entity_change(self, ev):
"""Determine if the alert should start or stop."""
_LOGGER.debug("Watched entity (%s) has changed", entity)
to_state = ev.data.get("new_state")
if to_state is None:
return
_LOGGER.debug("Watched entity (%s) has changed", ev.data.get("entity_id"))
if to_state.state == self._alert_state and not self._firing:
await self.begin_alerting()
if to_state.state != self._alert_state and self._firing:

View File

@@ -70,11 +70,11 @@ class Auth:
await self.async_load_preferences()
if self.is_token_valid():
_LOGGER.debug("Token still valid, using it.")
_LOGGER.debug("Token still valid, using it")
return self._prefs[STORAGE_ACCESS_TOKEN]
if self._prefs[STORAGE_REFRESH_TOKEN] is None:
_LOGGER.debug("Token invalid and no refresh token available.")
_LOGGER.debug("Token invalid and no refresh token available")
return None
lwa_params = {
@@ -84,7 +84,7 @@ class Auth:
CONF_CLIENT_SECRET: self.client_secret,
}
_LOGGER.debug("Calling LWA to refresh the access token.")
_LOGGER.debug("Calling LWA to refresh the access token")
return await self._async_request_new_token(lwa_params)
@callback
@@ -113,14 +113,14 @@ class Auth:
)
except (asyncio.TimeoutError, aiohttp.ClientError):
_LOGGER.error("Timeout calling LWA to get auth token.")
_LOGGER.error("Timeout calling LWA to get auth token")
return None
_LOGGER.debug("LWA response header: %s", response.headers)
_LOGGER.debug("LWA response status: %s", response.status)
if response.status != HTTP_OK:
_LOGGER.error("Error calling LWA to get auth token.")
_LOGGER.error("Error calling LWA to get auth token")
return None
response_json = await response.json()

View File

@@ -590,9 +590,8 @@ class ScriptCapabilities(AlexaEntity):
def interfaces(self):
"""Yield the supported interfaces."""
can_cancel = bool(self.entity.attributes.get("can_cancel"))
return [
AlexaSceneController(self.entity, supports_deactivation=can_cancel),
AlexaSceneController(self.entity, supports_deactivation=True),
Alexa(self.hass),
]

View File

@@ -101,7 +101,7 @@ async def async_send_changereport_message(
)
except (asyncio.TimeoutError, aiohttp.ClientError):
_LOGGER.error("Timeout sending report to Alexa.")
_LOGGER.error("Timeout sending report to Alexa")
return
response_text = await response.text()
@@ -233,7 +233,7 @@ async def async_send_doorbell_event_message(hass, config, alexa_entity):
)
except (asyncio.TimeoutError, aiohttp.ClientError):
_LOGGER.error("Timeout sending report to Alexa.")
_LOGGER.error("Timeout sending report to Alexa")
return
response_text = await response.text()

View File

@@ -3,5 +3,5 @@
"name": "Amazon Polly",
"documentation": "https://www.home-assistant.io/integrations/amazon_polly",
"requirements": ["boto3==1.9.252"],
"codeowners": ["@robbiet480"]
"codeowners": []
}

View File

@@ -0,0 +1,11 @@
{
"config": {
"step": {
"user": {
"data": {
"api_key": "Kl\u00ed\u010d API"
}
}
}
}
}

View File

@@ -33,7 +33,7 @@ from homeassistant.helpers.dispatcher import async_dispatcher_send, dispatcher_s
from homeassistant.helpers.event import track_time_interval
from homeassistant.helpers.service import async_extract_entity_ids
from .binary_sensor import BINARY_SENSORS
from .binary_sensor import BINARY_POLLED_SENSORS, BINARY_SENSORS, check_binary_sensors
from .camera import CAMERA_SERVICES, STREAM_SOURCE_LIST
from .const import (
CAMERAS,
@@ -98,7 +98,7 @@ AMCREST_SCHEMA = vol.Schema(
vol.Optional(CONF_FFMPEG_ARGUMENTS, default=DEFAULT_ARGUMENTS): cv.string,
vol.Optional(CONF_SCAN_INTERVAL, default=SCAN_INTERVAL): cv.time_period,
vol.Optional(CONF_BINARY_SENSORS): vol.All(
cv.ensure_list, [vol.In(BINARY_SENSORS)], vol.Unique()
cv.ensure_list, [vol.In(BINARY_SENSORS)], vol.Unique(), check_binary_sensors
),
vol.Optional(CONF_SENSORS): vol.All(
cv.ensure_list, [vol.In(SENSORS)], vol.Unique()
@@ -271,7 +271,7 @@ def setup(hass, config):
event_codes = [
BINARY_SENSORS[sensor_type][SENSOR_EVENT_CODE]
for sensor_type in binary_sensors
if BINARY_SENSORS[sensor_type][SENSOR_EVENT_CODE] is not None
if sensor_type not in BINARY_POLLED_SENSORS
]
if event_codes:
_start_event_monitor(hass, name, api, event_codes)

View File

@@ -3,15 +3,18 @@ from datetime import timedelta
import logging
from amcrest import AmcrestError
import voluptuous as vol
from homeassistant.components.binary_sensor import (
DEVICE_CLASS_CONNECTIVITY,
DEVICE_CLASS_MOTION,
DEVICE_CLASS_SOUND,
BinarySensorEntity,
)
from homeassistant.const import CONF_BINARY_SENSORS, CONF_NAME
from homeassistant.core import callback
from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.util import Throttle
from .const import (
BINARY_SENSOR_SCAN_INTERVAL_SECS,
@@ -28,25 +31,48 @@ from .helpers import log_update_error, service_signal
_LOGGER = logging.getLogger(__name__)
SCAN_INTERVAL = timedelta(seconds=BINARY_SENSOR_SCAN_INTERVAL_SECS)
_ONLINE_SCAN_INTERVAL = timedelta(seconds=60 - BINARY_SENSOR_SCAN_INTERVAL_SECS)
BINARY_SENSOR_AUDIO_DETECTED = "audio_detected"
BINARY_SENSOR_AUDIO_DETECTED_POLLED = "audio_detected_polled"
BINARY_SENSOR_MOTION_DETECTED = "motion_detected"
BINARY_SENSOR_MOTION_DETECTED_POLLED = "motion_detected_polled"
BINARY_SENSOR_ONLINE = "online"
BINARY_POLLED_SENSORS = [
BINARY_SENSOR_AUDIO_DETECTED_POLLED,
BINARY_SENSOR_MOTION_DETECTED_POLLED,
BINARY_SENSOR_ONLINE,
]
_AUDIO_DETECTED_PARAMS = ("Audio Detected", DEVICE_CLASS_SOUND, "AudioMutation")
_MOTION_DETECTED_PARAMS = ("Motion Detected", DEVICE_CLASS_MOTION, "VideoMotion")
BINARY_SENSORS = {
BINARY_SENSOR_MOTION_DETECTED: (
"Motion Detected",
DEVICE_CLASS_MOTION,
"VideoMotion",
),
BINARY_SENSOR_AUDIO_DETECTED: _AUDIO_DETECTED_PARAMS,
BINARY_SENSOR_AUDIO_DETECTED_POLLED: _AUDIO_DETECTED_PARAMS,
BINARY_SENSOR_MOTION_DETECTED: _MOTION_DETECTED_PARAMS,
BINARY_SENSOR_MOTION_DETECTED_POLLED: _MOTION_DETECTED_PARAMS,
BINARY_SENSOR_ONLINE: ("Online", DEVICE_CLASS_CONNECTIVITY, None),
}
BINARY_SENSORS = {
k: dict(zip((SENSOR_NAME, SENSOR_DEVICE_CLASS, SENSOR_EVENT_CODE), v))
for k, v in BINARY_SENSORS.items()
}
_EXCLUSIVE_OPTIONS = [
{BINARY_SENSOR_MOTION_DETECTED, BINARY_SENSOR_MOTION_DETECTED_POLLED},
]
_UPDATE_MSG = "Updating %s binary sensor"
def check_binary_sensors(value):
"""Validate binary sensor configurations."""
for exclusive_options in _EXCLUSIVE_OPTIONS:
if len(set(value) & exclusive_options) > 1:
raise vol.Invalid(
f"must contain at most one of {', '.join(exclusive_options)}."
)
return value
async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
"""Set up a binary sensor for an Amcrest IP Camera."""
if discovery_info is None:
@@ -80,7 +106,7 @@ class AmcrestBinarySensor(BinarySensorEntity):
@property
def should_poll(self):
"""Return True if entity has to be polled for state."""
return self._sensor_type == BINARY_SENSOR_ONLINE
return self._sensor_type in BINARY_POLLED_SENSORS
@property
def name(self):
@@ -109,6 +135,7 @@ class AmcrestBinarySensor(BinarySensorEntity):
else:
self._update_others()
@Throttle(_ONLINE_SCAN_INTERVAL)
def _update_online(self):
if not (self._api.available or self.is_on):
return
@@ -137,6 +164,11 @@ class AmcrestBinarySensor(BinarySensorEntity):
async def async_on_demand_update(self):
"""Update state."""
if self._sensor_type == BINARY_SENSOR_ONLINE:
_LOGGER.debug(_UPDATE_MSG, self._name)
self._state = self._api.available
self.async_write_ha_state()
return
self.async_schedule_update_ha_state(True)
@callback
@@ -155,7 +187,7 @@ class AmcrestBinarySensor(BinarySensorEntity):
self.async_on_demand_update,
)
)
if self._event_code:
if self._event_code and self._sensor_type not in BINARY_POLLED_SENSORS:
self._unsub_dispatcher.append(
async_dispatcher_connect(
self.hass,

View File

@@ -4,7 +4,7 @@ DATA_AMCREST = DOMAIN
CAMERAS = "cameras"
DEVICES = "devices"
BINARY_SENSOR_SCAN_INTERVAL_SECS = 60
BINARY_SENSOR_SCAN_INTERVAL_SECS = 5
CAMERA_WEB_SESSION_TIMEOUT = 10
COMM_RETRIES = 1
COMM_TIMEOUT = 6.05

View File

@@ -3,8 +3,8 @@
"name": "Android TV",
"documentation": "https://www.home-assistant.io/integrations/androidtv",
"requirements": [
"adb-shell==0.1.3",
"androidtv==0.0.43",
"adb-shell[async]==0.2.0",
"androidtv[async]==0.0.45",
"pure-python-adb==0.2.2.dev0"
],
"codeowners": ["@JeffLIrion"]

View File

@@ -5,15 +5,18 @@ import logging
import os
from adb_shell.auth.keygen import keygen
from adb_shell.auth.sign_pythonrsa import PythonRSASigner
from adb_shell.exceptions import (
AdbTimeoutError,
InvalidChecksumError,
InvalidCommandError,
InvalidResponseError,
TcpTimeoutException,
)
from androidtv import ha_state_detection_rules_validator, setup
from androidtv import ha_state_detection_rules_validator
from androidtv.constants import APPS, KEYS
from androidtv.exceptions import LockNotAcquiredException
from androidtv.setup_async import setup
import voluptuous as vol
from homeassistant.components.media_player import PLATFORM_SCHEMA, MediaPlayerEntity
@@ -44,7 +47,7 @@ from homeassistant.const import (
STATE_STANDBY,
)
from homeassistant.exceptions import PlatformNotReady
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers import config_validation as cv, entity_platform
from homeassistant.helpers.storage import STORAGE_DIR
ANDROIDTV_DOMAIN = "androidtv"
@@ -103,6 +106,7 @@ DEVICE_CLASSES = [DEFAULT_DEVICE_CLASS, DEVICE_ANDROIDTV, DEVICE_FIRETV]
SERVICE_ADB_COMMAND = "adb_command"
SERVICE_DOWNLOAD = "download"
SERVICE_LEARN_SENDEVENT = "learn_sendevent"
SERVICE_UPLOAD = "upload"
SERVICE_ADB_COMMAND_SCHEMA = vol.Schema(
@@ -161,7 +165,30 @@ ANDROIDTV_STATES = {
}
def setup_platform(hass, config, add_entities, discovery_info=None):
def setup_androidtv(hass, config):
"""Generate an ADB key (if needed) and load it."""
adbkey = config.get(CONF_ADBKEY, hass.config.path(STORAGE_DIR, "androidtv_adbkey"))
if CONF_ADB_SERVER_IP not in config:
# Use "adb_shell" (Python ADB implementation)
if not os.path.isfile(adbkey):
# Generate ADB key files
keygen(adbkey)
# Load the ADB key
with open(adbkey) as priv_key:
priv = priv_key.read()
signer = PythonRSASigner("", priv)
adb_log = f"using Python ADB implementation with adbkey='{adbkey}'"
else:
# Use "pure-python-adb" (communicate with ADB server)
signer = None
adb_log = f"using ADB server at {config[CONF_ADB_SERVER_IP]}:{config[CONF_ADB_SERVER_PORT]}"
return adbkey, signer, adb_log
async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
"""Set up the Android TV / Fire TV platform."""
hass.data.setdefault(ANDROIDTV_DOMAIN, {})
@@ -171,51 +198,21 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
_LOGGER.warning("Platform already setup on %s, skipping", address)
return
if CONF_ADB_SERVER_IP not in config:
# Use "adb_shell" (Python ADB implementation)
if CONF_ADBKEY not in config:
# Generate ADB key files (if they don't exist)
adbkey = hass.config.path(STORAGE_DIR, "androidtv_adbkey")
if not os.path.isfile(adbkey):
keygen(adbkey)
adbkey, signer, adb_log = await hass.async_add_executor_job(
setup_androidtv, hass, config
)
adb_log = f"using Python ADB implementation with adbkey='{adbkey}'"
aftv = setup(
config[CONF_HOST],
config[CONF_PORT],
adbkey,
device_class=config[CONF_DEVICE_CLASS],
state_detection_rules=config[CONF_STATE_DETECTION_RULES],
auth_timeout_s=10.0,
)
else:
adb_log = (
f"using Python ADB implementation with adbkey='{config[CONF_ADBKEY]}'"
)
aftv = setup(
config[CONF_HOST],
config[CONF_PORT],
config[CONF_ADBKEY],
device_class=config[CONF_DEVICE_CLASS],
state_detection_rules=config[CONF_STATE_DETECTION_RULES],
auth_timeout_s=10.0,
)
else:
# Use "pure-python-adb" (communicate with ADB server)
adb_log = f"using ADB server at {config[CONF_ADB_SERVER_IP]}:{config[CONF_ADB_SERVER_PORT]}"
aftv = setup(
config[CONF_HOST],
config[CONF_PORT],
adb_server_ip=config[CONF_ADB_SERVER_IP],
adb_server_port=config[CONF_ADB_SERVER_PORT],
device_class=config[CONF_DEVICE_CLASS],
state_detection_rules=config[CONF_STATE_DETECTION_RULES],
)
aftv = await setup(
config[CONF_HOST],
config[CONF_PORT],
adbkey,
config.get(CONF_ADB_SERVER_IP, ""),
config[CONF_ADB_SERVER_PORT],
config[CONF_STATE_DETECTION_RULES],
config[CONF_DEVICE_CLASS],
10.0,
signer,
)
if not aftv.available:
# Determine the name that will be used for the device in the log
@@ -251,14 +248,16 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
device = FireTVDevice(*device_args)
device_name = config.get(CONF_NAME, "Fire TV")
add_entities([device])
async_add_entities([device])
_LOGGER.debug("Setup %s at %s %s", device_name, address, adb_log)
hass.data[ANDROIDTV_DOMAIN][address] = device
if hass.services.has_service(ANDROIDTV_DOMAIN, SERVICE_ADB_COMMAND):
return
def service_adb_command(service):
platform = entity_platform.current_platform.get()
async def service_adb_command(service):
"""Dispatch service calls to target entities."""
cmd = service.data[ATTR_COMMAND]
entity_id = service.data[ATTR_ENTITY_ID]
@@ -269,7 +268,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
]
for target_device in target_devices:
output = target_device.adb_command(cmd)
output = await target_device.adb_command(cmd)
# log the output, if there is any
if output:
@@ -280,14 +279,18 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
output,
)
hass.services.register(
hass.services.async_register(
ANDROIDTV_DOMAIN,
SERVICE_ADB_COMMAND,
service_adb_command,
schema=SERVICE_ADB_COMMAND_SCHEMA,
)
def service_download(service):
platform.async_register_entity_service(
SERVICE_LEARN_SENDEVENT, {}, "learn_sendevent"
)
async def service_download(service):
"""Download a file from your Android TV / Fire TV device to your Home Assistant instance."""
local_path = service.data[ATTR_LOCAL_PATH]
if not hass.config.is_allowed_path(local_path):
@@ -302,16 +305,16 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
if dev.entity_id in entity_id
][0]
target_device.adb_pull(local_path, device_path)
await target_device.adb_pull(local_path, device_path)
hass.services.register(
hass.services.async_register(
ANDROIDTV_DOMAIN,
SERVICE_DOWNLOAD,
service_download,
schema=SERVICE_DOWNLOAD_SCHEMA,
)
def service_upload(service):
async def service_upload(service):
"""Upload a file from your Home Assistant instance to an Android TV / Fire TV device."""
local_path = service.data[ATTR_LOCAL_PATH]
if not hass.config.is_allowed_path(local_path):
@@ -327,9 +330,9 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
]
for target_device in target_devices:
target_device.adb_push(local_path, device_path)
await target_device.adb_push(local_path, device_path)
hass.services.register(
hass.services.async_register(
ANDROIDTV_DOMAIN, SERVICE_UPLOAD, service_upload, schema=SERVICE_UPLOAD_SCHEMA
)
@@ -345,13 +348,13 @@ def adb_decorator(override_available=False):
"""Wrap the provided ADB method and catch exceptions."""
@functools.wraps(func)
def _adb_exception_catcher(self, *args, **kwargs):
async def _adb_exception_catcher(self, *args, **kwargs):
"""Call an ADB-related method and catch exceptions."""
if not self.available and not override_available:
return None
try:
return func(self, *args, **kwargs)
return await func(self, *args, **kwargs)
except LockNotAcquiredException:
# If the ADB lock could not be acquired, skip this command
_LOGGER.info(
@@ -364,7 +367,7 @@ def adb_decorator(override_available=False):
"establishing attempt in the next update. Error: %s",
err,
)
self.aftv.adb_close()
await self.aftv.adb_close()
self._available = False # pylint: disable=protected-access
return None
@@ -411,6 +414,7 @@ class ADBDevice(MediaPlayerEntity):
if not self.aftv.adb_server_ip:
# Using "adb_shell" (Python ADB implementation)
self.exceptions = (
AdbTimeoutError,
AttributeError,
BrokenPipeError,
ConnectionResetError,
@@ -487,64 +491,60 @@ class ADBDevice(MediaPlayerEntity):
"""Return the device unique id."""
return self._unique_id
@adb_decorator()
async def async_get_media_image(self):
"""Fetch current playing image."""
if not self._screencap or self.state in [STATE_OFF, None] or not self.available:
return None, None
media_data = await self.hass.async_add_executor_job(self.get_raw_media_data)
media_data = await self.aftv.adb_screencap()
if media_data:
return media_data, "image/png"
return None, None
@adb_decorator()
def get_raw_media_data(self):
"""Raw image data."""
return self.aftv.adb_screencap()
@adb_decorator()
def media_play(self):
async def async_media_play(self):
"""Send play command."""
self.aftv.media_play()
await self.aftv.media_play()
@adb_decorator()
def media_pause(self):
async def async_media_pause(self):
"""Send pause command."""
self.aftv.media_pause()
await self.aftv.media_pause()
@adb_decorator()
def media_play_pause(self):
async def async_media_play_pause(self):
"""Send play/pause command."""
self.aftv.media_play_pause()
await self.aftv.media_play_pause()
@adb_decorator()
def turn_on(self):
async def async_turn_on(self):
"""Turn on the device."""
if self.turn_on_command:
self.aftv.adb_shell(self.turn_on_command)
await self.aftv.adb_shell(self.turn_on_command)
else:
self.aftv.turn_on()
await self.aftv.turn_on()
@adb_decorator()
def turn_off(self):
async def async_turn_off(self):
"""Turn off the device."""
if self.turn_off_command:
self.aftv.adb_shell(self.turn_off_command)
await self.aftv.adb_shell(self.turn_off_command)
else:
self.aftv.turn_off()
await self.aftv.turn_off()
@adb_decorator()
def media_previous_track(self):
async def async_media_previous_track(self):
"""Send previous track command (results in rewind)."""
self.aftv.media_previous_track()
await self.aftv.media_previous_track()
@adb_decorator()
def media_next_track(self):
async def async_media_next_track(self):
"""Send next track command (results in fast-forward)."""
self.aftv.media_next_track()
await self.aftv.media_next_track()
@adb_decorator()
def select_source(self, source):
async def async_select_source(self, source):
"""Select input source.
If the source starts with a '!', then it will close the app instead of
@@ -552,50 +552,58 @@ class ADBDevice(MediaPlayerEntity):
"""
if isinstance(source, str):
if not source.startswith("!"):
self.aftv.launch_app(self._app_name_to_id.get(source, source))
await self.aftv.launch_app(self._app_name_to_id.get(source, source))
else:
source_ = source[1:].lstrip()
self.aftv.stop_app(self._app_name_to_id.get(source_, source_))
await self.aftv.stop_app(self._app_name_to_id.get(source_, source_))
@adb_decorator()
def adb_command(self, cmd):
async def adb_command(self, cmd):
"""Send an ADB command to an Android TV / Fire TV device."""
key = self._keys.get(cmd)
if key:
self.aftv.adb_shell(f"input keyevent {key}")
self._adb_response = None
self.schedule_update_ha_state()
await self.aftv.adb_shell(f"input keyevent {key}")
return
if cmd == "GET_PROPERTIES":
self._adb_response = str(self.aftv.get_properties_dict())
self.schedule_update_ha_state()
self._adb_response = str(await self.aftv.get_properties_dict())
self.async_write_ha_state()
return self._adb_response
try:
response = self.aftv.adb_shell(cmd)
response = await self.aftv.adb_shell(cmd)
except UnicodeDecodeError:
self._adb_response = None
self.schedule_update_ha_state()
return
if isinstance(response, str) and response.strip():
self._adb_response = response.strip()
else:
self._adb_response = None
self.async_write_ha_state()
self.schedule_update_ha_state()
return self._adb_response
@adb_decorator()
def adb_pull(self, local_path, device_path):
"""Download a file from your Android TV / Fire TV device to your Home Assistant instance."""
self.aftv.adb_pull(local_path, device_path)
async def learn_sendevent(self):
"""Translate a key press on a remote to ADB 'sendevent' commands."""
output = await self.aftv.learn_sendevent()
if output:
self._adb_response = output
self.async_write_ha_state()
msg = f"Output from service '{SERVICE_LEARN_SENDEVENT}' from {self.entity_id}: '{output}'"
self.hass.components.persistent_notification.async_create(
msg, title="Android TV",
)
_LOGGER.info("%s", msg)
@adb_decorator()
def adb_push(self, local_path, device_path):
async def adb_pull(self, local_path, device_path):
"""Download a file from your Android TV / Fire TV device to your Home Assistant instance."""
await self.aftv.adb_pull(local_path, device_path)
@adb_decorator()
async def adb_push(self, local_path, device_path):
"""Upload a file from your Home Assistant instance to an Android TV / Fire TV device."""
self.aftv.adb_push(local_path, device_path)
await self.aftv.adb_push(local_path, device_path)
class AndroidTVDevice(ADBDevice):
@@ -628,17 +636,12 @@ class AndroidTVDevice(ADBDevice):
self._volume_level = None
@adb_decorator(override_available=True)
def update(self):
async def async_update(self):
"""Update the device state and, if necessary, re-connect."""
# Check if device is disconnected.
if not self._available:
# Try to connect
self._available = self.aftv.adb_connect(always_log_errors=False)
# To be safe, wait until the next update to run ADB commands if
# using the Python ADB implementation.
if not self.aftv.adb_server_ip:
return
self._available = await self.aftv.adb_connect(always_log_errors=False)
# If the ADB connection is not intact, don't update.
if not self._available:
@@ -652,7 +655,7 @@ class AndroidTVDevice(ADBDevice):
_,
self._is_volume_muted,
self._volume_level,
) = self.aftv.update(self._get_sources)
) = await self.aftv.update(self._get_sources)
self._state = ANDROIDTV_STATES.get(state)
if self._state is None:
@@ -685,53 +688,50 @@ class AndroidTVDevice(ADBDevice):
return self._volume_level
@adb_decorator()
def media_stop(self):
async def async_media_stop(self):
"""Send stop command."""
self.aftv.media_stop()
await self.aftv.media_stop()
@adb_decorator()
def mute_volume(self, mute):
async def async_mute_volume(self, mute):
"""Mute the volume."""
self.aftv.mute_volume()
await self.aftv.mute_volume()
@adb_decorator()
def set_volume_level(self, volume):
async def async_set_volume_level(self, volume):
"""Set the volume level."""
self.aftv.set_volume_level(volume)
await self.aftv.set_volume_level(volume)
@adb_decorator()
def volume_down(self):
async def async_volume_down(self):
"""Send volume down command."""
self._volume_level = self.aftv.volume_down(self._volume_level)
self._volume_level = await self.aftv.volume_down(self._volume_level)
@adb_decorator()
def volume_up(self):
async def async_volume_up(self):
"""Send volume up command."""
self._volume_level = self.aftv.volume_up(self._volume_level)
self._volume_level = await self.aftv.volume_up(self._volume_level)
class FireTVDevice(ADBDevice):
"""Representation of a Fire TV device."""
@adb_decorator(override_available=True)
def update(self):
async def async_update(self):
"""Update the device state and, if necessary, re-connect."""
# Check if device is disconnected.
if not self._available:
# Try to connect
self._available = self.aftv.adb_connect(always_log_errors=False)
# To be safe, wait until the next update to run ADB commands if
# using the Python ADB implementation.
if not self.aftv.adb_server_ip:
return
self._available = await self.aftv.adb_connect(always_log_errors=False)
# If the ADB connection is not intact, don't update.
if not self._available:
return
# Get the `state`, `current_app`, and `running_apps`.
state, self._current_app, running_apps = self.aftv.update(self._get_sources)
state, self._current_app, running_apps = await self.aftv.update(
self._get_sources
)
self._state = ANDROIDTV_STATES.get(state)
if self._state is None:
@@ -754,6 +754,6 @@ class FireTVDevice(ADBDevice):
return SUPPORT_FIRETV
@adb_decorator()
def media_stop(self):
async def async_media_stop(self):
"""Send stop (back) command."""
self.aftv.back()
await self.aftv.back()

View File

@@ -33,3 +33,9 @@ upload:
local_path:
description: The filepath on your Home Assistant instance.
example: "/config/www/example.txt"
learn_sendevent:
description: Translate a key press on a remote into ADB 'sendevent' commands. You must press one button on the remote within 8 seconds of calling this service.
fields:
entity_id:
description: Name(s) of Android TV / Fire TV entities.
example: "media_player.android_tv_living_room"

View File

@@ -2,6 +2,6 @@
"domain": "apache_kafka",
"name": "Apache Kafka",
"documentation": "https://www.home-assistant.io/integrations/apache_kafka",
"requirements": ["aiokafka==0.5.1"],
"requirements": ["aiokafka==0.6.0"],
"codeowners": ["@bachya"]
}

View File

@@ -48,7 +48,7 @@ def setup(hass, config):
try:
apcups_data.update(no_throttle=True)
except Exception: # pylint: disable=broad-except
_LOGGER.exception("Failure while testing APCUPSd status retrieval.")
_LOGGER.exception("Failure while testing APCUPSd status retrieval")
return False
return True

View File

@@ -36,13 +36,13 @@ SENSOR_TYPES = {
"battv": ["Battery Voltage", VOLT, "mdi:flash"],
"bcharge": ["Battery", UNIT_PERCENTAGE, "mdi:battery"],
"cable": ["Cable Type", "", "mdi:ethernet-cable"],
"cumonbatt": ["Total Time on Battery", "", "mdi:timer"],
"cumonbatt": ["Total Time on Battery", "", "mdi:timer-outline"],
"date": ["Status Date", "", "mdi:calendar-clock"],
"dipsw": ["Dip Switch Settings", "", "mdi:information-outline"],
"dlowbatt": ["Low Battery Signal", "", "mdi:clock-alert"],
"driver": ["Driver", "", "mdi:information-outline"],
"dshutd": ["Shutdown Delay", "", "mdi:timer"],
"dwake": ["Wake Delay", "", "mdi:timer"],
"dshutd": ["Shutdown Delay", "", "mdi:timer-outline"],
"dwake": ["Wake Delay", "", "mdi:timer-outline"],
"endapc": ["Date and Time", "", "mdi:calendar-clock"],
"extbatts": ["External Batteries", "", "mdi:information-outline"],
"firmware": ["Firmware Version", "", "mdi:information-outline"],
@@ -60,10 +60,10 @@ SENSOR_TYPES = {
"mandate": ["Manufacture Date", "", "mdi:calendar"],
"masterupd": ["Master Update", "", "mdi:information-outline"],
"maxlinev": ["Input Voltage High", VOLT, "mdi:flash"],
"maxtime": ["Battery Timeout", "", "mdi:timer-off"],
"maxtime": ["Battery Timeout", "", "mdi:timer-off-outline"],
"mbattchg": ["Battery Shutdown", UNIT_PERCENTAGE, "mdi:battery-alert"],
"minlinev": ["Input Voltage Low", VOLT, "mdi:flash"],
"mintimel": ["Shutdown Time", "", "mdi:timer"],
"mintimel": ["Shutdown Time", "", "mdi:timer-outline"],
"model": ["Model", "", "mdi:information-outline"],
"nombattv": ["Battery Nominal Voltage", VOLT, "mdi:flash"],
"nominv": ["Nominal Input Voltage", VOLT, "mdi:flash"],
@@ -85,7 +85,7 @@ SENSOR_TYPES = {
"status": ["Status", "", "mdi:information-outline"],
"stesti": ["Self Test Interval", "", "mdi:information-outline"],
"timeleft": ["Time Left", "", "mdi:clock-alert"],
"tonbatt": ["Time on Battery", "", "mdi:timer"],
"tonbatt": ["Time on Battery", "", "mdi:timer-outline"],
"upsmode": ["Mode", "", "mdi:information-outline"],
"upsname": ["Name", "", "mdi:information-outline"],
"version": ["Daemon Info", "", "mdi:information-outline"],

View File

@@ -97,7 +97,7 @@ def setup_scanner(hass, config, see, discovery_info=None):
hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, aprs_disconnect)
if not aprs_listener.start_event.wait(timeout):
_LOGGER.error("Timeout waiting for APRS to connect.")
_LOGGER.error("Timeout waiting for APRS to connect")
return
if not aprs_listener.start_success:
@@ -141,7 +141,7 @@ class AprsListenerThread(threading.Thread):
try:
_LOGGER.info(
"Opening connection to %s with callsign %s.", self.host, self.callsign
"Opening connection to %s with callsign %s", self.host, self.callsign
)
self.ais.connect()
self.start_complete(
@@ -152,7 +152,7 @@ class AprsListenerThread(threading.Thread):
self.start_complete(False, str(err))
except OSError:
_LOGGER.info(
"Closing connection to %s with callsign %s.", self.host, self.callsign
"Closing connection to %s with callsign %s", self.host, self.callsign
)
def stop(self):

View File

@@ -0,0 +1,13 @@
{
"config": {
"step": {
"user": {
"data": {
"host": "Hostitel",
"port": "Port"
},
"description": "Zadejte n\u00e1zev hostitele nebo IP adresu za\u0159\u00edzen\u00ed."
}
}
}
}

View File

@@ -9,7 +9,11 @@
"one": "Vide",
"other": "Vide"
},
"flow_title": "Arcam FMJ sur {host}",
"step": {
"confirm": {
"description": "Voulez-vous ajouter Arcam FMJ sur ` {host} ` \u00e0 HomeAssistant ?"
},
"user": {
"data": {
"host": "H\u00f4te",

View File

@@ -1,11 +1,16 @@
{
"config": {
"error": {
"one": "uma",
"other": "mais"
},
"step": {
"user": {
"data": {
"host": "Servidor",
"port": "Porto"
}
},
"description": "Por favor, introduza o nome ou o endere\u00e7o IP do dispositivo."
}
}
}

View File

@@ -15,7 +15,7 @@
"host": "\u0425\u043e\u0441\u0442",
"port": "\u041f\u043e\u0440\u0442"
},
"description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f \u0445\u043e\u0441\u0442\u0430 \u0438\u043b\u0438 IP-\u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430."
"description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0434\u043e\u043c\u0435\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0438\u043b\u0438 IP-\u0430\u0434\u0440\u0435\u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430."
}
}
},

View File

@@ -59,7 +59,7 @@ def setup(hass, config):
if arlo_base_station is not None:
arlo_base_station.refresh_rate = scan_interval.total_seconds()
elif not arlo.cameras:
_LOGGER.error("No Arlo camera or base station available.")
_LOGGER.error("No Arlo camera or base station available")
return False
hass.data[DATA_ARLO] = arlo

View File

@@ -103,7 +103,7 @@ async def async_setup(hass, config, retry_delay=FIRST_RETRY_TIME):
return True
if not api.is_connected:
_LOGGER.error("Error connecting %s to %s.", DOMAIN, conf[CONF_HOST])
_LOGGER.error("Error connecting %s to %s", DOMAIN, conf[CONF_HOST])
return False
hass.data[DATA_ASUSWRT] = api

View File

@@ -54,7 +54,7 @@ class AsusWrtDeviceScanner(DeviceScanner):
self.last_results = await self.connection.async_get_connected_devices()
if self._connect_error:
self._connect_error = False
_LOGGER.error("Reconnected to ASUS router for device update")
_LOGGER.info("Reconnected to ASUS router for device update")
except OSError as err:
if not self._connect_error:

View File

@@ -2,6 +2,6 @@
"domain": "asuswrt",
"name": "ASUSWRT",
"documentation": "https://www.home-assistant.io/integrations/asuswrt",
"requirements": ["aioasuswrt==1.2.6"],
"requirements": ["aioasuswrt==1.2.7"],
"codeowners": ["@kennedyshead"]
}

View File

@@ -69,9 +69,7 @@ class AsuswrtSensor(Entity):
self._speed = await self._api.async_get_current_transfer_rates()
if self._connect_error:
self._connect_error = False
_LOGGER.error(
"Reconnected to ASUS router for %s update", self.entity_id
)
_LOGGER.info("Reconnected to ASUS router for %s update", self.entity_id)
except OSError as err:
if not self._connect_error:
self._connect_error = True

View File

@@ -0,0 +1,12 @@
{
"config": {
"step": {
"user": {
"data": {
"host": "Hostitel",
"port": "Port"
}
}
}
}
}

View File

@@ -11,7 +11,7 @@
"user": {
"data": {
"email": "Courriel (facultatif)",
"host": "H\u00f4te",
"host": "Nom d'h\u00f4te ou adresse IP",
"port": "Port (10000)"
},
"title": "Se connecter \u00e0 l'appareil"

View File

@@ -3,7 +3,9 @@
"step": {
"user": {
"data": {
"host": "Servidor"
"email": "E-mail (opcional)",
"host": "Servidor",
"port": "Porta"
}
}
}

View File

@@ -143,7 +143,7 @@ class AtomeData:
values = self.atome_client.get_consumption(DAILY_TYPE)
self._day_usage = values["total"] / 1000
self._day_price = values["price"]
_LOGGER.debug("Updating Atome daily data. Got: %d.", self._day_usage)
_LOGGER.debug("Updating Atome daily data. Got: %d", self._day_usage)
except KeyError as error:
_LOGGER.error("Missing last value in values: %s: %s", values, error)
@@ -165,7 +165,7 @@ class AtomeData:
values = self.atome_client.get_consumption(WEEKLY_TYPE)
self._week_usage = values["total"] / 1000
self._week_price = values["price"]
_LOGGER.debug("Updating Atome weekly data. Got: %d.", self._week_usage)
_LOGGER.debug("Updating Atome weekly data. Got: %d", self._week_usage)
except KeyError as error:
_LOGGER.error("Missing last value in values: %s: %s", values, error)
@@ -187,7 +187,7 @@ class AtomeData:
values = self.atome_client.get_consumption(MONTHLY_TYPE)
self._month_usage = values["total"] / 1000
self._month_price = values["price"]
_LOGGER.debug("Updating Atome monthly data. Got: %d.", self._month_usage)
_LOGGER.debug("Updating Atome monthly data. Got: %d", self._month_usage)
except KeyError as error:
_LOGGER.error("Missing last value in values: %s: %s", values, error)
@@ -209,7 +209,7 @@ class AtomeData:
values = self.atome_client.get_consumption(YEARLY_TYPE)
self._year_usage = values["total"] / 1000
self._year_price = values["price"]
_LOGGER.debug("Updating Atome yearly data. Got: %d.", self._year_usage)
_LOGGER.debug("Updating Atome yearly data. Got: %d", self._year_usage)
except KeyError as error:
_LOGGER.error("Missing last value in values: %s: %s", values, error)

View File

@@ -60,7 +60,7 @@ async def async_request_validation(hass, config_entry, august_gateway):
# In the future this should start a new config flow
# instead of using the legacy configurator
#
_LOGGER.error("Access token is no longer valid.")
_LOGGER.error("Access token is no longer valid")
configurator = hass.components.configurator
entry_id = config_entry.entry_id
@@ -351,7 +351,7 @@ class AugustData(AugustSubscriberMixin):
doorbell_detail = self._device_detail_by_id.get(device_id)
if doorbell_detail is None:
_LOGGER.info(
"The doorbell %s could not be setup because the system could not fetch details about the doorbell.",
"The doorbell %s could not be setup because the system could not fetch details about the doorbell",
doorbell.device_name,
)
else:
@@ -373,17 +373,17 @@ class AugustData(AugustSubscriberMixin):
lock_detail = self._device_detail_by_id.get(device_id)
if lock_detail is None:
_LOGGER.info(
"The lock %s could not be setup because the system could not fetch details about the lock.",
"The lock %s could not be setup because the system could not fetch details about the lock",
lock.device_name,
)
elif lock_detail.bridge is None:
_LOGGER.info(
"The lock %s could not be setup because it does not have a bridge (Connect).",
"The lock %s could not be setup because it does not have a bridge (Connect)",
lock.device_name,
)
elif not lock_detail.bridge.operative:
_LOGGER.info(
"The lock %s could not be setup because the bridge (Connect) is not operative.",
"The lock %s could not be setup because the bridge (Connect) is not operative",
lock.device_name,
)
else:

View File

@@ -88,7 +88,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
detail = data.get_device_detail(door.device_id)
if not detail.doorsense:
_LOGGER.debug(
"Not adding sensor class door for lock %s because it does not have doorsense.",
"Not adding sensor class door for lock %s because it does not have doorsense",
door.device_name,
)
continue

View File

@@ -13,6 +13,8 @@ VERIFICATION_CODE_KEY = "verification_code"
NOTIFICATION_ID = "august_notification"
NOTIFICATION_TITLE = "August"
MANUFACTURER = "August Home Inc."
DEFAULT_AUGUST_CONFIG_FILE = ".august.conf"
DATA_AUGUST = "data_august"

View File

@@ -5,7 +5,8 @@ import logging
from homeassistant.core import callback
from homeassistant.helpers.entity import Entity
from . import DEFAULT_NAME, DOMAIN
from . import DOMAIN
from .const import MANUFACTURER
_LOGGER = logging.getLogger(__name__)
@@ -38,7 +39,7 @@ class AugustEntityMixin(Entity):
return {
"identifiers": {(DOMAIN, self._device_id)},
"name": self._device.device_name,
"manufacturer": DEFAULT_NAME,
"manufacturer": MANUFACTURER,
"sw_version": self._detail.firmware_version,
"model": self._detail.model,
}

View File

@@ -0,0 +1,12 @@
{
"config": {
"step": {
"user": {
"data": {
"password": "Heslo",
"username": "U\u017eivatelsk\u00e9 jm\u00e9no"
}
}
}
}
}

View File

@@ -5,7 +5,8 @@
"data": {
"password": "Palavra-passe",
"username": "Nome de Utilizador"
}
},
"description": "Se o m\u00e9todo de login for 'email', Nome do utilizador \u00e9 o endere\u00e7o de email. Se o m\u00e9todo de login for 'telefone', Nome do utilizador ser\u00e1 o n\u00famero de telefone no formato '+NNNNNNNNN'."
}
}
}

View File

@@ -9,9 +9,11 @@ import voluptuous as vol
from homeassistant.const import (
ATTR_ENTITY_ID,
ATTR_NAME,
CONF_ALIAS,
CONF_DEVICE_ID,
CONF_ENTITY_ID,
CONF_ID,
CONF_MODE,
CONF_PLATFORM,
CONF_ZONE,
EVENT_HOMEASSISTANT_STARTED,
@@ -23,11 +25,20 @@ from homeassistant.const import (
)
from homeassistant.core import Context, CoreState, HomeAssistant, callback
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import condition, extract_domain_configs, script
from homeassistant.helpers import condition, extract_domain_configs
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import ToggleEntity
from homeassistant.helpers.entity_component import EntityComponent
from homeassistant.helpers.restore_state import RestoreEntity
from homeassistant.helpers.script import (
ATTR_CUR,
ATTR_MAX,
ATTR_MODE,
CONF_MAX,
SCRIPT_MODE_SINGLE,
Script,
make_script_schema,
)
from homeassistant.helpers.service import async_register_admin_service
from homeassistant.helpers.typing import TemplateVarsType
from homeassistant.loader import bind_hass
@@ -41,7 +52,6 @@ ENTITY_ID_FORMAT = DOMAIN + ".{}"
GROUP_NAME_ALL_AUTOMATIONS = "all automations"
CONF_ALIAS = "alias"
CONF_DESCRIPTION = "description"
CONF_HIDE_ENTITY = "hide_entity"
@@ -96,7 +106,7 @@ _CONDITION_SCHEMA = vol.All(cv.ensure_list, [cv.CONDITION_SCHEMA])
PLATFORM_SCHEMA = vol.All(
cv.deprecated(CONF_HIDE_ENTITY, invalidation_version="0.110"),
vol.Schema(
make_script_schema(
{
# str on purpose
CONF_ID: str,
@@ -107,7 +117,8 @@ PLATFORM_SCHEMA = vol.All(
vol.Required(CONF_TRIGGER): _TRIGGER_SCHEMA,
vol.Optional(CONF_CONDITION): _CONDITION_SCHEMA,
vol.Required(CONF_ACTION): cv.SCRIPT_SCHEMA,
}
},
SCRIPT_MODE_SINGLE,
),
)
@@ -268,7 +279,15 @@ class AutomationEntity(ToggleEntity, RestoreEntity):
@property
def state_attributes(self):
"""Return the entity state attributes."""
return {ATTR_LAST_TRIGGERED: self._last_triggered}
attrs = {
ATTR_LAST_TRIGGERED: self._last_triggered,
ATTR_MODE: self.action_script.script_mode,
}
if self.action_script.supports_max:
attrs[ATTR_MAX] = self.action_script.max_runs
if self.is_on:
attrs[ATTR_CUR] = self.action_script.runs
return attrs
@property
def is_on(self) -> bool:
@@ -334,7 +353,7 @@ class AutomationEntity(ToggleEntity, RestoreEntity):
else:
enable_automation = DEFAULT_INITIAL_STATE
_LOGGER.debug(
"Automation %s not in state storage, state %s from default is used.",
"Automation %s not in state storage, state %s from default is used",
self.entity_id,
enable_automation,
)
@@ -389,7 +408,7 @@ class AutomationEntity(ToggleEntity, RestoreEntity):
try:
await self.action_script.async_run(variables, trigger_context)
except Exception: # pylint: disable=broad-except
pass
_LOGGER.exception("While executing automation %s", self.entity_id)
async def async_will_remove_from_hass(self):
"""Remove listeners when removing automation from Home Assistant."""
@@ -498,8 +517,13 @@ async def _async_process_config(hass, config, component):
initial_state = config_block.get(CONF_INITIAL_STATE)
action_script = script.Script(
hass, config_block.get(CONF_ACTION, {}), name, logger=_LOGGER
action_script = Script(
hass,
config_block[CONF_ACTION],
name,
script_mode=config_block[CONF_MODE],
max_runs=config_block[CONF_MAX],
logger=_LOGGER,
)
if CONF_CONDITION in config_block:

View File

@@ -10,7 +10,8 @@ from homeassistant.components.device_automation.exceptions import (
from homeassistant.config import async_log_exception, config_without_domain
from homeassistant.const import CONF_PLATFORM
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import condition, config_per_platform, script
from homeassistant.helpers import condition, config_per_platform
from homeassistant.helpers.script import async_validate_action_config
from homeassistant.loader import IntegrationNotFound
from . import CONF_ACTION, CONF_CONDITION, CONF_TRIGGER, DOMAIN, PLATFORM_SCHEMA
@@ -44,10 +45,7 @@ async def async_validate_config_item(hass, config, full_config=None):
)
config[CONF_ACTION] = await asyncio.gather(
*[
script.async_validate_action_config(hass, action)
for action in config[CONF_ACTION]
]
*[async_validate_action_config(hass, action) for action in config[CONF_ACTION]]
)
return config
@@ -71,19 +69,18 @@ async def _try_async_validate_config_item(hass, config, full_config=None):
async def async_validate_config(hass, config):
"""Validate config."""
validated_automations = await asyncio.gather(
*(
_try_async_validate_config_item(hass, p_config, config)
for _, p_config in config_per_platform(config, DOMAIN)
automations = list(
filter(
lambda x: x is not None,
await asyncio.gather(
*(
_try_async_validate_config_item(hass, p_config, config)
for _, p_config in config_per_platform(config, DOMAIN)
)
),
)
)
automations = [
validated_automation
for validated_automation in validated_automations
if validated_automation is not None
]
# Create a copy of the configuration with all config for current
# component removed and add validated config back in.
config = config_without_domain(config, DOMAIN)

View File

@@ -14,7 +14,10 @@ from homeassistant.const import (
)
from homeassistant.core import CALLBACK_TYPE, callback
from homeassistant.helpers import condition, config_validation as cv, template
from homeassistant.helpers.event import async_track_same_state, async_track_state_change
from homeassistant.helpers.event import (
async_track_same_state,
async_track_state_change_event,
)
# mypy: allow-incomplete-defs, allow-untyped-calls, allow-untyped-defs
# mypy: no-check-untyped-defs
@@ -94,8 +97,11 @@ async def async_attach_trigger(
)
@callback
def state_automation_listener(entity, from_s, to_s):
def state_automation_listener(event):
"""Listen for state changes and calls action."""
entity = event.data.get("entity_id")
from_s = event.data.get("old_state")
to_s = event.data.get("new_state")
@callback
def call_action():
@@ -168,7 +174,7 @@ async def async_attach_trigger(
else:
call_action()
unsub = async_track_state_change(hass, entity_id, state_automation_listener)
unsub = async_track_state_change_event(hass, entity_id, state_automation_listener)
@callback
def async_remove():

View File

@@ -6,12 +6,13 @@ from typing import Dict
import voluptuous as vol
from homeassistant import exceptions
from homeassistant.const import CONF_FOR, CONF_PLATFORM, EVENT_STATE_CHANGED, MATCH_ALL
from homeassistant.const import CONF_FOR, CONF_PLATFORM, MATCH_ALL
from homeassistant.core import CALLBACK_TYPE, HomeAssistant, callback
from homeassistant.helpers import config_validation as cv, template
from homeassistant.helpers.event import (
Event,
async_track_same_state,
async_track_state_change_event,
process_state_match,
)
@@ -153,7 +154,7 @@ async def async_attach_trigger(
hass, period[entity], call_action, _check_same_state, entity_ids=entity,
)
unsub = hass.bus.async_listen(EVENT_STATE_CHANGED, state_automation_listener)
unsub = async_track_state_change_event(hass, entity_id, state_automation_listener)
@callback
def async_remove():

View File

@@ -1,16 +1,10 @@
"""Offer zone automation rules."""
import voluptuous as vol
from homeassistant.const import (
CONF_ENTITY_ID,
CONF_EVENT,
CONF_PLATFORM,
CONF_ZONE,
MATCH_ALL,
)
from homeassistant.const import CONF_ENTITY_ID, CONF_EVENT, CONF_PLATFORM, CONF_ZONE
from homeassistant.core import callback
from homeassistant.helpers import condition, config_validation as cv, location
from homeassistant.helpers.event import async_track_state_change
from homeassistant.helpers.event import async_track_state_change_event
# mypy: allow-untyped-defs, no-check-untyped-defs
@@ -37,8 +31,12 @@ async def async_attach_trigger(hass, config, action, automation_info):
event = config.get(CONF_EVENT)
@callback
def zone_automation_listener(entity, from_s, to_s):
def zone_automation_listener(zone_event):
"""Listen for state changes and calls action."""
entity = zone_event.data.get("entity_id")
from_s = zone_event.data.get("old_state")
to_s = zone_event.data.get("new_state")
if (
from_s
and not location.has_location(from_s)
@@ -74,6 +72,4 @@ async def async_attach_trigger(hass, config, action, automation_info):
)
)
return async_track_state_change(
hass, entity_id, zone_automation_listener, MATCH_ALL, MATCH_ALL
)
return async_track_state_change_event(hass, entity_id, zone_automation_listener)

View File

@@ -22,7 +22,7 @@ async def async_setup_entry(
integration_id = entry.data[CONF_ID]
try:
each_upcoming = client.upcoming_of_each()
each_upcoming = await hass.async_add_executor_job(client.upcoming_of_each)
except AvriException as ex:
raise PlatformNotReady from ex
else:

View File

@@ -4,11 +4,13 @@
"already_configured": "D\u00ebs Adress ass scho konfigur\u00e9iert."
},
"error": {
"invalid_country_code": "Onbekannte Zweestellege L\u00e4nner Code",
"invalid_house_number": "Ong\u00eblteg Haus Nummer"
},
"step": {
"user": {
"data": {
"country_code": "Zweestellege L\u00e4nner Code",
"house_number": "Haus Nummer",
"house_number_extension": "Haus Nummer Extensioun",
"zip_code": "Postleitzuel"

View File

@@ -0,0 +1,16 @@
{
"config": {
"error": {
"invalid_house_number": "Nieprawid\u0142owy numer domu"
},
"step": {
"user": {
"data": {
"country_code": "Dwuliterowy kod kraju",
"house_number": "Numer domu",
"zip_code": "Kod pocztowy"
}
}
}
}
}

View File

@@ -0,0 +1,11 @@
{
"config": {
"step": {
"user": {
"data": {
"zip_code": "C\u00f3digo postal"
}
}
}
}
}

View File

@@ -21,7 +21,8 @@
"data": {
"access_token": "Token d'acc\u00e9s",
"email": "Correu electr\u00f2nic"
}
},
"description": "T'has de registrar a Awair per a obtenir un token d'acc\u00e9s de desenvolupador a trav\u00e9s de l'enlla\u00e7 seg\u00fcent: https://developer.getawair.com/onboard/login"
}
}
}

View File

@@ -0,0 +1,26 @@
{
"config": {
"abort": {
"already_configured": "\u00da\u010det je ji\u017e nakonfigurov\u00e1n",
"no_devices": "V s\u00edti nebyla nalezena \u017e\u00e1dn\u00e1 za\u0159\u00edzen\u00ed.",
"reauth_successful": "P\u0159\u00edstupov\u00fd token \u00fasp\u011b\u0161n\u011b aktualizov\u00e1n"
},
"error": {
"auth": "Neplatn\u00fd p\u0159\u00edstupov\u00fd token"
},
"step": {
"reauth": {
"data": {
"access_token": "P\u0159\u00edstupov\u00fd token",
"email": "E-mail"
}
},
"user": {
"data": {
"access_token": "P\u0159\u00edstupov\u00fd token",
"email": "E-mail"
}
}
}
}
}

View File

@@ -0,0 +1,12 @@
{
"config": {
"error": {
"unknown": "Unbekannter Awair-API-Fehler."
},
"step": {
"reauth": {
"description": "Bitte geben Sie Ihr Awair-Entwicklerzugriffstoken erneut ein."
}
}
}
}

View File

@@ -0,0 +1,29 @@
{
"config": {
"abort": {
"already_configured": "Le compte est d\u00e9j\u00e0 configur\u00e9",
"no_devices": "Pas d'appareil trouv\u00e9 sur le r\u00e9seau",
"reauth_successful": "Jeton d'acc\u00e8s mis \u00e0 jour avec succ\u00e8s"
},
"error": {
"auth": "Jeton d'acc\u00e8s invalide",
"unknown": "Erreur d'API Awair inconnue."
},
"step": {
"reauth": {
"data": {
"access_token": "Jeton d'acc\u00e8s",
"email": "Email"
},
"description": "Veuillez ressaisir votre jeton d'acc\u00e8s d\u00e9veloppeur Awair."
},
"user": {
"data": {
"access_token": "Jeton d'acc\u00e8s",
"email": "Email"
},
"description": "Vous devez vous inscrire pour un jeton d'acc\u00e8s d\u00e9veloppeur Awair sur: https://developer.getawair.com/onboard/login"
}
}
}
}

View File

@@ -0,0 +1,29 @@
{
"config": {
"abort": {
"already_configured": "L'account \u00e8 gi\u00e0 configurato",
"no_devices": "Nessun dispositivo trovato sulla rete",
"reauth_successful": "Token di accesso aggiornato correttamente"
},
"error": {
"auth": "Token di accesso non valido",
"unknown": "Errore API Awair sconosciuto."
},
"step": {
"reauth": {
"data": {
"access_token": "Token di accesso",
"email": "E-mail"
},
"description": "Inserisci nuovamente il tuo token di accesso per sviluppatori Awair."
},
"user": {
"data": {
"access_token": "Token di accesso",
"email": "E-mail"
},
"description": "\u00c8 necessario registrarsi per un token di accesso per sviluppatori Awair all'indirizzo: https://developer.getawair.com/onboard/login"
}
}
}
}

View File

@@ -0,0 +1,29 @@
{
"config": {
"abort": {
"already_configured": "\uacc4\uc815\uc774 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.",
"no_devices": "\ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \uae30\uae30\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4",
"reauth_successful": "\uc561\uc138\uc2a4 \ud1a0\ud070\uc774 \uc131\uacf5\uc801\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8\ub418\uc5c8\uc2b5\ub2c8\ub2e4"
},
"error": {
"auth": "\uc561\uc138\uc2a4 \ud1a0\ud070\uc774 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4",
"unknown": "\uc54c \uc218 \uc5c6\ub294 Awair API \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4."
},
"step": {
"reauth": {
"data": {
"access_token": "\uc561\uc138\uc2a4 \ud1a0\ud070",
"email": "\uc774\uba54\uc77c"
},
"description": "Awair \uac1c\ubc1c\uc790 \uc561\uc138\uc2a4 \ud1a0\ud070\uc744 \ub2e4\uc2dc \uc785\ub825\ud574\uc8fc\uc138\uc694."
},
"user": {
"data": {
"access_token": "\uc561\uc138\uc2a4 \ud1a0\ud070",
"email": "\uc774\uba54\uc77c"
},
"description": "https://developer.getawair.com/onboard/login \uc5d0 Awair \uac1c\ubc1c\uc790 \uc561\uc138\uc2a4 \ud1a0\ud070\uc744 \ub4f1\ub85d\ud574\uc57c\ud569\ub2c8\ub2e4"
}
}
}
}

View File

@@ -0,0 +1,29 @@
{
"config": {
"abort": {
"already_configured": "Kont ass",
"no_devices": "Keng Apparater am Netzwierk fonnt",
"reauth_successful": "Acc\u00e8s Jeton erfollegr\u00e4ich aktualis\u00e9iert"
},
"error": {
"auth": "Ong\u00ebltege Acc\u00e8s Jeton",
"unknown": "Onbekannten Awair API Feeler"
},
"step": {
"reauth": {
"data": {
"access_token": "Acc\u00e8s Jeton",
"email": "E-Mail"
},
"description": "G\u00ebff d\u00e4in Awair Developpeur Acc\u00e8s jeton nach emol un."
},
"user": {
"data": {
"access_token": "Acc\u00e8s Jeton",
"email": "E-Mail"
},
"description": "Du muss dech fir een Awair Developpeur Acc\u00e8s Jeton registr\u00e9ien op:\nhttps://developer.getawair.com/onboard/login"
}
}
}
}

View File

@@ -0,0 +1,25 @@
{
"config": {
"abort": {
"already_configured": "Conta j\u00e1 configurada",
"no_devices": "Nenhum dispositivo encontrado na rede",
"reauth_successful": "Token de Acesso actualizado com sucesso"
},
"error": {
"auth": "Token de acesso inv\u00e1lido"
},
"step": {
"reauth": {
"data": {
"email": "Email"
}
},
"user": {
"data": {
"access_token": "Token de Acesso",
"email": "Email"
}
}
}
}
}

View File

@@ -3,5 +3,5 @@
"name": "Amazon Web Services (AWS)",
"documentation": "https://www.home-assistant.io/integrations/aws",
"requirements": ["aiobotocore==0.11.1"],
"codeowners": ["@awarecan", "@robbiet480"]
"codeowners": ["@awarecan"]
}

View File

@@ -1,5 +1,15 @@
{
"config": {
"flow_title": "Za\u0159\u00edzen\u00ed Axis: {name} ({host})"
"flow_title": "Za\u0159\u00edzen\u00ed Axis: {name} ({host})",
"step": {
"user": {
"data": {
"host": "Hostitel",
"password": "Heslo",
"port": "Port",
"username": "U\u017eivatelsk\u00e9 jm\u00e9no"
}
}
}
}
}

View File

@@ -16,7 +16,7 @@
"step": {
"user": {
"data": {
"host": "H\u00f4te",
"host": "Nom d'h\u00f4te ou adresse IP",
"password": "Mot de passe",
"port": "Port",
"username": "Nom d'utilisateur"

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