Fix Netatmo climate issue when device out of reach (#25096)

* Fix valve/thermostat out of reach

* Fix boost for valves

* Set netatmo default max temp to 30

* Remove unnecessary get

* Remove unnecessary default value

* Readd get
This commit is contained in:
cgtobi 2019-07-12 17:43:18 +02:00 committed by Pascal Vizeli
parent 31dd6364c3
commit a9980c8be0

View File

@ -42,6 +42,7 @@ STATE_NETATMO_MANUAL = 'manual'
PRESET_MAP_NETATMO = { PRESET_MAP_NETATMO = {
PRESET_FROST_GUARD: STATE_NETATMO_HG, PRESET_FROST_GUARD: STATE_NETATMO_HG,
PRESET_BOOST: STATE_NETATMO_MAX, PRESET_BOOST: STATE_NETATMO_MAX,
STATE_NETATMO_MAX: STATE_NETATMO_MAX,
PRESET_SCHEDULE: STATE_NETATMO_SCHEDULE, PRESET_SCHEDULE: STATE_NETATMO_SCHEDULE,
PRESET_AWAY: STATE_NETATMO_AWAY, PRESET_AWAY: STATE_NETATMO_AWAY,
STATE_NETATMO_OFF: STATE_NETATMO_OFF STATE_NETATMO_OFF: STATE_NETATMO_OFF
@ -75,6 +76,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Optional(CONF_HOMES): vol.All(cv.ensure_list, [HOME_CONFIG_SCHEMA]) vol.Optional(CONF_HOMES): vol.All(cv.ensure_list, [HOME_CONFIG_SCHEMA])
}) })
DEFAULT_MAX_TEMP = 30
NA_THERM = 'NATherm1' NA_THERM = 'NATherm1'
NA_VALVE = 'NRV' NA_VALVE = 'NRV'
@ -141,7 +144,7 @@ class NetatmoThermostat(ClimateDevice):
self._hvac_mode = None self._hvac_mode = None
self.update_without_throttle = False self.update_without_throttle = False
self._module_type = \ self._module_type = \
self._data.room_status[room_id].get('module_type', NA_VALVE) self._data.room_status.get(room_id, {}).get('module_type')
if self._module_type == NA_THERM: if self._module_type == NA_THERM:
self._operation_list.append(HVAC_MODE_OFF) self._operation_list.append(HVAC_MODE_OFF)
@ -192,8 +195,10 @@ class NetatmoThermostat(ClimateDevice):
if self._module_type == NA_THERM: if self._module_type == NA_THERM:
return CURRENT_HVAC_MAP_NETATMO[self._data.boilerstatus] return CURRENT_HVAC_MAP_NETATMO[self._data.boilerstatus]
# Maybe it is a valve # Maybe it is a valve
if self._data.room_status[self._room_id]['heating_power_request'] > 0: if self._room_id in self._data.room_status:
return CURRENT_HVAC_HEAT if (self._data.room_status[self._room_id]
.get('heating_power_request', 0) > 0):
return CURRENT_HVAC_HEAT
return CURRENT_HVAC_IDLE return CURRENT_HVAC_IDLE
def set_hvac_mode(self, hvac_mode: str) -> None: def set_hvac_mode(self, hvac_mode: str) -> None:
@ -219,7 +224,20 @@ class NetatmoThermostat(ClimateDevice):
DEFAULT_MIN_TEMP DEFAULT_MIN_TEMP
) )
if preset_mode in [PRESET_BOOST, STATE_NETATMO_MAX, STATE_NETATMO_OFF]: if (
preset_mode in [PRESET_BOOST, STATE_NETATMO_MAX]
and self._module_type == NA_VALVE
):
self._data.homestatus.setroomThermpoint(
self._data.home_id,
self._room_id,
STATE_NETATMO_MANUAL,
DEFAULT_MAX_TEMP
)
elif (
preset_mode
in [PRESET_BOOST, STATE_NETATMO_MAX, STATE_NETATMO_OFF]
):
self._data.homestatus.setroomThermpoint( self._data.homestatus.setroomThermpoint(
self._data.home_id, self._data.home_id,
self._room_id, self._room_id,
@ -269,18 +287,21 @@ class NetatmoThermostat(ClimateDevice):
"got exception.") "got exception.")
return return
try: try:
if self._module_type is None:
self._module_type = \
self._data.room_status[self._room_id]['module_type']
self._current_temperature = \ self._current_temperature = \
self._data.room_status[self._room_id]['current_temperature'] self._data.room_status[self._room_id]['current_temperature']
self._target_temperature = \ self._target_temperature = \
self._data.room_status[self._room_id]['target_temperature'] self._data.room_status[self._room_id]['target_temperature']
self._preset = \ self._preset = \
self._data.room_status[self._room_id]["setpoint_mode"] self._data.room_status[self._room_id]["setpoint_mode"]
self._hvac_mode = HVAC_MAP_NETATMO[self._preset]
except KeyError: except KeyError:
_LOGGER.error( _LOGGER.error(
"The thermostat in room %s seems to be out of reach.", "The thermostat in room %s seems to be out of reach.",
self._room_id self._room_id
) )
self._hvac_mode = HVAC_MAP_NETATMO[self._preset]
self._away = self._hvac_mode == HVAC_MAP_NETATMO[STATE_NETATMO_AWAY] self._away = self._hvac_mode == HVAC_MAP_NETATMO[STATE_NETATMO_AWAY]
@ -303,8 +324,10 @@ class HomeData:
if self.homedata is None: if self.homedata is None:
return [] return []
for home in self.homedata.homes: for home in self.homedata.homes:
if 'therm_schedules' in self.homedata.homes[home] and 'modules' \ if (
in self.homedata.homes[home]: 'therm_schedules' in self.homedata.homes[home]
and 'modules' in self.homedata.homes[home]
):
self.home_names.append(self.homedata.homes[home]['name']) self.home_names.append(self.homedata.homes[home]['name'])
return self.home_names return self.home_names
@ -381,44 +404,47 @@ class ThermostatData:
roomstatus = {} roomstatus = {}
homestatus_room = self.homestatus.rooms[room] homestatus_room = self.homestatus.rooms[room]
homedata_room = self.homedata.rooms[self.home][room] homedata_room = self.homedata.rooms[self.home][room]
roomstatus["roomID"] = homestatus_room["id"] roomstatus["roomID"] = homestatus_room["id"]
roomstatus["roomname"] = homedata_room["name"] if homestatus_room["reachable"]:
roomstatus["target_temperature"] = homestatus_room[ roomstatus["roomname"] = homedata_room["name"]
"therm_setpoint_temperature" roomstatus["target_temperature"] = homestatus_room[
] "therm_setpoint_temperature"
roomstatus["setpoint_mode"] = homestatus_room[
"therm_setpoint_mode"
]
roomstatus["current_temperature"] = homestatus_room[
"therm_measured_temperature"
]
roomstatus["module_type"] = self.homestatus.thermostatType(
self.home, room
)
roomstatus["module_id"] = None
roomstatus["heating_status"] = None
roomstatus["heating_power_request"] = None
for module_id in homedata_room["module_ids"]:
if (self.homedata.modules[self.home][module_id]["type"]
== NA_THERM
or roomstatus["module_id"] is None):
roomstatus["module_id"] = module_id
if roomstatus["module_type"] == NA_THERM:
self.boilerstatus = self.homestatus.boilerStatus(
rid=roomstatus["module_id"]
)
roomstatus["heating_status"] = self.boilerstatus
elif roomstatus["module_type"] == NA_VALVE:
roomstatus["heating_power_request"] = homestatus_room[
"heating_power_request"
] ]
roomstatus["heating_status"] = ( roomstatus["setpoint_mode"] = homestatus_room[
roomstatus["heating_power_request"] > 0 "therm_setpoint_mode"
]
roomstatus["current_temperature"] = homestatus_room[
"therm_measured_temperature"
]
roomstatus["module_type"] = self.homestatus.thermostatType(
self.home, room
) )
if self.boilerstatus is not None: roomstatus["module_id"] = None
roomstatus["heating_status"] = ( roomstatus["heating_status"] = None
self.boilerstatus and roomstatus["heating_status"] roomstatus["heating_power_request"] = None
for module_id in homedata_room["module_ids"]:
if (self.homedata.modules[self.home][module_id]["type"]
== NA_THERM
or roomstatus["module_id"] is None):
roomstatus["module_id"] = module_id
if roomstatus["module_type"] == NA_THERM:
self.boilerstatus = self.homestatus.boilerStatus(
rid=roomstatus["module_id"]
) )
roomstatus["heating_status"] = self.boilerstatus
elif roomstatus["module_type"] == NA_VALVE:
roomstatus["heating_power_request"] = homestatus_room[
"heating_power_request"
]
roomstatus["heating_status"] = (
roomstatus["heating_power_request"] > 0
)
if self.boilerstatus is not None:
roomstatus["heating_status"] = (
self.boilerstatus
and roomstatus["heating_status"]
)
self.room_status[room] = roomstatus self.room_status[room] = roomstatus
except KeyError as err: except KeyError as err:
_LOGGER.error("Update of room %s failed. Error: %s", room, err) _LOGGER.error("Update of room %s failed. Error: %s", room, err)