Modbus TCP-gegevens verzamelen en visualiseren

Laatst bijgewerkt:

Inleiding

Modbus is een veelgebruikt communicatieprotocol in industriële automatisering om gegevens uit PLC’s, meters en andere industriële apparaten te lezen. De Modbus-integratie van Home Assistant zet registerwaarden om in sensorentiteiten en toont hun actuele status en geschiedenis in een webinterface.

Deze handleiding gebruikt reComputer RK3576 en Home Assistant Container om temperatuur en luchtvochtigheid via Modbus TCP te lezen en een dashboard te maken. Voor een reproduceerbaar voorbeeld draait een Python Modbus TCP-simulator lokaal op RK3576, zonder PLC of extra sensoren.

Architectuur

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

Voorbereiding

Hardware

  • Eén reComputer RK3576 met ARM64 Linux.
  • Een Windows-, macOS- of Linux-computer die RK3576 via SSH en een browser kan bereiken.
  • Een lokaal netwerk met toegang tot RK3576.

Dit voorbeeld gebruikt Modbus TCP en is niet afhankelijk van de RS485-interface van RK3576.

Software

OnderdeelOmgeving van de handleiding
Besturingssysteem RK3576Armbian / Debian 12 Bookworm (ARM64)
PythonPython 3.11
Home AssistantHome Assistant Container, geïmplementeerd met Docker
Modbus-simulator127.0.0.1:1502
Home Assistant-webinterfacePoort 8123

Voltooi eerst de Docker-installatie en eerste configuratie in Home Assistant installeren op reComputer RK3576. Controleer de omgeving:

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

De netwerkmodus moet host zijn. Zo kan de container de simulator op 127.0.0.1:1502 van de RK3576-host bereiken.

Een Modbus TCP-gegevensbron maken

Stap 1: De Python-simulator schrijven

Maak via SSH verbinding met RK3576. Kopieer de volledige opdracht naar de terminal om ~/modbus_demo.py in de persoonlijke map van de huidige gebruiker te maken:

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

De simulator ondersteunt functiecode 03 om holdingregisters te lezen:

Adres (vanaf 0)WaardeRuwe waardeGetoonde waarde
0TemperatuurOngeveer 230–270Ongeveer 23–27 °C
1LuchtvochtigheidOngeveer 500–700Ongeveer 50–70%

Home Assistant gebruikt scale: 0.1 om ruwe registerwaarden om te zetten naar graden Celsius en percentages. De waarden veranderen in de tijd om livebewaking te demonstreren.

Stap 2: De simulator uitvoeren

Start de simulator:

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

Controleer of deze luistert:

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

Je hoort het luisteradres 127.0.0.1:1502 en dit logbericht te zien:

text
Modbus TCP server running at 127.0.0.1:1502

Deze demo draait op de achtergrond met nohup. Voer na het opnieuw starten van RK3576 de startopdracht opnieuw uit. Controleer vooraf de poort om dubbele instanties te voorkomen.

Modbus TCP configureren in Home Assistant

Stap 3: configuration.yaml bewerken

Omdat deze handleiding Home Assistant Container gebruikt, is de File Editor-app niet nodig. Bewerk het configuratiebestand dat op RK3576 is gekoppeld rechtstreeks via SSH.

Maak een back-up van de bestaande configuratie:

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

Open het bestand met beheerdersrechten:

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

Behoud de bestaande configuratie, zoals default_config: en frontend:, en voeg het volgende toe:

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

De belangrijkste parameters:

ParameterDoel
type: tcpModbus TCP gebruiken
host: 127.0.0.1Lokaal adres van de simulator
port: 1502Luisterpoort
slave: 1Modbus-unit-ID
address: 0 / 1Registeradressen voor temperatuur / luchtvochtigheid
input_type: holdingHoldingregisters lezen
scale: 0.1Ruwe waarden schalen naar getoonde waarden
scan_interval: 5Elke 5 seconden opvragen

Als configuration.yaml al een sleutel modbus: op het hoogste niveau bevat, voeg je de nieuwe hub toe aan de bestaande lijst in plaats van modbus: nogmaals te declareren.

Druk op Ctrl + O en vervolgens Enter om op te slaan. Sluit nano met Ctrl + X.

Stap 4: De configuratie controleren en de container opnieuw starten

Valideer eerst de Home Assistant-configuratie:

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

Start Home Assistant opnieuw nadat de controle is geslaagd:

bash
sudo docker restart homeassistant

Open dit adres in de browser van de computer:

text
http://<RK3576_IP>:8123

De Modbus-sensoren bekijken

Stap 5: Controleren of gegevens worden gelezen

Open in de geteste Home Assistant-interface Settings → Tools → States en zoek naar rk3576. Controleer of deze sensoren bestaan en numerieke waarden tonen:

  • RK3576 Room Temperature
  • RK3576 Room Humidity

Je kunt beide sensoren ook toevoegen aan het overzicht via Overview → Edit overview → Favorite entities → Add favorite.

Modbus-temperatuur- en vochtigheidssensoren van RK3576 controleren

Een Modbus-dashboard maken

Stap 6: Het dashboard maken

Open Settings → Dashboards en selecteer rechtsonder Add dashboard.

Vul bij Add new dashboard het volgende in:

VeldWaarde
TitleRK3576 Modbus Monitoring
IconEventueel een thermometerpictogram
URLrk3576-modbus
Admin-onlyUit
Add to sidebarAan

Selecteer Create en open het nieuwe dashboard via de zijbalk.

Het RK3576 Modbus-dashboard maken

Stap 7: Temperatuur- en vochtigheidsmeters toevoegen

Selecteer in de dashboardeditor + bij New section en kies Add to dashboard → By card → Gauge.

Configureer twee Gauge-kaarten:

InstellingTemperatuurmeterVochtigheidsmeter
EntityRK3576 Room TemperatureRK3576 Room Humidity
Minimum00
Maximum50100

Selecteer bij elke kaart Save.

Temperatuur- en vochtigheidsmeters toevoegen

Stap 8: Een geschiedenisgrafiek toevoegen

Selecteer opnieuw + bij New section en kies By card → History graph.

Bij History graph card configuration:

  1. Stel Title in op RK3576 Modbus Sensor History.
  2. Stel Hours to show in op 1.
  3. Verwijder de standaardentiteit Sun uit Entities (required).
  4. Selecteer Add entity en voeg RK3576 Room Temperature toe.
  5. Selecteer nogmaals Add entity en voeg RK3576 Room Humidity toe.
  6. Selecteer Save en daarna Done in de editor.

Temperatuur en luchtvochtigheid gebruiken verschillende eenheden, dus Home Assistant kan afzonderlijke grafieken tonen. Je kunt ook voor elke sensor een eigen grafiekkaart maken.

Een geschiedenisgrafiek voor Modbus-sensoren toevoegen

Resultaten

Het dashboard in het aangeleverde RK3576-testverslag bevat temperatuur- en vochtigheidsmeters en een geschiedenisgrafiek die veranderingen in de luchtvochtigheid toont.

Modbus TCP-bewaking van temperatuur en luchtvochtigheid met Home Assistant op reComputer RK3576

In die test is de volgende keten gecontroleerd:

Python Modbus TCP-simulator → RK3576 → Home Assistant Container → Webdashboard.

De temperatuur- en vochtigheidswaarden zijn gesimuleerd. Voor een echte PLC, slimme meter of Modbus TCP-sensor pas je host, port, slave, registeradressen en gegevenstypen aan het apparaat aan.

Samenvatting

Deze stappen realiseren Modbus TCP-gegevensverzameling, live statusweergave en geschiedenisvisualisatie op reComputer RK3576. Het voorbeeld biedt een reproduceerbare basis voor huisautomatisering, lokale IoT-bewaking en industriële gateways.

Referenties

Technische ondersteuning en productdiscussie

Ga voor vragen naar het Seeed Studio Forum.