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.
Files changed (214) hide show
  1. homeassistant/components/ai_task/translations/cs.json +25 -3
  2. homeassistant/components/ai_task/translations/fr.json +22 -0
  3. homeassistant/components/ai_task/translations/lt.json +22 -0
  4. homeassistant/components/ai_task/translations/pt.json +22 -0
  5. homeassistant/components/ai_task/translations/sk.json +1 -1
  6. homeassistant/components/airgradient/translations/pt.json +1 -0
  7. homeassistant/components/airos/manifest.json +1 -1
  8. homeassistant/components/airos/translations/lt.json +18 -1
  9. homeassistant/components/aladdin_connect/translations/cs.json +30 -1
  10. homeassistant/components/aladdin_connect/translations/et.json +30 -1
  11. homeassistant/components/aladdin_connect/translations/fr.json +10 -0
  12. homeassistant/components/aladdin_connect/translations/ga.json +30 -1
  13. homeassistant/components/aladdin_connect/translations/lt.json +30 -1
  14. homeassistant/components/aladdin_connect/translations/nl.json +28 -0
  15. homeassistant/components/aladdin_connect/translations/pt.json +30 -1
  16. homeassistant/components/aladdin_connect/translations/sk.json +30 -1
  17. homeassistant/components/aladdin_connect/translations/zh-Hans.json +30 -1
  18. homeassistant/components/aladdin_connect/translations/zh-Hant.json +30 -1
  19. homeassistant/components/alarm_control_panel/translations/cs.json +3 -3
  20. homeassistant/components/alexa_devices/__init__.py +1 -1
  21. homeassistant/components/alexa_devices/const.py +9 -9
  22. homeassistant/components/alexa_devices/sensor.py +3 -0
  23. homeassistant/components/alexa_devices/translations/lt.json +7 -0
  24. homeassistant/components/alexa_devices/translations/pt.json +11 -0
  25. homeassistant/components/alexa_devices/translations/sk.json +20 -20
  26. homeassistant/components/asuswrt/manifest.json +1 -1
  27. homeassistant/components/august/translations/lt.json +23 -1
  28. homeassistant/components/august/translations/pt.json +26 -1
  29. homeassistant/components/backup/translations/de.json +1 -1
  30. homeassistant/components/bayesian/strings.json +1 -1
  31. homeassistant/components/bayesian/translations/cs.json +1 -1
  32. homeassistant/components/bayesian/translations/de.json +17 -17
  33. homeassistant/components/bayesian/translations/en-GB.json +1 -1
  34. homeassistant/components/bayesian/translations/en.json +3 -3
  35. homeassistant/components/bayesian/translations/et.json +1 -1
  36. homeassistant/components/bayesian/translations/fr.json +41 -0
  37. homeassistant/components/bayesian/translations/ga.json +8 -3
  38. homeassistant/components/bayesian/translations/lt.json +200 -0
  39. homeassistant/components/bayesian/translations/pl.json +7 -0
  40. homeassistant/components/bayesian/translations/pt.json +257 -0
  41. homeassistant/components/bayesian/translations/sk.json +5 -5
  42. homeassistant/components/bayesian/translations/zh-Hans.json +1 -1
  43. homeassistant/components/bayesian/translations/zh-Hant.json +1 -1
  44. homeassistant/components/bluetooth/manifest.json +2 -2
  45. homeassistant/components/bring/translations/sk.json +1 -1
  46. homeassistant/components/button/translations/ru.json +1 -1
  47. homeassistant/components/cover/translations/mk.json +13 -5
  48. homeassistant/components/cover/translations/pl.json +1 -1
  49. homeassistant/components/deconz/translations/ga.json +14 -0
  50. homeassistant/components/downloader/translations/sk.json +1 -1
  51. homeassistant/components/dsmr/translations/ga.json +8 -0
  52. homeassistant/components/dwd_weather_warnings/translations/sk.json +1 -1
  53. homeassistant/components/ecovacs/manifest.json +1 -1
  54. homeassistant/components/enphase_envoy/translations/lt.json +6 -0
  55. homeassistant/components/eq3btsmart/manifest.json +1 -1
  56. homeassistant/components/esphome/manifest.json +2 -2
  57. homeassistant/components/esphome/translations/sk.json +1 -1
  58. homeassistant/components/flux_led/translations/sk.json +1 -1
  59. homeassistant/components/frontend/manifest.json +1 -1
  60. homeassistant/components/fully_kiosk/translations/fr.json +5 -0
  61. homeassistant/components/fully_kiosk/translations/lt.json +3 -0
  62. homeassistant/components/fully_kiosk/translations/pt.json +3 -0
  63. homeassistant/components/fyta/translations/fr.json +3 -0
  64. homeassistant/components/fyta/translations/lt.json +64 -2
  65. homeassistant/components/fyta/translations/pt.json +64 -2
  66. homeassistant/components/google_assistant_sdk/translations/sk.json +1 -1
  67. homeassistant/components/google_generative_ai_conversation/translations/cs.json +3 -3
  68. homeassistant/components/google_generative_ai_conversation/translations/sk.json +1 -1
  69. homeassistant/components/google_mail/translations/sk.json +1 -1
  70. homeassistant/components/google_photos/translations/sk.json +1 -1
  71. homeassistant/components/google_sheets/translations/sk.json +1 -1
  72. homeassistant/components/google_tasks/translations/sk.json +1 -1
  73. homeassistant/components/govee_light_local/__init__.py +16 -3
  74. homeassistant/components/govee_light_local/config_flow.py +28 -10
  75. homeassistant/components/govee_light_local/coordinator.py +39 -24
  76. homeassistant/components/habitica/translations/cs.json +3 -3
  77. homeassistant/components/hassio/translations/sk.json +1 -1
  78. homeassistant/components/history_stats/translations/sk.json +3 -3
  79. homeassistant/components/home_connect/translations/sk.json +1 -1
  80. homeassistant/components/husqvarna_automower_ble/translations/cs.json +35 -1
  81. homeassistant/components/husqvarna_automower_ble/translations/lt.json +35 -1
  82. homeassistant/components/husqvarna_automower_ble/translations/pt.json +35 -1
  83. homeassistant/components/hyperion/translations/sk.json +1 -1
  84. homeassistant/components/iaqualink/__init__.py +10 -0
  85. homeassistant/components/iaqualink/entity.py +1 -0
  86. homeassistant/components/imeon_inverter/translations/lt.json +54 -0
  87. homeassistant/components/imeon_inverter/translations/pt.json +79 -0
  88. homeassistant/components/knx/translations/lt.json +245 -0
  89. homeassistant/components/knx/translations/pt.json +270 -0
  90. homeassistant/components/lg_thinq/translations/lt.json +3 -0
  91. homeassistant/components/lg_thinq/translations/pt.json +4 -0
  92. homeassistant/components/lock/translations/pl.json +1 -0
  93. homeassistant/components/logbook/translations/ko.json +2 -1
  94. homeassistant/components/lyric/translations/sk.json +1 -1
  95. homeassistant/components/mastodon/__init__.py +13 -2
  96. homeassistant/components/mastodon/config_flow.py +7 -2
  97. homeassistant/components/mastodon/diagnostics.py +8 -3
  98. homeassistant/components/matter/translations/lt.json +36 -0
  99. homeassistant/components/matter/translations/pt.json +27 -0
  100. homeassistant/components/media_player/translations/cs.json +5 -0
  101. homeassistant/components/media_player/translations/fr.json +3 -0
  102. homeassistant/components/media_player/translations/lt.json +4 -0
  103. homeassistant/components/media_player/translations/pt.json +5 -0
  104. homeassistant/components/media_player/translations/sk.json +1 -0
  105. homeassistant/components/media_player/translations/zh-Hans.json +1 -0
  106. homeassistant/components/media_player/translations/zh-Hant.json +1 -0
  107. homeassistant/components/meteo_france/const.py +1 -1
  108. homeassistant/components/metoffice/translations/sk.json +1 -1
  109. homeassistant/components/miele/translations/lt.json +12 -0
  110. homeassistant/components/miele/translations/pt.json +12 -0
  111. homeassistant/components/miele/translations/sk.json +8 -8
  112. homeassistant/components/modbus/translations/sk.json +1 -1
  113. homeassistant/components/mqtt/translations/cs.json +52 -0
  114. homeassistant/components/mqtt/translations/fr.json +11 -0
  115. homeassistant/components/mqtt/translations/lt.json +47 -0
  116. homeassistant/components/mqtt/translations/nl.json +68 -0
  117. homeassistant/components/mqtt/translations/pt.json +81 -0
  118. homeassistant/components/mqtt/translations/sk.json +8 -8
  119. homeassistant/components/mqtt/translations/zh-Hans.json +1 -0
  120. homeassistant/components/nest/translations/sk.json +2 -2
  121. homeassistant/components/nexia/manifest.json +1 -1
  122. homeassistant/components/nextdns/translations/lt.json +3 -0
  123. homeassistant/components/niko_home_control/translations/lt.json +10 -1
  124. homeassistant/components/niko_home_control/translations/pt.json +10 -1
  125. homeassistant/components/ollama/translations/cs.json +3 -3
  126. homeassistant/components/onewire/translations/lt.json +3 -0
  127. homeassistant/components/onvif/binary_sensor.py +1 -1
  128. homeassistant/components/onvif/sensor.py +1 -1
  129. homeassistant/components/open_router/translations/cs.json +2 -2
  130. homeassistant/components/openai_conversation/translations/cs.json +3 -3
  131. homeassistant/components/opower/translations/sk.json +1 -1
  132. homeassistant/components/playstation_network/__init__.py +4 -1
  133. homeassistant/components/playstation_network/config_flow.py +4 -13
  134. homeassistant/components/playstation_network/coordinator.py +55 -8
  135. homeassistant/components/playstation_network/helpers.py +4 -1
  136. homeassistant/components/playstation_network/notify.py +52 -27
  137. homeassistant/components/playstation_network/strings.json +11 -5
  138. homeassistant/components/playstation_network/translations/bg.json +0 -5
  139. homeassistant/components/playstation_network/translations/cs.json +5 -5
  140. homeassistant/components/playstation_network/translations/de.json +5 -5
  141. homeassistant/components/playstation_network/translations/en-GB.json +5 -5
  142. homeassistant/components/playstation_network/translations/en.json +5 -5
  143. homeassistant/components/playstation_network/translations/es.json +1 -13
  144. homeassistant/components/playstation_network/translations/et.json +0 -17
  145. homeassistant/components/playstation_network/translations/fr.json +1 -1
  146. homeassistant/components/playstation_network/translations/ga.json +0 -17
  147. homeassistant/components/playstation_network/translations/it.json +1 -1
  148. homeassistant/components/playstation_network/translations/lt.json +0 -17
  149. homeassistant/components/playstation_network/translations/pt.json +5 -5
  150. homeassistant/components/playstation_network/translations/sk.json +0 -17
  151. homeassistant/components/playstation_network/translations/zh-Hans.json +0 -17
  152. homeassistant/components/playstation_network/translations/zh-Hant.json +5 -5
  153. homeassistant/components/pooldose/translations/lt.json +102 -0
  154. homeassistant/components/pooldose/translations/nl.json +7 -2
  155. homeassistant/components/pooldose/translations/pt.json +102 -0
  156. homeassistant/components/profiler/translations/cs.json +2 -2
  157. homeassistant/components/qbus/translations/lt.json +8 -0
  158. homeassistant/components/recorder/translations/cs.json +2 -2
  159. homeassistant/components/remember_the_milk/translations/cs.json +7 -7
  160. homeassistant/components/reolink/manifest.json +1 -1
  161. homeassistant/components/reolink/number.py +3 -4
  162. homeassistant/components/reolink/select.py +0 -1
  163. homeassistant/components/reolink/translations/fr.json +3 -0
  164. homeassistant/components/reolink/translations/pt.json +9 -0
  165. homeassistant/components/roborock/translations/sk.json +9 -9
  166. homeassistant/components/sensor/translations/sk.json +1 -1
  167. homeassistant/components/sleep_as_android/translations/de.json +1 -1
  168. homeassistant/components/snapcast/translations/sk.json +2 -2
  169. homeassistant/components/sonos/translations/lt.json +12 -0
  170. homeassistant/components/sonos/translations/pt.json +15 -0
  171. homeassistant/components/sun/translations/sk.json +1 -1
  172. homeassistant/components/switchbot_cloud/translations/lt.json +16 -0
  173. homeassistant/components/switchbot_cloud/translations/pt.json +16 -0
  174. homeassistant/components/tautulli/translations/sk.json +1 -1
  175. homeassistant/components/template/translations/lt.json +102 -0
  176. homeassistant/components/template/translations/pl.json +140 -7
  177. homeassistant/components/template/translations/pt.json +149 -0
  178. homeassistant/components/template/translations/sk.json +6 -6
  179. homeassistant/components/togrill/translations/fr.json +4 -0
  180. homeassistant/components/togrill/translations/lt.json +30 -0
  181. homeassistant/components/togrill/translations/pt.json +49 -0
  182. homeassistant/components/tts/translations/cs.json +1 -1
  183. homeassistant/components/tuya/translations/pl.json +1 -1
  184. homeassistant/components/velux/translations/cs.json +7 -0
  185. homeassistant/components/velux/translations/lt.json +7 -0
  186. homeassistant/components/velux/translations/nl.json +7 -0
  187. homeassistant/components/velux/translations/pt.json +7 -0
  188. homeassistant/components/volvo/translations/lt.json +128 -0
  189. homeassistant/components/volvo/translations/pt.json +137 -0
  190. homeassistant/components/volvo/translations/sk.json +1 -1
  191. homeassistant/components/wallbox/translations/sk.json +1 -1
  192. homeassistant/components/withings/translations/sk.json +1 -1
  193. homeassistant/components/yolink/translations/pt.json +13 -0
  194. homeassistant/components/zha/translations/fr.json +48 -0
  195. homeassistant/components/zha/translations/lt.json +63 -0
  196. homeassistant/components/zha/translations/pl.json +3 -0
  197. homeassistant/components/zha/translations/pt.json +69 -0
  198. homeassistant/components/zha/translations/sk.json +3 -3
  199. homeassistant/components/zwave_js/binary_sensor.py +14 -6
  200. homeassistant/components/zwave_js/translations/lt.json +10 -0
  201. homeassistant/components/zwave_js/translations/pt.json +10 -0
  202. homeassistant/components/zwave_js/translations/sk.json +2 -2
  203. homeassistant/components/zwave_me/translations/sk.json +1 -1
  204. homeassistant/const.py +1 -1
  205. homeassistant/helpers/device_registry.py +37 -14
  206. homeassistant/helpers/entity_registry.py +68 -29
  207. homeassistant/package_constraints.txt +7 -3
  208. {homeassistant-2025.9.0b0.dist-info → homeassistant-2025.9.0b1.dist-info}/METADATA +1 -1
  209. {homeassistant-2025.9.0b0.dist-info → homeassistant-2025.9.0b1.dist-info}/RECORD +214 -210
  210. {homeassistant-2025.9.0b0.dist-info → homeassistant-2025.9.0b1.dist-info}/WHEEL +0 -0
  211. {homeassistant-2025.9.0b0.dist-info → homeassistant-2025.9.0b1.dist-info}/entry_points.txt +0 -0
  212. {homeassistant-2025.9.0b0.dist-info → homeassistant-2025.9.0b1.dist-info}/licenses/LICENSE.md +0 -0
  213. {homeassistant-2025.9.0b0.dist-info → homeassistant-2025.9.0b1.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
  214. {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 (mimo)"
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 \"Install code\").",
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) \"1\" a Warning Mode (V\u00fdstra\u017en\u00fd re\u017eim) \"0\" (\"Stop\"), aktivuje sa iba 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. \n\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 \"{file_path}\" \n\n'<'a href=\"{file_url}\" download=\"{file_name}\"'>'Stiahnu\u0165 s\u00fabor z\u00e1lohy'<'/a'>'",
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 Submit. Konfigura\u010dn\u00e1 polo\u017eka si bude pam\u00e4ta\u0165 ID nov\u00e9ho adapt\u00e9ra.",
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: URL: {add_on_url}\nToken: {local_token}\n\nPr\u00edklad pripojenia k Z-Way v lok\u00e1lnej sieti: URL: {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: URL: {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)."
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 = "0b0"
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
- disabled_by = self.disabled_by
487
- if config_entry.disabled_by:
488
- if disabled_by is None:
489
- disabled_by = DeviceEntryDisabler.CONFIG_ENTRY
490
- elif disabled_by == DeviceEntryDisabler.CONFIG_ENTRY:
491
- disabled_by = None
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"] = None
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(device["disabled_by"])
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(converter=_protect_entity_options)
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"] = None
588
- entity["hidden_by"] = None
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
- disabled_by = deleted_entity.disabled_by
962
- # Adjust disabled_by based on config entry state
963
- if config_entry and config_entry is not UNDEFINED:
964
- if config_entry.disabled_by:
965
- if disabled_by is None:
966
- disabled_by = RegistryEntryDisabler.CONFIG_ENTRY
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
- hidden_by = deleted_entity.hidden_by
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
- options = deleted_entity.options
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(entity["disabled_by"])
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(entity["hidden_by"])
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"],