homeassistant 2025.10.0b0__py3-none-any.whl → 2025.10.0b2__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 (82) hide show
  1. homeassistant/components/accuweather/manifest.json +1 -1
  2. homeassistant/components/accuweather/translations/nl.json +7 -1
  3. homeassistant/components/airzone/translations/nl.json +5 -0
  4. homeassistant/components/airzone/translations/zh-Hans.json +10 -0
  5. homeassistant/components/alexa_devices/binary_sensor.py +36 -38
  6. homeassistant/components/alexa_devices/config_flow.py +2 -2
  7. homeassistant/components/alexa_devices/coordinator.py +1 -1
  8. homeassistant/components/alexa_devices/diagnostics.py +1 -3
  9. homeassistant/components/alexa_devices/icons.json +0 -40
  10. homeassistant/components/alexa_devices/manifest.json +2 -2
  11. homeassistant/components/alexa_devices/sensor.py +13 -0
  12. homeassistant/components/alexa_devices/strings.json +0 -20
  13. homeassistant/components/alexa_devices/switch.py +27 -7
  14. homeassistant/components/alexa_devices/translations/bg.json +0 -13
  15. homeassistant/components/alexa_devices/translations/cs.json +0 -20
  16. homeassistant/components/alexa_devices/translations/de.json +0 -20
  17. homeassistant/components/alexa_devices/translations/el.json +0 -20
  18. homeassistant/components/alexa_devices/translations/en-GB.json +0 -20
  19. homeassistant/components/alexa_devices/translations/en.json +0 -20
  20. homeassistant/components/alexa_devices/translations/es.json +0 -20
  21. homeassistant/components/alexa_devices/translations/et.json +0 -20
  22. homeassistant/components/alexa_devices/translations/ga.json +0 -20
  23. homeassistant/components/alexa_devices/translations/he.json +0 -7
  24. homeassistant/components/alexa_devices/translations/hu.json +0 -20
  25. homeassistant/components/alexa_devices/translations/it.json +0 -20
  26. homeassistant/components/alexa_devices/translations/ja.json +0 -19
  27. homeassistant/components/alexa_devices/translations/lt.json +0 -20
  28. homeassistant/components/alexa_devices/translations/mk.json +0 -14
  29. homeassistant/components/alexa_devices/translations/nl.json +0 -20
  30. homeassistant/components/alexa_devices/translations/pl.json +0 -5
  31. homeassistant/components/alexa_devices/translations/pt.json +0 -20
  32. homeassistant/components/alexa_devices/translations/ru.json +0 -5
  33. homeassistant/components/alexa_devices/translations/sk.json +0 -20
  34. homeassistant/components/alexa_devices/translations/sv.json +0 -20
  35. homeassistant/components/alexa_devices/translations/tr.json +0 -5
  36. homeassistant/components/alexa_devices/translations/zh-Hans.json +0 -20
  37. homeassistant/components/alexa_devices/translations/zh-Hant.json +0 -20
  38. homeassistant/components/alexa_devices/utils.py +24 -1
  39. homeassistant/components/assist_pipeline/translations/nl.json +1 -0
  40. homeassistant/components/blue_current/translations/zh-Hans.json +44 -0
  41. homeassistant/components/comelit/manifest.json +1 -1
  42. homeassistant/components/cync/translations/cs.json +32 -0
  43. homeassistant/components/cync/translations/nl.json +20 -0
  44. homeassistant/components/cync/translations/sk.json +32 -0
  45. homeassistant/components/cync/translations/zh-Hans.json +32 -0
  46. homeassistant/components/cync/translations/zh-Hant.json +32 -0
  47. homeassistant/components/ekeybionyx/translations/nl.json +24 -0
  48. homeassistant/components/ekeybionyx/translations/zh-Hans.json +66 -0
  49. homeassistant/components/esphome/config_flow.py +9 -1
  50. homeassistant/components/esphome/manager.py +10 -0
  51. homeassistant/components/esphome/manifest.json +1 -1
  52. homeassistant/components/esphome/translations/nl.json +1 -1
  53. homeassistant/components/frontend/manifest.json +1 -1
  54. homeassistant/components/letpot/translations/nl.json +5 -0
  55. homeassistant/components/letpot/translations/zh-Hans.json +10 -0
  56. homeassistant/components/libre_hardware_monitor/manifest.json +1 -1
  57. homeassistant/components/mvglive/manifest.json +2 -4
  58. homeassistant/components/mvglive/sensor.py +116 -86
  59. homeassistant/components/portainer/binary_sensor.py +9 -1
  60. homeassistant/components/portainer/entity.py +1 -1
  61. homeassistant/components/roborock/coordinator.py +3 -7
  62. homeassistant/components/route_b_smart_meter/translations/nl.json +24 -0
  63. homeassistant/components/route_b_smart_meter/translations/zh-Hans.json +42 -0
  64. homeassistant/components/smartthings/manifest.json +1 -1
  65. homeassistant/components/smartthings/translations/nl.json +7 -0
  66. homeassistant/components/smartthings/translations/zh-Hans.json +21 -0
  67. homeassistant/components/switchbot/translations/nl.json +5 -0
  68. homeassistant/components/switchbot_cloud/translations/nl.json +2 -1
  69. homeassistant/components/tolo/translations/nl.json +2 -1
  70. homeassistant/components/usage_prediction/common_control.py +56 -59
  71. homeassistant/components/voip/translations/nl.json +1 -1
  72. homeassistant/components/wyoming/translations/nl.json +1 -1
  73. homeassistant/const.py +1 -1
  74. homeassistant/loader.py +3 -0
  75. homeassistant/package_constraints.txt +1 -1
  76. {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b2.dist-info}/METADATA +1 -1
  77. {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b2.dist-info}/RECORD +82 -73
  78. {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b2.dist-info}/WHEEL +0 -0
  79. {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b2.dist-info}/entry_points.txt +0 -0
  80. {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b2.dist-info}/licenses/LICENSE.md +0 -0
  81. {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b2.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
  82. {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b2.dist-info}/top_level.txt +0 -0
@@ -30,5 +30,5 @@
30
30
  "iot_class": "cloud_push",
31
31
  "loggers": ["pysmartthings"],
32
32
  "quality_scale": "bronze",
33
- "requirements": ["pysmartthings==3.2.9"]
33
+ "requirements": ["pysmartthings==3.3.0"]
34
34
  }
@@ -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": {
@@ -78,6 +78,21 @@
78
78
  "name": "\u505c\u6b62"
79
79
  }
80
80
  },
81
+ "climate": {
82
+ "air_conditioner": {
83
+ "state_attributes": {
84
+ "preset_mode": {
85
+ "state": {
86
+ "long_wind": "\u957f\u98ce",
87
+ "quiet": "\u5b89\u9759",
88
+ "smart": "\u667a\u80fd",
89
+ "wind_free": "\u65e0\u98ce",
90
+ "wind_free_sleep": "\u65e0\u98ce\u7761\u7720"
91
+ }
92
+ }
93
+ }
94
+ }
95
+ },
81
96
  "event": {
82
97
  "button": {
83
98
  "state": {
@@ -153,6 +168,8 @@
153
168
  "name": "\u706f",
154
169
  "state": {
155
170
  "extra_high": "\u8d85\u9ad8",
171
+ "high": "\u9ad8",
172
+ "low": "\u4f4e",
156
173
  "mid": "\u4e2d",
157
174
  "off": "\u5173\u95ed",
158
175
  "on": "\u5f00\u542f"
@@ -174,6 +191,7 @@
174
191
  "heavy": "\u91cd",
175
192
  "light": "\u8f7b",
176
193
  "none": "\u65e0",
194
+ "normal": "\u6b63\u5e38",
177
195
  "up": "\u5411\u4e0a"
178
196
  }
179
197
  },
@@ -598,6 +616,9 @@
598
616
  }
599
617
  },
600
618
  "switch": {
619
+ "auto_cycle_link": {
620
+ "name": "\u81ea\u52a8\u5faa\u73af\u94fe\u63a5"
621
+ },
601
622
  "bubble_soak": {
602
623
  "name": "\u6ce1\u6ce1\u6d74"
603
624
  },
@@ -55,6 +55,11 @@
55
55
  "password": "Het wachtwoord dat nodig is voor toegang tot het Bot-apparaat"
56
56
  },
57
57
  "description": "Het {name} apparaat vereist een wachtwoord"
58
+ },
59
+ "select_device": {
60
+ "data": {
61
+ "address": "MAC adres"
62
+ }
58
63
  }
59
64
  }
60
65
  },
@@ -38,7 +38,8 @@
38
38
  "state": {
39
39
  "high": "Hoog",
40
40
  "low": "Laag",
41
- "medium": "Gemiddeld"
41
+ "medium": "Gemiddeld",
42
+ "target_humidity": "Doelluchtvochtigheid"
42
43
  }
43
44
  }
44
45
  }
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "config": {
3
3
  "abort": {
4
- "already_configured": "Apparaat is al geconfigureerd"
4
+ "already_configured": "Apparaat is al geconfigureerd",
5
+ "reconfigure_successful": "Herconfiguratie was succesvol"
5
6
  },
6
7
  "error": {
7
8
  "cannot_connect": "Kan geen verbinding maken"
@@ -3,13 +3,14 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from collections import Counter
6
- from collections.abc import Callable
6
+ from collections.abc import Callable, Sequence
7
7
  from datetime import datetime, timedelta
8
8
  from functools import cache
9
9
  import logging
10
10
  from typing import Any, Literal, cast
11
11
 
12
12
  from sqlalchemy import select
13
+ from sqlalchemy.engine.row import Row
13
14
  from sqlalchemy.orm import Session
14
15
 
15
16
  from homeassistant.components.recorder import get_instance
@@ -38,13 +39,11 @@ ALLOWED_DOMAINS = {
38
39
  Platform.ALARM_CONTROL_PANEL,
39
40
  Platform.BINARY_SENSOR,
40
41
  Platform.BUTTON,
41
- Platform.CALENDAR,
42
42
  Platform.CAMERA,
43
43
  Platform.CLIMATE,
44
44
  Platform.COVER,
45
45
  Platform.FAN,
46
46
  Platform.HUMIDIFIER,
47
- Platform.IMAGE,
48
47
  Platform.LAWN_MOWER,
49
48
  Platform.LIGHT,
50
49
  Platform.LOCK,
@@ -55,7 +54,6 @@ ALLOWED_DOMAINS = {
55
54
  Platform.SENSOR,
56
55
  Platform.SIREN,
57
56
  Platform.SWITCH,
58
- Platform.TEXT,
59
57
  Platform.VACUUM,
60
58
  Platform.VALVE,
61
59
  Platform.WATER_HEATER,
@@ -93,61 +91,32 @@ async def async_predict_common_control(
93
91
  Args:
94
92
  hass: Home Assistant instance
95
93
  user_id: User ID to filter events by.
96
-
97
- Returns:
98
- Dictionary with time categories as keys and lists of most common entity IDs as values
99
94
  """
100
95
  # Get the recorder instance to ensure it's ready
101
96
  recorder = get_instance(hass)
102
97
  ent_reg = er.async_get(hass)
103
98
 
104
99
  # Execute the database operation in the recorder's executor
105
- return await recorder.async_add_executor_job(
100
+ data = await recorder.async_add_executor_job(
106
101
  _fetch_with_session, hass, _fetch_and_process_data, ent_reg, user_id
107
102
  )
108
-
109
-
110
- def _fetch_and_process_data(
111
- session: Session, ent_reg: er.EntityRegistry, user_id: str
112
- ) -> EntityUsagePredictions:
113
- """Fetch and process service call events from the database."""
114
103
  # Prepare a dictionary to track results
115
104
  results: dict[str, Counter[str]] = {
116
105
  time_cat: Counter() for time_cat in TIME_CATEGORIES
117
106
  }
118
107
 
108
+ allowed_entities = set(hass.states.async_entity_ids(ALLOWED_DOMAINS))
109
+ hidden_entities: set[str] = set()
110
+
119
111
  # Keep track of contexts that we processed so that we will only process
120
112
  # the first service call in a context, and not subsequent calls.
121
113
  context_processed: set[bytes] = set()
122
- thirty_days_ago_ts = (dt_util.utcnow() - timedelta(days=30)).timestamp()
123
- user_id_bytes = uuid_hex_to_bytes_or_none(user_id)
124
- if not user_id_bytes:
125
- raise ValueError("Invalid user_id format")
126
-
127
- # Build the main query for events with their data
128
- query = (
129
- select(
130
- Events.context_id_bin,
131
- Events.time_fired_ts,
132
- EventData.shared_data,
133
- )
134
- .select_from(Events)
135
- .outerjoin(EventData, Events.data_id == EventData.data_id)
136
- .outerjoin(EventTypes, Events.event_type_id == EventTypes.event_type_id)
137
- .where(Events.time_fired_ts >= thirty_days_ago_ts)
138
- .where(Events.context_user_id_bin == user_id_bytes)
139
- .where(EventTypes.event_type == "call_service")
140
- .order_by(Events.time_fired_ts)
141
- )
142
-
143
114
  # Execute the query
144
115
  context_id: bytes
145
116
  time_fired_ts: float
146
117
  shared_data: str | None
147
118
  local_time_zone = dt_util.get_default_time_zone()
148
- for context_id, time_fired_ts, shared_data in (
149
- session.connection().execute(query).all()
150
- ):
119
+ for context_id, time_fired_ts, shared_data in data:
151
120
  # Skip if we have already processed an event that was part of this context
152
121
  if context_id in context_processed:
153
122
  continue
@@ -156,7 +125,7 @@ def _fetch_and_process_data(
156
125
  context_processed.add(context_id)
157
126
 
158
127
  # Parse the event data
159
- if not shared_data:
128
+ if not time_fired_ts or not shared_data:
160
129
  continue
161
130
 
162
131
  try:
@@ -190,27 +159,26 @@ def _fetch_and_process_data(
190
159
  if not isinstance(entity_ids, list):
191
160
  entity_ids = [entity_ids]
192
161
 
193
- # Filter out entity IDs that are not in allowed domains
194
- entity_ids = [
195
- entity_id
196
- for entity_id in entity_ids
197
- if entity_id.split(".")[0] in ALLOWED_DOMAINS
198
- and ((entry := ent_reg.async_get(entity_id)) is None or not entry.hidden)
199
- ]
162
+ # Convert to local time for time category determination
163
+ period = time_category(
164
+ datetime.fromtimestamp(time_fired_ts, local_time_zone).hour
165
+ )
166
+ period_results = results[period]
200
167
 
201
- if not entity_ids:
202
- continue
168
+ # Count entity usage
169
+ for entity_id in entity_ids:
170
+ if entity_id not in allowed_entities or entity_id in hidden_entities:
171
+ continue
203
172
 
204
- # Convert timestamp to datetime and determine time category
205
- if time_fired_ts:
206
- # Convert to local time for time category determination
207
- period = time_category(
208
- datetime.fromtimestamp(time_fired_ts, local_time_zone).hour
209
- )
173
+ if (
174
+ entity_id not in period_results
175
+ and (entry := ent_reg.async_get(entity_id))
176
+ and entry.hidden
177
+ ):
178
+ hidden_entities.add(entity_id)
179
+ continue
210
180
 
211
- # Count entity usage
212
- for entity_id in entity_ids:
213
- results[period][entity_id] += 1
181
+ period_results[entity_id] += 1
214
182
 
215
183
  return EntityUsagePredictions(
216
184
  morning=[
@@ -229,11 +197,40 @@ def _fetch_and_process_data(
229
197
  )
230
198
 
231
199
 
200
+ def _fetch_and_process_data(
201
+ session: Session, ent_reg: er.EntityRegistry, user_id: str
202
+ ) -> Sequence[Row[tuple[bytes | None, float | None, str | None]]]:
203
+ """Fetch and process service call events from the database."""
204
+ thirty_days_ago_ts = (dt_util.utcnow() - timedelta(days=30)).timestamp()
205
+ user_id_bytes = uuid_hex_to_bytes_or_none(user_id)
206
+ if not user_id_bytes:
207
+ raise ValueError("Invalid user_id format")
208
+
209
+ # Build the main query for events with their data
210
+ query = (
211
+ select(
212
+ Events.context_id_bin,
213
+ Events.time_fired_ts,
214
+ EventData.shared_data,
215
+ )
216
+ .select_from(Events)
217
+ .outerjoin(EventData, Events.data_id == EventData.data_id)
218
+ .outerjoin(EventTypes, Events.event_type_id == EventTypes.event_type_id)
219
+ .where(Events.time_fired_ts >= thirty_days_ago_ts)
220
+ .where(Events.context_user_id_bin == user_id_bytes)
221
+ .where(EventTypes.event_type == "call_service")
222
+ .order_by(Events.time_fired_ts)
223
+ )
224
+ return session.connection().execute(query).all()
225
+
226
+
232
227
  def _fetch_with_session(
233
228
  hass: HomeAssistant,
234
- fetch_func: Callable[[Session], EntityUsagePredictions],
229
+ fetch_func: Callable[
230
+ [Session], Sequence[Row[tuple[bytes | None, float | None, str | None]]]
231
+ ],
235
232
  *args: object,
236
- ) -> EntityUsagePredictions:
233
+ ) -> Sequence[Row[tuple[bytes | None, float | None, str | None]]]:
237
234
  """Execute a fetch function with a database session."""
238
235
  with session_scope(hass=hass, read_only=True) as session:
239
236
  return fetch_func(session, *args)
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "select": {
19
19
  "pipeline": {
20
- "name": "Assistent",
20
+ "name": "Assistent{index}",
21
21
  "state": {
22
22
  "preferred": "Voorkeur"
23
23
  }
@@ -50,7 +50,7 @@
50
50
  }
51
51
  },
52
52
  "pipeline": {
53
- "name": "Assistent",
53
+ "name": "Assistent{index}",
54
54
  "state": {
55
55
  "preferred": "Voorkeur"
56
56
  }
homeassistant/const.py CHANGED
@@ -26,7 +26,7 @@ if TYPE_CHECKING:
26
26
  APPLICATION_NAME: Final = "HomeAssistant"
27
27
  MAJOR_VERSION: Final = 2025
28
28
  MINOR_VERSION: Final = 10
29
- PATCH_VERSION: Final = "0b0"
29
+ PATCH_VERSION: Final = "0b2"
30
30
  __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}"
31
31
  __version__: Final = f"{__short_version__}.{PATCH_VERSION}"
32
32
  REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 13, 2)
homeassistant/loader.py CHANGED
@@ -121,6 +121,9 @@ BLOCKED_CUSTOM_INTEGRATIONS: dict[str, BlockedIntegration] = {
121
121
  "variable": BlockedIntegration(
122
122
  AwesomeVersion("3.4.4"), "prevents recorder from working"
123
123
  ),
124
+ # Added in 2025.10.0 because of
125
+ # https://github.com/frenck/spook/issues/1066
126
+ "spook": BlockedIntegration(AwesomeVersion("4.0.0"), "breaks the template engine"),
124
127
  }
125
128
 
126
129
  DATA_COMPONENTS: HassKey[dict[str, ModuleType | ComponentProtocol]] = HassKey(
@@ -39,7 +39,7 @@ habluetooth==5.6.4
39
39
  hass-nabucasa==1.1.1
40
40
  hassil==3.2.0
41
41
  home-assistant-bluetooth==1.13.1
42
- home-assistant-frontend==20250924.0
42
+ home-assistant-frontend==20250925.1
43
43
  home-assistant-intents==2025.9.24
44
44
  httpx==0.28.1
45
45
  ifaddr==0.2.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: homeassistant
3
- Version: 2025.10.0b0
3
+ Version: 2025.10.0b2
4
4
  Summary: Open-source home automation platform running on Python 3.
5
5
  Author-email: The Home Assistant Authors <hello@home-assistant.io>
6
6
  License-Expression: Apache-2.0