From ad7ebfc959187a938aa2b758df4d5776adb27ead Mon Sep 17 00:00:00 2001 From: Richard <42204099+rikroe@users.noreply.github.com> Date: Mon, 13 Apr 2026 12:50:02 +0200 Subject: [PATCH 01/12] Add number platform to eurotronic_cometblue --- .../eurotronic_cometblue/__init__.py | 1 + .../components/eurotronic_cometblue/number.py | 148 +++++++++++ .../eurotronic_cometblue/strings.json | 14 + .../snapshots/test_number.ambr | 245 ++++++++++++++++++ .../eurotronic_cometblue/test_number.py | 92 +++++++ 5 files changed, 500 insertions(+) create mode 100644 homeassistant/components/eurotronic_cometblue/number.py create mode 100644 tests/components/eurotronic_cometblue/snapshots/test_number.ambr create mode 100644 tests/components/eurotronic_cometblue/test_number.py diff --git a/homeassistant/components/eurotronic_cometblue/__init__.py b/homeassistant/components/eurotronic_cometblue/__init__.py index 9036693b8d969c..734ed65628a479 100644 --- a/homeassistant/components/eurotronic_cometblue/__init__.py +++ b/homeassistant/components/eurotronic_cometblue/__init__.py @@ -18,6 +18,7 @@ PLATFORMS: list[Platform] = [ Platform.BUTTON, Platform.CLIMATE, + Platform.NUMBER, ] diff --git a/homeassistant/components/eurotronic_cometblue/number.py b/homeassistant/components/eurotronic_cometblue/number.py new file mode 100644 index 00000000000000..a03aa1ecab610b --- /dev/null +++ b/homeassistant/components/eurotronic_cometblue/number.py @@ -0,0 +1,148 @@ +"""Comet Blue number integration.""" + +from __future__ import annotations + +from collections.abc import Callable +from dataclasses import dataclass +import logging +from typing import Any + +from eurotronic_cometblue_ha import AsyncCometBlue + +from homeassistant.components.number import ( + NumberDeviceClass, + NumberEntity, + NumberEntityDescription, +) +from homeassistant.const import PRECISION_HALVES, UnitOfTemperature, UnitOfTime +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback + +from .climate import MAX_TEMP, MIN_TEMP +from .coordinator import CometBlueConfigEntry, CometBlueDataUpdateCoordinator +from .entity import CometBlueBluetoothEntity + +LOGGER = logging.getLogger(__name__) + +PARALLEL_UPDATES = 1 + + +@dataclass(frozen=True, kw_only=True) +class CometBlueRequiredKeysMixin: + """Mixin for required keys.""" + + cometblue_key: str + set_fn: Callable[[AsyncCometBlue], Any] + + +@dataclass(frozen=True, kw_only=True) +class CometBlueNumberEntityDescription( + NumberEntityDescription, CometBlueRequiredKeysMixin +): + """Describes a Comet Blue number entity.""" + + +DESCRIPTIONS = [ + CometBlueNumberEntityDescription( + key="offset", + cometblue_key="tempOffset", + translation_key="offset", + device_class=NumberDeviceClass.TEMPERATURE, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + set_fn=lambda x: x.set_temperature_async, + native_min_value=-5.0, + native_max_value=5.0, + native_step=PRECISION_HALVES, + entity_registry_enabled_default=False, + ), + CometBlueNumberEntityDescription( + key="target_temp_low", + cometblue_key="targetTempLow", + translation_key="target_temp_low", + device_class=NumberDeviceClass.TEMPERATURE, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + set_fn=lambda x: x.set_temperature_async, + native_min_value=MIN_TEMP, + native_max_value=MAX_TEMP, + native_step=PRECISION_HALVES, + entity_registry_enabled_default=True, + ), + CometBlueNumberEntityDescription( + key="target_temp_high", + cometblue_key="targetTempHigh", + translation_key="target_temp_high", + device_class=NumberDeviceClass.TEMPERATURE, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + set_fn=lambda x: x.set_temperature_async, + native_min_value=MIN_TEMP, + native_max_value=MAX_TEMP, + native_step=PRECISION_HALVES, + entity_registry_enabled_default=True, + ), + CometBlueNumberEntityDescription( + key="window_open_minutes", + cometblue_key="windowOpenMinutes", + translation_key="window_open_minutes", + device_class=NumberDeviceClass.DURATION, + native_unit_of_measurement=UnitOfTime.MINUTES, + set_fn=lambda x: x.set_temperature_async, + native_min_value=5.0, + native_max_value=15.0, + native_step=5.0, + entity_registry_enabled_default=False, + ), +] + + +async def async_setup_entry( + hass: HomeAssistant, + entry: CometBlueConfigEntry, + async_add_entities: AddConfigEntryEntitiesCallback, +) -> None: + """Set up the client entities.""" + + coordinator = entry.runtime_data + entities: list[CometBlueNumberEntity] = [ + CometBlueNumberEntity(coordinator, description) for description in DESCRIPTIONS + ] + + async_add_entities(entities) + + +class CometBlueNumberEntity(CometBlueBluetoothEntity, NumberEntity): + """Representation of a number.""" + + entity_description: CometBlueNumberEntityDescription + + def __init__( + self, + coordinator: CometBlueDataUpdateCoordinator, + description: CometBlueNumberEntityDescription, + ) -> None: + """Initialize CometBlueNumberEntity.""" + + super().__init__(coordinator) + self.entity_description = description + self._attr_unique_id = f"{coordinator.address}-{description.key}" + + @property + def native_value(self) -> float | None: + """Return the entity value to represent the entity state.""" + return self.coordinator.data.temperatures.get( + self.entity_description.cometblue_key + ) + + async def async_set_native_value(self, value: float) -> None: + """Update to the device.""" + + await self.coordinator.send_command( + self.coordinator.device.set_temperature_async, + { + "values": { + # manual temperature always needs to be set, otherwise TRV will turn OFF + "manualTemp": self.coordinator.data.temperatures["manualTemp"], + self.entity_description.cometblue_key: value, + } + }, + ) + await self.coordinator.async_request_refresh() diff --git a/homeassistant/components/eurotronic_cometblue/strings.json b/homeassistant/components/eurotronic_cometblue/strings.json index e69f84a6776809..990997d7cc7cd7 100644 --- a/homeassistant/components/eurotronic_cometblue/strings.json +++ b/homeassistant/components/eurotronic_cometblue/strings.json @@ -35,6 +35,20 @@ "sync_time": { "name": "Sync time" } + }, + "number": { + "offset": { + "name": "Temperature Offset" + }, + "target_temp_high": { + "name": "Target Temperature High" + }, + "target_temp_low": { + "name": "Target Temperature Low" + }, + "window_open_minutes": { + "name": "Window Open Minutes" + } } } } diff --git a/tests/components/eurotronic_cometblue/snapshots/test_number.ambr b/tests/components/eurotronic_cometblue/snapshots/test_number.ambr new file mode 100644 index 00000000000000..dadeb9b4d28e21 --- /dev/null +++ b/tests/components/eurotronic_cometblue/snapshots/test_number.ambr @@ -0,0 +1,245 @@ +# serializer version: 1 +# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_high-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'max': 28.5, + 'min': 7.5, + 'mode': , + 'step': 0.5, + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'number', + 'entity_category': None, + 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_high', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Target Temperature High', + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Target Temperature High', + 'platform': 'eurotronic_cometblue', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'target_temp_high', + 'unique_id': 'aa:bb:cc:dd:ee:ff-target_temp_high', + 'unit_of_measurement': , + }) +# --- +# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_high-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'temperature', + 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Target Temperature High', + 'max': 28.5, + 'min': 7.5, + 'mode': , + 'step': 0.5, + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_high', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '21.0', + }) +# --- +# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_low-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'max': 28.5, + 'min': 7.5, + 'mode': , + 'step': 0.5, + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'number', + 'entity_category': None, + 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_low', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Target Temperature Low', + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Target Temperature Low', + 'platform': 'eurotronic_cometblue', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'target_temp_low', + 'unique_id': 'aa:bb:cc:dd:ee:ff-target_temp_low', + 'unit_of_measurement': , + }) +# --- +# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_low-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'temperature', + 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Target Temperature Low', + 'max': 28.5, + 'min': 7.5, + 'mode': , + 'step': 0.5, + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_low', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '17.0', + }) +# --- +# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_temperature_offset-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'max': 5.0, + 'min': -5.0, + 'mode': , + 'step': 0.5, + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'number', + 'entity_category': None, + 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_temperature_offset', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Temperature Offset', + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Temperature Offset', + 'platform': 'eurotronic_cometblue', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'offset', + 'unique_id': 'aa:bb:cc:dd:ee:ff-offset', + 'unit_of_measurement': , + }) +# --- +# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_temperature_offset-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'temperature', + 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Temperature Offset', + 'max': 5.0, + 'min': -5.0, + 'mode': , + 'step': 0.5, + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_temperature_offset', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '0.0', + }) +# --- +# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_window_open_minutes-entry] + EntityRegistryEntrySnapshot({ + 'aliases': list([ + None, + ]), + 'area_id': None, + 'capabilities': dict({ + 'max': 15.0, + 'min': 5.0, + 'mode': , + 'step': 5.0, + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'number', + 'entity_category': None, + 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_window_open_minutes', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'object_id_base': 'Window Open Minutes', + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'Window Open Minutes', + 'platform': 'eurotronic_cometblue', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'window_open_minutes', + 'unique_id': 'aa:bb:cc:dd:ee:ff-window_open_minutes', + 'unit_of_measurement': , + }) +# --- +# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_window_open_minutes-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'duration', + 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Window Open Minutes', + 'max': 15.0, + 'min': 5.0, + 'mode': , + 'step': 5.0, + 'unit_of_measurement': , + }), + 'context': , + 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_window_open_minutes', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': '10', + }) +# --- diff --git a/tests/components/eurotronic_cometblue/test_number.py b/tests/components/eurotronic_cometblue/test_number.py new file mode 100644 index 00000000000000..baf01c9106e2f4 --- /dev/null +++ b/tests/components/eurotronic_cometblue/test_number.py @@ -0,0 +1,92 @@ +"""Test the eurotronic_cometblue number platform.""" + +import pytest +from syrupy.assertion import SnapshotAssertion + +from homeassistant.components.number import ( + ATTR_VALUE, + DOMAIN as NUMBER_DOMAIN, + SERVICE_SET_VALUE, +) +from homeassistant.const import ATTR_ENTITY_ID, Platform +from homeassistant.core import HomeAssistant +from homeassistant.helpers import entity_registry as er + +from . import FIXTURE_MAC +from .conftest import setup_with_selected_platforms + +from tests.common import MockConfigEntry, snapshot_platform + + +def _number_entity_id(entity_registry: er.EntityRegistry, key: str) -> str: + """Resolve a number entity id by unique id.""" + unique_id = f"{FIXTURE_MAC}-{key}" + entity_id = entity_registry.async_get_entity_id( + "number", "eurotronic_cometblue", unique_id + ) + assert entity_id is not None + return entity_id + + +@pytest.mark.usefixtures("entity_registry_enabled_by_default") +async def test_number_state( + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + snapshot: SnapshotAssertion, + mock_config_entry: MockConfigEntry, +) -> None: + """Test number entity state and registry data.""" + await setup_with_selected_platforms(hass, mock_config_entry, [Platform.NUMBER]) + + await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id) + + +async def test_number_disabled_by_default_entities( + hass: HomeAssistant, + entity_registry: er.EntityRegistry, + mock_config_entry: MockConfigEntry, +) -> None: + """Test disabled-by-default number entities are not available.""" + await setup_with_selected_platforms(hass, mock_config_entry, [Platform.NUMBER]) + + for key in ("offset", "window_open_minutes"): + entity_id = _number_entity_id(entity_registry, key) + + assert (entry := entity_registry.async_get(entity_id)) + assert entry.disabled_by is not None + assert hass.states.get(entity_id) is None + + +@pytest.mark.parametrize( + ("entity_id", "value", "default_value"), + [ + ("number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_low", 18.5, 17.0), + ("number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_high", 23.0, 21.0), + ], +) +async def test_set_number_value( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry, + entity_id: str, + value: float, + default_value: float, +) -> None: + """Test setting writable number entities.""" + await setup_with_selected_platforms(hass, mock_config_entry, [Platform.NUMBER]) + + # check the default values + assert (state := hass.states.get(entity_id)) + assert float(state.state) == default_value + + await hass.services.async_call( + NUMBER_DOMAIN, + SERVICE_SET_VALUE, + { + ATTR_ENTITY_ID: entity_id, + ATTR_VALUE: value, + }, + blocking=True, + ) + + assert (state := hass.states.get(entity_id)) + assert float(state.state) == value From 3991b4abd8b11d8bb0d90033d83a5b91af283826 Mon Sep 17 00:00:00 2001 From: Richard <42204099+rikroe@users.noreply.github.com> Date: Mon, 13 Apr 2026 19:28:24 +0200 Subject: [PATCH 02/12] Add icons --- .../components/eurotronic_cometblue/icons.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/homeassistant/components/eurotronic_cometblue/icons.json b/homeassistant/components/eurotronic_cometblue/icons.json index ce5f503321444f..1ed6e068b28032 100644 --- a/homeassistant/components/eurotronic_cometblue/icons.json +++ b/homeassistant/components/eurotronic_cometblue/icons.json @@ -4,6 +4,20 @@ "sync_time": { "default": "mdi:calendar-clock" } + }, + "number": { + "target_temperature_high": { + "default": "mdi:thermometer-chevron-up" + }, + "target_temperature_low": { + "default": "mdi:thermometer-chevron-down" + }, + "temperature_offset": { + "default": "mdi:thermometer-check" + }, + "window_open_minutes": { + "default": "mdi:timer-sand" + } } } } From 7167199259f406180801e0548915af7a8231331c Mon Sep 17 00:00:00 2001 From: Richard Kroegel <42204099+rikroe@users.noreply.github.com> Date: Mon, 13 Apr 2026 19:56:48 +0200 Subject: [PATCH 03/12] Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- homeassistant/components/eurotronic_cometblue/number.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/eurotronic_cometblue/number.py b/homeassistant/components/eurotronic_cometblue/number.py index a03aa1ecab610b..6da93b5eff0dc1 100644 --- a/homeassistant/components/eurotronic_cometblue/number.py +++ b/homeassistant/components/eurotronic_cometblue/number.py @@ -16,6 +16,7 @@ ) from homeassistant.const import PRECISION_HALVES, UnitOfTemperature, UnitOfTime from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity import EntityCategory from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from .climate import MAX_TEMP, MIN_TEMP @@ -48,6 +49,7 @@ class CometBlueNumberEntityDescription( cometblue_key="tempOffset", translation_key="offset", device_class=NumberDeviceClass.TEMPERATURE, + entity_category=EntityCategory.CONFIG, native_unit_of_measurement=UnitOfTemperature.CELSIUS, set_fn=lambda x: x.set_temperature_async, native_min_value=-5.0, @@ -60,6 +62,7 @@ class CometBlueNumberEntityDescription( cometblue_key="targetTempLow", translation_key="target_temp_low", device_class=NumberDeviceClass.TEMPERATURE, + entity_category=EntityCategory.CONFIG, native_unit_of_measurement=UnitOfTemperature.CELSIUS, set_fn=lambda x: x.set_temperature_async, native_min_value=MIN_TEMP, @@ -72,6 +75,7 @@ class CometBlueNumberEntityDescription( cometblue_key="targetTempHigh", translation_key="target_temp_high", device_class=NumberDeviceClass.TEMPERATURE, + entity_category=EntityCategory.CONFIG, native_unit_of_measurement=UnitOfTemperature.CELSIUS, set_fn=lambda x: x.set_temperature_async, native_min_value=MIN_TEMP, @@ -84,6 +88,7 @@ class CometBlueNumberEntityDescription( cometblue_key="windowOpenMinutes", translation_key="window_open_minutes", device_class=NumberDeviceClass.DURATION, + entity_category=EntityCategory.CONFIG, native_unit_of_measurement=UnitOfTime.MINUTES, set_fn=lambda x: x.set_temperature_async, native_min_value=5.0, @@ -136,7 +141,7 @@ async def async_set_native_value(self, value: float) -> None: """Update to the device.""" await self.coordinator.send_command( - self.coordinator.device.set_temperature_async, + self.entity_description.set_fn(self.coordinator.device), { "values": { # manual temperature always needs to be set, otherwise TRV will turn OFF From 93927df2ce9ecde681672de18cb16f18307139e1 Mon Sep 17 00:00:00 2001 From: Richard <42204099+rikroe@users.noreply.github.com> Date: Mon, 13 Apr 2026 20:06:35 +0200 Subject: [PATCH 04/12] Fix tests after Copilot feedback --- homeassistant/components/eurotronic_cometblue/number.py | 8 ++++++-- .../eurotronic_cometblue/snapshots/test_number.ambr | 8 ++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/eurotronic_cometblue/number.py b/homeassistant/components/eurotronic_cometblue/number.py index 6da93b5eff0dc1..31cfffda283887 100644 --- a/homeassistant/components/eurotronic_cometblue/number.py +++ b/homeassistant/components/eurotronic_cometblue/number.py @@ -14,9 +14,13 @@ NumberEntity, NumberEntityDescription, ) -from homeassistant.const import PRECISION_HALVES, UnitOfTemperature, UnitOfTime +from homeassistant.const import ( + PRECISION_HALVES, + EntityCategory, + UnitOfTemperature, + UnitOfTime, +) from homeassistant.core import HomeAssistant -from homeassistant.helpers.entity import EntityCategory from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from .climate import MAX_TEMP, MIN_TEMP diff --git a/tests/components/eurotronic_cometblue/snapshots/test_number.ambr b/tests/components/eurotronic_cometblue/snapshots/test_number.ambr index dadeb9b4d28e21..96a4b782e835f8 100644 --- a/tests/components/eurotronic_cometblue/snapshots/test_number.ambr +++ b/tests/components/eurotronic_cometblue/snapshots/test_number.ambr @@ -17,7 +17,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'number', - 'entity_category': None, + 'entity_category': , 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_high', 'has_entity_name': True, 'hidden_by': None, @@ -78,7 +78,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'number', - 'entity_category': None, + 'entity_category': , 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_low', 'has_entity_name': True, 'hidden_by': None, @@ -139,7 +139,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'number', - 'entity_category': None, + 'entity_category': , 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_temperature_offset', 'has_entity_name': True, 'hidden_by': None, @@ -200,7 +200,7 @@ 'device_id': , 'disabled_by': None, 'domain': 'number', - 'entity_category': None, + 'entity_category': , 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_window_open_minutes', 'has_entity_name': True, 'hidden_by': None, From aec58e43ee4f143272823741e1c89c199411a432 Mon Sep 17 00:00:00 2001 From: Richard <42204099+rikroe@users.noreply.github.com> Date: Mon, 13 Apr 2026 20:10:51 +0200 Subject: [PATCH 05/12] Fix icon translations --- .../components/eurotronic_cometblue/icons.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/eurotronic_cometblue/icons.json b/homeassistant/components/eurotronic_cometblue/icons.json index 1ed6e068b28032..56d03dd165c8b4 100644 --- a/homeassistant/components/eurotronic_cometblue/icons.json +++ b/homeassistant/components/eurotronic_cometblue/icons.json @@ -6,15 +6,15 @@ } }, "number": { - "target_temperature_high": { + "offset": { + "default": "mdi:thermometer-check" + }, + "target_temp_high": { "default": "mdi:thermometer-chevron-up" }, - "target_temperature_low": { + "target_temp_low": { "default": "mdi:thermometer-chevron-down" }, - "temperature_offset": { - "default": "mdi:thermometer-check" - }, "window_open_minutes": { "default": "mdi:timer-sand" } From 13a62f84488e019cd0c30aed5401ec82d175b3c3 Mon Sep 17 00:00:00 2001 From: Richard <42204099+rikroe@users.noreply.github.com> Date: Mon, 13 Apr 2026 20:33:17 +0200 Subject: [PATCH 06/12] Use sentence case --- .../components/eurotronic_cometblue/strings.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/eurotronic_cometblue/strings.json b/homeassistant/components/eurotronic_cometblue/strings.json index 990997d7cc7cd7..65cff406eab85b 100644 --- a/homeassistant/components/eurotronic_cometblue/strings.json +++ b/homeassistant/components/eurotronic_cometblue/strings.json @@ -38,16 +38,16 @@ }, "number": { "offset": { - "name": "Temperature Offset" + "name": "Temperature offset" }, "target_temp_high": { - "name": "Target Temperature High" + "name": "Target temperature high" }, "target_temp_low": { - "name": "Target Temperature Low" + "name": "Target temperature low" }, "window_open_minutes": { - "name": "Window Open Minutes" + "name": "Window open minutes" } } } From daeb65a8e680241543c25455863ccfbcc3b443b8 Mon Sep 17 00:00:00 2001 From: Richard <42204099+rikroe@users.noreply.github.com> Date: Mon, 13 Apr 2026 21:04:01 +0200 Subject: [PATCH 07/12] Fix snapshots after renaming --- .../snapshots/test_number.ambr | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/components/eurotronic_cometblue/snapshots/test_number.ambr b/tests/components/eurotronic_cometblue/snapshots/test_number.ambr index 96a4b782e835f8..5d102f98af68d0 100644 --- a/tests/components/eurotronic_cometblue/snapshots/test_number.ambr +++ b/tests/components/eurotronic_cometblue/snapshots/test_number.ambr @@ -26,12 +26,12 @@ 'labels': set({ }), 'name': None, - 'object_id_base': 'Target Temperature High', + 'object_id_base': 'Target temperature high', 'options': dict({ }), 'original_device_class': , 'original_icon': None, - 'original_name': 'Target Temperature High', + 'original_name': 'Target temperature high', 'platform': 'eurotronic_cometblue', 'previous_unique_id': None, 'suggested_object_id': None, @@ -45,7 +45,7 @@ StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'temperature', - 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Target Temperature High', + 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Target temperature high', 'max': 28.5, 'min': 7.5, 'mode': , @@ -87,12 +87,12 @@ 'labels': set({ }), 'name': None, - 'object_id_base': 'Target Temperature Low', + 'object_id_base': 'Target temperature low', 'options': dict({ }), 'original_device_class': , 'original_icon': None, - 'original_name': 'Target Temperature Low', + 'original_name': 'Target temperature low', 'platform': 'eurotronic_cometblue', 'previous_unique_id': None, 'suggested_object_id': None, @@ -106,7 +106,7 @@ StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'temperature', - 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Target Temperature Low', + 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Target temperature low', 'max': 28.5, 'min': 7.5, 'mode': , @@ -148,12 +148,12 @@ 'labels': set({ }), 'name': None, - 'object_id_base': 'Temperature Offset', + 'object_id_base': 'Temperature offset', 'options': dict({ }), 'original_device_class': , 'original_icon': None, - 'original_name': 'Temperature Offset', + 'original_name': 'Temperature offset', 'platform': 'eurotronic_cometblue', 'previous_unique_id': None, 'suggested_object_id': None, @@ -167,7 +167,7 @@ StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'temperature', - 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Temperature Offset', + 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Temperature offset', 'max': 5.0, 'min': -5.0, 'mode': , @@ -209,12 +209,12 @@ 'labels': set({ }), 'name': None, - 'object_id_base': 'Window Open Minutes', + 'object_id_base': 'Window open minutes', 'options': dict({ }), 'original_device_class': , 'original_icon': None, - 'original_name': 'Window Open Minutes', + 'original_name': 'Window open minutes', 'platform': 'eurotronic_cometblue', 'previous_unique_id': None, 'suggested_object_id': None, @@ -228,7 +228,7 @@ StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'duration', - 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Window Open Minutes', + 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Window open minutes', 'max': 15.0, 'min': 5.0, 'mode': , From 8c9d97aa1e99e6556d02039da96c12cd53a8a420 Mon Sep 17 00:00:00 2001 From: Richard <42204099+rikroe@users.noreply.github.com> Date: Thu, 16 Apr 2026 22:15:10 +0200 Subject: [PATCH 08/12] Rename window open delay --- .../components/eurotronic_cometblue/number.py | 4 ++-- .../eurotronic_cometblue/strings.json | 4 ++-- .../snapshots/test_number.ambr | 18 +++++++++--------- .../eurotronic_cometblue/test_number.py | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/homeassistant/components/eurotronic_cometblue/number.py b/homeassistant/components/eurotronic_cometblue/number.py index 31cfffda283887..98b02728a0102a 100644 --- a/homeassistant/components/eurotronic_cometblue/number.py +++ b/homeassistant/components/eurotronic_cometblue/number.py @@ -88,9 +88,9 @@ class CometBlueNumberEntityDescription( entity_registry_enabled_default=True, ), CometBlueNumberEntityDescription( - key="window_open_minutes", + key="window_open_delay", cometblue_key="windowOpenMinutes", - translation_key="window_open_minutes", + translation_key="window_open_delay", device_class=NumberDeviceClass.DURATION, entity_category=EntityCategory.CONFIG, native_unit_of_measurement=UnitOfTime.MINUTES, diff --git a/homeassistant/components/eurotronic_cometblue/strings.json b/homeassistant/components/eurotronic_cometblue/strings.json index 65cff406eab85b..e719895fd015dc 100644 --- a/homeassistant/components/eurotronic_cometblue/strings.json +++ b/homeassistant/components/eurotronic_cometblue/strings.json @@ -46,8 +46,8 @@ "target_temp_low": { "name": "Target temperature low" }, - "window_open_minutes": { - "name": "Window open minutes" + "window_open_delay": { + "name": "Window open delay" } } } diff --git a/tests/components/eurotronic_cometblue/snapshots/test_number.ambr b/tests/components/eurotronic_cometblue/snapshots/test_number.ambr index 5d102f98af68d0..e74eb7b150c109 100644 --- a/tests/components/eurotronic_cometblue/snapshots/test_number.ambr +++ b/tests/components/eurotronic_cometblue/snapshots/test_number.ambr @@ -182,7 +182,7 @@ 'state': '0.0', }) # --- -# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_window_open_minutes-entry] +# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_window_open_delay-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -201,7 +201,7 @@ 'disabled_by': None, 'domain': 'number', 'entity_category': , - 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_window_open_minutes', + 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_window_open_delay', 'has_entity_name': True, 'hidden_by': None, 'icon': None, @@ -209,26 +209,26 @@ 'labels': set({ }), 'name': None, - 'object_id_base': 'Window open minutes', + 'object_id_base': 'Window open delay', 'options': dict({ }), 'original_device_class': , 'original_icon': None, - 'original_name': 'Window open minutes', + 'original_name': 'Window open delay', 'platform': 'eurotronic_cometblue', 'previous_unique_id': None, 'suggested_object_id': None, 'supported_features': 0, - 'translation_key': 'window_open_minutes', - 'unique_id': 'aa:bb:cc:dd:ee:ff-window_open_minutes', + 'translation_key': 'window_open_delay', + 'unique_id': 'aa:bb:cc:dd:ee:ff-window_open_delay', 'unit_of_measurement': , }) # --- -# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_window_open_minutes-state] +# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_window_open_delay-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'duration', - 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Window open minutes', + 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Window open delay', 'max': 15.0, 'min': 5.0, 'mode': , @@ -236,7 +236,7 @@ 'unit_of_measurement': , }), 'context': , - 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_window_open_minutes', + 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_window_open_delay', 'last_changed': , 'last_reported': , 'last_updated': , diff --git a/tests/components/eurotronic_cometblue/test_number.py b/tests/components/eurotronic_cometblue/test_number.py index baf01c9106e2f4..ae9c529e12f138 100644 --- a/tests/components/eurotronic_cometblue/test_number.py +++ b/tests/components/eurotronic_cometblue/test_number.py @@ -49,7 +49,7 @@ async def test_number_disabled_by_default_entities( """Test disabled-by-default number entities are not available.""" await setup_with_selected_platforms(hass, mock_config_entry, [Platform.NUMBER]) - for key in ("offset", "window_open_minutes"): + for key in ("offset", "window_open_delay"): entity_id = _number_entity_id(entity_registry, key) assert (entry := entity_registry.async_get(entity_id)) From 86b4e533b3ec9485b71836ba46c2daed9389cad8 Mon Sep 17 00:00:00 2001 From: Richard <42204099+rikroe@users.noreply.github.com> Date: Sun, 26 Apr 2026 11:26:57 +0200 Subject: [PATCH 09/12] Remove non-functioning window_open_delay --- .../components/eurotronic_cometblue/number.py | 20 +----- .../snapshots/test_number.ambr | 61 ------------------- .../eurotronic_cometblue/test_number.py | 9 ++- 3 files changed, 5 insertions(+), 85 deletions(-) diff --git a/homeassistant/components/eurotronic_cometblue/number.py b/homeassistant/components/eurotronic_cometblue/number.py index 98b02728a0102a..5c70474d72c279 100644 --- a/homeassistant/components/eurotronic_cometblue/number.py +++ b/homeassistant/components/eurotronic_cometblue/number.py @@ -14,12 +14,7 @@ NumberEntity, NumberEntityDescription, ) -from homeassistant.const import ( - PRECISION_HALVES, - EntityCategory, - UnitOfTemperature, - UnitOfTime, -) +from homeassistant.const import PRECISION_HALVES, EntityCategory, UnitOfTemperature from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback @@ -87,19 +82,6 @@ class CometBlueNumberEntityDescription( native_step=PRECISION_HALVES, entity_registry_enabled_default=True, ), - CometBlueNumberEntityDescription( - key="window_open_delay", - cometblue_key="windowOpenMinutes", - translation_key="window_open_delay", - device_class=NumberDeviceClass.DURATION, - entity_category=EntityCategory.CONFIG, - native_unit_of_measurement=UnitOfTime.MINUTES, - set_fn=lambda x: x.set_temperature_async, - native_min_value=5.0, - native_max_value=15.0, - native_step=5.0, - entity_registry_enabled_default=False, - ), ] diff --git a/tests/components/eurotronic_cometblue/snapshots/test_number.ambr b/tests/components/eurotronic_cometblue/snapshots/test_number.ambr index e74eb7b150c109..c74cd11c7b6bab 100644 --- a/tests/components/eurotronic_cometblue/snapshots/test_number.ambr +++ b/tests/components/eurotronic_cometblue/snapshots/test_number.ambr @@ -182,64 +182,3 @@ 'state': '0.0', }) # --- -# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_window_open_delay-entry] - EntityRegistryEntrySnapshot({ - 'aliases': list([ - None, - ]), - 'area_id': None, - 'capabilities': dict({ - 'max': 15.0, - 'min': 5.0, - 'mode': , - 'step': 5.0, - }), - 'config_entry_id': , - 'config_subentry_id': , - 'device_class': None, - 'device_id': , - 'disabled_by': None, - 'domain': 'number', - 'entity_category': , - 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_window_open_delay', - 'has_entity_name': True, - 'hidden_by': None, - 'icon': None, - 'id': , - 'labels': set({ - }), - 'name': None, - 'object_id_base': 'Window open delay', - 'options': dict({ - }), - 'original_device_class': , - 'original_icon': None, - 'original_name': 'Window open delay', - 'platform': 'eurotronic_cometblue', - 'previous_unique_id': None, - 'suggested_object_id': None, - 'supported_features': 0, - 'translation_key': 'window_open_delay', - 'unique_id': 'aa:bb:cc:dd:ee:ff-window_open_delay', - 'unit_of_measurement': , - }) -# --- -# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_window_open_delay-state] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'device_class': 'duration', - 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Window open delay', - 'max': 15.0, - 'min': 5.0, - 'mode': , - 'step': 5.0, - 'unit_of_measurement': , - }), - 'context': , - 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_window_open_delay', - 'last_changed': , - 'last_reported': , - 'last_updated': , - 'state': '10', - }) -# --- diff --git a/tests/components/eurotronic_cometblue/test_number.py b/tests/components/eurotronic_cometblue/test_number.py index ae9c529e12f138..993cb1c5c84d8b 100644 --- a/tests/components/eurotronic_cometblue/test_number.py +++ b/tests/components/eurotronic_cometblue/test_number.py @@ -49,12 +49,11 @@ async def test_number_disabled_by_default_entities( """Test disabled-by-default number entities are not available.""" await setup_with_selected_platforms(hass, mock_config_entry, [Platform.NUMBER]) - for key in ("offset", "window_open_delay"): - entity_id = _number_entity_id(entity_registry, key) + entity_id = _number_entity_id(entity_registry, "offset") - assert (entry := entity_registry.async_get(entity_id)) - assert entry.disabled_by is not None - assert hass.states.get(entity_id) is None + assert (entry := entity_registry.async_get(entity_id)) + assert entry.disabled_by is not None + assert hass.states.get(entity_id) is None @pytest.mark.parametrize( From f3085c2d190158a093a272eabe281d00e9d8f184 Mon Sep 17 00:00:00 2001 From: Richard <42204099+rikroe@users.noreply.github.com> Date: Sun, 26 Apr 2026 11:48:43 +0200 Subject: [PATCH 10/12] Rename entities to setpoints --- .../eurotronic_cometblue/icons.json | 11 ++-- .../components/eurotronic_cometblue/number.py | 8 +-- .../eurotronic_cometblue/strings.json | 15 +++--- .../snapshots/test_number.ambr | 50 +++++++++---------- .../eurotronic_cometblue/test_number.py | 4 +- 5 files changed, 41 insertions(+), 47 deletions(-) diff --git a/homeassistant/components/eurotronic_cometblue/icons.json b/homeassistant/components/eurotronic_cometblue/icons.json index 56d03dd165c8b4..5b418f4b2dbff9 100644 --- a/homeassistant/components/eurotronic_cometblue/icons.json +++ b/homeassistant/components/eurotronic_cometblue/icons.json @@ -6,17 +6,14 @@ } }, "number": { - "offset": { - "default": "mdi:thermometer-check" - }, - "target_temp_high": { + "comfort_setpoint": { "default": "mdi:thermometer-chevron-up" }, - "target_temp_low": { + "eco_setpoint": { "default": "mdi:thermometer-chevron-down" }, - "window_open_minutes": { - "default": "mdi:timer-sand" + "offset": { + "default": "mdi:thermometer-check" } } } diff --git a/homeassistant/components/eurotronic_cometblue/number.py b/homeassistant/components/eurotronic_cometblue/number.py index 5c70474d72c279..0cd47ceb344493 100644 --- a/homeassistant/components/eurotronic_cometblue/number.py +++ b/homeassistant/components/eurotronic_cometblue/number.py @@ -57,9 +57,9 @@ class CometBlueNumberEntityDescription( entity_registry_enabled_default=False, ), CometBlueNumberEntityDescription( - key="target_temp_low", + key="eco_setpoint", cometblue_key="targetTempLow", - translation_key="target_temp_low", + translation_key="eco_setpoint", device_class=NumberDeviceClass.TEMPERATURE, entity_category=EntityCategory.CONFIG, native_unit_of_measurement=UnitOfTemperature.CELSIUS, @@ -70,9 +70,9 @@ class CometBlueNumberEntityDescription( entity_registry_enabled_default=True, ), CometBlueNumberEntityDescription( - key="target_temp_high", + key="comfort_setpoint", cometblue_key="targetTempHigh", - translation_key="target_temp_high", + translation_key="comfort_setpoint", device_class=NumberDeviceClass.TEMPERATURE, entity_category=EntityCategory.CONFIG, native_unit_of_measurement=UnitOfTemperature.CELSIUS, diff --git a/homeassistant/components/eurotronic_cometblue/strings.json b/homeassistant/components/eurotronic_cometblue/strings.json index e719895fd015dc..9722914a088b6d 100644 --- a/homeassistant/components/eurotronic_cometblue/strings.json +++ b/homeassistant/components/eurotronic_cometblue/strings.json @@ -37,17 +37,14 @@ } }, "number": { - "offset": { - "name": "Temperature offset" - }, - "target_temp_high": { - "name": "Target temperature high" + "comfort_setpoint": { + "name": "Comfort setpoint" }, - "target_temp_low": { - "name": "Target temperature low" + "eco_setpoint": { + "name": "Eco setpoint" }, - "window_open_delay": { - "name": "Window open delay" + "offset": { + "name": "Setpoint offset" } } } diff --git a/tests/components/eurotronic_cometblue/snapshots/test_number.ambr b/tests/components/eurotronic_cometblue/snapshots/test_number.ambr index c74cd11c7b6bab..a41636fa7ae92e 100644 --- a/tests/components/eurotronic_cometblue/snapshots/test_number.ambr +++ b/tests/components/eurotronic_cometblue/snapshots/test_number.ambr @@ -1,5 +1,5 @@ # serializer version: 1 -# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_high-entry] +# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_comfort_setpoint-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -18,7 +18,7 @@ 'disabled_by': None, 'domain': 'number', 'entity_category': , - 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_high', + 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_comfort_setpoint', 'has_entity_name': True, 'hidden_by': None, 'icon': None, @@ -26,26 +26,26 @@ 'labels': set({ }), 'name': None, - 'object_id_base': 'Target temperature high', + 'object_id_base': 'Comfort setpoint', 'options': dict({ }), 'original_device_class': , 'original_icon': None, - 'original_name': 'Target temperature high', + 'original_name': 'Comfort setpoint', 'platform': 'eurotronic_cometblue', 'previous_unique_id': None, 'suggested_object_id': None, 'supported_features': 0, - 'translation_key': 'target_temp_high', - 'unique_id': 'aa:bb:cc:dd:ee:ff-target_temp_high', + 'translation_key': 'comfort_setpoint', + 'unique_id': 'aa:bb:cc:dd:ee:ff-comfort_setpoint', 'unit_of_measurement': , }) # --- -# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_high-state] +# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_comfort_setpoint-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'temperature', - 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Target temperature high', + 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Comfort setpoint', 'max': 28.5, 'min': 7.5, 'mode': , @@ -53,14 +53,14 @@ 'unit_of_measurement': , }), 'context': , - 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_high', + 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_comfort_setpoint', 'last_changed': , 'last_reported': , 'last_updated': , 'state': '21.0', }) # --- -# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_low-entry] +# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_eco_setpoint-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -79,7 +79,7 @@ 'disabled_by': None, 'domain': 'number', 'entity_category': , - 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_low', + 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_eco_setpoint', 'has_entity_name': True, 'hidden_by': None, 'icon': None, @@ -87,26 +87,26 @@ 'labels': set({ }), 'name': None, - 'object_id_base': 'Target temperature low', + 'object_id_base': 'Eco setpoint', 'options': dict({ }), 'original_device_class': , 'original_icon': None, - 'original_name': 'Target temperature low', + 'original_name': 'Eco setpoint', 'platform': 'eurotronic_cometblue', 'previous_unique_id': None, 'suggested_object_id': None, 'supported_features': 0, - 'translation_key': 'target_temp_low', - 'unique_id': 'aa:bb:cc:dd:ee:ff-target_temp_low', + 'translation_key': 'eco_setpoint', + 'unique_id': 'aa:bb:cc:dd:ee:ff-eco_setpoint', 'unit_of_measurement': , }) # --- -# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_low-state] +# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_eco_setpoint-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'temperature', - 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Target temperature low', + 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Eco setpoint', 'max': 28.5, 'min': 7.5, 'mode': , @@ -114,14 +114,14 @@ 'unit_of_measurement': , }), 'context': , - 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_low', + 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_eco_setpoint', 'last_changed': , 'last_reported': , 'last_updated': , 'state': '17.0', }) # --- -# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_temperature_offset-entry] +# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_setpoint_offset-entry] EntityRegistryEntrySnapshot({ 'aliases': list([ None, @@ -140,7 +140,7 @@ 'disabled_by': None, 'domain': 'number', 'entity_category': , - 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_temperature_offset', + 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_setpoint_offset', 'has_entity_name': True, 'hidden_by': None, 'icon': None, @@ -148,12 +148,12 @@ 'labels': set({ }), 'name': None, - 'object_id_base': 'Temperature offset', + 'object_id_base': 'Setpoint offset', 'options': dict({ }), 'original_device_class': , 'original_icon': None, - 'original_name': 'Temperature offset', + 'original_name': 'Setpoint offset', 'platform': 'eurotronic_cometblue', 'previous_unique_id': None, 'suggested_object_id': None, @@ -163,11 +163,11 @@ 'unit_of_measurement': , }) # --- -# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_temperature_offset-state] +# name: test_number_state[number.comet_blue_aa_bb_cc_dd_ee_ff_setpoint_offset-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'temperature', - 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Temperature offset', + 'friendly_name': 'Comet Blue aa:bb:cc:dd:ee:ff Setpoint offset', 'max': 5.0, 'min': -5.0, 'mode': , @@ -175,7 +175,7 @@ 'unit_of_measurement': , }), 'context': , - 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_temperature_offset', + 'entity_id': 'number.comet_blue_aa_bb_cc_dd_ee_ff_setpoint_offset', 'last_changed': , 'last_reported': , 'last_updated': , diff --git a/tests/components/eurotronic_cometblue/test_number.py b/tests/components/eurotronic_cometblue/test_number.py index 993cb1c5c84d8b..27392f69001f4e 100644 --- a/tests/components/eurotronic_cometblue/test_number.py +++ b/tests/components/eurotronic_cometblue/test_number.py @@ -59,8 +59,8 @@ async def test_number_disabled_by_default_entities( @pytest.mark.parametrize( ("entity_id", "value", "default_value"), [ - ("number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_low", 18.5, 17.0), - ("number.comet_blue_aa_bb_cc_dd_ee_ff_target_temperature_high", 23.0, 21.0), + ("number.comet_blue_aa_bb_cc_dd_ee_ff_eco_setpoint", 18.5, 17.0), + ("number.comet_blue_aa_bb_cc_dd_ee_ff_comfort_setpoint", 23.0, 21.0), ], ) async def test_set_number_value( From 2584bfbed1295b261da74725de50bc21c129ecfe Mon Sep 17 00:00:00 2001 From: Richard <42204099+rikroe@users.noreply.github.com> Date: Sun, 26 Apr 2026 11:56:58 +0200 Subject: [PATCH 11/12] Add setpoint number test --- tests/components/eurotronic_cometblue/test_number.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/components/eurotronic_cometblue/test_number.py b/tests/components/eurotronic_cometblue/test_number.py index 27392f69001f4e..e7804b094439a4 100644 --- a/tests/components/eurotronic_cometblue/test_number.py +++ b/tests/components/eurotronic_cometblue/test_number.py @@ -56,11 +56,13 @@ async def test_number_disabled_by_default_entities( assert hass.states.get(entity_id) is None +@pytest.mark.usefixtures("entity_registry_enabled_by_default") @pytest.mark.parametrize( ("entity_id", "value", "default_value"), [ ("number.comet_blue_aa_bb_cc_dd_ee_ff_eco_setpoint", 18.5, 17.0), ("number.comet_blue_aa_bb_cc_dd_ee_ff_comfort_setpoint", 23.0, 21.0), + ("number.comet_blue_aa_bb_cc_dd_ee_ff_setpoint_offset", -1.5, 0.0), ], ) async def test_set_number_value( From a72e659ec0f64e32b49f7572172ed28b7fc1c5d7 Mon Sep 17 00:00:00 2001 From: Richard <42204099+rikroe@users.noreply.github.com> Date: Sun, 26 Apr 2026 12:08:03 +0200 Subject: [PATCH 12/12] Remove unneeded logger --- homeassistant/components/eurotronic_cometblue/number.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/homeassistant/components/eurotronic_cometblue/number.py b/homeassistant/components/eurotronic_cometblue/number.py index 0cd47ceb344493..45aa5b468ffb18 100644 --- a/homeassistant/components/eurotronic_cometblue/number.py +++ b/homeassistant/components/eurotronic_cometblue/number.py @@ -4,7 +4,6 @@ from collections.abc import Callable from dataclasses import dataclass -import logging from typing import Any from eurotronic_cometblue_ha import AsyncCometBlue @@ -22,8 +21,6 @@ from .coordinator import CometBlueConfigEntry, CometBlueDataUpdateCoordinator from .entity import CometBlueBluetoothEntity -LOGGER = logging.getLogger(__name__) - PARALLEL_UPDATES = 1