Пример #1
0
 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
Пример #2
0
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 = ""
Пример #3
0
    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)
Пример #4
0
 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
Пример #5
0
 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
Пример #6
0
    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
Пример #7
0
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 = ""
Пример #8
0
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]+"&#13;&#10;"
    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 ""
Пример #9
0
 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]
Пример #10
0
    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
Пример #11
0
    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))