Advertisement
Guest User

Untitled

a guest
Apr 9th, 2020
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.21 KB | None | 0 0
  1. import appdaemon.plugins.hass.hassapi as hass
  2. import time
  3. import requests
  4. from datetime import datetime, timedelta
  5.  
  6. class iotawatt(hass.Hass):
  7.  
  8.   '''
  9.   inputs': [{'channel': 0, 'Vrms': 127.6656, 'Hz': 59.97187, 'phase': 1.14},
  10.             {'channel': 1, 'Watts': '124', 'Pf': 0.647405, 'phase': 1.1, 'lastphase': -0.04},
  11.             {'channel': 2, 'Watts': '776', 'Pf': 0.948618, 'phase': 1, 'lastphase': -0.14},
  12.             {'channel': 3, 'Watts': '11', 'Pf': 0.495821, 'phase': 2, 'lastphase': 0.86},
  13.             {'channel': 4, 'Watts': ' 0', 'Pf': 0, 'phase': 0.9, 'lastphase': -0.24},
  14.             {'channel': 5, 'Watts': '166', 'Pf': 0.905786, 'phase': 1.9, 'lastphase': 0.76},
  15.             {'channel': 6, 'Watts': '230', 'Pf': 0.968985, 'phase': 1.9, 'lastphase': 0.76},
  16.             {'channel': 7, 'Watts': ' 3', 'Pf': 0.495793, 'phase': 2, 'lastphase': 0.86},
  17.             {'channel': 12, 'Watts': ' 0', 'Pf': 0, 'phase': 0.9, 'lastphase': -0.24},
  18.             {'channel': 13, 'Watts': ' 0', 'Pf': 0, 'phase': 0.9, 'lastphase': -0.24},
  19.             {'channel': 14, 'Watts': ' 0', 'Pf': 0, 'phase': 2, 'lastphase': 0.86}]
  20.   outputs': [{'name': 'Misc', 'units': 'Watts', 'value': 487.768},
  21.              {'name': 'OvenCooktop', 'units': 'Watts', 'value': 0},
  22.              {'name': 'Total_Power', 'units': 'Watts', 'value': 898.5995}]
  23.  '''
  24.  
  25.   def initialize(self):
  26.     self.log("Initialize IoTaWatt")
  27.     self.golfcart_sensor="sensor.i_garage"
  28.     self.IoTaWatt_list_http='http://192.168.1.224/feed/list.json'
  29.     self.IoTaWatt_status_http='http://192.168.1.224/status?inputs=yes&outputs=yes'
  30.     self.update_interval_secs=10
  31.     self.on_error_update_interval_secs=60
  32.     self.runin_secs_error=self.on_error_update_interval_secs
  33.     self.output_status_every=160 # output a status response every x status refreshes
  34.     self.refresh_counter=0
  35.     self.response_error=False
  36.     self.log("Updating sensors every "+str(self.update_interval_secs)+" seconds")
  37.     self.log("  Will report out a Heartbeat every "+str(int(round(self.output_status_every*self.update_interval_secs/60)))+" minutes or so")
  38.  
  39.     ''' Initialize sensor list '''
  40.     r = requests.get(self.IoTaWatt_list_http, timeout=10)
  41.     response=r.json()
  42.     input=1
  43.     output=0
  44.     self.ins=[]
  45.     self.outs=[]
  46.     for i in response:
  47.       if i["tag"]=="Power":
  48.         if i["id"][:2]=="IP":
  49.           self.ins.append({"channel":input,"name":i["name"],"sensor":"sensor.i_"+i["name"].lower()})
  50.           input+=1
  51.         elif i["id"][:2]=="OP":
  52.           self.outs.append({"channel":output,"name":i["name"],"sensor":"sensor.o_"+i["name"].lower()})
  53.           output+=1
  54.     self.inputs_outputs={"inputs":self.ins,"outputs":self.outs}
  55.     ''' Get initial status of Inputs and Outputs '''
  56.     try:
  57.       r = requests.get(self.IoTaWatt_status_http)
  58.       response=r.json()
  59.       self.log("Creating the following INPUT sensors:")
  60.       for i in self.inputs_outputs["inputs"]:
  61.         if i["channel"] != 0:
  62.           self.log("    "+i["sensor"])
  63.           self.set_state(i["sensor"], state=response['inputs'][i["channel"]]['Watts'],attributes={"unit_of_measure":"W","icon":"mdi:flash"})
  64.       self.log("Creating the following OUTPUT sensors:")
  65.       for i in self.inputs_outputs["outputs"]:
  66.         self.log("    "+i["sensor"])
  67.         self.set_state(i["sensor"], state=response['outputs'][i["channel"]]['value'],attributes={"unit_of_measure":"W","icon":"mdi:flash"})
  68.     except:
  69.       self.log("Error getting response from IotaWatt!")
  70.       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!")
  71.       self.response_error=True
  72.     if self.response_error:
  73.       self.run_in(self.refresh_iotawatt_data,self.on_error_update_interval_secs)
  74.     else:
  75.       self.run_in(self.refresh_iotawatt_data,self.update_interval_secs)
  76.       self.log("IoTaWatt Heartbeat - Total Power: "+"{:,}".format(int(response['outputs'][2]['value']))+" W")
  77.  
  78.   def refresh_iotawatt_data(self,*args):
  79.     try:
  80.       r = requests.get(self.IoTaWatt_status_http)
  81.       response=r.json()
  82.     except:
  83.       self.log("Error getting response from IotaWatt!")
  84.       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!")
  85.       self.run_in(self.refresh_iotawatt_data,self.runin_secs_error)
  86.       self.runin_secs_error=self.runin_secs_error+self.on_error_update_interval_secs # keep incrementing until error goes away
  87.       self.response_error=True
  88.       return
  89.     self.runin_secs_error=self.on_error_update_interval_secs
  90.     self.refresh_counter += 1
  91.     if self.refresh_counter==self.output_status_every:
  92.       self.refresh_counter=0
  93.       self.log("IotaWatt Heartbeat - Total Power: "+"{:,}".format(int(response['outputs'][2]['value']))+" W")
  94.     for i in self.inputs_outputs["inputs"]:
  95.       if i["channel"] != 0:
  96.         if self.get_state(i["sensor"]) != response['inputs'][i["channel"]]['Watts']:
  97.           ''' Check if Golf Cart '''
  98.           if i["sensor"]==self.golfcart_sensor:
  99.             if float(self.get_state(i["sensor"]))>200.0:
  100.               self.set_state(i["sensor"], state=response['inputs'][i["channel"]]['Watts'],attributes={"unit_of_measure":"W","icon":"mdi:flash","cart_charging":True})
  101.             else:
  102.               self.set_state(i["sensor"], state=response['inputs'][i["channel"]]['Watts'],attributes={"unit_of_measure":"W","icon":"mdi:flash","cart_charging":False})
  103.           else:
  104.             self.set_state(i["sensor"], state=response['inputs'][i["channel"]]['Watts'],attributes={"unit_of_measure":"W","icon":"mdi:flash"})
  105.     for i in self.inputs_outputs["outputs"]:
  106.       if self.get_state(i["sensor"]) != response['outputs'][i["channel"]]['value']:
  107.         self.set_state(i["sensor"], state=round(response['outputs'][i["channel"]]['value']),attributes={"unit_of_measure":"W","icon":"mdi:flash"})
  108.     #
  109.     if self.response_error:
  110.       self.log("Error condition rectified - returning to get status every "+str(self.update_interval_secs)+" seconds!")
  111.       self.response_error=False
  112.     #
  113.     self.run_in(self.refresh_iotawatt_data,self.update_interval_secs)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement