Skip to content

Commit d59a91a

Browse files
authored
2025.1.1 (#134940)
2 parents a412ace + 298f059 commit d59a91a

File tree

81 files changed

+922
-238
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+922
-238
lines changed

homeassistant/components/androidtv_remote/strings.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,12 @@
4444
}
4545
},
4646
"apps": {
47-
"title": "Configure Android Apps",
48-
"description": "Configure application id {app_id}",
47+
"title": "Configure Android apps",
48+
"description": "Configure application ID {app_id}",
4949
"data": {
50-
"app_name": "Application Name",
50+
"app_name": "Application name",
5151
"app_id": "Application ID",
52-
"app_icon": "Application Icon",
52+
"app_icon": "Application icon",
5353
"app_delete": "Check to delete this application"
5454
}
5555
}

homeassistant/components/asuswrt/strings.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131
"unknown": "[%key:common::config_flow::error::unknown%]"
3232
},
3333
"abort": {
34-
"invalid_unique_id": "Impossible to determine a valid unique id for the device",
35-
"no_unique_id": "A device without a valid unique id is already configured. Configuration of multiple instance is not possible"
34+
"invalid_unique_id": "Impossible to determine a valid unique ID for the device",
35+
"no_unique_id": "A device without a valid unique ID is already configured. Configuration of multiple instances is not possible"
3636
}
3737
},
3838
"options": {
@@ -42,7 +42,7 @@
4242
"consider_home": "Seconds to wait before considering a device away",
4343
"track_unknown": "Track unknown / unnamed devices",
4444
"interface": "The interface that you want statistics from (e.g. eth0, eth1 etc)",
45-
"dnsmasq": "The location in the router of the dnsmasq.leases files",
45+
"dnsmasq": "The location of the dnsmasq.leases file in the router",
4646
"require_ip": "Devices must have IP (for access point mode)"
4747
}
4848
}

homeassistant/components/backup/manager.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,7 @@ async def _async_upload_backup(
435435
# no point in continuing
436436
raise BackupManagerError(str(result)) from result
437437
if isinstance(result, BackupAgentError):
438+
LOGGER.error("Error uploading to %s: %s", agent_ids[idx], result)
438439
agent_errors[agent_ids[idx]] = result
439440
continue
440441
if isinstance(result, Exception):

homeassistant/components/bluetooth/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@
2020
"bluetooth-auto-recovery==1.4.2",
2121
"bluetooth-data-tools==1.20.0",
2222
"dbus-fast==2.24.3",
23-
"habluetooth==3.6.0"
23+
"habluetooth==3.7.0"
2424
]
2525
}

homeassistant/components/bring/manifest.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@
66
"documentation": "https://www.home-assistant.io/integrations/bring",
77
"integration_type": "service",
88
"iot_class": "cloud_polling",
9+
"loggers": ["bring_api"],
910
"requirements": ["bring-api==0.9.1"]
1011
}

homeassistant/components/cambridge_audio/strings.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
}
1313
},
1414
"discovery_confirm": {
15-
"description": "Do you want to setup {name}?"
15+
"description": "Do you want to set up {name}?"
1616
},
1717
"reconfigure": {
1818
"description": "Reconfigure your Cambridge Audio Streamer.",
@@ -28,7 +28,7 @@
2828
"cannot_connect": "Failed to connect to Cambridge Audio device. Please make sure the device is powered up and connected to the network. Try power-cycling the device if it does not connect."
2929
},
3030
"abort": {
31-
"wrong_device": "This Cambridge Audio device does not match the existing device id. Please make sure you entered the correct IP address.",
31+
"wrong_device": "This Cambridge Audio device does not match the existing device ID. Please make sure you entered the correct IP address.",
3232
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]",
3333
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
3434
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"

homeassistant/components/camera/__init__.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,19 @@ def supported_features(self) -> CameraEntityFeature:
516516
"""Flag supported features."""
517517
return self._attr_supported_features
518518

519+
@property
520+
def supported_features_compat(self) -> CameraEntityFeature:
521+
"""Return the supported features as CameraEntityFeature.
522+
523+
Remove this compatibility shim in 2025.1 or later.
524+
"""
525+
features = self.supported_features
526+
if type(features) is int: # noqa: E721
527+
new_features = CameraEntityFeature(features)
528+
self._report_deprecated_supported_features_values(new_features)
529+
return new_features
530+
return features
531+
519532
@cached_property
520533
def is_recording(self) -> bool:
521534
"""Return true if the device is recording."""
@@ -569,7 +582,7 @@ def frontend_stream_type(self) -> StreamType | None:
569582

570583
self._deprecate_attr_frontend_stream_type_logged = True
571584
return self._attr_frontend_stream_type
572-
if CameraEntityFeature.STREAM not in self.supported_features:
585+
if CameraEntityFeature.STREAM not in self.supported_features_compat:
573586
return None
574587
if (
575588
self._webrtc_provider
@@ -798,7 +811,9 @@ def async_update_token(self) -> None:
798811
async def async_internal_added_to_hass(self) -> None:
799812
"""Run when entity about to be added to hass."""
800813
await super().async_internal_added_to_hass()
801-
self.__supports_stream = self.supported_features & CameraEntityFeature.STREAM
814+
self.__supports_stream = (
815+
self.supported_features_compat & CameraEntityFeature.STREAM
816+
)
802817
await self.async_refresh_providers(write_state=False)
803818

804819
async def async_refresh_providers(self, *, write_state: bool = True) -> None:
@@ -838,7 +853,7 @@ async def _async_get_supported_webrtc_provider[_T](
838853
self, fn: Callable[[HomeAssistant, Camera], Coroutine[None, None, _T | None]]
839854
) -> _T | None:
840855
"""Get first provider that supports this camera."""
841-
if CameraEntityFeature.STREAM not in self.supported_features:
856+
if CameraEntityFeature.STREAM not in self.supported_features_compat:
842857
return None
843858

844859
return await fn(self.hass, self)
@@ -896,7 +911,7 @@ def _invalidate_camera_capabilities_cache(self) -> None:
896911
def camera_capabilities(self) -> CameraCapabilities:
897912
"""Return the camera capabilities."""
898913
frontend_stream_types = set()
899-
if CameraEntityFeature.STREAM in self.supported_features:
914+
if CameraEntityFeature.STREAM in self.supported_features_compat:
900915
if self._supports_native_sync_webrtc or self._supports_native_async_webrtc:
901916
# The camera has a native WebRTC implementation
902917
frontend_stream_types.add(StreamType.WEB_RTC)
@@ -916,7 +931,8 @@ def async_write_ha_state(self) -> None:
916931
"""
917932
super().async_write_ha_state()
918933
if self.__supports_stream != (
919-
supports_stream := self.supported_features & CameraEntityFeature.STREAM
934+
supports_stream := self.supported_features_compat
935+
& CameraEntityFeature.STREAM
920936
):
921937
self.__supports_stream = supports_stream
922938
self._invalidate_camera_capabilities_cache()

homeassistant/components/cloud/backup.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,11 @@ async def async_upload_backup(
181181
headers=details["headers"] | {"content-length": str(backup.size)},
182182
timeout=ClientTimeout(connect=10.0, total=43200.0), # 43200s == 12h
183183
)
184+
_LOGGER.log(
185+
logging.DEBUG if upload_status.status < 400 else logging.WARNING,
186+
"Backup upload status: %s",
187+
upload_status.status,
188+
)
184189
upload_status.raise_for_status()
185190
except (TimeoutError, ClientError) as err:
186191
raise BackupAgentError("Failed to upload backup") from err

homeassistant/components/cookidoo/__init__.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from __future__ import annotations
44

5-
from cookidoo_api import Cookidoo, CookidooConfig, CookidooLocalizationConfig
5+
from cookidoo_api import Cookidoo, CookidooConfig, get_localization_options
66

77
from homeassistant.const import (
88
CONF_COUNTRY,
@@ -22,15 +22,17 @@
2222
async def async_setup_entry(hass: HomeAssistant, entry: CookidooConfigEntry) -> bool:
2323
"""Set up Cookidoo from a config entry."""
2424

25+
localizations = await get_localization_options(
26+
country=entry.data[CONF_COUNTRY].lower(),
27+
language=entry.data[CONF_LANGUAGE],
28+
)
29+
2530
cookidoo = Cookidoo(
2631
async_get_clientsession(hass),
2732
CookidooConfig(
2833
email=entry.data[CONF_EMAIL],
2934
password=entry.data[CONF_PASSWORD],
30-
localization=CookidooLocalizationConfig(
31-
country_code=entry.data[CONF_COUNTRY].lower(),
32-
language=entry.data[CONF_LANGUAGE],
33-
),
35+
localization=localizations[0],
3436
),
3537
)
3638

homeassistant/components/cookidoo/config_flow.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
Cookidoo,
1111
CookidooAuthException,
1212
CookidooConfig,
13-
CookidooLocalizationConfig,
1413
CookidooRequestException,
1514
get_country_options,
1615
get_localization_options,
@@ -219,18 +218,19 @@ async def validate_input(
219218
else:
220219
data_input[CONF_LANGUAGE] = (
221220
await get_localization_options(country=data_input[CONF_COUNTRY].lower())
222-
)[0] # Pick any language to test login
221+
)[0].language # Pick any language to test login
222+
223+
localizations = await get_localization_options(
224+
country=data_input[CONF_COUNTRY].lower(),
225+
language=data_input[CONF_LANGUAGE],
226+
)
223227

224-
session = async_get_clientsession(self.hass)
225228
cookidoo = Cookidoo(
226-
session,
229+
async_get_clientsession(self.hass),
227230
CookidooConfig(
228231
email=data_input[CONF_EMAIL],
229232
password=data_input[CONF_PASSWORD],
230-
localization=CookidooLocalizationConfig(
231-
country_code=data_input[CONF_COUNTRY].lower(),
232-
language=data_input[CONF_LANGUAGE],
233-
),
233+
localization=localizations[0],
234234
),
235235
)
236236
try:

homeassistant/components/cookidoo/manifest.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"documentation": "https://www.home-assistant.io/integrations/cookidoo",
77
"integration_type": "service",
88
"iot_class": "cloud_polling",
9+
"loggers": ["cookidoo_api"],
910
"quality_scale": "silver",
10-
"requirements": ["cookidoo-api==0.10.0"]
11+
"requirements": ["cookidoo-api==0.11.2"]
1112
}

homeassistant/components/cover/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,10 @@ def state_attributes(self) -> dict[str, Any]:
300300
def supported_features(self) -> CoverEntityFeature:
301301
"""Flag supported features."""
302302
if (features := self._attr_supported_features) is not None:
303+
if type(features) is int: # noqa: E721
304+
new_features = CoverEntityFeature(features)
305+
self._report_deprecated_supported_features_values(new_features)
306+
return new_features
303307
return features
304308

305309
supported_features = (

homeassistant/components/enigma2/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@
77
"integration_type": "device",
88
"iot_class": "local_polling",
99
"loggers": ["openwebif"],
10-
"requirements": ["openwebifpy==4.3.0"]
10+
"requirements": ["openwebifpy==4.3.1"]
1111
}

homeassistant/components/eq3btsmart/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,5 @@
2222
"integration_type": "device",
2323
"iot_class": "local_polling",
2424
"loggers": ["eq3btsmart"],
25-
"requirements": ["eq3btsmart==1.4.1", "bleak-esphome==1.1.0"]
25+
"requirements": ["eq3btsmart==1.4.1", "bleak-esphome==2.0.0"]
2626
}

homeassistant/components/esphome/bluetooth.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
from aioesphomeapi import APIClient, DeviceInfo
99
from bleak_esphome import connect_scanner
10-
from bleak_esphome.backend.cache import ESPHomeBluetoothCache
1110

1211
from homeassistant.components.bluetooth import async_register_scanner
1312
from homeassistant.core import CALLBACK_TYPE, HomeAssistant, callback as hass_callback
@@ -28,10 +27,9 @@ def async_connect_scanner(
2827
entry_data: RuntimeEntryData,
2928
cli: APIClient,
3029
device_info: DeviceInfo,
31-
cache: ESPHomeBluetoothCache,
3230
) -> CALLBACK_TYPE:
3331
"""Connect scanner."""
34-
client_data = connect_scanner(cli, device_info, cache, entry_data.available)
32+
client_data = connect_scanner(cli, device_info, entry_data.available)
3533
entry_data.bluetooth_device = client_data.bluetooth_device
3634
client_data.disconnect_callbacks = entry_data.disconnect_callbacks
3735
scanner = client_data.scanner

homeassistant/components/esphome/domain_data.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
from functools import cache
77
from typing import Self
88

9-
from bleak_esphome.backend.cache import ESPHomeBluetoothCache
10-
119
from homeassistant.core import HomeAssistant
1210
from homeassistant.helpers.json import JSONEncoder
1311

@@ -22,9 +20,6 @@ class DomainData:
2220
"""Define a class that stores global esphome data in hass.data[DOMAIN]."""
2321

2422
_stores: dict[str, ESPHomeStorage] = field(default_factory=dict)
25-
bluetooth_cache: ESPHomeBluetoothCache = field(
26-
default_factory=ESPHomeBluetoothCache
27-
)
2823

2924
def get_entry_data(self, entry: ESPHomeConfigEntry) -> RuntimeEntryData:
3025
"""Return the runtime entry data associated with this config entry.

homeassistant/components/esphome/manager.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -423,9 +423,7 @@ async def _on_connnect(self) -> None:
423423

424424
if device_info.bluetooth_proxy_feature_flags_compat(api_version):
425425
entry_data.disconnect_callbacks.add(
426-
async_connect_scanner(
427-
hass, entry_data, cli, device_info, self.domain_data.bluetooth_cache
428-
)
426+
async_connect_scanner(hass, entry_data, cli, device_info)
429427
)
430428

431429
if device_info.voice_assistant_feature_flags_compat(api_version) and (

homeassistant/components/esphome/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"requirements": [
1919
"aioesphomeapi==28.0.0",
2020
"esphome-dashboard-api==1.2.3",
21-
"bleak-esphome==1.1.0"
21+
"bleak-esphome==2.0.0"
2222
],
2323
"zeroconf": ["_esphomelib._tcp.local."]
2424
}

homeassistant/components/flick_electric/__init__.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
from datetime import datetime as dt
44
import logging
5+
from typing import Any
56

67
import jwt
78
from pyflick import FlickAPI
8-
from pyflick.authentication import AbstractFlickAuth
9+
from pyflick.authentication import SimpleFlickAuth
910
from pyflick.const import DEFAULT_CLIENT_ID, DEFAULT_CLIENT_SECRET
1011

1112
from homeassistant.config_entries import ConfigEntry
@@ -93,16 +94,22 @@ async def async_migrate_entry(hass: HomeAssistant, config_entry: ConfigEntry) ->
9394
return True
9495

9596

96-
class HassFlickAuth(AbstractFlickAuth):
97+
class HassFlickAuth(SimpleFlickAuth):
9798
"""Implementation of AbstractFlickAuth based on a Home Assistant entity config."""
9899

99-
def __init__(self, hass: HomeAssistant, entry: ConfigEntry) -> None:
100+
def __init__(self, hass: HomeAssistant, entry: FlickConfigEntry) -> None:
100101
"""Flick authentication based on a Home Assistant entity config."""
101-
super().__init__(aiohttp_client.async_get_clientsession(hass))
102+
super().__init__(
103+
username=entry.data[CONF_USERNAME],
104+
password=entry.data[CONF_PASSWORD],
105+
client_id=entry.data.get(CONF_CLIENT_ID, DEFAULT_CLIENT_ID),
106+
client_secret=entry.data.get(CONF_CLIENT_SECRET, DEFAULT_CLIENT_SECRET),
107+
websession=aiohttp_client.async_get_clientsession(hass),
108+
)
102109
self._entry = entry
103110
self._hass = hass
104111

105-
async def _get_entry_token(self):
112+
async def _get_entry_token(self) -> dict[str, Any]:
106113
# No token saved, generate one
107114
if (
108115
CONF_TOKEN_EXPIRY not in self._entry.data
@@ -119,13 +126,8 @@ async def _get_entry_token(self):
119126
async def _update_token(self):
120127
_LOGGER.debug("Fetching new access token")
121128

122-
token = await self.get_new_token(
123-
username=self._entry.data[CONF_USERNAME],
124-
password=self._entry.data[CONF_PASSWORD],
125-
client_id=self._entry.data.get(CONF_CLIENT_ID, DEFAULT_CLIENT_ID),
126-
client_secret=self._entry.data.get(
127-
CONF_CLIENT_SECRET, DEFAULT_CLIENT_SECRET
128-
),
129+
token = await super().get_new_token(
130+
self._username, self._password, self._client_id, self._client_secret
129131
)
130132

131133
_LOGGER.debug("New token: %s", token)

homeassistant/components/fritz/coordinator.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,18 @@ async def async_setup(
214214
self._options = options
215215
await self.hass.async_add_executor_job(self.setup)
216216

217+
device_registry = dr.async_get(self.hass)
218+
device_registry.async_get_or_create(
219+
config_entry_id=self.config_entry.entry_id,
220+
configuration_url=f"http://{self.host}",
221+
connections={(dr.CONNECTION_NETWORK_MAC, self.mac)},
222+
identifiers={(DOMAIN, self.unique_id)},
223+
manufacturer="AVM",
224+
model=self.model,
225+
name=self.config_entry.title,
226+
sw_version=self.current_firmware,
227+
)
228+
217229
def setup(self) -> None:
218230
"""Set up FritzboxTools class."""
219231

0 commit comments

Comments
 (0)