homeassistant 2025.10.0b0__py3-none-any.whl → 2025.10.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.

Potentially problematic release.


This version of homeassistant might be problematic. Click here for more details.

Files changed (41) hide show
  1. homeassistant/components/accuweather/translations/nl.json +7 -1
  2. homeassistant/components/airzone/translations/nl.json +5 -0
  3. homeassistant/components/airzone/translations/zh-Hans.json +10 -0
  4. homeassistant/components/alexa_devices/manifest.json +1 -1
  5. homeassistant/components/blue_current/translations/zh-Hans.json +44 -0
  6. homeassistant/components/comelit/manifest.json +1 -1
  7. homeassistant/components/cync/translations/cs.json +32 -0
  8. homeassistant/components/cync/translations/nl.json +20 -0
  9. homeassistant/components/cync/translations/sk.json +32 -0
  10. homeassistant/components/cync/translations/zh-Hans.json +32 -0
  11. homeassistant/components/cync/translations/zh-Hant.json +32 -0
  12. homeassistant/components/ekeybionyx/translations/nl.json +24 -0
  13. homeassistant/components/ekeybionyx/translations/zh-Hans.json +66 -0
  14. homeassistant/components/esphome/config_flow.py +9 -1
  15. homeassistant/components/esphome/manager.py +10 -0
  16. homeassistant/components/esphome/manifest.json +1 -1
  17. homeassistant/components/frontend/manifest.json +1 -1
  18. homeassistant/components/letpot/translations/nl.json +5 -0
  19. homeassistant/components/letpot/translations/zh-Hans.json +10 -0
  20. homeassistant/components/libre_hardware_monitor/manifest.json +1 -1
  21. homeassistant/components/portainer/binary_sensor.py +9 -1
  22. homeassistant/components/portainer/entity.py +1 -1
  23. homeassistant/components/roborock/coordinator.py +3 -7
  24. homeassistant/components/route_b_smart_meter/translations/nl.json +24 -0
  25. homeassistant/components/route_b_smart_meter/translations/zh-Hans.json +42 -0
  26. homeassistant/components/smartthings/translations/nl.json +7 -0
  27. homeassistant/components/smartthings/translations/zh-Hans.json +21 -0
  28. homeassistant/components/switchbot/translations/nl.json +5 -0
  29. homeassistant/components/switchbot_cloud/translations/nl.json +2 -1
  30. homeassistant/components/tolo/translations/nl.json +2 -1
  31. homeassistant/components/usage_prediction/common_control.py +56 -59
  32. homeassistant/const.py +1 -1
  33. homeassistant/loader.py +3 -0
  34. homeassistant/package_constraints.txt +1 -1
  35. {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b1.dist-info}/METADATA +1 -1
  36. {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b1.dist-info}/RECORD +41 -32
  37. {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b1.dist-info}/WHEEL +0 -0
  38. {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b1.dist-info}/entry_points.txt +0 -0
  39. {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b1.dist-info}/licenses/LICENSE.md +0 -0
  40. {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b1.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
  41. {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b1.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "config": {
3
3
  "abort": {
4
- "already_configured": "Locatie is al geconfigureerd"
4
+ "already_configured": "Locatie is al geconfigureerd",
5
+ "reauth_successful": "Herauthenticatie geslaagd"
5
6
  },
6
7
  "create_entry": {
7
8
  "default": "Sommige sensoren zijn standaard niet ingeschakeld. Je kunt ze inschakelen in het entiteitenregister na de configuratie van deze integratie."
@@ -12,6 +13,11 @@
12
13
  "requests_exceeded": "Het toegestane aantal verzoeken aan de AccuWeather API is overschreden. Wacht of pas de API-sleutel aan."
13
14
  },
14
15
  "step": {
16
+ "reauth_confirm": {
17
+ "data": {
18
+ "api_key": "API-sleutel"
19
+ }
20
+ },
15
21
  "user": {
16
22
  "data": {
17
23
  "api_key": "API-sleutel",
@@ -62,6 +62,11 @@
62
62
  "heat_cool": "Verwarmen/koelen"
63
63
  }
64
64
  },
65
+ "q_adapt": {
66
+ "state": {
67
+ "minimum": "Minimum"
68
+ }
69
+ },
65
70
  "sleep_times": {
66
71
  "name": "Slaapstand",
67
72
  "state": {
@@ -63,6 +63,16 @@
63
63
  "stop": "\u505c\u6b62"
64
64
  }
65
65
  },
66
+ "q_adapt": {
67
+ "name": "Q-Adapt",
68
+ "state": {
69
+ "maximum": "\u6700\u5927",
70
+ "minimum": "\u6700\u5c0f",
71
+ "power": "\u7535\u6e90",
72
+ "silence": "\u9759\u97f3",
73
+ "standard": "\u6807\u51c6"
74
+ }
75
+ },
66
76
  "sleep_times": {
67
77
  "name": "\u7761\u7720",
68
78
  "state": {
@@ -7,6 +7,6 @@
7
7
  "integration_type": "hub",
8
8
  "iot_class": "cloud_polling",
9
9
  "loggers": ["aioamazondevices"],
10
- "quality_scale": "silver",
10
+ "quality_scale": "platinum",
11
11
  "requirements": ["aioamazondevices==6.0.0"]
12
12
  }
@@ -136,5 +136,49 @@
136
136
  "name": "\u5373\u63d2\u5373\u5145"
137
137
  }
138
138
  }
139
+ },
140
+ "exceptions": {
141
+ "config_entry_not_loaded": {
142
+ "message": "\u914d\u7f6e\u6761\u76ee\u672a\u52a0\u8f7d\u3002"
143
+ },
144
+ "invalid_device_id": {
145
+ "message": "\u7ed9\u51fa\u7684\u8bbe\u5907 ID \u65e0\u6548\u3002"
146
+ },
147
+ "no_config_entry": {
148
+ "message": "\u8bbe\u5907\u6ca1\u6709\u6709\u6548\u7684 blue_current \u914d\u7f6e\u6761\u76ee\u3002"
149
+ }
150
+ },
151
+ "options": {
152
+ "step": {
153
+ "init": {
154
+ "data": {
155
+ "card": "\u5361"
156
+ },
157
+ "description": "\u9009\u62e9\u60a8\u8981\u4f7f\u7528\u7684\u9ed8\u8ba4\u5145\u7535\u5361"
158
+ }
159
+ }
160
+ },
161
+ "selector": {
162
+ "select_charging_card": {
163
+ "options": {
164
+ "without_charging_card": "\u4e0d\u5e26\u5145\u7535\u5361"
165
+ }
166
+ }
167
+ },
168
+ "services": {
169
+ "start_charge_session": {
170
+ "description": "\u5728\u6307\u5b9a\u7684\u5145\u7535\u70b9\u5f00\u59cb\u65b0\u7684\u5145\u7535\u4f1a\u8bdd\u3002",
171
+ "fields": {
172
+ "charging_card_id": {
173
+ "description": "\u53ef\u9009\u7684\u5145\u7535\u5361 ID \uff0c\u7528\u4e8e\u542f\u52a8\u5145\u7535\u4f1a\u8bdd\u3002\u5982\u679c\u672a\u63d0\u4f9b\uff0c\u5219\u4e0d\u4f1a\u4f7f\u7528\u5145\u7535\u5361\u3002",
174
+ "name": "\u5145\u503c\u5361 ID"
175
+ },
176
+ "device_id": {
177
+ "description": "Blue Current \u5145\u7535\u70b9\u7684\u6807\u8bc6\u7b26\u3002",
178
+ "name": "\u8bbe\u5907\u6807\u8bc6\u7b26"
179
+ }
180
+ },
181
+ "name": "\u542f\u52a8\u5145\u7535\u4f1a\u8bdd"
182
+ }
139
183
  }
140
184
  }
@@ -7,6 +7,6 @@
7
7
  "integration_type": "hub",
8
8
  "iot_class": "local_polling",
9
9
  "loggers": ["aiocomelit"],
10
- "quality_scale": "silver",
10
+ "quality_scale": "platinum",
11
11
  "requirements": ["aiocomelit==0.12.3"]
12
12
  }
@@ -0,0 +1,32 @@
1
+ {
2
+ "config": {
3
+ "abort": {
4
+ "already_configured": "\u00da\u010det je ji\u017e nastaven"
5
+ },
6
+ "error": {
7
+ "cannot_connect": "Nepoda\u0159ilo se p\u0159ipojit",
8
+ "invalid_auth": "Neplatn\u00e9 ov\u011b\u0159en\u00ed",
9
+ "unknown": "Neo\u010dek\u00e1van\u00e1 chyba"
10
+ },
11
+ "step": {
12
+ "two_factor": {
13
+ "data": {
14
+ "two_factor_code": "K\u00f3d dvoufaktorov\u00e9ho ov\u011b\u0159en\u00ed"
15
+ },
16
+ "data_description": {
17
+ "two_factor_code": "K\u00f3d dvoufaktorov\u00e9ho ov\u011b\u0159en\u00ed byl zasl\u00e1n na e-mail va\u0161eho \u00fa\u010dtu Cync"
18
+ }
19
+ },
20
+ "user": {
21
+ "data": {
22
+ "email": "E-mail",
23
+ "password": "Heslo"
24
+ },
25
+ "data_description": {
26
+ "email": "E-mailov\u00e1 adresa va\u0161eho \u00fa\u010dtu Cync",
27
+ "password": "Heslo va\u0161eho \u00fa\u010dtu Cync"
28
+ }
29
+ }
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "config": {
3
+ "abort": {
4
+ "already_configured": "Account is al geconfigureerd"
5
+ },
6
+ "error": {
7
+ "cannot_connect": "Kan geen verbinding maken",
8
+ "invalid_auth": "Ongeldige authenticatie",
9
+ "unknown": "Onverwachte fout"
10
+ },
11
+ "step": {
12
+ "user": {
13
+ "data": {
14
+ "email": "E-mail",
15
+ "password": "Wachtwoord"
16
+ }
17
+ }
18
+ }
19
+ }
20
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "config": {
3
+ "abort": {
4
+ "already_configured": "\u00da\u010det je u\u017e nakonfigurovan\u00fd"
5
+ },
6
+ "error": {
7
+ "cannot_connect": "Nepodarilo sa pripoji\u0165",
8
+ "invalid_auth": "Neplatn\u00e9 overenie",
9
+ "unknown": "Neo\u010dak\u00e1van\u00e1 chyba"
10
+ },
11
+ "step": {
12
+ "two_factor": {
13
+ "data": {
14
+ "two_factor_code": "Dvojfaktorov\u00fd k\u00f3d"
15
+ },
16
+ "data_description": {
17
+ "two_factor_code": "Dvojfaktorov\u00fd k\u00f3d odoslan\u00fd na e-mail v\u00e1\u0161ho konta Cync"
18
+ }
19
+ },
20
+ "user": {
21
+ "data": {
22
+ "email": "Email",
23
+ "password": "Heslo"
24
+ },
25
+ "data_description": {
26
+ "email": "E-mailov\u00e1 adresa v\u00e1\u0161ho \u00fa\u010dtu Cync",
27
+ "password": "Heslo v\u00e1\u0161ho \u00fa\u010dtu Cync"
28
+ }
29
+ }
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "config": {
3
+ "abort": {
4
+ "already_configured": "\u8d26\u6237\u5df2\u914d\u7f6e"
5
+ },
6
+ "error": {
7
+ "cannot_connect": "\u8fde\u63a5\u5931\u8d25",
8
+ "invalid_auth": "\u8eab\u4efd\u9a8c\u8bc1\u65e0\u6548",
9
+ "unknown": "\u610f\u5916\u9519\u8bef"
10
+ },
11
+ "step": {
12
+ "two_factor": {
13
+ "data": {
14
+ "two_factor_code": "\u53cc\u91cd\u8ba4\u8bc1\u4ee3\u7801"
15
+ },
16
+ "data_description": {
17
+ "two_factor_code": "\u53d1\u9001\u5230\u60a8 Cync \u8d26\u6237\u7535\u5b50\u90ae\u7bb1\u7684\u53cc\u91cd\u8ba4\u8bc1\u4ee3\u7801"
18
+ }
19
+ },
20
+ "user": {
21
+ "data": {
22
+ "email": "\u7535\u5b50\u90ae\u7bb1",
23
+ "password": "\u5bc6\u7801"
24
+ },
25
+ "data_description": {
26
+ "email": "\u60a8 Cync \u8d26\u6237\u7684\u7535\u5b50\u90ae\u4ef6\u5730\u5740",
27
+ "password": "\u60a8 Cync \u8d26\u6237\u7684\u5bc6\u7801"
28
+ }
29
+ }
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "config": {
3
+ "abort": {
4
+ "already_configured": "\u5e33\u865f\u5df2\u7d93\u8a2d\u5b9a\u5b8c\u6210"
5
+ },
6
+ "error": {
7
+ "cannot_connect": "\u9023\u7dda\u5931\u6557",
8
+ "invalid_auth": "\u8eab\u4efd\u9a57\u8b49\u7121\u6548",
9
+ "unknown": "\u672a\u9810\u671f\u932f\u8aa4"
10
+ },
11
+ "step": {
12
+ "two_factor": {
13
+ "data": {
14
+ "two_factor_code": "\u96d9\u91cd\u8a8d\u8b49\u78bc"
15
+ },
16
+ "data_description": {
17
+ "two_factor_code": "\u50b3\u9001\u81f3 Cync \u5e33\u865f\u90f5\u4ef6\u7684\u96d9\u91cd\u8a8d\u8b49\u78bc"
18
+ }
19
+ },
20
+ "user": {
21
+ "data": {
22
+ "email": "\u96fb\u5b50\u90f5\u4ef6",
23
+ "password": "\u5bc6\u78bc"
24
+ },
25
+ "data_description": {
26
+ "email": "Cync \u5e33\u865f\u96fb\u5b50\u90f5\u4ef6\u4f4d\u5740\u3002",
27
+ "password": "Cync \u5e33\u865f\u5bc6\u78bc\u3002"
28
+ }
29
+ }
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "config": {
3
+ "abort": {
4
+ "already_configured": "Account is al geconfigureerd",
5
+ "already_in_progress": "De configuratie is momenteel al bezig",
6
+ "authorize_url_timeout": "Time-out bij het genereren van autorisatie-URL.",
7
+ "missing_configuration": "Integratie niet geconfigureerd. Raadpleeg de documentatie.",
8
+ "no_url_available": "Geen URL beschikbaar. Voor informatie over deze fout, [raadpleeg de documentatie]({docs_url})",
9
+ "oauth_error": "Ongeldige tokengegevens ontvangen.",
10
+ "oauth_failed": "Fout bij het verkrijgen van toegangstoken.",
11
+ "oauth_timeout": "Time-out bij het verkrijgen OAuth token.",
12
+ "oauth_unauthorized": "OAuth autorisatiefout tijdens het verkrijgen van een toegangstoken.",
13
+ "user_rejected_authorize": "Accountkoppeling geweigerd: {error}"
14
+ },
15
+ "create_entry": {
16
+ "default": "Authenticatie geslaagd"
17
+ },
18
+ "step": {
19
+ "pick_implementation": {
20
+ "title": "Kies een authenticatiemethode"
21
+ }
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,66 @@
1
+ {
2
+ "config": {
3
+ "abort": {
4
+ "already_configured": "\u8d26\u6237\u5df2\u914d\u7f6e",
5
+ "already_in_progress": "\u914d\u7f6e\u6d41\u7a0b\u5df2\u5728\u8fdb\u884c\u4e2d",
6
+ "authorize_url_timeout": "\u751f\u6210\u6388\u6743\u7f51\u5740\u8d85\u65f6\u3002",
7
+ "cannot_connect": "\u8fde\u63a5\u5230 {ekeybionyx} \u5931\u8d25\u3002\u8bf7\u68c0\u67e5\u60a8\u7684\u4e92\u8054\u7f51\u8fde\u63a5\uff0c\u7136\u540e\u91cd\u8bd5\u3002",
8
+ "missing_configuration": "\u6b64\u7ec4\u4ef6\u5c1a\u672a\u914d\u7f6e\u3002\u8bf7\u53c2\u9605\u6587\u6863\u3002",
9
+ "no_available_webhooks": "{ekeybionyx} \u7cfb\u7edf\u4e2d\u6ca1\u6709\u53ef\u7528\u7684 webhook \u3002\u8bf7\u5220\u9664\u4e00\u4e9b webhook \u540e\u91cd\u8bd5\u3002",
10
+ "no_own_systems": "\u60a8\u7684\u8d26\u6237\u4e0d\u5177\u5907\u4efb\u4f55\u7cfb\u7edf\u7684\u7ba1\u7406\u5458\u8bbf\u95ee\u6743\u9650\u3002",
11
+ "no_url_available": "\u6ca1\u6709\u53ef\u7528\u7684\u7f51\u5740\u3002\u6709\u5173\u6b64\u9519\u8bef\u7684\u4fe1\u606f\uff0c\u8bf7[\u68c0\u67e5\u5e2e\u52a9\u7ae0\u8282]({docs_url})",
12
+ "oauth_error": "\u6536\u5230\u65e0\u6548\u7684\u4ee4\u724c\u6570\u636e\u3002",
13
+ "oauth_failed": "\u83b7\u53d6\u8bbf\u95ee\u4ee4\u724c\u65f6\u51fa\u9519\u3002",
14
+ "oauth_timeout": "\u89e3\u6790 OAuth \u4ee4\u724c\u8d85\u65f6\u3002",
15
+ "oauth_unauthorized": "\u83b7\u53d6\u8bbf\u95ee\u4ee4\u724c\u65f6\u51fa\u73b0 OAuth \u6388\u6743\u9519\u8bef\u3002",
16
+ "user_rejected_authorize": "\u8d26\u6237\u94fe\u63a5\u88ab\u62d2\u7edd\uff1a{error}"
17
+ },
18
+ "create_entry": {
19
+ "default": "\u8ba4\u8bc1\u6210\u529f"
20
+ },
21
+ "error": {
22
+ "invalid_name": "\u540d\u79f0\u65e0\u6548",
23
+ "invalid_url": "\u7f51\u5740\u65e0\u6548",
24
+ "no_webhooks_provided": "\u672a\u63d0\u4f9b\u4e8b\u4ef6\u540d\u79f0"
25
+ },
26
+ "progress": {
27
+ "check_deletion_status": "\u8bf7\u6253\u5f00 {ekeybionyx} \u5e94\u7528\u5e76\u786e\u8ba4\u5220\u9664\u8be5\u529f\u80fd\u3002"
28
+ },
29
+ "step": {
30
+ "choose_system": {
31
+ "data": {
32
+ "system": "\u7cfb\u7edf"
33
+ },
34
+ "data_description": {
35
+ "system": "\u5e94\u8bbe\u7f6e\u4e8b\u4ef6\u5b9e\u4f53\u7684\u7cfb\u7edf\u3002"
36
+ },
37
+ "description": "\u8bf7\u9009\u62e9\u60a8\u60f3\u8981\u8fde\u63a5\u5230 Home Assistant \u7684 {ekeybionyx} \u7cfb\u7edf\u3002"
38
+ },
39
+ "delete_webhooks": {
40
+ "description": "\u6b64\u7cfb\u7edf\u5df2\u8fde\u63a5\u81f3 Home Assistant \u3002\u5982\u679c\u7ee7\u7eed\u64cd\u4f5c\uff0c\u4e4b\u524d\u914d\u7f6e\u7684\u529f\u80fd\u5c06\u88ab\u5220\u9664\u3002"
41
+ },
42
+ "pick_implementation": {
43
+ "title": "\u9009\u62e9\u8eab\u4efd\u9a8c\u8bc1\u65b9\u6cd5"
44
+ },
45
+ "webhooks": {
46
+ "data": {
47
+ "url": "Home Assistant \u7f51\u5740",
48
+ "webhook1": "\u4e8b\u4ef6\u5b9e\u4f53 1",
49
+ "webhook2": "\u4e8b\u4ef6\u5b9e\u4f53 2",
50
+ "webhook3": "\u4e8b\u4ef6\u5b9e\u4f53 3",
51
+ "webhook4": "\u4e8b\u4ef6\u5b9e\u4f53 4",
52
+ "webhook5": "\u4e8b\u4ef6\u5b9e\u4f53 5"
53
+ },
54
+ "data_description": {
55
+ "url": "\u53ef\u4ee5\u4ece\u6307\u7eb9\u63a7\u5236\u5668\u8bbf\u95ee\u7684 Home Assistant \u5b9e\u4f8b\u7f51\u5740",
56
+ "webhook1": "\u88ab\u6620\u5c04\u5230\u51fd\u6570\u7684\u4e8b\u4ef6\u5b9e\u4f53 1 \u7684\u540d\u79f0",
57
+ "webhook2": "\u88ab\u6620\u5c04\u5230\u51fd\u6570\u7684\u4e8b\u4ef6\u5b9e\u4f53 2 \u7684\u540d\u79f0",
58
+ "webhook3": "\u88ab\u6620\u5c04\u5230\u51fd\u6570\u7684\u4e8b\u4ef6\u5b9e\u4f53 3 \u7684\u540d\u79f0",
59
+ "webhook4": "\u88ab\u6620\u5c04\u5230\u51fd\u6570\u7684\u4e8b\u4ef6\u5b9e\u4f53 4 \u7684\u540d\u79f0",
60
+ "webhook5": "\u88ab\u6620\u5c04\u5230\u51fd\u6570\u7684\u4e8b\u4ef6\u5b9e\u4f53 5 \u7684\u540d\u79f0"
61
+ },
62
+ "description": "\u8bf7\u4e3a\u60a8\u7684\u4e8b\u4ef6\u5b9e\u4f53\u547d\u540d\u3002\u8fd9\u4e9b\u4e8b\u4ef6\u5b9e\u4f53\u5c06\u5728 {ekeybionyx} \u5e94\u7528\u4e2d\u6620\u5c04\u4e3a\u51fd\u6570\u3002\u60a8\u6700\u591a\u53ef\u4ee5\u914d\u7f6e {webhooks_available} \u4e2a\u4e8b\u4ef6\u5b9e\u4f53\u3002\u5982\u679c\u540d\u79f0\u7559\u7a7a\uff0c\u5219\u8df3\u8fc7\u8be5\u4e8b\u4ef6\u5b9e\u4f53\u7684\u8bbe\u7f6e\u3002"
63
+ }
64
+ }
65
+ }
66
+ }
@@ -57,6 +57,7 @@ from .manager import async_replace_device
57
57
 
58
58
  ERROR_REQUIRES_ENCRYPTION_KEY = "requires_encryption_key"
59
59
  ERROR_INVALID_ENCRYPTION_KEY = "invalid_psk"
60
+ ERROR_INVALID_PASSWORD_AUTH = "invalid_auth"
60
61
  _LOGGER = logging.getLogger(__name__)
61
62
 
62
63
  ZERO_NOISE_PSK = "MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA="
@@ -137,6 +138,11 @@ class EsphomeFlowHandler(ConfigFlow, domain=DOMAIN):
137
138
  self._password = ""
138
139
  return await self._async_authenticate_or_add()
139
140
 
141
+ if error == ERROR_INVALID_PASSWORD_AUTH or (
142
+ error is None and self._device_info and self._device_info.uses_password
143
+ ):
144
+ return await self.async_step_authenticate()
145
+
140
146
  if error is None and entry_data.get(CONF_NOISE_PSK):
141
147
  # Device was configured with encryption but now connects without it.
142
148
  # Check if it's the same device before offering to remove encryption.
@@ -690,13 +696,15 @@ class EsphomeFlowHandler(ConfigFlow, domain=DOMAIN):
690
696
  cli = APIClient(
691
697
  host,
692
698
  port or DEFAULT_PORT,
693
- "",
699
+ self._password or "",
694
700
  zeroconf_instance=zeroconf_instance,
695
701
  noise_psk=noise_psk,
696
702
  )
697
703
  try:
698
704
  await cli.connect()
699
705
  self._device_info = await cli.device_info()
706
+ except InvalidAuthAPIError:
707
+ return ERROR_INVALID_PASSWORD_AUTH
700
708
  except RequiresEncryptionAPIError:
701
709
  return ERROR_REQUIRES_ENCRYPTION_KEY
702
710
  except InvalidEncryptionKeyAPIError as ex:
@@ -372,6 +372,9 @@ class ESPHomeManager:
372
372
  """Subscribe to states and list entities on successful API login."""
373
373
  try:
374
374
  await self._on_connect()
375
+ except InvalidAuthAPIError as err:
376
+ _LOGGER.warning("Authentication failed for %s: %s", self.host, err)
377
+ await self._start_reauth_and_disconnect()
375
378
  except APIConnectionError as err:
376
379
  _LOGGER.warning(
377
380
  "Error getting setting up connection for %s: %s", self.host, err
@@ -641,7 +644,14 @@ class ESPHomeManager:
641
644
  if self.reconnect_logic:
642
645
  await self.reconnect_logic.stop()
643
646
  return
647
+ await self._start_reauth_and_disconnect()
648
+
649
+ async def _start_reauth_and_disconnect(self) -> None:
650
+ """Start reauth flow and stop reconnection attempts."""
644
651
  self.entry.async_start_reauth(self.hass)
652
+ await self.cli.disconnect()
653
+ if self.reconnect_logic:
654
+ await self.reconnect_logic.stop()
645
655
 
646
656
  async def _handle_dynamic_encryption_key(
647
657
  self, device_info: EsphomeDeviceInfo
@@ -17,7 +17,7 @@
17
17
  "mqtt": ["esphome/discover/#"],
18
18
  "quality_scale": "platinum",
19
19
  "requirements": [
20
- "aioesphomeapi==41.9.0",
20
+ "aioesphomeapi==41.9.4",
21
21
  "esphome-dashboard-api==1.3.0",
22
22
  "bleak-esphome==3.3.0"
23
23
  ],
@@ -20,5 +20,5 @@
20
20
  "documentation": "https://www.home-assistant.io/integrations/frontend",
21
21
  "integration_type": "system",
22
22
  "quality_scale": "internal",
23
- "requirements": ["home-assistant-frontend==20250924.0"]
23
+ "requirements": ["home-assistant-frontend==20250925.0"]
24
24
  }
@@ -43,6 +43,11 @@
43
43
  "name": "Pompfout"
44
44
  }
45
45
  },
46
+ "number": {
47
+ "plant_days": {
48
+ "unit_of_measurement": "dagen"
49
+ }
50
+ },
46
51
  "select": {
47
52
  "display_temperature_unit": {
48
53
  "name": "Temperatuureenheid op het display",
@@ -49,6 +49,15 @@
49
49
  "name": "\u91cd\u65b0\u586b\u5145\u51fa\u9519"
50
50
  }
51
51
  },
52
+ "number": {
53
+ "light_brightness": {
54
+ "name": "\u706f\u5149\u4eae\u5ea6"
55
+ },
56
+ "plant_days": {
57
+ "name": "\u690d\u7269\u5e74\u9f84",
58
+ "unit_of_measurement": "\u5929"
59
+ }
60
+ },
52
61
  "select": {
53
62
  "display_temperature_unit": {
54
63
  "name": "\u6e29\u5ea6\u663e\u793a\u5355\u4f4d",
@@ -58,6 +67,7 @@
58
67
  }
59
68
  },
60
69
  "light_brightness": {
70
+ "name": "\u706f\u5149\u4eae\u5ea6",
61
71
  "state": {
62
72
  "high": "\u9ad8",
63
73
  "low": "\u4f4e"
@@ -6,5 +6,5 @@
6
6
  "documentation": "https://www.home-assistant.io/integrations/libre_hardware_monitor",
7
7
  "iot_class": "local_polling",
8
8
  "quality_scale": "silver",
9
- "requirements": ["librehardwaremonitor-api==1.3.1"]
9
+ "requirements": ["librehardwaremonitor-api==1.4.0"]
10
10
  }
@@ -131,7 +131,15 @@ class PortainerContainerSensor(PortainerContainerEntity, BinarySensorEntity):
131
131
  self.entity_description = entity_description
132
132
  super().__init__(device_info, coordinator, via_device)
133
133
 
134
- self._attr_unique_id = f"{coordinator.config_entry.entry_id}_{device_info.id}_{entity_description.key}"
134
+ # Container ID's are ephemeral, so use the container name for the unique ID
135
+ # The first one, should always be unique, it's fine if users have aliases
136
+ # According to Docker's API docs, the first name is unique
137
+ device_identifier = (
138
+ self._device_info.names[0].replace("/", " ").strip()
139
+ if self._device_info.names
140
+ else None
141
+ )
142
+ self._attr_unique_id = f"{coordinator.config_entry.entry_id}_{device_identifier}_{entity_description.key}"
135
143
 
136
144
  @property
137
145
  def available(self) -> bool:
@@ -60,7 +60,7 @@ class PortainerContainerEntity(PortainerCoordinatorEntity):
60
60
 
61
61
  self._attr_device_info = DeviceInfo(
62
62
  identifiers={
63
- (DOMAIN, f"{self.coordinator.config_entry.entry_id}_{self.device_id}")
63
+ (DOMAIN, f"{self.coordinator.config_entry.entry_id}_{device_name}")
64
64
  },
65
65
  manufacturer=DEFAULT_NAME,
66
66
  model="Container",
@@ -351,13 +351,9 @@ class RoborockDataUpdateCoordinator(DataUpdateCoordinator[DeviceProp]):
351
351
  def _set_current_map(self) -> None:
352
352
  if (
353
353
  self.roborock_device_info.props.status is not None
354
- and self.roborock_device_info.props.status.map_status is not None
354
+ and self.roborock_device_info.props.status.current_map is not None
355
355
  ):
356
- # The map status represents the map flag as flag * 4 + 3 -
357
- # so we have to invert that in order to get the map flag that we can use to set the current map.
358
- self.current_map = (
359
- self.roborock_device_info.props.status.map_status - 3
360
- ) // 4
356
+ self.current_map = self.roborock_device_info.props.status.current_map
361
357
 
362
358
  async def set_current_map_rooms(self) -> None:
363
359
  """Fetch all of the rooms for the current map and set on RoborockMapInfo."""
@@ -440,7 +436,7 @@ class RoborockDataUpdateCoordinator(DataUpdateCoordinator[DeviceProp]):
440
436
  # If either of these fail, we don't care, and we want to continue.
441
437
  await asyncio.gather(*tasks, return_exceptions=True)
442
438
 
443
- if len(self.maps) != 1:
439
+ if len(self.maps) > 1:
444
440
  # Set the map back to the map the user previously had selected so that it
445
441
  # does not change the end user's app.
446
442
  # Only needs to happen when we changed maps above.
@@ -0,0 +1,24 @@
1
+ {
2
+ "config": {
3
+ "abort": {
4
+ "already_configured": "Apparaat is al geconfigureerd"
5
+ },
6
+ "error": {
7
+ "cannot_connect": "Kan geen verbinding maken",
8
+ "invalid_auth": "Ongeldige authenticatie",
9
+ "unknown": "Onverwachte fout"
10
+ },
11
+ "step": {
12
+ "user": {
13
+ "data": {
14
+ "device": "Apparaat",
15
+ "password": "Wachtwoord"
16
+ },
17
+ "data_description": {
18
+ "device": "Apparaat",
19
+ "password": "Wachtwoord"
20
+ }
21
+ }
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "config": {
3
+ "abort": {
4
+ "already_configured": "\u8bbe\u5907\u5df2\u914d\u7f6e"
5
+ },
6
+ "error": {
7
+ "cannot_connect": "\u8fde\u63a5\u5931\u8d25",
8
+ "invalid_auth": "\u8eab\u4efd\u9a8c\u8bc1\u65e0\u6548",
9
+ "unknown": "\u610f\u5916\u9519\u8bef"
10
+ },
11
+ "step": {
12
+ "user": {
13
+ "data": {
14
+ "device": "\u8bbe\u5907",
15
+ "id": "B \u8def\u7ebf ID",
16
+ "password": "\u5bc6\u7801"
17
+ },
18
+ "data_description": {
19
+ "device": "\u8bbe\u5907",
20
+ "id": "B \u8def\u7ebf ID",
21
+ "password": "\u5bc6\u7801"
22
+ }
23
+ }
24
+ }
25
+ },
26
+ "entity": {
27
+ "sensor": {
28
+ "instantaneous_current_r_phase": {
29
+ "name": "\u77ac\u65f6\u7535\u6d41 R \u76f8"
30
+ },
31
+ "instantaneous_current_t_phase": {
32
+ "name": "\u77ac\u65f6\u7535\u6d41 T \u76f8"
33
+ },
34
+ "instantaneous_power": {
35
+ "name": "\u77ac\u65f6\u529f\u7387"
36
+ },
37
+ "total_consumption": {
38
+ "name": "\u603b\u6d88\u8017"
39
+ }
40
+ }
41
+ }
42
+ }
@@ -73,6 +73,8 @@
73
73
  },
74
74
  "lamp": {
75
75
  "state": {
76
+ "high": "Hoog",
77
+ "low": "Laag",
76
78
  "off": "Uit",
77
79
  "on": "Aan"
78
80
  }
@@ -84,6 +86,11 @@
84
86
  "stop": "Gestopt"
85
87
  }
86
88
  },
89
+ "soil_level": {
90
+ "state": {
91
+ "normal": "Normaal"
92
+ }
93
+ },
87
94
  "spin_level": {
88
95
  "name": "Centrifuge snelheid",
89
96
  "state": {