Compare commits

..

652 Commits

Author SHA1 Message Date
Paulus Schoutsen 5f088c7ff0 Bumped version to 0.116.0b1 2020-10-01 19:58:32 +00:00
jjlawren 0be678c21c Plex websocket callback async cleanup (#40992) 2020-10-01 19:58:21 +00:00
J. Nick Koston 953a1ddc8c Prevent sqlalchemy from refetching the old_state_id as it will never change (#40982)
Disable expire_on_commit for the event writer. Since we never expect the
old_state_id to change in the database, it was never worth the expense of
refetching the id after the commit.
2020-10-01 19:58:21 +00:00
Bram Kragten fd91d21b28 Update frontend to 20201001.0 (#40974) 2020-10-01 19:58:20 +00:00
Bram Kragten 6e29eb3165 Revert using own cast app for media (#40937) 2020-10-01 19:58:19 +00:00
Alexei Chetroi 10bb399449 Bump up zha dependencies (#40914) 2020-10-01 19:58:19 +00:00
Aaron Bach 9312fd141e Bump simplisafe-python to 9.4.1 (#40819)
* Bump simplisafe-python to 9.4.0

* One more bump
2020-10-01 19:58:18 +00:00
cgtobi 8bfddbc4b2 Fix Netatmo climate error when no boiler status is set (#40815) 2020-10-01 19:58:17 +00:00
jjlawren c0d4e1eaf4 Accept new Plex websocket callback payloads (#40773) 2020-10-01 19:58:16 +00:00
J. Nick Koston 0902caa7e4 Implement template rate_limit directive (#40667) 2020-10-01 19:58:16 +00:00
J. Nick Koston b9931aabe7 Seperate state change tracking from async_track_template_result into async_track_state_change_filtered (#40803) 2020-10-01 19:57:57 +00:00
Franck Nijhof 1c534ea027 Bumped version to 0.116.0b0 2020-09-30 21:24:57 +02:00
Franck Nijhof 5cb5a508a8 Merge branch 'master' into dev 2020-09-30 21:16:36 +02:00
Chris c693d8af14 Discover additional ozw thermostats lacking mode support (#40799)
* Discover more thermostats without mode support

* Add tests
2020-09-30 21:12:44 +02:00
Robert Svensson 9d56d3bb31 Add deCONZ service to clean up orphaned device and entity entries (#40629)
* Add service that can clean up by deCONZ orphaned entries from device and entity registry

* Fix existing tests

* Add new test

* Add some inline comment to the service
2020-09-30 20:11:41 +02:00
Daniel Hjelseth Høyer 9bdc716e60 Include config flow modules in coverage (#40798)
* update coveragerc

* typo
2020-09-30 19:55:26 +02:00
Bram Kragten 8a16fb53c8 Update frontend to 20200930.0 (#40794) 2020-09-30 18:39:45 +02:00
J. Nick Koston 2076fc59c4 Remove message and domain from logbook state_changed events (#40070)
These are now handled by the frontend as we move closer
to making the logbook localized.
2020-09-30 11:29:51 -05:00
Quentame 1d816d25f7 Add Surveillance Station home mode switch for Synology DSM (#40490)
* Use camera name as device name

* Add Surveillance Station home mode switch for Synology DSM

- camera uses Surveillance Station as device parent
- camera uses camera name instead of NAS name + camera name

* Without device_class otherwise no icon

* Update .coveragerc
2020-09-30 18:27:06 +02:00
uvjustin e85d1deddd Return target duration of 1 when no segments (#40518) 2020-09-30 11:46:35 -04:00
uvjustin 5658abfaca Log timestamp overflow in stream (#39844) 2020-09-30 11:45:59 -04:00
J. Nick Koston 42ad36e9f8 Switch group to use None for the state unknown case (#40792) 2020-09-30 17:25:50 +02:00
Robert Svensson 082f866620 Improve deCONZ state updates (#40601) 2020-09-30 17:24:30 +02:00
Bram Kragten ac71641c18 Use the Home Assistant Cast app to play media on Chromecast (#40782) 2020-09-30 17:20:18 +02:00
J. Nick Koston a11fd08d20 Create MQTTMatcher once per subscription instead of each message (#40345)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-09-30 17:18:43 +02:00
Daniel Hjelseth Høyer 4c157f65ea Tibber, combine two fetches into one fetch (#40787) 2020-09-30 17:17:21 +02:00
Chris Reichel 01a0ffa636 Fix DWD namings (#40791) 2020-09-30 17:12:06 +02:00
Martin Hjelmare f454b4154b Fix and clean tox.ini (#40789) 2020-09-30 17:07:59 +02:00
MatthewFlamm ab3909c24f Disable hourly sensor by default in NWS (#40566) 2020-09-30 16:53:33 +02:00
J. Nick Koston 9ccebdb8d5 Refactor group to extend domains that can be grouped (#40607)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-09-30 09:13:53 -05:00
Franck Nijhof e7d8742771 Upgrade sentry-sdk to 0.18.0 (#40784) 2020-09-30 14:12:02 +02:00
Maikel Punie 30effb5c8a Use common strings for velbus config flow (#40660) 2020-09-30 13:53:03 +02:00
Franck Nijhof 27350f41c9 Improve command_line switch tests (#40749) 2020-09-30 13:29:43 +02:00
Mike O'Driscoll fc0344399b Remove TekSavvy Component, no longer available (#40762)
The TekSavvy API has been removed.
Per [this forum post](https://community.teksavvy.com/discussion/comment/120) on TekSavvy's
support page.
2020-09-30 13:14:41 +02:00
J. Nick Koston d9ba32dc3f Setup recorder model relationships to avoid calling flush (#40467) 2020-09-30 13:11:43 +02:00
J. Nick Koston aada6a1d88 Fix logbook with empty filter and remove unused code (#40565) 2020-09-30 13:10:11 +02:00
Thibaut 729ed1cab6 Add unique_id to the light switch (#40603)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2020-09-30 13:05:18 +02:00
J. Nick Koston 205cf57a77 Code cleanups for async_track_template_result (#40737) 2020-09-30 13:00:21 +02:00
Guido Schmitz d6df1527f1 Update devolo-home-control-api to 0.15.0 (#40764) 2020-09-30 12:58:19 +02:00
Paulus Schoutsen 3d2d56213c Merge pull request #40778 from home-assistant/rc 2020-09-30 11:39:39 +02:00
Franck Nijhof 4cce724473 Use direct service calls in flux tests instead of switch common (#40704) 2020-09-30 11:07:51 +02:00
Paulus Schoutsen dbda9a520e Bumped version to 0.115.6 2020-09-30 08:36:30 +00:00
Bram Kragten c802a63700 Use custom app to play camera stream using Google Assistant (#40750) 2020-09-30 08:36:26 +00:00
Bram Kragten c6f3352cf8 Use custom app to play camera stream using Google Assistant (#40750) 2020-09-30 10:33:56 +02:00
Marvin Wichmann f5429dc175 Update xknx to 0.15.0 (#40649)
* Update xknx to 0.15.0

closes #40526

* Review: Remove log_directory for now

* Review: typo fix
2020-09-30 10:04:56 +02:00
epenet e38ae1b188 Normalise headers in onewire integration (#40774) 2020-09-30 08:53:12 +02:00
HomeAssistant Azure 8d0f1e7db2 [ci skip] Translation update 2020-09-30 00:04:43 +00:00
David F. Mulcahey ac3a6aaa8c Bump ZHA quirks lib to 0.0.45 (#40769) 2020-09-29 19:59:12 -04:00
Samantha a8b68dc4f9 Add Neighbors & Endpoint Names to zha/devices reply (#40748)
* Add Neighbors & Endpoint Names to zha/devices reply.

* Remove unused const

* Add tests & correct const name.

* Change tests to use corresponding enum device_type
2020-09-29 15:25:05 -04:00
Franck Nijhof a2d2b7842d Upgrade paho-mqtt to 1.5.1 (#40703) 2020-09-29 18:12:45 +02:00
Richard van Duijn ee9540e137 Add template cover opening and closing states (#40677) 2020-09-29 16:04:33 +02:00
Franck Nijhof ef1c8c55f8 Merge pull request #40742 from home-assistant/rc 2020-09-29 13:33:10 +02:00
Franck Nijhof ebacc15e72 Bumped version to 0.115.5 2020-09-29 12:38:30 +02:00
Franck Nijhof e54ec3ba05 Fix ID3 tagging in TTS (#40740) 2020-09-29 12:38:04 +02:00
MatsNl fe6786aa6a Update pyatag to 0.3.4.4 (#40720) 2020-09-29 11:32:42 +02:00
Robert Svensson 7e58bfe01d Add deconz option to disable automatic addition of new devices (#40545)
* Allow disabling automatic additions of new devices from deconz

* Fix black

* Fix review comment

* Remove assertion

* Verify entity registry is empty
2020-09-29 11:07:19 +02:00
Franck Nijhof f3edec1191 Fix ID3 tagging in TTS (#40740) 2020-09-29 10:19:26 +02:00
Chris Talkington 432133a12a Add ability to reauth sonarr (#40306)
* add ability to reauth sonarr

* Update config_flow.py

* work on reauth

* Update test_init.py

* Update config_flow.py

* Update strings.json

* Update test_config_flow.py

* Update strings.json

* Update test_config_flow.py

* Update __init__.py

* Update __init__.py

* Update config_flow.py

* Update strings.json

* Update config_flow.py

* Update __init__.py

* Update test_config_flow.py

* Update test_config_flow.py

* Update strings.json

* Update test_config_flow.py

* Update config_flow.py

* Update test_config_flow.py

* Update config_flow.py

* Update strings.json

* Update config_flow.py

* Update test_config_flow.py

* Update test_config_flow.py
2020-09-28 20:15:59 -05:00
Chris Talkington bc89b63fc6 Add switch to control downloads for nzbget (#40673)
* add switch to control downloads for nzbget

* work on switch

* Update test_config_flow.py

* Update test_sensor.py
2020-09-28 20:14:49 -05:00
Alexei Chetroi 47286fbe2a Refactor permit services to allow joining using install codes (#40652)
* Update zha.permit schema to support install code

* Move install code to core helpers

* QR code converter for enbrighten

* Fix schemas

* Update test for permit service

* Refactor zha.permit to accept install codes

* Test zha.permit from QR code

* Fix regex for Embrighten QR code

* Add regex for Aqara QR codes

* Add Consciot regex for QR code

* Reuse test params for WS tests

* ZHA WS permit command with install code

* Tests for zha.permit WS service

* Refactor zha.permit and zha.remove service to use ATTR_IEEE for the address

* Make pylint happy

* Deprecate only ieee_address param for now
2020-09-28 20:55:08 -04:00
Alexei Chetroi b9823791f7 Bump up ZHA dependency (#40734) 2020-09-28 20:37:56 -04:00
HomeAssistant Azure 704ffe391a [ci skip] Translation update 2020-09-29 00:03:20 +00:00
Bashir 9b198e8d67 Update islamic_prayer_times with common strings (#40712) 2020-09-28 18:37:41 -05:00
Erik Montnemery e7f832a82f Add MQTT tag scanner (#40709) 2020-09-28 22:04:27 +02:00
Franck Nijhof 3bcd2b6f71 Fix name of the Vallox integration in the manifest (#40727) 2020-09-28 22:01:01 +02:00
Fabrice Pipart b7f596a71e Fix support for Aqara WXKG06LM (#40694) 2020-09-28 20:36:28 +02:00
Ville Skyttä 5bbddb5b26 Use NamedTuple for Huawei LTE sensor metadata (#40655) 2020-09-28 20:33:32 +03:00
Andre Lengwenus e5e6dda04f Bump pypck to v0.7.2 (#40716) 2020-09-28 18:51:38 +02:00
Guido Schmitz 70ed838571 Improve devolo Home Control code quality (#40708) 2020-09-28 10:37:46 -05:00
J. Nick Koston e564af0b5b Improve performance of accessing template state (#40323)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-09-28 10:35:12 -05:00
jjlawren 3596eb39f2 Add support to reauthorize expired Plex tokens (#40469) 2020-09-28 16:14:54 +02:00
Martin Hjelmare eda68f127c Add rpi_power during onboarding on RPi (#40076) 2020-09-28 16:07:17 +02:00
Jeff Irion 68d75a879b Fix Android TV 'async_get_media_image' (#40672) 2020-09-28 16:04:08 +02:00
RichieFrame ceded35a82 Remove degree from Kelvin unit (#40574)
Kelvin temperature unit does not use the degree symbol
2020-09-28 16:03:21 +02:00
J. Nick Koston a19e10c57a Add entity glob matching support to history (#40387) 2020-09-28 15:58:55 +02:00
Paulus Schoutsen b4237be609 Merge pull request #40706 from home-assistant/rc 2020-09-28 14:58:19 +02:00
J. Nick Koston e08ee282ab Abort execution of template renders that overwhelm the system (#40647) 2020-09-28 14:43:22 +02:00
Paulus Schoutsen 2ee5b0a9c1 Bumped version to 0.115.4 2020-09-28 12:29:16 +00:00
Paweł Stankowski 48f5ffa0bd Bump Airly package to 1.0.0 (#40695) 2020-09-28 12:29:06 +00:00
Franck Nijhof b01d04c4ca Pin gRPC to 1.31.0 to workaround amrv7 issues (#40678) 2020-09-28 12:29:05 +00:00
Chris 94f3a085ed set ID3 tags as TextFrame types (#40666) 2020-09-28 12:29:04 +00:00
Jason Hunter 59daab9434 Fix camera play stream (#40641)
Co-authored-by: Justin Wong <46082645+uvjustin@users.noreply.github.com>
2020-09-28 12:28:44 +00:00
Bouwe Westerdijk af88a78aae Bump Plugwise-Smile to v1.5.1 (#40572) 2020-09-28 12:27:54 +00:00
Colin Frei 837c3d3c9d Fix fitbit current URL not available while configuring (#40547)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-09-28 12:27:53 +00:00
uvjustin d952a2b756 Create master playlist for cast (#40483)
Co-authored-by: Jason Hunter <hunterjm@gmail.com>
2020-09-28 12:27:53 +00:00
Maciej Bieniek c07c6ca413 Bump aioshelly library to version 0.3.3 (#40415) 2020-09-28 12:27:40 +00:00
Jason Hunter 8bc62f3678 Fix camera play stream (#40641)
Co-authored-by: Justin Wong <46082645+uvjustin@users.noreply.github.com>
2020-09-28 14:24:30 +02:00
Matt Black 1c252634b7 Bump snapcast dependency to 2.1.1 (#40561) 2020-09-28 13:42:01 +02:00
Maciej Bieniek 29d87646dd Improve config flow descriptions in Shelly integration (#40396) 2020-09-28 13:35:40 +02:00
Paweł Stankowski 8466682b65 Bump Airly package to 1.0.0 (#40695) 2020-09-28 11:12:35 +02:00
Joakim Sørensen 953f6bad46 Allow non-authenticated calls to supervisor logs during onboarding (#40617) 2020-09-28 10:10:10 +02:00
Alex 373a1cabe6 Re-enable hdmi_cec component (#40671) 2020-09-28 08:31:35 +02:00
Alexei Chetroi 988bc8b35f Bump up zha dependency (#40689)
* Bump up zha dependency

* Update ZHA dependency for zigpy
2020-09-27 22:23:53 -04:00
jan iversen 0ca19133d9 Add tests for modbus binary sensor (#40367)
* Add test coverage of binary sensor.

Update conftest to be generic.

* Pass total config structure to run_base_test.

Simple devices like sensor/switch do only have one entry in the
dict array, whereas e.g. switch have multiple entries.

* Use STATE_ON / _OFF for binary_sensor test.

* Update coveragerc

Only exclude files that uses a third party library.

* Remove modbus/* from coveragerc

* Remove modbus from .coveragerc

* Update .coveragerc

Co-authored-by: Chris Talkington <chris@talkingtontech.com>
2020-09-27 20:00:44 -05:00
epenet ea6ec42bbd Add onewire humidity sensors connected via DS2438 (#39780) 2020-09-27 19:16:29 -05:00
HomeAssistant Azure e9e17122e7 [ci skip] Translation update 2020-09-28 00:03:28 +00:00
epenet f886ea9e3d Move onewire constants to separate file (#40550)
* Move constants to separate file

* Ignore coverage of const.py
2020-09-27 19:02:20 -05:00
epenet f71816d328 Fix issue with HobbyBoard moisture meter (#40680) 2020-09-28 01:25:04 +02:00
puddly 0a16ae6482 Upgrade zigpy-znp from 0.1.1 to 0.2.0 (#40674) 2020-09-27 18:13:46 -04:00
Colin Frei 13b6fe2bba Fix fitbit current URL not available while configuring (#40547)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-09-27 23:19:46 +02:00
Maciej Bieniek 088558b8df Increase the timeout during config entry setup in Shelly integration (#40684) 2020-09-27 23:03:47 +02:00
uvjustin 9a32e28574 Create master playlist for cast (#40483)
Co-authored-by: Jason Hunter <hunterjm@gmail.com>
2020-09-27 22:38:14 +02:00
Franck Nijhof e320c3b735 Pin gRPC to 1.31.0 to workaround amrv7 issues (#40678) 2020-09-27 21:51:37 +02:00
Adam Król ef751c0961 Update wolf_smartset to 0.1.6 (#40668)
* Bump wolf_smartset version. Support not fully fetched data

* Fix black and pylint errors

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

* Remove dot from exception message.

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

Co-authored-by: springstan <46536646+springstan@users.noreply.github.com>
Co-authored-by: Chris Talkington <chris@talkingtontech.com>
2020-09-27 14:02:29 -05:00
Chris 52b745b8a9 set ID3 tags as TextFrame types (#40666) 2020-09-27 20:40:57 +02:00
stephan192 abcfbf790b Bump dwdwfsapi to v1.0.3 (#40644) 2020-09-27 19:46:41 +02:00
tkdrob 67a7b28c84 Add Integration for Goal Zero Yeti Power Stations (#39231)
* Add Integration for Goal Zero Yeti Power Stations

* Goal Zero Yeti integration with config flow

* Remove unused entities

* Remove entry from requirements_test_all

* Pylint fix

* Apply suggestions from code review

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

* Add tests for goalzero integration

* Fix UNIT_PERCENTAGE to PERCENTAGE

* isort PERCENTAGE

* Add tests

* Add en translation

* Fix tests

* bump goalzero to 0.1.1

* fix await

* bump goalzero to 0.1.2

* Update tests/components/goalzero/__init__.py

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

* apply recommended changes

* isort

* bump goalzero to 0.1.4

* apply recommended changes

* apply recommended changes

Co-authored-by: Franck Nijhof <frenck@frenck.nl>
Co-authored-by: J. Nick Koston <nick@koston.org>
2020-09-27 12:44:21 -05:00
Ville Skyttä 4ca7b8569b Remove pre-0.102 Huawei LTE setup noop warnings (#40654) 2020-09-27 18:02:44 +02:00
Melvin c63cd63c1b Use common strings for oauth config flows (#40608) 2020-09-27 10:49:30 -05:00
Marcio Granzotto Rodrigues 3fba4274f5 Add authentication support to Nightscout (#40602)
* Add API Key to the Nightscout integration config

* Add tests for nightscout config changes

* Apply suggestions from code review

Co-authored-by: springstan <46536646+springstan@users.noreply.github.com>
Co-authored-by: Chris Talkington <chris@talkingtontech.com>

* Update homeassistant/components/nightscout/__init__.py

* Run translations script to fix en.json

Co-authored-by: springstan <46536646+springstan@users.noreply.github.com>
Co-authored-by: Chris Talkington <chris@talkingtontech.com>
2020-09-27 10:22:28 -05:00
Maikel Punie 6028953eca Bump python-velbus to 2.0.46 (#40663) 2020-09-27 17:12:36 +02:00
Franck Nijhof 0e6d54ea60 Rewrite core event tests to pytest tests (#40664) 2020-09-27 15:39:45 +02:00
Bashir 5274b03dc2 Resolve Frontend Services.yaml Minor Oversight (#40659)
The Default Values Suggest That The User enters 'light' as a parameter for the theme name. 'Light' is, however, not a valid option on a fresh install of HA unless a user manually downloads a theme with the name 'light'.
2020-09-27 12:51:41 +02:00
Maikel Punie b65583084b Fix solaredge service data KeyError (#40653) 2020-09-27 11:40:56 +02:00
Robert Svensson 66a8edb11e deCONZ fix comments from #40265 (#40640)
* Use set not list

* Events are not entities

* Don't await unload_events

* Remove checks of entities content in tests

* List to set comprehension

* Why is it so hard to remember that sets arent parenthesis...
2020-09-27 11:02:45 +02:00
Simone Chemelli 8895752837 Handle Shelly channel names (if available) (#40119)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2020-09-27 10:16:45 +02:00
Julius Mittenzwei a19b43a304 Add support for homekit windows (#40635)
Co-authored-by: J. Nick Koston <nick@koston.org>
2020-09-27 00:07:59 -05:00
HomeAssistant Azure 2b00d28af9 [ci skip] Translation update 2020-09-27 00:06:49 +00:00
J. Nick Koston 57b7559832 Ensure all jinja2 errors are trapped and displayed in the developer tools (#40624)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-09-26 17:03:32 -05:00
J. Nick Koston 3261a904da Reduce the number of template re-renders when we are only counting states (#40272) 2020-09-26 16:29:49 -05:00
Maciej Bieniek b8f837365c Bump aioshelly library to version 0.3.3 (#40415) 2020-09-26 22:39:02 +02:00
Franck Nijhof 8837ed35cd Use direct service calls in tests instead of automation common (#40623)
* Use direct service calls in tests instead of automation common

* Remove automation common test helpers
2020-09-26 19:28:26 +02:00
J. Nick Koston 35533407fe Improve performance of counting and iterating states in templates (#40250)
Co-authored-by: Anders Melchiorsen <amelchio@nogoto.net>
2020-09-26 11:36:47 -05:00
Vladimír Záhradník 1d41f024cf Add Modbus cover (#33642)
* Add Modbus cover

* Fix improper commands written for Modbus cover via coil

* Make changes per review comments

* Fix default hub not defined

Since support for multiple hubs was added, the default hub option
was not implemented correctly. Now I added necessary logic to make
it work. First hub in a list will be used as a default hub.

* Move Cover config under Modbus section

* Revert setting up a default hub alias

* Make hub mandatory for Cover

* Add default scan interval

* Read scan_interval from discovery info

* Fix linter error

* Use default scan interval from Cover platform

* Handle polling for Modbus cover directly inside entity

* Move covers under hub config

* Fix for review comment

* Call update() from Cover actuator methods

* Fix time validation
2020-09-26 11:11:51 -05:00
Felipe Martins Diel 2f4aa35ca6 Bump python-broadlink to 0.15.0 (#39228)
* Rename DeviceOfflineError to NetworkTimeoutError

* Bump python-broadlink to 0.15
2020-09-26 10:46:02 -05:00
SNoof85 6977425d04 Use common strings for Freebox config flow (#40590) 2020-09-26 10:27:18 -05:00
Rob Bierbooms 445743930b Use common strings for monoprice config flow (#40592) 2020-09-26 10:20:19 -05:00
Rob Bierbooms f6435affe9 Use common strings for somfy config flow (#40594) 2020-09-26 13:30:49 +02:00
Franck Nijhof c011f3fa95 Use direct service calls in light platform tests (#40604) 2020-09-26 13:19:59 +02:00
Franck Nijhof c64eec3238 Add bare hostname as valid known hostname in get_url helper (#40510) 2020-09-26 09:36:03 +02:00
J. Nick Koston 35cfc80dd7 Log the remote ip address for incoming websocket connections when debug is on (#40581) 2020-09-26 09:32:50 +02:00
Joakim Sørensen a42736e437 Allow non-authenticated calls to snapshots during onboarding (#40582) 2020-09-26 09:26:02 +02:00
Joakim Sørensen 4a63b83caa Add installation type to discovery endpoint (#40585) 2020-09-26 09:17:04 +02:00
Erik Montnemery 4cb118ca29 Bump pychromecast to 7.4.1 (#40587)
* Bump pychromecast to 7.4.0

* Bump pychromecast to 7.4.1
2020-09-26 09:15:09 +02:00
Daniel Kucera 6ddc6a44a2 Throttle ebusd sensors instead of the whole component (#40610) 2020-09-26 09:11:32 +02:00
Franck Nijhof 9cd8f66e14 Upgrade spotipy to 2.16.0 (#40606) 2020-09-26 08:21:12 +02:00
J. Nick Koston b3b9c52df2 Add device info to gogogate2 (#40538) 2020-09-25 22:28:59 -05:00
HomeAssistant Azure c3afe39ea0 [ci skip] Translation update 2020-09-26 00:05:34 +00:00
Alexei Chetroi f09f7feb94 Update schema for zha.set_zigbee_cluster_attribute service (#40600) 2020-09-25 18:36:55 -04:00
Robert Svensson 203c556ba3 Improve tracking of existing entities in deconz (#40265)
* Store all entities in dict

* Use stored unique id to select if to create entity or not

* Remove unnecessary init

* Change so same physical sensor doesnt try to create multiple battery sensors
Change so groups get created properly

* Add controls in tests that entities are logged correctly
2020-09-25 22:49:28 +02:00
Franck Nijhof e30acfbfee Rewrite light component tests to async pytest tests (#40589) 2020-09-25 19:14:25 +02:00
Oliver Acevedo 0c12af347e Add Omnilogic integration (#40474)
* Scaffold

* Added the en translation

* Modified the name

* Basic functionality for config flow.

* Pulled in enough to validate config flow works.

* Update manifest.json

* initial data polling (water and air temp sensors)

* Adding sensors, debugging update function

* polling updates working

* support for new data format from library

* Updated entity_id, friendly name, conversion for ppm, attributes for hayward display units, MSPSystemID and component systemID

* Fixed errors for PR

* clean up

* Add login exc, check if configured, test login.

* Remove debug print.

* Black formatting, ran isort, update requirements.

* Updated w isort. fix flake8 failures.

* Fix flake8 errors

* Fixed self.attrs to remove invalid self._ values - small change

* Missed on small change - fixing attributes

* Updated naming, updated unit of measure, updated icon, bumped omnilog…

* Updated to fix flake8 issues in __init__.py and config_flow.py

* Updated test_config_flow.py to pass, updated config_flow.py to correct errors in test

* Remove comments in preparation for PR

* update .covezragerc

* Formatting fix

* Rewrote sensors to dynamically add all BOWs, pumps, clorinators. Still to do - add CSAD sensors.

* Rewrote sensors to dynamically add all BOWs, pumps, clorinators. Still to do - add CSAD sensors.

* Added CSAD sensors for pools that have them.

* Added CSAD sensors for pools that have them.

* Fixed CSAD to not create if blank or don't exist, removed broad except usage to pass linting.

* Updated entity naming convention. Fixed linting issues.

* Added device association to the back yard / omnilogic system

* Removed .0 from ppm values when returning imperial values for salt sensor

* Updated to return state = None for water temp when pump is off, handled Chlorinator operatingMode = 2, and added PlatformNotReady check

* Corrected exception from Omnilogic library

* Bumped omnilogic to 0.3.7. Added alarm sensor/data to sensors. Handle pump off condition for ph and orp sensors.

* Bumped omnilogic to 0.3.7. Added alarm sensor/data to sensors. Handle pump off condition for ph and orp sensors.

* Bumped omnilogic to 0.3.7. Added alarm sensor/data to sensors. Handle pump off condition for ph and orp sensors.

* Removed nested_lookup dependency, bumped omnilogic.py to 0.3.8.

* Fixed lint error

* Added logging for sensor creation.

* Fixed linting errors with logging.

* Fixed explicit chaining of raised error. Fixed issue with alarm sensor.

* Fixed manifest.json based on feedback.

* Fixed self.attrs, should_poll, CoordinatorEntity, SCAN_INTERVAL from comments in PR.

* Addressed unique_id, moved data update coordinator, addressed minor other issues from testing

* Created main OmniLogic entity for common items, reworked DataUpdateCoordinator to it's own class.

* Addressed config_schema not used in __init__.py

* Fixed linting issues.

* Addressed several comments, still todo - separate sensor classes.

* Split the Omnilogic Sensors into separate logical classes for simpler logic.

* Fixed snake case lint error for AddAlarms (to add_alarms)

* Addressed config_flow issues from comments.

* Changed addressed ConfigNotReady issue from comments.

* Updated strings.json and generated corrected en.json with translations.

* Updated en.json to standard generated file.

* Added config_flow tests and updated issue with config_flow on cannot_connect

* Added test case for incomplete information entered.

* Compressed logic in the sensor classes to reduce duplication.

* Updated strings.json for polling_interval, added generic exception handling on config flow.

* Removed omnilogic from the .coveragerc omit file.

* Updated test_config_flow to follow recommended pattern.

* Excluded sensor.py from test coverage tests.

* Corected minor issues in test_config_flow from comments

* Fixed linting issues on last commits

* Fixed linting issues.

* Corrected issue when temp state is not available from Omnilogic

* Added omnililogic_common.py from .coveragerc to bypass test coverage check.

* Return false on Login Exception, handle OmniLogicException in config_flow and in tests.

* Handle all exceptions and in config_flow and tests, clarified test naming.

* Broke out test cases per comments.

* Regenerated en.json file.

* Addressed changes from comments in PR.

* Added session and bumped API to 0.4.0, addressed other comments from PR.

* Addressed entitydata (missed earlier).

* Fixed pylint issue

* Added test case for options flow in test_config_flow.py

* Removed super() and used self when calling methods in current class.

* Addressed comments in PR.

* Addressed comments in PR.

* Updated translations file.

* Rewrote data coordinator to output dict for easy searching.

* Updated chlorinator unit when chlorinator is on/off only

* Scaffold

* Added the en translation

* Modified the name

* Basic functionality for config flow.

* Pulled in enough to validate config flow works.

* Update manifest.json

* initial data polling (water and air temp sensors)

* Adding sensors, debugging update function

* polling updates working

* support for new data format from library

* Updated entity_id, friendly name, conversion for ppm, attributes for hayward display units, MSPSystemID and component systemID

* Fixed errors for PR

* clean up

* Add login exc, check if configured, test login.

* Remove debug print.

* Black formatting, ran isort, update requirements.

* Updated w isort. fix flake8 failures.

* Fix flake8 errors

* Fixed self.attrs to remove invalid self._ values - small change

* Missed on small change - fixing attributes

* Updated naming, updated unit of measure, updated icon, bumped omnilog…

* Updated to fix flake8 issues in __init__.py and config_flow.py

* Updated test_config_flow.py to pass, updated config_flow.py to correct errors in test

* Remove comments in preparation for PR

* update .covezragerc

* Formatting fix

* Rewrote sensors to dynamically add all BOWs, pumps, clorinators. Still to do - add CSAD sensors.

* Rewrote sensors to dynamically add all BOWs, pumps, clorinators. Still to do - add CSAD sensors.

* Added CSAD sensors for pools that have them.

* Added CSAD sensors for pools that have them.

* Fixed CSAD to not create if blank or don't exist, removed broad except usage to pass linting.

* Updated entity naming convention. Fixed linting issues.

* Added device association to the back yard / omnilogic system

* Removed .0 from ppm values when returning imperial values for salt sensor

* Updated to return state = None for water temp when pump is off, handled Chlorinator operatingMode = 2, and added PlatformNotReady check

* Corrected exception from Omnilogic library

* Bumped omnilogic to 0.3.7. Added alarm sensor/data to sensors. Handle pump off condition for ph and orp sensors.

* Bumped omnilogic to 0.3.7. Added alarm sensor/data to sensors. Handle pump off condition for ph and orp sensors.

* Bumped omnilogic to 0.3.7. Added alarm sensor/data to sensors. Handle pump off condition for ph and orp sensors.

* Removed nested_lookup dependency, bumped omnilogic.py to 0.3.8.

* Fixed lint error

* Added logging for sensor creation.

* Fixed linting errors with logging.

* Fixed explicit chaining of raised error. Fixed issue with alarm sensor.

* Fixed manifest.json based on feedback.

* Fixed self.attrs, should_poll, CoordinatorEntity, SCAN_INTERVAL from comments in PR.

* Addressed unique_id, moved data update coordinator, addressed minor other issues from testing

* Created main OmniLogic entity for common items, reworked DataUpdateCoordinator to it's own class.

* Addressed config_schema not used in __init__.py

* Fixed linting issues.

* Addressed several comments, still todo - separate sensor classes.

* Split the Omnilogic Sensors into separate logical classes for simpler logic.

* Fixed snake case lint error for AddAlarms (to add_alarms)

* Addressed config_flow issues from comments.

* Changed addressed ConfigNotReady issue from comments.

* Updated strings.json and generated corrected en.json with translations.

* Updated en.json to standard generated file.

* Added config_flow tests and updated issue with config_flow on cannot_connect

* Added test case for incomplete information entered.

* Compressed logic in the sensor classes to reduce duplication.

* Updated strings.json for polling_interval, added generic exception handling on config flow.

* Removed omnilogic from the .coveragerc omit file.

* Updated test_config_flow to follow recommended pattern.

* Excluded sensor.py from test coverage tests.

* Corected minor issues in test_config_flow from comments

* Fixed linting issues on last commits

* Fixed linting issues.

* Corrected issue when temp state is not available from Omnilogic

* Added omnililogic_common.py from .coveragerc to bypass test coverage check.

* Return false on Login Exception, handle OmniLogicException in config_flow and in tests.

* Handle all exceptions and in config_flow and tests, clarified test naming.

* Broke out test cases per comments.

* Regenerated en.json file.

* Addressed changes from comments in PR.

* Added session and bumped API to 0.4.0, addressed other comments from PR.

* Addressed entitydata (missed earlier).

* Fixed pylint issue

* Added test case for options flow in test_config_flow.py

* Removed super() and used self when calling methods in current class.

* Addressed comments in PR.

* Addressed comments in PR.

* Updated translations file.

* Rewrote data coordinator to output dict for easy searching.

* Updated chlorinator unit when chlorinator is on/off only

* Fixed ORP method not being @property, fixed unique_id potential issue. Does not address comments from PR.

* Rewrote coordinator for updated dict structure, rewrote sensors to parse new data structure.

* Added alarms as attributes on all entities which support alarm reporting.

* Updated SENSOR_TYPES to sensor_types to adhere to snake case in pylint.

* Addressed PR comments.

* Update homeassistant/components/omnilogic/sensor.py

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

* Update homeassistant/components/omnilogic/sensor.py

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

* Update homeassistant/components/omnilogic/sensor.py

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

* Update homeassistant/components/omnilogic/sensor.py

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

* Update homeassistant/components/omnilogic/sensor.py

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

* Update homeassistant/components/omnilogic/sensor.py

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

* Update homeassistant/components/omnilogic/sensor.py

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

* Update homeassistant/components/omnilogic/sensor.py

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

* Update homeassistant/components/omnilogic/sensor.py

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

* Update homeassistant/components/omnilogic/sensor.py

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

* Update homeassistant/components/omnilogic/sensor.py

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

* Update homeassistant/components/omnilogic/sensor.py

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

* Update homeassistant/components/omnilogic/sensor.py

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

* Update homeassistant/components/omnilogic/sensor.py

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

* Update homeassistant/components/omnilogic/sensor.py

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

* Update homeassistant/components/omnilogic/sensor.py

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

* Removed binary sensor conditions (alarms, on/off sensor types) and added ability for multiple guard conditions

* Update homeassistant/components/omnilogic/sensor.py

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

* Updated per comments in PR for Pump Type and removal of force_update().

* Update homeassistant/components/omnilogic/sensor.py

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

* Update homeassistant/components/omnilogic/common.py

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

* Correctly asserting conditions for the login exception case.

* Update .coveragerc

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

Co-authored-by: Mike Hershberger <mike.hershberger@gmail.com>
Co-authored-by: Chad <54695185+chadlyy@users.noreply.github.com>
Co-authored-by: Tim Empringham <tim.empringham@live.ca>
Co-authored-by: djtimca <60706061+djtimca@users.noreply.github.com>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2020-09-25 17:55:10 +02:00
Angelo Gagliano 318096be79 Remove auto from the fan speed modes for VeSync (#40559) 2020-09-25 15:12:47 +02:00
Franck Nijhof 25bfaf6c0d Upgrade tqdm to 4.49.0 (#40573) 2020-09-25 14:29:27 +02:00
Joakim Plate 0fbeb3bf7b Use HA constants for Rfxtrx units (#40562)
* Add more units and device classes

* Battery level is a value beteen 0 and 9 where 9 indicate full

Actual 0 battery can't occur since since then we would get to signal

* Adjust tests

* Add wind direction and adjust rain rate

* Adjust data types to be None rather than empty string

* Set counter values to count unit

* Forgotten unit
2020-09-25 08:27:38 -04:00
Bouwe Westerdijk b6aa29012e Bump Plugwise-Smile to v1.5.1 (#40572) 2020-09-25 13:18:21 +02:00
Franck Nijhof 9fdab64e8b Merge pull request #40571 from home-assistant/rc 2020-09-25 10:29:07 +02:00
Daniel Hjelseth Høyer 82c61fb6a7 Upgrade Tibber library to 0.15.3 (#40570) 2020-09-25 10:05:01 +02:00
Joakim Sørensen 2d429ea678 Add modifications for snapshot uploads (#40503)
Co-authored-by: springstan <46536646+springstan@users.noreply.github.com>
2020-09-25 10:02:26 +02:00
Franck Nijhof 7be494f845 Bumped version to 0.115.3 2020-09-25 09:28:38 +02:00
Kevin Cathcart 1c8e8419b6 Fix bug in state trigger when using for: without to: (#40556) 2020-09-25 09:27:49 +02:00
Bram Kragten da7f206414 Updated frontend to 20200918.2 (#40549) 2020-09-25 09:27:43 +02:00
Rob Bierbooms 6bd72c3ff5 Fix connection validation during import for dsmr integration (#40548)
* Close transport when equipment identifier is received

* Minor fix
2020-09-25 09:27:37 +02:00
Steven Looman 82c137d69b Increase upnp timeout from 5 seconds to 10 seconds (#40540) 2020-09-25 09:27:32 +02:00
cagnulein a404c51797 Fix luci device_tracker when release is none (#40524)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2020-09-25 09:27:27 +02:00
uvjustin ff39cd753c Disable audio in stream when audio stream profile is None (#40521) 2020-09-25 09:27:22 +02:00
J. Nick Koston fe056f518e Ensure group state is recalculated when re-adding on reload (#40497) 2020-09-25 09:27:15 +02:00
Anders Melchiorsen 0ebeb161e1 Fix handling of quoted time_pattern values (#40470)
Co-authored-by: J. Nick Koston <nick@koston.org>
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2020-09-25 09:27:10 +02:00
Robert Van Gorkom f953454374 Increase gogogate2 request timeout (#40461) 2020-09-25 09:27:07 +02:00
Maciej Bieniek 016834185a Bump accuweather library to version 0.0.11 (#40458) 2020-09-25 09:27:00 +02:00
square99 34c0e0f58d Fix proxy camera conversion with PNG Alpha(RGBA) (#40446) 2020-09-25 09:26:56 +02:00
MeIchthys 95e6969912 Fix regression in Nextcloud component (#40438) 2020-09-25 09:26:52 +02:00
Pedro Lamas 297e5300b4 Fix webostv supported features for "external_speaker" sound output (#40435) 2020-09-25 09:26:48 +02:00
jan iversen 6cccd87318 Make modbus switch read_coil failure resistent (#40417)
* Make modbus switch read_coil failure resistent.

Make sure all return paths return true/false.

* Add comment how binary_sensor get its value (is_on).
2020-09-25 09:26:43 +02:00
cagnulein 532c624d01 Fix luci device_tracker incorrectly reporting devices status (#40409) 2020-09-25 09:26:39 +02:00
Michael Thingnes ed17a81f50 Validate Met.no forecast entries before passing them on to HA (#40400) 2020-09-25 09:26:33 +02:00
On Freund 44be190378 Fix handling of empty ws port (#40399) 2020-09-25 09:26:29 +02:00
Maciej Bieniek b1ac920505 Fix OSError (#40393) 2020-09-25 09:26:25 +02:00
Tom Harris 1901cc962e Bump pyinsteon to 1.0.8 (#40383) 2020-09-25 09:26:21 +02:00
Michael Thingnes babaf48867 Fix Met.no missing conditions in API forecasts (#40373) 2020-09-25 09:26:17 +02:00
Robert Svensson b3e2426967 Axis - Fix list applications breaks if empty response (#40360) 2020-09-25 09:26:14 +02:00
uvjustin f1ee7fed4c Ignore packets with missing dts in peek_first_pts (#40299) 2020-09-25 09:26:10 +02:00
Markus Haack 3efda8d1d2 Guard SolarEdge for inverters without batteries (#40295) 2020-09-25 09:26:07 +02:00
Harrison Pace a5f00d1db2 Use Cloud State as alternative state if condition unknown (#37121) 2020-09-25 09:26:03 +02:00
Kevin Cathcart 371b589cb2 Fix bug in state trigger when using for: without to: (#40556) 2020-09-25 09:15:04 +02:00
cagnulein 4287694b42 Fix luci device_tracker when release is none (#40524)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2020-09-25 09:06:24 +02:00
Martin Eberhardt 700b119482 Add @darkfox as Rejseplanen code owner (#40329) 2020-09-25 07:48:08 +02:00
Ari Simonen fd05a7232a Improve handling of sources without a name in Denon (#40514) 2020-09-25 07:46:57 +02:00
HomeAssistant Azure c30982c981 [ci skip] Translation update 2020-09-25 00:04:29 +00:00
Aaron Bach ebdb34a911 Bump simplisafe-python to 9.3.3 (#40560) 2020-09-24 16:19:25 -06:00
Aaron Bach f82ca44aac Bump pyairvisual to 5.0.2 (#40554)
* Bump pyairvisual to 5.0.2

* Fix tests
2020-09-24 15:31:47 -06:00
Rob Bierbooms 0856c7292c Fix connection validation during import for dsmr integration (#40548)
* Close transport when equipment identifier is received

* Minor fix
2020-09-24 22:50:30 +02:00
Bram Kragten 6afa197586 Updated frontend to 20200918.2 (#40549) 2020-09-24 22:43:34 +02:00
Dermot Duffy 0a656f13eb Fix/Refactor Hyperion Integration (#39738) 2020-09-24 21:37:34 +02:00
Ville Skyttä e06f2a89ea Add Huawei LTE SMS storage full and unread sensors (#40021) 2020-09-24 20:18:55 +03:00
Steven Looman c3b6675617 Increase upnp timeout from 5 seconds to 10 seconds (#40540) 2020-09-24 11:27:55 -05:00
Guido Schmitz 0b11559031 Improve devolo Home Control code quality (#40480)
Co-authored-by: Markus Bong <2Fake1987@gmail.com>
2020-09-24 10:57:52 -05:00
epenet dc30f0e00c Ensure the title is consistent (#40528) 2020-09-24 16:39:42 +02:00
epenet 73f29a6cd4 Ensure consitstency of file docstring for 1-wire (#40528) 2020-09-24 16:39:24 +02:00
epenet 49be073002 Update constant name for onewire (#40530) 2020-09-24 16:37:15 +02:00
Ville Skyttä e3f9818af5 Add more Huawei LTE sensor metadata (#39988) 2020-09-24 17:32:44 +03:00
uvjustin 8e0bb92c79 Disable audio in stream when audio stream profile is None (#40521) 2020-09-24 14:35:52 +02:00
Franck Nijhof ebe3b5bfff Upgrade sentry-sdk to 0.17.8 (#40531) 2020-09-24 14:10:14 +02:00
Eugene Prystupa 7a337ac6fb Fix Bond error logging format (#40519) 2020-09-23 21:40:38 -05:00
Chris Talkington 4b58b8057d Update sonarr to 0.3.0 (#40515) 2020-09-24 02:29:37 +02:00
jjlawren d694c1f548 Bump plexapi to 4.1.1 (#40512) 2020-09-23 19:26:05 -05:00
HomeAssistant Azure c77c0e4780 [ci skip] Translation update 2020-09-24 00:05:22 +00:00
springstan 62054b8433 Correct label in mqtt config flow (#40507) 2020-09-23 21:55:33 +02:00
J. Nick Koston 3880ac0b0d Ensure group state is recalculated when re-adding on reload (#40497) 2020-09-23 20:55:32 +02:00
springstan 6c8e0e20fb Add and use light lux constant in entire code base (#40171) 2020-09-23 20:48:01 +02:00
springstan 6a7caad8dc Use content type json constant (#40312) 2020-09-23 20:21:55 +02:00
Philip Allgaier 9c1eb78a0f Adjust safe_theme for better readability (#40223) 2020-09-23 18:57:35 +02:00
Tomasz 223000a9fb Add all supported languages to OpenWeatherMap (#40448) 2020-09-23 17:57:06 +02:00
nagyrobi 9f5cd5547b Support all available languages in voicerss integration (#40502) 2020-09-23 17:56:23 +02:00
Martin Hjelmare 27c5594cda Add supervisor add-on stop helper (#40501) 2020-09-23 17:54:07 +02:00
Martin Hjelmare ccff7f97cb Add supervisor helper to start add-on (#40495) 2020-09-23 17:05:28 +02:00
Franck Nijhof 40d003eccf Upgrade isort to 5.5.3 (#40493) 2020-09-23 16:44:51 +02:00
Franck Nijhof 784af5ad10 Upgrade sentry-sdk to 0.17.7 (#40492) 2020-09-23 16:44:25 +02:00
jan iversen c7f48e9ea3 Make modbus switch read_coil failure resistent (#40417)
* Make modbus switch read_coil failure resistent.

Make sure all return paths return true/false.

* Add comment how binary_sensor get its value (is_on).
2020-09-23 08:50:01 -05:00
Franck Nijhof 7c61caf68e Revert "Support learning different command types with remote" (#40486)
This reverts commit c6a48d3b61.
2020-09-23 12:39:27 +02:00
springstan c2d20c548f Use content type multipart constant (#40314) 2020-09-23 11:29:56 +02:00
Anders Melchiorsen 7876cdb37a Fix handling of quoted time_pattern values (#40470)
Co-authored-by: J. Nick Koston <nick@koston.org>
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
2020-09-23 09:21:57 +02:00
jjlawren df9634a41f Refactor Plex tests using fixtures (#40260)
* Refactor Plex tests using fixtures

* Avoid unnecessary coroutine declaration
2020-09-22 22:14:41 -05:00
Felipe Martins Diel c6a48d3b61 Support learning different command types with remote (#39670) 2020-09-22 22:09:19 -05:00
lamiskin 5ebce075a1 Improve DOODS folder handling and add process time attribute (#40344)
* Updates to DOODS

* Fix import order
2020-09-22 21:43:21 -05:00
Marvin Wichmann 72a7f69a08 Update xknx to version 0.14.4 (#40472) 2020-09-22 21:10:37 -05:00
springstan 06a133c3e9 Add and use length millimeters constant (#40116)
* Add and use length millimeters constant

* Fix pylint error

* Fix broken accuweather sensor test
2020-09-22 21:09:17 -05:00
Markus Haack 511ea09c99 Guard SolarEdge for inverters without batteries (#40295) 2020-09-22 21:04:01 -05:00
HomeAssistant Azure 75659ff787 [ci skip] Translation update 2020-09-23 00:05:01 +00:00
Robert Van Gorkom a40d853682 Increase gogogate2 request timeout (#40461) 2020-09-22 18:00:27 -05:00
Robert Svensson fb7fb0ea78 deCONZ - move event handling (#40424)
* Working draft

* Remove event references in sensor
2020-09-22 19:55:10 +02:00
Tom Schneider 6e8e4eedb5 Add binary_sensor for elevator states to hvv_departures (#36822)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2020-09-22 17:42:50 +02:00
Maciej Bieniek 0400754270 Bump accuweather library to version 0.0.11 (#40458) 2020-09-22 17:36:44 +02:00
square99 1ed8e41e90 Fix proxy camera conversion with PNG Alpha(RGBA) (#40446) 2020-09-22 17:34:23 +02:00
J. Nick Koston f837da6fe3 Defer template tracking setup until template entity start (#40388) 2020-09-22 09:28:02 -05:00
J. Nick Koston 7029345b9d Add support for selecting multiple entity ids from logbook (#40075) 2020-09-22 09:27:04 -05:00
J. Nick Koston f0f817c361 Serialize websocket event message once (#40453)
Since most of the json serialize work for the websocket was done
multiple times for the same message, we can avoid the overhead
of serializing the same message many times (once per websocket
client) with a cache.
2020-09-22 08:47:04 -05:00
Marvin Wichmann d82b97fbe1 Update xknx to 0.14.3 (#40430) 2020-09-22 15:35:44 +02:00
Adam Belebczuk 02a19d0123 Bump pywemo to 0.5.0 (#40439) 2020-09-22 11:24:22 +02:00
MeIchthys 2f9afd3a2c Fix regression in Nextcloud component (#40438) 2020-09-22 10:58:51 +02:00
Robert Svensson 430275ac88 Axis - Fix list applications breaks if empty response (#40360) 2020-09-22 10:57:26 +02:00
cagnulein 8bff25fedd Fix luci device_tracker incorrectly reporting devices status (#40409) 2020-09-22 10:53:46 +02:00
Pedro Lamas d5741a5ba4 Fix webostv supported features for "external_speaker" sound output (#40435) 2020-09-22 10:49:44 +02:00
Perry Naseck 0582bf7746 Firmata analog input, PWM/analog output, deprecate arduino (#40369)
* firmata analog input

* firmata pwm/analog out, use more HA const

* firmata update pymata to 1.19

* deprecate arduino, firmata supersedes it

* firmata sensor diff min, pull review quality changes

* firmata condense platform setup into loop
2020-09-22 09:44:16 +02:00
Bas Nijholt 50b727ba83 Add PLAY and PAUSE to webos button service description (#40353) 2020-09-22 09:32:09 +02:00
Harrison Pace 8ad7b68c9e Use Cloud State as alternative state if condition unknown (#37121) 2020-09-22 09:01:58 +02:00
Eugene Prystupa f34455b6c2 Add debug logging to Bond fireplace entity (#40318)
* Add logging to Bond fireplace entity for troubleshooting turn off problem

* Update homeassistant/components/bond/light.py

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

* Update homeassistant/components/bond/light.py

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

Co-authored-by: Chris Talkington <chris@talkingtontech.com>
2020-09-21 21:38:43 -05:00
Brett b3691d5d90 Improve timeout error handling for Splunk (#40384)
* Bugfix to catch asyncio.timeout

* Better asyncio.timeout warning message
2020-09-21 20:01:52 -05:00
HomeAssistant Azure 7c344fa0cd [ci skip] Translation update 2020-09-22 00:07:08 +00:00
Ville Skyttä 5e90a4d000 Use more state attribute name constants (#40428) 2020-09-21 23:03:39 +02:00
Tom Harris f78391ce2a Bump pyinsteon to 1.0.8 (#40383) 2020-09-21 22:40:29 +02:00
Michael Thingnes bfbaa1e8bb Validate Met.no forecast entries before passing them on to HA (#40400) 2020-09-21 21:56:08 +02:00
Maciej Bieniek 663245c351 Fix OSError (#40393) 2020-09-21 21:10:02 +02:00
On Freund 447446c565 Fix handling of empty ws port (#40399) 2020-09-21 20:27:00 +02:00
Martin Hjelmare 1d7754f160 Add supervisor add-on uninstall helper (#40413) 2020-09-21 19:25:06 +02:00
MatthewFlamm 31ece55c57 bump pynws to 1.3.0 (#40386) 2020-09-21 19:18:54 +02:00
Marvin Wichmann 3d6434be75 Use centralized KnxEntity for all KNX platforms (#40381) 2020-09-21 18:08:35 +02:00
Robin Wohlers-Reichel c13fbf795d Update Solax Library to 0.2.4 (#40330) 2020-09-21 17:50:03 +02:00
Philip Allgaier 2a4d7dc561 Update voluptuous to 0.12.0 (#40401) 2020-09-21 10:43:35 -05:00
Julien Tant 8b9c757fdc Add zodiac integration (#38935)
* add zodiac sign integration

* add tests & refacto

* Apply suggestions from code review

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

* fix indentation from suggested correction, fix quality scale and remove useless functions

* fix code formatting

* Create const.py

* Update sensor.py

* Update const.py

* Update test_sensor.py

* Update test_sensor.py

* Update test_sensor.py

* Update test_sensor.py

* Update test_sensor.py

* Update sensor.py

* Update test_sensor.py

* Update __init__.py

* Update sensor.py

* Update test_sensor.py

* Update sensor.py

* Update __init__.py

* Update test_sensor.py

* Update __init__.py

* Fix zodiac time patch

* Delete sensor.fr.json

* Update sensor.py

* Delete sensor.en.json

* Update test_sensor.py

* Apply suggestions from code review

Co-authored-by: Chris Talkington <chris@talkingtontech.com>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2020-09-21 10:41:30 -05:00
Martin Hjelmare 2ef3dfb673 Fix supervisor get addon info (#40412) 2020-09-21 16:26:09 +02:00
Finbarr Brady 4aa9b72739 Remove myself as Luci code owner (#40398) 2020-09-21 14:10:39 +02:00
Josef Schlehofer 7cebfa75fc Upgrade youtube_dl to version 2020.09.20 (#40395) 2020-09-21 10:49:16 +02:00
Martin Hjelmare a0df6ccb81 Add supervisor install add-on helper (#40138) 2020-09-21 10:28:24 +02:00
Chris Talkington 37e51aa166 Add reauth source constant for config entries (#40352) 2020-09-20 21:15:48 -05:00
uvjustin 8d3e4b6b3f Ignore packets with missing dts in peek_first_pts (#40299) 2020-09-20 21:26:24 -04:00
HomeAssistant Azure 587e3f1eb2 [ci skip] Translation update 2020-09-21 00:02:47 +00:00
Chris Talkington 432911c994 Apply code review for canary config flow (#40355)
* apply code review for canary config flow

* Update __init__.py

* Update __init__.py

* Update __init__.py

* Update camera.py

* Update camera.py

* Update test_config_flow.py

* Update test_config_flow.py

* Update test_config_flow.py

* Update test_config_flow.py

* Update test_config_flow.py

* Update __init__.py
2020-09-20 17:38:02 -05:00
Michael Thingnes 83b0954e58 Fix Met.no missing conditions in API forecasts (#40373) 2020-09-20 23:56:04 +02:00
Marvin Wichmann 45288431f9 Update xknx to 0.14.2 (#40304)
* Updates xknx to 0.14.0

* Review: Explicity add state attributes to weather device

* Review: Remove state attributes from weather device

* Review: Add `counter` as a state attribute to binary_sensors
2020-09-20 23:40:36 +02:00
springstan 0c077685b6 Use content type text plain constant (#40313) 2020-09-20 13:19:10 +02:00
Brett 4f5d3b4035 Rebuilt Splunk using custom library (#40123)
* Rebuilt Splunk using splunk_data_sender

* Fixing lint issues

* Apply suggestions from code review

Recommended Fixes

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

* Moved to single send queue and fixed ssl verify

* Using coroutine and Asyncio.lock

* Changed to custom library hass_splunk

* Fixed "use_ssl" parameter

* Better error catching

* Better error log

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2020-09-20 11:22:43 +02:00
Ville Skyttä 167490b71c Complete helpers.service type hints (#40193)
* Complete helpers.service type hints

* Update homeassistant/helpers/service.py

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

* Handle None entity.supported_features
2020-09-20 12:03:58 +03:00
HomeAssistant Azure 5dcaeebdac [ci skip] Translation update 2020-09-20 00:05:00 +00:00
Paulus Schoutsen ddbadb1e26 Merge pull request #40310 from home-assistant/rc 2020-09-19 23:06:09 +02:00
Felipe Martins Diel cf81a5c09a Improve tests for Broadlink config flow (#39894) 2020-09-19 20:37:20 +00:00
Paulus Schoutsen a8b6464d7f Bumped version to 0.115.2 2020-09-19 20:13:52 +00:00
Rob Bierbooms 85ae63c656 Fix error creating duplicate ConfigEntry upon import for rfxtrx (#40296) 2020-09-19 20:13:44 +00:00
Alexei Chetroi 68cc34df6f Update ZHA dependencies (#40283) 2020-09-19 20:13:23 +00:00
Daniel Shokouhi 9955e7e5e1 Bump hangups to 0.4.11 (#40258) 2020-09-19 20:11:41 +00:00
Bram Kragten ab8ef1c9e1 Updated frontend to 20200918.0 (#40253) 2020-09-19 20:11:40 +00:00
Robert Van Gorkom 7e6d64a24c Fix high CPU usage in vera integration. (#40249) 2020-09-19 20:11:39 +00:00
On Freund e582caccc9 Fix Kodi discovery title (#40247) 2020-09-19 20:11:39 +00:00
Felipe Martins Diel 1eb8035122 Handle an unsupported device in the Broadlink config flow (#40242) 2020-09-19 20:11:38 +00:00
jan iversen 57b7ed6a07 Correct modbus switch to return correct coil (#40190) 2020-09-19 20:11:37 +00:00
Erik Montnemery d35f06ac15 Get option flow defaults from yaml for non configured MQTT options (#40177) 2020-09-19 20:11:36 +00:00
Erik Montnemery a50f121011 Get option flow defaults from yaml for non configured MQTT options (#40177) 2020-09-19 22:10:01 +02:00
Alexei Chetroi a9168c04fd Update ZHA dependencies (#40283) 2020-09-19 12:39:02 -04:00
Chris Talkington 6b317ced17 Update roku media browser classes (#40285)
* update roku media browser classes

this should allow proper icons to be shown vs plain directory

* Update test_media_player.py

* Update browse_media.py

* Update browse_media.py

* Update browse_media.py

* Update browse_media.py

* Update browse_media.py

* Update browse_media.py

* Update test_media_player.py
2020-09-19 18:02:15 +02:00
SukramJ e300cf3747 Add binary_sensor for cloud connectivity to HomematicIP Cloud (#39675)
* Add binary_sensor for cloud connectivity to HomematicIP Cloud

* Fix Test

* Remove device_class

* Switch from _device to _home

* Switch from _device to _home for sensor
2020-09-19 10:59:46 -05:00
springstan b088830382 Add and use currency cent constant (#40261) 2020-09-19 10:34:54 -05:00
springstan 7de1fe7416 Use percentage constant in more integrations (#40165) 2020-09-19 10:30:22 -05:00
Ian Duffy 711ca6aff5 Add kodi browse media for channels (#40277)
* Add kodi browse media for channels

* Rename "TV Channels" to "Channels"
2020-09-19 17:14:20 +02:00
Chris Talkington 0c8b530aa2 Add device info to canary camera and sensors (#40053)
* add device info to canary sensors

* Update test_sensor.py

* Update sensor.py

* Update sensor.py

* Update test_sensor.py

* Create const.py

* Update sensor.py

* Update test_sensor.py

* Update sensor.py

* Update test_sensor.py

* Update camera.py

* Update camera.py

* Update sensor.py

* Update camera.py

* Update camera.py
2020-09-19 10:09:40 -05:00
Rob Bierbooms 467a001e1f Fix error creating duplicate ConfigEntry upon import for rfxtrx (#40296) 2020-09-19 13:08:14 +02:00
jan iversen 9bd28306f6 Correct modbus switch to return correct coil (#40190) 2020-09-19 12:14:51 +02:00
Tom 5832184304 Add port to plugwise (#40017) 2020-09-19 12:08:16 +02:00
Franck Nijhof b175adae53 Add missing integration quality scale to tags integration (#40291) 2020-09-19 11:49:53 +02:00
Franck Nijhof 399661a7f4 Add missing integration quality scale to image integration (#40289) 2020-09-19 11:48:56 +02:00
springstan e330468a13 Use pressure constants in code base (#40262) 2020-09-19 09:26:08 +02:00
Chris Talkington f563068ce6 Add config flow to canary (#40055)
* Create config_flow.py

* Update config_flow.py

* work on config flow

* Update test_config_flow.py

* Update __init__.py

* Update camera.py

* Update test_config_flow.py

* Update test_config_flow.py

* Update config_flow.py

* Update conftest.py

* Update test_config_flow.py

* Update test_init.py

* Update test_init.py

* Apply suggestions from code review

* Update camera.py

* Update test_init.py

* Update camera.py

* Update __init__.py

* Update test_init.py

* Update test_init.py

* Update __init__.py

* Update __init__.py

* Apply suggestions from code review

* Update __init__.py

* Update test_init.py

* Update __init__.py

* Update __init__.py

* Update config_flow.py

* Update test_config_flow.py

* Update config_flow.py

* Update config_flow.py
2020-09-18 23:22:19 -05:00
Greg Badros 94dfb66824 Make tplink SmartStrip communication more robust (#40281) 2020-09-19 04:48:19 +02:00
twdkeule 052e8f0983 Add Influxdb precision option (#38454) 2020-09-19 04:42:03 +02:00
HomeAssistant Azure 62c4e072f5 [ci skip] Translation update 2020-09-19 00:07:12 +00:00
Daniel Shokouhi cf89b8764b Bump hangups to 0.4.11 (#40258) 2020-09-18 20:43:36 +02:00
Maikel Punie 1ba098508c Update velbus to 2.0.45 (#40256) 2020-09-18 20:19:54 +02:00
timkoers 46b86f4a2f Add UniFi Uptime sensor (#40058)
* Added UniFi Uptime sensor

Added the UniFi uptime data as a sensor. Untested.

* Update sensor.py

Updated code as a result of the tests.

* Changed timestamp format and device class

Converted state to iso timestamp and changed device class to DEVICE_CLASS_TIMESTAMP.

* Updated unit of measurement to None

* Added import

* Update homeassistant/components/unifi/sensor.py

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

* Removed whitespace

* Added the uptime sensors option to the config flow

* All the unit tests should be there now

* Whoops

* Fixed translation

* Properly formatted the code

* Flake8 really has angel eyes

* Black should also be satisfied now

* Should have satisfied all static code analysis tools

* Fixed add uptime sensor function

* Fixed overintendation

* Fixed unit tests

* Made a spelling mistake during editing of unit tests

* Test verifies if utc time is correct

* Converted to iso format

* Converted unit test to iso format

* Unit test sensor json had the wrong uptime name

* Added options_updated handler

* Fixed remove sensors unit test

* Update homeassistant/components/unifi/sensor.py

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

* Update homeassistant/components/unifi/sensor.py

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

* Update test_device_tracker.py

Removed uptime from the devices

* Fixed black formatting issue

* I think the code coverage should be good now

* Trying to add the sensors again

* Using signals to hopefully trigger the controller to add them again

* Forgot import

* Sorted components

* fixed isort comments

* Removed CLASS and DEVICE_CLASS

* Added TYPE again

* Removed double underscores

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Robert Svensson <Kane610@users.noreply.github.com>
2020-09-18 19:33:37 +02:00
Bram Kragten b25bb78916 Updated frontend to 20200918.0 (#40253) 2020-09-18 19:12:10 +02:00
Robert Van Gorkom 2858c8dcc7 Fix high CPU usage in vera integration. (#40249) 2020-09-18 17:39:12 +02:00
On Freund 7f072a5ca8 Fix Kodi discovery title (#40247) 2020-09-18 17:30:46 +02:00
Paulus Schoutsen bf741c1b26 Merge pull request #40243 from home-assistant/rc 2020-09-18 16:51:17 +02:00
Paulus Schoutsen 2df709c7d0 Bumped version to 0.115.1 2020-09-18 14:05:11 +00:00
On Freund e9b355bd8a Fix coolmaster.info (#40240) 2020-09-18 14:04:57 +00:00
On Freund ef279b125d Handle systems without groups (#40238) 2020-09-18 14:04:57 +00:00
On Freund 152b380a2f Fix kodi.call_method (#40236) 2020-09-18 14:04:56 +00:00
Felipe Martins Diel 8a39bea761 Fix RM mini 3 update manager (#40215) 2020-09-18 14:04:55 +00:00
Chris Caron d37fe1fbb6 Disable async on Apprise (#40213) 2020-09-18 14:04:54 +00:00
MeIchthys 33b56b0cf9 Fix Nextcloud sensors becoming unavailable (#40212) 2020-09-18 14:04:53 +00:00
Raman Gupta 0383030266 Fix Vizio async_unload_entry bug (#40210) 2020-09-18 14:04:52 +00:00
Julius Mittenzwei b8fe0c6c3a Upgrade pyvlx to 0.2.17 (#40182) 2020-09-18 14:04:52 +00:00
J. Nick Koston 7cb0c98c03 Log template listeners when debug logging is on (#40180) 2020-09-18 14:04:51 +00:00
MeIchthys 3612df91e1 Fix Nextcloud sensors becoming unavailable (#40212) 2020-09-18 15:34:17 +02:00
Chris Caron 0a0d44a0b5 Disable async on Apprise (#40213) 2020-09-18 15:32:38 +02:00
Felipe Martins Diel 2f7b6bfa2d Fix RM mini 3 update manager (#40215) 2020-09-18 15:31:25 +02:00
Markus Bong 27f11a1022 Use default values in advanced options in devolo home control (#40216) 2020-09-18 15:30:42 +02:00
Philip Allgaier ddbcfe83dd Catch TypeError in strptime() template helper (#40226) 2020-09-18 15:29:40 +02:00
Felipe Martins Diel 976d8f7abe Handle an unsupported device in the Broadlink config flow (#40242) 2020-09-18 15:29:26 +02:00
On Freund ff3fd63eea Handle systems without groups (#40238) 2020-09-18 15:28:39 +02:00
On Freund 4cd876f159 Fix coolmaster.info (#40240) 2020-09-18 15:28:02 +02:00
On Freund 3f514da285 Fix kodi.call_method (#40236) 2020-09-18 15:24:14 +02:00
Tomasz 2d9019d4b2 Fix shelly sensor names (#39854) 2020-09-18 14:32:33 +02:00
Raman Gupta d0a5feda44 Fix Vizio async_unload_entry bug (#40210) 2020-09-18 13:18:56 +02:00
Julius Mittenzwei ed4ab403de Upgrade pyvlx to 0.2.17 (#40182) 2020-09-17 20:18:55 -05:00
cgtobi 4efefd7fba Add cgtobi to kodi code owners (#40202)
* Add myself to Kodi code owners

* Run hassfest
2020-09-17 20:17:22 -05:00
cgtobi 689f1519c0 Add cgtobi to sonos code owners (#40204)
* Add myself to Sonos code owners

* Run hassfest
2020-09-17 20:16:29 -05:00
Raman Gupta 100d2369d5 Use async_on_remove for vizio listeners (#40185) 2020-09-17 20:13:40 -05:00
HomeAssistant Azure 0a0a8fc67d [ci skip] Translation update 2020-09-18 00:07:17 +00:00
Daniel de Jong 1887f11ec9 Do not default Pilight lights to max brightness (#39549)
Fix pilight lights would always turned on at max brightness instead of just turning on. Some 433mhz dimmers (like the KAKU series) remember their last brightness setting.

Fix pilight lights would not respect configured dimlevel_min
2020-09-17 22:48:52 +02:00
J. Nick Koston e9abb357e4 Log template listeners when debug logging is on (#40180) 2020-09-17 14:45:30 -05:00
Paulus Schoutsen 58c6702080 Merge pull request #40179 from home-assistant/rc 2020-09-17 17:37:29 +02:00
Franck Nijhof f77b3d4714 Bumped version to 0.115.0 2020-09-17 17:10:26 +02:00
J. Nick Koston f5aee6b886 Add missing conext preservation to bayesian and universal (#40178)
We already do this for template sensors, but it was
missing for bayesian and universal
2020-09-17 17:07:52 +02:00
Bram Kragten 6f26722f69 Fix editing tags only get isoformat from datetime (#40174)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-09-17 17:07:49 +02:00
Bram Kragten 13cfd1bae1 Updated frontend to 20200917.1 (#40170) 2020-09-17 17:07:45 +02:00
Joakim Sørensen 5271a3eb1e Update pyhaversion to 3.4.2 (#40161) 2020-09-17 17:07:42 +02:00
cagnulein 78022bf145 Fix luci device_tracker not reliably reporting home/away state (#40160) 2020-09-17 17:07:39 +02:00
Chris Talkington 99a57f5a4e Check mpd time type before splitting it (#40139) 2020-09-17 17:07:33 +02:00
SNoof85 2489a6c6ef Fix typo in strings for wolflink (#40164) 2020-09-17 18:07:03 +03:00
J. Nick Koston 44952a94cf Add missing conext preservation to bayesian and universal (#40178)
We already do this for template sensors, but it was
missing for bayesian and universal
2020-09-17 16:47:23 +02:00
Bram Kragten 95e998d25a Fix editing tags only get isoformat from datetime (#40174)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-09-17 16:45:55 +02:00
Chris Talkington 30de984827 Check mpd time type before splitting it (#40139) 2020-09-17 16:01:28 +02:00
Bram Kragten 0bb8a49ea2 Updated frontend to 20200917.1 (#40170) 2020-09-17 14:44:19 +02:00
Joakim Sørensen a82421306f Update pyhaversion to 3.4.2 (#40161) 2020-09-17 12:08:09 +02:00
cagnulein b4d29653c6 Fix luci device_tracker not reliably reporting home/away state (#40160) 2020-09-17 11:35:13 +02:00
Robert Van Gorkom 70173488a8 Add config support to zoneminder integration (#37060)
* Add config support to zoneminder integration.

* Fixing spelling issue.
Adding self to maintainers.
Updating config flows generated file.

* Maintain zoneminder functionality without breaking changes.

* Addressing lint feedback.
Updating code owners.

* Using non-blocking calls.

* Adding tests package file.

* Update service description.

Co-authored-by: Rohan Kapoor <rohan@rohankapoor.com>

* Resolving conflicts in requirements file.

* Resolving more conflicts.

* Addressing PR feedback.

* Merging from dev.

Co-authored-by: Rohan Kapoor <rohan@rohankapoor.com>
2020-09-16 22:58:51 -07:00
Ville Skyttä 271ffac4a9 Fix static/class async mocks on Python 3.8.0 and .1 (#40147)
* forked_daapd

* shelly

* simplipy
2020-09-17 08:20:00 +03:00
HomeAssistant Azure f6584c1866 [ci skip] Translation update 2020-09-17 00:08:34 +00:00
Robert Van Gorkom 00093faae2 Clean up vera typings (#40143)
Co-authored-by: J. Nick Koston <nick@koston.org>
2020-09-16 16:23:50 -05:00
Paulus Schoutsen a9e220c96b Bumped version to 0.115.0b12 2020-09-16 20:50:22 +00:00
Bram Kragten f7d7765d5e Update frontend to 20200916.0 (#40153) 2020-09-16 20:42:50 +00:00
Franck Nijhof 9ffcf35b23 Fix local media browser source conflicting with local www folder (#40151) 2020-09-16 20:42:49 +00:00
Franck Nijhof d3a59652bb Fix missing f from f-strings in cast integration (#40144) 2020-09-16 20:42:48 +00:00
Paulus Schoutsen c62a6cd779 Fix scene validator (#40140) 2020-09-16 20:42:47 +00:00
Bram Kragten a2cf09fb54 Update frontend to 20200916.0 (#40153) 2020-09-16 22:31:43 +02:00
Franck Nijhof f83f3c927a Fix local media browser source conflicting with local www folder (#40151) 2020-09-16 21:38:40 +02:00
J. Nick Koston 5ea04d64f6 Prompt to reauth when the august password is changed or token expires (#40103)
* Prompt to reauth when the august password is changed or token expires

* augment missing config flow coverage

* augment test coverage

* Adjust test

* Update homeassistant/components/august/__init__.py

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

* block until patch complete

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2020-09-16 17:35:01 +02:00
Franck Nijhof 540b925659 Fix missing f from f-strings in cast integration (#40144) 2020-09-16 17:04:57 +02:00
Niccolo Zapponi 2b7e735e3d Remove unsupported states from security systems in HomeKit (#40060) 2020-09-16 10:00:32 -05:00
Paulus Schoutsen d25192d8c5 Fix scene validator (#40140) 2020-09-16 16:26:34 +02:00
Paulus Schoutsen f1169120ae Bumped version to 0.115.0b11 2020-09-16 13:37:51 +00:00
Paulus Schoutsen b28dbe20b6 Fix ESPHome scan tag device ID (#40132) 2020-09-16 13:37:34 +00:00
Paulus Schoutsen 8dde59be02 Guard for when Yandex Transport data fetching fails (#40131) 2020-09-16 13:37:33 +00:00
Jesse Hills abca177894 Use device name stored in device_info for tag scan in ESPHome (#40130) 2020-09-16 13:37:32 +00:00
Jesse Hills d3bb2e5e16 Allow ESPHome to trigger the HA tag scanned event (#40128) 2020-09-16 13:37:31 +00:00
Maciej Bieniek 7f8a89838b Bump aioshelly library to version 0.3.2 (#40118) 2020-09-16 13:36:01 +00:00
springstan 39c4b338f1 Increase TIMEOUT_ACK to 10s (#40117) 2020-09-16 13:33:48 +00:00
Maciej Bieniek 4518335a56 Remove the unnecessary prefix from the sensor names in the Shelly integration (#40097) 2020-09-16 13:33:47 +00:00
Shay Levy b856b0e15d Guard both Shelly 2 & Shelly 2.5 in roller mode (#40086)
Co-authored-by: Maciej Bieniek <bieniu@users.noreply.github.com>
2020-09-16 13:33:46 +00:00
Franck Nijhof 5d518b5365 Add media dirs core configuration (#40071)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-09-16 13:33:46 +00:00
Diogo Gomes ce86112612 Address error in SQL query (#39939) 2020-09-16 13:33:45 +00:00
Franck Nijhof ff0562ad1e Add media dirs core configuration (#40071)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-09-16 15:28:25 +02:00
Franck Nijhof 80764261c3 Upgrade sentry-sdk to 0.17.6 (#40133) 2020-09-16 13:47:52 +02:00
Paulus Schoutsen b515480a98 Fix ESPHome scan tag device ID (#40132) 2020-09-16 13:17:05 +02:00
Paulus Schoutsen 9309297d76 Guard for when Yandex Transport data fetching fails (#40131) 2020-09-16 12:48:38 +02:00
Jesse Hills 16e0ed9242 Use device name stored in device_info for tag scan in ESPHome (#40130) 2020-09-16 12:22:06 +02:00
Jesse Hills d650bcca3b Allow ESPHome to trigger the HA tag scanned event (#40128) 2020-09-16 11:54:59 +02:00
springstan a13c4d4c17 Increase TIMEOUT_ACK to 10s (#40117) 2020-09-16 08:14:11 +02:00
HomeAssistant Azure f28b7f2187 [ci skip] Translation update 2020-09-16 00:09:01 +00:00
Maciej Bieniek 413263a6eb Bump aioshelly library to version 0.3.2 (#40118) 2020-09-16 00:12:59 +02:00
AJ Schmidt 66bb6a6ffa AlarmDecoder config flow fixes (#40037) 2020-09-16 00:11:29 +02:00
springstan 000d2047fb Add and use currency constants (#40113) 2020-09-15 15:01:01 -06:00
springstan 90f5b178ef Use AREA_SQUARE_METERS constant in all integrations (#40107) 2020-09-15 15:00:26 -06:00
Martin Hjelmare a71a4d642b Clean dyson climate tests (#40110)
* Move setup without devices

* Remove not needed tests

* Move set temp test

* Move set temp cool mode test

* Run black

* Move test target temperature

* Move test current temperature

* Move test current humidity

* Move test hvac mode

* Move test hvac modes

* Move test fan modes

* Move test service fan modes

* Move test fan state

* Move test supported features

* Move test idle state

* Move test humidity invalid state

* Move test humidity without state

* Move test device cool

* Rename test

* Move test set mode service

* Clean imports

* Clean strings

* Only load climate platform for climate tests
2020-09-15 22:38:45 +02:00
cgtobi f651b1f54b Extract Netatmo test data (#40094) 2020-09-15 21:49:08 +02:00
Dan Klaffenbach 74cef6966d Expose angle and xy attributes in deCONZ event if present (#39822)
These attribute are used by the color wheel on the Müller Licht tint
remote control.
2020-09-15 21:13:17 +02:00
Diogo Gomes 749d3c360a Address error in SQL query (#39939) 2020-09-15 20:01:36 +02:00
springstan 5a12056e59 Add and use volume cubic constants (#40106) 2020-09-15 19:59:26 +02:00
springstan db582bdc1b Use http status constants more, add HTTP_ACCEPTED and HTTP_BAD_GATEWAY (#39993)
* Use http status codes and add HTTP_BAD_GATEWAY constant

* Address review comments:
 - using constants in tado integration
 - using constant in media_player init.py

* Add and use HTTP_ACCEPTED constant
2020-09-15 20:01:07 +03:00
Josef Schlehofer 59d610af17 Upgrade youtube_dl to version 2020.09.14 (#40104) 2020-09-15 18:52:42 +02:00
Hareesh M U c8d5500441 Add bimonthly period feature for utility_meter component (#39931) 2020-09-15 17:52:19 +02:00
Maciej Bieniek 56ba4907e1 Remove the unnecessary prefix from the sensor names in the Shelly integration (#40097) 2020-09-15 16:30:33 +02:00
Shay Levy 4fbd4957bd Guard both Shelly 2 & Shelly 2.5 in roller mode (#40086)
Co-authored-by: Maciej Bieniek <bieniu@users.noreply.github.com>
2020-09-15 16:29:24 +02:00
Franck Nijhof b116e58620 Upgrade pytest-xdist to 2.1.0 (#40057) 2020-09-15 16:28:51 +02:00
Bram Kragten e095120023 Bumped version to 0.115.0b10 2020-09-15 16:21:32 +02:00
Bram Kragten 3ef3d848f7 Update frontend to 20200915.0 (#40101) 2020-09-15 16:19:42 +02:00
J. Nick Koston 610a327b52 Convert color temperature to hue and saturation for HomeKit (#40089)
The HomeKit spec does not permit the color temp characteristic
being exposed when color (hue, sat) is present.  Since
Home Assistant will still send color temp values, we need to
convert them to hue, sat values for HomeKit
2020-09-15 16:19:41 +02:00
cgtobi 81436fb688 Check Sonos for local library before browsing (#40085) 2020-09-15 16:19:40 +02:00
Alexei Chetroi 24fe9cdd5a Update ZHA dependency (#40083) 2020-09-15 16:19:39 +02:00
Erik Montnemery e5c499c22e Increase TIMEOUT_ACK to 2s (#40080) 2020-09-15 16:19:39 +02:00
cgtobi 99a8604601 Fix netatmo media browser of outdoor events (#40079)
* Fix outdoor events

* Fix test data

* Increase coverage
2020-09-15 16:19:38 +02:00
Paulus Schoutsen 3ef821d62f Fix tag last scanned serialization (#40067) 2020-09-15 16:19:37 +02:00
Pascal Vizeli a38e047e83 Update docker base image to 8.4.0 (#40066) 2020-09-15 16:19:36 +02:00
Jc2k e0fcf9b648 Bump aiohomekit version (regression fix) (#40064) 2020-09-15 16:18:08 +02:00
Evgeny 0e823b566b Fix default forecast mode OpenWeatherMap (#40062) 2020-09-15 16:00:28 +02:00
Markus Bong a9d24c2cd5 Correct devolo climate devices (#40061) 2020-09-15 16:00:27 +02:00
b3nj1 7a7cad39eb Fix ecobee weather forcast off by 1 bug (#40048) 2020-09-15 16:00:26 +02:00
J. Nick Koston 1a76a953c7 Update gogogate2-api to 2.0.2 (#40010)
* Update gogogate2-api to 2.0.2

Resolves a timeout issue: https://github.com/vangorra/python_gogogate2_api/pull/11

* mock voltage
2020-09-15 16:00:25 +02:00
r4nd0mbr1ck db27079fa8 Speedtestdotnet - use server name to generate server list (#39775) 2020-09-15 16:00:24 +02:00
Bram Kragten 272d36bc93 Update frontend to 20200915.0 (#40101) 2020-09-15 15:57:10 +02:00
Martin Hjelmare 487b56ab69 Fix hvv_departures config flow patches (#40095) 2020-09-15 12:37:31 +02:00
Franck Nijhof fffc7e2e8e Upgrade sentry-sdk to 0.17.5 (#40092) 2020-09-15 12:10:22 +02:00
Franck Nijhof 5d0fa1417e Upgrade pytest to 6.0.2 (#39959)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-09-15 10:09:56 +02:00
cgtobi 8236394b85 Check Sonos for local library before browsing (#40085) 2020-09-15 09:30:00 +02:00
J. Nick Koston 2ea604cc2a Convert color temperature to hue and saturation for HomeKit (#40089)
The HomeKit spec does not permit the color temp characteristic
being exposed when color (hue, sat) is present.  Since
Home Assistant will still send color temp values, we need to
convert them to hue, sat values for HomeKit
2020-09-15 09:27:30 +02:00
J. Nick Koston 8d687c951a Update gogogate2-api to 2.0.2 (#40010)
* Update gogogate2-api to 2.0.2

Resolves a timeout issue: https://github.com/vangorra/python_gogogate2_api/pull/11

* mock voltage
2020-09-15 08:48:30 +02:00
r4nd0mbr1ck 11319ac479 Speedtestdotnet - use server name to generate server list (#39775) 2020-09-14 22:50:44 -07:00
Robert Van Gorkom 903afb62d0 Add support for multiple vera controller hubs (#33613) 2020-09-14 22:06:52 -05:00
J. Nick Koston 938e06c00e Fix homekit error when the bridge has been ignored. (#40082) 2020-09-14 19:39:44 -05:00
HomeAssistant Azure d0f4b23063 [ci skip] Translation update 2020-09-15 00:09:18 +00:00
cgtobi cb0452d80e Fix netatmo media browser of outdoor events (#40079)
* Fix outdoor events

* Fix test data

* Increase coverage
2020-09-15 00:32:20 +02:00
Alexei Chetroi bdaea7879b Update ZHA dependency (#40083) 2020-09-14 16:48:39 -04:00
Erik Montnemery 0f3a2f1f29 Increase TIMEOUT_ACK to 2s (#40080) 2020-09-14 22:10:30 +02:00
J. Nick Koston 949bd8d738 Reduce listener cancelation code in template tracker (#40040) 2020-09-14 21:43:00 +02:00
b3nj1 7adec2d894 Fix ecobee weather forcast off by 1 bug (#40048) 2020-09-14 21:29:51 +02:00
Chris Talkington cacbb2eb12 Add unique_id to canary camera (#40054) 2020-09-14 17:41:05 +02:00
J. Nick Koston 15281f468e Extract the icon and state for logbook state changed events (#40039) 2020-09-14 09:35:19 -05:00
Paulus Schoutsen 3ba18550cd Fix tag last scanned serialization (#40067) 2020-09-14 15:40:32 +02:00
Pascal Vizeli e90a9940d4 Update docker base image to 8.4.0 (#40066) 2020-09-14 14:50:39 +02:00
Evgeny 09d437d531 Fix default forecast mode OpenWeatherMap (#40062) 2020-09-14 14:36:08 +02:00
Jc2k f1cc5182f0 Bump aiohomekit version (regression fix) (#40064) 2020-09-14 14:18:43 +02:00
Xiaonan Shen d26160c755 Add rpi_power integration (#35527)
Co-authored-by: Toast <swetoast@users.noreply.github.com>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2020-09-14 12:53:01 +02:00
Markus Bong 224fd24898 Correct devolo climate devices (#40061) 2020-09-14 12:24:49 +02:00
Xiaonan Shen 1e5186fe94 Deprecate the synology integration (#39958)
* Deprecate the synology integration

* Add release to remove synology
2020-09-14 12:14:13 +02:00
rajlaud 6e6d6c65ef Improve reproduce_state for media players (#38266) 2020-09-14 11:48:16 +02:00
Thomas Germain 3881e0cb23 Add temperature and uptime to Synology DSM (#39419)
Co-authored-by: Quentame <polletquentin74@me.com>
2020-09-14 09:42:37 +02:00
Ville Skyttä eb0af3752c Add more SSDP discovery data and constants (#39984) 2020-09-14 09:18:09 +02:00
J. Nick Koston 2e1dbe51a4 Make system_log test reliable (#40049) 2020-09-14 08:48:59 +02:00
J. Nick Koston c19b5c5ac3 Make recorder block_till_done reliable (#40043) 2020-09-14 08:48:29 +02:00
Ville Skyttä ad1a71ebc3 Don't try to create /test dir in camera tests (#39914)
ERROR:homeassistant.components.camera:
Can't write image to file: [Errno 13] Permission denied: '/test'
2020-09-14 08:40:59 +02:00
Ville Skyttä aad6a24f28 Fix vizio async mock fixtures on Python 3.8.0 and .1 (#39926) 2020-09-14 08:35:30 +02:00
Franck Nijhof bda66d1929 Upgrade coverage to 5.3.0 (#40056) 2020-09-14 08:34:18 +02:00
J. Nick Koston 2ff3c74fab Fix intermittently failing dyson test (#40051) 2020-09-13 21:37:52 -05:00
Chris Talkington 056e712667 Add device class to canary sensors (#40050)
* add device class to canary sensors

* Update test_sensor.py

* Update sensor.py

* Update sensor.py
2020-09-13 21:29:59 -05:00
HomeAssistant Azure 9acceda0f8 [ci skip] Translation update 2020-09-14 00:04:10 +00:00
Chris Talkington 9511103e26 Add unique_id to canary alarm_control_panel (#40041)
* add unique_id to canary alarm_control_panel

* Update test_alarm_control_panel.py

* Update alarm_control_panel.py

* Apply suggestions from code review

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

Co-authored-by: J. Nick Koston <nick@koston.org>
2020-09-13 18:52:40 -05:00
Aidan Timson ae8c9d82bc Mark Azure DevOps device as a service (#40044) 2020-09-13 18:22:33 -05:00
J. Nick Koston 7b016063ca Refactor zeroconf setup to be async (#39955)
* Refactor zeroconf setup to be async

Most of the setup was calling back to async because
we were setting up listeners.  Since we only need
to jump into the executor to create the zeroconf
instance, its much faster to setup in async.

In testing this cut the setup time in half
or better.

* partial revert to after_deps
2020-09-13 18:06:19 -05:00
Chris Talkington 00acb180d6 Add canary alarm_control_panel tests (#40029)
* add canary alarm_control_panel tests

* Update .coveragerc

* Create test_alarm_control_panel.py

* Update __init__.py

* Update __init__.py

* Update test_alarm_control_panel.py

* Update test_alarm_control_panel.py

* Update test_alarm_control_panel.py

* Update test_alarm_control_panel.py

* Update __init__.py

* Update __init__.py

* Update test_alarm_control_panel.py

* Update test_alarm_control_panel.py

* Update test_alarm_control_panel.py

* Update test_alarm_control_panel.py

* Update test_alarm_control_panel.py

* Update test_alarm_control_panel.py

* Update test_alarm_control_panel.py

* Update test_alarm_control_panel.py

* Update test_alarm_control_panel.py

* Update test_alarm_control_panel.py
2020-09-13 16:36:26 -05:00
J. Nick Koston 46f9c0fb8a Update phrasing and pin validation for homekit_controller (#40006) 2020-09-13 15:26:04 -05:00
Paulus Schoutsen ef1649383c Bumped version to 0.115.0b9 2020-09-13 20:22:47 +00:00
Franck Nijhof afde5a7ece Fix entity extraction from Template conditions (#40034) 2020-09-13 20:22:38 +00:00
J. Nick Koston 30b8565548 Ensure homekit_controller traps exceptions from find_ip_by_device_id (#40030) 2020-09-13 20:22:38 +00:00
springstan a971b92899 Fix slack notifications requiring an icon (#40027) 2020-09-13 20:22:37 +00:00
J. Nick Koston 4ee7cdc8a0 Do not log an error when a host is unreachable while pinging (#40024) 2020-09-13 20:22:36 +00:00
Robert Svensson 4c2788a13c Improve handling of mireds being far out of spec (#40018) 2020-09-13 20:22:36 +00:00
Bouwe Westerdijk 8b4e193614 Ensure Plugwise unique_id is correctly set (#40014)
* Ensure unique_id is correctly set

* Removed unnec. line

Co-authored-by: Tom Scholten <git@scholten.nu>
2020-09-13 20:22:35 +00:00
Tom f0ce65af7d Add tests for Plugwise integration (#36371) 2020-09-13 20:22:34 +00:00
springstan b81c61dd99 Fix requiring username or password for nzbget yaml config (#40003) 2020-09-13 20:18:57 +00:00
J. Nick Koston 30ef7a5e88 Suppress homekit bridge discovery by homekit controller (#39990) 2020-09-13 20:18:56 +00:00
Franck Nijhof cd26384634 Fix entity extraction from Template conditions (#40034) 2020-09-13 22:05:45 +02:00
springstan 1f8c1f151d Fix requiring username or password for nzbget yaml config (#40003) 2020-09-13 22:04:48 +02:00
J. Nick Koston 36ce8ba79e Ensure homekit_controller traps exceptions from find_ip_by_device_id (#40030) 2020-09-13 21:55:49 +02:00
AJ Schmidt c32f698671 Add Config Flow to AlarmDecoder (#37998) 2020-09-13 12:29:25 -05:00
Chris Talkington 17efa1bda5 Improve canary tests (#39956) 2020-09-13 11:32:41 -05:00
springstan da19854520 Fix slack notifications requiring an icon (#40027) 2020-09-13 10:23:50 -06:00
springstan fc1fb0ab7c Revert 'Use STATE_UNKNOWN constant in dlink and ecobee' (#40022) 2020-09-13 17:11:24 +02:00
J. Nick Koston f3d50e2104 Do not log an error when a host is unreachable while pinging (#40024) 2020-09-13 16:44:37 +02:00
springstan 621526bbae Use moisture and moving device class in various integrations (#39963) 2020-09-13 16:33:54 +02:00
Robert Svensson ceeea52915 Improve handling of mireds being far out of spec (#40018) 2020-09-13 16:31:39 +02:00
J. Nick Koston ff4bb962c4 Cleanup and reduce duplicate code from recent template changes (#40012)
As a result of refactoring, there is duplicate code
we can now reduce.

Additionally `_wrap_state` can be removed because
it had unreachable checks for `None`
2020-09-13 09:21:11 -05:00
J. Nick Koston 84578f515d Suppress homekit bridge discovery by homekit controller (#39990) 2020-09-13 09:12:10 -05:00
Pascal Vizeli 5a6492b76d Update azure-pipelines-wheels.yml 2020-09-13 15:38:31 +02:00
Pascal Vizeli 11d74124cd Update azure-pipelines-wheels.yml 2020-09-13 15:38:02 +02:00
Bram Kragten b19fe17e76 Bumped version to 0.115.0b8 2020-09-13 11:41:46 +02:00
Joakim Sørensen 47326b2295 Bump pyhaversion to 3.4.0 (#40016) 2020-09-13 11:40:19 +02:00
Quentame 951c373110 Fix Freebox call sensor when no call in history (#40001) 2020-09-13 11:40:19 +02:00
Jeff Irion b9b76b3519 Bump androidtv to 0.0.50 (#39998) 2020-09-13 11:40:17 +02:00
Joakim Sørensen da6885af6c Bump frontend to 20200912.0 (#39997) 2020-09-13 11:40:16 +02:00
jjlawren bc2173747c Fix children_media_class for special folders (#39974) 2020-09-13 11:40:15 +02:00
uvjustin d0e6b3e268 Remove skip_sidx container option in stream (#39970)
* Remove skip_sidx container option

* Add comment
2020-09-13 11:40:14 +02:00
Joakim Sørensen 1d12d4d54c Bump pyhaversion to 3.4.0 (#40016) 2020-09-13 11:30:51 +02:00
Bouwe Westerdijk eac9c3c4f2 Ensure Plugwise unique_id is correctly set (#40014)
* Ensure unique_id is correctly set

* Removed unnec. line

Co-authored-by: Tom Scholten <git@scholten.nu>
2020-09-13 11:02:49 +02:00
Xiaonan Shen e3c51f0350 Fix xiaomi_aqara duplicated battery sensors (#39961) 2020-09-13 08:44:32 +02:00
Quentame bab4ad4f17 Add timeout config option to Synology DSM (#40000) 2020-09-12 20:36:39 -05:00
HomeAssistant Azure b05c88f1bc [ci skip] Translation update 2020-09-13 00:04:18 +00:00
Quentame 13df452dd4 Fix Freebox call sensor when no call in history (#40001) 2020-09-13 01:13:57 +02:00
Jeff Irion 285408b46c Bump androidtv to 0.0.50 (#39998) 2020-09-12 23:53:41 +02:00
springstan e55035b2f9 Use DEVICE_CLASS_MOTION in various integrations (#39962) 2020-09-12 16:20:30 -05:00
Joakim Sørensen 02cb592917 Bump frontend to 20200912.0 (#39997) 2020-09-12 16:18:48 -05:00
Simone Chemelli ca26c8bbd7 Shelly: Power and Energy sensors in roller mode (#39709) 2020-09-12 22:31:01 +02:00
uvjustin b0ba0e77f8 Remove skip_sidx container option in stream (#39970)
* Remove skip_sidx container option

* Add comment
2020-09-12 15:19:37 -04:00
springstan 827711bcd1 Use problem, presence and plug device class constants in various integrations (#39973) 2020-09-12 13:23:24 -05:00
springstan 3d4ef8cfe1 Use connectivity device class constant in various integrations (#39972) 2020-09-12 13:21:57 -05:00
Franck Nijhof 6751a38b8e Upgrade responses to 0.12.0 (#39986) 2020-09-12 19:40:10 +02:00
Franck Nijhof 18e9e262e4 Upgrade pytest-timeout to 1.4.2 (#39983) 2020-09-12 19:33:44 +02:00
springstan cee96ae207 Use opening and occupancy device class in various integrations (#39965) 2020-09-12 18:07:13 +02:00
jjlawren 4c0f075d6a Fix children_media_class for special folders (#39974) 2020-09-12 15:54:00 +02:00
Josef Schlehofer 6b966e2c47 Upgrade youtube_dl to version 2020.09.06 (#39969) 2020-09-12 14:58:29 +02:00
springstan 1bb5d4754f Use DEVICE_CLASS_DOOR and DEVICE_CLASS_SMOKE in various integrations (#39950) 2020-09-12 07:35:24 -05:00
Paulus Schoutsen 172a02a605 Bumped version to 0.115.0b7 2020-09-12 12:28:57 +00:00
Bram Kragten b6f868f629 Add children media class to children spotify media browser (#39953) 2020-09-12 12:28:47 +00:00
uvjustin 5697f4b4e7 Set output timescale to input timescale (#39946) 2020-09-12 12:28:47 +00:00
J. Nick Koston 30f9e1b479 Change template loop detection strategy to allow self-referencing updates when there are multiple templates (#39943) 2020-09-12 12:28:46 +00:00
Quentame fcbcebea9b Fix missing position attribute for MeteoFranceAlertSensor (#39938) 2020-09-12 12:28:45 +00:00
J. Nick Koston f81606cbf5 Return the listeners with the template result for the websocket api (#39925) 2020-09-12 12:28:44 +00:00
Greg Dowling 3240be0bb6 Bump pyloopenergy library to 0.2.1 (#39919) 2020-09-12 12:28:44 +00:00
On Freund 18be6cbadc Handle Kodi shutdown (#39856)
* Handle Kodi shutdown

* Core review comments

* Make async_on_quit a coroutine
2020-09-12 12:28:43 +00:00
On Freund cf6b84790f Handle Kodi shutdown (#39856)
* Handle Kodi shutdown

* Core review comments

* Make async_on_quit a coroutine
2020-09-12 14:22:14 +02:00
J. Nick Koston aaa8083d49 Change template loop detection strategy to allow self-referencing updates when there are multiple templates (#39943) 2020-09-12 14:20:21 +02:00
Franck Nijhof e746965b1c Upgrade mypy to 0.782 (#39967) 2020-09-12 11:31:22 +02:00
Franck Nijhof 3dda76115c Upgrade pytest-sugar to 0.9.4 (#39966) 2020-09-12 11:30:41 +02:00
Bram Kragten fbf0e69558 Add children media class to children spotify media browser (#39953) 2020-09-12 10:35:51 +02:00
Franck Nijhof ee6945d63d Upgrade pytest-cov to 2.10.1 (#39964) 2020-09-12 09:39:08 +02:00
Franck Nijhof 824f551969 Upgrade codecov to 2.1.9 (#39960) 2020-09-12 09:08:04 +02:00
springstan f93c0c5cd3 Use DEVICE_CLASS_WINDOW constant in various integrations (#39949) 2020-09-11 21:24:23 -05:00
Felipe Martins Diel a6d3ee90f0 Improve tests for Broadlink config flow (#39894) 2020-09-11 20:00:28 -05:00
Felipe Martins Diel 9f08955fef Improve tests for Broadlink devices (#39898) 2020-09-11 19:57:07 -05:00
springstan ac2e290d97 Use sound, vibration and safety device class constants in various integrations (#39952)
* Use sound, vibration and safety device class constants in various integrations

* Fix wrong imports
2020-09-11 19:37:33 -05:00
HomeAssistant Azure ee5c1ea3f7 [ci skip] Translation update 2020-09-12 00:05:00 +00:00
Xiaonan Shen 4e10895a19 Remove unchecked return value in synology_dsm (#39929) 2020-09-11 15:14:22 -05:00
Jakob Schlyter 9b49ca3820 Add template filter timedelta_seconds to create a timedelta from seconds (#39608) 2020-09-11 15:07:31 -05:00
springstan 719aa0f317 Use STATE_UNKNOWN constant in dlink and ecobee (#39948) 2020-09-11 15:05:07 -05:00
Martin Hjelmare 50c573eb4d Activate hassfest requirements CI check (#39940)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2020-09-11 21:38:32 +02:00
Greg Dowling f1cb8e80b3 Bump pyloopenergy library to 0.2.1 (#39919) 2020-09-11 20:47:48 +02:00
Jc2k 988a467afd Device automation triggers for stateless HomeKit accessories (#39090)
Co-authored-by: J. Nick Koston <nick@koston.org>
2020-09-11 13:34:07 -05:00
J. Nick Koston 741487a1fc Return the listeners with the template result for the websocket api (#39925) 2020-09-11 13:18:40 -05:00
uvjustin 9b29d09d45 Set output timescale to input timescale (#39946) 2020-09-11 14:07:45 -04:00
Quentame 062ac5f27d Fix missing position attribute for MeteoFranceAlertSensor (#39938) 2020-09-11 16:50:17 +02:00
Paulus Schoutsen a002e9b12f Bumped version to 0.115.0b6 2020-09-11 12:18:53 +00:00
Franck Nijhof db64a9ebfa Accept known hosts for get_url for OAuth (#39936) 2020-09-11 12:17:24 +00:00
J. Nick Koston 3fbde22cc4 Update zeroconf to 0.28.5 (#39923) 2020-09-11 12:17:24 +00:00
J. Nick Koston 758e60a58d Prevent missing integration from failing HomeKit startup (#39918) 2020-09-11 12:17:23 +00:00
Paulus Schoutsen 5201410e39 Bump aioshelly to 0.3.1 (#39917) 2020-09-11 12:16:43 +00:00
Thomas Lovén b1b7944012 Set variable values in scripts (#39915)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-09-11 12:16:01 +00:00
Paulus Schoutsen 8ef04268be Extract variable rendering (#39934) 2020-09-11 12:15:28 +00:00
Bas Nijholt b107e87d38 Don't trigger on attribute when the attribute doesn't change (#39910)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-09-11 12:12:58 +00:00
uvjustin b0b9579778 Disable audio for HLS or mpegts input (#39906) 2020-09-11 12:12:57 +00:00
Martin Hjelmare 7eade4029a Add children media class (#39902)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-09-11 12:12:57 +00:00
Marvin Wichmann 3d4913348a Warn users if KNX has no devices configured (#39899)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2020-09-11 12:12:56 +00:00
J. Nick Koston 1720b71d62 Limit zeroconf discovery to name/macaddress when provided (#39877)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-09-11 12:12:27 +00:00
Bas Nijholt c2a9a39ee0 Don't trigger on attribute when the attribute doesn't change (#39910)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-09-11 14:02:17 +02:00
Thomas Lovén f59e727f16 Set variable values in scripts (#39915)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-09-11 13:16:25 +02:00
Marvin Wichmann 8ea8969d80 Warn users if KNX has no devices configured (#39899)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2020-09-11 13:09:31 +02:00
Martin Hjelmare e96fed20c8 Add children media class (#39902)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-09-11 13:08:13 +02:00
J. Nick Koston e208aac834 Add async_track_state_removed_domain to allow tracking when a state is removed from a domain (#39859)
when a state is removed from a domain
2020-09-11 13:03:31 +02:00
Franck Nijhof 101b5b3b35 Accept known hosts for get_url for OAuth (#39936) 2020-09-11 13:00:00 +02:00
Paulus Schoutsen 5117a16841 Extract variable rendering (#39934) 2020-09-11 12:24:16 +02:00
J. Nick Koston 9389a7c9be Limit zeroconf discovery to name/macaddress when provided (#39877)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-09-11 12:19:21 +02:00
J. Nick Koston 487a74ba5d Update zeroconf to 0.28.5 (#39923) 2020-09-11 07:15:13 +02:00
HomeAssistant Azure 39d441a29b [ci skip] Translation update 2020-09-11 00:09:17 +00:00
J. Nick Koston bf1ad0a757 Prevent missing integration from failing HomeKit startup (#39918) 2020-09-10 23:19:11 +02:00
Paulus Schoutsen cfc020daa2 Bump aioshelly to 0.3.1 (#39917) 2020-09-10 23:07:23 +02:00
uvjustin 4ee5a29bc0 Disable audio for HLS or mpegts input (#39906) 2020-09-10 15:55:55 -04:00
Xiaonan Shen b66aaeea99 Add camera support to synology_dsm (#39838)
* Add camera support to synology_dsm

* Code improvements

* More code improvements
2020-09-10 21:08:37 +02:00
Paulus Schoutsen 589086f0d0 Bumped version to 0.115.0b5 2020-09-10 18:53:37 +00:00
Erik Montnemery 6f8060dea7 Fix discovery update of MQTT state templates (#39901) 2020-09-10 18:53:25 +00:00
J. Nick Koston b8ef87d84c Fix ping log level to be debug instead of warning (#39900) 2020-09-10 18:53:25 +00:00
J. Nick Koston 7370b0ffc6 Detect self-referencing loops in template entities and log a warning (#39897) 2020-09-10 18:53:24 +00:00
Paulus Schoutsen 209cf44e8e Add default variables to script helper (#39895) 2020-09-10 18:53:23 +00:00
Pascal Vizeli b7dacabbe4 Fix issue with grpcio build on 32bit arch (#39893) 2020-09-10 18:53:22 +00:00
Bram Kragten 5098c35814 Fix spotify media browser category (#39888) 2020-09-10 18:53:21 +00:00
Paulus Schoutsen 896df60f32 Shelly switch to guard for shelly 2 in roller mode (#39886) 2020-09-10 18:53:21 +00:00
Pascal Vizeli b26ab2849b Bump hass-nabucasa 0.37.0 (#39885) 2020-09-10 18:53:20 +00:00
Paulus Schoutsen 36f52a26f6 Fix event trigger (#39884)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2020-09-10 18:53:19 +00:00
bsmappee f0295d562d Bump pysmappee to 0.2.13 (#39883) 2020-09-10 18:53:18 +00:00
Joakim Sørensen 081bd22e59 Updated frontend to 20200909.0 (#39869)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-10 18:53:18 +00:00
Franck Nijhof 668c73010a Disable Met.no hourly weather by default (#39867)
Co-authored-by: Daniel Hjelseth Høyer <mail@dahoiv.net>
2020-09-10 18:53:17 +00:00
Paulus Schoutsen fe371f0438 Install stdlib-list in script/bootstrap (#39866) 2020-09-10 18:53:16 +00:00
Joakim Sørensen be28dc0bca Add exception for NoURLAvailableError in OAuth2FlowHandler (#39845)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-09-10 18:53:15 +00:00
Chris Talkington 4578baca3e Improve Roku media browser structure (#39754)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2020-09-10 18:53:15 +00:00
Erik Montnemery 4d6e694d14 Fix discovery update of MQTT state templates (#39901) 2020-09-10 20:52:23 +02:00
J. Nick Koston fd8a4182d9 Detect self-referencing loops in template entities and log a warning (#39897) 2020-09-10 20:50:11 +02:00
Franck Nijhof bedc1e5672 Upgrade numpy to 1.19.2 (#39912) 2020-09-10 20:47:15 +02:00
J. Nick Koston 047dc19351 Add zeroconf discovery to homekit (#39907)
Ensures HomeKit Bridge is offered for onboarding if
homekit is detected on the network.
2020-09-10 20:44:11 +02:00
J. Nick Koston fb31b04c08 Increase template test coverage. (#39908) 2020-09-10 20:43:45 +02:00
Paulus Schoutsen aa9dff572e Add default variables to script helper (#39895) 2020-09-10 20:41:42 +02:00
J. Nick Koston b5005430be Fix ping log level to be debug instead of warning (#39900) 2020-09-10 12:10:43 -04:00
Pascal Vizeli 40bcd38caa Update azure-pipelines-wheels.yml 2020-09-10 16:58:15 +02:00
Pascal Vizeli 68e2824a28 Fix issue with grpcio build on 32bit arch (#39893) 2020-09-10 15:56:05 +02:00
Joakim Sørensen 0cce35b23e Add exception for NoURLAvailableError in OAuth2FlowHandler (#39845)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-09-10 14:52:49 +02:00
RogerSelwyn 162c39258e Add Carbon Monoxide binary sensor to Homekit Controller (#39889) 2020-09-10 12:25:14 +01:00
Franck Nijhof 14f7f5ba45 Remove stale debug from WLED tests (#39882) 2020-09-10 13:16:33 +02:00
Paulus Schoutsen 35a9106a4b Shelly switch to guard for shelly 2 in roller mode (#39886) 2020-09-10 12:08:17 +02:00
Bram Kragten b49e6243d1 Fix spotify media browser category (#39888) 2020-09-10 12:06:18 +02:00
Paulus Schoutsen bb661ad083 Fix event trigger (#39884)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2020-09-10 11:25:56 +02:00
Pascal Vizeli 7b3369b71d Bump hass-nabucasa 0.37.0 (#39885) 2020-09-10 11:18:43 +02:00
Paulus Schoutsen c9f87afd8b Optimize requirements check with stdlib (#39871)
* Check requirements don't conflict stdlib

* Use regex
2020-09-10 10:51:13 +02:00
bsmappee 8648d8d012 Bump pysmappee to 0.2.13 (#39883) 2020-09-10 10:27:07 +02:00
Marius a6a011ec19 Use entity_class 'safety' in synology_dsm storage sensors (#39757)
* Use entity_class: 'safety' in storage sensors

and more meaningful icons then 'mdi:test-tube', not sure if these are even necessary, given the device_class that defines the icons too?

* Set device_class, not icon

Still, the temperature sensors have both set, should I take these out in this go too? While we're at it....

* added device_class temperature to temp sensors

and removed explicit icons
do we need to set a D_c also on the Status sensor? line 187

* revert device_class Safety

which is now set in const.py
following up on https://github.com/home-assistant/core/pull/39757#pullrequestreview-483705147

* Use DEVICE_CLASS_SAFETY from const

+ revert temp to avoid conflict

* const from binary

* reverted non binary status sensors

to use: "mdi:checkbox-marked-circle-outline" and set None to device_class

Co-authored-by: Quentame <polletquentin74@me.com>
2020-09-10 09:21:51 +02:00
Franck Nijhof b57f97b954 Upgrade isort to 5.5.2 (#39879) 2020-09-10 08:34:15 +02:00
Franck Nijhof b70df4ab18 Disable Met.no hourly weather by default (#39867)
Co-authored-by: Daniel Hjelseth Høyer <mail@dahoiv.net>
2020-09-10 07:58:40 +02:00
HomeAssistant Azure 6e79d49c80 [ci skip] Translation update 2020-09-10 00:04:20 +00:00
Sören Oldag 1f75f61bb0 Bump pyTibber to 0.15.2 (#39870) 2020-09-10 00:52:27 +02:00
Franck Nijhof 1a12611117 Upgrade sentry-sdk to 0.17.4 (#39868) 2020-09-10 00:49:54 +02:00
Aaron Bach 0e11c10468 Prompt user to reauthenticate AirVisual when API key expires (#38341)
* Prompt user to reauthenticate AirVisual when API key expires

* Don't version bump

* Cleanup

* Linting
2020-09-09 16:41:07 -06:00
Paulus Schoutsen c06b18b47b Install stdlib-list in script/bootstrap (#39866) 2020-09-10 00:36:58 +02:00
Joakim Sørensen 94b4824c27 Updated frontend to 20200909.0 (#39869)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-10 00:32:49 +02:00
Chris Talkington a918981ff3 Improve Roku media browser structure (#39754)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2020-09-09 23:22:26 +02:00
Paulus Schoutsen 6d7dfc0804 Bumped version to 0.115.0b4 2020-09-09 20:35:18 +00:00
Martin Hjelmare c5cf95c14b Remove media class apps and channels (#39864) 2020-09-09 20:34:15 +00:00
Alexei Chetroi f79ce7bd04 Update ZHA dependency (#39862) 2020-09-09 20:34:14 +00:00
Jason Hunter 578c1b283a Sort Local Media Source and fix media class (#39858) 2020-09-09 20:34:13 +00:00
Martin 5ae0844f35 Updated warning_device_warn (#39851)
duty_cycle: spec says in inrements of 10
duration: its a 16 bit field
2020-09-09 20:34:13 +00:00
J. Nick Koston 8e3e2d436e Use a unique id for each icmplib ping to avoid mixing unrelated responses (#39830) 2020-09-09 20:34:12 +00:00
Colin Frei 4af6804c50 Use correct URL for Fitbit callbacks (#39823) 2020-09-09 20:34:11 +00:00
Martin 9c40b511f2 Updated warning_device_warn (#39851)
duty_cycle: spec says in inrements of 10
duration: its a 16 bit field
2020-09-09 22:30:40 +02:00
Martin Hjelmare e6bc48ab68 Remove media class apps and channels (#39864) 2020-09-09 22:19:52 +02:00
Jason Hunter 9358b5089e Sort Local Media Source and fix media class (#39858) 2020-09-09 22:19:30 +02:00
J. Nick Koston b7ad83c655 Use a unique id for each icmplib ping to avoid mixing unrelated responses (#39830) 2020-09-09 22:19:14 +02:00
Alexei Chetroi b0b0b15d9d Update ZHA dependency (#39862) 2020-09-09 15:08:55 -04:00
Colin Frei 5fd059a3b6 Use correct URL for Fitbit callbacks (#39823) 2020-09-09 20:19:37 +02:00
Chris 1f000e2c3e Allow setting of hvac_mode when setting temperature in ozw (#39853) 2020-09-09 17:08:43 +02:00
Paulus Schoutsen 1333e23c23 Bumped version to 0.115.0b3 2020-09-09 13:15:53 +00:00
Martin Hjelmare b572c0df7f Make spotify media class lookup more robust (#39841) 2020-09-09 13:15:47 +00:00
cgtobi 139a0ca008 Fix Kodi media browser (#39840)
* Refactor

* Make linter happy

* Only return at the end

* Handle exception
2020-09-09 13:15:46 +00:00
Chris Talkington 0458b5e3a6 Fix nzbget sensors (#39833)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-09-09 13:15:45 +00:00
cgtobi c91c9f2b40 Fix Kodi media browser (#39829)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-09-09 13:15:45 +00:00
Maciej Bieniek 5165d746aa Add missing sensors after reworking sensor platform in Shelly integration (#39765) 2020-09-09 13:15:44 +00:00
Chris Talkington 74219663d6 Fix nzbget sensors (#39833)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2020-09-09 14:56:40 +02:00
Martin Hjelmare be04f14a78 Make spotify media class lookup more robust (#39841) 2020-09-09 14:48:28 +02:00
cgtobi 4f342eae27 Fix Kodi media browser (#39840)
* Refactor

* Make linter happy

* Only return at the end

* Handle exception
2020-09-09 14:12:11 +02:00
Philip Allgaier 8185ddf9a1 Add systemmonitor check for mandatory "arg" of sensors (#39687)
* Added check for mandatory "arg" of sensors

* Make pylint happy

* Moved to vol validator function for "arg" checks

* Make pylint happy once again

* Adjustments from code review
2020-09-09 12:57:24 +02:00
HomeAssistant Azure 90892d275c [ci skip] Translation update 2020-09-09 00:03:44 +00:00
cgtobi 1c4951a8d7 Fix Kodi media browser (#39829)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-09-08 23:42:45 +02:00
Quentame 95a33ba894 Bump Synology DSM to 0.9.0 (#39819) 2020-09-08 23:38:41 +02:00
Maciej Bieniek 748e2696dc Add missing sensors after reworking sensor platform in Shelly integration (#39765) 2020-09-08 23:22:44 +02:00
Paulus Schoutsen 6cadc5b157 Bumped version to 0.115.0b2 2020-09-08 21:18:08 +00:00
Franchie d32e3dc31a Avoid failing when hub does not provide cover position information (#39826)
The powerview hub, seemingly randomly, will occasionally not
provide data for cover positions. Some requests will return the
desired response, but minutes later the same request might not.

It appears this issue is being experienced by a number of people:
https://community.home-assistant.io/t/hunter-douglas-powerview-component-expanding-this-api/88635/48

While an unfortunate bug with the hub, crashing the integration
as a result of this missing data appears somewhat excessive.
This patch adds a simple check to ensure the 'position' key
has been returned by the hub before attempting to access its
data.
2020-09-08 21:18:04 +00:00
Bram Kragten 807bfb71df Update frontend to 20200908.0 (#39824) 2020-09-08 21:18:03 +00:00
Erik Montnemery c2f16cf21d Fix MQTT light value template (#39820) 2020-09-08 21:18:02 +00:00
Bram Kragten a45f5c7831 Update frontend to 20200908.0 (#39824) 2020-09-08 23:17:30 +02:00
Erik Montnemery 9aba1985c7 Fix MQTT light value template (#39820) 2020-09-08 23:11:42 +02:00
Franchie 066a418518 Avoid failing when hub does not provide cover position information (#39826)
The powerview hub, seemingly randomly, will occasionally not
provide data for cover positions. Some requests will return the
desired response, but minutes later the same request might not.

It appears this issue is being experienced by a number of people:
https://community.home-assistant.io/t/hunter-douglas-powerview-component-expanding-this-api/88635/48

While an unfortunate bug with the hub, crashing the integration
as a result of this missing data appears somewhat excessive.
This patch adds a simple check to ensure the 'position' key
has been returned by the hub before attempting to access its
data.
2020-09-08 16:00:38 -05:00
J. Nick Koston 8adfcf23f0 Fix isy994 send_node_command (#39806) 2020-09-08 17:31:08 +02:00
J. Nick Koston 4bbd69955b Restore missing device_class to template binary_sensor (#39805) 2020-09-08 17:12:23 +02:00
J. Nick Koston 0507ec9d8b Fix cover template entities honoring titlecase True/False (#39803) 2020-09-08 17:08:31 +02:00
Martin Hjelmare 586d7eaba6 Add media class browse media attribute (#39770) 2020-09-08 16:42:01 +02:00
Franck Nijhof f075823529 Bump version to 0.116.0dev0 (#39768) 2020-09-08 16:39:48 +02:00
Emilv2 a695dc20fd Bump pydelijn to 0.6.1 (#39802) 2020-09-08 16:18:34 +02:00
Franck Nijhof 8e4710a2a9 Remove deprecated Hue configuration (#39800) 2020-09-08 15:52:04 +02:00
Paulus Schoutsen c6cba5ebc8 Remove HTML support from frontend (#39799) 2020-09-08 15:42:50 +02:00
Paulus Schoutsen 63aa46369b Copy instead of deepcopy the variables in a wait for trigger (#39796) 2020-09-08 15:23:38 +02:00
Paulus Schoutsen 5bcffba53e Guard for spotify items without type (#39795)
Co-authored-by: Bram Kragten <mail@bramkragten.nl>
2020-09-08 15:23:29 +02:00
Paulus Schoutsen 1e2741ff1b Some shelly fixes (#39798) 2020-09-08 15:12:20 +02:00
cgtobi 973524a4e6 Fix Sonos issue (#39790) 2020-09-08 14:13:48 +02:00
Bas Nijholt fa1a53cdeb Restore miflora now that v0.7.0 is out (#39787)
* add miflora again, reverts part of github.com/home-assistant/core/pull/37707

* edit CODEOWNERS
2020-09-08 13:50:53 +02:00
Franck Nijhof 401002dcd4 Remove invalidation version from panel_custom (#39782) 2020-09-08 11:59:39 +02:00
Andreas Rehn c68056d3ad Add missing EDL21 OBIS codes (#39714) 2020-09-08 10:40:05 +02:00
Simone Chemelli 0c8630a2f0 Support shelly cover(roller) mode (#39711)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2020-09-08 10:35:01 +02:00
J. Nick Koston a495946eeb Add the ability to reload bayesian platforms from yaml (#39771) 2020-09-08 09:41:17 +02:00
Tom bb9ea7ce6e Add tests for Plugwise integration (#36371) 2020-09-08 08:37:44 +02:00
HomeAssistant Azure 07d5af1969 [ci skip] Translation update 2020-09-08 00:04:13 +00:00
1798 changed files with 36516 additions and 9775 deletions
+32 -13
View File
@@ -33,7 +33,11 @@ omit =
homeassistant/components/airvisual/air_quality.py
homeassistant/components/airvisual/sensor.py
homeassistant/components/aladdin_connect/cover.py
homeassistant/components/alarmdecoder/*
homeassistant/components/alarmdecoder/__init__.py
homeassistant/components/alarmdecoder/alarm_control_panel.py
homeassistant/components/alarmdecoder/binary_sensor.py
homeassistant/components/alarmdecoder/const.py
homeassistant/components/alarmdecoder/sensor.py
homeassistant/components/alpha_vantage/sensor.py
homeassistant/components/amazon_polly/tts.py
homeassistant/components/ambiclimate/climate.py
@@ -117,7 +121,6 @@ omit =
homeassistant/components/buienradar/util.py
homeassistant/components/buienradar/weather.py
homeassistant/components/caldav/calendar.py
homeassistant/components/canary/alarm_control_panel.py
homeassistant/components/canary/camera.py
homeassistant/components/cast/*
homeassistant/components/cert_expiry/helper.py
@@ -266,7 +269,9 @@ omit =
homeassistant/components/firmata/board.py
homeassistant/components/firmata/const.py
homeassistant/components/firmata/entity.py
homeassistant/components/firmata/light.py
homeassistant/components/firmata/pin.py
homeassistant/components/firmata/sensor.py
homeassistant/components/firmata/switch.py
homeassistant/components/fitbit/sensor.py
homeassistant/components/fixer/sensor.py
@@ -315,6 +320,8 @@ omit =
homeassistant/components/glances/sensor.py
homeassistant/components/gntp/notify.py
homeassistant/components/goalfeed/*
homeassistant/components/goalzero/__init__.py
homeassistant/components/goalzero/binary_sensor.py
homeassistant/components/google/*
homeassistant/components/google_cloud/tts.py
homeassistant/components/google_maps/device_tracker.py
@@ -369,6 +376,7 @@ omit =
homeassistant/components/hunterdouglas_powerview/sensor.py
homeassistant/components/hunterdouglas_powerview/cover.py
homeassistant/components/hunterdouglas_powerview/entity.py
homeassistant/components/hvv_departures/binary_sensor.py
homeassistant/components/hvv_departures/sensor.py
homeassistant/components/hvv_departures/__init__.py
homeassistant/components/hydrawise/*
@@ -478,7 +486,8 @@ omit =
homeassistant/components/london_underground/sensor.py
homeassistant/components/loopenergy/sensor.py
homeassistant/components/luci/device_tracker.py
homeassistant/components/luftdaten/*
homeassistant/components/luftdaten/__init__.py
homeassistant/components/luftdaten/sensor.py
homeassistant/components/lupusec/*
homeassistant/components/lutron/*
homeassistant/components/lutron_caseta/__init__.py
@@ -530,7 +539,9 @@ omit =
homeassistant/components/mjpeg/camera.py
homeassistant/components/mobile_app/*
homeassistant/components/mochad/*
homeassistant/components/modbus/*
homeassistant/components/modbus/climate.py
homeassistant/components/modbus/cover.py
homeassistant/components/modbus/switch.py
homeassistant/components/modem_callerid/sensor.py
homeassistant/components/mpchc/media_player.py
homeassistant/components/mpd/media_player.py
@@ -589,13 +600,16 @@ omit =
homeassistant/components/nut/sensor.py
homeassistant/components/nx584/alarm_control_panel.py
homeassistant/components/nzbget/coordinator.py
homeassistant/components/nzbget/sensor.py
homeassistant/components/obihai/*
homeassistant/components/octoprint/*
homeassistant/components/oem/climate.py
homeassistant/components/oasa_telematics/sensor.py
homeassistant/components/ohmconnect/sensor.py
homeassistant/components/ombi/*
homeassistant/components/omnilogic/__init__.py
homeassistant/components/omnilogic/common.py
homeassistant/components/omnilogic/sensor.py
homeassistant/components/onewire/const.py
homeassistant/components/onewire/sensor.py
homeassistant/components/onkyo/media_player.py
homeassistant/components/onvif/__init__.py
@@ -657,11 +671,6 @@ omit =
homeassistant/components/plaato/*
homeassistant/components/plex/media_player.py
homeassistant/components/plex/sensor.py
homeassistant/components/plugwise/__init__.py
homeassistant/components/plugwise/binary_sensor.py
homeassistant/components/plugwise/climate.py
homeassistant/components/plugwise/sensor.py
homeassistant/components/plugwise/switch.py
homeassistant/components/plum_lightpad/light.py
homeassistant/components/pocketcasts/sensor.py
homeassistant/components/point/*
@@ -809,6 +818,7 @@ omit =
homeassistant/components/spc/*
homeassistant/components/speedtestdotnet/*
homeassistant/components/spider/*
homeassistant/components/splunk/*
homeassistant/components/spotcrime/sensor.py
homeassistant/components/spotify/__init__.py
homeassistant/components/spotify/media_player.py
@@ -836,7 +846,9 @@ omit =
homeassistant/components/synology_chat/notify.py
homeassistant/components/synology_dsm/__init__.py
homeassistant/components/synology_dsm/binary_sensor.py
homeassistant/components/synology_dsm/camera.py
homeassistant/components/synology_dsm/sensor.py
homeassistant/components/synology_dsm/switch.py
homeassistant/components/synology_srm/device_tracker.py
homeassistant/components/syslog/notify.py
homeassistant/components/systemmonitor/sensor.py
@@ -850,7 +862,13 @@ omit =
homeassistant/components/ted5000/sensor.py
homeassistant/components/telegram/notify.py
homeassistant/components/telegram_bot/*
homeassistant/components/tellduslive/*
homeassistant/components/tellduslive/__init__.py
homeassistant/components/tellduslive/binary_sensor.py
homeassistant/components/tellduslive/cover.py
homeassistant/components/tellduslive/entry.py
homeassistant/components/tellduslive/light.py
homeassistant/components/tellduslive/sensor.py
homeassistant/components/tellduslive/switch.py
homeassistant/components/tellstick/*
homeassistant/components/telnet/switch.py
homeassistant/components/temper/sensor.py
@@ -869,7 +887,9 @@ omit =
homeassistant/components/thingspeak/*
homeassistant/components/thinkingcleaner/*
homeassistant/components/thomson/device_tracker.py
homeassistant/components/tibber/*
homeassistant/components/tibber/__init__.py
homeassistant/components/tibber/notify.py
homeassistant/components/tibber/sensor.py
homeassistant/components/tikteck/light.py
homeassistant/components/tile/__init__.py
homeassistant/components/tile/device_tracker.py
@@ -1030,7 +1050,6 @@ omit =
homeassistant/components/zhong_hong/climate.py
homeassistant/components/xbee/*
homeassistant/components/ziggo_mediabox_xl/media_player.py
homeassistant/components/zoneminder/*
homeassistant/components/supla/*
homeassistant/components/zwave/util.py
homeassistant/components/ozw/__init__.py
+11 -12
View File
@@ -518,25 +518,24 @@ jobs:
hassfest:
name: Check hassfest
runs-on: ubuntu-latest
needs: prepare-base
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: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v2.1.2
id: python
with:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Restore base Python virtual environment
- name:
Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache@v2
with:
path: venv
key: >-
${{ env.CACHE_VERSION}}-${{ runner.os }}-base-venv-${{
steps.python.outputs.python-version }}-${{
hashFiles('requirements.txt') }}-${{
hashFiles('requirements_test.txt') }}-${{
${{ env.CACHE_VERSION}}-${{ 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'
@@ -546,7 +545,7 @@ jobs:
- name: Run hassfest
run: |
. venv/bin/activate
python -m script.hassfest --action validate
python -m script.hassfest --requirements --action validate
gen-requirements-all:
name: Check all requirements
+1 -1
View File
@@ -39,7 +39,7 @@ repos:
- --configfile=tests/bandit.yaml
files: ^(homeassistant|script|tests)/.+\.py$
- repo: https://github.com/PyCQA/isort
rev: 5.5.1
rev: 5.5.3
hooks:
- id: isort
- repo: https://github.com/pre-commit/pre-commit-hooks
+16 -6
View File
@@ -157,6 +157,7 @@ homeassistant/components/geonetnz_volcano/* @exxamalte
homeassistant/components/gios/* @bieniu
homeassistant/components/gitter/* @fabaff
homeassistant/components/glances/* @fabaff @engrbm87
homeassistant/components/goalzero/* @tkdrob
homeassistant/components/gogogate2/* @vangorra
homeassistant/components/google_assistant/* @home-assistant/cloud
homeassistant/components/google_cloud/* @lufton
@@ -169,6 +170,7 @@ homeassistant/components/growatt_server/* @indykoning
homeassistant/components/guardian/* @bachya
homeassistant/components/harmony/* @ehendrix23 @bramkragten @bdraco
homeassistant/components/hassio/* @home-assistant/hass-io
homeassistant/components/hdmi_cec/* @newAM
homeassistant/components/heatmiser/* @andylockran
homeassistant/components/heos/* @andrewsayre
homeassistant/components/here_travel_time/* @eifinger
@@ -193,6 +195,7 @@ homeassistant/components/humidifier/* @home-assistant/core @Shulyaka
homeassistant/components/hunterdouglas_powerview/* @bdraco
homeassistant/components/hvv_departures/* @vigonotion
homeassistant/components/hydrawise/* @ptcryan
homeassistant/components/hyperion/* @dermotduffy
homeassistant/components/iammeter/* @lewei50
homeassistant/components/iaqualink/* @flz
homeassistant/components/icloud/* @Quentame
@@ -226,7 +229,7 @@ homeassistant/components/keenetic_ndms2/* @foxel
homeassistant/components/kef/* @basnijholt
homeassistant/components/keyboard_remote/* @bendavid
homeassistant/components/knx/* @Julius2342 @farmio @marvin-w
homeassistant/components/kodi/* @OnFreund
homeassistant/components/kodi/* @OnFreund @cgtobi
homeassistant/components/konnected/* @heythisisnate @kit-klein
homeassistant/components/lametric/* @robbiet480
homeassistant/components/launch_library/* @ludeeus
@@ -236,8 +239,9 @@ homeassistant/components/linux_battery/* @fabaff
homeassistant/components/local_ip/* @issacg
homeassistant/components/logger/* @home-assistant/core
homeassistant/components/logi_circle/* @evanjd
homeassistant/components/loopenergy/* @pavoni
homeassistant/components/lovelace/* @home-assistant/frontend
homeassistant/components/luci/* @fbradyirl @mzdrale
homeassistant/components/luci/* @mzdrale
homeassistant/components/luftdaten/* @fabaff
homeassistant/components/lupusec/* @majuss
homeassistant/components/lutron/* @JonGilmore
@@ -260,7 +264,7 @@ homeassistant/components/min_max/* @fabaff
homeassistant/components/minecraft_server/* @elmurato
homeassistant/components/minio/* @tkislan
homeassistant/components/mobile_app/* @robbiet480
homeassistant/components/modbus/* @adamchengtkc @janiversen
homeassistant/components/modbus/* @adamchengtkc @janiversen @vzahradnik
homeassistant/components/monoprice/* @etsinko @OnFreund
homeassistant/components/moon/* @fabaff
homeassistant/components/mpd/* @fabaff
@@ -299,6 +303,7 @@ homeassistant/components/nzbget/* @chriscla
homeassistant/components/obihai/* @dshokouhi
homeassistant/components/ohmconnect/* @robbiet480
homeassistant/components/ombi/* @larssont
homeassistant/components/omnilogic/* @oliver84 @djtimca @gentoosu
homeassistant/components/onboarding/* @home-assistant/core
homeassistant/components/onewire/* @garbled1
homeassistant/components/onvif/* @hunterjm
@@ -348,6 +353,7 @@ homeassistant/components/raincloud/* @vanstinator
homeassistant/components/rainforest_eagle/* @gtdiehl @jcalbert
homeassistant/components/rainmachine/* @bachya
homeassistant/components/random/* @fabaff
homeassistant/components/rejseplanen/* @DarkFox
homeassistant/components/repetier/* @MTrab
homeassistant/components/rfxtrx/* @danielhiversen @elupus
homeassistant/components/ring/* @balloob
@@ -356,6 +362,7 @@ homeassistant/components/rmvtransport/* @cgtobi
homeassistant/components/roku/* @ctalkington
homeassistant/components/roomba/* @pschmitt @cyr-ius @shenxn
homeassistant/components/roon/* @pavoni
homeassistant/components/rpi_power/* @shenxn @swetoast
homeassistant/components/safe_mode/* @home-assistant/core
homeassistant/components/saj/* @fredericvl
homeassistant/components/salt/* @bjornorri
@@ -398,9 +405,11 @@ homeassistant/components/soma/* @ratsept
homeassistant/components/somfy/* @tetienne
homeassistant/components/sonarr/* @ctalkington
homeassistant/components/songpal/* @rytilahti @shenxn
homeassistant/components/sonos/* @cgtobi
homeassistant/components/spaceapi/* @fabaff
homeassistant/components/speedtestdotnet/* @rohankapoorcom @engrbm87
homeassistant/components/spider/* @peternijssen
homeassistant/components/splunk/* @Bre77
homeassistant/components/spotify/* @frenck
homeassistant/components/sql/* @dgomes
homeassistant/components/squeezebox/* @rajlaud
@@ -420,7 +429,7 @@ homeassistant/components/switchbot/* @danielhiversen
homeassistant/components/switcher_kis/* @tomerfi
homeassistant/components/switchmate/* @danielhiversen
homeassistant/components/syncthru/* @nielstron
homeassistant/components/synology_dsm/* @ProtoThis @Quentame
homeassistant/components/synology_dsm/* @hacf-fr @Quentame
homeassistant/components/synology_srm/* @aerialls
homeassistant/components/syslog/* @fabaff
homeassistant/components/tado/* @michaelarnauts @bdraco
@@ -465,7 +474,7 @@ homeassistant/components/velbus/* @Cereal2nd @brefra
homeassistant/components/velux/* @Julius2342
homeassistant/components/vera/* @vangorra
homeassistant/components/versasense/* @flamm3blemuff1n
homeassistant/components/version/* @fabaff
homeassistant/components/version/* @fabaff @ludeeus
homeassistant/components/vesync/* @markperdue @webdjoe @thegardenmonkey
homeassistant/components/vicare/* @oischinger
homeassistant/components/vilfo/* @ManneW
@@ -501,8 +510,9 @@ homeassistant/components/yi/* @bachya
homeassistant/components/zeroconf/* @Kane610
homeassistant/components/zerproc/* @emlove
homeassistant/components/zha/* @dmulcahey @adminiuga
homeassistant/components/zodiac/* @JulienTant
homeassistant/components/zone/* @home-assistant/core
homeassistant/components/zoneminder/* @rohankapoorcom
homeassistant/components/zoneminder/* @rohankapoorcom @vangorra
homeassistant/components/zwave/* @home-assistant/z-wave
# Individual files
+8 -1
View File
@@ -47,8 +47,9 @@ jobs:
- template: templates/azp-job-wheels.yaml@azure
parameters:
builderVersion: '$(versionWheels)'
builderApk: 'build-base;cmake;git;linux-headers;bluez-dev;libffi-dev;openssl-dev;glib-dev;eudev-dev;libxml2-dev;libxslt-dev;libpng-dev;libjpeg-turbo-dev;tiff-dev;autoconf;automake;cups-dev;gmp-dev;mpfr-dev;mpc1-dev;ffmpeg-dev;gammu-dev'
builderApk: 'build-base;cmake;git;linux-headers;libexecinfo-dev;bluez-dev;libffi-dev;openssl-dev;glib-dev;eudev-dev;libxml2-dev;libxslt-dev;libpng-dev;libjpeg-turbo-dev;tiff-dev;autoconf;automake;cups-dev;gmp-dev;mpfr-dev;mpc1-dev;ffmpeg-dev;gammu-dev'
builderPip: 'Cython;numpy;scikit-build'
builderEnvFile: true
skipBinary: 'aiohttp'
wheelsRequirement: 'requirements_wheels.txt'
wheelsRequirementDiff: 'requirements_diff.txt'
@@ -90,4 +91,10 @@ jobs:
sed -i "s|# bme680|bme680|g" ${requirement_file}
sed -i "s|# python-gammu|python-gammu|g" ${requirement_file}
done
# Write env for build settings
(
echo "GRPC_BUILD_WITH_BORING_SSL_ASM="
echo "GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1"
) > .env_file
displayName: 'Prepare requirements files for Home Assistant wheels'
+5 -5
View File
@@ -1,11 +1,11 @@
{
"image": "homeassistant/{arch}-homeassistant",
"build_from": {
"aarch64": "homeassistant/aarch64-homeassistant-base:8.3.0",
"armhf": "homeassistant/armhf-homeassistant-base:8.3.0",
"armv7": "homeassistant/armv7-homeassistant-base:8.3.0",
"amd64": "homeassistant/amd64-homeassistant-base:8.3.0",
"i386": "homeassistant/i386-homeassistant-base:8.3.0"
"aarch64": "homeassistant/aarch64-homeassistant-base:8.4.0",
"armhf": "homeassistant/armhf-homeassistant-base:8.4.0",
"armv7": "homeassistant/armv7-homeassistant-base:8.4.0",
"amd64": "homeassistant/amd64-homeassistant-base:8.4.0",
"i386": "homeassistant/i386-homeassistant-base:8.4.0"
},
"labels": {
"io.hass.type": "core"
@@ -5,6 +5,7 @@ from homeassistant.const import (
LENGTH_FEET,
LENGTH_INCHES,
LENGTH_METERS,
LENGTH_MILLIMETERS,
PERCENTAGE,
SPEED_KILOMETERS_PER_HOUR,
SPEED_MILES_PER_HOUR,
@@ -24,7 +25,6 @@ ATTR_UNIT_METRIC = "Metric"
CONCENTRATION_PARTS_PER_CUBIC_METER = f"p/{VOLUME_CUBIC_METERS}"
COORDINATOR = "coordinator"
DOMAIN = "accuweather"
LENGTH_MILIMETERS = "mm"
MANUFACTURER = "AccuWeather, Inc."
NAME = "AccuWeather"
UNDO_UPDATE_LISTENER = "undo_update_listener"
@@ -238,7 +238,7 @@ SENSOR_TYPES = {
ATTR_DEVICE_CLASS: None,
ATTR_ICON: "mdi:weather-rainy",
ATTR_LABEL: "Precipitation",
ATTR_UNIT_METRIC: LENGTH_MILIMETERS,
ATTR_UNIT_METRIC: LENGTH_MILLIMETERS,
ATTR_UNIT_IMPERIAL: LENGTH_INCHES,
},
"PressureTendency": {
@@ -2,7 +2,7 @@
"domain": "accuweather",
"name": "AccuWeather",
"documentation": "https://www.home-assistant.io/integrations/accuweather/",
"requirements": ["accuweather==0.0.10"],
"requirements": ["accuweather==0.0.11"],
"codeowners": ["@bieniu"],
"config_flow": true,
"quality_scale": "platinum"
@@ -0,0 +1,13 @@
{
"config": {
"step": {
"user": {
"data": {
"latitude": "Breitengrad",
"longitude": "L\u00e4ngengrad"
},
"title": "AccuWeather"
}
}
}
}
@@ -0,0 +1,35 @@
{
"config": {
"abort": {
"single_instance_allowed": "Sidumine juba tehtud. V\u00f5imalik on ainult 1 sidumine,"
},
"error": {
"cannot_connect": "\u00dchendus eba\u00f5nnestus",
"invalid_api_key": "API v\u00f5ti on vale",
"requests_exceeded": "Accuweatheri API-le esitatud p\u00e4ringute piirarv on \u00fcletatud. Peate ootama (v\u00f5i muutma API v\u00f5tit)."
},
"step": {
"user": {
"data": {
"api_key": "API v\u00f5ti",
"latitude": "Laiuskraad",
"longitude": "Pikkuskraad",
"name": "Sidumise nimi"
},
"description": "Kui vajate seadistamisel abi vaadake siit: https://www.home-assistant.io/integrations/accuweather/ \n\n M\u00f5ni andur pole vaikimisi lubatud. P\u00e4rast sidumise seadistamist saate need \u00fcksused lubada. \n Ilmapennustus pole vaikimisi lubatud. Saate selle lubada sidumise s\u00e4tetes.",
"title": "AccuWeather"
}
}
},
"options": {
"step": {
"user": {
"data": {
"forecast": "Ilmateade"
},
"description": "AccuWeather API tasuta versioonis toimub ilmaennustuse lubamisel andmete v\u00e4rskendamine iga 32 minuti asemel iga 64 minuti j\u00e4rel.",
"title": "AccuWeatheri valikud"
}
}
}
}
@@ -3,9 +3,32 @@
"abort": {
"single_instance_allowed": "D\u00e9j\u00e0 configur\u00e9. Une seule configuration possible."
},
"error": {
"cannot_connect": "\u00c9chec de connexion",
"invalid_api_key": "Cl\u00e9 API invalide",
"requests_exceeded": "Le nombre autoris\u00e9 de requ\u00eates adress\u00e9es \u00e0 l'API AccuWeather a \u00e9t\u00e9 d\u00e9pass\u00e9. Vous devez attendre ou modifier la cl\u00e9 API."
},
"step": {
"user": {
"description": "Si vous avez besoin d'aide pour la configuration, consultez le site suivant : https://www.home-assistant.io/integrations/accuweather/\n\nCertains capteurs ne sont pas activ\u00e9s par d\u00e9faut. Vous pouvez les activer dans le registre des entit\u00e9s apr\u00e8s la configuration de l'int\u00e9gration.\nLes pr\u00e9visions m\u00e9t\u00e9orologiques ne sont pas activ\u00e9es par d\u00e9faut. Vous pouvez l'activer dans les options d'int\u00e9gration."
"data": {
"api_key": "Cl\u00e9 d'API",
"latitude": "Latitude",
"longitude": "Longitude",
"name": "Nom de l'int\u00e9gration"
},
"description": "Si vous avez besoin d'aide pour la configuration, consultez le site suivant : https://www.home-assistant.io/integrations/accuweather/\n\nCertains capteurs ne sont pas activ\u00e9s par d\u00e9faut. Vous pouvez les activer dans le registre des entit\u00e9s apr\u00e8s la configuration de l'int\u00e9gration.\nLes pr\u00e9visions m\u00e9t\u00e9orologiques ne sont pas activ\u00e9es par d\u00e9faut. Vous pouvez l'activer dans les options d'int\u00e9gration.",
"title": "AccuWeather"
}
}
},
"options": {
"step": {
"user": {
"data": {
"forecast": "Pr\u00e9visions m\u00e9t\u00e9orologiques"
},
"description": "En raison des limitations de la version gratuite de la cl\u00e9 API AccuWeather, lorsque vous activez les pr\u00e9visions m\u00e9t\u00e9orologiques, les mises \u00e0 jour des donn\u00e9es seront effectu\u00e9es toutes les 64 minutes au lieu de toutes les 32 minutes.",
"title": "Options AccuWeather"
}
}
}
@@ -16,7 +16,8 @@
"longitude": "Lengdegrad",
"name": "Navn p\u00e5 integrasjon"
},
"description": "Hvis du trenger hjelp med konfigurasjonen, kan du se her: https://www.home-assistant.io/integrations/accuweather/ \n\n Noen sensorer er ikke aktivert som standard. Du kan aktivere dem i enhetsregisteret etter integrasjonskonfigurasjonen. \n V\u00e6rmelding er ikke aktivert som standard. Du kan aktivere det i integrasjonsalternativene."
"description": "Hvis du trenger hjelp med konfigurasjonen, kan du se her: https://www.home-assistant.io/integrations/accuweather/ \n\n Noen sensorer er ikke aktivert som standard. Du kan aktivere dem i enhetsregisteret etter integrasjonskonfigurasjonen. \n V\u00e6rmelding er ikke aktivert som standard. Du kan aktivere det i integrasjonsalternativene.",
"title": ""
}
}
},
@@ -4,7 +4,7 @@
"single_instance_allowed": "Ju\u017c skonfigurowano. Mo\u017cliwa jest tylko jedna konfiguracja."
},
"error": {
"cannot_connect": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia.",
"cannot_connect": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia",
"invalid_api_key": "Nieprawid\u0142owy klucz API.",
"requests_exceeded": "Dozwolona liczba zapyta\u0144 do interfejsu API AccuWeather zosta\u0142a przekroczona. Musisz poczeka\u0107 lub zmieni\u0107 klucz API."
},
@@ -0,0 +1,9 @@
{
"state": {
"accuweather__pressure_tendency": {
"falling": "Langev",
"rising": "T\u00f5usev",
"steady": "\u00dchtlane"
}
}
}
@@ -0,0 +1,9 @@
{
"state": {
"accuweather__pressure_tendency": {
"falling": "En baisse",
"rising": "En hausse",
"steady": "Stable"
}
}
}
@@ -11,5 +11,6 @@
"title": "Velg en hub du vil legge til"
}
}
}
},
"title": ""
}
@@ -16,6 +16,7 @@
"data": {
"host": "Vert",
"password": "Passord",
"port": "",
"ssl": "AdGuard Hjem bruker et SSL-sertifikat",
"username": "Brukernavn",
"verify_ssl": "AdGuard Home bruker et riktig sertifikat"
@@ -5,7 +5,7 @@
"single_instance_allowed": "Dozwolona jest tylko jedna konfiguracja AdGuard Home."
},
"error": {
"connection_error": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia."
"connection_error": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia"
},
"step": {
"hassio_confirm": {
@@ -4,6 +4,7 @@ import logging
import voluptuous as vol
from homeassistant.components.binary_sensor import (
DEVICE_CLASS_MOVING,
DEVICE_CLASSES_SCHEMA,
PLATFORM_SCHEMA,
BinarySensorEntity,
@@ -43,7 +44,7 @@ class AdsBinarySensor(AdsEntity, BinarySensorEntity):
def __init__(self, ads_hub, name, ads_var, device_class):
"""Initialize ADS binary sensor."""
super().__init__(ads_hub, name, ads_var)
self._device_class = device_class or "moving"
self._device_class = device_class or DEVICE_CLASS_MOVING
async def async_added_to_hass(self):
"""Register device notification."""
@@ -10,7 +10,8 @@
"step": {
"user": {
"data": {
"host": "Vert"
"host": "Vert",
"port": ""
},
"title": "Konfigurere Agent DVR"
}
@@ -1,7 +1,7 @@
{
"config": {
"abort": {
"already_configured": "Urz\u0105dzenie jest ju\u017c skonfigurowane."
"already_configured": "Urz\u0105dzenie jest ju\u017c skonfigurowane"
},
"error": {
"already_in_progress": "Konfiguracja urz\u0105dzenia jest ju\u017c w toku.",
@@ -0,0 +1,14 @@
"""Describe group states."""
from homeassistant.components.group import GroupIntegrationRegistry
from homeassistant.core import callback
from homeassistant.helpers.typing import HomeAssistantType
@callback
def async_describe_on_off_states(
hass: HomeAssistantType, registry: GroupIntegrationRegistry
) -> None:
"""Describe group on off states."""
registry.exclude_domain()
+1 -1
View File
@@ -3,7 +3,7 @@
"name": "Airly",
"documentation": "https://www.home-assistant.io/integrations/airly",
"codeowners": ["@bieniu"],
"requirements": ["airly==0.0.2"],
"requirements": ["airly==1.0.0"],
"config_flow": true,
"quality_scale": "platinum"
}
@@ -0,0 +1,12 @@
{
"config": {
"step": {
"user": {
"data": {
"latitude": "Laiuskraad",
"longitude": "Pikkuskraad"
}
}
}
}
}
@@ -15,7 +15,8 @@
"longitude": "Lengdegrad",
"name": "Navn p\u00e5 integrasjonen"
},
"description": "Sett opp Airly luftkvalitet integrasjon. For \u00e5 opprette API-n\u00f8kkel, g\u00e5 til [https://developer.airly.eu/register](https://developer.airly.eu/register)"
"description": "Sett opp Airly luftkvalitet integrasjon. For \u00e5 opprette API-n\u00f8kkel, g\u00e5 til [https://developer.airly.eu/register](https://developer.airly.eu/register)",
"title": ""
}
}
}
@@ -3,9 +3,11 @@
"step": {
"user": {
"data": {
"api_key": "",
"latitude": "Latitude",
"longitude": "Longitude"
}
},
"title": ""
}
}
}
+23 -15
View File
@@ -3,8 +3,13 @@ import asyncio
from datetime import timedelta
from math import ceil
from pyairvisual import Client
from pyairvisual.errors import AirVisualError, NodeProError
from pyairvisual import CloudAPI, NodeSamba
from pyairvisual.errors import (
AirVisualError,
InvalidKeyError,
KeyExpiredError,
NodeProError,
)
import voluptuous as vol
from homeassistant.config_entries import SOURCE_IMPORT
@@ -206,29 +211,36 @@ def _standardize_node_pro_config_entry(hass, config_entry):
async def async_setup_entry(hass, config_entry):
"""Set up AirVisual as config entry."""
websession = aiohttp_client.async_get_clientsession(hass)
if CONF_API_KEY in config_entry.data:
_standardize_geography_config_entry(hass, config_entry)
client = Client(api_key=config_entry.data[CONF_API_KEY], session=websession)
websession = aiohttp_client.async_get_clientsession(hass)
cloud_api = CloudAPI(config_entry.data[CONF_API_KEY], session=websession)
async def async_update_data():
"""Get new data from the API."""
if CONF_CITY in config_entry.data:
api_coro = client.api.city(
api_coro = cloud_api.air_quality.city(
config_entry.data[CONF_CITY],
config_entry.data[CONF_STATE],
config_entry.data[CONF_COUNTRY],
)
else:
api_coro = client.api.nearest_city(
api_coro = cloud_api.air_quality.nearest_city(
config_entry.data[CONF_LATITUDE],
config_entry.data[CONF_LONGITUDE],
)
try:
return await api_coro
except (InvalidKeyError, KeyExpiredError):
hass.async_create_task(
hass.config_entries.flow.async_init(
DOMAIN,
context={"source": "reauth"},
data=config_entry.data,
)
)
except AirVisualError as err:
raise UpdateFailed(f"Error while retrieving data: {err}") from err
@@ -254,17 +266,13 @@ async def async_setup_entry(hass, config_entry):
else:
_standardize_node_pro_config_entry(hass, config_entry)
client = Client(session=websession)
async def async_update_data():
"""Get new data from the API."""
try:
return await client.node.from_samba(
config_entry.data[CONF_IP_ADDRESS],
config_entry.data[CONF_PASSWORD],
include_history=False,
include_trends=False,
)
async with NodeSamba(
config_entry.data[CONF_IP_ADDRESS], config_entry.data[CONF_PASSWORD]
) as node:
return await node.async_get_latest_measurements()
except NodeProError as err:
raise UpdateFailed(f"Error while retrieving data: {err}") from err
@@ -40,9 +40,9 @@ class AirVisualNodeProSensor(AirVisualEntity, AirQualityEntity):
@property
def air_quality_index(self):
"""Return the Air Quality Index (AQI)."""
if self.coordinator.data["current"]["settings"]["is_aqi_usa"]:
return self.coordinator.data["current"]["measurements"]["aqi_us"]
return self.coordinator.data["current"]["measurements"]["aqi_cn"]
if self.coordinator.data["settings"]["is_aqi_usa"]:
return self.coordinator.data["measurements"]["aqi_us"]
return self.coordinator.data["measurements"]["aqi_cn"]
@property
def available(self):
@@ -52,61 +52,59 @@ class AirVisualNodeProSensor(AirVisualEntity, AirQualityEntity):
@property
def carbon_dioxide(self):
"""Return the CO2 (carbon dioxide) level."""
return self.coordinator.data["current"]["measurements"].get("co2")
return self.coordinator.data["measurements"].get("co2")
@property
def device_info(self):
"""Return device registry information for this entity."""
return {
"identifiers": {
(DOMAIN, self.coordinator.data["current"]["serial_number"])
},
"name": self.coordinator.data["current"]["settings"]["node_name"],
"identifiers": {(DOMAIN, self.coordinator.data["serial_number"])},
"name": self.coordinator.data["settings"]["node_name"],
"manufacturer": "AirVisual",
"model": f'{self.coordinator.data["current"]["status"]["model"]}',
"model": f'{self.coordinator.data["status"]["model"]}',
"sw_version": (
f'Version {self.coordinator.data["current"]["status"]["system_version"]}'
f'{self.coordinator.data["current"]["status"]["app_version"]}'
f'Version {self.coordinator.data["status"]["system_version"]}'
f'{self.coordinator.data["status"]["app_version"]}'
),
}
@property
def name(self):
"""Return the name."""
node_name = self.coordinator.data["current"]["settings"]["node_name"]
node_name = self.coordinator.data["settings"]["node_name"]
return f"{node_name} Node/Pro: Air Quality"
@property
def particulate_matter_2_5(self):
"""Return the particulate matter 2.5 level."""
return self.coordinator.data["current"]["measurements"].get("pm2_5")
return self.coordinator.data["measurements"].get("pm2_5")
@property
def particulate_matter_10(self):
"""Return the particulate matter 10 level."""
return self.coordinator.data["current"]["measurements"].get("pm1_0")
return self.coordinator.data["measurements"].get("pm1_0")
@property
def particulate_matter_0_1(self):
"""Return the particulate matter 0.1 level."""
return self.coordinator.data["current"]["measurements"].get("pm0_1")
return self.coordinator.data["measurements"].get("pm0_1")
@property
def unique_id(self):
"""Return a unique, Home Assistant friendly identifier for this entity."""
return self.coordinator.data["current"]["serial_number"]
return self.coordinator.data["serial_number"]
@callback
def update_from_latest_data(self):
"""Update the entity from the latest data."""
self._attrs.update(
{
ATTR_VOC: self.coordinator.data["current"]["measurements"].get("voc"),
ATTR_VOC: self.coordinator.data["measurements"].get("voc"),
**{
ATTR_SENSOR_LIFE.format(pollutant): lifespan
for pollutant, lifespan in self.coordinator.data["current"][
"status"
]["sensor_life"].items()
for pollutant, lifespan in self.coordinator.data["status"][
"sensor_life"
].items()
},
}
)
@@ -1,7 +1,7 @@
"""Define a config flow manager for AirVisual."""
import asyncio
from pyairvisual import Client
from pyairvisual import CloudAPI, NodeSamba
from pyairvisual.errors import InvalidKeyError, NodeProError
import voluptuous as vol
@@ -34,12 +34,19 @@ class AirVisualFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
VERSION = 2
CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_POLL
def __init__(self):
"""Initialize the config flow."""
self._geo_id = None
self._latitude = None
self._longitude = None
self.api_key_data_schema = vol.Schema({vol.Required(CONF_API_KEY): str})
@property
def geography_schema(self):
"""Return the data schema for the cloud API."""
return vol.Schema(
return self.api_key_data_schema.extend(
{
vol.Required(CONF_API_KEY): str,
vol.Required(
CONF_LATITUDE, default=self.hass.config.latitude
): cv.latitude,
@@ -85,8 +92,8 @@ class AirVisualFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
step_id="geography", data_schema=self.geography_schema
)
geo_id = async_get_geography_id(user_input)
await self._async_set_unique_id(geo_id)
self._geo_id = async_get_geography_id(user_input)
await self._async_set_unique_id(self._geo_id)
self._abort_if_unique_id_configured()
# Find older config entries without unique ID:
@@ -95,13 +102,13 @@ class AirVisualFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
continue
if any(
geo_id == async_get_geography_id(geography)
self._geo_id == async_get_geography_id(geography)
for geography in entry.data[CONF_GEOGRAPHIES]
):
return self.async_abort(reason="already_configured")
websession = aiohttp_client.async_get_clientsession(self.hass)
client = Client(session=websession, api_key=user_input[CONF_API_KEY])
cloud_api = CloudAPI(user_input[CONF_API_KEY], session=websession)
# If this is the first (and only the first) time we've seen this API key, check
# that it's valid:
@@ -113,7 +120,7 @@ class AirVisualFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
async with check_keys_lock:
if user_input[CONF_API_KEY] not in checked_keys:
try:
await client.api.nearest_city()
await cloud_api.air_quality.nearest_city()
except InvalidKeyError:
return self.async_show_form(
step_id="geography",
@@ -123,10 +130,19 @@ class AirVisualFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
checked_keys.add(user_input[CONF_API_KEY])
return self.async_create_entry(
title=f"Cloud API ({geo_id})",
data={**user_input, CONF_INTEGRATION_TYPE: INTEGRATION_TYPE_GEOGRAPHY},
)
return await self.async_step_geography_finish(user_input)
async def async_step_geography_finish(self, user_input=None):
"""Handle the finalization of a Cloud API config entry."""
existing_entry = await self.async_set_unique_id(self._geo_id)
if existing_entry:
self.hass.config_entries.async_update_entry(existing_entry, data=user_input)
return self.async_abort(reason="reauth_successful")
return self.async_create_entry(
title=f"Cloud API ({self._geo_id})",
data={**user_input, CONF_INTEGRATION_TYPE: INTEGRATION_TYPE_GEOGRAPHY},
)
async def async_step_import(self, import_config):
"""Import a config entry from configuration.yaml."""
@@ -141,16 +157,10 @@ class AirVisualFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
await self._async_set_unique_id(user_input[CONF_IP_ADDRESS])
websession = aiohttp_client.async_get_clientsession(self.hass)
client = Client(session=websession)
node = NodeSamba(user_input[CONF_IP_ADDRESS], user_input[CONF_PASSWORD])
try:
await client.node.from_samba(
user_input[CONF_IP_ADDRESS],
user_input[CONF_PASSWORD],
include_history=False,
include_trends=False,
)
await node.async_connect()
except NodeProError as err:
LOGGER.error("Error connecting to Node/Pro unit: %s", err)
return self.async_show_form(
@@ -159,11 +169,37 @@ class AirVisualFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
errors={CONF_IP_ADDRESS: "unable_to_connect"},
)
await node.async_disconnect()
return self.async_create_entry(
title=f"Node/Pro ({user_input[CONF_IP_ADDRESS]})",
data={**user_input, CONF_INTEGRATION_TYPE: INTEGRATION_TYPE_NODE_PRO},
)
async def async_step_reauth(self, data):
"""Handle configuration by re-auth."""
self._latitude = data[CONF_LATITUDE]
self._longitude = data[CONF_LONGITUDE]
return await self.async_step_reauth_confirm()
async def async_step_reauth_confirm(self, user_input=None):
"""Handle re-auth completion."""
if not user_input:
return self.async_show_form(
step_id="reauth_confirm", data_schema=self.api_key_data_schema
)
conf = {
CONF_API_KEY: user_input[CONF_API_KEY],
CONF_LATITUDE: self._latitude,
CONF_LONGITUDE: self._longitude,
}
self._geo_id = async_get_geography_id(conf)
return await self.async_step_geography_finish(conf)
async def async_step_user(self, user_input=None):
"""Handle the start of the config flow."""
if not user_input:
@@ -3,6 +3,6 @@
"name": "AirVisual",
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/airvisual",
"requirements": ["pyairvisual==4.4.0"],
"requirements": ["pyairvisual==5.0.2"],
"codeowners": ["@bachya"]
}
+10 -20
View File
@@ -38,10 +38,6 @@ ATTR_POLLUTANT_SYMBOL = "pollutant_symbol"
ATTR_POLLUTANT_UNIT = "pollutant_unit"
ATTR_REGION = "region"
MASS_PARTS_PER_MILLION = "ppm"
MASS_PARTS_PER_BILLION = "ppb"
VOLUME_MICROGRAMS_PER_CUBIC_METER = "µg/m3"
SENSOR_KIND_LEVEL = "air_pollution_level"
SENSOR_KIND_AQI = "air_quality_index"
SENSOR_KIND_POLLUTANT = "main_pollutant"
@@ -229,22 +225,20 @@ class AirVisualNodeProSensor(AirVisualEntity):
def device_info(self):
"""Return device registry information for this entity."""
return {
"identifiers": {
(DOMAIN, self.coordinator.data["current"]["serial_number"])
},
"name": self.coordinator.data["current"]["settings"]["node_name"],
"identifiers": {(DOMAIN, self.coordinator.data["serial_number"])},
"name": self.coordinator.data["settings"]["node_name"],
"manufacturer": "AirVisual",
"model": f'{self.coordinator.data["current"]["status"]["model"]}',
"model": f'{self.coordinator.data["status"]["model"]}',
"sw_version": (
f'Version {self.coordinator.data["current"]["status"]["system_version"]}'
f'{self.coordinator.data["current"]["status"]["app_version"]}'
f'Version {self.coordinator.data["status"]["system_version"]}'
f'{self.coordinator.data["status"]["app_version"]}'
),
}
@property
def name(self):
"""Return the name."""
node_name = self.coordinator.data["current"]["settings"]["node_name"]
node_name = self.coordinator.data["settings"]["node_name"]
return f"{node_name} Node/Pro: {self._name}"
@property
@@ -255,18 +249,14 @@ class AirVisualNodeProSensor(AirVisualEntity):
@property
def unique_id(self):
"""Return a unique, Home Assistant friendly identifier for this entity."""
return f"{self.coordinator.data['current']['serial_number']}_{self._kind}"
return f"{self.coordinator.data['serial_number']}_{self._kind}"
@callback
def update_from_latest_data(self):
"""Update the entity from the latest data."""
if self._kind == SENSOR_KIND_BATTERY_LEVEL:
self._state = self.coordinator.data["current"]["status"]["battery"]
self._state = self.coordinator.data["status"]["battery"]
elif self._kind == SENSOR_KIND_HUMIDITY:
self._state = self.coordinator.data["current"]["measurements"].get(
"humidity"
)
self._state = self.coordinator.data["measurements"].get("humidity")
elif self._kind == SENSOR_KIND_TEMPERATURE:
self._state = self.coordinator.data["current"]["measurements"].get(
"temperature_C"
)
self._state = self.coordinator.data["measurements"].get("temperature_C")
@@ -0,0 +1,17 @@
{
"config": {
"step": {
"geography": {
"data": {
"latitude": "Laiuskraad",
"longitude": "Pikkuskraad"
}
},
"user": {
"data": {
"cloud_api": "Geograafiline asukoht"
}
}
}
}
}
@@ -29,6 +29,7 @@
"user": {
"data": {
"cloud_api": "Geografisk plassering",
"node_pro": "",
"type": "Integrasjonstype"
},
"description": "Velg hvilken type AirVisual-data du vil overv\u00e5ke.",
@@ -4,7 +4,7 @@
"already_configured": "Ten klucz API jest ju\u017c w u\u017cyciu."
},
"error": {
"general_error": "Nieoczekiwany b\u0142\u0105d.",
"general_error": "Nieoczekiwany b\u0142\u0105d",
"invalid_api_key": "Nieprawid\u0142owy klucz API.",
"unable_to_connect": "Nie mo\u017cna po\u0142\u0105czy\u0107 si\u0119 z jednostk\u0105 Node/Pro."
},
@@ -6,6 +6,7 @@ import voluptuous as vol
from homeassistant.const import (
ATTR_CODE,
ATTR_ENTITY_ID,
ATTR_SUPPORTED_FEATURES,
CONF_CODE,
CONF_DEVICE_ID,
CONF_DOMAIN,
@@ -56,7 +57,7 @@ async def async_get_actions(hass: HomeAssistant, device_id: str) -> List[dict]:
if state is None:
continue
supported_features = state.attributes["supported_features"]
supported_features = state.attributes[ATTR_SUPPORTED_FEATURES]
# Add actions for each entity that belongs to this integration
if supported_features & SUPPORT_ALARM_ARM_AWAY:
@@ -11,6 +11,7 @@ from homeassistant.components.alarm_control_panel.const import (
)
from homeassistant.const import (
ATTR_ENTITY_ID,
ATTR_SUPPORTED_FEATURES,
CONF_CONDITION,
CONF_DEVICE_ID,
CONF_DOMAIN,
@@ -73,7 +74,7 @@ async def async_get_conditions(
if state is None:
continue
supported_features = state.attributes["supported_features"]
supported_features = state.attributes[ATTR_SUPPORTED_FEATURES]
# Add conditions for each entity that belongs to this integration
conditions += [
@@ -12,6 +12,7 @@ from homeassistant.components.automation import AutomationActionType
from homeassistant.components.device_automation import TRIGGER_BASE_SCHEMA
from homeassistant.components.homeassistant.triggers import state as state_trigger
from homeassistant.const import (
ATTR_SUPPORTED_FEATURES,
CONF_DEVICE_ID,
CONF_DOMAIN,
CONF_ENTITY_ID,
@@ -64,7 +65,7 @@ async def async_get_triggers(hass: HomeAssistant, device_id: str) -> List[dict]:
if entity_state is None:
continue
supported_features = entity_state.attributes["supported_features"]
supported_features = entity_state.attributes[ATTR_SUPPORTED_FEATURES]
# Add triggers for each entity that belongs to this integration
triggers += [
@@ -0,0 +1,31 @@
"""Describe group states."""
from homeassistant.components.group import GroupIntegrationRegistry
from homeassistant.const import (
STATE_ALARM_ARMED_AWAY,
STATE_ALARM_ARMED_CUSTOM_BYPASS,
STATE_ALARM_ARMED_HOME,
STATE_ALARM_ARMED_NIGHT,
STATE_ALARM_TRIGGERED,
STATE_OFF,
)
from homeassistant.core import callback
from homeassistant.helpers.typing import HomeAssistantType
@callback
def async_describe_on_off_states(
hass: HomeAssistantType, registry: GroupIntegrationRegistry
) -> None:
"""Describe group on off states."""
registry.on_off_states(
{
STATE_ALARM_ARMED_AWAY,
STATE_ALARM_ARMED_CUSTOM_BYPASS,
STATE_ALARM_ARMED_HOME,
STATE_ALARM_ARMED_NIGHT,
STATE_ALARM_TRIGGERED,
},
STATE_OFF,
)
@@ -1,4 +1,27 @@
{
"device_automation": {
"action_type": {
"arm_away": "Valvesta {entity_name}",
"arm_home": "Valvesta {entity_name} kodus re\u017eiimis",
"arm_night": "Valvesta {entity_name} \u00f6\u00f6re\u017eiimis",
"disarm": "V\u00f5ta {entity_name} valvest maha",
"trigger": "K\u00e4ivita {entity_name}"
},
"condition_type": {
"is_armed_away": "{entity_name} on valvestatud",
"is_armed_home": "{entity_name} on valvestatud kodure\u017eiimis",
"is_armed_night": "{entity_name} on valvestatud \u00f6\u00f6re\u017eiimis",
"is_disarmed": "{entity_name} on valve alt maas",
"is_triggered": "{entity_name} on h\u00e4iret andnud"
},
"trigger_type": {
"armed_away": "{entity_name} valvestatus",
"armed_home": "{entity_name} valvestatus kodure\u017eiimis",
"armed_night": "{entity_name} valvestatus \u00f6\u00f6re\u017eiimis",
"disarmed": "{entity_name} v\u00f5eti valvest maha",
"triggered": "{entity_name} andis h\u00e4iret"
}
},
"state": {
"_": {
"armed": "Valves",
@@ -25,7 +25,7 @@
"state": {
"_": {
"armed": "Ingeschakeld",
"armed_away": "Afwezig Ingeschakeld",
"armed_away": "Ingeschakeld afwezig",
"armed_custom_bypass": "Ingeschakeld met overbrugging(en)",
"armed_home": "Ingeschakeld thuis",
"armed_night": "Ingeschakeld nacht",
+100 -157
View File
@@ -1,167 +1,82 @@
"""Support for AlarmDecoder devices."""
import asyncio
from datetime import timedelta
import logging
from adext import AdExt
from alarmdecoder.devices import SerialDevice, SocketDevice, USBDevice
from alarmdecoder.devices import SerialDevice, SocketDevice
from alarmdecoder.util import NoDeviceError
import voluptuous as vol
from homeassistant.components.binary_sensor import DEVICE_CLASSES_SCHEMA
from homeassistant.const import CONF_HOST, EVENT_HOMEASSISTANT_STOP
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.discovery import load_platform
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
CONF_HOST,
CONF_PORT,
CONF_PROTOCOL,
EVENT_HOMEASSISTANT_STOP,
)
from homeassistant.helpers.typing import HomeAssistantType
from homeassistant.util import dt as dt_util
from .const import (
CONF_DEVICE_BAUD,
CONF_DEVICE_PATH,
DATA_AD,
DATA_REMOVE_STOP_LISTENER,
DATA_REMOVE_UPDATE_LISTENER,
DATA_RESTART,
DOMAIN,
PROTOCOL_SERIAL,
PROTOCOL_SOCKET,
SIGNAL_PANEL_MESSAGE,
SIGNAL_REL_MESSAGE,
SIGNAL_RFX_MESSAGE,
SIGNAL_ZONE_FAULT,
SIGNAL_ZONE_RESTORE,
)
_LOGGER = logging.getLogger(__name__)
DOMAIN = "alarmdecoder"
DATA_AD = "alarmdecoder"
CONF_DEVICE = "device"
CONF_DEVICE_BAUD = "baudrate"
CONF_DEVICE_PATH = "path"
CONF_DEVICE_PORT = "port"
CONF_DEVICE_TYPE = "type"
CONF_AUTO_BYPASS = "autobypass"
CONF_PANEL_DISPLAY = "panel_display"
CONF_ZONE_NAME = "name"
CONF_ZONE_TYPE = "type"
CONF_ZONE_LOOP = "loop"
CONF_ZONE_RFID = "rfid"
CONF_ZONES = "zones"
CONF_RELAY_ADDR = "relayaddr"
CONF_RELAY_CHAN = "relaychan"
CONF_CODE_ARM_REQUIRED = "code_arm_required"
DEFAULT_DEVICE_TYPE = "socket"
DEFAULT_DEVICE_HOST = "localhost"
DEFAULT_DEVICE_PORT = 10000
DEFAULT_DEVICE_PATH = "/dev/ttyUSB0"
DEFAULT_DEVICE_BAUD = 115200
DEFAULT_AUTO_BYPASS = False
DEFAULT_PANEL_DISPLAY = False
DEFAULT_CODE_ARM_REQUIRED = True
DEFAULT_ZONE_TYPE = "opening"
SIGNAL_PANEL_MESSAGE = "alarmdecoder.panel_message"
SIGNAL_PANEL_ARM_AWAY = "alarmdecoder.panel_arm_away"
SIGNAL_PANEL_ARM_HOME = "alarmdecoder.panel_arm_home"
SIGNAL_PANEL_DISARM = "alarmdecoder.panel_disarm"
SIGNAL_ZONE_FAULT = "alarmdecoder.zone_fault"
SIGNAL_ZONE_RESTORE = "alarmdecoder.zone_restore"
SIGNAL_RFX_MESSAGE = "alarmdecoder.rfx_message"
SIGNAL_REL_MESSAGE = "alarmdecoder.rel_message"
DEVICE_SOCKET_SCHEMA = vol.Schema(
{
vol.Required(CONF_DEVICE_TYPE): "socket",
vol.Optional(CONF_HOST, default=DEFAULT_DEVICE_HOST): cv.string,
vol.Optional(CONF_DEVICE_PORT, default=DEFAULT_DEVICE_PORT): cv.port,
}
)
DEVICE_SERIAL_SCHEMA = vol.Schema(
{
vol.Required(CONF_DEVICE_TYPE): "serial",
vol.Optional(CONF_DEVICE_PATH, default=DEFAULT_DEVICE_PATH): cv.string,
vol.Optional(CONF_DEVICE_BAUD, default=DEFAULT_DEVICE_BAUD): cv.string,
}
)
DEVICE_USB_SCHEMA = vol.Schema({vol.Required(CONF_DEVICE_TYPE): "usb"})
ZONE_SCHEMA = vol.Schema(
{
vol.Required(CONF_ZONE_NAME): cv.string,
vol.Optional(CONF_ZONE_TYPE, default=DEFAULT_ZONE_TYPE): vol.Any(
DEVICE_CLASSES_SCHEMA
),
vol.Optional(CONF_ZONE_RFID): cv.string,
vol.Optional(CONF_ZONE_LOOP): vol.All(vol.Coerce(int), vol.Range(min=1, max=4)),
vol.Inclusive(
CONF_RELAY_ADDR,
"relaylocation",
"Relay address and channel must exist together",
): cv.byte,
vol.Inclusive(
CONF_RELAY_CHAN,
"relaylocation",
"Relay address and channel must exist together",
): cv.byte,
}
)
CONFIG_SCHEMA = vol.Schema(
{
DOMAIN: vol.Schema(
{
vol.Required(CONF_DEVICE): vol.Any(
DEVICE_SOCKET_SCHEMA, DEVICE_SERIAL_SCHEMA, DEVICE_USB_SCHEMA
),
vol.Optional(
CONF_PANEL_DISPLAY, default=DEFAULT_PANEL_DISPLAY
): cv.boolean,
vol.Optional(CONF_AUTO_BYPASS, default=DEFAULT_AUTO_BYPASS): cv.boolean,
vol.Optional(
CONF_CODE_ARM_REQUIRED, default=DEFAULT_CODE_ARM_REQUIRED
): cv.boolean,
vol.Optional(CONF_ZONES): {vol.Coerce(int): ZONE_SCHEMA},
}
)
},
extra=vol.ALLOW_EXTRA,
)
PLATFORMS = ["alarm_control_panel", "sensor", "binary_sensor"]
def setup(hass, config):
async def async_setup(hass, config):
"""Set up for the AlarmDecoder devices."""
conf = config.get(DOMAIN)
return True
restart = False
device = conf[CONF_DEVICE]
display = conf[CONF_PANEL_DISPLAY]
auto_bypass = conf[CONF_AUTO_BYPASS]
code_arm_required = conf[CONF_CODE_ARM_REQUIRED]
zones = conf.get(CONF_ZONES)
device_type = device[CONF_DEVICE_TYPE]
host = DEFAULT_DEVICE_HOST
port = DEFAULT_DEVICE_PORT
path = DEFAULT_DEVICE_PATH
baud = DEFAULT_DEVICE_BAUD
async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry) -> bool:
"""Set up AlarmDecoder config flow."""
undo_listener = entry.add_update_listener(_update_listener)
ad_connection = entry.data
protocol = ad_connection[CONF_PROTOCOL]
def stop_alarmdecoder(event):
"""Handle the shutdown of AlarmDecoder."""
if not hass.data.get(DOMAIN):
return
_LOGGER.debug("Shutting down alarmdecoder")
nonlocal restart
restart = False
hass.data[DOMAIN][entry.entry_id][DATA_RESTART] = False
controller.close()
def open_connection(now=None):
async def open_connection(now=None):
"""Open a connection to AlarmDecoder."""
nonlocal restart
try:
controller.open(baud)
await hass.async_add_executor_job(controller.open, baud)
except NoDeviceError:
_LOGGER.debug("Failed to connect. Retrying in 5 seconds")
hass.helpers.event.track_point_in_time(
_LOGGER.debug("Failed to connect. Retrying in 5 seconds")
hass.helpers.event.async_track_point_in_time(
open_connection, dt_util.utcnow() + timedelta(seconds=5)
)
return
_LOGGER.debug("Established a connection with the alarmdecoder")
restart = True
hass.data[DOMAIN][entry.entry_id][DATA_RESTART] = True
def handle_closed_connection(event):
"""Restart after unexpected loss of connection."""
nonlocal restart
if not restart:
if not hass.data[DOMAIN][entry.entry_id][DATA_RESTART]:
return
restart = False
hass.data[DOMAIN][entry.entry_id][DATA_RESTART] = False
_LOGGER.warning("AlarmDecoder unexpectedly lost connection")
hass.add_job(open_connection)
@@ -185,18 +100,14 @@ def setup(hass, config):
"""Handle relay or zone expander message from AlarmDecoder."""
hass.helpers.dispatcher.dispatcher_send(SIGNAL_REL_MESSAGE, message)
controller = False
if device_type == "socket":
host = device[CONF_HOST]
port = device[CONF_DEVICE_PORT]
baud = ad_connection.get(CONF_DEVICE_BAUD)
if protocol == PROTOCOL_SOCKET:
host = ad_connection[CONF_HOST]
port = ad_connection[CONF_PORT]
controller = AdExt(SocketDevice(interface=(host, port)))
elif device_type == "serial":
path = device[CONF_DEVICE_PATH]
baud = device[CONF_DEVICE_BAUD]
if protocol == PROTOCOL_SERIAL:
path = ad_connection[CONF_DEVICE_PATH]
controller = AdExt(SerialDevice(interface=path))
elif device_type == "usb":
AdExt(USBDevice.find())
return False
controller.on_message += handle_message
controller.on_rfx_message += handle_rfx_message
@@ -205,24 +116,56 @@ def setup(hass, config):
controller.on_close += handle_closed_connection
controller.on_expander_message += handle_rel_message
hass.data[DATA_AD] = controller
open_connection()
hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, stop_alarmdecoder)
load_platform(
hass,
"alarm_control_panel",
DOMAIN,
{CONF_AUTO_BYPASS: auto_bypass, CONF_CODE_ARM_REQUIRED: code_arm_required},
config,
remove_stop_listener = hass.bus.async_listen_once(
EVENT_HOMEASSISTANT_STOP, stop_alarmdecoder
)
if zones:
load_platform(hass, "binary_sensor", DOMAIN, {CONF_ZONES: zones}, config)
hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN][entry.entry_id] = {
DATA_AD: controller,
DATA_REMOVE_UPDATE_LISTENER: undo_listener,
DATA_REMOVE_STOP_LISTENER: remove_stop_listener,
DATA_RESTART: False,
}
if display:
load_platform(hass, "sensor", DOMAIN, conf, config)
await open_connection()
for component in PLATFORMS:
hass.async_create_task(
hass.config_entries.async_forward_entry_setup(entry, component)
)
return True
async def async_unload_entry(hass: HomeAssistantType, entry: ConfigEntry):
"""Unload a AlarmDecoder entry."""
hass.data[DOMAIN][entry.entry_id][DATA_RESTART] = False
unload_ok = all(
await asyncio.gather(
*[
hass.config_entries.async_forward_entry_unload(entry, component)
for component in PLATFORMS
]
)
)
if not unload_ok:
return False
hass.data[DOMAIN][entry.entry_id][DATA_REMOVE_UPDATE_LISTENER]()
hass.data[DOMAIN][entry.entry_id][DATA_REMOVE_STOP_LISTENER]()
await hass.async_add_executor_job(hass.data[DOMAIN][entry.entry_id][DATA_AD].close)
if hass.data[DOMAIN][entry.entry_id]:
hass.data[DOMAIN].pop(entry.entry_id)
if not hass.data[DOMAIN]:
hass.data.pop(DOMAIN)
return True
async def _update_listener(hass: HomeAssistantType, entry: ConfigEntry):
"""Handle options update."""
_LOGGER.debug("AlarmDecoder options updated: %s", entry.as_dict()["options"])
await hass.config_entries.async_reload(entry.entry_id)
@@ -12,6 +12,7 @@ from homeassistant.components.alarm_control_panel.const import (
SUPPORT_ALARM_ARM_HOME,
SUPPORT_ALARM_ARM_NIGHT,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
ATTR_CODE,
STATE_ALARM_ARMED_AWAY,
@@ -20,66 +21,70 @@ from homeassistant.const import (
STATE_ALARM_DISARMED,
STATE_ALARM_TRIGGERED,
)
from homeassistant.helpers import entity_platform
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.typing import HomeAssistantType
from . import (
from .const import (
CONF_ALT_NIGHT_MODE,
CONF_AUTO_BYPASS,
CONF_CODE_ARM_REQUIRED,
DATA_AD,
DEFAULT_ARM_OPTIONS,
DOMAIN,
OPTIONS_ARM,
SIGNAL_PANEL_MESSAGE,
)
_LOGGER = logging.getLogger(__name__)
SERVICE_ALARM_TOGGLE_CHIME = "alarm_toggle_chime"
ALARM_TOGGLE_CHIME_SCHEMA = vol.Schema({vol.Required(ATTR_CODE): cv.string})
SERVICE_ALARM_KEYPRESS = "alarm_keypress"
ATTR_KEYPRESS = "keypress"
ALARM_KEYPRESS_SCHEMA = vol.Schema({vol.Required(ATTR_KEYPRESS): cv.string})
def setup_platform(hass, config, add_entities, discovery_info=None):
async def async_setup_entry(
hass: HomeAssistantType, entry: ConfigEntry, async_add_entities
):
"""Set up for AlarmDecoder alarm panels."""
if discovery_info is None:
return
options = entry.options
arm_options = options.get(OPTIONS_ARM, DEFAULT_ARM_OPTIONS)
client = hass.data[DOMAIN][entry.entry_id][DATA_AD]
auto_bypass = discovery_info[CONF_AUTO_BYPASS]
code_arm_required = discovery_info[CONF_CODE_ARM_REQUIRED]
entity = AlarmDecoderAlarmPanel(auto_bypass, code_arm_required)
add_entities([entity])
entity = AlarmDecoderAlarmPanel(
client=client,
auto_bypass=arm_options[CONF_AUTO_BYPASS],
code_arm_required=arm_options[CONF_CODE_ARM_REQUIRED],
alt_night_mode=arm_options[CONF_ALT_NIGHT_MODE],
)
async_add_entities([entity])
def alarm_toggle_chime_handler(service):
"""Register toggle chime handler."""
code = service.data.get(ATTR_CODE)
entity.alarm_toggle_chime(code)
platform = entity_platform.current_platform.get()
hass.services.register(
DOMAIN,
platform.async_register_entity_service(
SERVICE_ALARM_TOGGLE_CHIME,
alarm_toggle_chime_handler,
schema=ALARM_TOGGLE_CHIME_SCHEMA,
{
vol.Required(ATTR_CODE): cv.string,
},
"alarm_toggle_chime",
)
def alarm_keypress_handler(service):
"""Register keypress handler."""
keypress = service.data[ATTR_KEYPRESS]
entity.alarm_keypress(keypress)
hass.services.register(
DOMAIN,
platform.async_register_entity_service(
SERVICE_ALARM_KEYPRESS,
alarm_keypress_handler,
schema=ALARM_KEYPRESS_SCHEMA,
{
vol.Required(ATTR_KEYPRESS): cv.string,
},
"alarm_keypress",
)
class AlarmDecoderAlarmPanel(AlarmControlPanelEntity):
"""Representation of an AlarmDecoder-based alarm panel."""
def __init__(self, auto_bypass, code_arm_required):
def __init__(self, client, auto_bypass, code_arm_required, alt_night_mode):
"""Initialize the alarm panel."""
self._client = client
self._display = ""
self._name = "Alarm Panel"
self._state = None
@@ -95,6 +100,7 @@ class AlarmDecoderAlarmPanel(AlarmControlPanelEntity):
self._zone_bypassed = None
self._auto_bypass = auto_bypass
self._code_arm_required = code_arm_required
self._alt_night_mode = alt_night_mode
async def async_added_to_hass(self):
"""Register callbacks."""
@@ -180,11 +186,11 @@ class AlarmDecoderAlarmPanel(AlarmControlPanelEntity):
def alarm_disarm(self, code=None):
"""Send disarm command."""
if code:
self.hass.data[DATA_AD].send(f"{code!s}1")
self._client.send(f"{code!s}1")
def alarm_arm_away(self, code=None):
"""Send arm away command."""
self.hass.data[DATA_AD].arm_away(
self._client.arm_away(
code=code,
code_arm_required=self._code_arm_required,
auto_bypass=self._auto_bypass,
@@ -192,7 +198,7 @@ class AlarmDecoderAlarmPanel(AlarmControlPanelEntity):
def alarm_arm_home(self, code=None):
"""Send arm home command."""
self.hass.data[DATA_AD].arm_home(
self._client.arm_home(
code=code,
code_arm_required=self._code_arm_required,
auto_bypass=self._auto_bypass,
@@ -200,18 +206,19 @@ class AlarmDecoderAlarmPanel(AlarmControlPanelEntity):
def alarm_arm_night(self, code=None):
"""Send arm night command."""
self.hass.data[DATA_AD].arm_night(
self._client.arm_night(
code=code,
code_arm_required=self._code_arm_required,
alt_night_mode=self._alt_night_mode,
auto_bypass=self._auto_bypass,
)
def alarm_toggle_chime(self, code=None):
"""Send toggle chime command."""
if code:
self.hass.data[DATA_AD].send(f"{code!s}9")
self._client.send(f"{code!s}9")
def alarm_keypress(self, keypress):
"""Send custom keypresses."""
if keypress:
self.hass.data[DATA_AD].send(keypress)
self._client.send(keypress)
@@ -2,20 +2,23 @@
import logging
from homeassistant.components.binary_sensor import BinarySensorEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.helpers.typing import HomeAssistantType
from . import (
from .const import (
CONF_RELAY_ADDR,
CONF_RELAY_CHAN,
CONF_ZONE_LOOP,
CONF_ZONE_NAME,
CONF_ZONE_NUMBER,
CONF_ZONE_RFID,
CONF_ZONE_TYPE,
CONF_ZONES,
DEFAULT_ZONE_OPTIONS,
OPTIONS_ZONES,
SIGNAL_REL_MESSAGE,
SIGNAL_RFX_MESSAGE,
SIGNAL_ZONE_FAULT,
SIGNAL_ZONE_RESTORE,
ZONE_SCHEMA,
)
_LOGGER = logging.getLogger(__name__)
@@ -30,27 +33,28 @@ ATTR_RF_LOOP4 = "rf_loop4"
ATTR_RF_LOOP1 = "rf_loop1"
def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up the AlarmDecoder binary sensor devices."""
configured_zones = discovery_info[CONF_ZONES]
async def async_setup_entry(
hass: HomeAssistantType, entry: ConfigEntry, async_add_entities
):
"""Set up for AlarmDecoder sensor."""
devices = []
for zone_num in configured_zones:
device_config_data = ZONE_SCHEMA(configured_zones[zone_num])
zone_type = device_config_data[CONF_ZONE_TYPE]
zone_name = device_config_data[CONF_ZONE_NAME]
zone_rfid = device_config_data.get(CONF_ZONE_RFID)
zone_loop = device_config_data.get(CONF_ZONE_LOOP)
relay_addr = device_config_data.get(CONF_RELAY_ADDR)
relay_chan = device_config_data.get(CONF_RELAY_CHAN)
device = AlarmDecoderBinarySensor(
zones = entry.options.get(OPTIONS_ZONES, DEFAULT_ZONE_OPTIONS)
entities = []
for zone_num in zones:
zone_info = zones[zone_num]
zone_type = zone_info[CONF_ZONE_TYPE]
zone_name = zone_info[CONF_ZONE_NAME]
zone_rfid = zone_info.get(CONF_ZONE_RFID)
zone_loop = zone_info.get(CONF_ZONE_LOOP)
relay_addr = zone_info.get(CONF_RELAY_ADDR)
relay_chan = zone_info.get(CONF_RELAY_CHAN)
entity = AlarmDecoderBinarySensor(
zone_num, zone_name, zone_type, zone_rfid, zone_loop, relay_addr, relay_chan
)
devices.append(device)
entities.append(entity)
add_entities(devices)
return True
async_add_entities(entities)
class AlarmDecoderBinarySensor(BinarySensorEntity):
@@ -67,7 +71,7 @@ class AlarmDecoderBinarySensor(BinarySensorEntity):
relay_chan,
):
"""Initialize the binary_sensor."""
self._zone_number = zone_number
self._zone_number = int(zone_number)
self._zone_type = zone_type
self._state = None
self._name = zone_name
@@ -117,6 +121,7 @@ class AlarmDecoderBinarySensor(BinarySensorEntity):
def device_state_attributes(self):
"""Return the state attributes."""
attr = {}
attr[CONF_ZONE_NUMBER] = self._zone_number
if self._rfid and self._rfstate is not None:
attr[ATTR_RF_BIT0] = bool(self._rfstate & 0x01)
attr[ATTR_RF_LOW_BAT] = bool(self._rfstate & 0x02)
@@ -0,0 +1,360 @@
"""Config flow for AlarmDecoder."""
import logging
from adext import AdExt
from alarmdecoder.devices import SerialDevice, SocketDevice
from alarmdecoder.util import NoDeviceError
import voluptuous as vol
from homeassistant import config_entries
from homeassistant.components.binary_sensor import DEVICE_CLASSES
from homeassistant.const import CONF_HOST, CONF_PORT, CONF_PROTOCOL
from homeassistant.core import callback
from .const import ( # pylint: disable=unused-import
CONF_ALT_NIGHT_MODE,
CONF_AUTO_BYPASS,
CONF_CODE_ARM_REQUIRED,
CONF_DEVICE_BAUD,
CONF_DEVICE_PATH,
CONF_RELAY_ADDR,
CONF_RELAY_CHAN,
CONF_ZONE_LOOP,
CONF_ZONE_NAME,
CONF_ZONE_NUMBER,
CONF_ZONE_RFID,
CONF_ZONE_TYPE,
DEFAULT_ARM_OPTIONS,
DEFAULT_DEVICE_BAUD,
DEFAULT_DEVICE_HOST,
DEFAULT_DEVICE_PATH,
DEFAULT_DEVICE_PORT,
DEFAULT_ZONE_OPTIONS,
DEFAULT_ZONE_TYPE,
DOMAIN,
OPTIONS_ARM,
OPTIONS_ZONES,
PROTOCOL_SERIAL,
PROTOCOL_SOCKET,
)
EDIT_KEY = "edit_selection"
EDIT_ZONES = "Zones"
EDIT_SETTINGS = "Arming Settings"
_LOGGER = logging.getLogger(__name__)
class AlarmDecoderFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
"""Handle a AlarmDecoder config flow."""
VERSION = 1
CONNECTION_CLASS = config_entries.CONN_CLASS_LOCAL_PUSH
def __init__(self):
"""Initialize AlarmDecoder ConfigFlow."""
self.protocol = None
@staticmethod
@callback
def async_get_options_flow(config_entry):
"""Get the options flow for AlarmDecoder."""
return AlarmDecoderOptionsFlowHandler(config_entry)
async def async_step_user(self, user_input=None):
"""Handle a flow initialized by the user."""
if user_input is not None:
self.protocol = user_input[CONF_PROTOCOL]
return await self.async_step_protocol()
return self.async_show_form(
step_id="user",
data_schema=vol.Schema(
{
vol.Required(CONF_PROTOCOL): vol.In(
[PROTOCOL_SOCKET, PROTOCOL_SERIAL]
),
}
),
)
async def async_step_protocol(self, user_input=None):
"""Handle AlarmDecoder protocol setup."""
errors = {}
if user_input is not None:
if _device_already_added(
self._async_current_entries(), user_input, self.protocol
):
return self.async_abort(reason="already_configured")
connection = {}
baud = None
if self.protocol == PROTOCOL_SOCKET:
host = connection[CONF_HOST] = user_input[CONF_HOST]
port = connection[CONF_PORT] = user_input[CONF_PORT]
title = f"{host}:{port}"
device = SocketDevice(interface=(host, port))
if self.protocol == PROTOCOL_SERIAL:
path = connection[CONF_DEVICE_PATH] = user_input[CONF_DEVICE_PATH]
baud = connection[CONF_DEVICE_BAUD] = user_input[CONF_DEVICE_BAUD]
title = path
device = SerialDevice(interface=path)
controller = AdExt(device)
def test_connection():
controller.open(baud)
controller.close()
try:
await self.hass.async_add_executor_job(test_connection)
return self.async_create_entry(
title=title, data={CONF_PROTOCOL: self.protocol, **connection}
)
except NoDeviceError:
errors["base"] = "service_unavailable"
except Exception: # pylint: disable=broad-except
_LOGGER.exception("Unexpected exception during AlarmDecoder setup")
errors["base"] = "unknown"
if self.protocol == PROTOCOL_SOCKET:
schema = vol.Schema(
{
vol.Required(CONF_HOST, default=DEFAULT_DEVICE_HOST): str,
vol.Required(CONF_PORT, default=DEFAULT_DEVICE_PORT): int,
}
)
if self.protocol == PROTOCOL_SERIAL:
schema = vol.Schema(
{
vol.Required(CONF_DEVICE_PATH, default=DEFAULT_DEVICE_PATH): str,
vol.Required(CONF_DEVICE_BAUD, default=DEFAULT_DEVICE_BAUD): int,
}
)
return self.async_show_form(
step_id="protocol",
data_schema=schema,
errors=errors,
)
class AlarmDecoderOptionsFlowHandler(config_entries.OptionsFlow):
"""Handle AlarmDecoder options."""
def __init__(self, config_entry: config_entries.ConfigEntry):
"""Initialize AlarmDecoder options flow."""
self.arm_options = config_entry.options.get(OPTIONS_ARM, DEFAULT_ARM_OPTIONS)
self.zone_options = config_entry.options.get(
OPTIONS_ZONES, DEFAULT_ZONE_OPTIONS
)
self.selected_zone = None
async def async_step_init(self, user_input=None):
"""Manage the options."""
if user_input is not None:
if user_input[EDIT_KEY] == EDIT_SETTINGS:
return await self.async_step_arm_settings()
if user_input[EDIT_KEY] == EDIT_ZONES:
return await self.async_step_zone_select()
return self.async_show_form(
step_id="init",
data_schema=vol.Schema(
{
vol.Required(EDIT_KEY, default=EDIT_SETTINGS): vol.In(
[EDIT_SETTINGS, EDIT_ZONES]
)
},
),
)
async def async_step_arm_settings(self, user_input=None):
"""Arming options form."""
if user_input is not None:
return self.async_create_entry(
title="",
data={OPTIONS_ARM: user_input, OPTIONS_ZONES: self.zone_options},
)
return self.async_show_form(
step_id="arm_settings",
data_schema=vol.Schema(
{
vol.Optional(
CONF_ALT_NIGHT_MODE,
default=self.arm_options[CONF_ALT_NIGHT_MODE],
): bool,
vol.Optional(
CONF_AUTO_BYPASS, default=self.arm_options[CONF_AUTO_BYPASS]
): bool,
vol.Optional(
CONF_CODE_ARM_REQUIRED,
default=self.arm_options[CONF_CODE_ARM_REQUIRED],
): bool,
},
),
)
async def async_step_zone_select(self, user_input=None):
"""Zone selection form."""
errors = _validate_zone_input(user_input)
if user_input is not None and not errors:
self.selected_zone = str(
int(user_input[CONF_ZONE_NUMBER])
) # remove leading zeros
return await self.async_step_zone_details()
return self.async_show_form(
step_id="zone_select",
data_schema=vol.Schema({vol.Required(CONF_ZONE_NUMBER): str}),
errors=errors,
)
async def async_step_zone_details(self, user_input=None):
"""Zone details form."""
errors = _validate_zone_input(user_input)
if user_input is not None and not errors:
zone_options = self.zone_options.copy()
zone_id = self.selected_zone
zone_options[zone_id] = _fix_input_types(user_input)
# Delete zone entry if zone_name is omitted
if CONF_ZONE_NAME not in zone_options[zone_id]:
zone_options.pop(zone_id)
return self.async_create_entry(
title="",
data={OPTIONS_ARM: self.arm_options, OPTIONS_ZONES: zone_options},
)
existing_zone_settings = self.zone_options.get(self.selected_zone, {})
return self.async_show_form(
step_id="zone_details",
description_placeholders={CONF_ZONE_NUMBER: self.selected_zone},
data_schema=vol.Schema(
{
vol.Optional(
CONF_ZONE_NAME,
description={
"suggested_value": existing_zone_settings.get(
CONF_ZONE_NAME
)
},
): str,
vol.Optional(
CONF_ZONE_TYPE,
default=existing_zone_settings.get(
CONF_ZONE_TYPE, DEFAULT_ZONE_TYPE
),
): vol.In(DEVICE_CLASSES),
vol.Optional(
CONF_ZONE_RFID,
description={
"suggested_value": existing_zone_settings.get(
CONF_ZONE_RFID
)
},
): str,
vol.Optional(
CONF_ZONE_LOOP,
description={
"suggested_value": existing_zone_settings.get(
CONF_ZONE_LOOP
)
},
): str,
vol.Optional(
CONF_RELAY_ADDR,
description={
"suggested_value": existing_zone_settings.get(
CONF_RELAY_ADDR
)
},
): str,
vol.Optional(
CONF_RELAY_CHAN,
description={
"suggested_value": existing_zone_settings.get(
CONF_RELAY_CHAN
)
},
): str,
}
),
errors=errors,
)
def _validate_zone_input(zone_input):
if not zone_input:
return {}
errors = {}
# CONF_RELAY_ADDR & CONF_RELAY_CHAN are inclusive
if (CONF_RELAY_ADDR in zone_input and CONF_RELAY_CHAN not in zone_input) or (
CONF_RELAY_ADDR not in zone_input and CONF_RELAY_CHAN in zone_input
):
errors["base"] = "relay_inclusive"
# The following keys must be int
for key in [CONF_ZONE_NUMBER, CONF_ZONE_LOOP, CONF_RELAY_ADDR, CONF_RELAY_CHAN]:
if key in zone_input:
try:
int(zone_input[key])
except ValueError:
errors[key] = "int"
# CONF_ZONE_LOOP depends on CONF_ZONE_RFID
if CONF_ZONE_LOOP in zone_input and CONF_ZONE_RFID not in zone_input:
errors[CONF_ZONE_LOOP] = "loop_rfid"
# CONF_ZONE_LOOP must be 1-4
if (
CONF_ZONE_LOOP in zone_input
and zone_input[CONF_ZONE_LOOP].isdigit()
and int(zone_input[CONF_ZONE_LOOP]) not in list(range(1, 5))
):
errors[CONF_ZONE_LOOP] = "loop_range"
return errors
def _fix_input_types(zone_input):
"""Convert necessary keys to int.
Since ConfigFlow inputs of type int cannot default to an empty string, we collect the values below as
strings and then convert them to ints.
"""
for key in [CONF_ZONE_LOOP, CONF_RELAY_ADDR, CONF_RELAY_CHAN]:
if key in zone_input:
zone_input[key] = int(zone_input[key])
return zone_input
def _device_already_added(current_entries, user_input, protocol):
"""Determine if entry has already been added to HA."""
user_host = user_input.get(CONF_HOST)
user_port = user_input.get(CONF_PORT)
user_path = user_input.get(CONF_DEVICE_PATH)
user_baud = user_input.get(CONF_DEVICE_BAUD)
for entry in current_entries:
entry_host = entry.data.get(CONF_HOST)
entry_port = entry.data.get(CONF_PORT)
entry_path = entry.data.get(CONF_DEVICE_PATH)
entry_baud = entry.data.get(CONF_DEVICE_BAUD)
if protocol == PROTOCOL_SOCKET:
if user_host == entry_host and user_port == entry_port:
return True
if protocol == PROTOCOL_SERIAL:
if user_baud == entry_baud and user_path == entry_path:
return True
return False
@@ -0,0 +1,49 @@
"""Constants for the AlarmDecoder component."""
CONF_ALT_NIGHT_MODE = "alt_night_mode"
CONF_AUTO_BYPASS = "auto_bypass"
CONF_CODE_ARM_REQUIRED = "code_arm_required"
CONF_DEVICE_BAUD = "device_baudrate"
CONF_DEVICE_PATH = "device_path"
CONF_RELAY_ADDR = "zone_relayaddr"
CONF_RELAY_CHAN = "zone_relaychan"
CONF_ZONE_LOOP = "zone_loop"
CONF_ZONE_NAME = "zone_name"
CONF_ZONE_NUMBER = "zone_number"
CONF_ZONE_RFID = "zone_rfid"
CONF_ZONE_TYPE = "zone_type"
DATA_AD = "alarmdecoder"
DATA_REMOVE_STOP_LISTENER = "rm_stop_listener"
DATA_REMOVE_UPDATE_LISTENER = "rm_update_listener"
DATA_RESTART = "restart"
DEFAULT_ALT_NIGHT_MODE = False
DEFAULT_AUTO_BYPASS = False
DEFAULT_CODE_ARM_REQUIRED = True
DEFAULT_DEVICE_BAUD = 115200
DEFAULT_DEVICE_HOST = "alarmdecoder"
DEFAULT_DEVICE_PATH = "/dev/ttyUSB0"
DEFAULT_DEVICE_PORT = 10000
DEFAULT_ZONE_TYPE = "window"
DEFAULT_ARM_OPTIONS = {
CONF_ALT_NIGHT_MODE: DEFAULT_ALT_NIGHT_MODE,
CONF_AUTO_BYPASS: DEFAULT_AUTO_BYPASS,
CONF_CODE_ARM_REQUIRED: DEFAULT_CODE_ARM_REQUIRED,
}
DEFAULT_ZONE_OPTIONS = {}
DOMAIN = "alarmdecoder"
OPTIONS_ARM = "arm_options"
OPTIONS_ZONES = "zone_options"
PROTOCOL_SERIAL = "serial"
PROTOCOL_SOCKET = "socket"
SIGNAL_PANEL_MESSAGE = "alarmdecoder.panel_message"
SIGNAL_REL_MESSAGE = "alarmdecoder.rel_message"
SIGNAL_RFX_MESSAGE = "alarmdecoder.rfx_message"
SIGNAL_ZONE_FAULT = "alarmdecoder.zone_fault"
SIGNAL_ZONE_RESTORE = "alarmdecoder.zone_restore"
@@ -3,5 +3,6 @@
"name": "AlarmDecoder",
"documentation": "https://www.home-assistant.io/integrations/alarmdecoder",
"requirements": ["adext==0.3"],
"codeowners": ["@ajschmidt8"]
"codeowners": ["@ajschmidt8"],
"config_flow": true
}
@@ -1,26 +1,29 @@
"""Support for AlarmDecoder sensors (Shows Panel Display)."""
import logging
from homeassistant.config_entries import ConfigEntry
from homeassistant.helpers.entity import Entity
from homeassistant.helpers.typing import HomeAssistantType
from . import SIGNAL_PANEL_MESSAGE
from .const import SIGNAL_PANEL_MESSAGE
_LOGGER = logging.getLogger(__name__)
def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up for AlarmDecoder sensor devices."""
_LOGGER.debug("AlarmDecoderSensor: setup_platform")
async def async_setup_entry(
hass: HomeAssistantType, entry: ConfigEntry, async_add_entities
):
"""Set up for AlarmDecoder sensor."""
device = AlarmDecoderSensor(hass)
add_entities([device])
entity = AlarmDecoderSensor()
async_add_entities([entity])
return True
class AlarmDecoderSensor(Entity):
"""Representation of an AlarmDecoder keypad."""
def __init__(self, hass):
def __init__(self):
"""Initialize the alarm panel."""
self._display = ""
self._state = None
@@ -1,6 +1,9 @@
alarm_keypress:
description: Send custom keypresses to the alarm.
fields:
entity_id:
description: Name of alarm control panel to deliver keypress.
example: "alarm_control_panel.main"
keypress:
description: "String to send to the alarm panel."
example: "*71"
@@ -8,6 +11,9 @@ alarm_keypress:
alarm_toggle_chime:
description: Send the alarm the toggle chime command.
fields:
entity_id:
description: Name of alarm control panel to toggle chime.
example: "alarm_control_panel.main"
code:
description: A required code to toggle the alarm control panel chime with.
example: 1234
@@ -0,0 +1,72 @@
{
"config": {
"step": {
"user": {
"title": "Choose AlarmDecoder Protocol",
"data": {
"protocol": "Protocol"
}
},
"protocol": {
"title": "Configure connection settings",
"data": {
"host": "[%key:common::config_flow::data::host%]",
"port": "[%key:common::config_flow::data::port%]",
"device_baudrate": "Device Baud Rate",
"device_path": "Device Path"
}
}
},
"error": {
"service_unavailable": "[%key:common::config_flow::error::cannot_connect%]"
},
"create_entry": { "default": "Successfully connected to AlarmDecoder." },
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
}
},
"options": {
"step": {
"init": {
"title": "Configure AlarmDecoder",
"description": "What would you like to edit?",
"data": {
"edit_select": "Edit"
}
},
"arm_settings": {
"title": "Configure AlarmDecoder",
"data": {
"auto_bypass": "Auto Bypass on Arm",
"code_arm_required": "Code Required for Arming",
"alt_night_mode": "Alternative Night Mode"
}
},
"zone_select": {
"title": "Configure AlarmDecoder",
"description": "Enter the zone number you'd like to to add, edit, or remove.",
"data": {
"zone_number": "Zone Number"
}
},
"zone_details": {
"title": "Configure AlarmDecoder",
"description": "Enter details for zone {zone_number}. To delete zone {zone_number}, leave Zone Name blank.",
"data": {
"zone_name": "Zone Name",
"zone_type": "Zone Type",
"zone_rfid": "RF Serial",
"zone_loop": "RF Loop",
"zone_relayaddr": "Relay Address",
"zone_relaychan": "Relay Channel"
}
}
},
"error": {
"relay_inclusive": "Relay Address and Relay Channel are codependent and must be included together.",
"int": "The field below must be an integer.",
"loop_rfid": "RF Loop cannot be used without RF Serial.",
"loop_range": "RF Loop must be an integer between 1 and 4."
}
}
}
@@ -0,0 +1,74 @@
{
"config": {
"abort": {
"already_configured": "El dispositiu ja est\u00e0 configurat"
},
"create_entry": {
"default": "S'ha connectat correctament amb AlarmDecoder."
},
"error": {
"service_unavailable": "Ha fallat la connexi\u00f3"
},
"step": {
"protocol": {
"data": {
"device_baudrate": "Velocitat, en baudis, del dispositiu",
"device_path": "Ruta del dispositiu",
"host": "Amfitri\u00f3",
"port": "Port"
},
"title": "Configuraci\u00f3 dels par\u00e0metres de connexi\u00f3"
},
"user": {
"data": {
"protocol": "Protocol"
},
"title": "Selecciona el protocol d'AlarmDecoder"
}
}
},
"options": {
"error": {
"int": "El camp seg\u00fcent ha de ser un nombre enter.",
"loop_range": "El bucle RF ha de ser un nombre enter entre 1 i 4.",
"loop_rfid": "El bucle RF no es pot utilitzar sense RF s\u00e8rie.",
"relay_inclusive": "L'adre\u00e7a i el canal de rel\u00e9 s\u00f3n codependents i s'han d'incloure junts."
},
"step": {
"arm_settings": {
"data": {
"alt_night_mode": "Mode nocturn alternatiu",
"auto_bypass": "Bypass autom\u00e0tic en l'activaci\u00f3",
"code_arm_required": "Codi necessari per a l'activaci\u00f3"
},
"title": "Configuraci\u00f3 d'AlarmDecoder"
},
"init": {
"data": {
"edit_select": "Edita"
},
"description": "Qu\u00e8 voldries editar?",
"title": "Configuraci\u00f3 d'AlarmDecoder"
},
"zone_details": {
"data": {
"zone_loop": "Bucle RF",
"zone_name": "Nom de la zona",
"zone_relayaddr": "Adre\u00e7a del rel\u00e9",
"zone_relaychan": "Canal del rel\u00e9",
"zone_rfid": "RF s\u00e8rie",
"zone_type": "Tipus de zona"
},
"description": "Introdueix els detalls de la zona {zone_number}. Per suprimir la zona {zone_number}, deixa el nom de la zona en blanc.",
"title": "Configuraci\u00f3 d'AlarmDecoder"
},
"zone_select": {
"data": {
"zone_number": "N\u00famero de zona"
},
"description": "Introdueix el n\u00famero de zona que vulguis afegir, editar o eliminar.",
"title": "Configuraci\u00f3 d'AlarmDecoder"
}
}
}
}
@@ -0,0 +1,35 @@
{
"options": {
"step": {
"arm_settings": {
"title": "Konfigurovat AlarmDecoder"
},
"init": {
"data": {
"edit_select": "Upravit"
},
"description": "Co chcete upravit?",
"title": "Konfigurovat AlarmDecoder"
},
"zone_details": {
"data": {
"zone_loop": "RF Loop",
"zone_name": "N\u00e1zev z\u00f3ny",
"zone_relayaddr": "Relay adresa",
"zone_relaychan": "Relay kan\u00e1l",
"zone_rfid": "RF Serial",
"zone_type": "Typ z\u00f3ny"
},
"description": "Zadejte podrobnosti pro z\u00f3nu {zone_number}. Chcete-li odstranit z\u00f3nu {zone_number}, ponechejte n\u00e1zev z\u00f3ny pr\u00e1zdn\u00fd.",
"title": "Konfigurovat AlarmDecoder"
},
"zone_select": {
"data": {
"zone_number": "\u010c\u00edslo z\u00f3ny"
},
"description": "Zadejte \u010d\u00edslo z\u00f3ny, kterou chcete p\u0159idat, upravit nebo odstranit.",
"title": "Konfigurovat AlarmDecoder"
}
}
}
}
@@ -0,0 +1,48 @@
{
"config": {
"error": {
"service_unavailable": "Verbindung konnte nicht hergestellt werden"
},
"step": {
"protocol": {
"data": {
"host": "Host",
"port": "Port"
}
},
"user": {
"data": {
"protocol": "Protokoll"
}
}
}
},
"options": {
"step": {
"arm_settings": {
"data": {
"alt_night_mode": "Alternativer Nachtmodus"
}
},
"init": {
"data": {
"edit_select": "Bearbeiten"
},
"description": "Was m\u00f6chtest du bearbeiten?"
},
"zone_details": {
"data": {
"zone_name": "Zonenname",
"zone_relayaddr": "Relais-Adresse",
"zone_type": "Zonentyp"
}
},
"zone_select": {
"data": {
"zone_number": "Zonennummer"
},
"description": "Geben Sie die Zonennummer ein, die Sie hinzuf\u00fcgen, bearbeiten oder entfernen m\u00f6chten."
}
}
}
}
@@ -0,0 +1,34 @@
{
"config": {
"create_entry": {
"default": "\u0395\u03c0\u03b9\u03c4\u03c5\u03c7\u03ae\u03c2 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03c3\u03c4\u03bf AlarmDecoder."
},
"error": {
"service_unavailable": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u03c2"
},
"step": {
"protocol": {
"data": {
"device_baudrate": "\u03a1\u03c5\u03b8\u03bc\u03cc\u03c2 Baud \u03c3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae\u03c2",
"device_path": "\u0394\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae \u03c3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae\u03c2"
}
}
}
},
"options": {
"step": {
"zone_details": {
"data": {
"zone_type": "\u03a4\u03cd\u03c0\u03bf\u03c2 \u03b6\u03ce\u03bd\u03b7\u03c2"
},
"title": "\u0394\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 AlarmDecoder"
},
"zone_select": {
"data": {
"zone_number": "\u0391\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03b6\u03ce\u03bd\u03b7\u03c2"
},
"title": "\u0394\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7 AlarmDecoder"
}
}
}
}
@@ -0,0 +1,74 @@
{
"config": {
"abort": {
"already_configured": "Device is already configured"
},
"create_entry": {
"default": "Successfully connected to AlarmDecoder."
},
"error": {
"service_unavailable": "Failed to connect"
},
"step": {
"protocol": {
"data": {
"device_baudrate": "Device Baud Rate",
"device_path": "Device Path",
"host": "Host",
"port": "Port"
},
"title": "Configure connection settings"
},
"user": {
"data": {
"protocol": "Protocol"
},
"title": "Choose AlarmDecoder Protocol"
}
}
},
"options": {
"error": {
"int": "The field below must be an integer.",
"loop_range": "RF Loop must be an integer between 1 and 4.",
"loop_rfid": "RF Loop cannot be used without RF Serial.",
"relay_inclusive": "Relay Address and Relay Channel are codependent and must be included together."
},
"step": {
"arm_settings": {
"data": {
"alt_night_mode": "Alternative Night Mode",
"auto_bypass": "Auto Bypass on Arm",
"code_arm_required": "Code Required for Arming"
},
"title": "Configure AlarmDecoder"
},
"init": {
"data": {
"edit_select": "Edit"
},
"description": "What would you like to edit?",
"title": "Configure AlarmDecoder"
},
"zone_details": {
"data": {
"zone_loop": "RF Loop",
"zone_name": "Zone Name",
"zone_relayaddr": "Relay Address",
"zone_relaychan": "Relay Channel",
"zone_rfid": "RF Serial",
"zone_type": "Zone Type"
},
"description": "Enter details for zone {zone_number}. To delete zone {zone_number}, leave Zone Name blank.",
"title": "Configure AlarmDecoder"
},
"zone_select": {
"data": {
"zone_number": "Zone Number"
},
"description": "Enter the zone number you'd like to to add, edit, or remove.",
"title": "Configure AlarmDecoder"
}
}
}
}
@@ -0,0 +1,74 @@
{
"config": {
"abort": {
"already_configured": "El dispositivo AlarmDecoder ya est\u00e1 configurado."
},
"create_entry": {
"default": "Conectado con \u00e9xito a AlarmDecoder."
},
"error": {
"service_unavailable": "No se pudo conectar"
},
"step": {
"protocol": {
"data": {
"device_baudrate": "Velocidad en baudios del dispositivo",
"device_path": "Ruta del dispositivo",
"host": "Host",
"port": "Puerto"
},
"title": "Configurar los ajustes de conexi\u00f3n"
},
"user": {
"data": {
"protocol": "Protocolo"
},
"title": "Elige el protocolo del AlarmDecoder"
}
}
},
"options": {
"error": {
"int": "El campo siguiente debe ser un n\u00famero entero.",
"loop_range": "El bucle RF debe ser un n\u00famero entero entre 1 y 4.",
"loop_rfid": "El bucle de RF no puede utilizarse sin el serie RF.",
"relay_inclusive": "La direcci\u00f3n de retransmisi\u00f3n y el canal de retransmisi\u00f3n son codependientes y deben incluirse a la vez."
},
"step": {
"arm_settings": {
"data": {
"alt_night_mode": "Modo noche alternativo",
"auto_bypass": "Desv\u00edo autom\u00e1tico al armar",
"code_arm_required": "C\u00f3digo requerido para el armado"
},
"title": "Configurar AlarmDecoder"
},
"init": {
"data": {
"edit_select": "Editar"
},
"description": "\u00bfQu\u00e9 te gustar\u00eda editar?",
"title": "Configurar AlarmDecoder"
},
"zone_details": {
"data": {
"zone_loop": "Bucle RF",
"zone_name": "Nombre de zona",
"zone_relayaddr": "Direcci\u00f3n de retransmisi\u00f3n",
"zone_relaychan": "Canal de retransmisi\u00f3n",
"zone_rfid": "Serie RF",
"zone_type": "Tipo de zona"
},
"description": "Introduce los detalles para la zona {zona_number}. Para borrar la zona {zone_number}, deja el nombre de la zona en blanco.",
"title": "Configurar AlarmDecoder"
},
"zone_select": {
"data": {
"zone_number": "N\u00famero de zona"
},
"description": "Introduce el n\u00famero de zona que deseas a\u00f1adir, editar o eliminar.",
"title": "Configurar AlarmDecoder"
}
}
}
}
@@ -0,0 +1,49 @@
{
"config": {
"step": {
"user": {
"data": {
"protocol": "Protokoll"
}
}
}
},
"options": {
"step": {
"arm_settings": {
"data": {
"alt_night_mode": "Alternatiivne \u00f6\u00f6re\u017eiim",
"auto_bypass": "Automaatne m\u00f6\u00f6daviik valvestamisel",
"code_arm_required": "Valvestamise kood"
},
"title": "Seadista AlarmDecoder"
},
"init": {
"data": {
"edit_select": "Muuda"
},
"description": "Mida Te soovite muuta?",
"title": "Seadista AlarmDecoder"
},
"zone_details": {
"data": {
"zone_loop": "RF silmus",
"zone_name": "Ala nimi",
"zone_relayaddr": "Relee aadress",
"zone_relaychan": "Relee kanalinumber",
"zone_rfid": "RF jada\u00fchendus",
"zone_type": "Ala t\u00fc\u00fcp"
},
"description": "Sisestage ala {zone_number} \u00fcksikasjad. Ala {zone_number} kustutamiseks j\u00e4tke ala nimi t\u00fchjaks.",
"title": "Seadista AlarmDecoder"
},
"zone_select": {
"data": {
"zone_number": "Ala number"
},
"description": "Sisestage ala number mida soovite lisada, muuta v\u00f5i eemaldada.",
"title": "Seadista AlarmDecoder"
}
}
}
}
@@ -0,0 +1,74 @@
{
"config": {
"abort": {
"already_configured": "L'appareil est d\u00e9j\u00e0 configur\u00e9"
},
"create_entry": {
"default": "Connexion r\u00e9ussie \u00e0 AlarmDecoder."
},
"error": {
"service_unavailable": "\u00c9chec de connexion"
},
"step": {
"protocol": {
"data": {
"device_baudrate": "D\u00e9bit en bauds de l'appareil",
"device_path": "Chemin du p\u00e9riph\u00e9rique",
"host": "H\u00f4te",
"port": "Port"
},
"title": "Configurer les param\u00e8tres de connexion"
},
"user": {
"data": {
"protocol": "Protocole"
},
"title": "Choisissez le protocole AlarmDecoder"
}
}
},
"options": {
"error": {
"int": "Le champ ci-dessous doit \u00eatre un entier.",
"loop_range": "La boucle RF doit \u00eatre un entier compris entre 1 et 4.",
"loop_rfid": "La boucle RF ne peut pas \u00eatre utilis\u00e9e sans s\u00e9rie RF.",
"relay_inclusive": "L'adresse de relais et le canal de relais d\u00e9pendent du codage et doivent \u00eatre inclus ensemble."
},
"step": {
"arm_settings": {
"data": {
"alt_night_mode": "Mode nuit alternatif",
"auto_bypass": "Bypass automatique \u00e0 l'armement",
"code_arm_required": "Code requis pour l'armement"
},
"title": "Configurer AlarmDecoder"
},
"init": {
"data": {
"edit_select": "Modifier"
},
"description": "Que voulez-vous modifier?",
"title": "Configurer AlarmDecoder"
},
"zone_details": {
"data": {
"zone_loop": "Boucle RF",
"zone_name": "Nom de zone",
"zone_relayaddr": "Adresse de relais",
"zone_relaychan": "Canal de relais",
"zone_rfid": "RF S\u00e9rie",
"zone_type": "Type de zone"
},
"description": "Entrez les d\u00e9tails de la zone {zone_number} . Pour supprimer la zone {zone_number} , laissez le nom de zone vide.",
"title": "Configurer AlarmDecoder"
},
"zone_select": {
"data": {
"zone_number": "Num\u00e9ro de zone"
},
"description": "Saisissez le num\u00e9ro de zone que vous souhaitez ajouter, modifier ou supprimer.",
"title": "Configurer AlarmDecoder"
}
}
}
}
@@ -0,0 +1,74 @@
{
"config": {
"abort": {
"already_configured": "Il dispositivo \u00e8 gi\u00e0 configurato"
},
"create_entry": {
"default": "Collegato con successo ad AlarmDecoder."
},
"error": {
"service_unavailable": "Impossibile connettersi"
},
"step": {
"protocol": {
"data": {
"device_baudrate": "Velocit\u00e0 di trasmissione del dispositivo",
"device_path": "Percorso del dispositivo",
"host": "Host",
"port": "Porta"
},
"title": "Configurare le impostazioni di connessione"
},
"user": {
"data": {
"protocol": "Protocollo"
},
"title": "Scegliere il protocollo AlarmDecoder"
}
}
},
"options": {
"error": {
"int": "Il campo sottostante deve essere un numero intero.",
"loop_range": "Il Ciclo RF deve essere un numero intero compreso tra 1 e 4.",
"loop_rfid": "Il Ciclo RF non pu\u00f2 essere utilizzato senza il Seriale RF ",
"relay_inclusive": "L'indirizzo del rel\u00e8 e il canale del rel\u00e8 sono codipendenti e devono essere inclusi insieme."
},
"step": {
"arm_settings": {
"data": {
"alt_night_mode": "Modalit\u00e0 notturna alternativa",
"auto_bypass": "Bypass automatico all'attivazione",
"code_arm_required": "Codice richiesto per l'attivazione"
},
"title": "Configurare AlarmDecoder"
},
"init": {
"data": {
"edit_select": "Modifica"
},
"description": "Cosa vorresti modificare?",
"title": "Configurare AlarmDecoder"
},
"zone_details": {
"data": {
"zone_loop": "Ciclo RF",
"zone_name": "Nome zona",
"zone_relayaddr": "Indirizzo rel\u00e8",
"zone_relaychan": "Canale rel\u00e8",
"zone_rfid": "Seriale RF",
"zone_type": "Tipo di zona"
},
"description": "Immettere i dettagli per la zona {zone_number}. Per eliminare la zona {zone_number}, lasciare vuoto il campo Nome zona.",
"title": "Configurare AlarmDecoder"
},
"zone_select": {
"data": {
"zone_number": "Numero di zona"
},
"description": "Immettere il numero di zona che si desidera aggiungere, modificare o rimuovere.",
"title": "Configurare AlarmDecoder"
}
}
}
}
@@ -0,0 +1,74 @@
{
"config": {
"abort": {
"already_configured": "\uc7a5\uce58\uac00 \uc774\ubbf8 \uad6c\uc131\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4."
},
"create_entry": {
"default": "AlarmDecoder\uc5d0 \uc131\uacf5\uc801\uc73c\ub85c \uc5f0\uacb0\ub418\uc5c8\uc2b5\ub2c8\ub2e4."
},
"error": {
"service_unavailable": "\uc5f0\uacb0 \uc2e4\ud328"
},
"step": {
"protocol": {
"data": {
"device_baudrate": "\uc7a5\uce58 \uc804\uc1a1 \uc18d\ub3c4",
"device_path": "\uc7a5\uce58 \uacbd\ub85c",
"host": "\ud638\uc2a4\ud2b8",
"port": "\ud3ec\ud2b8"
},
"title": "\uc5f0\uacb0 \uc124\uc815 \uad6c\uc131"
},
"user": {
"data": {
"protocol": "\ud504\ub85c\ud1a0\ucf5c"
},
"title": "AlarmDecoder \ud504\ub85c\ud1a0\ucf5c \uc120\ud0dd"
}
}
},
"options": {
"error": {
"int": "\uc544\ub798 \ud544\ub4dc\ub294 \uc815\uc218\uc5ec\uc57c \ud569\ub2c8\ub2e4.",
"loop_range": "RF \ub8e8\ud504\ub294 1\uc5d0\uc11c 4 \uc0ac\uc774\uc758 \uc815\uc218\uc5ec\uc57c \ud569\ub2c8\ub2e4.",
"loop_rfid": "RF \ub8e8\ud504\ub294 RF \uc2dc\ub9ac\uc5bc\uc5c6\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.",
"relay_inclusive": "\ub9b4\ub808\uc774 \uc8fc\uc18c\uc640 \ub9b4\ub808\uc774 \ucc44\ub110\uc740 \uc11c\ub85c \uc758\uc874\uc801\uc774\uba70 \ud568\uaed8 \ud3ec\ud568\ub418\uc5b4\uc57c\ud569\ub2c8\ub2e4."
},
"step": {
"arm_settings": {
"data": {
"alt_night_mode": "\ub300\uccb4 \uc57c\uac04 \ubaa8\ub4dc",
"auto_bypass": "\uacbd\ube44\uc911 \uc790\ub3d9 \uc6b0\ud68c",
"code_arm_required": "\uacbd\ube44\uc5d0 \ud544\uc694\ud55c \ucf54\ub4dc"
},
"title": "AlarmDecoder \uad6c\uc131"
},
"init": {
"data": {
"edit_select": "\ud3b8\uc9d1"
},
"description": "\ubb34\uc5c7\uc744 \ud3b8\uc9d1 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
"title": "AlarmDecoder \uad6c\uc131"
},
"zone_details": {
"data": {
"zone_loop": "RF \ub8e8\ud504",
"zone_name": "\uc601\uc5ed \uc774\ub984",
"zone_relayaddr": "\ub9b4\ub808\uc774 \uc8fc\uc18c",
"zone_relaychan": "\ub9b4\ub808\uc774 \ucc44\ub110",
"zone_rfid": "RF \uc2dc\ub9ac\uc5bc",
"zone_type": "\uc601\uc5ed \uc720\ud615"
},
"description": "{zone_number} \uc601\uc5ed\uc5d0 \ub300\ud55c \uc138\ubd80 \uc815\ubcf4\ub97c \uc785\ub825\ud569\ub2c8\ub2e4. {zone_number} \uc601\uc5ed\uc744 \uc0ad\uc81c\ud558\ub824\uba74 \uc601\uc5ed \uc774\ub984\uc744 \ube44\uc6cc \ub461\ub2c8\ub2e4.",
"title": "AlarmDecoder \uad6c\uc131"
},
"zone_select": {
"data": {
"zone_number": "\uad6c\uc5ed \ubc88\ud638"
},
"description": "\ucd94\uac00, \ud3b8\uc9d1 \ub610\ub294 \uc81c\uac70\ud560 \uc601\uc5ed \ubc88\ud638\ub97c \uc785\ub825\ud569\ub2c8\ub2e4.",
"title": "AlarmDecoder \uad6c\uc131"
}
}
}
}
@@ -0,0 +1,64 @@
{
"config": {
"abort": {
"already_configured": "Apparat ass scho konfigur\u00e9iert"
},
"error": {
"service_unavailable": "Feeler beim verbannen"
},
"step": {
"protocol": {
"data": {
"device_baudrate": "Apparat Baudrate",
"device_path": "Pad vum Apparat",
"host": "Host",
"port": "Port"
}
},
"user": {
"data": {
"protocol": "Protokoll"
}
}
}
},
"options": {
"error": {
"int": "D'Feld hei \u00ebnnen muss eng ganz Zuel sinn.",
"relay_inclusive": "Relais Adress a Relais Kanal sin vuneneen ofh\u00e4ngeg a musse mat abegraff sinn."
},
"step": {
"arm_settings": {
"data": {
"alt_night_mode": "Alternative Nuecht Modus",
"auto_bypass": "Auto Bypass beim aktiv\u00e9ieren",
"code_arm_required": "Code erfuerderlech fir d'Aktiv\u00e9ierung"
},
"title": "AlarmDecoder konfigur\u00e9ieren"
},
"init": {
"data": {
"edit_select": "\u00c4nneren"
},
"description": "Wat w\u00eblls du \u00e4nneren?",
"title": "AlarmDecoder konfigur\u00e9ieren"
},
"zone_details": {
"data": {
"zone_loop": "RF Schleef",
"zone_name": "Numm vun der Zone",
"zone_relayaddr": "Relais Adresse",
"zone_relaychan": "Relais Kanal",
"zone_rfid": "RF Serielle",
"zone_type": "Type vun der Zone"
},
"title": "AlarmDecoder konfigur\u00e9ieren"
},
"zone_select": {
"data": {
"zone_number": "Zone Nummer"
}
}
}
}
}
@@ -0,0 +1,73 @@
{
"config": {
"abort": {
"already_configured": "AlarmDecoder-apparaat is al geconfigureerd."
},
"create_entry": {
"default": "Succesvol verbonden met AlarmDecoder."
},
"error": {
"service_unavailable": "Kon niet verbinden"
},
"step": {
"protocol": {
"data": {
"device_baudrate": "Baudrate van apparaat",
"device_path": "Apparaatpad",
"host": "Host",
"port": "Poort"
},
"title": "Configureer de verbindingsinstellingen"
},
"user": {
"data": {
"protocol": "Protocol"
},
"title": "Kies AlarmDecoder Protocol"
}
}
},
"options": {
"error": {
"int": "Het onderstaande veld moet een geheel getal zijn.",
"loop_range": "RF Lus moet een geheel getal zijn tussen 1 en 4.",
"loop_rfid": "RF Lus kan niet worden gebruikt zonder RF Serieel.",
"relay_inclusive": "Het relais-adres en het relais-kanaal zijn codeafhankelijk en moeten samen worden opgenomen."
},
"step": {
"arm_settings": {
"data": {
"alt_night_mode": "Alternatieve nachtmodus",
"auto_bypass": "Automatische bypass bij inschakelen",
"code_arm_required": "Code vereist voor inschakelen"
},
"title": "Configureer AlarmDecoder"
},
"init": {
"data": {
"edit_select": "Bewerk"
},
"description": "Wat wilt u bewerken?",
"title": "Configureer AlarmDecoder"
},
"zone_details": {
"data": {
"zone_loop": "RF Lus",
"zone_name": "Zone naam",
"zone_relayaddr": "Relais Adres",
"zone_relaychan": "Relais Kanaal",
"zone_rfid": "RF Serieel",
"zone_type": "Zone Type"
},
"title": "Configureer AlarmDecoder"
},
"zone_select": {
"data": {
"zone_number": "Zone nummer"
},
"description": "Voer het zone nummer in dat u wilt toevoegen, bewerken of verwijderen.",
"title": "Configureer AlarmDecoder"
}
}
}
}
@@ -0,0 +1,74 @@
{
"config": {
"abort": {
"already_configured": "Enheten er allerede konfigurert"
},
"create_entry": {
"default": "Vellykket koblet til AlarmDecoder."
},
"error": {
"service_unavailable": "Tilkobling mislyktes."
},
"step": {
"protocol": {
"data": {
"device_baudrate": "Baud-hastighet for enhet",
"device_path": "Bane til enheten",
"host": "Vert",
"port": "Port"
},
"title": "Konfigurer tilkoblingsinnstillinger"
},
"user": {
"data": {
"protocol": "Protokoll"
},
"title": "Velg AlarmDecoder Protokoll"
}
}
},
"options": {
"error": {
"int": "Feltet nedenfor m\u00e5 v\u00e6re et helt tall.",
"loop_range": "RF Loop m\u00e5 v\u00e6re et heltall mellom 1 og 4.",
"loop_rfid": "RF Loop kan ikke brukes uten RF Serial.",
"relay_inclusive": "Rel\u00e9adresse og rel\u00e9kanal er kodeavhengige og m\u00e5 inkluderes sammen."
},
"step": {
"arm_settings": {
"data": {
"alt_night_mode": "Alternativ nattmodus",
"auto_bypass": "Auto bypass p\u00e5 Arm",
"code_arm_required": "Kode kreves for tilkobling"
},
"title": "Konfigurer AlarmDecoder"
},
"init": {
"data": {
"edit_select": "Rediger"
},
"description": "Hva \u00f8nsker du \u00e5 redigere?",
"title": "Konfigurer AlarmDecoder"
},
"zone_details": {
"data": {
"zone_loop": "RF Loop",
"zone_name": "Sonenavn",
"zone_relayaddr": "Rel\u00e9 adresse",
"zone_relaychan": "Rel\u00e9 kanal",
"zone_rfid": "RF seriell",
"zone_type": "Sone type"
},
"description": "Angi detaljer for sonen {zone_number}. Hvis du vil slette sonen {zone_number}, lar du Sonenavn st\u00e5 tomt.",
"title": "Konfigurer AlarmDecoder"
},
"zone_select": {
"data": {
"zone_number": "Sone nummer"
},
"description": "Angi sonenummeret du vil legge til, redigere eller fjerne.",
"title": "Konfigurer AlarmDecoder"
}
}
}
}
@@ -0,0 +1,37 @@
{
"config": {
"abort": {
"already_configured": "Urz\u0105dzenie jest ju\u017c skonfigurowane"
},
"error": {
"service_unavailable": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia"
},
"step": {
"protocol": {
"data": {
"host": "Nazwa hosta lub adres IP",
"port": "Port"
}
}
}
},
"options": {
"step": {
"init": {
"data": {
"edit_select": "Edytuj"
}
},
"zone_details": {
"data": {
"zone_relaychan": "Kana\u0142 przeka\u017anika"
}
},
"zone_select": {
"data": {
"zone_number": "Numer strefy"
}
}
}
}
}
@@ -0,0 +1,74 @@
{
"config": {
"abort": {
"already_configured": "\u042d\u0442\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0432 Home Assistant."
},
"create_entry": {
"default": "\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043a AlarmDecoder."
},
"error": {
"service_unavailable": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f."
},
"step": {
"protocol": {
"data": {
"device_baudrate": "\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430",
"device_path": "\u041f\u0443\u0442\u044c \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443",
"host": "\u0425\u043e\u0441\u0442",
"port": "\u041f\u043e\u0440\u0442"
},
"title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f"
},
"user": {
"data": {
"protocol": "\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b"
},
"title": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b AlarmDecoder"
}
}
},
"options": {
"error": {
"int": "\u041f\u043e\u043b\u0435 \u043d\u0438\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0446\u0435\u043b\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c.",
"loop_range": "RF Loop \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0446\u0435\u043b\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u043e\u0442 1 \u0434\u043e 4.",
"loop_rfid": "RF Loop \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0435\u0437 RF Serial.",
"relay_inclusive": "\u0410\u0434\u0440\u0435\u0441 \u0440\u0435\u043b\u0435 \u0438 \u043a\u0430\u043d\u0430\u043b \u0440\u0435\u043b\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b \u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0432\u043c\u0435\u0441\u0442\u0435."
},
"step": {
"arm_settings": {
"data": {
"alt_night_mode": "\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043d\u043e\u0447\u043d\u043e\u0439 \u0440\u0435\u0436\u0438\u043c",
"auto_bypass": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043d\u0430 \u043e\u0445\u0440\u0430\u043d\u0443",
"code_arm_required": "\u041a\u043e\u0434, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043d\u0430 \u043e\u0445\u0440\u0430\u043d\u0443"
},
"title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 AlarmDecoder"
},
"init": {
"data": {
"edit_select": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c"
},
"description": "\u0427\u0442\u043e \u0431\u044b \u0412\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c?",
"title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 AlarmDecoder"
},
"zone_details": {
"data": {
"zone_loop": "RF Loop",
"zone_name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0437\u043e\u043d\u044b",
"zone_relayaddr": "\u0410\u0434\u0440\u0435\u0441 \u0440\u0435\u043b\u0435",
"zone_relaychan": "\u041a\u0430\u043d\u0430\u043b \u0440\u0435\u043b\u0435",
"zone_rfid": "RF Serial",
"zone_type": "\u0422\u0438\u043f \u0437\u043e\u043d\u044b"
},
"description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0437\u043e\u043d\u044b {zone_number}. \u0427\u0442\u043e\u0431\u044b \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u043e\u043d\u0443 {zone_number}, \u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u043e\u043b\u0435 \"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0437\u043e\u043d\u044b\" \u043f\u0443\u0441\u0442\u044b\u043c.",
"title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 AlarmDecoder"
},
"zone_select": {
"data": {
"zone_number": "\u041d\u043e\u043c\u0435\u0440 \u0437\u043e\u043d\u044b"
},
"description": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u043e\u043c\u0435\u0440 \u0437\u043e\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c.",
"title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 AlarmDecoder"
}
}
}
}
@@ -0,0 +1,27 @@
{
"config": {
"step": {
"protocol": {
"data": {
"device_path": "Enhetsv\u00e4g"
},
"title": "Konfigurera anslutningsinst\u00e4llningar"
},
"user": {
"data": {
"protocol": "Protokoll"
}
}
}
},
"options": {
"step": {
"init": {
"data": {
"edit_select": "Redigera"
},
"description": "Vad vill du redigera?"
}
}
}
}
@@ -0,0 +1,74 @@
{
"config": {
"abort": {
"already_configured": "\u8a2d\u5099\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210"
},
"create_entry": {
"default": "\u6210\u529f\u9023\u7dda\u81f3 AlarmDecoder\u3002"
},
"error": {
"service_unavailable": "\u9023\u7dda\u5931\u6557"
},
"step": {
"protocol": {
"data": {
"device_baudrate": "\u8a2d\u5099\u901a\u8a0a\u7387",
"device_path": "\u8a2d\u5099\u8def\u5f91",
"host": "\u4e3b\u6a5f\u7aef",
"port": "\u901a\u8a0a\u57e0"
},
"title": "\u8a2d\u5b9a\u9023\u7dda\u8a2d\u5b9a"
},
"user": {
"data": {
"protocol": "\u901a\u8a0a\u5354\u5b9a"
},
"title": "\u9078\u64c7 AlarmDecoder \u901a\u8a0a\u5354\u5b9a"
}
}
},
"options": {
"error": {
"int": "\u4e0b\u65b9\u6b04\u4f4d\u5fc5\u9808\u70ba\u6574\u6578\u3002",
"loop_range": "RF \u8ff4\u8def\u5fc5\u9808\u70ba\u4ecb\u65bc 1 \u81f3 4 \u9593\u7684\u6574\u6578\u3002",
"loop_rfid": "\u5982\u679c\u6c92\u6709 RF \u5e8f\u5217\u5247\u7121\u6cd5\u4f7f\u7528 RF \u8ff4\u8def\u3002",
"relay_inclusive": "\u4e2d\u7e7c\u5730\u5740\u8207\u4e2d\u7e7c\u983b\u9053\u70ba\u76f8\u4e92\u4f9d\u8cf4\uff0c\u4e26\u5fc5\u9808\u4e00\u8d77\u5305\u542b\u3002"
},
"step": {
"arm_settings": {
"data": {
"alt_night_mode": "\u66ff\u4ee3\u591c\u9593\u6a21\u5f0f",
"auto_bypass": "\u81ea\u52d5\u5ffd\u7565\u8b66\u6212",
"code_arm_required": "\u8b66\u6212\u9700\u8981\u4ee3\u78bc"
},
"title": "\u8a2d\u5b9a AlarmDecoder"
},
"init": {
"data": {
"edit_select": "\u7de8\u8f2f"
},
"description": "\u662f\u5426\u8981\u9032\u884c\u7de8\u8f2f\uff1f",
"title": "\u8a2d\u5b9a AlarmDecoder"
},
"zone_details": {
"data": {
"zone_loop": "RF \u8ff4\u8def",
"zone_name": "\u5340\u57df\u540d\u7a31",
"zone_relayaddr": "\u4e2d\u7e7c\u4f4d\u5740",
"zone_relaychan": "\u4e2d\u7e7c\u983b\u9053",
"zone_rfid": "RF \u5e8f\u5217",
"zone_type": "\u5340\u57df\u985e\u578b"
},
"description": "\u8f38\u5165\u5340\u57df {zone_number} \u8a73\u7d30\u8cc7\u6599\u3002\u6b32\u522a\u9664\u5340\u57df {zone_number}\uff0c\u4fdd\u6301\u5340\u57df\u540d\u7a31\u7a7a\u767d\u3002",
"title": "\u8a2d\u5b9a AlarmDecoder"
},
"zone_select": {
"data": {
"zone_number": "\u5340\u57df\u78bc"
},
"description": "\u8f38\u5165\u6240\u8981\u65b0\u589e\u3001\u7de8\u8f2f\u6216\u79fb\u9664\u7684\u5340\u57df\u78bc\u3002",
"title": "\u8a2d\u5b9a AlarmDecoder"
}
}
}
}
+2 -1
View File
@@ -17,6 +17,7 @@ from homeassistant.components import (
from homeassistant.components.climate import const as climate
from homeassistant.const import (
ATTR_ENTITY_ID,
ATTR_ENTITY_PICTURE,
ATTR_SUPPORTED_FEATURES,
ATTR_TEMPERATURE,
SERVICE_ALARM_ARM_AWAY,
@@ -1532,7 +1533,7 @@ async def async_api_initialize_camera_stream(hass, config, directive, context):
"""Process a InitializeCameraStreams request."""
entity = directive.entity
stream_source = await camera.async_request_stream(hass, entity.entity_id, fmt="hls")
camera_image = hass.states.get(entity.entity_id).attributes["entity_picture"]
camera_image = hass.states.get(entity.entity_id).attributes[ATTR_ENTITY_PICTURE]
try:
external_url = network.get_url(
@@ -6,7 +6,7 @@ import logging
import aiohttp
import async_timeout
from homeassistant.const import MATCH_ALL, STATE_ON
from homeassistant.const import HTTP_ACCEPTED, MATCH_ALL, STATE_ON
import homeassistant.util.dt as dt_util
from .const import API_CHANGE, Cause
@@ -109,7 +109,7 @@ async def async_send_changereport_message(
_LOGGER.debug("Sent: %s", json.dumps(message_serialized))
_LOGGER.debug("Received (%s): %s", response.status, response_text)
if response.status == 202:
if response.status == HTTP_ACCEPTED:
return
response_json = json.loads(response_text)
@@ -240,7 +240,7 @@ async def async_send_doorbell_event_message(hass, config, alexa_entity):
_LOGGER.debug("Sent: %s", json.dumps(message_serialized))
_LOGGER.debug("Received (%s): %s", response.status, response_text)
if response.status == 202:
if response.status == HTTP_ACCEPTED:
return
response_json = json.loads(response_text)
+3 -2
View File
@@ -1,7 +1,7 @@
{
"config": {
"step": {
"pick_implementation": { "title": "Pick Authentication Method" },
"pick_implementation": { "title": "[%key:common::config_flow::title::oauth2_pick_implementation%]" },
"hassio_confirm": {
"title": "Almond via Hass.io add-on",
"description": "Do you want to configure Home Assistant to connect to Almond provided by the Hass.io add-on: {addon}?"
@@ -10,7 +10,8 @@
"abort": {
"already_setup": "You can only configure one Almond account.",
"cannot_connect": "Unable to connect to the Almond server.",
"missing_configuration": "Please check the documentation on how to set up Almond."
"missing_configuration": "Please check the documentation on how to set up Almond.",
"no_url_available": "[%key:common::config_flow::abort::oauth2_no_url_available%]"
}
}
}
@@ -3,7 +3,8 @@
"abort": {
"already_setup": "Nom\u00e9s pots configurar un \u00fanic compte amb Almond.",
"cannot_connect": "No es pot connectar amb el servidor d'Almond.",
"missing_configuration": "Consulta la documentaci\u00f3 sobre com configurar Almond."
"missing_configuration": "Consulta la documentaci\u00f3 sobre com configurar Almond.",
"no_url_available": "No hi ha cap URL disponible. Per a m\u00e9s informaci\u00f3 sobre aquest error, [consulta la secci\u00f3 d'ajuda]({docs_url})"
},
"step": {
"hassio_confirm": {
@@ -3,7 +3,8 @@
"abort": {
"already_setup": "You can only configure one Almond account.",
"cannot_connect": "Unable to connect to the Almond server.",
"missing_configuration": "Please check the documentation on how to set up Almond."
"missing_configuration": "Please check the documentation on how to set up Almond.",
"no_url_available": "No URL available. For information about this error, [check the help section]({docs_url})"
},
"step": {
"hassio_confirm": {
@@ -3,7 +3,8 @@
"abort": {
"already_setup": "S\u00f3lo puede configurar una cuenta de Almond.",
"cannot_connect": "No se puede conectar al servidor Almond.",
"missing_configuration": "Consulte la documentaci\u00f3n sobre c\u00f3mo configurar Almond."
"missing_configuration": "Consulte la documentaci\u00f3n sobre c\u00f3mo configurar Almond.",
"no_url_available": "No hay URL disponible. Para obtener informaci\u00f3n sobre este error, [consulta la secci\u00f3n de ayuda]({docs_url})"
},
"step": {
"hassio_confirm": {
@@ -3,7 +3,8 @@
"abort": {
"already_setup": "Vous ne pouvez configurer qu'un seul compte Almond",
"cannot_connect": "Impossible de se connecter au serveur Almond",
"missing_configuration": "Veuillez consulter la documentation pour savoir comment configurer Almond."
"missing_configuration": "Veuillez consulter la documentation pour savoir comment configurer Almond.",
"no_url_available": "Aucune URL disponible. Pour plus d'informations sur cette erreur, [consultez la section d'aide] ( {docs_url} )"
},
"step": {
"hassio_confirm": {
@@ -3,7 +3,8 @@
"abort": {
"already_setup": "\u00c8 possibile configurare un solo account Almond.",
"cannot_connect": "Impossibile connettersi al server Almond.",
"missing_configuration": "Si prega di controllare la documentazione su come impostare Almond."
"missing_configuration": "Si prega di controllare la documentazione su come impostare Almond.",
"no_url_available": "Nessun URL disponibile. Per informazioni su questo errore, [controlla la sezione della guida]({docs_url})"
},
"step": {
"hassio_confirm": {
@@ -11,7 +12,7 @@
"title": "Almond tramite il componente aggiuntivo di Hass.io"
},
"pick_implementation": {
"title": "Seleziona metodo di autenticazione"
"title": "Scegli il metodo di autenticazione"
}
}
}
@@ -3,7 +3,8 @@
"abort": {
"already_setup": "\ud558\ub098\uc758 Almond \uacc4\uc815\ub9cc \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",
"cannot_connect": "Almond \uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.",
"missing_configuration": "Almond \uc124\uc815 \ubc29\ubc95\uc5d0 \ub300\ud55c \uc124\uba85\uc11c\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694."
"missing_configuration": "Almond \uc124\uc815 \ubc29\ubc95\uc5d0 \ub300\ud55c \uc124\uba85\uc11c\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694.",
"no_url_available": "\uac00\ub2a5\ud55c URL\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \uc774 \uc5d0\ub7ec\uc5d0 \ub300\ud55c \uc815\ubcf4\ub294 \ub3c4\uc6c0\ub9d0 \uc139\uc158\uc744 \ud655\uc778\ud558\uc138\uc694({docs_url})"
},
"step": {
"hassio_confirm": {
@@ -3,7 +3,8 @@
"abort": {
"already_setup": "Dir k\u00ebnnt n\u00ebmmen een eenzegen Almond Kont konfigur\u00e9ieren.",
"cannot_connect": "Kann sech net mam Almond Server verbannen.",
"missing_configuration": "Kuckt w.e.g. Dokumentatioun iwwert d'ariichten vun Almond."
"missing_configuration": "Kuckt w.e.g. Dokumentatioun iwwert d'ariichten vun Almond.",
"no_url_available": "Keng URL disponibel. Fir Informatiounen iwwert d\u00ebse Feeler, [kuck H\u00ebllef Sektioun]({docs_url})"
},
"step": {
"hassio_confirm": {
@@ -3,7 +3,8 @@
"abort": {
"already_setup": "U kunt slechts \u00e9\u00e9n Almond-account configureren.",
"cannot_connect": "Kan geen verbinding maken met de Almond-server.",
"missing_configuration": "Raadpleeg de documentatie over het instellen van Almond."
"missing_configuration": "Raadpleeg de documentatie over het instellen van Almond.",
"no_url_available": "Geen URL beschikbaar. Voor informatie over deze fout, [check de helpsectie]({docs_url})"
},
"step": {
"hassio_confirm": {
@@ -3,11 +3,13 @@
"abort": {
"already_setup": "Du kan bare konfigurere en Almond konto.",
"cannot_connect": "Kan ikke koble til Almond-serveren.",
"missing_configuration": "Vennligst sjekk dokumentasjonen om hvordan du setter opp Almond."
"missing_configuration": "Vennligst sjekk dokumentasjonen om hvordan du setter opp Almond.",
"no_url_available": "Ingen URL tilgjengelig. For informasjon om denne feilen, [sjekk {docs_url} ] ( {docs_url} )"
},
"step": {
"hassio_confirm": {
"description": "Vil du konfigurere Home Assistant til \u00e5 koble til Almond levert av Hass.io add-on: {addon}?"
"description": "Vil du konfigurere Home Assistant til \u00e5 koble til Almond levert av Hass.io add-on: {addon}?",
"title": ""
},
"pick_implementation": {
"title": "Velg godkjenningsmetode"
@@ -3,7 +3,8 @@
"abort": {
"already_setup": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.",
"cannot_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 Almond.",
"missing_configuration": "\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 Almond."
"missing_configuration": "\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 Almond.",
"no_url_available": "URL-\u0430\u0434\u0440\u0435\u0441 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d. \u041e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 [\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439]({docs_url}) \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u044d\u0442\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0435."
},
"step": {
"hassio_confirm": {
@@ -3,7 +3,8 @@
"abort": {
"already_setup": "\u50c5\u80fd\u8a2d\u5b9a\u4e00\u7d44 Almond \u5e33\u865f\u3002",
"cannot_connect": "\u7121\u6cd5\u9023\u7dda\u81f3 Almond \u4f3a\u670d\u5668\u3002",
"missing_configuration": "\u8acb\u53c3\u8003\u76f8\u95dc\u6587\u4ef6\u4ee5\u4e86\u89e3\u5982\u4f55\u8a2d\u5b9a Almond\u3002"
"missing_configuration": "\u8acb\u53c3\u8003\u76f8\u95dc\u6587\u4ef6\u4ee5\u4e86\u89e3\u5982\u4f55\u8a2d\u5b9a Almond\u3002",
"no_url_available": "\u6c92\u6709\u53ef\u7528\u7684\u7db2\u5740\u3002\u95dc\u65bc\u6b64\u932f\u8aa4\u66f4\u8a73\u7d30\u8a0a\u606f\uff0c[\u9ede\u9078\u5354\u52a9\u7ae0\u7bc0]({docs_url})"
},
"step": {
"hassio_confirm": {
@@ -6,8 +6,10 @@ from aioambient import Client
from aioambient.errors import WebsocketError
import voluptuous as vol
from homeassistant.components.binary_sensor import DEVICE_CLASS_CONNECTIVITY
from homeassistant.config_entries import SOURCE_IMPORT
from homeassistant.const import (
AREA_SQUARE_METERS,
ATTR_LOCATION,
ATTR_NAME,
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
@@ -15,8 +17,10 @@ from homeassistant.const import (
CONF_API_KEY,
DEGREE,
EVENT_HOMEASSISTANT_STOP,
LIGHT_LUX,
PERCENTAGE,
POWER_WATT,
PRESSURE_INHG,
SPEED_MILES_PER_HOUR,
TEMP_FAHRENHEIT,
)
@@ -141,8 +145,8 @@ TYPE_WINDSPEEDMPH = "windspeedmph"
TYPE_YEARLYRAININ = "yearlyrainin"
SENSOR_TYPES = {
TYPE_24HOURRAININ: ("24 Hr Rain", "in", TYPE_SENSOR, None),
TYPE_BAROMABSIN: ("Abs Pressure", "inHg", TYPE_SENSOR, "pressure"),
TYPE_BAROMRELIN: ("Rel Pressure", "inHg", TYPE_SENSOR, "pressure"),
TYPE_BAROMABSIN: ("Abs Pressure", PRESSURE_INHG, TYPE_SENSOR, "pressure"),
TYPE_BAROMRELIN: ("Rel Pressure", PRESSURE_INHG, TYPE_SENSOR, "pressure"),
TYPE_BATT10: ("Battery 10", None, TYPE_BINARY_SENSOR, "battery"),
TYPE_BATT1: ("Battery 1", None, TYPE_BINARY_SENSOR, "battery"),
TYPE_BATT2: ("Battery 2", None, TYPE_BINARY_SENSOR, "battery"),
@@ -175,16 +179,16 @@ SENSOR_TYPES = {
TYPE_LASTRAIN: ("Last Rain", None, TYPE_SENSOR, "timestamp"),
TYPE_MAXDAILYGUST: ("Max Gust", SPEED_MILES_PER_HOUR, TYPE_SENSOR, None),
TYPE_MONTHLYRAININ: ("Monthly Rain", "in", TYPE_SENSOR, None),
TYPE_RELAY10: ("Relay 10", None, TYPE_BINARY_SENSOR, "connectivity"),
TYPE_RELAY1: ("Relay 1", None, TYPE_BINARY_SENSOR, "connectivity"),
TYPE_RELAY2: ("Relay 2", None, TYPE_BINARY_SENSOR, "connectivity"),
TYPE_RELAY3: ("Relay 3", None, TYPE_BINARY_SENSOR, "connectivity"),
TYPE_RELAY4: ("Relay 4", None, TYPE_BINARY_SENSOR, "connectivity"),
TYPE_RELAY5: ("Relay 5", None, TYPE_BINARY_SENSOR, "connectivity"),
TYPE_RELAY6: ("Relay 6", None, TYPE_BINARY_SENSOR, "connectivity"),
TYPE_RELAY7: ("Relay 7", None, TYPE_BINARY_SENSOR, "connectivity"),
TYPE_RELAY8: ("Relay 8", None, TYPE_BINARY_SENSOR, "connectivity"),
TYPE_RELAY9: ("Relay 9", None, TYPE_BINARY_SENSOR, "connectivity"),
TYPE_RELAY10: ("Relay 10", None, TYPE_BINARY_SENSOR, DEVICE_CLASS_CONNECTIVITY),
TYPE_RELAY1: ("Relay 1", None, TYPE_BINARY_SENSOR, DEVICE_CLASS_CONNECTIVITY),
TYPE_RELAY2: ("Relay 2", None, TYPE_BINARY_SENSOR, DEVICE_CLASS_CONNECTIVITY),
TYPE_RELAY3: ("Relay 3", None, TYPE_BINARY_SENSOR, DEVICE_CLASS_CONNECTIVITY),
TYPE_RELAY4: ("Relay 4", None, TYPE_BINARY_SENSOR, DEVICE_CLASS_CONNECTIVITY),
TYPE_RELAY5: ("Relay 5", None, TYPE_BINARY_SENSOR, DEVICE_CLASS_CONNECTIVITY),
TYPE_RELAY6: ("Relay 6", None, TYPE_BINARY_SENSOR, DEVICE_CLASS_CONNECTIVITY),
TYPE_RELAY7: ("Relay 7", None, TYPE_BINARY_SENSOR, DEVICE_CLASS_CONNECTIVITY),
TYPE_RELAY8: ("Relay 8", None, TYPE_BINARY_SENSOR, DEVICE_CLASS_CONNECTIVITY),
TYPE_RELAY9: ("Relay 9", None, TYPE_BINARY_SENSOR, DEVICE_CLASS_CONNECTIVITY),
TYPE_SOILHUM10: ("Soil Humidity 10", PERCENTAGE, TYPE_SENSOR, "humidity"),
TYPE_SOILHUM1: ("Soil Humidity 1", PERCENTAGE, TYPE_SENSOR, "humidity"),
TYPE_SOILHUM2: ("Soil Humidity 2", PERCENTAGE, TYPE_SENSOR, "humidity"),
@@ -205,8 +209,13 @@ SENSOR_TYPES = {
TYPE_SOILTEMP7F: ("Soil Temp 7", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"),
TYPE_SOILTEMP8F: ("Soil Temp 8", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"),
TYPE_SOILTEMP9F: ("Soil Temp 9", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"),
TYPE_SOLARRADIATION: ("Solar Rad", f"{POWER_WATT}/m^2", TYPE_SENSOR, None),
TYPE_SOLARRADIATION_LX: ("Solar Rad (lx)", "lx", TYPE_SENSOR, "illuminance"),
TYPE_SOLARRADIATION: (
"Solar Rad",
f"{POWER_WATT}/{AREA_SQUARE_METERS}",
TYPE_SENSOR,
None,
),
TYPE_SOLARRADIATION_LX: ("Solar Rad (lx)", LIGHT_LUX, TYPE_SENSOR, "illuminance"),
TYPE_TEMP10F: ("Temp 10", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"),
TYPE_TEMP1F: ("Temp 1", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"),
TYPE_TEMP2F: ("Temp 2", TEMP_FAHRENHEIT, TYPE_SENSOR, "temperature"),
@@ -1,5 +1,8 @@
"""Support for Android IP Webcam binary sensors."""
from homeassistant.components.binary_sensor import BinarySensorEntity
from homeassistant.components.binary_sensor import (
DEVICE_CLASS_MOTION,
BinarySensorEntity,
)
from . import CONF_HOST, CONF_NAME, DATA_IP_WEBCAM, KEY_MAP, AndroidIPCamEntity
@@ -47,4 +50,4 @@ class IPWebcamBinarySensor(AndroidIPCamEntity, BinarySensorEntity):
@property
def device_class(self):
"""Return the class of this device, from component DEVICE_CLASSES."""
return "motion"
return DEVICE_CLASS_MOTION
@@ -4,7 +4,7 @@
"documentation": "https://www.home-assistant.io/integrations/androidtv",
"requirements": [
"adb-shell[async]==0.2.1",
"androidtv[async]==0.0.49",
"androidtv[async]==0.0.50",
"pure-python-adb[async]==0.3.0.dev0"
],
"codeowners": ["@JeffLIrion"]
@@ -380,7 +380,7 @@ def adb_decorator(override_available=False):
# An unforeseen exception occurred. Close the ADB connection so that
# it doesn't happen over and over again, then raise the exception.
await self.aftv.adb_close()
self._available = False # pylint: disable=protected-access
self._available = False
raise
return _adb_exception_catcher
@@ -502,14 +502,23 @@ class ADBDevice(MediaPlayerEntity):
return self._unique_id
@adb_decorator()
async def _adb_screencap(self):
"""Take a screen capture from the device."""
return await self.aftv.adb_screencap()
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.aftv.adb_screencap()
media_data = await self._adb_screencap()
if media_data:
return media_data, "image/png"
# If an exception occurred and the device is no longer available, write the state
if not self.available:
self.async_write_ha_state()
return None, None
@adb_decorator()
+4
View File
@@ -38,6 +38,7 @@ from homeassistant.helpers.json import JSONEncoder
from homeassistant.helpers.network import NoURLAvailableError, get_url
from homeassistant.helpers.service import async_get_all_descriptions
from homeassistant.helpers.state import AsyncTrackStates
from homeassistant.helpers.system_info import async_get_system_info
_LOGGER = logging.getLogger(__name__)
@@ -45,6 +46,7 @@ ATTR_BASE_URL = "base_url"
ATTR_EXTERNAL_URL = "external_url"
ATTR_INTERNAL_URL = "internal_url"
ATTR_LOCATION_NAME = "location_name"
ATTR_INSTALLATION_TYPE = "installation_type"
ATTR_REQUIRES_API_PASSWORD = "requires_api_password"
ATTR_UUID = "uuid"
ATTR_VERSION = "version"
@@ -181,6 +183,7 @@ class APIDiscoveryView(HomeAssistantView):
"""Get discovery information."""
hass = request.app["hass"]
uuid = await hass.helpers.instance_id.async_get()
system_info = await async_get_system_info(hass)
data = {
ATTR_UUID: uuid,
@@ -188,6 +191,7 @@ class APIDiscoveryView(HomeAssistantView):
ATTR_EXTERNAL_URL: None,
ATTR_INTERNAL_URL: None,
ATTR_LOCATION_NAME: hass.config.location_name,
ATTR_INSTALLATION_TYPE: system_info[ATTR_INSTALLATION_TYPE],
# always needs authentication
ATTR_REQUIRES_API_PASSWORD: True,
ATTR_VERSION: __version__,
+5 -2
View File
@@ -29,8 +29,11 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
def get_service(hass, config, discovery_info=None):
"""Get the Apprise notification service."""
# Create our object
a_obj = apprise.Apprise()
# Create our Apprise Asset Object
asset = apprise.AppriseAsset(async_mode=False)
# Create our Apprise Instance (reference our asset)
a_obj = apprise.Apprise(asset=asset)
if config.get(CONF_FILE):
# Sourced from a Configuration File
@@ -12,7 +12,8 @@
},
"user": {
"data": {
"host": "Vert"
"host": "Vert",
"port": ""
},
"description": "Vennligst skriv inn vertsnavnet eller IP-adressen til enheten."
}
@@ -1,7 +1,7 @@
{
"config": {
"abort": {
"already_configured": "Urz\u0105dzenie jest ju\u017c skonfigurowane."
"already_configured": "Urz\u0105dzenie jest ju\u017c skonfigurowane"
},
"step": {
"user": {
@@ -23,6 +23,12 @@ CONFIG_SCHEMA = vol.Schema(
def setup(hass, config):
"""Set up the Arduino component."""
_LOGGER.warning(
"The %s integration has been deprecated. Please move your "
"configuration to the firmata integration. "
"https://www.home-assistant.io/integrations/firmata",
DOMAIN,
)
port = config[DOMAIN][CONF_PORT]
+1 -1
View File
@@ -3,6 +3,6 @@
"name": "Atag",
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/atag/",
"requirements": ["pyatag==0.3.3.4"],
"requirements": ["pyatag==0.3.4.4"],
"codeowners": ["@MatsNL"]
}
@@ -16,5 +16,6 @@
"title": "Verbinding maken met het apparaat"
}
}
}
},
"title": ""
}
@@ -11,10 +11,12 @@
"user": {
"data": {
"email": "E-post (valgfritt)",
"host": "Vert"
"host": "Vert",
"port": ""
},
"title": "Koble til enheten"
}
}
}
},
"title": ""
}
+32 -8
View File
@@ -3,13 +3,18 @@ import asyncio
import itertools
import logging
from aiohttp import ClientError
from aiohttp import ClientError, ClientResponseError
from august.authenticator import ValidationResult
from august.exceptions import AugustApiAIOHTTPError
import voluptuous as vol
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
from homeassistant.const import CONF_PASSWORD, CONF_TIMEOUT, CONF_USERNAME
from homeassistant.const import (
CONF_PASSWORD,
CONF_TIMEOUT,
CONF_USERNAME,
HTTP_UNAUTHORIZED,
)
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryNotReady, HomeAssistantError
import homeassistant.helpers.config_validation as cv
@@ -29,7 +34,7 @@ from .const import (
MIN_TIME_BETWEEN_DETAIL_UPDATES,
VERIFICATION_CODE_KEY,
)
from .exceptions import InvalidAuth, RequireValidation
from .exceptions import CannotConnect, InvalidAuth, RequireValidation
from .gateway import AugustGateway
from .subscriber import AugustSubscriberMixin
@@ -113,10 +118,7 @@ async def async_setup_august(hass, config_entry, august_gateway):
await august_gateway.async_authenticate()
except RequireValidation:
await async_request_validation(hass, config_entry, august_gateway)
return False
except InvalidAuth:
_LOGGER.error("Password is no longer valid. Please set up August again")
return False
raise
# We still use the configurator to get a new 2fa code
# when needed since config_flow doesn't have a way
@@ -171,8 +173,30 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry):
try:
await august_gateway.async_setup(entry.data)
return await async_setup_august(hass, entry, august_gateway)
except asyncio.TimeoutError as err:
except ClientResponseError as err:
if err.status == HTTP_UNAUTHORIZED:
_async_start_reauth(hass, entry)
return False
raise ConfigEntryNotReady from err
except InvalidAuth:
_async_start_reauth(hass, entry)
return False
except RequireValidation:
return False
except (CannotConnect, asyncio.TimeoutError) as err:
raise ConfigEntryNotReady from err
def _async_start_reauth(hass: HomeAssistant, entry: ConfigEntry):
hass.async_create_task(
hass.config_entries.flow.async_init(
DOMAIN,
context={"source": "reauth"},
data=entry.data,
)
)
_LOGGER.error("Password is no longer valid. Please reauthenticate")
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry):
+44 -18
View File
@@ -4,7 +4,7 @@ import logging
from august.authenticator import ValidationResult
import voluptuous as vol
from homeassistant import config_entries, core
from homeassistant import config_entries
from homeassistant.const import CONF_PASSWORD, CONF_TIMEOUT, CONF_USERNAME
from .const import (
@@ -19,18 +19,8 @@ from .gateway import AugustGateway
_LOGGER = logging.getLogger(__name__)
DATA_SCHEMA = vol.Schema(
{
vol.Required(CONF_LOGIN_METHOD, default="phone"): vol.In(LOGIN_METHODS),
vol.Required(CONF_USERNAME): str,
vol.Required(CONF_PASSWORD): str,
vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): vol.Coerce(int),
}
)
async def async_validate_input(
hass: core.HomeAssistant,
data,
august_gateway,
):
@@ -79,6 +69,7 @@ class AugustConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
"""Store an AugustGateway()."""
self._august_gateway = None
self.user_auth_details = {}
self._needs_reset = False
super().__init__()
async def async_step_user(self, user_input=None):
@@ -87,30 +78,45 @@ class AugustConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
self._august_gateway = AugustGateway(self.hass)
errors = {}
if user_input is not None:
await self._august_gateway.async_setup(user_input)
combined_inputs = {**self.user_auth_details, **user_input}
await self._august_gateway.async_setup(combined_inputs)
if self._needs_reset:
self._needs_reset = False
await self._august_gateway.async_reset_authentication()
try:
info = await async_validate_input(
self.hass,
user_input,
combined_inputs,
self._august_gateway,
)
await self.async_set_unique_id(user_input[CONF_USERNAME])
return self.async_create_entry(title=info["title"], data=info["data"])
except CannotConnect:
errors["base"] = "cannot_connect"
except InvalidAuth:
errors["base"] = "invalid_auth"
except RequireValidation:
self.user_auth_details = user_input
self.user_auth_details.update(user_input)
return await self.async_step_validation()
except Exception: # pylint: disable=broad-except
_LOGGER.exception("Unexpected exception")
errors["base"] = "unknown"
if not errors:
self.user_auth_details.update(user_input)
existing_entry = await self.async_set_unique_id(
combined_inputs[CONF_USERNAME]
)
if existing_entry:
self.hass.config_entries.async_update_entry(
existing_entry, data=info["data"]
)
await self.hass.config_entries.async_reload(existing_entry.entry_id)
return self.async_abort(reason="reauth_successful")
return self.async_create_entry(title=info["title"], data=info["data"])
return self.async_show_form(
step_id="user", data_schema=DATA_SCHEMA, errors=errors
step_id="user", data_schema=self._async_build_schema(), errors=errors
)
async def async_step_validation(self, user_input=None):
@@ -135,3 +141,23 @@ class AugustConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
self._abort_if_unique_id_configured()
return await self.async_step_user(user_input)
async def async_step_reauth(self, data):
"""Handle configuration by re-auth."""
self.user_auth_details = dict(data)
self._needs_reset = True
return await self.async_step_user()
def _async_build_schema(self):
"""Generate the config flow schema."""
base_schema = {
vol.Required(CONF_LOGIN_METHOD, default="phone"): vol.In(LOGIN_METHODS),
vol.Required(CONF_USERNAME): str,
vol.Required(CONF_PASSWORD): str,
vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): vol.Coerce(int),
}
for key in self.user_auth_details:
if key == CONF_PASSWORD or key not in base_schema:
continue
del base_schema[key]
return vol.Schema(base_schema)
+43 -35
View File
@@ -2,12 +2,18 @@
import asyncio
import logging
import os
from aiohttp import ClientError
from aiohttp import ClientError, ClientResponseError
from august.api_async import ApiAsync
from august.authenticator_async import AuthenticationState, AuthenticatorAsync
from homeassistant.const import CONF_PASSWORD, CONF_TIMEOUT, CONF_USERNAME
from homeassistant.const import (
CONF_PASSWORD,
CONF_TIMEOUT,
CONF_USERNAME,
HTTP_UNAUTHORIZED,
)
from homeassistant.helpers import aiohttp_client
from .const import (
@@ -32,29 +38,14 @@ class AugustGateway:
self._access_token_cache_file = None
self._hass = hass
self._config = None
self._api = None
self._authenticator = None
self._authentication = None
@property
def authenticator(self):
"""August authentication object from py-august."""
return self._authenticator
@property
def authentication(self):
"""August authentication object from py-august."""
return self._authentication
self.api = None
self.authenticator = None
self.authentication = None
@property
def access_token(self):
"""Access token for the api."""
return self._authentication.access_token
@property
def api(self):
"""August api object from py-august."""
return self._api
return self.authentication.access_token
def config_entry(self):
"""Config entry."""
@@ -78,12 +69,12 @@ class AugustGateway:
)
self._config = conf
self._api = ApiAsync(
self.api = ApiAsync(
self._aiohttp_session, timeout=self._config.get(CONF_TIMEOUT)
)
self._authenticator = AuthenticatorAsync(
self._api,
self.authenticator = AuthenticatorAsync(
self.api,
self._config[CONF_LOGIN_METHOD],
self._config[CONF_USERNAME],
self._config[CONF_PASSWORD],
@@ -93,30 +84,47 @@ class AugustGateway:
),
)
await self._authenticator.async_setup_authentication()
await self.authenticator.async_setup_authentication()
async def async_authenticate(self):
"""Authenticate with the details provided to setup."""
self._authentication = None
self.authentication = None
try:
self._authentication = await self.authenticator.async_authenticate()
self.authentication = await self.authenticator.async_authenticate()
if self.authentication.state == AuthenticationState.AUTHENTICATED:
# Call the locks api to verify we are actually
# authenticated because we can be authenticated
# by have no access
await self.api.async_get_operable_locks(self.access_token)
except ClientResponseError as ex:
if ex.status == HTTP_UNAUTHORIZED:
raise InvalidAuth from ex
raise CannotConnect from ex
except ClientError as ex:
_LOGGER.error("Unable to connect to August service: %s", str(ex))
raise CannotConnect from ex
if self._authentication.state == AuthenticationState.BAD_PASSWORD:
if self.authentication.state == AuthenticationState.BAD_PASSWORD:
raise InvalidAuth
if self._authentication.state == AuthenticationState.REQUIRES_VALIDATION:
if self.authentication.state == AuthenticationState.REQUIRES_VALIDATION:
raise RequireValidation
if self._authentication.state != AuthenticationState.AUTHENTICATED:
_LOGGER.error(
"Unknown authentication state: %s", self._authentication.state
)
if self.authentication.state != AuthenticationState.AUTHENTICATED:
_LOGGER.error("Unknown authentication state: %s", self.authentication.state)
raise InvalidAuth
return self._authentication
return self.authentication
async def async_reset_authentication(self):
"""Remove the cache file."""
await self._hass.async_add_executor_job(self._reset_authentication)
def _reset_authentication(self):
"""Remove the cache file."""
if os.path.exists(self._access_token_cache_file):
os.unlink(self._access_token_cache_file)
async def async_refresh_access_token_if_needed(self):
"""Refresh the august access token if needed."""
@@ -130,4 +138,4 @@ class AugustGateway:
self.authentication.access_token_expires,
refreshed_authentication.access_token_expires,
)
self._authentication = refreshed_authentication
self.authentication = refreshed_authentication
+3 -2
View File
@@ -6,7 +6,8 @@
"invalid_auth": "Invalid authentication"
},
"abort": {
"already_configured": "Account is already configured"
"already_configured": "Account is already configured",
"reauth_successful": "Re-authentication was successful"
},
"step": {
"validation": {
@@ -28,4 +29,4 @@
}
}
}
}
}
@@ -1,7 +1,8 @@
{
"config": {
"abort": {
"already_configured": "El compte ja ha estat configurat"
"already_configured": "El compte ja ha estat configurat",
"reauth_successful": "Re-autenticaci\u00f3 realitzada correctament"
},
"error": {
"cannot_connect": "No s'ha pogut connectar, torna-ho a provar",
@@ -0,0 +1,7 @@
{
"config": {
"abort": {
"reauth_successful": "\u0397 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c0\u03b9\u03c3\u03c4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03ae\u03c4\u03b1\u03bd \u03b5\u03c0\u03b9\u03c4\u03c5\u03c7\u03ae\u03c2"
}
}
}
@@ -1,7 +1,8 @@
{
"config": {
"abort": {
"already_configured": "Account is already configured"
"already_configured": "Account is already configured",
"reauth_successful": "Re-authentication was successful"
},
"error": {
"cannot_connect": "Failed to connect, please try again",
@@ -1,7 +1,8 @@
{
"config": {
"abort": {
"already_configured": "La cuenta ya est\u00e1 configurada"
"already_configured": "La cuenta ya est\u00e1 configurada",
"reauth_successful": "La reautenticaci\u00f3n se realiz\u00f3 correctamente"
},
"error": {
"cannot_connect": "No se ha podido conectar, por favor, int\u00e9ntalo de nuevo.",

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