From 5f9f623c3f6fd6aaa651694b14379ad1c0b49df3 Mon Sep 17 00:00:00 2001 From: Luke Lashley Date: Sun, 1 Feb 2026 23:28:35 -0500 Subject: [PATCH 1/6] Bump python-roborock to 4.12.0 (#162054) --- homeassistant/components/roborock/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/roborock/manifest.json b/homeassistant/components/roborock/manifest.json index 288bb31f83ff98..75cb18c739d0d8 100644 --- a/homeassistant/components/roborock/manifest.json +++ b/homeassistant/components/roborock/manifest.json @@ -20,7 +20,7 @@ "loggers": ["roborock"], "quality_scale": "silver", "requirements": [ - "python-roborock==4.8.0", + "python-roborock==4.12.0", "vacuum-map-parser-roborock==0.1.4" ] } diff --git a/requirements_all.txt b/requirements_all.txt index 0f06a6b66827ca..d922a2309be14d 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2597,7 +2597,7 @@ python-rabbitair==0.0.8 python-ripple-api==0.0.3 # homeassistant.components.roborock -python-roborock==4.8.0 +python-roborock==4.12.0 # homeassistant.components.smarttub python-smarttub==0.0.46 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 3177582108ca0c..cad327195126ff 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -2187,7 +2187,7 @@ python-pooldose==0.8.2 python-rabbitair==0.0.8 # homeassistant.components.roborock -python-roborock==4.8.0 +python-roborock==4.12.0 # homeassistant.components.smarttub python-smarttub==0.0.46 From 692b8d0722283cd4effc687db52640cbf5fce047 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Mon, 2 Feb 2026 08:59:35 +0100 Subject: [PATCH 2/6] Move agent_dvr service registration (#162062) --- .../components/agent_dvr/__init__.py | 12 +++++- homeassistant/components/agent_dvr/camera.py | 23 +---------- .../components/agent_dvr/services.py | 38 +++++++++++++++++++ 3 files changed, 50 insertions(+), 23 deletions(-) create mode 100644 homeassistant/components/agent_dvr/services.py diff --git a/homeassistant/components/agent_dvr/__init__.py b/homeassistant/components/agent_dvr/__init__.py index d504568869c58b..6452e1a3bf25f2 100644 --- a/homeassistant/components/agent_dvr/__init__.py +++ b/homeassistant/components/agent_dvr/__init__.py @@ -7,10 +7,12 @@ from homeassistant.const import Platform from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryNotReady -from homeassistant.helpers import device_registry as dr +from homeassistant.helpers import config_validation as cv, device_registry as dr from homeassistant.helpers.aiohttp_client import async_get_clientsession +from homeassistant.helpers.typing import ConfigType from .const import DOMAIN, SERVER_URL +from .services import async_setup_services ATTRIBUTION = "ispyconnect.com" DEFAULT_BRAND = "Agent DVR by ispyconnect.com" @@ -19,6 +21,14 @@ AgentDVRConfigEntry = ConfigEntry[Agent] +CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) + + +async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: + """Set up the component.""" + async_setup_services(hass) + return True + async def async_setup_entry( hass: HomeAssistant, config_entry: AgentDVRConfigEntry diff --git a/homeassistant/components/agent_dvr/camera.py b/homeassistant/components/agent_dvr/camera.py index c0076024fe4746..d39224f28f8f8d 100644 --- a/homeassistant/components/agent_dvr/camera.py +++ b/homeassistant/components/agent_dvr/camera.py @@ -9,10 +9,7 @@ from homeassistant.components.mjpeg import MjpegCamera, filter_urllib3_logging from homeassistant.core import HomeAssistant from homeassistant.helpers.device_registry import DeviceInfo -from homeassistant.helpers.entity_platform import ( - AddConfigEntryEntitiesCallback, - async_get_current_platform, -) +from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from . import AgentDVRConfigEntry from .const import ATTRIBUTION, CAMERA_SCAN_INTERVAL_SECS, DOMAIN @@ -21,20 +18,6 @@ _LOGGER = logging.getLogger(__name__) -_DEV_EN_ALT = "enable_alerts" -_DEV_DS_ALT = "disable_alerts" -_DEV_EN_REC = "start_recording" -_DEV_DS_REC = "stop_recording" -_DEV_SNAP = "snapshot" - -CAMERA_SERVICES = { - _DEV_EN_ALT: "async_enable_alerts", - _DEV_DS_ALT: "async_disable_alerts", - _DEV_EN_REC: "async_start_recording", - _DEV_DS_REC: "async_stop_recording", - _DEV_SNAP: "async_snapshot", -} - async def async_setup_entry( hass: HomeAssistant, @@ -57,10 +40,6 @@ async def async_setup_entry( async_add_entities(cameras) - platform = async_get_current_platform() - for service, method in CAMERA_SERVICES.items(): - platform.async_register_entity_service(service, None, method) - class AgentCamera(MjpegCamera): """Representation of an Agent Device Stream.""" diff --git a/homeassistant/components/agent_dvr/services.py b/homeassistant/components/agent_dvr/services.py new file mode 100644 index 00000000000000..d80d94427fbd28 --- /dev/null +++ b/homeassistant/components/agent_dvr/services.py @@ -0,0 +1,38 @@ +"""Services for Agent DVR.""" + +from __future__ import annotations + +from homeassistant.components.camera import DOMAIN as CAMERA_DOMAIN +from homeassistant.core import HomeAssistant, callback +from homeassistant.helpers import service + +from .const import DOMAIN + +_DEV_EN_ALT = "enable_alerts" +_DEV_DS_ALT = "disable_alerts" +_DEV_EN_REC = "start_recording" +_DEV_DS_REC = "stop_recording" +_DEV_SNAP = "snapshot" + +CAMERA_SERVICES = { + _DEV_EN_ALT: "async_enable_alerts", + _DEV_DS_ALT: "async_disable_alerts", + _DEV_EN_REC: "async_start_recording", + _DEV_DS_REC: "async_stop_recording", + _DEV_SNAP: "async_snapshot", +} + + +@callback +def async_setup_services(hass: HomeAssistant) -> None: + """Home Assistant services.""" + + for service_name, method in CAMERA_SERVICES.items(): + service.async_register_platform_entity_service( + hass, + DOMAIN, + service_name, + entity_domain=CAMERA_DOMAIN, + schema=None, + func=method, + ) From 87f655f56ded220a62a0500b301a3d3bd9ce94b7 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Mon, 2 Feb 2026 08:59:47 +0100 Subject: [PATCH 3/6] Move alarmdecoder service registration (#162063) --- .../components/alarmdecoder/__init__.py | 11 +++++ .../alarmdecoder/alarm_control_panel.py | 26 ----------- .../components/alarmdecoder/services.py | 46 +++++++++++++++++++ 3 files changed, 57 insertions(+), 26 deletions(-) create mode 100644 homeassistant/components/alarmdecoder/services.py diff --git a/homeassistant/components/alarmdecoder/__init__.py b/homeassistant/components/alarmdecoder/__init__.py index 4abf45b74facfe..cddff654a39946 100644 --- a/homeassistant/components/alarmdecoder/__init__.py +++ b/homeassistant/components/alarmdecoder/__init__.py @@ -18,12 +18,15 @@ Platform, ) from homeassistant.core import HomeAssistant +from homeassistant.helpers import config_validation as cv from homeassistant.helpers.dispatcher import dispatcher_send from homeassistant.helpers.event import async_call_later +from homeassistant.helpers.typing import ConfigType from .const import ( CONF_DEVICE_BAUD, CONF_DEVICE_PATH, + DOMAIN, PROTOCOL_SERIAL, PROTOCOL_SOCKET, SIGNAL_PANEL_MESSAGE, @@ -32,9 +35,11 @@ SIGNAL_ZONE_FAULT, SIGNAL_ZONE_RESTORE, ) +from .services import async_setup_services _LOGGER = logging.getLogger(__name__) +CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) PLATFORMS = [ Platform.ALARM_CONTROL_PANEL, Platform.BINARY_SENSOR, @@ -54,6 +59,12 @@ class AlarmDecoderData: restart: bool +async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: + """Set up the component.""" + async_setup_services(hass) + return True + + async def async_setup_entry( hass: HomeAssistant, entry: AlarmDecoderConfigEntry ) -> bool: diff --git a/homeassistant/components/alarmdecoder/alarm_control_panel.py b/homeassistant/components/alarmdecoder/alarm_control_panel.py index 52687f04bf9202..ea3f339256ac42 100644 --- a/homeassistant/components/alarmdecoder/alarm_control_panel.py +++ b/homeassistant/components/alarmdecoder/alarm_control_panel.py @@ -2,17 +2,13 @@ from __future__ import annotations -import voluptuous as vol - from homeassistant.components.alarm_control_panel import ( AlarmControlPanelEntity, AlarmControlPanelEntityFeature, AlarmControlPanelState, CodeFormat, ) -from homeassistant.const import ATTR_CODE from homeassistant.core import HomeAssistant -from homeassistant.helpers import config_validation as cv, entity_platform from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback @@ -27,11 +23,6 @@ ) from .entity import AlarmDecoderEntity -SERVICE_ALARM_TOGGLE_CHIME = "alarm_toggle_chime" - -SERVICE_ALARM_KEYPRESS = "alarm_keypress" -ATTR_KEYPRESS = "keypress" - async def async_setup_entry( hass: HomeAssistant, @@ -50,23 +41,6 @@ async def async_setup_entry( ) async_add_entities([entity]) - platform = entity_platform.async_get_current_platform() - platform.async_register_entity_service( - SERVICE_ALARM_TOGGLE_CHIME, - { - vol.Required(ATTR_CODE): cv.string, - }, - "alarm_toggle_chime", - ) - - platform.async_register_entity_service( - SERVICE_ALARM_KEYPRESS, - { - vol.Required(ATTR_KEYPRESS): cv.string, - }, - "alarm_keypress", - ) - class AlarmDecoderAlarmPanel(AlarmDecoderEntity, AlarmControlPanelEntity): """Representation of an AlarmDecoder-based alarm panel.""" diff --git a/homeassistant/components/alarmdecoder/services.py b/homeassistant/components/alarmdecoder/services.py new file mode 100644 index 00000000000000..98a58239265aa8 --- /dev/null +++ b/homeassistant/components/alarmdecoder/services.py @@ -0,0 +1,46 @@ +"""Support for AlarmDecoder-based alarm control panels (Honeywell/DSC).""" + +from __future__ import annotations + +import voluptuous as vol + +from homeassistant.components.alarm_control_panel import ( + DOMAIN as ALARM_CONTROL_PANEL_DOMAIN, +) +from homeassistant.const import ATTR_CODE +from homeassistant.core import HomeAssistant, callback +from homeassistant.helpers import config_validation as cv, service + +from .const import DOMAIN + +SERVICE_ALARM_TOGGLE_CHIME = "alarm_toggle_chime" + +SERVICE_ALARM_KEYPRESS = "alarm_keypress" +ATTR_KEYPRESS = "keypress" + + +@callback +def async_setup_services(hass: HomeAssistant) -> None: + """Home Assistant services.""" + + service.async_register_platform_entity_service( + hass, + DOMAIN, + SERVICE_ALARM_TOGGLE_CHIME, + entity_domain=ALARM_CONTROL_PANEL_DOMAIN, + schema={ + vol.Required(ATTR_CODE): cv.string, + }, + func="alarm_toggle_chime", + ) + + service.async_register_platform_entity_service( + hass, + DOMAIN, + SERVICE_ALARM_KEYPRESS, + entity_domain=ALARM_CONTROL_PANEL_DOMAIN, + schema={ + vol.Required(ATTR_KEYPRESS): cv.string, + }, + func="alarm_keypress", + ) From 61e35157e3779f4c9a6853dc2886432443512099 Mon Sep 17 00:00:00 2001 From: Andres Ruiz Date: Mon, 2 Feb 2026 02:59:53 -0500 Subject: [PATCH 4/6] Bump waterfurnace to 1.5.1 (#162042) --- homeassistant/components/waterfurnace/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/waterfurnace/manifest.json b/homeassistant/components/waterfurnace/manifest.json index 2bdf1c4a56e318..2db75d6f363235 100644 --- a/homeassistant/components/waterfurnace/manifest.json +++ b/homeassistant/components/waterfurnace/manifest.json @@ -8,5 +8,5 @@ "iot_class": "cloud_polling", "loggers": ["waterfurnace"], "quality_scale": "legacy", - "requirements": ["waterfurnace==1.4.0"] + "requirements": ["waterfurnace==1.5.1"] } diff --git a/requirements_all.txt b/requirements_all.txt index d922a2309be14d..16ff92489ff5ab 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -3190,7 +3190,7 @@ wallbox==0.9.0 watchdog==6.0.0 # homeassistant.components.waterfurnace -waterfurnace==1.4.0 +waterfurnace==1.5.1 # homeassistant.components.watergate watergate-local-api==2025.1.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index cad327195126ff..5d63673f3172b3 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -2672,7 +2672,7 @@ wallbox==0.9.0 watchdog==6.0.0 # homeassistant.components.waterfurnace -waterfurnace==1.4.0 +waterfurnace==1.5.1 # homeassistant.components.watergate watergate-local-api==2025.1.0 From 841fa48186fb5abd31df1b5757cc9f618f024f5f Mon Sep 17 00:00:00 2001 From: Henning Kerstan Date: Mon, 2 Feb 2026 09:50:49 +0100 Subject: [PATCH 5/6] Replace hass.data[DATA_ENOCEAN] by config_entry.runtime_data (#161997) --- homeassistant/components/enocean/__init__.py | 18 +++++++++++------- homeassistant/components/enocean/const.py | 2 -- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/enocean/__init__.py b/homeassistant/components/enocean/__init__.py index c1db27c1c34618..7c55f47a979171 100644 --- a/homeassistant/components/enocean/__init__.py +++ b/homeassistant/components/enocean/__init__.py @@ -8,9 +8,11 @@ from homeassistant.helpers import config_validation as cv from homeassistant.helpers.typing import ConfigType -from .const import DATA_ENOCEAN, DOMAIN, ENOCEAN_DONGLE +from .const import DOMAIN from .dongle import EnOceanDongle +type EnOceanConfigEntry = ConfigEntry[EnOceanDongle] + CONFIG_SCHEMA = vol.Schema( {DOMAIN: vol.Schema({vol.Required(CONF_DEVICE): cv.string})}, extra=vol.ALLOW_EXTRA ) @@ -36,21 +38,23 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: return True -async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool: +async def async_setup_entry( + hass: HomeAssistant, config_entry: EnOceanConfigEntry +) -> bool: """Set up an EnOcean dongle for the given entry.""" - enocean_data = hass.data.setdefault(DATA_ENOCEAN, {}) usb_dongle = EnOceanDongle(hass, config_entry.data[CONF_DEVICE]) await usb_dongle.async_setup() - enocean_data[ENOCEAN_DONGLE] = usb_dongle + config_entry.runtime_data = usb_dongle return True -async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool: +async def async_unload_entry( + hass: HomeAssistant, config_entry: EnOceanConfigEntry +) -> bool: """Unload EnOcean config entry.""" - enocean_dongle = hass.data[DATA_ENOCEAN][ENOCEAN_DONGLE] + enocean_dongle = config_entry.runtime_data enocean_dongle.unload() - hass.data.pop(DATA_ENOCEAN) return True diff --git a/homeassistant/components/enocean/const.py b/homeassistant/components/enocean/const.py index 0f3271655d8264..8c4692830741e5 100644 --- a/homeassistant/components/enocean/const.py +++ b/homeassistant/components/enocean/const.py @@ -5,8 +5,6 @@ from homeassistant.const import Platform DOMAIN = "enocean" -DATA_ENOCEAN = "enocean" -ENOCEAN_DONGLE = "dongle" ERROR_INVALID_DONGLE_PATH = "invalid_dongle_path" From 423a7cdbba461460a98069640e576067b066795f Mon Sep 17 00:00:00 2001 From: Jan Bouwhuis Date: Mon, 2 Feb 2026 10:10:11 +0100 Subject: [PATCH 6/6] Bump incomfort-client to 0.6.12 (#162037) --- homeassistant/components/incomfort/manifest.json | 2 +- homeassistant/components/incomfort/strings.json | 1 + requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/incomfort/manifest.json b/homeassistant/components/incomfort/manifest.json index ea1a460a0cb921..ad904f31c778ff 100644 --- a/homeassistant/components/incomfort/manifest.json +++ b/homeassistant/components/incomfort/manifest.json @@ -12,5 +12,5 @@ "iot_class": "local_polling", "loggers": ["incomfortclient"], "quality_scale": "platinum", - "requirements": ["incomfort-client==0.6.11"] + "requirements": ["incomfort-client==0.6.12"] } diff --git a/homeassistant/components/incomfort/strings.json b/homeassistant/components/incomfort/strings.json index 50cd85d40bf7c8..6b3ef1aa45ea31 100644 --- a/homeassistant/components/incomfort/strings.json +++ b/homeassistant/components/incomfort/strings.json @@ -90,6 +90,7 @@ "boiler_int": "Boiler internal", "buffer": "Buffer", "central_heating": "Central heating", + "central_heating_low": "Central heating low", "central_heating_rf": "Central heating rf", "cv_temperature_too_high_e1": "Temperature too high", "flame_detection_fault_e6": "Flame detection fault", diff --git a/requirements_all.txt b/requirements_all.txt index 16ff92489ff5ab..0021ad607ba459 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1288,7 +1288,7 @@ imeon_inverter_api==0.4.0 imgw_pib==2.0.1 # homeassistant.components.incomfort -incomfort-client==0.6.11 +incomfort-client==0.6.12 # homeassistant.components.influxdb influxdb-client==1.50.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 5d63673f3172b3..510a5d8ba2a6d2 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1134,7 +1134,7 @@ imeon_inverter_api==0.4.0 imgw_pib==2.0.1 # homeassistant.components.incomfort -incomfort-client==0.6.11 +incomfort-client==0.6.12 # homeassistant.components.influxdb influxdb-client==1.50.0