Compare commits

..

43 Commits

Author SHA1 Message Date
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
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
251 changed files with 3224 additions and 816 deletions

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

@@ -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

@@ -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

@@ -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

@@ -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

@@ -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

@@ -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

@@ -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"
@@ -63,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."""
@@ -82,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]
@@ -110,16 +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 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

@@ -2,7 +2,7 @@
"domain": "frontend",
"name": "Home Assistant Frontend",
"documentation": "https://www.home-assistant.io/integrations/frontend",
"requirements": ["home-assistant-frontend==20200427.0"],
"requirements": ["home-assistant-frontend==20200427.1"],
"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"
}

View File

@@ -0,0 +1,24 @@
{
"config": {
"abort": {
"already_configured": "Apparaat is al geconfigureerd"
},
"error": {
"cannot_connect": "Verbinding mislukt, probeer het opnieuw"
},
"flow_title": "Logitech Harmony Hub {name}",
"step": {
"link": {
"description": "Wil je {name} ({host}) instellen?",
"title": "Logitech Harmony Hub instellen"
},
"user": {
"data": {
"host": "Hostnaam of IP-adres",
"name": "Naam van hub"
},
"title": "Logitech Harmony Hub instellen"
}
}
}
}

View File

@@ -9,8 +9,8 @@
"step": {
"user": {
"data": {
"access_token": "Host",
"host": "Host"
"access_token": "Nazwa hosta lub adres IP",
"host": "Nazwa hosta lub adres IP"
},
"description": "Wprowad\u017a nazw\u0119 hosta lub adres IP urz\u0105dzenia Heos (najlepiej pod\u0142\u0105czonego przewodowo do sieci).",
"title": "Po\u0142\u0105czenie z Heos"

View File

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

View File

@@ -99,6 +99,9 @@ class HomeAccessory(Accessory):
self.entity_id = entity_id
self.hass = hass
self.debounce = {}
self._char_battery = None
self._char_charging = None
self._char_low_battery = None
self.linked_battery_sensor = self.config.get(CONF_LINKED_BATTERY_SENSOR)
self.linked_battery_charging_sensor = self.config.get(
CONF_LINKED_BATTERY_CHARGING_SENSOR
@@ -247,6 +250,10 @@ class HomeAccessory(Accessory):
Only call this function if self._support_battery_level is True.
"""
if not self._char_battery:
# Battery appeared after homekit was started
return
battery_level = convert_to_float(battery_level)
if battery_level is not None:
if self._char_battery.value != battery_level:
@@ -258,7 +265,8 @@ class HomeAccessory(Accessory):
"%s: Updated battery level to %d", self.entity_id, battery_level
)
if battery_charging is None:
# Charging state can appear after homekit was started
if battery_charging is None or not self._char_charging:
return
hk_charging = HK_CHARGING if battery_charging else HK_NOT_CHARGING

View File

@@ -94,13 +94,13 @@ class Fan(HomeAccessory):
_LOGGER.debug("Fan _set_chars: %s", char_values)
if CHAR_ACTIVE in char_values:
if char_values[CHAR_ACTIVE]:
is_on = False
state = self.hass.states.get(self.entity_id)
if state and state.state == STATE_ON:
is_on = True
# Only set the state to active if we
# did not get a rotation speed or its off
if not is_on or CHAR_ROTATION_SPEED not in char_values:
# If the device supports set speed we
# do not want to turn on as it will take
# the fan to 100% than to the desired speed.
#
# Setting the speed will take care of turning
# on the fan if SUPPORT_SET_SPEED is set.
if not self.char_speed or CHAR_ROTATION_SPEED not in char_values:
self.set_state(1)
else:
# Its off, nothing more to do as setting the

View File

@@ -117,12 +117,15 @@ class Thermostat(HomeAccessory):
"""Initialize a Thermostat accessory object."""
super().__init__(*args, category=CATEGORY_THERMOSTAT)
self._unit = self.hass.config.units.temperature_unit
self._state_updates = 0
self.hc_homekit_to_hass = None
self.hc_hass_to_homekit = None
min_temp, max_temp = self.get_temperature_range()
# Homekit only supports 10-38, overwriting
# the max to appears to work, but less than 10 causes
# the max to appears to work, but less than 0 causes
# a crash on the home app
hc_min_temp = max(min_temp, HC_MIN_TEMP)
hc_min_temp = max(min_temp, 0)
hc_max_temp = max_temp
min_humidity = self.hass.states.get(self.entity_id).attributes.get(
@@ -149,48 +152,17 @@ class Thermostat(HomeAccessory):
CHAR_CURRENT_HEATING_COOLING, value=0
)
# Target mode characteristics
hc_modes = state.attributes.get(ATTR_HVAC_MODES)
if hc_modes is None:
_LOGGER.error(
"%s: HVAC modes not yet available. Please disable auto start for homekit.",
self.entity_id,
)
hc_modes = (
HVAC_MODE_HEAT,
HVAC_MODE_COOL,
HVAC_MODE_HEAT_COOL,
HVAC_MODE_OFF,
)
# Determine available modes for this entity,
# Prefer HEAT_COOL over AUTO and COOL over FAN_ONLY, DRY
#
# HEAT_COOL is preferred over auto because HomeKit Accessory Protocol describes
# heating or cooling comes on to maintain a target temp which is closest to
# the Home Assistant spec
#
# HVAC_MODE_HEAT_COOL: The device supports heating/cooling to a range
self.hc_homekit_to_hass = {
c: s
for s, c in HC_HASS_TO_HOMEKIT.items()
if (
s in hc_modes
and not (
(s == HVAC_MODE_AUTO and HVAC_MODE_HEAT_COOL in hc_modes)
or (
s in (HVAC_MODE_DRY, HVAC_MODE_FAN_ONLY)
and HVAC_MODE_COOL in hc_modes
)
)
)
}
hc_valid_values = {k: v for v, k in self.hc_homekit_to_hass.items()}
self._configure_hvac_modes(state)
# Must set the value first as setting
# valid_values happens before setting
# the value and if 0 is not a valid
# value this will throw
self.char_target_heat_cool = serv_thermostat.configure_char(
CHAR_TARGET_HEATING_COOLING, valid_values=hc_valid_values,
CHAR_TARGET_HEATING_COOLING, value=list(self.hc_homekit_to_hass)[0]
)
self.char_target_heat_cool.override_properties(
valid_values=self.hc_hass_to_homekit
)
# Current and target temperature characteristics
self.char_current_temp = serv_thermostat.configure_char(
@@ -249,7 +221,7 @@ class Thermostat(HomeAccessory):
CHAR_CURRENT_HUMIDITY, value=50
)
self.update_state(state)
self._update_state(state)
serv_thermostat.setter_callback = self._set_chars
@@ -356,6 +328,46 @@ class Thermostat(HomeAccessory):
if CHAR_TARGET_HUMIDITY in char_values:
self.set_target_humidity(char_values[CHAR_TARGET_HUMIDITY])
def _configure_hvac_modes(self, state):
"""Configure target mode characteristics."""
hc_modes = state.attributes.get(ATTR_HVAC_MODES)
if not hc_modes:
# This cannot be none OR an empty list
_LOGGER.error(
"%s: HVAC modes not yet available. Please disable auto start for homekit.",
self.entity_id,
)
hc_modes = (
HVAC_MODE_HEAT,
HVAC_MODE_COOL,
HVAC_MODE_HEAT_COOL,
HVAC_MODE_OFF,
)
# Determine available modes for this entity,
# Prefer HEAT_COOL over AUTO and COOL over FAN_ONLY, DRY
#
# HEAT_COOL is preferred over auto because HomeKit Accessory Protocol describes
# heating or cooling comes on to maintain a target temp which is closest to
# the Home Assistant spec
#
# HVAC_MODE_HEAT_COOL: The device supports heating/cooling to a range
self.hc_homekit_to_hass = {
c: s
for s, c in HC_HASS_TO_HOMEKIT.items()
if (
s in hc_modes
and not (
(s == HVAC_MODE_AUTO and HVAC_MODE_HEAT_COOL in hc_modes)
or (
s in (HVAC_MODE_DRY, HVAC_MODE_FAN_ONLY)
and HVAC_MODE_COOL in hc_modes
)
)
)
}
self.hc_hass_to_homekit = {k: v for v, k in self.hc_homekit_to_hass.items()}
def get_temperature_range(self):
"""Return min and max temperature range."""
max_temp = self.hass.states.get(self.entity_id).attributes.get(ATTR_MAX_TEMP)
@@ -382,14 +394,46 @@ class Thermostat(HomeAccessory):
def update_state(self, new_state):
"""Update thermostat state after state changed."""
if self._state_updates < 3:
# When we get the first state updates
# we recheck valid hvac modes as the entity
# may not have been fully setup when we saw it the
# first time
original_hc_hass_to_homekit = self.hc_hass_to_homekit
self._configure_hvac_modes(new_state)
if self.hc_hass_to_homekit != original_hc_hass_to_homekit:
if self.char_target_heat_cool.value not in self.hc_homekit_to_hass:
# We must make sure the char value is
# in the new valid values before
# setting the new valid values or
# changing them with throw
self.char_target_heat_cool.set_value(
list(self.hc_homekit_to_hass)[0], should_notify=False
)
self.char_target_heat_cool.override_properties(
valid_values=self.hc_hass_to_homekit
)
self._state_updates += 1
self._update_state(new_state)
def _update_state(self, new_state):
"""Update state without rechecking the device features."""
features = new_state.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
# Update target operation mode FIRST
hvac_mode = new_state.state
if hvac_mode and hvac_mode in HC_HASS_TO_HOMEKIT:
homekit_hvac_mode = HC_HASS_TO_HOMEKIT[hvac_mode]
if self.char_target_heat_cool.value != homekit_hvac_mode:
self.char_target_heat_cool.set_value(homekit_hvac_mode)
if homekit_hvac_mode in self.hc_homekit_to_hass:
if self.char_target_heat_cool.value != homekit_hvac_mode:
self.char_target_heat_cool.set_value(homekit_hvac_mode)
else:
_LOGGER.error(
"Cannot map hvac target mode: %s to homekit as only %s modes are supported",
hvac_mode,
self.hc_homekit_to_hass,
)
# Set current operation mode for supported thermostats
hvac_action = new_state.attributes.get(ATTR_HVAC_ACTION)
@@ -444,13 +488,13 @@ class Thermostat(HomeAccessory):
# even if the device does not support it
hc_hvac_mode = self.char_target_heat_cool.value
if hc_hvac_mode == HC_HEAT_COOL_HEAT:
target_temp = self._temperature_to_homekit(
new_state.attributes.get(ATTR_TARGET_TEMP_LOW)
)
temp_low = new_state.attributes.get(ATTR_TARGET_TEMP_LOW)
if isinstance(temp_low, (int, float)):
target_temp = self._temperature_to_homekit(temp_low)
elif hc_hvac_mode == HC_HEAT_COOL_COOL:
target_temp = self._temperature_to_homekit(
new_state.attributes.get(ATTR_TARGET_TEMP_HIGH)
)
temp_high = new_state.attributes.get(ATTR_TARGET_TEMP_HIGH)
if isinstance(temp_high, (int, float)):
target_temp = self._temperature_to_homekit(temp_high)
if target_temp and self.char_target_temp.value != target_temp:
self.char_target_temp.set_value(target_temp)

View File

@@ -36,5 +36,5 @@
}
}
},
"title": "HomeKit Accessoire"
"title": "HomeKit Kontroller"
}

View File

@@ -36,5 +36,5 @@
}
}
},
"title": "\u0410\u043a\u0441\u0435\u0441\u0441\u0443\u0430\u0440 HomeKit"
"title": "HomeKit Controller"
}

View File

@@ -29,8 +29,21 @@
},
"device_automation": {
"trigger_subtype": {
"button_1": "Premier bouton",
"button_2": "Deuxi\u00e8me bouton",
"button_3": "Troisi\u00e8me bouton",
"button_4": "Quatri\u00e8me bouton",
"dim_down": "Assombrir",
"dim_up": "\u00c9claircir",
"double_buttons_1_3": "Premier et troisi\u00e8me boutons",
"double_buttons_2_4": "Deuxi\u00e8me et quatri\u00e8me boutons"
"double_buttons_2_4": "Deuxi\u00e8me et quatri\u00e8me boutons",
"turn_off": "\u00c9teindre",
"turn_on": "Allumer"
},
"trigger_type": {
"remote_button_long_release": "Bouton \" {subtype} \" rel\u00e2ch\u00e9 apr\u00e8s un appui long",
"remote_button_short_press": "bouton \"{subtype}\" est press\u00e9",
"remote_button_short_release": "Bouton \" {subtype} \" est rel\u00e2ch\u00e9"
}
}
}

View File

@@ -35,13 +35,17 @@
"button_4": "\ub124 \ubc88\uc9f8 \ubc84\ud2bc",
"dim_down": "\uc5b4\ub461\uac8c \ud558\uae30",
"dim_up": "\ubc1d\uac8c \ud558\uae30",
"double_buttons_1_3": "\uccab \ubc88\uc9f8 \ubc0f \uc138 \ubc88\uc9f8 \ubc84\ud2bc",
"double_buttons_2_4": "\ub450 \ubc88\uc9f8 \ubc0f \ub124 \ubc88\uc9f8 \ubc84\ud2bc",
"turn_off": "\ub044\uae30",
"turn_on": "\ucf1c\uae30"
},
"trigger_type": {
"remote_button_long_release": "\"{subtype}\" \ubc84\ud2bc\uc774 \uae38\uac8c \ub20c\ub838\ub2e4\uac00 \uc190\uc744 \ub5c4 \ub54c",
"remote_button_short_press": "\"{subtype}\" \ubc84\ud2bc\uc774 \ub20c\ub9b4 \ub54c",
"remote_button_short_release": "\"{subtype}\" \ubc84\ud2bc\uc5d0\uc11c \uc190\uc744 \ub5c4 \ub54c"
"remote_button_short_release": "\"{subtype}\" \ubc84\ud2bc\uc5d0\uc11c \uc190\uc744 \ub5c4 \ub54c",
"remote_double_button_long_press": "\"{subtype}\" \ubaa8\ub450 \uae38\uac8c \ub20c\ub838\ub2e4\uac00 \uc190\uc744 \ub5c4 \ub54c",
"remote_double_button_short_press": "\"{subtype}\" \ubaa8\ub450 \uc190\uc744 \ub5c4 \ub54c"
}
}
}

View File

@@ -35,13 +35,17 @@
"button_4": "V\u00e9ierte Kn\u00e4ppchen",
"dim_down": "Verd\u00e4ischteren",
"dim_up": "Erhellen",
"double_buttons_1_3": "\u00c9ischte an Dr\u00ebtte Kn\u00e4ppchen",
"double_buttons_2_4": "Zweete a V\u00e9ierte Kn\u00e4ppchen",
"turn_off": "Ausschalten",
"turn_on": "Uschalten"
},
"trigger_type": {
"remote_button_long_release": "\"{subtype}\" Kn\u00e4ppche no laangem unhalen lassgelooss",
"remote_button_short_press": "\"{subtype}\" Kn\u00e4ppche gedr\u00e9ckt",
"remote_button_short_release": "\"{subtype}\" Kn\u00e4ppche lassgelooss"
"remote_button_short_release": "\"{subtype}\" Kn\u00e4ppche lassgelooss",
"remote_double_button_long_press": "B\u00e9id \"{subtype}\" no laangem unhalen lassgelooss",
"remote_double_button_short_press": "B\u00e9id \"{subtype}\" lassgeloss"
}
}
}

View File

@@ -17,7 +17,7 @@
"step": {
"init": {
"data": {
"host": "Host"
"host": "Nazwa hosta lub adres IP"
},
"title": "Wybierz mostek Hue"
},
@@ -26,5 +26,26 @@
"title": "Hub Link"
}
}
},
"device_automation": {
"trigger_subtype": {
"button_1": "pierwszy przycisk",
"button_2": "drugi przycisk",
"button_3": "trzeci przycisk",
"button_4": "czwarty przycisk",
"dim_down": "nast\u0105pi zmniejszenie jasno\u015bci",
"dim_up": "nast\u0105pi zwi\u0119kszenie jasno\u015bci",
"double_buttons_1_3": "Przyciski pierwszy i trzeci",
"double_buttons_2_4": "Przyciski drugi i czwarty",
"turn_off": "Nast\u0105pi wy\u0142\u0105czenie",
"turn_on": "Nast\u0105pi w\u0142\u0105czenie"
},
"trigger_type": {
"remote_button_long_release": "\"{subtype}\" zostanie zwolniony po d\u0142ugim naci\u015bni\u0119ciu",
"remote_button_short_press": "\"{subtype}\" zostanie naci\u015bni\u0119ty",
"remote_button_short_release": "\"{subtype}\" zostanie zwolniony",
"remote_double_button_long_press": "Obydwa \"{subtype}\" zostanie zwolniony po d\u0142ugim naci\u015bni\u0119ciu",
"remote_double_button_short_press": "Obydwa \"{subtype}\" zostanie zwolniony"
}
}
}

View File

@@ -1,7 +1,7 @@
{
"config": {
"abort": {
"already_setup": "\ud558\ub098\uc758 iAqualink \uc5f0\uacb0\ub9cc \uad6c\uc131 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."
"already_setup": "\ud558\ub098\uc758 iAqualink \uc5f0\uacb0\ub9cc \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."
},
"error": {
"connection_failure": "iAqualink \uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc0ac\uc6a9\uc790 \uc774\ub984\uacfc \ube44\ubc00\ubc88\ud638\ub97c \ud655\uc778\ud574\uc8fc\uc138\uc694."

View File

@@ -20,7 +20,7 @@
"user": {
"data": {
"password": "Has\u0142o",
"username": "E-mail",
"username": "Adres e-mail",
"with_family": "Z rodzin\u0105"
},
"description": "Wprowad\u017a dane uwierzytelniaj\u0105ce",

View File

@@ -1,7 +1,7 @@
{
"config": {
"abort": {
"single_instance_allowed": "\ud558\ub098\uc758 Home Assistant iOS \ub9cc \uad6c\uc131 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."
"single_instance_allowed": "\ud558\ub098\uc758 Home Assistant iOS \ub9cc \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."
},
"step": {
"confirm": {

View File

@@ -128,24 +128,20 @@ class IPPEntity(Entity):
self,
*,
entry_id: str,
device_id: str,
coordinator: IPPDataUpdateCoordinator,
name: str,
icon: str,
enabled_default: bool = True,
) -> None:
"""Initialize the IPP entity."""
self._device_id = None
self._device_id = device_id
self._enabled_default = enabled_default
self._entry_id = entry_id
self._icon = icon
self._name = name
self.coordinator = coordinator
if coordinator.data.info.uuid is not None:
self._device_id = coordinator.data.info.uuid
elif coordinator.data.info.serial is not None:
self._device_id = coordinator.data.info.serial
@property
def name(self) -> str:
"""Return the name of the entity."""

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