Node-Redでマルチメータのデータを読む

この記事ではWindowsを使っています。

#はじめに
TEXIO GDM-8342( https://www.texio.co.jp/product/detail/46 )は、USBデバイスポートを備えたマルチメータです。Node-Redでマルチメータのデータを読み込んで表示しました。

#準備
##USBドライバのインストール
TEXIOのホームページ（ https://www.texio.co.jp/product/detail/46 )からGDM-834x用USBドライバ(Win10)  をダウンロードし、インストールします。

##Node-Redの準備
ここでは必要な以下の2つのパレットをインストールします。
<dl>
<dt>node-red-dashboard</dt>　<dd>グラフ表示で使います。</dd>
<dt>node-red-node-serialport</dt>　 <dd>Arduinoとシリアルポート通信をします。</dd>
</dl>
node-red-node-serialportは、”Tools for Native Modules”をインストールしておく必要があります。（Node.jsをインストールした時に一緒に入れていない場合は、スタート-->[Node.js]-->[Install Additional Tools for Node.js]でインストールしてください。）

#Flow
フローは以下の内容です。読み込んでください。

```nodered:flows.json
[
    {
        "id": "714806269dd4e39d",
        "type": "tab",
        "label": "フロー 1",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "59079920a821b896",
        "type": "inject",
        "z": "714806269dd4e39d",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "1",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payloadType": "date",
        "x": 190,
        "y": 100,
        "wires": [
            [
                "7b59323b3343dc3f"
            ]
        ]
    },
    {
        "id": "e0853489ddbfdb03",
        "type": "template",
        "z": "714806269dd4e39d",
        "name": "VAL1?",
        "field": "payload",
        "fieldType": "msg",
        "format": "handlebars",
        "syntax": "mustache",
        "template": "SAMP:COUN 1;VAL1?;SYST:LOC",
        "output": "str",
        "x": 650,
        "y": 100,
        "wires": [
            [
                "45c294f617fc927c"
            ]
        ]
    },
    {
        "id": "45c294f617fc927c",
        "type": "serial out",
        "z": "714806269dd4e39d",
        "name": "",
        "serial": "7acb69a22b74a550",
        "x": 790,
        "y": 100,
        "wires": []
    },
    {
        "id": "4f19bc660b42537a",
        "type": "serial in",
        "z": "714806269dd4e39d",
        "name": "",
        "serial": "7acb69a22b74a550",
        "x": 130,
        "y": 320,
        "wires": [
            [
                "6e6edef950734505",
                "987dcdf304d8790c",
                "24f03351219d050a",
                "b5833895ab539049"
            ]
        ]
    },
    {
        "id": "6e6edef950734505",
        "type": "debug",
        "z": "714806269dd4e39d",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 470,
        "y": 320,
        "wires": []
    },
    {
        "id": "b8caee8d4a1010c6",
        "type": "switch",
        "z": "714806269dd4e39d",
        "name": "",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "true"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 510,
        "y": 100,
        "wires": [
            [
                "e0853489ddbfdb03"
            ]
        ]
    },
    {
        "id": "7b59323b3343dc3f",
        "type": "ui_switch",
        "z": "714806269dd4e39d",
        "name": "",
        "label": "測定",
        "tooltip": "",
        "group": "48468ccc1018a9c3",
        "order": 1,
        "width": 0,
        "height": 0,
        "passthru": true,
        "decouple": "false",
        "topic": "topic",
        "topicType": "msg",
        "style": "",
        "onvalue": "true",
        "onvalueType": "bool",
        "onicon": "",
        "oncolor": "",
        "offvalue": "false",
        "offvalueType": "bool",
        "officon": "",
        "offcolor": "",
        "animate": false,
        "className": "",
        "x": 370,
        "y": 100,
        "wires": [
            [
                "b8caee8d4a1010c6"
            ]
        ]
    },
    {
        "id": "987dcdf304d8790c",
        "type": "ui_text",
        "z": "714806269dd4e39d",
        "group": "dd04f7f7db8ff68c",
        "order": 1,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "出力",
        "format": "{{msg.payload}}",
        "layout": "row-center",
        "className": "",
        "x": 450,
        "y": 380,
        "wires": []
    },
    {
        "id": "24f03351219d050a",
        "type": "ui_chart",
        "z": "714806269dd4e39d",
        "name": "",
        "group": "dd04f7f7db8ff68c",
        "order": 3,
        "width": 0,
        "height": 0,
        "label": "chart",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "",
        "ymax": "",
        "removeOlder": 1,
        "removeOlderPoints": "",
        "removeOlderUnit": "60",
        "cutout": 0,
        "useOneColor": false,
        "useUTC": false,
        "colors": [
            "#1f77b4",
            "#aec7e8",
            "#ff7f0e",
            "#2ca02c",
            "#98df8a",
            "#d62728",
            "#ff9896",
            "#9467bd",
            "#c5b0d5"
        ],
        "outputs": 1,
        "useDifferentColor": false,
        "className": "",
        "x": 450,
        "y": 440,
        "wires": [
            []
        ]
    },
    {
        "id": "b5833895ab539049",
        "type": "change",
        "z": "714806269dd4e39d",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "{\t   \"DateTime\":$now(\t       '[Y0001]/[M01]/[D01] [H01]:[m01]:[s01]',\t       '+0900'\t   ),\t   \"Data\":msg.payload\t}",
                "tot": "jsonata"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 400,
        "y": 500,
        "wires": [
            [
                "c65a69e8ec3d860c"
            ]
        ]
    },
    {
        "id": "c65a69e8ec3d860c",
        "type": "csv",
        "z": "714806269dd4e39d",
        "name": "",
        "sep": ",",
        "hdrin": "",
        "hdrout": "none",
        "multi": "one",
        "ret": "\\r\\n",
        "temp": "",
        "skip": "0",
        "strings": true,
        "include_empty_strings": "",
        "include_null_values": "",
        "x": 570,
        "y": 500,
        "wires": [
            [
                "dc809bc0452d50ad"
            ]
        ]
    },
    {
        "id": "dc809bc0452d50ad",
        "type": "file",
        "z": "714806269dd4e39d",
        "name": "",
        "filename": "d:\\data.csv",
        "appendNewline": false,
        "createDir": false,
        "overwriteFile": "false",
        "encoding": "none",
        "x": 730,
        "y": 500,
        "wires": [
            []
        ]
    },
    {
        "id": "d7a1ccd5680e08a9",
        "type": "ui_spacer",
        "z": "714806269dd4e39d",
        "name": "spacer",
        "group": "dd04f7f7db8ff68c",
        "order": 2,
        "width": 1,
        "height": 1
    },
    {
        "id": "7acb69a22b74a550",
        "type": "serial-port",
        "serialport": "COM4",
        "serialbaud": "115200",
        "databits": "8",
        "parity": "none",
        "stopbits": "1",
        "waitfor": "",
        "dtr": "none",
        "rts": "none",
        "cts": "none",
        "dsr": "none",
        "newline": "\\n",
        "bin": "false",
        "out": "char",
        "addchar": "\\r",
        "responsetimeout": "10000"
    },
    {
        "id": "48468ccc1018a9c3",
        "type": "ui_group",
        "name": "測定",
        "tab": "845add20c30e6d4f",
        "order": 1,
        "disp": true,
        "width": "6",
        "collapse": false,
        "className": ""
    },
    {
        "id": "dd04f7f7db8ff68c",
        "type": "ui_group",
        "name": "出力",
        "tab": "845add20c30e6d4f",
        "order": 2,
        "disp": true,
        "width": "10",
        "collapse": false,
        "className": ""
    },
    {
        "id": "845add20c30e6d4f",
        "type": "ui_tab",
        "name": "GDM-8342",
        "icon": "dashboard",
        "disabled": false,
        "hidden": false
    }
]
```

以下の感じのフローになります。
(上段)
タイムスタンプで1秒間隔のイベントを発生しています。データ間隔を変える場合はここを変更してください。
Dashboardのスイッチノード(測定）とSwitchノードはダッシュボードで測定をOn-Off出来るようにしています。SwitchノードでPayloadを通過させるかを決定します。
Templateノードで、マルチメータに送る電文を設定しています。
Serial Outノードは、マルチメータに送信する部分です。COMポートは自分の環境に合わせてください。出力の出力メッセージに分割文字を追加するに"\r"を追加しています。
(下段）
Serial Inノードはデータを受信します。
Debugノードは、特に必要ありませんが、ここでは受信の確認のために置いています。
Dashboardのテキストノードは値を表示します。
DashboardのChartノードはグラフを作成します。横幅とかは適当に変えてください。
Changeノードは受信した文字列を日時を加えてJSON形式に変換します。
CSVノードはJSONをCSV形式に変換します。
WriteFileノードは、ファイルを出力します。ファイル名は適当な感じに変更してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/d91f7f86-41a2-9d3c-d933-4efc52f83f77.png)

なおDashboard表示は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/2d4c1997-f2ff-a25e-6228-d13894d1ba62.png)

#最後に
実験で使うには、少し勝手が違いますね。
Node-RedはIoT向け？で長期間のデータをデータベースに保存とかは便利なのですが、ファイルOpenダイアログを使うアプリの代わりに使うには向かないような気がしました。（今回は、出力ファイルをUSBメモリに割り当てることで対処しています。 標準のWriteFileノードでは、ファイル名を変更のたびにデプロイが必要だったりします。）
また、DashboardのChartで縦軸の書式の変えれるかどうかわかりませんでした。10e-5ぐらいの値では0と表示されてしまいます。