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.
Files changed (208) hide show
  1. homeassistant/components/aemet/sensor.py +1 -1
  2. homeassistant/components/airq/coordinator.py +2 -2
  3. homeassistant/components/alexa_devices/__init__.py +5 -2
  4. homeassistant/components/alexa_devices/notify.py +2 -0
  5. homeassistant/components/alexa_devices/quality_scale.yaml +1 -1
  6. homeassistant/components/alexa_devices/strings.json +11 -4
  7. homeassistant/components/alexa_devices/switch.py +2 -0
  8. homeassistant/components/alexa_devices/translations/bg.json +6 -4
  9. homeassistant/components/alexa_devices/translations/cs.json +0 -4
  10. homeassistant/components/alexa_devices/translations/de.json +6 -7
  11. homeassistant/components/alexa_devices/translations/el.json +4 -5
  12. homeassistant/components/alexa_devices/translations/en.json +12 -5
  13. homeassistant/components/alexa_devices/translations/es.json +0 -4
  14. homeassistant/components/alexa_devices/translations/et.json +4 -5
  15. homeassistant/components/alexa_devices/translations/ga.json +0 -6
  16. homeassistant/components/alexa_devices/translations/he.json +0 -4
  17. homeassistant/components/alexa_devices/translations/hu.json +0 -4
  18. homeassistant/components/alexa_devices/translations/id.json +1 -0
  19. homeassistant/components/alexa_devices/translations/lt.json +0 -4
  20. homeassistant/components/alexa_devices/translations/mk.json +12 -0
  21. homeassistant/components/alexa_devices/translations/nl.json +0 -4
  22. homeassistant/components/alexa_devices/translations/pl.json +0 -4
  23. homeassistant/components/alexa_devices/translations/pt.json +0 -4
  24. homeassistant/components/alexa_devices/translations/ru.json +4 -5
  25. homeassistant/components/alexa_devices/translations/sk.json +4 -5
  26. homeassistant/components/alexa_devices/translations/sv.json +17 -5
  27. homeassistant/components/alexa_devices/translations/tr.json +0 -4
  28. homeassistant/components/alexa_devices/translations/zh-Hans.json +15 -4
  29. homeassistant/components/alexa_devices/translations/zh-Hant.json +4 -5
  30. homeassistant/components/alexa_devices/utils.py +40 -0
  31. homeassistant/components/altruist/translations/id.json +11 -0
  32. homeassistant/components/anthropic/__init__.py +8 -1
  33. homeassistant/components/anthropic/translations/bg.json +21 -0
  34. homeassistant/components/anthropic/translations/ga.json +32 -1
  35. homeassistant/components/anthropic/translations/id.json +19 -0
  36. homeassistant/components/anthropic/translations/ru.json +30 -0
  37. homeassistant/components/buienradar/sensor.py +0 -1
  38. homeassistant/components/cambridge_audio/translations/sv.json +1 -1
  39. homeassistant/components/demo/translations/select.sv.json +2 -2
  40. homeassistant/components/derivative/translations/ga.json +20 -0
  41. homeassistant/components/derivative/translations/ru.json +3 -0
  42. homeassistant/components/devolo_home_control/translations/bg.json +6 -0
  43. homeassistant/components/devolo_home_control/translations/id.json +5 -0
  44. homeassistant/components/devolo_home_control/translations/sv.json +10 -0
  45. homeassistant/components/devolo_home_control/translations/zh-Hans.json +10 -0
  46. homeassistant/components/dlink/manifest.json +1 -1
  47. homeassistant/components/ecovacs/translations/sv.json +1 -1
  48. homeassistant/components/enphase_envoy/translations/sv.json +2 -2
  49. homeassistant/components/ezviz/translations/bg.json +6 -0
  50. homeassistant/components/ezviz/translations/mk.json +13 -0
  51. homeassistant/components/ezviz/translations/sv.json +10 -0
  52. homeassistant/components/ezviz/translations/zh-Hans.json +10 -0
  53. homeassistant/components/frontend/manifest.json +1 -1
  54. homeassistant/components/goodwe/translations/sv.json +5 -5
  55. homeassistant/components/google_generative_ai_conversation/__init__.py +15 -0
  56. homeassistant/components/google_generative_ai_conversation/config_flow.py +72 -36
  57. homeassistant/components/google_generative_ai_conversation/const.py +15 -2
  58. homeassistant/components/google_generative_ai_conversation/diagnostics.py +1 -0
  59. homeassistant/components/google_generative_ai_conversation/entity.py +7 -2
  60. homeassistant/components/google_generative_ai_conversation/helpers.py +73 -0
  61. homeassistant/components/google_generative_ai_conversation/strings.json +28 -1
  62. homeassistant/components/google_generative_ai_conversation/translations/bg.json +19 -0
  63. homeassistant/components/google_generative_ai_conversation/translations/de.json +28 -0
  64. homeassistant/components/google_generative_ai_conversation/translations/el.json +28 -0
  65. homeassistant/components/google_generative_ai_conversation/translations/en.json +28 -0
  66. homeassistant/components/google_generative_ai_conversation/translations/es.json +28 -0
  67. homeassistant/components/google_generative_ai_conversation/translations/et.json +28 -0
  68. homeassistant/components/google_generative_ai_conversation/translations/ga.json +9 -0
  69. homeassistant/components/google_generative_ai_conversation/translations/id.json +30 -0
  70. homeassistant/components/google_generative_ai_conversation/translations/mk.json +11 -0
  71. homeassistant/components/google_generative_ai_conversation/translations/ru.json +67 -0
  72. homeassistant/components/google_generative_ai_conversation/translations/sk.json +28 -0
  73. homeassistant/components/google_generative_ai_conversation/translations/sv.json +21 -0
  74. homeassistant/components/google_generative_ai_conversation/translations/zh-Hans.json +28 -0
  75. homeassistant/components/google_generative_ai_conversation/translations/zh-Hant.json +28 -0
  76. homeassistant/components/google_generative_ai_conversation/tts.py +48 -106
  77. homeassistant/components/group/translations/el.json +18 -18
  78. homeassistant/components/habitica/const.py +1 -1
  79. homeassistant/components/harmony/translations/select.sv.json +1 -1
  80. homeassistant/components/harmony/translations/sv.json +1 -1
  81. homeassistant/components/homeassistant_hardware/translations/ga.json +9 -0
  82. homeassistant/components/homeassistant_hardware/translations/mk.json +9 -0
  83. homeassistant/components/homeassistant_sky_connect/translations/ga.json +10 -0
  84. homeassistant/components/homeassistant_sky_connect/translations/mk.json +7 -0
  85. homeassistant/components/homeassistant_yellow/translations/ga.json +5 -0
  86. homeassistant/components/homewizard/translations/sv.json +3 -1
  87. homeassistant/components/http/auth.py +1 -1
  88. homeassistant/components/image/__init__.py +34 -3
  89. homeassistant/components/input_select/translations/sv.json +6 -6
  90. homeassistant/components/iron_os/translations/sv.json +1 -1
  91. homeassistant/components/keenetic_ndms2/translations/id.json +3 -0
  92. homeassistant/components/lamarzocco/translations/sv.json +3 -3
  93. homeassistant/components/lametric/translations/sv.json +2 -2
  94. homeassistant/components/lametric/update.py +1 -1
  95. homeassistant/components/lg_thinq/translations/sv.json +5 -5
  96. homeassistant/components/litterrobot/translations/bg.json +4 -0
  97. homeassistant/components/litterrobot/translations/ga.json +3 -0
  98. homeassistant/components/matter/translations/id.json +5 -0
  99. homeassistant/components/matter/vacuum.py +38 -26
  100. homeassistant/components/meater/__init__.py +5 -1
  101. homeassistant/components/meater/coordinator.py +4 -2
  102. homeassistant/components/media_source/local_source.py +21 -4
  103. homeassistant/components/mqtt/translations/bg.json +10 -0
  104. homeassistant/components/mqtt/translations/el.json +21 -0
  105. homeassistant/components/mqtt/translations/fi.json +3 -0
  106. homeassistant/components/mqtt/translations/ga.json +25 -0
  107. homeassistant/components/mqtt/translations/mk.json +23 -0
  108. homeassistant/components/mqtt/translations/ru.json +1 -0
  109. homeassistant/components/mqtt/translations/sv.json +24 -0
  110. homeassistant/components/mqtt/translations/zh-Hans.json +26 -0
  111. homeassistant/components/mqtt/translations/zh-Hant.json +19 -0
  112. homeassistant/components/music_assistant/button.py +0 -6
  113. homeassistant/components/ntfy/translations/id.json +13 -0
  114. homeassistant/components/ohme/translations/sv.json +1 -1
  115. homeassistant/components/ollama/__init__.py +2 -0
  116. homeassistant/components/ollama/const.py +2 -0
  117. homeassistant/components/ollama/translations/bg.json +19 -0
  118. homeassistant/components/ollama/translations/ga.json +31 -1
  119. homeassistant/components/ollama/translations/id.json +18 -0
  120. homeassistant/components/ollama/translations/mk.json +13 -1
  121. homeassistant/components/onewire/translations/sv.json +4 -4
  122. homeassistant/components/openai_conversation/__init__.py +2 -0
  123. homeassistant/components/openai_conversation/const.py +1 -1
  124. homeassistant/components/openai_conversation/conversation.py +1 -1
  125. homeassistant/components/openai_conversation/translations/bg.json +26 -0
  126. homeassistant/components/openai_conversation/translations/id.json +23 -0
  127. homeassistant/components/openai_conversation/translations/mk.json +44 -0
  128. homeassistant/components/playstation_network/translations/bg.json +25 -1
  129. homeassistant/components/playstation_network/translations/es.json +1 -1
  130. homeassistant/components/playstation_network/translations/ga.json +31 -0
  131. homeassistant/components/playstation_network/translations/id.json +14 -0
  132. homeassistant/components/playstation_network/translations/mk.json +18 -0
  133. homeassistant/components/playstation_network/translations/sv.json +29 -0
  134. homeassistant/components/playstation_network/translations/zh-Hans.json +29 -0
  135. homeassistant/components/qnap/translations/sv.json +1 -1
  136. homeassistant/components/remote_calendar/translations/fi.json +34 -0
  137. homeassistant/components/select/translations/sv.json +10 -10
  138. homeassistant/components/smarla/__init__.py +2 -2
  139. homeassistant/components/sonos/translations/bg.json +5 -0
  140. homeassistant/components/sonos/translations/el.json +6 -0
  141. homeassistant/components/sonos/translations/ga.json +8 -0
  142. homeassistant/components/sonos/translations/mk.json +10 -0
  143. homeassistant/components/sonos/translations/ru.json +6 -0
  144. homeassistant/components/sonos/translations/sv.json +6 -0
  145. homeassistant/components/sonos/translations/zh-Hans.json +9 -0
  146. homeassistant/components/sonos/translations/zh-Hant.json +6 -0
  147. homeassistant/components/switchbot/translations/bg.json +26 -0
  148. homeassistant/components/switchbot/translations/ga.json +33 -0
  149. homeassistant/components/switchbot/translations/id.json +19 -0
  150. homeassistant/components/switchbot/translations/mk.json +49 -0
  151. homeassistant/components/switchbot/translations/sv.json +52 -0
  152. homeassistant/components/switchbot/translations/zh-Hans.json +53 -0
  153. homeassistant/components/telegram_bot/__init__.py +20 -4
  154. homeassistant/components/telegram_bot/bot.py +33 -29
  155. homeassistant/components/telegram_bot/config_flow.py +49 -10
  156. homeassistant/components/telegram_bot/const.py +1 -1
  157. homeassistant/components/telegram_bot/strings.json +33 -10
  158. homeassistant/components/telegram_bot/translations/bg.json +0 -1
  159. homeassistant/components/telegram_bot/translations/cs.json +5 -12
  160. homeassistant/components/telegram_bot/translations/de.json +12 -11
  161. homeassistant/components/telegram_bot/translations/el.json +5 -12
  162. homeassistant/components/telegram_bot/translations/en-GB.json +5 -12
  163. homeassistant/components/telegram_bot/translations/en.json +35 -12
  164. homeassistant/components/telegram_bot/translations/es.json +5 -12
  165. homeassistant/components/telegram_bot/translations/et.json +11 -12
  166. homeassistant/components/telegram_bot/translations/fr.json +5 -12
  167. homeassistant/components/telegram_bot/translations/ga.json +5 -11
  168. homeassistant/components/telegram_bot/translations/he.json +3 -8
  169. homeassistant/components/telegram_bot/translations/hu.json +5 -12
  170. homeassistant/components/telegram_bot/translations/id.json +0 -5
  171. homeassistant/components/telegram_bot/translations/it.json +2 -5
  172. homeassistant/components/telegram_bot/translations/lt.json +5 -12
  173. homeassistant/components/telegram_bot/translations/mk.json +7 -5
  174. homeassistant/components/telegram_bot/translations/nl.json +5 -12
  175. homeassistant/components/telegram_bot/translations/pt.json +5 -12
  176. homeassistant/components/telegram_bot/translations/ru.json +12 -11
  177. homeassistant/components/telegram_bot/translations/sk.json +5 -12
  178. homeassistant/components/telegram_bot/translations/sv.json +5 -12
  179. homeassistant/components/telegram_bot/translations/tr.json +5 -12
  180. homeassistant/components/telegram_bot/translations/zh-Hans.json +5 -12
  181. homeassistant/components/telegram_bot/translations/zh-Hant.json +5 -12
  182. homeassistant/components/template/translations/sv.json +5 -5
  183. homeassistant/components/tilt_pi/translations/id.json +11 -0
  184. homeassistant/components/tts/__init__.py +15 -0
  185. homeassistant/components/unifiprotect/translations/zh-Hans.json +3 -3
  186. homeassistant/components/utility_meter/translations/sv.json +9 -9
  187. homeassistant/components/vegehub/translations/bg.json +2 -0
  188. homeassistant/components/vegehub/translations/id.json +11 -0
  189. homeassistant/components/whirlpool/translations/sv.json +12 -12
  190. homeassistant/components/zha/translations/bg.json +23 -0
  191. homeassistant/components/zha/translations/el.json +10 -0
  192. homeassistant/components/zha/translations/ga.json +20 -0
  193. homeassistant/components/zha/translations/id.json +6 -0
  194. homeassistant/components/zha/translations/sv.json +15 -0
  195. homeassistant/components/zha/translations/zh-Hans.json +50 -0
  196. homeassistant/components/zwave_js/api.py +1 -1
  197. homeassistant/components/zwave_js/config_flow.py +12 -8
  198. homeassistant/components/zwave_js/manifest.json +1 -1
  199. homeassistant/config_entries.py +6 -0
  200. homeassistant/const.py +1 -1
  201. homeassistant/package_constraints.txt +1 -1
  202. {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/METADATA +1 -1
  203. {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/RECORD +208 -192
  204. {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/WHEEL +0 -0
  205. {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/entry_points.txt +0 -0
  206. {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/licenses/LICENSE.md +0 -0
  207. {homeassistant-2025.7.0b0.dist-info → homeassistant-2025.7.0b1.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
  208. {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
- messages = await notify_service.leave_chat(
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 _get_target_chat_ids(self, target: Any) -> list[int]:
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
- default_user: int = allowed_chat_ids[0]
298
- if target is not None:
299
- if isinstance(target, int):
300
- target = [target]
301
- chat_ids = [t for t in target if t in allowed_chat_ids]
302
- if chat_ids:
303
- return chat_ids
304
- _LOGGER.warning(
305
- "Disallowed targets: %s, using default: %s", target, default_user
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 [default_user]
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 not isinstance(out, bool) and hasattr(out, ATTR_MESSAGEID):
425
+ if isinstance(out, Message):
418
426
  chat_id = out.chat_id
419
- message_id = out[ATTR_MESSAGEID]
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._get_target_chat_ids(target):
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._get_target_chat_ids(chat_id)[0]
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._get_target_chat_ids(chat_id)[0]
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._get_target_chat_ids(target):
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._get_target_chat_ids(target):
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._get_target_chat_ids(target):
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._get_target_chat_ids(target):
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: Any = None,
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._get_target_chat_ids(chat_id)[0]
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._get_target_chat_ids(chat_id)[0]
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