『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 9008|回复: 11

[流程系列] [請問] Nodered如何在觸發條件後自動跳開不再重複觸發?

[复制链接]

9

主题

358

帖子

3113

积分

论坛元老

Rank: 8Rank: 8

积分
3113
金钱
2755
HASS币
0
发表于 2019-7-31 17:47:52 | 显示全部楼层 |阅读模式
我原本HA裡面的自動化是這樣寫- alias: tvmode  trigger:
    - platform: state
      entity_id: sensor.ir_code
      to: '990610224'
  condition: []
  action:
    - delay:
        seconds: 4
    - service: automation.turn_off
      data_template:
        entity_id: tvmode
    - delay:
        seconds: 1
    - service: script.turn_on
      entity_id: script.lg_tv_dtv
  中間省略
    - service: automation.turn_on
      data_template:
        entity_id: tvmode


我照以上這樣寫的話 可以保證只執行一次
因為他一收到符合觸發條件就關閉該條自動化
後面就不會再有觸發
但我現在改成nodered 因為我是使用紅外線觸發 發現他如果多按幾次他會重複觸發
請問各位大神 我如何在nodered裡面限制他只要觸發了 只執行第一次呢?


我是用下面的方式寫的 但他不是執行開關而以 我只是想說有無方法只觸發第一次
ScreenHunter_199.jpg


回复

使用道具 举报

40

主题

3056

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11149
金钱
8042
HASS币
182
发表于 2019-7-31 19:37:10 | 显示全部楼层
请举一个详细的逻辑,我看看?
Nero
回复

使用道具 举报

9

主题

358

帖子

3113

积分

论坛元老

Rank: 8Rank: 8

积分
3113
金钱
2755
HASS币
0
 楼主| 发表于 2019-7-31 21:34:19 | 显示全部楼层
neroxps 发表于 2019-7-31 19:37
请举一个详细的逻辑,我看看?

N大 邏輯是這樣的
我想模擬我的遙控器按下兩次影音鍵然後按下上鍵以後再按確認鍵 選擇到我要的選項
因為我的搖控器按下影音鍵有AV1,AV2,HDMI1,HDMI2,HDMI3
並且我的觸發是用某個紅外碼來觸發這個動作,
若是不跳開 的話會導致選錯我要的選項

例如正常接收到紅外碼第一次的時候 他會按下兩次影音鍵然後按下上鍵以後再按確認鍵 選擇到我要的選項
若是不跳開 他接收到兩次就會再繼續執行 導致我選錯
不知道我這樣解釋您知道嗎@@

我之前用HA自動化的時候 我是寫 只要接收到紅外碼開始動作後
我先把該條自動化關閉 等全部動作執行完成後再打開
但是在nodered我就不知道怎麼作了
下面是我的示意圖
ScreenHunter_200.jpg

感謝N大抽空幫我解答

flows (3).rar

1.18 KB, 下载次数: 9

回复

使用道具 举报

8

主题

2073

帖子

6053

积分

论坛元老

流水无味

Rank: 8Rank: 8

积分
6053
金钱
3980
HASS币
145

灌水之王

发表于 2019-8-1 07:55:15 | 显示全部楼层
如果用收到的遥控码作为触发,收到后加个虚拟开关开的判断,延时200毫秒关闭虚拟开关,
然后延迟1秒开始你的动作,最后打开虚拟开关。就是模拟关闭自动化 flowstest.rar (1.2 KB, 下载次数: 5)

其实你可以把你后面的动作做成一个script放到HA遥控器里去
我不清楚你的目的是什么…(达到的使用效果)…
hdmi3: 
  sequence:
    - service: broadlink.send
      data:
        host: 192.168.203.231
        packet:
          - "JgBOAJOUExMTOBU2FDcUEhQTEhQSFBITFTcUNxQ3ExMTExIUExMTOBI5ExMUEhQ3FRETOBQSEhQSFBI5FTYVERM4ExMUNhQABfmUkxQ3FAANBQAAAAAAAAAAAAA="
    - delay:
        seconds: 2
    - service: broadlink.send
      data:
        host: 192.168.203.231
        packet:
          - "JgBOAJOVEhQSORI4EjkTExIUEhQUExIUETkTNxM4EhQSFBMTFBMSFBI5ExMSFBMTEhQSORIUEjkSFBI4EjkSOBI5ExMSORIABfqSlRI5EgANBQAAAAAAAAAAAAA="
    - delay:
        seconds: 0.5
    - service: broadlink.send
      data:
        host: 192.168.203.231
        packet:
          - "JgBOAJKVEhQSOBI5EjkSExQSEhQSFBIUEzgRORI5EhMTExIUEhQSFBI4FDgSExIUEhQTNxIUEjkSFBITEjkTOBI4EhUSNxIABfqSlRI6EQANBQAAAAAAAAAAAAA="

回复

使用道具 举报

40

主题

3056

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11149
金钱
8042
HASS币
182
发表于 2019-8-1 16:11:34 | 显示全部楼层
本帖最后由 neroxps 于 2019-8-1 16:31 编辑

楼主意思当流程自身在运行的时候,就不应该重复触发,对吧。等到流程结束了才重新触发。可以用 flow.context 来做,这里有关于node-red的 context 中文说明 https://blog.csdn.net/geek_monkey/article/details/80751284

node-red 有三种变量(context),包括你可以修改 setiing.js 添加以下配置,来使得 context 持久化,从而防止node-red重启导致context 丢失。

    contextStorage: {
        default: {
            module: "localfilesystem"
        }
    }

这个是我做的一个例子。

TIM截图20190801162345.jpg

flow_context_demo.zip (1.01 KB, 下载次数: 45)

context 是作用在当前的节点上生效,只能使用在 function 节点里面。
flow.context 是作用在整个 Flow,也就是当前页整个流程里。
global.context 顾名思义就是全局,整个node-red都可以读取调用里面的变量。

如何查看以上变量的内容?看下图

TIM截图20190801162822.jpg



Nero
回复

使用道具 举报

9

主题

358

帖子

3113

积分

论坛元老

Rank: 8Rank: 8

积分
3113
金钱
2755
HASS币
0
 楼主| 发表于 2019-8-1 20:07:34 | 显示全部楼层
neroxps 发表于 2019-8-1 16:11
楼主意思当流程自身在运行的时候,就不应该重复触发,对吧。等到流程结束了才重新触发。可以用 flow.contex ...

感謝N大  您的方法我剛剛試了一下
運作上可以只觸發一次
但我還是不太了解 怎麼 運作的@@
我是這樣加入 ScreenHunter_201.jpg

我不了解 如果流程没运行 flow_status !=on
為何要設定為on?  是因為不要讓他在執行第二次嗎?
後面有個設定off的又是為什麼? 是因為off掉才可以讓他繼續執行嗎?
但是我試過 off 以後我怎麼觸發都觸發不了 我必須要再跑删除flow变量才可以再度觸發
這又是為什麼?

不好意思  我小白一枚 問題比較多 還請N大見諒 多多指教 TKS!
回复

使用道具 举报

40

主题

3056

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11149
金钱
8042
HASS币
182
发表于 2019-8-1 20:19:32 | 显示全部楼层
本帖最后由 neroxps 于 2019-8-1 20:45 编辑
jozhi 发表于 2019-8-1 20:07
感謝N大  您的方法我剛剛試了一下
運作上可以只觸發一次
但我還是不太了解 怎麼 運作的@@

flow.context 是一个对象(我上面例子就是 flow.flow_status 这对象用来存储 on和off字符串,用来判断流程是不是在运行中,假设他就是一张纸,而这张纸上面可以写 on或者off


因为这张纸node-red定义,在整个Flow,也就是当前的标签页上,所有节点都能看到这张纸。

我们假设我们现在一串流程就是一条路,而这条路就只能有一个人在跑。

那么好,假设每一次触发我们假设他是都属于一个人。第一次触发我们叫A君,第二次触发的人我们叫B君。

A君过来,就拿起这张纸看一下,前面如果没有人在跑这路上,那么他就在纸上写上,on,让后面来的人看到,哦前面有人跑了,我不跑了。然后A君跑完这条路后,又在纸上擦掉之前的on,然后写上 off,告诉其他过来的人,这条路我跑完了,下次有人来到(触发),就重复A做的事。

当A在路上跑的时候,B来了,B来的时候也先看这张纸,写着ON,那么他就知道路上有人,没他什么事了。

context 就是一个对象,我们可以定义这对象里面放东西。而这个对象谁可以看到呢,所以就有 context(当前节点)、flow(当前页面)、global(整个node-red所有页面)三种权限,定义了这个对象是所有人能看到呢?还是当前页面的人才看到,还是当前节点才看到。
Nero
回复

使用道具 举报

9

主题

358

帖子

3113

积分

论坛元老

Rank: 8Rank: 8

积分
3113
金钱
2755
HASS币
0
 楼主| 发表于 2019-8-1 21:03:07 | 显示全部楼层
neroxps 发表于 2019-8-1 20:19
flow.context 是一个对象(我上面例子就是 flow.flow_status 这对象用来存储 on和off字符串,用来判断流程 ...

N大這解釋讓我茅塞頓開....懂了好多!!
感謝再感謝.....
但我在測試的時候 我發現沒有跑最後面那個删除flow变量
我不管怎麼觸發他都不跑
但我有跑off的部分
回复

使用道具 举报

40

主题

3056

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11149
金钱
8042
HASS币
182
发表于 2019-8-2 07:39:49 | 显示全部楼层
jozhi 发表于 2019-8-1 21:03
N大這解釋讓我茅塞頓開....懂了好多!!
感謝再感謝.....
但我在測試的時候 我發現沒有跑最後面那個删除flo ...

不需要删除,删除我只是给你看看删除的方法。你的逻辑里面不需要删除对象。
Nero
回复

使用道具 举报

9

主题

358

帖子

3113

积分

论坛元老

Rank: 8Rank: 8

积分
3113
金钱
2755
HASS币
0
 楼主| 发表于 2019-8-2 08:32:42 | 显示全部楼层
neroxps 发表于 2019-8-2 07:39
不需要删除,删除我只是给你看看删除的方法。你的逻辑里面不需要删除对象。 ...

N大...非常謝謝您!
我在試試看...TKS!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-24 05:11 , Processed in 0.063061 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表