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.
- homeassistant/components/accuweather/manifest.json +1 -1
- homeassistant/components/accuweather/translations/nl.json +7 -1
- homeassistant/components/airzone/translations/nl.json +5 -0
- homeassistant/components/airzone/translations/zh-Hans.json +10 -0
- homeassistant/components/alexa_devices/binary_sensor.py +36 -38
- homeassistant/components/alexa_devices/config_flow.py +2 -2
- homeassistant/components/alexa_devices/coordinator.py +1 -1
- homeassistant/components/alexa_devices/diagnostics.py +1 -3
- homeassistant/components/alexa_devices/icons.json +0 -40
- homeassistant/components/alexa_devices/manifest.json +2 -2
- homeassistant/components/alexa_devices/sensor.py +13 -0
- homeassistant/components/alexa_devices/strings.json +0 -20
- homeassistant/components/alexa_devices/switch.py +27 -7
- homeassistant/components/alexa_devices/translations/bg.json +0 -13
- homeassistant/components/alexa_devices/translations/cs.json +0 -20
- homeassistant/components/alexa_devices/translations/de.json +0 -20
- homeassistant/components/alexa_devices/translations/el.json +0 -20
- homeassistant/components/alexa_devices/translations/en-GB.json +0 -20
- homeassistant/components/alexa_devices/translations/en.json +0 -20
- homeassistant/components/alexa_devices/translations/es.json +0 -20
- homeassistant/components/alexa_devices/translations/et.json +0 -20
- homeassistant/components/alexa_devices/translations/ga.json +0 -20
- homeassistant/components/alexa_devices/translations/he.json +0 -7
- homeassistant/components/alexa_devices/translations/hu.json +0 -20
- homeassistant/components/alexa_devices/translations/it.json +0 -20
- homeassistant/components/alexa_devices/translations/ja.json +0 -19
- homeassistant/components/alexa_devices/translations/lt.json +0 -20
- homeassistant/components/alexa_devices/translations/mk.json +0 -14
- homeassistant/components/alexa_devices/translations/nl.json +0 -20
- homeassistant/components/alexa_devices/translations/pl.json +0 -5
- homeassistant/components/alexa_devices/translations/pt.json +0 -20
- homeassistant/components/alexa_devices/translations/ru.json +0 -5
- homeassistant/components/alexa_devices/translations/sk.json +0 -20
- homeassistant/components/alexa_devices/translations/sv.json +0 -20
- homeassistant/components/alexa_devices/translations/tr.json +0 -5
- homeassistant/components/alexa_devices/translations/zh-Hans.json +0 -20
- homeassistant/components/alexa_devices/translations/zh-Hant.json +0 -20
- homeassistant/components/alexa_devices/utils.py +24 -1
- homeassistant/components/assist_pipeline/translations/nl.json +1 -0
- homeassistant/components/blue_current/translations/zh-Hans.json +44 -0
- homeassistant/components/comelit/manifest.json +1 -1
- homeassistant/components/cync/translations/cs.json +32 -0
- homeassistant/components/cync/translations/nl.json +20 -0
- homeassistant/components/cync/translations/sk.json +32 -0
- homeassistant/components/cync/translations/zh-Hans.json +32 -0
- homeassistant/components/cync/translations/zh-Hant.json +32 -0
- homeassistant/components/ekeybionyx/translations/nl.json +24 -0
- homeassistant/components/ekeybionyx/translations/zh-Hans.json +66 -0
- homeassistant/components/esphome/config_flow.py +9 -1
- homeassistant/components/esphome/manager.py +10 -0
- homeassistant/components/esphome/manifest.json +1 -1
- homeassistant/components/esphome/translations/nl.json +1 -1
- homeassistant/components/frontend/manifest.json +1 -1
- homeassistant/components/letpot/translations/nl.json +5 -0
- homeassistant/components/letpot/translations/zh-Hans.json +10 -0
- homeassistant/components/libre_hardware_monitor/manifest.json +1 -1
- homeassistant/components/mvglive/manifest.json +2 -4
- homeassistant/components/mvglive/sensor.py +116 -86
- homeassistant/components/portainer/binary_sensor.py +9 -1
- homeassistant/components/portainer/entity.py +1 -1
- homeassistant/components/roborock/coordinator.py +3 -7
- homeassistant/components/route_b_smart_meter/translations/nl.json +24 -0
- homeassistant/components/route_b_smart_meter/translations/zh-Hans.json +42 -0
- homeassistant/components/smartthings/manifest.json +1 -1
- homeassistant/components/smartthings/translations/nl.json +7 -0
- homeassistant/components/smartthings/translations/zh-Hans.json +21 -0
- homeassistant/components/switchbot/translations/nl.json +5 -0
- homeassistant/components/switchbot_cloud/translations/nl.json +2 -1
- homeassistant/components/tolo/translations/nl.json +2 -1
- homeassistant/components/usage_prediction/common_control.py +56 -59
- homeassistant/components/voip/translations/nl.json +1 -1
- homeassistant/components/wyoming/translations/nl.json +1 -1
- homeassistant/const.py +1 -1
- homeassistant/loader.py +3 -0
- homeassistant/package_constraints.txt +1 -1
- {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b2.dist-info}/METADATA +1 -1
- {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b2.dist-info}/RECORD +82 -73
- {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b2.dist-info}/WHEEL +0 -0
- {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b2.dist-info}/entry_points.txt +0 -0
- {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b2.dist-info}/licenses/LICENSE.md +0 -0
- {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b2.dist-info}/licenses/homeassistant/backports/LICENSE.Python +0 -0
- {homeassistant-2025.10.0b0.dist-info → homeassistant-2025.10.0b2.dist-info}/top_level.txt +0 -0
|
@@ -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
|
},
|
|
@@ -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
|
-
|
|
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
|
-
#
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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
|
-
|
|
202
|
-
|
|
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
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
|
|
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[
|
|
229
|
+
fetch_func: Callable[
|
|
230
|
+
[Session], Sequence[Row[tuple[bytes | None, float | None, str | None]]]
|
|
231
|
+
],
|
|
235
232
|
*args: object,
|
|
236
|
-
) ->
|
|
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)
|
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 = "
|
|
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(
|