【问题标题】:State Machine in Node-Red, how to?Node-Red中的状态机,如何?
【发布时间】:2021-10-02 14:45:32
【问题描述】:

有没有人为此找到一个优雅的解决方案?

用户有一个 BLE Puck.js 按钮,当按钮被按下时,它会将 MQTT 消息发送到 Node-Red。

Node-Red 场景将收到来自冰球的按钮按下事件,并将启动 30 秒计时器。 [First Pass Works] 定时器超时后向指定用户发送短信。

这适用于标准触发器。收到消息后,我启动 LED 闪烁并等待 30 秒,然后发送停止闪烁的 LED 并发送 SMS。

但是... 30 秒延迟的整个想法是,我们让用户有机会通过在延迟有效时再次按下来取消他们的请求。在这种情况下,我们需要关闭闪烁的 LED,然后继续等待。

这部分我遇到了一些麻烦。它基本上是一个状态机,接收到消息时执行的操作取决于机器的当前状态。

我正在尝试使用上下文变量来解决这个问题,但结果并不干净。

我已经让它与编码到 Puck.js 按钮中的状态机一起工作,但我正在尝试另一种设计,而是将它编码到 Node-Red 流中。

有什么想法吗? 谢谢

【问题讨论】:

    标签: node-red espruino


    【解决方案1】:

    最简单的方法是使用几个更改节点来翻转上下文变量中的状态,并使用一个切换节点对其进行操作。我使用注入节点代替节点中的 MQTT 只是为了使示例自包含。

    [{"id":"71ea94637b60dd2c","type":"inject","z":"e8d5f4c1515e1039","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":180,"wires":[["bdf84eb23b897f7d"]]},{"id":"f2b5bc7d60926ed7","type":"trigger","z":"e8d5f4c1515e1039","name":"","op1":"","op2":"send sms","op1type":"nul","op2type":"str","duration":"30","extend":false,"overrideDelay":false,"units":"s","reset":"","bytopic":"all","topic":"topic","outputs":1,"x":670,"y":120,"wires":[["cf353e3bf59d6027"]]},{"id":"bdf84eb23b897f7d","type":"switch","z":"e8d5f4c1515e1039","name":"","property":"running","propertyType":"global","rules":[{"t":"false"},{"t":"true"}],"checkall":"true","repair":false,"outputs":2,"x":250,"y":140,"wires":[["f4a049fdc943889e","2d7e39b07c89783c"],["f4923cda32b3ea13","ce7e2c9cb4923215"]]},{"id":"f4a049fdc943889e","type":"change","z":"e8d5f4c1515e1039","name":"","rules":[{"t":"set","p":"running","pt":"global","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":450,"y":120,"wires":[["f2b5bc7d60926ed7","3a7b67d8c03d6483"]]},{"id":"f4923cda32b3ea13","type":"change","z":"e8d5f4c1515e1039","name":"","rules":[{"t":"set","p":"reset","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":440,"y":160,"wires":[["f2b5bc7d60926ed7"]]},{"id":"cf353e3bf59d6027","type":"change","z":"e8d5f4c1515e1039","name":"","rules":[{"t":"set","p":"running","pt":"global","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":870,"y":120,"wires":[["871ed613768c8cba"]]},{"id":"871ed613768c8cba","type":"debug","z":"e8d5f4c1515e1039","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":990,"y":200,"wires":[]},{"id":"3a7b67d8c03d6483","type":"debug","z":"e8d5f4c1515e1039","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":670,"y":80,"wires":[]},{"id":"2d7e39b07c89783c","type":"debug","z":"e8d5f4c1515e1039","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":430,"y":80,"wires":[]},{"id":"ce7e2c9cb4923215","type":"debug","z":"e8d5f4c1515e1039","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":430,"y":200,"wires":[]},{"id":"5ba1151ce4153c8d","type":"inject","z":"e8d5f4c1515e1039","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"false","payloadType":"bool","x":110,"y":300,"wires":[["8fa0194926bdeaec"]]},{"id":"8fa0194926bdeaec","type":"change","z":"e8d5f4c1515e1039","name":"","rules":[{"t":"set","p":"running","pt":"global","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":210,"y":360,"wires":[[]]},{"id":"ae00864cf5a5a222","type":"comment","z":"e8d5f4c1515e1039","name":"","info":"Set up global.running context var","x":260,"y":300,"wires":[]}]
    

    【讨论】:

    • 谢谢@hardillb,我将在今天晚些时候尝试这种技术。看起来很完美!
    • 完美运行!
    【解决方案2】:

    一个简单的join(手动)需要 2 条消息,超时 30 秒。

    然后检查有效载荷数组是否包含1个值(超时)或2个(第二次按下):

    这是一张图片:

    【讨论】:

      猜你喜欢
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多