diff --git a/telldus/src/telldus/Device.py b/telldus/src/telldus/Device.py index 3c4c29b..22de1dc 100644 --- a/telldus/src/telldus/Device.py +++ b/telldus/src/telldus/Device.py @@ -117,7 +117,7 @@ def __init__(self): self._name = None self._manager = None self._state = Device.TURNOFF - self._stateValue = '' + self._stateValues = {} self._sensorValues = {} self._confirmed = True self.valueChangedTime = {} @@ -260,9 +260,9 @@ def loadCached(self, olddevice): self._name = olddevice._name self._loadCount = 0 self.setParams(olddevice.params()) - (state, stateValue) = olddevice.state() + (state, __stateValue) = olddevice.state() self._state = state - self._stateValue = stateValue + self._stateValues = olddevice.stateValues() self._ignored = olddevice._ignored self._sensorValues = olddevice._sensorValues @@ -460,7 +460,7 @@ def setState(self, state, stateValue=None, ack=None, origin=None, onlyUpdateIfCh """ if stateValue is None: stateValue = '' - if self._state == state and self._stateValue == stateValue: + if self._state == state and self._stateValues.get(state, None) == stateValue: if self.lastUpdated and self.lastUpdated > int(time.time() - 1): # Same state/statevalue and less than one second ago, most probably # just the same value being resent, ignore @@ -470,11 +470,13 @@ def setState(self, state, stateValue=None, ack=None, origin=None, onlyUpdateIfCh return self.lastUpdated = time.time() self._state = state - self._stateValue = stateValue + if state in (Device.DIM, Device.RGB, Device.THERMOSTAT) \ + and stateValue is not None and stateValue is not '': + self._stateValues[str(state)] = stateValue if self._manager: self._manager.stateUpdated(self, ackId=ack, origin=origin) - def setStateFailed(self, state, stateValue='', reason=0, origin=None): + def setStateFailed(self, state, stateValue=None, reason=0, origin=None): if self._manager: self._manager.stateUpdatedFail(self, state, stateValue, reason, origin) @@ -488,7 +490,27 @@ def state(self): state, stateValue = device.state() """ - return (self._state, self._stateValue) + return (self._state, self.stateValue()) + + def stateValue(self, state=None): + """ + .. versionadded:: 1.2 + + :returns: The statevalue for the specified state. + :param state: The state to request the value for. If no state is specified the current state + is used + :type state: int or None + """ + state = state or self._state + return self._stateValues.get(str(state), '') + + def stateValues(self): + """ + .. versionadded:: 1.2 + + :returns: a dict of all state values for the device + """ + return self._stateValues def typeString(self): """ @@ -599,8 +621,10 @@ def __init__(self, settings): self.storedmethods = settings['methods'] if 'state' in settings: self._state = settings['state'] - if 'stateValue' in settings: - self._stateValue = settings['stateValue'] + if 'stateValues' in settings: + self._stateValues = settings['stateValues'] + if 'stateValue' in settings and settings['stateValue'] is not None: + self._stateValues[str(self._state)] = settings['stateValue'] if 'battery' in settings: self.batteryLevel = settings['battery'] if 'ignored' in settings: diff --git a/telldus/src/telldus/DeviceManager.py b/telldus/src/telldus/DeviceManager.py index d22e676..74343e0 100644 --- a/telldus/src/telldus/DeviceManager.py +++ b/telldus/src/telldus/DeviceManager.py @@ -103,6 +103,7 @@ def addDevice(self, device): 'methods': device.methods(), 'state': state, 'stateValue': stateValue, + 'stateValues': device.stateValues(), 'protocol': device.protocol(), 'model': device.model(), 'parameters': parameters, @@ -281,7 +282,9 @@ def sensorValuesUpdated(self, device, values): def stateUpdated(self, device, ackId=None, origin=None): if device.isDevice() is False: return - extras = {} + extras = { + 'stateValues': device.stateValues() + } if ackId: extras['ACK'] = ackId if origin: @@ -478,7 +481,8 @@ def __deviceStateChanged(self, device, state, stateValue, origin): def save(self): data = [] for device in self.devices: - (state, stateValue) = device.state() + (state, __stateValue) = device.state() + stateValues = device.stateValues() dev = { "id": device.id(), "loadCount": device.loadCount(), @@ -488,7 +492,7 @@ def save(self): "params": device.params(), "methods": device.methods(), "state": state, - "stateValue": stateValue, + "stateValues": stateValues, "ignored": device.ignored(), "isSensor": device.isSensor() } @@ -528,6 +532,7 @@ def __sendDeviceReport(self): 'methods': device.methods(), 'state': state, 'stateValue': str(stateValue), + 'stateValues': device.stateValues(), 'protocol': device.protocol(), 'model': device.model(), 'parametersHash': parametersHash.hexdigest(),