homeassistant 2025.7.0b0__py3-none-any.whl → 2025.7.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/aemet/sensor.py +1 -1
- homeassistant/components/airq/coordinator.py +2 -2
- homeassistant/components/alexa_devices/__init__.py +5 -2
- homeassistant/components/alexa_devices/notify.py +2 -0
- homeassistant/components/alexa_devices/quality_scale.yaml +1 -1
- homeassistant/components/alexa_devices/strings.json +11 -4
- homeassistant/components/alexa_devices/switch.py +2 -0
- homeassistant/components/alexa_devices/translations/bg.json +6 -4
- homeassistant/components/alexa_devices/translations/cs.json +0 -4
- homeassistant/components/alexa_devices/translations/de.json +6 -7
- homeassistant/components/alexa_devices/translations/el.json +4 -5
- homeassistant/components/alexa_devices/translations/en.json +12 -5
- homeassistant/components/alexa_devices/translations/es.json +0 -4
- homeassistant/components/alexa_devices/translations/et.json +4 -5
- homeassistant/components/alexa_devices/translations/ga.json +0 -6
- homeassistant/components/alexa_devices/translations/he.json +0 -4
- homeassistant/components/alexa_devices/translations/hu.json +0 -4
- homeassistant/components/alexa_devices/translations/id.json +1 -0
- homeassistant/components/alexa_devices/translations/lt.json +0 -4
- homeassistant/components/alexa_devices/translations/mk.json +12 -0
- homeassistant/components/alexa_devices/translations/nl.json +0 -4
- homeassistant/components/alexa_devices/translations/pl.json +0 -4
- homeassistant/components/alexa_devices/translations/pt.json +0 -4
- homeassistant/components/alexa_devices/translations/ru.json +4 -5
- homeassistant/components/alexa_devices/translations/sk.json +4 -5
- homeassistant/components/alexa_devices/translations/sv.json +17 -5
- homeassistant/components/alexa_devices/translations/tr.json +0 -4
- homeassistant/components/alexa_devices/translations/zh-Hans.json +15 -4
- homeassistant/components/alexa_devices/translations/zh-Hant.json +4 -5
- homeassistant/components/alexa_devices/utils.py +40 -0
- homeassistant/components/altruist/translations/id.json +11 -0
- homeassistant/components/anthropic/__init__.py +8 -1
- homeassistant/components/anthropic/translations/bg.json +21 -0
- homeassistant/components/anthropic/translations/ga.json +32 -1
- homeassistant/components/anthropic/translations/id.json +19 -0
- homeassistant/components/anthropic/translations/ru.json +30 -0
- homeassistant/components/buienradar/sensor.py +0 -1
- homeassistant/components/cambridge_audio/translations/sv.json +1 -1
- homeassistant/components/demo/translations/select.sv.json +2 -2
- homeassistant/components/derivative/translations/ga.json +20 -0
- homeassistant/components/derivative/translations/ru.json +3 -0
- homeassistant/components/devolo_home_control/translations/bg.json +6 -0
- homeassistant/components/devolo_home_control/translations/id.json +5 -0
- homeassistant/components/devolo_home_control/translations/sv.json +10 -0
- homeassistant/components/devolo_home_control/translations/zh-Hans.json +10 -0
- homeassistant/components/dlink/manifest.json +1 -1
- homeassistant/components/ecovacs/translations/sv.json +1 -1
- homeassistant/components/enphase_envoy/translations/sv.json +2 -2
- homeassistant/components/ezviz/translations/bg.json +6 -0
- homeassistant/components/ezviz/translations/mk.json +13 -0
- homeassistant/components/ezviz/translations/sv.json +10 -0
- homeassistant/components/ezviz/translations/zh-Hans.json +10 -0
- homeassistant/components/frontend/manifest.json +1 -1
- homeassistant/components/goodwe/translations/sv.json +5 -5
- homeassistant/components/google_generative_ai_conversation/__init__.py +15 -0
- homeassistant/components/google_generative_ai_conversation/config_flow.py +72 -36
- homeassistant/components/google_generative_ai_conversation/const.py +15 -2
- homeassistant/components/google_generative_ai_conversation/diagnostics.py +1 -0
- homeassistant/components/google_generative_ai_conversation/entity.py +7 -2
- homeassistant/components/google_generative_ai_conversation/helpers.py +73 -0
- homeassistant/components/google_generative_ai_conversation/strings.json +28 -1
- homeassistant/components/google_generative_ai_conversation/translations/bg.json +19 -0
- homeassistant/components/google_generative_ai_conversation/translations/de.json +28 -0
- homeassistant/components/google_generative_ai_conversation/translations/el.json +28 -0
- homeassistant/components/google_generative_ai_conversation/translations/en.json +28 -0
- homeassistant/components/google_generative_ai_conversation/translations/es.json +28 -0
- homeassistant/components/google_generative_ai_conversation/translations/et.json +28 -0
- homeassistant/components/google_generative_ai_conversation/translations/ga.json +9 -0
- homeassistant/components/google_generative_ai_conversation/translations/id.json +30 -0
- homeassistant/components/google_generative_ai_conversation/translations/mk.json +11 -0
- homeassistant/components/google_generative_ai_conversation/translations/ru.json +67 -0
- homeassistant/components/google_generative_ai_conversation/translations/sk.json +28 -0
- homeassistant/components/google_generative_ai_conversation/translations/sv.json +21 -0
- homeassistant/components/google_generative_ai_conversation/translations/zh-Hans.json +28 -0
- homeassistant/components/google_generative_ai_conversation/translations/zh-Hant.json +28 -0
- homeassistant/components/google_generative_ai_conversation/tts.py +48 -106
- homeassistant/components/group/translations/el.json +18 -18
- homeassistant/components/habitica/const.py +1 -1
- homeassistant/components/harmony/translations/select.sv.json +1 -1
- homeassistant/components/harmony/translations/sv.json +1 -1
- homeassistant/components/homeassistant_hardware/translations/ga.json +9 -0
- homeassistant/components/homeassistant_hardware/translations/mk.json +9 -0
- homeassistant/components/homeassistant_sky_connect/translations/ga.json +10 -0
- homeassistant/components/homeassistant_sky_connect/translations/mk.json +7 -0
- homeassistant/components/homeassistant_yellow/translations/ga.json +5 -0
- homeassistant/components/homewizard/translations/sv.json +3 -1
- homeassistant/components/http/auth.py +1 -1
- homeassistant/components/image/__init__.py +34 -3
- homeassistant/components/input_select/translations/sv.json +6 -6
- homeassistant/components/iron_os/translations/sv.json +1 -1
- homeassistant/components/keenetic_ndms2/translations/id.json +3 -0
- homeassistant/components/lamarzocco/translations/sv.json +3 -3
- homeassistant/components/lametric/translations/sv.json +2 -2
- homeassistant/components/lametric/update.py +1 -1
- homeassistant/components/lg_thinq/translations/sv.json +5 -5
- homeassistant/components/litterrobot/translations/bg.json +4 -0
- homeassistant/components/litterrobot/translations/ga.json +3 -0
- homeassistant/components/matter/translations/id.json +5 -0
- homeassistant/components/matter/vacuum.py +38 -26
- homeassistant/components/meater/__init__.py +5 -1
- homeassistant/components/meater/coordinator.py +4 -2
- homeassistant/components/media_source/local_source.py +21 -4
- homeassistant/components/mqtt/translations/bg.json +10 -0
- homeassistant/components/mqtt/translations/el.json +21 -0
- homeassistant/components/mqtt/translations/fi.json +3 -0
- homeassistant/components/mqtt/translations/ga.json +25 -0
- homeassistant/components/mqtt/translations/mk.json +23 -0
- homeassistant/components/mqtt/translations/ru.json +1 -0
- homeassistant/components/mqtt/translations/sv.json +24 -0
- homeassistant/components/mqtt/translations/zh-Hans.json +26 -0
- homeassistant/components/mqtt/translations/zh-Hant.json +19 -0
- homeassistant/components/music_assistant/button.py +0 -6
- homeassistant/components/ntfy/translations/id.json +13 -0
- homeassistant/components/ohme/translations/sv.json +1 -1
- homeassistant/components/ollama/__init__.py +2 -0
- homeassistant/components/ollama/const.py +2 -0
- homeassistant/components/ollama/translations/bg.json +19 -0
- homeassistant/components/ollama/translations/ga.json +31 -1
- homeassistant/components/ollama/translations/id.json +18 -0
- homeassistant/components/ollama/translations/mk.json +13 -1
- homeassistant/components/onewire/translations/sv.json +4 -4
- homeassistant/components/openai_conversation/__init__.py +2 -0
- homeassistant/components/openai_conversation/const.py +1 -1
- homeassistant/components/openai_conversation/conversation.py +1 -1
- homeassistant/components/openai_conversation/translations/bg.json +26 -0
- homeassistant/components/openai_conversation/translations/id.json +23 -0
- homeassistant/components/openai_conversation/translations/mk.json +44 -0
- homeassistant/components/playstation_network/translations/bg.json +25 -1
- homeassistant/components/playstation_network/translations/es.json +1 -1
- homeassistant/components/playstation_network/translations/ga.json +31 -0
- homeassistant/components/playstation_network/translations/id.json +14 -0
- homeassistant/components/playstation_network/translations/mk.json +18 -0
- homeassistant/components/playstation_network/translations/sv.json +29 -0
- homeassistant/components/playstation_network/translations/zh-Hans.json +29 -0
- homeassistant/components/qnap/translations/sv.json +1 -1
- homeassistant/components/remote_calendar/translations/fi.json +34 -0
- homeassistant/components/select/translations/sv.json +10 -10
- homeassistant/components/smarla/__init__.py +2 -2
- homeassistant/components/sonos/translations/bg.json +5 -0
- homeassistant/components/sonos/translations/el.json +6 -0
- homeassistant/components/sonos/translations/ga.json +8 -0
- homeassistant/components/sonos/translations/mk.json +10 -0
- homeassistant/components/sonos/translations/ru.json +6 -0
- homeassistant/components/sonos/translations/sv.json +6 -0
- homeassistant/components/sonos/translations/zh-Hans.json +9 -0
- homeassistant/components/sonos/translations/zh-Hant.json +6 -0
- homeassistant/components/switchbot/translations/bg.json +26 -0
- homeassistant/components/switchbot/translations/ga.json +33 -0
- homeassistant/components/switchbot/translations/id.json +19 -0
- homeassistant/components/switchbot/translations/mk.json +49 -0
- homeassistant/components/switchbot/translations/sv.json +52 -0
- homeassistant/components/switchbot/translations/zh-Hans.json +53 -0
- homeassistant/components/telegram_bot/__init__.py +20 -4
- homeassistant/components/telegram_bot/bot.py +33 -29
- homeassistant/components/telegram_bot/config_flow.py +49 -10
- homeassistant/components/telegram_bot/const.py +1 -1
- homeassistant/components/telegram_bot/strings.json +33 -10
- homeassistant/components/telegram_bot/translations/bg.json +0 -1
- homeassistant/components/telegram_bot/translations/cs.json +5 -12
- homeassistant/components/telegram_bot/translations/de.json +12 -11
- homeassistant/components/telegram_bot/translations/el.json +5 -12
- homeassistant/components/telegram_bot/translations/en-GB.json +5 -12
- homeassistant/components/telegram_bot/translations/en.json +35 -12
- homeassistant/components/telegram_bot/translations/es.json +5 -12
- homeassistant/components/telegram_bot/translations/et.json +11 -12
- homeassistant/components/telegram_bot/translations/fr.json +5 -12
- homeassistant/components/telegram_bot/translations/ga.json +5 -11
- homeassistant/components/telegram_bot/translations/he.json +3 -8
- homeassistant/components/telegram_bot/translations/hu.json +5 -12
- homeassistant/components/telegram_bot/translations/id.json +0 -5
- homeassistant/components/telegram_bot/translations/it.json +2 -5
- homeassistant/components/telegram_bot/translations/lt.json +5 -12
- homeassistant/components/telegram_bot/translations/mk.json +7 -5
- homeassistant/components/telegram_bot/translations/nl.json +5 -12
- homeassistant/components/telegram_bot/translations/pt.json +5 -12
- homeassistant/components/telegram_bot/translations/ru.json +12 -11
- homeassistant/components/telegram_bot/translations/sk.json +5 -12
- homeassistant/components/telegram_bot/translations/sv.json +5 -12
- homeassistant/components/telegram_bot/translations/tr.json +5 -12
- homeassistant/components/telegram_bot/translations/zh-Hans.json +5 -12
- homeassistant/components/telegram_bot/translations/zh-Hant.json +5 -12
- homeassistant/components/template/translations/sv.json +5 -5
- homeassistant/components/tilt_pi/translations/id.json +11 -0
- homeassistant/components/tts/__init__.py +15 -0
- homeassistant/components/unifiprotect/translations/zh-Hans.json +3 -3
- homeassistant/components/utility_meter/translations/sv.json +9 -9
- homeassistant/components/vegehub/translations/bg.json +2 -0
- homeassistant/components/vegehub/translations/id.json +11 -0
- homeassistant/components/whirlpool/translations/sv.json +12 -12
- homeassistant/components/zha/translations/bg.json +23 -0
- homeassistant/components/zha/translations/el.json +10 -0
- homeassistant/components/zha/translations/ga.json +20 -0
- homeassistant/components/zha/translations/id.json +6 -0
- homeassistant/components/zha/translations/sv.json +15 -0
- homeassistant/components/zha/translations/zh-Hans.json +50 -0
- homeassistant/components/zwave_js/api.py +1 -1
- homeassistant/components/zwave_js/config_flow.py +12 -8
- homeassistant/components/zwave_js/manifest.json +1 -1
- homeassistant/config_entries.py +6 -0
- homeassistant/const.py +1 -1
- homeassistant/package_constraints.txt +1 -1
- {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/METADATA +1 -1
- {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/RECORD +208 -192
- {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/WHEEL +0 -0
- {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/entry_points.txt +0 -0
- {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/licenses/LICENSE.md +0 -0
- {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
- {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/top_level.txt +0 -0
|
@@ -83,6 +83,9 @@
|
|
|
83
83
|
"announce_media_error": {
|
|
84
84
|
"message": "\u64ad\u62a5\u7247\u6bb5 {media_id} \u5931\u8d25 {response}"
|
|
85
85
|
},
|
|
86
|
+
"entity_not_found": {
|
|
87
|
+
"message": "\u672a\u627e\u5230\u5b9e\u4f53 {entity_id} \u3002"
|
|
88
|
+
},
|
|
86
89
|
"invalid_content_type": {
|
|
87
90
|
"message": "Sonos \u4e0d\u652f\u6301\u5a92\u4f53\u5185\u5bb9\u7c7b\u578b\uff1a{media_type}"
|
|
88
91
|
},
|
|
@@ -94,6 +97,12 @@
|
|
|
94
97
|
},
|
|
95
98
|
"invalid_sonos_playlist": {
|
|
96
99
|
"message": "\u627e\u4e0d\u5230 Sonos \u64ad\u653e\u5217\u8868\uff1a{name}"
|
|
100
|
+
},
|
|
101
|
+
"speaker_not_found": {
|
|
102
|
+
"message": "{entity_id} \u4e0d\u662f\u5df2\u77e5\u7684 Sonos \u626c\u58f0\u5668\u3002"
|
|
103
|
+
},
|
|
104
|
+
"timeout_join": {
|
|
105
|
+
"message": "\u7b49\u5f85 Sonos \u64ad\u653e\u5668\u52a0\u5165\u7fa4\u7ec4\u201c{group_description}\u201d\u65f6\u8d85\u65f6"
|
|
97
106
|
}
|
|
98
107
|
},
|
|
99
108
|
"issues": {
|
|
@@ -83,6 +83,9 @@
|
|
|
83
83
|
"announce_media_error": {
|
|
84
84
|
"message": "\u516c\u544a\u526a\u8f2f {media_id} \u5931\u6557 {response}"
|
|
85
85
|
},
|
|
86
|
+
"entity_not_found": {
|
|
87
|
+
"message": "\u627e\u4e0d\u5230\u5be6\u9ad4 {entity_id}"
|
|
88
|
+
},
|
|
86
89
|
"invalid_content_type": {
|
|
87
90
|
"message": "Sonos \u4e0d\u652f\u63f4\u5a92\u9ad4\u5167\u5bb9\u985e\u578b\uff1a{media_type}"
|
|
88
91
|
},
|
|
@@ -95,6 +98,9 @@
|
|
|
95
98
|
"invalid_sonos_playlist": {
|
|
96
99
|
"message": "\u627e\u4e0d\u5230 Sonos \u64ad\u653e\u5217\u8868\uff1a {name}"
|
|
97
100
|
},
|
|
101
|
+
"speaker_not_found": {
|
|
102
|
+
"message": "{entity_id} \u4e26\u975e\u5df2\u77e5 Sonos \u63da\u8072\u5668\u3002"
|
|
103
|
+
},
|
|
98
104
|
"timeout_join": {
|
|
99
105
|
"message": "\u7b49\u5f85 Sonos \u64ad\u653e\u5668\u52a0\u5165\u7fa4\u7d44 {group_description} \u6642\u903e\u6642"
|
|
100
106
|
}
|
|
@@ -101,6 +101,15 @@
|
|
|
101
101
|
}
|
|
102
102
|
},
|
|
103
103
|
"humidifier": {
|
|
104
|
+
"evaporative_humidifier": {
|
|
105
|
+
"state_attributes": {
|
|
106
|
+
"mode": {
|
|
107
|
+
"state": {
|
|
108
|
+
"auto": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e"
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
},
|
|
104
113
|
"humidifier": {
|
|
105
114
|
"state_attributes": {
|
|
106
115
|
"last_run_success": {
|
|
@@ -112,6 +121,20 @@
|
|
|
112
121
|
}
|
|
113
122
|
}
|
|
114
123
|
},
|
|
124
|
+
"light": {
|
|
125
|
+
"light": {
|
|
126
|
+
"state_attributes": {
|
|
127
|
+
"effect": {
|
|
128
|
+
"state": {
|
|
129
|
+
"autumn": "\u0415\u0441\u0435\u043d",
|
|
130
|
+
"christmas": "\u041a\u043e\u043b\u0435\u0434\u0430",
|
|
131
|
+
"forest": "\u0413\u043e\u0440\u0430",
|
|
132
|
+
"ocean": "\u041e\u043a\u0435\u0430\u043d"
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
},
|
|
115
138
|
"lock": {
|
|
116
139
|
"lock": {
|
|
117
140
|
"state_attributes": {
|
|
@@ -131,6 +154,9 @@
|
|
|
131
154
|
"light_level": {
|
|
132
155
|
"name": "\u041d\u0438\u0432\u043e \u043d\u0430 \u043e\u0441\u0432\u0435\u0442\u0435\u043d\u043e\u0441\u0442"
|
|
133
156
|
},
|
|
157
|
+
"water_level": {
|
|
158
|
+
"name": "\u041d\u0438\u0432\u043e \u043d\u0430 \u0432\u043e\u0434\u0430\u0442\u0430"
|
|
159
|
+
},
|
|
134
160
|
"wifi_signal": {
|
|
135
161
|
"name": "Wi-Fi \u0441\u0438\u0433\u043d\u0430\u043b"
|
|
136
162
|
}
|
|
@@ -54,6 +54,39 @@
|
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
},
|
|
57
|
+
"humidifier": {
|
|
58
|
+
"evaporative_humidifier": {
|
|
59
|
+
"state_attributes": {
|
|
60
|
+
"mode": {
|
|
61
|
+
"state": {
|
|
62
|
+
"auto": "Uath",
|
|
63
|
+
"drying_filter": "Scagaire triom\u00fa",
|
|
64
|
+
"high": "Ard",
|
|
65
|
+
"low": "\u00cdseal",
|
|
66
|
+
"medium": "Me\u00e1nach"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
"light": {
|
|
73
|
+
"light": {
|
|
74
|
+
"state_attributes": {
|
|
75
|
+
"effect": {
|
|
76
|
+
"state": {
|
|
77
|
+
"autumn": "F\u00f3mhar",
|
|
78
|
+
"breathing": "An\u00e1l\u00fa",
|
|
79
|
+
"christmas": "Nollaig",
|
|
80
|
+
"colorful": "Ildaite",
|
|
81
|
+
"cool": "Fionnuar",
|
|
82
|
+
"fade": "C\u00e9imni\u00fa",
|
|
83
|
+
"flashing": "Ag splancadh",
|
|
84
|
+
"vitality": "Beocht"
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
},
|
|
57
90
|
"sensor": {
|
|
58
91
|
"aqi_quality_level": {
|
|
59
92
|
"name": "Leibh\u00e9al c\u00e1il\u00edochta aeir",
|
|
@@ -84,6 +84,18 @@
|
|
|
84
84
|
}
|
|
85
85
|
},
|
|
86
86
|
"humidifier": {
|
|
87
|
+
"evaporative_humidifier": {
|
|
88
|
+
"state_attributes": {
|
|
89
|
+
"mode": {
|
|
90
|
+
"state": {
|
|
91
|
+
"auto": "Otomatis",
|
|
92
|
+
"high": "Tinggi",
|
|
93
|
+
"low": "Rendah",
|
|
94
|
+
"medium": "Sedang"
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
},
|
|
87
99
|
"humidifier": {
|
|
88
100
|
"state_attributes": {
|
|
89
101
|
"last_run_success": {
|
|
@@ -114,6 +126,13 @@
|
|
|
114
126
|
"light_level": {
|
|
115
127
|
"name": "Tingkat ringan"
|
|
116
128
|
},
|
|
129
|
+
"water_level": {
|
|
130
|
+
"state": {
|
|
131
|
+
"high": "Tinggi",
|
|
132
|
+
"low": "Rendah",
|
|
133
|
+
"medium": "Sedang"
|
|
134
|
+
}
|
|
135
|
+
},
|
|
117
136
|
"wifi_signal": {
|
|
118
137
|
"name": "Sinyal Wi-Fi"
|
|
119
138
|
}
|
|
@@ -12,6 +12,49 @@
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
},
|
|
15
|
+
"humidifier": {
|
|
16
|
+
"evaporative_humidifier": {
|
|
17
|
+
"state_attributes": {
|
|
18
|
+
"mode": {
|
|
19
|
+
"state": {
|
|
20
|
+
"drying_filter": "\u0424\u0438\u043b\u0442\u0435\u0440 \u0437\u0430 \u0441\u0443\u0448\u0435\u045a\u0435",
|
|
21
|
+
"quiet": "\u0422\u0438\u0432\u043a\u043e",
|
|
22
|
+
"sleep": "\u0421\u043f\u0438\u0435",
|
|
23
|
+
"target_humidity": "\u0426\u0435\u043b\u043d\u0430 \u0432\u043b\u0430\u0436\u043d\u043e\u0441\u0442"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"light": {
|
|
30
|
+
"light": {
|
|
31
|
+
"state_attributes": {
|
|
32
|
+
"effect": {
|
|
33
|
+
"state": {
|
|
34
|
+
"autumn": "\u0415\u0441\u0435\u043d",
|
|
35
|
+
"breathing": "\u0414\u0438\u0448\u0435\u045a\u0435",
|
|
36
|
+
"christmas": "\u0411\u043e\u0436\u0438\u045c",
|
|
37
|
+
"colorful": "\u0428\u0430\u0440\u0435\u043d\u0438",
|
|
38
|
+
"cool": "\u041a\u0443\u043b",
|
|
39
|
+
"fade": "\u0418\u0437\u0431\u043b\u0435\u0434\u0443\u0432\u0430\u045a\u0435",
|
|
40
|
+
"flashing": "\u0422\u0440\u0435\u043f\u043a\u0430\u045a\u0435",
|
|
41
|
+
"flickering": "\u0422\u0440\u0435\u043f\u0435\u0440\u0435\u045a\u0435",
|
|
42
|
+
"flow": "\u0422\u0435\u043a",
|
|
43
|
+
"forest": "\u0428\u0443\u043c\u0430",
|
|
44
|
+
"halloween": "\u041d\u043e\u045c\u0442\u0430 \u043d\u0430 \u0432\u0435\u0448\u0442\u0435\u0440\u043a\u0438\u0442\u0435",
|
|
45
|
+
"modern": "\u041c\u043e\u0434\u0435\u0440\u0435\u043d",
|
|
46
|
+
"ocean": "\u041e\u043a\u0435\u0430\u043d",
|
|
47
|
+
"relax": "\u0420\u0435\u043b\u0430\u043a\u0441\u0438\u0440\u0430\u0458\u0442\u0435 \u0441\u0435",
|
|
48
|
+
"rose": "\u0420\u043e\u0437\u0430",
|
|
49
|
+
"smooth": "\u041c\u0430\u0437\u043d\u043e",
|
|
50
|
+
"strobe": "\u0421\u0442\u0440\u043e\u0431\u043e\u0441\u043a\u043e\u043f",
|
|
51
|
+
"sunset": "\u0417\u0430\u0458\u0434\u0438\u0441\u043e\u043d\u0446\u0435",
|
|
52
|
+
"vitality": "\u0412\u0438\u0442\u0430\u043b\u043d\u043e\u0441\u0442"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
15
58
|
"sensor": {
|
|
16
59
|
"aqi_quality_level": {
|
|
17
60
|
"name": "\u041d\u0438\u0432\u043e \u043d\u0430 \u043a\u0432\u0430\u043b\u0438\u0442\u0435\u0442 \u043d\u0430 \u0432\u043e\u0437\u0434\u0443\u0445",
|
|
@@ -21,6 +64,12 @@
|
|
|
21
64
|
"moderate": "\u0423\u043c\u0435\u0440\u0435\u043d\u043e",
|
|
22
65
|
"unhealthy": "\u041d\u0435\u0437\u0434\u0440\u0430\u0432\u043e"
|
|
23
66
|
}
|
|
67
|
+
},
|
|
68
|
+
"water_level": {
|
|
69
|
+
"name": "\u041d\u0438\u0432\u043e \u043d\u0430 \u0432\u043e\u0434\u0430\u0442\u0430",
|
|
70
|
+
"state": {
|
|
71
|
+
"empty": "\u041f\u0440\u0430\u0437\u043d\u043e"
|
|
72
|
+
}
|
|
24
73
|
}
|
|
25
74
|
}
|
|
26
75
|
}
|
|
@@ -135,6 +135,22 @@
|
|
|
135
135
|
}
|
|
136
136
|
},
|
|
137
137
|
"humidifier": {
|
|
138
|
+
"evaporative_humidifier": {
|
|
139
|
+
"state_attributes": {
|
|
140
|
+
"mode": {
|
|
141
|
+
"state": {
|
|
142
|
+
"auto": "Auto",
|
|
143
|
+
"drying_filter": "Torkfilter",
|
|
144
|
+
"high": "H\u00f6g",
|
|
145
|
+
"low": "L\u00e5g",
|
|
146
|
+
"medium": "Medel",
|
|
147
|
+
"quiet": "Tyst",
|
|
148
|
+
"sleep": "Sova",
|
|
149
|
+
"target_humidity": "M\u00e5lluftfuktighet"
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
},
|
|
138
154
|
"humidifier": {
|
|
139
155
|
"state_attributes": {
|
|
140
156
|
"last_run_success": {
|
|
@@ -146,6 +162,33 @@
|
|
|
146
162
|
}
|
|
147
163
|
}
|
|
148
164
|
},
|
|
165
|
+
"light": {
|
|
166
|
+
"light": {
|
|
167
|
+
"state_attributes": {
|
|
168
|
+
"effect": {
|
|
169
|
+
"state": {
|
|
170
|
+
"autumn": "H\u00f6st",
|
|
171
|
+
"christmas": "Jul",
|
|
172
|
+
"colorful": "F\u00e4rgstark",
|
|
173
|
+
"cool": "Sval",
|
|
174
|
+
"fade": "Tona",
|
|
175
|
+
"flashing": "Blinkande",
|
|
176
|
+
"flickering": "Flimrande",
|
|
177
|
+
"flow": "Fl\u00f6de",
|
|
178
|
+
"forest": "Skog",
|
|
179
|
+
"halloween": "Halloween",
|
|
180
|
+
"modern": "Modern",
|
|
181
|
+
"ocean": "Hav",
|
|
182
|
+
"relax": "Koppla av",
|
|
183
|
+
"smooth": "Mjukt",
|
|
184
|
+
"strobe": "Stroboskop",
|
|
185
|
+
"sunset": "Solnedg\u00e5ng",
|
|
186
|
+
"vitality": "Vitalitet"
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
},
|
|
149
192
|
"lock": {
|
|
150
193
|
"lock": {
|
|
151
194
|
"state_attributes": {
|
|
@@ -174,6 +217,15 @@
|
|
|
174
217
|
"light_level": {
|
|
175
218
|
"name": "Ljusniv\u00e5"
|
|
176
219
|
},
|
|
220
|
+
"water_level": {
|
|
221
|
+
"name": "Vattenniv\u00e5",
|
|
222
|
+
"state": {
|
|
223
|
+
"empty": "Tom",
|
|
224
|
+
"high": "H\u00f6g",
|
|
225
|
+
"low": "L\u00e5g",
|
|
226
|
+
"medium": "Medel"
|
|
227
|
+
}
|
|
228
|
+
},
|
|
177
229
|
"wifi_signal": {
|
|
178
230
|
"name": "Wi-Fi-signal"
|
|
179
231
|
}
|
|
@@ -135,6 +135,22 @@
|
|
|
135
135
|
}
|
|
136
136
|
},
|
|
137
137
|
"humidifier": {
|
|
138
|
+
"evaporative_humidifier": {
|
|
139
|
+
"state_attributes": {
|
|
140
|
+
"mode": {
|
|
141
|
+
"state": {
|
|
142
|
+
"auto": "\u81ea\u52a8",
|
|
143
|
+
"drying_filter": "\u5e72\u71e5\u8fc7\u6ee4\u5668",
|
|
144
|
+
"high": "\u9ad8",
|
|
145
|
+
"low": "\u4f4e",
|
|
146
|
+
"medium": "\u4e2d",
|
|
147
|
+
"quiet": "\u5b89\u9759",
|
|
148
|
+
"sleep": "\u7761\u7720",
|
|
149
|
+
"target_humidity": "\u76ee\u6807\u6e7f\u5ea6"
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
},
|
|
138
154
|
"humidifier": {
|
|
139
155
|
"state_attributes": {
|
|
140
156
|
"last_run_success": {
|
|
@@ -146,6 +162,35 @@
|
|
|
146
162
|
}
|
|
147
163
|
}
|
|
148
164
|
},
|
|
165
|
+
"light": {
|
|
166
|
+
"light": {
|
|
167
|
+
"state_attributes": {
|
|
168
|
+
"effect": {
|
|
169
|
+
"state": {
|
|
170
|
+
"autumn": "\u79cb\u5b63",
|
|
171
|
+
"breathing": "\u547c\u5438",
|
|
172
|
+
"christmas": "\u5723\u8bde\u8282",
|
|
173
|
+
"colorful": "\u591a\u5f69",
|
|
174
|
+
"cool": "\u51c9\u723d",
|
|
175
|
+
"fade": "\u6de1\u5316",
|
|
176
|
+
"flashing": "\u95ea\u5149",
|
|
177
|
+
"flickering": "\u95ea\u70c1",
|
|
178
|
+
"flow": "\u6d41\u52a8",
|
|
179
|
+
"forest": "\u68ee\u6797",
|
|
180
|
+
"halloween": "\u4e07\u5723\u8282",
|
|
181
|
+
"modern": "\u73b0\u4ee3",
|
|
182
|
+
"ocean": "\u6d77\u6d0b",
|
|
183
|
+
"relax": "\u653e\u677e",
|
|
184
|
+
"rose": "\u73ab\u7470",
|
|
185
|
+
"smooth": "\u987a\u6ed1",
|
|
186
|
+
"strobe": "\u9891\u95ea",
|
|
187
|
+
"sunset": "\u65e5\u843d",
|
|
188
|
+
"vitality": "\u6d3b\u529b"
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
},
|
|
149
194
|
"lock": {
|
|
150
195
|
"lock": {
|
|
151
196
|
"state_attributes": {
|
|
@@ -174,6 +219,14 @@
|
|
|
174
219
|
"light_level": {
|
|
175
220
|
"name": "\u706f\u5149\u7ea7\u522b"
|
|
176
221
|
},
|
|
222
|
+
"water_level": {
|
|
223
|
+
"name": "\u6c34\u4f4d",
|
|
224
|
+
"state": {
|
|
225
|
+
"high": "\u9ad8",
|
|
226
|
+
"low": "\u4f4e",
|
|
227
|
+
"medium": "\u4e2d"
|
|
228
|
+
}
|
|
229
|
+
},
|
|
177
230
|
"wifi_signal": {
|
|
178
231
|
"name": "Wi-Fi\u4fe1\u53f7"
|
|
179
232
|
}
|
|
@@ -29,6 +29,7 @@ from homeassistant.core import (
|
|
|
29
29
|
from homeassistant.exceptions import (
|
|
30
30
|
ConfigEntryAuthFailed,
|
|
31
31
|
ConfigEntryNotReady,
|
|
32
|
+
HomeAssistantError,
|
|
32
33
|
ServiceValidationError,
|
|
33
34
|
)
|
|
34
35
|
from homeassistant.helpers import config_validation as cv
|
|
@@ -390,9 +391,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
|
|
|
390
391
|
elif msgtype == SERVICE_DELETE_MESSAGE:
|
|
391
392
|
await notify_service.delete_message(context=service.context, **kwargs)
|
|
392
393
|
elif msgtype == SERVICE_LEAVE_CHAT:
|
|
393
|
-
|
|
394
|
-
context=service.context, **kwargs
|
|
395
|
-
)
|
|
394
|
+
await notify_service.leave_chat(context=service.context, **kwargs)
|
|
396
395
|
elif msgtype == SERVICE_SET_MESSAGE_REACTION:
|
|
397
396
|
await notify_service.set_message_reaction(context=service.context, **kwargs)
|
|
398
397
|
else:
|
|
@@ -400,12 +399,29 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
|
|
|
400
399
|
msgtype, context=service.context, **kwargs
|
|
401
400
|
)
|
|
402
401
|
|
|
403
|
-
if service.return_response and messages:
|
|
402
|
+
if service.return_response and messages is not None:
|
|
403
|
+
target: list[int] | None = service.data.get(ATTR_TARGET)
|
|
404
|
+
if not target:
|
|
405
|
+
target = notify_service.get_target_chat_ids(None)
|
|
406
|
+
|
|
407
|
+
failed_chat_ids = [chat_id for chat_id in target if chat_id not in messages]
|
|
408
|
+
if failed_chat_ids:
|
|
409
|
+
raise HomeAssistantError(
|
|
410
|
+
f"Failed targets: {failed_chat_ids}",
|
|
411
|
+
translation_domain=DOMAIN,
|
|
412
|
+
translation_key="failed_chat_ids",
|
|
413
|
+
translation_placeholders={
|
|
414
|
+
"chat_ids": ", ".join([str(i) for i in failed_chat_ids]),
|
|
415
|
+
"bot_name": config_entry.title,
|
|
416
|
+
},
|
|
417
|
+
)
|
|
418
|
+
|
|
404
419
|
return {
|
|
405
420
|
"chats": [
|
|
406
421
|
{"chat_id": cid, "message_id": mid} for cid, mid in messages.items()
|
|
407
422
|
]
|
|
408
423
|
}
|
|
424
|
+
|
|
409
425
|
return None
|
|
410
426
|
|
|
411
427
|
# Register notification services
|
|
@@ -287,24 +287,32 @@ class TelegramNotificationService:
|
|
|
287
287
|
inline_message_id = msg_data["inline_message_id"]
|
|
288
288
|
return message_id, inline_message_id
|
|
289
289
|
|
|
290
|
-
def
|
|
290
|
+
def get_target_chat_ids(self, target: int | list[int] | None) -> list[int]:
|
|
291
291
|
"""Validate chat_id targets or return default target (first).
|
|
292
292
|
|
|
293
293
|
:param target: optional list of integers ([12234, -12345])
|
|
294
294
|
:return list of chat_id targets (integers)
|
|
295
295
|
"""
|
|
296
296
|
allowed_chat_ids: list[int] = self._get_allowed_chat_ids()
|
|
297
|
-
|
|
298
|
-
if target is
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
297
|
+
|
|
298
|
+
if target is None:
|
|
299
|
+
return [allowed_chat_ids[0]]
|
|
300
|
+
|
|
301
|
+
chat_ids = [target] if isinstance(target, int) else target
|
|
302
|
+
valid_chat_ids = [
|
|
303
|
+
chat_id for chat_id in chat_ids if chat_id in allowed_chat_ids
|
|
304
|
+
]
|
|
305
|
+
if not valid_chat_ids:
|
|
306
|
+
raise ServiceValidationError(
|
|
307
|
+
"Invalid chat IDs",
|
|
308
|
+
translation_domain=DOMAIN,
|
|
309
|
+
translation_key="invalid_chat_ids",
|
|
310
|
+
translation_placeholders={
|
|
311
|
+
"chat_ids": ", ".join(str(chat_id) for chat_id in chat_ids),
|
|
312
|
+
"bot_name": self.config.title,
|
|
313
|
+
},
|
|
306
314
|
)
|
|
307
|
-
return
|
|
315
|
+
return valid_chat_ids
|
|
308
316
|
|
|
309
317
|
def _get_msg_kwargs(self, data: dict[str, Any]) -> dict[str, Any]:
|
|
310
318
|
"""Get parameters in message data kwargs."""
|
|
@@ -414,9 +422,9 @@ class TelegramNotificationService:
|
|
|
414
422
|
"""Send one message."""
|
|
415
423
|
try:
|
|
416
424
|
out = await func_send(*args_msg, **kwargs_msg)
|
|
417
|
-
if
|
|
425
|
+
if isinstance(out, Message):
|
|
418
426
|
chat_id = out.chat_id
|
|
419
|
-
message_id = out
|
|
427
|
+
message_id = out.message_id
|
|
420
428
|
self._last_message_id[chat_id] = message_id
|
|
421
429
|
_LOGGER.debug(
|
|
422
430
|
"Last message ID: %s (from chat_id %s)",
|
|
@@ -424,7 +432,7 @@ class TelegramNotificationService:
|
|
|
424
432
|
chat_id,
|
|
425
433
|
)
|
|
426
434
|
|
|
427
|
-
event_data = {
|
|
435
|
+
event_data: dict[str, Any] = {
|
|
428
436
|
ATTR_CHAT_ID: chat_id,
|
|
429
437
|
ATTR_MESSAGEID: message_id,
|
|
430
438
|
}
|
|
@@ -437,10 +445,6 @@ class TelegramNotificationService:
|
|
|
437
445
|
self.hass.bus.async_fire(
|
|
438
446
|
EVENT_TELEGRAM_SENT, event_data, context=context
|
|
439
447
|
)
|
|
440
|
-
elif not isinstance(out, bool):
|
|
441
|
-
_LOGGER.warning(
|
|
442
|
-
"Update last message: out_type:%s, out=%s", type(out), out
|
|
443
|
-
)
|
|
444
448
|
except TelegramError as exc:
|
|
445
449
|
_LOGGER.error(
|
|
446
450
|
"%s: %s. Args: %s, kwargs: %s", msg_error, exc, args_msg, kwargs_msg
|
|
@@ -460,7 +464,7 @@ class TelegramNotificationService:
|
|
|
460
464
|
text = f"{title}\n{message}" if title else message
|
|
461
465
|
params = self._get_msg_kwargs(kwargs)
|
|
462
466
|
msg_ids = {}
|
|
463
|
-
for chat_id in self.
|
|
467
|
+
for chat_id in self.get_target_chat_ids(target):
|
|
464
468
|
_LOGGER.debug("Send message in chat ID %s with params: %s", chat_id, params)
|
|
465
469
|
msg = await self._send_msg(
|
|
466
470
|
self.bot.send_message,
|
|
@@ -488,7 +492,7 @@ class TelegramNotificationService:
|
|
|
488
492
|
**kwargs: dict[str, Any],
|
|
489
493
|
) -> bool:
|
|
490
494
|
"""Delete a previously sent message."""
|
|
491
|
-
chat_id = self.
|
|
495
|
+
chat_id = self.get_target_chat_ids(chat_id)[0]
|
|
492
496
|
message_id, _ = self._get_msg_ids(kwargs, chat_id)
|
|
493
497
|
_LOGGER.debug("Delete message %s in chat ID %s", message_id, chat_id)
|
|
494
498
|
deleted: bool = await self._send_msg(
|
|
@@ -513,7 +517,7 @@ class TelegramNotificationService:
|
|
|
513
517
|
**kwargs: dict[str, Any],
|
|
514
518
|
) -> Any:
|
|
515
519
|
"""Edit a previously sent message."""
|
|
516
|
-
chat_id = self.
|
|
520
|
+
chat_id = self.get_target_chat_ids(chat_id)[0]
|
|
517
521
|
message_id, inline_message_id = self._get_msg_ids(kwargs, chat_id)
|
|
518
522
|
params = self._get_msg_kwargs(kwargs)
|
|
519
523
|
_LOGGER.debug(
|
|
@@ -620,7 +624,7 @@ class TelegramNotificationService:
|
|
|
620
624
|
|
|
621
625
|
msg_ids = {}
|
|
622
626
|
if file_content:
|
|
623
|
-
for chat_id in self.
|
|
627
|
+
for chat_id in self.get_target_chat_ids(target):
|
|
624
628
|
_LOGGER.debug("Sending file to chat ID %s", chat_id)
|
|
625
629
|
|
|
626
630
|
if file_type == SERVICE_SEND_PHOTO:
|
|
@@ -738,7 +742,7 @@ class TelegramNotificationService:
|
|
|
738
742
|
|
|
739
743
|
msg_ids = {}
|
|
740
744
|
if stickerid:
|
|
741
|
-
for chat_id in self.
|
|
745
|
+
for chat_id in self.get_target_chat_ids(target):
|
|
742
746
|
msg = await self._send_msg(
|
|
743
747
|
self.bot.send_sticker,
|
|
744
748
|
"Error sending sticker",
|
|
@@ -769,7 +773,7 @@ class TelegramNotificationService:
|
|
|
769
773
|
longitude = float(longitude)
|
|
770
774
|
params = self._get_msg_kwargs(kwargs)
|
|
771
775
|
msg_ids = {}
|
|
772
|
-
for chat_id in self.
|
|
776
|
+
for chat_id in self.get_target_chat_ids(target):
|
|
773
777
|
_LOGGER.debug(
|
|
774
778
|
"Send location %s/%s to chat ID %s", latitude, longitude, chat_id
|
|
775
779
|
)
|
|
@@ -803,7 +807,7 @@ class TelegramNotificationService:
|
|
|
803
807
|
params = self._get_msg_kwargs(kwargs)
|
|
804
808
|
openperiod = kwargs.get(ATTR_OPEN_PERIOD)
|
|
805
809
|
msg_ids = {}
|
|
806
|
-
for chat_id in self.
|
|
810
|
+
for chat_id in self.get_target_chat_ids(target):
|
|
807
811
|
_LOGGER.debug("Send poll '%s' to chat ID %s", question, chat_id)
|
|
808
812
|
msg = await self._send_msg(
|
|
809
813
|
self.bot.send_poll,
|
|
@@ -826,12 +830,12 @@ class TelegramNotificationService:
|
|
|
826
830
|
|
|
827
831
|
async def leave_chat(
|
|
828
832
|
self,
|
|
829
|
-
chat_id:
|
|
833
|
+
chat_id: int | None = None,
|
|
830
834
|
context: Context | None = None,
|
|
831
835
|
**kwargs: dict[str, Any],
|
|
832
836
|
) -> Any:
|
|
833
837
|
"""Remove bot from chat."""
|
|
834
|
-
chat_id = self.
|
|
838
|
+
chat_id = self.get_target_chat_ids(chat_id)[0]
|
|
835
839
|
_LOGGER.debug("Leave from chat ID %s", chat_id)
|
|
836
840
|
return await self._send_msg(
|
|
837
841
|
self.bot.leave_chat, "Error leaving chat", None, chat_id, context=context
|
|
@@ -839,14 +843,14 @@ class TelegramNotificationService:
|
|
|
839
843
|
|
|
840
844
|
async def set_message_reaction(
|
|
841
845
|
self,
|
|
842
|
-
chat_id: int,
|
|
843
846
|
reaction: str,
|
|
847
|
+
chat_id: int | None = None,
|
|
844
848
|
is_big: bool = False,
|
|
845
849
|
context: Context | None = None,
|
|
846
850
|
**kwargs: dict[str, Any],
|
|
847
851
|
) -> None:
|
|
848
852
|
"""Set the bot's reaction for a given message."""
|
|
849
|
-
chat_id = self.
|
|
853
|
+
chat_id = self.get_target_chat_ids(chat_id)[0]
|
|
850
854
|
message_id, _ = self._get_msg_ids(kwargs, chat_id)
|
|
851
855
|
params = self._get_msg_kwargs(kwargs)
|
|
852
856
|
|