homeassistant 2025.7.0b3__py3-none-any.whl → 2025.7.0b4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- homeassistant/components/ai_task/translations/fr.json +22 -1
- homeassistant/components/ai_task/translations/it.json +22 -0
- homeassistant/components/alexa_devices/translations/it.json +29 -0
- homeassistant/components/anthropic/translations/fr.json +37 -0
- homeassistant/components/anthropic/translations/it.json +37 -0
- homeassistant/components/assist_satellite/translations/fr.json +8 -0
- homeassistant/components/assist_satellite/translations/it.json +8 -0
- homeassistant/components/blue_current/translations/el.json +3 -1
- homeassistant/components/bluetooth/translations/el.json +3 -0
- homeassistant/components/denonavr/translations/el.json +5 -0
- homeassistant/components/derivative/translations/fr.json +4 -0
- homeassistant/components/derivative/translations/it.json +4 -0
- homeassistant/components/devolo_home_control/translations/it.json +6 -0
- homeassistant/components/ecovacs/translations/el.json +1 -0
- homeassistant/components/emoncms/translations/el.json +3 -0
- homeassistant/components/ezviz/translations/it.json +10 -0
- homeassistant/components/fronius/translations/el.json +14 -1
- homeassistant/components/google_generative_ai_conversation/translations/fr.json +82 -1
- homeassistant/components/google_generative_ai_conversation/translations/it.json +20 -0
- homeassistant/components/homeassistant/translations/fr.json +1 -0
- homeassistant/components/homeassistant/translations/it.json +1 -0
- homeassistant/components/homeassistant_hardware/translations/el.json +1 -0
- homeassistant/components/homeassistant_hardware/translations/fr.json +4 -0
- homeassistant/components/homeassistant_hardware/translations/it.json +6 -0
- homeassistant/components/homeassistant_hardware/translations/sk.json +1 -0
- homeassistant/components/homeassistant_hardware/translations/zh-Hans.json +1 -0
- homeassistant/components/homeassistant_sky_connect/translations/el.json +2 -0
- homeassistant/components/homeassistant_sky_connect/translations/fr.json +4 -0
- homeassistant/components/homeassistant_sky_connect/translations/it.json +4 -0
- homeassistant/components/homeassistant_sky_connect/translations/sk.json +2 -0
- homeassistant/components/homeassistant_sky_connect/translations/zh-Hans.json +2 -0
- homeassistant/components/homeassistant_yellow/translations/el.json +2 -0
- homeassistant/components/homeassistant_yellow/translations/fr.json +2 -0
- homeassistant/components/homeassistant_yellow/translations/it.json +2 -0
- homeassistant/components/homeassistant_yellow/translations/sk.json +2 -0
- homeassistant/components/homeassistant_yellow/translations/zh-Hans.json +2 -0
- homeassistant/components/imap/translations/fr.json +2 -0
- homeassistant/components/lifx/translations/el.json +2 -1
- homeassistant/components/litterrobot/translations/it.json +4 -0
- homeassistant/components/mqtt/config_flow.py +34 -7
- homeassistant/components/mqtt/strings.json +11 -4
- homeassistant/components/mqtt/translations/bg.json +1 -3
- homeassistant/components/mqtt/translations/cs.json +2 -6
- homeassistant/components/mqtt/translations/de.json +23 -16
- homeassistant/components/mqtt/translations/el.json +11 -0
- homeassistant/components/mqtt/translations/en-GB.json +2 -6
- homeassistant/components/mqtt/translations/en.json +13 -6
- homeassistant/components/mqtt/translations/es.json +2 -6
- homeassistant/components/mqtt/translations/et.json +13 -6
- homeassistant/components/mqtt/translations/fr.json +27 -6
- homeassistant/components/mqtt/translations/fy.json +2 -5
- homeassistant/components/mqtt/translations/ga.json +2 -6
- homeassistant/components/mqtt/translations/he.json +2 -6
- homeassistant/components/mqtt/translations/hu.json +2 -6
- homeassistant/components/mqtt/translations/it.json +25 -0
- homeassistant/components/mqtt/translations/ja.json +1 -4
- homeassistant/components/mqtt/translations/lt.json +2 -6
- homeassistant/components/mqtt/translations/mk.json +1 -6
- homeassistant/components/mqtt/translations/nl.json +2 -6
- homeassistant/components/mqtt/translations/pt.json +2 -6
- homeassistant/components/mqtt/translations/ru.json +2 -6
- homeassistant/components/mqtt/translations/sk.json +13 -6
- homeassistant/components/mqtt/translations/sl.json +2 -6
- homeassistant/components/mqtt/translations/sv.json +2 -6
- homeassistant/components/mqtt/translations/tr.json +2 -6
- homeassistant/components/mqtt/translations/zh-Hans.json +2 -6
- homeassistant/components/mqtt/translations/zh-Hant.json +13 -6
- homeassistant/components/nextdns/translations/fr.json +6 -0
- homeassistant/components/ntfy/translations/hu.json +53 -4
- homeassistant/components/nut/translations/el.json +42 -0
- homeassistant/components/ollama/translations/fr.json +33 -0
- homeassistant/components/ollama/translations/it.json +35 -0
- homeassistant/components/openai_conversation/translations/fr.json +56 -0
- homeassistant/components/openai_conversation/translations/it.json +56 -0
- homeassistant/components/paperless_ngx/manifest.json +1 -1
- homeassistant/components/peblar/translations/el.json +12 -0
- homeassistant/components/pegel_online/translations/el.json +2 -1
- homeassistant/components/pegel_online/translations/es.json +2 -1
- homeassistant/components/pegel_online/translations/et.json +2 -1
- homeassistant/components/pegel_online/translations/sk.json +2 -1
- homeassistant/components/pegel_online/translations/zh-Hans.json +2 -1
- homeassistant/components/pegel_online/translations/zh-Hant.json +2 -1
- homeassistant/components/pi_hole/translations/fr.json +1 -0
- homeassistant/components/playstation_network/translations/fr.json +15 -0
- homeassistant/components/playstation_network/translations/hu.json +44 -1
- homeassistant/components/playstation_network/translations/it.json +43 -0
- homeassistant/components/rest/data.py +40 -1
- homeassistant/components/screenlogic/translations/el.json +7 -0
- homeassistant/components/sensibo/translations/el.json +1 -0
- homeassistant/components/shelly/entity.py +4 -1
- homeassistant/components/sonos/translations/fr.json +6 -0
- homeassistant/components/sonos/translations/it.json +11 -0
- homeassistant/components/stream/__init__.py +8 -4
- homeassistant/components/stream/const.py +2 -1
- homeassistant/components/stream/core.py +3 -1
- homeassistant/components/subaru/translations/el.json +2 -0
- homeassistant/components/subaru/translations/sk.json +2 -0
- homeassistant/components/subaru/translations/zh-Hans.json +2 -0
- homeassistant/components/swiss_public_transport/translations/el.json +60 -6
- homeassistant/components/switchbot/translations/it.json +53 -0
- homeassistant/components/switchbot_cloud/__init__.py +6 -1
- homeassistant/components/switchbot_cloud/binary_sensor.py +8 -1
- homeassistant/components/switchbot_cloud/sensor.py +3 -2
- homeassistant/components/telegram_bot/translations/fr.json +3 -1
- homeassistant/components/telegram_bot/translations/it.json +30 -0
- homeassistant/components/thermopro/translations/el.json +7 -0
- homeassistant/components/thermopro/translations/es.json +7 -0
- homeassistant/components/thermopro/translations/sk.json +7 -0
- homeassistant/components/thermopro/translations/zh-Hans.json +7 -0
- homeassistant/components/tibber/manifest.json +1 -1
- homeassistant/components/tibber/sensor.py +1 -1
- homeassistant/components/vegehub/translations/it.json +40 -0
- homeassistant/components/vulcan/manifest.json +1 -1
- homeassistant/components/wled/translations/fr.json +1 -0
- homeassistant/components/wmspro/cover.py +2 -0
- homeassistant/components/xiaomi_miio/translations/fr.json +24 -2
- homeassistant/components/zha/translations/fr.json +50 -0
- homeassistant/components/zha/translations/it.json +50 -0
- homeassistant/components/zwave_js/translations/el.json +33 -0
- homeassistant/components/zwave_js/translations/es.json +32 -0
- homeassistant/components/zwave_js/translations/fr.json +6 -0
- homeassistant/components/zwave_js/translations/hu.json +41 -1
- homeassistant/components/zwave_js/translations/it.json +26 -0
- homeassistant/components/zwave_js/translations/sk.json +33 -0
- homeassistant/components/zwave_js/translations/zh-Hans.json +33 -0
- homeassistant/components/zwave_js/translations/zh-Hant.json +32 -0
- homeassistant/const.py +1 -1
- {homeassistant-2025.7.0b3.dist-info → homeassistant-2025.7.0b4.dist-info}/METADATA +1 -1
- {homeassistant-2025.7.0b3.dist-info → homeassistant-2025.7.0b4.dist-info}/RECORD +134 -129
- {homeassistant-2025.7.0b3.dist-info → homeassistant-2025.7.0b4.dist-info}/WHEEL +0 -0
- {homeassistant-2025.7.0b3.dist-info → homeassistant-2025.7.0b4.dist-info}/entry_points.txt +0 -0
- {homeassistant-2025.7.0b3.dist-info → homeassistant-2025.7.0b4.dist-info}/licenses/LICENSE.md +0 -0
- {homeassistant-2025.7.0b3.dist-info → homeassistant-2025.7.0b4.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
- {homeassistant-2025.7.0b3.dist-info → homeassistant-2025.7.0b4.dist-info}/top_level.txt +0 -0
|
@@ -2,29 +2,72 @@
|
|
|
2
2
|
"config": {
|
|
3
3
|
"abort": {
|
|
4
4
|
"already_configured": "A fi\u00f3k m\u00e1r konfigur\u00e1lva van",
|
|
5
|
-
"reauth_successful": "Az \u00fajrahiteles\u00edt\u00e9s sikeres volt"
|
|
5
|
+
"reauth_successful": "Az \u00fajrahiteles\u00edt\u00e9s sikeres volt",
|
|
6
|
+
"unique_id_mismatch": "A megadott NPSSO token a(z) {wrong_account} fi\u00f3khoz tartozik. Hiteles\u00edtsen \u00fajra a(z) **{name}** fi\u00f3kkal"
|
|
6
7
|
},
|
|
7
8
|
"error": {
|
|
8
9
|
"cannot_connect": "Sikertelen csatlakoz\u00e1s",
|
|
9
10
|
"invalid_account": "\u00c9rv\u00e9nytelen hozz\u00e1f\u00e9r\u00e9si token",
|
|
10
11
|
"invalid_auth": "\u00c9rv\u00e9nytelen hiteles\u00edt\u00e9s",
|
|
11
12
|
"unknown": "V\u00e1ratlan hiba"
|
|
13
|
+
},
|
|
14
|
+
"step": {
|
|
15
|
+
"reauth_confirm": {
|
|
16
|
+
"data": {
|
|
17
|
+
"npsso": "NPSSO token"
|
|
18
|
+
},
|
|
19
|
+
"data_description": {
|
|
20
|
+
"npsso": "Az NPSSO tokent akkor kapja meg, amikor sikeresen bejelentkezik a PlayStation Network fi\u00f3kj\u00e1ba, \u00e9s a Home Assistant \u00e1ltali hiteles\u00edt\u00e9sekhez haszn\u00e1latos."
|
|
21
|
+
},
|
|
22
|
+
"description": "A(z) **{name}** felhaszn\u00e1l\u00f3 NPSSO tokene lej\u00e1rt. \u00daj token beszerz\u00e9s\u00e9hez el\u0151sz\u00f6r jelentkezzen be a [PlayStation fi\u00f3kj\u00e1ba]({psn_link}), majd [kattintson ide]({npsso_link}) a token lek\u00e9r\u00e9s\u00e9hez.",
|
|
23
|
+
"title": "{name} \u00fajrahiteles\u00edt\u00e9se a PlayStation Network szolg\u00e1ltat\u00e1ssal"
|
|
24
|
+
},
|
|
25
|
+
"user": {
|
|
26
|
+
"data": {
|
|
27
|
+
"npsso": "NPSSO token"
|
|
28
|
+
},
|
|
29
|
+
"data_description": {
|
|
30
|
+
"npsso": "Az NPSSO tokent akkor kapja meg, amikor sikeresen bejelentkezik a PlayStation Network fi\u00f3kj\u00e1ba, \u00e9s a Home Assistant \u00e1ltali hiteles\u00edt\u00e9sekhez haszn\u00e1latos."
|
|
31
|
+
},
|
|
32
|
+
"description": "NPSSO token beszerz\u00e9s\u00e9hez el\u0151sz\u00f6r jelentkezzen be a [PlayStation fi\u00f3kj\u00e1ba]({psn_link}), majd [kattintson ide]({npsso_link}) a token lek\u00e9r\u00e9s\u00e9hez."
|
|
33
|
+
}
|
|
12
34
|
}
|
|
13
35
|
},
|
|
14
36
|
"entity": {
|
|
15
37
|
"sensor": {
|
|
16
38
|
"earned_trophies_bronze": {
|
|
39
|
+
"name": "Bronz tr\u00f3fe\u00e1k",
|
|
17
40
|
"unit_of_measurement": "tr\u00f3fea"
|
|
18
41
|
},
|
|
19
42
|
"earned_trophies_gold": {
|
|
43
|
+
"name": "Arany tr\u00f3fe\u00e1k",
|
|
20
44
|
"unit_of_measurement": "tr\u00f3fea"
|
|
21
45
|
},
|
|
22
46
|
"earned_trophies_platinum": {
|
|
47
|
+
"name": "Platina tr\u00f3fe\u00e1k",
|
|
23
48
|
"unit_of_measurement": "tr\u00f3fea"
|
|
24
49
|
},
|
|
25
50
|
"earned_trophies_silver": {
|
|
51
|
+
"name": "Ez\u00fcst tr\u00f3fe\u00e1k",
|
|
26
52
|
"unit_of_measurement": "tr\u00f3fea"
|
|
53
|
+
},
|
|
54
|
+
"online_id": {
|
|
55
|
+
"name": "Online-azonos\u00edt\u00f3"
|
|
56
|
+
},
|
|
57
|
+
"trophy_level": {
|
|
58
|
+
"name": "Tr\u00f3feaszint"
|
|
59
|
+
},
|
|
60
|
+
"trophy_level_progress": {
|
|
61
|
+
"name": "K\u00f6vetkez\u0151 szint"
|
|
27
62
|
}
|
|
28
63
|
}
|
|
64
|
+
},
|
|
65
|
+
"exceptions": {
|
|
66
|
+
"not_ready": {
|
|
67
|
+
"message": "A PlayStation Network hiteles\u00edt\u00e9se nem siker\u00fclt."
|
|
68
|
+
},
|
|
69
|
+
"update_failed": {
|
|
70
|
+
"message": "Nem siker\u00fclt az adatok lek\u00e9r\u00e9se a PlayStation Network el\u00e9r\u00e9s\u00e9nek k\u00eds\u00e9rletekor."
|
|
71
|
+
}
|
|
29
72
|
}
|
|
30
73
|
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"config": {
|
|
3
|
+
"abort": {
|
|
4
|
+
"reauth_successful": "L'autenticazione ha avuto successo",
|
|
5
|
+
"unique_id_mismatch": "Il token NPSSO fornito corrisponde all'account {wrong_account}. Per favore, autenticati nuovamente con l'account **{name}**"
|
|
6
|
+
},
|
|
7
|
+
"step": {
|
|
8
|
+
"reauth_confirm": {
|
|
9
|
+
"description": "Il token NPSSO per **{name}** \u00e8 scaduto. Per ottenerne uno nuovo, accedi prima al tuo [account PlayStation]({psn_link}). Poi [clicca qui]({npsso_link}) per recuperare il token.",
|
|
10
|
+
"title": "Ri-autentica {name} con PlayStation Network"
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"entity": {
|
|
15
|
+
"sensor": {
|
|
16
|
+
"earned_trophies_bronze": {
|
|
17
|
+
"name": "Trofei di bronzo",
|
|
18
|
+
"unit_of_measurement": "trofei"
|
|
19
|
+
},
|
|
20
|
+
"earned_trophies_gold": {
|
|
21
|
+
"name": "Trofei d'oro",
|
|
22
|
+
"unit_of_measurement": "trofei"
|
|
23
|
+
},
|
|
24
|
+
"earned_trophies_platinum": {
|
|
25
|
+
"name": "Trofei di platino",
|
|
26
|
+
"unit_of_measurement": "trofei"
|
|
27
|
+
},
|
|
28
|
+
"earned_trophies_silver": {
|
|
29
|
+
"name": "Trofei d'argento",
|
|
30
|
+
"unit_of_measurement": "trofei"
|
|
31
|
+
},
|
|
32
|
+
"online_id": {
|
|
33
|
+
"name": "ID online"
|
|
34
|
+
},
|
|
35
|
+
"trophy_level": {
|
|
36
|
+
"name": "Livello del trofeo"
|
|
37
|
+
},
|
|
38
|
+
"trophy_level_progress": {
|
|
39
|
+
"name": "Livello successivo"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -6,6 +6,7 @@ import logging
|
|
|
6
6
|
from typing import Any
|
|
7
7
|
|
|
8
8
|
import aiohttp
|
|
9
|
+
from aiohttp import hdrs
|
|
9
10
|
from multidict import CIMultiDictProxy
|
|
10
11
|
import xmltodict
|
|
11
12
|
|
|
@@ -77,6 +78,12 @@ class RestData:
|
|
|
77
78
|
"""Set url."""
|
|
78
79
|
self._resource = url
|
|
79
80
|
|
|
81
|
+
def _is_expected_content_type(self, content_type: str) -> bool:
|
|
82
|
+
"""Check if the content type is one we expect (JSON or XML)."""
|
|
83
|
+
return content_type.startswith(
|
|
84
|
+
("application/json", "text/json", *XML_MIME_TYPES)
|
|
85
|
+
)
|
|
86
|
+
|
|
80
87
|
def data_without_xml(self) -> str | None:
|
|
81
88
|
"""If the data is an XML string, convert it to a JSON string."""
|
|
82
89
|
_LOGGER.debug("Data fetched from resource: %s", self.data)
|
|
@@ -84,7 +91,7 @@ class RestData:
|
|
|
84
91
|
(value := self.data) is not None
|
|
85
92
|
# If the http request failed, headers will be None
|
|
86
93
|
and (headers := self.headers) is not None
|
|
87
|
-
and (content_type := headers.get(
|
|
94
|
+
and (content_type := headers.get(hdrs.CONTENT_TYPE))
|
|
88
95
|
and content_type.startswith(XML_MIME_TYPES)
|
|
89
96
|
):
|
|
90
97
|
value = json_dumps(xmltodict.parse(value))
|
|
@@ -120,6 +127,7 @@ class RestData:
|
|
|
120
127
|
# Handle data/content
|
|
121
128
|
if self._request_data:
|
|
122
129
|
request_kwargs["data"] = self._request_data
|
|
130
|
+
response = None
|
|
123
131
|
try:
|
|
124
132
|
# Make the request
|
|
125
133
|
async with self._session.request(
|
|
@@ -143,3 +151,34 @@ class RestData:
|
|
|
143
151
|
self.last_exception = ex
|
|
144
152
|
self.data = None
|
|
145
153
|
self.headers = None
|
|
154
|
+
|
|
155
|
+
# Log response details outside the try block so we always get logging
|
|
156
|
+
if response is None:
|
|
157
|
+
return
|
|
158
|
+
|
|
159
|
+
# Log response details for debugging
|
|
160
|
+
content_type = response.headers.get(hdrs.CONTENT_TYPE)
|
|
161
|
+
_LOGGER.debug(
|
|
162
|
+
"REST response from %s: status=%s, content-type=%s, length=%s",
|
|
163
|
+
self._resource,
|
|
164
|
+
response.status,
|
|
165
|
+
content_type or "not set",
|
|
166
|
+
len(self.data) if self.data else 0,
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
# If we got an error response with non-JSON/XML content, log a sample
|
|
170
|
+
# This helps debug issues like servers blocking with HTML error pages
|
|
171
|
+
if (
|
|
172
|
+
response.status >= 400
|
|
173
|
+
and content_type
|
|
174
|
+
and not self._is_expected_content_type(content_type)
|
|
175
|
+
):
|
|
176
|
+
sample = self.data[:500] if self.data else "<empty>"
|
|
177
|
+
_LOGGER.warning(
|
|
178
|
+
"REST request to %s returned status %s with %s response: %s%s",
|
|
179
|
+
self._resource,
|
|
180
|
+
response.status,
|
|
181
|
+
content_type,
|
|
182
|
+
sample,
|
|
183
|
+
"..." if self.data and len(self.data) > 500 else "",
|
|
184
|
+
)
|
|
@@ -66,6 +66,13 @@
|
|
|
66
66
|
}
|
|
67
67
|
},
|
|
68
68
|
"sensor": {
|
|
69
|
+
"chem_dose_state": {
|
|
70
|
+
"state": {
|
|
71
|
+
"dosing": "\u0394\u03bf\u03c3\u03bf\u03bb\u03bf\u03b3\u03af\u03b1",
|
|
72
|
+
"mixing": "\u039c\u03af\u03be\u03b7",
|
|
73
|
+
"monitoring": "\u03a0\u03b1\u03c1\u03b1\u03ba\u03bf\u03bb\u03bf\u03cd\u03b8\u03b7\u03c3\u03b7"
|
|
74
|
+
}
|
|
75
|
+
},
|
|
69
76
|
"controller_state": {
|
|
70
77
|
"name": "\u039a\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03b5\u03bb\u03b5\u03b3\u03ba\u03c4\u03ae",
|
|
71
78
|
"state": {
|
|
@@ -488,6 +488,7 @@
|
|
|
488
488
|
}
|
|
489
489
|
},
|
|
490
490
|
"get_device_capabilities": {
|
|
491
|
+
"description": "\u039b\u03b1\u03bc\u03b2\u03ac\u03bd\u03b5\u03b9 \u03c4\u03b9\u03c2 \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 \u03c3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae\u03c2 \u03b3\u03b9\u03b1 \u03bc\u03b9\u03b1 \u03c3\u03c5\u03b3\u03ba\u03b5\u03ba\u03c1\u03b9\u03bc\u03ad\u03bd\u03b7 \u03c3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae \u03c3\u03cd\u03bc\u03c6\u03c9\u03bd\u03b1 \u03bc\u03b5 \u03c4\u03b9\u03c2 \u03b1\u03c0\u03b1\u03b9\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2 \u03c4\u03bf\u03c5 API.",
|
|
491
492
|
"fields": {
|
|
492
493
|
"hvac_mode": {
|
|
493
494
|
"description": "\u03a4\u03c1\u03cc\u03c0\u03bf\u03c2 \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1\u03c2 \u03ba\u03bb\u03b9\u03bc\u03b1\u03c4\u03b9\u03c3\u03bc\u03bf\u03cd",
|
|
@@ -86,7 +86,10 @@ def async_setup_block_attribute_entities(
|
|
|
86
86
|
coordinator.device.settings, block
|
|
87
87
|
):
|
|
88
88
|
domain = sensor_class.__module__.split(".")[-1]
|
|
89
|
-
unique_id =
|
|
89
|
+
unique_id = sensor_class(
|
|
90
|
+
coordinator, block, sensor_id, description
|
|
91
|
+
).unique_id
|
|
92
|
+
LOGGER.debug("Removing Shelly entity with unique_id: %s", unique_id)
|
|
90
93
|
async_remove_shelly_entity(hass, domain, unique_id)
|
|
91
94
|
else:
|
|
92
95
|
entities.append(
|
|
@@ -79,8 +79,14 @@
|
|
|
79
79
|
}
|
|
80
80
|
},
|
|
81
81
|
"exceptions": {
|
|
82
|
+
"entity_not_found": {
|
|
83
|
+
"message": "Entit\u00e9 {entity_id} non trouv\u00e9e."
|
|
84
|
+
},
|
|
82
85
|
"invalid_sonos_playlist": {
|
|
83
86
|
"message": "Impossible de trouver la liste de lecture Sonos\u00a0: {name}"
|
|
87
|
+
},
|
|
88
|
+
"speaker_not_found": {
|
|
89
|
+
"message": "{entity_id} n'est pas une enceinte Sonos connue."
|
|
84
90
|
}
|
|
85
91
|
},
|
|
86
92
|
"issues": {
|
|
@@ -76,6 +76,17 @@
|
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
},
|
|
79
|
+
"exceptions": {
|
|
80
|
+
"entity_not_found": {
|
|
81
|
+
"message": "Entit\u00e0 {entity_id} non trovata."
|
|
82
|
+
},
|
|
83
|
+
"speaker_not_found": {
|
|
84
|
+
"message": "{entity_id} non \u00e8 un altoparlante Sonos conosciuto."
|
|
85
|
+
},
|
|
86
|
+
"timeout_join": {
|
|
87
|
+
"message": "Tempo scaduto durante l'attesa che il lettore Sonos si unisca al gruppo {group_description}"
|
|
88
|
+
}
|
|
89
|
+
},
|
|
79
90
|
"issues": {
|
|
80
91
|
"subscriptions_failed": {
|
|
81
92
|
"description": "Se si ricorre al polling, la funzionalit\u00e0 potrebbe essere limitata.\n\nIl dispositivo Sonos al {device_ip} non pu\u00f2 raggiungere Home assistant al {listener_address}.\n\nPer ulteriori informazioni su come risolvere questo problema, consultare la nostra [documentazione]({sub_fail_url}).",
|
|
@@ -55,6 +55,7 @@ from .const import (
|
|
|
55
55
|
MAX_SEGMENTS,
|
|
56
56
|
OUTPUT_FORMATS,
|
|
57
57
|
OUTPUT_IDLE_TIMEOUT,
|
|
58
|
+
OUTPUT_STARTUP_TIMEOUT,
|
|
58
59
|
RECORDER_PROVIDER,
|
|
59
60
|
RTSP_TRANSPORTS,
|
|
60
61
|
SEGMENT_DURATION_ADJUSTER,
|
|
@@ -363,11 +364,14 @@ class Stream:
|
|
|
363
364
|
# without concern about self._outputs being modified from another thread.
|
|
364
365
|
return MappingProxyType(self._outputs.copy())
|
|
365
366
|
|
|
366
|
-
def add_provider(
|
|
367
|
-
self, fmt: str, timeout: int = OUTPUT_IDLE_TIMEOUT
|
|
368
|
-
) -> StreamOutput:
|
|
367
|
+
def add_provider(self, fmt: str, timeout: int | None = None) -> StreamOutput:
|
|
369
368
|
"""Add provider output stream."""
|
|
370
369
|
if not (provider := self._outputs.get(fmt)):
|
|
370
|
+
startup_timeout = OUTPUT_STARTUP_TIMEOUT
|
|
371
|
+
if timeout is None:
|
|
372
|
+
timeout = OUTPUT_IDLE_TIMEOUT
|
|
373
|
+
else:
|
|
374
|
+
startup_timeout = timeout
|
|
371
375
|
|
|
372
376
|
async def idle_callback() -> None:
|
|
373
377
|
if (
|
|
@@ -379,7 +383,7 @@ class Stream:
|
|
|
379
383
|
|
|
380
384
|
provider = PROVIDERS[fmt](
|
|
381
385
|
self.hass,
|
|
382
|
-
IdleTimer(self.hass, timeout, idle_callback),
|
|
386
|
+
IdleTimer(self.hass, timeout, idle_callback, startup_timeout),
|
|
383
387
|
self._stream_settings,
|
|
384
388
|
self.dynamic_stream_settings,
|
|
385
389
|
)
|
|
@@ -22,7 +22,8 @@ AUDIO_CODECS = {"aac", "mp3"}
|
|
|
22
22
|
|
|
23
23
|
FORMAT_CONTENT_TYPE = {HLS_PROVIDER: "application/vnd.apple.mpegurl"}
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
OUTPUT_STARTUP_TIMEOUT = 60 # timeout due to no startup
|
|
26
|
+
OUTPUT_IDLE_TIMEOUT = 30 # Idle timeout due to inactivity
|
|
26
27
|
|
|
27
28
|
NUM_PLAYLIST_SEGMENTS = 3 # Number of segments to use in HLS playlist
|
|
28
29
|
MAX_SEGMENTS = 5 # Max number of segments to keep around
|
|
@@ -234,10 +234,12 @@ class IdleTimer:
|
|
|
234
234
|
hass: HomeAssistant,
|
|
235
235
|
timeout: int,
|
|
236
236
|
idle_callback: Callable[[], Coroutine[Any, Any, None]],
|
|
237
|
+
startup_timeout: int | None = None,
|
|
237
238
|
) -> None:
|
|
238
239
|
"""Initialize IdleTimer."""
|
|
239
240
|
self._hass = hass
|
|
240
241
|
self._timeout = timeout
|
|
242
|
+
self._startup_timeout = startup_timeout or timeout
|
|
241
243
|
self._callback = idle_callback
|
|
242
244
|
self._unsub: CALLBACK_TYPE | None = None
|
|
243
245
|
self.idle = False
|
|
@@ -246,7 +248,7 @@ class IdleTimer:
|
|
|
246
248
|
"""Start the idle timer if not already started."""
|
|
247
249
|
self.idle = False
|
|
248
250
|
if self._unsub is None:
|
|
249
|
-
self._unsub = async_call_later(self._hass, self.
|
|
251
|
+
self._unsub = async_call_later(self._hass, self._startup_timeout, self.fire)
|
|
250
252
|
|
|
251
253
|
def awake(self) -> None:
|
|
252
254
|
"""Keep the idle time alive by resetting the timeout."""
|
|
@@ -101,8 +101,10 @@
|
|
|
101
101
|
},
|
|
102
102
|
"services": {
|
|
103
103
|
"unlock_specific_door": {
|
|
104
|
+
"description": "\u039e\u03b5\u03ba\u03bb\u03b5\u03b9\u03b4\u03ce\u03bd\u03b5\u03b9 \u03c4\u03b7\u03bd \u03c0\u03cc\u03c1\u03c4\u03b1 \u03c4\u03bf\u03c5 \u03bf\u03b4\u03b7\u03b3\u03bf\u03cd, \u03cc\u03bb\u03b5\u03c2 \u03c4\u03b9\u03c2 \u03c0\u03cc\u03c1\u03c4\u03b5\u03c2 \u03ae \u03c4\u03b7\u03bd \u03c0\u03cc\u03c1\u03c4\u03b1 \u03c4\u03bf\u03c5 \u03c7\u03ce\u03c1\u03bf\u03c5 \u03b1\u03c0\u03bf\u03c3\u03ba\u03b5\u03c5\u03ce\u03bd.",
|
|
104
105
|
"fields": {
|
|
105
106
|
"door": {
|
|
107
|
+
"description": "\u0397 \u03c3\u03c5\u03b3\u03ba\u03b5\u03ba\u03c1\u03b9\u03bc\u03ad\u03bd\u03b7 \u03c0\u03cc\u03c1\u03c4\u03b1 (\u03b5\u03c2) \u03b3\u03b9\u03b1 \u03be\u03b5\u03ba\u03bb\u03b5\u03af\u03b4\u03c9\u03bc\u03b1.",
|
|
106
108
|
"name": "\u03a0\u03cc\u03c1\u03c4\u03b1"
|
|
107
109
|
}
|
|
108
110
|
},
|
|
@@ -101,8 +101,10 @@
|
|
|
101
101
|
},
|
|
102
102
|
"services": {
|
|
103
103
|
"unlock_specific_door": {
|
|
104
|
+
"description": "Odomkne dvere vodi\u010da, v\u0161etky dvere alebo zadn\u00e9 dvere.",
|
|
104
105
|
"fields": {
|
|
105
106
|
"door": {
|
|
107
|
+
"description": "Konkr\u00e9tne dvere, ktor\u00e9 sa maj\u00fa odomkn\u00fa\u0165.",
|
|
106
108
|
"name": "Dvere"
|
|
107
109
|
}
|
|
108
110
|
},
|
|
@@ -101,8 +101,10 @@
|
|
|
101
101
|
},
|
|
102
102
|
"services": {
|
|
103
103
|
"unlock_specific_door": {
|
|
104
|
+
"description": "\u89e3\u9501\u9a7e\u9a76\u5458\u8f66\u95e8\u3001\u6240\u6709\u8f66\u95e8\u6216\u5c3e\u95e8\u3002",
|
|
104
105
|
"fields": {
|
|
105
106
|
"door": {
|
|
107
|
+
"description": "\u8981\u89e3\u9501\u7684\u7279\u5b9a\u95e8\u3002",
|
|
106
108
|
"name": "\u95e8"
|
|
107
109
|
}
|
|
108
110
|
},
|
|
@@ -2,15 +2,54 @@
|
|
|
2
2
|
"config": {
|
|
3
3
|
"abort": {
|
|
4
4
|
"already_configured": "\u0397 \u03c5\u03c0\u03b7\u03c1\u03b5\u03c3\u03af\u03b1 \u03ad\u03c7\u03b5\u03b9 \u03ae\u03b4\u03b7 \u03b4\u03b9\u03b1\u03bc\u03bf\u03c1\u03c6\u03c9\u03b8\u03b5\u03af",
|
|
5
|
-
"bad_config": "\u03a4\u03bf \u03b1\u03af\u03c4\u03b7\u03bc\u03b1 \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5 \u03bb\u03cc\u03b3\u03c9 \u03ba\u03b1\u03ba\u03ae\u03c2 \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7\u03c2: \u0395\u03bb\u03ad\u03b3\u03be\u03c4\u03b5 \u03c4\u03bf [stationboard]({stationboard_url}) \u03b3\u03b9\u03b1 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf\u03c5\u03c2 \u03c3\u03c4\u03b1\u03b8\u03bc\u03bf\u03cd\u03c2."
|
|
5
|
+
"bad_config": "\u03a4\u03bf \u03b1\u03af\u03c4\u03b7\u03bc\u03b1 \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5 \u03bb\u03cc\u03b3\u03c9 \u03ba\u03b1\u03ba\u03ae\u03c2 \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7\u03c2: \u0395\u03bb\u03ad\u03b3\u03be\u03c4\u03b5 \u03c4\u03bf [stationboard]({stationboard_url}) \u03b3\u03b9\u03b1 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf\u03c5\u03c2 \u03c3\u03c4\u03b1\u03b8\u03bc\u03bf\u03cd\u03c2.",
|
|
6
|
+
"cannot_connect": "\u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03bc\u03b5 \u03c4\u03bf\u03bd server",
|
|
7
|
+
"unknown": "\u0395\u03bd\u03b1 \u03ac\u03b3\u03bd\u03c9\u03c3\u03c4\u03bf \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03c0\u03c1\u03bf\u03ad\u03ba\u03c5\u03c8\u03b5 \u03b1\u03c0\u03cc \u03c4\u03bf python-opendata-transport"
|
|
6
8
|
},
|
|
7
9
|
"error": {
|
|
8
10
|
"bad_config": "\u03a4\u03bf \u03b1\u03af\u03c4\u03b7\u03bc\u03b1 \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5 \u03bb\u03cc\u03b3\u03c9 \u03ba\u03b1\u03ba\u03ae\u03c2 \u03b4\u03b9\u03b1\u03bc\u03cc\u03c1\u03c6\u03c9\u03c3\u03b7\u03c2: \u0395\u03bb\u03ad\u03b3\u03be\u03c4\u03b5 \u03c4\u03bf\u03bd \u03c0\u03af\u03bd\u03b1\u03ba\u03b1 \u03c3\u03c4\u03b1\u03b8\u03bc\u03bf\u03cd \u03c0\u03bf\u03c5 \u03c3\u03c5\u03bd\u03b4\u03ad\u03b5\u03c4\u03b1\u03b9 \u03c0\u03b1\u03c1\u03b1\u03c0\u03ac\u03bd\u03c9 \u03b5\u03ac\u03bd \u03c4\u03b1 \u03bf\u03bd\u03cc\u03bc\u03b1\u03c4\u03b1 \u03c4\u03c9\u03bd \u03c3\u03c4\u03b1\u03b8\u03bc\u03ce\u03bd \u03c3\u03b1\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9 \u03ad\u03b3\u03ba\u03c5\u03c1\u03b1",
|
|
9
|
-
"
|
|
11
|
+
"cannot_connect": "\u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03bc\u03b5 \u03c4\u03bf\u03bd server",
|
|
12
|
+
"too_many_via_stations": "\u03a0\u03ac\u03c1\u03b1 \u03c0\u03bf\u03bb\u03bb\u03bf\u03af \u03b5\u03bd\u03b4\u03b9\u03ac\u03bc\u03b5\u03c3\u03bf\u03b9 \u03c3\u03c4\u03b1\u03b8\u03bc\u03bf\u03af, \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03bf\u03bd\u03c4\u03b1\u03b9 \u03bc\u03cc\u03bd\u03bf \u03ad\u03c9\u03c2 5 \u03b5\u03bd\u03b4\u03b9\u03ac\u03bc\u03b5\u03c3\u03bf\u03b9 \u03c3\u03c4\u03b1\u03b8\u03bc\u03bf\u03af \u03b1\u03bd\u03ac \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7.",
|
|
13
|
+
"unknown": "\u0395\u03bd\u03b1 \u03ac\u03b3\u03bd\u03c9\u03c3\u03c4\u03bf \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03c0\u03c1\u03bf\u03ad\u03ba\u03c5\u03c8\u03b5 \u03b1\u03c0\u03cc \u03c4\u03bf python-opendata-transport"
|
|
10
14
|
},
|
|
11
15
|
"step": {
|
|
16
|
+
"time_fixed": {
|
|
17
|
+
"data": {
|
|
18
|
+
"time_fixed": "\u03a9\u03c1\u03b1 \u03c4\u03b7\u03c2 \u03b7\u03bc\u03ad\u03c1\u03b1\u03c2"
|
|
19
|
+
},
|
|
20
|
+
"data_description": {
|
|
21
|
+
"time_fixed": "\u0397 \u03ce\u03c1\u03b1 \u03c4\u03b7\u03c2 \u03b7\u03bc\u03ad\u03c1\u03b1\u03c2 \u03b3\u03b9\u03b1 \u03c4\u03b7 \u03b1\u03bd\u03c4\u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7"
|
|
22
|
+
},
|
|
23
|
+
"description": "\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b5\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03c4\u03b7\u03bd \u03ba\u03b1\u03c4\u03ac\u03bb\u03bb\u03b7\u03bb\u03b7 \u03ce\u03c1\u03b1 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03b1\u03bd\u03c4\u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7 (\u03c0.\u03c7. 7:12:00 \u03c0.\u03bc. \u03ba\u03ac\u03b8\u03b5 \u03c0\u03c1\u03c9\u03af).",
|
|
24
|
+
"title": "\u0395\u03bb\u03b2\u03b5\u03c4\u03b9\u03ba\u03ad\u03c2 \u0394\u03b7\u03bc\u03cc\u03c3\u03b9\u03b5\u03c2 \u03a3\u03c5\u03b3\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b5\u03c2"
|
|
25
|
+
},
|
|
26
|
+
"time_offset": {
|
|
27
|
+
"data": {
|
|
28
|
+
"time_offset": "\u039c\u03b5\u03c4\u03b1\u03c4\u03cc\u03c0\u03b9\u03c3\u03b7 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c5"
|
|
29
|
+
},
|
|
30
|
+
"data_description": {
|
|
31
|
+
"time_offset": "\u0397 \u03c7\u03c1\u03bf\u03bd\u03b9\u03ba\u03ae \u03bc\u03b5\u03c4\u03b1\u03c4\u03cc\u03c0\u03b9\u03c3\u03b7 \u03c0\u03bf\u03c5 \u03c0\u03c1\u03bf\u03c3\u03c4\u03af\u03b8\u03b5\u03c4\u03b1\u03b9 \u03c3\u03c4\u03b7 \u03bd\u03c9\u03c1\u03af\u03c4\u03b5\u03c1\u03b7 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b1\u03bd\u03c4\u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7"
|
|
32
|
+
},
|
|
33
|
+
"description": "\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b5\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03c4\u03b7 \u03c3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ae \u03bc\u03b5\u03c4\u03b1\u03c4\u03cc\u03c0\u03b9\u03c3\u03b7 \u03c0\u03bf\u03c5 \u03b8\u03b1 \u03c0\u03c1\u03bf\u03c3\u03b8\u03ad\u03c3\u03b5\u03c4\u03b5 \u03c3\u03c4\u03b7 \u03bd\u03c9\u03c1\u03af\u03c4\u03b5\u03c1\u03b7 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b1\u03bd\u03c4\u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7 (\u03c0.\u03c7. \u03c0\u03c1\u03bf\u03c3\u03b8\u03ad\u03c3\u03c4\u03b5 \u03c4\u03b7 \u03bc\u03b5\u03c4\u03b1\u03c4\u03cc\u03c0\u03b9\u03c3\u03b7 +00:05:00, \u03bb\u03b1\u03bc\u03b2\u03ac\u03bd\u03bf\u03bd\u03c4\u03b1\u03c2 \u03c5\u03c0\u03cc\u03c8\u03b7 \u03c4\u03bf \u03c7\u03c1\u03cc\u03bd\u03bf \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03c6\u03c4\u03ac\u03c3\u03b5\u03c4\u03b5 \u03c3\u03c4\u03bf\u03bd \u03c3\u03c4\u03b1\u03b8\u03bc\u03cc \u03bc\u03b5 \u03c4\u03b1 \u03c0\u03cc\u03b4\u03b9\u03b1)",
|
|
34
|
+
"title": "\u0395\u03bb\u03b2\u03b5\u03c4\u03b9\u03ba\u03ad\u03c2 \u0394\u03b7\u03bc\u03cc\u03c3\u03b9\u03b5\u03c2 \u03a3\u03c5\u03b3\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b5\u03c2"
|
|
35
|
+
},
|
|
12
36
|
"user": {
|
|
13
|
-
"
|
|
37
|
+
"data": {
|
|
38
|
+
"from": "\u03a3\u03c4\u03b1\u03b8\u03bc\u03cc\u03c2 \u03b5\u03ba\u03ba\u03af\u03bd\u03b7\u03c3\u03b7\u03c2",
|
|
39
|
+
"time_mode": "\u0395\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03bc\u03b9\u03b1 \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c5",
|
|
40
|
+
"time_station": "\u0395\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03c4\u03bf\u03bd \u03b1\u03bd\u03c4\u03af\u03c3\u03c4\u03bf\u03b9\u03c7\u03bf \u03c3\u03c4\u03b1\u03b8\u03bc\u03cc",
|
|
41
|
+
"to": "\u03a4\u03b5\u03bb\u03b9\u03ba\u03cc\u03c2 \u03c3\u03c4\u03b1\u03b8\u03bc\u03cc\u03c2",
|
|
42
|
+
"via": "\u0395\u03bd\u03b4\u03b9\u03ac\u03bc\u03b5\u03c3\u03bf\u03b9 \u03c3\u03c4\u03b1\u03b8\u03bc\u03bf\u03af"
|
|
43
|
+
},
|
|
44
|
+
"data_description": {
|
|
45
|
+
"from": "\u039f \u03c3\u03c4\u03b1\u03b8\u03bc\u03cc\u03c2 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03bf\u03c0\u03bf\u03af\u03bf \u03be\u03b5\u03ba\u03b9\u03bd\u03ac \u03b7 \u03b1\u03bd\u03c4\u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7",
|
|
46
|
+
"time_mode": "\u0397 \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \"\u03a7\u03c1\u03cc\u03bd\u03bf\u03c2\" \u03c3\u03b1\u03c2 \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b1\u03bb\u03bb\u03ac\u03be\u03b5\u03c4\u03b5 \u03c4\u03bf \u03c7\u03c1\u03cc\u03bd\u03bf \u03b1\u03bd\u03b1\u03c7\u03ce\u03c1\u03b7\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u03bd\u03b1 \u03c4\u03bf\u03bd \u03ba\u03b1\u03b8\u03bf\u03c1\u03af\u03c3\u03b5\u03c4\u03b5 \u03c3\u03b5 \u03bc\u03b9\u03b1 \u03c3\u03c5\u03b3\u03ba\u03b5\u03ba\u03c1\u03b9\u03bc\u03ad\u03bd\u03b7 \u03ce\u03c1\u03b1 (\u03c0.\u03c7. 7:12:00 \u03c0.\u03bc. \u03ba\u03ac\u03b8\u03b5 \u03c0\u03c1\u03c9\u03af) \u03ae \u03bd\u03b1 \u03c0\u03c1\u03bf\u03c3\u03b8\u03ad\u03c3\u03b5\u03c4\u03b5 \u03bc\u03b9\u03b1 \u03bc\u03b5\u03c4\u03b1\u03c4\u03cc\u03c0\u03b9\u03c3\u03b7 (\u03c0.\u03c7. +00:05:00 \u03bb\u03b1\u03bc\u03b2\u03ac\u03bd\u03bf\u03bd\u03c4\u03b1\u03c2 \u03c5\u03c0\u03cc\u03c8\u03b7 \u03c4\u03bf \u03c7\u03c1\u03cc\u03bd\u03bf \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03c0\u03b5\u03c1\u03c0\u03b1\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5 \u03bc\u03ad\u03c7\u03c1\u03b9 \u03c4\u03bf\u03bd \u03c3\u03c4\u03b1\u03b8\u03bc\u03cc).",
|
|
47
|
+
"time_station": "\u03a3\u03c5\u03bd\u03ae\u03b8\u03c9\u03c2 \u03c0\u03b1\u03c1\u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03b5\u03af\u03c4\u03b1\u03b9 \u03b7 \u03ce\u03c1\u03b1 \u03b1\u03bd\u03b1\u03c7\u03ce\u03c1\u03b7\u03c3\u03b7\u03c2 \u03bc\u03b9\u03b1\u03c2 \u03b1\u03bd\u03c4\u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7\u03c2 \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7\u03bd \u03b1\u03bd\u03b1\u03c7\u03ce\u03c1\u03b7\u03c3\u03ae \u03c4\u03b7\u03c2 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03c3\u03c4\u03b1\u03b8\u03bc\u03cc \u03b5\u03ba\u03ba\u03af\u03bd\u03b7\u03c3\u03b7\u03c2. \u0395\u03bd\u03b1\u03bb\u03bb\u03b1\u03ba\u03c4\u03b9\u03ba\u03ac, \u03c0\u03b1\u03c1\u03b1\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03b5\u03af\u03c4\u03b5 \u03c4\u03b7\u03bd \u03ce\u03c1\u03b1 \u03ac\u03c6\u03b9\u03be\u03b7\u03c2 \u03c4\u03b7\u03c2 \u03b1\u03bd\u03c4\u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7\u03c2 \u03c3\u03c4\u03bf\u03bd \u03c3\u03c4\u03b1\u03b8\u03bc\u03cc \u03c4\u03b5\u03c1\u03bc\u03b1\u03c4\u03b9\u03c3\u03bc\u03bf\u03cd \u03c4\u03b7\u03c2.",
|
|
48
|
+
"to": "\u039f \u03c3\u03c4\u03b1\u03b8\u03bc\u03cc\u03c2 \u03c3\u03c4\u03bf\u03bd \u03bf\u03c0\u03bf\u03af\u03bf \u03c4\u03b5\u03bb\u03b5\u03b9\u03ce\u03bd\u03b5\u03b9 \u03b7 \u03b1\u03bd\u03c4\u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7",
|
|
49
|
+
"via": "\u039b\u03af\u03c3\u03c4\u03b1 \u03bc\u03b5 \u03ad\u03c9\u03c2 \u03ba\u03b1\u03b9 5 \u03c3\u03c4\u03b1\u03b8\u03bc\u03bf\u03cd\u03c2 \u03b1\u03c0\u03cc \u03c4\u03bf\u03c5\u03c2 \u03bf\u03c0\u03bf\u03af\u03bf\u03c5\u03c2 \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03c0\u03b5\u03c1\u03ac\u03c3\u03b5\u03b9 \u03b7 \u03b4\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae"
|
|
50
|
+
},
|
|
51
|
+
"description": "\u0394\u03ce\u03c3\u03c4\u03b5 \u03c4\u03bf\u03bd \u03c3\u03c4\u03b1\u03b8\u03bc\u03cc \u03b1\u03c1\u03c7\u03ae\u03c2 \u03ba\u03b1\u03b9 \u03c4\u03ad\u03bb\u03bf\u03c5\u03c2 \u03b3\u03b9\u03b1 \u03c4\u03b7 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03ae \u03c3\u03b1\u03c2, \u03ba\u03b1\u03b9 \u03c0\u03c1\u03bf\u03b1\u03b9\u03c1\u03b5\u03c4\u03b9\u03ba\u03ac \u03ad\u03c9\u03c2 \u03ba\u03b1\u03b9 5 \u03b5\u03bd\u03b4\u03b9\u03ac\u03bc\u03b5\u03c3\u03bf\u03c5\u03c2 \u03c3\u03c4\u03b1\u03b8\u03bc\u03bf\u03cd\u03c2.\n\n\u0395\u03bb\u03ad\u03b3\u03be\u03c4\u03b5 \u03c4\u03bf [stationboard]({stationboard_url}) \u03b3\u03b9\u03b1 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf\u03c5\u03c2 \u03c3\u03c4\u03b1\u03b8\u03bc\u03bf\u03cd\u03c2.",
|
|
52
|
+
"title": "\u0395\u03bb\u03b2\u03b5\u03c4\u03b9\u03ba\u03ad\u03c2 \u0394\u03b7\u03bc\u03cc\u03c3\u03b9\u03b5\u03c2 \u03a3\u03c5\u03b3\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b5\u03c2"
|
|
14
53
|
}
|
|
15
54
|
}
|
|
16
55
|
},
|
|
@@ -47,7 +86,7 @@
|
|
|
47
86
|
"message": "\u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03c3\u03c4\u03bf\u03bd server.\n{error}"
|
|
48
87
|
},
|
|
49
88
|
"config_entry_not_found": {
|
|
50
|
-
"message": "\u0397 \u03c5\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7\u03c2 \
|
|
89
|
+
"message": "\u0397 \u03c5\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u03b5\u03bd\u03c3\u03c9\u03bc\u03ac\u03c4\u03c9\u03c3\u03b7\u03c2 \u0395\u03bb\u03b2\u03b5\u03c4\u03b9\u03ba\u03ce\u03bd \u0394\u03b7\u03bc\u03cc\u03c3\u03b9\u03c9\u03bd \u03a3\u03c5\u03b3\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03b9\u03ce\u03bd \"{target}\" \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5."
|
|
51
90
|
},
|
|
52
91
|
"invalid_data": {
|
|
53
92
|
"message": "\u0397 \u03c1\u03cd\u03b8\u03bc\u03b9\u03c3\u03b7 \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03ba\u03b1\u03c4\u03b1\u03c7\u03ce\u03c1\u03b9\u03c3\u03b7 {config_title} \u03bc\u03b5 \u03bc\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1, \u03b5\u03bb\u03ad\u03b3\u03be\u03c4\u03b5 \u03c3\u03c4\u03bf [stationboard]({stationboard_url}) \u03b5\u03ac\u03bd \u03c4\u03b1 \u03bf\u03bd\u03cc\u03bc\u03b1\u03c4\u03b1 \u03c4\u03c9\u03bd \u03c3\u03c4\u03b1\u03b8\u03bc\u03ce\u03bd \u03c3\u03b1\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9 \u03ad\u03b3\u03ba\u03c5\u03c1\u03b1.\n{error}"
|
|
@@ -59,12 +98,27 @@
|
|
|
59
98
|
"message": "\u03a7\u03c1\u03bf\u03bd\u03b9\u03ba\u03cc \u03cc\u03c1\u03b9\u03bf \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03b5\u03af\u03c3\u03bf\u03b4\u03bf {config_title}.\n{error}"
|
|
60
99
|
}
|
|
61
100
|
},
|
|
101
|
+
"selector": {
|
|
102
|
+
"time_mode": {
|
|
103
|
+
"options": {
|
|
104
|
+
"fixed": "\u03a3\u03b5 \u03bc\u03b9\u03b1 \u03ba\u03b1\u03b8\u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03b7 \u03ce\u03c1\u03b1 \u03c4\u03b7\u03c2 \u03b7\u03bc\u03ad\u03c1\u03b1\u03c2",
|
|
105
|
+
"now": "\u03a4\u03ce\u03c1\u03b1",
|
|
106
|
+
"offset": "\u03a3\u03b5 \u03bc\u03b9\u03b1 \u03bc\u03b5\u03c4\u03b1\u03c4\u03cc\u03c0\u03b9\u03c3\u03b7 \u03b1\u03c0\u03cc \u03c4\u03ce\u03c1\u03b1"
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
"time_station": {
|
|
110
|
+
"options": {
|
|
111
|
+
"arrival": "\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03ce\u03c1\u03b1\u03c2 \u03ac\u03c6\u03b9\u03be\u03b7\u03c2 \u03c3\u03c4\u03bf\u03bd \u03c4\u03b5\u03bb\u03b9\u03ba\u03cc \u03c3\u03c4\u03b1\u03b8\u03bc\u03cc",
|
|
112
|
+
"departure": "\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03ce\u03c1\u03b1\u03c2 \u03b1\u03bd\u03b1\u03c7\u03ce\u03c1\u03b7\u03c3\u03b7\u03c2 \u03b1\u03c0\u03cc \u03c4\u03bf\u03bd \u03c3\u03c4\u03b1\u03b8\u03bc\u03cc \u03b5\u03ba\u03ba\u03af\u03bd\u03b7\u03c3\u03b7\u03c2"
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
},
|
|
62
116
|
"services": {
|
|
63
117
|
"fetch_connections": {
|
|
64
|
-
"description": "\u039b\u03b1\u03bc\u03b2\u03ac\u03bd\u03b5\u03b9 \u03bc\u03b9\u03b1 \u03bb\u03af\u03c3\u03c4\u03b1 \u03bc\u03b5 \u03b1\u03bd\u03c4\u03b1\u03c0\u03bf\u03ba\u03c1\u03af\u03c3\u03b5\u03b9\u03c2 \u03b1\u03c0\u03cc \u03c4\u03b9\u03c2 \
|
|
118
|
+
"description": "\u039b\u03b1\u03bc\u03b2\u03ac\u03bd\u03b5\u03b9 \u03bc\u03b9\u03b1 \u03bb\u03af\u03c3\u03c4\u03b1 \u03bc\u03b5 \u03b1\u03bd\u03c4\u03b1\u03c0\u03bf\u03ba\u03c1\u03af\u03c3\u03b5\u03b9\u03c2 \u03b1\u03c0\u03cc \u03c4\u03b9\u03c2 \u0395\u03bb\u03b2\u03b5\u03c4\u03b9\u03ba\u03ad\u03c2 \u0394\u03b7\u03bc\u03cc\u03c3\u03b9\u03b5\u03c2 \u03a3\u03c5\u03b3\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b5\u03c2.",
|
|
65
119
|
"fields": {
|
|
66
120
|
"config_entry_id": {
|
|
67
|
-
"description": "\u03a5\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \
|
|
121
|
+
"description": "\u03a5\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7 \u0395\u03bb\u03b2\u03b5\u03c4\u03b9\u03ba\u03ce\u03bd \u0394\u03b7\u03bc\u03cc\u03c3\u03b9\u03c9\u03bd \u03a3\u03c5\u03b3\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03b9\u03ce\u03bd \u03b3\u03b9\u03b1 \u03c4\u03b7 \u03bb\u03ae\u03c8\u03b7 \u03b1\u03bd\u03c4\u03b1\u03c0\u03bf\u03ba\u03c1\u03af\u03c3\u03b5\u03c9\u03bd.",
|
|
68
122
|
"name": "\u03a5\u03c0\u03cc\u03c3\u03c4\u03b1\u03c3\u03b7"
|
|
69
123
|
},
|
|
70
124
|
"limit": {
|
|
@@ -70,6 +70,21 @@
|
|
|
70
70
|
}
|
|
71
71
|
},
|
|
72
72
|
"humidifier": {
|
|
73
|
+
"evaporative_humidifier": {
|
|
74
|
+
"state_attributes": {
|
|
75
|
+
"mode": {
|
|
76
|
+
"state": {
|
|
77
|
+
"drying_filter": "Filtro essiccatore",
|
|
78
|
+
"high": "Alto/a",
|
|
79
|
+
"low": "Basso/a",
|
|
80
|
+
"medium": "Medio/a",
|
|
81
|
+
"quiet": "Silenzioso",
|
|
82
|
+
"sleep": "Sonno",
|
|
83
|
+
"target_humidity": "Umidit\u00e0 desiderata"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
},
|
|
73
88
|
"humidifier": {
|
|
74
89
|
"state_attributes": {
|
|
75
90
|
"last_run_success": {
|
|
@@ -81,6 +96,35 @@
|
|
|
81
96
|
}
|
|
82
97
|
}
|
|
83
98
|
},
|
|
99
|
+
"light": {
|
|
100
|
+
"light": {
|
|
101
|
+
"state_attributes": {
|
|
102
|
+
"effect": {
|
|
103
|
+
"state": {
|
|
104
|
+
"autumn": "Autunno",
|
|
105
|
+
"breathing": "Respirazione",
|
|
106
|
+
"christmas": "Natalizio",
|
|
107
|
+
"colorful": "Colorato",
|
|
108
|
+
"cool": "Freddo",
|
|
109
|
+
"fade": "Dissolvenza",
|
|
110
|
+
"flashing": "Lampeggiamento",
|
|
111
|
+
"flickering": "Sfarfallio",
|
|
112
|
+
"flow": "Flusso",
|
|
113
|
+
"forest": "Foresta",
|
|
114
|
+
"halloween": "Halloween",
|
|
115
|
+
"modern": "Moderno",
|
|
116
|
+
"ocean": "Oceano",
|
|
117
|
+
"relax": "Relax",
|
|
118
|
+
"rose": "Risveglio",
|
|
119
|
+
"smooth": "Diffusa",
|
|
120
|
+
"strobe": "Luce stroboscopica",
|
|
121
|
+
"sunset": "Tramonto",
|
|
122
|
+
"vitality": "Vitalit\u00e0"
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
},
|
|
84
128
|
"lock": {
|
|
85
129
|
"lock": {
|
|
86
130
|
"state_attributes": {
|
|
@@ -100,6 +144,15 @@
|
|
|
100
144
|
"light_level": {
|
|
101
145
|
"name": "Livello di luce"
|
|
102
146
|
},
|
|
147
|
+
"water_level": {
|
|
148
|
+
"name": "Livello dell'acqua",
|
|
149
|
+
"state": {
|
|
150
|
+
"empty": "Vuoto",
|
|
151
|
+
"high": "Alto/a",
|
|
152
|
+
"low": "Basso/a",
|
|
153
|
+
"medium": "Medio/a"
|
|
154
|
+
}
|
|
155
|
+
},
|
|
103
156
|
"wifi_signal": {
|
|
104
157
|
"name": "Segnale Wi Fi"
|
|
105
158
|
}
|
|
@@ -153,7 +153,12 @@ async def make_device_data(
|
|
|
153
153
|
)
|
|
154
154
|
devices_data.vacuums.append((device, coordinator))
|
|
155
155
|
|
|
156
|
-
if isinstance(device, Device) and device.device_type
|
|
156
|
+
if isinstance(device, Device) and device.device_type in [
|
|
157
|
+
"Smart Lock",
|
|
158
|
+
"Smart Lock Lite",
|
|
159
|
+
"Smart Lock Pro",
|
|
160
|
+
"Smart Lock Ultra",
|
|
161
|
+
]:
|
|
157
162
|
coordinator = await coordinator_for_device(
|
|
158
163
|
hass, entry, api, device, coordinators_by_id
|
|
159
164
|
)
|
|
@@ -48,10 +48,18 @@ BINARY_SENSOR_DESCRIPTIONS_BY_DEVICE_TYPES = {
|
|
|
48
48
|
CALIBRATION_DESCRIPTION,
|
|
49
49
|
DOOR_OPEN_DESCRIPTION,
|
|
50
50
|
),
|
|
51
|
+
"Smart Lock Lite": (
|
|
52
|
+
CALIBRATION_DESCRIPTION,
|
|
53
|
+
DOOR_OPEN_DESCRIPTION,
|
|
54
|
+
),
|
|
51
55
|
"Smart Lock Pro": (
|
|
52
56
|
CALIBRATION_DESCRIPTION,
|
|
53
57
|
DOOR_OPEN_DESCRIPTION,
|
|
54
58
|
),
|
|
59
|
+
"Smart Lock Ultra": (
|
|
60
|
+
CALIBRATION_DESCRIPTION,
|
|
61
|
+
DOOR_OPEN_DESCRIPTION,
|
|
62
|
+
),
|
|
55
63
|
}
|
|
56
64
|
|
|
57
65
|
|
|
@@ -69,7 +77,6 @@ async def async_setup_entry(
|
|
|
69
77
|
for description in BINARY_SENSOR_DESCRIPTIONS_BY_DEVICE_TYPES[
|
|
70
78
|
device.device_type
|
|
71
79
|
]
|
|
72
|
-
if device.device_type in BINARY_SENSOR_DESCRIPTIONS_BY_DEVICE_TYPES
|
|
73
80
|
)
|
|
74
81
|
|
|
75
82
|
|
|
@@ -134,8 +134,10 @@ SENSOR_DESCRIPTIONS_BY_DEVICE_TYPES = {
|
|
|
134
134
|
BATTERY_DESCRIPTION,
|
|
135
135
|
CO2_DESCRIPTION,
|
|
136
136
|
),
|
|
137
|
-
"Smart Lock Pro": (BATTERY_DESCRIPTION,),
|
|
138
137
|
"Smart Lock": (BATTERY_DESCRIPTION,),
|
|
138
|
+
"Smart Lock Lite": (BATTERY_DESCRIPTION,),
|
|
139
|
+
"Smart Lock Pro": (BATTERY_DESCRIPTION,),
|
|
140
|
+
"Smart Lock Ultra": (BATTERY_DESCRIPTION,),
|
|
139
141
|
}
|
|
140
142
|
|
|
141
143
|
|
|
@@ -151,7 +153,6 @@ async def async_setup_entry(
|
|
|
151
153
|
SwitchBotCloudSensor(data.api, device, coordinator, description)
|
|
152
154
|
for device, coordinator in data.devices.sensors
|
|
153
155
|
for description in SENSOR_DESCRIPTIONS_BY_DEVICE_TYPES[device.device_type]
|
|
154
|
-
if device.device_type in SENSOR_DESCRIPTIONS_BY_DEVICE_TYPES
|
|
155
156
|
)
|
|
156
157
|
|
|
157
158
|
|
|
@@ -34,12 +34,14 @@
|
|
|
34
34
|
},
|
|
35
35
|
"user": {
|
|
36
36
|
"data": {
|
|
37
|
+
"api_key": "Jeton d\u2019API",
|
|
37
38
|
"platform": "Plateforme"
|
|
38
39
|
},
|
|
39
40
|
"data_description": {
|
|
40
41
|
"api_key": "Le jeton d'API de votre bot.",
|
|
41
42
|
"platform": "Implantation du bot Telegram"
|
|
42
|
-
}
|
|
43
|
+
},
|
|
44
|
+
"description": "Pour cr\u00e9er un bot Telegram, suivez ces \u00e9tapes\u00a0:\n\n1. Ouvrez Telegram et d\u00e9marrez une discussion avec [{botfather_username}]({botfather_url}).\n1. Envoyez la commande `/newbot`.\n1. Suivez les instructions pour cr\u00e9er votre bot et obtenir votre jeton API."
|
|
43
45
|
},
|
|
44
46
|
"webhooks": {
|
|
45
47
|
"data": {
|