Modbus Register schreiben

SilverShadow

New member
Hallo,

ich habe mich schon relative weit in HA und Modbus eingelesen. Ich lese mittlerweile Daten via der Modbus Integration mit Home Assistant aus und lass mir verschiedene Werte anzeigen.

Meine YAML sieht folgend aus:
YAML:
modbus:
  - name: hub1
    type: rtuovertcp
    host: 192.168.178.88
    port: 502
    sensors:
      - unique_id: 27acef9c-1f13-11ee-be56-0242ac120002
        name: EActual
        device_class: energy
        unit_of_measurement: "W"
        state_class: measurement
        slave: 247
        address: 781
        scan_interval: 7
        input_type: holding
        data_type: uint16

      - unique_id: c22bd43a-1f12-11ee-be56-0242ac120002
        name: ETotal
        device_class: energy
        unit_of_measurement: "Wh"
        state_class: measurement
        slave: 247
        address: 546
        scan_interval: 7
        input_type: holding
        data_type: uint32

      - name: EDay
        device_class: energy
        unit_of_measurement: "Wh"
        state_class: measurement
        slave: 247
        address: 566
        scan_interval: 7
        input_type: holding
        data_type: uint16

      - name: E-Limit
        device_class: energy
        unit_of_measurement: "%"
        state_class: measurement
        slave: 247
        address: 292
        scan_interval: 7
        input_type: holding
        data_type: uint16

Hier ein Auszug aus dem PDF mit der Übersicht der verfügaren Register:
XML:
Address | Name of Data               | Content | Unit  | Data Format | (R.W) Property | Range of Data | Remarks
0222    | ETotal                     |         | 0.1KW | INT32U      | R              |               | Total Energy Yield
030D    | Pac L                      |         | 1 W   | INT16U      | R              |               | low Byte of Feeding power
0236    | EDay                       |         | 0.1KW | INT16U      | R              |               | Energy yield in current day
0124    | Power limit setting with % |         | 1 %   | INT16U      | R/W            | 0-100         |

Die Adress in der Modbus Register Übersicht ist Hex, in der YAML dann unter address Dezimal.
Die Werte werden mir sauber im Home Assistan angezeigt, unter anderem natürlich auch das Power Limit mit zB 70%. Nun würde ich diese Register aber gern nicht nur lesen (R) sondern auch schreiben (W) mit einem Range of Date Wert von 1-100.

Ich habe mich da echt reingekämpft mit dem ganzen Modbus, RS485 TCP LAN Adapter, etc, aber ab hier steige ich nicht mehr durch. Wie kann ich mir in Home Assitant einen Schieberegler schaffen den ich von 1-100 regeln kann. Der Wert auf den der Regler geschoben wird, sollte dann ins Register geschrieben werden.

Ich würde mich sehr freuen wenn hier einer im Modbus Thema noch tiefer drinsteckt und mir hier helfen kann.
 
Vielen Dank für deine Antwort. Ich habe mich da dann wohl etwas unklar ausgedrückt... der "leere" Schieberegler war nicht das eigentliche Problem, das Problem ist die weitere Config, dass er funktioniert.
 
Ich hab mich mit Modbus noch nicht so auseinandergesetzt. Aber ich könnte mir vorstellen, das du zum Schreiben auch schon alles hast.
Veränder doch mal den Wert E-Limit und schau, ob der neue Wert nicht automatisch schon auf den Modbus gesendet wird.
 
Du must einen Dienst aufrufen: Modbus Write Register, um den Wert an den Modbus zu senden.
zB über eine Automation.
 
Danke noch für den weiteren Input. Jetzt funktioniert das ganze und ich kann das Wechselrichter Limit per Schieberegler setzen. Dann kann ich mich jetzt langsam mal informieren wie ich das ganze noch an mein Smart Meter kopple und eine weiche Regelung hinbekomme.

Danke euch!

Den Slider erstellt:
YAML:
#Schieberegler ELimit
input_number:
  sliderelimit:
    name: sliderelimit
    initial: 73
    min: 1
    max: 100
    step: 1

noch eine Automation erstellt:
YAML:
- id: '1689416298060'
  alias: Setze WR Limit
  description: ''
  trigger:
  - platform: state
    entity_id:
    - input_number.sliderelimit
  condition: []
  action:
  - service: modbus.write_register
    data:
      hub: hub1
      address: 292
      slave: 247
      value:
      - '{{ (states.input_number.sliderelimit.state) }}'
  mode: single
 
Hallo zusammen,
auch wenn das Thema schon etwas älter ist, hab ich ein ähnliches Problem:
Ich habe einen Deye12k Hybridumformer der über ein Waveshare mit Modbus an HA läuft.
meine modbus.yaml sieht auch ähnlich wie oben aus (die Formatierung ist etwas anders), funktioniert aber. Ich kann auch Optionen als Switch AN / AUS schalten.
Ich würde nun gerne den Ladestrom des Akkus (max. sind 100A) einstellbar machen. Die adresse des Registers ist 108. Wenn ich aber nun die Lösung von SliverShadow modifiziere und einfüge, zeigt mit HA beim Check wilde Fehlermeldungen von Zeilen, die gar nicht verändert wurden an? (siehe Bild)
Das schreiben scheint bei HA mit Modbus wohl ein sehr spezielles Thema zu sein?

YAML:
- name: Waveshare
    type: tcp
    host: 192.168.0.100
    port: 502
    sensors:

      - name: "Deye Deye Heat sink temperature"
        slave: 1
        address: 541
        input_type: holding
        data_type: int16
        unit_of_measurement: "°C"
        scale: 0.1
        offset: -100
        precision: 2

      - name: "Deye load frequency"
        slave: 1
        address: 655
        input_type: holding
        data_type: uint16
        unit_of_measurement: "Hz"
        scale: 0.01
        precision: 2

    input_number:
      sliderelimit:
        name: "sliderelimit"
        initial: 100
        min: 1
        max: 100
        step: 1

      - id: '1689416298060'
        alias: Setze Battery Charge Limit
        description: ''
        trigger:
        - platform: state
          entity_id:
          - input_number.sliderelimit
        condition: []
        action:
        - service: modbus.write_register
          data:
            hub: Waveshare
            address: 108
            slave: 1
            value:
            - '{{ (states.input_number.sliderelimit.state) }}'
        mode: single

die modbus.yaml ist nicht komplett, weil 1000 zeichen...
 

Anhänge

  • HA Fehler.png
    HA Fehler.png
    116,1 KB · Aufrufe: 3
Zuletzt bearbeitet:
Ich würde nun gerne den Ladestrom des Akkus (max. sind 100A) einstellbar machen. Die adresse des Registers ist 108. Wenn ich aber nun die Lösung von SliverShadow modifiziere und einfüge, zeigt mit HA beim Check wilde Fehlermeldungen von Zeilen, die gar nicht verändert wurden an? (siehe Bild)
Was du da gemacht hast, gehört nicht in die modbus.yaml, sondern in die autoamtions.yaml. Das habe ich dir schon in einem anderen Forum geschrieben.

Oder versuche so einen Eintrag in der modbus.yaml, vielleicht funktioniert es, ich habe es nicht getestet.

YAML:
      - name: "Battery Max Charging Current"
        slave: 1
        address: 108
        input_type: holding
        data_type: int16
        unit_of_measurement: "A"
        scale: 1
        rule: 1
        configurable:
          min: 0
          max: 185
        icon: "mdi:battery"
        range:
          min: 0
          max: 185
 
Zuletzt bearbeitet:
Wie amiko schon schreibt würfelst du hier Automation und Einlesen vom Modbus durcheinander.

Der Automationsteil gehört separat und muss das Modbus Register durch eine Action schreiben.
 
ok spannend, man muss beide Posts aus zwei Foren zusammen nehmen, damit´s verständlich wird...
ich hab also in die autoamtions.yaml (die info fehlt im anderen Forum) das eingefügt:

YAML:
- id: '1680707528756'
  alias: Setze Ladestrom
  description: ''
  trigger:
  - platform: state
    entity_id:
    - input_number.strom_sollwert
  condition: []
  action:
  - service: modbus.write_register
    data:
      hub: Waveshare
      address: 108
      slave: 1
      value:
      - '{{ (states.input_number.strom_sollwert.state) }}'
  mode: single

und einen Helfer als Input number (input_number.strom_sollwert) erstellt, den ich im Dashboard auch entsprechend einstellen kann (ich hab lediglich von 0-100A als Bereich, da mein Akku nicht mehr kann:
1728411501792.png
wenn ich aber das Register 108 auslese, bleibt der 100A Wert stehen und verändert sich nicht.
Ein Fehler wird mir keiner angezeigt?

Der hier im vorletzten Beitrag gezeigte code für die modbus.yaml funktioniert übrigens nicht. --> Fehler beim Config Check

@amiko vielen dank (auch wenns über über zwei Forenbeiträge ging), bisher waren das für mich als Anfänger die besten Infos.
 
Der hier im vorletzten Beitrag gezeigte code für die modbus.yaml funktioniert übrigens nicht. --> Fehler beim Config Check
Ich habe es gerade getestet, mit dem gleichen Ergebnis.

Mit der Automatisierung versuche bitte folgendes: in HA links auf Einstellungen klicken, dann auf Automatisierungen & Szenen, dort sollte eine Automatisierung mit dem Namen "Setze Ladestrom" zu finden sein. Kontrolliere, ob die Automatisierung eingeschaltet ist, der Schieber muss nach rechts zeigen und blau sein. Du kannst die Automatisierung manuell ausführen. Auf die 3 Punkte und ausführen.

und noch was, die Datei configuration.yaml muss folgenden Eintrag enthalten
automation: !include automations.yaml
 
Zuletzt bearbeitet:
ok, erklärt, warums nicht geht:
ich kann in die autoamtions.yaml den Code schreiben und speichern, HA entfernt aber den Code immer wieder?! damit fehlt die Automatisierung und der Wert im Register ändert sich natürlich nicht 😢
 
ok, habs hinbekommen: in HA links auf Einstellungen klicken, dann auf Automatisierungen & Szenen --> Dann auf Automatisierung erstellen und dann rechts oben auf die drei Punkte als YAML bearbeiten.
Der Code muss aber Modifiziert werden:
YAML:
alias: setze Ladestrom
description: ""
trigger:
  - platform: state
    entity_id:
      - input_number.strom_sollwert
condition: []
action:
  - data:
      hub: Waveshare
      address: 108
      slave: 1
      value:
        - "{{ (states.input_number.strom_sollwert.state) }}"
    action: modbus.write_register
mode: single

damit taucht die Automatisierung auch auf und funktioniert nun entsprechend.
@amiko auf jeden Fall vielen dank für den letzten schubs, damit sollte der Rest von alleine gehen :cool:👍
 
Vielleicht noch als allgemeine Frage:
Warum man den Umformer (und ich denke, da geben sich die verschiedenen Umformer nicht viel?) über die modbus.yaml auslesen und dort auch die Schalter für Funktionen rein packen kann aber bei Zahlenwerten das derart umständlich ist, kann mir wohl keiner wirklich erklären?!
Zumal es bei git für den Deye eine ModBus lösung über einen ESP32 (aber wlan) gibt, der alles (lesen und schreiben von Schaltern und Zahlenwerten) in einer YAML Datei macht.
 
Eigentlich ist die Erklärung ganz einfach.
Die Modbus.yaml ist eine reine Leseaktion, da damit können nur Werte von einem Modbusteilnehmer gelesen werden, hier wird NICHTS gesendet (geschrieben).
Schreiben passiert in HA nur über „Aktionen“.
 
aber ein Schalter sendet doch auch bzw. schreibt ein 0/1 Wert?!

In der modbus.yaml funktionieren diese Schalter:

YAML:
      - name: "Deye Switch on/off (Achtung!)"
        address: 80
        write_type: holdings
        slave: 1
        command_on: 1
        command_off: 0
        verify:
            input_type: holding
            address: 80
            delay: 2
            state_on: 1
            state_off: 0

      - name: "Deye Solar_sell"
        address: 145
        write_type: holdings
        slave: 1
        command_on: 1
        command_off: 0
        verify:
            input_type: holding
            address: 145
            delay: 2
            state_on: 1
            state_off: 0

      - name: "Deye Grid_Charge"
        address: 130
        write_type: holdings
        slave: 1
        command_on: 1
        command_off: 0
        verify:
            input_type: holding
            address: 130
            delay: 2
            state_on: 1
            state_off: 0
 
Da hast du natürlich Recht, von daher ist meine Erklärung falsch bzw unvollständig.
Mit der Definition eines Switches in der Modbus.yaml wird in HA ja eine Entität geschaffen deren grundsätzliche Eigenschaft es ist einen „Befehl“ zu senden, damit erledigt HA dies „Aktion“ senden sozusagen im Hintergrund. Hier nimmst du ja aber einen „Helfer“ der sozusagen erst mal nichts mit dem Modbus zu tun hat. Der weiß ja gar nicht wohin sein Wert gehen soll. Und in der Modbus Integration gibt es diese Zuordnung ja nicht, deshalb muss man das von Hand erledigen.
 
ok soweit auch verständlich. Meine Annahme basierte darauf das es dieses Projekt: klatremis / esphome-for-deye auf github gibt.
In dem Projekt wird der ganze Umformer in einem rutsch in einer YAML Datei (wohl auch über MODBUS) definiert.

ob ich da einen esp32 über wlan oder den waveshare per lan anbinde, macht das im HA so einen unterschied?! Der esp32 ist halt Bastellösung, während der Waveshare auf einer Hutschiene sitzt, Strom per PoE bekommt und eine Isolierung zum Umformer hat.
 
Sorry da kann ich leider gar nichts zusagen, da ich mich mit esp32 nicht auskenne. Ichbhane nur schon in verschiedenen Zusammenhängen gelesen das vieles in esp32 einfacher sein soll.
 

Zurzeit aktive Besucher

Neueste Beiträge

Letzte Anleitungen

Statistik des Forums

Themen
5.390
Beiträge
53.396
Mitglieder
5.182
Neuestes Mitglied
mwecom
Zurück
Oben