[Feature Request] - Resend state to underlying device is device switch from Unknown state.

Fixes #829
This commit is contained in:
Jean-Marc Collin
2025-01-18 16:48:04 +00:00
parent d1ef83f422
commit a2f3b24928
4 changed files with 137 additions and 33 deletions

View File

@@ -1067,9 +1067,7 @@ class BaseThermostat(ClimateEntity, RestoreEntity, Generic[T]):
save_state()
@overrides
async def async_set_preset_mode(
self, preset_mode: str, overwrite_saved_preset=True
):
async def async_set_preset_mode(self, preset_mode: str, overwrite_saved_preset=True):
"""Set new preset mode."""
# We accept a new preset when:
@@ -1097,14 +1095,10 @@ class BaseThermostat(ClimateEntity, RestoreEntity, Generic[T]):
return
await self.async_set_preset_mode_internal(
preset_mode, force=False, overwrite_saved_preset=overwrite_saved_preset
)
await self.async_set_preset_mode_internal(preset_mode, force=False, overwrite_saved_preset=overwrite_saved_preset)
await self.async_control_heating(force=True)
async def async_set_preset_mode_internal(
self, preset_mode: str, force=False, overwrite_saved_preset=True
):
async def async_set_preset_mode_internal(self, preset_mode: str, force=False, overwrite_saved_preset=True):
"""Set new preset mode."""
_LOGGER.info("%s - Set preset_mode: %s force=%s", self, preset_mode, force)
if (
@@ -1573,9 +1567,7 @@ class BaseThermostat(ClimateEntity, RestoreEntity, Generic[T]):
and HVACMode.HEAT in self.hvac_modes
):
await self.async_set_hvac_mode(HVACMode.HEAT)
await self.async_set_preset_mode(
PRESET_FROST_PROTECTION, overwrite_saved_preset=False
)
await self.async_set_preset_mode(PRESET_FROST_PROTECTION, overwrite_saved_preset=False)
else:
self.set_hvac_off_reason(HVAC_OFF_REASON_MANUAL)
await self.async_set_hvac_mode(HVACMode.OFF)
@@ -1800,9 +1792,7 @@ class BaseThermostat(ClimateEntity, RestoreEntity, Generic[T]):
# If the changed preset is active, change the current temperature
# Issue #119 - reload new preset temperature also in ac mode
if preset.startswith(self._attr_preset_mode):
await self.async_set_preset_mode_internal(
preset.rstrip(PRESET_AC_SUFFIX), force=True
)
await self.async_set_preset_mode_internal(preset.rstrip(PRESET_AC_SUFFIX), force=True)
await self.async_control_heating(force=True)
async def SERVICE_SET_SAFETY(

View File

@@ -3,7 +3,7 @@
import logging
from datetime import timedelta, datetime
from homeassistant.const import STATE_ON
from homeassistant.const import STATE_ON, STATE_UNAVAILABLE, STATE_UNKNOWN
from homeassistant.core import Event, HomeAssistant, State, callback
from homeassistant.helpers.event import (
async_track_state_change_event,
@@ -614,7 +614,7 @@ class ThermostatOverClimate(BaseThermostat[UnderlyingClimate]):
return
# Find the underlying which have change
under = self.find_underlying_by_entity_id(new_state.entity_id)
under: UnderlyingClimate = self.find_underlying_by_entity_id(new_state.entity_id)
if not under:
_LOGGER.warning(
@@ -626,6 +626,16 @@ class ThermostatOverClimate(BaseThermostat[UnderlyingClimate]):
new_hvac_mode = new_state.state
old_state = event.data.get("old_state")
# Issue #829 - refresh underlying command if it comes back to life
if old_state is not None and new_state.state not in (STATE_UNAVAILABLE, STATE_UNKNOWN) and old_state.state in (STATE_UNAVAILABLE, STATE_UNKNOWN):
_LOGGER.warning("%s - underlying %s come back to life. New state=%s, old_state=%s. Will refresh its status", self, under.entity_id, new_state.state, old_state.state)
# Force hvac_mode and target temperature
await under.set_hvac_mode(self.hvac_mode)
await self._send_regulated_temperature(force=True)
return
old_hvac_action = (
old_state.attributes.get("hvac_action")
if old_state and old_state.attributes