homeassistant 2025.11.0b2__py3-none-any.whl → 2025.11.2__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/auth/mfa_modules/notify.py +7 -7
- homeassistant/auth/providers/homeassistant.py +8 -2
- homeassistant/components/abode/translations/mk.json +11 -0
- homeassistant/components/abode/translations/uk.json +4 -1
- homeassistant/components/accuweather/translations/mk.json +1 -0
- homeassistant/components/actron_air/translations/sr-Latn.json +3 -0
- homeassistant/components/adax/translations/sv.json +1 -1
- homeassistant/components/ads/translations/mk.json +11 -0
- homeassistant/components/aemet/translations/sv.json +2 -1
- homeassistant/components/aftership/translations/mk.json +11 -0
- homeassistant/components/ai_task/translations/mk.json +42 -1
- homeassistant/components/ai_task/translations/sv.json +3 -0
- homeassistant/components/airgradient/translations/bg.json +11 -0
- homeassistant/components/airgradient/translations/sr-Latn.json +3 -3
- homeassistant/components/airgradient/translations/sv.json +2 -0
- homeassistant/components/airly/translations/sv.json +2 -1
- homeassistant/components/airnow/translations/sv.json +2 -1
- homeassistant/components/airq/translations/sv.json +1 -0
- homeassistant/components/airthings/translations/mk.json +9 -1
- homeassistant/components/airthings_ble/config_flow.py +10 -7
- homeassistant/components/airthings_ble/const.py +5 -0
- homeassistant/components/airthings_ble/coordinator.py +32 -3
- homeassistant/components/airzone/translations/bg.json +2 -1
- homeassistant/components/airzone/translations/sr-Latn.json +1 -1
- homeassistant/components/airzone/translations/vi.json +9 -0
- homeassistant/components/airzone_cloud/translations/bg.json +5 -0
- homeassistant/components/airzone_cloud/translations/sr-Latn.json +2 -2
- homeassistant/components/airzone_cloud/translations/vi.json +9 -0
- homeassistant/components/aladdin_connect/translations/sr-Latn.json +7 -0
- homeassistant/components/aladdin_connect/translations/sv.json +1 -1
- homeassistant/components/alarm_control_panel/translations/mk.json +12 -0
- homeassistant/components/alarm_control_panel/translations/vi.json +16 -11
- homeassistant/components/alexa_devices/binary_sensor.py +2 -2
- homeassistant/components/alexa_devices/coordinator.py +6 -1
- homeassistant/components/alexa_devices/diagnostics.py +1 -1
- homeassistant/components/alexa_devices/entity.py +2 -2
- homeassistant/components/alexa_devices/manifest.json +1 -1
- homeassistant/components/alexa_devices/notify.py +3 -2
- homeassistant/components/alexa_devices/sensor.py +2 -2
- homeassistant/components/alexa_devices/services.py +1 -1
- homeassistant/components/alexa_devices/switch.py +1 -1
- homeassistant/components/alexa_devices/translations/bg.json +13 -0
- homeassistant/components/alexa_devices/translations/it.json +3 -3
- homeassistant/components/alexa_devices/translations/mk.json +7 -0
- homeassistant/components/alexa_devices/translations/pt.json +11 -0
- homeassistant/components/alexa_devices/translations/sv.json +16 -0
- homeassistant/components/alexa_devices/utils.py +1 -1
- homeassistant/components/ambient_network/sensor.py +5 -5
- homeassistant/components/anthropic/translations/en-GB.json +1 -1
- homeassistant/components/anthropic/translations/lt.json +1 -1
- homeassistant/components/aosmith/translations/bg.json +2 -1
- homeassistant/components/aosmith/translations/sr-Latn.json +1 -1
- homeassistant/components/apcupsd/translations/mk.json +3 -0
- homeassistant/components/apcupsd/translations/pl.json +13 -0
- homeassistant/components/aprilaire/translations/bg.json +30 -5
- homeassistant/components/aprilaire/translations/sr-Latn.json +14 -14
- homeassistant/components/assist_pipeline/translations/sv.json +1 -1
- homeassistant/components/assist_satellite/translations/mk.json +59 -0
- homeassistant/components/assist_satellite/translations/vi.json +38 -0
- homeassistant/components/august/translations/sr-Latn.json +7 -1
- homeassistant/components/august/translations/sv.json +4 -0
- homeassistant/components/automation/translations/bg.json +3 -0
- homeassistant/components/automation/translations/sv.json +1 -1
- homeassistant/components/awair/translations/sv.json +1 -1
- homeassistant/components/backup/manifest.json +1 -1
- homeassistant/components/backup/translations/de.json +1 -1
- homeassistant/components/backup/translations/sr-Latn.json +11 -0
- homeassistant/components/bang_olufsen/translations/mk.json +21 -0
- homeassistant/components/bayesian/translations/de.json +1 -1
- homeassistant/components/bayesian/translations/sr-Latn.json +1 -0
- homeassistant/components/bayesian/translations/sv.json +108 -11
- homeassistant/components/bayesian/translations/vi.json +8 -0
- homeassistant/components/binary_sensor/translations/bg.json +9 -2
- homeassistant/components/binary_sensor/translations/mk.json +4 -0
- homeassistant/components/binary_sensor/translations/sr-Latn.json +3 -3
- homeassistant/components/blackbird/translations/mk.json +11 -0
- homeassistant/components/blink/translations/bg.json +8 -1
- homeassistant/components/blink/translations/ca.json +8 -1
- homeassistant/components/blink/translations/mk.json +3 -0
- homeassistant/components/blink/translations/pt.json +17 -1
- homeassistant/components/blink/translations/sv.json +15 -1
- homeassistant/components/bluesound/translations/mk.json +8 -0
- homeassistant/components/bond/translations/sr-Latn.json +3 -0
- homeassistant/components/bosch_alarm/translations/sr-Latn.json +3 -0
- homeassistant/components/bring/translations/mk.json +5 -0
- homeassistant/components/bring/translations/sr-Latn.json +3 -0
- homeassistant/components/brother/translations/bg.json +0 -6
- homeassistant/components/brother/translations/ca.json +1 -5
- homeassistant/components/brother/translations/cs.json +2 -2
- homeassistant/components/brother/translations/da.json +1 -5
- homeassistant/components/brother/translations/de.json +4 -4
- homeassistant/components/brother/translations/el.json +1 -5
- homeassistant/components/brother/translations/en-GB.json +4 -4
- homeassistant/components/brother/translations/en.json +4 -4
- homeassistant/components/brother/translations/es-419.json +0 -5
- homeassistant/components/brother/translations/es.json +2 -2
- homeassistant/components/brother/translations/et.json +2 -2
- homeassistant/components/brother/translations/fi.json +1 -5
- homeassistant/components/brother/translations/fr.json +1 -5
- homeassistant/components/brother/translations/ga.json +2 -10
- homeassistant/components/brother/translations/hu.json +1 -5
- homeassistant/components/brother/translations/id.json +1 -5
- homeassistant/components/brother/translations/it.json +1 -5
- homeassistant/components/brother/translations/ja.json +1 -5
- homeassistant/components/brother/translations/ko.json +1 -5
- homeassistant/components/brother/translations/lb.json +1 -2
- homeassistant/components/brother/translations/lt.json +2 -2
- homeassistant/components/brother/translations/mk.json +9 -0
- homeassistant/components/brother/translations/nb.json +1 -5
- homeassistant/components/brother/translations/nl.json +1 -5
- homeassistant/components/brother/translations/pl.json +3 -7
- homeassistant/components/brother/translations/pt-BR.json +1 -5
- homeassistant/components/brother/translations/pt.json +2 -2
- homeassistant/components/brother/translations/ro.json +1 -2
- homeassistant/components/brother/translations/sk.json +2 -2
- homeassistant/components/brother/translations/sl.json +2 -10
- homeassistant/components/brother/translations/sv.json +4 -4
- homeassistant/components/brother/translations/tr.json +1 -5
- homeassistant/components/brother/translations/uk.json +1 -5
- homeassistant/components/brother/translations/vi.json +1 -5
- 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 +3 -0
- homeassistant/components/bryant_evolution/translations/pt.json +3 -0
- homeassistant/components/bryant_evolution/translations/ru.json +3 -0
- homeassistant/components/bryant_evolution/translations/vi.json +19 -0
- homeassistant/components/bsblan/climate.py +5 -2
- homeassistant/components/bsblan/manifest.json +1 -1
- homeassistant/components/bsblan/translations/vi.json +5 -0
- homeassistant/components/bthome/translations/mk.json +20 -0
- homeassistant/components/button/translations/mk.json +8 -1
- homeassistant/components/button/translations/vi.json +1 -0
- homeassistant/components/calendar/translations/bg.json +3 -0
- homeassistant/components/calendar/translations/mk.json +72 -0
- homeassistant/components/calendar/translations/sr-Latn.json +2 -2
- homeassistant/components/calendar/translations/sv.json +1 -1
- homeassistant/components/calendar/translations/vi.json +1 -0
- homeassistant/components/cambridge_audio/translations/bg.json +1 -0
- homeassistant/components/cambridge_audio/translations/sr-Latn.json +2 -2
- homeassistant/components/camera/translations/mk.json +60 -0
- homeassistant/components/camera/translations/sv.json +1 -1
- homeassistant/components/cert_expiry/translations/it.json +1 -0
- homeassistant/components/channels/translations/mk.json +11 -0
- homeassistant/components/climate/reproduce_state.py +3 -3
- homeassistant/components/climate/translations/bg.json +10 -4
- homeassistant/components/climate/translations/mk.json +101 -1
- homeassistant/components/climate/translations/pl.json +13 -13
- homeassistant/components/climate/translations/sr-Latn.json +4 -4
- homeassistant/components/climate/translations/vi.json +66 -10
- homeassistant/components/comelit/config_flow.py +42 -30
- homeassistant/components/control4/translations/es.json +2 -1
- homeassistant/components/conversation/manifest.json +1 -1
- homeassistant/components/conversation/translations/mk.json +37 -0
- homeassistant/components/conversation/translations/vi.json +38 -0
- homeassistant/components/counter/translations/mk.json +27 -0
- homeassistant/components/cover/translations/es.json +7 -7
- homeassistant/components/cover/translations/mk.json +6 -1
- homeassistant/components/daikin/translations/es.json +1 -0
- homeassistant/components/daikin/translations/mk.json +3 -0
- homeassistant/components/daikin/translations/pl.json +7 -0
- homeassistant/components/deluge/translations/sv.json +3 -0
- homeassistant/components/demo/translations/bg.json +3 -1
- homeassistant/components/demo/translations/mk.json +11 -0
- homeassistant/components/demo/translations/sr-Latn.json +3 -3
- homeassistant/components/demo/translations/vi.json +11 -0
- homeassistant/components/denonavr/translations/sr-Latn.json +3 -0
- homeassistant/components/derivative/translations/mk.json +9 -0
- homeassistant/components/device_tracker/translations/mk.json +22 -1
- homeassistant/components/devolo_home_control/translations/cs.json +1 -1
- homeassistant/components/devolo_home_control/translations/de.json +1 -1
- homeassistant/components/devolo_home_control/translations/el.json +0 -3
- homeassistant/components/devolo_home_control/translations/en-GB.json +1 -1
- homeassistant/components/devolo_home_control/translations/en.json +1 -1
- homeassistant/components/devolo_home_control/translations/es.json +1 -1
- homeassistant/components/devolo_home_control/translations/et.json +1 -1
- homeassistant/components/devolo_home_control/translations/ga.json +0 -3
- homeassistant/components/devolo_home_control/translations/hu.json +0 -3
- homeassistant/components/devolo_home_control/translations/ja.json +0 -3
- homeassistant/components/devolo_home_control/translations/lt.json +1 -1
- homeassistant/components/devolo_home_control/translations/pt.json +1 -1
- homeassistant/components/devolo_home_control/translations/sk.json +1 -1
- homeassistant/components/devolo_home_control/translations/tr.json +0 -3
- homeassistant/components/devolo_home_control/translations/zh-Hans.json +1 -1
- homeassistant/components/devolo_home_control/translations/zh-Hant.json +1 -1
- homeassistant/components/dlna_dmr/translations/sv.json +1 -1
- homeassistant/components/downloader/translations/mk.json +11 -0
- homeassistant/components/drop_connect/translations/mk.json +1 -0
- homeassistant/components/ecobee/translations/mk.json +21 -0
- homeassistant/components/ecobee/translations/sv.json +3 -0
- homeassistant/components/ecoforest/translations/bg.json +1 -0
- homeassistant/components/ecoforest/translations/mk.json +9 -0
- homeassistant/components/ecoforest/translations/sr-Latn.json +2 -2
- homeassistant/components/econet/translations/sv.json +1 -1
- homeassistant/components/ecovacs/translations/es.json +27 -0
- homeassistant/components/ecovacs/translations/mk.json +9 -0
- homeassistant/components/ecovacs/translations/sr-Latn.json +18 -0
- homeassistant/components/eheimdigital/translations/sr-Latn.json +5 -0
- homeassistant/components/ekeybionyx/translations/sr-Latn.json +10 -0
- homeassistant/components/electric_kiwi/translations/sv.json +3 -0
- homeassistant/components/elkm1/translations/mk.json +7 -0
- homeassistant/components/esphome/__init__.py +5 -3
- homeassistant/components/esphome/translations/he.json +2 -2
- homeassistant/components/esphome/translations/sv.json +1 -1
- homeassistant/components/event/translations/mk.json +7 -0
- homeassistant/components/evohome/translations/mk.json +18 -0
- homeassistant/components/ezviz/translations/mk.json +9 -0
- homeassistant/components/faa_delays/translations/mk.json +13 -0
- homeassistant/components/fan/translations/bg.json +3 -0
- homeassistant/components/fan/translations/mk.json +35 -0
- homeassistant/components/filter/translations/mk.json +9 -0
- homeassistant/components/fing/translations/bg.json +20 -0
- homeassistant/components/fing/translations/ca.json +23 -0
- homeassistant/components/fing/translations/es.json +31 -0
- homeassistant/components/fing/translations/sv.json +17 -0
- homeassistant/components/firefly_iii/translations/bg.json +3 -0
- homeassistant/components/fitbit/translations/sv.json +3 -0
- homeassistant/components/fivem/translations/mk.json +9 -0
- homeassistant/components/flexit_bacnet/translations/vi.json +7 -0
- homeassistant/components/foscam/camera.py +4 -1
- homeassistant/components/foscam/coordinator.py +37 -19
- homeassistant/components/foscam/manifest.json +1 -1
- homeassistant/components/foscam/switch.py +1 -0
- homeassistant/components/foscam/translations/mk.json +9 -0
- homeassistant/components/freebox/translations/sv.json +1 -1
- homeassistant/components/fritzbox/translations/vi.json +13 -0
- homeassistant/components/fritzbox_callmonitor/translations/mk.json +3 -0
- homeassistant/components/fronius/translations/pl.json +3 -3
- homeassistant/components/frontend/__init__.py +1 -1
- homeassistant/components/frontend/manifest.json +1 -1
- homeassistant/components/frontend/translations/mk.json +9 -0
- homeassistant/components/frontend/translations/pl.json +18 -1
- homeassistant/components/fully_kiosk/translations/mk.json +11 -0
- homeassistant/components/fyta/translations/sr-Latn.json +3 -0
- homeassistant/components/generic_thermostat/translations/mk.json +2 -0
- homeassistant/components/generic_thermostat/translations/pl.json +2 -0
- homeassistant/components/geniushub/translations/mk.json +18 -0
- homeassistant/components/geo_location/translations/mk.json +11 -0
- homeassistant/components/geocaching/translations/sv.json +3 -0
- homeassistant/components/glances/translations/sl.json +7 -0
- homeassistant/components/goalzero/translations/sv.json +3 -0
- homeassistant/components/google/translations/mk.json +53 -0
- homeassistant/components/google/translations/sv.json +3 -0
- homeassistant/components/google_assistant_sdk/translations/sv.json +3 -0
- homeassistant/components/google_cloud/translations/sv.json +1 -0
- homeassistant/components/google_drive/translations/sr-Latn.json +7 -0
- homeassistant/components/google_drive/translations/sv.json +3 -0
- homeassistant/components/google_generative_ai_conversation/translations/lt.json +1 -1
- homeassistant/components/google_generative_ai_conversation/translations/mk.json +3 -0
- homeassistant/components/google_generative_ai_conversation/translations/sv.json +3 -1
- homeassistant/components/google_mail/translations/mk.json +12 -0
- homeassistant/components/google_mail/translations/sv.json +3 -0
- homeassistant/components/google_mail/translations/vi.json +7 -0
- homeassistant/components/google_photos/translations/mk.json +9 -0
- homeassistant/components/google_photos/translations/sv.json +3 -0
- homeassistant/components/google_sheets/translations/bg.json +10 -0
- homeassistant/components/google_sheets/translations/ca.json +11 -0
- homeassistant/components/google_sheets/translations/es.json +9 -0
- homeassistant/components/google_sheets/translations/mk.json +9 -0
- homeassistant/components/google_sheets/translations/sr-Latn.json +14 -0
- homeassistant/components/google_sheets/translations/sv.json +14 -0
- homeassistant/components/google_tasks/translations/sv.json +3 -0
- homeassistant/components/google_travel_time/translations/ru.json +4 -2
- homeassistant/components/google_travel_time/translations/sv.json +4 -2
- homeassistant/components/govee_ble/translations/mk.json +15 -0
- homeassistant/components/group/translations/bg.json +1 -0
- homeassistant/components/group/translations/ca.json +15 -0
- homeassistant/components/group/translations/mk.json +6 -0
- homeassistant/components/growatt_server/__init__.py +15 -0
- homeassistant/components/growatt_server/translations/it.json +14 -0
- homeassistant/components/growatt_server/translations/ru.json +6 -0
- homeassistant/components/growatt_server/translations/sv.json +4 -2
- homeassistant/components/guardian/translations/mk.json +11 -0
- homeassistant/components/habitica/translations/ca.json +7 -0
- homeassistant/components/habitica/translations/es.json +26 -0
- homeassistant/components/habitica/translations/mk.json +16 -1
- homeassistant/components/habitica/translations/sv.json +19 -1
- homeassistant/components/hassio/issues.py +0 -2
- homeassistant/components/hassio/translations/es.json +13 -0
- homeassistant/components/hassio/translations/it.json +13 -0
- homeassistant/components/hassio/translations/sv.json +7 -2
- homeassistant/components/hdmi_cec/translations/mk.json +7 -0
- homeassistant/components/heos/translations/mk.json +1 -1
- homeassistant/components/heos/translations/sr-Latn.json +3 -0
- homeassistant/components/here_travel_time/translations/mk.json +7 -0
- homeassistant/components/history_stats/translations/mk.json +11 -0
- homeassistant/components/hive/translations/bg.json +2 -0
- homeassistant/components/hive/translations/mk.json +16 -0
- homeassistant/components/hive/translations/sr-Latn.json +3 -3
- homeassistant/components/holiday/manifest.json +1 -1
- homeassistant/components/home_connect/translations/bg.json +160 -32
- homeassistant/components/home_connect/translations/mk.json +10 -0
- homeassistant/components/home_connect/translations/pt.json +3 -0
- homeassistant/components/home_connect/translations/sr-Latn.json +44 -44
- homeassistant/components/home_connect/translations/sv.json +7 -1
- homeassistant/components/homeassistant/translations/sv.json +5 -1
- homeassistant/components/homeassistant_connect_zbt2/config_flow.py +18 -1
- homeassistant/components/homeassistant_connect_zbt2/const.py +58 -0
- homeassistant/components/homeassistant_connect_zbt2/manifest.json +6 -0
- homeassistant/components/homeassistant_connect_zbt2/translations/pt.json +7 -0
- homeassistant/components/homeassistant_connect_zbt2/translations/sv.json +35 -3
- homeassistant/components/homeassistant_hardware/firmware_config_flow.py +101 -65
- homeassistant/components/homeassistant_hardware/translations/sv.json +5 -2
- homeassistant/components/homeassistant_hardware/translations/vi.json +1 -0
- homeassistant/components/homeassistant_sky_connect/manifest.json +6 -0
- homeassistant/components/homeassistant_sky_connect/translations/pt.json +7 -0
- homeassistant/components/homeassistant_sky_connect/translations/sv.json +20 -5
- homeassistant/components/homeassistant_sky_connect/translations/vi.json +1 -0
- homeassistant/components/homeassistant_yellow/manifest.json +6 -0
- homeassistant/components/homeassistant_yellow/translations/pt.json +5 -0
- homeassistant/components/homeassistant_yellow/translations/sv.json +13 -3
- homeassistant/components/homeassistant_yellow/translations/vi.json +1 -0
- homeassistant/components/homee/translations/bg.json +2 -1
- homeassistant/components/homee/translations/mk.json +16 -0
- homeassistant/components/homee/translations/sr-Latn.json +4 -2
- homeassistant/components/homekit/translations/sv.json +6 -0
- homeassistant/components/homekit_controller/translations/mk.json +1 -0
- homeassistant/components/homematic/translations/mk.json +18 -0
- homeassistant/components/homematicip_cloud/translations/mk.json +7 -0
- homeassistant/components/homematicip_cloud/translations/sv.json +1 -1
- homeassistant/components/homewizard/translations/es.json +4 -2
- homeassistant/components/homewizard/translations/pl.json +1 -1
- homeassistant/components/homewizard/translations/ru.json +4 -2
- homeassistant/components/homewizard/translations/sv.json +1 -1
- homeassistant/components/homeworks/translations/mk.json +11 -0
- homeassistant/components/honeywell/translations/mk.json +15 -0
- homeassistant/components/honeywell/translations/vi.json +11 -0
- homeassistant/components/html5/translations/mk.json +9 -1
- homeassistant/components/http/__init__.py +13 -2
- homeassistant/components/http/strings.json +4 -0
- homeassistant/components/http/translations/cs.json +4 -0
- homeassistant/components/http/translations/de.json +4 -0
- homeassistant/components/http/translations/en-GB.json +4 -0
- homeassistant/components/http/translations/en.json +4 -0
- homeassistant/components/http/translations/es.json +4 -0
- homeassistant/components/http/translations/et.json +4 -0
- homeassistant/components/http/translations/ga.json +4 -0
- homeassistant/components/http/translations/he.json +4 -0
- homeassistant/components/http/translations/it.json +4 -0
- homeassistant/components/http/translations/lt.json +4 -0
- homeassistant/components/http/translations/pt.json +4 -0
- homeassistant/components/http/translations/ru.json +3 -0
- homeassistant/components/http/translations/sk.json +4 -0
- homeassistant/components/http/translations/sr-Latn.json +7 -0
- homeassistant/components/http/translations/sv.json +4 -0
- homeassistant/components/http/translations/zh-Hans.json +4 -0
- homeassistant/components/http/translations/zh-Hant.json +4 -0
- homeassistant/components/huawei_lte/translations/bg.json +0 -6
- homeassistant/components/huawei_lte/translations/ca.json +0 -6
- homeassistant/components/huawei_lte/translations/cs.json +2 -2
- homeassistant/components/huawei_lte/translations/de.json +2 -2
- homeassistant/components/huawei_lte/translations/el.json +2 -2
- homeassistant/components/huawei_lte/translations/en-GB.json +2 -2
- homeassistant/components/huawei_lte/translations/en.json +2 -2
- homeassistant/components/huawei_lte/translations/es.json +2 -2
- homeassistant/components/huawei_lte/translations/et.json +2 -2
- homeassistant/components/huawei_lte/translations/fi.json +0 -6
- homeassistant/components/huawei_lte/translations/ga.json +0 -6
- homeassistant/components/huawei_lte/translations/hu.json +0 -6
- homeassistant/components/huawei_lte/translations/it.json +0 -6
- homeassistant/components/huawei_lte/translations/ja.json +0 -6
- homeassistant/components/huawei_lte/translations/ko.json +0 -6
- homeassistant/components/huawei_lte/translations/lt.json +2 -2
- homeassistant/components/huawei_lte/translations/nl.json +0 -6
- homeassistant/components/huawei_lte/translations/pt.json +2 -2
- homeassistant/components/huawei_lte/translations/ru.json +2 -2
- homeassistant/components/huawei_lte/translations/sk.json +2 -2
- homeassistant/components/huawei_lte/translations/tr.json +0 -6
- homeassistant/components/huawei_lte/translations/zh-Hans.json +2 -2
- homeassistant/components/huawei_lte/translations/zh-Hant.json +2 -2
- homeassistant/components/hue/translations/sv.json +1 -0
- homeassistant/components/humidifier/translations/bg.json +5 -1
- homeassistant/components/humidifier/translations/mk.json +18 -0
- homeassistant/components/humidifier/translations/pl.json +11 -4
- homeassistant/components/humidifier/translations/sr-Latn.json +3 -3
- homeassistant/components/husqvarna_automower/entity.py +7 -4
- homeassistant/components/husqvarna_automower/translations/bg.json +2 -0
- homeassistant/components/husqvarna_automower/translations/mk.json +14 -0
- homeassistant/components/husqvarna_automower/translations/sr-Latn.json +2 -2
- homeassistant/components/husqvarna_automower/translations/sv.json +3 -0
- homeassistant/components/husqvarna_automower_ble/translations/sv.json +22 -1
- homeassistant/components/huum/translations/vi.json +9 -0
- homeassistant/components/hydrawise/translations/mk.json +11 -0
- homeassistant/components/hyperion/camera.py +3 -1
- homeassistant/components/hyperion/translations/sv.json +1 -1
- homeassistant/components/icloud/translations/mk.json +17 -0
- homeassistant/components/icloud/translations/sv.json +2 -0
- homeassistant/components/ifttt/translations/mk.json +9 -0
- homeassistant/components/ihc/translations/mk.json +25 -0
- homeassistant/components/image/translations/mk.json +12 -0
- homeassistant/components/imeon_inverter/translations/sv.json +8 -0
- homeassistant/components/incomfort/translations/bg.json +1 -0
- homeassistant/components/incomfort/translations/sr-Latn.json +1 -1
- homeassistant/components/inels/translations/bg.json +1 -0
- homeassistant/components/inels/translations/ca.json +7 -0
- homeassistant/components/inels/translations/es.json +30 -0
- homeassistant/components/inels/translations/sr-Latn.json +1 -0
- homeassistant/components/inels/translations/sv.json +12 -0
- homeassistant/components/input_boolean/translations/bg.json +1 -0
- homeassistant/components/input_boolean/translations/cs.json +2 -2
- homeassistant/components/input_boolean/translations/mk.json +17 -0
- homeassistant/components/input_boolean/translations/pl.json +4 -0
- homeassistant/components/input_boolean/translations/sr-Latn.json +2 -2
- homeassistant/components/input_button/translations/mk.json +12 -0
- homeassistant/components/input_datetime/translations/mk.json +10 -0
- homeassistant/components/input_number/translations/mk.json +21 -0
- homeassistant/components/input_select/translations/mk.json +38 -0
- homeassistant/components/input_select/translations/vi.json +2 -0
- homeassistant/components/input_text/translations/mk.json +15 -0
- homeassistant/components/integration/translations/mk.json +9 -0
- homeassistant/components/iometer/translations/sr-Latn.json +7 -0
- homeassistant/components/iotawatt/translations/sv.json +1 -1
- homeassistant/components/iotty/translations/sv.json +3 -0
- homeassistant/components/iron_os/translations/bg.json +9 -1
- homeassistant/components/iron_os/translations/sr-Latn.json +5 -5
- homeassistant/components/iskra/translations/sv.json +2 -1
- homeassistant/components/isy994/translations/mk.json +14 -0
- homeassistant/components/isy994/translations/sv.json +2 -0
- homeassistant/components/ituran/binary_sensor.py +1 -2
- homeassistant/components/ituran/device_tracker.py +2 -4
- homeassistant/components/ituran/sensor.py +1 -2
- homeassistant/components/jewish_calendar/translations/es.json +6 -0
- homeassistant/components/jvc_projector/translations/sr-Latn.json +1 -1
- homeassistant/components/keba/translations/sv.json +1 -0
- homeassistant/components/keymitt_ble/translations/mk.json +11 -0
- homeassistant/components/kitchen_sink/translations/sv.json +3 -3
- homeassistant/components/knx/manifest.json +1 -1
- homeassistant/components/knx/storage/entity_store_schema.py +1 -1
- homeassistant/components/knx/translations/bg.json +94 -0
- homeassistant/components/knx/translations/ca.json +15 -0
- homeassistant/components/knx/translations/es.json +39 -8
- homeassistant/components/knx/translations/it.json +119 -2
- homeassistant/components/knx/translations/mk.json +13 -0
- homeassistant/components/knx/translations/pl.json +16 -0
- homeassistant/components/knx/translations/sr-Latn.json +44 -1
- homeassistant/components/knx/translations/sv.json +56 -5
- homeassistant/components/knx/translations/vi.json +29 -0
- homeassistant/components/kodi/translations/mk.json +11 -0
- homeassistant/components/lamarzocco/update.py +1 -1
- homeassistant/components/lametric/translations/es.json +1 -0
- homeassistant/components/lametric/translations/mk.json +16 -0
- homeassistant/components/lametric/translations/sv.json +4 -0
- homeassistant/components/laundrify/translations/mk.json +9 -0
- homeassistant/components/lawn_mower/translations/mk.json +7 -0
- homeassistant/components/lawn_mower/translations/sr-Latn.json +1 -1
- homeassistant/components/lcn/translations/mk.json +23 -1
- homeassistant/components/lg_thinq/sensor.py +1 -0
- homeassistant/components/lg_thinq/translations/bg.json +25 -3
- homeassistant/components/lg_thinq/translations/mk.json +13 -0
- homeassistant/components/lg_thinq/translations/pl.json +5 -0
- homeassistant/components/lg_thinq/translations/sr-Latn.json +16 -16
- homeassistant/components/lg_thinq/translations/sv.json +1 -0
- homeassistant/components/libre_hardware_monitor/translations/sv.json +4 -0
- homeassistant/components/lifx/translations/mk.json +7 -0
- homeassistant/components/light/translations/bg.json +7 -1
- homeassistant/components/light/translations/mk.json +3 -1
- homeassistant/components/light/translations/sr-Latn.json +3 -3
- homeassistant/components/light/translations/vi.json +25 -2
- homeassistant/components/litterrobot/manifest.json +1 -1
- homeassistant/components/litterrobot/translations/bg.json +3 -1
- homeassistant/components/litterrobot/translations/mk.json +12 -0
- homeassistant/components/litterrobot/translations/sr-Latn.json +2 -2
- homeassistant/components/lock/translations/he.json +1 -1
- homeassistant/components/lock/translations/vi.json +5 -1
- homeassistant/components/logbook/translations/mk.json +14 -0
- homeassistant/components/logger/translations/de.json +1 -1
- homeassistant/components/logger/translations/mk.json +11 -0
- homeassistant/components/london_underground/translations/he.json +1 -0
- homeassistant/components/lutron/translations/mk.json +13 -0
- homeassistant/components/lutron_caseta/translations/bg.json +2 -1
- homeassistant/components/lutron_caseta/translations/sr-Latn.json +2 -2
- homeassistant/components/lyric/translations/sv.json +4 -1
- homeassistant/components/mastodon/translations/mk.json +17 -0
- homeassistant/components/matrix/translations/bg.json +2 -1
- homeassistant/components/matrix/translations/mk.json +17 -0
- homeassistant/components/matrix/translations/sv.json +31 -0
- homeassistant/components/matter/translations/bg.json +12 -2
- homeassistant/components/matter/translations/cs.json +1 -1
- homeassistant/components/matter/translations/de.json +0 -3
- homeassistant/components/matter/translations/el.json +0 -3
- homeassistant/components/matter/translations/en-GB.json +0 -3
- homeassistant/components/matter/translations/en.json +1 -1
- homeassistant/components/matter/translations/es.json +26 -6
- homeassistant/components/matter/translations/et.json +0 -3
- homeassistant/components/matter/translations/he.json +0 -3
- homeassistant/components/matter/translations/it.json +40 -0
- homeassistant/components/matter/translations/lt.json +0 -3
- homeassistant/components/matter/translations/mk.json +19 -3
- homeassistant/components/matter/translations/pl.json +5 -0
- homeassistant/components/matter/translations/pt.json +0 -3
- homeassistant/components/matter/translations/ru.json +0 -3
- homeassistant/components/matter/translations/sk.json +0 -3
- homeassistant/components/matter/translations/sr-Latn.json +5 -5
- homeassistant/components/matter/translations/sv.json +10 -0
- homeassistant/components/matter/translations/zh-Hans.json +0 -3
- homeassistant/components/matter/translations/zh-Hant.json +0 -3
- homeassistant/components/mcp/translations/es.json +4 -0
- homeassistant/components/mcp/translations/sv.json +3 -0
- homeassistant/components/mcp_server/translations/lt.json +1 -1
- homeassistant/components/mealie/translations/mk.json +14 -0
- homeassistant/components/mealie/translations/sr-Latn.json +2 -1
- homeassistant/components/media_extractor/translations/mk.json +7 -0
- homeassistant/components/media_player/translations/bg.json +3 -0
- homeassistant/components/media_player/translations/mk.json +200 -2
- homeassistant/components/media_player/translations/sr-Latn.json +6 -6
- homeassistant/components/media_player/translations/vi.json +54 -1
- homeassistant/components/media_source/translations/mk.json +5 -0
- homeassistant/components/meteo_lt/weather.py +2 -2
- homeassistant/components/metoffice/translations/sr-Latn.json +3 -1
- homeassistant/components/microbees/translations/sv.json +3 -0
- homeassistant/components/miele/button.py +4 -3
- homeassistant/components/miele/climate.py +3 -2
- homeassistant/components/miele/coordinator.py +1 -1
- homeassistant/components/miele/fan.py +5 -2
- homeassistant/components/miele/light.py +3 -2
- homeassistant/components/miele/sensor.py +8 -2
- homeassistant/components/miele/services.py +4 -4
- homeassistant/components/miele/switch.py +5 -3
- homeassistant/components/miele/translations/bg.json +1 -0
- homeassistant/components/miele/translations/cs.json +1 -1
- homeassistant/components/miele/translations/de.json +1 -1
- homeassistant/components/miele/translations/en-GB.json +1 -1
- homeassistant/components/miele/translations/en.json +1 -1
- homeassistant/components/miele/translations/es.json +1 -1
- homeassistant/components/miele/translations/et.json +1 -1
- homeassistant/components/miele/translations/ga.json +1 -2
- homeassistant/components/miele/translations/hu.json +1 -2
- homeassistant/components/miele/translations/it.json +1 -2
- homeassistant/components/miele/translations/lt.json +1 -1
- homeassistant/components/miele/translations/mk.json +11 -0
- homeassistant/components/miele/translations/pt.json +1 -1
- homeassistant/components/miele/translations/sk.json +1 -1
- homeassistant/components/miele/translations/sr-Latn.json +3 -2
- homeassistant/components/miele/translations/sv.json +21 -2
- homeassistant/components/miele/translations/tr.json +1 -2
- homeassistant/components/miele/translations/vi.json +9 -0
- homeassistant/components/miele/translations/zh-Hans.json +1 -1
- homeassistant/components/miele/translations/zh-Hant.json +1 -1
- homeassistant/components/miele/vacuum.py +3 -2
- homeassistant/components/mill/manifest.json +1 -1
- homeassistant/components/minecraft_server/translations/mk.json +9 -0
- homeassistant/components/mjpeg/translations/sv.json +2 -0
- homeassistant/components/mobile_app/binary_sensor.py +6 -4
- homeassistant/components/mobile_app/sensor.py +6 -4
- homeassistant/components/mobile_app/translations/mk.json +11 -0
- homeassistant/components/modbus/translations/mk.json +11 -0
- homeassistant/components/modbus/translations/sv.json +2 -0
- homeassistant/components/monarch_money/translations/mk.json +9 -0
- homeassistant/components/monzo/translations/sv.json +3 -0
- homeassistant/components/motion_blinds/cover.py +1 -0
- homeassistant/components/motion_blinds/translations/sv.json +2 -1
- homeassistant/components/motionmount/translations/sr-Latn.json +4 -0
- homeassistant/components/motionmount/translations/sv.json +4 -1
- homeassistant/components/mqtt/translations/bg.json +4 -2
- homeassistant/components/mqtt/translations/es.json +4 -4
- homeassistant/components/mqtt/translations/he.json +2 -2
- homeassistant/components/mqtt/translations/mk.json +13 -1
- homeassistant/components/mqtt/translations/sr-Latn.json +2 -2
- homeassistant/components/mqtt/translations/sv.json +50 -10
- homeassistant/components/mqtt/translations/vi.json +83 -7
- homeassistant/components/music_assistant/translations/mk.json +10 -0
- homeassistant/components/mutesync/translations/mk.json +9 -0
- homeassistant/components/myuplink/translations/mk.json +7 -0
- homeassistant/components/myuplink/translations/sv.json +3 -0
- homeassistant/components/nanoleaf/translations/sv.json +1 -1
- homeassistant/components/neato/translations/sv.json +3 -0
- homeassistant/components/nederlandse_spoorwegen/translations/bg.json +2 -1
- homeassistant/components/nederlandse_spoorwegen/translations/ca.json +7 -1
- homeassistant/components/nederlandse_spoorwegen/translations/pt.json +12 -1
- homeassistant/components/nederlandse_spoorwegen/translations/sv.json +3 -0
- homeassistant/components/nest/translations/sr-Latn.json +1 -0
- homeassistant/components/nest/translations/sv.json +3 -0
- homeassistant/components/netatmo/translations/mk.json +14 -0
- homeassistant/components/netatmo/translations/sv.json +3 -0
- homeassistant/components/nexia/translations/mk.json +14 -0
- homeassistant/components/nexia/translations/vi.json +12 -0
- homeassistant/components/nextdns/translations/bg.json +2 -1
- homeassistant/components/nextdns/translations/ca.json +7 -1
- homeassistant/components/nextdns/translations/it.json +1 -0
- homeassistant/components/nextdns/translations/sv.json +10 -1
- homeassistant/components/nina/translations/bg.json +0 -6
- homeassistant/components/nina/translations/es.json +40 -1
- homeassistant/components/nina/translations/sr-Latn.json +28 -0
- homeassistant/components/nina/translations/sv.json +14 -0
- homeassistant/components/nintendo_parental_controls/translations/bg.json +19 -0
- homeassistant/components/nintendo_parental_controls/translations/pt.json +27 -0
- homeassistant/components/nintendo_parental_controls/translations/sv.json +23 -0
- homeassistant/components/nobo_hub/translations/mk.json +11 -0
- homeassistant/components/nobo_hub/translations/vi.json +11 -0
- homeassistant/components/nordpool/translations/mk.json +14 -0
- homeassistant/components/notify/translations/mk.json +58 -0
- homeassistant/components/notify/translations/sv.json +1 -1
- homeassistant/components/ntfy/translations/mk.json +14 -0
- homeassistant/components/ntfy/translations/sv.json +1 -1
- homeassistant/components/nuki/translations/es.json +4 -0
- homeassistant/components/nuki/translations/ru.json +4 -0
- homeassistant/components/number/translations/mk.json +14 -1
- homeassistant/components/nut/translations/bg.json +1 -0
- homeassistant/components/nut/translations/mk.json +8 -0
- homeassistant/components/nut/translations/pl.json +6 -0
- homeassistant/components/nut/translations/sr-Latn.json +1 -1
- homeassistant/components/nws/translations/mk.json +10 -0
- homeassistant/components/octoprint/translations/es.json +16 -0
- homeassistant/components/ohme/translations/mk.json +5 -0
- homeassistant/components/ollama/translations/lt.json +1 -1
- homeassistant/components/ollama/translations/sr-Latn.json +6 -0
- homeassistant/components/ondilo_ico/translations/sv.json +3 -0
- homeassistant/components/onedrive/manifest.json +1 -1
- homeassistant/components/onedrive/translations/mk.json +9 -0
- homeassistant/components/onedrive/translations/sr-Latn.json +5 -0
- homeassistant/components/onedrive/translations/sv.json +3 -0
- homeassistant/components/onewire/manifest.json +1 -1
- homeassistant/components/onewire/translations/el.json +1 -1
- homeassistant/components/onewire/translations/en-GB.json +1 -1
- homeassistant/components/onewire/translations/en.json +1 -1
- homeassistant/components/onewire/translations/es.json +1 -1
- homeassistant/components/onewire/translations/et.json +1 -1
- homeassistant/components/onewire/translations/ga.json +0 -1
- homeassistant/components/onewire/translations/sv.json +0 -1
- homeassistant/components/onvif/translations/sv.json +1 -1
- homeassistant/components/open_router/manifest.json +1 -1
- homeassistant/components/open_router/translations/lt.json +1 -1
- homeassistant/components/open_router/translations/mk.json +3 -0
- homeassistant/components/openai_conversation/translations/lt.json +1 -1
- homeassistant/components/openrgb/translations/cs.json +1 -1
- homeassistant/components/openrgb/translations/de.json +1 -1
- homeassistant/components/openrgb/translations/es.json +1 -1
- homeassistant/components/openrgb/translations/pt.json +1 -1
- homeassistant/components/opentherm_gw/translations/mk.json +10 -0
- homeassistant/components/opentherm_gw/translations/vi.json +5 -0
- homeassistant/components/openweathermap/translations/sv.json +1 -1
- homeassistant/components/oralb/translations/bg.json +2 -0
- homeassistant/components/oralb/translations/es.json +1 -0
- homeassistant/components/oralb/translations/fr.json +41 -4
- homeassistant/components/osoenergy/translations/bg.json +6 -0
- homeassistant/components/osoenergy/translations/sr-Latn.json +2 -2
- homeassistant/components/overkiz/translations/lt.json +2 -1
- homeassistant/components/overkiz/translations/mk.json +11 -0
- homeassistant/components/overkiz/translations/pt.json +2 -1
- homeassistant/components/overkiz/translations/ru.json +2 -1
- homeassistant/components/overkiz/translations/vi.json +6 -0
- homeassistant/components/palazzetti/manifest.json +1 -1
- homeassistant/components/palazzetti/translations/mk.json +1 -0
- homeassistant/components/palazzetti/translations/sr-Latn.json +1 -1
- homeassistant/components/persistent_notification/translations/mk.json +15 -0
- homeassistant/components/person/translations/mk.json +7 -1
- homeassistant/components/pi_hole/translations/mk.json +14 -0
- homeassistant/components/playstation_network/translations/sr-Latn.json +3 -0
- homeassistant/components/plugwise/climate.py +86 -26
- homeassistant/components/plugwise/manifest.json +1 -1
- homeassistant/components/plugwise/strings.json +3 -0
- homeassistant/components/plugwise/translations/bg.json +9 -2
- homeassistant/components/plugwise/translations/cs.json +3 -0
- homeassistant/components/plugwise/translations/de.json +3 -0
- homeassistant/components/plugwise/translations/en-GB.json +3 -0
- homeassistant/components/plugwise/translations/en.json +3 -0
- homeassistant/components/plugwise/translations/es.json +3 -0
- homeassistant/components/plugwise/translations/et.json +3 -0
- homeassistant/components/plugwise/translations/ga.json +3 -0
- homeassistant/components/plugwise/translations/it.json +3 -0
- homeassistant/components/plugwise/translations/lt.json +3 -0
- homeassistant/components/plugwise/translations/mk.json +8 -0
- homeassistant/components/plugwise/translations/pt.json +3 -0
- homeassistant/components/plugwise/translations/sk.json +3 -0
- homeassistant/components/plugwise/translations/sr-Latn.json +3 -3
- homeassistant/components/plugwise/translations/sv.json +3 -0
- homeassistant/components/plugwise/translations/vi.json +6 -1
- homeassistant/components/plugwise/translations/zh-Hans.json +3 -0
- homeassistant/components/plugwise/translations/zh-Hant.json +3 -0
- homeassistant/components/point/translations/sv.json +3 -0
- homeassistant/components/pooldose/translations/bg.json +4 -0
- homeassistant/components/pooldose/translations/it.json +1 -0
- homeassistant/components/pooldose/translations/sr-Latn.json +4 -4
- homeassistant/components/pooldose/translations/sv.json +14 -1
- homeassistant/components/portainer/manifest.json +1 -1
- homeassistant/components/portainer/translations/bg.json +8 -1
- homeassistant/components/portainer/translations/ca.json +9 -1
- homeassistant/components/portainer/translations/mk.json +9 -0
- homeassistant/components/portainer/translations/pt.json +16 -1
- homeassistant/components/portainer/translations/sr-Latn.json +3 -1
- homeassistant/components/portainer/translations/sv.json +16 -3
- homeassistant/components/powerwall/translations/mk.json +9 -0
- homeassistant/components/probe_plus/translations/es.json +5 -0
- homeassistant/components/profiler/translations/mk.json +18 -0
- homeassistant/components/prusalink/translations/mk.json +9 -0
- homeassistant/components/ps4/translations/es.json +9 -1
- homeassistant/components/ps4/translations/sv.json +2 -2
- homeassistant/components/pterodactyl/translations/mk.json +7 -0
- homeassistant/components/pushbullet/translations/mk.json +9 -0
- homeassistant/components/qbittorrent/translations/mk.json +3 -0
- homeassistant/components/qbittorrent/translations/ru.json +4 -0
- homeassistant/components/qbus/translations/sr-Latn.json +5 -0
- homeassistant/components/qbus/translations/sv.json +7 -0
- homeassistant/components/qnap/translations/mk.json +7 -0
- homeassistant/components/rachio/translations/mk.json +23 -0
- homeassistant/components/rainbird/translations/mk.json +18 -0
- homeassistant/components/rainmachine/translations/mk.json +21 -0
- homeassistant/components/rainmachine/translations/pt.json +1 -0
- homeassistant/components/random/translations/sr-Latn.json +2 -1
- homeassistant/components/recorder/auto_repairs/statistics/schema.py +3 -0
- homeassistant/components/recorder/const.py +1 -1
- homeassistant/components/recorder/db_schema.py +1 -1
- homeassistant/components/recorder/migration.py +73 -4
- homeassistant/components/recorder/translations/mk.json +6 -0
- homeassistant/components/renault/translations/sr-Latn.json +1 -0
- homeassistant/components/renault/translations/vi.json +11 -0
- homeassistant/components/renson/translations/bg.json +2 -1
- homeassistant/components/renson/translations/mk.json +11 -0
- homeassistant/components/renson/translations/sr-Latn.json +4 -4
- homeassistant/components/reolink/manifest.json +1 -1
- homeassistant/components/reolink/translations/bg.json +34 -1
- homeassistant/components/reolink/translations/cs.json +1 -0
- homeassistant/components/reolink/translations/en-GB.json +1 -0
- homeassistant/components/reolink/translations/es.json +1 -0
- homeassistant/components/reolink/translations/et.json +1 -0
- homeassistant/components/reolink/translations/ga.json +1 -0
- homeassistant/components/reolink/translations/it.json +5 -0
- homeassistant/components/reolink/translations/lt.json +1 -0
- homeassistant/components/reolink/translations/mk.json +4 -0
- homeassistant/components/reolink/translations/pl.json +8 -7
- homeassistant/components/reolink/translations/pt.json +1 -0
- homeassistant/components/reolink/translations/sk.json +1 -0
- homeassistant/components/reolink/translations/sr-Latn.json +12 -12
- homeassistant/components/reolink/translations/sv.json +1 -1
- homeassistant/components/rfxtrx/translations/bg.json +1 -0
- homeassistant/components/rfxtrx/translations/sr-Latn.json +2 -2
- homeassistant/components/risco/translations/vi.json +8 -0
- homeassistant/components/roborock/translations/bg.json +3 -1
- homeassistant/components/roborock/translations/mk.json +3 -0
- homeassistant/components/roborock/translations/sr-Latn.json +2 -2
- homeassistant/components/roomba/translations/sv.json +1 -1
- homeassistant/components/roon/translations/sv.json +1 -1
- homeassistant/components/ruuvitag_ble/manifest.json +1 -1
- homeassistant/components/sabnzbd/translations/mk.json +9 -0
- homeassistant/components/satel_integra/translations/it.json +1 -0
- homeassistant/components/satel_integra/translations/pl.json +3 -3
- homeassistant/components/satel_integra/translations/sr-Latn.json +2 -1
- homeassistant/components/satel_integra/translations/sv.json +9 -2
- homeassistant/components/satel_integra/translations/vi.json +10 -0
- homeassistant/components/schedule/translations/vi.json +8 -1
- homeassistant/components/scrape/translations/mk.json +2 -1
- homeassistant/components/select/translations/mk.json +48 -0
- homeassistant/components/sensibo/translations/bg.json +72 -7
- homeassistant/components/sensibo/translations/mk.json +21 -0
- homeassistant/components/sensibo/translations/pl.json +2 -2
- homeassistant/components/sensibo/translations/sr-Latn.json +27 -27
- homeassistant/components/sensibo/translations/vi.json +26 -0
- homeassistant/components/sensor/translations/mk.json +6 -0
- homeassistant/components/sensor/translations/pl.json +2 -2
- homeassistant/components/senz/translations/sv.json +3 -0
- homeassistant/components/sfr_box/__init__.py +4 -0
- homeassistant/components/sfr_box/translations/pt.json +4 -0
- homeassistant/components/sftp_storage/translations/sv.json +1 -0
- homeassistant/components/shelly/translations/bg.json +2 -1
- homeassistant/components/shelly/translations/ca.json +4 -0
- homeassistant/components/shelly/translations/es.json +10 -3
- homeassistant/components/shelly/translations/mk.json +11 -0
- homeassistant/components/shelly/translations/pl.json +1 -1
- homeassistant/components/shelly/translations/pt.json +2 -1
- homeassistant/components/shelly/translations/sv.json +10 -3
- homeassistant/components/shopping_list/translations/mk.json +8 -0
- homeassistant/components/sia/translations/sv.json +6 -3
- homeassistant/components/simplisafe/translations/mk.json +11 -0
- homeassistant/components/siren/translations/mk.json +19 -0
- homeassistant/components/siren/translations/sr-Latn.json +1 -1
- homeassistant/components/skybell/translations/mk.json +9 -0
- homeassistant/components/slack/translations/sv.json +2 -0
- homeassistant/components/sleep_as_android/translations/sv.json +24 -0
- homeassistant/components/sleepiq/translations/bg.json +14 -0
- homeassistant/components/sleepiq/translations/sr-Latn.json +2 -2
- homeassistant/components/slide_local/translations/es.json +1 -1
- homeassistant/components/smappee/translations/sv.json +3 -0
- homeassistant/components/smarla/translations/sv.json +5 -0
- homeassistant/components/smartthings/manifest.json +1 -1
- homeassistant/components/smartthings/translations/bg.json +25 -2
- homeassistant/components/smartthings/translations/mk.json +15 -0
- homeassistant/components/smartthings/translations/sr-Latn.json +9 -9
- homeassistant/components/smartthings/translations/sv.json +6 -0
- homeassistant/components/smarttub/manifest.json +1 -1
- homeassistant/components/smarttub/translations/mk.json +9 -0
- homeassistant/components/sms/translations/sr-Latn.json +3 -0
- homeassistant/components/snapcast/translations/mk.json +10 -0
- homeassistant/components/snapcast/translations/sv.json +10 -0
- homeassistant/components/snips/translations/mk.json +18 -0
- homeassistant/components/snooz/translations/sv.json +1 -1
- homeassistant/components/solaredge/__init__.py +3 -0
- homeassistant/components/solaredge/config_flow.py +5 -2
- homeassistant/components/solaredge/translations/ca.json +22 -1
- homeassistant/components/solaredge/translations/ru.json +4 -2
- homeassistant/components/somfy_mylink/translations/es.json +3 -3
- homeassistant/components/somfy_mylink/translations/ru.json +2 -1
- homeassistant/components/songpal/translations/mk.json +11 -0
- homeassistant/components/sonos/translations/bg.json +7 -0
- homeassistant/components/sonos/translations/sr-Latn.json +1 -1
- homeassistant/components/soundtouch/__init__.py +10 -1
- homeassistant/components/spotify/translations/sv.json +3 -0
- homeassistant/components/sql/translations/bg.json +1 -2
- homeassistant/components/sql/translations/ca.json +2 -4
- homeassistant/components/sql/translations/cs.json +2 -2
- homeassistant/components/sql/translations/de.json +2 -2
- homeassistant/components/sql/translations/el.json +2 -4
- homeassistant/components/sql/translations/en-GB.json +2 -2
- homeassistant/components/sql/translations/en.json +2 -2
- homeassistant/components/sql/translations/es.json +29 -2
- homeassistant/components/sql/translations/et.json +2 -2
- homeassistant/components/sql/translations/fi.json +2 -4
- homeassistant/components/sql/translations/fr.json +2 -4
- homeassistant/components/sql/translations/ga.json +2 -4
- homeassistant/components/sql/translations/he.json +2 -4
- homeassistant/components/sql/translations/hu.json +2 -4
- homeassistant/components/sql/translations/id.json +2 -4
- homeassistant/components/sql/translations/ja.json +2 -4
- homeassistant/components/sql/translations/lt.json +2 -2
- homeassistant/components/sql/translations/mk.json +11 -0
- homeassistant/components/sql/translations/pl.json +2 -4
- homeassistant/components/sql/translations/pt-BR.json +2 -4
- homeassistant/components/sql/translations/pt.json +2 -2
- homeassistant/components/sql/translations/ru.json +2 -4
- homeassistant/components/sql/translations/sk.json +2 -2
- homeassistant/components/sql/translations/sl.json +2 -4
- homeassistant/components/sql/translations/sr-Latn.json +12 -0
- homeassistant/components/sql/translations/sv.json +16 -5
- homeassistant/components/sql/translations/tr.json +2 -4
- homeassistant/components/sql/translations/zh-Hans.json +2 -2
- homeassistant/components/sql/translations/zh-Hant.json +2 -2
- homeassistant/components/squeezebox/translations/es.json +63 -0
- homeassistant/components/squeezebox/translations/sr-Latn.json +8 -0
- homeassistant/components/squeezebox/translations/uk.json +5 -0
- homeassistant/components/starline/translations/mk.json +9 -0
- homeassistant/components/statistics/translations/sl.json +7 -0
- homeassistant/components/subaru/translations/sv.json +2 -0
- homeassistant/components/{sunricher_dali_center → sunricher_dali}/__init__.py +2 -2
- homeassistant/components/{sunricher_dali_center → sunricher_dali}/config_flow.py +2 -2
- homeassistant/components/sunricher_dali/const.py +5 -0
- homeassistant/components/{sunricher_dali_center → sunricher_dali}/light.py +2 -2
- homeassistant/components/{sunricher_dali_center → sunricher_dali}/manifest.json +3 -3
- homeassistant/components/{sunricher_dali_center → sunricher_dali}/strings.json +4 -6
- homeassistant/components/sunricher_dali/translations/bg.json +18 -0
- homeassistant/components/sunricher_dali/translations/ca.json +11 -0
- homeassistant/components/{sunricher_dali_center → sunricher_dali}/translations/cs.json +4 -6
- homeassistant/components/{sunricher_dali_center → sunricher_dali}/translations/de.json +5 -7
- homeassistant/components/{sunricher_dali_center → sunricher_dali}/translations/en-GB.json +4 -6
- homeassistant/components/{sunricher_dali_center → sunricher_dali}/translations/en.json +4 -6
- homeassistant/components/{sunricher_dali_center → sunricher_dali}/translations/es.json +4 -6
- homeassistant/components/{sunricher_dali_center → sunricher_dali}/translations/et.json +4 -6
- homeassistant/components/{sunricher_dali_center → sunricher_dali}/translations/ga.json +4 -6
- homeassistant/components/sunricher_dali/translations/it.json +27 -0
- homeassistant/components/{sunricher_dali_center → sunricher_dali}/translations/lt.json +5 -7
- homeassistant/components/{sunricher_dali_center → sunricher_dali}/translations/pt.json +4 -6
- homeassistant/components/{sunricher_dali_center → sunricher_dali}/translations/sk.json +4 -6
- homeassistant/components/sunricher_dali/translations/sr-Latn.json +25 -0
- homeassistant/components/sunricher_dali/translations/sv.json +27 -0
- homeassistant/components/{sunricher_dali_center → sunricher_dali}/translations/zh-Hans.json +4 -6
- homeassistant/components/{sunricher_dali_center → sunricher_dali}/translations/zh-Hant.json +4 -6
- homeassistant/components/{sunricher_dali_center → sunricher_dali}/types.py +2 -2
- homeassistant/components/swiss_public_transport/translations/mk.json +1 -0
- homeassistant/components/switch/translations/bg.json +10 -0
- homeassistant/components/switch/translations/mk.json +10 -0
- homeassistant/components/switch_as_x/translations/cs.json +1 -1
- homeassistant/components/switch_as_x/translations/es.json +4 -4
- homeassistant/components/switchbot_cloud/translations/mk.json +15 -0
- homeassistant/components/switchbot_cloud/translations/sv.json +2 -1
- homeassistant/components/synology_dsm/translations/mk.json +13 -0
- homeassistant/components/system_bridge/translations/es.json +1 -0
- homeassistant/components/system_bridge/translations/mk.json +12 -0
- homeassistant/components/system_bridge/translations/ru.json +1 -0
- homeassistant/components/system_log/translations/mk.json +14 -0
- homeassistant/components/systemmonitor/translations/sv.json +1 -1
- homeassistant/components/tado/translations/sv.json +2 -2
- homeassistant/components/tankerkoenig/translations/mk.json +9 -0
- homeassistant/components/tautulli/translations/sv.json +2 -1
- homeassistant/components/technove/translations/mk.json +1 -0
- homeassistant/components/telegram/translations/pt.json +6 -0
- homeassistant/components/telegram/translations/ru.json +6 -0
- homeassistant/components/telegram_bot/translations/bg.json +11 -0
- homeassistant/components/telegram_bot/translations/es.json +42 -7
- homeassistant/components/telegram_bot/translations/mk.json +95 -0
- homeassistant/components/telegram_bot/translations/ru.json +69 -0
- homeassistant/components/telegram_bot/translations/sv.json +19 -0
- homeassistant/components/telegram_bot/translations/vi.json +7 -0
- homeassistant/components/template/translations/es.json +11 -3
- homeassistant/components/template/translations/it.json +5 -0
- homeassistant/components/template/translations/mk.json +9 -0
- homeassistant/components/template/translations/sr-Latn.json +8 -0
- homeassistant/components/template/translations/sv.json +140 -40
- homeassistant/components/template/translations/vi.json +301 -10
- homeassistant/components/tesla_fleet/manifest.json +1 -1
- homeassistant/components/tesla_fleet/translations/bg.json +40 -0
- homeassistant/components/tesla_fleet/translations/mk.json +10 -0
- homeassistant/components/tesla_fleet/translations/sr-Latn.json +13 -8
- homeassistant/components/tesla_fleet/translations/sv.json +3 -0
- homeassistant/components/tesla_fleet/translations/vi.json +5 -0
- homeassistant/components/tesla_wall_connector/translations/mk.json +3 -0
- homeassistant/components/teslemetry/manifest.json +1 -1
- homeassistant/components/teslemetry/translations/bg.json +68 -3
- homeassistant/components/teslemetry/translations/mk.json +32 -1
- homeassistant/components/teslemetry/translations/sr-Latn.json +16 -16
- homeassistant/components/teslemetry/translations/sv.json +133 -2
- homeassistant/components/teslemetry/translations/vi.json +22 -0
- homeassistant/components/teslemetry/update.py +1 -1
- homeassistant/components/tessie/manifest.json +1 -1
- homeassistant/components/tessie/translations/bg.json +45 -0
- homeassistant/components/tessie/translations/es.json +3 -0
- homeassistant/components/tessie/translations/mk.json +10 -0
- homeassistant/components/tessie/translations/sr-Latn.json +9 -9
- homeassistant/components/tessie/translations/vi.json +5 -0
- homeassistant/components/text/translations/mk.json +23 -0
- homeassistant/components/thethingsnetwork/translations/sv.json +1 -0
- homeassistant/components/timer/translations/mk.json +27 -0
- homeassistant/components/timer/translations/sk.json +1 -1
- homeassistant/components/timer/translations/vi.json +29 -1
- homeassistant/components/todo/translations/mk.json +61 -0
- homeassistant/components/todo/translations/vi.json +102 -1
- homeassistant/components/todoist/translations/mk.json +11 -0
- homeassistant/components/todoist/translations/vi.json +76 -1
- homeassistant/components/togrill/translations/pl.json +5 -0
- homeassistant/components/togrill/translations/sr-Latn.json +3 -0
- homeassistant/components/tomorrowio/translations/sv.json +2 -1
- homeassistant/components/toon/translations/sv.json +3 -0
- homeassistant/components/tplink/climate.py +8 -9
- homeassistant/components/tplink/translations/mk.json +6 -0
- homeassistant/components/tplink/translations/sr-Latn.json +3 -0
- homeassistant/components/traccar_server/translations/ca.json +6 -0
- homeassistant/components/traccar_server/translations/mk.json +7 -0
- homeassistant/components/traccar_server/translations/pt.json +10 -0
- homeassistant/components/trafikverket_camera/translations/mk.json +21 -0
- homeassistant/components/transmission/translations/bg.json +10 -0
- homeassistant/components/transmission/translations/mk.json +9 -0
- homeassistant/components/transmission/translations/pt.json +25 -0
- homeassistant/components/transmission/translations/ru.json +1 -0
- homeassistant/components/transmission/translations/sv.json +24 -0
- homeassistant/components/tts/translations/mk.json +11 -0
- homeassistant/components/tuya/manifest.json +1 -1
- homeassistant/components/tuya/translations/bg.json +10 -2
- homeassistant/components/tuya/translations/mk.json +27 -1
- homeassistant/components/tuya/translations/pl.json +3 -0
- homeassistant/components/tuya/translations/pt.json +12 -0
- homeassistant/components/tuya/translations/sr-Latn.json +5 -5
- homeassistant/components/tuya/translations/sv.json +3 -0
- homeassistant/components/twinkly/translations/bg.json +9 -0
- homeassistant/components/twinkly/translations/sr-Latn.json +1 -1
- homeassistant/components/twitch/translations/mk.json +13 -0
- homeassistant/components/ukraine_alarm/__init__.py +63 -0
- homeassistant/components/ukraine_alarm/config_flow.py +2 -2
- homeassistant/components/ukraine_alarm/strings.json +9 -3
- homeassistant/components/ukraine_alarm/translations/bg.json +9 -6
- homeassistant/components/ukraine_alarm/translations/ca.json +3 -6
- homeassistant/components/ukraine_alarm/translations/cs.json +9 -3
- homeassistant/components/ukraine_alarm/translations/de.json +9 -3
- homeassistant/components/ukraine_alarm/translations/el.json +3 -6
- homeassistant/components/ukraine_alarm/translations/en-GB.json +9 -3
- homeassistant/components/ukraine_alarm/translations/en.json +9 -3
- homeassistant/components/ukraine_alarm/translations/es.json +9 -3
- homeassistant/components/ukraine_alarm/translations/et.json +6 -0
- homeassistant/components/ukraine_alarm/translations/fi.json +3 -6
- homeassistant/components/ukraine_alarm/translations/fr.json +3 -6
- homeassistant/components/ukraine_alarm/translations/ga.json +3 -6
- homeassistant/components/ukraine_alarm/translations/hu.json +3 -6
- homeassistant/components/ukraine_alarm/translations/id.json +3 -6
- homeassistant/components/ukraine_alarm/translations/it.json +1 -8
- homeassistant/components/ukraine_alarm/translations/ja.json +3 -6
- homeassistant/components/ukraine_alarm/translations/ko.json +3 -6
- homeassistant/components/ukraine_alarm/translations/lt.json +9 -3
- homeassistant/components/ukraine_alarm/translations/nb.json +3 -6
- homeassistant/components/ukraine_alarm/translations/nl.json +3 -6
- homeassistant/components/ukraine_alarm/translations/pl.json +3 -6
- homeassistant/components/ukraine_alarm/translations/pt-BR.json +3 -6
- homeassistant/components/ukraine_alarm/translations/pt.json +9 -3
- homeassistant/components/ukraine_alarm/translations/ro.json +3 -6
- homeassistant/components/ukraine_alarm/translations/ru.json +3 -6
- homeassistant/components/ukraine_alarm/translations/sk.json +9 -3
- homeassistant/components/ukraine_alarm/translations/sv.json +3 -6
- homeassistant/components/ukraine_alarm/translations/tr.json +3 -6
- homeassistant/components/ukraine_alarm/translations/uk.json +3 -6
- homeassistant/components/ukraine_alarm/translations/zh-Hans.json +9 -3
- homeassistant/components/ukraine_alarm/translations/zh-Hant.json +9 -3
- homeassistant/components/unifiprotect/translations/vi.json +7 -0
- homeassistant/components/update/translations/mk.json +3 -0
- homeassistant/components/update/translations/sr-Latn.json +1 -0
- homeassistant/components/usb/utils.py +22 -23
- homeassistant/components/utility_meter/manifest.json +1 -1
- homeassistant/components/utility_meter/translations/mk.json +20 -0
- homeassistant/components/vacuum/translations/sr-Latn.json +1 -1
- homeassistant/components/vallox/translations/mk.json +13 -0
- homeassistant/components/vegehub/translations/sr-Latn.json +7 -0
- homeassistant/components/velux/translations/cs.json +1 -1
- homeassistant/components/velux/translations/de.json +1 -1
- homeassistant/components/velux/translations/el.json +0 -1
- homeassistant/components/velux/translations/en-GB.json +1 -1
- homeassistant/components/velux/translations/en.json +1 -1
- homeassistant/components/velux/translations/es.json +1 -1
- homeassistant/components/velux/translations/et.json +1 -1
- homeassistant/components/velux/translations/fi.json +0 -1
- homeassistant/components/velux/translations/fr.json +0 -1
- homeassistant/components/velux/translations/ga.json +0 -1
- homeassistant/components/velux/translations/gl.json +0 -1
- homeassistant/components/velux/translations/hu.json +0 -1
- homeassistant/components/velux/translations/it.json +0 -1
- homeassistant/components/velux/translations/ja.json +0 -1
- homeassistant/components/velux/translations/ko.json +0 -1
- homeassistant/components/velux/translations/lt.json +1 -1
- homeassistant/components/velux/translations/nl.json +0 -1
- homeassistant/components/velux/translations/pt.json +1 -1
- homeassistant/components/velux/translations/ru.json +0 -1
- homeassistant/components/velux/translations/sk.json +1 -1
- homeassistant/components/velux/translations/sv.json +7 -1
- homeassistant/components/velux/translations/tr.json +0 -1
- homeassistant/components/velux/translations/uk.json +0 -1
- homeassistant/components/velux/translations/vi.json +0 -1
- homeassistant/components/velux/translations/zh-Hans.json +1 -1
- homeassistant/components/velux/translations/zh-Hant.json +1 -1
- homeassistant/components/vesync/humidifier.py +3 -1
- homeassistant/components/vesync/manifest.json +1 -1
- homeassistant/components/vesync/strings.json +11 -0
- homeassistant/components/vesync/translations/bg.json +18 -0
- homeassistant/components/vesync/translations/cs.json +11 -0
- homeassistant/components/vesync/translations/de.json +11 -0
- homeassistant/components/vesync/translations/en-GB.json +11 -0
- homeassistant/components/vesync/translations/en.json +11 -0
- homeassistant/components/vesync/translations/es.json +11 -0
- homeassistant/components/vesync/translations/et.json +11 -0
- homeassistant/components/vesync/translations/ga.json +11 -0
- homeassistant/components/vesync/translations/he.json +11 -0
- homeassistant/components/vesync/translations/it.json +11 -0
- homeassistant/components/vesync/translations/lt.json +11 -0
- homeassistant/components/vesync/translations/mk.json +11 -0
- homeassistant/components/vesync/translations/pt.json +11 -0
- homeassistant/components/vesync/translations/sk.json +11 -0
- homeassistant/components/vesync/translations/sr-Latn.json +2 -2
- homeassistant/components/vesync/translations/sv.json +11 -0
- homeassistant/components/vesync/translations/zh-Hans.json +11 -0
- homeassistant/components/vesync/translations/zh-Hant.json +11 -0
- homeassistant/components/voip/translations/sv.json +1 -1
- homeassistant/components/volvo/translations/bg.json +5 -0
- homeassistant/components/volvo/translations/cs.json +5 -0
- homeassistant/components/volvo/translations/en-GB.json +5 -0
- homeassistant/components/volvo/translations/es.json +11 -0
- homeassistant/components/volvo/translations/ga.json +5 -0
- homeassistant/components/volvo/translations/it.json +5 -0
- homeassistant/components/volvo/translations/lt.json +5 -0
- homeassistant/components/volvo/translations/mk.json +9 -0
- homeassistant/components/volvo/translations/pt.json +5 -0
- homeassistant/components/volvo/translations/sk.json +5 -0
- homeassistant/components/volvo/translations/sr-Latn.json +8 -0
- homeassistant/components/volvo/translations/sv.json +37 -1
- homeassistant/components/volvo/translations/vi.json +1 -0
- homeassistant/components/wallbox/translations/bg.json +2 -1
- homeassistant/components/wallbox/translations/sr-Latn.json +1 -1
- homeassistant/components/water_heater/translations/bg.json +5 -0
- homeassistant/components/water_heater/translations/sr-Latn.json +3 -3
- homeassistant/components/watergate/translations/mk.json +15 -0
- homeassistant/components/weather/translations/mk.json +11 -1
- homeassistant/components/weather/translations/sv.json +1 -1
- homeassistant/components/weatherflow/translations/sv.json +1 -1
- homeassistant/components/webostv/translations/mk.json +12 -0
- homeassistant/components/webostv/translations/sv.json +3 -3
- homeassistant/components/weheat/translations/pl.json +1 -0
- homeassistant/components/weheat/translations/sv.json +3 -0
- homeassistant/components/wemo/translations/mk.json +11 -0
- homeassistant/components/wemo/translations/pl.json +10 -0
- homeassistant/components/whirlpool/translations/bg.json +22 -0
- homeassistant/components/whirlpool/translations/ca.json +30 -0
- homeassistant/components/whirlpool/translations/es.json +81 -0
- homeassistant/components/whirlpool/translations/mk.json +3 -0
- homeassistant/components/whirlpool/translations/pl.json +3 -0
- homeassistant/components/whirlpool/translations/sv.json +66 -0
- homeassistant/components/wilight/translations/mk.json +25 -0
- homeassistant/components/withings/translations/sv.json +4 -1
- homeassistant/components/wolflink/translations/bg.json +1 -0
- homeassistant/components/wolflink/translations/sr-Latn.json +2 -2
- homeassistant/components/workday/manifest.json +1 -1
- homeassistant/components/workday/translations/vi.json +5 -0
- homeassistant/components/wyoming/translations/bg.json +2 -1
- homeassistant/components/wyoming/translations/sr-Latn.json +1 -1
- homeassistant/components/xbox/coordinator.py +18 -2
- homeassistant/components/xbox/translations/bg.json +36 -0
- homeassistant/components/xbox/translations/es.json +22 -1
- homeassistant/components/xbox/translations/mk.json +7 -0
- homeassistant/components/xbox/translations/pt.json +11 -0
- homeassistant/components/xbox/translations/sr-Latn.json +1 -0
- homeassistant/components/xbox/translations/sv.json +47 -2
- homeassistant/components/xiaomi_aqara/translations/sr-Latn.json +3 -0
- homeassistant/components/xiaomi_ble/translations/mk.json +19 -0
- homeassistant/components/xiaomi_miio/translations/bg.json +5 -0
- homeassistant/components/xiaomi_miio/translations/mk.json +114 -0
- homeassistant/components/xiaomi_miio/translations/pt.json +4 -2
- homeassistant/components/xiaomi_miio/translations/ru.json +4 -2
- homeassistant/components/xiaomi_miio/translations/sr-Latn.json +1 -1
- homeassistant/components/xiaomi_miio/translations/sv.json +2 -1
- homeassistant/components/yale/translations/sv.json +3 -0
- homeassistant/components/yale_smart_alarm/translations/bg.json +4 -1
- homeassistant/components/yale_smart_alarm/translations/sr-Latn.json +1 -1
- homeassistant/components/yamaha_musiccast/translations/bg.json +5 -0
- homeassistant/components/yamaha_musiccast/translations/sr-Latn.json +1 -1
- homeassistant/components/yardian/translations/bg.json +7 -0
- homeassistant/components/yardian/translations/es.json +16 -0
- homeassistant/components/yardian/translations/mk.json +11 -0
- homeassistant/components/yeelight/translations/bg.json +5 -0
- homeassistant/components/yeelight/translations/mk.json +1 -0
- homeassistant/components/yeelight/translations/sr-Latn.json +1 -1
- homeassistant/components/yolink/translations/bg.json +4 -2
- homeassistant/components/yolink/translations/mk.json +5 -0
- homeassistant/components/yolink/translations/sr-Latn.json +2 -2
- homeassistant/components/yolink/translations/sv.json +16 -0
- homeassistant/components/zha/__init__.py +16 -1
- homeassistant/components/zha/config_flow.py +237 -63
- homeassistant/components/zha/manifest.json +1 -1
- homeassistant/components/zha/radio_manager.py +3 -2
- homeassistant/components/zha/strings.json +68 -15
- homeassistant/components/zha/translations/bg.json +52 -3
- homeassistant/components/zha/translations/ca.json +0 -3
- homeassistant/components/zha/translations/cs.json +68 -15
- homeassistant/components/zha/translations/da.json +0 -3
- homeassistant/components/zha/translations/de.json +68 -15
- homeassistant/components/zha/translations/el.json +0 -3
- homeassistant/components/zha/translations/en-GB.json +68 -15
- homeassistant/components/zha/translations/en.json +68 -15
- homeassistant/components/zha/translations/es.json +119 -18
- homeassistant/components/zha/translations/et.json +68 -15
- homeassistant/components/zha/translations/fi.json +0 -3
- homeassistant/components/zha/translations/fr.json +0 -18
- homeassistant/components/zha/translations/ga.json +67 -2
- homeassistant/components/zha/translations/gsw.json +0 -3
- homeassistant/components/zha/translations/hu.json +0 -3
- homeassistant/components/zha/translations/id.json +0 -3
- homeassistant/components/zha/translations/it.json +67 -2
- homeassistant/components/zha/translations/ja.json +0 -3
- homeassistant/components/zha/translations/ko.json +0 -9
- homeassistant/components/zha/translations/lt.json +68 -15
- homeassistant/components/zha/translations/mk.json +39 -0
- homeassistant/components/zha/translations/nb.json +0 -3
- homeassistant/components/zha/translations/nl.json +0 -3
- homeassistant/components/zha/translations/pl.json +25 -5
- homeassistant/components/zha/translations/pt-BR.json +0 -3
- homeassistant/components/zha/translations/pt.json +115 -16
- homeassistant/components/zha/translations/ro.json +0 -3
- homeassistant/components/zha/translations/ru.json +38 -16
- homeassistant/components/zha/translations/sk.json +68 -15
- homeassistant/components/zha/translations/sl.json +0 -9
- homeassistant/components/zha/translations/sr-Latn.json +58 -10
- homeassistant/components/zha/translations/sv.json +55 -3
- homeassistant/components/zha/translations/tr.json +0 -3
- homeassistant/components/zha/translations/uk.json +3 -3
- homeassistant/components/zha/translations/vi.json +10 -0
- homeassistant/components/zha/translations/zh-Hans.json +68 -15
- homeassistant/components/zha/translations/zh-Hant.json +68 -15
- homeassistant/components/zwave_js/translations/es.json +3 -0
- homeassistant/components/zwave_js/translations/mk.json +20 -0
- homeassistant/components/zwave_js/translations/pl.json +93 -0
- homeassistant/components/zwave_js/translations/sr-Latn.json +6 -0
- homeassistant/components/zwave_js/translations/sv.json +18 -2
- homeassistant/config_entries.py +9 -7
- homeassistant/const.py +1 -1
- homeassistant/data_entry_flow.py +49 -35
- homeassistant/generated/config_flows.py +1 -1
- homeassistant/generated/integrations.json +2 -7
- homeassistant/package_constraints.txt +3 -3
- homeassistant/util/language.py +17 -7
- {homeassistant-2025.11.0b2.dist-info → homeassistant-2025.11.2.dist-info}/METADATA +2 -2
- {homeassistant-2025.11.0b2.dist-info → homeassistant-2025.11.2.dist-info}/RECORD +1168 -1048
- homeassistant/components/enmax/__init__.py +0 -1
- homeassistant/components/enmax/manifest.json +0 -6
- homeassistant/components/sunricher_dali_center/const.py +0 -5
- homeassistant/components/sunricher_dali_center/translations/it.json +0 -11
- homeassistant/components/sunricher_dali_center/translations/sr-Latn.json +0 -11
- /homeassistant/components/{sunricher_dali_center → sunricher_dali}/quality_scale.yaml +0 -0
- /homeassistant/components/{sunricher_dali_center → sunricher_dali}/translations/el.json +0 -0
- /homeassistant/components/{sunricher_dali_center → sunricher_dali}/translations/he.json +0 -0
- /homeassistant/components/{sunricher_dali_center → sunricher_dali}/translations/nl.json +0 -0
- {homeassistant-2025.11.0b2.dist-info → homeassistant-2025.11.2.dist-info}/WHEEL +0 -0
- {homeassistant-2025.11.0b2.dist-info → homeassistant-2025.11.2.dist-info}/entry_points.txt +0 -0
- {homeassistant-2025.11.0b2.dist-info → homeassistant-2025.11.2.dist-info}/licenses/LICENSE.md +0 -0
- {homeassistant-2025.11.0b2.dist-info → homeassistant-2025.11.2.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
- {homeassistant-2025.11.0b2.dist-info → homeassistant-2025.11.2.dist-info}/top_level.txt +0 -0
|
@@ -3,18 +3,19 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
from abc import abstractmethod
|
|
6
|
+
import asyncio
|
|
6
7
|
import collections
|
|
7
8
|
from contextlib import suppress
|
|
8
9
|
from enum import StrEnum
|
|
9
10
|
import json
|
|
11
|
+
import logging
|
|
12
|
+
import os
|
|
10
13
|
from typing import Any
|
|
11
14
|
|
|
12
|
-
import serial.tools.list_ports
|
|
13
|
-
from serial.tools.list_ports_common import ListPortInfo
|
|
14
15
|
import voluptuous as vol
|
|
15
16
|
from zha.application.const import RadioType
|
|
16
17
|
import zigpy.backups
|
|
17
|
-
from zigpy.config import CONF_DEVICE, CONF_DEVICE_PATH
|
|
18
|
+
from zigpy.config import CONF_DEVICE, CONF_DEVICE_PATH, CONF_NWK_TX_POWER
|
|
18
19
|
from zigpy.exceptions import CannotWriteNetworkSettings, DestructiveWriteNetworkSettings
|
|
19
20
|
|
|
20
21
|
from homeassistant.components import onboarding, usb
|
|
@@ -25,6 +26,7 @@ from homeassistant.components.homeassistant_hardware.firmware_config_flow import
|
|
|
25
26
|
ZigbeeFlowStrategy,
|
|
26
27
|
)
|
|
27
28
|
from homeassistant.components.homeassistant_yellow import hardware as yellow_hardware
|
|
29
|
+
from homeassistant.components.usb import USBDevice, scan_serial_ports
|
|
28
30
|
from homeassistant.config_entries import (
|
|
29
31
|
SOURCE_IGNORE,
|
|
30
32
|
SOURCE_ZEROCONF,
|
|
@@ -56,6 +58,8 @@ from .radio_manager import (
|
|
|
56
58
|
ZhaRadioManager,
|
|
57
59
|
)
|
|
58
60
|
|
|
61
|
+
_LOGGER = logging.getLogger(__name__)
|
|
62
|
+
|
|
59
63
|
CONF_MANUAL_PATH = "Enter Manually"
|
|
60
64
|
DECONZ_DOMAIN = "deconz"
|
|
61
65
|
|
|
@@ -124,10 +128,10 @@ def _format_backup_choice(
|
|
|
124
128
|
return f"{dt_util.as_local(backup.backup_time).strftime('%c')} ({identifier})"
|
|
125
129
|
|
|
126
130
|
|
|
127
|
-
async def list_serial_ports(hass: HomeAssistant) -> list[
|
|
131
|
+
async def list_serial_ports(hass: HomeAssistant) -> list[USBDevice]:
|
|
128
132
|
"""List all serial ports, including the Yellow radio and the multi-PAN addon."""
|
|
129
|
-
ports: list[
|
|
130
|
-
ports.extend(await hass.async_add_executor_job(
|
|
133
|
+
ports: list[USBDevice] = []
|
|
134
|
+
ports.extend(await hass.async_add_executor_job(scan_serial_ports))
|
|
131
135
|
|
|
132
136
|
# Add useful info to the Yellow's serial port selection screen
|
|
133
137
|
try:
|
|
@@ -137,9 +141,14 @@ async def list_serial_ports(hass: HomeAssistant) -> list[ListPortInfo]:
|
|
|
137
141
|
else:
|
|
138
142
|
# PySerial does not properly handle the Yellow's serial port with the CM5
|
|
139
143
|
# so we manually include it
|
|
140
|
-
port =
|
|
141
|
-
|
|
142
|
-
|
|
144
|
+
port = USBDevice(
|
|
145
|
+
device="/dev/ttyAMA1",
|
|
146
|
+
vid="ffff", # This is technically not a USB device
|
|
147
|
+
pid="ffff",
|
|
148
|
+
serial_number=None,
|
|
149
|
+
manufacturer="Nabu Casa",
|
|
150
|
+
description="Yellow Zigbee module",
|
|
151
|
+
)
|
|
143
152
|
|
|
144
153
|
ports = [p for p in ports if not p.device.startswith("/dev/ttyAMA")]
|
|
145
154
|
ports.insert(0, port)
|
|
@@ -156,13 +165,15 @@ async def list_serial_ports(hass: HomeAssistant) -> list[ListPortInfo]:
|
|
|
156
165
|
addon_info = None
|
|
157
166
|
|
|
158
167
|
if addon_info is not None and addon_info.state != AddonState.NOT_INSTALLED:
|
|
159
|
-
addon_port =
|
|
168
|
+
addon_port = USBDevice(
|
|
160
169
|
device=silabs_multiprotocol_addon.get_zigbee_socket(),
|
|
161
|
-
|
|
170
|
+
vid="ffff", # This is technically not a USB device
|
|
171
|
+
pid="ffff",
|
|
172
|
+
serial_number=None,
|
|
173
|
+
manufacturer="Nabu Casa",
|
|
174
|
+
description="Silicon Labs Multiprotocol add-on",
|
|
162
175
|
)
|
|
163
176
|
|
|
164
|
-
addon_port.description = "Multiprotocol add-on"
|
|
165
|
-
addon_port.manufacturer = "Nabu Casa"
|
|
166
177
|
ports.append(addon_port)
|
|
167
178
|
|
|
168
179
|
return ports
|
|
@@ -172,6 +183,7 @@ class BaseZhaFlow(ConfigEntryBaseFlow):
|
|
|
172
183
|
"""Mixin for common ZHA flow steps and forms."""
|
|
173
184
|
|
|
174
185
|
_flow_strategy: ZigbeeFlowStrategy | None = None
|
|
186
|
+
_overwrite_ieee_during_restore: bool = False
|
|
175
187
|
_hass: HomeAssistant
|
|
176
188
|
_title: str
|
|
177
189
|
|
|
@@ -181,6 +193,14 @@ class BaseZhaFlow(ConfigEntryBaseFlow):
|
|
|
181
193
|
|
|
182
194
|
self._hass = None # type: ignore[assignment]
|
|
183
195
|
self._radio_mgr = ZhaRadioManager()
|
|
196
|
+
self._restore_backup_task: asyncio.Task[None] | None = None
|
|
197
|
+
self._reset_old_radio_task: asyncio.Task[None] | None = None
|
|
198
|
+
self._form_network_task: asyncio.Task[None] | None = None
|
|
199
|
+
self._extra_network_config: dict[str, Any] = {}
|
|
200
|
+
|
|
201
|
+
# Progress flow steps cannot abort so we need to store the abort reason and then
|
|
202
|
+
# re-raise it in a dedicated step
|
|
203
|
+
self._progress_error: AbortFlow | None = None
|
|
184
204
|
|
|
185
205
|
@property
|
|
186
206
|
def hass(self) -> HomeAssistant:
|
|
@@ -213,13 +233,27 @@ class BaseZhaFlow(ConfigEntryBaseFlow):
|
|
|
213
233
|
async def _async_create_radio_entry(self) -> ConfigFlowResult:
|
|
214
234
|
"""Create a config entry with the current flow state."""
|
|
215
235
|
|
|
236
|
+
async def async_step_progress_failed(
|
|
237
|
+
self, user_input: dict[str, Any] | None = None
|
|
238
|
+
) -> ConfigFlowResult:
|
|
239
|
+
"""Abort when progress step failed."""
|
|
240
|
+
assert self._progress_error is not None
|
|
241
|
+
raise self._progress_error
|
|
242
|
+
|
|
216
243
|
async def async_step_choose_serial_port(
|
|
217
244
|
self, user_input: dict[str, Any] | None = None
|
|
218
245
|
) -> ConfigFlowResult:
|
|
219
246
|
"""Choose a serial port."""
|
|
220
247
|
ports = await list_serial_ports(self.hass)
|
|
248
|
+
|
|
249
|
+
# The full `/dev/serial/by-id/` path is too verbose to show
|
|
250
|
+
resolved_paths = {
|
|
251
|
+
p.device: await self.hass.async_add_executor_job(os.path.realpath, p.device)
|
|
252
|
+
for p in ports
|
|
253
|
+
}
|
|
254
|
+
|
|
221
255
|
list_of_ports = [
|
|
222
|
-
f"{p}{', s/n: ' + p.serial_number if p.serial_number else ''}"
|
|
256
|
+
f"{resolved_paths[p.device]} - {p.description}{', s/n: ' + p.serial_number if p.serial_number else ''}"
|
|
223
257
|
+ (f" - {p.manufacturer}" if p.manufacturer else "")
|
|
224
258
|
for p in ports
|
|
225
259
|
]
|
|
@@ -446,6 +480,22 @@ class BaseZhaFlow(ConfigEntryBaseFlow):
|
|
|
446
480
|
self._radio_mgr.chosen_backup = self._radio_mgr.backups[0]
|
|
447
481
|
return await self.async_step_maybe_reset_old_radio()
|
|
448
482
|
|
|
483
|
+
async def _async_reset_old_radio(self, config_entry: ConfigEntry) -> None:
|
|
484
|
+
"""Do the work of resetting the old radio."""
|
|
485
|
+
|
|
486
|
+
# Unload ZHA before connecting to the old adapter
|
|
487
|
+
with suppress(OperationNotAllowed):
|
|
488
|
+
await self.hass.config_entries.async_unload(config_entry.entry_id)
|
|
489
|
+
|
|
490
|
+
# Create a radio manager to connect to the old stick to reset it
|
|
491
|
+
temp_radio_mgr = ZhaRadioManager()
|
|
492
|
+
temp_radio_mgr.hass = self.hass
|
|
493
|
+
temp_radio_mgr.device_path = config_entry.data[CONF_DEVICE][CONF_DEVICE_PATH]
|
|
494
|
+
temp_radio_mgr.device_settings = config_entry.data[CONF_DEVICE]
|
|
495
|
+
temp_radio_mgr.radio_type = RadioType[config_entry.data[CONF_RADIO_TYPE]]
|
|
496
|
+
|
|
497
|
+
await temp_radio_mgr.async_reset_adapter()
|
|
498
|
+
|
|
449
499
|
async def async_step_maybe_reset_old_radio(
|
|
450
500
|
self, user_input: dict[str, Any] | None = None
|
|
451
501
|
) -> ConfigFlowResult:
|
|
@@ -456,26 +506,93 @@ class BaseZhaFlow(ConfigEntryBaseFlow):
|
|
|
456
506
|
DOMAIN, include_ignore=False
|
|
457
507
|
)
|
|
458
508
|
|
|
459
|
-
if config_entries:
|
|
509
|
+
if not config_entries:
|
|
510
|
+
return await self.async_step_restore_backup()
|
|
511
|
+
|
|
512
|
+
if self._reset_old_radio_task is None:
|
|
513
|
+
# This will only ever be called during migration, so there must be an
|
|
514
|
+
# existing config entry
|
|
460
515
|
assert len(config_entries) == 1
|
|
461
516
|
config_entry = config_entries[0]
|
|
462
517
|
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
518
|
+
self._reset_old_radio_task = self.hass.async_create_task(
|
|
519
|
+
self._async_reset_old_radio(config_entry),
|
|
520
|
+
"Reset old radio",
|
|
521
|
+
)
|
|
466
522
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
523
|
+
if not self._reset_old_radio_task.done():
|
|
524
|
+
return self.async_show_progress(
|
|
525
|
+
step_id="maybe_reset_old_radio",
|
|
526
|
+
progress_action="maybe_reset_old_radio",
|
|
527
|
+
progress_task=self._reset_old_radio_task,
|
|
528
|
+
)
|
|
529
|
+
|
|
530
|
+
try:
|
|
531
|
+
await self._reset_old_radio_task
|
|
532
|
+
except HomeAssistantError:
|
|
533
|
+
_LOGGER.exception("Failed to reset old radio during migration")
|
|
534
|
+
# Old adapter not found or cannot connect, show prompt to plug back in
|
|
535
|
+
return self.async_show_progress_done(next_step_id="plug_in_old_radio")
|
|
536
|
+
finally:
|
|
537
|
+
self._reset_old_radio_task = None
|
|
538
|
+
|
|
539
|
+
return self.async_show_progress_done(next_step_id="restore_backup")
|
|
540
|
+
|
|
541
|
+
async def async_step_plug_in_old_radio(
|
|
542
|
+
self, user_input: dict[str, Any] | None = None
|
|
543
|
+
) -> ConfigFlowResult:
|
|
544
|
+
"""Prompt user to plug in the old radio if connection fails."""
|
|
545
|
+
config_entries = self.hass.config_entries.async_entries(
|
|
546
|
+
DOMAIN, include_ignore=False
|
|
547
|
+
)
|
|
548
|
+
|
|
549
|
+
# Unless the user removes the config entry whilst we try to reset the old radio
|
|
550
|
+
# for a few seconds and then also unplugs it, we will basically never hit this
|
|
551
|
+
if not config_entries:
|
|
552
|
+
return await self.async_step_restore_backup()
|
|
553
|
+
|
|
554
|
+
config_entry = config_entries[0]
|
|
555
|
+
old_device_path = config_entry.data[CONF_DEVICE][CONF_DEVICE_PATH]
|
|
556
|
+
|
|
557
|
+
return self.async_show_menu(
|
|
558
|
+
step_id="plug_in_old_radio",
|
|
559
|
+
menu_options=["retry_old_radio", "skip_reset_old_radio"],
|
|
560
|
+
description_placeholders={"device_path": old_device_path},
|
|
561
|
+
)
|
|
562
|
+
|
|
563
|
+
async def async_step_retry_old_radio(
|
|
564
|
+
self, user_input: dict[str, Any] | None = None
|
|
565
|
+
) -> ConfigFlowResult:
|
|
566
|
+
"""Retry connecting to the old radio."""
|
|
567
|
+
return await self.async_step_maybe_reset_old_radio()
|
|
568
|
+
|
|
569
|
+
async def async_step_skip_reset_old_radio(
|
|
570
|
+
self, user_input: dict[str, Any] | None = None
|
|
571
|
+
) -> ConfigFlowResult:
|
|
572
|
+
"""Skip resetting the old radio and continue with migration."""
|
|
573
|
+
return await self.async_step_restore_backup()
|
|
574
|
+
|
|
575
|
+
async def async_step_pre_plug_in_new_radio(
|
|
576
|
+
self, user_input: dict[str, Any] | None = None
|
|
577
|
+
) -> ConfigFlowResult:
|
|
578
|
+
"""Strip user_input before showing "plug in new radio" form."""
|
|
579
|
+
# This step is necessary to prevent `user_input` from being passed through
|
|
580
|
+
return await self.async_step_plug_in_new_radio()
|
|
581
|
+
|
|
582
|
+
async def async_step_plug_in_new_radio(
|
|
583
|
+
self, user_input: dict[str, Any] | None = None
|
|
584
|
+
) -> ConfigFlowResult:
|
|
585
|
+
"""Prompt user to plug in the new radio if connection fails."""
|
|
586
|
+
if user_input is not None:
|
|
587
|
+
# User confirmed, retry now
|
|
588
|
+
return await self.async_step_restore_backup()
|
|
475
589
|
|
|
476
|
-
|
|
590
|
+
assert self._radio_mgr.device_path is not None
|
|
477
591
|
|
|
478
|
-
return
|
|
592
|
+
return self.async_show_form(
|
|
593
|
+
step_id="plug_in_new_radio",
|
|
594
|
+
description_placeholders={"device_path": self._radio_mgr.device_path},
|
|
595
|
+
)
|
|
479
596
|
|
|
480
597
|
async def async_step_migration_strategy_advanced(
|
|
481
598
|
self, user_input: dict[str, Any] | None = None
|
|
@@ -539,14 +656,35 @@ class BaseZhaFlow(ConfigEntryBaseFlow):
|
|
|
539
656
|
# This step exists only for translations, it does nothing new
|
|
540
657
|
return await self.async_step_form_new_network(user_input)
|
|
541
658
|
|
|
659
|
+
async def _async_form_new_network(self) -> None:
|
|
660
|
+
"""Do the work of forming a new network."""
|
|
661
|
+
await self._radio_mgr.async_form_network(config=self._extra_network_config)
|
|
662
|
+
# Load the newly formed network settings to get the network info
|
|
663
|
+
await self._radio_mgr.async_load_network_settings()
|
|
664
|
+
|
|
542
665
|
async def async_step_form_new_network(
|
|
543
666
|
self, user_input: dict[str, Any] | None = None
|
|
544
667
|
) -> ConfigFlowResult:
|
|
545
668
|
"""Form a brand-new network."""
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
669
|
+
if self._form_network_task is None:
|
|
670
|
+
self._form_network_task = self.hass.async_create_task(
|
|
671
|
+
self._async_form_new_network(),
|
|
672
|
+
"Form new network",
|
|
673
|
+
)
|
|
674
|
+
|
|
675
|
+
if not self._form_network_task.done():
|
|
676
|
+
return self.async_show_progress(
|
|
677
|
+
step_id="form_new_network",
|
|
678
|
+
progress_action="form_new_network",
|
|
679
|
+
progress_task=self._form_network_task,
|
|
680
|
+
)
|
|
681
|
+
|
|
682
|
+
try:
|
|
683
|
+
await self._form_network_task
|
|
684
|
+
finally:
|
|
685
|
+
self._form_network_task = None
|
|
686
|
+
|
|
687
|
+
return self.async_show_progress_done(next_step_id="create_entry")
|
|
550
688
|
|
|
551
689
|
def _parse_uploaded_backup(
|
|
552
690
|
self, uploaded_file_id: str
|
|
@@ -624,47 +762,80 @@ class BaseZhaFlow(ConfigEntryBaseFlow):
|
|
|
624
762
|
),
|
|
625
763
|
)
|
|
626
764
|
|
|
627
|
-
async def
|
|
765
|
+
async def async_step_restore_backup(
|
|
628
766
|
self, user_input: dict[str, Any] | None = None
|
|
629
767
|
) -> ConfigFlowResult:
|
|
630
|
-
"""
|
|
631
|
-
if
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
reason="cannot_restore_backup",
|
|
639
|
-
description_placeholders={"error": str(exc)},
|
|
640
|
-
)
|
|
641
|
-
|
|
642
|
-
return await self._async_create_radio_entry()
|
|
768
|
+
"""Restore network backup to new radio."""
|
|
769
|
+
if self._restore_backup_task is None:
|
|
770
|
+
self._restore_backup_task = self.hass.async_create_task(
|
|
771
|
+
self._radio_mgr.restore_backup(
|
|
772
|
+
overwrite_ieee=self._overwrite_ieee_during_restore
|
|
773
|
+
),
|
|
774
|
+
"Restore backup",
|
|
775
|
+
)
|
|
643
776
|
|
|
644
|
-
|
|
645
|
-
return self.
|
|
777
|
+
if not self._restore_backup_task.done():
|
|
778
|
+
return self.async_show_progress(
|
|
779
|
+
step_id="restore_backup",
|
|
780
|
+
progress_action="restore_backup",
|
|
781
|
+
progress_task=self._restore_backup_task,
|
|
782
|
+
)
|
|
646
783
|
|
|
647
|
-
# On first attempt, just try to restore nondestructively
|
|
648
784
|
try:
|
|
649
|
-
await self.
|
|
785
|
+
await self._restore_backup_task
|
|
650
786
|
except DestructiveWriteNetworkSettings:
|
|
651
|
-
#
|
|
652
|
-
|
|
787
|
+
# If we cannot restore without overwriting the IEEE, ask for confirmation
|
|
788
|
+
return self.async_show_progress_done(
|
|
789
|
+
next_step_id="pre_confirm_ezsp_ieee_overwrite"
|
|
790
|
+
)
|
|
791
|
+
except HomeAssistantError:
|
|
792
|
+
_LOGGER.exception("Failed to restore network backup to new radio")
|
|
793
|
+
# User unplugged the new adapter, allow retry
|
|
794
|
+
return self.async_show_progress_done(next_step_id="pre_plug_in_new_radio")
|
|
653
795
|
except CannotWriteNetworkSettings as exc:
|
|
654
|
-
|
|
796
|
+
self._progress_error = AbortFlow(
|
|
655
797
|
reason="cannot_restore_backup",
|
|
656
798
|
description_placeholders={"error": str(exc)},
|
|
657
799
|
)
|
|
658
|
-
|
|
659
|
-
|
|
800
|
+
return self.async_show_progress_done(next_step_id="progress_failed")
|
|
801
|
+
finally:
|
|
802
|
+
self._restore_backup_task = None
|
|
660
803
|
|
|
661
|
-
#
|
|
662
|
-
return self.
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
804
|
+
# Otherwise, proceed to entry creation
|
|
805
|
+
return self.async_show_progress_done(next_step_id="create_entry")
|
|
806
|
+
|
|
807
|
+
async def async_step_pre_confirm_ezsp_ieee_overwrite(
|
|
808
|
+
self, user_input: dict[str, Any] | None = None
|
|
809
|
+
) -> ConfigFlowResult:
|
|
810
|
+
"""Strip user_input before showing confirmation form."""
|
|
811
|
+
# This step is necessary to prevent `user_input` from being passed through
|
|
812
|
+
return await self.async_step_confirm_ezsp_ieee_overwrite()
|
|
813
|
+
|
|
814
|
+
async def async_step_confirm_ezsp_ieee_overwrite(
|
|
815
|
+
self, user_input: dict[str, Any] | None = None
|
|
816
|
+
) -> ConfigFlowResult:
|
|
817
|
+
"""Show confirmation form for EZSP IEEE address overwrite."""
|
|
818
|
+
if user_input is None:
|
|
819
|
+
return self.async_show_form(
|
|
820
|
+
step_id="confirm_ezsp_ieee_overwrite",
|
|
821
|
+
data_schema=vol.Schema(
|
|
822
|
+
{vol.Required(OVERWRITE_COORDINATOR_IEEE, default=True): bool}
|
|
823
|
+
),
|
|
824
|
+
)
|
|
825
|
+
|
|
826
|
+
if not user_input[OVERWRITE_COORDINATOR_IEEE]:
|
|
827
|
+
return self.async_abort(reason="cannot_restore_backup_no_ieee_confirm")
|
|
828
|
+
|
|
829
|
+
self._overwrite_ieee_during_restore = True
|
|
830
|
+
return await self.async_step_restore_backup()
|
|
831
|
+
|
|
832
|
+
async def async_step_create_entry(
|
|
833
|
+
self, user_input: dict[str, Any] | None = None
|
|
834
|
+
) -> ConfigFlowResult:
|
|
835
|
+
"""Create the config entry after successful setup/migration."""
|
|
836
|
+
|
|
837
|
+
# This step only exists so that we can create entries from other steps
|
|
838
|
+
return await self._async_create_radio_entry()
|
|
668
839
|
|
|
669
840
|
|
|
670
841
|
class ZhaConfigFlowHandler(BaseZhaFlow, ConfigFlow, domain=DOMAIN):
|
|
@@ -897,6 +1068,9 @@ class ZhaConfigFlowHandler(BaseZhaFlow, ConfigFlow, domain=DOMAIN):
|
|
|
897
1068
|
device_path = device_settings[CONF_DEVICE_PATH]
|
|
898
1069
|
self._flow_strategy = discovery_data.get("flow_strategy")
|
|
899
1070
|
|
|
1071
|
+
if "tx_power" in discovery_data:
|
|
1072
|
+
self._extra_network_config[CONF_NWK_TX_POWER] = discovery_data["tx_power"]
|
|
1073
|
+
|
|
900
1074
|
await self._set_unique_id_and_update_ignored_flow(
|
|
901
1075
|
unique_id=f"{name}_{radio_type.name}_{device_path}",
|
|
902
1076
|
device_path=device_path,
|
|
@@ -1018,7 +1192,7 @@ class ZhaOptionsFlowHandler(BaseZhaFlow, OptionsFlow):
|
|
|
1018
1192
|
|
|
1019
1193
|
# If we are reconfiguring, the old radio will not be available
|
|
1020
1194
|
if self._migration_intent is OptionsMigrationIntent.RECONFIGURE:
|
|
1021
|
-
return await self.
|
|
1195
|
+
return await self.async_step_restore_backup()
|
|
1022
1196
|
|
|
1023
1197
|
return await super().async_step_maybe_reset_old_radio(user_input)
|
|
1024
1198
|
|
|
@@ -78,6 +78,7 @@ 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)),
|
|
81
82
|
}
|
|
82
83
|
)
|
|
83
84
|
|
|
@@ -322,7 +323,7 @@ class ZhaRadioManager:
|
|
|
322
323
|
|
|
323
324
|
return backup
|
|
324
325
|
|
|
325
|
-
async def async_form_network(self) -> None:
|
|
326
|
+
async def async_form_network(self, config: dict[str, Any] | None) -> None:
|
|
326
327
|
"""Form a brand-new network."""
|
|
327
328
|
|
|
328
329
|
# When forming a new network, we delete the ZHA database to prevent old devices
|
|
@@ -331,7 +332,7 @@ class ZhaRadioManager:
|
|
|
331
332
|
await self.hass.async_add_executor_job(os.remove, self.zigpy_database_path)
|
|
332
333
|
|
|
333
334
|
async with self.create_zigpy_app() as app:
|
|
334
|
-
await app.form_network()
|
|
335
|
+
await app.form_network(config=config)
|
|
335
336
|
|
|
336
337
|
async def async_reset_adapter(self) -> None:
|
|
337
338
|
"""Reset the current adapter."""
|
|
@@ -16,6 +16,11 @@
|
|
|
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
|
+
},
|
|
19
24
|
"step": {
|
|
20
25
|
"choose_automatic_backup": {
|
|
21
26
|
"data": {
|
|
@@ -76,8 +81,15 @@
|
|
|
76
81
|
"confirm": {
|
|
77
82
|
"description": "Do you want to set up {name}?"
|
|
78
83
|
},
|
|
79
|
-
"
|
|
80
|
-
"
|
|
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"
|
|
81
93
|
},
|
|
82
94
|
"manual_pick_radio_type": {
|
|
83
95
|
"data": {
|
|
@@ -100,17 +112,28 @@
|
|
|
100
112
|
"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",
|
|
101
113
|
"title": "Serial port settings"
|
|
102
114
|
},
|
|
103
|
-
"maybe_confirm_ezsp_restore": {
|
|
104
|
-
"data": {
|
|
105
|
-
"overwrite_coordinator_ieee": "Permanently replace the adapter IEEE address"
|
|
106
|
-
},
|
|
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"
|
|
109
|
-
},
|
|
110
115
|
"maybe_reset_old_radio": {
|
|
111
|
-
"description": "A backup was created earlier and your old adapter is being reset as part of the migration.",
|
|
112
116
|
"title": "Resetting old adapter"
|
|
113
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"
|
|
131
|
+
},
|
|
132
|
+
"title": "Old adapter not found"
|
|
133
|
+
},
|
|
134
|
+
"restore_backup": {
|
|
135
|
+
"title": "Restoring network to new adapter"
|
|
136
|
+
},
|
|
114
137
|
"upload_manual_backup": {
|
|
115
138
|
"data": {
|
|
116
139
|
"uploaded_backup_file": "Upload a file"
|
|
@@ -1869,6 +1892,11 @@
|
|
|
1869
1892
|
"invalid_backup_json": "[%key:component::zha::config::error::invalid_backup_json%]"
|
|
1870
1893
|
},
|
|
1871
1894
|
"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
|
+
},
|
|
1872
1900
|
"step": {
|
|
1873
1901
|
"choose_automatic_backup": {
|
|
1874
1902
|
"data": {
|
|
@@ -1914,6 +1942,16 @@
|
|
|
1914
1942
|
"description": "[%key:component::zha::config::step::choose_serial_port::description%]",
|
|
1915
1943
|
"title": "[%key:component::zha::config::step::choose_serial_port::title%]"
|
|
1916
1944
|
},
|
|
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
|
+
},
|
|
1917
1955
|
"init": {
|
|
1918
1956
|
"description": "A backup will be performed and ZHA will be stopped. Do you wish to continue?",
|
|
1919
1957
|
"title": "Reconfigure ZHA"
|
|
@@ -1938,12 +1976,24 @@
|
|
|
1938
1976
|
"description": "[%key:component::zha::config::step::manual_port_config::description%]",
|
|
1939
1977
|
"title": "[%key:component::zha::config::step::manual_port_config::title%]"
|
|
1940
1978
|
},
|
|
1941
|
-
"
|
|
1942
|
-
"
|
|
1943
|
-
|
|
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%]"
|
|
1944
1995
|
},
|
|
1945
|
-
"
|
|
1946
|
-
"title": "[%key:component::zha::config::step::maybe_confirm_ezsp_restore::title%]"
|
|
1996
|
+
"title": "[%key:component::zha::config::step::plug_in_old_radio::title%]"
|
|
1947
1997
|
},
|
|
1948
1998
|
"prompt_migrate_or_reconfigure": {
|
|
1949
1999
|
"description": "Are you migrating to a new adapter or re-configuring the current adapter?",
|
|
@@ -1957,6 +2007,9 @@
|
|
|
1957
2007
|
},
|
|
1958
2008
|
"title": "Migrate or re-configure"
|
|
1959
2009
|
},
|
|
2010
|
+
"restore_backup": {
|
|
2011
|
+
"title": "[%key:component::zha::config::step::restore_backup::title%]"
|
|
2012
|
+
},
|
|
1960
2013
|
"upload_manual_backup": {
|
|
1961
2014
|
"data": {
|
|
1962
2015
|
"uploaded_backup_file": "[%key:component::zha::config::step::upload_manual_backup::data::uploaded_backup_file%]"
|