Issue #56 - Exception when undeerlying thermostat is not found at startup
This commit is contained in:
@@ -598,7 +598,11 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
||||
|
||||
self.async_on_remove(self.async_remove_thermostat)
|
||||
|
||||
await self.async_startup()
|
||||
try:
|
||||
await self.async_startup()
|
||||
except UnknownEntity:
|
||||
# Ingore this error which is possible if underlying climate is not found temporary
|
||||
pass
|
||||
|
||||
# starts a cycle if we are in over_climate type
|
||||
if self._is_over_climate:
|
||||
@@ -651,7 +655,8 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
||||
self,
|
||||
self._climate_entity_id,
|
||||
)
|
||||
self._is_over_climate = False
|
||||
# #56 keep the over_climate and try periodically to find the underlying climate
|
||||
# self._is_over_climate = False
|
||||
raise UnknownEntity(
|
||||
f"Underlying thermostat {self._climate_entity_id} not found"
|
||||
)
|
||||
@@ -2229,6 +2234,17 @@ class VersatileThermostat(ClimateEntity, RestoreEntity):
|
||||
self._attr_preset_mode,
|
||||
)
|
||||
|
||||
# Issue 56 in over_climate mode, if the underlying climate is not initialized, try to initialize it
|
||||
if self._is_over_climate and self._underlying_climate is None:
|
||||
_LOGGER.info(
|
||||
"%s - Underlying climate is not initialized. Try to initialize it", self
|
||||
)
|
||||
try:
|
||||
await self.async_startup()
|
||||
except UnknownEntity as err:
|
||||
# still not found, we an stop here
|
||||
raise err
|
||||
|
||||
# Check overpowering condition
|
||||
overpowering: bool = await self.check_overpowering()
|
||||
if overpowering:
|
||||
|
||||
84
custom_components/versatile_thermostat/tests/test_bugs.py
Normal file
84
custom_components/versatile_thermostat/tests/test_bugs.py
Normal file
@@ -0,0 +1,84 @@
|
||||
""" Test the Window management """
|
||||
from unittest.mock import patch
|
||||
from .commons import * # pylint: disable=wildcard-import, unused-wildcard-import
|
||||
|
||||
import logging
|
||||
|
||||
logging.getLogger().setLevel(logging.DEBUG)
|
||||
|
||||
|
||||
async def test_bug_56(
|
||||
hass: HomeAssistant,
|
||||
skip_hass_states_is_state,
|
||||
skip_turn_on_off_heater,
|
||||
skip_send_event,
|
||||
):
|
||||
"""Test that in over_climate mode there is no error when underlying climate is not available"""
|
||||
|
||||
the_mock_underlying = MagicMockClimate()
|
||||
with patch(
|
||||
"custom_components.versatile_thermostat.climate.VersatileThermostat.find_underlying_climate",
|
||||
return_value=None, # dont find the underlying climate
|
||||
):
|
||||
entry = MockConfigEntry(
|
||||
domain=DOMAIN,
|
||||
title="TheOverClimateMockName",
|
||||
unique_id="uniqueId",
|
||||
data={
|
||||
CONF_NAME: "TheOverClimateMockName",
|
||||
CONF_THERMOSTAT_TYPE: CONF_THERMOSTAT_CLIMATE,
|
||||
CONF_TEMP_SENSOR: "sensor.mock_temp_sensor",
|
||||
CONF_EXTERNAL_TEMP_SENSOR: "sensor.mock_ext_temp_sensor",
|
||||
CONF_CYCLE_MIN: 5,
|
||||
CONF_TEMP_MIN: 15,
|
||||
CONF_TEMP_MAX: 30,
|
||||
"eco_temp": 17,
|
||||
"comfort_temp": 18,
|
||||
"boost_temp": 19,
|
||||
CONF_USE_WINDOW_FEATURE: False,
|
||||
CONF_USE_MOTION_FEATURE: False,
|
||||
CONF_USE_POWER_FEATURE: False,
|
||||
CONF_USE_PRESENCE_FEATURE: False,
|
||||
CONF_CLIMATE: "climate.mock_climate",
|
||||
CONF_MINIMAL_ACTIVATION_DELAY: 30,
|
||||
CONF_SECURITY_DELAY_MIN: 5,
|
||||
CONF_SECURITY_MIN_ON_PERCENT: 0.3,
|
||||
},
|
||||
)
|
||||
|
||||
entity: VersatileThermostat = await create_thermostat(
|
||||
hass, entry, "climate.theoverclimatemockname"
|
||||
)
|
||||
assert entity
|
||||
# cause the underlying climate was not found
|
||||
assert entity.is_over_climate is True
|
||||
assert entity._underlying_climate is None
|
||||
|
||||
# Should not failed
|
||||
entity.update_custom_attributes()
|
||||
|
||||
# try to call _async_control_heating
|
||||
try:
|
||||
await entity._async_control_heating()
|
||||
# an exception should be send
|
||||
assert False
|
||||
except UnknownEntity:
|
||||
pass
|
||||
except Exception: # pylint: disable=broad-exception-caught
|
||||
assert False
|
||||
|
||||
# This time the underlying will be found
|
||||
with patch(
|
||||
"custom_components.versatile_thermostat.climate.VersatileThermostat.find_underlying_climate",
|
||||
return_value=the_mock_underlying, # dont find the underlying climate
|
||||
):
|
||||
# try to call _async_control_heating
|
||||
try:
|
||||
await entity._async_control_heating()
|
||||
except UnknownEntity:
|
||||
assert False
|
||||
except Exception: # pylint: disable=broad-exception-caught
|
||||
assert False
|
||||
|
||||
# Should not failed
|
||||
entity.update_custom_attributes()
|
||||
Reference in New Issue
Block a user