Compare commits

..

108 Commits

Author SHA1 Message Date
Paulus Schoutsen
d2179e5321 Merge pull request #35221 from home-assistant/rc 2020-05-04 20:06:57 -07:00
Paulus Schoutsen
f5282bfcf3 remove deprecation 2020-05-04 18:18:15 -07:00
Xiaonan Shen
3f449e1d27 Remove certificate configuration variable from roomba (#35162)
* Remove certificate option from roomba

* Fix roomba test

* Add back certificate with deprecated flag

* Remove invalidation_version
2020-05-04 18:16:16 -07:00
Paulus Schoutsen
d4200b5eb9 Bumped version to 0.109.4 2020-05-04 18:03:16 -07:00
Quentame
222a8bb7be Fix Synology DSM sensor to be False or 0 (#35208) 2020-05-04 18:03:05 -07:00
Diogo Gomes
96576a9775 Fix utility_meter calibration with float values (#35186) 2020-05-04 18:03:05 -07:00
Franck Nijhof
c03e3ce961 Fix UVC doing I/O inside the event loop (#35169) 2020-05-04 18:03:04 -07:00
Franck Nijhof
45d934e64d Fix Canary KeyError: 'ffmpeg_arguments' (#35158) 2020-05-04 18:03:03 -07:00
Quentame
89cbbfc2e5 Bump pyiCloud to 0.9.7 + do not warn when pending devices (#35156) 2020-05-04 18:03:02 -07:00
Paulus Schoutsen
0d8390b9df Hue: Guard for when there is no brightness (#35151) 2020-05-04 18:03:01 -07:00
Joakim Sørensen
ab2c3a2130 Correct typo Asssitant -> Assistant (#35117) 2020-05-04 18:03:00 -07:00
Quentame
d3b6255ffe Fix Synology NAS discovered multiple times (#35094) 2020-05-04 18:02:59 -07:00
Paulus Schoutsen
5f267be1db Merge pull request #35092 from home-assistant/rc 2020-05-02 16:30:19 -07:00
Paulus Schoutsen
cf2e71a530 Fix import 2020-05-02 15:38:24 -07:00
Paulus Schoutsen
ec63ab0639 Bumped version to 0.109.3 2020-05-02 15:00:00 -07:00
J. Nick Koston
bd882fa4e4 Improve stability of homekit media players (#35080) 2020-05-02 14:59:22 -07:00
Bram Kragten
a083eb334e Updated frontend to 20200427.2 (#35079) 2020-05-02 14:55:27 -07:00
David Nielsen
4c65c51ede Update bravia-tv to 1.0.3 (#35077) 2020-05-02 14:55:26 -07:00
Quentame
b0dc1fdfad Bump python-synology to 0.8.0 + Fix disk space incorrect sensor type (#35068)
* Fix Synology disk space incorrect sensor type

* Review 1
2020-05-02 14:55:25 -07:00
Xiaonan Shen
69b8032a5a Bump roombapy to 1.5.2 (#35067) 2020-05-02 14:55:25 -07:00
Robert Svensson
2f374abc58 UniFi - Add support for 2.4/5 GHz separated SSIDs (#35062) 2020-05-02 14:55:24 -07:00
Robert Svensson
f445a81a4d UniFi - Catch controllers running on UniFi OS that don't have a local user configured (#35060) 2020-05-02 14:55:23 -07:00
Quentame
002a8f4900 Bump python-synology to 0.7.4 (#35052) 2020-05-02 14:55:22 -07:00
Paulus Schoutsen
93631341a5 Bump hass-nabucasa to 0.34.2 (#35046) 2020-05-02 14:55:21 -07:00
Aaron Bach
6a5f9d74f5 Fix Canary doing I/O in the event loop (#35039) 2020-05-02 14:55:20 -07:00
Paulus Schoutsen
ed4441a1c2 Fix translation merging for custom components without translations (#35032) 2020-05-02 14:55:19 -07:00
Vilppu Vuorinen
0c5b24a1f5 Fix MELCloud temperature unit (#35003)
The MELCLoud API produces and consumes only Celsius.
2020-05-02 14:55:18 -07:00
Franck Nijhof
02cca1a4da Merge pull request #35001 from home-assistant/rc 2020-05-01 10:35:19 +02:00
Paulus Schoutsen
421ebb087b Fix pylint CI 2020-04-30 23:50:16 -07:00
Paulus Schoutsen
7e47481676 Fix MQTT test 2020-04-30 22:55:59 -07:00
Paulus Schoutsen
837b1384af Bumped version to 0.109.2 2020-04-30 22:41:44 -07:00
Paulus Schoutsen
af5cdc1f65 Lint roomba (#35000) 2020-04-30 22:41:37 -07:00
Xiaonan Shen
bc9125666f Fix roomba not reporting error (#34996) 2020-04-30 22:41:36 -07:00
Austin Mroczek
b01131ab9d Add allow extra to totalconnect config schema (#34993) 2020-04-30 22:41:35 -07:00
J. Nick Koston
b8070567bf Log the rachio webhook url (#34992) 2020-04-30 22:41:34 -07:00
Robert Svensson
77d89d13b6 UniFi - Disconnected clients wrongfully marked as wired not created (#34986) 2020-04-30 22:41:34 -07:00
Chris Talkington
12119f89e5 Support num_repeats for directv remote (#34982) 2020-04-30 22:41:20 -07:00
Chris Talkington
3a4b8625bd Support num_repeats for roku remote (#34981) 2020-04-30 22:40:26 -07:00
J. Nick Koston
42dd3ba748 Fix restoring isy994 brightness with no previous state (#34972) 2020-04-30 22:39:02 -07:00
J. Nick Koston
de18207ca3 Fix preservation of homekit fan speed on toggle (#34971) 2020-04-30 22:37:57 -07:00
Erik Montnemery
b68228c7e8 Fix MQTT debug info for same topic (#34952) 2020-04-30 22:37:56 -07:00
Maciej Bieniek
9ccd56c019 Bump brother to 0.1.14 (#34930) 2020-04-30 22:37:56 -07:00
Raman Gupta
4d49fe6b93 Don't attempt to set Vizio is_volume_muted property if Vizio API doesn't provide muted state (#34782) 2020-04-30 22:37:55 -07:00
Pascal Vizeli
becc120ad9 Merge pull request #34922 from home-assistant/rc
0.109.1
2020-04-30 11:00:49 +02:00
Chris Talkington
ade4e36da7 Use entry ID when IPP printer offers no identifier (#34316) 2020-04-30 00:22:05 -07:00
Paulus Schoutsen
38f9559348 Bumped version to 0.109.1 2020-04-30 00:11:31 -07:00
J. Nick Koston
d974e64a8b Make sqlalchemy engine connect listener recorder specific (#34908) 2020-04-30 00:11:21 -07:00
J. Nick Koston
6f20a4a181 Avoid error when battery appears after homekit has started (#34906) 2020-04-30 00:11:20 -07:00
J. Nick Koston
6b2a006fea Fix handling homekit thermostat states (#34905) 2020-04-30 00:11:20 -07:00
jjlawren
88c755518f Reduce log level for WebOS connection error (#34904) 2020-04-30 00:11:19 -07:00
Paulus Schoutsen
e2475e67c6 Fix Toon doing I/O in event loop (#34896) 2020-04-30 00:11:18 -07:00
Paulus Schoutsen
d891810e95 Fix Garmin Connect doing I/O in event loop (#34895) 2020-04-30 00:11:18 -07:00
Aaron Bach
98bff965f5 Fix Flu Near You exception re: stale coroutines (#34880) 2020-04-30 00:11:17 -07:00
J. Nick Koston
d391b87227 Prevent homekit fans from going to 100% than speed when turning on (#34875) 2020-04-30 00:11:16 -07:00
J. Nick Koston
5f7711e7a6 Abort nexia import if the username is already configured (#34863) 2020-04-30 00:11:15 -07:00
Andrew Sayre
3bf1cf4f85 SmartThings continue correct config flow after external auth (#34862) 2020-04-30 00:11:14 -07:00
Pascal Vizeli
6d9aafd3b0 Fix CVE-2020-1967 (#34853) 2020-04-30 00:11:13 -07:00
Maciej Bieniek
81a2fb9615 Reload braviatv entry after options update (#34576)
* Reload entry after options update

* Undo update listener when unloading
2020-04-30 00:11:13 -07:00
Franck Nijhof
405062d2df Merge pull request #34850 from home-assistant/rc 2020-04-29 15:50:32 +02:00
Franck Nijhof
50144e883e Bumped version to 0.109.0 2020-04-29 14:15:35 +02:00
Franck Nijhof
e7e0f049d1 Update translations for Islamic Prayer Times 2020-04-29 13:52:10 +02:00
Quentame
dad0109eca Bump python-synology to 0.7.3 (#34847) 2020-04-29 13:42:55 +02:00
Rami Mosleh
1e23019df8 Fix Islamic prayer times naming (#34784) 2020-04-29 13:42:50 +02:00
Franck Nijhof
0bb83e5b7c Merge branch 'master' into rc 2020-04-29 12:15:16 +02:00
Franck Nijhof
aca1c5a5f8 Update translations for FRITZ!Box 2020-04-29 12:04:53 +02:00
HomeAssistant Azure
a3d048e9c0 [ci skip] Translation update 2020-04-28 22:25:55 -07:00
Paulus Schoutsen
66d938fcea Bumped version to 0.109.0b5 2020-04-28 22:24:09 -07:00
Bram Kragten
72d805d458 Updated frontend to 20200427.1 (#34831) 2020-04-28 22:23:56 -07:00
Quentame
1a2e6eae8e Bump python-synology to 0.7.2 (#34830) 2020-04-28 22:23:55 -07:00
Franck Nijhof
d634ed0bbb Fix meteoalarm exception handling with instance of KeyError (#34828) 2020-04-28 22:23:54 -07:00
Franck Nijhof
bdbeb1d68f Fix async call in sync context in steam_online (#34823) 2020-04-28 22:23:54 -07:00
Franck Nijhof
e8314e1d86 Fix sync call in async context generic_thermostat (#34822) 2020-04-28 22:23:53 -07:00
Robert Svensson
bf424caf4a UniFi - Add a second roaming event (#34819) 2020-04-28 22:23:52 -07:00
escoand
996af94bb8 Handle more fritzbox edge cases (#34802) 2020-04-28 22:23:52 -07:00
Chris Talkington
f47055a1b0 Remove legacy discovery for roku (#34794) 2020-04-28 22:23:51 -07:00
Chris Talkington
e416e0a9e9 Remove legacy discovery for directv (#34793)
* remove legacy discovery for directv

* Update __init__.py

* Update __init__.py
2020-04-28 22:23:50 -07:00
Paulus Schoutsen
fd690db01f Disable upnp SSDP discovery (#34756) 2020-04-28 22:23:49 -07:00
escoand
e03df37417 Add unique_id to fritzbox (#34716) 2020-04-28 22:23:48 -07:00
MatsNl
3f232f3dbd Fix atag timezone bug (#34686)
Co-authored-by: Boris Nelissen <borisnelissen91@gmail.com>
2020-04-28 22:23:48 -07:00
HomeAssistant Azure
28a4af89d9 [ci skip] Translation update 2020-04-27 11:05:38 -07:00
HomeAssistant Azure
77cec174b8 [ci skip] Translation update 2020-04-27 11:05:33 -07:00
HomeAssistant Azure
511366f329 [ci skip] Translation update 2020-04-27 11:05:13 -07:00
HomeAssistant Azure
e4d320d5f5 [ci skip] Translation update 2020-04-27 11:05:04 -07:00
Bram Kragten
097b1d112b Bumped version to 0.109.0b4 2020-04-27 15:43:28 +02:00
Bram Kragten
961327f76b Updated frontend to 20200427.0 (#34766) 2020-04-27 15:40:43 +02:00
Quentame
d7fbb8ed8e Bump python-synology to 0.7.1 (#34728) 2020-04-27 15:40:43 +02:00
escoand
79135f59fd Fix fritzbox errors again (#34710) 2020-04-27 15:40:42 +02:00
Paulus Schoutsen
0c066a0944 Bumped version to 0.109.0b3 2020-04-25 17:30:56 -07:00
Paulus Schoutsen
86ae02e5c5 Add frontend version WS command (#34701) 2020-04-25 17:30:47 -07:00
Quentame
17c31ed640 Fix Synology DSM translation (#34696) 2020-04-25 17:30:46 -07:00
cgtobi
7fa3950001 Fix zero value state rendering sensor unavailable (#34694)
Co-Authored-By: Franck Nijhof <git@frenck.dev>
2020-04-25 17:30:46 -07:00
Joakim Sørensen
9def9464e9 Add retry at startup (#34656) 2020-04-25 17:30:45 -07:00
escoand
f474631ac0 Fix fritzbox integration errors (#34639) 2020-04-25 17:30:44 -07:00
Paulus Schoutsen
e757c47bc8 Bumped version to 0.109.0b2 2020-04-24 14:21:12 -07:00
Quentame
2452f3504c Log config flow errors (#34665) 2020-04-24 14:20:57 -07:00
Alexei Chetroi
e3b91f4ce7 Update ZHA dependency (#34661)
Bump up zigpy-deconz
2020-04-24 14:20:56 -07:00
Paulus Schoutsen
214d6f5cf5 Add Home Assistant Started event (#34657) 2020-04-24 14:20:55 -07:00
Paulus Schoutsen
f3f2aa807b Fix identifying Plex schema when used in packages (#34651) 2020-04-24 14:20:55 -07:00
Bram Kragten
a65bb6d804 Updated frontend to 20200424.0 (#34645) 2020-04-24 14:20:54 -07:00
J. Nick Koston
1063594bf0 Handle synology_dsm discovery broadcasting on multiple ip addresses (#34623) 2020-04-24 14:20:53 -07:00
Paulus Schoutsen
a7f4b4d248 Delay sync for Google and limit updates to relevant info (#34622) 2020-04-24 14:20:52 -07:00
Franck Nijhof
5b4cfc6b25 Fix BloomSky KeyError: 'monitored_conditions' (#34613)
Co-Authored-By: Paulus Schoutsen <balloob@gmail.com>
2020-04-24 14:20:52 -07:00
J. Nick Koston
93aa47851a Restore ability to overwrite homekit max temp bound (#34612) 2020-04-24 14:20:51 -07:00
Paulus Schoutsen
513f33f454 Fix UVC doing I/O in event loop (#34610) 2020-04-24 14:20:50 -07:00
Chris Talkington
7b35f5d66d Restore Expected Behavior of Sonarr Upcoming Sensor (#34408) 2020-04-24 14:20:49 -07:00
Paulus Schoutsen
79fdac6674 Merge pull request #34655 from home-assistant/108.9 2020-04-24 10:59:28 -07:00
Paulus Schoutsen
73535200c2 Bumped version to 0.108.9 2020-04-24 09:56:18 -07:00
Paulus Schoutsen
f3de26444e Delay sync for Google and limit updates to relevant info (#34622) 2020-04-24 09:56:12 -07:00
329 changed files with 4123 additions and 1124 deletions

View File

@@ -195,6 +195,7 @@ homeassistant/components/ipp/* @ctalkington
homeassistant/components/iqvia/* @bachya
homeassistant/components/irish_rail_transport/* @ttroy50
homeassistant/components/islamic_prayer_times/* @engrbm87
homeassistant/components/isy994/* @bdraco
homeassistant/components/izone/* @Swamp-Ig
homeassistant/components/jewish_calendar/* @tsvi
homeassistant/components/juicenet/* @jesserockz

View File

@@ -190,6 +190,9 @@ stages:
pip install -U pip setuptools wheel
pip install -r requirements_all.txt -c homeassistant/package_constraints.txt
pip install -r requirements_test.txt -c homeassistant/package_constraints.txt
# This is a TEMP. Eventually we should make sure our 4 dependencies drop typing.
# Find offending deps with `pipdeptree -r -p typing`
pip uninstall -y typing
- script: |
. venv/bin/activate
pip install -e .

View File

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

View File

@@ -1,7 +1,7 @@
{
"config": {
"abort": {
"single_instance_allowed": "\ud558\ub098\uc758 Abode \ub9cc \uad6c\uc131 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."
"single_instance_allowed": "\ud558\ub098\uc758 Abode \ub9cc \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."
},
"error": {
"connection_error": "Abode \uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.",

View File

@@ -4,7 +4,7 @@
"adguard_home_addon_outdated": "\uc774 \ud1b5\ud569 \uad6c\uc131\uc694\uc18c\ub294 AdGuard Home {minimal_version} \uc774\uc0c1\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \ud604\uc7ac \ubc84\uc804\uc740 {current_version} \uc785\ub2c8\ub2e4. Hass.io AdGuard Home \uc560\ub4dc\uc628\uc744 \uc5c5\ub370\uc774\ud2b8 \ud574\uc8fc\uc138\uc694.",
"adguard_home_outdated": "\uc774 \ud1b5\ud569 \uad6c\uc131\uc694\uc18c\ub294 AdGuard Home {minimal_version} \uc774\uc0c1\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \ud604\uc7ac \ubc84\uc804\uc740 {current_version} \uc785\ub2c8\ub2e4.",
"existing_instance_updated": "\uae30\uc874 \uad6c\uc131\uc744 \uc5c5\ub370\uc774\ud2b8\ud588\uc2b5\ub2c8\ub2e4.",
"single_instance_allowed": "\ud558\ub098\uc758 AdGuard Home \ub9cc \uad6c\uc131 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."
"single_instance_allowed": "\ud558\ub098\uc758 AdGuard Home \ub9cc \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."
},
"error": {
"connection_error": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4."

View File

@@ -16,7 +16,7 @@
},
"user": {
"data": {
"host": "Host",
"host": "Nazwa hosta lub adres IP",
"password": "Has\u0142o",
"port": "Port",
"ssl": "AdGuard Home u\u017cywa certyfikatu SSL",

View File

@@ -4,15 +4,37 @@
"already_configured": "Aquesta clau API ja est\u00e0 sent utilitzada."
},
"error": {
"invalid_api_key": "Clau API inv\u00e0lida"
"general_error": "S'ha produ\u00eft un error desconegut.",
"invalid_api_key": "Clau API inv\u00e0lida",
"unable_to_connect": "No s'ha pogut connectar a la unitat Node/Pro."
},
"step": {
"user": {
"geography": {
"data": {
"api_key": "Clau API",
"latitude": "Latitud",
"longitude": "Longitud"
},
"description": "Utilitza l'API d'AirVisual per monitoritzar una ubicaci\u00f3 geogr\u00e0fica.",
"title": "Configuraci\u00f3 localitzaci\u00f3 geogr\u00e0fica"
},
"node_pro": {
"data": {
"ip_address": "Adre\u00e7a IP o amfitri\u00f3 de la unitat",
"password": "Contrasenya de la unitat"
},
"description": "Monitoritza una unitat personal d'AirVisual. Pots obtenir la contrasenya des de la interf\u00edcie d'usuari (UI) de la unitat.",
"title": "Configuraci\u00f3 d'AirVisual Node/Pro"
},
"user": {
"data": {
"api_key": "Clau API",
"cloud_api": "Ubicaci\u00f3 geogr\u00e0fica",
"latitude": "Latitud",
"longitude": "Longitud",
"node_pro": "AirVisual Node Pro",
"type": "Tipus d'integraci\u00f3"
},
"description": "Monitoritzaci\u00f3 de la qualitat de l'aire per ubicaci\u00f3 geogr\u00e0fica.",
"title": "Configura AirVisual"
}

View File

@@ -1,19 +1,39 @@
{
"config": {
"abort": {
"already_configured": "Diese Koordinaten wurden bereits registriert."
"already_configured": "Diese Koordinaten oder Node/Pro ID sind bereits registriert."
},
"error": {
"invalid_api_key": "Ung\u00fcltiger API-Schl\u00fcssel"
"general_error": "Es gab einen unbekannten Fehler.",
"invalid_api_key": "Ung\u00fcltiger API-Schl\u00fcssel bereitgestellt.",
"unable_to_connect": "Verbindung zum Node/Pro-Ger\u00e4t nicht m\u00f6glich."
},
"step": {
"user": {
"geography": {
"data": {
"api_key": "API-Schl\u00fcssel",
"latitude": "Breitengrad",
"longitude": "L\u00e4ngengrad"
}
},
"node_pro": {
"data": {
"ip_address": "IP-Adresse/Hostname des Ger\u00e4ts",
"password": "Ger\u00e4tekennwort"
},
"description": "\u00dcberwachen Sie die Luftqualit\u00e4t an einem geografischen Ort.",
"description": "\u00dcberwachen Sie eine pers\u00f6nliche AirVisual-Einheit. Das Passwort kann von der Benutzeroberfl\u00e4che des Ger\u00e4ts abgerufen werden.",
"title": "Konfigurieren Sie einen AirVisual Node/Pro"
},
"user": {
"data": {
"api_key": "API-Schl\u00fcssel",
"cloud_api": "Geografische Position",
"latitude": "Breitengrad",
"longitude": "L\u00e4ngengrad",
"node_pro": "AirVisual Node Pro",
"type": "Integrationstyp"
},
"description": "W\u00e4hlen Sie aus, welche Art von AirVisual-Daten Sie \u00fcberwachen m\u00f6chten.",
"title": "Konfigurieren Sie AirVisual"
}
}

View File

@@ -4,15 +4,37 @@
"already_configured": "Esta clave API ya est\u00e1 en uso."
},
"error": {
"invalid_api_key": "Clave API inv\u00e1lida"
"general_error": "Se ha producido un error desconocido.",
"invalid_api_key": "Clave API inv\u00e1lida",
"unable_to_connect": "No se puede conectar a la unidad Node/Pro."
},
"step": {
"user": {
"geography": {
"data": {
"api_key": "Clave API",
"latitude": "Latitud",
"longitude": "Longitud"
},
"description": "Utilizar la API en la nube de AirVisual para monitorizar una ubicaci\u00f3n geogr\u00e1fica.",
"title": "Configurar una Geograf\u00eda"
},
"node_pro": {
"data": {
"ip_address": "Direcci\u00f3n IP/Nombre de host de la Unidad",
"password": "Contrase\u00f1a de la Unidad"
},
"description": "Monitorizar una unidad personal AirVisual. La contrase\u00f1a puede ser recuperada desde la interfaz de la unidad.",
"title": "Configurar un AirVisual Node/Pro"
},
"user": {
"data": {
"api_key": "Clave API",
"cloud_api": "Ubicaci\u00f3n Geogr\u00e1fica",
"latitude": "Latitud",
"longitude": "Longitud",
"node_pro": "AirVisual Node Pro",
"type": "Tipo de Integraci\u00f3n"
},
"description": "Monitorizar la calidad del aire en una ubicaci\u00f3n geogr\u00e1fica.",
"title": "Configurar AirVisual"
}

View File

@@ -7,6 +7,13 @@
"invalid_api_key": "Cl\u00e9 API invalide"
},
"step": {
"geography": {
"data": {
"api_key": "Cl\u00e9 d'API",
"latitude": "Latitude",
"longitude": "Longitude"
}
},
"user": {
"data": {
"api_key": "Cl\u00e9 API",

View File

@@ -0,0 +1,34 @@
{
"config": {
"error": {
"general_error": "\u0915\u094b\u0908 \u0905\u091c\u094d\u091e\u093e\u0924 \u0924\u094d\u0930\u0941\u091f\u093f \u0925\u0940\u0964",
"unable_to_connect": "\u0928\u094b\u0921 / \u092a\u094d\u0930\u094b \u0907\u0915\u093e\u0908 \u0938\u0947 \u0915\u0928\u0947\u0915\u094d\u091f \u0915\u0930\u0928\u0947 \u092e\u0947\u0902 \u0905\u0938\u092e\u0930\u094d\u0925\u0964"
},
"step": {
"geography": {
"data": {
"api_key": "\u090f\u092a\u0940\u0906\u0908 \u0915\u0941\u0902\u091c\u0940",
"latitude": "\u0905\u0915\u094d\u0937\u093e\u0902\u0936",
"longitude": "\u0926\u0947\u0936\u093e\u0928\u094d\u0924\u0930"
},
"description": "\u092d\u094c\u0917\u094b\u0932\u093f\u0915 \u0938\u094d\u0925\u093f\u0924\u093f \u0915\u0940 \u0928\u093f\u0917\u0930\u093e\u0928\u0940 \u0915\u0947 \u0932\u093f\u090f \u090f\u092f\u0930\u0935\u093f\u091c\u0941\u0905\u0932 \u0915\u094d\u0932\u093e\u0909\u0921 \u090f\u092a\u0940\u0906\u0908 \u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0915\u0930\u0947\u0902\u0964",
"title": "\u092d\u0942\u0917\u094b\u0932 \u0915\u0949\u0928\u094d\u092b\u093c\u093f\u0917\u0930 \u0915\u0930\u0947\u0902"
},
"node_pro": {
"data": {
"ip_address": "\u0907\u0915\u093e\u0908 \u0915\u0947 \u0906\u0908\u092a\u0940 \u092a\u0924\u0947/\u0939\u094b\u0938\u094d\u091f\u0928\u093e\u092e",
"password": "\u0907\u0915\u093e\u0908 \u092a\u093e\u0938\u0935\u0930\u094d\u0921"
},
"description": "\u090f\u0915 \u0935\u094d\u092f\u0915\u094d\u0924\u093f\u0917\u0924 \u090f\u092f\u0930\u0935\u093f\u091c\u0941\u0905\u0932 \u0907\u0915\u093e\u0908 \u0915\u0940 \u0928\u093f\u0917\u0930\u093e\u0928\u0940 \u0915\u0930\u0947\u0902\u0964 \u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u092f\u0942\u0928\u093f\u091f \u0915\u0947 \u092f\u0942\u0906\u0908 \u0938\u0947 \u092a\u094d\u0930\u093e\u092a\u094d\u0924 \u0915\u093f\u092f\u093e \u091c\u093e \u0938\u0915\u0924\u093e \u0939\u0948\u0964",
"title": "\u090f\u092f\u0930\u0935\u093f\u091c\u0941\u0905\u0932 \u0928\u094b\u0921 \u092a\u094d\u0930\u094b"
},
"user": {
"data": {
"cloud_api": "\u092d\u094c\u0917\u094b\u0932\u093f\u0915 \u0938\u094d\u0925\u093f\u0924\u093f",
"node_pro": "\u090f\u092f\u0930\u0935\u093f\u091c\u0941\u0905\u0932 \u0928\u094b\u0921 \u092a\u094d\u0930\u094b",
"type": "\u090f\u0915\u0940\u0915\u0930\u0923 \u092a\u094d\u0930\u0915\u093e\u0930"
}
}
}
}
}

View File

@@ -1,18 +1,40 @@
{
"config": {
"abort": {
"already_configured": "D\u00ebs Koordinate si schon registr\u00e9iert."
"already_configured": "D\u00ebs Koordinate oder ode/Pro ID si schon registr\u00e9iert."
},
"error": {
"invalid_api_key": "Ong\u00ebltegen API Schl\u00ebssel"
"general_error": "Onbekannten Feeler",
"invalid_api_key": "Ong\u00ebltegen API Schl\u00ebssel uginn",
"unable_to_connect": "Kann sech net mat der Node/Pri verbannen."
},
"step": {
"user": {
"geography": {
"data": {
"api_key": "API Schl\u00ebssel",
"latitude": "Breedegrad",
"longitude": "L\u00e4ngegrad"
},
"description": "Benotz Airvisual cloud API fir eng geografescher Lag z'iwwerwaachen.",
"title": "Geografie ariichten"
},
"node_pro": {
"data": {
"ip_address": "IP Adresse / Numm vun der Unit\u00e9it",
"password": "Passwuert vun der Unit\u00e9it"
},
"description": "Pers\u00e9inlech Airvisual Unit\u00e9it iwwerwaachen. Passwuert kann vum UI vum Apparat ausgelies ginn.",
"title": "Airvisual Node/Pro ariichten"
},
"user": {
"data": {
"api_key": "API Schl\u00ebssel",
"cloud_api": "Geografesche Standuert",
"latitude": "Breedegrad",
"longitude": "L\u00e4ngegrad",
"node_pro": "Airvisual Node Pro",
"type": "Typ vun der Integratioun"
},
"description": "Loft Qualit\u00e9it an enger geografescher Lag iwwerwaachen.",
"title": "AirVisual konfigur\u00e9ieren"
}

View File

@@ -1,19 +1,41 @@
{
"config": {
"abort": {
"already_configured": "Disse koordinatene er allerede registrert."
"already_configured": "Disse koordinatene eller Node / Pro ID er allerede registrert."
},
"error": {
"invalid_api_key": "Ugyldig API-n\u00f8kkel"
"general_error": "Det oppstod en ukjent feil.",
"invalid_api_key": "Ugyldig API-n\u00f8kkel",
"unable_to_connect": "Kan ikke koble til Node / Pro-enheten."
},
"step": {
"user": {
"geography": {
"data": {
"api_key": "API-n\u00f8kkel",
"latitude": "Breddegrad",
"longitude": "Lengdegrad"
},
"description": "Overv\u00e5k luftkvaliteten p\u00e5 et geografisk sted.",
"description": "Bruk AirVisual cloud API til \u00e5 overv\u00e5ke en geografisk plassering.",
"title": "Konfigurer en geografi"
},
"node_pro": {
"data": {
"ip_address": "Enhetens IP-adresse / vertsnavn",
"password": "Passord for enhet"
},
"description": "Overv\u00e5ke en personlig AirVisual-enhet. Passordet kan hentes fra enhetens brukergrensesnitt.",
"title": "Konfigurer en AirVisual Node / Pro"
},
"user": {
"data": {
"api_key": "API-n\u00f8kkel",
"cloud_api": "Geografisk plassering",
"latitude": "Breddegrad",
"longitude": "Lengdegrad",
"node_pro": "AirVisual Node Pro",
"type": "Integrasjonstype"
},
"description": "Velg hvilken type AirVisual-data du vil overv\u00e5ke.",
"title": "Konfigurer AirVisual"
}
}

View File

@@ -4,15 +4,36 @@
"already_configured": "Ten klucz API jest ju\u017c w u\u017cyciu."
},
"error": {
"invalid_api_key": "Nieprawid\u0142owy klucz API"
"general_error": "Nieznany 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."
},
"step": {
"user": {
"geography": {
"data": {
"api_key": "Klucz API",
"latitude": "Szeroko\u015b\u0107 geograficzna",
"longitude": "D\u0142ugo\u015b\u0107 geograficzna"
},
"title": "Konfiguracja Geography"
},
"node_pro": {
"data": {
"ip_address": "Nazwa hosta lub adres IP jednostki",
"password": "Has\u0142o jednostki"
},
"description": "Has\u0142o",
"title": "Konfiguracja AirVisual Node/Pro"
},
"user": {
"data": {
"api_key": "Klucz API",
"cloud_api": "Lokalizacja geograficzna",
"latitude": "Szeroko\u015b\u0107 geograficzna",
"longitude": "D\u0142ugo\u015b\u0107 geograficzna",
"node_pro": "AirVisual Node Pro",
"type": "Typ integracji"
},
"description": "Monitoruj jako\u015b\u0107 powietrza w okre\u015blonej lokalizacji geograficznej.",
"title": "Konfiguracja AirVisual"
}

View File

@@ -1,19 +1,41 @@
{
"config": {
"abort": {
"already_configured": "\u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b."
"already_configured": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e."
},
"error": {
"invalid_api_key": "\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 API."
"general_error": "\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430.",
"invalid_api_key": "\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 API.",
"unable_to_connect": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443."
},
"step": {
"user": {
"geography": {
"data": {
"api_key": "\u041a\u043b\u044e\u0447 API",
"latitude": "\u0428\u0438\u0440\u043e\u0442\u0430",
"longitude": "\u0414\u043e\u043b\u0433\u043e\u0442\u0430"
},
"description": "\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0439\u0442\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438.",
"description": "\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0433\u043e API AirVisual.",
"title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f"
},
"node_pro": {
"data": {
"ip_address": "IP-\u0430\u0434\u0440\u0435\u0441/\u0418\u043c\u044f \u0445\u043e\u0441\u0442\u0430",
"password": "\u041f\u0430\u0440\u043e\u043b\u044c"
},
"description": "\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 AirVisual. \u041f\u0430\u0440\u043e\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.",
"title": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 AirVisual Node / Pro"
},
"user": {
"data": {
"api_key": "\u041a\u043b\u044e\u0447 API",
"cloud_api": "\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435",
"latitude": "\u0428\u0438\u0440\u043e\u0442\u0430",
"longitude": "\u0414\u043e\u043b\u0433\u043e\u0442\u0430",
"node_pro": "AirVisual Node Pro",
"type": "\u0422\u0438\u043f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438"
},
"description": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 AirVisual, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c.",
"title": "AirVisual"
}
}

View File

@@ -0,0 +1,11 @@
{
"config": {
"step": {
"user": {
"data": {
"type": "Lo\u1ea1i t\u00edch h\u1ee3p"
}
}
}
}
}

View File

@@ -1,19 +1,41 @@
{
"config": {
"abort": {
"already_configured": "\u6b64\u4e9b\u5ea7\u6a19\u5df2\u8a3b\u518a\u3002"
"already_configured": "\u6b64\u5ea7\u6a19\u6216 Node/Pro ID \u5df2\u8a3b\u518a\u3002"
},
"error": {
"invalid_api_key": "API \u5bc6\u78bc\u7121\u6548"
"general_error": "\u767c\u751f\u672a\u77e5\u932f\u8aa4\u3002",
"invalid_api_key": "API \u5bc6\u78bc\u7121\u6548\u3002",
"unable_to_connect": "\u7121\u6cd5\u9023\u7dda\u81f3 Node/Pro \u8a2d\u5099\u3002"
},
"step": {
"user": {
"geography": {
"data": {
"api_key": "API \u5bc6\u9470",
"latitude": "\u7def\u5ea6",
"longitude": "\u7d93\u5ea6"
},
"description": "\u4f9d\u5730\u7406\u4f4d\u7f6e\u76e3\u63a7\u7a7a\u6c23\u54c1\u8cea\u3002",
"description": "\u4f7f\u7528 AirVisual \u96f2\u7aef API \u4ee5\u76e3\u63a7\u5730\u7406\u5ea7\u6a19\u3002",
"title": "\u8a2d\u5b9a\u5730\u7406\u5ea7\u6a19"
},
"node_pro": {
"data": {
"ip_address": "\u8a2d\u5099 IP \u4f4d\u5740/\u4e3b\u6a5f\u540d\u7a31",
"password": "\u8a2d\u5099\u5bc6\u78bc"
},
"description": "\u76e3\u63a7\u500b\u4eba AirVisual \u8a2d\u5099\uff0c\u5bc6\u78bc\u53ef\u4ee5\u900f\u904e\u8a2d\u5099 UI \u7372\u5f97\u3002",
"title": "\u8a2d\u5b9a AirVisual Node/Pro"
},
"user": {
"data": {
"api_key": "API \u5bc6\u9470",
"cloud_api": "\u5730\u7406\u5ea7\u6a19",
"latitude": "\u7def\u5ea6",
"longitude": "\u7d93\u5ea6",
"node_pro": "AirVisual Node Pro",
"type": "\u6574\u5408\u985e\u578b"
},
"description": "\u9078\u64c7\u6240\u8981\u76e3\u63a7\u7684 AirVisual \u8cc7\u6599\u985e\u578b\u3002",
"title": "\u8a2d\u5b9a AirVisual"
}
}

View File

@@ -1,7 +1,7 @@
{
"config": {
"abort": {
"already_setup": "\ud558\ub098\uc758 Almond \uacc4\uc815\ub9cc \uad6c\uc131 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",
"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."
},

View File

@@ -3,6 +3,6 @@
"name": "Atag",
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/atag/",
"requirements": ["pyatag==0.2.18"],
"requirements": ["pyatag==0.2.19"],
"codeowners": ["@MatsNL"]
}

View File

@@ -0,0 +1,20 @@
{
"config": {
"abort": {
"already_configured": "Nur ein Atag-Ger\u00e4t kann mit Home Assistant verbunden werden."
},
"error": {
"connection_error": "Verbindung fehlgeschlagen, versuchen Sie es erneut"
},
"step": {
"user": {
"data": {
"host": "Host",
"port": "Port (10000)"
},
"title": "Stellen Sie eine Verbindung zum Ger\u00e4t her"
}
}
},
"title": "Atag"
}

View File

@@ -0,0 +1,20 @@
{
"config": {
"abort": {
"already_configured": "S\u00f3lo se puede a\u00f1adir un dispositivo Atag a Home Assistant"
},
"error": {
"connection_error": "No se pudo conectar, por favor, int\u00e9ntalo de nuevo"
},
"step": {
"user": {
"data": {
"host": "Host",
"port": "Puerto (10000)"
},
"title": "Conectarse al dispositivo"
}
}
},
"title": "Atag"
}

View File

@@ -3,6 +3,7 @@
"step": {
"user": {
"data": {
"host": "H\u00f4te",
"port": "Port (10000)"
},
"title": "Se connecter \u00e0 l'appareil"

View File

@@ -0,0 +1,17 @@
{
"config": {
"error": {
"connection_error": "\u0915\u0928\u0947\u0915\u094d\u091f \u0915\u0930\u0928\u0947 \u092e\u0947\u0902 \u0935\u093f\u092b\u0932, \u0915\u0943\u092a\u092f\u093e \u092a\u0941\u0928\u0903 \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902"
},
"step": {
"user": {
"data": {
"host": "Host",
"port": "\u092a\u094b\u0930\u094d\u091f (10000)"
},
"title": "\u0921\u093f\u0935\u093e\u0907\u0938 \u0938\u0947 \u0915\u0928\u0947\u0915\u094d\u091f \u0915\u0930\u0947\u0902"
}
}
},
"title": "A\u091f\u0948\u0917"
}

View File

@@ -0,0 +1,20 @@
{
"config": {
"abort": {
"already_configured": "N\u00ebmmen 1 Atag Apparat kann am Home Assistant dob\u00e4igesat ginn"
},
"error": {
"connection_error": "Feeler beim verbannen, prob\u00e9ier w.e.g. nach emol."
},
"step": {
"user": {
"data": {
"host": "Apparat",
"port": "Port (10000)"
},
"title": "Mam Apparat verbannen"
}
}
},
"title": "Atag"
}

View File

@@ -0,0 +1,20 @@
{
"config": {
"abort": {
"already_configured": "Er kan slechts \u00e9\u00e9n Atag-apparaat worden toegevoegd aan Home Assistant "
},
"error": {
"connection_error": "Verbinding mislukt, probeer het opnieuw"
},
"step": {
"user": {
"data": {
"host": "Host",
"port": "Poort (10000)"
},
"title": "Verbinding maken met het apparaat"
}
}
},
"title": "Atag"
}

View File

@@ -0,0 +1,20 @@
{
"config": {
"abort": {
"already_configured": "Bare en Atag-enhet kan legges til Home Assistant"
},
"error": {
"connection_error": "Klarte ikke \u00e5 koble til, vennligst pr\u00f8v igjen"
},
"step": {
"user": {
"data": {
"host": "Vert",
"port": "Port (10000)"
},
"title": "Koble til enheten"
}
}
},
"title": "Atag "
}

View File

@@ -0,0 +1,20 @@
{
"config": {
"abort": {
"already_configured": "Do Home Assistant mo\u017cna doda\u0107 tylko jedno urz\u0105dzenie Atag"
},
"error": {
"connection_error": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia, spr\u00f3buj ponownie."
},
"step": {
"user": {
"data": {
"host": "Nazwa hosta lub adres IP",
"port": "Port (10000)"
},
"title": "Po\u0142\u0105cz z urz\u0105dzeniem"
}
}
},
"title": "Atag"
}

View File

@@ -0,0 +1,20 @@
{
"config": {
"abort": {
"already_configured": "\u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e."
},
"error": {
"connection_error": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437."
},
"step": {
"user": {
"data": {
"host": "\u0425\u043e\u0441\u0442",
"port": "\u041f\u043e\u0440\u0442 (10000)"
},
"title": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443"
}
}
},
"title": "Atag"
}

View File

@@ -0,0 +1,20 @@
{
"config": {
"abort": {
"already_configured": "\u50c5\u80fd\u65b0\u589e\u4e00\u7d44 Atag \u8a2d\u5099\u81f3 Home Assistant"
},
"error": {
"connection_error": "\u9023\u7dda\u5931\u6557\uff0c\u8acb\u518d\u8a66\u4e00\u6b21"
},
"step": {
"user": {
"data": {
"host": "\u4e3b\u6a5f\u7aef",
"port": "\u901a\u8a0a\u57e0\uff0810000\uff09"
},
"title": "\u9023\u7dda\u81f3\u8a2d\u5099"
}
}
},
"title": "Atag"
}

View File

@@ -14,7 +14,7 @@ from homeassistant.const import (
CONF_PLATFORM,
CONF_ZONE,
EVENT_AUTOMATION_TRIGGERED,
EVENT_HOMEASSISTANT_START,
EVENT_HOMEASSISTANT_STARTED,
SERVICE_RELOAD,
SERVICE_TOGGLE,
SERVICE_TURN_OFF,
@@ -408,7 +408,7 @@ class AutomationEntity(ToggleEntity, RestoreEntity):
# HomeAssistant is starting up
if self.hass.state != CoreState.not_running:
self._async_detach_triggers = await self._async_attach_triggers()
self._async_detach_triggers = await self._async_attach_triggers(False)
self.async_write_ha_state()
return
@@ -418,10 +418,10 @@ class AutomationEntity(ToggleEntity, RestoreEntity):
if not self._is_enabled or self._async_detach_triggers is not None:
return
self._async_detach_triggers = await self._async_attach_triggers()
self._async_detach_triggers = await self._async_attach_triggers(True)
self.hass.bus.async_listen_once(
EVENT_HOMEASSISTANT_START, async_enable_automation
EVENT_HOMEASSISTANT_STARTED, async_enable_automation
)
self.async_write_ha_state()
@@ -438,15 +438,17 @@ class AutomationEntity(ToggleEntity, RestoreEntity):
self.async_write_ha_state()
async def _async_attach_triggers(self):
async def _async_attach_triggers(
self, home_assistant_start: bool
) -> Optional[Callable[[], None]]:
"""Set up the triggers."""
removes = []
info = {"name": self._name}
info = {"name": self._name, "home_assistant_start": home_assistant_start}
for conf in self._trigger_config:
platform = importlib.import_module(f".{conf[CONF_PLATFORM]}", __name__)
remove = await platform.async_attach_trigger(
remove = await platform.async_attach_trigger( # type: ignore
self.hass, conf, self.async_trigger, info
)

View File

@@ -4,7 +4,7 @@ import logging
import voluptuous as vol
from homeassistant.const import CONF_EVENT, CONF_PLATFORM, EVENT_HOMEASSISTANT_STOP
from homeassistant.core import CoreState, callback
from homeassistant.core import callback
# mypy: allow-untyped-defs
@@ -40,7 +40,7 @@ async def async_attach_trigger(hass, config, action, automation_info):
# Automation are enabled while hass is starting up, fire right away
# Check state because a config reload shouldn't trigger it.
if hass.state == CoreState.starting:
if automation_info["home_assistant_start"]:
hass.async_run_job(
action({"trigger": {"platform": "homeassistant", "event": event}})
)

View File

@@ -16,7 +16,7 @@
"step": {
"user": {
"data": {
"host": "Host",
"host": "Nazwa hosta lub adres IP",
"password": "Has\u0142o",
"port": "Port",
"username": "Nazwa u\u017cytkownika"

View File

@@ -25,6 +25,9 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up the available BloomSky weather binary sensors."""
# Default needed in case of discovery
if discovery_info is not None:
return
sensors = config[CONF_MONITORED_CONDITIONS]
bloomsky = hass.data[DOMAIN]

View File

@@ -10,6 +10,9 @@ from . import DOMAIN
def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up access to BloomSky cameras."""
if discovery_info is not None:
return
bloomsky = hass.data[DOMAIN]
for device in bloomsky.devices.values():

View File

@@ -60,6 +60,9 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up the available BloomSky weather sensors."""
# Default needed in case of discovery
if discovery_info is not None:
return
sensors = config[CONF_MONITORED_CONDITIONS]
bloomsky = hass.data[DOMAIN]

View File

@@ -5,7 +5,7 @@ from bravia_tv import BraviaRC
from homeassistant.const import CONF_HOST, CONF_MAC
from .const import DOMAIN
from .const import BRAVIARC, DOMAIN, UNDO_UPDATE_LISTENER
PLATFORMS = ["media_player"]
@@ -20,8 +20,13 @@ async def async_setup_entry(hass, config_entry):
host = config_entry.data[CONF_HOST]
mac = config_entry.data[CONF_MAC]
undo_listener = config_entry.add_update_listener(update_listener)
hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN][config_entry.entry_id] = BraviaRC(host, mac)
hass.data[DOMAIN][config_entry.entry_id] = {
BRAVIARC: BraviaRC(host, mac),
UNDO_UPDATE_LISTENER: undo_listener,
}
for component in PLATFORMS:
hass.async_create_task(
@@ -41,7 +46,15 @@ async def async_unload_entry(hass, config_entry):
]
)
)
hass.data[DOMAIN][config_entry.entry_id][UNDO_UPDATE_LISTENER]()
if unload_ok:
hass.data[DOMAIN].pop(config_entry.entry_id)
return unload_ok
async def update_listener(hass, config_entry):
"""Handle options update."""
await hass.config_entries.async_reload(config_entry.entry_id)

View File

@@ -15,6 +15,7 @@ from .const import ( # pylint:disable=unused-import
ATTR_CID,
ATTR_MAC,
ATTR_MODEL,
BRAVIARC,
CLIENTID_PREFIX,
CONF_IGNORED_SOURCES,
DOMAIN,
@@ -152,7 +153,7 @@ class BraviaTVOptionsFlowHandler(config_entries.OptionsFlow):
async def async_step_init(self, user_input=None):
"""Manage the options."""
self.braviarc = self.hass.data[DOMAIN][self.config_entry.entry_id]
self.braviarc = self.hass.data[DOMAIN][self.config_entry.entry_id][BRAVIARC]
if not self.braviarc.is_connected():
await self.hass.async_add_executor_job(
self.braviarc.connect, self.pin, CLIENTID_PREFIX, NICKNAME,

View File

@@ -6,8 +6,10 @@ ATTR_MODEL = "model"
CONF_IGNORED_SOURCES = "ignored_sources"
BRAVIARC = "braviarc"
BRAVIA_CONFIG_FILE = "bravia.conf"
CLIENTID_PREFIX = "HomeAssistant"
DEFAULT_NAME = f"{ATTR_MANUFACTURER} Bravia TV"
DOMAIN = "braviatv"
NICKNAME = "Home Assistant"
UNDO_UPDATE_LISTENER = "undo_update_listener"

View File

@@ -2,7 +2,7 @@
"domain": "braviatv",
"name": "Sony Bravia TV",
"documentation": "https://www.home-assistant.io/integrations/braviatv",
"requirements": ["bravia-tv==1.0.2"],
"requirements": ["bravia-tv==1.0.3"],
"codeowners": ["@robbiet480", "@bieniu"],
"config_flow": true
}

View File

@@ -30,6 +30,7 @@ from homeassistant.util.json import load_json
from .const import (
ATTR_MANUFACTURER,
BRAVIA_CONFIG_FILE,
BRAVIARC,
CLIENTID_PREFIX,
CONF_IGNORED_SOURCES,
DEFAULT_NAME,
@@ -103,7 +104,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
"model": config_entry.title,
}
braviarc = hass.data[DOMAIN][config_entry.entry_id]
braviarc = hass.data[DOMAIN][config_entry.entry_id][BRAVIARC]
ignored_sources = config_entry.options.get(CONF_IGNORED_SOURCES, [])

View File

@@ -0,0 +1,9 @@
{
"config": {
"step": {
"authorize": {
"description": "\u0938\u094b\u0928\u0940 \u092c\u094d\u0930\u093e\u0935\u093f\u092f\u093e \u091f\u0940\u0935\u0940 \u092a\u0930 \u0926\u093f\u0916\u093e\u092f\u093e \u0917\u092f\u093e \u092a\u093f\u0928 \u0915\u094b\u0921 \u0921\u093e\u0932\u0947\u0902\u0964 \n\n \u092f\u0926\u093f \u092a\u093f\u0928 \u0915\u094b\u0921 \u0928\u0939\u0940\u0902 \u0926\u093f\u0916\u093e\u092f\u093e \u0917\u092f\u093e \u0939\u0948, \u0924\u094b \u0906\u092a\u0915\u094b \u0905\u092a\u0928\u0947 \u091f\u0940\u0935\u0940 \u092a\u0930 \u0939\u094b\u092e \u0905\u0938\u093f\u0938\u094d\u091f\u0947\u0902\u091f \u0915\u094b \u0905\u092a\u0902\u091c\u0940\u0915\u0943\u0924 \u0915\u0930\u0928\u093e \u0939\u094b\u0917\u093e, \u0907\u0938\u0915\u0947 \u0932\u093f\u090f \u091c\u093e\u090f\u0902: \u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938 - > \u0928\u0947\u091f\u0935\u0930\u094d\u0915 - > \u0926\u0942\u0930\u0938\u094d\u0925 \u0921\u093f\u0935\u093e\u0907\u0938 \u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938 - > \u0905\u092a\u0902\u091c\u0940\u0915\u0943\u0924 \u0930\u093f\u092e\u094b\u091f \u0921\u093f\u0935\u093e\u0907\u0938\u0964"
}
}
}
}

View File

@@ -0,0 +1,38 @@
{
"config": {
"abort": {
"already_configured": "\uc774 TV \ub294 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4."
},
"error": {
"cannot_connect": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4. \ud638\uc2a4\ud2b8 \ub610\ub294 PIN \ucf54\ub4dc\uac00 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4.",
"invalid_host": "\ud638\uc2a4\ud2b8 \uc774\ub984 \ub610\ub294 IP \uc8fc\uc18c\uac00 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4.",
"unsupported_model": "\uc774 TV \ubaa8\ub378\uc740 \uc9c0\uc6d0\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4."
},
"step": {
"authorize": {
"data": {
"pin": "PIN \ucf54\ub4dc"
},
"description": "Sony Bravia TV \uc5d0 \ud45c\uc2dc\ub41c PIN \ucf54\ub4dc\ub97c \uc785\ub825\ud574\uc8fc\uc138\uc694.\n\nPIN \ucf54\ub4dc\uac00 \ud45c\uc2dc\ub418\uc9c0 \uc54a\uc73c\uba74 TV \uc5d0\uc11c Home Assistant \ub97c \ub4f1\ub85d \ud574\uc81c\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4. Settings -> Network -> Remote device settings -> Unregister remote device \ub85c \uc774\ub3d9\ud558\uc5ec \ub4f1\ub85d\uc744 \ud574\uc81c\ud574\uc8fc\uc138\uc694.",
"title": "Sony Bravia TV \uc2b9\uc778\ud558\uae30"
},
"user": {
"data": {
"host": "TV \ud638\uc2a4\ud2b8 \uc774\ub984 \ub610\ub294 IP \uc8fc\uc18c"
},
"description": "Sony Bravia TV \ud1b5\ud569 \uad6c\uc131\uc694\uc18c\ub97c \uc124\uc815\ud574\uc8fc\uc138\uc694. \uad6c\uc131\uc5d0 \ubb38\uc81c\uac00 \uc788\ub294 \uacbd\uc6b0 https://www.home-assistant.io/integrations/braviatv \ub97c \ucc38\uace0\ud574\uc8fc\uc138\uc694.\n\nTV \uac00 \ucf1c\uc838 \uc788\ub294\uc9c0 \ud655\uc778\ud574\uc8fc\uc138\uc694.",
"title": "Sony Bravia TV"
}
}
},
"options": {
"step": {
"user": {
"data": {
"ignored_sources": "\ubb34\uc2dc\ub41c \uc785\ub825 \uc18c\uc2a4 \ubaa9\ub85d"
},
"title": "Sony Bravia TV \uc635\uc158"
}
}
}
}

View File

@@ -4,6 +4,7 @@
"already_configured": "D\u00ebse Fernseh ass scho konfigur\u00e9iert."
},
"error": {
"cannot_connect": "Feeler beim verbannen, ong\u00ebltege Numm oder PIN code.",
"invalid_host": "Ong\u00ebltege Numm oder IP Adresse.",
"unsupported_model": "D\u00e4in TV Modell g\u00ebtt net \u00ebnnerst\u00ebtzt."
},
@@ -12,12 +13,14 @@
"data": {
"pin": "PIN Code"
},
"description": "G\u00ebff de PIN code an deen op der Sony Bravia TV ugewise g\u00ebtt.\n\nFalls kee PIN code ugewise g\u00ebtt muss den Home Assistant um Fernseh ofgemellt ginn, um TV: Settings -> Network -> Remote device settings -> Unregister remote device.",
"title": "Sony Bravia TV erlaaben"
},
"user": {
"data": {
"host": "TV Host Numm oder IP Adresse"
},
"description": "Sony Bravia TV Integratioun ariichten. Falls et Problemer mat der Konfiguratioun g\u00ebtt g\u00e9i op:\nhttps://www.home-assistant.io/integrations/braviatv\nStell s\u00e9cher dass d\u00e4in Fernseh un ass.",
"title": "Sony Bravia TV"
}
}

View File

@@ -3,7 +3,7 @@
"name": "Brother Printer",
"documentation": "https://www.home-assistant.io/integrations/brother",
"codeowners": ["@bieniu"],
"requirements": ["brother==0.1.13"],
"requirements": ["brother==0.1.14"],
"zeroconf": ["_printer._tcp.local."],
"config_flow": true,
"quality_scale": "platinum"

View File

@@ -1,7 +1,8 @@
{
"state": {
"_": {
"off": "\u092c\u0902\u0926"
"off": "\u092c\u0902\u0926",
"on": "\u091a\u093e\u0932\u0942"
}
}
}

View File

@@ -1,7 +1,8 @@
{
"state": {
"_": {
"recording": "\u0930\u093f\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917"
"recording": "\u0930\u093f\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917",
"streaming": "\u0938\u094d\u091f\u094d\u0930\u0940\u092e\u093f\u0902\u0917"
}
}
}

View File

@@ -24,10 +24,7 @@ _LOGGER = logging.getLogger(__name__)
def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up the Canary alarms."""
data = hass.data[DATA_CANARY]
devices = []
for location in data.locations:
devices.append(CanaryAlarm(data, location.location_id))
devices = [CanaryAlarm(data, location.location_id) for location in data.locations]
add_entities(devices, True)

View File

@@ -29,6 +29,9 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up the Canary sensors."""
if discovery_info is not None:
return
data = hass.data[DATA_CANARY]
devices = []
@@ -81,7 +84,7 @@ class CanaryCamera(Camera):
async def async_camera_image(self):
"""Return a still image response from the camera."""
self.renew_live_stream_session()
await self.hass.async_add_executor_job(self.renew_live_stream_session)
ffmpeg = ImageFrame(self._ffmpeg.binary, loop=self.hass.loop)
image = await asyncio.shield(

View File

@@ -2,7 +2,7 @@
"config": {
"abort": {
"no_devices_found": "Google \uce90\uc2a4\ud2b8 \uae30\uae30\uac00 \ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \ubc1c\uacac\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.",
"single_instance_allowed": "\ud558\ub098\uc758 Google \uce90\uc2a4\ud2b8\ub9cc \uad6c\uc131 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."
"single_instance_allowed": "\ud558\ub098\uc758 Google \uce90\uc2a4\ud2b8\ub9cc \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."
},
"step": {
"confirm": {

View File

@@ -16,7 +16,12 @@
},
"state": {
"_": {
"heat": "Varme"
"auto": "Auto",
"cool": "Kj\u00f8le",
"dry": "T\u00f8rr",
"fan_only": "Kun vifte",
"heat": "Varme",
"heat_cool": "Varme/kj\u00f8lig"
}
},
"title": "Klima"

View File

@@ -271,15 +271,25 @@ class AlexaConfig(alexa_config.AbstractConfig):
if not self.enabled or not self._cloud.is_logged_in:
return
action = event.data["action"]
entity_id = event.data["entity_id"]
if not self.should_expose(entity_id):
return
action = event.data["action"]
to_update = []
to_remove = []
if action == "create" and self.should_expose(entity_id):
if action == "create":
to_update.append(entity_id)
elif action == "remove" and self.should_expose(entity_id):
elif action == "remove":
to_remove.append(entity_id)
elif action == "update" and bool(
set(event.data["changes"]) & entity_registry.ENTITY_DESCRIBING_ATTRIBUTES
):
to_update.append(entity_id)
if "old_entity_id" in event.data:
to_remove.append(event.data["old_entity_id"])
try:
await self._sync_helper(to_update, to_remove)

View File

@@ -6,7 +6,12 @@ from hass_nabucasa import cloud_api
from hass_nabucasa.google_report_state import ErrorResponse
from homeassistant.components.google_assistant.helpers import AbstractConfig
from homeassistant.const import CLOUD_NEVER_EXPOSED_ENTITIES, HTTP_OK
from homeassistant.const import (
CLOUD_NEVER_EXPOSED_ENTITIES,
EVENT_HOMEASSISTANT_STARTED,
HTTP_OK,
)
from homeassistant.core import CoreState, callback
from homeassistant.helpers import entity_registry
from .const import (
@@ -32,12 +37,7 @@ class CloudGoogleConfig(AbstractConfig):
self._cloud = cloud
self._cur_entity_prefs = self._prefs.google_entity_configs
self._sync_entities_lock = asyncio.Lock()
prefs.async_listen_updates(self._async_prefs_updated)
hass.bus.async_listen(
entity_registry.EVENT_ENTITY_REGISTRY_UPDATED,
self._handle_entity_registry_updated,
)
self._sync_on_started = False
@property
def enabled(self):
@@ -83,6 +83,13 @@ class CloudGoogleConfig(AbstractConfig):
# Remove bad data that was there until 0.103.6 - Jan 6, 2020
self._store.pop_agent_user_id(self._user)
self._prefs.async_listen_updates(self._async_prefs_updated)
self.hass.bus.async_listen(
entity_registry.EVENT_ENTITY_REGISTRY_UPDATED,
self._handle_entity_registry_updated,
)
def should_expose(self, state):
"""If a state object should be exposed."""
return self._should_expose_entity_id(state.entity_id)
@@ -160,8 +167,29 @@ class CloudGoogleConfig(AbstractConfig):
if not self.enabled or not self._cloud.is_logged_in:
return
# Only consider entity registry updates if info relevant for Google has changed
if event.data["action"] == "update" and not bool(
set(event.data["changes"]) & entity_registry.ENTITY_DESCRIBING_ATTRIBUTES
):
return
entity_id = event.data["entity_id"]
# Schedule a sync if a change was made to an entity that Google knows about
if self._should_expose_entity_id(entity_id):
if not self._should_expose_entity_id(entity_id):
return
if self.hass.state == CoreState.running:
self.async_schedule_google_sync_all()
return
if self._sync_on_started:
return
self._sync_on_started = True
@callback
async def sync_google(_):
"""Sync entities to Google."""
await self.async_sync_entities_all()
self.hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STARTED, sync_google)

View File

@@ -2,7 +2,7 @@
"domain": "cloud",
"name": "Home Assistant Cloud",
"documentation": "https://www.home-assistant.io/integrations/cloud",
"requirements": ["hass-nabucasa==0.34.1"],
"requirements": ["hass-nabucasa==0.34.2"],
"dependencies": ["http", "webhook", "alexa"],
"after_dependencies": ["google_assistant"],
"codeowners": ["@home-assistant/cloud"]

View File

@@ -1,3 +1,9 @@
{
"state": {
"_": {
"configure": "Konfigurer",
"configured": "Konfigurert"
}
},
"title": "Konfigurator"
}

View File

@@ -12,7 +12,7 @@
"fan_only": "Obs\u0142uga trybu \"tylko wentylator\"",
"heat": "Obs\u0142uga trybu grzania",
"heat_cool": "Obs\u0142uga automatycznego trybu grzanie/ch\u0142odzenie",
"host": "Host",
"host": "Nazwa hosta lub adres IP",
"off": "Mo\u017ce by\u0107 wy\u0142\u0105czone"
},
"title": "Skonfiguruj szczeg\u00f3\u0142y po\u0142\u0105czenia CoolMasterNet."

View File

@@ -0,0 +1,15 @@
{
"config": {
"abort": {
"already_configured": "Dit land is al geconfigureerd."
},
"step": {
"user": {
"data": {
"country": "Land"
},
"title": "Kies een land om te monitoren"
}
}
}
}

View File

@@ -25,5 +25,12 @@
"tilt_position": "{entity_name} endringer i vippeposisjon"
}
},
"state": {
"_": {
"closing": "Lukker",
"opening": "\u00c5pner",
"stopped": "Stoppet"
}
},
"title": "Dekke"
}

View File

@@ -8,7 +8,7 @@
"step": {
"user": {
"data": {
"host": "Host"
"host": "Nazwa hosta lub adres IP"
},
"description": "Wprowad\u017a adres IP Daikin AC.",
"title": "Konfiguracja Daikin AC"

View File

@@ -29,6 +29,12 @@
"host": "H\u00f4te",
"port": "Port"
}
},
"manual_input": {
"data": {
"host": "H\u00f4te",
"port": "Port"
}
}
}
},

View File

@@ -29,12 +29,19 @@
"host": "\ud638\uc2a4\ud2b8",
"port": "\ud3ec\ud2b8"
}
},
"manual_input": {
"data": {
"host": "\ud638\uc2a4\ud2b8",
"port": "\ud3ec\ud2b8"
}
}
}
},
"device_automation": {
"trigger_subtype": {
"both_buttons": "\ub450 \uac1c",
"bottom_buttons": "\ud558\ub2e8 \ubc84\ud2bc",
"button_1": "\uccab \ubc88\uc9f8",
"button_2": "\ub450 \ubc88\uc9f8",
"button_3": "\uc138 \ubc88\uc9f8",
@@ -51,6 +58,7 @@
"side_4": "\uba74 4",
"side_5": "\uba74 5",
"side_6": "\uba74 6",
"top_buttons": "\uc0c1\ub2e8 \ubc84\ud2bc",
"turn_off": "\ub044\uae30",
"turn_on": "\ucf1c\uae30"
},

View File

@@ -48,6 +48,7 @@
"device_automation": {
"trigger_subtype": {
"both_buttons": "B\u00e9id Kn\u00e4ppchen",
"bottom_buttons": "\u00cbnnescht Kn\u00e4ppchen",
"button_1": "\u00c9ischte Kn\u00e4ppchen",
"button_2": "Zweete Kn\u00e4ppchen",
"button_3": "Dr\u00ebtte Kn\u00e4ppchen",
@@ -64,6 +65,7 @@
"side_4": "S\u00e4it 4",
"side_5": "S\u00e4it 5",
"side_6": "S\u00e4it 6",
"top_buttons": "Iewescht Kn\u00e4ppchen",
"turn_off": "Ausschalten",
"turn_on": "Uschalten"
},

View File

@@ -34,7 +34,14 @@
"data": {
"host": "Host",
"port": "Poort"
}
},
"title": "Configureer deCONZ gateway"
},
"user": {
"data": {
"host": "Selecteer gevonden deCONZ gateway"
},
"title": "Selecteer DeCONZ gateway"
}
}
},
@@ -97,7 +104,8 @@
"allow_clip_sensor": "DeCONZ CLIP sensoren toestaan",
"allow_deconz_groups": "Sta deCONZ-lichtgroepen toe"
},
"description": "Configureer de zichtbaarheid van deCONZ-apparaattypen"
"description": "Configureer de zichtbaarheid van deCONZ-apparaattypen",
"title": "deCONZ opties"
}
}
}

View File

@@ -26,15 +26,29 @@
},
"manual_confirm": {
"data": {
"host": "Host",
"host": "Nazwa hosta lub adres IP",
"port": "Port"
}
},
"manual_input": {
"data": {
"host": "Nazwa hosta lub adres IP",
"port": "Port"
},
"title": "Konfiguracja bramki deCONZ"
},
"user": {
"data": {
"host": "Wybierz znalezion\u0105 bramk\u0119 deCONZ"
},
"title": "Wybierz bramk\u0119 deCONZ"
}
}
},
"device_automation": {
"trigger_subtype": {
"both_buttons": "oba przyciski",
"bottom_buttons": "Dolne przyciski",
"button_1": "pierwszy przycisk",
"button_2": "drugi przycisk",
"button_3": "trzeci przycisk",
@@ -51,6 +65,7 @@
"side_4": "strona 4",
"side_5": "strona 5",
"side_6": "strona 6",
"top_buttons": "G\u00f3rne przyciski",
"turn_off": "nast\u0105pi wy\u0142\u0105czenie",
"turn_on": "nast\u0105pi w\u0142\u0105czenie"
},

View File

@@ -4,7 +4,7 @@
"init": {
"data": {
"one": "Een",
"other": "Aner"
"other": "M\u00e9i"
}
},
"options_1": {

View File

@@ -5,7 +5,7 @@ from typing import Any, Callable, Iterable, List
from directv import DIRECTV, DIRECTVError
from homeassistant.components.remote import RemoteDevice
from homeassistant.components.remote import ATTR_NUM_REPEATS, RemoteDevice
from homeassistant.config_entries import ConfigEntry
from homeassistant.helpers.typing import HomeAssistantType
@@ -95,12 +95,15 @@ class DIRECTVRemote(DIRECTVEntity, RemoteDevice):
blue, chanup, chandown, prev, 0, 1, 2, 3, 4, 5,
6, 7, 8, 9, dash, enter
"""
for single_command in command:
try:
await self.dtv.remote(single_command, self._address)
except DIRECTVError:
_LOGGER.exception(
"Sending command %s to device %s failed",
single_command,
self._device_id,
)
num_repeats = kwargs[ATTR_NUM_REPEATS]
for _ in range(num_repeats):
for single_command in command:
try:
await self.dtv.remote(single_command, self._address)
except DIRECTVError:
_LOGGER.exception(
"Sending command %s to device %s failed",
single_command,
self._device_id,
)

View File

@@ -37,7 +37,6 @@ SERVICE_KONNECTED = "konnected"
SERVICE_MOBILE_APP = "hass_mobile_app"
SERVICE_NETGEAR = "netgear_router"
SERVICE_OCTOPRINT = "octoprint"
SERVICE_ROKU = "roku"
SERVICE_SABNZBD = "sabnzbd"
SERVICE_SAMSUNG_PRINTER = "samsung_printer"
SERVICE_TELLDUSLIVE = "tellstick"
@@ -59,7 +58,6 @@ SERVICE_HANDLERS = {
SERVICE_HASSIO: ("hassio", None),
SERVICE_APPLE_TV: ("apple_tv", None),
SERVICE_ENIGMA2: ("media_player", "enigma2"),
SERVICE_ROKU: ("roku", None),
SERVICE_WINK: ("wink", None),
SERVICE_XIAOMI_GW: ("xiaomi_aqara", None),
SERVICE_SABNZBD: ("sabnzbd", None),
@@ -71,7 +69,6 @@ SERVICE_HANDLERS = {
"panasonic_viera": ("media_player", "panasonic_viera"),
"yamaha": ("media_player", "yamaha"),
"logitech_mediaserver": ("media_player", "squeezebox"),
"directv": ("media_player", "directv"),
"denonavr": ("media_player", "denonavr"),
"frontier_silicon": ("media_player", "frontier_silicon"),
"openhome": ("media_player", "openhome"),

View File

@@ -1,7 +1,8 @@
{
"config": {
"abort": {
"already_configured": "Ce DoorBird est d\u00e9j\u00e0 configur\u00e9"
"already_configured": "Ce DoorBird est d\u00e9j\u00e0 configur\u00e9",
"not_doorbird_device": "Cet appareil n'est pas un DoorBird"
},
"error": {
"cannot_connect": "Impossible de se connecter, veuillez r\u00e9essayer",

View File

@@ -0,0 +1,36 @@
{
"config": {
"abort": {
"already_configured": "BoorBird jest ju\u017c skonfigurowany.",
"link_local_address": "Po\u0142\u0105czenie lokalnego adresu nie jest obs\u0142ugiwane",
"not_doorbird_device": "To urz\u0105dzenie nie jest urz\u0105dzeniem DoorBird"
},
"error": {
"cannot_connect": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia, spr\u00f3buj ponownie.",
"invalid_auth": "Niepoprawne uwierzytelnienie.",
"unknown": "Niespodziewany b\u0142\u0105d."
},
"flow_title": "DoorBird {name} ({host})",
"step": {
"user": {
"data": {
"host": "Nazwa hosta lub adres IP",
"name": "Nazwa urz\u0105dzenia",
"password": "Has\u0142o",
"username": "Nazwa u\u017cytkownika"
},
"title": "Po\u0142\u0105czenie z DoorBird"
}
}
},
"options": {
"step": {
"init": {
"data": {
"events": "Lista wydarze\u0144 oddzielona przecinkami"
},
"description": "Dodaj nazwy wydarze\u0144 oddzielonych przecinkami, kt\u00f3re chcesz \u015bledzi\u0107. Po wprowadzeniu ich tutaj u\u017cyj aplikacji DoorBird, aby przypisa\u0107 je do okre\u015blonych zdarze\u0144. Zapoznaj si\u0119 z dokumentacj\u0105 na stronie https://www.home-assistant.io/integrations/doorbird/#events.\nPrzyk\u0142ad: nacisnienie_przycisku, ruch"
}
}
}
}

View File

@@ -1,5 +1,9 @@
{
"config": {
"abort": {
"address_already_configured": "Un ElkM1 avec cette adresse est d\u00e9j\u00e0 configur\u00e9",
"already_configured": "Un ElkM1 avec ce pr\u00e9fixe est d\u00e9j\u00e0 configur\u00e9"
},
"error": {
"cannot_connect": "Impossible de se connecter, veuillez r\u00e9essayer",
"invalid_auth": "Authentification non valide",

View File

@@ -0,0 +1,27 @@
{
"config": {
"abort": {
"address_already_configured": "ElkM1 z tym adresem jest ju\u017c skonfigurowany.",
"already_configured": "ElkM1 z tym prefiksem jest ju\u017c skonfigurowany."
},
"error": {
"cannot_connect": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia, spr\u00f3buj ponownie.",
"invalid_auth": "Niepoprawne uwierzytelnienie.",
"unknown": "Niespodziewany b\u0142\u0105d."
},
"step": {
"user": {
"data": {
"address": "Adres IP, domena lub port szeregowy w przypadku po\u0142\u0105czenia szeregowego.",
"password": "Has\u0142o (tylko bezpieczne).",
"prefix": "Unikatowy prefiks (pozostaw pusty, je\u015bli masz tylko jeden ElkM1).",
"protocol": "Protok\u00f3\u0142",
"temperature_unit": "Jednostka temperatury u\u017cywanej przez ElkM1.",
"username": "Nazwa u\u017cytkownika (tylko bezpieczne)"
},
"description": "Adres musi by\u0107 w postaci 'adres[:port]' dla tryb\u00f3w 'zabezpieczony' i 'niezabezpieczony'. Przyk\u0142ad: '192.168.1.1'. Port jest opcjonalny i domy\u015blnie ustawiony na 2101 dla po\u0142\u0105cze\u0144 'niezabezpieczonych' i 2601 dla 'zabezpieczonych'. W przypadku protoko\u0142u szeregowego adres musi by\u0107 w formie 'tty[:baudrate]'. Przyk\u0142ad: '/dev/ttyS1'. Warto\u015b\u0107 transmisji jest opcjonalna i domy\u015blnie wynosi 115200.",
"title": "Pod\u0142\u0105czenie do sterownika Elk-M1"
}
}
}
}

View File

@@ -17,5 +17,5 @@
}
}
},
"title": "EmulatedRoku"
"title": "Emul\u00e9ierte Roku"
}

View File

@@ -8,7 +8,7 @@
"data": {
"advertise_ip": "IP rozg\u0142aszania",
"advertise_port": "Port rozg\u0142aszania",
"host_ip": "IP hosta",
"host_ip": "Adres IP",
"listen_port": "Port nas\u0142uchu",
"name": "Nazwa",
"upnp_bind_multicast": "Powi\u0105\u017c multicast (prawda/fa\u0142sz)"

View File

@@ -27,7 +27,7 @@
"port": "Port"
},
"description": "Gitt Verbindungs Informatioune vun \u00e4rem [ESPHome](https://esphomelib.com/) an.",
"title": "[%key:component::esphome::title%]"
"title": "ESPHome"
}
}
}

View File

@@ -23,7 +23,7 @@
},
"user": {
"data": {
"host": "Host",
"host": "Nazwa hosta lub adres IP",
"port": "Port"
},
"description": "Wprowad\u017a ustawienia po\u0142\u0105czenia [ESPHome](https://esphomelib.com/) w\u0119z\u0142a.",

View File

@@ -10,6 +10,10 @@
},
"step": {
"user": {
"data": {
"password": "Mot de passe",
"username": "Nom d'utilisateur"
},
"description": "Pour acc\u00e9der \u00e0 l'API personnel Flume, vous devez demander un \"Client ID\" et un \"Client Secret\" \u00e0 l'adresse https://portal.flumetech.com/settings#token",
"title": "Se connecter \u00e0 votre compte Flume"
}

View File

@@ -0,0 +1,24 @@
{
"config": {
"abort": {
"already_configured": "\uc774 \uacc4\uc815\uc740 \uc774\ubbf8 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4."
},
"error": {
"cannot_connect": "\uc5f0\uacb0\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc2dc\ub3c4\ud574\uc8fc\uc138\uc694.",
"invalid_auth": "\uc778\uc99d\uc774 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4",
"unknown": "\uc608\uc0c1\uce58 \ubabb\ud55c \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4"
},
"step": {
"user": {
"data": {
"client_id": "\ud074\ub77c\uc774\uc5b8\ud2b8 ID",
"client_secret": "\ud074\ub77c\uc774\uc5b8\ud2b8 \uc2dc\ud06c\ub9bf",
"password": "\ube44\ubc00\ubc88\ud638",
"username": "\uc0ac\uc6a9\uc790 \uc774\ub984"
},
"description": "Flume Personal API \uc5d0 \uc561\uc138\uc2a4 \ud558\ub824\uba74 https://portal.flumetech.com/settings#token \uc5d0\uc11c '\ud074\ub77c\uc774\uc5b8\ud2b8 ID'\ubc0f '\ud074\ub77c\uc774\uc5b8\ud2b8 \uc2dc\ud06c\ub9bf'\uc744 \uc694\uccad\ud574\uc57c \ud569\ub2c8\ub2e4.",
"title": "Flume \uacc4\uc815\uc5d0 \uc5f0\uacb0\ud558\uae30"
}
}
}
}

View File

@@ -15,7 +15,9 @@
"client_secret": "Client Schl\u00ebssel",
"password": "Passwuert",
"username": "Benotzernumm"
}
},
"description": "Fir k\u00ebnnen op Flume Personal API z'acc\u00e9d\u00e9ieren muss du eng 'Client ID' an eng 'Client Secret' op https://portal.flumetech.com/settings#token ufroen.",
"title": "Verbann dech mat dengem Flume Kont."
}
}
}

View File

@@ -0,0 +1,24 @@
{
"config": {
"abort": {
"already_configured": "To konto jest ju\u017c skonfigurowane."
},
"error": {
"cannot_connect": "Nie mo\u017cna nawi\u0105za\u0107 po\u0142\u0105czenia, spr\u00f3buj ponownie.",
"invalid_auth": "Niepoprawne uwierzytelnienie.",
"unknown": "Niespodziewany b\u0142\u0105d."
},
"step": {
"user": {
"data": {
"client_id": "Identyfikator klienta",
"client_secret": "Has\u0142o klienta",
"password": "Has\u0142o",
"username": "Nazwa u\u017cytkownika"
},
"description": "Aby uzyska\u0107 dost\u0119p do API Flume, musisz poprosi\u0107 o 'ID klienta\u201d i 'klucz tajny klienta' na stronie https://portal.flumetech.com/settings#token",
"title": "Po\u0142\u0105cz z kontem Flume"
}
}
}
}

View File

@@ -131,15 +131,6 @@ class FluNearYouData:
self.latitude = latitude
self.longitude = longitude
self._api_coros = {
CATEGORY_CDC_REPORT: self._client.cdc_reports.status_by_coordinates(
latitude, longitude
),
CATEGORY_USER_REPORT: self._client.user_reports.status_by_coordinates(
latitude, longitude
),
}
self._api_category_count = {
CATEGORY_CDC_REPORT: 0,
CATEGORY_USER_REPORT: 0,
@@ -155,8 +146,17 @@ class FluNearYouData:
if self._api_category_count[api_category] == 0:
return
if api_category == CATEGORY_CDC_REPORT:
api_coro = self._client.cdc_reports.status_by_coordinates(
self.latitude, self.longitude
)
else:
api_coro = self._client.user_reports.status_by_coordinates(
self.latitude, self.longitude
)
try:
self.data[api_category] = await self._api_coros[api_category]
self.data[api_category] = await api_coro
except FluNearYouError as err:
LOGGER.error("Unable to get %s data: %s", api_category, err)
self.data[api_category] = None
@@ -200,7 +200,7 @@ class FluNearYouData:
"""Update Flu Near You data."""
tasks = [
self._async_get_data_from_api(api_category)
for api_category in self._api_coros
for api_category in self._api_category_count
]
await asyncio.gather(*tasks)

View File

@@ -0,0 +1,18 @@
{
"config": {
"abort": {
"already_configured": "Wsp\u00f3\u0142rz\u0119dne s\u0105 ju\u017c zarejestrowane."
},
"error": {
"general_error": "Nieznany b\u0142\u0105d"
},
"step": {
"user": {
"data": {
"latitude": "Szeroko\u015b\u0107 geograficzna",
"longitude": "D\u0142ugo\u015b\u0107 geograficzna"
}
}
}
}
}

View File

@@ -15,7 +15,7 @@
},
"user": {
"data": {
"host": "Host",
"host": "Nazwa hosta lub adres IP",
"port": "Port"
},
"title": "Freebox"

View File

@@ -2,10 +2,15 @@
from urllib.parse import urlparse
from pyfritzhome import Fritzhome, LoginError
from requests.exceptions import HTTPError
import voluptuous as vol
from homeassistant import config_entries
from homeassistant.components.ssdp import ATTR_SSDP_LOCATION, ATTR_UPNP_FRIENDLY_NAME
from homeassistant.components.ssdp import (
ATTR_SSDP_LOCATION,
ATTR_UPNP_FRIENDLY_NAME,
ATTR_UPNP_UDN,
)
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME
# pylint:disable=unused-import
@@ -28,6 +33,7 @@ DATA_SCHEMA_CONFIRM = vol.Schema(
RESULT_AUTH_FAILED = "auth_failed"
RESULT_NOT_FOUND = "not_found"
RESULT_NOT_SUPPORTED = "not_supported"
RESULT_SUCCESS = "success"
@@ -42,8 +48,6 @@ class FritzboxConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
def __init__(self):
"""Initialize flow."""
self._host = None
self._manufacturer = None
self._model = None
self._name = None
self._password = None
self._username = None
@@ -65,12 +69,15 @@ class FritzboxConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
)
try:
fritzbox.login()
fritzbox.get_device_elements()
fritzbox.logout()
return RESULT_SUCCESS
except OSError:
return RESULT_NOT_FOUND
except LoginError:
return RESULT_AUTH_FAILED
except HTTPError:
return RESULT_NOT_SUPPORTED
except OSError:
return RESULT_NOT_FOUND
async def async_step_import(self, user_input=None):
"""Handle configuration by yaml file."""
@@ -84,10 +91,6 @@ class FritzboxConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
for entry in self.hass.config_entries.async_entries(DOMAIN):
if entry.data[CONF_HOST] == user_input[CONF_HOST]:
if entry.data != user_input:
self.hass.config_entries.async_update_entry(
entry, data=user_input
)
return self.async_abort(reason="already_configured")
self._host = user_input[CONF_HOST]
@@ -112,18 +115,26 @@ class FritzboxConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
host = urlparse(user_input[ATTR_SSDP_LOCATION]).hostname
self.context[CONF_HOST] = host
uuid = user_input.get(ATTR_UPNP_UDN)
if uuid:
if uuid.startswith("uuid:"):
uuid = uuid[5:]
await self.async_set_unique_id(uuid)
self._abort_if_unique_id_configured({CONF_HOST: host})
for progress in self._async_in_progress():
if progress.get("context", {}).get(CONF_HOST) == host:
return self.async_abort(reason="already_in_progress")
# update old and user-configured config entries
for entry in self.hass.config_entries.async_entries(DOMAIN):
if entry.data[CONF_HOST] == host:
if entry.data != user_input:
self.hass.config_entries.async_update_entry(entry, data=user_input)
if uuid and not entry.unique_id:
self.hass.config_entries.async_update_entry(entry, unique_id=uuid)
return self.async_abort(reason="already_configured")
self._host = host
self._name = user_input[ATTR_UPNP_FRIENDLY_NAME]
self._name = user_input.get(ATTR_UPNP_FRIENDLY_NAME) or host
self.context["title_placeholders"] = {"name": self._name}
return await self.async_step_confirm()

View File

@@ -21,7 +21,8 @@
"abort": {
"already_in_progress": "AVM FRITZ!Box configuration is already in progress.",
"already_configured": "This AVM FRITZ!Box is already configured.",
"not_found": "No supported AVM FRITZ!Box found on the network."
"not_found": "No supported AVM FRITZ!Box found on the network.",
"not_supported": "Connected to AVM FRITZ!Box but it's unable to control Smart Home devices."
},
"error": {
"auth_failed": "Username and/or password are incorrect."

View File

@@ -0,0 +1,32 @@
{
"config": {
"abort": {
"already_configured": "Diese AVM FRITZ! Box ist bereits konfiguriert.",
"already_in_progress": "Die Konfiguration der AVM FRITZ! Box ist bereits in Bearbeitung.",
"not_found": "Keine unterst\u00fctzte AVM FRITZ! Box im Netzwerk gefunden."
},
"error": {
"auth_failed": "Benutzername und/oder Passwort sind falsch."
},
"flow_title": "AVM FRITZ! Box: {name}",
"step": {
"confirm": {
"data": {
"password": "Passwort",
"username": "Benutzername"
},
"description": "M\u00f6chten Sie {name} einrichten?",
"title": "AVM FRITZ! Box"
},
"user": {
"data": {
"host": "Host oder IP-Adresse",
"password": "Passwort",
"username": "Benutzername"
},
"description": "Geben Sie Ihre AVM FRITZ! Box-Informationen ein.",
"title": "AVM FRITZ! Box"
}
}
}
}

View File

@@ -3,7 +3,8 @@
"abort": {
"already_configured": "This AVM FRITZ!Box is already configured.",
"already_in_progress": "AVM FRITZ!Box configuration is already in progress.",
"not_found": "No supported AVM FRITZ!Box found on the network."
"not_found": "No supported AVM FRITZ!Box found on the network.",
"not_supported": "Connected to AVM FRITZ!Box but it's unable to control Smart Home devices."
},
"error": {
"auth_failed": "Username and/or password are incorrect."

View File

@@ -3,7 +3,8 @@
"abort": {
"already_configured": "Este AVM FRITZ!Box ya est\u00e1 configurado.",
"already_in_progress": "La configuraci\u00f3n del AVM FRITZ!Box ya est\u00e1 en progreso.",
"not_found": "No se encontr\u00f3 ning\u00fan AVM FRITZ!Box compatible en la red."
"not_found": "No se encontr\u00f3 ning\u00fan AVM FRITZ!Box compatible en la red.",
"not_supported": "Conectado a AVM FRITZ!Box pero no es capaz de controlar dispositivos Smart Home."
},
"error": {
"auth_failed": "Usuario y/o contrase\u00f1a incorrectos."

View File

@@ -8,10 +8,12 @@
"data": {
"password": "Mot de passe",
"username": "Nom d'utilisateur"
}
},
"description": "Voulez-vous configurer {name} ?"
},
"user": {
"data": {
"host": "H\u00f4te ou adresse IP",
"password": "Mot de passe",
"username": "Nom d'utilisateur"
}

View File

@@ -0,0 +1,7 @@
{
"config": {
"abort": {
"not_found": "\u0915\u094b\u0908 \u0938\u092e\u0930\u094d\u0925\u093f\u0924 AVM FRITZ! \u092c\u0949\u0915\u094d\u0938 \u0928\u0947\u091f\u0935\u0930\u094d\u0915 \u092a\u0930 \u0928\u0939\u0940\u0902 \u092e\u093f\u0932\u093e\u0964"
}
}
}

View File

@@ -0,0 +1,32 @@
{
"config": {
"abort": {
"already_configured": "Questo AVM FRITZ!Box \u00e8 gi\u00e0 configurato.",
"already_in_progress": "La configurazione di AVM FRITZ!Box \u00e8 gi\u00e0 in corso.",
"not_found": "Nessun AVM FRITZ!Box supportato trovato sulla rete."
},
"error": {
"auth_failed": "Nome utente e/o password non sono corretti."
},
"flow_title": "AVM FRITZ!Box: {name}",
"step": {
"confirm": {
"data": {
"password": "Password",
"username": "Nome utente"
},
"description": "Vuoi impostare {name}?",
"title": "AVM FRITZ!Box"
},
"user": {
"data": {
"host": "Host o indirizzo IP",
"password": "Password",
"username": "Nome utente"
},
"description": "Inserisci le informazioni del tuo AVM FRITZ!Box .",
"title": "AVM FRITZ!Box"
}
}
}
}

View File

@@ -1,20 +1,31 @@
{
"config": {
"abort": {
"already_configured": "Deze AVM FRITZ!Box is al geconfigureerd.",
"already_in_progress": "AVM FRITZ!Box configuratie is al bezig.",
"not_found": "Geen ondersteunde AVM FRITZ!Box gevonden op het netwerk."
},
"error": {
"auth_failed": "Ongeldige gebruikersnaam of wachtwoord"
},
"flow_title": "AVM FRITZ!Box: {name}",
"step": {
"confirm": {
"data": {
"password": "Wachtwoord",
"username": "Gebruikersnaam"
}
},
"description": "Wilt u {name} instellen?",
"title": "AVM FRITZ!Box"
},
"user": {
"data": {
"host": "Host- of IP-adres",
"password": "Wachtwoord",
"username": "Gebruikersnaam"
}
},
"description": "Voer uw AVM FRITZ!Box informatie in.",
"title": "AVM FRITZ!Box"
}
}
}

View File

@@ -8,7 +8,7 @@
"error": {
"auth_failed": "Brukernavn og/eller passord er feil."
},
"flow_title": "AVM FRITZ!Box: {name}",
"flow_title": "",
"step": {
"confirm": {
"data": {
@@ -16,7 +16,7 @@
"username": "Brukernavn"
},
"description": "Vil du sette opp {name} ?",
"title": "AVM FRITZ!Box"
"title": ""
},
"user": {
"data": {
@@ -25,7 +25,7 @@
"username": "Brukernavn"
},
"description": "Skriv inn AVM FRITZ!Box informasjonen.",
"title": "AVM FRITZ!Box"
"title": ""
}
}
}

View File

@@ -0,0 +1,33 @@
{
"config": {
"abort": {
"already_configured": "Ten AVM FRITZ!Box jest ju\u017c skonfigurowany.",
"already_in_progress": "Konfiguracja AVM FRITZ!Box jest ju\u017c w toku.",
"not_found": "W sieci nie znaleziono obs\u0142ugiwanego urz\u0105dzenia AVM FRITZ!Box.",
"not_supported": "Po\u0142\u0105czony z AVM FRITZ! Box, ale nie jest w stanie kontrolowa\u0107 urz\u0105dze\u0144 Smart Home."
},
"error": {
"auth_failed": "Nazwa u\u017cytkownika i/lub has\u0142o s\u0105 nieprawid\u0142owe."
},
"flow_title": "AVM FRITZ!Box: {name}",
"step": {
"confirm": {
"data": {
"password": "Has\u0142o",
"username": "Nazwa u\u017cytkownika"
},
"description": "Czy chcesz skonfigurowa\u0107 {name}?",
"title": "AVM FRITZ! Box"
},
"user": {
"data": {
"host": "Nazwa hosta lub adres IP",
"password": "Has\u0142o",
"username": "Nazwa u\u017cytkownika"
},
"description": "Wprowad\u017a informacje o urz\u0105dzeniu AVM FRITZ! Box.",
"title": "AVM FRITZ! Box"
}
}
}
}

View File

@@ -19,7 +19,7 @@ from homeassistant.core import callback
from homeassistant.helpers import service
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.translation import async_get_translations
from homeassistant.loader import bind_hass
from homeassistant.loader import async_get_integration, bind_hass
from .storage import async_setup_frontend_storage
@@ -248,6 +248,7 @@ async def async_setup(hass, config):
hass.components.websocket_api.async_register_command(websocket_get_panels)
hass.components.websocket_api.async_register_command(websocket_get_themes)
hass.components.websocket_api.async_register_command(websocket_get_translations)
hass.components.websocket_api.async_register_command(websocket_get_version)
hass.http.register_view(ManifestJSONView)
conf = config.get(DOMAIN, {})
@@ -486,10 +487,7 @@ class ManifestJSONView(HomeAssistantView):
@callback
@websocket_api.websocket_command({"type": "get_panels"})
def websocket_get_panels(hass, connection, msg):
"""Handle get panels command.
Async friendly.
"""
"""Handle get panels command."""
user_is_admin = connection.user.is_admin
panels = {
panel_key: panel.to_response()
@@ -503,10 +501,7 @@ def websocket_get_panels(hass, connection, msg):
@callback
@websocket_api.websocket_command({"type": "frontend/get_themes"})
def websocket_get_themes(hass, connection, msg):
"""Handle get themes command.
Async friendly.
"""
"""Handle get themes command."""
if hass.config.safe_mode:
connection.send_message(
websocket_api.result_message(
@@ -546,10 +541,7 @@ def websocket_get_themes(hass, connection, msg):
)
@websocket_api.async_response
async def websocket_get_translations(hass, connection, msg):
"""Handle get translations command.
Async friendly.
"""
"""Handle get translations command."""
resources = await async_get_translations(
hass,
msg["language"],
@@ -560,3 +552,21 @@ async def websocket_get_translations(hass, connection, msg):
connection.send_message(
websocket_api.result_message(msg["id"], {"resources": resources})
)
@websocket_api.websocket_command({"type": "frontend/get_version"})
@websocket_api.async_response
async def websocket_get_version(hass, connection, msg):
"""Handle get version command."""
integration = await async_get_integration(hass, "frontend")
frontend = None
for req in integration.requirements:
if req.startswith("home-assistant-frontend=="):
frontend = req.split("==", 1)[1]
if frontend is None:
connection.send_error(msg["id"], "unknown_version", "Version not found")
else:
connection.send_result(msg["id"], {"version": frontend})

View File

@@ -2,7 +2,7 @@
"domain": "frontend",
"name": "Home Assistant Frontend",
"documentation": "https://www.home-assistant.io/integrations/frontend",
"requirements": ["home-assistant-frontend==20200422.0"],
"requirements": ["home-assistant-frontend==20200427.2"],
"dependencies": [
"api",
"auth",

View File

@@ -86,6 +86,7 @@ class GarminConnectData:
def __init__(self, hass, client):
"""Initialize."""
self.hass = hass
self.client = client
self.data = None
@@ -95,7 +96,9 @@ class GarminConnectData:
today = date.today()
try:
self.data = self.client.get_stats_and_body(today.isoformat())
self.data = await self.hass.async_add_executor_job(
self.client.get_stats_and_body, today.isoformat()
)
except (
GarminConnectAuthenticationError,
GarminConnectTooManyRequestsError,

View File

@@ -325,7 +325,7 @@ class GenericThermostat(ClimateDevice, RestoreEntity):
_LOGGER.error("Unrecognized hvac mode: %s", hvac_mode)
return
# Ensure we update the current operation after changing the mode
self.schedule_update_ha_state()
self.async_write_ha_state()
async def async_set_temperature(self, **kwargs):
"""Set new target temperature."""

View File

@@ -1,5 +1,8 @@
{
"config": {
"abort": {
"already_configured": "Locatie is al geconfigureerd."
},
"step": {
"user": {
"data": {

View File

@@ -10,7 +10,7 @@
"step": {
"user": {
"data": {
"host": "Host",
"host": "Nazwa hosta lub adres IP",
"name": "Nazwa",
"password": "Has\u0142o",
"port": "Port",

View File

@@ -1,10 +1,15 @@
{
"state": {
"_": {
"closed": "\u092c\u0902\u0926",
"home": "\u0918\u0930",
"locked": "\u0924\u093e\u0932\u093e \u092c\u0902\u0926 \u0939\u0948",
"off": "\u092c\u0902\u0926",
"ok": "\u0920\u0940\u0915",
"on": "\u091a\u093e\u0932\u0942",
"problem": "\u0938\u092e\u0938\u094d\u092f\u093e"
"open": "\u0916\u0941\u0932\u093e",
"problem": "\u0938\u092e\u0938\u094d\u092f\u093e",
"unlocked": "\u0924\u093e\u0932\u093e \u0916\u0941\u0932\u093e \u0939\u0948"
}
},
"title": "\u0938\u092e\u0942\u0939"

View File

@@ -13,5 +13,5 @@
"unlocked": "Net gespaart"
}
},
"title": "Gruppe"
"title": "Grupp"
}

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