8000 2025.5.2 by frenck · Pull Request #145072 · home-assistant/core · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

2025.5.2 #145072

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 55 commits into from
May 16, 2025
Merged

2025.5.2 #145072

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
010b044
Allow dns hostnames to be retained for SMLIGHT user flow. (#142514)
tl-sl May 9, 2025
7d163aa
Removed unused file_id param from open_ai_conversation request (#143878)
cadavre May 11, 2025
bde04bc
Doorbell Event is fired just once in homematicip_cloud (#144357)
hahn-th May 14, 2025
48aa6be
Don't scale Roborock mop Path (#144421)
Lash-L May 9, 2025
2fbc75f
Reolink fix privacy mode availability for NVR IPC cams (#144569)
starkillerOG May 9, 2025
36a3513
Bump aiodiscover to 2.7.0 (#144571)
bdraco May 9, 2025
5a95f43
Bump reolink_aio to 0.13.3 (#144583)
starkillerOG May 11, 2025
e9cc624
Mark inkbird coordinator as not needing connectable (#144584)
bdraco May 9, 2025
27db4e9
fix enphase_envoy diagnostics home endpoint name (#144634)
catsmanac May 10, 2025
a54816a
Bump pylamarzocco to 2.0.2 (#144635)
zweckj May 11, 2025
ca14322
bump pyenphase to 1.26.1 (#144641)
catsmanac May 11, 2025
081afe6 8000
Bump ical to 9.2.1 (#144642)
allenporter May 11, 2025
0635856
Bump python-linkplay to v0.2.5 (#144666)
silamon May 11, 2025
543348f
Close Octoprint aiohttp session on unload (#144670)
RubenNL May 11, 2025
358b0c1
Bump holidays to 0.72 (#144671)
gjohansson-ST May 11, 2025
da79d5b
Fix strings typo for Comelit (#144672)
chemelli74 May 11, 2025
cf0911c
Avoid closing shared session for Comelit (#144682)
chemelli74 May 11, 2025
47b4544
Fix wrong state in Husqvarna Automower (#144684)
Thomas55555 May 12, 2025
e465276
Bump voluptuous-openapi to 0.1.0 (#144703)
allenporter May 12, 2025
f1a3d62
Bump ical to 9.2.2 (#144713)
allenporter May 12, 2025
41a503f
Bump gcal-sync to 7.0.1 (#144718)
oyvindwe May 12, 2025
a4a7601
Bump aiocomelit to 0.12.1 (#144720)
chemelli74 May 12, 2025
f25e50b
Fix Netgear handeling of missing MAC in device registry (#144722)
starkillerOG May 15, 2025
b69ebda
Repair Z-Wave unknown controller (#144738)
MartinHjelmare May 12, 2025
9de1d3b
Fill in Plaato URL via placeholders (#144754)
joostlek May 12, 2025
139b484
Cleanup wrongly combined Reolink devices (#144771)
starkillerOG May 16, 2025
c373fa9
Do not show an empty component name on MQTT device subentries not as …
jbouwh May 16, 2025
d82feb8
Fix blocking call in azure storage (#144803)
zweckj May 13, 2025
6c3a4f1
Fix Z-Wave unique id after controller reset (#144813)
MartinHjelmare May 13, 2025
b7c0720
Fix blocking call in azure_storage config flow (#144818)
zweckj May 13, 2025
d9cbd1b
Bump pylamarzocco to 2.0.3 (#144825)
zweckj May 14, 2025
8161ce6
Bump python-snoo to 0.6.6 (#144849)
Lash-L May 14, 2025
3123a7b
Bump ical to 9.2.4 (#144852)
allenporter May 14, 2025
5a83627
Fix wall connector states in Teslemetry (#144855)
Bre77 May 14, 2025
4c4be88
Fix Reolink setup when ONVIF push is unsupported (#144869)
starkillerOG May 14, 2025
e5e1c9f
Fix some Home Connect translation strings (#144905)
rjblake May 16, 2025
bf1d206
Update Tibber lib 0.31.2 (#144908)
Danielhiversen May 14, 2025
543104b
Update mill library 0.12.5 (#144911)
Danielhiversen May 14, 2025
a657964
Fix unknown Pure AQI in Sensibo (#144924)
gjohansson-ST May 15, 2025
f086f4a
Ignore Fronius Gen24 firmware 1.35.4-1 SSL verification issue for new…
farmio May 16, 2025
a952088
Fix Home Assistant Yellow config entry data (#144948)
emontnemery May 15, 2025
19b7cfb
Bump deebot-client to 13.2.0 (#144957)
edenhaus May 15, 2025
0ba55c3
Fix ESPHome entities unavailable if deep sleep enabled after entry se…
oddstr13 May 15, 2025
9f0db98
Strip `_CLIENT` suffix from ZHA event `unique_id` (#145006)
puddly May 16, 2025
715f116
Bump pySmartThings to 3.2.2 (#145033)
joostlek May 16, 2025
0691ad9
Set SmartThings oven setpoint to unknown if its 1 Fahrenheit (#145038)
joostlek May 16, 2025
b76ac68
Fix climate idle state for Comelit (#145059)
chemelli74 May 16, 2025
e2ede3e
Map SmartThings auto mode correctly (#145061)
joostlek May 16, 2025
146e440
Update frontend to 20250516.0 (#145062)
bramkragten May 16, 2025
4906e78
Only set suggested area for new SmartThings devices (#145063)
joostlek May 16, 2025
621a14d
Fix fan AC mode in SmartThings AC (#145064)
joostlek May 16, 2025
8c4eec2
Don't create entities for Smartthings smarttags (#145066)
joostlek May 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions homeassistant/components/azure_storage/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,20 @@ async def async_setup_entry(
session = async_create_clientsession(
hass, timeout=ClientTimeout(connect=10, total=12 * 60 * 60)
)
container_client = ContainerClient(
account_url=f"https://{entry.data[CONF_ACCOUNT_NAME]}.blob.core.windows.net/",
container_name=entry.data[CONF_CONTAINER_NAME],
credential=entry.data[CONF_STORAGE_ACCOUNT_KEY],
transport=AioHttpTransport(session=session),

def create_container_client() -> ContainerClient:
"""Create a ContainerClient."""

return ContainerClient(
account_url=f"https://{entry.data[CONF_ACCOUNT_NAME]}.blob.core.windows.net/",
container_name=entry.data[CONF_CONTAINER_NAME],
credential=entry.data[CONF_STORAGE_ACCOUNT_KEY],
transport=AioHttpTransport(session=session),
)

# has a blocking call to open in cpython
container_client: ContainerClient = await hass.async_add_executor_job(
create_container_client
)

try:
Expand Down
46 changes: 29 additions & 17 deletions homeassistant/components/azure_storage/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,25 @@
class AzureStorageConfigFlow(ConfigFlow, domain=DOMAIN):
"""Handle a config flow for azure storage."""

def get_account_url(self, account_name: str) -> str:
"""Get the account URL."""
return f"https://{account_name}.blob.core.windows.net/"
async def get_container_client(
self, account_name: str, container_name: str, storage_account_key: str
) -> ContainerClient:
"""Get the container client.
ContainerClient has a blocking call to open in cpython
"""

session = async_get_clientsession(self.hass)

def create_container_client() -> ContainerClient:
return ContainerClient(
account_url=f"https://{account_name}.blob.core.windows.net/",
container_name=container_name,
credential=storage_account_key,
transport=AioHttpTransport(session=session),
)

return await self.hass.async_add_executor_job(create_container_client)

async def validate_config(
self, container_client: ContainerClient
Expand Down Expand Up @@ -58,11 +74,10 @@ async def async_step_user(
self._async_abort_entries_match(
{CONF_ACCOUNT_NAME: user_input[CONF_ACCOUNT_NAME]}
)
container_client = ContainerClient(
account_url=self.get_account_url(user_input[CONF_ACCOUNT_NAME]),
container_client = await self.get_container_client(
account_name=user_input[CONF_ACCOUNT_NAME],
container_name=user_input[CONF_CONTAINER_NAME],
credential=user_input[CONF_STORAGE_ACCOUNT_KEY],
transport=AioHttpTransport(session=async_get_clientsession(self.hass)),
storage_account_key=user_input[CONF_STORAGE_ACCOUNT_KEY],
)
errors = await self.validate_config(container_client)

Expand Down Expand Up @@ -99,12 +114,12 @@ async def async_step_reauth_confirm(
reauth_entry = self._get_reauth_entry()

if user_input is not None:
container_client = ContainerClient(
account_url=self.get_account_url(reauth_entry.data[CONF_ACCOUNT_NAME]),
container_client = await self.get_container_client(
account_name=reauth_entry.data[CONF_ACCOUNT_NAME],
container_name=reauth_entry.data[CONF_CONTAINER_NAME],
credential=user_input[CONF_STORAGE_ACCOUNT_KEY],
transport=AioHttpTransport(session=async_get_clientsession(self.hass)),
storage_account_key=user_input[CONF_STORAGE_ACCOUNT_KEY],
)

errors = await self.validate_config(container_client)
if not errors:
return self.async_update_reload_and_abort(
Expand All @@ -129,13 +144,10 @@ async def async_step_reconfigure(
reconfigure_entry = self._get_reconfigure_entry()

if user_input is not None:
container_client = ContainerClient(
account_url=self.get_account_url(
reconfigure_entry.data[CONF_ACCOUNT_NAME]
),
container_client = await self.get_container_client(
account_name=reconfigure_entry.data[CONF_ACCOUNT_NAME],
container_name=user_input[CONF_CONTAINER_NAME],
credential=user_input[CONF_STORAGE_ACCOUNT_KEY],
transport=AioHttpTransport(session=async_get_clientsession(self.hass)),
storage_account_key=user_input[CONF_STORAGE_ACCOUNT_KEY],
)
errors = await self.validate_config(container_client)
if not errors:
Expand Down
1 change: 0 additions & 1 deletion homeassistant/components/comelit/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,5 @@ async def async_unload_entry(hass: HomeAssistant, entry: ComelitConfigEntry) ->
coordinator = entry.runtime_data
if unload_ok := await hass.config_entries.async_unload_platforms(entry, platforms):
await coordinator.api.logout()
await coordinator.api.close()

return unload_ok
4 changes: 1 addition & 3 deletions homeassistant/components/comelit/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,11 +134,9 @@ def _update_attributes(self) -> None:
self._attr_current_temperature = values[0] / 10

self._attr_hvac_action = None
if _mode == ClimaComelitMode.OFF:
self._attr_hvac_action = HVACAction.OFF
if not _active:
self._attr_hvac_action = HVACAction.IDLE
if _mode in API_STATUS:
elif _mode in API_STATUS:
self._attr_hvac_action = API_STATUS[_mode]["hvac_action"]

self._attr_hvac_mode = None
Expand Down
1 change: 0 additions & 1 deletion homeassistant/components/comelit/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,6 @@ async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> dict[str,
) from err
finally:
await api.logout()
await api.close()

return {"title": data[CONF_HOST]}

Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/comelit/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@
"iot_class": "local_polling",
"loggers": ["aiocomelit"],
"quality_scale": "bronze",
"requirements": ["aiocomelit==0.12.0"]
"requirements": ["aiocomelit==0.12.1"]
}
2 changes: 1 addition & 1 deletion homeassistant/components/comelit/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@
"cannot_authenticate": {
"message": "Error authenticating"
},
"updated_failed": {
"update_failed": {
"message": "Failed to update data: {error}"
}
}
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/dhcp/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
"quality_scale": "internal",
"requirements": [
"aiodhcpwatcher==1.1.1",
"aiodiscover==2.6.1",
"aiodiscover==2.7.0",
"cached-ipaddress==0.10.0"
]
}
2 changes: 1 addition & 1 deletion homeassistant/components/ecovacs/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/ecovacs",
"iot_class": "cloud_push",
"loggers": ["sleekxmppfs", "sucks", "deebot_client"],
"requirements": ["py-sucks==0.9.10", "deebot-client==13.1.0"]
"requirements": ["py-sucks==0.9.10", "deebot-client==13.2.0"]
}
39 changes: 35 additions & 4 deletions homeassistant/components/ecovacs/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
from dataclasses import dataclass
from typing import Any, Generic

from deebot_client.capabilities import CapabilityEvent, CapabilityLifeSpan
from deebot_client.capabilities import CapabilityEvent, CapabilityLifeSpan, DeviceType
from deebot_client.device import Device
from deebot_client.events import (
BatteryEvent,
ErrorEvent,
Expand Down Expand Up @@ -34,7 +35,7 @@
UnitOfArea,
UnitOfTime,
)
from homeassistant.core import HomeAssistant
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.typing import StateType

Expand All @@ -59,6 +60,15 @@ class EcovacsSensorEntityDescription(
"""Ecovacs sensor entity description."""

value_fn: Callable[[EventT], StateType]
native_unit_of_measurement_fn: Callable[[DeviceType], str | None] | None = None


@callback
def get_area_native_unit_of_measurement(device_type: DeviceType) -> str | None:
"""Get the area native unit of measurement based on device type."""
if device_type is DeviceType.MOWER:
return UnitOfArea.SQUARE_CENTIMETERS
return UnitOfArea.SQUARE_METERS


ENTITY_DESCRIPTIONS: tuple[EcovacsSensorEntityDescription, ...] = (
Expand All @@ -68,7 +78,7 @@ class EcovacsSensorEntityDescription(
capability_fn=lambda caps: caps.stats.clean,
value_fn=lambda e: e.area,
translation_key="stats_area",
native_unit_of_measurement=UnitOfArea.SQUARE_METERS,
native_unit_of_measurement_fn=get_area_native_unit_of_measurement,
),
EcovacsSensorEntityDescription[StatsEvent](
key="stats_time",
Expand All @@ -85,7 +95,7 @@ class EcovacsSensorEntityDescription(
value_fn=lambda e: e.area,
key="total_stats_area",
translation_key="total_stats_area",
native_unit_of_measurement=UnitOfArea.SQUARE_METERS,
native_unit_of_measurement_fn=get_area_native_unit_of_measurement,
state_class=SensorStateClass.TOTAL_INCREASING,
),
EcovacsSensorEntityDescription[TotalStatsEvent](
Expand Down Expand Up @@ -249,6 +259,27 @@ class EcovacsSensor(

entity_description: EcovacsSensorEntityDescription

def __init__(
self,
device: Device,
capability: CapabilityEvent,
entity_description: EcovacsSensorEntityDescription,
**kwargs: Any,
) -> None:
"""Initialize entity."""
super().__init__(device, capability, entity_description, **kwargs)
if (
entity_description.native_unit_of_measurement_fn
and (
native_unit_of_measurement
:= entity_description.native_unit_of_measurement_fn(
device.capabilities.device_type
)
)
is not None
):
self._attr_native_unit_of_measurement = native_unit_of_measurement

async def async_added_to_hass(self) -> None:
"""Set up the event listeners now that hass is ready."""
await super().async_added_to_hass()
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/enphase_envoy/diagnostics.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ async def _get_fixture_collection(envoy: Envoy, serial: str) -> dict[str, Any]:
"/ivp/ensemble/generator",
"/ivp/meters",
"/ivp/meters/readings",
"/home,",
"/home",
]

for end_point in end_points:
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/enphase_envoy/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"iot_class": "local_polling",
"loggers": ["pyenphase"],
"quality_scale": "platinum",
"requirements": ["pyenphase==1.26.0"],
"requirements": ["pyenphase==1.26.1"],
"zeroconf": [
{
"type": "_enphase-envoy._tcp.local."
Expand Down
6 changes: 5 additions & 1 deletion homeassistant/components/esphome/entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,6 @@ def __init__(
self._states = cast(dict[int, _StateT], entry_data.state[state_type])
assert entry_data.device_info is not None
device_info = entry_data.device_info
self._device_info = device_info
self._on_entry_data_changed()
self._key = entity_info.key
self._state_type = state_type
Expand Down Expand Up @@ -311,6 +310,11 @@ def _on_state_update(self) -> None:
@callback
def _on_entry_data_changed(self) -> None:
entry_data = self._entry_data
# Update the device info since it can change
# when the device is reconnected
if TYPE_CHECKING:
assert entry_data.device_info is not None
self._device_info = entry_data.device_info
self._api_version = entry_data.api_version
self._client = entry_data.client
if self._device_info.has_deep_sleep:
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/fronius/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ async def validate_host(
hass: HomeAssistant, host: str
) -> tuple[str, FroniusConfigEntryData]:
"""Validate the user input allows us to connect."""
fronius = Fronius(async_get_clientsession(hass), host)
fronius = Fronius(async_get_clientsession(hass, verify_ssl=False), host)

try:
datalogger_info: dict[str, Any]
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/frontend/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@
"documentation": "https://www.home-assistant.io/integrations/frontend",
"integration_type": "system",
"quality_scale": "internal",
"requirements": ["home-assistant-frontend==20250509.0"]
"requirements": ["home-assistant-frontend==20250516.0"]
}
2 changes: 1 addition & 1 deletion homeassistant/components/google/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
"documentation": "https://www.home-assistant.io/integrations/google",
"iot_class": "cloud_polling",
"loggers": ["googleapiclient"],
"requirements": ["gcal-sync==7.0.0", "oauth2client==4.1.3", "ical==9.2.0"]
"requirements": ["gcal-sync==7.0.1", "oauth2client==4.1.3", "ical==9.2.4"]
}
2 changes: 1 addition & 1 deletion homeassistant/components/holiday/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/holiday",
"iot_class": "local_polling",
"requirements": ["holidays==0.70", "babel==2.15.0"]
"requirements": ["holidays==0.72", "babel==2.15.0"]
}
4 changes: 2 additions & 2 deletions homeassistant/components/home_connect/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@
"consumer_products_coffee_maker_program_coffee_world_black_eye": "Black eye",
"consumer_products_coffee_maker_program_coffee_world_dead_eye": "Dead eye",
"consumer_products_coffee_maker_program_beverage_hot_water": "Hot water",
"dishcare_dishwasher_program_pre_rinse": "Pre_rinse",
"dishcare_dishwasher_program_pre_rinse": "Pre-rinse",
"dishcare_dishwasher_program_auto_1": "Auto 1",
"dishcare_dishwasher_program_auto_2": "Auto 2",
"dishcare_dishwasher_program_auto_3": "Auto 3",
Expand All @@ -252,7 +252,7 @@
"dishcare_dishwasher_program_intensiv_power": "Intensive power",
"dishcare_dishwasher_program_magic_daily": "Magic daily",
"dishcare_dishwasher_program_super_60": "Super 60ºC",
"dishcare_dishwasher_program_kurz_60": "Kurz 60ºC",
"dishcare_dishwasher_program_kurz_60": "Speed 60ºC",
"dishcare_dishwasher_program_express_sparkle_65": "Express sparkle 65ºC",
"dishcare_dishwasher_program_machine_care": "Machine care",
"dishcare_dishwasher_program_steam_fresh": "Steam fresh",
Expand Down
9 changes: 5 additions & 4 deletions homeassistant/components/homeassistant_yellow/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,16 +90,17 @@ async def async_migrate_entry(hass: HomeAssistant, config_entry: ConfigEntry) ->
minor_version=2,
)

if config_entry.minor_version == 2:
# Add a `firmware_version` key
if config_entry.minor_version <= 3:
# Add a `firmware_version` key if it doesn't exist to handle entries created
# with minor version 1.3 where the firmware version was not set.
hass.config_entries.async_update_entry(
config_entry,
data={
**config_entry.data,
FIRMWARE_VERSION: None,
FIRMWARE_VERSION: config_entry.data.get(FIRMWARE_VERSION),
},
version=1,
minor_version=3,
minor_version=4,
)

_LOGGER.debug(
Expand Down
A6F8
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class HomeAssistantYellowConfigFlow(BaseFirmwareConfigFlow, domain=DOMAIN):
"""Handle a config flow for Home Assistant Yellow."""

VERSION = 1
MINOR_VERSION = 3
MINOR_VERSION = 4

def __init__(self, *args: Any, **kwargs: Any) -> None:
"""Instantiate config flow."""
Expand Down Expand Up @@ -116,6 +116,11 @@ def _async_flow_finished(self) -> ConfigFlowResult:
if self._probed_firmware_info is not None
else ApplicationType.EZSP
).value,
FIRMWARE_VERSION: (
self._probed_firmware_info.firmware_version
if self._probed_firmware_info is not None
else None
),
},
)

Expand Down
Loading
Loading
0