我是一个在 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 命令,但它在 " 符号处给出了语法错误。我已经浏览了整个网络,但还没有找到解决方案。如果你知道新手可以实现这一点的方法,请告诉我。你将永远是英雄;)。
无论如何,感谢您阅读这个庞大的问题!