homeassistant 2025.9.0b0__py3-none-any.whl → 2025.9.0b1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- homeassistant/components/ai_task/translations/cs.json +25 -3
- homeassistant/components/ai_task/translations/fr.json +22 -0
- homeassistant/components/ai_task/translations/lt.json +22 -0
- homeassistant/components/ai_task/translations/pt.json +22 -0
- homeassistant/components/ai_task/translations/sk.json +1 -1
- homeassistant/components/airgradient/translations/pt.json +1 -0
- homeassistant/components/airos/manifest.json +1 -1
- homeassistant/components/airos/translations/lt.json +18 -1
- homeassistant/components/aladdin_connect/translations/cs.json +30 -1
- homeassistant/components/aladdin_connect/translations/et.json +30 -1
- homeassistant/components/aladdin_connect/translations/fr.json +10 -0
- homeassistant/components/aladdin_connect/translations/ga.json +30 -1
- homeassistant/components/aladdin_connect/translations/lt.json +30 -1
- homeassistant/components/aladdin_connect/translations/nl.json +28 -0
- homeassistant/components/aladdin_connect/translations/pt.json +30 -1
- homeassistant/components/aladdin_connect/translations/sk.json +30 -1
- homeassistant/components/aladdin_connect/translations/zh-Hans.json +30 -1
- homeassistant/components/aladdin_connect/translations/zh-Hant.json +30 -1
- homeassistant/components/alarm_control_panel/translations/cs.json +3 -3
- homeassistant/components/alexa_devices/__init__.py +1 -1
- homeassistant/components/alexa_devices/const.py +9 -9
- homeassistant/components/alexa_devices/sensor.py +3 -0
- homeassistant/components/alexa_devices/translations/lt.json +7 -0
- homeassistant/components/alexa_devices/translations/pt.json +11 -0
- homeassistant/components/alexa_devices/translations/sk.json +20 -20
- homeassistant/components/asuswrt/manifest.json +1 -1
- homeassistant/components/august/translations/lt.json +23 -1
- homeassistant/components/august/translations/pt.json +26 -1
- homeassistant/components/backup/translations/de.json +1 -1
- homeassistant/components/bayesian/strings.json +1 -1
- homeassistant/components/bayesian/translations/cs.json +1 -1
- homeassistant/components/bayesian/translations/de.json +17 -17
- homeassistant/components/bayesian/translations/en-GB.json +1 -1
- homeassistant/components/bayesian/translations/en.json +3 -3
- homeassistant/components/bayesian/translations/et.json +1 -1
- homeassistant/components/bayesian/translations/fr.json +41 -0
- homeassistant/components/bayesian/translations/ga.json +8 -3
- homeassistant/components/bayesian/translations/lt.json +200 -0
- homeassistant/components/bayesian/translations/pl.json +7 -0
- homeassistant/components/bayesian/translations/pt.json +257 -0
- homeassistant/components/bayesian/translations/sk.json +5 -5
- homeassistant/components/bayesian/translations/zh-Hans.json +1 -1
- homeassistant/components/bayesian/translations/zh-Hant.json +1 -1
- homeassistant/components/bluetooth/manifest.json +2 -2
- homeassistant/components/bring/translations/sk.json +1 -1
- homeassistant/components/button/translations/ru.json +1 -1
- homeassistant/components/cover/translations/mk.json +13 -5
- homeassistant/components/cover/translations/pl.json +1 -1
- homeassistant/components/deconz/translations/ga.json +14 -0
- homeassistant/components/downloader/translations/sk.json +1 -1
- homeassistant/components/dsmr/translations/ga.json +8 -0
- homeassistant/components/dwd_weather_warnings/translations/sk.json +1 -1
- homeassistant/components/ecovacs/manifest.json +1 -1
- homeassistant/components/enphase_envoy/translations/lt.json +6 -0
- homeassistant/components/eq3btsmart/manifest.json +1 -1
- homeassistant/components/esphome/manifest.json +2 -2
- homeassistant/components/esphome/translations/sk.json +1 -1
- homeassistant/components/flux_led/translations/sk.json +1 -1
- homeassistant/components/frontend/manifest.json +1 -1
- homeassistant/components/fully_kiosk/translations/fr.json +5 -0
- homeassistant/components/fully_kiosk/translations/lt.json +3 -0
- homeassistant/components/fully_kiosk/translations/pt.json +3 -0
- homeassistant/components/fyta/translations/fr.json +3 -0
- homeassistant/components/fyta/translations/lt.json +64 -2
- homeassistant/components/fyta/translations/pt.json +64 -2
- homeassistant/components/google_assistant_sdk/translations/sk.json +1 -1
- homeassistant/components/google_generative_ai_conversation/translations/cs.json +3 -3
- homeassistant/components/google_generative_ai_conversation/translations/sk.json +1 -1
- homeassistant/components/google_mail/translations/sk.json +1 -1
- homeassistant/components/google_photos/translations/sk.json +1 -1
- homeassistant/components/google_sheets/translations/sk.json +1 -1
- homeassistant/components/google_tasks/translations/sk.json +1 -1
- homeassistant/components/govee_light_local/__init__.py +16 -3
- homeassistant/components/govee_light_local/config_flow.py +28 -10
- homeassistant/components/govee_light_local/coordinator.py +39 -24
- homeassistant/components/habitica/translations/cs.json +3 -3
- homeassistant/components/hassio/translations/sk.json +1 -1
- homeassistant/components/history_stats/translations/sk.json +3 -3
- homeassistant/components/home_connect/translations/sk.json +1 -1
- homeassistant/components/husqvarna_automower_ble/translations/cs.json +35 -1
- homeassistant/components/husqvarna_automower_ble/translations/lt.json +35 -1
- homeassistant/components/husqvarna_automower_ble/translations/pt.json +35 -1
- homeassistant/components/hyperion/translations/sk.json +1 -1
- homeassistant/components/iaqualink/__init__.py +10 -0
- homeassistant/components/iaqualink/entity.py +1 -0
- homeassistant/components/imeon_inverter/translations/lt.json +54 -0
- homeassistant/components/imeon_inverter/translations/pt.json +79 -0
- homeassistant/components/knx/translations/lt.json +245 -0
- homeassistant/components/knx/translations/pt.json +270 -0
- homeassistant/components/lg_thinq/translations/lt.json +3 -0
- homeassistant/components/lg_thinq/translations/pt.json +4 -0
- homeassistant/components/lock/translations/pl.json +1 -0
- homeassistant/components/logbook/translations/ko.json +2 -1
- homeassistant/components/lyric/translations/sk.json +1 -1
- homeassistant/components/mastodon/__init__.py +13 -2
- homeassistant/components/mastodon/config_flow.py +7 -2
- homeassistant/components/mastodon/diagnostics.py +8 -3
- homeassistant/components/matter/translations/lt.json +36 -0
- homeassistant/components/matter/translations/pt.json +27 -0
- homeassistant/components/media_player/translations/cs.json +5 -0
- homeassistant/components/media_player/translations/fr.json +3 -0
- homeassistant/components/media_player/translations/lt.json +4 -0
- homeassistant/components/media_player/translations/pt.json +5 -0
- homeassistant/components/media_player/translations/sk.json +1 -0
- homeassistant/components/media_player/translations/zh-Hans.json +1 -0
- homeassistant/components/media_player/translations/zh-Hant.json +1 -0
- homeassistant/components/meteo_france/const.py +1 -1
- homeassistant/components/metoffice/translations/sk.json +1 -1
- homeassistant/components/miele/translations/lt.json +12 -0
- homeassistant/components/miele/translations/pt.json +12 -0
- homeassistant/components/miele/translations/sk.json +8 -8
- homeassistant/components/modbus/translations/sk.json +1 -1
- homeassistant/components/mqtt/translations/cs.json +52 -0
- homeassistant/components/mqtt/translations/fr.json +11 -0
- homeassistant/components/mqtt/translations/lt.json +47 -0
- homeassistant/components/mqtt/translations/nl.json +68 -0
- homeassistant/components/mqtt/translations/pt.json +81 -0
- homeassistant/components/mqtt/translations/sk.json +8 -8
- homeassistant/components/mqtt/translations/zh-Hans.json +1 -0
- homeassistant/components/nest/translations/sk.json +2 -2
- homeassistant/components/nexia/manifest.json +1 -1
- homeassistant/components/nextdns/translations/lt.json +3 -0
- homeassistant/components/niko_home_control/translations/lt.json +10 -1
- homeassistant/components/niko_home_control/translations/pt.json +10 -1
- homeassistant/components/ollama/translations/cs.json +3 -3
- homeassistant/components/onewire/translations/lt.json +3 -0
- homeassistant/components/onvif/binary_sensor.py +1 -1
- homeassistant/components/onvif/sensor.py +1 -1
- homeassistant/components/open_router/translations/cs.json +2 -2
- homeassistant/components/openai_conversation/translations/cs.json +3 -3
- homeassistant/components/opower/translations/sk.json +1 -1
- homeassistant/components/playstation_network/__init__.py +4 -1
- homeassistant/components/playstation_network/config_flow.py +4 -13
- homeassistant/components/playstation_network/coordinator.py +55 -8
- homeassistant/components/playstation_network/helpers.py +4 -1
- homeassistant/components/playstation_network/notify.py +52 -27
- homeassistant/components/playstation_network/strings.json +11 -5
- homeassistant/components/playstation_network/translations/bg.json +0 -5
- homeassistant/components/playstation_network/translations/cs.json +5 -5
- homeassistant/components/playstation_network/translations/de.json +5 -5
- homeassistant/components/playstation_network/translations/en-GB.json +5 -5
- homeassistant/components/playstation_network/translations/en.json +5 -5
- homeassistant/components/playstation_network/translations/es.json +1 -13
- homeassistant/components/playstation_network/translations/et.json +0 -17
- homeassistant/components/playstation_network/translations/fr.json +1 -1
- homeassistant/components/playstation_network/translations/ga.json +0 -17
- homeassistant/components/playstation_network/translations/it.json +1 -1
- homeassistant/components/playstation_network/translations/lt.json +0 -17
- homeassistant/components/playstation_network/translations/pt.json +5 -5
- homeassistant/components/playstation_network/translations/sk.json +0 -17
- homeassistant/components/playstation_network/translations/zh-Hans.json +0 -17
- homeassistant/components/playstation_network/translations/zh-Hant.json +5 -5
- homeassistant/components/pooldose/translations/lt.json +102 -0
- homeassistant/components/pooldose/translations/nl.json +7 -2
- homeassistant/components/pooldose/translations/pt.json +102 -0
- homeassistant/components/profiler/translations/cs.json +2 -2
- homeassistant/components/qbus/translations/lt.json +8 -0
- homeassistant/components/recorder/translations/cs.json +2 -2
- homeassistant/components/remember_the_milk/translations/cs.json +7 -7
- homeassistant/components/reolink/manifest.json +1 -1
- homeassistant/components/reolink/number.py +3 -4
- homeassistant/components/reolink/select.py +0 -1
- homeassistant/components/reolink/translations/fr.json +3 -0
- homeassistant/components/reolink/translations/pt.json +9 -0
- homeassistant/components/roborock/translations/sk.json +9 -9
- homeassistant/components/sensor/translations/sk.json +1 -1
- homeassistant/components/sleep_as_android/translations/de.json +1 -1
- homeassistant/components/snapcast/translations/sk.json +2 -2
- homeassistant/components/sonos/translations/lt.json +12 -0
- homeassistant/components/sonos/translations/pt.json +15 -0
- homeassistant/components/sun/translations/sk.json +1 -1
- homeassistant/components/switchbot_cloud/translations/lt.json +16 -0
- homeassistant/components/switchbot_cloud/translations/pt.json +16 -0
- homeassistant/components/tautulli/translations/sk.json +1 -1
- homeassistant/components/template/translations/lt.json +102 -0
- homeassistant/components/template/translations/pl.json +140 -7
- homeassistant/components/template/translations/pt.json +149 -0
- homeassistant/components/template/translations/sk.json +6 -6
- homeassistant/components/togrill/translations/fr.json +4 -0
- homeassistant/components/togrill/translations/lt.json +30 -0
- homeassistant/components/togrill/translations/pt.json +49 -0
- homeassistant/components/tts/translations/cs.json +1 -1
- homeassistant/components/tuya/translations/pl.json +1 -1
- homeassistant/components/velux/translations/cs.json +7 -0
- homeassistant/components/velux/translations/lt.json +7 -0
- homeassistant/components/velux/translations/nl.json +7 -0
- homeassistant/components/velux/translations/pt.json +7 -0
- homeassistant/components/volvo/translations/lt.json +128 -0
- homeassistant/components/volvo/translations/pt.json +137 -0
- homeassistant/components/volvo/translations/sk.json +1 -1
- homeassistant/components/wallbox/translations/sk.json +1 -1
- homeassistant/components/withings/translations/sk.json +1 -1
- homeassistant/components/yolink/translations/pt.json +13 -0
- homeassistant/components/zha/translations/fr.json +48 -0
- homeassistant/components/zha/translations/lt.json +63 -0
- homeassistant/components/zha/translations/pl.json +3 -0
- homeassistant/components/zha/translations/pt.json +69 -0
- homeassistant/components/zha/translations/sk.json +3 -3
- homeassistant/components/zwave_js/binary_sensor.py +14 -6
- homeassistant/components/zwave_js/translations/lt.json +10 -0
- homeassistant/components/zwave_js/translations/pt.json +10 -0
- homeassistant/components/zwave_js/translations/sk.json +2 -2
- homeassistant/components/zwave_me/translations/sk.json +1 -1
- homeassistant/const.py +1 -1
- homeassistant/helpers/device_registry.py +37 -14
- homeassistant/helpers/entity_registry.py +68 -29
- homeassistant/package_constraints.txt +7 -3
- {homeassistant-2025.9.0b0.dist-info → homeassistant-2025.9.0b1.dist-info}/METADATA +1 -1
- {homeassistant-2025.9.0b0.dist-info → homeassistant-2025.9.0b1.dist-info}/RECORD +214 -210
- {homeassistant-2025.9.0b0.dist-info → homeassistant-2025.9.0b1.dist-info}/WHEEL +0 -0
- {homeassistant-2025.9.0b0.dist-info → homeassistant-2025.9.0b1.dist-info}/entry_points.txt +0 -0
- {homeassistant-2025.9.0b0.dist-info → homeassistant-2025.9.0b1.dist-info}/licenses/LICENSE.md +0 -0
- {homeassistant-2025.9.0b0.dist-info → homeassistant-2025.9.0b1.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
- {homeassistant-2025.9.0b0.dist-info → homeassistant-2025.9.0b1.dist-info}/top_level.txt +0 -0
|
@@ -258,6 +258,9 @@
|
|
|
258
258
|
}
|
|
259
259
|
},
|
|
260
260
|
"button": {
|
|
261
|
+
"calibrate_valve": {
|
|
262
|
+
"name": "Calibrar a v\u00e1lvula"
|
|
263
|
+
},
|
|
261
264
|
"feed": {
|
|
262
265
|
"name": "Alimenta\u00e7\u00e3o"
|
|
263
266
|
},
|
|
@@ -399,6 +402,9 @@
|
|
|
399
402
|
"calibration_vertical_run_time_up": {
|
|
400
403
|
"name": "Calibra\u00e7\u00e3o do tempo de movimento vertical para cima"
|
|
401
404
|
},
|
|
405
|
+
"closing_duration": {
|
|
406
|
+
"name": "Dura\u00e7\u00e3o do fecho"
|
|
407
|
+
},
|
|
402
408
|
"comfort_humidity_max": {
|
|
403
409
|
"name": "Humidade de conforto m\u00e1x"
|
|
404
410
|
},
|
|
@@ -459,6 +465,9 @@
|
|
|
459
465
|
"display_inactive_brightness": {
|
|
460
466
|
"name": "Brilho do ecr\u00e3 quando inativo"
|
|
461
467
|
},
|
|
468
|
+
"display_on_time": {
|
|
469
|
+
"name": "Exibir tempo ligado"
|
|
470
|
+
},
|
|
462
471
|
"double_tap_down_level": {
|
|
463
472
|
"name": "Duplo toque para descer de n\u00edvel"
|
|
464
473
|
},
|
|
@@ -582,6 +591,12 @@
|
|
|
582
591
|
"local_temperature_calibration": {
|
|
583
592
|
"name": "Corre\u00e7\u00e3o da temperatura local"
|
|
584
593
|
},
|
|
594
|
+
"long_press_duration": {
|
|
595
|
+
"name": "Dura\u00e7\u00e3o da press\u00e3o longa"
|
|
596
|
+
},
|
|
597
|
+
"max_brightness": {
|
|
598
|
+
"name": "Brilho m\u00e1ximo"
|
|
599
|
+
},
|
|
585
600
|
"max_heat_setpoint_limit": {
|
|
586
601
|
"name": "Limite m\u00e1ximo do ponto de regula\u00e7\u00e3o do calor"
|
|
587
602
|
},
|
|
@@ -603,6 +618,9 @@
|
|
|
603
618
|
"medium_motion_detection_sensitivity": {
|
|
604
619
|
"name": "Sensibilidade m\u00e9dia de dete\u00e7\u00e3o de movimento"
|
|
605
620
|
},
|
|
621
|
+
"min_brightness": {
|
|
622
|
+
"name": "Brilho m\u00ednimo"
|
|
623
|
+
},
|
|
606
624
|
"min_heat_setpoint_limit": {
|
|
607
625
|
"name": "Limite m\u00ednimo do ponto de regula\u00e7\u00e3o do calor"
|
|
608
626
|
},
|
|
@@ -627,6 +645,9 @@
|
|
|
627
645
|
"motionless_sensitivity": {
|
|
628
646
|
"name": "Sensibilidade de dete\u00e7\u00e3o sem movimento"
|
|
629
647
|
},
|
|
648
|
+
"motor_start_delay": {
|
|
649
|
+
"name": "Atraso no arranque do motor"
|
|
650
|
+
},
|
|
630
651
|
"move_sensitivity": {
|
|
631
652
|
"name": "Sensibilidade ao movimento"
|
|
632
653
|
},
|
|
@@ -663,6 +684,9 @@
|
|
|
663
684
|
"open_window_event_duration": {
|
|
664
685
|
"name": "Dura\u00e7\u00e3o do evento de janela aberta"
|
|
665
686
|
},
|
|
687
|
+
"opening_duration": {
|
|
688
|
+
"name": "Dura\u00e7\u00e3o da abertura"
|
|
689
|
+
},
|
|
666
690
|
"output_time": {
|
|
667
691
|
"name": "Hora de sa\u00edda"
|
|
668
692
|
},
|
|
@@ -705,6 +729,12 @@
|
|
|
705
729
|
"regulator_set_point": {
|
|
706
730
|
"name": "Ponto de regula\u00e7\u00e3o do regulador"
|
|
707
731
|
},
|
|
732
|
+
"reporting_interval": {
|
|
733
|
+
"name": "Intervalo de reporte"
|
|
734
|
+
},
|
|
735
|
+
"sensitivity": {
|
|
736
|
+
"name": "Sensibilidade"
|
|
737
|
+
},
|
|
708
738
|
"serving_size": {
|
|
709
739
|
"name": "Servir para dispensar"
|
|
710
740
|
},
|
|
@@ -848,12 +878,18 @@
|
|
|
848
878
|
"breaker_status": {
|
|
849
879
|
"name": "Estado do disjuntor"
|
|
850
880
|
},
|
|
881
|
+
"calibration_mode": {
|
|
882
|
+
"name": "Modo de calibra\u00e7\u00e3o"
|
|
883
|
+
},
|
|
851
884
|
"click_mode": {
|
|
852
885
|
"name": "Modo de clique"
|
|
853
886
|
},
|
|
854
887
|
"control_type": {
|
|
855
888
|
"name": "Tipo de controlo"
|
|
856
889
|
},
|
|
890
|
+
"ctrl_sequence_of_oper": {
|
|
891
|
+
"name": "Sequ\u00eancia de controlo"
|
|
892
|
+
},
|
|
857
893
|
"decoupled_mode": {
|
|
858
894
|
"name": "Modo desligado"
|
|
859
895
|
},
|
|
@@ -887,6 +923,9 @@
|
|
|
887
923
|
"display_unit": {
|
|
888
924
|
"name": "Unidade de visualiza\u00e7\u00e3o"
|
|
889
925
|
},
|
|
926
|
+
"displayed_temperature": {
|
|
927
|
+
"name": "Temperatura indicada"
|
|
928
|
+
},
|
|
890
929
|
"eco_mode": {
|
|
891
930
|
"name": "Modo Eco"
|
|
892
931
|
},
|
|
@@ -947,6 +986,9 @@
|
|
|
947
986
|
"mode": {
|
|
948
987
|
"name": "Modo"
|
|
949
988
|
},
|
|
989
|
+
"mode_switch": {
|
|
990
|
+
"name": "Interruptor de modo"
|
|
991
|
+
},
|
|
950
992
|
"monitoring_mode": {
|
|
951
993
|
"name": "Modo de monitoriza\u00e7\u00e3o"
|
|
952
994
|
},
|
|
@@ -974,6 +1016,9 @@
|
|
|
974
1016
|
"output_mode": {
|
|
975
1017
|
"name": "Modo de sa\u00edda"
|
|
976
1018
|
},
|
|
1019
|
+
"phase": {
|
|
1020
|
+
"name": "Fase"
|
|
1021
|
+
},
|
|
977
1022
|
"pilot_wire_mode": {
|
|
978
1023
|
"name": "Modo de fio piloto"
|
|
979
1024
|
},
|
|
@@ -1239,6 +1284,9 @@
|
|
|
1239
1284
|
"motion_distance": {
|
|
1240
1285
|
"name": "Dist\u00e2ncia de movimento"
|
|
1241
1286
|
},
|
|
1287
|
+
"motor_state": {
|
|
1288
|
+
"name": "Estado do motor"
|
|
1289
|
+
},
|
|
1242
1290
|
"motor_stepcount": {
|
|
1243
1291
|
"name": "N\u00famero de passos do motor"
|
|
1244
1292
|
},
|
|
@@ -1248,6 +1296,9 @@
|
|
|
1248
1296
|
"opening": {
|
|
1249
1297
|
"name": "A abrir"
|
|
1250
1298
|
},
|
|
1299
|
+
"operating_mode": {
|
|
1300
|
+
"name": "Modo de funcionamento"
|
|
1301
|
+
},
|
|
1251
1302
|
"overheated": {
|
|
1252
1303
|
"name": "Prote\u00e7\u00e3o de sobreaquecimento"
|
|
1253
1304
|
},
|
|
@@ -1407,6 +1458,9 @@
|
|
|
1407
1458
|
"total_power_factor": {
|
|
1408
1459
|
"name": "Fator de pot\u00eancia total"
|
|
1409
1460
|
},
|
|
1461
|
+
"valve_adapt_status": {
|
|
1462
|
+
"name": "Estado de adapta\u00e7\u00e3o da v\u00e1lvula"
|
|
1463
|
+
},
|
|
1410
1464
|
"valve_duration": {
|
|
1411
1465
|
"name": "Dura\u00e7\u00e3o da irriga\u00e7\u00e3o"
|
|
1412
1466
|
},
|
|
@@ -1469,6 +1523,9 @@
|
|
|
1469
1523
|
"detach_relay": {
|
|
1470
1524
|
"name": "Desanexar rel\u00e9"
|
|
1471
1525
|
},
|
|
1526
|
+
"dimmer_mode": {
|
|
1527
|
+
"name": "Modo de atenua\u00e7\u00e3o"
|
|
1528
|
+
},
|
|
1472
1529
|
"disable_clear_notifications_double_tap": {
|
|
1473
1530
|
"name": "Desativar op\u00e7\u00e3o de 2 toques para limpar notifica\u00e7\u00f5es"
|
|
1474
1531
|
},
|
|
@@ -1511,6 +1568,9 @@
|
|
|
1511
1568
|
"firmware_progress_led": {
|
|
1512
1569
|
"name": "LED de progresso do firmware"
|
|
1513
1570
|
},
|
|
1571
|
+
"flip_indicator_light": {
|
|
1572
|
+
"name": "Luz indicadora de mudan\u00e7a de dire\u00e7\u00e3o"
|
|
1573
|
+
},
|
|
1514
1574
|
"frient_com_1": {
|
|
1515
1575
|
"name": "COM 1"
|
|
1516
1576
|
},
|
|
@@ -1640,6 +1700,12 @@
|
|
|
1640
1700
|
"turbo_mode": {
|
|
1641
1701
|
"name": "Modo turbo"
|
|
1642
1702
|
},
|
|
1703
|
+
"turn_on_led_when_off": {
|
|
1704
|
+
"name": "Ligar o LED quando desligado"
|
|
1705
|
+
},
|
|
1706
|
+
"turn_on_led_when_on": {
|
|
1707
|
+
"name": "Ligar o LED quando ligado"
|
|
1708
|
+
},
|
|
1643
1709
|
"use_internal_window_detection": {
|
|
1644
1710
|
"name": "Usar dete\u00e7\u00e3o de janela interna"
|
|
1645
1711
|
},
|
|
@@ -1663,6 +1729,9 @@
|
|
|
1663
1729
|
},
|
|
1664
1730
|
"window_detection_function": {
|
|
1665
1731
|
"name": "Inverter dete\u00e7\u00e3o de janela"
|
|
1732
|
+
},
|
|
1733
|
+
"window_open": {
|
|
1734
|
+
"name": "Janela aberta"
|
|
1666
1735
|
}
|
|
1667
1736
|
}
|
|
1668
1737
|
},
|
|
@@ -367,7 +367,7 @@
|
|
|
367
367
|
"name": "\u010casova\u010d automatick\u00e9ho vypnutia vyp\u00edna\u010da"
|
|
368
368
|
},
|
|
369
369
|
"away_preset_temperature": {
|
|
370
|
-
"name": "Prednastaven\u00e1 teplota
|
|
370
|
+
"name": "Prednastaven\u00e1 teplota mimo"
|
|
371
371
|
},
|
|
372
372
|
"block_time": {
|
|
373
373
|
"name": "\u010cas blokovania"
|
|
@@ -1974,7 +1974,7 @@
|
|
|
1974
1974
|
"name": "QR k\u00f3d"
|
|
1975
1975
|
},
|
|
1976
1976
|
"source_ieee": {
|
|
1977
|
-
"description": "IEEE adresa prip\u00e1jaj\u00faceho sa zariadenia (mus\u00ed by\u0165 kombinovan\u00e1 s po\u013eom \
|
|
1977
|
+
"description": "IEEE adresa prip\u00e1jaj\u00faceho sa zariadenia (mus\u00ed by\u0165 kombinovan\u00e1 s po\u013eom 'In\u0161tala\u010dn\u00fd k\u00f3d').",
|
|
1978
1978
|
"name": "Zdroj IEEE"
|
|
1979
1979
|
}
|
|
1980
1980
|
},
|
|
@@ -2098,7 +2098,7 @@
|
|
|
2098
2098
|
"name": "Re\u017eim"
|
|
2099
2099
|
},
|
|
2100
2100
|
"strobe": {
|
|
2101
|
-
"description": "Pole Strobe sa pou\u017e\u00edva ako 2-bitov\u00fd v\u00fdpo\u010det a ur\u010duje, \u010di sa okrem zvukovej sir\u00e9ny vy\u017eaduje aj vizu\u00e1lna indik\u00e1cia, ako je uveden\u00e9 v tabu\u013eke 8-21 \u0161pecifik\u00e1cie ZCL. \"0\" znamen\u00e1 bez stroboskopu, \"1\" znamen\u00e1 stroboskop. Ak je pole strobe (stroboskop) \
|
|
2101
|
+
"description": "Pole Strobe sa pou\u017e\u00edva ako 2-bitov\u00fd v\u00fdpo\u010det a ur\u010duje, \u010di sa okrem zvukovej sir\u00e9ny vy\u017eaduje aj vizu\u00e1lna indik\u00e1cia, ako je uveden\u00e9 v tabu\u013eke 8-21 \u0161pecifik\u00e1cie ZCL. \"0\" znamen\u00e1 bez stroboskopu, \"1\" znamen\u00e1 stroboskop. Ak je pole strobe (stroboskop) \u201d1\u201d a Warning Mode (V\u00fdstra\u017en\u00fd re\u017eim) \"0\" (\u201dStop\u201d), aktivuje sa iba stroboskop.",
|
|
2102
2102
|
"name": "Stroboskop"
|
|
2103
2103
|
}
|
|
2104
2104
|
},
|
|
@@ -122,6 +122,13 @@ class NewNotificationZWaveJSEntityDescription(BinarySensorEntityDescription):
|
|
|
122
122
|
# - Replace water filter
|
|
123
123
|
# - Sump pump failure
|
|
124
124
|
|
|
125
|
+
|
|
126
|
+
# This set can be removed once all notification sensors have been migrated
|
|
127
|
+
# to use the new discovery schema and we've removed the old discovery code.
|
|
128
|
+
MIGRATED_NOTIFICATION_TYPES = {
|
|
129
|
+
NotificationType.SMOKE_ALARM,
|
|
130
|
+
}
|
|
131
|
+
|
|
125
132
|
NOTIFICATION_SENSOR_MAPPINGS: tuple[NotificationZWaveJSEntityDescription, ...] = (
|
|
126
133
|
NotificationZWaveJSEntityDescription(
|
|
127
134
|
# NotificationType 2: Carbon Monoxide - State Id's 1 and 2
|
|
@@ -402,6 +409,12 @@ async def async_setup_entry(
|
|
|
402
409
|
# ensure the notification CC Value is valid as binary sensor
|
|
403
410
|
if not is_valid_notification_binary_sensor(info):
|
|
404
411
|
return
|
|
412
|
+
if (
|
|
413
|
+
notification_type := info.primary_value.metadata.cc_specific[
|
|
414
|
+
CC_SPECIFIC_NOTIFICATION_TYPE
|
|
415
|
+
]
|
|
416
|
+
) in MIGRATED_NOTIFICATION_TYPES:
|
|
417
|
+
return
|
|
405
418
|
# Get all sensors from Notification CC states
|
|
406
419
|
for state_key in info.primary_value.metadata.states:
|
|
407
420
|
if TYPE_CHECKING:
|
|
@@ -414,12 +427,7 @@ async def async_setup_entry(
|
|
|
414
427
|
NotificationZWaveJSEntityDescription | None
|
|
415
428
|
) = None
|
|
416
429
|
for description in NOTIFICATION_SENSOR_MAPPINGS:
|
|
417
|
-
if (
|
|
418
|
-
int(description.key)
|
|
419
|
-
== info.primary_value.metadata.cc_specific[
|
|
420
|
-
CC_SPECIFIC_NOTIFICATION_TYPE
|
|
421
|
-
]
|
|
422
|
-
) and (
|
|
430
|
+
if (int(description.key) == notification_type) and (
|
|
423
431
|
not description.states or int(state_key) in description.states
|
|
424
432
|
):
|
|
425
433
|
notification_description = description
|
|
@@ -147,6 +147,16 @@
|
|
|
147
147
|
"submit": "Bandykite dar kart\u0105",
|
|
148
148
|
"title": "Atkurti nepavyko"
|
|
149
149
|
},
|
|
150
|
+
"rf_region": {
|
|
151
|
+
"data": {
|
|
152
|
+
"rf_region": "RF regionas"
|
|
153
|
+
},
|
|
154
|
+
"data_description": {
|
|
155
|
+
"rf_region": "J\u016bs\u0173 Z-Wave tinklo radijo da\u017eni\u0173 regionas. Jis turi sutapti su j\u016bs\u0173 Z-Wave \u012frengini\u0173 regionu."
|
|
156
|
+
},
|
|
157
|
+
"description": "Pasirinkite savo Z-Wave tinklo RF region\u0105.",
|
|
158
|
+
"title": "Z bangos regionas"
|
|
159
|
+
},
|
|
150
160
|
"start_addon": {
|
|
151
161
|
"title": "Priedo konfig\u016bravimas"
|
|
152
162
|
},
|
|
@@ -148,6 +148,16 @@
|
|
|
148
148
|
"submit": "Tentar novamente",
|
|
149
149
|
"title": "Restauro sem \u00eaxito"
|
|
150
150
|
},
|
|
151
|
+
"rf_region": {
|
|
152
|
+
"data": {
|
|
153
|
+
"rf_region": "Regi\u00e3o RF"
|
|
154
|
+
},
|
|
155
|
+
"data_description": {
|
|
156
|
+
"rf_region": "A regi\u00e3o de radiofrequ\u00eancia da sua rede Z-Wave. Esta deve corresponder \u00e0 regi\u00e3o dos seus dispositivos Z-Wave."
|
|
157
|
+
},
|
|
158
|
+
"description": "Selecione a regi\u00e3o de RF para a sua rede Z-Wave.",
|
|
159
|
+
"title": "Regi\u00e3o Z-Wave"
|
|
160
|
+
},
|
|
151
161
|
"start_addon": {
|
|
152
162
|
"title": "Configura\u00e7\u00e3o do suplemento"
|
|
153
163
|
},
|
|
@@ -144,7 +144,7 @@
|
|
|
144
144
|
"title": "Migr\u00e1cia alebo zmena konfigur\u00e1cie"
|
|
145
145
|
},
|
|
146
146
|
"restore_failed": {
|
|
147
|
-
"description": "Va\u0161u sie\u0165 Z-Wave nebolo mo\u017en\u00e9 obnovi\u0165 na nov\u00fd adapt\u00e9r. \
|
|
147
|
+
"description": "Va\u0161u sie\u0165 Z-Wave nebolo mo\u017en\u00e9 obnovi\u0165 na nov\u00fd adapt\u00e9r. \nTo znamen\u00e1, \u017ee va\u0161e zariadenia Z-Wave nie s\u00fa pripojen\u00e9 k aplik\u00e1cii Home Assistant. \n\nZ\u00e1loha je ulo\u017een\u00e1 na \u201d{file_path}\u201d \n\n'<'a href=\"{file_url}\" download=\"{file_name}\"'>'Stiahnu\u0165 s\u00fabor z\u00e1lohy'<'/a'>'",
|
|
148
148
|
"submit": "Sk\u00faste to znova",
|
|
149
149
|
"title": "Obnovenie ne\u00faspe\u0161n\u00e9"
|
|
150
150
|
},
|
|
@@ -311,7 +311,7 @@
|
|
|
311
311
|
"fix_flow": {
|
|
312
312
|
"step": {
|
|
313
313
|
"confirm": {
|
|
314
|
-
"description": "K polo\u017eke konfigur\u00e1cie {config_entry_title} bol pripojen\u00fd adapt\u00e9r Z-Wave modelu {controller_model}. Tento adapt\u00e9r m\u00e1 in\u00e9 ID ({new_unique_id}) ako predt\u00fdm pripojen\u00fd adapt\u00e9r ({old_unique_id}). \n\nD\u00f4vody pre in\u00e9 ID adapt\u00e9ra m\u00f4\u017eu by\u0165: \n\n1. Adapt\u00e9r bol resetovan\u00fd do tov\u00e1rensk\u00e9ho nastavenia pomocou aplik\u00e1cie tretej strany. \n2. Z\u00e1loha nevolatilnej pam\u00e4te adapt\u00e9ra bola obnoven\u00e1 do adapt\u00e9ra pomocou aplik\u00e1cie tretej strany. \n3. K tejto konfigura\u010dnej polo\u017eke bol pripojen\u00fd in\u00fd adapt\u00e9r. \n\nAk bol pripojen\u00fd in\u00fd adapt\u00e9r, mali by ste namiesto toho nastavi\u0165 nov\u00fa konfigura\u010dn\u00fa polo\u017eku pre nov\u00fd adapt\u00e9r. \n\nAk ste si ist\u00ed, \u017ee aktu\u00e1lny adapt\u00e9r je spr\u00e1vny adapt\u00e9r, potvr\u010fte stla\u010den\u00edm tla\u010didla
|
|
314
|
+
"description": "K polo\u017eke konfigur\u00e1cie {config_entry_title} bol pripojen\u00fd adapt\u00e9r Z-Wave modelu {controller_model}. Tento adapt\u00e9r m\u00e1 in\u00e9 ID ({new_unique_id}) ako predt\u00fdm pripojen\u00fd adapt\u00e9r ({old_unique_id}). \n\nD\u00f4vody pre in\u00e9 ID adapt\u00e9ra m\u00f4\u017eu by\u0165: \n\n1. Adapt\u00e9r bol resetovan\u00fd do tov\u00e1rensk\u00e9ho nastavenia pomocou aplik\u00e1cie tretej strany. \n2. Z\u00e1loha nevolatilnej pam\u00e4te adapt\u00e9ra bola obnoven\u00e1 do adapt\u00e9ra pomocou aplik\u00e1cie tretej strany. \n3. K tejto konfigura\u010dnej polo\u017eke bol pripojen\u00fd in\u00fd adapt\u00e9r. \n\nAk bol pripojen\u00fd in\u00fd adapt\u00e9r, mali by ste namiesto toho nastavi\u0165 nov\u00fa konfigura\u010dn\u00fa polo\u017eku pre nov\u00fd adapt\u00e9r. \n\nAk ste si ist\u00ed, \u017ee aktu\u00e1lny adapt\u00e9r je spr\u00e1vny adapt\u00e9r, potvr\u010fte stla\u010den\u00edm tla\u010didla Odosla\u0165. Konfigura\u010dn\u00e1 polo\u017eka si bude pam\u00e4ta\u0165 ID nov\u00e9ho adapt\u00e9ra.",
|
|
315
315
|
"title": "Bol zisten\u00fd nezn\u00e1my adapt\u00e9r"
|
|
316
316
|
}
|
|
317
317
|
}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"token": "API token",
|
|
14
14
|
"url": "URL"
|
|
15
15
|
},
|
|
16
|
-
"description": "Zadajte IP adresu s portom a pr\u00edstupov\u00fd token servera Z-Way. Token z\u00edskate v pou\u017e\u00edvate\u013eskom rozhran\u00ed Z-Way Smart Home UI > Menu > Nastavenia > Pou\u017e\u00edvatelia > Spr\u00e1vca > API token. \n\nPr\u00edklad pripojenia k Z-Way spusten\u00e9ho ako doplnok:
|
|
16
|
+
"description": "Zadajte IP adresu s portom a pr\u00edstupov\u00fd token servera Z-Way. Token z\u00edskate v pou\u017e\u00edvate\u013eskom rozhran\u00ed Z-Way Smart Home UI > Menu > Nastavenia > Pou\u017e\u00edvatelia > Spr\u00e1vca > API token. \n\nPr\u00edklad pripojenia k Z-Way spusten\u00e9ho ako doplnok: \nURL: {add_on_url}\nToken: {local_token}\n\nPr\u00edklad pripojenia k Z-Way v lok\u00e1lnej sieti: \nURL: {local_url}\nToken: Z-Way: {local_token}\n\nPr\u00edklad pripojenia k Z-Way prostredn\u00edctvom vzdialen\u00e9ho pr\u00edstupu find.z-wave.me: URL: {find_url}\nToken: {find_token}\n\nPr\u00edklad pripojenia k Z-Way pomocou statickej verejnej IP adresy: \nURL: {remote_url}\nToken: {local_token}\n\nPri prip\u00e1jan\u00ed cez find.z-wave.me mus\u00edte pou\u017ei\u0165 token s glob\u00e1lnym rozsahom (prihl\u00e1ste sa do Z-Way cez find.z-wave.me)."
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
}
|
homeassistant/const.py
CHANGED
|
@@ -25,7 +25,7 @@ if TYPE_CHECKING:
|
|
|
25
25
|
APPLICATION_NAME: Final = "HomeAssistant"
|
|
26
26
|
MAJOR_VERSION: Final = 2025
|
|
27
27
|
MINOR_VERSION: Final = 9
|
|
28
|
-
PATCH_VERSION: Final = "
|
|
28
|
+
PATCH_VERSION: Final = "0b1"
|
|
29
29
|
__short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}"
|
|
30
30
|
__version__: Final = f"{__short_version__}.{PATCH_VERSION}"
|
|
31
31
|
REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 13, 2)
|
|
@@ -9,7 +9,7 @@ from enum import StrEnum
|
|
|
9
9
|
from functools import lru_cache
|
|
10
10
|
import logging
|
|
11
11
|
import time
|
|
12
|
-
from typing import TYPE_CHECKING, Any, Literal, TypedDict
|
|
12
|
+
from typing import TYPE_CHECKING, Any, Final, Literal, TypedDict
|
|
13
13
|
|
|
14
14
|
import attr
|
|
15
15
|
from yarl import URL
|
|
@@ -68,6 +68,8 @@ CONNECTION_ZIGBEE = "zigbee"
|
|
|
68
68
|
|
|
69
69
|
ORPHANED_DEVICE_KEEP_SECONDS = 86400 * 30
|
|
70
70
|
|
|
71
|
+
UNDEFINED_STR: Final = "UNDEFINED"
|
|
72
|
+
|
|
71
73
|
# Can be removed when suggested_area is removed from DeviceEntry
|
|
72
74
|
RUNTIME_ONLY_ATTRS = {"suggested_area"}
|
|
73
75
|
|
|
@@ -465,7 +467,7 @@ class DeletedDeviceEntry:
|
|
|
465
467
|
validator=_normalize_connections_validator
|
|
466
468
|
)
|
|
467
469
|
created_at: datetime = attr.ib()
|
|
468
|
-
disabled_by: DeviceEntryDisabler | None = attr.ib()
|
|
470
|
+
disabled_by: DeviceEntryDisabler | UndefinedType | None = attr.ib()
|
|
469
471
|
id: str = attr.ib()
|
|
470
472
|
identifiers: set[tuple[str, str]] = attr.ib()
|
|
471
473
|
labels: set[str] = attr.ib()
|
|
@@ -480,15 +482,19 @@ class DeletedDeviceEntry:
|
|
|
480
482
|
config_subentry_id: str | None,
|
|
481
483
|
connections: set[tuple[str, str]],
|
|
482
484
|
identifiers: set[tuple[str, str]],
|
|
485
|
+
disabled_by: DeviceEntryDisabler | UndefinedType | None,
|
|
483
486
|
) -> DeviceEntry:
|
|
484
487
|
"""Create DeviceEntry from DeletedDeviceEntry."""
|
|
485
488
|
# Adjust disabled_by based on config entry state
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
if disabled_by
|
|
489
|
-
disabled_by
|
|
490
|
-
|
|
491
|
-
disabled_by
|
|
489
|
+
if self.disabled_by is not UNDEFINED:
|
|
490
|
+
disabled_by = self.disabled_by
|
|
491
|
+
if config_entry.disabled_by:
|
|
492
|
+
if disabled_by is None:
|
|
493
|
+
disabled_by = DeviceEntryDisabler.CONFIG_ENTRY
|
|
494
|
+
elif disabled_by == DeviceEntryDisabler.CONFIG_ENTRY:
|
|
495
|
+
disabled_by = None
|
|
496
|
+
else:
|
|
497
|
+
disabled_by = disabled_by if disabled_by is not UNDEFINED else None
|
|
492
498
|
return DeviceEntry(
|
|
493
499
|
area_id=self.area_id,
|
|
494
500
|
# type ignores: likely https://github.com/python/mypy/issues/8625
|
|
@@ -520,7 +526,9 @@ class DeletedDeviceEntry:
|
|
|
520
526
|
},
|
|
521
527
|
"connections": list(self.connections),
|
|
522
528
|
"created_at": self.created_at,
|
|
523
|
-
"disabled_by": self.disabled_by
|
|
529
|
+
"disabled_by": self.disabled_by
|
|
530
|
+
if self.disabled_by is not UNDEFINED
|
|
531
|
+
else UNDEFINED_STR,
|
|
524
532
|
"identifiers": list(self.identifiers),
|
|
525
533
|
"id": self.id,
|
|
526
534
|
"labels": list(self.labels),
|
|
@@ -608,7 +616,7 @@ class DeviceRegistryStore(storage.Store[dict[str, list[dict[str, Any]]]]):
|
|
|
608
616
|
# Introduced in 2025.6
|
|
609
617
|
for device in old_data["deleted_devices"]:
|
|
610
618
|
device["area_id"] = None
|
|
611
|
-
device["disabled_by"] =
|
|
619
|
+
device["disabled_by"] = UNDEFINED_STR
|
|
612
620
|
device["labels"] = []
|
|
613
621
|
device["name_by_user"] = None
|
|
614
622
|
if old_minor_version < 11:
|
|
@@ -934,7 +942,10 @@ class DeviceRegistry(BaseRegistry[dict[str, list[dict[str, Any]]]]):
|
|
|
934
942
|
config_subentry_id if config_subentry_id is not UNDEFINED else None,
|
|
935
943
|
connections,
|
|
936
944
|
identifiers,
|
|
945
|
+
disabled_by,
|
|
937
946
|
)
|
|
947
|
+
disabled_by = UNDEFINED
|
|
948
|
+
|
|
938
949
|
self.devices[device.id] = device
|
|
939
950
|
# If creating a new device, default to the config entry name
|
|
940
951
|
if device_info_type == "primary" and (not name or name is UNDEFINED):
|
|
@@ -1442,7 +1453,21 @@ class DeviceRegistry(BaseRegistry[dict[str, list[dict[str, Any]]]]):
|
|
|
1442
1453
|
sw_version=device["sw_version"],
|
|
1443
1454
|
via_device_id=device["via_device_id"],
|
|
1444
1455
|
)
|
|
1456
|
+
|
|
1445
1457
|
# Introduced in 0.111
|
|
1458
|
+
def get_optional_enum[_EnumT: StrEnum](
|
|
1459
|
+
cls: type[_EnumT], value: str | None
|
|
1460
|
+
) -> _EnumT | UndefinedType | None:
|
|
1461
|
+
"""Convert string to the passed enum, UNDEFINED or None."""
|
|
1462
|
+
if value is None:
|
|
1463
|
+
return None
|
|
1464
|
+
if value == UNDEFINED_STR:
|
|
1465
|
+
return UNDEFINED
|
|
1466
|
+
try:
|
|
1467
|
+
return cls(value)
|
|
1468
|
+
except ValueError:
|
|
1469
|
+
return None
|
|
1470
|
+
|
|
1446
1471
|
for device in data["deleted_devices"]:
|
|
1447
1472
|
deleted_devices[device["id"]] = DeletedDeviceEntry(
|
|
1448
1473
|
area_id=device["area_id"],
|
|
@@ -1455,10 +1480,8 @@ class DeviceRegistry(BaseRegistry[dict[str, list[dict[str, Any]]]]):
|
|
|
1455
1480
|
},
|
|
1456
1481
|
connections={tuple(conn) for conn in device["connections"]},
|
|
1457
1482
|
created_at=datetime.fromisoformat(device["created_at"]),
|
|
1458
|
-
disabled_by=(
|
|
1459
|
-
DeviceEntryDisabler
|
|
1460
|
-
if device["disabled_by"]
|
|
1461
|
-
else None
|
|
1483
|
+
disabled_by=get_optional_enum(
|
|
1484
|
+
DeviceEntryDisabler, device["disabled_by"]
|
|
1462
1485
|
),
|
|
1463
1486
|
identifiers={tuple(iden) for iden in device["identifiers"]},
|
|
1464
1487
|
id=device["id"],
|
|
@@ -16,7 +16,7 @@ from datetime import datetime, timedelta
|
|
|
16
16
|
from enum import StrEnum
|
|
17
17
|
import logging
|
|
18
18
|
import time
|
|
19
|
-
from typing import TYPE_CHECKING, Any, Literal, NotRequired, TypedDict
|
|
19
|
+
from typing import TYPE_CHECKING, Any, Final, Literal, NotRequired, TypedDict
|
|
20
20
|
|
|
21
21
|
import attr
|
|
22
22
|
import voluptuous as vol
|
|
@@ -85,6 +85,8 @@ STORAGE_KEY = "core.entity_registry"
|
|
|
85
85
|
CLEANUP_INTERVAL = 3600 * 24
|
|
86
86
|
ORPHANED_ENTITY_KEEP_SECONDS = 3600 * 24 * 30
|
|
87
87
|
|
|
88
|
+
UNDEFINED_STR: Final = "UNDEFINED"
|
|
89
|
+
|
|
88
90
|
ENTITY_CATEGORY_VALUE_TO_INDEX: dict[EntityCategory | None, int] = {
|
|
89
91
|
val: idx for idx, val in enumerate(EntityCategory)
|
|
90
92
|
}
|
|
@@ -164,6 +166,17 @@ def _protect_entity_options(
|
|
|
164
166
|
return ReadOnlyDict({key: ReadOnlyDict(val) for key, val in data.items()})
|
|
165
167
|
|
|
166
168
|
|
|
169
|
+
def _protect_optional_entity_options(
|
|
170
|
+
data: EntityOptionsType | UndefinedType | None,
|
|
171
|
+
) -> ReadOnlyEntityOptionsType | UndefinedType:
|
|
172
|
+
"""Protect entity options from being modified."""
|
|
173
|
+
if data is UNDEFINED:
|
|
174
|
+
return UNDEFINED
|
|
175
|
+
if data is None:
|
|
176
|
+
return ReadOnlyDict({})
|
|
177
|
+
return ReadOnlyDict({key: ReadOnlyDict(val) for key, val in data.items()})
|
|
178
|
+
|
|
179
|
+
|
|
167
180
|
@attr.s(frozen=True, kw_only=True, slots=True)
|
|
168
181
|
class RegistryEntry:
|
|
169
182
|
"""Entity Registry Entry."""
|
|
@@ -414,15 +427,17 @@ class DeletedRegistryEntry:
|
|
|
414
427
|
config_subentry_id: str | None = attr.ib()
|
|
415
428
|
created_at: datetime = attr.ib()
|
|
416
429
|
device_class: str | None = attr.ib()
|
|
417
|
-
disabled_by: RegistryEntryDisabler | None = attr.ib()
|
|
430
|
+
disabled_by: RegistryEntryDisabler | UndefinedType | None = attr.ib()
|
|
418
431
|
domain: str = attr.ib(init=False, repr=False)
|
|
419
|
-
hidden_by: RegistryEntryHider | None = attr.ib()
|
|
432
|
+
hidden_by: RegistryEntryHider | UndefinedType | None = attr.ib()
|
|
420
433
|
icon: str | None = attr.ib()
|
|
421
434
|
id: str = attr.ib()
|
|
422
435
|
labels: set[str] = attr.ib()
|
|
423
436
|
modified_at: datetime = attr.ib()
|
|
424
437
|
name: str | None = attr.ib()
|
|
425
|
-
options: ReadOnlyEntityOptionsType = attr.ib(
|
|
438
|
+
options: ReadOnlyEntityOptionsType | UndefinedType = attr.ib(
|
|
439
|
+
converter=_protect_optional_entity_options
|
|
440
|
+
)
|
|
426
441
|
orphaned_timestamp: float | None = attr.ib()
|
|
427
442
|
|
|
428
443
|
_cache: dict[str, Any] = attr.ib(factory=dict, eq=False, init=False)
|
|
@@ -445,15 +460,21 @@ class DeletedRegistryEntry:
|
|
|
445
460
|
"config_subentry_id": self.config_subentry_id,
|
|
446
461
|
"created_at": self.created_at,
|
|
447
462
|
"device_class": self.device_class,
|
|
448
|
-
"disabled_by": self.disabled_by
|
|
463
|
+
"disabled_by": self.disabled_by
|
|
464
|
+
if self.disabled_by is not UNDEFINED
|
|
465
|
+
else UNDEFINED_STR,
|
|
449
466
|
"entity_id": self.entity_id,
|
|
450
|
-
"hidden_by": self.hidden_by
|
|
467
|
+
"hidden_by": self.hidden_by
|
|
468
|
+
if self.hidden_by is not UNDEFINED
|
|
469
|
+
else UNDEFINED_STR,
|
|
451
470
|
"icon": self.icon,
|
|
452
471
|
"id": self.id,
|
|
453
472
|
"labels": list(self.labels),
|
|
454
473
|
"modified_at": self.modified_at,
|
|
455
474
|
"name": self.name,
|
|
456
|
-
"options": self.options
|
|
475
|
+
"options": self.options
|
|
476
|
+
if self.options is not UNDEFINED
|
|
477
|
+
else UNDEFINED_STR,
|
|
457
478
|
"orphaned_timestamp": self.orphaned_timestamp,
|
|
458
479
|
"platform": self.platform,
|
|
459
480
|
"unique_id": self.unique_id,
|
|
@@ -584,12 +605,12 @@ class EntityRegistryStore(storage.Store[dict[str, list[dict[str, Any]]]]):
|
|
|
584
605
|
entity["area_id"] = None
|
|
585
606
|
entity["categories"] = {}
|
|
586
607
|
entity["device_class"] = None
|
|
587
|
-
entity["disabled_by"] =
|
|
588
|
-
entity["hidden_by"] =
|
|
608
|
+
entity["disabled_by"] = UNDEFINED_STR
|
|
609
|
+
entity["hidden_by"] = UNDEFINED_STR
|
|
589
610
|
entity["icon"] = None
|
|
590
611
|
entity["labels"] = []
|
|
591
612
|
entity["name"] = None
|
|
592
|
-
entity["options"] =
|
|
613
|
+
entity["options"] = UNDEFINED_STR
|
|
593
614
|
|
|
594
615
|
if old_major_version > 1:
|
|
595
616
|
raise NotImplementedError
|
|
@@ -958,25 +979,30 @@ class EntityRegistry(BaseRegistry):
|
|
|
958
979
|
categories = deleted_entity.categories
|
|
959
980
|
created_at = deleted_entity.created_at
|
|
960
981
|
device_class = deleted_entity.device_class
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
if config_entry
|
|
965
|
-
if disabled_by
|
|
966
|
-
disabled_by
|
|
982
|
+
if deleted_entity.disabled_by is not UNDEFINED:
|
|
983
|
+
disabled_by = deleted_entity.disabled_by
|
|
984
|
+
# Adjust disabled_by based on config entry state
|
|
985
|
+
if config_entry and config_entry is not UNDEFINED:
|
|
986
|
+
if config_entry.disabled_by:
|
|
987
|
+
if disabled_by is None:
|
|
988
|
+
disabled_by = RegistryEntryDisabler.CONFIG_ENTRY
|
|
989
|
+
elif disabled_by == RegistryEntryDisabler.CONFIG_ENTRY:
|
|
990
|
+
disabled_by = None
|
|
967
991
|
elif disabled_by == RegistryEntryDisabler.CONFIG_ENTRY:
|
|
968
992
|
disabled_by = None
|
|
969
|
-
elif disabled_by == RegistryEntryDisabler.CONFIG_ENTRY:
|
|
970
|
-
disabled_by = None
|
|
971
993
|
# Restore entity_id if it's available
|
|
972
994
|
if self._entity_id_available(deleted_entity.entity_id):
|
|
973
995
|
entity_id = deleted_entity.entity_id
|
|
974
996
|
entity_registry_id = deleted_entity.id
|
|
975
|
-
|
|
997
|
+
if deleted_entity.hidden_by is not UNDEFINED:
|
|
998
|
+
hidden_by = deleted_entity.hidden_by
|
|
976
999
|
icon = deleted_entity.icon
|
|
977
1000
|
labels = deleted_entity.labels
|
|
978
1001
|
name = deleted_entity.name
|
|
979
|
-
|
|
1002
|
+
if deleted_entity.options is not UNDEFINED:
|
|
1003
|
+
options = deleted_entity.options
|
|
1004
|
+
else:
|
|
1005
|
+
options = get_initial_options() if get_initial_options else None
|
|
980
1006
|
else:
|
|
981
1007
|
aliases = set()
|
|
982
1008
|
area_id = None
|
|
@@ -1529,6 +1555,20 @@ class EntityRegistry(BaseRegistry):
|
|
|
1529
1555
|
previous_unique_id=entity["previous_unique_id"],
|
|
1530
1556
|
unit_of_measurement=entity["unit_of_measurement"],
|
|
1531
1557
|
)
|
|
1558
|
+
|
|
1559
|
+
def get_optional_enum[_EnumT: StrEnum](
|
|
1560
|
+
cls: type[_EnumT], value: str | None
|
|
1561
|
+
) -> _EnumT | UndefinedType | None:
|
|
1562
|
+
"""Convert string to the passed enum, UNDEFINED or None."""
|
|
1563
|
+
if value is None:
|
|
1564
|
+
return None
|
|
1565
|
+
if value == UNDEFINED_STR:
|
|
1566
|
+
return UNDEFINED
|
|
1567
|
+
try:
|
|
1568
|
+
return cls(value)
|
|
1569
|
+
except ValueError:
|
|
1570
|
+
return None
|
|
1571
|
+
|
|
1532
1572
|
for entity in data["deleted_entities"]:
|
|
1533
1573
|
try:
|
|
1534
1574
|
domain = split_entity_id(entity["entity_id"])[0]
|
|
@@ -1546,6 +1586,7 @@ class EntityRegistry(BaseRegistry):
|
|
|
1546
1586
|
entity["platform"],
|
|
1547
1587
|
entity["unique_id"],
|
|
1548
1588
|
)
|
|
1589
|
+
|
|
1549
1590
|
deleted_entities[key] = DeletedRegistryEntry(
|
|
1550
1591
|
aliases=set(entity["aliases"]),
|
|
1551
1592
|
area_id=entity["area_id"],
|
|
@@ -1554,23 +1595,21 @@ class EntityRegistry(BaseRegistry):
|
|
|
1554
1595
|
config_subentry_id=entity["config_subentry_id"],
|
|
1555
1596
|
created_at=datetime.fromisoformat(entity["created_at"]),
|
|
1556
1597
|
device_class=entity["device_class"],
|
|
1557
|
-
disabled_by=(
|
|
1558
|
-
RegistryEntryDisabler
|
|
1559
|
-
if entity["disabled_by"]
|
|
1560
|
-
else None
|
|
1598
|
+
disabled_by=get_optional_enum(
|
|
1599
|
+
RegistryEntryDisabler, entity["disabled_by"]
|
|
1561
1600
|
),
|
|
1562
1601
|
entity_id=entity["entity_id"],
|
|
1563
|
-
hidden_by=(
|
|
1564
|
-
RegistryEntryHider
|
|
1565
|
-
if entity["hidden_by"]
|
|
1566
|
-
else None
|
|
1602
|
+
hidden_by=get_optional_enum(
|
|
1603
|
+
RegistryEntryHider, entity["hidden_by"]
|
|
1567
1604
|
),
|
|
1568
1605
|
icon=entity["icon"],
|
|
1569
1606
|
id=entity["id"],
|
|
1570
1607
|
labels=set(entity["labels"]),
|
|
1571
1608
|
modified_at=datetime.fromisoformat(entity["modified_at"]),
|
|
1572
1609
|
name=entity["name"],
|
|
1573
|
-
options=entity["options"]
|
|
1610
|
+
options=entity["options"]
|
|
1611
|
+
if entity["options"] is not UNDEFINED_STR
|
|
1612
|
+
else UNDEFINED,
|
|
1574
1613
|
orphaned_timestamp=entity["orphaned_timestamp"],
|
|
1575
1614
|
platform=entity["platform"],
|
|
1576
1615
|
unique_id=entity["unique_id"],
|