homeassistant 2025.11.0__py3-none-any.whl → 2025.11.0b2__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 (256) hide show
  1. homeassistant/components/alexa_devices/manifest.json +1 -1
  2. homeassistant/components/alexa_devices/translations/bg.json +0 -13
  3. homeassistant/components/ambient_network/sensor.py +5 -5
  4. homeassistant/components/blink/translations/bg.json +1 -8
  5. homeassistant/components/brother/translations/bg.json +6 -0
  6. homeassistant/components/brother/translations/ca.json +5 -1
  7. homeassistant/components/brother/translations/cs.json +2 -2
  8. homeassistant/components/brother/translations/da.json +5 -1
  9. homeassistant/components/brother/translations/de.json +4 -4
  10. homeassistant/components/brother/translations/el.json +5 -1
  11. homeassistant/components/brother/translations/en-GB.json +4 -4
  12. homeassistant/components/brother/translations/en.json +4 -4
  13. homeassistant/components/brother/translations/es-419.json +5 -0
  14. homeassistant/components/brother/translations/es.json +2 -2
  15. homeassistant/components/brother/translations/et.json +2 -2
  16. homeassistant/components/brother/translations/fi.json +5 -1
  17. homeassistant/components/brother/translations/fr.json +5 -1
  18. homeassistant/components/brother/translations/ga.json +10 -2
  19. homeassistant/components/brother/translations/hu.json +5 -1
  20. homeassistant/components/brother/translations/id.json +5 -1
  21. homeassistant/components/brother/translations/it.json +5 -1
  22. homeassistant/components/brother/translations/ja.json +5 -1
  23. homeassistant/components/brother/translations/ko.json +5 -1
  24. homeassistant/components/brother/translations/lb.json +2 -1
  25. homeassistant/components/brother/translations/lt.json +2 -2
  26. homeassistant/components/brother/translations/nb.json +5 -1
  27. homeassistant/components/brother/translations/nl.json +5 -1
  28. homeassistant/components/brother/translations/pl.json +7 -3
  29. homeassistant/components/brother/translations/pt-BR.json +5 -1
  30. homeassistant/components/brother/translations/pt.json +10 -2
  31. homeassistant/components/brother/translations/ro.json +2 -1
  32. homeassistant/components/brother/translations/ru.json +5 -1
  33. homeassistant/components/brother/translations/sk.json +2 -2
  34. homeassistant/components/brother/translations/sl.json +10 -2
  35. homeassistant/components/brother/translations/sv.json +10 -2
  36. homeassistant/components/brother/translations/tr.json +5 -1
  37. homeassistant/components/brother/translations/uk.json +5 -1
  38. homeassistant/components/brother/translations/vi.json +5 -1
  39. homeassistant/components/brother/translations/zh-Hans.json +2 -2
  40. homeassistant/components/brother/translations/zh-Hant.json +4 -4
  41. homeassistant/components/bryant_evolution/translations/lt.json +0 -3
  42. homeassistant/components/control4/translations/es.json +1 -2
  43. homeassistant/components/cover/translations/es.json +7 -7
  44. homeassistant/components/daikin/translations/es.json +0 -1
  45. homeassistant/components/ecovacs/translations/es.json +0 -27
  46. homeassistant/components/ecovacs/translations/sr-Latn.json +0 -18
  47. homeassistant/components/enmax/__init__.py +1 -0
  48. homeassistant/components/enmax/manifest.json +6 -0
  49. homeassistant/components/esphome/__init__.py +3 -5
  50. homeassistant/components/esphome/translations/he.json +2 -2
  51. homeassistant/components/firefly_iii/translations/bg.json +0 -3
  52. homeassistant/components/foscam/manifest.json +1 -1
  53. homeassistant/components/frontend/__init__.py +1 -1
  54. homeassistant/components/frontend/manifest.json +1 -1
  55. homeassistant/components/google_sheets/translations/bg.json +0 -10
  56. homeassistant/components/google_sheets/translations/es.json +0 -9
  57. homeassistant/components/google_sheets/translations/sr-Latn.json +0 -14
  58. homeassistant/components/habitica/translations/es.json +0 -26
  59. homeassistant/components/hassio/issues.py +2 -0
  60. homeassistant/components/hassio/translations/es.json +0 -13
  61. homeassistant/components/holiday/manifest.json +1 -1
  62. homeassistant/components/homeassistant_connect_zbt2/config_flow.py +1 -18
  63. homeassistant/components/homeassistant_connect_zbt2/const.py +0 -58
  64. homeassistant/components/homeassistant_hardware/firmware_config_flow.py +0 -5
  65. homeassistant/components/homewizard/translations/es.json +2 -4
  66. homeassistant/components/http/__init__.py +2 -13
  67. homeassistant/components/http/strings.json +0 -4
  68. homeassistant/components/http/translations/de.json +0 -4
  69. homeassistant/components/http/translations/en-GB.json +0 -4
  70. homeassistant/components/http/translations/en.json +0 -4
  71. homeassistant/components/http/translations/es.json +0 -4
  72. homeassistant/components/http/translations/et.json +0 -4
  73. homeassistant/components/http/translations/lt.json +0 -4
  74. homeassistant/components/http/translations/sk.json +0 -4
  75. homeassistant/components/http/translations/zh-Hant.json +0 -4
  76. homeassistant/components/input_boolean/translations/cs.json +2 -2
  77. homeassistant/components/jewish_calendar/translations/es.json +0 -6
  78. homeassistant/components/knx/translations/bg.json +0 -93
  79. homeassistant/components/knx/translations/es.json +8 -39
  80. homeassistant/components/knx/translations/sr-Latn.json +1 -44
  81. homeassistant/components/lametric/translations/es.json +0 -1
  82. homeassistant/components/lg_thinq/sensor.py +0 -1
  83. homeassistant/components/litterrobot/manifest.json +1 -1
  84. homeassistant/components/london_underground/translations/he.json +0 -1
  85. homeassistant/components/matrix/translations/bg.json +1 -2
  86. homeassistant/components/matter/translations/bg.json +0 -7
  87. homeassistant/components/matter/translations/es.json +3 -26
  88. homeassistant/components/mcp/translations/es.json +0 -4
  89. homeassistant/components/mqtt/translations/es.json +4 -4
  90. homeassistant/components/mqtt/translations/he.json +2 -2
  91. homeassistant/components/nederlandse_spoorwegen/translations/bg.json +1 -2
  92. homeassistant/components/nextdns/translations/bg.json +1 -2
  93. homeassistant/components/nina/translations/bg.json +6 -0
  94. homeassistant/components/nina/translations/es.json +1 -40
  95. homeassistant/components/nina/translations/sr-Latn.json +0 -28
  96. homeassistant/components/nintendo_parental_controls/translations/bg.json +0 -19
  97. homeassistant/components/nuki/translations/es.json +0 -4
  98. homeassistant/components/octoprint/translations/es.json +0 -16
  99. homeassistant/components/oralb/translations/es.json +0 -1
  100. homeassistant/components/overkiz/translations/lt.json +1 -2
  101. homeassistant/components/plugwise/climate.py +26 -86
  102. homeassistant/components/plugwise/manifest.json +1 -1
  103. homeassistant/components/plugwise/strings.json +0 -3
  104. homeassistant/components/plugwise/translations/de.json +0 -3
  105. homeassistant/components/plugwise/translations/en-GB.json +0 -3
  106. homeassistant/components/plugwise/translations/en.json +0 -3
  107. homeassistant/components/plugwise/translations/es.json +0 -3
  108. homeassistant/components/plugwise/translations/et.json +0 -3
  109. homeassistant/components/plugwise/translations/lt.json +0 -3
  110. homeassistant/components/plugwise/translations/sk.json +0 -3
  111. homeassistant/components/plugwise/translations/zh-Hant.json +0 -3
  112. homeassistant/components/portainer/translations/bg.json +1 -8
  113. homeassistant/components/portainer/translations/sr-Latn.json +1 -3
  114. homeassistant/components/probe_plus/translations/es.json +0 -5
  115. homeassistant/components/ps4/translations/es.json +1 -9
  116. homeassistant/components/reolink/manifest.json +1 -1
  117. homeassistant/components/reolink/translations/cs.json +0 -1
  118. homeassistant/components/reolink/translations/en-GB.json +0 -1
  119. homeassistant/components/reolink/translations/es.json +0 -1
  120. homeassistant/components/reolink/translations/et.json +0 -1
  121. homeassistant/components/reolink/translations/lt.json +0 -1
  122. homeassistant/components/reolink/translations/pl.json +7 -8
  123. homeassistant/components/reolink/translations/sk.json +0 -1
  124. homeassistant/components/ruuvitag_ble/manifest.json +1 -1
  125. homeassistant/components/shelly/translations/bg.json +1 -2
  126. homeassistant/components/shelly/translations/es.json +3 -10
  127. homeassistant/components/slide_local/translations/es.json +1 -1
  128. homeassistant/components/smarttub/manifest.json +1 -1
  129. homeassistant/components/somfy_mylink/translations/es.json +3 -3
  130. homeassistant/components/soundtouch/__init__.py +1 -10
  131. homeassistant/components/sql/translations/es.json +0 -27
  132. homeassistant/components/sql/translations/sr-Latn.json +0 -9
  133. homeassistant/components/squeezebox/translations/es.json +0 -63
  134. homeassistant/components/{sunricher_dali → sunricher_dali_center}/__init__.py +2 -2
  135. homeassistant/components/{sunricher_dali → sunricher_dali_center}/config_flow.py +2 -2
  136. homeassistant/components/sunricher_dali_center/const.py +5 -0
  137. homeassistant/components/{sunricher_dali → sunricher_dali_center}/light.py +2 -2
  138. homeassistant/components/{sunricher_dali → sunricher_dali_center}/manifest.json +3 -3
  139. homeassistant/components/{sunricher_dali → sunricher_dali_center}/strings.json +6 -4
  140. homeassistant/components/sunricher_dali_center/translations/cs.json +29 -0
  141. homeassistant/components/{sunricher_dali → sunricher_dali_center}/translations/de.json +7 -5
  142. homeassistant/components/sunricher_dali_center/translations/el.json +11 -0
  143. homeassistant/components/{sunricher_dali → sunricher_dali_center}/translations/en-GB.json +6 -4
  144. homeassistant/components/{sunricher_dali → sunricher_dali_center}/translations/en.json +6 -4
  145. homeassistant/components/{sunricher_dali → sunricher_dali_center}/translations/es.json +6 -4
  146. homeassistant/components/sunricher_dali_center/translations/et.json +29 -0
  147. homeassistant/components/sunricher_dali_center/translations/ga.json +29 -0
  148. homeassistant/components/sunricher_dali_center/translations/he.json +11 -0
  149. homeassistant/components/sunricher_dali_center/translations/it.json +11 -0
  150. homeassistant/components/sunricher_dali_center/translations/lt.json +29 -0
  151. homeassistant/components/sunricher_dali_center/translations/nl.json +11 -0
  152. homeassistant/components/sunricher_dali_center/translations/pt.json +29 -0
  153. homeassistant/components/sunricher_dali_center/translations/sk.json +29 -0
  154. homeassistant/components/sunricher_dali_center/translations/sr-Latn.json +11 -0
  155. homeassistant/components/sunricher_dali_center/translations/zh-Hans.json +29 -0
  156. homeassistant/components/sunricher_dali_center/translations/zh-Hant.json +29 -0
  157. homeassistant/components/{sunricher_dali → sunricher_dali_center}/types.py +2 -2
  158. homeassistant/components/switch_as_x/translations/cs.json +1 -1
  159. homeassistant/components/switch_as_x/translations/es.json +4 -4
  160. homeassistant/components/system_bridge/translations/es.json +0 -1
  161. homeassistant/components/telegram_bot/translations/bg.json +0 -11
  162. homeassistant/components/telegram_bot/translations/es.json +7 -42
  163. homeassistant/components/template/translations/es.json +3 -11
  164. homeassistant/components/tesla_fleet/manifest.json +1 -1
  165. homeassistant/components/teslemetry/manifest.json +1 -1
  166. homeassistant/components/tessie/manifest.json +1 -1
  167. homeassistant/components/tessie/translations/es.json +0 -3
  168. homeassistant/components/transmission/translations/bg.json +0 -10
  169. homeassistant/components/usb/utils.py +23 -22
  170. homeassistant/components/vesync/humidifier.py +1 -3
  171. homeassistant/components/vesync/strings.json +0 -11
  172. homeassistant/components/vesync/translations/bg.json +0 -11
  173. homeassistant/components/vesync/translations/cs.json +0 -11
  174. homeassistant/components/vesync/translations/de.json +0 -11
  175. homeassistant/components/vesync/translations/en-GB.json +0 -11
  176. homeassistant/components/vesync/translations/en.json +0 -11
  177. homeassistant/components/vesync/translations/es.json +0 -11
  178. homeassistant/components/vesync/translations/et.json +0 -11
  179. homeassistant/components/vesync/translations/he.json +0 -11
  180. homeassistant/components/vesync/translations/lt.json +0 -11
  181. homeassistant/components/vesync/translations/sk.json +0 -11
  182. homeassistant/components/vesync/translations/zh-Hans.json +0 -11
  183. homeassistant/components/vesync/translations/zh-Hant.json +0 -11
  184. homeassistant/components/volvo/translations/bg.json +0 -5
  185. homeassistant/components/volvo/translations/cs.json +0 -5
  186. homeassistant/components/volvo/translations/en-GB.json +0 -5
  187. homeassistant/components/volvo/translations/es.json +0 -11
  188. homeassistant/components/volvo/translations/lt.json +0 -5
  189. homeassistant/components/volvo/translations/sk.json +0 -5
  190. homeassistant/components/whirlpool/translations/bg.json +0 -22
  191. homeassistant/components/whirlpool/translations/es.json +0 -81
  192. homeassistant/components/workday/manifest.json +1 -1
  193. homeassistant/components/xbox/translations/bg.json +0 -36
  194. homeassistant/components/xbox/translations/es.json +0 -21
  195. homeassistant/components/xbox/translations/sr-Latn.json +0 -1
  196. homeassistant/components/yardian/translations/bg.json +0 -7
  197. homeassistant/components/yardian/translations/es.json +0 -16
  198. homeassistant/components/zha/__init__.py +1 -16
  199. homeassistant/components/zha/config_flow.py +48 -163
  200. homeassistant/components/zha/manifest.json +1 -1
  201. homeassistant/components/zha/radio_manager.py +2 -3
  202. homeassistant/components/zha/strings.json +15 -68
  203. homeassistant/components/zha/translations/bg.json +3 -20
  204. homeassistant/components/zha/translations/ca.json +3 -0
  205. homeassistant/components/zha/translations/cs.json +16 -30
  206. homeassistant/components/zha/translations/da.json +3 -0
  207. homeassistant/components/zha/translations/de.json +15 -68
  208. homeassistant/components/zha/translations/el.json +3 -0
  209. homeassistant/components/zha/translations/en-GB.json +15 -68
  210. homeassistant/components/zha/translations/en.json +15 -68
  211. homeassistant/components/zha/translations/es.json +18 -119
  212. homeassistant/components/zha/translations/et.json +15 -68
  213. homeassistant/components/zha/translations/fi.json +3 -0
  214. homeassistant/components/zha/translations/fr.json +18 -0
  215. homeassistant/components/zha/translations/ga.json +3 -0
  216. homeassistant/components/zha/translations/gsw.json +3 -0
  217. homeassistant/components/zha/translations/hu.json +3 -0
  218. homeassistant/components/zha/translations/id.json +3 -0
  219. homeassistant/components/zha/translations/it.json +3 -0
  220. homeassistant/components/zha/translations/ja.json +3 -0
  221. homeassistant/components/zha/translations/ko.json +9 -0
  222. homeassistant/components/zha/translations/lt.json +15 -68
  223. homeassistant/components/zha/translations/nb.json +3 -0
  224. homeassistant/components/zha/translations/nl.json +3 -0
  225. homeassistant/components/zha/translations/pl.json +3 -0
  226. homeassistant/components/zha/translations/pt-BR.json +3 -0
  227. homeassistant/components/zha/translations/pt.json +18 -0
  228. homeassistant/components/zha/translations/ro.json +3 -0
  229. homeassistant/components/zha/translations/ru.json +18 -0
  230. homeassistant/components/zha/translations/sk.json +15 -68
  231. homeassistant/components/zha/translations/sl.json +9 -0
  232. homeassistant/components/zha/translations/sr-Latn.json +14 -0
  233. homeassistant/components/zha/translations/sv.json +4 -0
  234. homeassistant/components/zha/translations/tr.json +3 -0
  235. homeassistant/components/zha/translations/uk.json +3 -0
  236. homeassistant/components/zha/translations/zh-Hans.json +16 -30
  237. homeassistant/components/zha/translations/zh-Hant.json +15 -68
  238. homeassistant/components/zwave_js/translations/es.json +0 -3
  239. homeassistant/const.py +1 -1
  240. homeassistant/generated/config_flows.py +1 -1
  241. homeassistant/generated/integrations.json +7 -2
  242. homeassistant/package_constraints.txt +1 -1
  243. homeassistant/util/language.py +7 -17
  244. {homeassistant-2025.11.0.dist-info → homeassistant-2025.11.0b2.dist-info}/METADATA +1 -1
  245. {homeassistant-2025.11.0.dist-info → homeassistant-2025.11.0b2.dist-info}/RECORD +251 -240
  246. homeassistant/components/fing/translations/bg.json +0 -20
  247. homeassistant/components/fing/translations/es.json +0 -31
  248. homeassistant/components/inels/translations/bg.json +0 -1
  249. homeassistant/components/inels/translations/es.json +0 -30
  250. homeassistant/components/sunricher_dali/const.py +0 -5
  251. /homeassistant/components/{sunricher_dali → sunricher_dali_center}/quality_scale.yaml +0 -0
  252. {homeassistant-2025.11.0.dist-info → homeassistant-2025.11.0b2.dist-info}/WHEEL +0 -0
  253. {homeassistant-2025.11.0.dist-info → homeassistant-2025.11.0b2.dist-info}/entry_points.txt +0 -0
  254. {homeassistant-2025.11.0.dist-info → homeassistant-2025.11.0b2.dist-info}/licenses/LICENSE.md +0 -0
  255. {homeassistant-2025.11.0.dist-info → homeassistant-2025.11.0b2.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
  256. {homeassistant-2025.11.0.dist-info → homeassistant-2025.11.0b2.dist-info}/top_level.txt +0 -0
@@ -3,18 +3,18 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from abc import abstractmethod
6
- import asyncio
7
6
  import collections
8
7
  from contextlib import suppress
9
8
  from enum import StrEnum
10
9
  import json
11
- import os
12
10
  from typing import Any
13
11
 
12
+ import serial.tools.list_ports
13
+ from serial.tools.list_ports_common import ListPortInfo
14
14
  import voluptuous as vol
15
15
  from zha.application.const import RadioType
16
16
  import zigpy.backups
17
- from zigpy.config import CONF_DEVICE, CONF_DEVICE_PATH, CONF_NWK_TX_POWER
17
+ from zigpy.config import CONF_DEVICE, CONF_DEVICE_PATH
18
18
  from zigpy.exceptions import CannotWriteNetworkSettings, DestructiveWriteNetworkSettings
19
19
 
20
20
  from homeassistant.components import onboarding, usb
@@ -25,7 +25,6 @@ from homeassistant.components.homeassistant_hardware.firmware_config_flow import
25
25
  ZigbeeFlowStrategy,
26
26
  )
27
27
  from homeassistant.components.homeassistant_yellow import hardware as yellow_hardware
28
- from homeassistant.components.usb import USBDevice, scan_serial_ports
29
28
  from homeassistant.config_entries import (
30
29
  SOURCE_IGNORE,
31
30
  SOURCE_ZEROCONF,
@@ -39,7 +38,7 @@ from homeassistant.config_entries import (
39
38
  )
40
39
  from homeassistant.const import CONF_NAME
41
40
  from homeassistant.core import HomeAssistant, callback
42
- from homeassistant.data_entry_flow import AbortFlow, progress_step
41
+ from homeassistant.data_entry_flow import AbortFlow
43
42
  from homeassistant.exceptions import HomeAssistantError
44
43
  from homeassistant.helpers.hassio import is_hassio
45
44
  from homeassistant.helpers.selector import FileSelector, FileSelectorConfig
@@ -125,10 +124,10 @@ def _format_backup_choice(
125
124
  return f"{dt_util.as_local(backup.backup_time).strftime('%c')} ({identifier})"
126
125
 
127
126
 
128
- async def list_serial_ports(hass: HomeAssistant) -> list[USBDevice]:
127
+ async def list_serial_ports(hass: HomeAssistant) -> list[ListPortInfo]:
129
128
  """List all serial ports, including the Yellow radio and the multi-PAN addon."""
130
- ports: list[USBDevice] = []
131
- ports.extend(await hass.async_add_executor_job(scan_serial_ports))
129
+ ports: list[ListPortInfo] = []
130
+ ports.extend(await hass.async_add_executor_job(serial.tools.list_ports.comports))
132
131
 
133
132
  # Add useful info to the Yellow's serial port selection screen
134
133
  try:
@@ -138,14 +137,9 @@ async def list_serial_ports(hass: HomeAssistant) -> list[USBDevice]:
138
137
  else:
139
138
  # PySerial does not properly handle the Yellow's serial port with the CM5
140
139
  # so we manually include it
141
- port = USBDevice(
142
- device="/dev/ttyAMA1",
143
- vid="ffff", # This is technically not a USB device
144
- pid="ffff",
145
- serial_number=None,
146
- manufacturer="Nabu Casa",
147
- description="Yellow Zigbee module",
148
- )
140
+ port = ListPortInfo(device="/dev/ttyAMA1", skip_link_detection=True)
141
+ port.description = "Yellow Zigbee module"
142
+ port.manufacturer = "Nabu Casa"
149
143
 
150
144
  ports = [p for p in ports if not p.device.startswith("/dev/ttyAMA")]
151
145
  ports.insert(0, port)
@@ -162,15 +156,13 @@ async def list_serial_ports(hass: HomeAssistant) -> list[USBDevice]:
162
156
  addon_info = None
163
157
 
164
158
  if addon_info is not None and addon_info.state != AddonState.NOT_INSTALLED:
165
- addon_port = USBDevice(
159
+ addon_port = ListPortInfo(
166
160
  device=silabs_multiprotocol_addon.get_zigbee_socket(),
167
- vid="ffff", # This is technically not a USB device
168
- pid="ffff",
169
- serial_number=None,
170
- manufacturer="Nabu Casa",
171
- description="Silicon Labs Multiprotocol add-on",
161
+ skip_link_detection=True,
172
162
  )
173
163
 
164
+ addon_port.description = "Multiprotocol add-on"
165
+ addon_port.manufacturer = "Nabu Casa"
174
166
  ports.append(addon_port)
175
167
 
176
168
  return ports
@@ -180,7 +172,6 @@ class BaseZhaFlow(ConfigEntryBaseFlow):
180
172
  """Mixin for common ZHA flow steps and forms."""
181
173
 
182
174
  _flow_strategy: ZigbeeFlowStrategy | None = None
183
- _overwrite_ieee_during_restore: bool = False
184
175
  _hass: HomeAssistant
185
176
  _title: str
186
177
 
@@ -190,8 +181,6 @@ class BaseZhaFlow(ConfigEntryBaseFlow):
190
181
 
191
182
  self._hass = None # type: ignore[assignment]
192
183
  self._radio_mgr = ZhaRadioManager()
193
- self._restore_backup_task: asyncio.Task[None] | None = None
194
- self._extra_network_config: dict[str, Any] = {}
195
184
 
196
185
  @property
197
186
  def hass(self) -> HomeAssistant:
@@ -229,15 +218,8 @@ class BaseZhaFlow(ConfigEntryBaseFlow):
229
218
  ) -> ConfigFlowResult:
230
219
  """Choose a serial port."""
231
220
  ports = await list_serial_ports(self.hass)
232
-
233
- # The full `/dev/serial/by-id/` path is too verbose to show
234
- resolved_paths = {
235
- p.device: await self.hass.async_add_executor_job(os.path.realpath, p.device)
236
- for p in ports
237
- }
238
-
239
221
  list_of_ports = [
240
- f"{resolved_paths[p.device]} - {p.description}{', s/n: ' + p.serial_number if p.serial_number else ''}"
222
+ f"{p}{', s/n: ' + p.serial_number if p.serial_number else ''}"
241
223
  + (f" - {p.manufacturer}" if p.manufacturer else "")
242
224
  for p in ports
243
225
  ]
@@ -464,7 +446,6 @@ class BaseZhaFlow(ConfigEntryBaseFlow):
464
446
  self._radio_mgr.chosen_backup = self._radio_mgr.backups[0]
465
447
  return await self.async_step_maybe_reset_old_radio()
466
448
 
467
- @progress_step()
468
449
  async def async_step_maybe_reset_old_radio(
469
450
  self, user_input: dict[str, Any] | None = None
470
451
  ) -> ConfigFlowResult:
@@ -492,69 +473,9 @@ class BaseZhaFlow(ConfigEntryBaseFlow):
492
473
  temp_radio_mgr.device_settings = config_entry.data[CONF_DEVICE]
493
474
  temp_radio_mgr.radio_type = RadioType[config_entry.data[CONF_RADIO_TYPE]]
494
475
 
495
- try:
496
- await temp_radio_mgr.async_reset_adapter()
497
- except HomeAssistantError:
498
- # Old adapter not found or cannot connect, show prompt to plug back in
499
- return await self.async_step_plug_in_old_radio()
500
-
501
- return await self.async_step_restore_backup()
502
-
503
- async def async_step_plug_in_old_radio(
504
- self, user_input: dict[str, Any] | None = None
505
- ) -> ConfigFlowResult:
506
- """Prompt user to plug in the old radio if connection fails."""
507
- config_entries = self.hass.config_entries.async_entries(
508
- DOMAIN, include_ignore=False
509
- )
510
-
511
- # Unless the user removes the config entry whilst we try to reset the old radio
512
- # for a few seconds and then also unplugs it, we will basically never hit this
513
- if not config_entries:
514
- return await self.async_step_restore_backup()
515
-
516
- config_entry = config_entries[0]
517
- old_device_path = config_entry.data[CONF_DEVICE][CONF_DEVICE_PATH]
518
-
519
- return self.async_show_menu(
520
- step_id="plug_in_old_radio",
521
- menu_options=["retry_old_radio", "skip_reset_old_radio"],
522
- description_placeholders={"device_path": old_device_path},
523
- )
524
-
525
- async def async_step_retry_old_radio(
526
- self, user_input: dict[str, Any] | None = None
527
- ) -> ConfigFlowResult:
528
- """Retry connecting to the old radio."""
529
- return await self.async_step_maybe_reset_old_radio()
476
+ await temp_radio_mgr.async_reset_adapter()
530
477
 
531
- async def async_step_skip_reset_old_radio(
532
- self, user_input: dict[str, Any] | None = None
533
- ) -> ConfigFlowResult:
534
- """Skip resetting the old radio and continue with migration."""
535
- return await self.async_step_restore_backup()
536
-
537
- async def async_step_pre_plug_in_new_radio(
538
- self, user_input: dict[str, Any] | None = None
539
- ) -> ConfigFlowResult:
540
- """Strip user_input before showing "plug in new radio" form."""
541
- # This step is necessary to prevent `user_input` from being passed through
542
- return await self.async_step_plug_in_new_radio()
543
-
544
- async def async_step_plug_in_new_radio(
545
- self, user_input: dict[str, Any] | None = None
546
- ) -> ConfigFlowResult:
547
- """Prompt user to plug in the new radio if connection fails."""
548
- if user_input is not None:
549
- # User confirmed, retry now
550
- return await self.async_step_restore_backup()
551
-
552
- assert self._radio_mgr.device_path is not None
553
-
554
- return self.async_show_form(
555
- step_id="plug_in_new_radio",
556
- description_placeholders={"device_path": self._radio_mgr.device_path},
557
- )
478
+ return await self.async_step_maybe_confirm_ezsp_restore()
558
479
 
559
480
  async def async_step_migration_strategy_advanced(
560
481
  self, user_input: dict[str, Any] | None = None
@@ -618,13 +539,11 @@ class BaseZhaFlow(ConfigEntryBaseFlow):
618
539
  # This step exists only for translations, it does nothing new
619
540
  return await self.async_step_form_new_network(user_input)
620
541
 
621
- @progress_step()
622
542
  async def async_step_form_new_network(
623
543
  self, user_input: dict[str, Any] | None = None
624
544
  ) -> ConfigFlowResult:
625
545
  """Form a brand-new network."""
626
- await self._radio_mgr.async_form_network(config=self._extra_network_config)
627
-
546
+ await self._radio_mgr.async_form_network()
628
547
  # Load the newly formed network settings to get the network info
629
548
  await self._radio_mgr.async_load_network_settings()
630
549
  return await self._async_create_radio_entry()
@@ -705,78 +624,47 @@ class BaseZhaFlow(ConfigEntryBaseFlow):
705
624
  ),
706
625
  )
707
626
 
708
- async def async_step_restore_backup(
627
+ async def async_step_maybe_confirm_ezsp_restore(
709
628
  self, user_input: dict[str, Any] | None = None
710
629
  ) -> ConfigFlowResult:
711
- """Restore network backup to new radio."""
712
- if self._restore_backup_task is None:
713
- self._restore_backup_task = self.hass.async_create_task(
714
- self._radio_mgr.restore_backup(
715
- overwrite_ieee=self._overwrite_ieee_during_restore
716
- ),
717
- "Restore backup",
718
- )
630
+ """Confirm restore for EZSP radios that require permanent IEEE writes."""
631
+ if user_input is not None:
632
+ if user_input[OVERWRITE_COORDINATOR_IEEE]:
633
+ # On confirmation, overwrite destructively
634
+ try:
635
+ await self._radio_mgr.restore_backup(overwrite_ieee=True)
636
+ except CannotWriteNetworkSettings as exc:
637
+ return self.async_abort(
638
+ reason="cannot_restore_backup",
639
+ description_placeholders={"error": str(exc)},
640
+ )
719
641
 
720
- if not self._restore_backup_task.done():
721
- return self.async_show_progress(
722
- step_id="restore_backup",
723
- progress_action="restore_backup",
724
- progress_task=self._restore_backup_task,
725
- )
642
+ return await self._async_create_radio_entry()
726
643
 
644
+ # On rejection, explain why we can't restore
645
+ return self.async_abort(reason="cannot_restore_backup_no_ieee_confirm")
646
+
647
+ # On first attempt, just try to restore nondestructively
727
648
  try:
728
- await self._restore_backup_task
649
+ await self._radio_mgr.restore_backup()
729
650
  except DestructiveWriteNetworkSettings:
730
- # If we cannot restore without overwriting the IEEE, ask for confirmation
731
- return self.async_show_progress_done(
732
- next_step_id="pre_confirm_ezsp_ieee_overwrite"
733
- )
734
- except HomeAssistantError:
735
- # User unplugged the new adapter, allow retry
736
- return self.async_show_progress_done(next_step_id="pre_plug_in_new_radio")
651
+ # Restore cannot happen automatically, we need to ask for permission
652
+ pass
737
653
  except CannotWriteNetworkSettings as exc:
738
654
  return self.async_abort(
739
655
  reason="cannot_restore_backup",
740
656
  description_placeholders={"error": str(exc)},
741
657
  )
742
- finally:
743
- self._restore_backup_task = None
744
-
745
- # Otherwise, proceed to entry creation
746
- return self.async_show_progress_done(next_step_id="create_entry")
747
-
748
- async def async_step_pre_confirm_ezsp_ieee_overwrite(
749
- self, user_input: dict[str, Any] | None = None
750
- ) -> ConfigFlowResult:
751
- """Strip user_input before showing confirmation form."""
752
- # This step is necessary to prevent `user_input` from being passed through
753
- return await self.async_step_confirm_ezsp_ieee_overwrite()
754
-
755
- async def async_step_confirm_ezsp_ieee_overwrite(
756
- self, user_input: dict[str, Any] | None = None
757
- ) -> ConfigFlowResult:
758
- """Show confirmation form for EZSP IEEE address overwrite."""
759
- if user_input is None:
760
- return self.async_show_form(
761
- step_id="confirm_ezsp_ieee_overwrite",
762
- data_schema=vol.Schema(
763
- {vol.Required(OVERWRITE_COORDINATOR_IEEE, default=True): bool}
764
- ),
765
- )
766
-
767
- if not user_input[OVERWRITE_COORDINATOR_IEEE]:
768
- return self.async_abort(reason="cannot_restore_backup_no_ieee_confirm")
769
-
770
- self._overwrite_ieee_during_restore = True
771
- return await self.async_step_restore_backup()
772
-
773
- async def async_step_create_entry(
774
- self, user_input: dict[str, Any] | None = None
775
- ) -> ConfigFlowResult:
776
- """Create the config entry after successful setup/migration."""
658
+ else:
659
+ return await self._async_create_radio_entry()
777
660
 
778
- # This step only exists so that we can create entries from other steps
779
- return await self._async_create_radio_entry()
661
+ # If it fails, show the form
662
+ return self.async_show_form(
663
+ step_id="maybe_confirm_ezsp_restore",
664
+ data_schema=vol.Schema(
665
+ {vol.Required(OVERWRITE_COORDINATOR_IEEE, default=True): bool}
666
+ ),
667
+ )
780
668
 
781
669
 
782
670
  class ZhaConfigFlowHandler(BaseZhaFlow, ConfigFlow, domain=DOMAIN):
@@ -1009,9 +897,6 @@ class ZhaConfigFlowHandler(BaseZhaFlow, ConfigFlow, domain=DOMAIN):
1009
897
  device_path = device_settings[CONF_DEVICE_PATH]
1010
898
  self._flow_strategy = discovery_data.get("flow_strategy")
1011
899
 
1012
- if "tx_power" in discovery_data:
1013
- self._extra_network_config[CONF_NWK_TX_POWER] = discovery_data["tx_power"]
1014
-
1015
900
  await self._set_unique_id_and_update_ignored_flow(
1016
901
  unique_id=f"{name}_{radio_type.name}_{device_path}",
1017
902
  device_path=device_path,
@@ -1133,7 +1018,7 @@ class ZhaOptionsFlowHandler(BaseZhaFlow, OptionsFlow):
1133
1018
 
1134
1019
  # If we are reconfiguring, the old radio will not be available
1135
1020
  if self._migration_intent is OptionsMigrationIntent.RECONFIGURE:
1136
- return await self.async_step_restore_backup()
1021
+ return await self.async_step_maybe_confirm_ezsp_restore()
1137
1022
 
1138
1023
  return await super().async_step_maybe_reset_old_radio(user_input)
1139
1024
 
@@ -21,7 +21,7 @@
21
21
  "zha",
22
22
  "universal_silabs_flasher"
23
23
  ],
24
- "requirements": ["zha==0.0.77"],
24
+ "requirements": ["zha==0.0.75"],
25
25
  "usb": [
26
26
  {
27
27
  "description": "*2652*",
@@ -78,7 +78,6 @@ HARDWARE_DISCOVERY_SCHEMA = vol.Schema(
78
78
  vol.Required("port"): DEVICE_SCHEMA,
79
79
  vol.Required("radio_type"): str,
80
80
  vol.Optional("flow_strategy"): vol.All(str, vol.Coerce(ZigbeeFlowStrategy)),
81
- vol.Optional("tx_power"): vol.All(vol.Coerce(int), vol.Range(min=0, max=10)),
82
81
  }
83
82
  )
84
83
 
@@ -323,7 +322,7 @@ class ZhaRadioManager:
323
322
 
324
323
  return backup
325
324
 
326
- async def async_form_network(self, config: dict[str, Any] | None) -> None:
325
+ async def async_form_network(self) -> None:
327
326
  """Form a brand-new network."""
328
327
 
329
328
  # When forming a new network, we delete the ZHA database to prevent old devices
@@ -332,7 +331,7 @@ class ZhaRadioManager:
332
331
  await self.hass.async_add_executor_job(os.remove, self.zigpy_database_path)
333
332
 
334
333
  async with self.create_zigpy_app() as app:
335
- await app.form_network(config=config)
334
+ await app.form_network()
336
335
 
337
336
  async def async_reset_adapter(self) -> None:
338
337
  """Reset the current adapter."""
@@ -16,11 +16,6 @@
16
16
  "invalid_backup_json": "Invalid backup JSON"
17
17
  },
18
18
  "flow_title": "{name}",
19
- "progress": {
20
- "form_new_network": "Forming a new Zigbee network.\n\nWe scan for a clear network channel as part of this process, this can take a minute.",
21
- "maybe_reset_old_radio": "Resetting old adapter.\n\nYour old adapter has been backed up and is being factory reset.",
22
- "restore_backup": "Restoring network settings to new adapter.\n\nThis will take a minute."
23
- },
24
19
  "step": {
25
20
  "choose_automatic_backup": {
26
21
  "data": {
@@ -81,15 +76,8 @@
81
76
  "confirm": {
82
77
  "description": "Do you want to set up {name}?"
83
78
  },
84
- "confirm_ezsp_ieee_overwrite": {
85
- "data": {
86
- "overwrite_coordinator_ieee": "Permanently replace the adapter IEEE address"
87
- },
88
- "description": "Your backup has a different IEEE address than your adapter. For your network to function properly, the IEEE address of your adapter should also be changed.\n\nThis is a permanent operation.",
89
- "title": "Overwrite adapter IEEE address"
90
- },
91
- "form_new_network": {
92
- "title": "Forming new network"
79
+ "confirm_hardware": {
80
+ "description": "Do you want to set up {name}?"
93
81
  },
94
82
  "manual_pick_radio_type": {
95
83
  "data": {
@@ -112,27 +100,16 @@
112
100
  "description": "ZHA was not able to automatically detect serial port settings for your adapter. This usually is an issue with the firmware or permissions.\n\nIf you are using firmware with nonstandard settings, enter the serial port settings",
113
101
  "title": "Serial port settings"
114
102
  },
115
- "maybe_reset_old_radio": {
116
- "title": "Resetting old adapter"
117
- },
118
- "plug_in_new_radio": {
119
- "description": "Your new adapter at `{device_path}` was not found.\nPlease plug it in and click Submit to continue.",
120
- "title": "New adapter not found"
121
- },
122
- "plug_in_old_radio": {
123
- "description": "Your old adapter at `{device_path}` was not found. You can retry after plugging it back in, or skip resetting the old adapter.\n\n**Warning:** If you skip resetting the old adapter, ensure it remains permanently disconnected. Plugging it back in later will cause network issues.",
124
- "menu_option_descriptions": {
125
- "retry_old_radio": "Retry connecting to the old adapter to reset it as part of the migration.",
126
- "skip_reset_old_radio": "Skip resetting the old adapter and continue with the migration."
127
- },
128
- "menu_options": {
129
- "retry_old_radio": "Retry",
130
- "skip_reset_old_radio": "Skip reset"
103
+ "maybe_confirm_ezsp_restore": {
104
+ "data": {
105
+ "overwrite_coordinator_ieee": "Permanently replace the adapter IEEE address"
131
106
  },
132
- "title": "Old adapter not found"
107
+ "description": "Your backup has a different IEEE address than your adapter. For your network to function properly, the IEEE address of your adapter should also be changed.\n\nThis is a permanent operation.",
108
+ "title": "Overwrite adapter IEEE address"
133
109
  },
134
- "restore_backup": {
135
- "title": "Restoring network to new adapter"
110
+ "maybe_reset_old_radio": {
111
+ "description": "A backup was created earlier and your old adapter is being reset as part of the migration.",
112
+ "title": "Resetting old adapter"
136
113
  },
137
114
  "upload_manual_backup": {
138
115
  "data": {
@@ -1892,11 +1869,6 @@
1892
1869
  "invalid_backup_json": "[%key:component::zha::config::error::invalid_backup_json%]"
1893
1870
  },
1894
1871
  "flow_title": "[%key:component::zha::config::flow_title%]",
1895
- "progress": {
1896
- "form_new_network": "[%key:component::zha::config::progress::form_new_network%]",
1897
- "maybe_reset_old_radio": "[%key:component::zha::config::progress::maybe_reset_old_radio%]",
1898
- "restore_backup": "[%key:component::zha::config::progress::restore_backup%]"
1899
- },
1900
1872
  "step": {
1901
1873
  "choose_automatic_backup": {
1902
1874
  "data": {
@@ -1942,16 +1914,6 @@
1942
1914
  "description": "[%key:component::zha::config::step::choose_serial_port::description%]",
1943
1915
  "title": "[%key:component::zha::config::step::choose_serial_port::title%]"
1944
1916
  },
1945
- "confirm_ezsp_ieee_overwrite": {
1946
- "data": {
1947
- "overwrite_coordinator_ieee": "[%key:component::zha::config::step::confirm_ezsp_ieee_overwrite::data::overwrite_coordinator_ieee%]"
1948
- },
1949
- "description": "[%key:component::zha::config::step::confirm_ezsp_ieee_overwrite::description%]",
1950
- "title": "[%key:component::zha::config::step::confirm_ezsp_ieee_overwrite::title%]"
1951
- },
1952
- "form_new_network": {
1953
- "title": "[%key:component::zha::config::step::form_new_network::title%]"
1954
- },
1955
1917
  "init": {
1956
1918
  "description": "A backup will be performed and ZHA will be stopped. Do you wish to continue?",
1957
1919
  "title": "Reconfigure ZHA"
@@ -1976,24 +1938,12 @@
1976
1938
  "description": "[%key:component::zha::config::step::manual_port_config::description%]",
1977
1939
  "title": "[%key:component::zha::config::step::manual_port_config::title%]"
1978
1940
  },
1979
- "maybe_reset_old_radio": {
1980
- "title": "[%key:component::zha::config::step::maybe_reset_old_radio::title%]"
1981
- },
1982
- "plug_in_new_radio": {
1983
- "description": "[%key:component::zha::config::step::plug_in_new_radio::description%]",
1984
- "title": "[%key:component::zha::config::step::plug_in_new_radio::title%]"
1985
- },
1986
- "plug_in_old_radio": {
1987
- "description": "[%key:component::zha::config::step::plug_in_old_radio::description%]",
1988
- "menu_option_descriptions": {
1989
- "retry_old_radio": "[%key:component::zha::config::step::plug_in_old_radio::menu_option_descriptions::retry_old_radio%]",
1990
- "skip_reset_old_radio": "[%key:component::zha::config::step::plug_in_old_radio::menu_option_descriptions::skip_reset_old_radio%]"
1991
- },
1992
- "menu_options": {
1993
- "retry_old_radio": "[%key:component::zha::config::step::plug_in_old_radio::menu_options::retry_old_radio%]",
1994
- "skip_reset_old_radio": "[%key:component::zha::config::step::plug_in_old_radio::menu_options::skip_reset_old_radio%]"
1941
+ "maybe_confirm_ezsp_restore": {
1942
+ "data": {
1943
+ "overwrite_coordinator_ieee": "[%key:component::zha::config::step::maybe_confirm_ezsp_restore::data::overwrite_coordinator_ieee%]"
1995
1944
  },
1996
- "title": "[%key:component::zha::config::step::plug_in_old_radio::title%]"
1945
+ "description": "[%key:component::zha::config::step::maybe_confirm_ezsp_restore::description%]",
1946
+ "title": "[%key:component::zha::config::step::maybe_confirm_ezsp_restore::title%]"
1997
1947
  },
1998
1948
  "prompt_migrate_or_reconfigure": {
1999
1949
  "description": "Are you migrating to a new adapter or re-configuring the current adapter?",
@@ -2007,9 +1957,6 @@
2007
1957
  },
2008
1958
  "title": "Migrate or re-configure"
2009
1959
  },
2010
- "restore_backup": {
2011
- "title": "[%key:component::zha::config::step::restore_backup::title%]"
2012
- },
2013
1960
  "upload_manual_backup": {
2014
1961
  "data": {
2015
1962
  "uploaded_backup_file": "[%key:component::zha::config::step::upload_manual_backup::data::uploaded_backup_file%]"
@@ -58,8 +58,8 @@
58
58
  "confirm": {
59
59
  "description": "\u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 {name}?"
60
60
  },
61
- "form_new_network": {
62
- "title": "\u0424\u043e\u0440\u043c\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u043d\u043e\u0432\u0430 \u043c\u0440\u0435\u0436\u0430"
61
+ "confirm_hardware": {
62
+ "description": "\u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 {name}?"
63
63
  },
64
64
  "manual_port_config": {
65
65
  "data_description": {
@@ -69,14 +69,9 @@
69
69
  }
70
70
  },
71
71
  "maybe_reset_old_radio": {
72
+ "description": "\u041f\u043e-\u0440\u0430\u043d\u043e \u0431\u0435\u0448\u0435 \u0441\u044a\u0437\u0434\u0430\u0434\u0435\u043d\u043e \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e \u043a\u043e\u043f\u0438\u0435 \u0438 \u0441\u0442\u0430\u0440\u0438\u044f\u0442 \u0432\u0438 \u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u0441\u0435 \u043d\u0443\u043b\u0438\u0440\u0430 \u043a\u0430\u0442\u043e \u0447\u0430\u0441\u0442 \u043e\u0442 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f\u0442\u0430.",
72
73
  "title": "\u041d\u0443\u043b\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0441\u0442\u0430\u0440\u0438\u044f \u0430\u0434\u0430\u043f\u0442\u0435\u0440"
73
74
  },
74
- "plug_in_old_radio": {
75
- "title": "\u0421\u0442\u0430\u0440\u0438\u044f\u0442 \u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u043d\u0435 \u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d"
76
- },
77
- "restore_backup": {
78
- "title": "\u0412\u044a\u0437\u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u043c\u0440\u0435\u0436\u0430\u0442\u0430 \u043a\u044a\u043c \u043d\u043e\u0432 \u0430\u0434\u0430\u043f\u0442\u0435\u0440"
79
- },
80
75
  "upload_manual_backup": {
81
76
  "data": {
82
77
  "uploaded_backup_file": "\u041a\u0430\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 \u0444\u0430\u0439\u043b"
@@ -495,18 +490,9 @@
495
490
  },
496
491
  "title": "\u041c\u0438\u0433\u0440\u0438\u0440\u0430\u043d\u0435 \u043a\u044a\u043c \u043d\u043e\u0432 \u0430\u0434\u0430\u043f\u0442\u0435\u0440"
497
492
  },
498
- "form_new_network": {
499
- "title": "\u0424\u043e\u0440\u043c\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u043d\u043e\u0432\u0430 \u043c\u0440\u0435\u0436\u0430"
500
- },
501
493
  "init": {
502
494
  "title": "\u041f\u0440\u0435\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 ZHA"
503
495
  },
504
- "maybe_reset_old_radio": {
505
- "title": "\u041d\u0443\u043b\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0441\u0442\u0430\u0440\u0438\u044f \u0430\u0434\u0430\u043f\u0442\u0435\u0440"
506
- },
507
- "plug_in_old_radio": {
508
- "title": "\u0421\u0442\u0430\u0440\u0438\u044f\u0442 \u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u043d\u0435 \u0435 \u043d\u0430\u043c\u0435\u0440\u0435\u043d"
509
- },
510
496
  "prompt_migrate_or_reconfigure": {
511
497
  "menu_option_descriptions": {
512
498
  "intent_migrate": "\u0422\u043e\u0432\u0430 \u0449\u0435 \u0432\u0438 \u043f\u043e\u043c\u043e\u0433\u043d\u0435 \u0434\u0430 \u043c\u0438\u0433\u0440\u0438\u0440\u0430\u0442\u0435 \u0432\u0430\u0448\u0430\u0442\u0430 Zigbee \u043c\u0440\u0435\u0436\u0430 \u043e\u0442 \u0441\u0442\u0430\u0440\u0438\u044f \u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u043a\u044a\u043c \u043d\u043e\u0432.",
@@ -514,9 +500,6 @@
514
500
  },
515
501
  "title": "\u041c\u0438\u0433\u0440\u0438\u0440\u0430\u043d\u0435 \u0438\u043b\u0438 \u043f\u0440\u0435\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u0435"
516
502
  },
517
- "restore_backup": {
518
- "title": "\u0412\u044a\u0437\u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u043c\u0440\u0435\u0436\u0430\u0442\u0430 \u043a\u044a\u043c \u043d\u043e\u0432 \u0430\u0434\u0430\u043f\u0442\u0435\u0440"
519
- },
520
503
  "upload_manual_backup": {
521
504
  "data": {
522
505
  "uploaded_backup_file": "\u041a\u0430\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 \u0444\u0430\u0439\u043b"
@@ -27,6 +27,9 @@
27
27
  "confirm": {
28
28
  "description": "Vols configurar {name}?"
29
29
  },
30
+ "confirm_hardware": {
31
+ "description": "Vols configurar {name}?"
32
+ },
30
33
  "manual_port_config": {
31
34
  "data": {
32
35
  "path": "Ruta del port s\u00e8rie al dispositiu"
@@ -76,6 +76,9 @@
76
76
  "confirm": {
77
77
  "description": "Chcete nastavit {name}?"
78
78
  },
79
+ "confirm_hardware": {
80
+ "description": "Chcete nastavit {name}?"
81
+ },
79
82
  "manual_pick_radio_type": {
80
83
  "data": {
81
84
  "radio_type": "Typ adapt\u00e9ru"
@@ -97,25 +100,17 @@
97
100
  "description": "ZHA nedok\u00e1zala automaticky detekovat nastaven\u00ed s\u00e9riov\u00e9ho portu pro v\u00e1\u0161 adapt\u00e9r. Obvykle se jedn\u00e1 o probl\u00e9m s firmwarem nebo opr\u00e1vn\u011bn\u00edmi.\n \nPokud pou\u017e\u00edv\u00e1te firmware s nestandardn\u00edm nastaven\u00edm, zadejte nastaven\u00ed s\u00e9riov\u00e9ho portu.",
98
101
  "title": "Nastaven\u00ed s\u00e9riov\u00e9ho portu"
99
102
  },
103
+ "maybe_confirm_ezsp_restore": {
104
+ "data": {
105
+ "overwrite_coordinator_ieee": "Trvale nahradit IEEE adresu adapt\u00e9ru"
106
+ },
107
+ "description": "Va\u0161e z\u00e1loha m\u00e1 jinou adresu IEEE ne\u017e v\u00e1\u0161 adapt\u00e9r. Aby s\u00ed\u0165 fungovala spr\u00e1vn\u011b, m\u011bla by b\u00fdt zm\u011bn\u011bna tak\u00e9 adresa IEEE va\u0161eho adapt\u00e9ru.\n\nJedn\u00e1 se o trvalou operaci.",
108
+ "title": "P\u0159epsat adresu IEEE adapt\u00e9ru"
109
+ },
100
110
  "maybe_reset_old_radio": {
111
+ "description": "Z\u00e1loha byla vytvo\u0159ena d\u0159\u00edve a v\u00e1\u0161 star\u00fd adapt\u00e9r se v r\u00e1mci migrace resetuje.",
101
112
  "title": "Resetov\u00e1n\u00ed star\u00e9ho adapt\u00e9ru"
102
113
  },
103
- "plug_in_new_radio": {
104
- "description": "V\u00e1\u0161 nov\u00fd adapt\u00e9r na adrese \"{device_path}\" nebyl nalezen.\nZapojte jej a klepn\u011bte na tla\u010d\u00edtko Odeslat pro pokra\u010dov\u00e1n\u00ed.",
105
- "title": "Nov\u00fd adapt\u00e9r nebyl nalezen"
106
- },
107
- "plug_in_old_radio": {
108
- "description": "V\u00e1\u0161 star\u00fd adapt\u00e9r na adrese \"{device_path}\" nebyl nalezen. M\u016f\u017eete to zkusit znovu po jeho op\u011btovn\u00e9m zapojen\u00ed nebo p\u0159esko\u010dit resetov\u00e1n\u00ed star\u00e9ho adapt\u00e9ru.\n \n**Varov\u00e1n\u00ed:** Pokud resetov\u00e1n\u00ed star\u00e9ho adapt\u00e9ru p\u0159esko\u010d\u00edte, ujist\u011bte se, \u017ee z\u016fstane trvale odpojen\u00fd. Jeho pozd\u011bj\u0161\u00ed op\u011btovn\u00e9 p\u0159ipojen\u00ed zp\u016fsob\u00ed probl\u00e9my se s\u00edt\u00ed.",
109
- "menu_option_descriptions": {
110
- "retry_old_radio": "Zkuste se znovu p\u0159ipojit ke star\u00e9mu adapt\u00e9ru, abyste jej v r\u00e1mci migrace resetovali.",
111
- "skip_reset_old_radio": "P\u0159esko\u010d\u00ed resetov\u00e1n\u00ed star\u00e9ho adapt\u00e9ru a pokra\u010duje v migraci."
112
- },
113
- "menu_options": {
114
- "retry_old_radio": "Opakovat",
115
- "skip_reset_old_radio": "P\u0159esko\u010dit resetov\u00e1n\u00ed"
116
- },
117
- "title": "Star\u00fd adapt\u00e9r nebyl nalezen"
118
- },
119
114
  "upload_manual_backup": {
120
115
  "data": {
121
116
  "uploaded_backup_file": "Nahr\u00e1t soubor"
@@ -1943,21 +1938,12 @@
1943
1938
  "description": "ZHA nedok\u00e1zala automaticky detekovat nastaven\u00ed s\u00e9riov\u00e9ho portu pro v\u00e1\u0161 adapt\u00e9r. Obvykle se jedn\u00e1 o probl\u00e9m s firmwarem nebo opr\u00e1vn\u011bn\u00edmi.\n \nPokud pou\u017e\u00edv\u00e1te firmware s nestandardn\u00edm nastaven\u00edm, zadejte nastaven\u00ed s\u00e9riov\u00e9ho portu.",
1944
1939
  "title": "Nastaven\u00ed s\u00e9riov\u00e9ho portu"
1945
1940
  },
1946
- "plug_in_new_radio": {
1947
- "description": "V\u00e1\u0161 nov\u00fd adapt\u00e9r na adrese \"{device_path}\" nebyl nalezen.\nZapojte jej a klepn\u011bte na tla\u010d\u00edtko Odeslat pro pokra\u010dov\u00e1n\u00ed.",
1948
- "title": "Nov\u00fd adapt\u00e9r nebyl nalezen"
1949
- },
1950
- "plug_in_old_radio": {
1951
- "description": "V\u00e1\u0161 star\u00fd adapt\u00e9r na adrese \"{device_path}\" nebyl nalezen. M\u016f\u017eete to zkusit znovu po jeho op\u011btovn\u00e9m zapojen\u00ed nebo p\u0159esko\u010dit resetov\u00e1n\u00ed star\u00e9ho adapt\u00e9ru.\n \n**Varov\u00e1n\u00ed:** Pokud resetov\u00e1n\u00ed star\u00e9ho adapt\u00e9ru p\u0159esko\u010d\u00edte, ujist\u011bte se, \u017ee z\u016fstane trvale odpojen\u00fd. Jeho pozd\u011bj\u0161\u00ed op\u011btovn\u00e9 p\u0159ipojen\u00ed zp\u016fsob\u00ed probl\u00e9my se s\u00edt\u00ed.",
1952
- "menu_option_descriptions": {
1953
- "retry_old_radio": "Zkuste se znovu p\u0159ipojit ke star\u00e9mu adapt\u00e9ru, abyste jej v r\u00e1mci migrace resetovali.",
1954
- "skip_reset_old_radio": "P\u0159esko\u010d\u00ed resetov\u00e1n\u00ed star\u00e9ho adapt\u00e9ru a pokra\u010duje v migraci."
1955
- },
1956
- "menu_options": {
1957
- "retry_old_radio": "Opakovat",
1958
- "skip_reset_old_radio": "P\u0159esko\u010dit resetov\u00e1n\u00ed"
1941
+ "maybe_confirm_ezsp_restore": {
1942
+ "data": {
1943
+ "overwrite_coordinator_ieee": "Trvale nahradit IEEE adresu adapt\u00e9ru"
1959
1944
  },
1960
- "title": "Star\u00fd adapt\u00e9r nebyl nalezen"
1945
+ "description": "Va\u0161e z\u00e1loha m\u00e1 jinou adresu IEEE ne\u017e v\u00e1\u0161 adapt\u00e9r. Aby s\u00ed\u0165 fungovala spr\u00e1vn\u011b, m\u011bla by b\u00fdt zm\u011bn\u011bna tak\u00e9 adresa IEEE va\u0161eho adapt\u00e9ru.\n\nJedn\u00e1 se o trvalou operaci.",
1946
+ "title": "P\u0159epsat adresu IEEE adapt\u00e9ru"
1961
1947
  },
1962
1948
  "prompt_migrate_or_reconfigure": {
1963
1949
  "description": "P\u0159ech\u00e1z\u00edte na nov\u00fd adapt\u00e9r nebo m\u011bn\u00edte nastaven\u00ed st\u00e1vaj\u00edc\u00edho adapt\u00e9ru?",