Home Assistant Modbus Einrichtung

Guten Morgen zusammen,

erstmal vielen Dank für eure Beiträge, ich versuche jetzt schon ein paar Tage meinen F-Kessel über Modbus in HomeAssistant auszulesen.
Leider habe ich noch folgende Fehlermeldung, vielleicht könnt ihr mir helfen.

Ich habe die modbus.yaml wie im ersten Beitrag aufgebaut:

YAML:
  - name: modbus_hub
    type: rtuovertcp
    host: 192.168.20.33
    port: 502

    sensors:
      - name: HDG_Puffer1_oben_modbus
        unit_of_measurement: °C
        slave: 10
        address: 210
        input_type: input
        
      - name: HDG_Puffer1_oben_mitte_modbus
        unit_of_measurement: °C
        slave: 10
        address: 211
        input_type: input

      - name: HDG_Puffer1_mitte_modbus
        unit_of_measurement: °C
        slave: 10
        address: 212
        input_type: input

      - name: HDG_Puffer1_unten_mitte_modbus
        unit_of_measurement: °C
        slave: 10
        address: 213
        input_type: input


Diese Fehlermeldung steht im Protokoll:

Pymodbus: modbus_hub: Error: device: 10 address: 210 -> Modbus Error: [Connection] Not connected[AsyncModbusTcpClient 192.168.20.33:502

Den RS485 Converter habe ich an das Panel angeschlossen, ich denke die Verbindung funktioniert, da die Act LED ab und zu leuchtet und wenn ich die Verbindung trenne, dann nicht.

Danke schonmal.

LG Kay
 
Also lt. Der Registerlistebauf Seite 1 des Beitrages ist 210 ja auch ein Statusregister und die Temperaturwerte fangen bei 211 an.
 
Die Vorredner mussten immer -1 rechnen, damit es geklappt hat. Wenn ich die 210 auskommentiere, dann geht es auch mit der 211 nicht.
 
Wie hast du den den RS485 Konverter eingestellt? bzw. was für einen hast du?
Mein erster Konverter hat auch nicht funktioniert.
 
Ah, das ist ja interessant. Ich habe einen von Waveshare:

1740484483710.png

Das sind meine Einstellungen:
1740484573618.png

Die Verbindung zum Converter steht jetzt aber schonmal und ich bekomme folgende Fehlermeldung:

Pymodbus: modbus_hub: Error: device: 10 address: 210 -> pymodbus returned isError True
 
Mach mal bei "Multi-Host-Setting" das Protokoll auf "TCP to RTU" und in der Home Assistant YAML statt "rtuovertcp" nur tcp.
dann hast du die gleiche Einstellung wie ich, und bei mir funktioniert es!
 
Zuletzt bearbeitet:
YAML:
  - name: modbushub
    type: tcp
    host: 192.168.30.115
    port: 502

    sensors:
      - name: Kesselwarnungen_modbus
        slave: 1
        address: 10
        input_type: holding
        data_type: uint16

      - name: Betriebsmeldung_Kessel_modbus
        slave: 1
        address: 30
        input_type: holding
        data_type: uint16

      - name: Betriebsphase_Kessel_modbus
        slave: 1
        address: 71
        input_type: holding
        data_type: uint16

      - name: Restsauerstoff_Kessel_modbus
        unit_of_measurement: "%"
        slave: 1
        address: 91
        input_type: holding
        data_type: uint32
        
      - name: Kesseltemperatur_modbus
        unit_of_measurement: "°C"
        slave: 1
        address: 103
        input_type: holding
        data_type: uint16

      - name: Puffer_1_oben_modbus
        unit_of_measurement: "°C"
        slave: 1
        address: 210
        input_type: holding
        data_type: uint16

      - name: Puffer_1_mitte_modbus
        unit_of_measurement: "°C"
        slave: 1
        address: 212
        input_type: holding
        data_type: uint16

      - name: Puffer_1_unten_modbus
        unit_of_measurement: "°C"
        slave: 1
        address: 214
        input_type: holding
        data_type: uint16

      - name: Puffer_2_oben_modbus
        unit_of_measurement: "°C"
        slave: 1
        address: 235
        input_type: holding
        data_type: uint16

      - name: Puffer_2_mitte_modbus
        unit_of_measurement: "°C"
        slave: 1
        address: 237
        input_type: holding
        data_type: uint16

      - name: Puffer_2_unten_modbus
        unit_of_measurement: "°C"
        slave: 1
        address: 239
        input_type: holding
        data_type: uint16

      - name: Oelbrenner_betrieb_modbus
        slave: 1
        address: 251
        input_type: holding
        data_type: uint16

      - name: Heizkreis_Vorlauf_modbus
        unit_of_measurement: "°C"
        slave: 1
        address: 286
        input_type: holding
        data_type: uint16

      - name: Brauchwasser_temp_modbus
        unit_of_measurement: "°C"
        slave: 1
        address: 485
        input_type: holding
        data_type: uint16
        
      - name: Statuswort_484
        slave: 1
        address: 484
        input_type: holding
        data_type: uint16
 
Servus,
mit Hilfe der Einträge in diesem Forum habe ich bei meinem HDG Euro 30 die Temperaturen der Puffer und die Vorlauftemperaturen der Heizkreise mit einem RS485 zu USB Konverter und der Python Bibliothek minimalmodbus auslesen können. Mit einem RS485 zu TTL Konverter und einem ESP32 möchte ich mit ESPHome diese Werte und eventuell weitere Werte zyklisch abfragen und im Home Assistant darstellen. Weil ich auch gerne den Status der Heizkreispumpen darstellen möchte würde mir die Registerliste weiterhelfen. @ktmexc könntest du mir die Modbus-Adressen von HDG dafür zukommen lassen?
 
Mit der geteilten Registertabelle (danke nochmal dafür) habe ich mit einem ESP32 von seeed studio mit dem Namen
seeed_xiao_esp32c3 und einem TTL zu RS485-Modul einen ausreichend kompakten und leistungsarmen Aufbau hinbekommen, dass ich zur Versorgung die 5V am Display des Euro30 verwenden konnte. Die Verdrahtung hat sich auf A und B für den RS485-Bus und die Versorgungsadern beschränkt. Die Software für den ESP32 ist mit ESPHome aus einer yaml-Datei compilierbar. Die so gelesenen Register können in Home Assistant mit der ESPHome-Integration ohne weiteren Konfigurationsaufwand angezeigt werden. Über den visuellen Editor im Home Assistant habe ich mir damit ein Dashboard mit den für mich interessanten Daten erstellt.
Den Pumpenstatus lese ich mit einer bitmask als binären Sensor. Im Home Assistant werden mir die Pumpen dann als Ein oder Aus dargestellt.

Ich hoffe ich kann mit diesem Post jemandem weiterhelfen, ähnlich wie mir durch diesen Thread geholfen worden ist.

Aufbau_ESP32_RS485.jpg
1742998905063.png

YAML:
esphome:
  name: hdg_euro_30

esp32:
  board: seeed_xiao_esp32c3
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: "xxx"

ota:
  - platform: esphome
    password: "xxx"

wifi:
  networks:
  - ssid: "xxx"
    password: "xxx"
  - ssid: xxx
    password: xxx

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Hdg Euro 30 Fallback Hotspot"
    password: "xxx"

captive_portal:
    
#Konfiguration für Modbus-UART
uart:
  tx_pin: GPIO21
  rx_pin: GPIO20
  baud_rate: 19200

modbus:
  id: modbus1
  send_wait_time: 100ms

modbus_controller:
  - id: modbus_device
    address: 0x1
    modbus_id: modbus1
    update_interval: 60s
    command_throttle: 50ms
    setup_priority: -10

sensor:
  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Puffer 1 oben"
    register_type: holding
    address: 210
    unit_of_measurement: "°C"
    value_type: S_WORD
    device_class: temperature

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Puffer 1 mitte"
    register_type: holding
    address: 212
    unit_of_measurement: "°C"
    value_type: S_WORD
    device_class: temperature

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Puffer 1 unten"
    register_type: holding
    address: 214
    unit_of_measurement: "°C"
    value_type: S_WORD
    device_class: temperature

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Pufferladegrad 1"
    register_type: holding
    address: 215
    unit_of_measurement: "%"
    value_type: S_WORD

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Puffer 2 oben"
    register_type: holding
    address: 235
    unit_of_measurement: "°C"
    value_type: S_WORD
    device_class: temperature

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Puffer 2 mitte"
    register_type: holding
    address: 237
    unit_of_measurement: "°C"
    value_type: S_WORD
    device_class: temperature

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Puffer 2 unten"
    register_type: holding
    address: 239
    unit_of_measurement: "°C"
    value_type: S_WORD
    device_class: temperature

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Kesselvorlauf"
    register_type: holding
    address: 103
    unit_of_measurement: "°C"
    value_type: S_WORD
    device_class: temperature

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Kesselrucklauf"
    register_type: holding
    address: 105
    unit_of_measurement: "°C"
    value_type: S_WORD
    device_class: temperature

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Abgastemperatur"
    register_type: holding
    address: 97
    unit_of_measurement: "°C"
    value_type: S_WORD
    device_class: temperature

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Restsauerstoff"
    icon: 'mdi:percent'
    register_type: holding
    address: 91
    unit_of_measurement: "%"
    value_type: S_WORD
    accuracy_decimals: 1
    filters:
      multiply: 0.1
    lambda: !lambda |-
      if((x > 200.0)||(x < -200)){
        return 200.0;
      }
      else{
        return x;
      }

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Betriebsphase"
    register_type: holding
    address: 71
    unit_of_measurement: ""
    value_type: S_WORD

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Wartungsmeldung"
    register_type: holding
    address: 20
    unit_of_measurement: ""
    value_type: S_WORD

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Restlaufzeit bis Wartung"
    register_type: holding
    address: 21
    unit_of_measurement: "h"
    value_type: S_WORD

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Freilufttemperatur"
    register_type: holding
    address: 40
    unit_of_measurement: "°C"
    value_type: S_WORD
    device_class: temperature
    state_class: measurement

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Heizkreis 1 Vorlauf"
    register_type: holding
    address: 286
    unit_of_measurement: "°C"
    value_type: S_WORD
    device_class: temperature

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Heizkreis 2 Vorlauf"
    register_type: holding
    address: 311
    unit_of_measurement: "°C"
    value_type: S_WORD
    device_class: temperature

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Brauchwasser oben"
    register_type: holding
    address: 485
    unit_of_measurement: "°C"
    value_type: S_WORD   
    device_class: temperature

binary_sensor:
  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Heizkreispumpe 1"
    register_type: holding
    address: 284
    bitmask: 0x2000

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Heizkreispumpe 2"
    register_type: holding
    address: 309
    bitmask: 0x2000

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Netzpumpe"
    register_type: holding
    address: 434
    bitmask: 0x2000

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Brauchwasserpumpe"
    register_type: holding
    address: 484
    bitmask: 0x2000

  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Kesselpumpe"
    register_type: holding
    address: 79
    bitmask: 0x2000
 
YAML:
  - platform: modbus_controller
    modbus_controller_id: modbus_device
    name: "Restsauerstoff"
    icon: 'mdi:percent'
    register_type: holding
    address: 91
    unit_of_measurement: "%"
    value_type: S_WORD
    accuracy_decimals: 1
    filters:
      multiply: 0.1
    lambda: !lambda |-
      if((x > 200.0)||(x < -200)){
        return 200.0;
      }
      else{
        return x;
      }



@V01der was kommt bei dir für ein Wert bei Restsauerstoff? Ich habe es nicht in ESP-Home sondern eine modbus yaml. mein "roher Wert ohne Feuer" beträgt -32768
Als Datentyp hab ich data_type: int16, ist das gleiche wie S_WORD, nur S_WORD funktioniert in der modbus yaml nicht.

Oder ich baue nochmal alles um zu ESP. Deine Lösung gefällt mir sehr gut! :p
 
Der Wert kommt bei mir auch, aber ich unterdrücke die Ausgabe dieses Werts durch den lambda-Ausdruck. Im Endeffekt ist das Register mit Adresse 91 für den Restsauerstoff eine Dualzahl mit 16 bit im Zweierkomplement. Der Wert -32768 ist als Dualzahl eine 1 gefolgt von 15 Nullen. Wenn man statt int16 bzw. S_WORD ein Zahlenformat ohne Vorzeichen wie uint16 bzw. U_WORD verwendet, wird die gleiche 1 gefolgt von 15 Nullen im Dezimalsystem als 65535 interpretiert. Das war der Wert den ich hatte, als ich mit meiner Konfigurations-yaml für ESPHome angefangen hatte.
Mit dem lambda-Ausdruck im ESP-Home wird geprüft, ob sich der Wert außerhalb des Bereichs von -200 bis +200 befindet. Wenn das der Fall ist, gebe ich +200 zurück. Andernfalls wird der gelesene Wert zurückgegeben. Mit den accuracy_decimals: 1 wird im Home Assistant dann 20.0 angezeigt. Das habe ich deswegen gemacht, dass ich im Verlauf eine Linie von ungefähr Umgebungssauerstoffkonzentration bis zum mit der Lambdasonde gemessenen Restsauerstoff bekomme. Der Wert ist aber eher willkürlich. Ich gehe davon aus, dass die Lambdasonde vom Kessel nicht abgefragt wird, wenn das Feuer aus ist und deshalb die 1 und 15 Nullen im 16 bit Register steht.
Soweit ich weiß, funktioniert der lambda-Ausdruck zwar im ESP-Home, aber nicht im Home Assistant. Stattdessen könnte vielleicht ein Sensor-Helper funktionieren, mit dem negative Werte abgeschnitten werden. Ein Ausdruck im Home Assistant könnte vielleicht so wie unten dargestellt aussehen. Dann sollte 0.0 ausgegeben werden, wenn der Wert negativ wird. Der Ausdruck unten ist aber ohne Gewähr. Den habe ich selber nicht ausprobiert.

YAML:
{{ [float(states('sensor.restsauerstoff')), 0.0] | max}}
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
6.501
Beiträge
62.513
Mitglieder
6.704
Neuestes Mitglied
Oligopol
Zurück
Oben