Skip to content

Commit

Permalink
Merge pull request #1 from berkinet/master
Browse files Browse the repository at this point in the history
Added energy usage reporting.
  • Loading branch information
indigodomo authored Aug 31, 2017
2 parents 171948c + 6e30d0c commit 6fa4401
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 52 deletions.
2 changes: 1 addition & 1 deletion Vera Bridge.indigoPlugin/Contents/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<plist version="1.0">
<dict>
<key>PluginVersion</key>
<string>2.0.1</string>
<string>2.0.2</string>
<key>ServerApiVersion</key>
<string>2.0</string>
<key>IwsApiVersion</key>
Expand Down
114 changes: 63 additions & 51 deletions Vera Bridge.indigoPlugin/Contents/Server Plugin/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,9 @@ def closedDeviceFactoryUi(self, valuesDict, userCancelled, devIdList):
dev.model = deviceTypeMap[1]
dev.replaceOnServer()
props = dev.pluginProps
# if "watts" not in deviceDict and "SupportsEnergyMeter" in props:
# del props["SupportsEnergyMeter"]
# del props["SupportsEnergyMeterCurPower"]
if "watts" not in deviceDict and "SupportsEnergyMeter" in props:
del props["SupportsEnergyMeter"]
del props["SupportsEnergyMeterCurPower"]
if "batterylevel" in deviceDict:
props["SupportsBatteryLevel"] = True
props["address"] = valuesDict["veraDeviceId"]
Expand All @@ -137,9 +137,9 @@ def closedDeviceFactoryUi(self, valuesDict, userCancelled, devIdList):
deviceTypeMap = veralib.modelForDeviceInfo(deviceDict)
self.debugLog("closedDeviceFactoryUi: creating device for: %s" % str(deviceDict))
newProps = indigo.Dict()
# if "watts" in deviceDict:
# newProps = {"SupportsEnergyMeterCurPower": True}
# newProps = {"SupportsEnergyMeter": True}
if "watts" in deviceDict:
newProps = {"SupportsEnergyMeterCurPower": True}
newProps = {"SupportsEnergyMeter": True}
if "batterylevel" in deviceDict:
newProps["SupportsBatteryLevel"] = True
if deviceTypeMap:
Expand Down Expand Up @@ -280,6 +280,17 @@ def runConcurrentThread(self):
self.vera.stop()

########################################
def getUniqueDeviceName(self, seedName):
seedName = seedName.strip()
if (seedName not in indigo.devices):
return seedName
else:
counter = 1
candidate = seedName + " " + str(counter)
while candidate in indigo.devices:
counter = counter + 1
candidate = seedName + " " + str(counter)
return candidate ########################################
def processUpdate(self, updateDict):
self.debugLog("processUpdate called")
updateType = updateDict["updateType"]
Expand All @@ -291,38 +302,52 @@ def processUpdate(self, updateDict):
dev = indigo.devices.get(devId, None)
keyValueList = []
if dev and dev.enabled:
self.debugLog("processUpdate: found device (%s) updating: %s" % (dev.name, deviceInfo))
# This first set of if/elif will take care of dimmers, locks, and relays.
if "level" in deviceInfo:
keyValueList.append({'key':'brightnessLevel', 'value':int(deviceInfo["level"])})
elif "locked" in deviceInfo:
keyValueList.append({'key':'onOffState', 'value':bool(int(deviceInfo["locked"]))})
elif "status" in deviceInfo and dev.deviceTypeId != "veraThermostat": #some versions of the API send an erroneous status for thermostats which have no on/off state
keyValueList.append({'key':'onOffState', 'value':bool(int(deviceInfo["status"]))})

# Next, we deal with thermostat values
if u'mode' in deviceInfo:
keyValueList.append({'key':'hvacOperationMode', 'value':kThermostatModeLookup[deviceInfo["mode"]]})
if "heatsp" in deviceInfo:
keyValueList.append({'key':'setpointHeat', 'value':int(deviceInfo["heatsp"])})
if "coolsp" in deviceInfo:
keyValueList.append({'key':'setpointCool', 'value':int(deviceInfo["coolsp"])})
if "temperature" in deviceInfo:
keyValueList.append({'key':'temperatureInput1', 'value':int(deviceInfo["temperature"])})
if "fanmode" in deviceInfo:
keyValueList.append({'key':'hvacFanMode', 'value':kThermostatFanLookup[deviceInfo["fanmode"]]})
if "batterylevel" in deviceInfo:
uiString = "%s%%" % deviceInfo["batterylevel"]
keyValueList.append({'key':'batteryLevel', 'value':int(deviceInfo["batterylevel"]), 'uiValue':uiString})
# if "watts" in deviceInfo:
# keyValueList.append({'key':'curEnergyLevel', 'value':int(deviceInfo["watts"])})
# if "kwh" in deviceInfo:
# keyValueList.append({'key':'accumEnergyTotal', 'value':int(deviceInfo["kwh"])})
if len(keyValueList) > 0:
dev.updateStatesOnServer(keyValueList)
if "state" in deviceInfo:
if deviceInfo["state"] in veralib.kErrorStates:
dev.setErrorStateOnServer("device error")
try:
self.debugLog("processUpdate start: found device (%s) updating: %s" % (dev.name, deviceInfo))
# This first set of if/elif will take care of dimmers, locks, and relays.
if "level" in deviceInfo:
keyValueList.append({'key':'brightnessLevel', 'value':deviceInfo["level"]})
elif "locked" in deviceInfo:
keyValueList.append({'key':'onOffState', 'value':bool(int(deviceInfo["locked"]))})
elif "status" in deviceInfo and dev.deviceTypeId != "veraThermostat": #some versions of the API send an erroneous status for thermostats which have no on/off state
keyValueList.append({'key':'onOffState', 'value':bool(int(deviceInfo["status"]))})


# Next, we deal with thermostat and other values
if u'mode' in deviceInfo:
keyValueList.append({'key':'hvacOperationMode', 'value':kThermostatModeLookup[deviceInfo["mode"]]})
if "heatsp" in deviceInfo:
keyValueList.append({'key':'setpointHeat', 'value':int(deviceInfo["heatsp"])})
if "coolsp" in deviceInfo:
keyValueList.append({'key':'setpointCool', 'value':int(deviceInfo["coolsp"])})
if "temperature" in deviceInfo:
keyValueList.append({'key':'temperatureInput1', 'value':int(deviceInfo["temperature"])})
if "fanmode" in deviceInfo:
keyValueList.append({'key':'hvacFanMode', 'value':kThermostatFanLookup[deviceInfo["fanmode"]]})
if "batterylevel" in deviceInfo:
uiString = "%s%%" % deviceInfo["batterylevel"]
keyValueList.append({'key':'batteryLevel', 'value':int(deviceInfo["batterylevel"]), 'uiValue':uiString})
if "watts" in deviceInfo:
uiString = ("%2.2f W" % float(deviceInfo["watts"]))
keyValueList.append({'key':'curEnergyLevel', 'value':deviceInfo["watts"], 'uiValue':uiString})
if "kwh" in deviceInfo:
uiString = ("%2.3f kWh" % float(deviceInfo["kwh"]))
keyValueList.append({'key':'accumEnergyTotal', 'value':deviceInfo["kwh"], 'uiValue':uiString})

# Now we can process keyValueList and update all the device states
if len(keyValueList) > 0:
dev.updateStatesOnServer(keyValueList)

# And, finaly, check to see if the device is in an error state
if "state" in deviceInfo:
if deviceInfo["state"] in veralib.kErrorStates:
dev.setErrorStateOnServer("device error")

self.debugLog("processUpdate Finished: for device (%s) : %s" % (dev.name, deviceInfo))

except Exception, e:
self.logger.exception(u"Error encountered in processUpdate")
return
else:
if dev:
self.debugLog("processUpdate: device with Vera ID %i found (%s) but is disabled, skipping update" % (devAddress, dev.name))
Expand All @@ -339,19 +364,6 @@ def processUpdate(self, updateDict):
dev.setErrorStateOnServer("device deleted")
self.errorLog('Device "%s" (id: %s) deleted on the Vera' % (dev.name, devAddress))

########################################
def getUniqueDeviceName(self, seedName):
seedName = seedName.strip()
if (seedName not in indigo.devices):
return seedName
else:
counter = 1
candidate = seedName + " " + str(counter)
while candidate in indigo.devices:
counter = counter + 1
candidate = seedName + " " + str(counter)
return candidate

########################################
# Action Methods
########################################
Expand Down

0 comments on commit 6fa4401

Please sign in to comment.