0

非常に優れたpigpio ライブラリの助けを借りて、 Somfy スケッチを Pythonに移植しました。これにより、Raspberry Pi が朝にブラインドを開き、日没後にブラインドを閉じることができます。

すべてが機能し、私はそれに満足しています。

インタラクティブ性を少し追加するために、Raspberry Pi が提供する Web ページを介してブラインドを制御できるようにしたいと考えています。これは、ウェブページでボタンが押されたときに Python スクリプトを起動することを意味します

n 個のブラインドがあるため、ページには 3*n 個のボタン (ブラインドごとに {UP、STOP、DOWN}) があります。2 つの引数 (ブラインドとコマンド) で同じスクリプトをトリガーするか、ボタンごとに異なるスクリプトをトリガーすることができます (気にしません)。

しかし、私はウェブサーバーをセットアップしたことがありません。私は HTML をほとんど知りませんし、CGI を使用したこともありませんし、それが何であるかを正確に理解していません。

だから、私の質問は次のとおりです。

  1. 使用できる最も単純な ( 1 つのページとトリガー スクリプトを配信する必要がある) Web サーバーは何ですか?
  2. どの HTML コードを使用しますか?
  3. 最も重要なのは、ボタン/リンクをクリックするとスクリプトが開始される方法 (おそらく 2 つの引数を渡す) です。
  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