Webserver:如何从本地网页运行python脚本

时间:2016-01-16 18:29:41

标签: python raspberry-pi webserver cgi home-automation

我在非常好的Somfy sketch的帮助下将我的pigpio library移植到了Python,这样我的Raspberry Pi可以在早上打开百叶窗并在日落后关闭它们。

一切正常,我很满意。

为了增加一点互动性,我希望能够通过Raspberry Pi提供的网页控制百叶窗。 这意味着在网页上按下按钮时启动Python脚本

会有n个百叶窗,所以页面上有3 * n个按钮(每个盲人{UP,STOP,DOWN})。 他们可以使用两个参数(盲和命令)触发相同的脚本,也可以为每个按钮触发不同的脚本(我不介意)。

但我从未设置过网络服务器。我几乎不知道任何HTML,我从未使用过CGI,也不知道它是什么。

所以,我的问题是:

  1. 我可以使用哪种最简单的(必须提供一个页面和触发脚本)的网络服务器?
  2. 使用什么HTML代码?
  3. 最重要的是:如何点击按钮/链接将启动一个脚本(可能传递两个参数)?
  4. 如何确保这只能在本地工作(检查主机的IP,或在我的智能手机上下载证书,这是最简单的路线)?
  5. 该脚本位于 somfy 目录中。跟踪滚动代码和远程地址的文本文件也是如此。也许页面也可以放在那里? 如果你真的觉得你需要代码,我会把它给你,但我不确定是否有必要:

    def envoi_commande(telco, bouton):
       checksum = 0
    
       with open("somfy/" + telco + ".txt", 'r') as file:
          data = file.readlines()
    
       teleco = int(data[0], 16)
       code = int(data[1])
       data[1] = str(code + 1)
    
       print hex(teleco)
       print code
    
       with open("somfy/" + telco + ".txt", 'w') as file:
          file.writelines(data)
    
       pi = pigpio.pi() # connect to Pi
    
       if not pi.connected:
          exit()
    
       pi.wave_add_new()
       pi.set_mode(TXGPIO, pigpio.OUTPUT)
    
    
       print "Remote  :      " + "0x%0.2X" % teleco
       print "Button  :      " + "0x%0.2X" % bouton
       print "Rolling code : " + str(code)
       print ""
    
       frame[0] = 0xA7;       # Encryption key. Doesn't matter much
       frame[1] = bouton << 4 # Which button did  you press? The 4 LSB will be the checksum
       frame[2] = code >> 8               # Rolling code (big endian)
       frame[3] = (code & 0xFF)           # Rolling code
       frame[4] = teleco >> 16            # Remote address
       frame[5] = ((teleco >>  8) & 0xFF) # Remote address
       frame[6] = (teleco & 0xFF)         # Remote address
    
       print "Frame  :    ",
       for octet in frame:
          print "0x%0.2X" % octet,
       print ""
    
       for i in range(0, 7):
          checksum = checksum ^ frame[i] ^ (frame[i] >> 4)
    
       checksum &= 0b1111; # We keep the last 4 bits only
    
       frame[1] |= checksum;
    
       print "With cks  : ",
       for octet in frame:
          print "0x%0.2X" % octet,
       print ""
    
       for i in range(1, 7):
          frame[i] ^= frame[i-1];
    
       print "Obfuscated :",
       for octet in frame:
          print "0x%0.2X" % octet,
       print ""
    
       wf=[]
       wf.append(pigpio.pulse(1<<TXGPIO, 0, 9415))
       wf.append(pigpio.pulse(0, 1<<TXGPIO, 89565))
       for i in range(2):
          wf.append(pigpio.pulse(1<<TXGPIO, 0, 2560))
          wf.append(pigpio.pulse(0, 1<<TXGPIO, 2560))
       wf.append(pigpio.pulse(1<<TXGPIO, 0, 4550))
       wf.append(pigpio.pulse(0, 1<<TXGPIO,  640))
    
       for i in range (0, 56):
          if ((frame[i/8] >> (7 - (i%8))) & 1):
             wf.append(pigpio.pulse(0, 1<<TXGPIO, 640))
             wf.append(pigpio.pulse(1<<TXGPIO, 0, 640))
          else:
             wf.append(pigpio.pulse(1<<TXGPIO, 0, 640))
             wf.append(pigpio.pulse(0, 1<<TXGPIO, 640))
    
       wf.append(pigpio.pulse(0, 1<<TXGPIO, 30415))
    
       #2 (I repeat the frame)
       for i in range(7):
          wf.append(pigpio.pulse(1<<TXGPIO, 0, 2560))
          wf.append(pigpio.pulse(0, 1<<TXGPIO, 2560))
       wf.append(pigpio.pulse(1<<TXGPIO, 0, 4550))
       wf.append(pigpio.pulse(0, 1<<TXGPIO,  640))
    
       for i in range (0, 56):
          if ((frame[i/8] >> (7 - (i%8))) & 1):
             wf.append(pigpio.pulse(0, 1<<TXGPIO, 640))
             wf.append(pigpio.pulse(1<<TXGPIO, 0, 640))
          else:
             wf.append(pigpio.pulse(1<<TXGPIO, 0, 640))
             wf.append(pigpio.pulse(0, 1<<TXGPIO, 640))
    
       wf.append(pigpio.pulse(0, 1<<TXGPIO, 30415))
    
    
       pi.wave_add_generic(wf)
       wid = pi.wave_create()
       pi.wave_send_once(wid)
       while pi.wave_tx_busy():
          pass
       pi.wave_delete(wid)
    
       pi.stop()
    

1 个答案:

答案 0 :(得分:0)

因为您已经将脚本移植到python,所以可以使用django

www.djangoproject.com

按下按钮时,在视图中调用python脚本。

让我添加一些警告,其中很多可能取决于其他因素,因为完成此任务有一些工作。

这是学习HTML的好网站  http://www.w3schools.com/