示例#1
0
 def set_value(self,valuenum,value,publish=True,suserssi=-1,susebattery=-1): # implement if GPIO used!!
  if float(valuenum)<=self.valuecount and float(valuenum)>0:
   rval = value
   if self.formulaoption: # handle formulas
    tval = False
    if len(self.formula[valuenum-1])>0 and commands.isformula(self.formula[valuenum-1]):
     tval = commands.parseformula(self.formula[valuenum-1],float(value))
     if tval!=False:
      rval = tval
   if self.pininversed:          # only binary sensors supported for inversion!
    if type(rval) is str:
     if (rval.lower() == "off") or (rval=="0"):
      rval = 1
     else:
      rval = 0
    else:
     if (float(rval) == 0):
      rval = 1
     else:
      rval = 0
   if int(float(self.decimals[valuenum-1]))>=0: # handle decimals if needed
    try:
     rval = misc.formatnum(rval,int(float(self.decimals[valuenum-1])))
    except:
     pass
   self.uservar[valuenum-1] = rval
   if self.valuenames[valuenum-1]!= "":
    commands.rulesProcessing(self.taskname+"#"+self.valuenames[valuenum-1]+"="+str(rval),rpieGlobals.RULE_USER)
   if self.senddataoption and publish:
    self.plugin_senddata(puserssi=suserssi,pusebattery=susebattery,pchangedvalue=valuenum)
   try:
    if self.writecallback is not None:
     self.writecallback(self.taskindex,valuenum)
   except:
    pass
示例#2
0
 def plugin_read(self): # deal with data processing at specified time interval
  result = False
  if self.initialized:
   for x in range(self.valuecount):
    if len(self.formula[x])>1 and ("%" in self.formula[x]) and ("value" not in self.formula[x].lower()):
     self.uservar[x] = commands.parsevalue(self.formula[x])
    logs = self.gettaskname()+"#"+self.valuenames[x]+"="+str(misc.formatnum(self.uservar[x],self.decimals[x]))
    misc.addLog(rpieGlobals.LOG_LEVEL_INFO,logs)
   self._lastdataservetime = rpieTime.millis()
   self.plugin_senddata()
   result = True
  return result
示例#3
0
def getuptime(form=0):
   global start_time
   rs = datetime.now() - start_time
   upts = ""
   if form==0:
    upts = (rs.days * 86400) + rs.seconds
   elif form==1:
    hours, remainder = divmod(rs.seconds, 3600)
    minutes, seconds = divmod(remainder, 60)
    upts = str(rs.days) + " days " + str(hours) + " hours " + str(minutes) + " minutes"
   elif form==2:
    upts = misc.formatnum( ((rs.days * 86400) + rs.seconds)/60, 4)
   return upts
示例#4
0
def parseconversions(cvalue):
    retval = cvalue
    if ("%c_" in retval):
        cf = retval.find("%c_m2day%")
        if cf >= 0:
            ps = retval.find("(", cf)
            pe = -1
            if ps >= 0:
                pe = retval.find(")", ps)
            if pe >= 0:
                param = retval[ps + 1:pe].strip()
            try:
                param = float(param)
            except:
                param = 0
            retval = retval[:cf] + str(misc.formatnum(
                (param / 1440), 2)) + retval[pe + 1:]
        cf = retval.find("%c_m2dh%")
        if cf >= 0:
            ps = retval.find("(", cf)
            pe = -1
            if ps >= 0:
                pe = retval.find(")", ps)
            if pe >= 0:
                param = retval[ps + 1:pe].strip()
            try:
                param = float(param)
            except:
                param = 0
            days, remainder = divmod(param, 1440)
            hours, minutes = divmod(remainder, 60)
            retval = retval[:cf] + str(int(days)) + "d " + str(
                int(hours)) + "h" + retval[pe + 1:]
        cf = retval.find("%c_m2dhm%")
        if cf >= 0:
            ps = retval.find("(", cf)
            pe = -1
            if ps >= 0:
                pe = retval.find(")", ps)
            if pe >= 0:
                param = retval[ps + 1:pe].strip()
            try:
                param = float(param)
            except:
                param = 0
            days, remainder = divmod(param, 1440)
            hours, minutes = divmod(remainder, 60)
            retval = retval[:cf] + str(int(days)) + "d " + str(
                int(hours)) + "h " + str(int(minutes)) + "m" + retval[pe + 1:]
    return retval
示例#5
0
    def decode_xiaomi(self, buf):
        res = {}
        ofs = 0
        try:
            if len(buf) > 16:
                cdata = struct.unpack_from('<H H H B 6B B B B B', buf)
            elif len(buf) > 15:
                cdata = struct.unpack_from('<H H H B 6B B B B ', buf)
            else:
                cdata = [0]
        except:
            cdata = [0]
        if cdata[0] == 0xFE95:
            if cdata[11] != 0x10 and cdata[12] == 0x10:
                ofs = 1
            try:
                if cdata[2] == 0x0576:
                    cdata2 = struct.unpack_from('<h H', buf[15:])
                    res = {"temp": cdata2[0] / 10.0, "hum": cdata2[1] / 10.0}
                elif cdata[10 + ofs] == 0xD and cdata[12 + ofs] > 3:
                    cdata2 = struct.unpack_from('<H H', buf[16 + ofs:])
                    res = {"temp": cdata2[0] / 10.0, "hum": cdata2[1] / 10.0}
                elif cdata[10 + ofs] == 0xA and cdata[12 + ofs] > 0:
                    res = {"batt": buf[16 + ofs]}


#      misc.addLog(rpieGlobals.LOG_LEVEL_DEBUG,str(res)+" "+str(cdata))
                elif cdata[10 + ofs] == 6 and cdata[12 + ofs] > 0:
                    cdata2 = struct.unpack_from('<H', buf[16 + ofs:])
                    res = {"hum": cdata2[0] / 10.0}
                elif cdata[10 + ofs] == 4 and cdata[12 + ofs] > 0:
                    cdata2 = struct.unpack_from('<H', buf[16 + ofs:])
                    res = {"temp": cdata2[0] / 10.0}
                elif cdata[10 + ofs] == 7 and cdata[12 + ofs] > 0:
                    try:
                        cdata2 = struct.unpack_from('<3B', buf[16 + ofs:])
                        res = cdata2[0] + cdata2[1] * 256 + cdata2[2] * 65535
                    except:
                        res = buf[16 + ofs]
                    res = {"light": res}  # 3byte
                elif cdata[10 + ofs] == 8 and cdata[12 + ofs] > 0:
                    res = {"moist": buf[16 + ofs]}  #1byte
                elif cdata[10 + ofs] == 9 and cdata[12 + ofs] > 0:
                    try:
                        cdata2 = struct.unpack_from('<H', buf[16 + ofs:])
                        res = cdata2[0]
                    except:
                        res = buf[16 + ofs]
                    res = {"fertil": res}  #2byte
                elif cdata[10 + ofs] == 5 and cdata[12 + ofs] > 0:
                    res = {"stat": buf[16 + ofs], "temp": buf[17 + ofs]}
            except:
                res = {}
        else:
            if buf[0] == 0x1A and buf[1] == 0x18:  # ATC
                ttemp = 0
                thum = 101
                if len(buf) == 15:  #atc1441
                    try:
                        cdata = struct.unpack_from('>H 6B h B B H B', buf)
                        ttemp = int(cdata[7]) / 10.0
                        thum = cdata[8]
                        tbat = cdata[9]
                    except:
                        cdata = [0]
                        ttemp = 0
                        thum = 101
                elif len(buf) == 17:  #custom pvvx
                    try:
                        cdata = struct.unpack_from('<H 6B h H H B B B', buf)
                        ttemp = float(misc.formatnum(
                            float(cdata[7]) * 0.01, 2))
                        thum = float(misc.formatnum(float(cdata[8]) * 0.01, 2))
                        tbat = cdata[10]
                    except:
                        cdata = [0]
                        ttemp = 0
                        thum = 101
                if len(cdata) > 1 and (ttemp > -20 and ttemp < 120
                                       ) and thum < 101:  #basic validation
                    res = {"temp": ttemp, "hum": thum, "batt": tbat}
                else:
                    res = {}
        return res
示例#6
0
def handle_devices(httpResponse,responsearr):
 ws.navMenuIndex=4
 ws.TXBuffer = ""
 httpResponse.WriteResponseOk(
        headers = ({'Cache-Control': 'no-cache'}),
        contentType = 'text/html',
        contentCharset = 'UTF-8',
        content = "" )

 taskdevicenumber = ws.arg('TDNUM',responsearr)
 if taskdevicenumber=='':
  taskdevicenumber=0
 else:
  taskdevicenumber=int(float(taskdevicenumber))

 taskdevicetimer = ws.arg('TDT',responsearr)
 if taskdevicetimer=='':
  taskdevicetimer=0
 else:
  taskdevicetimer=float(taskdevicetimer)

 edit = ws.arg("edit",responsearr)
 page = ws.arg("page",responsearr)
 setpage = ws.arg("setpage",responsearr)
 taskIndex = ws.arg("index",responsearr)
 runIndex = ws.arg("run",responsearr)
 toggleIndex = ws.arg("toggle",responsearr)

 if page=='':
  page=0
 else:
  page=int(float(page))
 if page==0:
  page = 1
 if setpage=='':
  setpage=0
 else:
  setpage=int(float(setpage))
 if (setpage>0):
  if setpage <= (pglobals.TASKS_MAX / ws.TASKS_PER_PAGE):
   page = setpage
  else:
   page = int(pglobals.TASKS_MAX / ws.TASKS_PER_PAGE)

 ws.sendHeadandTail("TmplStd",ws._HEAD)
 taskIndexNotSet = (taskIndex == 0) or (taskIndex == '')
 import settings
 import misc

 if taskIndex!="":
  taskIndex = int(taskIndex) - 1
 if ws.arg('del',responsearr) != '':
  taskdevicenumber=0
  ttid = -1
  try:
    ttid = settings.Tasks[taskIndex].pluginid
  except:
    ttid = -1

  if ttid != -1:
   try:
    settings.Tasks[taskIndex].plugin_exit()
    taskIndexNotSet = True
    settings.Tasks[taskIndex] = False
    settings.savetasks() # savetasksettings!!!
   except Exception as e:
    misc.addLog(pglobals.LOG_LEVEL_ERROR, "Deleting failed: "+str(e))

 if runIndex != "":
  if len(settings.Tasks)<1:
   return False
  try:
   s = int(runIndex)
  except:
   s = -1
  try:
   if s >0 and (s<=len(settings.Tasks)):
    s = s-1 # array is 0 based, tasks is 1 based
    if (type(settings.Tasks[s])!=bool) and (settings.Tasks[s]):
     if (settings.Tasks[s].enabled):
      settings.Tasks[s].plugin_read()
  except Exception as e:
    print(e)
 httpResponse._write(ws.TXBuffer,strEncoding='UTF-8')
 ws.TXBuffer = ""

 if toggleIndex != "":
  if len(settings.Tasks)<1:
   return False
  try:
   s = int(toggleIndex)
  except:
   s = -1
  try:
   if s >0 and (s<=len(settings.Tasks)):
    s = s-1 # array is 0 based, tasks is 1 based
    if (type(settings.Tasks[s])!=bool) and (settings.Tasks[s]):
     if (settings.Tasks[s].enabled):
      settings.Tasks[s].set_value(1,(1-int(settings.Tasks[s].uservar[0])),publish=True)
  except Exception as e:
    print(e)

 if taskIndexNotSet: # show all tasks as table

    ws.TXBuffer += "<table class='multirow' border=1px frame='box' rules='all'><TR><TH style='width:70px;'>"

    if (pglobals.TASKS_MAX != ws.TASKS_PER_PAGE):
      ws.TXBuffer += "<a class='button link' href='devices?setpage="
      if (page > 1):
        ws.TXBuffer += str(page - 1)
      else:
        ws.TXBuffer += str(page)
      ws.TXBuffer += "'>&lt;</a><a class='button link' href='devices?setpage="

      if (page < (pglobals.TASKS_MAX / ws.TASKS_PER_PAGE)):
        ws.TXBuffer += str(page + 1)
      else:
        ws.TXBuffer += str(page)
      ws.TXBuffer += "'>&gt;</a><TH style='width:50px;'>Task<TH style='width:100px;'>Enabled<TH>Device<TH>Name<TH>Port<TH style='width:100px;'>Ctr (IDX)<TH style='width:70px;'>GPIO<TH>Values"
      for x in range( ((page - 1) * ws.TASKS_PER_PAGE), ((page) * ws.TASKS_PER_PAGE) ):
       ws.TXBuffer += "<TR><TD><a class='button link' href='devices?index={0}&page={1}'>Edit</a>".format((x+1),page)
       try:
        if settings.Tasks[x] and settings.Tasks[x].enabled and settings.Tasks[x].remotefeed<1:
         ws.TXBuffer += "<a class='button link' href='devices?run={0}&page={1}'>Run</a>".format((x+1),page)
         if settings.Tasks[x].recdataoption and settings.Tasks[x].vtype==pglobals.SENSOR_TYPE_SWITCH:
          ws.TXBuffer += "<a class='button link' href='devices?toggle={0}&page={1}'>Toggle</a>".format((x+1),page)
       except:
        pass
       ws.TXBuffer += "<TD>{0}<TD>".format(x+1)

       lent = False
       try:
        if settings.Tasks[x]:
         lent = True
       except:
        lent = False

       if (len(settings.Tasks)>x) and (lent):
        try:
         ws.addEnabled(settings.Tasks[x].enabled)
        except Exception as e:
         pass
        ws.TXBuffer += "<TD>{0}<TD>{1}<TD>".format(settings.Tasks[x].getdevicename(),settings.Tasks[x].gettaskname())

        try:
          if (str(settings.Tasks[x].ports) != "0" and str(settings.Tasks[x].ports) != ""):
            ws.TXBuffer += str(settings.Tasks[x].ports)
        except:
         pass
        if settings.Tasks[x].remotefeed:
         ws.TXBuffer += "<TD style='background-color:#00FF00'>"
        else:
         ws.TXBuffer += "<TD>"
        try:
         if (settings.Tasks[x].senddataoption):
          doBR = False
          maxcon = len(settings.Controllers)
          if maxcon>pglobals.CONTROLLER_MAX:
           maxcon = pglobals.CONTROLLER_MAX
          try:
           for controllerNr in range(0,maxcon):
            if (settings.Tasks[x]) and (settings.Tasks[x].senddataenabled[controllerNr]) and (settings.Controllers[controllerNr].enabled):
              if (doBR):
                ws.TXBuffer += "<BR>"
              ws.TXBuffer += ws.getControllerSymbol(controllerNr)
              if (settings.Controllers[controllerNr].usesID):
                ws.TXBuffer += " ({0})".format(settings.Tasks[x].controlleridx[controllerNr])
                if (int(settings.Tasks[x].controlleridx[controllerNr]) <= 0):
                  ws.TXBuffer += " " + HTML_SYMBOL_WARNING
              doBR = True
          except Exception as e:
            pass
         ws.TXBuffer += "<TD>"
        except Exception as e:
         print(e)

        if (settings.Tasks[x].dtype == pglobals.DEVICE_TYPE_I2C):
            try:
             i2cpins = settings.get_i2c_pins(settings.Tasks[x].i2c)
             ws.TXBuffer += "{0}<BR>{1}".format(i2cpins[0],i2cpins[1])
            except:
             ws.TXBuffer += "NO-I2C"
        if (settings.Tasks[x].dtype == pglobals.DEVICE_TYPE_SPI):
            try:
             ws.TXBuffer += "SPI{0}".format(settings.Tasks[x].spi)
            except:
             ws.TXBuffer += "NO-SPI"
        for tp in range(0,len(settings.Tasks[x].taskdevicepin)):
          if int(settings.Tasks[x].taskdevicepin[tp])>=0:
            ws.TXBuffer += "<br>GPIO-{0}".format(settings.Tasks[x].taskdevicepin[tp])
        ws.TXBuffer += "<TD>"
        customValues = False
#        customValues = PluginCall(PLUGIN_WEBFORM_SHOW_VALUES, &TempEvent,ws.TXBuffer.buf);

        if not(customValues):
          if (settings.Tasks[x].vtype == pglobals.SENSOR_TYPE_LONG):
           try:
            numtodisp = str(float(settings.Tasks[x].uservar[0]) + float(settings.Tasks[x].uservar[1] << 16))
            ws.TXBuffer  += "<div class='div_l' id='valuename_{0}_0'>{1}:</div><div class='div_r' id='value_{2}_0'>{3}</div>".format(x,settings.Tasks[x].getdevicevaluenames()[0],x,str(misc.formatnum(numtodisp,0)))
           except Exception as e:
            print(e)
          else:
            try:
             for varNr in range(0,pglobals.VARS_PER_TASK):
              if ((settings.Tasks[x].enabled) and (varNr < settings.Tasks[x].valuecount)):
                if (varNr > 0):
                  ws.TXBuffer += "<div class='div_br'></div>"
                numtodisp = settings.Tasks[x].uservar[varNr]
                decimalv = settings.Tasks[x].decimals[varNr]
                ws.TXBuffer  += "<div class='div_l' id='valuename_{0}_{1}'>{2}:</div><div class='div_r' id='value_{3}_{4}'>{5}</div>".format(x,varNr,settings.Tasks[x].getdevicevaluenames()[varNr],x,varNr,str(misc.formatnum(numtodisp,decimalv)))
            except Exception as e:
             print(e)
       else:
        ws.TXBuffer += "<TD><TD><TD><TD><TD><TD>"
       httpResponse._write(ws.TXBuffer,strEncoding='UTF-8')
       ws.TXBuffer = ""
      ws.TXBuffer += "</table></form>"

 ws.sendHeadandTail("TmplStd",ws._TAIL)
 httpResponse._write(ws.TXBuffer,strEncoding='UTF-8')
 ws.TXBuffer = ""