规则触发器

在 Openhab 中,以下是不同类别的规则触发器:

  • 基于 Item(-Event) 的触发器:它们对 openHAB 事件总线上的事件做出反应,即项目的命令和状态更新

  • 基于时间的触发器:它们在特殊时间做出反应,例如在午夜,每小时等。

  • 基于系统的触发器:它们对某些系统状态做出反应。

基于事件的触发器
下面显示了 Openhab 中每个不同的基于事件的触发器类型,以及如何在 Node-Red 中复制它们。

项目 <item%gt; 已接收命令 [<命令>] / 项目<项目>已接收更新 [<state>]
状态更改:
要在 Node-Red 中捕获项目状态的更改(注意,如果状态未更改,即具有相同状态的更新,则此触发器将不起作用),请使用Openhab2 In 118节点托盘Home_Automation部分中的节点。

这些节点跟踪发送一条消息,其中包含每次项目从顶部通道更改时的状态,以及与项目关联的所有数据的完整输出从底部通道更改状态。连接到顶部通道将创建与 Openhab 中的"已接收项目命令"或"已接收项目更新"触发器相同的触发事件。要将触发器限制为特定的"[]"或"[]",您需要添加一个 Switch 节点并将其连接到第一个通道。

现在可以将此开关节点设置为反映要触发事件的命令,方法是将逻辑设置为等于要作为触发器基础的 [] 或"[]"。您添加的每个附加规则都会在交换机上创建一个附加输出通道,该通道对应于节点中规则的顺序。

无状态更改:
如果要捕获项目何时已更新,但在命令或更新后项目的实际状态可能相同,则必须采用不同的方法。您需要使用的第二个通道Openhab2 In 118节点,然后添加一个交换机节点以查找状态的更新。

项目<项目>已更改 [从<状态>] [更改为<状态>]
要围绕正在更改的项目状态创建触发器,您需要使用Openhab2 In 118节点。如果您只想在项目更改时触发事件,而不考虑 from/to,则需要评估节点是否收到了更改状态事件。

如果要评估特定值的更改,则可以使用计算"msg.payload.payload.oldValue"属性的开关来读取旧状态以创建"项目已更改 [from ]"触发器。

同样,如果要评估"[to <state>]",则需要添加第二个开关来检查"msg.payload.payload.value"属性。

如果您还想同时评估"[from <state>]"和"[to <state>]",则需要将这些开关串联起来,以创建"if 语句"中"and"条件的等效项。

0451d701eda04e0fc5629862a280e8ae59355627.png754×58 4.69 KB


基于时间的触发器
要创建要在特定时间触发的规则,例如 Openhab"Time cron <cron expression>"触发器,则插件节点位于大计时器 181进来了。此节点不仅替换了基于时间的触发器,还替换了通常使用 Astro 绑定的基于日出/日落的触发器。

从 BigTimer 信息中:

Bigtimer可能是最终的Node-Red计时器,可以在任何时间,日,月或特殊日期发送开始和结束条件的消息。
在最简单的情况下,Bigtimer不需要输入,您只需要考虑第一个输出。但Bigtimer可以做得更多。
第一个输出在您设置的 ON 或 OFF 时间发送一条消息(如果重复的复选框被勾选 - 每分钟一次),
第二个输出只是发送状态 - 每分钟 1 或 0,并在 msg.state 和 msg.time 中回显状态。(从 v1.5.6 开始,已向 msg 添加了多个属性)
第三个输出为两种状态发送可选消息 - 适用于语音输出或日志(这仅在 ON 或 OFF 时间发生)。
输入可用作替代。


8729b83a8d4059e385d21a4c9aedfee905dc1268.png430×679 62.1 KB


基于系统的触发器
我还没有尝试过基于系统的触发器,但如果/当我这样做时,将更新本节。

脚本

OpehHab 中的脚本是触发器之后的部分,您可以在其中设计规则的其他逻辑和操作。我已尝试在下面捕获尽可能多的常见类型的脚本操作,并将根据对本教程的反馈和我自己的经验继续添加到此列表中。

变量
在 Node-Red 中,您有两种不同类型的变量:

  • 流变量(或在 Node-Red 中说出流上下文) - 可用于选项卡上的任何流。这类似于规则文件中定义的变量可用于该文件中包含的任何规则的方式

  • 全局变量(全局上下文) - 这些变量可用于 Node-Red 部署中的任何流。它们取代了大多数人用来跨规则文件存储变量的虚拟交换机。

要在 Node-Red 中定义变量,请使用 Change 节点。

您可以从项目节点传输有效负载(状态),

也可以输入设置的值:

如果。。。然后 语句
在节点红色中,您利用开关来复制 If...然后是来自Openhab规则的语句。要复制多个"和(&&)"或"或(||)"检查,请使用串行(和)或并行(或)流。或者在这种情况下,如果(检查1||Check2) && Check3 && Check4)

每个开关都可以检查传入项的值或 Flow 或 Global 变量的值。

如果要根据 OpenHab 中其他项目的状态进行检查,有两种方法可以执行此操作。一种选择是将状态更改分配给变量,如上所示(变量)

另一种方法是使用 openhab2-get 节点来查找项目的状态。因为此节点返回包含项目名称、标签、状态等的单个响应对象。然后,您需要对稍作修改的主题执行逻辑检查,以指定要使用的主题。


cd6d1297de0f9e9b70b32ae84f686dd19dd6b85d.png787×83 5.43 KB




事例陈述
如果单个 Switch 节点可以针对多个条件评估项目状态或变量,则很容易使用这些条件来复制事例陈述。

操作
操作是"脚本"部分中 Openhab 规则的核心。以下是如何重现核心操作 24来自 NodeRed 中的 Openhab。

事件总线相关操作
[.sendCommand() / .postUpdate()]

在 Openhab2 节点中有openhab2-out 31用于向项目发送命令或更新的节点。若要指定 或 您可以使用来自先前节点的 msg.payload,请在它到达 openhab2-out 节点之前使用 Change 节点对其进行更改,或者使用 openhab2-out 节点中的 Payload 覆盖字段。若要指定是执行 sendCommand 还是 postUpdate,可以在 openhab2-out 节点上游的 msg.topic 中指定它,也可以使用节点的 Topic 属性进行指定。

计时器
计时器 用于 Openhab 中的许多不同场景。我试图在下面捕获许多这些场景,以及如何在Node-Red中重现它们。

延迟操作
大多数计时器用于将特定操作延迟到相对较晚的时间点(即在特定时间间隔后关闭灯光)。Node-Red 有一个 Delay 节点,用于执行与设置的时间延迟相同的时间。

在定义的时间段内
阻止其他操作 在 Openhab 中,很多时候,当您不希望操作在前一个操作的特定时间范围内发生时,可以通过在第一个操作中设置计时器,然后检查计时器在第二个操作尝试发生时是否仍处于活动状态来实现。在 Node-Red 中,有几种不同的方法可以实现此目的,具体取决于所涉及的一些细微差别。一种是在延迟内使用"速率限制",并告诉延迟丢弃延迟期间传入的任何消息。

您还可以使用"节点红色"中的"触发器"节点。这些节点非常灵活,允许您在某个时间段开始时、结束时或两者期间发送操作。如果发生某些事件,您还可以扩展触发器。因此,例如,如果您有一个运动传感器触发一盏灯,然后希望它在运动传感器的最后一次触发后关闭,则可以按如下方式使用触发器:

如您所见,使用延迟和触发器有许多不同的方法可以解决相同的问题。

日志记录
日志记录是 Node-Red 的一大优势。可以创建可从编辑窗口或 File 节点看到的即时调试输出,以便将条目写入外部日志文件。

通知

虽然 Node-RED 有一些插件节点来帮助支持不同类型的通知,但我希望仍然能够利用 OpenHAB 的一些内置功能。这需要设置必要的OpenHAB项目和规则,以与OpenHAB的功能进行交互。

通过 OpenHAB 云连接器广播通知
http://docs.openhab.org/addons/io/openhabcloud/readme.html 10您可以使用移动应用程序访问您的系统并接收广播通知http://www.myopenhab.org/ 4.要将其集成到 Node-RED 中,需要一个项目来携带通知信息,并需要一个规则来触发通知。

项目定义:

String  vNotification  "Notification [%s]"`

通知规则:

rule "Send Notification"when
	Item vNotification received updatethen
	sendBroadcastNotification(vNotification.state.toString)end

最后是一个 Node-RED 流来发送通知。在这里,我使用了一个更改节点来创建我的短信:
图像
图像

您还可以使用模板节点将其他有效负载或主题包含在通知消息中:
图像
图像

如果您想在邮件中添加时间戳,我能够将以下内容放在一起以创建一个简单的语言时间戳(即下午3:32)

图像

c8605074da1fccf4bdf118311b045d68d58f511a.png713×103 8.57 KB


图像

a4d710fcd8fcf90db4391d7e336c9df1a30743d1.png843×295 8.95 KB


用于剪切和粘贴目的:

msg.payload =  msg.payload + new Date().toLocaleTimeString('en-US',{timeZoneName: 'short'});return msg;

Audio & Voice
OpenHAB能够播放音频文件并将文本转换为语音转换:http://docs.openhab.org/configuration/multimedia.html 4.为了利用此集成,我们遵循与上面的广播通知类似的方法,使用自定义项和规则与 Node-RED 流的组合。

首先触发文本到语音转换(假设您已经如上所述在OpenHAB中设置了所有内容)。

项目定义:

String vSpeech

语音规则:

规则"发送语音"

项目 vSpeech 收到更新
时,然后
说(vSpeech.state.toString)
结束

最后是一个 NodeRed 流,将它连接在一起。
图像

我更进一步地控制了发送语音期间和之后的音量级别(在广播语音时将其调高并调低)。所以我创建了一个子流(https://github.com/node-red/node-red/wiki/Design:-subflows 5
图像
图像

同样,对于发送保存到目录中的音频文件:conf/sounds

项目定义:

String vSound

声音规则:

rule "Send Sound"when
	Item vSound received updatethen
    playSound(vSound.state.toString)end

和 Node-RED 流:
图像
图像

电子邮件
对于可以选择使用 SendMail 绑定的电子邮件http://docs.openhab.org/addons/actions/mail/readme.html 3或者,您可以使用电子邮件节点直接从 Node-RED 执行此操作https://flows.nodered.org/node/node-red-node-email 2.我在这里应用的一个技巧是,我不想使用我的smtp服务器信息配置每个节点实例,并且我希望能够打开和关闭发送电子邮件的功能(因此我在测试时没有向妻子发送垃圾邮件),因此创建了电子邮件子流和控制流。

电子邮件子流:
图像
图像
图像

控制流:
图像
图像
图像