Einbindung Speicher über Modbus TCP

Hallo Uwe, konntest Du den Test für Register 43 inzwischen machen? Ich habe die Aktion um das Register zu schreiben wie von Bert beschrieben implementiert, bekomme aber om Protokollfile eine Fehlermeldung: Pymodbus: SAX_battery: Error: device: 64 address: 43 → Modbus Error: [Input/Output] ERROR: No response received after 3 retries
Und ja, ich habe die Register 41, 43 und 44 von SAX freischalten lassen.

Im übrigen funktioniert das Lesen der anderen Register problemlos.
Kannst Du mir bitte weiter helfen?

Danke,
Wolfgang

Hallo Wolfgang,

ich finde bei mir auch diese Fehlermeldung allerdings funktioniert das Ändern der Endladeleistung.

Übrigens gibt es einen weiteren Beitrag sax-power Speicher und da gibt es nur kleine Unterschiede:

Integration of a SAX battery over Modbus TCP and automation for solar charging - Share your Projects! / Custom Integrations - Home Assistant Community

Grüße
Bert

Hallo Wolfgang,
ich habe die Begrenzung der Ladeleistung und der Entladeleistung erfolgreich umgesetzt und es hat auch (nicht gut) funktioniert.
„Nicht gut“ war, dass die gewählte Leistung irgendwann vom SAX Speicher „vergessen“ wird.
Aber ansonsten hatte das bis zu einem Update des HA funktioniert und und jetzt bekomme auch ich diese Fehlermeldung und der Befehl wird nicht mehr umgesetzt.

Mit der von Dir genannten APP funktioniert das aber weiterhin sauber. Liegt also nicht am SAX.
Somit hat für mich der HA seit mehreren Updates ein Problem mit Modbus. Da gab es auch issues in Github, aber ich hatte leider noch keine Zeit tiefer reinzuschauen.

Evtl will Modbus auch anders kommunizieren (Siehe Post von Bert42 und weiter oben „justone“ auch schon mal)
Dort wird alles in einem Rutsch abgefragt und somit gehen viel weniger Anfragen an den SAX raus. Sieht nach Optimierung aus und könnte die Lösung sein.

Gruß Uwe

Hallo Uwe und Bert, ich habe am Wochenende Infos zu dem Fehler gefunden, die darauf schließen lassen, dass der SAX das Schreibkommando nur fehlerfrei akzeptier, wenn man mehrere Werte schreibt (Array oder explizit) um damit das Modus Kommando 10H zu generieren. Dann klappt. Mein Test-Code:

  • action: modbus.write_register
    metadata: {}
    data:
    address: 43
    slave: 64
    hub: SAX_battery
    value:
    - 0
    - 0

Dann verschwindet die Fehlermeldung und der SAX stellt die Entladung ein. Interessanterweise reicht >ein< Schreibkommando und der Speicher bleibt dauerhaft im Standby. Den Effekt, dass das Kommando automatisch nach einer kurzen Zeit zurückgesetzt wird, sehe ich nicht - auch wenn die Hotline mir genau das vorhergesagt hatte. Dort bin ich noch in Klärung, warum das nun so ist.
Gruß, Wolfgang

Hallo Wolfgang,
Danke für den Hinweis.

Ich habe für modbus den Debug Mode aktiviert und mit dem Beispiel aus der Dokumentation verglichen.

action: modbus.write_register
metadata: {}
data:
  address: 43
  slave: 64
  hub: SAX_a
  value: >-    [{{states.input_select.sax_a_leistungsgrenzwert_entladen.state|int|bitwise_and(0xffff)}}]
2025-02-04 17:08:03.787 DEBUG (MainThread) [pymodbus.logging] Adding transaction 4748
2025-02-04 17:08:03.787 DEBUG (MainThread) [pymodbus.logging] send: 0x12 0x8c 0x0 0x0 0x0 0x9 0x40 0x10 0x0 0x2b 0x0 0x1 0x2 0x1 0xf4
2025-02-04 17:08:03.802 DEBUG (MainThread) [pymodbus.logging] recv: 0x0 0x8c 0x0 0x0 0x0 0x6 0x40 0x10 0x0 0x2b 0x0 0x1 old_data:  addr=None
2025-02-04 17:08:03.803 DEBUG (MainThread) [pymodbus.logging] Processing: 0x0 0x8c 0x0 0x0 0x0 0x6 0x40 0x10 0x0 0x2b 0x0 0x1
2025-02-04 17:08:03.803 DEBUG (MainThread) [pymodbus.logging] decode PDU for 16
2025-02-04 17:08:03.803 DEBUG (MainThread) [pymodbus.logging] Frame advanced, resetting header!!

Ich werde morgen probieren register 43 und 44 in einem write register zu verwenden.

[{{states.input_select.sax_a_leistungsgrenzwert_entladen.state|int|bitwise_and(0xffff)}},{{states.input_select.sax_a_leistungsgrenzwert_laden.state|int|bitwise_and(0xffff)}} ]

Hallo Wolfgang,
leider treten die Fehlermeldung auch auf wenn 2 Register geschrieben werden.

Mit den eingeschalteten Debug log sieht man mehrere Versuche das Register zu schreiben und für mich sieht das wie eine fehlende Quittung aus.


Es wird zwar eine Quittung empfangen aber die Transaction ID ist nicht korrekt (send: 0x77 0x7d → recv: 0x0 0x7d).

Das ganze mit 2 Registern

Hier noch einige Quellen zum Modbus Protokoll:

Grüße
Bert

Noch eine Anmerkung: Modbus kennt kein Write-Only Register

:crayon:by HarryP: Zusammenführung Doppelpost (bitte “bearbeiten” Funktion nutzen)

1 „Gefällt mir“

Einen kleinen Unterschied, aber vielleicht lohnt es sich zu testen:
Ich benutze input_number und ich lese in deinem Code input_select.
Ich habe zuerst mit Register 41 getestet und schaffte es auch nicht auf 43 und 44 zu schreiben. Als erstes Problem war ganz klar, dass es eigentlich gar nicht freigeschaltet war (team bei Sax verstand nicht warum ich 41 und 43,44 schreiben möchte, da wenn mann programmiert, könnte mann alles auf 41 vorbereiten, ich wollte aber trotzdem volle Macht auf dem System haben). Aber dann bin ich nicht mehr ganz sicher wann ich von input_select auf input_number gegangen bin…