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.
- homeassistant/components/alexa_devices/manifest.json +1 -1
- homeassistant/components/alexa_devices/translations/bg.json +0 -13
- homeassistant/components/ambient_network/sensor.py +5 -5
- homeassistant/components/blink/translations/bg.json +1 -8
- homeassistant/components/brother/translations/bg.json +6 -0
- homeassistant/components/brother/translations/ca.json +5 -1
- homeassistant/components/brother/translations/cs.json +2 -2
- homeassistant/components/brother/translations/da.json +5 -1
- homeassistant/components/brother/translations/de.json +4 -4
- homeassistant/components/brother/translations/el.json +5 -1
- homeassistant/components/brother/translations/en-GB.json +4 -4
- homeassistant/components/brother/translations/en.json +4 -4
- homeassistant/components/brother/translations/es-419.json +5 -0
- homeassistant/components/brother/translations/es.json +2 -2
- homeassistant/components/brother/translations/et.json +2 -2
- homeassistant/components/brother/translations/fi.json +5 -1
- homeassistant/components/brother/translations/fr.json +5 -1
- homeassistant/components/brother/translations/ga.json +10 -2
- homeassistant/components/brother/translations/hu.json +5 -1
- homeassistant/components/brother/translations/id.json +5 -1
- homeassistant/components/brother/translations/it.json +5 -1
- homeassistant/components/brother/translations/ja.json +5 -1
- homeassistant/components/brother/translations/ko.json +5 -1
- homeassistant/components/brother/translations/lb.json +2 -1
- homeassistant/components/brother/translations/lt.json +2 -2
- homeassistant/components/brother/translations/nb.json +5 -1
- homeassistant/components/brother/translations/nl.json +5 -1
- homeassistant/components/brother/translations/pl.json +7 -3
- homeassistant/components/brother/translations/pt-BR.json +5 -1
- homeassistant/components/brother/translations/pt.json +10 -2
- homeassistant/components/brother/translations/ro.json +2 -1
- homeassistant/components/brother/translations/ru.json +5 -1
- homeassistant/components/brother/translations/sk.json +2 -2
- homeassistant/components/brother/translations/sl.json +10 -2
- homeassistant/components/brother/translations/sv.json +10 -2
- homeassistant/components/brother/translations/tr.json +5 -1
- homeassistant/components/brother/translations/uk.json +5 -1
- homeassistant/components/brother/translations/vi.json +5 -1
- homeassistant/components/brother/translations/zh-Hans.json +2 -2
- homeassistant/components/brother/translations/zh-Hant.json +4 -4
- homeassistant/components/bryant_evolution/translations/lt.json +0 -3
- homeassistant/components/control4/translations/es.json +1 -2
- homeassistant/components/cover/translations/es.json +7 -7
- homeassistant/components/daikin/translations/es.json +0 -1
- homeassistant/components/ecovacs/translations/es.json +0 -27
- homeassistant/components/ecovacs/translations/sr-Latn.json +0 -18
- homeassistant/components/enmax/__init__.py +1 -0
- homeassistant/components/enmax/manifest.json +6 -0
- homeassistant/components/esphome/__init__.py +3 -5
- homeassistant/components/esphome/translations/he.json +2 -2
- homeassistant/components/firefly_iii/translations/bg.json +0 -3
- homeassistant/components/foscam/manifest.json +1 -1
- homeassistant/components/frontend/__init__.py +1 -1
- homeassistant/components/frontend/manifest.json +1 -1
- homeassistant/components/google_sheets/translations/bg.json +0 -10
- homeassistant/components/google_sheets/translations/es.json +0 -9
- homeassistant/components/google_sheets/translations/sr-Latn.json +0 -14
- homeassistant/components/habitica/translations/es.json +0 -26
- homeassistant/components/hassio/issues.py +2 -0
- homeassistant/components/hassio/translations/es.json +0 -13
- homeassistant/components/holiday/manifest.json +1 -1
- homeassistant/components/homeassistant_connect_zbt2/config_flow.py +1 -18
- homeassistant/components/homeassistant_connect_zbt2/const.py +0 -58
- homeassistant/components/homeassistant_hardware/firmware_config_flow.py +0 -5
- homeassistant/components/homewizard/translations/es.json +2 -4
- homeassistant/components/http/__init__.py +2 -13
- homeassistant/components/http/strings.json +0 -4
- homeassistant/components/http/translations/de.json +0 -4
- homeassistant/components/http/translations/en-GB.json +0 -4
- homeassistant/components/http/translations/en.json +0 -4
- homeassistant/components/http/translations/es.json +0 -4
- homeassistant/components/http/translations/et.json +0 -4
- homeassistant/components/http/translations/lt.json +0 -4
- homeassistant/components/http/translations/sk.json +0 -4
- homeassistant/components/http/translations/zh-Hant.json +0 -4
- homeassistant/components/input_boolean/translations/cs.json +2 -2
- homeassistant/components/jewish_calendar/translations/es.json +0 -6
- homeassistant/components/knx/translations/bg.json +0 -93
- homeassistant/components/knx/translations/es.json +8 -39
- homeassistant/components/knx/translations/sr-Latn.json +1 -44
- homeassistant/components/lametric/translations/es.json +0 -1
- homeassistant/components/lg_thinq/sensor.py +0 -1
- homeassistant/components/litterrobot/manifest.json +1 -1
- homeassistant/components/london_underground/translations/he.json +0 -1
- homeassistant/components/matrix/translations/bg.json +1 -2
- homeassistant/components/matter/translations/bg.json +0 -7
- homeassistant/components/matter/translations/es.json +3 -26
- homeassistant/components/mcp/translations/es.json +0 -4
- homeassistant/components/mqtt/translations/es.json +4 -4
- homeassistant/components/mqtt/translations/he.json +2 -2
- homeassistant/components/nederlandse_spoorwegen/translations/bg.json +1 -2
- homeassistant/components/nextdns/translations/bg.json +1 -2
- homeassistant/components/nina/translations/bg.json +6 -0
- homeassistant/components/nina/translations/es.json +1 -40
- homeassistant/components/nina/translations/sr-Latn.json +0 -28
- homeassistant/components/nintendo_parental_controls/translations/bg.json +0 -19
- homeassistant/components/nuki/translations/es.json +0 -4
- homeassistant/components/octoprint/translations/es.json +0 -16
- homeassistant/components/oralb/translations/es.json +0 -1
- homeassistant/components/overkiz/translations/lt.json +1 -2
- homeassistant/components/plugwise/climate.py +26 -86
- homeassistant/components/plugwise/manifest.json +1 -1
- homeassistant/components/plugwise/strings.json +0 -3
- homeassistant/components/plugwise/translations/de.json +0 -3
- homeassistant/components/plugwise/translations/en-GB.json +0 -3
- homeassistant/components/plugwise/translations/en.json +0 -3
- homeassistant/components/plugwise/translations/es.json +0 -3
- homeassistant/components/plugwise/translations/et.json +0 -3
- homeassistant/components/plugwise/translations/lt.json +0 -3
- homeassistant/components/plugwise/translations/sk.json +0 -3
- homeassistant/components/plugwise/translations/zh-Hant.json +0 -3
- homeassistant/components/portainer/translations/bg.json +1 -8
- homeassistant/components/portainer/translations/sr-Latn.json +1 -3
- homeassistant/components/probe_plus/translations/es.json +0 -5
- homeassistant/components/ps4/translations/es.json +1 -9
- homeassistant/components/reolink/manifest.json +1 -1
- homeassistant/components/reolink/translations/cs.json +0 -1
- homeassistant/components/reolink/translations/en-GB.json +0 -1
- homeassistant/components/reolink/translations/es.json +0 -1
- homeassistant/components/reolink/translations/et.json +0 -1
- homeassistant/components/reolink/translations/lt.json +0 -1
- homeassistant/components/reolink/translations/pl.json +7 -8
- homeassistant/components/reolink/translations/sk.json +0 -1
- homeassistant/components/ruuvitag_ble/manifest.json +1 -1
- homeassistant/components/shelly/translations/bg.json +1 -2
- homeassistant/components/shelly/translations/es.json +3 -10
- homeassistant/components/slide_local/translations/es.json +1 -1
- homeassistant/components/smarttub/manifest.json +1 -1
- homeassistant/components/somfy_mylink/translations/es.json +3 -3
- homeassistant/components/soundtouch/__init__.py +1 -10
- homeassistant/components/sql/translations/es.json +0 -27
- homeassistant/components/sql/translations/sr-Latn.json +0 -9
- homeassistant/components/squeezebox/translations/es.json +0 -63
- homeassistant/components/{sunricher_dali → sunricher_dali_center}/__init__.py +2 -2
- homeassistant/components/{sunricher_dali → sunricher_dali_center}/config_flow.py +2 -2
- homeassistant/components/sunricher_dali_center/const.py +5 -0
- homeassistant/components/{sunricher_dali → sunricher_dali_center}/light.py +2 -2
- homeassistant/components/{sunricher_dali → sunricher_dali_center}/manifest.json +3 -3
- homeassistant/components/{sunricher_dali → sunricher_dali_center}/strings.json +6 -4
- homeassistant/components/sunricher_dali_center/translations/cs.json +29 -0
- homeassistant/components/{sunricher_dali → sunricher_dali_center}/translations/de.json +7 -5
- homeassistant/components/sunricher_dali_center/translations/el.json +11 -0
- homeassistant/components/{sunricher_dali → sunricher_dali_center}/translations/en-GB.json +6 -4
- homeassistant/components/{sunricher_dali → sunricher_dali_center}/translations/en.json +6 -4
- homeassistant/components/{sunricher_dali → sunricher_dali_center}/translations/es.json +6 -4
- homeassistant/components/sunricher_dali_center/translations/et.json +29 -0
- homeassistant/components/sunricher_dali_center/translations/ga.json +29 -0
- homeassistant/components/sunricher_dali_center/translations/he.json +11 -0
- homeassistant/components/sunricher_dali_center/translations/it.json +11 -0
- homeassistant/components/sunricher_dali_center/translations/lt.json +29 -0
- homeassistant/components/sunricher_dali_center/translations/nl.json +11 -0
- homeassistant/components/sunricher_dali_center/translations/pt.json +29 -0
- homeassistant/components/sunricher_dali_center/translations/sk.json +29 -0
- homeassistant/components/sunricher_dali_center/translations/sr-Latn.json +11 -0
- homeassistant/components/sunricher_dali_center/translations/zh-Hans.json +29 -0
- homeassistant/components/sunricher_dali_center/translations/zh-Hant.json +29 -0
- homeassistant/components/{sunricher_dali → sunricher_dali_center}/types.py +2 -2
- homeassistant/components/switch_as_x/translations/cs.json +1 -1
- homeassistant/components/switch_as_x/translations/es.json +4 -4
- homeassistant/components/system_bridge/translations/es.json +0 -1
- homeassistant/components/telegram_bot/translations/bg.json +0 -11
- homeassistant/components/telegram_bot/translations/es.json +7 -42
- homeassistant/components/template/translations/es.json +3 -11
- homeassistant/components/tesla_fleet/manifest.json +1 -1
- homeassistant/components/teslemetry/manifest.json +1 -1
- homeassistant/components/tessie/manifest.json +1 -1
- homeassistant/components/tessie/translations/es.json +0 -3
- homeassistant/components/transmission/translations/bg.json +0 -10
- homeassistant/components/usb/utils.py +23 -22
- homeassistant/components/vesync/humidifier.py +1 -3
- homeassistant/components/vesync/strings.json +0 -11
- homeassistant/components/vesync/translations/bg.json +0 -11
- homeassistant/components/vesync/translations/cs.json +0 -11
- homeassistant/components/vesync/translations/de.json +0 -11
- homeassistant/components/vesync/translations/en-GB.json +0 -11
- homeassistant/components/vesync/translations/en.json +0 -11
- homeassistant/components/vesync/translations/es.json +0 -11
- homeassistant/components/vesync/translations/et.json +0 -11
- homeassistant/components/vesync/translations/he.json +0 -11
- homeassistant/components/vesync/translations/lt.json +0 -11
- homeassistant/components/vesync/translations/sk.json +0 -11
- homeassistant/components/vesync/translations/zh-Hans.json +0 -11
- homeassistant/components/vesync/translations/zh-Hant.json +0 -11
- homeassistant/components/volvo/translations/bg.json +0 -5
- homeassistant/components/volvo/translations/cs.json +0 -5
- homeassistant/components/volvo/translations/en-GB.json +0 -5
- homeassistant/components/volvo/translations/es.json +0 -11
- homeassistant/components/volvo/translations/lt.json +0 -5
- homeassistant/components/volvo/translations/sk.json +0 -5
- homeassistant/components/whirlpool/translations/bg.json +0 -22
- homeassistant/components/whirlpool/translations/es.json +0 -81
- homeassistant/components/workday/manifest.json +1 -1
- homeassistant/components/xbox/translations/bg.json +0 -36
- homeassistant/components/xbox/translations/es.json +0 -21
- homeassistant/components/xbox/translations/sr-Latn.json +0 -1
- homeassistant/components/yardian/translations/bg.json +0 -7
- homeassistant/components/yardian/translations/es.json +0 -16
- homeassistant/components/zha/__init__.py +1 -16
- homeassistant/components/zha/config_flow.py +48 -163
- homeassistant/components/zha/manifest.json +1 -1
- homeassistant/components/zha/radio_manager.py +2 -3
- homeassistant/components/zha/strings.json +15 -68
- homeassistant/components/zha/translations/bg.json +3 -20
- homeassistant/components/zha/translations/ca.json +3 -0
- homeassistant/components/zha/translations/cs.json +16 -30
- homeassistant/components/zha/translations/da.json +3 -0
- homeassistant/components/zha/translations/de.json +15 -68
- homeassistant/components/zha/translations/el.json +3 -0
- homeassistant/components/zha/translations/en-GB.json +15 -68
- homeassistant/components/zha/translations/en.json +15 -68
- homeassistant/components/zha/translations/es.json +18 -119
- homeassistant/components/zha/translations/et.json +15 -68
- homeassistant/components/zha/translations/fi.json +3 -0
- homeassistant/components/zha/translations/fr.json +18 -0
- homeassistant/components/zha/translations/ga.json +3 -0
- homeassistant/components/zha/translations/gsw.json +3 -0
- homeassistant/components/zha/translations/hu.json +3 -0
- homeassistant/components/zha/translations/id.json +3 -0
- homeassistant/components/zha/translations/it.json +3 -0
- homeassistant/components/zha/translations/ja.json +3 -0
- homeassistant/components/zha/translations/ko.json +9 -0
- homeassistant/components/zha/translations/lt.json +15 -68
- homeassistant/components/zha/translations/nb.json +3 -0
- homeassistant/components/zha/translations/nl.json +3 -0
- homeassistant/components/zha/translations/pl.json +3 -0
- homeassistant/components/zha/translations/pt-BR.json +3 -0
- homeassistant/components/zha/translations/pt.json +18 -0
- homeassistant/components/zha/translations/ro.json +3 -0
- homeassistant/components/zha/translations/ru.json +18 -0
- homeassistant/components/zha/translations/sk.json +15 -68
- homeassistant/components/zha/translations/sl.json +9 -0
- homeassistant/components/zha/translations/sr-Latn.json +14 -0
- homeassistant/components/zha/translations/sv.json +4 -0
- homeassistant/components/zha/translations/tr.json +3 -0
- homeassistant/components/zha/translations/uk.json +3 -0
- homeassistant/components/zha/translations/zh-Hans.json +16 -30
- homeassistant/components/zha/translations/zh-Hant.json +15 -68
- homeassistant/components/zwave_js/translations/es.json +0 -3
- homeassistant/const.py +1 -1
- homeassistant/generated/config_flows.py +1 -1
- homeassistant/generated/integrations.json +7 -2
- homeassistant/package_constraints.txt +1 -1
- homeassistant/util/language.py +7 -17
- {homeassistant-2025.11.0.dist-info → homeassistant-2025.11.0b2.dist-info}/METADATA +1 -1
- {homeassistant-2025.11.0.dist-info → homeassistant-2025.11.0b2.dist-info}/RECORD +251 -240
- homeassistant/components/fing/translations/bg.json +0 -20
- homeassistant/components/fing/translations/es.json +0 -31
- homeassistant/components/inels/translations/bg.json +0 -1
- homeassistant/components/inels/translations/es.json +0 -30
- homeassistant/components/sunricher_dali/const.py +0 -5
- /homeassistant/components/{sunricher_dali → sunricher_dali_center}/quality_scale.yaml +0 -0
- {homeassistant-2025.11.0.dist-info → homeassistant-2025.11.0b2.dist-info}/WHEEL +0 -0
- {homeassistant-2025.11.0.dist-info → homeassistant-2025.11.0b2.dist-info}/entry_points.txt +0 -0
- {homeassistant-2025.11.0.dist-info → homeassistant-2025.11.0b2.dist-info}/licenses/LICENSE.md +0 -0
- {homeassistant-2025.11.0.dist-info → homeassistant-2025.11.0b2.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
- {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
|
|
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
|
|
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[
|
|
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[
|
|
131
|
-
ports.extend(await hass.async_add_executor_job(
|
|
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 =
|
|
142
|
-
|
|
143
|
-
|
|
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 =
|
|
159
|
+
addon_port = ListPortInfo(
|
|
166
160
|
device=silabs_multiprotocol_addon.get_zigbee_socket(),
|
|
167
|
-
|
|
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"{
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
627
|
+
async def async_step_maybe_confirm_ezsp_restore(
|
|
709
628
|
self, user_input: dict[str, Any] | None = None
|
|
710
629
|
) -> ConfigFlowResult:
|
|
711
|
-
"""
|
|
712
|
-
if
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
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
|
-
|
|
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.
|
|
649
|
+
await self._radio_mgr.restore_backup()
|
|
729
650
|
except DestructiveWriteNetworkSettings:
|
|
730
|
-
#
|
|
731
|
-
|
|
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
|
-
|
|
743
|
-
self.
|
|
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
|
-
#
|
|
779
|
-
return
|
|
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.
|
|
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
|
|
|
@@ -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
|
|
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(
|
|
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
|
-
"
|
|
85
|
-
"
|
|
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
|
-
"
|
|
116
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
135
|
-
"
|
|
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
|
-
"
|
|
1980
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
62
|
-
"
|
|
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"
|
|
@@ -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
|
-
"
|
|
1947
|
-
"
|
|
1948
|
-
|
|
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
|
-
"
|
|
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?",
|