首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:使用RPi GPIO输入通过curl (octoprint plugin API)切换智能插头

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

Stack Overflow用户
提问于 2020-07-31 03:36:42
回答 1查看 148关注 0票数 0

我是一个用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中触发的代码完成的,并且按照我想要的那样完美地工作:

代码语言:javascript
复制
#!/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命令,但它在出现“符号”时出现语法错误。我已经浏览了整个网络,但还没有找到解决方案。如果你知道一个新手可以做到这一点的方法,请告诉我。你将永远是一个英雄;)。

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

EN

回答 1

Stack Overflow用户

发布于 2020-08-01 04:14:30

如上所述,使用subprocess模块将有助于进程间的数据共享。要捕获系统调用的输出(比如问题中的curl ),可以使用.Popen.communicate方法。查看另一个答案Store output of subprocess.Popen call in a string

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63180181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档