0

我是一个在 Python 中为 RPi(模型 3B)编程的新手。我正在使用 RPi 运行控制我的一台 3D 打印机的 Octoprint。打印机的电源通过 TP-Link 智能插头连接。我可以通过 Octoprint 中的插件控制插头,但它不允许我根据 GPIO 输入切换插头。在我的情况下,当我切换连接到 GPIO 的摇臂开关时,我需要插头来切换其开/关状态。换句话说; 当 GPIO 输入切换状态(HIGH 到 LOW 或反之)时,我也需要 TP-Link 插头切换(因此 ON 到 OFF 或反之亦然,取决于当前状态)。

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

无论如何,感谢您阅读这个庞大的问题!

4

1 回答 1

0

如上所述,使用该subprocess模块将有助于进程间数据共享。要捕获系统调用的输出(例如 curl,在您的问题中),请使用.Popenand.communicate方法。请参阅此其他答案将 subprocess.Popen 调用的输出存储在字符串中

于 2020-07-31T20:14:29.720 回答