33import os
44import time
55import requests
6+ #import json
67from requests .compat import json
78from requests_oauthlib import OAuth2Session
89import urllib .parse
@@ -23,6 +24,7 @@ def __repr__(self):
2324 return '<%s: %s>' % (self .__class__ .__name__ , self ._repr_name )
2425
2526 def _set (self , endpoint , data , ** params ):
27+ params ['locationId' ] = self ._locationId
2628 self ._lyric_api ._post (endpoint , data , ** params )
2729 self ._lyric_api ._bust_cache_all ()
2830
@@ -301,7 +303,7 @@ def id(self):
301303 @property
302304 def name (self ):
303305 return self .username
304-
306+
305307 @property
306308 def _repr_name (self ):
307309 return self .username
@@ -411,6 +413,40 @@ class Thermostat(lyricDevice):
411413 # scheduleType.scheduleType String Currently selected schedule type. Would follow the values in scheduleCapabilities.availableScheduleTypes.
412414 # scheduleType.scheduleSubType String Currently selected schedule subtype.
413415
416+ def updateThermostat (self , mode = None , heatSetpoint = None , coolSetpoint = None , AutoChangeover = None , thermostatSetpointStatus = None ):
417+ if mode is None :
418+ mode = self .operationMode
419+ if heatSetpoint is None :
420+ heatSetpoint = self .heatSetpoint
421+ if coolSetpoint is None :
422+ coolSetpoint = self .coolSetpoint
423+
424+ if 'thermostatSetpointStatus' in self .changeableValues :
425+ if thermostatSetpointStatus is None :
426+ thermostatSetpointStatus = self .thermostatSetpointStatus
427+
428+ if 'AutoChangeover' in self .changeableValues :
429+ if AutoChangeover is None :
430+ AutoChangeover = self .changeableValues ['AutoChangeover' ]
431+
432+ data = [
433+ 'mode' = mode ,
434+ 'heatSetpoint' = heatSetpoint ,
435+ 'coolSetpoint' = coolSetpoint
436+ ]
437+
438+ if 'thermostatSetpointStatus' in self .changeableValues :
439+ data ['thermostatSetpointStatus' ] = thermostatSetpointStatus
440+ if 'AutoChangeover' in self .changeableValues :
441+ data ['AutoChangeover' ] = AutoChangeover
442+
443+ data = json .dump (data )
444+ self ._set ('devices/thermostats/' + self ._deviceId , data )
445+
446+ @property
447+ def where (self ):
448+ return self ._lyric_api ._location (self ._locationId )['name' ]
449+
414450 @property
415451 def units (self ):
416452 return self ._lyric_api ._device (self ._locationId , self ._deviceId )['units' ]
@@ -420,28 +456,65 @@ def indoorTemperature(self):
420456 if 'indoorTemperature' in self ._lyric_api ._device (self ._locationId , self ._deviceId ):
421457 return self ._lyric_api ._device (self ._locationId , self ._deviceId )['indoorTemperature' ]
422458
459+ @property
460+ def heatSetpoint (self ):
461+ return self .changeableValues ['heatSetpoint' ]
462+
463+ @property
464+ def coolSetpoint (self ):
465+ return self .changeableValues ['coolSetpoint' ]
466+
467+ @property
468+ def thermostatSetpointStatus (self ):
469+ if 'thermostatSetpointStatus' in self .changeableValues :
470+ return self .changeableValues ['thermostatSetpointStatus' ]
471+
472+ @property
473+ def nextPeriodTime (self ):
474+ if 'nextPeriodTime' in self .changeableValues :
475+ return self .changeableValues ['nextPeriodTime' ]
476+
477+ @property
478+ def AutoChangeover (self ):
479+ if 'AutoChangeover' in self .changeableValues :
480+ return self .changeableValues ['AutoChangeover' ]
481+
482+ @property
483+ def operationMode (self ):
484+ return self .operationStatus ['mode' ]
485+
486+ @operationMode .setter
487+ def operationMode (self , mode ):
488+ updateThermostat (mode = mode )
489+
423490 @property
424491 def temperatureSetpoint (self ):
425- if self .changeableValues [ 'mode' ] == 'Heat' :
492+ if self .operationMode == 'Heat' :
426493 return self .changeableValues ['heatSetpoint' ]
427494 else :
428495 return self .changeableValues ['coolSetpoint' ]
429-
496+
430497 @temperatureSetpoint .setter
431498 def temperatureSetpoint (self , setpoint , mode = None ):
432499 if mode is None :
433- if setpoint > self .indoorTemperature :
434- mode = 'Heat' ;
435- else :
500+ if setpoint < self .indoorTemperature and self .can_cool :
436501 mode = 'Cool' ;
502+ else :
503+ mode = 'Heat' ;
437504
438505 if mode == 'Cool' :
439- data = '{" mode": %s,"coolSetpoint": %s}' % ( mode , setpoint )
506+ updateThermostat ( mode = mode , coolSetpoint = setpoint )
440507
441508 if mode == 'Heat' :
442- data = '{"mode": %s, "heatSetpoint": %s}' % (mode , setpoint )
509+ updateThermostat (mode = mode , heatSetpoint = setpoint )
510+
511+ @property
512+ def can_heat (self ):
513+ return ("Heat" in self .allowedModes )
443514
444- self ._set ('devices/thermostats/' + self ._deviceId , data , locationId = self ._locationId )
515+ @property
516+ def can_cool (self ):
517+ return ("Cool" in self .allowedModes )
445518
446519 @property
447520 def outdoorTemperature (self ):
@@ -923,12 +996,12 @@ def _device_type(self, locationId, deviceType, deviceId):
923996 for device in self ._devices_type (deviceType , locationId ):
924997 if device ['deviceID' ] == deviceId :
925998 return device
926-
999+
9271000 def _devices_type (self , deviceType , locationId ):
9281001 cache_key = 'devices_type-%s_%s' % (locationId , deviceType )
9291002 value , last_update = self ._checkCache (cache_key )
9301003 now = time .time ()
931-
1004+
9321005 if not value or now - last_update > self ._cache_ttl :
9331006 value = self ._get ('devices/' + deviceType , locationId = locationId )
9341007 self ._cache [cache_key ] = (value , now )
0 commit comments