@@ -183,6 +183,19 @@ def fan(self):
183
183
else :
184
184
return STATE_OFF
185
185
186
+ @property
187
+ def current_hold_mode (self ):
188
+ """Return current hold mode."""
189
+ if self .is_away_mode_on :
190
+ hold = 'away'
191
+ elif self .is_home_mode_on :
192
+ hold = 'home'
193
+ elif self .is_temp_hold_on ():
194
+ hold = 'temp'
195
+ else :
196
+ hold = None
197
+ return hold
198
+
186
199
@property
187
200
def current_operation (self ):
188
201
"""Return current operation."""
@@ -236,66 +249,111 @@ def device_state_attributes(self):
236
249
"fan_min_on_time" : self .fan_min_on_time
237
250
}
238
251
252
+ def is_vacation_on (self ):
253
+ """Return true if vacation mode is on."""
254
+ events = self .thermostat ['events' ]
255
+ return any (event ['type' ] == 'vacation' and event ['running' ]
256
+ for event in events )
257
+
258
+ def is_temp_hold_on (self ):
259
+ """Return true if temperature hold is on."""
260
+ events = self .thermostat ['events' ]
261
+ return any (event ['type' ] == 'hold' and event ['running' ]
262
+ for event in events )
263
+
239
264
@property
240
265
def is_away_mode_on (self ):
241
266
"""Return true if away mode is on."""
242
- mode = self .mode
243
267
events = self .thermostat ['events' ]
244
- for event in events :
245
- if event ['holdClimateRef' ] == 'away' or \
246
- event ['type' ] == 'autoAway' :
247
- mode = "away"
248
- break
249
- return 'away' in mode
268
+ return any (event ['holdClimateRef' ] == 'away' or
269
+ event ['type' ] == 'autoAway'
270
+ for event in events )
250
271
251
272
def turn_away_mode_on (self ):
252
273
"""Turn away on."""
253
- if self .hold_temp :
254
- self .data .ecobee .set_climate_hold (self .thermostat_index ,
255
- "away" , "indefinite" )
256
- else :
257
- self .data .ecobee .set_climate_hold (self .thermostat_index , "away" )
274
+ self .data .ecobee .set_climate_hold (self .thermostat_index ,
275
+ "away" , self .hold_preference ())
258
276
self .update_without_throttle = True
259
277
260
278
def turn_away_mode_off (self ):
261
279
"""Turn away off."""
262
- self .data .ecobee .resume_program (self .thermostat_index )
280
+ self .set_hold_mode (None )
281
+
282
+ @property
283
+ def is_home_mode_on (self ):
284
+ """Return true if home mode is on."""
285
+ events = self .thermostat ['events' ]
286
+ return any (event ['holdClimateRef' ] == 'home' or
287
+ event ['type' ] == 'autoHome'
288
+ for event in events )
289
+
290
+ def turn_home_mode_on (self ):
291
+ """Turn home on."""
292
+ self .data .ecobee .set_climate_hold (self .thermostat_index ,
293
+ "home" , self .hold_preference ())
263
294
self .update_without_throttle = True
264
295
265
- def set_temperature (self , ** kwargs ):
266
- """Set new target temperature."""
267
- low_temp = kwargs .get (ATTR_TARGET_TEMP_LOW )
268
- high_temp = kwargs .get (ATTR_TARGET_TEMP_HIGH )
269
- temp = kwargs .get (ATTR_TEMPERATURE )
296
+ def set_hold_mode (self , hold_mode ):
297
+ """Set hold mode (away, home, temp)."""
298
+ hold = self .current_hold_mode
270
299
271
- if self .current_operation == STATE_HEAT and temp is not None :
272
- low_temp = temp
273
- high_temp = temp + 20
274
- elif self .current_operation == STATE_COOL and temp is not None :
275
- low_temp = temp - 20
276
- high_temp = temp
277
- if low_temp is None and high_temp is None :
278
- _LOGGER .error (
279
- 'Missing valid arguments for set_temperature in %s' , kwargs )
300
+ if hold == hold_mode :
280
301
return
302
+ elif hold_mode == 'away' :
303
+ self .turn_away_mode_on ()
304
+ elif hold_mode == 'home' :
305
+ self .turn_home_mode_on ()
306
+ elif hold_mode == 'temp' :
307
+ self .set_temp_hold (int (self .current_temperature ))
308
+ else :
309
+ self .data .ecobee .resume_program (self .thermostat_index )
310
+ self .update_without_throttle = True
311
+
312
+ def set_auto_temp_hold (self , heat_temp , cool_temp ):
313
+ """Set temperature hold in auto mode."""
314
+ self .data .ecobee .set_hold_temp (self .thermostat_index , cool_temp ,
315
+ heat_temp , self .hold_preference ())
316
+ _LOGGER .debug ("Setting ecobee hold_temp to: heat=%s, is=%s, "
317
+ "cool=%s, is=%s" , heat_temp , isinstance (
318
+ heat_temp , (int , float )), cool_temp ,
319
+ isinstance (cool_temp , (int , float )))
281
320
282
- low_temp = int (low_temp )
283
- high_temp = int (high_temp )
321
+ self .update_without_throttle = True
284
322
285
- if self .hold_temp :
286
- self .data .ecobee .set_hold_temp (
287
- self .thermostat_index , high_temp , low_temp , "indefinite" )
288
- else :
289
- self .data .ecobee .set_hold_temp (
290
- self .thermostat_index , high_temp , low_temp )
323
+ def set_temp_hold (self , temp ):
324
+ """Set temperature hold in modes other than auto."""
325
+ # Set arbitrary range when not in auto mode
326
+ if self .current_operation == STATE_HEAT :
327
+ heat_temp = temp
328
+ cool_temp = temp + 20
329
+ elif self .current_operation == STATE_COOL :
330
+ heat_temp = temp - 20
331
+ cool_temp = temp
291
332
333
+ self .data .ecobee .set_hold_temp (self .thermostat_index , cool_temp ,
334
+ heat_temp , self .hold_preference ())
292
335
_LOGGER .debug ("Setting ecobee hold_temp to: low=%s, is=%s, "
293
- "high =%s, is=%s" , low_temp , isinstance (
294
- low_temp , (int , float )), high_temp ,
295
- isinstance (high_temp , (int , float )))
336
+ "cool =%s, is=%s" , heat_temp , isinstance (
337
+ heat_temp , (int , float )), cool_temp ,
338
+ isinstance (cool_temp , (int , float )))
296
339
297
340
self .update_without_throttle = True
298
341
342
+ def set_temperature (self , ** kwargs ):
343
+ """Set new target temperature."""
344
+ low_temp = kwargs .get (ATTR_TARGET_TEMP_LOW )
345
+ high_temp = kwargs .get (ATTR_TARGET_TEMP_HIGH )
346
+ temp = kwargs .get (ATTR_TEMPERATURE )
347
+
348
+ if self .current_operation == STATE_AUTO and low_temp is not None \
349
+ and high_temp is not None :
350
+ self .set_auto_temp_hold (int (low_temp ), int (high_temp ))
351
+ elif temp is not None :
352
+ self .set_temp_hold (int (temp ))
353
+ else :
354
+ _LOGGER .error (
355
+ 'Missing valid arguments for set_temperature in %s' , kwargs )
356
+
299
357
def set_operation_mode (self , operation_mode ):
300
358
"""Set HVAC mode (auto, auxHeatOnly, cool, heat, off)."""
301
359
self .data .ecobee .set_hvac_mode (self .thermostat_index , operation_mode )
@@ -313,15 +371,19 @@ def resume_program(self, resume_all):
313
371
str (resume_all ).lower ())
314
372
self .update_without_throttle = True
315
373
316
- # Home and Sleep mode aren't used in UI yet:
317
-
318
- # def turn_home_mode_on(self):
319
- # """ Turns home mode on. """
320
- # self.data.ecobee.set_climate_hold(self.thermostat_index, "home")
374
+ def hold_preference (self ):
375
+ """Return user preference setting for hold time."""
376
+ # Values returned from thermostat are 'useEndTime4hour',
377
+ # 'useEndTime2hour', 'nextTransition', 'indefinite', 'askMe'
378
+ default = self .thermostat ['settings' ]['holdAction' ]
379
+ if default == 'nextTransition' :
380
+ return default
381
+ elif default == 'indefinite' :
382
+ return default
383
+ else :
384
+ return 'nextTransition'
321
385
322
- # def turn_home_mode_off(self):
323
- # """ Turns home mode off. """
324
- # self.data.ecobee.resume_program(self.thermostat_index)
386
+ # Sleep mode isn't used in UI yet:
325
387
326
388
# def turn_sleep_mode_on(self):
327
389
# """ Turns sleep mode on. """
0 commit comments