PATLITE LA6-POEをOpenBlocks IoTの設定によりModbus/TCP接続しAzureなど各種クラウド/ホストからリモート制御する手順について

PATLITE LA6-POEはPOEに対応した積層情報表示灯です。

本製品は、PoEにより電源供給/ネットワーク接続されるとともに、PNS/PHN互換コマンド/HTTPによる制御に加え、Modbus/TCPでの制御が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316451/74ea785c-3cae-bae6-5e3f-cec6779c3251.png)


今回は、本製品を弊社OpenBlocks IoTシリーズの標準ファームウェア3.3.2よりmodbus client接続設定を行い、mqttおよびazure IoT Hub経由でのJSONメッセージによるリモート制御の方法について説明します。

## 初期設定について

今回はお借りした機器の設定のまま利用しましたので、
PATLITE LA6-POE IP address : 192.168.10.1/24
としてネットワーク回りの設定を行っています。

OpenBlocksはeth0をWAN側の接続に使用し、eth1をLA6-POE接続用に使用します。
BX/EX/VX1の場合は、WAN側接続にWiFiもしくはLTE/3Gを利用し、ローカル側のネットワークに有線LANを割り付ける必要があります。(BXシリーズの場合、USB二股ケーブルにUSBイーサネットアダプタを接続します)
ローカルのLANには192.168.10.xxx (xxxは1以外)を設定して下さい。

## Modbusクライアントの送受信設定

アプリ設定により、デフォルトアプリ起動制御内のPD Handler MODBUS Clientを「使用する」に、アプリ起動制御内もPD Handler MODBUS Clientを「使用する」に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316451/76016707-8ffa-1810-2b6e-2dcbaabce57d.png)
Modbus(C)登録タブにより、クライアントデバイスの登録を行います。
LA6-POEをデバイス番号mdcdev_0000001として登録しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316451/0d23a362-537b-2b15-e05a-3c3980fbe42f.png)
## 送受信設定

今回はAzureからAzure IoT Hubからのメッセージ送受信を行うとともに、ローカル側でもテストを行えるように、Node-REDのMOSCAノードによるMQTTブローカーを利用し、標準のMQTT接続によるメッセージ送受信も行いました。

### Azure IoT Hubの送受信設定
利用するAzure IoT Hub名を始めとした各種設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316451/77824a2f-e1d7-bc46-7008-2dc29ff9f079.png)
### MQTTサーバー設定
OpenBlocks本体側にもMQTTサーバを起動するため、以下の送受信設定を行います。

```
送信先ホスト: localhost
クライアントID: test
トピックプレフィックス: pub_root
受信トピックプレフィックス: sub_root
プロトコル: tcp
ポート番号: 1883
```
インターバルは今回は0に設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316451/6bcaf7ea-5544-874b-e8e6-c5f6217d938a.png)
### Modbusクライアントデバイス設定
前項で設定したmodbusクライアントデバイスに対しての送受信設定を行います。
定期的なステータスレポートを兼ねて、今回は30分毎に点灯状況とブザーの状況のレジスタ読み出しを行っています。
LA6-POEのレジスタは、コマンド送受信による開始アドレスは0からとなり、解説にあるレジスタアドレス1からのデータ(符号なし16ビット整数)が順に割り付けられます。
送受信設定として、iothubおよびmqttにチェックをし、iothub(Azure IoT Hub)については、Azureポータルにて設定したデバイスのIDとプライマリーキーを、MQTTについてはユニークID(任意)を設定します。

```
受信設定: 有効
読み込み方法: レジスタ出力 (function=3)
データタイプ: 符号なし16ビット整数
読み込み開始アドレス: 0
読み込みレジスタ数: 6
ユニットID: 1
取得時間間隔: 1800
使用プロトコル: TCP
接続アドレス: 192.168.10.1
接続ポート: 502
送受信設定: iothubとmqttにチェック
デバイスID(iothub): Azure IoT Hubにて登録したデバイスID
デバイスキー(iothub): Azure IoT Hubにて登録したデバイスのプライマリーキー
ユニークID(mqtt): 00001
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316451/1b1634d2-9858-e7d7-a26d-34008da1b43a.png)
## Node-REDを使用したローカルテスト

本体内のNode-REDに接続し、未導入であれば、node-red-contrib-mqtt-brokerを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316451/d07ff9b6-77da-4133-b9d9-529559ae089b.png)
MQTTノードを使用して、LA6-POEをmodbus制御するためのJSONデータを送受信します。
OpenBlocks IoTシリーズの標準ファームウェアのドキュメントの以下の項を参照してください。

[Modbusクライアントの下流方向制御](https://docs.plathome.co.jp/docs/openblocks/fw4/data_handling/modbus/down_stream_client)

Modbus/TCPによるデータハンドリングを行う場合のJSON形式のメッセージ構造は以下の様になります。
(以下の例は今回の設定値ではありません)

Write Single Registerの例
{"protocol":"tcp","node":"127.0.0.1","port":502,"unit":1,"address":10,"function":"0x06","values":[99]}

Write Multiple Registersの例
{"protocol":"tcp","node":"127.0.0.1","port":502,"unit":1,"address":10,"function":"0x10","number":2,"values":[99,88]}


以下のサンプルフローでは、mqttサーバ経由で、LEDユニット1～5までの制御レジスタに対して、点灯、点滅、消灯のコマンドを送信しています。

```
[{"id":"564d3141.2436e","type":"mosca in","z":"38faf32f.7487fc","mqtt_port":1883,"mqtt_ws_port":8080,"name":"","username":"","password":"","dburl":"","x":210,"y":120,"wires":[["42cdbfb5.14a36"]]},{"id":"42cdbfb5.14a36","type":"debug","z":"38faf32f.7487fc","name":"","active":false,"console":"false","complete":"false","x":440,"y":120,"wires":[]},{"id":"a79f1295.c7fcc","type":"mqtt in","z":"38faf32f.7487fc","name":"","topic":"pub_root/00001","qos":"2","broker":"417e1815.164238","x":400,"y":360,"wires":[["c23d25f4.8297e8"]]},{"id":"c23d25f4.8297e8","type":"debug","z":"38faf32f.7487fc","name":"","active":true,"console":"false","complete":"false","x":580,"y":280,"wires":[]},{"id":"38e5cace.462bc6","type":"mqtt out","z":"38faf32f.7487fc","name":"","topic":"sub_root/00001","qos":"","retain":"","broker":"417e1815.164238","x":590,"y":220,"wires":[]},{"id":"54cc2a32.669754","type":"inject","z":"38faf32f.7487fc","name":"全点灯","topic":"","payload":"{\"protocol\":\"tcp\",\"node\":\"192.168.10.1\",\"port\":502 ,\"unit\":1,\"address\":0,\"function\":\"16\",\"number\":5,\"values\":[257,257,257,257,257]}","payloadType":"json","repeat":"","crontab":"","once":false,"x":210,"y":180,"wires":[["38e5cace.462bc6"]]},{"id":"9c36b5c2.f63228","type":"inject","z":"38faf32f.7487fc","name":"全点滅","topic":"","payload":"{\"protocol\":\"tcp\",\"node\":\"192.168.10.1\",\"port\":502 ,\"unit\":1,\"address\":0,\"function\":\"16\",\"number\":5,\"values\":[258,258,258,258,258]}","payloadType":"json","repeat":"","crontab":"","once":false,"x":210,"y":240,"wires":[["38e5cace.462bc6"]]},{"id":"c4617601.076cb8","type":"inject","z":"38faf32f.7487fc","name":"全消灯","topic":"","payload":"{\"protocol\":\"tcp\",\"node\":\"192.168.10.1\",\"port\":502 ,\"unit\":1,\"address\":0,\"function\":\"16\",\"number\":5,\"values\":[256,256,256,256,256]}","payloadType":"json","repeat":"","crontab":"","once":false,"x":210,"y":300,"wires":[["38e5cace.462bc6"]]},{"id":"417e1815.164238","type":"mqtt-broker","z":"","broker":"127.0.0.1","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"","birthTopic":"","birthQos":"0","birthPayload":""}]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316451/4661ff81-9124-bd1c-31b7-effa5cf96e6c.png)
コマンド送信に対し、以下のレスポンスを受信します。

{"time":"2019-09-26T15:03:35.648+09:00","reply_to":"ffb15d3b141e865d00f4bc04b9c9471d","result":"done","memo":"LA6-POE","protocol":"tcp","node":"192.168.10.1","port":502,"unit":1,"address":0,"function":16,"data_type":"uint16_t","values":[257,257,257,257,257]}

上記のフローにより、LA6-POEの点灯制御をMQTTサーバ経由で行えることを確認しました。
## Azure IoT Hubからのコマンド送信

前前項にてAzure IoT Hubへの送受信設定は正しく行われている前提で、クラウドからのコマンド送信のテストを行います。デバイスに対するメッセージ送信のプログラムとしては、mosquittoやmqtt.fxなどが有名ですが、azure iot hubに関してはSASトークンの発行の手間などを考えると、node-redのazureiothubノード(node-red-contrib-azure-iot-hub)や、Microsoftから提供されるDevice Explorerを利用するのが簡単です。
Device Explorerの場合、以下の画面のように、Message to Deviceのタブより、送りたいデバイスを選択し、上記のJSONメッセージを入力してSendボタンを押すことにより、デバイスにメッセージが送信されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316451/e7f5af18-bb98-d6eb-a08f-5f28c5e6bd30.png)
レスポンスをDataタブより確認します。あらかじめデバイスを選択しMonitorボタンを押しておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316451/3081a65a-d002-e775-0cb3-92aaa538ca8a.png)
上記の手順により、Azureからのリモート制御の確認を行いました。
## 最後に
今回LA6-POEのModbus/TCPでの接続については、ゲートウェイ側に同様の機能を実現するためのプログラムを用意する必要がありますが、今回の例では本体の標準機能の設定のみでクラウド側からの遠隔操作を可能としており、システムの開発におけるゲートウェイ側の開発工数を削減することが出来るかと思います。
本製品は、近くOpenBlocks IoTシリーズの標準対応センサーデバイスとして記載する予定です。

--
(ご)　　Toshiya Goto
　　　　goto@plathome.co.jp