Modbus TCP & Siemens Junelight

Hallo Leute!

Ich bin was Modbus, Adressen und Register betrifft ein totaler Idiot, zumindest fühle ich mich aktuell so.
Ich habe von Siemens folgende Info erhalten damit ich mein HA konfigurieren kann. Ich komme aber mit de rInfo null klar.
Auslesbare Daten aus der Smart Battery:
Datenpunkt Beschreibung Format Adresse (dezimal) Anzahl Register (16bit)
p_charge_nominal_max Max. Ladeleistung Int32 0 2
p_discharge_nominal_max Max. Entladeleistung Int32 2 2
e_capacity_nominal Anzahl der Batterien Int32 4 2
p Aktuelle Leistung der Smart Battery Int32 6 2
soc Ladezustand der Smart Battery Int32 8 2
status 0 = Normalzustand oder Fehlercodes Int32 10 2
cycles Anzahl der Zyklen Int32 12 2
p_gcp Aktuelle Leistung am Netzübergabepunkt Int32 14 2
p_pv Aktuelle Leistung der PV Anlage Int32 16 2

Leider stht zu der Batterie, welche leider nur kurz am Markt war, nicht wirklich viel im Netz:
Aber zu Iobroker hätte ich was gefunden:Junelight Batterie mit modbus (Teil 2) · evcc-io/evcc · Discussion #11288 · GitHub

Damit ist meine Verwirrung noch größer: Wie kommen die auf diese Adressen von 400xx?

Aktuell hätte ich in der config.yaml mal Modbus als Include über modbus.yaml konfiguriert.
Dort hätte ich dann das konfiguriert:

# Modbus Junelight
- name: modbus_junelight
  type: tcp
  host: 192.168.123.138
  port: 502
  delay: 0
  message_wait_milliseconds: 30
  timeout: 5
  sensors:
    - name: junelight_akku_percent
      address: 40009
      unit_of_measurement: "%"
      data_type: int32
      scan_interval: 10

Aber irgendwie tut das Ding nicht.
Und ja, ich habe schon Modbus von Siemens freischalten lassen.

Lg, Rob

:crayon:by HarryP: Code-/Logzeilen formatiert (bitte immer in </> einbinden)

Ich kann jetzt nur raten,
das iobroker Beispiel ist ja schon mal nicht so schlecht.
Wenn du es formatiert hättest wüsste ich schon mal ob es ein Einrückungsfehler von dir in YAML war. Hoffen wir mal das es bei dir so aussieht.

modbus:
  - type: type
    host: 102.168.123.138
    port :502
    name: modbus_junelight
    sensors:
      - name: junelight_akku_percent
        address: 40009
        slave: 1
        unit_of_measurement: %
        data_type: int32
        scan_interval: 10

timeout, delay, message_wait… alles schnick-schnack
aber slave: 1 würde ich mal reinpacken

Probier mal bitte folgendes:

modbus:
  - type: type
    host: 102.168.123.138
    port :502
    name: modbus_junelight
    sensors:
      - name: xxxx_test
        address: 40000
        slave: 1
        count: 18
        data_type: custom
        structure: ">9I"

du solltest dann eigentlich eine Liste von Werten mit Komma getrennt in einer entität xxxx_test finden und Entwicklerwerkzeuge>Zustände
Falls ja und falls keiner der Werte für dich einen Sinn ergibt das gleiche nochmal mit adress: 40001 und dann schauen.
Es gibt ja Firmen die zählen Addressen von 0 bis … und andere von 1 bis … (daher vermutlich auch die ungeraden Addressen im iobroker, die 40000 mal aussen vor.)

Solltest du node-red als addon unter HA installiert haben ist es wesentlich einfacher, denn das ist ja das übel bei HA man kann zwar schön Dinge automatisch und kontinuierlich einlesen lassen aber es gibt keine modbus:read_register Aktion und die ist halt zum Testen ob die Addresse überhaupt stimmt extremst hilfreich. Falls ja “node-red installiert und einigermassen fit wie man das bedient” dann meld dich, dann erkläre ich dir wie es da geht. Das geht halt wesentlich schneller solange es ums probieren geht.

wow, das war ja schon mal hilfreich:
Mit 40000 sieht es so aus: 1400204883.00,65601.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00
Mit 40001 sieht es so aus:
1850933249.00,4259840.00,0.00,0.00,0.00,0.00,0.00,0.00,11621.00

Ich hätte einen Wert aus der App, Anzahl der Ladezycln, der wäre 899.
Den sehe ich aber nicht :upside_down_face:

Kurz erklärt was das macht.
Er liest ab “address” halt 18 int16 werte in form von “9” int32 (besser gesagt uint32) werten, und zwar als “>” big endian.

Du kannst jetzt mehrere Sachen probieren.

  1. Mit der Adresse spielen, von 0 bis weiss der Geier
  2. zu kannst bei structure auf ein “kleines i” nehmen dann sinds int32 statt uint32
  3. du kannst notfalls auch mal das “>” durch ein “<” ersetzen dann ist’s little endian.
  4. du kannst auch im struct mal “>18H” eingeben dann bekommst du 18 einzelwerte also int16.

Irgendwann und wo müsste dann ja mal ein Wert auftauchen der dir bekannt vorkommt. Das ist halt doof mit der bisher vorliegenden Info da diese zu dünn ist. Da lob ich mir dann doch Fronius die alles sauber dokumentieren und selbst wenn man dort nicht weiter kommt ist allein die Tatsache das dort auch Texte also Hersteller, Gerätename und so weiter per modbus ausgelesen werden können immer sehr hilfreich, denn damit kann man sehr schnell feststellen ob die Address ab wann wer gezählt hat richtig ist oder um eins korrigiert werden muss und man stellt auch schnell fest ob es little oder big endian sein muss.
So stochert man hier deutlich im Nebel.

Hab kurz mal gegoogled und bin über eine Passage gestolpert in der genau die Infos standen dei du im ersten Post geschrieben hast. das was aber im Zusammenhang mit einem Fronius WR.
Wie gesagt ich kenne den Speicher nicht, ist der AC oder DC gekoppelt? Weil normalerweise hat ein Speicher keine Info über eine Leistung am Netzübergabepunkt, sprich die Chance ist groß das das mit 40000 als Basis für die Addesse komplett falsch sein könnte.

Glücklicherweise kann man beim lesen sehr wenig kaput machen um nicht zu sagen nix.

Ich habe gestwrn am Abend nochmals geprüft ob ich eventuell am falschen LAN-Port gesteckt habe. Das war aber richtig.
Meine Spielereien erbrachten aktuell keine befriedigende Ergebnisse.
Ich habe ja auch einen Fronius WR.
Die Siemens bezieht aber deren Daten von 2 Siemens GRIDs welche einal kurz nach dem Netzwingang und einmal vor demm Fronius montiert sind.
Diese sind dan per seriellem MODBUS an der Junelight angeschlossen.
Witzig, ich hätte die Konfiguration einmal auf einem IOBroker welcher auf meiner Synology auf einem Docker Container läuft probiert.
Auch da sind die Daten “falsch”.
Als ob Siemens hier den MODBUS Ausgang falsch konfiguriert hat.

So ganz versteh ich deine physikalische Konfiguration trotzdem noch nicht auch mangels mehr googlen was ich mir erstmal verkniffen habe.

Wenn du sagst du hast n Fronius WR (welchen)
Und hängt an dem der Speicher oder ist das gar ein AC Speicher?

Weil wenn es ein Hybrid WR ist/wäre und der Speicher dort auf DC Seite angebunden ist bekommst du ja ohnehin alle relevanten Daten vom Fronius und nicht vom Speicher selbst.

Es ist ein AC Speicher. Der Junelight hat seinen eigenen Wchselrichter.
DIe Grids sind dazu da das Juneligt weiß wann was von Solar kommt bzw. ins Netz geht…

DIe Juneligt hängt mit einer fixen IP - Adresse im lokalen LAN und ist dort auch erreichbar.
Laut Siemens ist Modbus Server am Interfache 1 aktiv.

Kacke ist halt, da die Infos zu diesem leider eingestellten Produkt kaum vorhanden sind. Generell finde ich den Speicher toll.Aber nicht mal erweitern kann ich diesen nun weil eben eingestellt…

Ich würd die einfach weiter löchern, kann ja gar nicht sein das die keine Doku haben, irgendwer muss da ja wohl Dokumente habe.

Gibts vielleicht noch baugleiche die unter einem anderen Hersteller vertrieben wurden?

So, bin seit langem wieder dazu gekommen.
Ich habe mir das Programm Modbus tester GModbus herunter geladen und konnte da jetzt mal tatsächlich ein Ergebnis bekommen.
Ich habe die Adresse 12 mit Count 2 als Holding abgefragt.
Als Werte bekam ich dann HEX 03C7 und 967 Decimal.
Das sind die Anzahl der Ladezyclen.
Aber bisher waren meine Versuche jetzt vergebilch genau das 2. 16 Bit Register in HA entsprechend abzufragen. :frowning:

Also so ganz bin ich da noch nicht bei dir.

Wenn du ein (start)register, in dem Fall #12 mit einem count:2 abfragst dann sollte er ja 2 Registerauslesen, 12 und 13

Du sagst jetzt du bekommst 976 dezimal.

Da würde ich ja vermuten das dir der Modbus Tester im unteren Bereich
das Register 12 mit dem Wert 976
das Register 13 mit dem Wert 0
anzeigt, wenn du sagst du bekommst keinen 2ten Wert.
oder aber es ist gar kein “int16” pro Wert, also 1 Register pro Wert, sondern vielleicht sind’s int32.
Dann müsstest du halt mal mit einem count:4 arbeiten, dann sollten dir 4 Register samt Werten angezeigt werden wovon immer 2 Register je einem Wert entsprechen.

Es ist genau umgekehrt, zumindest bei diesem Register 12 und Count 2.
Es sind laut Dokumentation 16Bit.
Dieses Tool gibt bei Adresse 12 keinen schlüssigen Wert aus, bei 13 dann den richtigen Wert den ich in der App verifizieren konnte.

Ich dachte nun, gut, mache int2 und Count 2 aber das funktioniert in der aktuellen Version von HA nicht mehr ( wird aber in vielen Manuals so beschrieben )

Ok da sind wir ja schon wieder einen Schritt weiter.

Vielleicht hängt es mit der Zählweise zusammen, so ähnlich wie bei Fronius.

Der Mensch mit Bezug zum Real-Life sagt ich habe eine Anzahl an Registern die ich einlesen will und das 1. Register ist dann halt Nummer 1

Der Programmierer sagt ich habe eine Anzahl an Register von 0 bis Anzahl -1

Das wäre EINE Möglichkeit.

Die andere ist, es handelt sich gar nicht um einen int16 oder uint16 Wert sondern um einen Wert der in 2 Register geschrieben wird.
Dann ist 967 natürlich vollständig in einem Register abbildbar, sprich das andere hat dann 0.

Herausfinden kannst du das nur wenn du 2 Werte kennst und feststellen kannst ob die beide jeweils um 1 Register bei der Zählweise daneben liegen.

Falls du nur Werte bekommst die dir gar nix sagen …

könnte es ja auch ein uint32 oder int32 sein, also 2 Register.
Nicht in dem Fall von 967 aber vielleicht bei anderen Werten die du kennst.

Mit count=2 halt 2 Register einlesen, modbustester zeigt dir dann ja 2 Zeilen mit den jeweiligen Registerwerten die dir nix sagen.
Und dann auf Display>unit32 klicken.
Du bekommst dann 4 Möglichkeiten angezeigt.
Big Endian, Little Endian und beide auch noch mal geswappt, also vertauscht.
Wenn dir davon ein Wert irgendwie bekannt vorkommt weisst du 2 Dinge.

  1. Das es ein Wert ist der in 2 Registern abgelegt ist und du weisst ob dein Gerät mit BigEndian oder LittleEndian arbeitet.

Noch ein Beispiel wir man mehrere Register (mit count) in HA einlesen kann.

modbus:
  - type: tcp
    host: xxx.xxx.xxx.xxx
    port: 502
    name: xxxxxxxx
    sensors:
      - name: test
        slave: 1
        count: 2 # 2 register
        data_type: custom
        structure: ">I" # I = uint32 ..... siehe python structs zur Erklärung

Das Resulat ist eine Entität mit dem Namen “test” weil die 2 Register nur den einen Wert liefern.

Würdest du jetzt bei structure: “>2h” schreiben würdest du 2 Werte bekommen.
Also z.B. “0, 768”
Immer noch mit count:2 weil das sagt nur aus wieviele Register es sind

sowas splittet man sich dann mit

template:
  - sensor:
    - name: ersterwert
      state: >
        {{ states('sensor.test').split(',')[0]  | int(0) }}
    - name: zweiterwert
      state: >
        {{ states('sensor.test').split(',')[1]  | int(0) }}

und ne strcture kann am Ende halt auch so aussehen, denn dafür ist’s gedacht.
structure: “>1L8s1I2H1h”
da musst du mal nach “python structs” google da wird erklärt welcher Bezeichner für welchen Typ steht. Das “>” sagt übrigens aus “big Endian”.

Zuerst mal lieben dabnk für Deine Bemühungen mir die noch aktuell unbekannte Welt von HA/Phyton etwas näher zu brignen. :pray:

Ich dachte eigentlich das ich es verstanden hätte und eigentlich müsste das funktionieren:
- name: xxxx_test
address: 12
slave: 1
count: 2
input_type: holding
data_type: custom
structure: “>I”
Es kommt aber das heraus: 4294967295.00
Wenn ich structure: “>i” verwende, ist das Ergebnis: -1.00

Dann habe ich es damit gemacht:
structure: “>2h”
Dann kommt das heraus: -1.00,-1.00

Der Modbustester zeigt das:

Ich habe den Fehler gefunden, rein durch Zufall.
Siemens schreibt Anschluss 1, es war aber der andere Anschluss :rofl: