expose schedule id as an extra state attribute in Netatmo (#147076)

This commit is contained in:
wuede 2025-07-15 12:16:59 +02:00 committed by GitHub
parent ab187f39c2
commit 8256401f7f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 33 additions and 6 deletions

View File

@ -38,6 +38,7 @@ from .const import (
ATTR_HEATING_POWER_REQUEST,
ATTR_SCHEDULE_NAME,
ATTR_SELECTED_SCHEDULE,
ATTR_SELECTED_SCHEDULE_ID,
ATTR_TARGET_TEMPERATURE,
ATTR_TIME_PERIOD,
DATA_SCHEDULES,
@ -251,16 +252,22 @@ class NetatmoThermostat(NetatmoRoomEntity, ClimateEntity):
if data["event_type"] == EVENT_TYPE_SCHEDULE:
# handle schedule change
if "schedule_id" in data:
selected_schedule = self.hass.data[DOMAIN][DATA_SCHEDULES][
self.home.entity_id
].get(data["schedule_id"])
self._selected_schedule = getattr(
self.hass.data[DOMAIN][DATA_SCHEDULES][self.home.entity_id].get(
data["schedule_id"]
),
selected_schedule,
"name",
None,
)
self._attr_extra_state_attributes[ATTR_SELECTED_SCHEDULE] = (
self._selected_schedule
)
self._attr_extra_state_attributes[ATTR_SELECTED_SCHEDULE_ID] = getattr(
selected_schedule, "entity_id", None
)
self.async_write_ha_state()
self.data_handler.async_force_update(self._signal_name)
# ignore other schedule events
@ -420,12 +427,14 @@ class NetatmoThermostat(NetatmoRoomEntity, ClimateEntity):
self._attr_hvac_mode = HVAC_MAP_NETATMO[self._attr_preset_mode]
self._away = self._attr_hvac_mode == HVAC_MAP_NETATMO[STATE_NETATMO_AWAY]
self._selected_schedule = getattr(
self.home.get_selected_schedule(), "name", None
)
selected_schedule = self.home.get_selected_schedule()
self._selected_schedule = getattr(selected_schedule, "name", None)
self._attr_extra_state_attributes[ATTR_SELECTED_SCHEDULE] = (
self._selected_schedule
)
self._attr_extra_state_attributes[ATTR_SELECTED_SCHEDULE_ID] = getattr(
selected_schedule, "entity_id", None
)
if self.device_type == NA_VALVE:
self._attr_extra_state_attributes[ATTR_HEATING_POWER_REQUEST] = (

View File

@ -95,6 +95,7 @@ ATTR_PSEUDO = "pseudo"
ATTR_SCHEDULE_ID = "schedule_id"
ATTR_SCHEDULE_NAME = "schedule_name"
ATTR_SELECTED_SCHEDULE = "selected_schedule"
ATTR_SELECTED_SCHEDULE_ID = "selected_schedule_id"
ATTR_TARGET_TEMPERATURE = "target_temperature"
ATTR_TIME_PERIOD = "time_period"

View File

@ -147,6 +147,7 @@
'schedule',
]),
'selected_schedule': 'Default',
'selected_schedule_id': '591b54a2764ff4d50d8b5795',
'supported_features': <ClimateEntityFeature: 401>,
'target_temp_step': 0.5,
'temperature': 7,
@ -229,6 +230,7 @@
'schedule',
]),
'selected_schedule': 'Default',
'selected_schedule_id': '591b54a2764ff4d50d8b5795',
'supported_features': <ClimateEntityFeature: 401>,
'target_temp_step': 0.5,
'temperature': 22,
@ -312,6 +314,7 @@
'schedule',
]),
'selected_schedule': 'Default',
'selected_schedule_id': '591b54a2764ff4d50d8b5795',
'supported_features': <ClimateEntityFeature: 401>,
'target_temp_step': 0.5,
'temperature': 7,
@ -396,6 +399,7 @@
'schedule',
]),
'selected_schedule': 'Default',
'selected_schedule_id': '591b54a2764ff4d50d8b5795',
'supported_features': <ClimateEntityFeature: 401>,
'target_temp_step': 0.5,
'temperature': 12,

View File

@ -681,6 +681,13 @@ async def test_service_schedule_thermostats(
webhook_id = config_entry.data[CONF_WEBHOOK_ID]
climate_entity_livingroom = "climate.livingroom"
assert (
hass.states.get(climate_entity_livingroom).attributes.get(
"selected_schedule_id"
)
== "591b54a2764ff4d50d8b5795"
)
# Test setting a valid schedule
with patch("pyatmo.home.Home.async_switch_schedule") as mock_switch_schedule:
await hass.services.async_call(
@ -707,6 +714,12 @@ async def test_service_schedule_thermostats(
hass.states.get(climate_entity_livingroom).attributes["selected_schedule"]
== "Winter"
)
assert (
hass.states.get(climate_entity_livingroom).attributes.get(
"selected_schedule_id"
)
== "b1b54a2f45795764f59d50d8"
)
# Test setting an invalid schedule
with patch("pyatmo.home.Home.async_switch_schedule") as mock_switch_home_schedule: