我是一个用python为RPi (3B模型)编程的新手。我正在使用RPi运行Octoprint,它控制着我的一台3D打印机。打印机的电源通过TP-Link智能插头连接。我可以通过Octoprint中的插件来控制插头,但它不允许我基于GPIO输入来切换插头。在我的情况下,当我切换连接到GPIO的摇杆开关时,我需要插头来切换其开/关状态。换句话说,当GPIO输入切换状态(高到低,反之亦然)时,我也需要TP-Link插头进行切换(根据当前状态,依次切换到OFF或反之亦然)。
我正在使用的插件有使用API的curl脚本,应该可以实现这一点。我对此还是个新手,但是通过在ssh 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脚本中运行示例终端(包含所需的信息),插头确实打开了。“off”的例子也是如此。当我运行以下命令以获取状态: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将状态更改为相反的状态(on/off)。我尝试在GPIO脚本中集成curl命令,但它在出现“符号”时出现语法错误。我已经浏览了整个网络,但还没有找到解决方案。如果你知道一个新手可以做到这一点的方法,请告诉我。你将永远是一个英雄;)。
无论如何,感谢你阅读这个庞大的问题!
发布于 2020-08-01 04:14:30
如上所述,使用subprocess模块将有助于进程间的数据共享。要捕获系统调用的输出(比如问题中的curl ),可以使用.Popen和.communicate方法。查看另一个答案Store output of subprocess.Popen call in a string
https://stackoverflow.com/questions/63180181
复制相似问题