我是为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命令,但它在“符号”处给了我语法错误。我浏览了整个网络,但还没有找到解决方案。如果你知道一个新手可以实现这一点的方法,请告诉我。你将永远是英雄;)
不管怎样,谢谢你阅读这个庞大的问题
如上所述,使用
subprocess
模块将有助于进程间数据共享。要捕获系统调用的输出(如问题中的curl),请使用.Popen
和.communicate
方法。看到另一个答案了吗Store output of subprocess.Popen call in a string相关问题 更多 >
编程相关推荐