時間変化するsin波を表示

functionノードを使い、sin波形を生成します。

injectノード

injectノードは周期的にメッセージを送る設定にします。ここでは1秒に一回の更新としています。

functionノード

グローバル変数を使って前回の値を保持します。’angle’には角度(0~359)を格納し、毎回この値を読み込んで値を更新します。角度に+6しているのは、値の変化の速度の調整のためです。(1秒で1度ではあまりに変化が緩やか過ぎました)

var val = flow.get('angle')||0;
val = val + 6;

if(val >= 360){
   val = 0; 
}

flow.set('angle', val);
msg.payload = Math.sin(val * Math.PI / 180);

return msg;

chartノード

Y軸を-1~1に設定します。これはsin関数の出力範囲ですね。

実行結果

時間変化するsin波形を出力できました。横軸の表示範囲はchartノード設定のX-axisで変更できます。

0.5以上でアラートを上げる機能を追加

少し機能を追加して、波形がしきい値を超える場合にアラートを上げるようにしてみます。

しきい 値は0.5とします。 switchノードでは0.5を超える場合は1に、超えない場合は2にメッセージを送る設定にします。

templateノード

templateノードを使い、後段のtextノードに表示するメッセージを用意しておきます。今回は「正常」と「異常値検出」を表示するので二つのtemplateノードを用意します。 template にはHTMLが使えるので、文字の装飾が可能です。今回は0.5以上を異常値とするので、「異常値検出」を赤字にしてみます。

<font color="#FF0000">異常値検出</font>

textノード

textノードの設定はラベルの入力のみ。

実行結果

0.5を超えている間のみ、赤字で「異常値検出」と表示されました。

フロー

[{"id":"fe102279.157248","type":"tab","label":"sin波","disabled":false,"info":""},{"id":"e98d5097.0d7c2","type":"inject","z":"fe102279.157248","name":"kick(1s)","topic":"","payload":"kick(1s)","payloadType":"str","repeat":"1","crontab":"","once":false,"onceDelay":0.1,"x":800,"y":260,"wires":[["3c640227.27bc2e"]]},{"id":"3c640227.27bc2e","type":"function","z":"fe102279.157248","name":"sin波生成","func":"var val = flow.get('angle')||0;\n\nval = val + 6;\n\nif(val >= 360){\n   val = 0; \n}\n\nflow.set('angle', val);\n\nmsg.payload = Math.sin(val * Math.PI / 180);\n\nreturn msg;","outputs":1,"noerr":0,"x":1000,"y":260,"wires":[["20e1f318.b0e534","2a5e4c42.abf434"]]},{"id":"20e1f318.b0e534","type":"ui_chart","z":"fe102279.157248","name":"","group":"ff76c06d.c37258","order":2,"width":0,"height":0,"label":"sin波表示","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"-1","ymax":"1","removeOlder":"2","removeOlderPoints":"","removeOlderUnit":"60","cutout":0,"useOneColor":false,"colors":["#ff8040","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"outputs":1,"x":1560,"y":260,"wires":[[]]},{"id":"f6025201.2355","type":"ui_text","z":"fe102279.157248","group":"ff76c06d.c37258","order":1,"width":0,"height":0,"name":"","label":"状態","format":"{{msg.payload}}","layout":"row-spread","x":1570,"y":360,"wires":[]},{"id":"2a5e4c42.abf434","type":"switch","z":"fe102279.157248","name":"異常判定","property":"payload","propertyType":"msg","rules":[{"t":"lt","v":"0.5","vt":"num"},{"t":"gte","v":"0.5","vt":"num"}],"checkall":"true","repair":false,"outputs":2,"x":1200,"y":360,"wires":[["36168456.d4861c"],["6ac33cd9.dd9aac"]]},{"id":"36168456.d4861c","type":"template","z":"fe102279.157248","name":"正常","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"正常","output":"str","x":1390,"y":340,"wires":[["f6025201.2355"]]},{"id":"6ac33cd9.dd9aac","type":"template","z":"fe102279.157248","name":"異常","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<font color=\"#FF0000\">異常値検出</font>","output":"str","x":1390,"y":380,"wires":[["f6025201.2355"]]},{"id":"ff76c06d.c37258","type":"ui_group","z":"","name":"sin波","tab":"d26d2dc2.424ac8","order":1,"disp":true,"width":"6","collapse":false},{"id":"d26d2dc2.424ac8","type":"ui_tab","z":"","name":"sin波","icon":"dashboard","order":7,"disabled":false,"hidden":false}]