Python: использование входа RPi GPIO для переключения умного разъема через curl (API плагина octoprint)

Я новичок в программировании на python для RPi (модель 3B). Я использую RPi для запуска Octoprint, который управляет одним из моих 3D-принтеров. Питание принтера подключается через интеллектуальную вилку TP-Link. Я могу управлять штекером через плагин в Octoprint, но он не позволяет мне переключать штекер на основе входа GPIO. В моей ситуации мне нужна вилка для включения / выключения состояния, когда я переключаю тумблер, подключенный к GPIO. Другими словами; когда вход GPIO переключает состояние (ВЫСОКИЙ на НИЗКИЙ или наоборот), мне нужно, чтобы штекер TP-Link также переключался (поэтому ВКЛ на ВЫКЛ или наоборот, в зависимости от текущего состояния).

Плагин, который я использую, имеет скрипты curl с использованием API, которые должны сделать это возможным. Я новичок в этом, но запустив примерcurl -s -H "Content-Type: application/json" -H "X-Api-Key: YOUR_API_KEY" -X POST -d '{ "command":"turnOn", "ip":"<ip of smartplug in settings>" }' http://YOUR_OCTOPRINT_SERVER/api/plugin/tplinksmartplug(с необходимой информацией) в скрипте.py, запущенном с помощью команды терминала ssh, плагин действительно включается. То же самое и с "выключенным" примером. Когда я запускаю это, чтобы получить статус:curl -s -H "Content-Type: application/json" -H "X-Api-Key: MYAPIKEYHERE" -X POST -d '{ "command":"checkStatus", "ip":"xxx.xxx.xx.xx" }' http://xxx.xxx.xx.xxx/api/plugin/tplinksmartplug , это результат, когда питание действительно включено: {"currentState":"on","emeter":null,"ip":"xxx.xxx.xx.xxx"}

Кроме того, я раньше использовал часть GPIO с кулисным переключателем, позволяющую мне включать и выключать свет принтера через реле. Это делается с помощью этого кода, запускаемого в rc.local, и отлично работает так, как я хочу:

#!/usr/bin/env python
import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BOARD)

GPIO.setup(3, GPIO.OUT)
GPIO.setup(10, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

relayState = 0
relayNeedsSwitch = 0
currentSwitchState = 0
oldSwitchState = 0

while True:
    if GPIO.input(10) == GPIO.HIGH:
        currentSwitchState = 1
    if GPIO.input(10) == GPIO.LOW:
        currentSwitchState = 0
    
    if currentSwitchState != oldSwitchState:
        print("SWITCHING RELAY")
        relayNeedsSwitch = 1
        
    if relayNeedsSwitch == 1:
        if GPIO.input(3) == GPIO.HIGH:
                GPIO.output(3, GPIO.LOW)
    else:
        GPIO.output(3, GPIO.HIGH)
        relayNeedsSwitch = 0
    
    oldSwitchState = currentSwitchState
    sleep(0.3)

Теперь проблема в том, что я не могу понять, как совместить два успеха. Итак, как определить GPIO, когда обнаружен переключатель, используйте curl для проверки состояния вилки, извлекая переменные 'on' и 'off' из вывода, и через curl измените статус на противоположный (вкл / выкл). Я попытался интегрировать команды curl в сценарий GPIO, но это дает мне синтаксические ошибки на знаках ". Я просмотрел весь Интернет, но пока не нашел решения. Если вы знаете, как новичок может этого добиться, пожалуйста скажи мне. Ты будешь героем навсегда;).

В любом случае, спасибо, что прочитали этот огромный вопрос!

1 ответ

Как упоминалось выше, используя subprocessмодуль поможет с обменом данными между процессами. Чтобы захватить вывод системного вызова (например, curl, в вашей проблеме), используйте.Popen а также .communicateметоды. См. Этот другой ответ Сохранить вывод подпроцесса. Открыть вызов в строке

Другие вопросы по тегам