节点红色:如何在每分钟给定的秒数内注入火焰
Node red: how to make inject fire at given seconds per minute
是否可以制作一个每 5 秒触发一次的注入节点,但不依赖于部署,而是在固定的时间网格中。
例如,当部署在 hh:mm:03 时,间隔为 5 秒的注入节点将在 hh:mm:08、hh:mm:13、hh:mm:18 等处触发。
有没有办法延迟它,以便消息在 hh:mm:05、hh:mm:10、hh:mm:15 准确发送 (*),无论它是在哪一秒部署的?
一个可能的解决方案是将重复间隔设置为 1 秒,并使用功能节点仅传递适当的消息(即第一条消息在 5 秒的倍数时间戳之后到达),但也许有是更好的存档方式。
(*) 在机器的范围内,当然
编辑:根据要求描述流程实际执行的操作。该计时器用于环境监测(空气质量、水质、气象)的数据记录器。为了使该数据记录器与旧系统兼容,我们必须应用相同的时序约束。
暂时没有。
注入节点在"Interval between times"模式下使用cron调度引擎,但cron只有分钟级粒度。
1 秒的注入速率和过滤器可能是唯一的选择。
编辑:请只使用 Hannes 的回答中引用的 node-red-contrib-interval-multiples-timer 节点。它基于我的代码,所以没有理由当您只需单击几下即可安装 npm 包时,不再需要从此处复制粘贴代码。我只是将代码留在这里以供参考或作为您自己实验的起点。
最终,我创建了一个执行此操作的节点...我可能会稍后创建一个 NPM 包,现在这里是将其安装为本地节点的源代码。
要安装它,请使用下面给出的内容创建两个文件 interval-timer.js
和 interval-timer.html
,然后将它们复制到 Node-RED 安装的 nodes
目录中;例如,在 Raspberry Pi 和 Raspbian 上,这些文件转到 /root/.node-red/nodes/
。重新启动 Node-RED 后,新的 interval timer
节点将出现在节点面板的输入部分。
间隔-timer.js:
module.exports = function(RED) {
function IntervalTimerNode(config) {
RED.nodes.createNode(this,config);
var node = this;
var interval = config.interval;
var timer;
var timeHandler = function() {
node.send({payload: config.payload || Date.now()});
timer = setTimeout(timeHandler, interval - (Date.now() %interval)); // setInterval apparently has a considerable drift, so we use setTimeout to stay within the time grid as much as possible
};
timer = setTimeout(timeHandler, interval - (Date.now() %interval));
node.on('close', function() {
clearTimeout(timer);
});
}
RED.nodes.registerType("interval-timer", IntervalTimerNode);
}
间隔-timer.html:
<script type="text/javascript">
RED.nodes.registerType('interval-timer',{
category: 'input',
color: '#a6bbcf',
defaults: {
interval: {value:5000},
payload: {value: ""},
name: {value:""}
},
inputs:0,
outputs:1,
icon: "timer.png",
label: function() {
return this.name||"interval-timer";
}
});
</script>
<script type="text/x-red" data-template-name="interval-timer">
<div class="form-row">
<label for="node-input-interval"><i class="icon-repeat"></i> Interval [ms]</label>
<input type="number" id="node-input-interval">
</div>
<div class="form-row">
<label for="node-input-payload"><i class="icon-envelope"></i> Payload (defaults to current timestamp)</label>
<input type="text" id="node-input-payload" placeholder="Payload">
</div>
<div class="form-row">
<label for="node-input-name"><i class="icon-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-help-name="interval-timer">
<p>A interval timer that fires at multiples of the given interval, measured from Jan 1 1970</p>
</script>
node-red-contrib-interval-multiples-timer 正是你想要的。它以可配置的时间间隔注入消息。此间隔固定在上述时间网格上,例如它总是会在每分钟的第一秒触发。 https://flows.nodered.org/node/node-red-contrib-interval-multiples-timer
是否可以制作一个每 5 秒触发一次的注入节点,但不依赖于部署,而是在固定的时间网格中。
例如,当部署在 hh:mm:03 时,间隔为 5 秒的注入节点将在 hh:mm:08、hh:mm:13、hh:mm:18 等处触发。
有没有办法延迟它,以便消息在 hh:mm:05、hh:mm:10、hh:mm:15 准确发送 (*),无论它是在哪一秒部署的?
一个可能的解决方案是将重复间隔设置为 1 秒,并使用功能节点仅传递适当的消息(即第一条消息在 5 秒的倍数时间戳之后到达),但也许有是更好的存档方式。
(*) 在机器的范围内,当然
编辑:根据要求描述流程实际执行的操作。该计时器用于环境监测(空气质量、水质、气象)的数据记录器。为了使该数据记录器与旧系统兼容,我们必须应用相同的时序约束。
暂时没有。
注入节点在"Interval between times"模式下使用cron调度引擎,但cron只有分钟级粒度。
1 秒的注入速率和过滤器可能是唯一的选择。
编辑:请只使用 Hannes 的回答中引用的 node-red-contrib-interval-multiples-timer 节点。它基于我的代码,所以没有理由当您只需单击几下即可安装 npm 包时,不再需要从此处复制粘贴代码。我只是将代码留在这里以供参考或作为您自己实验的起点。
最终,我创建了一个执行此操作的节点...我可能会稍后创建一个 NPM 包,现在这里是将其安装为本地节点的源代码。
要安装它,请使用下面给出的内容创建两个文件 interval-timer.js
和 interval-timer.html
,然后将它们复制到 Node-RED 安装的 nodes
目录中;例如,在 Raspberry Pi 和 Raspbian 上,这些文件转到 /root/.node-red/nodes/
。重新启动 Node-RED 后,新的 interval timer
节点将出现在节点面板的输入部分。
间隔-timer.js:
module.exports = function(RED) {
function IntervalTimerNode(config) {
RED.nodes.createNode(this,config);
var node = this;
var interval = config.interval;
var timer;
var timeHandler = function() {
node.send({payload: config.payload || Date.now()});
timer = setTimeout(timeHandler, interval - (Date.now() %interval)); // setInterval apparently has a considerable drift, so we use setTimeout to stay within the time grid as much as possible
};
timer = setTimeout(timeHandler, interval - (Date.now() %interval));
node.on('close', function() {
clearTimeout(timer);
});
}
RED.nodes.registerType("interval-timer", IntervalTimerNode);
}
间隔-timer.html:
<script type="text/javascript">
RED.nodes.registerType('interval-timer',{
category: 'input',
color: '#a6bbcf',
defaults: {
interval: {value:5000},
payload: {value: ""},
name: {value:""}
},
inputs:0,
outputs:1,
icon: "timer.png",
label: function() {
return this.name||"interval-timer";
}
});
</script>
<script type="text/x-red" data-template-name="interval-timer">
<div class="form-row">
<label for="node-input-interval"><i class="icon-repeat"></i> Interval [ms]</label>
<input type="number" id="node-input-interval">
</div>
<div class="form-row">
<label for="node-input-payload"><i class="icon-envelope"></i> Payload (defaults to current timestamp)</label>
<input type="text" id="node-input-payload" placeholder="Payload">
</div>
<div class="form-row">
<label for="node-input-name"><i class="icon-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-help-name="interval-timer">
<p>A interval timer that fires at multiples of the given interval, measured from Jan 1 1970</p>
</script>
node-red-contrib-interval-multiples-timer 正是你想要的。它以可配置的时间间隔注入消息。此间隔固定在上述时间网格上,例如它总是会在每分钟的第一秒触发。 https://flows.nodered.org/node/node-red-contrib-interval-multiples-timer