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.
Files changed (134) hide show
  1. homeassistant/components/ai_task/translations/fr.json +22 -1
  2. homeassistant/components/ai_task/translations/it.json +22 -0
  3. homeassistant/components/alexa_devices/translations/it.json +29 -0
  4. homeassistant/components/anthropic/translations/fr.json +37 -0
  5. homeassistant/components/anthropic/translations/it.json +37 -0
  6. homeassistant/components/assist_satellite/translations/fr.json +8 -0
  7. homeassistant/components/assist_satellite/translations/it.json +8 -0
  8. homeassistant/components/blue_current/translations/el.json +3 -1
  9. homeassistant/components/bluetooth/translations/el.json +3 -0
  10. homeassistant/components/denonavr/translations/el.json +5 -0
  11. homeassistant/components/derivative/translations/fr.json +4 -0
  12. homeassistant/components/derivative/translations/it.json +4 -0
  13. homeassistant/components/devolo_home_control/translations/it.json +6 -0
  14. homeassistant/components/ecovacs/translations/el.json +1 -0
  15. homeassistant/components/emoncms/translations/el.json +3 -0
  16. homeassistant/components/ezviz/translations/it.json +10 -0
  17. homeassistant/components/fronius/translations/el.json +14 -1
  18. homeassistant/components/google_generative_ai_conversation/translations/fr.json +82 -1
  19. homeassistant/components/google_generative_ai_conversation/translations/it.json +20 -0
  20. homeassistant/components/homeassistant/translations/fr.json +1 -0
  21. homeassistant/components/homeassistant/translations/it.json +1 -0
  22. homeassistant/components/homeassistant_hardware/translations/el.json +1 -0
  23. homeassistant/components/homeassistant_hardware/translations/fr.json +4 -0
  24. homeassistant/components/homeassistant_hardware/translations/it.json +6 -0
  25. homeassistant/components/homeassistant_hardware/translations/sk.json +1 -0
  26. homeassistant/components/homeassistant_hardware/translations/zh-Hans.json +1 -0
  27. homeassistant/components/homeassistant_sky_connect/translations/el.json +2 -0
  28. homeassistant/components/homeassistant_sky_connect/translations/fr.json +4 -0
  29. homeassistant/components/homeassistant_sky_connect/translations/it.json +4 -0
  30. homeassistant/components/homeassistant_sky_connect/translations/sk.json +2 -0
  31. homeassistant/components/homeassistant_sky_connect/translations/zh-Hans.json +2 -0
  32. homeassistant/components/homeassistant_yellow/translations/el.json +2 -0
  33. homeassistant/components/homeassistant_yellow/translations/fr.json +2 -0
  34. homeassistant/components/homeassistant_yellow/translations/it.json +2 -0
  35. homeassistant/components/homeassistant_yellow/translations/sk.json +2 -0
  36. homeassistant/components/homeassistant_yellow/translations/zh-Hans.json +2 -0
  37. homeassistant/components/imap/translations/fr.json +2 -0
  38. homeassistant/components/lifx/translations/el.json +2 -1
  39. homeassistant/components/litterrobot/translations/it.json +4 -0
  40. homeassistant/components/mqtt/config_flow.py +34 -7
  41. homeassistant/components/mqtt/strings.json +11 -4
  42. homeassistant/components/mqtt/translations/bg.json +1 -3
  43. homeassistant/components/mqtt/translations/cs.json +2 -6
  44. homeassistant/components/mqtt/translations/de.json +23 -16
  45. homeassistant/components/mqtt/translations/el.json +11 -0
  46. homeassistant/components/mqtt/translations/en-GB.json +2 -6
  47. homeassistant/components/mqtt/translations/en.json +13 -6
  48. homeassistant/components/mqtt/translations/es.json +2 -6
  49. homeassistant/components/mqtt/translations/et.json +13 -6
  50. homeassistant/components/mqtt/translations/fr.json +27 -6
  51. homeassistant/components/mqtt/translations/fy.json +2 -5
  52. homeassistant/components/mqtt/translations/ga.json +2 -6
  53. homeassistant/components/mqtt/translations/he.json +2 -6
  54. homeassistant/components/mqtt/translations/hu.json +2 -6
  55. homeassistant/components/mqtt/translations/it.json +25 -0
  56. homeassistant/components/mqtt/translations/ja.json +1 -4
  57. homeassistant/components/mqtt/translations/lt.json +2 -6
  58. homeassistant/components/mqtt/translations/mk.json +1 -6
  59. homeassistant/components/mqtt/translations/nl.json +2 -6
  60. homeassistant/components/mqtt/translations/pt.json +2 -6
  61. homeassistant/components/mqtt/translations/ru.json +2 -6
  62. homeassistant/components/mqtt/translations/sk.json +13 -6
  63. homeassistant/components/mqtt/translations/sl.json +2 -6
  64. homeassistant/components/mqtt/translations/sv.json +2 -6
  65. homeassistant/components/mqtt/translations/tr.json +2 -6
  66. homeassistant/components/mqtt/translations/zh-Hans.json +2 -6
  67. homeassistant/components/mqtt/translations/zh-Hant.json +13 -6
  68. homeassistant/components/nextdns/translations/fr.json +6 -0
  69. homeassistant/components/ntfy/translations/hu.json +53 -4
  70. homeassistant/components/nut/translations/el.json +42 -0
  71. homeassistant/components/ollama/translations/fr.json +33 -0
  72. homeassistant/components/ollama/translations/it.json +35 -0
  73. homeassistant/components/openai_conversation/translations/fr.json +56 -0
  74. homeassistant/components/openai_conversation/translations/it.json +56 -0
  75. homeassistant/components/paperless_ngx/manifest.json +1 -1
  76. homeassistant/components/peblar/translations/el.json +12 -0
  77. homeassistant/components/pegel_online/translations/el.json +2 -1
  78. homeassistant/components/pegel_online/translations/es.json +2 -1
  79. homeassistant/components/pegel_online/translations/et.json +2 -1
  80. homeassistant/components/pegel_online/translations/sk.json +2 -1
  81. homeassistant/components/pegel_online/translations/zh-Hans.json +2 -1
  82. homeassistant/components/pegel_online/translations/zh-Hant.json +2 -1
  83. homeassistant/components/pi_hole/translations/fr.json +1 -0
  84. homeassistant/components/playstation_network/translations/fr.json +15 -0
  85. homeassistant/components/playstation_network/translations/hu.json +44 -1
  86. homeassistant/components/playstation_network/translations/it.json +43 -0
  87. homeassistant/components/rest/data.py +40 -1
  88. homeassistant/components/screenlogic/translations/el.json +7 -0
  89. homeassistant/components/sensibo/translations/el.json +1 -0
  90. homeassistant/components/shelly/entity.py +4 -1
  91. homeassistant/components/sonos/translations/fr.json +6 -0
  92. homeassistant/components/sonos/translations/it.json +11 -0
  93. homeassistant/components/stream/__init__.py +8 -4
  94. homeassistant/components/stream/const.py +2 -1
  95. homeassistant/components/stream/core.py +3 -1
  96. homeassistant/components/subaru/translations/el.json +2 -0
  97. homeassistant/components/subaru/translations/sk.json +2 -0
  98. homeassistant/components/subaru/translations/zh-Hans.json +2 -0
  99. homeassistant/components/swiss_public_transport/translations/el.json +60 -6
  100. homeassistant/components/switchbot/translations/it.json +53 -0
  101. homeassistant/components/switchbot_cloud/__init__.py +6 -1
  102. homeassistant/components/switchbot_cloud/binary_sensor.py +8 -1
  103. homeassistant/components/switchbot_cloud/sensor.py +3 -2
  104. homeassistant/components/telegram_bot/translations/fr.json +3 -1
  105. homeassistant/components/telegram_bot/translations/it.json +30 -0
  106. homeassistant/components/thermopro/translations/el.json +7 -0
  107. homeassistant/components/thermopro/translations/es.json +7 -0
  108. homeassistant/components/thermopro/translations/sk.json +7 -0
  109. homeassistant/components/thermopro/translations/zh-Hans.json +7 -0
  110. homeassistant/components/tibber/manifest.json +1 -1
  111. homeassistant/components/tibber/sensor.py +1 -1
  112. homeassistant/components/vegehub/translations/it.json +40 -0
  113. homeassistant/components/vulcan/manifest.json +1 -1
  114. homeassistant/components/wled/translations/fr.json +1 -0
  115. homeassistant/components/wmspro/cover.py +2 -0
  116. homeassistant/components/xiaomi_miio/translations/fr.json +24 -2
  117. homeassistant/components/zha/translations/fr.json +50 -0
  118. homeassistant/components/zha/translations/it.json +50 -0
  119. homeassistant/components/zwave_js/translations/el.json +33 -0
  120. homeassistant/components/zwave_js/translations/es.json +32 -0
  121. homeassistant/components/zwave_js/translations/fr.json +6 -0
  122. homeassistant/components/zwave_js/translations/hu.json +41 -1
  123. homeassistant/components/zwave_js/translations/it.json +26 -0
  124. homeassistant/components/zwave_js/translations/sk.json +33 -0
  125. homeassistant/components/zwave_js/translations/zh-Hans.json +33 -0
  126. homeassistant/components/zwave_js/translations/zh-Hant.json +32 -0
  127. homeassistant/const.py +1 -1
  128. {homeassistant-2025.7.0b3.dist-info → homeassistant-2025.7.0b4.dist-info}/METADATA +1 -1
  129. {homeassistant-2025.7.0b3.dist-info → homeassistant-2025.7.0b4.dist-info}/RECORD +134 -129
  130. {homeassistant-2025.7.0b3.dist-info → homeassistant-2025.7.0b4.dist-info}/WHEEL +0 -0
  131. {homeassistant-2025.7.0b3.dist-info → homeassistant-2025.7.0b4.dist-info}/entry_points.txt +0 -0
  132. {homeassistant-2025.7.0b3.dist-info → homeassistant-2025.7.0b4.dist-info}/licenses/LICENSE.md +0 -0
  133. {homeassistant-2025.7.0b3.dist-info → homeassistant-2025.7.0b4.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
  134. {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("content-type"))
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 = f"{coordinator.mac}-{block.description}-{sensor_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
- OUTPUT_IDLE_TIMEOUT = 300 # Idle timeout due to inactivity
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._timeout, self.fire)
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
- "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."
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
- "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."
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 \u03b5\u03bb\u03b2\u03b5\u03c4\u03b9\u03ba\u03ce\u03bd \u03b4\u03b7\u03bc\u03cc\u03c3\u03b9\u03c9\u03bd \u03c3\u03c5\u03b3\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03b9\u03ce\u03bd \" {target} \" \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5."
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 \u03b5\u03bb\u03b2\u03b5\u03c4\u03b9\u03ba\u03ad\u03c2 \u03b4\u03b7\u03bc\u03cc\u03c3\u03b9\u03b5\u03c2 \u03c3\u03c5\u03b3\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b5\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 \u03b5\u03bb\u03b2\u03b5\u03c4\u03b9\u03ba\u03ae\u03c2 \u03b4\u03b7\u03bc\u03cc\u03c3\u03b9\u03b1\u03c2 \u03c3\u03c5\u03b3\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b1\u03c2 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03bb\u03ae\u03c8\u03b7 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03b5\u03c9\u03bd.",
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.startswith("Smart Lock"):
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": {