Modbus einrichten

Moin zusammen,

Ich komme immer noch nicht weiter mit dem einrichten vom Modbus im HA.
In der Hardware vom PI sehe ich den USB-Adapter RS485

Wie richte ich den Sensor in der yaml ein?
Wo finde ich den Sensor in HA?

Anbei meine yaml

Und der Screenshot vom USB-Adapter

Danke Gruß Jörg

1 „Gefällt mir“

So ganz straight forward scheint mir das in HA nicht dokumentiert zu sein.
Ich habe eine modbus.yaml angelegt, die in der Configuration.yaml auch verlinkt und da die Sensoren nach dem nachfolgenden Schema angelegt:

- sensors:
  - name: Modbus_PV_Power
    unit_of_measurement: W
    slave: 247
    address: 35138

Die Slave-Adress ist die des Gerätes das du abfragst (mein Wechselrichter hat eben die 247, meistens haben die Teile eine 1 als Standard. Aber das musst im Handbuch nachsehen).

Die adress ist die Registeradresse, die unit of measurement ergibt sich ebenfalls aus der Doku zu deinen Modbusregistern. Ich nutze zwar Modbus TCP, aber das sollte keinen Unterschied machen.

Leider habe ich auch keine Option gefunden, wie man die grundsätzliche Kommunikation zwischen dem Modbus Slave und HA checken kann. Bei mir war das ewiges Trial and Error…vlt weiss da jemand anderes mehr

Vielen Dank für deine Antwort.
Dann werde ich mal auf die Suche gehen, wo ich bei meinem SDM230 die Adressen finde.

Gruß Jörg

Hallo,

interessanter Weise müssen die Adressen für Modbus TCP komplett geschrieben werden (z. B. 30003) für ein Input-Register Adresse 2, bei Modbus RTU jedoch eben ohne Offset 30001.

Meine modbus-yaml sieht so aus: (für den Modbus RTU-Teil mit Stromzähler SDM72DM-V2 MID)

# modbus1
  # RS485-Verbindung zur Pool-Steuerung und Stromzaehlern
  - name: "modbus1"
    type: serial
    method: rtu
    baudrate: 19200
    bytesize: 8
    stopbits: 1
    parity: E
    port: /dev/ttyUSB1
    delay: 1

#.....

    sensors:
    # Eingangsregister (Offset 30001)
    # Stromzaehler Waermepumpe
      - name: "modbus1.stromzaehler_wp.spannung_l1"
        unique_id: "modbus1.stromzaehler_wp.spannung_l1"
        input_type: input
        slave: 10
        address: 0
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "V"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.spannung_l2"
        unique_id: "modbus1.stromzaehler_wp.spannung_l2"
        input_type: input
        slave: 10
        address: 2
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "V"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.spannung_l3"
        unique_id: "modbus1.stromzaehler_wp.spannung_l3"
        input_type: input
        slave: 10
        address: 4
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "V"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.strom_l1"
        unique_id: "modbus1.stromzaehler_wp.strom_l1"
        input_type: input
        slave: 10
        address: 6
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "A"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.strom_l2"
        unique_id: "modbus1.stromzaehler_wp.strom_l2"
        input_type: input
        slave: 10
        address: 8
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "A"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.strom_l3"
        unique_id: "modbus1.stromzaehler_wp.strom_l3"
        input_type: input
        slave: 10
        address: 10
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "A"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.wirkleistung_l1"
        unique_id: "modbus1.stromzaehler_wp.wirkleistung_l1"
        input_type: input
        slave: 10
        address: 12
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "W"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.wirkleistung_l2"
        unique_id: "modbus1.stromzaehler_wp.wirkleistung_l2"
        input_type: input
        slave: 10
        address: 14
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "W"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.wirkleistung_l3"
        unique_id: "modbus1.stromzaehler_wp.wirkleistung_l3"
        input_type: input
        slave: 10
        address: 16
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "W"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.scheinleistung_l1"
        unique_id: "modbus1.stromzaehler_wp.scheinleistung_l1"
        input_type: input
        slave: 10
        address: 18
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "VA"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.scheinleistung_l2"
        unique_id: "modbus1.stromzaehler_wp.scheinleistung_l2"
        input_type: input
        slave: 10
        address: 20
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "VA"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.scheinleistung_l3"
        unique_id: "modbus1.stromzaehler_wp.scheinleistung_l3"
        input_type: input
        slave: 10
        address: 22
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "VA"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.blindleistung_l1"
        unique_id: "modbus1.stromzaehler_wp.blindleistung_l1"
        input_type: input
        slave: 10
        address: 24
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "VAr"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.blindleistung_l2"
        unique_id: "modbus1.stromzaehler_wp.blindleistung_l2"
        input_type: input
        slave: 10
        address: 26
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "VAr"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.blindleistung_l3"
        unique_id: "modbus1.stromzaehler_wp.blindleistung_l3"
        input_type: input
        slave: 10
        address: 28
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "VAr"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.leistungsfaktor_l1"
        unique_id: "modbus1.stromzaehler_wp.leistungsfaktor_l1"
        input_type: input
        slave: 10
        address: 30
        data_type: float32
        scan_interval: 15
        unit_of_measurement: ""
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.leistungsfaktor_l2"
        unique_id: "modbus1.stromzaehler_wp.leistungsfaktor_l2"
        input_type: input
        slave: 10
        address: 32
        data_type: float32
        scan_interval: 15
        unit_of_measurement: ""
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.leistungsfaktor_l3"
        unique_id: "modbus1.stromzaehler_wp.leistungsfaktor_l3"
        input_type: input
        slave: 10
        address: 34
        data_type: float32
        scan_interval: 15
        unit_of_measurement: ""
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.wirkleistung_gesamt"
        unique_id: "modbus1.stromzaehler_wp.wirkleistung_gesamt"
        input_type: input
        slave: 10
        address: 52
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "W"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.scheinleistung_gesamt"
        unique_id: "modbus1.stromzaehler_wp.scheinleistung_gesamt"
        input_type: input
        slave: 10
        address: 56
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "VA"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.blindleistung_gesamt"
        unique_id: "modbus1.stromzaehler_wp.blindleistung_gesamt"
        input_type: input
        slave: 10
        address: 60
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "VAr"
        scale: 1
        precision: 2       
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.netzfrequenz"
        unique_id: "modbus1.stromzaehler_wp.netzfrequenz"
        input_type: input
        slave: 10
        address: 70
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "Hz"
        scale: 1
        precision: 2       
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.energie_bezug_gesamt"
        unique_id: "modbus1.stromzaehler_wp.energie_bezug_gesamt"
        input_type: input
        slave: 10
        address: 72
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "kWh"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.spannung_l1_l2"
        unique_id: "modbus1.stromzaehler_wp.spannung_l1_l2"
        input_type: input
        slave: 10
        address: 200
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "V"
        scale: 1
        precision: 2       
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.spannung_l2_l3"
        unique_id: "modbus1.stromzaehler_wp.spannung_l2_l3"
        input_type: input
        slave: 10
        address: 202
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "V"
        scale: 1
        precision: 2       
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.spannung_l3_l1"
        unique_id: "modbus1.stromzaehler_wp.spannung_l3_l1"
        input_type: input
        slave: 10
        address: 204
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "V"
        scale: 1
        precision: 2
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.strom_n"
        unique_id: "modbus1.stromzaehler_wp.strom_n"
        input_type: input
        slave: 10
        address: 224
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "A"
        scale: 1
        precision: 2       
        lazy_error_count: 4

      - name: "modbus1.stromzaehler_wp.energie_bezug_ruecksetzbar"
        unique_id: "modbus1.stromzaehler_wp.energie_bezug_ruecksetzbar"
        input_type: input
        slave: 10
        address: 388
        data_type: float32
        scan_interval: 15
        unit_of_measurement: "kWh"
        scale: 1
        precision: 2       
        lazy_error_count: 4

Ich hoffe, ich konnte ein wenig Unterstützung leisten, wobei ich in dem Thema Modbus noch nicht ganz drin bin.

VG
Volker

Hallo Volker,

vielen Dank für die Unterstützung.

Ich möchte nur die kwh erfassen, der SDM230 ist nur für die Wärmepumpe.

Wie finde ich die slave + Adresse heraus?

Gruß Jörg

Die Begriffe und Funktionsweise zu kennen ist nicht ganz unwichtig, auch bei der Suche nach Infos.

Master: löst die Kommunikation aus, gibt’s für gewöhnlich nur 1 mal im Netzwerk. (Multimaster ignorieren wir mal)
Slave: Sind die Teilnehmer im Bus und Antworten auf die Kommunikation, Dürfen maximal 32 am Netzwerk sein.
Adress: Damit ist die Adresse des Slaves gemeint der angesprochen wird. In der Regel lassen sich diese durch Drehschalter, Dip-Schalter o.ä. Einstellen. Gültig sind Adressen bis 0 bis 247 verwendet werden oft, limitiert durch die Art der Adressschalter, Adressen bis 99. Gibt also mehr mögliche Adresse n als Teilnehmer.
Registeradress: ist die Adresse des Registers in dem jeweiligen Slave. Diese enthalten je 2 Byte an Daten
Registertyp: Die 2 Byte bzw. 16 Bit bzw. 1 Word müssen umgerechnet werden unterschiedliche Integration haben bereits Methoden dazu an Board. Doku lesen.
Befehl: Kennzeichnet die Art des Registers das angesprochen wird bzw. den Befehl mit dem der Slave angesprochen wird. Read Write MultiRead usw.

Oft gibt es Registertabellen in denen alles mehr oder weniger gut dokumentiert ist.
Oft sind die Register in diesen Tabellen um 1 verschoben also lfd. Nummer ist ungleich der Registeradresse.

Die Kommunikationseinstellungen (Parität, Stopbits, Datenbits, Baudrate) an Master und Slave müssen im Netzwerk übereinstimmen und am dem Master (im Programm) sowie allen Slaves (über Schalter) gesetzt werden.
An den Slaves ist ein Standard eingestellt, der auch oft dokumentiert ist.
Dieser lässt sich aber auch über Dipschalter usw. verändern.
Die Kommuinikationseinstellungen und Slaveadressen lassen sich in der Regel auch über funktionierendes Modbus auslesen und teils ändern, so kann man sich schön den Ast absägen.

Schlussendlich muss die Polung der Datenleitung stimmen und noch auf die beidseitige Terminierung geachtet werden. Schirmung nicht außer acht lassen. Leitungslängenbeschränkungen gibt es auch.

Fragen?

Hallo Jörg,

im Handbuch zum Zähler (SDM230-Modbus) ab Seite 14.
Ich weiß jetzt nicht, ob ich das verlinken darf. Auf der Herstellerseite muss man sich anmelden, gefunden habe ich das PDF bei einem Online-Händler.

Adresse 30073 Import active energy kwh
also abzgl. Offset 30001 = Adresse 72 (gleich bei meinem Zähler) siehe meine ID “modbus1.stromzaehler_wp.energie_bezug_gesamt”

bzw.

Adresse 30343 Total active energy kwh
also abzgl. Offset 30001 = Adresse 342

Blöde Frage… ist Deine Wärmepumpe einphasig?

VG
Volker

@AlphizZzle , das ist mein großes Problem, das ich nicht weiß wie sowas aufgebaut wird…
Gibt es irgendwo die Möglichkeiten sowas nachzulesen?
Ich werde morgen mich damit weiter beschäftigen.
Aber schon mal vielen Dank.

@vkannengiesser , vielen Dank das Du das für mich raus gesucht hast.
Meine WP ist einphasig, hat nur 7KW

Gruß Jörg

Modbus ist nicht gleich Modbus. Jeder Gerätehersteller kann schlussendlich machen was er will.
Hab schon die wildesten Sachen gesehen.

Zum nachlesen gibt es eher anwenderspezifische Handbücher.
Also am Besten ein Hersteller erklärt, wie eine bestimmte Integration funktioniert.
Ansonsten bist du schon richtig hier. :wink:

@AlphizZzle
mit nachlesen meinte ich, wie die yaml richtig aufgebaut sein muss, mit den gganzen :!"({ usw.

Gruß Jörg

Nachtrag1:
@zaphood
wenn ich den Sensor so anlege wie bei dir, mit meiner Adresse und slave, kann ich HA nicht neu starten.

Nachtrag2:
Gibt es einen andere/einfache Lösung, um Modbus und Mbus in HA zu bekommen?

Wohnt jemand nicht allzu weit weg von mir, der mich unterstützten kann?
Komme aus 29525 Uelzen

Gruß Jörg

:crayon:by HarryP: Zusammenführung Mehrfachposting

Andere sicher, einfacher…naja. Wie meine Vorposter geschrieben haben, es mangelt Modbus an gewissen Standards, daher ist das immer ein gewisses basteln und raten bis alles geht, unabhängig vom Tool.

Ok, weiter suchen und probieren…

@zaphood Warum funktioniert deine Sensor.yaml nicht bei mir?
Was kann den Fehler auslösen, das ich HA nicht neu starten kann?

Gruß Jörg

Gute Frage. Machen wir das mal einfacher. Kommentier die modbus-include Zeile aus und pack das hier mal direkt in die configuration.yaml bitte

modbus: 
  - name: "SDM230-Modbus"
    type: serial
    method: rtu
    baudrate: 9600
    bytesize: 8
    stopbits: 1
    parity: N
    port: /dev/ttyUSB0
    delay: 1
    sensors:
      - name: modbus1_stromzaehler_wp.energie_bezug_gesamt
        data_type: int16
        slave: 10
        address: 72 

Danach über Entwicklerwerkzeuge - Konfiguration Prüfen und bei grünem Haken neu Starten.

Die Slave ID sowie die address habe ich aus dem Post von Volker, im Zweifel steht das aber auf jeden Fall im Handbuch

Nachtrag: Im Handbuch finde ich keine Default Slave Adresse… blöd. Kann man aber scheinbar am Gerät über das Display einstellen. Also da mal schauen was da steht und entweder da die 10 eintragen, oder hier in HA die entsprechende ID einstellen

Nachtrag 2: 19200/8/E/1 ist SEHR unüblich, zumal das Gerät maximal 9600 unterstützt. Daher habe ich die Parameter oben nochmal angepasst wie ich sie vermuten würde.

Sicher, dass der Port stimmt? Wenn nicht sicher, Gerät ausstecken aus HA, Konsole aufmachen und

dmesg | grep tty

eingeben. Dann Gerät einstecken und nochmals den selben Befehl eingeben. Der neue Port sollte nun sichtbar sein. Ich habe oben mal deinen Port aus dem Ursprungspost eingesetzt.

@zaphood , hab das jetzt mal stumpf kopiert, bei Konfiguration prüfen gab es keine Probleme.
Neustart hat geklappt.
Wo kann ich denn nun den Zähler/Wert finden?
Im Dashboard nicht, unter Geräte und Dienste kann ich Modus nicht einrichten (geht nur über yaml.)

Adress lt- Zähler ist die 1, ist das die Adresse wo jetzt 72 steht.
Am Zähler kann ich das Schloss öffnen, nach einer gewissen Zeit ist das Symbol wieder zu sehen.




Auch das ändern auf 1 brachte keine Veränderung…

Nachtrag:

Der Port stimmt, hatte ich schon so getestet

:crayon:by HarryP: Zusammenführung Doppelpost

In den Enwicklungstools sollte dein neuer Sensor zu sehen sein mit dem Namen den du vergeben hast. Die Entität kannst du dann deinem Dashboard hinzufügen

Dort steht leider nicht verfügbar…

Ne, nicht ganz richtig. Die “1” ist die Adresse des Slaves. Habs unten angepasst.

modbus: 
  - name: "SDM230-Modbus"
    type: serial
    method: rtu
    baudrate: 9600
    bytesize: 8
    stopbits: 1
    parity: N
    port: /dev/ttyUSB0
    delay: 1
    sensors:
      - name: modbus1_stromzaehler_wp.energie_bezug_gesamt
        data_type: int16
        slave: 1
        address: 72 

Die adress ist das Modbus-Register und sollte auf 72 bleiben.

Nach dem Neustart geh zu Einstellungen - Geräte & Dienste und da zu Entitäten. Dort in der Kopfzeile (Suchfeld) suchst nach modbus, dann sollte die Entität auftauchen

Nachtrag:

@zaphood
Machst bitte mal Screenshots von allen Kommunikationsparametern ?
9.6 ist die Baudrate
1 vermutlich die Slave-Adresse
Parität (E/O/N) fehlt noch
Stopbits (1/0) fehlen noch.

dann hätten wir die Kommunikation als solches mal geprüft

:crayon:by HarryP: Zusammenführung Doppelpost

@zaphood ,

So sieht es aus:

Das hab ich noch vom Zähler:









Danach Parity = N
Stop bits lt Beschreibungen 1 oder 2
Adress 1 to 247

Stop bits gerade mal auf 2 geändert, hat auch nichts gebracht…

Lt. Der Beschreibung soll dort ein Telefonhörer im Display zu sehen sein, wenn RS485 aktiv ist.
Ich muss morgen nochmal schauen, wie ich da hin komme, um es zu aktivieren…


stuff deleted

Nachtrag: Vergiss was ich getippt habe. Laut Doku muss man da nichts einschalten. Der Hörer signalisiert nur aktive Datenübertragung, so wie ich die Doku verstehe.

Verkabelung passt, A-A, B-B, Gnd-Gnd? Bitte checken…

Wenn Baudrate, Parity, Stopbit und Slave-ID mit dem am Zähler angezeigten Werten übereinstimmen und dann noch immer nix geht, dann bleibt eigentlich nur der USB-Adapter als Fehlerquelle übrig…

Nachtrag 2: Du denkst daran, nach jeder Änderung den HA neu starten… dem scheint das Neuladen der YAML Files in dem Fall nicht genug zu sein…

Wo hast du das im Handbuch gefunden, dass bei RTU der Offset abgezogen werden muss ? Ich kenne das von anderen Geräten, aber bei dem hier habe ich das nicht gesehen?

@zaphood,
GnD ist am USB Adapter nicht dran, wo soll der angeklemmt werden?
Hab den Adapter bei Reichelt gekauft, dort stand, dass er kompatibel mit dem Pi ist.
Mit der Klemmung überprüfe ich morgen nochmal.
Ich hab bei der Firma mal angefragt, wie es sich mit dem Hörer verhält.
USB Adapter hab ich mir neu gekauft, er wird ja als Hardware im Pi angezeigt.
Ich hatte vorher ein RS485 Modul, was direkt auf dem PI gesteckt wird, wurde mir nur nicht angezeigt. Ich hätte den Port auf dem Pi freigeschaltet müssen, komme aber nicht in die Konfig vom Pi :frowning:
Nach jeder Änderung starte ich HA neu.

Gruß Jörg