예제 #1
0
 def webform_load(self):  # create html page for settings
     webserver.addFormNote(
         "1st GPIO=CLK, 2nd GPIO=DT, BOTH of them needs to be INPUT-PULLUP")
     choice1 = int(float(self.taskdevicepluginconfig[0]))
     options = ["1", "2", "3", "4"]
     optionvalues = [1, 2, 3, 4]
     webserver.addFormSelector("Step", "p059_step", len(options), options,
                               optionvalues, None, choice1)
     try:
         minv = int(self.taskdevicepluginconfig[1])
     except:
         minv = 0
     webserver.addFormNumericBox("Limit min.", "p059_min", minv, -65535,
                                 65535)
     try:
         maxv = int(self.taskdevicepluginconfig[2])
     except:
         maxv = 100
     if minv >= maxv:
         maxv = minv + 1
     webserver.addFormNumericBox("Limit max.", "p059_max", maxv, -65535,
                                 65535)
     try:
         bt = int(self.taskdevicepluginconfig[3])
     except:
         bt = 10
     webserver.addFormNumericBox("GPIO bounce time", "p059_bounce", bt, 0,
                                 1000)
     webserver.addUnit("ms")
     return True
예제 #2
0
 def webform_load(self): # create html page for settings
  choice1 = self.taskdevicepluginconfig[0]
  options = ["0x68","0x69"]
  optionvalues = [0x68,0x69]
  webserver.addFormSelector("I2C address","p045_address",len(optionvalues),options,optionvalues,None,int(choice1))
  webserver.addFormNote("Enable <a href='pinout'>I2C bus</a> first, than <a href='i2cscanner'>search for the used address</a>!")
  webserver.addFormPinSelect("Interrupt pin","p045_int_pin",self.taskdevicepin[0])
  webserver.addFormNote("Set an Input-PULLUP pin to INT pin and connect it for fastest results. (optional)")
  choice2 = int(self.taskdevicepluginconfig[1])
  options = ["Movement detection","Acceleration X","Acceleration Y","Acceleration Z","G-force X","G-force Y","G-force Z"]
  optionvalues = [0,4,5,6,7,8,9]
  webserver.addFormSelector("Type","p045_function",len(optionvalues),options,optionvalues,None,choice2)
  if choice2==0:
   webserver.addHtml("<TR><TD><TD>The thresholdvalues (-65535 to 65535, except 0) can be used to set a threshold for one or more<br>")
   webserver.addHtml("axis. The axis will trigger when the range for that axis exceeds the threshold<br>")
   webserver.addHtml("value. A value of 0 disables movement detection for that axis.")
   webserver.addFormNumericBox("Detection threshold X", "p045_threshold_x", self.taskdevicepluginconfig[2], -65535, 65535)
   webserver.addFormNumericBox("Detection threshold Y", "p045_threshold_y", self.taskdevicepluginconfig[3], -65535, 65535)
   webserver.addFormNumericBox("Detection threshold Z", "p045_threshold_z", self.taskdevicepluginconfig[4], -65535, 65535)
   webserver.addFormNumericBox("Min movement time", "p045_threshold_window", self.taskdevicepluginconfig[6], 0, 120)
   webserver.addUnit("s")
  else: # pos
   choice5 = int(self.taskdevicepluginconfig[7])
   options = ["Nothing","Acceleration X","Acceleration Y","Acceleration Z","G-force X","G-force Y","G-force Z"]
   optionvalues = [0,4,5,6,7,8,9]
   webserver.addFormSelector("Type","p045_function2",len(optionvalues),options,optionvalues,None,choice5)
   choice6 = int(self.taskdevicepluginconfig[8])
   webserver.addFormSelector("Type","p045_function3",len(optionvalues),options,optionvalues,None,choice6)
  if self.enabled and self.initialized:
   try:
    webserver.addFormNote("Accel x:"+str(self.mpu.ax)+", y:"+str(self.mpu.ay)+", z:"+str(self.mpu.az))
    webserver.addFormNote("Gyro x:"+str(self.mpu.gx)+", y:"+str(self.mpu.gy)+", z:"+str(self.mpu.gz))
   except:
    pass
  return True
예제 #3
0
 def webform_load(self):  # create html page for settings
     bledevs = BLEHelper.find_hci_devices()
     options = []
     optionvalues = []
     if bledevs:
         for bd in bledevs:
             options.append(bd)
             try:
                 optionvalues.append(int(bd[3:]))
             except:
                 optionvalues.append(bd[3:])
     webserver.addFormSelector("Local Device", "plugin_520_dev",
                               len(options), options, optionvalues, None,
                               int(self.taskdevicepluginconfig[2]))
     webserver.addFormTextBox("Remote Device Address", "plugin_520_addr",
                              str(self.taskdevicepluginconfig[0]), 20)
     webserver.addFormCheckBox("Add RSSI value for non-Domoticz system",
                               "plugin_520_rssi",
                               self.taskdevicepluginconfig[1])
     webserver.addFormNote(
         "For Domoticz it's integrated with online value!")
     webserver.addFormFloatNumberBox("Timeout", "plugin_520_tout",
                                     float(self.taskdevicepluginconfig[3]),
                                     0, 60)
     webserver.addUnit("s")
     options = ["State", "State or RSSI"]
     optionvalues = ["0", "1"]
     webserver.addFormSelector("Report on change of", "plugin_520_rep",
                               len(options), options, optionvalues, None,
                               int(self.taskdevicepluginconfig[4]))
     return True
예제 #4
0
 def webform_load(self):  # create html page for settings
     webserver.addFormTextBox("Controller Publish", "inchannel",
                              self.inchannel, 255)
     webserver.addFormTextBox("Controller Subscribe", "outchannel",
                              self.outchannel, 255)
     try:
         kp = self.keepalive
     except:
         kp = 60
     webserver.addFormNumericBox("Keepalive time", "keepalive", kp, 2, 600)
     webserver.addUnit("s")
     try:
         am = self.authmode
         fname = self.certfile
     except:
         am = 0
         fname = ""
     options = ["MQTT", "MQTTS/with cert", "MQTTS/insecure"]
     optionvalues = [0, 1, 2]
     webserver.addFormSelector("Mode", "c002_mode", len(optionvalues),
                               options, optionvalues, None, int(am))
     webserver.addFormTextBox("Server certificate file", "c002_cert",
                              str(fname), 120)
     webserver.addBrowseButton("Browse", "c002_cert", startdir=str(fname))
     webserver.addFormNote(
         "Upload certificate first at <a href='filelist'>filelist</a> then select here!"
     )
     return True
예제 #5
0
 def webform_load(self):
     webserver.addFormTextBox("Remote station address", "plugin_126_addr",
                              str(self.taskdevicepluginconfig[0]), 128)
     webserver.addFormFloatNumberBox("Timeout", "plugin_126_timeout",
                                     float(self.taskdevicepluginconfig[1]),
                                     0, 20)
     webserver.addUnit("s")
     webserver.addFormNote("Ping3 icmp will only work with ROOT rights!")
     return True
예제 #6
0
 def webform_load(self):  # create html page for settings
     webserver.addFormTextBox("Device Address", "plugin_510_itagaddr",
                              str(self.taskdevicepluginconfig[0]), 20)
     webserver.addFormNote(
         "Enable blueetooth then <a href='blescanner'>scan iTag address</a> first."
     )
     webserver.addFormNumericBox("Reconnect time", "plugin_510_reconnect",
                                 self.taskdevicepluginconfig[1], 5, 240)
     webserver.addUnit("s")
     return True
예제 #7
0
 def webform_load(self):
     webserver.addFormNote("Select an input pin.")
     tol = self.taskdevicepluginconfig[0]
     try:
         tol = int(tol)
     except:
         tol = 0
     if tol == 0:
         tol = 60
     webserver.addFormNumericBox("Signal decoding tolerance",
                                 "p111_tolerance", tol, 1, 200)
     webserver.addUnit("%")
     return True
예제 #8
0
 def webform_load(self): # create html page for settings
  global analogpins,realanalog,rpiok
  if realanalog:
   self.taskdevicepluginconfig[0] = 0
   webserver.addHtml("<tr><td>Analog input pin:<td>")
   webserver.addSelector_Head("p002_ain",False)
   for d in range(len(analogpins)):
    webserver.addSelector_Item(analogpins[d][1],analogpins[d][0],(self.taskdevicepluginconfig[1]==analogpins[d][0]),False)
   webserver.addSelector_Foot()
  elif rpiok:
   webserver.addFormNote("Pin1 is A, Pin2 is B, for wiring, see <a href='https://github.com/simonmonk/pi_analog'>https://github.com/simonmonk/pi_analog</a>")
   choice0 = self.taskdevicepluginconfig[0]
   options = ["Analog","Resistance","Thermistor"]
   optionvalues = [0,1,2]
   webserver.addFormSelector("Result Type","p002_type",len(options),options,optionvalues,None,choice0)
   webserver.addFormFloatNumberBox("C1 capacitor", "p002_c1", self.taskdevicepluginconfig[1], 0, 1000000.0)
   webserver.addUnit("uF")
   webserver.addFormNumericBox("R1 resistor","p002_r1",self.taskdevicepluginconfig[2])
   webserver.addUnit("Ohm")
   webserver.addFormFloatNumberBox("Vt voltage (digital HIGH level)", "p002_vt", self.taskdevicepluginconfig[3], 0, 3.3)
   webserver.addUnit("V")
   webserver.addFormNote("Settings below are only valid for thermistor type!")
   webserver.addFormNumericBox("Thermistor resistance","p002_tr",self.taskdevicepluginconfig[4])
   webserver.addUnit("Ohm")
   webserver.addFormNumericBox("Thermistor Beta","p002_tb",self.taskdevicepluginconfig[5])
  return True
예제 #9
0
 def webform_load(self):  # create html page for settings
     webserver.addFormNote(
         "1st GPIO is <b>Trigger</b> pin which has to be an output, and 2nd GPIO is the <b>Echo</b> pin which has to be an input!<br>Make sure to set it up at <a href='pinout'>Pinout settings</a> first! <br>And do not forget about 5V->3.3V level shifting when connecting them!"
     )
     webserver.addFormNumericBox("Samples", "p013_samples",
                                 self.taskdevicepluginconfig[0], 1, 30)
     webserver.addFormNote("Number of readings at once, that are averaged.")
     webserver.addFormNumericBox("Cooldown time between samples",
                                 "p013_ctime",
                                 self.taskdevicepluginconfig[1], 10, 1000)
     webserver.addUnit("ms")
     webserver.addFormNote(
         "Waiting before starting the next sample reading. (100ms recommended)"
     )
     return True
예제 #10
0
 def webform_load(self):  # create html page for settings
     webserver.addFormTextBox("Device Address", "plugin_513_addr",
                              str(self.taskdevicepluginconfig[0]), 20)
     webserver.addFormNote(
         "Enable blueetooth then <a href='blescanner'>scan LYWSD02 address</a> first."
     )
     webserver.addFormNote(
         "This plugin may not work well with ble scanner plugin.")
     webserver.addFormCheckBox("Add Battery value for non-Domoticz system",
                               "plugin_513_bat",
                               self.taskdevicepluginconfig[1])
     webserver.addFormCheckBox("Set LYWSD time at startup", "plugin_513_t",
                               self.taskdevicepluginconfig[2])
     webserver.addFormNumericBox(
         "Force to release BLE queue if blocked for x seconds",
         "plugin_513_free", self.taskdevicepluginconfig[3], 5, 240)
     webserver.addUnit('s')
     return True
예제 #11
0
 def webform_load(self):  # create html page for settings
     choice1 = int(float(
         self.taskdevicepluginconfig[0]))  # store i2c address
     optionvalues = []
     for i in range(0x40, 0x78):
         optionvalues.append(i)
     options = []
     for i in range(len(optionvalues)):
         options.append(str(hex(optionvalues[i])))
     webserver.addFormSelector("Address", "p022_adr", len(options), options,
                               optionvalues, None, choice1)
     webserver.addFormNote(
         "Enable <a href='pinout'>I2C bus</a> first, than <a href='i2cscanner'>search for the used address</a>!"
     )
     webserver.addFormNumericBox("Frequency", "p022_freq",
                                 self.taskdevicepluginconfig[2],
                                 self.MIN_FREQUENCY, self.MAX_FREQUENCY)
     webserver.addUnit("Hz")
     return True
예제 #12
0
 def webform_load(self): # create html page for settings
  bledevs = BLEHelper.find_hci_devices()
  options = []
  optionvalues = []
  if bledevs:
   for bd in bledevs:
    options.append(bd)
    try:
     optionvalues.append(int(bd[3:]))
    except:
     optionvalues.append(bd[3:])
  webserver.addFormSelector("Local Device","plugin_510_dev",len(options),options,optionvalues,None,int(self.taskdevicepluginconfig[3]))
  webserver.addFormTextBox("Device Address","plugin_510_itagaddr",str(self.taskdevicepluginconfig[0]),20)
  webserver.addFormNote("Enable blueetooth then <a href='blescanner'>scan iTag address</a> first.")
  webserver.addFormNote("This plugin needs continous connection so WILL NOT WORK WITH scanner plugin on the same dongle!")
  webserver.addFormNumericBox("Reconnect time","plugin_510_reconnect",self.taskdevicepluginconfig[1],5,240)
  webserver.addUnit("s")
  options = ["Button+Connection","Button","Connection"]
  optionvalues = [0,1,2]
  webserver.addFormSelector("Return state of","plugin_510_ret",len(options),options,optionvalues,None,self.taskdevicepluginconfig[2])
  return True
예제 #13
0
 def webform_load(self):  # create html page for settings
     webserver.addFormTextBox("Report topic", "inchannel", self.inchannel,
                              255)
     webserver.addFormTextBox("Command topic", "outchannel",
                              self.outchannel, 255)
     try:
         kp = self.keepalive
     except:
         kp = 60
     webserver.addFormNumericBox("Keepalive time", "keepalive", kp, 2, 600)
     webserver.addUnit("s")
     try:
         am = self.authmode
         fname = self.certfile
     except:
         am = 0
         fname = ""
     options = ["MQTT", "MQTTS/with cert", "MQTTS/insecure"]
     optionvalues = [0, 1, 2]
     webserver.addFormSelector("Mode", "c014_mode", len(optionvalues),
                               options, optionvalues, None, int(am))
     webserver.addFormTextBox("Server certificate file", "c014_cert",
                              str(fname), 120)
     webserver.addBrowseButton("Browse", "c014_cert", startdir=str(fname))
     webserver.addFormNote(
         "Upload certificate first at <a href='filelist'>filelist</a> then select here!"
     )
     try:
         lwt = self.lwt_topic
         lwt1 = self.lwtconnmsg
         lwt2 = self.lwtdisconnmsg
     except:
         lwt = "%sysname%/LWT"
         lwt1 = "Online"
         lwt2 = "Offline"
     webserver.addFormTextBox("Controller lwl topic", "c014_lwt", lwt, 255)
     webserver.addFormTextBox("LWT Connect Message", "c014_cmsg", lwt1, 255)
     webserver.addFormTextBox("LWT Disconnect Message", "c014_dcmsg", lwt2,
                              255)
     return True
예제 #14
0
 def webform_load(self):
  choice1 = self.taskdevicepluginconfig[0]
  options = rpiSerial.serial_portlist()
  if len(options)>0:
   webserver.addHtml("<tr><td>Serial Device:<td>")
   webserver.addSelector_Head("p201_addr",False)
   for o in range(len(options)):
    webserver.addSelector_Item(options[o],options[o],(str(options[o])==str(choice1)),False)
   webserver.addSelector_Foot()
   webserver.addFormNote("For RPI use 'raspi-config' tool: 5- Interfacing Options-P6 Serial- (Kernel logging disabled + serial port hardware enabled) before enable this plugin")
   webserver.addFormNumericBox("Baudrate","p201_spd",self.taskdevicepluginconfig[1],50,4000000)
   webserver.addFormNote("Generic values: 9600, 19200, 38400, 57600, 115200")
   choice2 = self.taskdevicepluginconfig[2]
   options = ["5","6","7","8"]
   optionvalues = [rpiSerial.FIVEBITS,rpiSerial.SIXBITS,rpiSerial.SEVENBITS,rpiSerial.EIGHTBITS]
   webserver.addFormSelector("Bytesize","p201_bsize",len(optionvalues),options,optionvalues,None,int(choice2))
   webserver.addFormNote("Most common setting is 8")
   choice3 = self.taskdevicepluginconfig[3]
   options = ["None","Even","Odd","Mark","Space"]
   optionvalues = [rpiSerial.PARITY_NONE,rpiSerial.PARITY_EVEN,rpiSerial.PARITY_ODD,rpiSerial.PARITY_MARK,rpiSerial.PARITY_SPACE]
   webserver.addHtml("<tr><td>Parity:<td>")
   webserver.addSelector_Head("p201_par",False)
   for o in range(len(options)):
    webserver.addSelector_Item(options[o],optionvalues[o],(str(optionvalues[o])==str(choice3)),False)
   webserver.addSelector_Foot()
   webserver.addFormNote("Most common setting is None")
   choice4 = self.taskdevicepluginconfig[4]
   options = ["1","2"]
   optionvalues = [rpiSerial.STOPBITS_ONE,rpiSerial.STOPBITS_TWO]
   webserver.addFormSelector("Stopbits","p201_sbit",len(optionvalues),options,optionvalues,None,float(choice4))
   webserver.addFormNote("Most common setting is 1")
   webserver.addFormNumericBox("Expected max packet size","p201_pkt",self.taskdevicepluginconfig[5],1,4096) # Linux serial buffer is fixed max 4096 bytes
   webserver.addUnit("byte")
   choice6 = self.taskdevicepluginconfig[6]
   options = ["Hex values","String"]
   optionvalues = [0,1]
   webserver.addFormSelector("Data format","p201_fmt",len(optionvalues),options,optionvalues,None,int(choice6))
  else:
   webserver.addFormNote("No serial ports found")
  return True
예제 #15
0
    def webform_load(self):  # create html page for settings
        choice1 = self.taskdevicepluginconfig[0]
        options = ["0x40", "0x41", "0x44", "0x45"]
        optionvalues = [0x40, 0x41, 0x44, 0x45]
        webserver.addFormSelector("I2C address", "plugin_027_addr",
                                  len(options), options, optionvalues, None,
                                  int(choice1))
        webserver.addFormNote(
            "Enable <a href='pinout'>I2C bus</a> first, than <a href='i2cscanner'>search for the used address</a>!"
        )

        choice2 = self.taskdevicepluginconfig[1]
        options = ["AUTO", "200", "400", "800", "1000", "1600", "2000", "3200"]
        optionvalues = [0, 200, 400, 800, 1000, 1600, 2000, 3200]
        webserver.addFormSelector("Maximum current", "plugin_027_amp",
                                  len(options), options, optionvalues, None,
                                  int(choice2))
        webserver.addUnit("mA")

        choice3 = self.taskdevicepluginconfig[2]
        options = ["32", "16"]
        optionvalues = [1, 0]
        webserver.addFormSelector("Max voltage", "plugin_027_volt",
                                  len(options), options, optionvalues, None,
                                  int(choice3))
        webserver.addUnit("V")

        choice4 = self.taskdevicepluginconfig[3]
        options = ["None", "Voltage", "Current", "Power"]
        optionvalues = [0, 1, 2, 3]
        webserver.addFormSelector("Param1", "plugin_027_p1", len(options),
                                  options, optionvalues, None, int(choice4))
        choice5 = self.taskdevicepluginconfig[4]
        webserver.addFormSelector("Param2", "plugin_027_p2", len(options),
                                  options, optionvalues, None, int(choice5))
        choice6 = self.taskdevicepluginconfig[5]
        webserver.addFormSelector("Param3", "plugin_027_p3", len(options),
                                  options, optionvalues, None, int(choice6))
        return True
예제 #16
0
 def webform_load(self):  # create html page for settings
     choice1 = self.taskdevicepluginconfig[0]
     options = ["0x29", "0x39", "0x49"]
     optionvalues = [0x29, 0x39, 0x49]
     webserver.addFormSelector("I2C address", "plugin_015_addr",
                               len(options), options, optionvalues, None,
                               int(choice1))
     choice2 = self.taskdevicepluginconfig[1]
     options = ["13.7", "101", "402"]
     optionvalues = [0, 1, 2]
     webserver.addFormSelector("Exposure speed", "plugin_015_spd",
                               len(options), options, optionvalues, None,
                               int(choice2))
     webserver.addUnit("ms")
     choice3 = self.taskdevicepluginconfig[2]
     options = ["1", "16"]
     optionvalues = [0, 0x10]
     webserver.addFormSelector("Gain", "plugin_015_gain", len(options),
                               options, optionvalues, None, int(choice3))
     webserver.addUnit("x")
     webserver.addFormNote(
         "Enable <a href='pinout'>I2C bus</a> first, than <a href='i2cscanner'>search for the used address</a>!"
     )
     return True
예제 #17
0
 def webform_load(self): # create html page for settings
  webserver.addFormNote("Pin1 is A, Pin2 is B, for wiring, see <a href='https://github.com/simonmonk/pi_analog'>https://github.com/simonmonk/pi_analog</a>")
  choice0 = self.taskdevicepluginconfig[0]
  options = ["Analog","Resistance","Thermistor"]
  optionvalues = [0,1,2]
  webserver.addFormSelector("Result Type","p002_type",len(options),options,optionvalues,None,choice0)
  webserver.addFormFloatNumberBox("C1 capacitor", "p002_c1", self.taskdevicepluginconfig[1], 0, 1000000.0)
  webserver.addUnit("uF")
  webserver.addFormNumericBox("R1 resistor","p002_r1",self.taskdevicepluginconfig[2])
  webserver.addUnit("Ohm")
  webserver.addFormFloatNumberBox("Vt voltage (digital HIGH level)", "p002_vt", self.taskdevicepluginconfig[3], 0, 3.3)
  webserver.addUnit("V")
  webserver.addFormNote("Settings below are only valid for thermistor type!")
  webserver.addFormNumericBox("Thermistor resistance","p002_tr",self.taskdevicepluginconfig[4])
  webserver.addUnit("Ohm")
  webserver.addFormNumericBox("Thermistor Beta","p002_tb",self.taskdevicepluginconfig[5])
  return True
예제 #18
0
 def webform_load(self): # create html page for settings
  bledevs = BLEHelper.find_hci_devices()
  options = []
  optionvalues = []
  if bledevs:
   for bd in bledevs:
    options.append(bd)
    try:
     optionvalues.append(int(bd[3:]))
    except:
     optionvalues.append(bd[3:])
  webserver.addFormSelector("Local Device","plugin_527_dev",len(options),options,optionvalues,None,int(self.taskdevicepluginconfig[4]))
  webserver.addFormTextBox("Remote Device Address","plugin_527_addr",str(self.address),20)
  webserver.addFormNote("Supported device types: LYWSD02, CGQ, CGG1, MiFlora")
  webserver.addFormNote("If you are using Sniffer, its not the best idea to use another BLE plugin at the same time. Although multiple sniffer tasks can be used.")
  choice1 = self.taskdevicepluginconfig[0]
  choice2 = self.taskdevicepluginconfig[1]
  choice3 = self.taskdevicepluginconfig[2]
  choice4 = self.taskdevicepluginconfig[3]
  options = ["None","Temperature","Humidity","Light","Moisture","Fertility","Battery","RSSI"]
  optionvalues = [-1,4,6,7,8,9,10,200]
  webserver.addFormSelector("Indicator1","plugin_527_ind0",len(optionvalues),options,optionvalues,None,choice1)
  webserver.addFormSelector("Indicator2","plugin_527_ind1",len(optionvalues),options,optionvalues,None,choice2)
  webserver.addFormSelector("Indicator3","plugin_527_ind2",len(optionvalues),options,optionvalues,None,choice3)
  webserver.addFormSelector("Indicator4","plugin_527_ind3",len(optionvalues),options,optionvalues,None,choice4)
  try:
   if self.taskdevicepluginconfig[5]<1:
     self.taskdevicepluginconfig[5] = self.blescanner.scantime
  except:
   pass
  try:
   if self.taskdevicepluginconfig[6]<1:
     self.taskdevicepluginconfig[6] = self.blescanner.minsleep
  except:
   pass
  try:
   if self.taskdevicepluginconfig[7]<1:
     self.taskdevicepluginconfig[7] = self.blescanner.maxsleep
  except:
   pass
  if self.taskdevicepluginconfig[5]<1:
   self.taskdevicepluginconfig[5]=5
  if self.taskdevicepluginconfig[6]<1:
   self.taskdevicepluginconfig[6]=10
  if self.taskdevicepluginconfig[7]<1:
   self.taskdevicepluginconfig[7]=30
  webserver.addFormNumericBox("Scan time","plugin_527_scantime",self.taskdevicepluginconfig[5],5,60)
  webserver.addUnit('s')
  webserver.addFormNumericBox("Minimal pause after scan","plugin_527_minsleep",self.taskdevicepluginconfig[6],5,60)
  webserver.addUnit('s')
  webserver.addFormNumericBox("Maximal pause after scan","plugin_527_maxsleep",self.taskdevicepluginconfig[7],10,120)
  webserver.addUnit('s')
  return True
예제 #19
0
 def webform_load(self):
  webserver.addFormNote("IP and Port parameter is not used!")
  webserver.addFormNote("SX127x hardware supported by pyLoRa library")
  webserver.addHtml("<p>Example sender sketches could be find <a href='https://github.com/enesbcs/EasyLora'>here</a>.")
#  if self.lora is not None:
#    webserver.addFormNote("LoRa version: "+str(self.lora.get_version()))
  try:
   webserver.addTableSeparator("Hardware settings",2,3)
   if BOARD.SPI_BUS==0:
    webserver.addHtml("<tr><td>SPI0 selected<td><i>(MOSI=GPIO10, MISO=GPIO9, SCK=GPIO11, NSS=GPIO8)</i>")
    spiok = False
    if gpios.HWPorts.is_spi_usable(BOARD.SPI_BUS):
     if gpios.HWPorts.is_spi_enabled(BOARD.SPI_BUS):
      webserver.addHtml(" - <b>SPI0 enabled</b>")
      spiok = True
    if spiok==False:
     webserver.addHtml("<tr><td><td>Enable SPI0 first at hardware <a href='pinout'>pinout page</a>!")
   else:
     webserver.addHtml("<tr><td><td>You have modified BOARD constants, so you are an expert!")
   webserver.addHtml("<tr><td>DIO0 (IRQ)<td>GPIO"+str(BOARD.DIO0))
   webserver.addHtml("<tr><td>DIO1<td>GPIO"+str(BOARD.DIO1))
   webserver.addHtml("<tr><td>DIO2<td>GPIO"+str(BOARD.DIO2))
   webserver.addHtml("<tr><td>DIO3<td>GPIO"+str(BOARD.DIO3))
   webserver.addHtml("<tr><td>RST<td>GPIO"+str(BOARD.RST))

   webserver.addTableSeparator("LoRa settings",2,3)
   webserver.addFormFloatNumberBox("Frequency","freq",self.freq,433,928)
   webserver.addUnit("Mhz")
   if self.lora is not None:
     try:
      afreq = self.lora.get_freq()
     except:
      afreq = "UNINITIALIZED"
     webserver.addFormNote("Current frequency: "+str(afreq)+" Mhz")
   webserver.addFormNote("Please check local regulations for your selected frequency!")

   options = ["10%","1%","0.1%"]
   optionvalues = [10,100,1000]
   webserver.addFormSelector("Duty cycle","duty",len(optionvalues),options,optionvalues,None,self.duty)
   webserver.addFormNote("Please check your local Duty cycle regulations for your selected frequency!")

   webserver.addFormNumericBox("Spreading factor","spreading",self.sf,6,12)
   options = ["7.8","10.4","15.6","20.8","31.25","41.7","62.5","125","250","500"]
   optionvalues = [BW.BW7_8, BW.BW10_4, BW.BW15_6, BW.BW20_8, BW.BW31_25, BW.BW41_7, BW.BW62_5, BW.BW125, BW.BW250, BW.BW500]
   webserver.addFormSelector("Bandwidth","bw",len(optionvalues),options,optionvalues,None,self.bw)
   webserver.addUnit("khz")

   options = ["CR4/5","CR4/6","CR4/7","CR4/8"]
   optionvalues = [CODING_RATE.CR4_5,CODING_RATE.CR4_6,CODING_RATE.CR4_7,CODING_RATE.CR4_8]
   webserver.addFormSelector("Coding rate","coding",len(optionvalues),options,optionvalues,None,self.coding)

   webserver.addFormNumericBox("Sync Word","sync",self.sync,0,255)
   webserver.addHtml("( 0x"+format(self.sync, '02x')+" )")
   webserver.addFormNote("Default 0x12, LoRaWAN is 0x34. Nodes can only communicate each other if uses same sync word!")

   webserver.addFormCheckBox("Enable Sending","sender",self.enablesend)
   webserver.addFormNumericBox("Default destination node index","defaultnode",self.defaultunit,0,255)
   webserver.addFormNote("Default node index for data sending")
  except Exception as e:
   misc.addLog(rpieGlobals.LOG_LEVEL_ERROR,str(e))
  return True
예제 #20
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 ""