Skip to content

2025.4.1 #142299

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 25 commits into from
Apr 4, 2025
Merged

2025.4.1 #142299

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
9070a8d
Fix blocking event loop - daikin (#141442)
fredrike Apr 3, 2025
802ad2f
Made Google Search enable dependent on Assist availability (#141712)
IvanLH Apr 3, 2025
06ebe08
Fix humidifier platform for Comelit (#141854)
chemelli74 Apr 2, 2025
f8d284e
Bump evohome-async to 1.0.5 (#141871)
zxdavb Apr 4, 2025
109d209
Replace "to log into" with "to log in to" in `incomfort` (#142060)
NoRi2909 Apr 2, 2025
854cae7
Avoid unnecessary reload in apple_tv reauth flow (#142079)
emontnemery Apr 2, 2025
04be575
Add translation for hassio update entity name (#142090)
piitaya Apr 3, 2025
490e320
Bump pyenphase to 1.25.5 (#142107)
catsmanac Apr 3, 2025
7546b5d
Hide broken ZBT-1 config entries on the hardware page (#142110)
puddly Apr 4, 2025
281beec
Bump pysmhi to 1.0.1 (#142111)
gjohansson-ST Apr 3, 2025
fe65579
Avoid logging a warning when replacing an ignored config entry (#142114)
bdraco Apr 3, 2025
e5c00ec
Slow down polling in Tesla Fleet (#142130)
Bre77 Apr 4, 2025
6410b90
Bump tesla-fleet-api to v1.0.17 (#142131)
Bre77 Apr 3, 2025
4643fc2
Tado bump to 0.18.11 (#142175)
erwindouna Apr 3, 2025
2a49960
Add preset mode to SmartThings climate (#142180)
joostlek Apr 3, 2025
c43a468
Do not create a HA mediaplayer for the builtin Music Assistant player…
marcelveldt Apr 3, 2025
9db60c8
Do not fetch disconnected Home Connect appliances (#142200)
Diegorro98 Apr 4, 2025
86eee4f
Fix fibaro setup (#142201)
rappenze Apr 3, 2025
e9abdab
Fix circular mean by always storing and using the weighted one (#142208)
edenhaus Apr 4, 2025
7bd517e
Bump pySmartThings to 3.0.2 (#142257)
joostlek Apr 4, 2025
f46e659
Update frontend to 20250404.0 (#142274)
bramkragten Apr 4, 2025
af708b7
Bump forecast-solar lib to v4.1.0 (#142280)
klaasnicolaas Apr 4, 2025
4f79906
Bump version to 2025.4.1
frenck Apr 4, 2025
8d62cb6
Fix skyconnect tests (#142262)
zweckj Apr 4, 2025
c25f26a
Fix empty actions (#142292)
Petro31 Apr 4, 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
5 changes: 4 additions & 1 deletion homeassistant/components/apple_tv/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from homeassistant.components import zeroconf
from homeassistant.config_entries import (
SOURCE_IGNORE,
SOURCE_REAUTH,
SOURCE_ZEROCONF,
ConfigEntry,
ConfigFlow,
Expand Down Expand Up @@ -381,7 +382,9 @@ async def async_find_device(self, allow_exist: bool = False) -> None:
CONF_IDENTIFIERS: list(combined_identifiers),
},
)
if entry.source != SOURCE_IGNORE:
# Don't reload ignored entries or in the middle of reauth,
# e.g. if the user is entering a new PIN
if entry.source != SOURCE_IGNORE and self.source != SOURCE_REAUTH:
self.hass.config_entries.async_schedule_reload(entry.entry_id)
if not allow_exist:
raise DeviceAlreadyConfigured
Expand Down
6 changes: 5 additions & 1 deletion homeassistant/components/comelit/humidifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@

async def async_set_humidity(self, humidity: int) -> None:
"""Set new target humidity."""
if self.mode == HumidifierComelitMode.OFF:
if not self._attr_is_on:

Check warning on line 165 in homeassistant/components/comelit/humidifier.py

View check run for this annotation

Codecov / codecov/patch

homeassistant/components/comelit/humidifier.py#L165

Added line #L165 was not covered by tests
raise ServiceValidationError(
translation_domain=DOMAIN,
translation_key="humidity_while_off",
Expand Down Expand Up @@ -190,9 +190,13 @@
await self.coordinator.api.set_humidity_status(
self._device.index, self._set_command
)
self._attr_is_on = True
self.async_write_ha_state()

Check warning on line 194 in homeassistant/components/comelit/humidifier.py

View check run for this annotation

Codecov / codecov/patch

homeassistant/components/comelit/humidifier.py#L193-L194

Added lines #L193 - L194 were not covered by tests

async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn off."""
await self.coordinator.api.set_humidity_status(
self._device.index, HumidifierComelitCommand.OFF
)
self._attr_is_on = False
self.async_write_ha_state()

Check warning on line 202 in homeassistant/components/comelit/humidifier.py

View check run for this annotation

Codecov / codecov/patch

homeassistant/components/comelit/humidifier.py#L201-L202

Added lines #L201 - L202 were not covered by tests
4 changes: 3 additions & 1 deletion homeassistant/components/comelit/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,9 @@
"rest": "Rest",
"sabotated": "Sabotated"
}
},
}
},
"humidifier": {
"humidifier": {
"name": "Humidifier"
},
Expand Down
2 changes: 2 additions & 0 deletions homeassistant/components/daikin/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from homeassistant.helpers import device_registry as dr, entity_registry as er
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.device_registry import CONNECTION_NETWORK_MAC
from homeassistant.util.ssl import client_context_no_verify

from .const import KEY_MAC, TIMEOUT
from .coordinator import DaikinConfigEntry, DaikinCoordinator
Expand Down Expand Up @@ -48,6 +49,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: DaikinConfigEntry) -> bo
key=entry.data.get(CONF_API_KEY),
uuid=entry.data.get(CONF_UUID),
password=entry.data.get(CONF_PASSWORD),
ssl_context=client_context_no_verify(),
)
_LOGGER.debug("Connection to %s successful", host)
except TimeoutError as err:
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/daikin/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@
"documentation": "https://www.home-assistant.io/integrations/daikin",
"iot_class": "local_polling",
"loggers": ["pydaikin"],
"requirements": ["pydaikin==2.14.1"],
"requirements": ["pydaikin==2.15.0"],
"zeroconf": ["_dkapi._tcp.local."]
}
2 changes: 1 addition & 1 deletion homeassistant/components/enphase_envoy/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"documentation": "https://www.home-assistant.io/integrations/enphase_envoy",
"iot_class": "local_polling",
"loggers": ["pyenphase"],
"requirements": ["pyenphase==1.25.1"],
"requirements": ["pyenphase==1.25.5"],
"zeroconf": [
{
"type": "_enphase-envoy._tcp.local."
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/evohome/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
"iot_class": "cloud_polling",
"loggers": ["evohome", "evohomeasync", "evohomeasync2"],
"quality_scale": "legacy",
"requirements": ["evohome-async==1.0.4"]
"requirements": ["evohome-async==1.0.5"]
}
1 change: 1 addition & 0 deletions homeassistant/components/fibaro/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,7 @@ def _read_devices(self) -> None:
device.ha_id = (
f"{slugify(room_name)}_{slugify(device.name)}_{device.fibaro_id}"
)
platform = None
if device.enabled and (not device.is_plugin or self._import_plugins):
platform = self._map_device_to_platform(device)
if platform is None:
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/forecast_solar/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/forecast_solar",
"integration_type": "service",
"iot_class": "cloud_polling",
"requirements": ["forecast-solar==4.0.0"]
"requirements": ["forecast-solar==4.1.0"]
}
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==20250401.0"]
"requirements": ["home-assistant-frontend==20250404.0"]
}
Original file line number Diff line number Diff line change
Expand Up @@ -179,28 +179,30 @@ async def async_step_init(
) -> ConfigFlowResult:
"""Manage the options."""
options: dict[str, Any] | MappingProxyType[str, Any] = self.config_entry.options
errors: dict[str, str] = {}

if user_input is not None:
if user_input[CONF_RECOMMENDED] == self.last_rendered_recommended:
if user_input[CONF_LLM_HASS_API] == "none":
user_input.pop(CONF_LLM_HASS_API)
return self.async_create_entry(title="", data=user_input)
if not (
user_input.get(CONF_LLM_HASS_API, "none") != "none"
and user_input.get(CONF_USE_GOOGLE_SEARCH_TOOL, False) is True
):
# Don't allow to save options that enable the Google Seearch tool with an Assist API
return self.async_create_entry(title="", data=user_input)
errors[CONF_USE_GOOGLE_SEARCH_TOOL] = "invalid_google_search_option"

# Re-render the options again, now with the recommended options shown/hidden
self.last_rendered_recommended = user_input[CONF_RECOMMENDED]

options = {
CONF_RECOMMENDED: user_input[CONF_RECOMMENDED],
CONF_PROMPT: user_input[CONF_PROMPT],
CONF_LLM_HASS_API: user_input[CONF_LLM_HASS_API],
}
options = user_input

schema = await google_generative_ai_config_option_schema(
self.hass, options, self._genai_client
)
return self.async_show_form(
step_id="init",
data_schema=vol.Schema(schema),
step_id="init", data_schema=vol.Schema(schema), errors=errors
)


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@
"prompt": "Instruct how the LLM should respond. This can be a template."
}
}
},
"error": {
"invalid_google_search_option": "Google Search cannot be enabled alongside any Assist capability, this can only be used when Assist is set to \"No control\"."
}
},
"services": {
Expand Down
5 changes: 5 additions & 0 deletions homeassistant/components/hassio/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,11 @@
"version_latest": {
"name": "Newest version"
}
},
"update": {
"update": {
"name": "[%key:component::update::title%]"
}
}
},
"services": {
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/hassio/update.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
from .update_helper import update_addon, update_core

ENTITY_DESCRIPTION = UpdateEntityDescription(
name="Update",
translation_key="update",
key=ATTR_VERSION_LATEST,
)

Expand Down
32 changes: 23 additions & 9 deletions homeassistant/components/home_connect/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,19 @@ def update(self, other: HomeConnectApplianceData) -> None:
self.settings.update(other.settings)
self.status.update(other.status)

@classmethod
def empty(cls, appliance: HomeAppliance) -> HomeConnectApplianceData:
"""Return empty data."""
return cls(
commands=set(),
events={},
info=appliance,
options={},
programs=[],
settings={},
status={},
)


class HomeConnectCoordinator(
DataUpdateCoordinator[dict[str, HomeConnectApplianceData]]
Expand Down Expand Up @@ -358,15 +371,7 @@ async def _async_setup(self) -> None:
model=appliance.vib,
)
if appliance.ha_id not in self.data:
self.data[appliance.ha_id] = HomeConnectApplianceData(
commands=set(),
events={},
info=appliance,
options={},
programs=[],
settings={},
status={},
)
self.data[appliance.ha_id] = HomeConnectApplianceData.empty(appliance)
else:
self.data[appliance.ha_id].info.connected = appliance.connected
old_appliances.remove(appliance.ha_id)
Expand Down Expand Up @@ -402,6 +407,15 @@ async def _get_appliance_data(
name=appliance.name,
model=appliance.vib,
)
if not appliance.connected:
_LOGGER.debug(
"Appliance %s is not connected, skipping data fetch",
appliance.ha_id,
)
if appliance_data_to_update:
appliance_data_to_update.info.connected = False
return appliance_data_to_update
return HomeConnectApplianceData.empty(appliance)
try:
settings = {
setting.key: setting
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,21 @@
from homeassistant.components.hardware.models import HardwareInfo, USBInfo
from homeassistant.core import HomeAssistant, callback

from .config_flow import HomeAssistantSkyConnectConfigFlow
from .const import DOMAIN
from .util import get_hardware_variant

DOCUMENTATION_URL = "https://skyconnect.home-assistant.io/documentation/"
EXPECTED_ENTRY_VERSION = (
HomeAssistantSkyConnectConfigFlow.VERSION,
HomeAssistantSkyConnectConfigFlow.MINOR_VERSION,
)


@callback
def async_info(hass: HomeAssistant) -> list[HardwareInfo]:
"""Return board info."""
entries = hass.config_entries.async_entries(DOMAIN)

return [
HardwareInfo(
board=None,
Expand All @@ -31,4 +35,6 @@ def async_info(hass: HomeAssistant) -> list[HardwareInfo]:
url=DOCUMENTATION_URL,
)
for entry in entries
# Ignore unmigrated config entries in the hardware page
if (entry.version, entry.minor_version) == EXPECTED_ENTRY_VERSION
]
8 changes: 4 additions & 4 deletions homeassistant/components/incomfort/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
},
"data_description": {
"host": "Hostname or IP-address of the Intergas gateway.",
"username": "The username to log into the gateway. This is `admin` in most cases.",
"password": "The password to log into the gateway, is printed at the bottom of the gateway or is `intergas` for some older devices."
"username": "The username to log in to the gateway. This is `admin` in most cases.",
"password": "The password to log in to the gateway, is printed at the bottom of the gateway or is `intergas` for some older devices."
}
},
"dhcp_auth": {
Expand All @@ -22,8 +22,8 @@
"password": "[%key:common::config_flow::data::password%]"
},
"data_description": {
"username": "The username to log into the gateway. This is `admin` in most cases.",
"password": "The password to log into the gateway, is printed at the bottom of the Gateway or is `intergas` for some older devices."
"username": "[%key:component::incomfort::config::step::user::data_description::username%]",
"password": "[%key:component::incomfort::config::step::user::data_description::password%]"
}
},
"dhcp_confirm": {
Expand Down
4 changes: 4 additions & 0 deletions homeassistant/components/music_assistant/media_player.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,8 @@
assert event.object_id is not None
if event.object_id in added_ids:
return
if not player.expose_to_ha:
return

Check warning on line 155 in homeassistant/components/music_assistant/media_player.py

View check run for this annotation

Codecov / codecov/patch

homeassistant/components/music_assistant/media_player.py#L154-L155

Added lines #L154 - L155 were not covered by tests
added_ids.add(event.object_id)
async_add_entities([MusicAssistantPlayer(mass, event.object_id)])

Expand All @@ -159,6 +161,8 @@
mass_players = []
# add all current players
for player in mass.players:
if not player.expose_to_ha:
continue

Check warning on line 165 in homeassistant/components/music_assistant/media_player.py

View check run for this annotation

Codecov / codecov/patch

homeassistant/components/music_assistant/media_player.py#L165

Added line #L165 was not covered by tests
added_ids.add(player.player_id)
mass_players.append(MusicAssistantPlayer(mass, player.player_id))

Expand Down
Loading