Modbus TCP データ収集と可視化
最終更新:
はじめに
Modbus は、PLC、計測器、その他の産業機器からデータを読み取るために、産業オートメーションで広く使われている通信プロトコルです。Home Assistant の Modbus 連携により、レジスター値をセンサーエンティティに変換し、現在の状態と履歴を Web 画面に表示できます。
このチュートリアルでは、reComputer RK3576 と Home Assistant Container で Modbus TCP 経由の温湿度データを読み取り、監視ダッシュボードを作成します。再現しやすいよう、RK3576 上で Python Modbus TCP シミュレーターを実行するため、PLC や追加センサーは必要ありません。
構成
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 の OS | Armbian / Debian 12 Bookworm (ARM64) |
| Python | Python 3.11 |
| Home Assistant | Docker で導入した Home Assistant Container |
| Modbus シミュレーター | 127.0.0.1:1502 |
| Home Assistant Web 画面 | ポート 8123 |
まず、reComputer RK3576 に Home Assistant をインストールするの Docker 導入と初期設定を完了してください。環境を確認します。
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 を作成します。
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:シミュレーターの実行
シミュレーターを起動します。
nohup python3 ~/modbus_demo.py > ~/modbus_demo.log 2>&1 &待ち受け状態を確認します。
ss -lntp | grep ':1502'
cat ~/modbus_demo.log待ち受けアドレス 127.0.0.1:1502 と次のログが表示されることを確認します。
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 経由で直接編集します。
既存の設定をバックアップします。
sudo cp ~/homeassistant/config/configuration.yaml \
~/homeassistant/config/configuration.yaml.bak管理者権限でファイルを開きます。
sudo nano ~/homeassistant/config/configuration.yamldefault_config: や frontend: などの既存の設定を保持し、次の内容を追加します。
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: tcp | Modbus TCP を使用 |
host: 127.0.0.1 | シミュレーターのローカルアドレス |
port: 1502 | 待ち受けポート |
slave: 1 | Modbus ユニット ID |
address: 0 / 1 | 温度 / 湿度レジスターのアドレス |
input_type: holding | 保持レジスターを読み取る |
scale: 0.1 | 生の値を表示値に変換 |
scan_interval: 5 | 5 秒ごとにポーリング |
configuration.yamlにトップレベルのmodbus:がすでにある場合は、modbus:を再定義せず、既存のリストに新しいハブを追加してください。
Ctrl + O、Enter で保存し、Ctrl + X で nano を終了します。
手順 4:設定の確認とコンテナの再起動
まず Home Assistant の設定を検証します。
sudo docker exec homeassistant \
python -m homeassistant --script check_config --config /config検証に成功したら Home Assistant を再起動します。
sudo docker restart homeassistantコンピューターのブラウザーで次のアドレスを開きます。
http://<RK3576_IP>:8123Modbus センサーの確認
手順 5:データの読み取りを確認
検証時の Home Assistant 画面で Settings → Tools → States を開き、rk3576 を検索します。次のセンサーが存在し、数値を表示することを確認します。
RK3576 Room TemperatureRK3576 Room Humidity
Overview → Edit overview → Favorite entities → Add favorite から、両方のセンサーを概要画面に追加することもできます。

Modbus 監視ダッシュボードの作成
手順 6:ダッシュボードの作成
Settings → Dashboards を開き、右下の Add dashboard を選択します。
Add new dashboard で次を入力します。
| 項目 | 値 |
|---|---|
| Title | RK3576 Modbus Monitoring |
| Icon | 必要に応じて温度計アイコンを選択 |
| URL | rk3576-modbus |
| Admin-only | オフ |
| Add to sidebar | オン |
Create を選択し、サイドバーから新しいダッシュボードを開きます。

手順 7:温度と湿度の Gauge カードを追加
ダッシュボード編集画面の New section にある + を選択し、Add to dashboard → By card → Gauge を選びます。
2 枚の Gauge カードを設定します。
| 設定項目 | 温度 Gauge | 湿度 Gauge |
|---|---|---|
| Entity | RK3576 Room Temperature | RK3576 Room Humidity |
| Minimum | 0 | 0 |
| Maximum | 50 | 100 |
各カードで Save を選択します。

手順 8:履歴グラフの追加
New section の + をもう一度選択し、By card → History graph を選びます。
History graph card configuration で次を設定します。
TitleをRK3576 Modbus Sensor Historyに設定します。Hours to showを1に設定します。- Entities (required) から既定の
Sunエンティティを削除します。 - Add entity を選択し、
RK3576 Room Temperatureを追加します。 - Add entity を再度選択し、
RK3576 Room Humidityを追加します。 - Save を選択し、編集画面で Done を選択します。
温度と湿度は単位が異なるため、別々のグラフとして表示される場合があります。センサーごとに独立したグラフカードを作成することもできます。

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

この検証では、次の経路が確認されています。
Python Modbus TCP シミュレーター → RK3576 → Home Assistant Container → Web ダッシュボード。
温湿度はシミュレーション値です。実際の PLC、スマートメーター、Modbus TCP センサーを接続する場合は、host、port、slave、レジスターアドレス、データ型を機器の仕様に合わせて変更します。
まとめ
これらの手順で、reComputer RK3576 上の Modbus TCP データ収集、リアルタイム状態表示、履歴の可視化を実現できます。ホームオートメーション、ローカル IoT 監視、産業用ゲートウェイの再現可能な基礎例です。
参考資料
- Seeed Wiki:reComputer R1000 と Home Assistant の Modbus 連携
- Home Assistant Modbus 連携
- Home Assistant Linux / Container のインストール
技術サポートと製品に関する議論
質問は Seeed Studio Forum に投稿できます。