homeassistant 2025.12.0b5__py3-none-any.whl → 2025.12.0b8__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/airobot/translations/el.json +5 -1
- homeassistant/components/airobot/translations/en-GB.json +5 -1
- homeassistant/components/airobot/translations/lt.json +5 -1
- homeassistant/components/airobot/translations/sk.json +5 -1
- homeassistant/components/alarm_control_panel/translations/cs.json +3 -1
- homeassistant/components/alarm_control_panel/translations/de.json +1 -1
- homeassistant/components/alarm_control_panel/translations/en-GB.json +21 -7
- homeassistant/components/alarm_control_panel/translations/es.json +13 -7
- homeassistant/components/alarm_control_panel/translations/lt.json +21 -7
- homeassistant/components/alarm_control_panel/translations/sk.json +21 -7
- homeassistant/components/anglian_water/translations/en-GB.json +2 -1
- homeassistant/components/anglian_water/translations/lt.json +2 -1
- homeassistant/components/anglian_water/translations/sk.json +2 -1
- homeassistant/components/assist_satellite/manifest.json +1 -1
- homeassistant/components/assist_satellite/translations/en-GB.json +12 -4
- homeassistant/components/assist_satellite/translations/es.json +12 -4
- homeassistant/components/assist_satellite/translations/lt.json +12 -4
- homeassistant/components/assist_satellite/translations/sk.json +12 -4
- homeassistant/components/automation/manifest.json +2 -0
- homeassistant/components/automation/translations/en-GB.json +8 -0
- homeassistant/components/automation/translations/es.json +8 -0
- homeassistant/components/automation/translations/fr.json +8 -0
- homeassistant/components/automation/translations/lt.json +8 -0
- homeassistant/components/automation/translations/sk.json +8 -0
- homeassistant/components/binary_sensor/strings.json +4 -4
- homeassistant/components/binary_sensor/translations/de.json +3 -3
- homeassistant/components/binary_sensor/translations/en-GB.json +36 -1
- homeassistant/components/binary_sensor/translations/en.json +4 -4
- homeassistant/components/binary_sensor/translations/es.json +36 -1
- homeassistant/components/binary_sensor/translations/et.json +0 -4
- homeassistant/components/binary_sensor/translations/lt.json +36 -1
- homeassistant/components/binary_sensor/translations/sk.json +4 -4
- homeassistant/components/binary_sensor/translations/zh-Hant.json +3 -3
- homeassistant/components/binary_sensor/triggers.yaml +2 -2
- homeassistant/components/camera/__init__.py +1 -1
- homeassistant/components/climate/translations/en-GB.json +15 -5
- homeassistant/components/climate/translations/es.json +11 -5
- homeassistant/components/climate/translations/lt.json +15 -5
- homeassistant/components/climate/translations/sk.json +15 -5
- homeassistant/components/cloud/client.py +9 -5
- homeassistant/components/cloud/http_api.py +21 -0
- homeassistant/components/conversation/manifest.json +1 -1
- homeassistant/components/esphome/translations/lt.json +1 -0
- homeassistant/components/fan/translations/en-GB.json +6 -2
- homeassistant/components/fan/translations/es.json +2 -1
- homeassistant/components/fan/translations/lt.json +6 -2
- homeassistant/components/fan/translations/sk.json +6 -2
- homeassistant/components/google_air_quality/translations/en-GB.json +154 -1
- homeassistant/components/group/notify.py +28 -5
- homeassistant/components/hassio/const.py +1 -0
- homeassistant/components/hassio/strings.json +1 -1
- homeassistant/components/hassio/translations/cs.json +0 -1
- homeassistant/components/hassio/translations/de.json +1 -1
- homeassistant/components/hassio/translations/el.json +0 -1
- homeassistant/components/hassio/translations/en-GB.json +1 -1
- homeassistant/components/hassio/translations/en.json +1 -1
- homeassistant/components/hassio/translations/es.json +1 -1
- homeassistant/components/hassio/translations/et.json +0 -1
- homeassistant/components/hassio/translations/fr.json +0 -1
- homeassistant/components/hassio/translations/fy.json +0 -3
- homeassistant/components/hassio/translations/ga.json +0 -1
- homeassistant/components/hassio/translations/he.json +0 -1
- homeassistant/components/hassio/translations/id.json +0 -1
- homeassistant/components/hassio/translations/lt.json +1 -1
- homeassistant/components/hassio/translations/mk.json +0 -1
- homeassistant/components/hassio/translations/nl.json +0 -1
- homeassistant/components/hassio/translations/pt.json +0 -1
- homeassistant/components/hassio/translations/ru.json +0 -1
- homeassistant/components/hassio/translations/sk.json +1 -1
- homeassistant/components/hassio/translations/sv.json +0 -1
- homeassistant/components/hassio/translations/tr.json +0 -1
- homeassistant/components/hassio/translations/zh-Hans.json +0 -1
- homeassistant/components/hassio/translations/zh-Hant.json +1 -1
- homeassistant/components/homeassistant_connect_zbt2/config_flow.py +0 -17
- homeassistant/components/homeassistant_connect_zbt2/const.py +0 -58
- homeassistant/components/homeassistant_hardware/firmware_config_flow.py +0 -5
- homeassistant/components/hue_ble/translations/en-GB.json +2 -1
- homeassistant/components/hue_ble/translations/lt.json +2 -1
- homeassistant/components/hue_ble/translations/sk.json +2 -1
- homeassistant/components/iometer/manifest.json +1 -1
- homeassistant/components/lawn_mower/translations/en-GB.json +12 -4
- homeassistant/components/lawn_mower/translations/es.json +4 -4
- homeassistant/components/lawn_mower/translations/lt.json +12 -4
- homeassistant/components/lawn_mower/translations/sk.json +12 -4
- homeassistant/components/letpot/manifest.json +1 -1
- homeassistant/components/libre_hardware_monitor/coordinator.py +26 -18
- homeassistant/components/light/translations/en-GB.json +6 -2
- homeassistant/components/light/translations/es.json +2 -2
- homeassistant/components/light/translations/lt.json +6 -2
- homeassistant/components/light/translations/sk.json +6 -2
- homeassistant/components/media_player/translations/en-GB.json +3 -1
- homeassistant/components/media_player/translations/es.json +1 -1
- homeassistant/components/media_player/translations/lt.json +3 -1
- homeassistant/components/media_player/translations/sk.json +3 -1
- homeassistant/components/miele/translations/en-GB.json +1 -0
- homeassistant/components/miele/translations/lt.json +1 -0
- homeassistant/components/mqtt/translations/en-GB.json +3 -1
- homeassistant/components/mqtt/translations/es.json +1 -1
- homeassistant/components/mqtt/translations/lt.json +5 -1
- homeassistant/components/mqtt/translations/sk.json +3 -1
- homeassistant/components/music_assistant/__init__.py +2 -1
- homeassistant/components/music_assistant/config_flow.py +23 -5
- homeassistant/components/nest/manifest.json +1 -1
- homeassistant/components/nordpool/manifest.json +1 -1
- homeassistant/components/oralb/manifest.json +1 -0
- homeassistant/components/ping/helpers.py +1 -1
- homeassistant/components/plugwise/translations/en-GB.json +1 -1
- homeassistant/components/roborock/manifest.json +1 -1
- homeassistant/components/roborock/roborock_storage.py +29 -10
- homeassistant/components/tedee/manifest.json +1 -0
- homeassistant/components/text/translations/en-GB.json +7 -1
- homeassistant/components/text/translations/es.json +1 -1
- homeassistant/components/text/translations/lt.json +7 -1
- homeassistant/components/text/translations/sk.json +7 -1
- homeassistant/components/unifiprotect/translations/el.json +6 -0
- homeassistant/components/unifiprotect/translations/lt.json +10 -0
- homeassistant/components/vacuum/translations/en-GB.json +12 -4
- homeassistant/components/vacuum/translations/es.json +3 -3
- homeassistant/components/vacuum/translations/lt.json +12 -4
- homeassistant/components/vacuum/translations/sk.json +12 -4
- homeassistant/components/wled/config_flow.py +5 -1
- homeassistant/components/wled/coordinator.py +9 -0
- homeassistant/components/wled/strings.json +10 -2
- homeassistant/components/wled/translations/de.json +10 -2
- homeassistant/components/wled/translations/en-GB.json +10 -2
- homeassistant/components/wled/translations/en.json +10 -2
- homeassistant/components/wled/translations/es.json +10 -2
- homeassistant/components/wled/translations/lt.json +10 -2
- homeassistant/components/wled/translations/sk.json +10 -2
- homeassistant/components/wled/translations/zh-Hant.json +10 -2
- homeassistant/components/wled/update.py +1 -1
- homeassistant/components/zha/config_flow.py +2 -6
- homeassistant/components/zha/radio_manager.py +2 -2
- homeassistant/const.py +1 -1
- homeassistant/generated/integrations.json +2 -2
- homeassistant/generated/labs.py +2 -2
- homeassistant/package_constraints.txt +1 -1
- {homeassistant-2025.12.0b5.dist-info → homeassistant-2025.12.0b8.dist-info}/METADATA +1 -1
- {homeassistant-2025.12.0b5.dist-info → homeassistant-2025.12.0b8.dist-info}/RECORD +144 -144
- {homeassistant-2025.12.0b5.dist-info → homeassistant-2025.12.0b8.dist-info}/WHEEL +0 -0
- {homeassistant-2025.12.0b5.dist-info → homeassistant-2025.12.0b8.dist-info}/entry_points.txt +0 -0
- {homeassistant-2025.12.0b5.dist-info → homeassistant-2025.12.0b8.dist-info}/licenses/LICENSE.md +0 -0
- {homeassistant-2025.12.0b5.dist-info → homeassistant-2025.12.0b8.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
- {homeassistant-2025.12.0b5.dist-info → homeassistant-2025.12.0b8.dist-info}/top_level.txt +0 -0
|
@@ -508,7 +508,7 @@
|
|
|
508
508
|
"title": "Luz",
|
|
509
509
|
"triggers": {
|
|
510
510
|
"turned_off": {
|
|
511
|
-
"description": "Se dispara
|
|
511
|
+
"description": "Se dispara despu\u00e9s de que una o m\u00e1s luces se apagan.",
|
|
512
512
|
"fields": {
|
|
513
513
|
"behavior": {
|
|
514
514
|
"description": "El comportamiento de las luces objetivo para que se dispare.",
|
|
@@ -518,7 +518,7 @@
|
|
|
518
518
|
"name": "Luz apagada"
|
|
519
519
|
},
|
|
520
520
|
"turned_on": {
|
|
521
|
-
"description": "Se dispara
|
|
521
|
+
"description": "Se dispara despu\u00e9s de que una o m\u00e1s luces se encienden.",
|
|
522
522
|
"fields": {
|
|
523
523
|
"behavior": {
|
|
524
524
|
"description": "El comportamiento de las luces objetivo para que se dispare.",
|
|
@@ -509,20 +509,24 @@
|
|
|
509
509
|
"title": "Lempa",
|
|
510
510
|
"triggers": {
|
|
511
511
|
"turned_off": {
|
|
512
|
+
"description": "Suveikia u\u017egesus vienai ar kelioms lemput\u0117ms.",
|
|
512
513
|
"fields": {
|
|
513
514
|
"behavior": {
|
|
514
515
|
"description": "Tikslini\u0173 \u0161vies\u0173 \u012fjungimo elgsena.",
|
|
515
516
|
"name": "Elgesys"
|
|
516
517
|
}
|
|
517
|
-
}
|
|
518
|
+
},
|
|
519
|
+
"name": "\u0160viesa i\u0161jungta"
|
|
518
520
|
},
|
|
519
521
|
"turned_on": {
|
|
522
|
+
"description": "Suveikia \u012fsijungus vienai ar kelioms lemput\u0117ms.",
|
|
520
523
|
"fields": {
|
|
521
524
|
"behavior": {
|
|
522
525
|
"description": "Tikslini\u0173 \u0161vies\u0173 \u012fjungimo elgsena.",
|
|
523
526
|
"name": "Elgesys"
|
|
524
527
|
}
|
|
525
|
-
}
|
|
528
|
+
},
|
|
529
|
+
"name": "\u012ejungta \u0161viesa"
|
|
526
530
|
}
|
|
527
531
|
}
|
|
528
532
|
}
|
|
@@ -509,20 +509,24 @@
|
|
|
509
509
|
"title": "Svetlo",
|
|
510
510
|
"triggers": {
|
|
511
511
|
"turned_off": {
|
|
512
|
+
"description": "Spust\u00ed sa po zhasnut\u00ed jedn\u00e9ho alebo viacer\u00fdch svetiel.",
|
|
512
513
|
"fields": {
|
|
513
514
|
"behavior": {
|
|
514
515
|
"description": "Spr\u00e1vanie cie\u013eov\u00fdch svetiel pri spusten\u00ed.",
|
|
515
516
|
"name": "Spr\u00e1vanie"
|
|
516
517
|
}
|
|
517
|
-
}
|
|
518
|
+
},
|
|
519
|
+
"name": "Svetlo vypnut\u00e9"
|
|
518
520
|
},
|
|
519
521
|
"turned_on": {
|
|
522
|
+
"description": "Spust\u00ed sa po rozsvieten\u00ed jedn\u00e9ho alebo viacer\u00fdch svetiel.",
|
|
520
523
|
"fields": {
|
|
521
524
|
"behavior": {
|
|
522
525
|
"description": "Spr\u00e1vanie cie\u013eov\u00fdch svetiel pri spusten\u00ed.",
|
|
523
526
|
"name": "Spr\u00e1vanie"
|
|
524
527
|
}
|
|
525
|
-
}
|
|
528
|
+
},
|
|
529
|
+
"name": "Svetlo zapnut\u00e9"
|
|
526
530
|
}
|
|
527
531
|
}
|
|
528
532
|
}
|
|
@@ -381,12 +381,14 @@
|
|
|
381
381
|
"title": "Media player",
|
|
382
382
|
"triggers": {
|
|
383
383
|
"stopped_playing": {
|
|
384
|
+
"description": "Triggers after one or more media players stop playing media.",
|
|
384
385
|
"fields": {
|
|
385
386
|
"behavior": {
|
|
386
387
|
"description": "The behaviour of the targeted media players to trigger on.",
|
|
387
388
|
"name": "Behaviour"
|
|
388
389
|
}
|
|
389
|
-
}
|
|
390
|
+
},
|
|
391
|
+
"name": "Media player stopped playing"
|
|
390
392
|
}
|
|
391
393
|
}
|
|
392
394
|
}
|
|
@@ -381,7 +381,7 @@
|
|
|
381
381
|
"title": "Reproductor multimedia",
|
|
382
382
|
"triggers": {
|
|
383
383
|
"stopped_playing": {
|
|
384
|
-
"description": "Se dispara
|
|
384
|
+
"description": "Se dispara despu\u00e9s de que uno o m\u00e1s reproductores multimedia dejan de reproducir.",
|
|
385
385
|
"fields": {
|
|
386
386
|
"behavior": {
|
|
387
387
|
"description": "El comportamiento de los reproductores multimedia objetivo para que se dispare.",
|
|
@@ -381,12 +381,14 @@
|
|
|
381
381
|
"title": "Medijos leistuvas",
|
|
382
382
|
"triggers": {
|
|
383
383
|
"stopped_playing": {
|
|
384
|
+
"description": "Suveikia, kai vienas ar keli medijos leistuvai nustoja leisti medij\u0105.",
|
|
384
385
|
"fields": {
|
|
385
386
|
"behavior": {
|
|
386
387
|
"description": "Tikslini\u0173 medijos leistuv\u0173 elgsena, kada jie suveikia.",
|
|
387
388
|
"name": "Elgesys"
|
|
388
389
|
}
|
|
389
|
-
}
|
|
390
|
+
},
|
|
391
|
+
"name": "Medijos grotuvas nustojo groti"
|
|
390
392
|
}
|
|
391
393
|
}
|
|
392
394
|
}
|
|
@@ -381,12 +381,14 @@
|
|
|
381
381
|
"title": "Prehr\u00e1va\u010d m\u00e9di\u00ed",
|
|
382
382
|
"triggers": {
|
|
383
383
|
"stopped_playing": {
|
|
384
|
+
"description": "Spust\u00ed sa po tom, \u010do jeden alebo viacero prehr\u00e1va\u010dov m\u00e9di\u00ed prestane prehr\u00e1va\u0165 m\u00e9di\u00e1.",
|
|
384
385
|
"fields": {
|
|
385
386
|
"behavior": {
|
|
386
387
|
"description": "Spr\u00e1vanie cie\u013eov\u00fdch prehr\u00e1va\u010dov m\u00e9di\u00ed, ktor\u00e9 sa maj\u00fa spusti\u0165.",
|
|
387
388
|
"name": "Spr\u00e1vanie"
|
|
388
389
|
}
|
|
389
|
-
}
|
|
390
|
+
},
|
|
391
|
+
"name": "Prehr\u00e1va\u010d m\u00e9di\u00ed prestal prehr\u00e1va\u0165"
|
|
390
392
|
}
|
|
391
393
|
}
|
|
392
394
|
}
|
|
@@ -954,6 +954,7 @@
|
|
|
954
954
|
"extra_dry": "Extra dry",
|
|
955
955
|
"final_rinse": "Final rinse",
|
|
956
956
|
"finished": "Finished",
|
|
957
|
+
"flex_load_active": "FlexLoad active",
|
|
957
958
|
"freshen_up_and_moisten": "Freshen up & moisten",
|
|
958
959
|
"going_to_target_area": "Going to target area",
|
|
959
960
|
"grinding": "Grinding",
|
|
@@ -954,6 +954,7 @@
|
|
|
954
954
|
"extra_dry": "Ypa\u010d sausas",
|
|
955
955
|
"final_rinse": "Galutinis skalavimas",
|
|
956
956
|
"finished": "Baigta",
|
|
957
|
+
"flex_load_active": "FlexLoad aktyvus",
|
|
957
958
|
"freshen_up_and_moisten": "At\u0161vie\u017einkite ir sudr\u0117kinkite",
|
|
958
959
|
"going_to_target_area": "Va\u017eiuoja \u012f tikslin\u0119 zon\u0105",
|
|
959
960
|
"grinding": "\u0160lifavimas",
|
|
@@ -1562,6 +1562,7 @@
|
|
|
1562
1562
|
},
|
|
1563
1563
|
"triggers": {
|
|
1564
1564
|
"_": {
|
|
1565
|
+
"description": "Triggers after a specific message is received on a given MQTT topic.",
|
|
1565
1566
|
"fields": {
|
|
1566
1567
|
"payload": {
|
|
1567
1568
|
"description": "The payload to trigger on.",
|
|
@@ -1571,7 +1572,8 @@
|
|
|
1571
1572
|
"description": "MQTT topic to listen to.",
|
|
1572
1573
|
"name": "Topic"
|
|
1573
1574
|
}
|
|
1574
|
-
}
|
|
1575
|
+
},
|
|
1576
|
+
"name": "MQTT message received"
|
|
1575
1577
|
}
|
|
1576
1578
|
}
|
|
1577
1579
|
}
|
|
@@ -1562,7 +1562,7 @@
|
|
|
1562
1562
|
},
|
|
1563
1563
|
"triggers": {
|
|
1564
1564
|
"_": {
|
|
1565
|
-
"description": "Se dispara
|
|
1565
|
+
"description": "Se dispara despu\u00e9s de que se recibe un mensaje espec\u00edfico en un topic MQTT determinado.",
|
|
1566
1566
|
"fields": {
|
|
1567
1567
|
"payload": {
|
|
1568
1568
|
"description": "El payload en el que dispararse.",
|
|
@@ -729,6 +729,8 @@
|
|
|
729
729
|
"data_description": {
|
|
730
730
|
"payload_reset_percentage": "Specialus \u017einut\u0117s turinys, kuris, gautas procentin\u0117s b\u016bsenos temoje, atkuria ventiliatoriaus grei\u010dio procentin\u0117s b\u016bsenos atribut\u0105 \u012f ne\u017einom\u0105.",
|
|
731
731
|
"percentage_command_template": "[\u0160ablonas]( {command_templating_url} ), skirtas sudaryti nauding\u0105j\u0105 apkrov\u0105, kuri bus publikuojama procentin\u0117s dalies komandos temoje.",
|
|
732
|
+
"percentage_command_topic": "MQTT tema, skirta publikuoti komandas, skirtas ventiliatoriaus grei\u010dio b\u016bsenai keisti pagal procentin\u012f nustatym\u0105. Reik\u0161m\u0117 turi b\u016bti diapazone nuo \"grei\u010dio diapazonas min\" iki \"grei\u010dio diapazonas maks\". [Su\u017einokite daugiau.]({url}#procent\u0173_komandos_tema)",
|
|
733
|
+
"percentage_state_topic": "MQTT tema u\u017esiprenumeravo ventiliatoriaus grei\u010dio b\u016bsenos gavim\u0105. Tai reik\u0161m\u0117 diapazone nuo \"grei\u010dio diapazonas min\" iki \"grei\u010dio diapazonas maks\". [Su\u017einokite daugiau.]({url}#procentin\u0117_valstyb\u0117s_tema)",
|
|
732
734
|
"percentage_value_template": "Apibr\u0117\u017eia [template]( {value_templating_url} ), kad b\u016bt\u0173 i\u0161gauta grei\u010dio procentin\u0117 vert\u0117.",
|
|
733
735
|
"speed_range_max": "Skaitmenin\u0117s i\u0161vesties diapazono maksimumas (atitinka 100 %). Procentinis \u017eingsnis yra 100 / grei\u010di\u0173 skai\u010dius \u201egrei\u010di\u0173 diapazone\u201c.",
|
|
734
736
|
"speed_range_min": "Minimalus skaitinis i\u0161vesties diapazonas (i\u0161jungimas ne\u012ftrauktas, tod\u0117l speed_range_min - 1 rei\u0161kia 0 %). Procentinis \u017eingsnis yra 100 / grei\u010di\u0173 skai\u010dius \u201egrei\u010di\u0173 diapazone\u201c."
|
|
@@ -1560,6 +1562,7 @@
|
|
|
1560
1562
|
},
|
|
1561
1563
|
"triggers": {
|
|
1562
1564
|
"_": {
|
|
1565
|
+
"description": "Suveikia gavus konkret\u0173 prane\u0161im\u0105 tam tikra MQTT tema.",
|
|
1563
1566
|
"fields": {
|
|
1564
1567
|
"payload": {
|
|
1565
1568
|
"description": "\u017dinut\u0117s turinys, nuo kurio reikia suaktyvinti.",
|
|
@@ -1569,7 +1572,8 @@
|
|
|
1569
1572
|
"description": "MQTT tema, kurios verta klausytis.",
|
|
1570
1573
|
"name": "Tema"
|
|
1571
1574
|
}
|
|
1572
|
-
}
|
|
1575
|
+
},
|
|
1576
|
+
"name": "Gautas MQTT prane\u0161imas"
|
|
1573
1577
|
}
|
|
1574
1578
|
}
|
|
1575
1579
|
}
|
|
@@ -1562,6 +1562,7 @@
|
|
|
1562
1562
|
},
|
|
1563
1563
|
"triggers": {
|
|
1564
1564
|
"_": {
|
|
1565
|
+
"description": "Sp\u00fa\u0161\u0165a sa po prijat\u00ed konkr\u00e9tnej spr\u00e1vy na dan\u00fa t\u00e9mu MQTT.",
|
|
1565
1566
|
"fields": {
|
|
1566
1567
|
"payload": {
|
|
1567
1568
|
"description": "U\u017eito\u010dn\u00e9 za\u0165a\u017eenie, pri ktorom sa m\u00e1 spusti\u0165.",
|
|
@@ -1571,7 +1572,8 @@
|
|
|
1571
1572
|
"description": "T\u00e9ma MQTT na po\u010d\u00favanie.",
|
|
1572
1573
|
"name": "T\u00e9ma"
|
|
1573
1574
|
}
|
|
1574
|
-
}
|
|
1575
|
+
},
|
|
1576
|
+
"name": "Prijat\u00e1 spr\u00e1va MQTT"
|
|
1575
1577
|
}
|
|
1576
1578
|
}
|
|
1577
1579
|
}
|
|
@@ -18,6 +18,7 @@ from music_assistant_models.enums import EventType
|
|
|
18
18
|
from music_assistant_models.errors import (
|
|
19
19
|
ActionUnavailable,
|
|
20
20
|
AuthenticationFailed,
|
|
21
|
+
AuthenticationRequired,
|
|
21
22
|
InvalidToken,
|
|
22
23
|
MusicAssistantError,
|
|
23
24
|
)
|
|
@@ -99,7 +100,7 @@ async def async_setup_entry( # noqa: C901
|
|
|
99
100
|
translation_key="invalid_server_version",
|
|
100
101
|
)
|
|
101
102
|
raise ConfigEntryNotReady(f"Invalid server version: {err}") from err
|
|
102
|
-
except (AuthenticationFailed, InvalidToken) as err:
|
|
103
|
+
except (AuthenticationRequired, AuthenticationFailed, InvalidToken) as err:
|
|
103
104
|
raise ConfigEntryAuthFailed(
|
|
104
105
|
f"Authentication failed for {mass_url}: {err}"
|
|
105
106
|
) from err
|
|
@@ -17,7 +17,12 @@ from music_assistant_models.api import ServerInfoMessage
|
|
|
17
17
|
from music_assistant_models.errors import AuthenticationFailed, InvalidToken
|
|
18
18
|
import voluptuous as vol
|
|
19
19
|
|
|
20
|
-
from homeassistant.config_entries import
|
|
20
|
+
from homeassistant.config_entries import (
|
|
21
|
+
SOURCE_REAUTH,
|
|
22
|
+
ConfigEntryState,
|
|
23
|
+
ConfigFlow,
|
|
24
|
+
ConfigFlowResult,
|
|
25
|
+
)
|
|
21
26
|
from homeassistant.const import CONF_URL
|
|
22
27
|
from homeassistant.core import HomeAssistant
|
|
23
28
|
from homeassistant.helpers import aiohttp_client
|
|
@@ -165,10 +170,23 @@ class MusicAssistantConfigFlow(ConfigFlow, domain=DOMAIN):
|
|
|
165
170
|
self.token = discovery_info.config["auth_token"]
|
|
166
171
|
|
|
167
172
|
self.server_info = server_info
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
173
|
+
|
|
174
|
+
# Check if there's an existing entry
|
|
175
|
+
if entry := await self.async_set_unique_id(server_info.server_id):
|
|
176
|
+
# Update the entry with new URL and token
|
|
177
|
+
if self.hass.config_entries.async_update_entry(
|
|
178
|
+
entry, data={**entry.data, CONF_URL: self.url, CONF_TOKEN: self.token}
|
|
179
|
+
):
|
|
180
|
+
# Reload the entry if it's in a state that can be reloaded
|
|
181
|
+
if entry.state in (
|
|
182
|
+
ConfigEntryState.LOADED,
|
|
183
|
+
ConfigEntryState.SETUP_ERROR,
|
|
184
|
+
ConfigEntryState.SETUP_RETRY,
|
|
185
|
+
):
|
|
186
|
+
self.hass.config_entries.async_schedule_reload(entry.entry_id)
|
|
187
|
+
|
|
188
|
+
# Abort since entry already exists
|
|
189
|
+
return self.async_abort(reason="already_configured")
|
|
172
190
|
|
|
173
191
|
return await self.async_step_hassio_confirm()
|
|
174
192
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"codeowners": ["@gjohansson-ST"],
|
|
5
5
|
"config_flow": true,
|
|
6
6
|
"documentation": "https://www.home-assistant.io/integrations/nordpool",
|
|
7
|
-
"integration_type": "
|
|
7
|
+
"integration_type": "service",
|
|
8
8
|
"iot_class": "cloud_polling",
|
|
9
9
|
"loggers": ["pynordpool"],
|
|
10
10
|
"quality_scale": "platinum",
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"config_flow": true,
|
|
11
11
|
"dependencies": ["bluetooth_adapters"],
|
|
12
12
|
"documentation": "https://www.home-assistant.io/integrations/oralb",
|
|
13
|
+
"integration_type": "device",
|
|
13
14
|
"iot_class": "local_push",
|
|
14
15
|
"loggers": ["oralb_ble"],
|
|
15
16
|
"requirements": ["oralb-ble==0.17.6"]
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"""Roborock storage."""
|
|
2
2
|
|
|
3
|
-
import dataclasses
|
|
4
3
|
import logging
|
|
5
4
|
from pathlib import Path
|
|
6
5
|
import shutil
|
|
@@ -17,7 +16,7 @@ _LOGGER = logging.getLogger(__name__)
|
|
|
17
16
|
|
|
18
17
|
STORAGE_PATH = f".storage/{DOMAIN}"
|
|
19
18
|
MAPS_PATH = "maps"
|
|
20
|
-
CACHE_VERSION =
|
|
19
|
+
CACHE_VERSION = 2
|
|
21
20
|
|
|
22
21
|
|
|
23
22
|
def _storage_path_prefix(hass: HomeAssistant, entry_id: str) -> Path:
|
|
@@ -44,6 +43,31 @@ async def async_cleanup_map_storage(hass: HomeAssistant, entry_id: str) -> None:
|
|
|
44
43
|
await hass.async_add_executor_job(remove, path_prefix)
|
|
45
44
|
|
|
46
45
|
|
|
46
|
+
class StoreImpl(Store[dict[str, Any]]):
|
|
47
|
+
"""Store implementation for Roborock cache."""
|
|
48
|
+
|
|
49
|
+
def __init__(self, hass: HomeAssistant, entry_id: str) -> None:
|
|
50
|
+
"""Initialize StoreImpl."""
|
|
51
|
+
super().__init__(
|
|
52
|
+
hass,
|
|
53
|
+
version=CACHE_VERSION,
|
|
54
|
+
key=f"{DOMAIN}/{entry_id}",
|
|
55
|
+
private=True,
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
async def _async_migrate_func(
|
|
59
|
+
self,
|
|
60
|
+
old_major_version: int,
|
|
61
|
+
old_minor_version: int,
|
|
62
|
+
old_data: dict[str, Any],
|
|
63
|
+
) -> dict[str, Any]:
|
|
64
|
+
"""Wipe out old caches with the old format."""
|
|
65
|
+
if old_major_version == 1:
|
|
66
|
+
# No need for migration as version 1 was never in any stable releases
|
|
67
|
+
return {}
|
|
68
|
+
return old_data
|
|
69
|
+
|
|
70
|
+
|
|
47
71
|
class CacheStore(Cache):
|
|
48
72
|
"""Store and retrieve cache for a Roborock device.
|
|
49
73
|
|
|
@@ -55,19 +79,14 @@ class CacheStore(Cache):
|
|
|
55
79
|
|
|
56
80
|
def __init__(self, hass: HomeAssistant, entry_id: str) -> None:
|
|
57
81
|
"""Initialize CacheStore."""
|
|
58
|
-
self._cache_store =
|
|
59
|
-
hass,
|
|
60
|
-
version=CACHE_VERSION,
|
|
61
|
-
key=f"{DOMAIN}/{entry_id}",
|
|
62
|
-
private=True,
|
|
63
|
-
)
|
|
82
|
+
self._cache_store = StoreImpl(hass, entry_id)
|
|
64
83
|
self._cache_data: CacheData | None = None
|
|
65
84
|
|
|
66
85
|
async def get(self) -> CacheData:
|
|
67
86
|
"""Retrieve cached metadata."""
|
|
68
87
|
if self._cache_data is None:
|
|
69
88
|
if data := await self._cache_store.async_load():
|
|
70
|
-
self._cache_data = CacheData(
|
|
89
|
+
self._cache_data = CacheData.from_dict(data)
|
|
71
90
|
else:
|
|
72
91
|
self._cache_data = CacheData()
|
|
73
92
|
|
|
@@ -80,7 +99,7 @@ class CacheStore(Cache):
|
|
|
80
99
|
async def flush(self) -> None:
|
|
81
100
|
"""Flush cached metadata to disk."""
|
|
82
101
|
if self._cache_data is not None:
|
|
83
|
-
await self._cache_store.async_save(
|
|
102
|
+
await self._cache_store.async_save(self._cache_data.as_dict())
|
|
84
103
|
|
|
85
104
|
async def async_remove(self) -> None:
|
|
86
105
|
"""Remove cached metadata from disk."""
|
|
@@ -42,5 +42,11 @@
|
|
|
42
42
|
"name": "Nastaven\u00e1 hodnota"
|
|
43
43
|
}
|
|
44
44
|
},
|
|
45
|
-
"title": "Text"
|
|
45
|
+
"title": "Text",
|
|
46
|
+
"triggers": {
|
|
47
|
+
"changed": {
|
|
48
|
+
"description": "Sp\u00fa\u0161\u0165a sa po zmene jedn\u00e9ho alebo viacer\u00fdch textov.",
|
|
49
|
+
"name": "Text zmenen\u00fd"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
46
52
|
}
|
|
@@ -19,6 +19,9 @@
|
|
|
19
19
|
"password": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2",
|
|
20
20
|
"username": "\u039f\u03bd\u03bf\u03bc\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7"
|
|
21
21
|
},
|
|
22
|
+
"data_description": {
|
|
23
|
+
"api_key": "\u039a\u03bb\u03b5\u03b9\u03b4\u03af API \u03b3\u03b9\u03b1 \u03c4\u03bf\u03bd \u03c4\u03bf\u03c0\u03b9\u03ba\u03cc \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03c3\u03b1\u03c2."
|
|
24
|
+
},
|
|
22
25
|
"description": "\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf {name} ({ip_address}); \u0398\u03b1 \u03c7\u03c1\u03b5\u03b9\u03b1\u03c3\u03c4\u03b5\u03af\u03c4\u03b5 \u03ad\u03bd\u03b1\u03bd \u03c4\u03bf\u03c0\u03b9\u03ba\u03cc \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03c0\u03bf\u03c5 \u03ad\u03c7\u03b5\u03b9 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03b7\u03b8\u03b5\u03af \u03c3\u03c4\u03b7\u03bd \u03ba\u03bf\u03bd\u03c3\u03cc\u03bb\u03b1 UniFi OS \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5. \u039f\u03b9 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b5\u03c2 \u03c4\u03bf\u03c5 Ubiquiti Cloud \u03b4\u03b5\u03bd \u03b8\u03b1 \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03ae\u03c3\u03bf\u03c5\u03bd. \u0393\u03b9\u03b1 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2: {local_user_documentation_url}",
|
|
23
26
|
"title": "\u0391\u03bd\u03b1\u03ba\u03b1\u03bb\u03cd\u03c6\u03b8\u03b7\u03ba\u03b5 \u03c4\u03bf UniFi Protect"
|
|
24
27
|
},
|
|
@@ -30,6 +33,9 @@
|
|
|
30
33
|
"port": "\u0398\u03cd\u03c1\u03b1",
|
|
31
34
|
"username": "\u039f\u03bd\u03bf\u03bc\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7"
|
|
32
35
|
},
|
|
36
|
+
"data_description": {
|
|
37
|
+
"api_key": "\u039a\u03bb\u03b5\u03b9\u03b4\u03af API \u03b3\u03b9\u03b1 \u03c4\u03bf\u03bd \u03c4\u03bf\u03c0\u03b9\u03ba\u03cc \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03c3\u03b1\u03c2."
|
|
38
|
+
},
|
|
33
39
|
"description": "\u03a4\u03b1 \u03b4\u03b9\u03b1\u03c0\u03b9\u03c3\u03c4\u03b5\u03c5\u03c4\u03ae\u03c1\u03b9\u03ac \u03c3\u03b1\u03c2 \u03ae \u03c4\u03bf \u03ba\u03bb\u03b5\u03b9\u03b4\u03af API \u03c6\u03b1\u03af\u03bd\u03b5\u03c4\u03b1\u03b9 \u03bd\u03b1 \u03bb\u03b5\u03af\u03c0\u03bf\u03c5\u03bd \u03ae \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03ac\u03ba\u03c5\u03c1\u03b1. \u0393\u03b9\u03b1 \u03bf\u03b4\u03b7\u03b3\u03af\u03b5\u03c2 \u03c3\u03c7\u03b5\u03c4\u03b9\u03ba\u03ac \u03bc\u03b5 \u03c4\u03b7 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b5\u03bd\u03cc\u03c2 \u03c4\u03bf\u03c0\u03b9\u03ba\u03bf\u03cd \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03ae \u03c4\u03b7 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u03b5\u03bd\u03cc\u03c2 \u03bd\u03ad\u03bf\u03c5 \u03ba\u03bb\u03b5\u03b9\u03b4\u03b9\u03bf\u03cd API, \u03c0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b4\u03b5\u03af\u03c4\u03b5 \u03c4\u03b7\u03bd \u03c4\u03b5\u03ba\u03bc\u03b7\u03c1\u03af\u03c9\u03c3\u03b7: {local_user_documentation_url}",
|
|
34
40
|
"title": "\u0395\u03ba \u03bd\u03ad\u03bf\u03c5 \u03ad\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03b1\u03c2 UniFi Protect"
|
|
35
41
|
},
|
|
@@ -19,6 +19,9 @@
|
|
|
19
19
|
"password": "Slapta\u017eodis",
|
|
20
20
|
"username": "Naudotojo vardas"
|
|
21
21
|
},
|
|
22
|
+
"data_description": {
|
|
23
|
+
"api_key": "J\u016bs\u0173 vietin\u0117s vartotojo paskyros API raktas."
|
|
24
|
+
},
|
|
22
25
|
"description": "Ar norite nustatyti {name} ( {ip_address} )? Jums reik\u0117s vietinio vartotojo, sukurto UniFi OS konsol\u0117je, kad gal\u0117tum\u0117te prisijungti. Ubiquiti Cloud naudotojai neveiks. Daugiau informacijos: {local_user_documentation_url}",
|
|
23
26
|
"title": "Aptiktas UniFi Protect."
|
|
24
27
|
},
|
|
@@ -30,6 +33,10 @@
|
|
|
30
33
|
"port": "Prievadas",
|
|
31
34
|
"username": "Naudotojo vardas"
|
|
32
35
|
},
|
|
36
|
+
"data_description": {
|
|
37
|
+
"api_key": "J\u016bs\u0173 vietin\u0117s vartotojo paskyros API raktas.",
|
|
38
|
+
"username": "J\u016bs\u0173 vietin\u0117s (ne debesies) vartotojo paskyros vartotojo vardas."
|
|
39
|
+
},
|
|
33
40
|
"description": "Atrodo, kad tr\u016bksta j\u016bs\u0173 prisijungimo duomen\u0173 arba API rakto arba jie negalioja. Instrukcijas, kaip sukurti vietin\u012f vartotoj\u0105 arba sugeneruoti nauj\u0105 API rakt\u0105, rasite dokumentacijoje: {local_user_documentation_url}",
|
|
34
41
|
"title": "UniFi Protect reauth"
|
|
35
42
|
},
|
|
@@ -559,6 +566,9 @@
|
|
|
559
566
|
"exceptions": {
|
|
560
567
|
"api_key_required": {
|
|
561
568
|
"message": "Reikalingas API raktas. Nor\u0117dami pateikti API rakt\u0105, i\u0161 naujo autentifikuokite \u0161i\u0105 integracij\u0105."
|
|
569
|
+
},
|
|
570
|
+
"protect_version": {
|
|
571
|
+
"message": "J\u016bs\u0173 UniFi Protect versija ({current_version}) yra per sena. Reikalingas minimumas: {min_version}"
|
|
562
572
|
}
|
|
563
573
|
},
|
|
564
574
|
"issues": {
|
|
@@ -113,36 +113,44 @@
|
|
|
113
113
|
"title": "Vacuum",
|
|
114
114
|
"triggers": {
|
|
115
115
|
"docked": {
|
|
116
|
+
"description": "Triggers after one or more vacuums return to dock.",
|
|
116
117
|
"fields": {
|
|
117
118
|
"behavior": {
|
|
118
119
|
"description": "The behaviour of the targeted vacuum cleaners to trigger on.",
|
|
119
120
|
"name": "Behaviour"
|
|
120
121
|
}
|
|
121
|
-
}
|
|
122
|
+
},
|
|
123
|
+
"name": "Vacuum returned to dock"
|
|
122
124
|
},
|
|
123
125
|
"errored": {
|
|
126
|
+
"description": "Triggers after one or more vacuums encounter an error.",
|
|
124
127
|
"fields": {
|
|
125
128
|
"behavior": {
|
|
126
129
|
"description": "The behaviour of the targeted vacuum cleaners to trigger on.",
|
|
127
130
|
"name": "Behaviour"
|
|
128
131
|
}
|
|
129
|
-
}
|
|
132
|
+
},
|
|
133
|
+
"name": "Vacuum encountered an error"
|
|
130
134
|
},
|
|
131
135
|
"paused_cleaning": {
|
|
136
|
+
"description": "Triggers after one or more vacuums pause cleaning.",
|
|
132
137
|
"fields": {
|
|
133
138
|
"behavior": {
|
|
134
139
|
"description": "The behaviour of the targeted vacuum cleaners to trigger on.",
|
|
135
140
|
"name": "Behaviour"
|
|
136
141
|
}
|
|
137
|
-
}
|
|
142
|
+
},
|
|
143
|
+
"name": "Vacuum cleaner paused cleaning"
|
|
138
144
|
},
|
|
139
145
|
"started_cleaning": {
|
|
146
|
+
"description": "Triggers after one or more vacuums start cleaning.",
|
|
140
147
|
"fields": {
|
|
141
148
|
"behavior": {
|
|
142
149
|
"description": "The behaviour of the targeted vacuum cleaners to trigger on.",
|
|
143
150
|
"name": "Behaviour"
|
|
144
151
|
}
|
|
145
|
-
}
|
|
152
|
+
},
|
|
153
|
+
"name": "Vacuum cleaner started cleaning"
|
|
146
154
|
}
|
|
147
155
|
}
|
|
148
156
|
}
|
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
"title": "Aspiradora",
|
|
114
114
|
"triggers": {
|
|
115
115
|
"docked": {
|
|
116
|
-
"description": "Se dispara
|
|
116
|
+
"description": "Se dispara despu\u00e9s de que uno m\u00e1s robots aspiradores se acoplan a la base.",
|
|
117
117
|
"fields": {
|
|
118
118
|
"behavior": {
|
|
119
119
|
"description": "El comportamiento de los robots aspirador objetivo para que se dispare.",
|
|
@@ -123,7 +123,7 @@
|
|
|
123
123
|
"name": "El robot aspirador se acopl\u00f3 a la base"
|
|
124
124
|
},
|
|
125
125
|
"errored": {
|
|
126
|
-
"description": "Se dispara
|
|
126
|
+
"description": "Se dispara despu\u00e9s de que una o m\u00e1s robots aspiradores detectan un error.",
|
|
127
127
|
"fields": {
|
|
128
128
|
"behavior": {
|
|
129
129
|
"description": "El comportamiento de los robots aspirador objetivo para que se dispare.",
|
|
@@ -143,7 +143,7 @@
|
|
|
143
143
|
"name": "El robot aspirador dej\u00f3 de limpiar"
|
|
144
144
|
},
|
|
145
145
|
"started_cleaning": {
|
|
146
|
-
"description": "Se dispara despu\u00e9s de que uno o m\u00e1s robots aspiradores
|
|
146
|
+
"description": "Se dispara despu\u00e9s de que uno o m\u00e1s robots aspiradores empiezan a limpiar.",
|
|
147
147
|
"fields": {
|
|
148
148
|
"behavior": {
|
|
149
149
|
"description": "El comportamiento de los robots aspirador objetivo para que se dispare.",
|