def on_message(self, msg): success = False tstart = self.outch[:len(self.outch) - 1] if msg.topic.startswith(tstart): msg2 = msg.payload.decode('utf-8') if msg.topic == tstart + "cmd": # global command arrived, execute commands.doExecuteCommand(msg2, True) success = True else: try: tend = msg.topic[len(self.outch) - 1:] dnames = tend.split("/") except: dnames = [] if len(dnames) > 2: if self.outchannel.endswith( "/" + dnames[len(dnames) - 1] ): # set command arrived, forward it to the Task self.onmsgcallbackfunc( self.controllerindex, -1, msg2, taskname=dnames[0], valuename=dnames[1] ) #-> Settings.callback_from_controllers() success = True
def handle_command(httpResponse, responsearr): ws.navMenuIndex = 0 ws.TXBuffer = "" responsestr = "" httpResponse.WriteResponseOk(headers=({ 'Cache-Control': 'no-cache' }), contentType='text/html', contentCharset='UTF-8', content="") ws.sendHeadandTail("TmplStd", ws._HEAD) try: cmdline = ws.arg("cmd", responsearr).strip() if cmdline.startswith('reboot'): ws.sendHeadandTail("TmplStd", ws._TAIL) if len(cmdline) > 0: responsestr = str(commands.doExecuteCommand(cmdline)) except: pass if len(responsestr) > 0: ws.TXBuffer += "<P>{0}<p>".format(responsestr) if responsestr == False: ws.TXBuffer += "FAILED" ws.sendHeadandTail("TmplStd", ws._TAIL) httpResponse._write(ws.TXBuffer, strEncoding='UTF-8') ws.TXBuffer = ""
def pkt_receiver(self, payload): # processing incoming packets # print(payload) # debug if self.enabled: dp = p2pbuffer.data_packet() pbuf = list(payload) if pbuf[0] == '/' or pbuf[0] == 47: # base64 encoded dp.buffer = base64.b64decode(payload.decode("utf-8")) else: # otherwise plain data arrived dp.buffer = payload dp.decode() # asking p2pbuffer library to decode it # print(dp.buffer) # debug if dp.pkgtype != 0: if dp.pkgtype == 1: # info packet received # print(dp.infopacket) if int(dp.infopacket["unitno"]) == int( Settings.Settings["Unit"]): # skip own messages return False un = getunitordfromnum(dp.infopacket["unitno"] ) # process incoming alive reports if un == -1: # CAPABILITIES byte: first bit 1 if able to send, second bit 1 if able to receive Settings.p2plist.append({ "protocol": "BLE", "unitno": dp.infopacket["unitno"], "name": dp.infopacket["name"], "build": dp.infopacket["build"], "type": dp.infopacket["type"], "mac": dp.infopacket["mac"], "lastseen": datetime.now(), "lastrssi": self.bleserv.getrssi(), "cap": dp.infopacket["cap"] }) misc.addLog( rpieGlobals.LOG_LEVEL_INFO, "New BLE unit discovered: " + str(dp.infopacket["unitno"]) + " " + str(dp.infopacket["name"])) Settings.p2plist.sort(reverse=False, key=self.nodesort) else: misc.addLog( rpieGlobals.LOG_LEVEL_DEBUG, "Unit alive: " + str(dp.infopacket["unitno"])) if Settings.p2plist[un]["type"] == 0: Settings.p2plist[un]["name"] = dp.infopacket[ "name"] Settings.p2plist[un]["build"] = dp.infopacket[ "build"] Settings.p2plist[un]["type"] = dp.infopacket[ "type"] Settings.p2plist[un]["mac"] = dp.infopacket["mac"] Settings.p2plist[un]["cap"] = dp.infopacket["cap"] Settings.p2plist[un]["lastseen"] = datetime.now() Settings.p2plist[un][ "lastrssi"] = self.bleserv.getrssi() elif dp.pkgtype == 5: # process incoming data if int(dp.sensordata["sunit"]) == int( Settings.Settings["Unit"]): return False un = getunitordfromnum(dp.sensordata["sunit"]) if un > -1: # refresh lastseen data Settings.p2plist[un]["lastseen"] = datetime.now() Settings.p2plist[un][ "lastrssi"] = self.bleserv.getrssi() else: Settings.p2plist.append({ "protocol": "BLE", "unitno": dp.sensordata["sunit"], "name": "", "build": 0, "type": 0, "mac": "", "lastseen": datetime.now(), "lastrssi": self.bleserv.getrssi(), "cap": 1 }) if (int(Settings.Settings["Unit"]) == int( dp.sensordata["dunit"] )) or (0 == int( dp.sensordata["dunit"] )): # process only if we are the destination or broadcast ltaskindex = -1 for x in range( 0, len(Settings.Tasks) ): # check if the sent IDX already exists? try: if (type(Settings.Tasks[x]) is not bool and Settings.Tasks[x]): if Settings.Tasks[x].controlleridx[ self.controllerindex] == int( dp.sensordata["idx"]): ltaskindex = x break except Exception as e: print(e) dvaluecount = int(dp.sensordata["valuecount"]) if rpieGlobals.VARS_PER_TASK < dvaluecount: # avoid possible buffer overflow dvaluecount = rpieGlobals.VARS_PER_TASK if ltaskindex < 0: # create new task if necessarry devtype = int(dp.sensordata["pluginid"]) m = False try: for y in range(len( rpieGlobals.deviceselector)): if int(rpieGlobals.deviceselector[y] [1]) == devtype: m = __import__( rpieGlobals.deviceselector[y][0]) break except: m = False TempEvent = None if m: try: TempEvent = m.Plugin(-1) except: TempEvent = None if True: ltaskindex = -1 for x in range( 0, len(Settings.Tasks) ): # check if there are free TaskIndex slot exists try: if (type(Settings.Tasks[x]) is bool): if Settings.Tasks[x] == False: ltaskindex = x break except: pass devtype = 33 # dummy device m = False try: for y in range( len(rpieGlobals.deviceselector)): if int(rpieGlobals.deviceselector[y] [1]) == devtype: m = __import__( rpieGlobals.deviceselector[y] [0]) break except: m = False if m: if ltaskindex < 0: ltaskindex = len(Settings.Tasks) try: Settings.Tasks[ltaskindex] = m.Plugin( ltaskindex) except: ltaskindex = len(Settings.Tasks) Settings.Tasks.append( m.Plugin(ltaskindex) ) # add a new device Settings.Tasks[ltaskindex].plugin_init( True) Settings.Tasks[ ltaskindex].remotefeed = True # Mark that this task accepts incoming data updates! Settings.Tasks[ltaskindex].enabled = True Settings.Tasks[ltaskindex].interval = 0 Settings.Tasks[ltaskindex].senddataenabled[ self.controllerindex] = True Settings.Tasks[ltaskindex].controlleridx[ self.controllerindex] = int( dp.sensordata["idx"]) if TempEvent is not None: Settings.Tasks[ ltaskindex].taskname = TempEvent.PLUGIN_NAME.replace( " ", "") for v in range(dvaluecount): Settings.Tasks[ ltaskindex].valuenames[ v] = TempEvent.valuenames[ v] Settings.Tasks[ ltaskindex].taskdevicepluginconfig[ 0] = TempEvent.vtype Settings.Tasks[ ltaskindex].vtype = TempEvent.vtype else: Settings.Tasks[ ltaskindex].taskname = Settings.Tasks[ ltaskindex].PLUGIN_NAME.replace( " ", "") Settings.Tasks[ ltaskindex].valuecount = dvaluecount Settings.savetasks() if ltaskindex < 0: return False misc.addLog(rpieGlobals.LOG_LEVEL_DEBUG, "Sensordata update arrived from unit " + str(dp.sensordata["sunit"]) ) # save received values if Settings.Tasks[ltaskindex].remotefeed: for v in range(dvaluecount): Settings.Tasks[ltaskindex].set_value( v + 1, dp.sensordata["values"][v], False) Settings.Tasks[ltaskindex].plugin_senddata() elif (int(Settings.Settings["Unit"]) != int( dp.sensordata["dunit"]) ): # reroute if pkt is not for us if ( self.defaultunit != int(dp.sensordata["dunit"]) ) and ( self.enablesend or self.directsend ): # ... and not came from default target, and sending is enabled if self.directsend: un = getunitordfromnum( dp.sensordata["dunit"] ) # try direct send only if instructed to do so else: un = -1 self.bleclient.setdestination( self.defaultdestination) if un > -1: if ( int(Settings.p2plist[un]["cap"]) & 2 ) == 2: # try only if endpoint is able to receive self.bleclient.setdestination( Settings.p2plist[un]["mac"]) success = self.bleclient.send(dp.buffer) if success == False and un > -1: self.bleclient.setdestination( self.defaultdestination) success = self.bleclient.send(dp.buffer) elif dp.pkgtype == 7: # process incoming command if int(dp.cmdpacket["sunit"]) == int( Settings.Settings["Unit"]): return False un = getunitordfromnum(dp.cmdpacket["sunit"]) if un > -1: # refresh lastseen data Settings.p2plist[un]["lastseen"] = datetime.now() Settings.p2plist[un][ "lastrssi"] = self.bleserv.getrssi() else: Settings.p2plist.append({ "protocol": "BLE", "unitno": dp.cmdpacket["sunit"], "name": "", "build": 0, "type": 0, "mac": "", "lastseen": datetime.now(), "lastrssi": self.bleserv.getrssi(), "cap": 1 }) if (int(Settings.Settings["Unit"]) == int( dp.cmdpacket["dunit"] )) or (0 == int( dp.cmdpacket["dunit"] )): # process only if we are the destination or broadcast misc.addLog( rpieGlobals.LOG_LEVEL_INFO, "Command arrived from " + str(dp.cmdpacket["sunit"])) # print(dp.cmdpacket["cmdline"]) # DEBUG commands.doExecuteCommand(dp.cmdpacket["cmdline"], True)
def on_message(self, msg): success = False tstart = self.outch[:len(self.outch)-1] if msg.topic.startswith(tstart) or self.outch=="#": msg2 = msg.payload.decode('utf-8') if (msg.topic == tstart + "cmd") and (self.outch!="#"): # global command arrived, execute commands.doExecuteCommand(msg2,True) success = True else: try: # tend = msg.topic[len(self.outch)-1:] dnames = msg.topic.split("/") dnames2 = self.outchannel.split("/") except: dnames = [] if len(dnames)>1: v1 = -1 v2 = -1 if self.outchannel.endswith("/"+dnames[len(dnames)-1]): # set command arrived, forward it to the Task ttaskname = "" if self.useJSON: mlist = [] if ('{' in msg2): try: mlist = json.loads(msg2) except Exception as e: mlist = [] if ("taskname" in mlist): ttaskname = mlist['taskname'] dnames = [] # print(msg2,mlist,ttaskname,dnames)#debug if ttaskname=="": try: v1 = dnames2.index("#") v2 = v1+1 except: v1 = -1 if v1 == -1: try: v1 = dnames2.index("%tskname%") except: v1 = -1 try: v2 = dnames2.index("%valname%") except: v2 = -1 try: v3 = dnames2.index("%tskid%") except: v3 = -1 if v3>-1: try: t = int(dnames[v3])-1 if Settings.Tasks[t] and type(Settings.Tasks[t]) is not bool: ttaskname = Settings.Tasks[t].gettaskname().strip() except: pass elif v1==-1 and v2>-1: try: for x in range(len(Settings.Tasks)): if Settings.Tasks[x] and type(Settings.Tasks[x]) is not bool: for u in range(Settings.Tasks[x].valuecount): if Settings.Tasks[x].valuenames[u] == dnames[v2]: ttaskname = Settings.Tasks[x].gettaskname().strip() break if ttaskname != "": break except: pass if ttaskname=="" and v1>-1: ttaskname = dnames[v1] if self.useJSON and ttaskname != "": try: pvalues = [-1,-1,-1,-1] for x in range(len(Settings.Tasks)): if Settings.Tasks[x] and type(Settings.Tasks[x]) is not bool: if Settings.Tasks[x].gettaskname() == ttaskname: for u in range(Settings.Tasks[x].valuecount): valnam = Settings.Tasks[x].valuenames[u] if valnam in mlist: pvalues[u] = mlist[valnam] break except: pass self.onmsgcallbackfunc(self.controllerindex,-1,pvalues,taskname=ttaskname,valuename="") #-> Settings.callback_from_controllers() success = True return success if ttaskname != "" and v2>-1 and v2<len(dnames): self.onmsgcallbackfunc(self.controllerindex,-1,msg2,taskname=ttaskname,valuename=dnames[v2]) #-> Settings.callback_from_controllers() success = True
def bgreceiver(self): # start with threading! if self.enabled: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Make Socket Reusable s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # Allow incoming broadcasts s.setblocking(False) # Set socket to non-blocking mode s.bind(('',int(self.controllerport))) # data ='' address = '' dp = data_packet() while self.enabled: dp.clear() try: dp.buffer,address = s.recvfrom(10000) except socket.error: pass else: dp.decode() if dp.pkgtype==1: un = getunitordfromnum(dp.infopacket["unitno"]) # process incoming alive reports if un==-1: Settings.nodelist.append({"unitno":dp.infopacket["unitno"],"name":dp.infopacket["name"],"build":dp.infopacket["build"],"type":dp.infopacket["type"],"ip":dp.infopacket["ip"],"port":dp.infopacket["port"],"age":0}) misc.addLog(rpieGlobals.LOG_LEVEL_INFO,"New P2P unit discovered: "+str(dp.infopacket["unitno"])+" "+str(dp.infopacket["ip"])+" "+str(dp.infopacket["mac"])) Settings.nodelist.sort(reverse=False,key=self.nodesort) else: Settings.nodelist[un]["age"] = 0 if int(dp.infopacket["unitno"]) != int(Settings.Settings["Unit"]): misc.addLog(rpieGlobals.LOG_LEVEL_DEBUG,"Unit alive: "+str(dp.infopacket["unitno"])) elif dp.pkgtype==3: # process incoming new devices if int(Settings.Settings["Unit"])==int(dp.sensorinfo["dunit"]): # process only if we are the destination rtaskindex = int(dp.sensorinfo["dti"]) if len(Settings.Tasks)<=rtaskindex or Settings.Tasks[rtaskindex]==False: # continue only if taskindex is empty misc.addLog(rpieGlobals.LOG_LEVEL_DEBUG,"Sensorinfo arrived from unit "+str(dp.sensorinfo["sunit"])) devtype = 33 for x in range(len(rpieGlobals.deviceselector)): if int(rpieGlobals.deviceselector[x][1]) == int(dp.sensorinfo["dnum"]): devtype = int(dp.sensorinfo["dnum"]) break m = False try: for y in range(len(rpieGlobals.deviceselector)): if int(rpieGlobals.deviceselector[y][1]) == devtype: if len(Settings.Tasks)<=rtaskindex: while len(Settings.Tasks)<=rtaskindex: Settings.Tasks.append(False) m = __import__(rpieGlobals.deviceselector[y][0]) break except: m = False if m: try: Settings.Tasks[rtaskindex] = m.Plugin(rtaskindex) except: Settings.Tasks.append(m.Plugin(rtaskindex)) Settings.Tasks[rtaskindex].plugin_init(False) Settings.Tasks[rtaskindex].remotefeed = True # Mark that this task accepts incoming data updates! Settings.Tasks[rtaskindex].taskname = dp.sensorinfo["taskname"] for v in range(4): dp.sensorinfo["valuenames"].append("") for v in range(Settings.Tasks[rtaskindex].valuecount): Settings.Tasks[rtaskindex].valuenames[v] = dp.sensorinfo["valuenames"][v] elif dp.pkgtype==5: # process incoming data if int(Settings.Settings["Unit"])==int(dp.sensordata["dunit"]): # process only if we are the destination rtaskindex = int(dp.sensordata["dti"]) if len(Settings.Tasks)>rtaskindex and Settings.Tasks[rtaskindex] and Settings.Tasks[rtaskindex].remotefeed: # continue only if taskindex exists and accepts incoming datas misc.addLog(rpieGlobals.LOG_LEVEL_DEBUG,"Sensordata update arrived from unit "+str(dp.sensordata["sunit"])) for v in range(Settings.Tasks[rtaskindex].valuecount): Settings.Tasks[rtaskindex].set_value(v+1,dp.sensordata["values"][v],False) Settings.Tasks[rtaskindex].plugin_senddata() elif dp.pkgtype==0: misc.addLog(rpieGlobals.LOG_LEVEL_INFO,"Command arrived from "+str(address)) cmdline = decodezerostr(dp.buffer) commands.doExecuteCommand(cmdline,True) time.sleep(0.01) # sleep to avoid 100% cpu usage
def on_message(self, msg): success = False tstart = self.outch[:len(self.outch) - 1] if msg.topic.startswith(tstart) or self.outch == "#": msg2 = msg.payload.decode('utf-8') if (msg.topic == tstart + "cmd") and ( self.outch != "#"): # global command arrived, execute commands.doExecuteCommand(msg2, True) success = True else: try: # tend = msg.topic[len(self.outch)-1:] dnames = msg.topic.split("/") dnames2 = self.outchannel.split("/") except: dnames = [] if len(dnames) > 1: v1 = -1 v2 = -1 if self.outchannel.endswith( "/" + dnames[len(dnames) - 1] ): # set command arrived, forward it to the Task ttaskname = "" try: v1 = dnames2.index("#") v2 = v1 + 1 except: v1 = -1 if v1 == -1: try: v1 = dnames2.index("%tskname%") except: v1 = -1 try: v2 = dnames2.index("%valname%") except: v2 = -1 if v1 == -1 and v2 > -1: try: for x in range(len(Settings.Tasks)): if Settings.Tasks[x] and type( Settings.Tasks[x]) is not bool: for u in range(Settings.Tasks[x]. valuecount): if Settings.Tasks[ x].valuenames[ u] == dnames[v2]: ttaskname = Settings.Tasks[ x].gettaskname().strip( ) break if ttaskname != "": break except: pass if ttaskname == "" and v1 > -1: ttaskname = dnames[v1] # print(v1,v2,ttaskname,dnames) #debug if ttaskname != "" and v2 > -1 and v2 < len(dnames): self.onmsgcallbackfunc( self.controllerindex, -1, msg2, taskname=ttaskname, valuename=dnames[v2] ) #-> Settings.callback_from_controllers() success = True
def handle_root(httpResponse, responsearr): ws.navMenuIndex = 0 ws.TXBuffer = "" responsestr = "" try: redir = settings.AdvSettings["startpage"] except: redir = "/" if redir != "/": return httpResponse.WriteResponseRedirect(redir) httpResponse.WriteResponseOk(headers=({ 'Cache-Control': 'no-cache' }), contentType='text/html', contentCharset='UTF-8', content="") ws.sendHeadandTail("TmplStd", ws._HEAD) try: cmdline = ws.arg("cmd", responsearr).strip() if cmdline.startswith('reboot'): ws.sendHeadandTail("TmplStd", ws._TAIL) if len(cmdline) > 0: import commands responsestr = str(commands.doExecuteCommand(cmdline)) except: pass if len(responsestr) > 0: ws.TXBuffer += "<P>{0}<p>".format(responsestr) ws.TXBuffer += "<form><table class='normal'><tr><TH style='width:150px;' align='left'>System Info<TH align='left'>Value<TR><TD>Unit:<TD>" ws.TXBuffer += str(settings.Settings["Unit"]) ws.TXBuffer += "<TR><TD>Uptime:<TD>" + str(misc.getuptime(1)) httpResponse._write(ws.TXBuffer, strEncoding='UTF-8') ws.TXBuffer = "" try: ws.TXBuffer += "<TR><TD>Free Mem:<TD>" + str( int(esp_os.get_memory()['f'] / 1024)) + " kB" except: pass ws.TXBuffer += "<TR><TD>IP:<TD>" + str(unet.get_ip()) ws.TXBuffer += "<TR><TD>Wifi RSSI:<TD>" + str(unet.get_rssi()) ws.TXBuffer += '<tr><td>Build<td>' + str(pglobals.PROGNAME) + " " + str( pglobals.PROGVER) ws.TXBuffer += "<TR><TD><TD>" ws.addButton("sysinfo", "More info") httpResponse._write(ws.TXBuffer, strEncoding='UTF-8') ws.TXBuffer = "" ws.TXBuffer += "</table><BR>" if len(settings.nodelist) > 0: ws.TXBuffer += "<BR><table class='multirow'><TR><TH>Node List<TH>Name<TH>Build<TH>Type<TH>IP<TH>Age" for n in settings.nodelist: ws.TXBuffer += "<TR><TD>Unit " + str(n["unitno"]) + "<TD>" + str( n["name"]) + "<TD>" + str(n["build"]) + "<TD>" ntype = "" if int(n["type"]) == pglobals.NODE_TYPE_ID_ESP_EASY_STD: ntype = "ESP Easy" elif int(n["type"]) == pglobals.NODE_TYPE_ID_ESP_EASYM_STD: ntype = "ESP Easy Mega" elif int(n["type"]) == pglobals.NODE_TYPE_ID_ESP_EASY32_STD: ntype = "ESP Easy32" elif int(n["type"]) == pglobals.NODE_TYPE_ID_ARDUINO_EASY_STD: ntype = "Arduino Easy" elif int(n["type"]) == pglobals.NODE_TYPE_ID_NANO_EASY_STD: ntype = "Nano Easy" elif int(n["type"]) == pglobals.NODE_TYPE_ID_RPI_EASY_STD: ntype = "RPI Easy" ws.TXBuffer += ntype + "<TD>" waddr = str(n["ip"]) if str(n["port"]) != "" and str(n["port"]) != "0" and str( n["port"]) != "80": waddr += ":" + str(n["port"]) ws.addWideButton("http://" + waddr, waddr, "") ws.TXBuffer += "<TD>" + str(n["age"]) ws.TXBuffer += "</table></form>" if len(settings.p2plist) > 0: try: ws.TXBuffer += "<BR><table class='multirow'><TR><TH>Protocol<TH>P2P node number<TH>Name<TH>Build<TH>Type<TH>MAC<TH>RSSI<TH>Last seen<TH>Capabilities" for n in settings.p2plist: hstr = str(n["protocol"]) if hstr == "ESPNOW": hstr = "<a href='espnow'>" + hstr + "</a>" ws.TXBuffer += "<TR><TD>" + hstr + "<TD>Unit " + str( n["unitno"]) + "<TD>" + str(n["name"]) + "<TD>" + str( n["build"]) + "<TD>" ntype = "Unknown" if int(n["type"]) == pglobals.NODE_TYPE_ID_ESP_EASY_STD: ntype = "ESP Easy" elif int(n["type"]) == pglobals.NODE_TYPE_ID_ESP_EASYM_STD: ntype = "ESP Easy Mega" elif int(n["type"]) == pglobals.NODE_TYPE_ID_ESP_EASY32_STD: ntype = "ESP Easy32" elif int(n["type"]) == pglobals.NODE_TYPE_ID_ARDUINO_EASY_STD: ntype = "Arduino Easy" elif int(n["type"]) == pglobals.NODE_TYPE_ID_NANO_EASY_STD: ntype = "Nano Easy" elif int(n["type"]) == pglobals.NODE_TYPE_ID_RPI_EASY_STD: ntype = "RPI Easy" elif int(n["type"]) == pglobals.NODE_TYPE_ID_ATMEGA_EASY_LORA: ntype = "LoRa32u4" ws.TXBuffer += ntype ws.TXBuffer += "<TD>" + str(n["mac"]) ws.TXBuffer += "<TD>" + str(n["lastrssi"]) ldt = n["lastseen"] lstr = "" try: lstr = '{:04}-{:02}-{:02} {:02}:{:02}:{:02}'.format( ldt[0], ldt[1], ldt[2], ldt[3], ldt[4], ldt[5]) except: lstr = str(ldt) ws.TXBuffer += "<TD>" + lstr wm = int(n["cap"]) wms = "" if (wm & 1) == 1: wms = "SEND " if (wm & 2) == 2: wms += "RECEIVE " ws.TXBuffer += "<TD>" + wms ws.TXBuffer += "</table></form>" except Exception as e: pass ws.sendHeadandTail("TmplStd", ws._TAIL) httpResponse._write(ws.TXBuffer, strEncoding='UTF-8') ws.TXBuffer = ""
def handle_espnow(self): try: webserver.TXBuffer="" if self.type == "GET": responsearr = self.get else: responsearr = self.post try: managenode = webserver.arg('nodenum',responsearr) except: managenode = "" try: tasknum = int(webserver.arg('tasknum',responsearr)) except: tasknum = 0 taskmode = False i2cmode = False for i in range(1,48): try: if webserver.arg('del'+str(i),responsearr) != '': if str(managenode)=="local": commands.doExecuteCommand("serialcommand,taskclear,"+str(i),False) taskmode = True break elif str(managenode)!="": commands.doExecuteCommand("espnowcommand,"+str(managenode)+",taskclear,"+str(i),False) taskmode = True time.sleep(1) break except: pass if int(tasknum)>0: taskc = ["Conf",tasknum,0,0,0,0,0,0,0,0,0,0] taska = ["Task",tasknum,0,-1,-1,-1,0,0,0] wv = -1 try: wv = int(webserver.arg('pluginid',responsearr)) except: wv = -999 if wv > -999: taska[2] = wv for i in range(1,4): try: wv = int(webserver.arg('pin'+str(i),responsearr)) except: wv = -999 if wv>-999: taska[2+i]=wv try: wv = int(webserver.arg('interval',responsearr)) except: wv = -999 if wv>-999: taska[7] = wv try: wv = int(webserver.arg('idx',responsearr)) except: wv = -999 if wv>-999: taska[8] = wv try: wv = int(webserver.arg('port',responsearr)) except: wv = -999 if wv>-999: taska[6] = wv try: wv = webserver.arg('pullup',responsearr) if str(wv)=="on": wv = 1 else: wv = 0 except: wv = 0 if wv>-1: taskc[2] = wv try: wv = 0 wv = webserver.arg('inverse',responsearr) if str(wv)=="on" or str(wv)=="1": wv = 1 else: wv = 0 except: wv = 0 if wv>-1: taskc[3] = wv for i in range(0,8): try: wv = webserver.arg('c'+str(i),responsearr) wv = int(wv) except: wv = -1 if str(wv)=="on" or str(wv)=="1": wv = 1 else: wv = 0 if wv>-1: taskc[4+i]=wv if str(managenode)=="local": tcmd = "serialcommand," else: tcmd = "espnowcommand,"+str(managenode)+"," tcmdc = tcmd + "espnow,taskconf" tcmda = tcmd + "espnow,taskadd" for i in range(1,len(taskc)): tcmdc += ","+str(taskc[i]) for i in range(1,len(taska)): tcmda += ","+str(taska[i]) commands.doExecuteCommand(tcmdc,False) time.sleep(1) commands.doExecuteCommand(tcmda,False) # print(tcmdc) # print(tcmda) taskmode = True elif taskmode==False: for i in range(1,48): try: if webserver.arg('add'+str(i),responsearr) != '': tasknum = i taskmode = True taskc = ["Conf",i,0,0,0,0,0,0,0,0,0,0] taska = ["Task",i,0,-1,-1,-1,0,0,0] break except: pass if taskmode: pass elif ( (webserver.arg('savelocal',responsearr) != '') or (webserver.arg('savenode',responsearr) != '') ): try: workmode = int(webserver.arg('workmode',responsearr)) except: workmode = 0 try: nodenum = int(webserver.arg('nnodenum',responsearr)) except: nodenum = 0 try: dnodenum = int(webserver.arg('dnodenum',responsearr)) except: dnodenum = 0 try: name = str(webserver.arg('name',responsearr)) except: name = "" try: wchannel = int(webserver.arg('wchannel',responsearr)) except: wchannel = 1 try: deepsleep = int(webserver.arg('deepsleep',responsearr)) except: deepsleep = 1 if str(managenode)=="local": tcmd = "serialcommand," dt = 0.5 elif str(managenode)!="": tcmd = "espnowcommand,"+str(managenode)+"," dt = 2 commands.doExecuteCommand(tcmd+"espnow,mode,"+str(workmode),False) time.sleep(dt) commands.doExecuteCommand(tcmd+"espnow,name,"+str(name),False) time.sleep(dt) commands.doExecuteCommand(tcmd+"espnow,deepsleep,"+str(deepsleep),False) time.sleep(dt) commands.doExecuteCommand(tcmd+"espnow,chan,"+str(wchannel),False) time.sleep(dt) commands.doExecuteCommand(tcmd+"espnow,dest,"+str(dnodenum),False) time.sleep(dt) commands.doExecuteCommand(tcmd+"unit,"+str(nodenum),False) time.sleep(dt) if str(managenode)=="local": pass elif str(managenode)!="": commands.doExecuteCommand(tcmd+"reboot",False) # just for sure reboot old node commands.doExecuteCommand("espnowcommand,"+str(nodenum)+",reboot",False) # reboot new node number time.sleep(dt*3) managenode = "" # return to main page instead of re-request all settings elif webserver.arg('submit',responsearr) != '': pass elif webserver.arg('search',responsearr) != '': commands.doExecuteCommand("espnowcommand,0,espnow,sendinfo",False) # broadcast command to every node managenode = "" elif webserver.arg('reboot',responsearr) != '': if str(managenode)!="local" and str(managenode)!="": commands.doExecuteCommand("espnowcommand,"+str(managenode)+",reboot",False) # reboot selected node else: commands.doExecuteCommand("serialcommand,reboot",False) # reboot selected node managenode = "" elif webserver.arg('i2c',responsearr) != '': i2cmode = True elif webserver.arg('tasks',responsearr) != '': taskmode = True elif webserver.arg('time',responsearr) != '': if str(managenode)=="local": commands.doExecuteCommand("serialcommand,espnow,setdate,"+datetime.now().strftime('%Y,%m,%d,%H,%M,%S'),False) elif str(managenode)!="": commands.doExecuteCommand("espnowcommand,"+str(managenode)+",espnow,setdate,"+datetime.now().strftime('%Y,%m,%d,%H,%M,%S'),False) managenode = "" webserver.sendHeadandTail("TmplStd",webserver._HEAD) if i2cmode: webserver.TXBuffer += "<form name='frmadd' method='post'><table class='normal'>" webserver.addFormHeader("I2C scan on Node "+str(managenode)) if str(managenode)=="local": commands.doExecuteCommand("serialcommand,i2cscanner",False) time.sleep(1) elif str(managenode)!="": commands.doExecuteCommand("espnowcommand,"+str(managenode)+",i2cscanner",False) time.sleep(3) scmdarr = [] for i in reversed(range(len(misc.ShadowLog))): if len(scmdarr)>=30: break if "i2cscanner" in misc.ShadowLog[i]["l"]: break if misc.ShadowLog[i]["lvl"]== rpieGlobals.LOG_LEVEL_DEBUG: if "I2C :" in misc.ShadowLog[i]["l"]: scmdarr.append(misc.ShadowLog[i]["l"].replace("ESPNOW:","").replace("SERIAL:","").strip()) webserver.TXBuffer += "<TR><TD colspan='2'><textarea readonly rows='10' wrap='on'>" for i in range(len(scmdarr)): webserver.TXBuffer += scmdarr[i]+" " webserver.TXBuffer += "</textarea><br>" webserver.addButton("espnow","Back") webserver.TXBuffer += "</table></form>" webserver.sendHeadandTail("TmplStd",webserver._TAIL) return webserver.TXBuffer elif taskmode and int(tasknum)>0: # display plugin selection webserver.TXBuffer += "<form name='frmadd' method='post'><table class='normal'>" try: if ("," in taska): ts = str(taska).split(",") tasknum2 = int(ts[1]) else: tasknum2 = int(taska[1]) except: tasknum2 = int(tasknum) webserver.addFormHeader("ESPNow add new task "+str(tasknum2)+" on Node "+str(managenode)) displaytask(taska,taskc) webserver.addHtml("<tr><td><input type='hidden' name='nodenum' value='"+str(managenode)+"'><input type='hidden' name='tasknum' value='"+str(tasknum2)+"'>") webserver.addSubmitButton("Save task", "savetask") webserver.addButton("espnow","Back") webserver.TXBuffer += "</table></form>" webserver.sendHeadandTail("TmplStd",webserver._TAIL) return webserver.TXBuffer elif taskmode and str(managenode)!="": # display tasklist webserver.TXBuffer += "<form name='frmtask' method='post'><table class='normal'>" webserver.addFormHeader("ESPNow tasklist") tasks = [] confs = [] if str(managenode)=="local": #serial node webserver.addFormHeader("Serial node") commands.doExecuteCommand("serialcommand,espnow,tasklist",False) time.sleep(3) scmdarr = getlastseriallogs(30) else: # espnow node webserver.addFormHeader("Node: "+str(managenode)) commands.doExecuteCommand("espnowcommand,"+str(managenode)+",espnow,tasklist",False) time.sleep(3) scmdarr = [] for i in reversed(range(len(misc.ShadowLog))): if len(scmdarr)>=30: break if "espnow,tasklist" in misc.ShadowLog[i]["l"]: break if misc.ShadowLog[i]["lvl"]== rpieGlobals.LOG_LEVEL_DEBUG: if "ESPNOW:" in misc.ShadowLog[i]["l"]: scmdarr.append(misc.ShadowLog[i]["l"].replace("ESPNOW:","").strip()) if len(scmdarr)>0: for i in range(len(scmdarr)): if ",tasklist" in scmdarr[i]: break if "Task," in scmdarr[i]: tasks.append(scmdarr[i]) elif "Conf," in scmdarr[i]: confs.append(scmdarr[i]) tasknum = 0 tasknum2 = tasknum if len(tasks)>0: for i in reversed(range(len(tasks))): tasknum = len(tasks)-i try: if ("," in tasks[i]): ts = str(tasks[i]).split(",") tasknum2 = int(ts[1]) else: tasknum2 = int(tasks[i][1]) except: tasknum2 = int(tasknum) webserver.addFormSubHeader("Task "+str(tasknum2)) webserver.addSubmitButton("Delete task "+str(tasknum2), "del"+str(tasknum2)) displaytask(tasks[i],confs[i]) webserver.addFormSeparator(2) webserver.addHtml("<tr><td><input type='hidden' name='nodenum' value='"+str(managenode)+"'>") webserver.addSubmitButton("Add new task "+str(tasknum2+1), "add"+str(tasknum2+1)) webserver.addButton("espnow","Back") webserver.TXBuffer += "</table></form>" webserver.sendHeadandTail("TmplStd",webserver._TAIL) return webserver.TXBuffer elif str(managenode)=="": # display node list webserver.addFormHeader("ESPNow node list") webserver.TXBuffer += "<form name='frmespnow' method='post'><table class='multirow'><TR><TH>Select<TH>P2P node number<TH>Name<TH>Build<TH>Type<TH>MAC<TH>Last seen<TH>Capabilities" webserver.TXBuffer += "<TR>" webserver.TXBuffer += "<td><input type='radio' name='nodenum' value='local'>" webserver.TXBuffer +="<TD>serial<TD>local node<TD></TR>" if len(Settings.p2plist)>0: for n in Settings.p2plist: if str(n["protocol"]) == "ESPNOW": webserver.TXBuffer += "<TR>" webserver.TXBuffer += "<td><input type='radio' name='nodenum' value='"+ str(n["unitno"])+"'>" webserver.TXBuffer +="<TD>Unit "+str(n["unitno"])+"<TD>"+str(n["name"])+"<TD>"+str(n["build"])+"<TD>" ntype = "Unknown" if int(n["type"])==rpieGlobals.NODE_TYPE_ID_ESP_EASY_STD: ntype = "ESP Easy" elif int(n["type"])==rpieGlobals.NODE_TYPE_ID_ESP_EASYM_STD: ntype = "ESP Easy Mega" elif int(n["type"])==rpieGlobals.NODE_TYPE_ID_ESP_EASY32_STD: ntype = "ESP Easy32" elif int(n["type"])==rpieGlobals.NODE_TYPE_ID_ARDUINO_EASY_STD: ntype = "Arduino Easy" elif int(n["type"])==rpieGlobals.NODE_TYPE_ID_NANO_EASY_STD: ntype = "Nano Easy" elif int(n["type"])==rpieGlobals.NODE_TYPE_ID_RPI_EASY_STD: ntype = "RPI Easy" elif int(n["type"])==rpieGlobals.NODE_TYPE_ID_ATMEGA_EASY_LORA: ntype = "LoRa32u4" webserver.TXBuffer += ntype webserver.TXBuffer += "<TD>"+str(n["mac"]) ldt = n["lastseen"] lstr = "" try: lstr = ldt.strftime('%Y-%m-%d %H:%M:%S') except: lstr = str(ldt) webserver.TXBuffer += "<TD>"+lstr wm = int(n["cap"]) wms = "" if (wm & 1)==1: wms = "SEND " if (wm & 2)==2: wms += "RECEIVE " webserver.TXBuffer += "<TD>"+wms webserver.TXBuffer += "</table><br>" webserver.addSubmitButton("Manage selected node", "submit") webserver.addSubmitButton("Tasks on selected node", "tasks") webserver.addSubmitButton("I2C scan selected node", "i2c") webserver.addSubmitButton("Reboot selected node", "reboot") webserver.addSubmitButton("Set date and time on selected node", "time") webserver.TXBuffer += "<P>" webserver.addSubmitButton("Request all nodes to advertise itself", "search") webserver.TXBuffer += "<P>" webserver.addButton("espnow","Refresh") webserver.TXBuffer += "</form>" elif str(managenode)=="local": # display local settings page webserver.addFormHeader("Serial node management") webserver.TXBuffer += "<form name='manespnow' method='post'><table class='multirow'>" modenum = -1 for i in range(3): commands.doExecuteCommand("serialcommand,espnow,mode",False) time.sleep(0.5) scmdarr = getlastseriallogs(3) if len(scmdarr)>2: if ",mode" in scmdarr[2]: try: modenum = int(scmdarr[1]) break except: modenum = -1 if modenum!=-1: # valid number, process options = ["Gateway","Send only (remote config wont work!)","Receive only","Send&Receive"] optionvalues = [0,1,2,3] webserver.addFormSelector("Working mode","workmode",len(options),options,optionvalues,None,modenum) nodenum = -1 commands.doExecuteCommand("serialcommand,unit",False) time.sleep(1) scmdarr = getlastseriallogs(3) if len(scmdarr)>2: if "unit" in scmdarr[2]: nodenum = scmdarr[1].replace("SERIAL: ","").strip() try: nodenum = int(nodenum) except: nodenum = -1 if nodenum!=-1: webserver.addFormNumericBox("Unit number","nnodenum",nodenum,1,254) dnodenum = -1 commands.doExecuteCommand("serialcommand,espnow,dest",False) time.sleep(1) scmdarr = getlastseriallogs(3) if len(scmdarr)>2: if ",dest" in scmdarr[2]: dnodenum = scmdarr[1].replace("SERIAL: ","").strip() try: dnodenum = int(dnodenum) except: dnodenum = -1 webserver.addFormNumericBox("Destination node number","dnodenum",dnodenum,0,254) sdat = "" commands.doExecuteCommand("serialcommand,espnow,name",False) time.sleep(1) scmdarr = getlastseriallogs(3) if len(scmdarr)>2: if ",name" in scmdarr[2]: sdat = scmdarr[1].replace("SERIAL: ","").strip() webserver.addFormTextBox("Unit name","name",sdat,25) wchan = -1 commands.doExecuteCommand("serialcommand,espnow,chan",False) time.sleep(1) scmdarr = getlastseriallogs(3) if len(scmdarr)>2: if ",chan" in scmdarr[2]: wchan = scmdarr[1].replace("SERIAL: ","").strip() try: wchan = int(wchan) except: wchan = -1 if wchan!=-1: options = [] optionvalues = [] for i in range(1,14): options.append(str(i)) optionvalues.append(i) webserver.addFormSelector("Wifi channel","wchannel",len(options),options,optionvalues,None,wchan) ds = -1 commands.doExecuteCommand("serialcommand,espnow,deepsleep",False) time.sleep(1) scmdarr = getlastseriallogs(3) if len(scmdarr)>2: if ",deep" in scmdarr[2]: ds = scmdarr[1].replace("SERIAL: ","").strip() try: ds = int(ds) except: ds = -1 if ds != -1: webserver.addFormNumericBox("DeepSleep timeout","deepsleep",ds,0,4294) webserver.addUnit("s") webserver.addFormNote("0 means disabled state,1-4294 means deep sleep timout in sec") webserver.addHtml("<input type='hidden' name='nodenum' value='"+str(managenode)+"'>") webserver.addSubmitButton("Save settings", "savelocal") webserver.addButton("espnow","Back") webserver.TXBuffer += "</form>" # print(scmdarr,modenum) elif str(managenode)!="": # display remote settings page webserver.addFormHeader("Node management") # commands.doExecuteCommand("espnowcommand,"+str(managenode)+",espnow,name",False) webserver.TXBuffer += "<form name='manespnow' method='post'><table class='multirow'>" modenum = -1 for i in range(3): commands.doExecuteCommand("espnowcommand,"+str(managenode)+",espnow,mode",False) time.sleep(1) scmdarr = getlastespnowlogs(1) if len(scmdarr)>0: try: modenum = int(scmdarr[0]) break except: modenum = -1 if modenum!=-1: # valid number, process options = ["Gateway","Send only (remote config wont work!)","Receive only","Send&Receive"] optionvalues = [0,1,2,3] webserver.addFormSelector("Working mode","workmode",len(options),options,optionvalues,None,modenum) nodenum = -1 commands.doExecuteCommand("espnowcommand,"+str(managenode)+",unit",False) time.sleep(2) scmdarr = getlastespnowlogs(1) if len(scmdarr)>0: try: nodenum = int(scmdarr[0]) except: nodenum = -1 webserver.addFormNumericBox("Unit number","nnodenum",nodenum,1,254) dnodenum = -1 commands.doExecuteCommand("espnowcommand,"+str(managenode)+",espnow,dest",False) time.sleep(2) scmdarr = getlastespnowlogs(1) if len(scmdarr)>0: try: dnodenum = int(scmdarr[0]) except: dnodenum = -1 webserver.addFormNumericBox("Destination node number","dnodenum",dnodenum,0,254) webserver.addFormNote("If destination is not the same as your UNIT number ("+str(Settings.Settings["Unit"])+") you will NOT get any data from this remote!!!") sdat = "" commands.doExecuteCommand("espnowcommand,"+str(managenode)+",espnow,name",False) time.sleep(3) scmdarr = getlastespnowlogs(1) if len(scmdarr)>0: sdat = scmdarr[0] webserver.addFormTextBox("Unit name","name",sdat,25) wchan = -1 commands.doExecuteCommand("espnowcommand,"+str(managenode)+",espnow,chan",False) time.sleep(2) scmdarr = getlastespnowlogs(1) if len(scmdarr)>0: try: wchan = int(scmdarr[0]) except: wchan = -1 options = [] optionvalues = [] for i in range(1,14): options.append(str(i)) optionvalues.append(i) webserver.addFormSelector("Wifi channel","wchannel",len(options),options,optionvalues,None,wchan) ds = 0 commands.doExecuteCommand("espnowcommand,"+str(managenode)+",espnow,deepsleep",False) time.sleep(2) scmdarr = getlastespnowlogs(1) if len(scmdarr)>0: try: ds = int(scmdarr[0]) except: ds = 0 webserver.addFormNumericBox("DeepSleep timeout","deepsleep",ds,0,4294) webserver.addUnit("s") webserver.addFormNote("0 means disabled state,1-4294 means deep sleep timout in sec") webserver.addHtml("<input type='hidden' name='nodenum' value='"+str(managenode)+"'>") webserver.addSubmitButton("Save settings", "savenode") webserver.addButton("espnow","Back") webserver.TXBuffer += "</form>" # print(str(managenode)) webserver.sendHeadandTail("TmplStd",webserver._TAIL) return webserver.TXBuffer except Exception as e: print(e) return ""
def pkt_receiver(self,payload): if self.enabled: while len(payload)>0: dp = p2pbuffer.data_packet() dp.buffer = payload dp.decode() # print(dp.pktlen," T:",dp.pkgtype," FL:",len(payload)," PL:",dp.pktlen) # print("DATA ARRIVED ",payload,dp.buffer) if int(dp.pkgtype)!=0: if dp.pkgtype==1: if int(dp.infopacket["unitno"]) == int(Settings.Settings["Unit"]): # skip own messages return False un = getunitordfromnum(dp.infopacket["unitno"]) # process incoming alive reports if un==-1: # CAPABILITIES byte: first bit 1 if able to send, second bit 1 if able to receive Settings.p2plist.append({"protocol":"ESPNOW","unitno":dp.infopacket["unitno"],"name":dp.infopacket["name"],"build":dp.infopacket["build"],"type":dp.infopacket["type"],"mac":dp.infopacket["mac"],"lastseen":datetime.now(),"lastrssi":"","cap":dp.infopacket["cap"]}) misc.addLog(rpieGlobals.LOG_LEVEL_INFO,"New ESPNOW unit discovered: "+str(dp.infopacket["unitno"])+" "+str(dp.infopacket["name"])) Settings.p2plist.sort(reverse=False,key=self.nodesort) else: misc.addLog(rpieGlobals.LOG_LEVEL_DEBUG,"Unit alive: "+str(dp.infopacket["unitno"])) if Settings.p2plist[un]["type"]==0: Settings.p2plist[un]["name"] = dp.infopacket["name"] Settings.p2plist[un]["build"] = dp.infopacket["build"] Settings.p2plist[un]["type"] = dp.infopacket["type"] Settings.p2plist[un]["mac"] = dp.infopacket["mac"] Settings.p2plist[un]["cap"] = dp.infopacket["cap"] Settings.p2plist[un]["lastseen"] = datetime.now() elif dp.pkgtype==5: # process incoming data if int(dp.sensordata["sunit"])==int(Settings.Settings["Unit"]): return False un = getunitordfromnum(dp.sensordata["sunit"]) if un>-1: # refresh lastseen data Settings.p2plist[un]["lastseen"] = datetime.now() else: Settings.p2plist.append({"protocol":"ESPNOW","unitno":dp.sensordata["sunit"],"name":"","build":0,"type":0,"mac":"","lastseen":datetime.now(),"lastrssi":"","cap":1}) if (int(Settings.Settings["Unit"])==int(dp.sensordata["dunit"])) or (0==int(dp.sensordata["dunit"])): # process only if we are the destination or broadcast ltaskindex = -1 for x in range(0,len(Settings.Tasks)): # check if the sent IDX already exists? try: if (type(Settings.Tasks[x]) is not bool and Settings.Tasks[x]): if Settings.Tasks[x].controlleridx[self.controllerindex]==int(dp.sensordata["idx"]): ltaskindex = x break except Exception as e: print(e) dvaluecount = int(dp.sensordata["valuecount"]) if rpieGlobals.VARS_PER_TASK<dvaluecount: # avoid possible buffer overflow dvaluecount = rpieGlobals.VARS_PER_TASK if ltaskindex < 0: # create new task if necessarry devtype = int(dp.sensordata["pluginid"]) m = False try: for y in range(len(rpieGlobals.deviceselector)): if int(rpieGlobals.deviceselector[y][1]) == devtype: m = __import__(rpieGlobals.deviceselector[y][0]) break except: m = False TempEvent = None if m: try: TempEvent = m.Plugin(-1) except: TempEvent = None if True: ltaskindex = -1 for x in range(0,len(Settings.Tasks)): # check if there are free TaskIndex slot exists try: if (type(Settings.Tasks[x]) is bool): if Settings.Tasks[x]==False: ltaskindex = x break except: pass devtype = 33 # dummy device m = False try: for y in range(len(rpieGlobals.deviceselector)): if int(rpieGlobals.deviceselector[y][1]) == devtype: m = __import__(rpieGlobals.deviceselector[y][0]) break except: m = False if m: if ltaskindex<0: ltaskindex = len(Settings.Tasks) try: Settings.Tasks[ltaskindex] = m.Plugin(ltaskindex) except: ltaskindex = len(Settings.Tasks) Settings.Tasks.append(m.Plugin(ltaskindex)) # add a new device Settings.Tasks[ltaskindex].plugin_init(True) Settings.Tasks[ltaskindex].remotefeed = int(dp.sensordata["sunit"]) # True # Mark that this task accepts incoming data updates! Settings.Tasks[ltaskindex].enabled = True Settings.Tasks[ltaskindex].interval = 0 Settings.Tasks[ltaskindex].senddataenabled[self.controllerindex]=True Settings.Tasks[ltaskindex].controlleridx[self.controllerindex]=int(dp.sensordata["idx"]) if TempEvent is not None: Settings.Tasks[ltaskindex].taskname = TempEvent.PLUGIN_NAME.replace(" ","") for v in range(dvaluecount): Settings.Tasks[ltaskindex].valuenames[v] = TempEvent.valuenames[v] Settings.Tasks[ltaskindex].taskdevicepluginconfig[0] = TempEvent.vtype Settings.Tasks[ltaskindex].vtype = TempEvent.vtype else: Settings.Tasks[ltaskindex].taskname = Settings.Tasks[ltaskindex].PLUGIN_NAME.replace(" ","") Settings.Tasks[ltaskindex].valuecount = dvaluecount Settings.savetasks() if ltaskindex<0: return False misc.addLog(rpieGlobals.LOG_LEVEL_DEBUG,"Sensordata update arrived from unit "+str(dp.sensordata["sunit"])) # save received values if Settings.Tasks[ltaskindex].remotefeed: for v in range(dvaluecount): Settings.Tasks[ltaskindex].set_value(v+1,dp.sensordata["values"][v],False) Settings.Tasks[ltaskindex].plugin_senddata() elif dp.pkgtype==7: # process incoming command if int(dp.cmdpacket["sunit"])==int(Settings.Settings["Unit"]): return False un = getunitordfromnum(dp.cmdpacket["sunit"]) if un>-1: # refresh lastseen data Settings.p2plist[un]["lastseen"] = datetime.now() else: Settings.p2plist.append({"protocol":"ESPNOW","unitno":dp.cmdpacket["sunit"],"name":"","build":0,"type":0,"mac":"","lastseen":datetime.now(),"lastrssi":"","cap":1}) if (int(Settings.Settings["Unit"])==int(dp.cmdpacket["dunit"])) or (0==int(dp.cmdpacket["dunit"])): # process only if we are the destination or broadcast misc.addLog(rpieGlobals.LOG_LEVEL_INFO,"Command arrived from "+str(dp.cmdpacket["sunit"])) commands.doExecuteCommand(dp.cmdpacket["cmdline"],True) elif dp.pkgtype==8: # process incoming text/log if int(dp.cmdpacket["sunit"])==int(Settings.Settings["Unit"]): return False un = getunitordfromnum(dp.cmdpacket["sunit"]) if un>-1: # refresh lastseen data Settings.p2plist[un]["lastseen"] = datetime.now() else: Settings.p2plist.append({"protocol":"ESPNOW","unitno":dp.cmdpacket["sunit"],"name":"","build":0,"type":0,"mac":"","lastseen":datetime.now(),"lastrssi":"","cap":1}) if (int(Settings.Settings["Unit"])==int(dp.cmdpacket["dunit"])) or (0==int(dp.cmdpacket["dunit"])): # process only if we are the destination or broadcast misc.addLog(rpieGlobals.LOG_LEVEL_DEBUG,"ESPNOW: "+str(dp.cmdpacket["cmdline"])) payload = payload[dp.pktlen:-1] else: payload = payload[1:-1]
def periodic_check(self): if self.enabled and self._started and self.cbinprogress == False: self.cbinprogress = True self._dp.clear() address = "" try: self._dp.buffer, address = self._s.recvfrom(1024) except: pass pok = False try: if len(self._dp.buffer) > 2 and int(self._dp.buffer[0]) != 0: pok = True except Exception as e: pass if pok: try: # print("buf",pok,self._dp.buffer,address) self._dp.decode() # print(self._dp.infopacket) if self._dp.pkgtype == 1: un = getunitordfromnum( self._dp.infopacket["unitno"] ) # process incoming alive reports if un == -1: settings.nodelist.append({ "unitno": self._dp.infopacket["unitno"], "name": self._dp.infopacket["name"], "build": self._dp.infopacket["build"], "type": self._dp.infopacket["type"], "ip": self._dp.infopacket["ip"], "port": self._dp.infopacket["port"], "age": 0 }) misc.addLog( pglobals.LOG_LEVEL_INFO, "New P2P unit discovered: " + str(self._dp.infopacket["unitno"]) + " " + str(self._dp.infopacket["ip"]) + " " + str(self._dp.infopacket["mac"])) settings.nodelist.sort(reverse=False, key=self.nodesort) else: settings.nodelist[un]["age"] = 0 settings.nodelist[un]["ip"] = self._dp.infopacket[ "ip"] settings.nodelist[un][ "port"] = self._dp.infopacket["port"] settings.nodelist[un][ "name"] = self._dp.infopacket["name"] if int(self._dp.infopacket["unitno"]) != int( settings.Settings["Unit"]): misc.addLog( pglobals.LOG_LEVEL_DEBUG, "Unit alive: " + str(self._dp.infopacket["unitno"])) elif self._dp.pkgtype == 3: # process incoming new devices if int(settings.Settings["Unit"]) == int( self._dp.sensorinfo["dunit"] ): # process only if we are the destination rtaskindex = int(self._dp.sensorinfo["dti"]) if len( settings.Tasks ) <= rtaskindex or settings.Tasks[ rtaskindex] == False: # continue only if taskindex is empty misc.addLog( pglobals.LOG_LEVEL_DEBUG, "Sensorinfo arrived from unit " + str(self._dp.sensorinfo["sunit"])) devtype = 33 for x in range(len(pglobals.deviceselector)): if int(pglobals.deviceselector[x] [1]) == int( self._dp.sensorinfo["dnum"]): devtype = int( self._dp.sensorinfo["dnum"]) break m = False try: for y in range(len( pglobals.deviceselector)): if int(pglobals.deviceselector[y] [1]) == devtype: if len(settings.Tasks ) <= rtaskindex: while len(settings.Tasks ) <= rtaskindex: settings.Tasks.append( False) m = __import__( pglobals.deviceselector[y][0]) break except: m = False if m: try: settings.Tasks[rtaskindex] = m.Plugin( rtaskindex) except: settings.Tasks.append( m.Plugin(rtaskindex)) settings.Tasks[rtaskindex].plugin_init( False) settings.Tasks[ rtaskindex].remotefeed = True # Mark that this task accepts incoming data updates! settings.Tasks[ rtaskindex].taskname = self._dp.sensorinfo[ "taskname"] for v in range(4): self._dp.sensorinfo[ "valuenames"].append("") for v in range(settings.Tasks[rtaskindex]. valuecount): settings.Tasks[rtaskindex].valuenames[ v] = self._dp.sensorinfo[ "valuenames"][v] elif self._dp.pkgtype == 5: # process incoming data if int(settings.Settings["Unit"]) == int( self._dp.sensordata["dunit"] ): # process only if we are the destination rtaskindex = int(self._dp.sensordata["dti"]) if len( settings.Tasks ) > rtaskindex and settings.Tasks[ rtaskindex] and settings.Tasks[ rtaskindex].remotefeed: # continue only if taskindex exists and accepts incoming datas misc.addLog( pglobals.LOG_LEVEL_DEBUG, "Sensordata update arrived from unit " + str(self._dp.sensordata["sunit"])) recok = False try: if self._onmsgcallbackfunc is not None and settings.Tasks[ rtaskindex].recdataoption: self._onmsgcallbackfunc( self.controllerindex, -1, self._dp.sensordata["values"], settings.Tasks[rtaskindex]. gettaskname()) recok = True except: pass if recok == False: for v in range(settings.Tasks[rtaskindex]. valuecount): settings.Tasks[rtaskindex].set_value( v + 1, self._dp.sensordata["values"][v], False) settings.Tasks[rtaskindex].plugin_senddata( ) elif self._dp.pkgtype == 0: misc.addLog(pglobals.LOG_LEVEL_INFO, "Command arrived from " + str(address)) try: cmdline = decodezerostr(self._dp.buffer) except: cmdline = "" if len(cmdline) > 1: commands.doExecuteCommand(cmdline, True) except Exception as e: print("c13loop", e) self.cbinprogress = False return self.onmsgcallbacksupported
def pkt_receiver(self, payload): if self.enabled: try: rssi = self._lora.packet_rssi() except: rssi = -100 try: dp = p2pbuffer.data_packet() dp.buffer = payload dp.decode() # print("REC",payload,dp.buffer) #debug except: pass try: if dp.pkgtype != 0: if dp.pkgtype == 1: # print(dp.infopacket) if int(dp.infopacket["unitno"]) == int( settings.Settings["Unit"] ): # skip own messages return False un = getunitordfromnum( dp.infopacket["unitno"] ) # process incoming alive reports if un == -1: # CAPABILITIES byte: first bit 1 if able to send, second bit 1 if able to receive settings.p2plist.append({ "protocol": "LORA", "unitno": dp.infopacket["unitno"], "name": dp.infopacket["name"], "build": dp.infopacket["build"], "type": dp.infopacket["type"], "mac": dp.infopacket["mac"], "lastseen": utime.localtime(), "lastrssi": rssi, "cap": dp.infopacket["cap"] }) misc.addLog( pglobals.LOG_LEVEL_INFO, "New LORA unit discovered: " + str(dp.infopacket["unitno"]) + " " + str(dp.infopacket["name"])) settings.p2plist.sort(reverse=False, key=self.nodesort) else: misc.addLog( pglobals.LOG_LEVEL_DEBUG, "Unit alive: " + str(dp.infopacket["unitno"])) if settings.p2plist[un]["type"] == 0: settings.p2plist[un]["name"] = dp.infopacket[ "name"] settings.p2plist[un]["build"] = dp.infopacket[ "build"] settings.p2plist[un]["type"] = dp.infopacket[ "type"] settings.p2plist[un]["mac"] = dp.infopacket[ "mac"] settings.p2plist[un]["cap"] = dp.infopacket["cap"] settings.p2plist[un]["lastseen"] = utime.localtime( ) settings.p2plist[un]["lastrssi"] = rssi elif dp.pkgtype == 5: # process incoming data if int(dp.sensordata["sunit"]) == int( settings.Settings["Unit"]): return False un = getunitordfromnum(dp.sensordata["sunit"]) if un > -1: # refresh lastseen data settings.p2plist[un]["lastseen"] = utime.localtime( ) settings.p2plist[un]["lastrssi"] = rssi else: settings.p2plist.append({ "protocol": "LORA", "unitno": dp.sensordata["sunit"], "name": "", "build": 0, "type": 0, "mac": "", "lastseen": utime.localtime(), "lastrssi": rssi, "cap": 1 }) if (int(settings.Settings["Unit"]) == int( dp.sensordata["dunit"] )) or ( 0 == int(dp.sensordata["dunit"]) ): # process only if we are the destination or broadcast ltaskindex = -1 for x in range( 0, len(settings.Tasks) ): # check if the sent IDX already exists? try: if (type(settings.Tasks[x]) is not bool and settings.Tasks[x]): if settings.Tasks[x].controlleridx[ self.controllerindex] == int( dp.sensordata["idx"]): ltaskindex = x break except Exception as e: print(e) dvaluecount = int(dp.sensordata["valuecount"]) if pglobals.VARS_PER_TASK < dvaluecount: # avoid possible buffer overflow dvaluecount = pglobals.VARS_PER_TASK if ltaskindex < 0: # create new task if necessarry devtype = int(dp.sensordata["pluginid"]) m = False try: for y in range(len( pglobals.deviceselector)): if int(pglobals.deviceselector[y] [1]) == devtype: m = __import__( pglobals.deviceselector[y][0]) break except: m = False TempEvent = None if m: try: TempEvent = m.Plugin(-1) except: TempEvent = None if True: ltaskindex = -1 for x in range( 0, len(settings.Tasks) ): # check if there are free TaskIndex slot exists try: if (type(settings.Tasks[x]) is bool): if settings.Tasks[x] == False: ltaskindex = x break except: pass devtype = 33 # dummy device m = False try: for y in range( len(pglobals.deviceselector)): if int(pglobals.deviceselector[y] [1]) == devtype: m = __import__( pglobals.deviceselector[y] [0]) break except: m = False if m: if ltaskindex < 0: ltaskindex = len(settings.Tasks) try: settings.Tasks[ ltaskindex] = m.Plugin( ltaskindex) except: ltaskindex = len(settings.Tasks) settings.Tasks.append( m.Plugin(ltaskindex) ) # add a new device settings.Tasks[ltaskindex].plugin_init( True) settings.Tasks[ ltaskindex].remotefeed = True # Mark that this task accepts incoming data updates! settings.Tasks[ ltaskindex].enabled = True settings.Tasks[ltaskindex].interval = 0 settings.Tasks[ ltaskindex].senddataenabled[ self.controllerindex] = True settings.Tasks[ ltaskindex].controlleridx[ self.controllerindex] = int( dp.sensordata["idx"]) if TempEvent is not None: settings.Tasks[ ltaskindex].taskname = TempEvent.PLUGIN_NAME.replace( " ", "") for v in range(dvaluecount): settings.Tasks[ ltaskindex].valuenames[ v] = TempEvent.valuenames[ v] settings.Tasks[ ltaskindex].taskdevicepluginconfig[ 0] = TempEvent.vtype settings.Tasks[ ltaskindex].vtype = TempEvent.vtype else: settings.Tasks[ ltaskindex].taskname = settings.Tasks[ ltaskindex].PLUGIN_NAME.replace( " ", "") settings.Tasks[ ltaskindex].valuecount = dvaluecount settings.savetasks() if ltaskindex < 0: return False misc.addLog( pglobals.LOG_LEVEL_DEBUG, "Sensordata update arrived from unit " + str(dp.sensordata["sunit"]) ) # save received values if settings.Tasks[ltaskindex].remotefeed: recok = False try: if self._onmsgcallbackfunc is not None and settings.Tasks[ ltaskindex].recdataoption: self._onmsgcallbackfunc( self.controllerindex, -1, self._dp.sensordata["values"], settings.Tasks[ltaskindex]. gettaskname()) recok = True except: pass if recok == False: for v in range(dvaluecount): settings.Tasks[ltaskindex].set_value( v + 1, dp.sensordata["values"][v], False) settings.Tasks[ltaskindex].plugin_senddata( ) elif dp.pkgtype == 7: # process incoming command if int(dp.cmdpacket["sunit"]) == int( settings.Settings["Unit"]): return False un = getunitordfromnum(dp.cmdpacket["sunit"]) if un > -1: # refresh lastseen data settings.p2plist[un]["lastseen"] = utime.localtime( ) settings.p2plist[un]["lastrssi"] = rssi else: settings.p2plist.append({ "protocol": "LORA", "unitno": dp.cmdpacket["sunit"], "name": "", "build": 0, "type": 0, "mac": "", "lastseen": utime.localtime(), "lastrssi": rssi, "cap": 1 }) if (int(settings.Settings["Unit"]) == int( dp.cmdpacket["dunit"] )) or ( 0 == int(dp.cmdpacket["dunit"]) ): # process only if we are the destination or broadcast misc.addLog( pglobals.LOG_LEVEL_INFO, "Command arrived from " + str(dp.cmdpacket["sunit"])) # print(dp.cmdpacket["cmdline"]) # DEBUG commands.doExecuteCommand(dp.cmdpacket["cmdline"], True) except Exception as e: print("C20 decode error", str(e))