Modbus TCP データ収集と可視化

最終更新:

はじめに

Modbus は、PLC、計測器、その他の産業機器からデータを読み取るために、産業オートメーションで広く使われている通信プロトコルです。Home Assistant の Modbus 連携により、レジスター値をセンサーエンティティに変換し、現在の状態と履歴を Web 画面に表示できます。

このチュートリアルでは、reComputer RK3576 と Home Assistant Container で Modbus TCP 経由の温湿度データを読み取り、監視ダッシュボードを作成します。再現しやすいよう、RK3576 上で Python Modbus TCP シミュレーターを実行するため、PLC や追加センサーは必要ありません。

構成

text
Python Modbus TCP simulator
     127.0.0.1:1502
            ↓
     reComputer RK3576
            ↓
 Home Assistant Container
            ↓
 Live temperature/humidity / history graphs

準備

ハードウェア

  • ARM64 Linux を実行する reComputer RK3576 1 台。
  • SSH とブラウザーで RK3576 にアクセスできる Windows、macOS、または Linux コンピューター。
  • RK3576 にアクセスできるローカルネットワーク。

この例は Modbus TCP を使用し、RK3576 の RS485 インターフェースには依存しません。

ソフトウェア

項目チュートリアルの環境
RK3576 の OSArmbian / Debian 12 Bookworm (ARM64)
PythonPython 3.11
Home AssistantDocker で導入した Home Assistant Container
Modbus シミュレーター127.0.0.1:1502
Home Assistant Web 画面ポート 8123

まず、reComputer RK3576 に Home Assistant をインストールするの Docker 導入と初期設定を完了してください。環境を確認します。

bash
python3 --version
sudo docker ps --filter name=homeassistant
sudo docker inspect homeassistant --format '{{.HostConfig.NetworkMode}}'

ネットワークモードは host である必要があります。これにより、コンテナから RK3576 ホストの 127.0.0.1:1502 にあるシミュレーターにアクセスできます。

Modbus TCP データソースの作成

手順 1:Python シミュレーターの作成

SSH で RK3576 に接続します。次のコマンド全体をコピーして端末に貼り付け、現在のユーザーのホームディレクトリに ~/modbus_demo.py を作成します。

bash
cat > ~/modbus_demo.py <<'PY'
import math
import socketserver
import struct
import time


class ModbusHandler(socketserver.BaseRequestHandler):
    def read_exact(self, size):
        data = b""
        while len(data) < size:
            chunk = self.request.recv(size - len(data))
            if not chunk:
                return None
            data += chunk
        return data

    def handle(self):
        try:
            while True:
                header = self.read_exact(7)
                if not header:
                    break

                tid, pid, length, unit = struct.unpack(">HHHB", header)
                if pid != 0 or not 2 <= length <= 254:
                    break

                request = self.read_exact(length - 1)
                if not request:
                    break

                function = request[0]
                if function == 3 and len(request) == 5:
                    address, count = struct.unpack(">HH", request[1:])

                    if count < 1 or count > 2 or address + count > 2:
                        response = bytes([0x83, 2])
                    else:
                        temperature = round(
                            (25 + 2 * math.sin(time.monotonic() / 20)) * 10
                        )
                        humidity = round(
                            (60 + 10 * math.sin(time.monotonic() / 30)) * 10
                        )
                        registers = [temperature, humidity]
                        response = bytes([3, count * 2]) + b"".join(
                            struct.pack(">H", value)
                            for value in registers[address:address + count]
                        )
                else:
                    response = bytes([function | 0x80, 1])

                reply = struct.pack(">HHHB", tid, 0, len(response) + 1, unit) + response
                self.request.sendall(reply)
        except (OSError, ConnectionError):
            pass


class ModbusServer(socketserver.ThreadingTCPServer):
    allow_reuse_address = True
    daemon_threads = True


with ModbusServer(("127.0.0.1", 1502), ModbusHandler) as server:
    print("Modbus TCP server running at 127.0.0.1:1502", flush=True)
    server.serve_forever()
PY

シミュレーターは、保持レジスターを読み取る機能コード 03 に対応しています。

アドレス(0 から開始)値生の値表示値
0温度約 230–270約 23–27 °C
1湿度約 500–700約 50–70%

Home Assistant は scale: 0.1 でレジスター値を摂氏温度と百分率に変換します。値は時間とともに変化し、リアルタイム監視の動作を確認できます。

手順 2:シミュレーターの実行

シミュレーターを起動します。

bash
nohup python3 ~/modbus_demo.py > ~/modbus_demo.log 2>&1 &

待ち受け状態を確認します。

bash
ss -lntp | grep ':1502'
cat ~/modbus_demo.log

待ち受けアドレス 127.0.0.1:1502 と次のログが表示されることを確認します。

text
Modbus TCP server running at 127.0.0.1:1502

このデモは nohup でバックグラウンド実行します。RK3576 の再起動後は起動コマンドを再実行してください。重複起動を避けるため、起動前にポートを確認します。

Home Assistant の Modbus TCP 設定

手順 3:configuration.yaml の編集

Home Assistant Container を使用するため、File Editor アプリは不要です。RK3576 にマウントされている設定ファイルを SSH 経由で直接編集します。

既存の設定をバックアップします。

bash
sudo cp ~/homeassistant/config/configuration.yaml \
  ~/homeassistant/config/configuration.yaml.bak

管理者権限でファイルを開きます。

bash
sudo nano ~/homeassistant/config/configuration.yaml

default_config: や frontend: などの既存の設定を保持し、次の内容を追加します。

yaml
modbus:
  - name: rk3576_demo
    type: tcp
    host: 127.0.0.1
    port: 1502

    sensors:
      - name: RK3576 Room Temperature
        unique_id: rk3576_demo_temperature
        slave: 1
        address: 0
        input_type: holding
        data_type: uint16
        scale: 0.1
        precision: 1
        unit_of_measurement: "°C"
        device_class: temperature
        state_class: measurement
        scan_interval: 5

      - name: RK3576 Room Humidity
        unique_id: rk3576_demo_humidity
        slave: 1
        address: 1
        input_type: holding
        data_type: uint16
        scale: 0.1
        precision: 1
        unit_of_measurement: "%"
        device_class: humidity
        state_class: measurement
        scan_interval: 5

主なパラメーターは次のとおりです。

パラメーター用途
type: tcpModbus TCP を使用
host: 127.0.0.1シミュレーターのローカルアドレス
port: 1502待ち受けポート
slave: 1Modbus ユニット ID
address: 0 / 1温度 / 湿度レジスターのアドレス
input_type: holding保持レジスターを読み取る
scale: 0.1生の値を表示値に変換
scan_interval: 55 秒ごとにポーリング

configuration.yaml にトップレベルの modbus: がすでにある場合は、modbus: を再定義せず、既存のリストに新しいハブを追加してください。

Ctrl + O、Enter で保存し、Ctrl + X で nano を終了します。

手順 4:設定の確認とコンテナの再起動

まず Home Assistant の設定を検証します。

bash
sudo docker exec homeassistant \
  python -m homeassistant --script check_config --config /config

検証に成功したら Home Assistant を再起動します。

bash
sudo docker restart homeassistant

コンピューターのブラウザーで次のアドレスを開きます。

text
http://<RK3576_IP>:8123

Modbus センサーの確認

手順 5:データの読み取りを確認

検証時の Home Assistant 画面で Settings → Tools → States を開き、rk3576 を検索します。次のセンサーが存在し、数値を表示することを確認します。

  • RK3576 Room Temperature
  • RK3576 Room Humidity

Overview → Edit overview → Favorite entities → Add favorite から、両方のセンサーを概要画面に追加することもできます。

RK3576 の Modbus 温湿度センサーを確認

Modbus 監視ダッシュボードの作成

手順 6:ダッシュボードの作成

Settings → Dashboards を開き、右下の Add dashboard を選択します。

Add new dashboard で次を入力します。

項目値
TitleRK3576 Modbus Monitoring
Icon必要に応じて温度計アイコンを選択
URLrk3576-modbus
Admin-onlyオフ
Add to sidebarオン

Create を選択し、サイドバーから新しいダッシュボードを開きます。

RK3576 Modbus 監視ダッシュボードを作成

手順 7:温度と湿度の Gauge カードを追加

ダッシュボード編集画面の New section にある + を選択し、Add to dashboard → By card → Gauge を選びます。

2 枚の Gauge カードを設定します。

設定項目温度 Gauge湿度 Gauge
EntityRK3576 Room TemperatureRK3576 Room Humidity
Minimum00
Maximum50100

各カードで Save を選択します。

温度と湿度の Gauge カードを追加

手順 8:履歴グラフの追加

New section の + をもう一度選択し、By card → History graph を選びます。

History graph card configuration で次を設定します。

  1. Title を RK3576 Modbus Sensor History に設定します。
  2. Hours to show を 1 に設定します。
  3. Entities (required) から既定の Sun エンティティを削除します。
  4. Add entity を選択し、RK3576 Room Temperature を追加します。
  5. Add entity を再度選択し、RK3576 Room Humidity を追加します。
  6. Save を選択し、編集画面で Done を選択します。

温度と湿度は単位が異なるため、別々のグラフとして表示される場合があります。センサーごとに独立したグラフカードを作成することもできます。

Modbus センサーの履歴グラフを追加

実行結果

提供された RK3576 の検証記録では、温度と湿度の Gauge、および時間による湿度の変化を示す履歴グラフを含むダッシュボードが確認されています。

reComputer RK3576 上の Home Assistant Modbus TCP 温湿度監視

この検証では、次の経路が確認されています。

Python Modbus TCP シミュレーター → RK3576 → Home Assistant Container → Web ダッシュボード。

温湿度はシミュレーション値です。実際の PLC、スマートメーター、Modbus TCP センサーを接続する場合は、host、port、slave、レジスターアドレス、データ型を機器の仕様に合わせて変更します。

まとめ

これらの手順で、reComputer RK3576 上の Modbus TCP データ収集、リアルタイム状態表示、履歴の可視化を実現できます。ホームオートメーション、ローカル IoT 監視、産業用ゲートウェイの再現可能な基礎例です。

参考資料

技術サポートと製品に関する議論

質問は Seeed Studio Forum に投稿できます。