try:
EnergyYesterdayRawID= indigo.variables["EnergyYesterdayRaw"]
except:
indigo.variable.create("EnergyYesterdayRaw","0")
EnergyYesterdayRawID= indigo.variables["EnergyYesterdayRaw"]
try:
EnergyYesterdayID= indigo.variables["EnergyYesterday"]
except:
indigo.variable.create("energyYesterday","0")
EnergyYesterdayID= indigo.variables["EnergyYesterday"]
EnergyYesterday = float(EnergyYesterdayID.value)
EnergyYesterdayRaw = float(EnergyYesterdayRawID.value)
energyNowID=indigo.devices[374645596] # "MeterTotalLeftBox"
energyNow= float(energyNowID.states["accumEnergyTotal"])
usedYesterday = energyNow - EnergyYesterdayRaw
## for debugging only
indigo.server.log("EnergyYesterday "+str(EnergyYesterday))
indigo.server.log("EnergyYesterdayRaw "+str(EnergyYesterdayRaw))
indigo.server.log("energyNow "+str(energyNow))
##
indigo.variable.updateValue("EnergyYesterday", str(usedYesterday))
indigo.variable.updateValue("EnergyYesterdayRaw", str(energyNow))
## if you reset your energy device at midnight, this must run AFTER the reset, call from a schedule at 0:01 + every x minutes
## calculates:
# 1. energy consumed yesterday
# 2. energy consumed today
# 3. energy consumption prediction for today, linear extrapolation from #2 and seconds since midnight
#
# v0.2: fixed switch at midnight
## define your variable and device names here
vEnergyYesterday = "EnergyYesterday" # this is the name of the variable that shows the KwH consumed yesterday
vEnergyYesterdayRaw = "EnergyYesterdayRaw" # this is the name of the variable of the raw number read from the energy device at mignight
vEnergyToday = "EnergyToday" # this is the name of the variable that shows todays current engery consumed in KwH
vEnergyTodayPredicted = "EnergyTodayPredicted" # this is the name of the variable that shows todays predicted total engery consumed in KwH
vEnergyDayNumber = "EnergyDayNumber" # this is the name of the variable that is used to keep trak if we have calculated yesterdays consumption. it is the day in the month number
dEnergy = "MeterTotalLeftBox" # this is the device name from where we read the energy info
dEnergyState = "accumEnergyTotal" # this is the state name of the device we read
# get dates and seconds
import datetime
rightNow = datetime.datetime.now()
theDay = rightNow.day
secondsSinceMidnight = (rightNow.hour * 3600) + (rightNow.minute * 60) + rightNow.second
secondsInAday = float(60*60*24)
## get the values and if the variables dont exits, create them
try:
vEnergyYesterdayRawID= indigo.variables[vEnergyYesterdayRaw]
except:
indigo.variable.create(vEnergyYesterdayRaw,"0")
vEnergyYesterdayRawID= indigo.variables[vEnergyYesterdayRaw]
##
try:
EnergyYesterdayID= indigo.variables[vEnergyYesterday]
except:
indigo.variable.create(venergyYesterday,"0")
EnergyYesterdayID= indigo.variables[vEnergyYesterday]
##
try:
vEnergyTodayPredictedID = indigo.variables[vEnergyTodayPredicted]
except:
indigo.variable.create(vEnergyTodayPredicted,"0")
vEnergyTodayPredictedID = indigo.variables[vEnergyTodayPredicted]
##
try:
vEnergyTodayID = indigo.variables[vEnergyToday]
except:
indigo.variable.create(vEnergyToday,"0")
vEnergyTodayID = indigo.variables[vEnergyToday]
##
try:
vEnergyDayNumberID = indigo.variables[vEnergyDayNumber]
except:
indigo.variable.create(vEnergyDayNumber,"-1")
vEnergyDayNumberID = indigo.variables[vEnergyDayNumber]
EnergyYesterdayRaw = float(vEnergyYesterdayRawID.value) # this is the raw number from yesterday
energyNowID = indigo.devices[dEnergy]
energyNow = float(energyNowID.states[dEnergyState]) # this is the new raw number from the device
# now calculate
if energyNow < EnergyYesterdayRaw: # need to reset? works if reset happens at midnight, if it hapens during the day this is wrong, but you can only take care of some many variations ;-(
EnergyYesterdayRaw =0
if theDay != int(vEnergyDayNumberID.value): # if this is a new day, update yesterdays value
indigo.variable.updateValue(vEnergyYesterday , ("%6.1f"%(energyNow - EnergyYesterdayRaw)).strip(" "))
indigo.variable.updateValue(vEnergyDayNumber , str(theDay))
indigo.variable.updateValue(vEnergyYesterdayRaw, str(energyNow ))
EnergyYesterdayRaw = energyNow
EnergyToday = energyNow - EnergyYesterdayRaw
EnergyTodayPredicted = EnergyToday * secondsInAday/max(secondsSinceMidnight,1.)
indigo.variable.updateValue(vEnergyToday, ("%6.1f"%EnergyToday).strip(" "))
indigo.variable.updateValue(vEnergyTodayPredicted, ("%6.1f"%EnergyTodayPredicted).strip(" "))
indigo.server.log("rightNow "+str(rightNow))
indigo.server.log("theDay "+str(theDay))
indigo.server.log("secondsSinceMidnight "+str(secondsSinceMidnight))
indigo.server.log("EnergyYesterdayRaw "+str(EnergyYesterdayRaw))
indigo.server.log("EnergyToday "+str(EnergyToday))
indigo.server.log("EnergyTodayPredicted "+str(EnergyTodayPredicted))
Users browsing this forum: No registered users and 11 guests