mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 13:17:32 +00:00
Support away_mode as permanent hold and hold_mode as temporary hold. (#5725)
* Support away_mode as permanent hold and hold_mode as temporary hold. * Add comments to explain code better. Remove indefinite hold preference to be consistent with 'away_mode'.
This commit is contained in:
parent
fdcf5fe233
commit
7fa08059dc
@ -122,8 +122,6 @@ def set_away_mode(hass, away_mode, entity_id=None):
|
|||||||
if entity_id:
|
if entity_id:
|
||||||
data[ATTR_ENTITY_ID] = entity_id
|
data[ATTR_ENTITY_ID] = entity_id
|
||||||
|
|
||||||
_LOGGER.warning(
|
|
||||||
'This service has been deprecated; use climate.set_hold_mode')
|
|
||||||
hass.services.call(DOMAIN, SERVICE_SET_AWAY_MODE, data)
|
hass.services.call(DOMAIN, SERVICE_SET_AWAY_MODE, data)
|
||||||
|
|
||||||
|
|
||||||
@ -243,8 +241,6 @@ def async_setup(hass, config):
|
|||||||
|
|
||||||
away_mode = service.data.get(ATTR_AWAY_MODE)
|
away_mode = service.data.get(ATTR_AWAY_MODE)
|
||||||
|
|
||||||
_LOGGER.warning(
|
|
||||||
'This service has been deprecated; use climate.set_hold_mode')
|
|
||||||
for climate in target_climate:
|
for climate in target_climate:
|
||||||
if away_mode:
|
if away_mode:
|
||||||
yield from climate.async_turn_away_mode_on()
|
yield from climate.async_turn_away_mode_on()
|
||||||
|
@ -186,12 +186,27 @@ class Thermostat(ClimateDevice):
|
|||||||
@property
|
@property
|
||||||
def current_hold_mode(self):
|
def current_hold_mode(self):
|
||||||
"""Return current hold mode."""
|
"""Return current hold mode."""
|
||||||
if self.is_away_mode_on:
|
events = self.thermostat['events']
|
||||||
|
if any((event['holdClimateRef'] == 'away' and
|
||||||
|
int(event['endDate'][0:4])-int(event['startDate'][0:4]) <= 1)
|
||||||
|
or event['type'] == 'autoAway'
|
||||||
|
for event in events):
|
||||||
|
# away hold is auto away or a temporary hold from away climate
|
||||||
hold = 'away'
|
hold = 'away'
|
||||||
elif self.is_home_mode_on:
|
elif any(event['holdClimateRef'] == 'away' and
|
||||||
|
int(event['endDate'][0:4])-int(event['startDate'][0:4]) > 1
|
||||||
|
for event in events):
|
||||||
|
# a permanent away is not considered a hold, but away_mode
|
||||||
|
hold = None
|
||||||
|
elif any(event['holdClimateRef'] == 'home' or
|
||||||
|
event['type'] == 'autoHome'
|
||||||
|
for event in events):
|
||||||
|
# home mode is auto home or any home hold
|
||||||
hold = 'home'
|
hold = 'home'
|
||||||
elif self.is_temp_hold_on():
|
elif any(event['type'] == 'hold' and event['running']
|
||||||
|
for event in events):
|
||||||
hold = 'temp'
|
hold = 'temp'
|
||||||
|
# temperature hold is any other hold not based on climate
|
||||||
else:
|
else:
|
||||||
hold = None
|
hold = None
|
||||||
return hold
|
return hold
|
||||||
@ -255,42 +270,23 @@ class Thermostat(ClimateDevice):
|
|||||||
return any(event['type'] == 'vacation' and event['running']
|
return any(event['type'] == 'vacation' and event['running']
|
||||||
for event in events)
|
for event in events)
|
||||||
|
|
||||||
def is_temp_hold_on(self):
|
|
||||||
"""Return true if temperature hold is on."""
|
|
||||||
events = self.thermostat['events']
|
|
||||||
return any(event['type'] == 'hold' and event['running']
|
|
||||||
for event in events)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_away_mode_on(self):
|
def is_away_mode_on(self):
|
||||||
"""Return true if away mode is on."""
|
"""Return true if away mode is on."""
|
||||||
events = self.thermostat['events']
|
events = self.thermostat['events']
|
||||||
return any(event['holdClimateRef'] == 'away' or
|
return any(event['holdClimateRef'] == 'away' and
|
||||||
event['type'] == 'autoAway'
|
int(event['endDate'][0:4])-int(event['startDate'][0:4]) > 1
|
||||||
for event in events)
|
for event in events)
|
||||||
|
|
||||||
def turn_away_mode_on(self):
|
def turn_away_mode_on(self):
|
||||||
"""Turn away on."""
|
"""Turn away on."""
|
||||||
self.data.ecobee.set_climate_hold(self.thermostat_index,
|
self.data.ecobee.set_climate_hold(self.thermostat_index,
|
||||||
"away", self.hold_preference())
|
"away", 'indefinite')
|
||||||
self.update_without_throttle = True
|
self.update_without_throttle = True
|
||||||
|
|
||||||
def turn_away_mode_off(self):
|
def turn_away_mode_off(self):
|
||||||
"""Turn away off."""
|
"""Turn away off."""
|
||||||
self.set_hold_mode(None)
|
self.data.ecobee.resume_program(self.thermostat_index)
|
||||||
|
|
||||||
@property
|
|
||||||
def is_home_mode_on(self):
|
|
||||||
"""Return true if home mode is on."""
|
|
||||||
events = self.thermostat['events']
|
|
||||||
return any(event['holdClimateRef'] == 'home' or
|
|
||||||
event['type'] == 'autoHome'
|
|
||||||
for event in events)
|
|
||||||
|
|
||||||
def turn_home_mode_on(self):
|
|
||||||
"""Turn home on."""
|
|
||||||
self.data.ecobee.set_climate_hold(self.thermostat_index,
|
|
||||||
"home", self.hold_preference())
|
|
||||||
self.update_without_throttle = True
|
self.update_without_throttle = True
|
||||||
|
|
||||||
def set_hold_mode(self, hold_mode):
|
def set_hold_mode(self, hold_mode):
|
||||||
@ -298,11 +294,14 @@ class Thermostat(ClimateDevice):
|
|||||||
hold = self.current_hold_mode
|
hold = self.current_hold_mode
|
||||||
|
|
||||||
if hold == hold_mode:
|
if hold == hold_mode:
|
||||||
|
# no change, so no action required
|
||||||
return
|
return
|
||||||
elif hold_mode == 'away':
|
elif hold_mode == 'away':
|
||||||
self.turn_away_mode_on()
|
self.data.ecobee.set_climate_hold(self.thermostat_index,
|
||||||
|
"away", self.hold_preference())
|
||||||
elif hold_mode == 'home':
|
elif hold_mode == 'home':
|
||||||
self.turn_home_mode_on()
|
self.data.ecobee.set_climate_hold(self.thermostat_index,
|
||||||
|
"home", self.hold_preference())
|
||||||
elif hold_mode == 'temp':
|
elif hold_mode == 'temp':
|
||||||
self.set_temp_hold(int(self.current_temperature))
|
self.set_temp_hold(int(self.current_temperature))
|
||||||
else:
|
else:
|
||||||
@ -378,7 +377,8 @@ class Thermostat(ClimateDevice):
|
|||||||
default = self.thermostat['settings']['holdAction']
|
default = self.thermostat['settings']['holdAction']
|
||||||
if default == 'nextTransition':
|
if default == 'nextTransition':
|
||||||
return default
|
return default
|
||||||
elif default == 'indefinite':
|
# add further conditions if other hold durations should be
|
||||||
return default
|
# supported; note that this should not include 'indefinite'
|
||||||
|
# as an indefinite away hold is interpreted as away_mode
|
||||||
else:
|
else:
|
||||||
return 'nextTransition'
|
return 'nextTransition'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user