CoolMasterのレジスタアドレス(Set Point)をModbusからNode-REDを通して操作してみた

はじめに

今回はCoolMasterをNode-REDを通してModbusで操作してみましたので、その内容についてまとめてみます。これができますと、ネットワークを通してエアコンの設定温度などを変更することができます。

CoolMasterの設定(Modbusの有効化)

最初にCoolMaster本体の設定でModbusの通信を有効化させるための設定をします。

左上に見えるギヤのアイコン All Unitsを押して設定画面に進みます。

設定画面に進んだら、下に見えるBMS Settingsを押し、次に進みます。

1つ目の項目に見えるModbus IPをONに切り替えれば設定は完了です。

Telnetで接続することでModBusが有効化になっているのか確認する方法がありますので、試してみてください。

telnet 192.168.1.100 10102 などCoolmasterのIPアドレスと通信に使用するポートの10102を使用して接続します。すると、真っ黒な画面になるので「modbus」と入力して設定情報を表示させます。

>modbus
ModBus IP : enabled
server port : 502
server idle TO: 0 sec
CG4/5 ignore : none
IP TTM : –
DK VA->AirNet : –
OK

上記のように出力されればOKです。ModBus IPの項目がenabled(有効化)になっているので問題なさそうですね。

Node-REDの設定

Modbusの通信をさせるためには専用のパレットが必要となりますので、パレットの追加から「node-red-contrib-modbus」と検索して動作させるためのパレットを追加します。

使用するのは「Modbus – Read」と「Modbus – Write」のフローです。

Modbus-Readは設定内容を上記画像のように設定。設定温度(Set Point)に関連するレジスタアドレスは18を指定する必要があるので、こちらを指定します。

Modbus-Writeもアドレスに18を指定します。

jsonフロー(参考用)

ReadとWriteのフローが用意できたら、上記のように線でつなぎます。

# function
msg.payload = msg.payload[0] / 10;
return msg;

functionノードにはSet Pointが3桁(260など)で送られてくる数値を10で割って26など見やすくするために配置してあります。別にfunctionノードが無くてもReadの動作的には問題ありません。

Writeの手前にmsg.payloadに3桁の数値が入ったInjectノードを繋いで、設定したい温度の数値をWriteに渡してあげます。すると、Set Pointの数値が渡した値に変化し、エアコンの設定温度が変更されます。

以下コピペ用のフローです。(トリプルクリックでコピー推奨)

[{"id":"7febda7fc96ef81b","type":"tab","label":"CoolMaster Modbus","disabled":true,"info":"","env":[]},{"id":"86d34d6bc5c94d14","type":"modbus-write","z":"7febda7fc96ef81b","name":"","showStatusActivities":false,"showErrors":false,"showWarnings":true,"unitid":"0","dataType":"HoldingRegister","adr":"18","quantity":"1","server":"72dae1ff58c52973","emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"startDelayTime":"","x":520,"y":260,"wires":[["c484308b136080a9"],[]]},{"id":"962ec480cc744ab5","type":"inject","z":"7febda7fc96ef81b","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"250","payloadType":"num","x":270,"y":240,"wires":[["86d34d6bc5c94d14"]]},{"id":"c484308b136080a9","type":"debug","z":"7febda7fc96ef81b","name":"debug 15","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":720,"y":240,"wires":[]},{"id":"c89586fc54d19aac","type":"modbus-read","z":"7febda7fc96ef81b","name":"Read Temperature","topic":"","showStatusActivities":true,"logIOActivities":true,"showErrors":true,"showWarnings":true,"unitid":"0","dataType":"HoldingRegister","adr":"18","quantity":"1","rate":"10","rateUnit":"s","delayOnStart":false,"startDelayTime":"","server":"72dae1ff58c52973","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"x":310,"y":140,"wires":[["46f9a9fb448e40b2","827c33e73ec5152d"],[]]},{"id":"46f9a9fb448e40b2","type":"debug","z":"7febda7fc96ef81b","name":"Debug Read Temperature","active":true,"tosidebar":true,"complete":"true","targetType":"msg","x":550,"y":120,"wires":[]},{"id":"827c33e73ec5152d","type":"function","z":"7febda7fc96ef81b","name":"function 5","func":"msg.payload = msg.payload[0] / 10;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":180,"wires":[["6812e84afecd82de"]]},{"id":"6812e84afecd82de","type":"debug","z":"7febda7fc96ef81b","name":"debug 16","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":680,"y":180,"wires":[]},{"id":"c64f74bbe23b8812","type":"inject","z":"7febda7fc96ef81b","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"260","payloadType":"num","x":270,"y":280,"wires":[["86d34d6bc5c94d14"]]},{"id":"bbaaefb331a53510","type":"inject","z":"7febda7fc96ef81b","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"270","payloadType":"num","x":270,"y":320,"wires":[["86d34d6bc5c94d14"]]},{"id":"72dae1ff58c52973","type":"modbus-client","name":"ModbusNet","clienttype":"tcp","bufferCommands":true,"stateLogEnabled":false,"queueLogEnabled":false,"failureLogEnabled":true,"tcpHost":"192.168.1.100","tcpPort":"502","tcpType":"DEFAULT","serialPort":"/dev/ttyUSB","serialType":"RTU-BUFFERD","serialBaudrate":"9600","serialDatabits":"8","serialStopbits":"1","serialParity":"none","serialConnectionDelay":"100","serialAsciiResponseStartDelimiter":"0x3A","unit_id":"1","commandDelay":"1","clientTimeout":"1000","reconnectOnTimeout":true,"reconnectTimeout":"2000","parallelUnitIdsAllowed":true,"showErrors":false,"showWarnings":true,"showLogs":true}]

動作結果

10秒ごとにSet Pointの数値がデバッグノード上に表示されればOKです。Writeで渡した値の温度に変化するか確かめてみましょう。Readさせる頻度を増やし、1秒ごとにReadする必要があれば、ReadのPoll Rateを10millisecond(s)に変更してみてください。

まとめ

比較的カンタンにModbusから制御することができました。ただ、わからない状態で調べているときに本体設定側の操作でModbusを有効化する必要があると知るまでに少し時間を要してしまいました。

環境によってはファイアウォールの都合で動かなかったりする可能性もありそうなので、通信に使用するポートの状況を確認しながらお試しください。