From 94e9a3ef20cb119a0e9877ed3c14e3f783905b6b Mon Sep 17 00:00:00 2001 From: Tobias Sauerwein Date: Wed, 1 Apr 2020 18:40:04 +0200 Subject: [PATCH 1/8] Handle unavailabe entities --- homeassistant/components/netatmo/climate.py | 58 +++++++++++++++------ 1 file changed, 43 insertions(+), 15 deletions(-) diff --git a/homeassistant/components/netatmo/climate.py b/homeassistant/components/netatmo/climate.py index 1f1b7088b295a..aaf6e03a41910 100644 --- a/homeassistant/components/netatmo/climate.py +++ b/homeassistant/components/netatmo/climate.py @@ -11,7 +11,6 @@ from homeassistant.components.climate.const import ( CURRENT_HVAC_HEAT, CURRENT_HVAC_IDLE, - DEFAULT_MIN_TEMP, HVAC_MODE_AUTO, HVAC_MODE_HEAT, HVAC_MODE_OFF, @@ -56,6 +55,7 @@ STATE_NETATMO_AWAY = PRESET_AWAY STATE_NETATMO_OFF = STATE_OFF STATE_NETATMO_MANUAL = "manual" +STATE_NETATMO_HOME = "home" PRESET_MAP_NETATMO = { PRESET_FROST_GUARD: STATE_NETATMO_HG, @@ -173,8 +173,11 @@ def __init__(self, data, room_id): self._support_flags = SUPPORT_FLAGS self._hvac_mode = None self._battery_level = None + self._connected = None self.update_without_throttle = False - self._module_type = self._data.room_status.get(room_id, {}).get("module_type") + self._module_type = self._data.room_status.get(room_id, {}).get( + "module_type", NA_VALVE + ) if self._module_type == NA_THERM: self._operation_list.append(HVAC_MODE_OFF) @@ -252,25 +255,23 @@ def hvac_action(self) -> Optional[str]: def set_hvac_mode(self, hvac_mode: str) -> None: """Set new target hvac mode.""" - mode = None - + _LOGGER.debug("set hvac mode: %s", hvac_mode) if hvac_mode == HVAC_MODE_OFF: - mode = STATE_NETATMO_OFF + self.turn_off() elif hvac_mode == HVAC_MODE_AUTO: - mode = PRESET_SCHEDULE + if self.hvac_mode == STATE_OFF: + _LOGGER.debug("Turning on first") + self.turn_on() + self.set_preset_mode(PRESET_SCHEDULE) elif hvac_mode == HVAC_MODE_HEAT: - mode = PRESET_BOOST - - self.set_preset_mode(mode) + self.set_preset_mode(PRESET_BOOST) def set_preset_mode(self, preset_mode: str) -> None: """Set new preset mode.""" + _LOGGER.debug("set preset mode: %s", preset_mode) if self.target_temperature == 0: self._data.homestatus.setroomThermpoint( - self._data.home_id, - self._room_id, - STATE_NETATMO_MANUAL, - DEFAULT_MIN_TEMP, + self._data.home_id, self._room_id, STATE_NETATMO_HOME, ) if ( @@ -283,7 +284,7 @@ def set_preset_mode(self, preset_mode: str) -> None: STATE_NETATMO_MANUAL, DEFAULT_MAX_TEMP, ) - elif preset_mode in [PRESET_BOOST, STATE_NETATMO_MAX, STATE_NETATMO_OFF]: + elif preset_mode in [PRESET_BOOST, STATE_NETATMO_MAX]: self._data.homestatus.setroomThermpoint( self._data.home_id, self._room_id, PRESET_MAP_NETATMO[preset_mode] ) @@ -293,6 +294,7 @@ def set_preset_mode(self, preset_mode: str) -> None: ) else: _LOGGER.error("Preset mode '%s' not available", preset_mode) + self.update_without_throttle = True self.schedule_update_ha_state() @@ -328,6 +330,31 @@ def device_state_attributes(self): return attr + def turn_off(self): + """Turn the entity off.""" + _LOGGER.debug("Turn off home: %s room: %s", self._data.home_id, self._room_id) + if self._module_type != NA_VALVE: + _LOGGER.info("Valves do not support being turned off") + elif self.hvac_mode != STATE_OFF: + self._data.homestatus.setroomThermpoint( + self._data.home_id, self._room_id, HVAC_MODE_OFF + ) + self.update_without_throttle = True + self.schedule_update_ha_state() + + def turn_on(self): + """Turn the entity on.""" + self._data.homestatus.setroomThermpoint( + self._data.home_id, self._room_id, STATE_NETATMO_HOME + ) + self.update_without_throttle = True + self.schedule_update_ha_state() + + @property + def available(self) -> bool: + """If the device hasn't been able to connect, mark as unavailable.""" + return self._connected or self._connected is None + def update(self): """Get the latest data from NetAtmo API and updates the states.""" try: @@ -356,11 +383,12 @@ def update(self): "battery_level" ) except KeyError as err: - _LOGGER.error( + _LOGGER.debug( "The thermostat in room %s seems to be out of reach. (%s)", self._room_name, err, ) + self._connected = None self._away = self._hvac_mode == HVAC_MAP_NETATMO[STATE_NETATMO_AWAY] From 64e62de331aed81adb596a0090664229c99eca19 Mon Sep 17 00:00:00 2001 From: Tobias Sauerwein Date: Wed, 1 Apr 2020 18:41:01 +0200 Subject: [PATCH 2/8] Remove some logging --- homeassistant/components/netatmo/climate.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/homeassistant/components/netatmo/climate.py b/homeassistant/components/netatmo/climate.py index aaf6e03a41910..f5ba4ee1283ec 100644 --- a/homeassistant/components/netatmo/climate.py +++ b/homeassistant/components/netatmo/climate.py @@ -255,7 +255,6 @@ def hvac_action(self) -> Optional[str]: def set_hvac_mode(self, hvac_mode: str) -> None: """Set new target hvac mode.""" - _LOGGER.debug("set hvac mode: %s", hvac_mode) if hvac_mode == HVAC_MODE_OFF: self.turn_off() elif hvac_mode == HVAC_MODE_AUTO: @@ -268,7 +267,6 @@ def set_hvac_mode(self, hvac_mode: str) -> None: def set_preset_mode(self, preset_mode: str) -> None: """Set new preset mode.""" - _LOGGER.debug("set preset mode: %s", preset_mode) if self.target_temperature == 0: self._data.homestatus.setroomThermpoint( self._data.home_id, self._room_id, STATE_NETATMO_HOME, @@ -332,8 +330,7 @@ def device_state_attributes(self): def turn_off(self): """Turn the entity off.""" - _LOGGER.debug("Turn off home: %s room: %s", self._data.home_id, self._room_id) - if self._module_type != NA_VALVE: + if self._module_type == NA_VALVE: _LOGGER.info("Valves do not support being turned off") elif self.hvac_mode != STATE_OFF: self._data.homestatus.setroomThermpoint( From ba5707c762a646d9fe29a15efc4b09bbb8a5ce42 Mon Sep 17 00:00:00 2001 From: Tobias Sauerwein Date: Wed, 1 Apr 2020 19:09:28 +0200 Subject: [PATCH 3/8] Set valve to lowest temp when turned off --- homeassistant/components/netatmo/climate.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/netatmo/climate.py b/homeassistant/components/netatmo/climate.py index f5ba4ee1283ec..9b1961ff02627 100644 --- a/homeassistant/components/netatmo/climate.py +++ b/homeassistant/components/netatmo/climate.py @@ -11,6 +11,7 @@ from homeassistant.components.climate.const import ( CURRENT_HVAC_HEAT, CURRENT_HVAC_IDLE, + DEFAULT_MIN_TEMP, HVAC_MODE_AUTO, HVAC_MODE_HEAT, HVAC_MODE_OFF, @@ -331,13 +332,18 @@ def device_state_attributes(self): def turn_off(self): """Turn the entity off.""" if self._module_type == NA_VALVE: - _LOGGER.info("Valves do not support being turned off") + self._data.homestatus.setroomThermpoint( + self._data.home_id, + self._room_id, + STATE_NETATMO_MANUAL, + DEFAULT_MIN_TEMP, + ) elif self.hvac_mode != STATE_OFF: self._data.homestatus.setroomThermpoint( self._data.home_id, self._room_id, HVAC_MODE_OFF ) - self.update_without_throttle = True - self.schedule_update_ha_state() + self.update_without_throttle = True + self.schedule_update_ha_state() def turn_on(self): """Turn the entity on.""" From 828c77c094c0a1065fdfc8f17e9fd10497c4efab Mon Sep 17 00:00:00 2001 From: Tobias Sauerwein Date: Wed, 1 Apr 2020 21:54:52 +0200 Subject: [PATCH 4/8] Remove some logging --- homeassistant/components/netatmo/climate.py | 1 - 1 file changed, 1 deletion(-) diff --git a/homeassistant/components/netatmo/climate.py b/homeassistant/components/netatmo/climate.py index 9b1961ff02627..e7b7d42a838c4 100644 --- a/homeassistant/components/netatmo/climate.py +++ b/homeassistant/components/netatmo/climate.py @@ -260,7 +260,6 @@ def set_hvac_mode(self, hvac_mode: str) -> None: self.turn_off() elif hvac_mode == HVAC_MODE_AUTO: if self.hvac_mode == STATE_OFF: - _LOGGER.debug("Turning on first") self.turn_on() self.set_preset_mode(PRESET_SCHEDULE) elif hvac_mode == HVAC_MODE_HEAT: From 8bd7435493183e23d72fcea9b18109170cd42a2d Mon Sep 17 00:00:00 2001 From: Tobias Sauerwein Date: Thu, 2 Apr 2020 12:48:51 +0200 Subject: [PATCH 5/8] Address comments --- homeassistant/components/netatmo/climate.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/netatmo/climate.py b/homeassistant/components/netatmo/climate.py index e7b7d42a838c4..41194d87f9205 100644 --- a/homeassistant/components/netatmo/climate.py +++ b/homeassistant/components/netatmo/climate.py @@ -259,7 +259,7 @@ def set_hvac_mode(self, hvac_mode: str) -> None: if hvac_mode == HVAC_MODE_OFF: self.turn_off() elif hvac_mode == HVAC_MODE_AUTO: - if self.hvac_mode == STATE_OFF: + if self.hvac_mode == HVAC_MODE_OFF: self.turn_on() self.set_preset_mode(PRESET_SCHEDULE) elif hvac_mode == HVAC_MODE_HEAT: @@ -337,9 +337,9 @@ def turn_off(self): STATE_NETATMO_MANUAL, DEFAULT_MIN_TEMP, ) - elif self.hvac_mode != STATE_OFF: + elif self.hvac_mode != HVAC_MODE_OFF: self._data.homestatus.setroomThermpoint( - self._data.home_id, self._room_id, HVAC_MODE_OFF + self._data.home_id, self._room_id, STATE_NETATMO_OFF ) self.update_without_throttle = True self.schedule_update_ha_state() @@ -355,7 +355,7 @@ def turn_on(self): @property def available(self) -> bool: """If the device hasn't been able to connect, mark as unavailable.""" - return self._connected or self._connected is None + return self._connected or self._connected is not None def update(self): """Get the latest data from NetAtmo API and updates the states.""" From 38a232ae3b6e3f8ab2282bb70913445622211b5d Mon Sep 17 00:00:00 2001 From: Tobias Sauerwein Date: Thu, 2 Apr 2020 14:27:30 +0200 Subject: [PATCH 6/8] Report entity as connected if update is successful --- homeassistant/components/netatmo/climate.py | 1 + 1 file changed, 1 insertion(+) diff --git a/homeassistant/components/netatmo/climate.py b/homeassistant/components/netatmo/climate.py index 41194d87f9205..13114aba82dc1 100644 --- a/homeassistant/components/netatmo/climate.py +++ b/homeassistant/components/netatmo/climate.py @@ -384,6 +384,7 @@ def update(self): self._battery_level = self._data.room_status[self._room_id].get( "battery_level" ) + self._connected = True except KeyError as err: _LOGGER.debug( "The thermostat in room %s seems to be out of reach. (%s)", From c34f1a5b765ad958f4c10561556c90b06c672a69 Mon Sep 17 00:00:00 2001 From: Tobias Sauerwein Date: Thu, 2 Apr 2020 16:26:44 +0200 Subject: [PATCH 7/8] Fix stupidness --- homeassistant/components/netatmo/climate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/netatmo/climate.py b/homeassistant/components/netatmo/climate.py index 13114aba82dc1..8cfa916e366e3 100644 --- a/homeassistant/components/netatmo/climate.py +++ b/homeassistant/components/netatmo/climate.py @@ -355,7 +355,7 @@ def turn_on(self): @property def available(self) -> bool: """If the device hasn't been able to connect, mark as unavailable.""" - return self._connected or self._connected is not None + return self._connected or self._connected is None def update(self): """Get the latest data from NetAtmo API and updates the states.""" @@ -391,7 +391,7 @@ def update(self): self._room_name, err, ) - self._connected = None + self._connected = False self._away = self._hvac_mode == HVAC_MAP_NETATMO[STATE_NETATMO_AWAY] From ae21df637278eeb9b64aa6ceac0e1f3b3bd31a6e Mon Sep 17 00:00:00 2001 From: Tobias Sauerwein Date: Thu, 2 Apr 2020 16:31:07 +0200 Subject: [PATCH 8/8] Fix --- homeassistant/components/netatmo/climate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/netatmo/climate.py b/homeassistant/components/netatmo/climate.py index 8cfa916e366e3..fe6526a16eb0a 100644 --- a/homeassistant/components/netatmo/climate.py +++ b/homeassistant/components/netatmo/climate.py @@ -355,7 +355,7 @@ def turn_on(self): @property def available(self) -> bool: """If the device hasn't been able to connect, mark as unavailable.""" - return self._connected or self._connected is None + return bool(self._connected) def update(self): """Get the latest data from NetAtmo API and updates the states."""