Python:使用RPi GPIO输入通过curl(octoprint插件API)切换智能插件

2024-06-06 11:44:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我是为RPi(模型3B)用python编程的新手。我正在使用RPi运行Octoprint,它控制我的一台3D打印机。打印机电源通过TP-Link智能插头连接。我可以通过Octoprint中的插件控制插件,但它不允许我根据GPIO输入切换插件。在我的情况下,当我切换连接到GPIO的翘板开关时,我需要插头来切换其开/关状态。换言之;当GPIO输入切换状态(从高到低,反之亦然)时,我也需要TP链路插头切换(根据当前状态从ON切换到OFF,反之亦然)

我正在使用的插件有使用API的curl脚本,这应该使这成为可能。我对这一点非常陌生,但通过在通过ssh终端命令触发的.py脚本中运行示例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(带有所需信息),插件确实打开了。“关闭”示例也是如此。当我运行此命令以获取状态: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检查插头的状态,从输出中提取“开”和“关”变量,并通过curl将状态更改为相反的状态(开/关)。我尝试在GPIO脚本中集成curl命令,但它在“符号”处给了我语法错误。我浏览了整个网络,但还没有找到解决方案。如果你知道一个新手可以实现这一点的方法,请告诉我。你将永远是英雄;)

不管怎样,谢谢你阅读这个庞大的问题


Tags: 命令ip脚本插件gpioif状态打印机