Co-authored-by: Jean-Marc Collin <jean-marc.collin-extern@renault.com>
This commit is contained in:
@@ -532,7 +532,7 @@ class BaseThermostat(ClimateEntity, RestoreEntity, Generic[T]):
|
|||||||
self._overpowering_state = None
|
self._overpowering_state = None
|
||||||
self._presence_state = None
|
self._presence_state = None
|
||||||
|
|
||||||
self._total_energy = 0
|
self._total_energy = None
|
||||||
|
|
||||||
# Read the parameter from configuration.yaml if it exists
|
# Read the parameter from configuration.yaml if it exists
|
||||||
short_ema_params = DEFAULT_SHORT_EMA_PARAMS
|
short_ema_params = DEFAULT_SHORT_EMA_PARAMS
|
||||||
@@ -860,8 +860,7 @@ class BaseThermostat(ClimateEntity, RestoreEntity, Generic[T]):
|
|||||||
self._hvac_mode = HVACMode.OFF
|
self._hvac_mode = HVACMode.OFF
|
||||||
|
|
||||||
old_total_energy = old_state.attributes.get(ATTR_TOTAL_ENERGY)
|
old_total_energy = old_state.attributes.get(ATTR_TOTAL_ENERGY)
|
||||||
if old_total_energy:
|
self._total_energy = old_total_energy if old_total_energy else 0
|
||||||
self._total_energy = old_total_energy
|
|
||||||
|
|
||||||
self.restore_specific_previous_state(old_state)
|
self.restore_specific_previous_state(old_state)
|
||||||
else:
|
else:
|
||||||
@@ -874,6 +873,7 @@ class BaseThermostat(ClimateEntity, RestoreEntity, Generic[T]):
|
|||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"No previously saved temperature, setting to %s", self._target_temp
|
"No previously saved temperature, setting to %s", self._target_temp
|
||||||
)
|
)
|
||||||
|
self._total_energy = 0
|
||||||
|
|
||||||
self._saved_target_temp = self._target_temp
|
self._saved_target_temp = self._target_temp
|
||||||
|
|
||||||
@@ -1063,7 +1063,10 @@ class BaseThermostat(ClimateEntity, RestoreEntity, Generic[T]):
|
|||||||
@property
|
@property
|
||||||
def total_energy(self) -> float | None:
|
def total_energy(self) -> float | None:
|
||||||
"""Returns the total energy calculated for this thermostast"""
|
"""Returns the total energy calculated for this thermostast"""
|
||||||
return round(self._total_energy, 2)
|
if self._total_energy is not None:
|
||||||
|
return round(self._total_energy, 2)
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def device_power(self) -> float | None:
|
def device_power(self) -> float | None:
|
||||||
|
|||||||
@@ -125,15 +125,15 @@ class EnergySensor(VersatileThermostatBaseEntity, SensorEntity):
|
|||||||
"""Called when my climate have change"""
|
"""Called when my climate have change"""
|
||||||
_LOGGER.debug("%s - climate state change", self._attr_unique_id)
|
_LOGGER.debug("%s - climate state change", self._attr_unique_id)
|
||||||
|
|
||||||
if math.isnan(self.my_climate.total_energy) or math.isinf(
|
energy = self.my_climate.total_energy
|
||||||
self.my_climate.total_energy
|
if energy is None:
|
||||||
):
|
return
|
||||||
|
|
||||||
|
if math.isnan(energy) or math.isinf(energy):
|
||||||
raise ValueError(f"Sensor has illegal state {self.my_climate.total_energy}")
|
raise ValueError(f"Sensor has illegal state {self.my_climate.total_energy}")
|
||||||
|
|
||||||
old_state = self._attr_native_value
|
old_state = self._attr_native_value
|
||||||
self._attr_native_value = round(
|
self._attr_native_value = round(energy, self.suggested_display_precision)
|
||||||
self.my_climate.total_energy, self.suggested_display_precision
|
|
||||||
)
|
|
||||||
if old_state != self._attr_native_value:
|
if old_state != self._attr_native_value:
|
||||||
self.async_write_ha_state()
|
self.async_write_ha_state()
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -581,7 +581,11 @@ class ThermostatOverClimate(BaseThermostat[UnderlyingClimate]):
|
|||||||
):
|
):
|
||||||
added_energy = self._device_power * self._underlying_climate_delta_t
|
added_energy = self._device_power * self._underlying_climate_delta_t
|
||||||
|
|
||||||
self._total_energy += added_energy
|
if self._total_energy is None:
|
||||||
|
self._total_energy = added_energy
|
||||||
|
else:
|
||||||
|
self._total_energy += added_energy
|
||||||
|
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"%s - added energy is %.3f . Total energy is now: %.3f",
|
"%s - added energy is %.3f . Total energy is now: %.3f",
|
||||||
self,
|
self,
|
||||||
|
|||||||
@@ -199,7 +199,11 @@ class ThermostatOverSwitch(BaseThermostat[UnderlyingSwitch]):
|
|||||||
if not self.is_over_climate and self.mean_cycle_power is not None:
|
if not self.is_over_climate and self.mean_cycle_power is not None:
|
||||||
added_energy = self.mean_cycle_power * float(self._cycle_min) / 60.0
|
added_energy = self.mean_cycle_power * float(self._cycle_min) / 60.0
|
||||||
|
|
||||||
self._total_energy += added_energy
|
if self._total_energy is None:
|
||||||
|
self._total_energy = added_energy
|
||||||
|
else:
|
||||||
|
self._total_energy += added_energy
|
||||||
|
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"%s - added energy is %.3f . Total energy is now: %.3f",
|
"%s - added energy is %.3f . Total energy is now: %.3f",
|
||||||
self,
|
self,
|
||||||
|
|||||||
@@ -279,7 +279,11 @@ class ThermostatOverValve(BaseThermostat[UnderlyingValve]): # pylint: disable=a
|
|||||||
if not self.is_over_climate and self.mean_cycle_power is not None:
|
if not self.is_over_climate and self.mean_cycle_power is not None:
|
||||||
added_energy = self.mean_cycle_power * float(self._cycle_min) / 60.0
|
added_energy = self.mean_cycle_power * float(self._cycle_min) / 60.0
|
||||||
|
|
||||||
self._total_energy += added_energy
|
if self._total_energy is None:
|
||||||
|
self._total_energy = added_energy
|
||||||
|
else:
|
||||||
|
self._total_energy += added_energy
|
||||||
|
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"%s - added energy is %.3f . Total energy is now: %.3f",
|
"%s - added energy is %.3f . Total energy is now: %.3f",
|
||||||
self,
|
self,
|
||||||
|
|||||||
Reference in New Issue
Block a user