2016-01-16 2 views
0

Я портировал свой Somfy sketch на Python с помощью очень хорошего pigpio library, так что моя малина Pi может открывать блайнды утром и закрывать их после захода солнца.Webserver: как запустить скрипт python с локальной веб-страницы

Все работает, и я доволен им.

Чтобы добавить немного интерактивности, я хотел бы иметь возможность управлять блайндами через веб-страницу, обслуживаемую малиной 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() 

ответ

0

Поскольку вы уже портировали свой скрипт на Python, вы можете использовать Django

www.djangoproject.com

И когда нажата кнопка, вызовите ваш скрипт python в виде.

Позвольте мне добавить несколько предостережений, поскольку многое из этого может зависеть от других факторов, так как при выполнении этой задачи немного работы.

Это хороший сайт для изучения HTML http://www.w3schools.com/

Смежные вопросы