Skip to content

[pull] dev from home-assistant:dev #642

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 37 commits into from
Apr 30, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
441bca5
Use CONF_PIN in SamsungTv config flow (#143621)
chemelli74 Apr 30, 2025
ef023f0
Ensure port is stored and used in SamsungTV legacy bridge (#143940)
epenet Apr 30, 2025
4ac29c6
Remove redundant turn_on/turn_off methods in samsungtv (#143939)
epenet Apr 30, 2025
a7af0ea
Add retry restore step to ZWave-JS migration (#143934)
MindFreeze Apr 30, 2025
40217e7
Allow overriding blueprinted templates (#143874)
emontnemery Apr 30, 2025
73a1dbf
Fix invalid-else in samsungtv (#143942)
epenet Apr 30, 2025
6c63366
Add Rehlko (formerly Kohler Energy Management) Integration (#143602)
PeteRager Apr 30, 2025
6168fe0
Remove Oncue integration (#143945)
joostlek Apr 30, 2025
8fafbfa
Change function alias to proxy in ista EcoTrend (#143911)
tr4nt0r Apr 30, 2025
e24082b
Fix incorrect return types in samsungtv tests (#143937)
epenet Apr 30, 2025
ae118da
Bump orjson to 3.10.18 (#143943)
bdraco Apr 30, 2025
5dab9ba
Allow streaming text into TTS ResultStream objects (#143745)
balloob Apr 30, 2025
d924f0b
Improve the live context tool prompt with additional instructions (#1…
allenporter Apr 30, 2025
bdd9099
switchbot_cloud: Add firmware information (#143693)
mrueg Apr 30, 2025
b16151a
Add an LLM tool for fetching todo list items (#143777)
allenporter Apr 30, 2025
f7a9319
Don't attempt to garbage collect objects leaked by previous modules (…
emontnemery Apr 30, 2025
d606e86
Fix spelling of "Overtorque fault" in `litterrobot` (#143953)
NoRi2909 Apr 30, 2025
57a7c26
Add generator status sensors for Rehlko (#143948)
PeteRager Apr 30, 2025
f7c1a0c
Add tests for parse_time_expression (#143912)
Choromanski Apr 30, 2025
9b1c6b0
Bump deebot-client to 13.0.0 (#143823)
edenhaus Apr 30, 2025
800f403
Adjust unique_id in SamsungTV tests (#143959)
epenet Apr 30, 2025
c6bdee8
Various minor tweaks in samsungtv tests (#143951)
epenet Apr 30, 2025
03ecd7f
Remove icon from rehlko power_source (#143955)
bdraco Apr 30, 2025
857db67
Add time platform to eheimdigital (#143168)
autinerd Apr 30, 2025
8b9c4da
Use freezer.tick in SamsungTV tests (#143954)
epenet Apr 30, 2025
af66d0b
Delay register callback in SamsungTV (#143950)
epenet Apr 30, 2025
923300f
Add Sabbath mode to SmartThings (#141072)
joostlek Apr 30, 2025
d8122d1
Add zeroconf to Home Connect (#143952)
Diegorro98 Apr 30, 2025
fa1dc75
Add repair flow for Shelly BLE scanner with unsupported firmware (#14…
bieniu Apr 30, 2025
84634ce
Improve Error message states in `fronius` (#143958)
NoRi2909 Apr 30, 2025
5b0ea21
Add light as entity platform on MQTT subentries (#141345)
jbouwh Apr 30, 2025
80e4f19
Fix Z-Wave USB flow test warning (#143956)
MartinHjelmare Apr 30, 2025
819be71
Bump uv to 0.7.1 (#143957)
edenhaus Apr 30, 2025
4061314
Allow multiple config entries in Home Connect (#143935)
Diegorro98 Apr 30, 2025
df5f150
Cleanup samsungtv coordinator (#143949)
epenet Apr 30, 2025
101b073
Use Lokalise references to remove duplicates in todo component (#143967)
TimoPtr Apr 30, 2025
8375923
Update frontend to 20250430.1 (#143965)
piitaya Apr 30, 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
4 changes: 2 additions & 2 deletions CODEOWNERS

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Dockerfile

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions homeassistant/components/ecovacs/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from typing import Generic

from deebot_client.capabilities import CapabilityEvent
from deebot_client.events.water_info import WaterInfoEvent
from deebot_client.events.water_info import MopAttachedEvent

from homeassistant.components.binary_sensor import (
BinarySensorEntity,
Expand All @@ -32,9 +32,9 @@ class EcovacsBinarySensorEntityDescription(


ENTITY_DESCRIPTIONS: tuple[EcovacsBinarySensorEntityDescription, ...] = (
EcovacsBinarySensorEntityDescription[WaterInfoEvent](
capability_fn=lambda caps: caps.water,
value_fn=lambda e: e.mop_attached,
EcovacsBinarySensorEntityDescription[MopAttachedEvent](
capability_fn=lambda caps: caps.water.mop_attached if caps.water else None,
value_fn=lambda e: e.value,
key="water_mop_attached",
translation_key="water_mop_attached",
entity_category=EntityCategory.DIAGNOSTIC,
Expand Down
8 changes: 6 additions & 2 deletions homeassistant/components/ecovacs/image.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
"""Ecovacs image entities."""

from typing import cast

from deebot_client.capabilities import CapabilityMap
from deebot_client.device import Device
from deebot_client.events.map import CachedMapInfoEvent, MapChangedEvent
from deebot_client.map import Map

from homeassistant.components.image import ImageEntity
from homeassistant.core import HomeAssistant
Expand Down Expand Up @@ -47,6 +50,7 @@ def __init__(
"""Initialize entity."""
super().__init__(device, capability, hass=hass)
self._attr_extra_state_attributes = {}
self._map = cast(Map, self._device.map)

entity_description = EntityDescription(
key="map",
Expand All @@ -55,7 +59,7 @@ def __init__(

def image(self) -> bytes | None:
"""Return bytes of image or None."""
if svg := self._device.map.get_svg_map():
if svg := self._map.get_svg_map():
return svg.encode()

return None
Expand All @@ -80,4 +84,4 @@ async def async_update(self) -> None:
Only used by the generic entity update service.
"""
await super().async_update()
self._device.map.refresh()
self._map.refresh()
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==12.5.0"]
"requirements": ["py-sucks==0.9.10", "deebot-client==13.0.1"]
}
9 changes: 5 additions & 4 deletions homeassistant/components/ecovacs/select.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@

from deebot_client.capabilities import CapabilitySetTypes
from deebot_client.device import Device
from deebot_client.events import WaterInfoEvent, WorkModeEvent
from deebot_client.events import WorkModeEvent
from deebot_client.events.water_info import WaterAmountEvent

from homeassistant.components.select import SelectEntity, SelectEntityDescription
from homeassistant.const import EntityCategory
Expand All @@ -31,9 +32,9 @@ class EcovacsSelectEntityDescription(


ENTITY_DESCRIPTIONS: tuple[EcovacsSelectEntityDescription, ...] = (
EcovacsSelectEntityDescription[WaterInfoEvent](
capability_fn=lambda caps: caps.water,
current_option_fn=lambda e: get_name_key(e.amount),
EcovacsSelectEntityDescription[WaterAmountEvent](
capability_fn=lambda caps: caps.water.amount if caps.water else None,
current_option_fn=lambda e: get_name_key(e.value),
options_fn=lambda water: [get_name_key(amount) for amount in water.types],
key="water_amount",
translation_key="water_amount",
Expand Down
8 changes: 7 additions & 1 deletion homeassistant/components/eheimdigital/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,13 @@
from .const import DOMAIN
from .coordinator import EheimDigitalConfigEntry, EheimDigitalUpdateCoordinator

PLATFORMS = [Platform.CLIMATE, Platform.LIGHT, Platform.NUMBER, Platform.SENSOR]
PLATFORMS = [
Platform.CLIMATE,
Platform.LIGHT,
Platform.NUMBER,
Platform.SENSOR,
Platform.TIME,
]


async def async_setup_entry(
Expand Down
8 changes: 8 additions & 0 deletions homeassistant/components/eheimdigital/icons.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,14 @@
"no_error": "mdi:check-circle"
}
}
},
"time": {
"day_start_time": {
"default": "mdi:weather-sunny"
},
"night_start_time": {
"default": "mdi:moon-waning-crescent"
}
}
}
}
8 changes: 8 additions & 0 deletions homeassistant/components/eheimdigital/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,14 @@
"air_in_filter": "Air in filter"
}
}
},
"time": {
"day_start_time": {
"name": "Day start time"
},
"night_start_time": {
"name": "Night start time"
}
}
}
}
132 changes: 132 additions & 0 deletions homeassistant/components/eheimdigital/time.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
"""EHEIM Digital time entities."""

from collections.abc import Awaitable, Callable
from dataclasses import dataclass
from datetime import time
from typing import Generic, TypeVar, final, override

from eheimdigital.classic_vario import EheimDigitalClassicVario
from eheimdigital.device import EheimDigitalDevice
from eheimdigital.heater import EheimDigitalHeater

from homeassistant.components.time import TimeEntity, TimeEntityDescription
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback

from .coordinator import EheimDigitalConfigEntry, EheimDigitalUpdateCoordinator
from .entity import EheimDigitalEntity

PARALLEL_UPDATES = 0

_DeviceT_co = TypeVar("_DeviceT_co", bound=EheimDigitalDevice, covariant=True)


@dataclass(frozen=True, kw_only=True)
class EheimDigitalTimeDescription(TimeEntityDescription, Generic[_DeviceT_co]):
"""Class describing EHEIM Digital time entities."""

value_fn: Callable[[_DeviceT_co], time | None]
set_value_fn: Callable[[_DeviceT_co, time], Awaitable[None]]


CLASSICVARIO_DESCRIPTIONS: tuple[
EheimDigitalTimeDescription[EheimDigitalClassicVario], ...
] = (
EheimDigitalTimeDescription[EheimDigitalClassicVario](
key="day_start_time",
translation_key="day_start_time",
entity_category=EntityCategory.CONFIG,
value_fn=lambda device: device.day_start_time,
set_value_fn=lambda device, value: device.set_day_start_time(value),
),
EheimDigitalTimeDescription[EheimDigitalClassicVario](
key="night_start_time",
translation_key="night_start_time",
entity_category=EntityCategory.CONFIG,
value_fn=lambda device: device.night_start_time,
set_value_fn=lambda device, value: device.set_night_start_time(value),
),
)

HEATER_DESCRIPTIONS: tuple[EheimDigitalTimeDescription[EheimDigitalHeater], ...] = (
EheimDigitalTimeDescription[EheimDigitalHeater](
key="day_start_time",
translation_key="day_start_time",
entity_category=EntityCategory.CONFIG,
value_fn=lambda device: device.day_start_time,
set_value_fn=lambda device, value: device.set_day_start_time(value),
),
EheimDigitalTimeDescription[EheimDigitalHeater](
key="night_start_time",
translation_key="night_start_time",
entity_category=EntityCategory.CONFIG,
value_fn=lambda device: device.night_start_time,
set_value_fn=lambda device, value: device.set_night_start_time(value),
),
)


async def async_setup_entry(
hass: HomeAssistant,
entry: EheimDigitalConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up the callbacks for the coordinator so times can be added as devices are found."""
coordinator = entry.runtime_data

def async_setup_device_entities(
device_address: dict[str, EheimDigitalDevice],
) -> None:
"""Set up the time entities for one or multiple devices."""
entities: list[EheimDigitalTime[EheimDigitalDevice]] = []
for device in device_address.values():
if isinstance(device, EheimDigitalClassicVario):
entities.extend(
EheimDigitalTime[EheimDigitalClassicVario](
coordinator, device, description
)
for description in CLASSICVARIO_DESCRIPTIONS
)
if isinstance(device, EheimDigitalHeater):
entities.extend(
EheimDigitalTime[EheimDigitalHeater](
coordinator, device, description
)
for description in HEATER_DESCRIPTIONS
)

async_add_entities(entities)

coordinator.add_platform_callback(async_setup_device_entities)
async_setup_device_entities(coordinator.hub.devices)


@final
class EheimDigitalTime(
EheimDigitalEntity[_DeviceT_co], TimeEntity, Generic[_DeviceT_co]
):
"""Represent an EHEIM Digital time entity."""

entity_description: EheimDigitalTimeDescription[_DeviceT_co]

def __init__(
self,
coordinator: EheimDigitalUpdateCoordinator,
device: _DeviceT_co,
description: EheimDigitalTimeDescription[_DeviceT_co],
) -> None:
"""Initialize an EHEIM Digital time entity."""
super().__init__(coordinator, device)
self.entity_description = description
self._attr_unique_id = f"{device.mac_address}_{description.key}"

@override
async def async_set_value(self, value: time) -> None:
"""Change the time."""
return await self.entity_description.set_value_fn(self._device, value)

@override
def _async_update_attrs(self) -> None:
"""Update the entity attributes."""
self._attr_native_value = self.entity_description.value_fn(self._device)
12 changes: 6 additions & 6 deletions homeassistant/components/fronius/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -82,13 +82,13 @@
"ac_frequency_too_high": "AC frequency too high",
"ac_frequency_too_low": "AC frequency too low",
"ac_grid_outside_permissible_limits": "AC grid outside the permissible limits",
"stand_alone_operation_detected": "Stand alone operation detected",
"stand_alone_operation_detected": "Stand-alone operation detected",
"rcmu_error": "RCMU error",
"arc_detection_triggered": "Arc detection triggered",
"overcurrent_ac": "Overcurrent (AC)",
"overcurrent_dc": "Overcurrent (DC)",
"dc_module_over_temperature": "DC module over temperature",
"ac_module_over_temperature": "AC module over temperature",
"dc_module_over_temperature": "DC module overtemperature",
"ac_module_over_temperature": "AC module overtemperature",
"no_power_fed_in_despite_closed_relay": "No power being fed in, despite closed relay",
"pv_output_too_low_for_feeding_energy_into_the_grid": "PV output too low for feeding energy into the grid",
"low_pv_voltage_dc_input_voltage_too_low": "Low PV voltage - DC input voltage too low for feeding energy into the grid",
Expand Down Expand Up @@ -133,16 +133,16 @@
"no_energy_fed_by_mppt1_past_24_hours": "No energy fed into the grid by MPPT1 in the past 24 hours",
"dc_low_string_1": "DC low string 1",
"dc_low_string_2": "DC low string 2",
"derating_caused_by_over_frequency": "Derating caused by over-frequency",
"derating_caused_by_over_frequency": "Derating caused by overfrequency",
"arc_detector_switched_off": "Arc detector switched off (e.g. during external arc monitoring)",
"grid_voltage_dependent_power_reduction_active": "Grid Voltage Dependent Power Reduction is active",
"grid_voltage_dependent_power_reduction_active": "Grid voltage-dependent power reduction (GVDPR) is active",
"can_bus_full": "CAN bus is full",
"ac_module_temperature_sensor_faulty_l3": "AC module temperature sensor faulty (L3)",
"dc_module_temperature_sensor_faulty": "DC module temperature sensor faulty",
"internal_processor_status": "Warning about the internal processor status. See status code for more information",
"eeprom_reinitialised": "EEPROM has been re-initialised",
"initialisation_error_usb_flash_drive_not_supported": "Initialisation error – USB flash drive is not supported",
"initialisation_error_usb_stick_over_current": "Initialisation error – Over current on USB stick",
"initialisation_error_usb_stick_over_current": "Initialisation error – Overcurrent on USB stick",
"no_usb_flash_drive_connected": "No USB flash drive connected",
"update_file_not_recognised_or_missing": "Update file not recognised or not present",
"update_file_does_not_match_device": "Update file does not match the device, update file too old",
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==20250411.0"]
"requirements": ["home-assistant-frontend==20250430.1"]
}
Loading