Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import appdaemon.plugins.hass.hassapi as hass
- import time
- import requests
- from datetime import datetime, timedelta
- class iotawatt(hass.Hass):
- '''
- inputs': [{'channel': 0, 'Vrms': 127.6656, 'Hz': 59.97187, 'phase': 1.14},
- {'channel': 1, 'Watts': '124', 'Pf': 0.647405, 'phase': 1.1, 'lastphase': -0.04},
- {'channel': 2, 'Watts': '776', 'Pf': 0.948618, 'phase': 1, 'lastphase': -0.14},
- {'channel': 3, 'Watts': '11', 'Pf': 0.495821, 'phase': 2, 'lastphase': 0.86},
- {'channel': 4, 'Watts': ' 0', 'Pf': 0, 'phase': 0.9, 'lastphase': -0.24},
- {'channel': 5, 'Watts': '166', 'Pf': 0.905786, 'phase': 1.9, 'lastphase': 0.76},
- {'channel': 6, 'Watts': '230', 'Pf': 0.968985, 'phase': 1.9, 'lastphase': 0.76},
- {'channel': 7, 'Watts': ' 3', 'Pf': 0.495793, 'phase': 2, 'lastphase': 0.86},
- {'channel': 12, 'Watts': ' 0', 'Pf': 0, 'phase': 0.9, 'lastphase': -0.24},
- {'channel': 13, 'Watts': ' 0', 'Pf': 0, 'phase': 0.9, 'lastphase': -0.24},
- {'channel': 14, 'Watts': ' 0', 'Pf': 0, 'phase': 2, 'lastphase': 0.86}]
- outputs': [{'name': 'Misc', 'units': 'Watts', 'value': 487.768},
- {'name': 'OvenCooktop', 'units': 'Watts', 'value': 0},
- {'name': 'Total_Power', 'units': 'Watts', 'value': 898.5995}]
- '''
- def initialize(self):
- self.log("Initialize IoTaWatt")
- self.golfcart_sensor="sensor.i_garage"
- self.IoTaWatt_list_http='http://192.168.1.224/feed/list.json'
- self.IoTaWatt_status_http='http://192.168.1.224/status?inputs=yes&outputs=yes'
- self.update_interval_secs=10
- self.on_error_update_interval_secs=60
- self.runin_secs_error=self.on_error_update_interval_secs
- self.output_status_every=160 # output a status response every x status refreshes
- self.refresh_counter=0
- self.response_error=False
- self.log("Updating sensors every "+str(self.update_interval_secs)+" seconds")
- self.log(" Will report out a Heartbeat every "+str(int(round(self.output_status_every*self.update_interval_secs/60)))+" minutes or so")
- ''' Initialize sensor list '''
- r = requests.get(self.IoTaWatt_list_http, timeout=10)
- response=r.json()
- input=1
- output=0
- self.ins=[]
- self.outs=[]
- for i in response:
- if i["tag"]=="Power":
- if i["id"][:2]=="IP":
- self.ins.append({"channel":input,"name":i["name"],"sensor":"sensor.i_"+i["name"].lower()})
- input+=1
- elif i["id"][:2]=="OP":
- self.outs.append({"channel":output,"name":i["name"],"sensor":"sensor.o_"+i["name"].lower()})
- output+=1
- self.inputs_outputs={"inputs":self.ins,"outputs":self.outs}
- ''' Get initial status of Inputs and Outputs '''
- try:
- r = requests.get(self.IoTaWatt_status_http)
- response=r.json()
- self.log("Creating the following INPUT sensors:")
- for i in self.inputs_outputs["inputs"]:
- if i["channel"] != 0:
- self.log(" "+i["sensor"])
- self.set_state(i["sensor"], state=response['inputs'][i["channel"]]['Watts'],attributes={"unit_of_measure":"W","icon":"mdi:flash"})
- self.log("Creating the following OUTPUT sensors:")
- for i in self.inputs_outputs["outputs"]:
- self.log(" "+i["sensor"])
- self.set_state(i["sensor"], state=response['outputs'][i["channel"]]['value'],attributes={"unit_of_measure":"W","icon":"mdi:flash"})
- except:
- self.log("Error getting response from IotaWatt!")
- self.log(" Reseting update interval from every "+str(self.update_interval_secs)+" seconds to every "+ str(self.on_error_update_interval_secs)+" seconds until error goes away!")
- self.response_error=True
- if self.response_error:
- self.run_in(self.refresh_iotawatt_data,self.on_error_update_interval_secs)
- else:
- self.run_in(self.refresh_iotawatt_data,self.update_interval_secs)
- self.log("IoTaWatt Heartbeat - Total Power: "+"{:,}".format(int(response['outputs'][2]['value']))+" W")
- def refresh_iotawatt_data(self,*args):
- try:
- r = requests.get(self.IoTaWatt_status_http)
- response=r.json()
- except:
- self.log("Error getting response from IotaWatt!")
- self.log(" Reseting update interval from every "+str(self.update_interval_secs)+" seconds to every "+str(self.runin_secs_error)+" seconds until error goes away!")
- self.run_in(self.refresh_iotawatt_data,self.runin_secs_error)
- self.runin_secs_error=self.runin_secs_error+self.on_error_update_interval_secs # keep incrementing until error goes away
- self.response_error=True
- return
- self.runin_secs_error=self.on_error_update_interval_secs
- self.refresh_counter += 1
- if self.refresh_counter==self.output_status_every:
- self.refresh_counter=0
- self.log("IotaWatt Heartbeat - Total Power: "+"{:,}".format(int(response['outputs'][2]['value']))+" W")
- for i in self.inputs_outputs["inputs"]:
- if i["channel"] != 0:
- if self.get_state(i["sensor"]) != response['inputs'][i["channel"]]['Watts']:
- ''' Check if Golf Cart '''
- if i["sensor"]==self.golfcart_sensor:
- if float(self.get_state(i["sensor"]))>200.0:
- self.set_state(i["sensor"], state=response['inputs'][i["channel"]]['Watts'],attributes={"unit_of_measure":"W","icon":"mdi:flash","cart_charging":True})
- else:
- self.set_state(i["sensor"], state=response['inputs'][i["channel"]]['Watts'],attributes={"unit_of_measure":"W","icon":"mdi:flash","cart_charging":False})
- else:
- self.set_state(i["sensor"], state=response['inputs'][i["channel"]]['Watts'],attributes={"unit_of_measure":"W","icon":"mdi:flash"})
- for i in self.inputs_outputs["outputs"]:
- if self.get_state(i["sensor"]) != response['outputs'][i["channel"]]['value']:
- self.set_state(i["sensor"], state=round(response['outputs'][i["channel"]]['value']),attributes={"unit_of_measure":"W","icon":"mdi:flash"})
- #
- if self.response_error:
- self.log("Error condition rectified - returning to get status every "+str(self.update_interval_secs)+" seconds!")
- self.response_error=False
- #
- self.run_in(self.refresh_iotawatt_data,self.update_interval_secs)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement