Я портировал свой Somfy sketch на Python с помощью очень хорошего pigpio library, так что моя малина Pi может открывать блайнды утром и закрывать их после захода солнца.Webserver: как запустить скрипт python с локальной веб-страницы
Все работает, и я доволен им.
Чтобы добавить немного интерактивности, я хотел бы иметь возможность управлять блайндами через веб-страницу, обслуживаемую малиной Pi. Это означало запуск сценария Python при нажатии кнопки на веб-странице.
Там будут n шторы, поэтому кнопки 3 * n ({UP, STOP, DOWN} для каждой шторки) на странице. Они могут запускать один и тот же сценарий с двумя аргументами (слепой и командой) или запускать другой скрипт для каждой кнопки (я не против).
Но я никогда не настраивал веб-сервер. Я едва знаю любой HTML, и я никогда не использовал CGI, и я точно не понимаю, что это такое.
Итак, мои вопросы:
- Что самое простое (будет поставлять один страниц и запуска скриптов) веб-сервер можно использовать?
- Какой HTML-код использовать?
- Самое главное: как щелчок по кнопке/ссылке запустит скрипт (возможно, передав два аргумента)?
- Как убедиться, что это будет работать только локально (проверка 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()