0

在非常好的pigpio 库的帮助下,我将我的Somfy 草图移植到了 Python ,这样我的树莓派就可以在早上打开百叶窗,在日落之后关闭它们。

一切正常,我很满意。

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

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

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

所以,我的问题是:

  1. 我可以使用的最简单(必须提供一页并触发脚本)网络服务器是什么?
  2. 使用什么 HTML 代码?
  3. 最重要的是:单击按钮/链接将如何启动脚本(可能传递两个参数)?
  4. 如何确保这只能在本地工作(检查主机的 IP,或者在我的智能手机上下载证书,最简单的方法)?

该脚本位于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()
4

1 回答 1

0

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

www.djangoproject.com

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

让我补充一些警告,其中很多可能取决于其他因素,因为完成这项任务需要做一些工作。

这是一个学习html的好网站 http://www.w3schools.com/

于 2016-01-16T21:35:58.307 回答