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
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
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
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
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
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 += "'><</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 += "'>></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 = ""