OH2, Modbus TCP, write-only Register beschreiben

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
am66798
Beiträge: 13
Registriert: 11. Aug 2020 19:45
Answers: 0
Wohnort: Gisingen

OH2, Modbus TCP, write-only Register beschreiben

Beitrag von am66798 »

Hallo zusammen,

ich möchte gerne in meiner PV-Anlage mit SMA Komponenten, das prognosebasierte Laden der Batterie, selbst regeln.
Es gibt ein funktionierendes Projekt mit ioBroker auf github (https://github.com/Maverick78de/SMA_forecast_charging), das auch ausführlich im Photovoltaikforum besprochen wurde. Der Code, meine ich mal, ist recht einfach auf openHAB portierbar.
Aber mein Speicherwechselrichter (SMA SBS 2.5) lässt sich nicht mit openHAB steuern.
Leider gibt es kaum Beispiele, wo nur schreibend auf ein Modbus-Register zugegriffen wird.
Lesend habe ich mit dem Modbus keine Probleme.

sbs25.things:

Code: Alles auswählen

Bridge modbus:tcp:inverter3 [ host="192.168.178.20", port=502, id=3 ]   // SBS 2.5
{
  Bridge poller sbs_sma30201 [start=30201, length=2, refresh=60000, type="input"] { Thing data SBS_Status [readStart="30201", readValueType="uint32"] }    // Gerätestatus
  Bridge poller sbs_sma30845 [start=30845, length=4, refresh=5000, type="input"]  { Thing data SBS_Ladung [readStart="30845", readValueType="int32"] }     // Ladungszustand in %
  Bridge poller sbs_sma30775 [start=30775, length=4, refresh=5000, type="input"]  { Thing data SBS_PIO [readStart="30775", readValueType="int32"] }        // Ladung bzw Entl. in W
  Bridge poller sbs_sma30535 [start=30535, length=4, refresh=10000, type="input"] { Thing data SBS_TagEntladung [readStart="30535", readValueType="uint32"] } // heutige Entladung in Wh
  Bridge poller sbs_sma30777 [start=30777, length=4, refresh=5000, type="input"]  { Thing data Leistung_L1 [readStart="30777", readValueType="int32"] }   // Ladung bzw Entl. in W (L1)
  Bridge poller sbs_sma30865 [start=30865, length=2, refresh=5000, type="input"]  { Thing data SBS_TotWIn  [readStart="30865", readValueType="int32"] }   // Leistung Bezug (W)
  Bridge poller sbs_sma30867 [start=30537, length=2, refresh=5000, type="input"]  { Thing data SBS_TotWOut [readStart="30867", readValueType="int32"] }   // Leistung Einspeisung (W)
  Bridge poller sbs_sma31009 [start=31009, length=2, refresh=5000, type="input"]  { Thing data Entladelimit [readStart="31009", readValueType="uint32"] } // Entladelimit in %
  Bridge poller sbs_sma30867 [start=30867, length=2, refresh=5000, type="input"]  { Thing data PowerOut [readStart="30867", readValueType="int32"] }      // aktuelle Einspeiseleistung
  Bridge poller sbs_sma40189 [start=40189, length=2, refresh=60000, type="input"] { Thing data WMaxCha  [readStart="40189", readValueType="uint32"] }     // max Ladeleistung BatWR
  Bridge poller sbs_sma40191 [start=40191, length=2, refresh=60000, type="input"] { Thing data WMaxDsch [readStart="40191", readValueType="uint32"] }     // max Entladeleistung BatWR
  Bridge poller sbs_sma40035 [start=40035, length=2, refresh=60000, type="input"] { Thing data BatType  [readStart="40035", readValueType="uint32"] }     // Abfrage Batterietyp LiIonen=1785
  Bridge poller sbs_sma30053 [start=30053, length=2, refresh=60000, type="input"] { Thing data Dev_Type [readStart="30053", readValueType="uint32"] }     // Typnummer, 9326: Sunny Boy Storage 2.5
  Bridge poller sbs_sma31061 [start=31061, length=2, refresh=10000, type="input"] { Thing data Kommunikation [readStart="31061", readValueType="uint32"] }  // Kommunikation extern zugelassen
  Bridge poller sbs_sma30847 [start=30847, length=2, refresh=60000, type="input"] { Thing data SOH [readStart="30847", readValueType="uint32"] }            // Tatsächliche, restliche Batteriekapazität

  // Diese 6 Register werden zur Lade- und Entladsteuerung benötigt und müssen innerhalb 60s nacheinander geschrieben werden!
  Thing data CmpBMSOpMod  [writeStart="40236", writeValueType="uint32", writeType="holding", updateUnchangedValuesEveryMillis=1000 ]   // Betriebsart des BMS
  Thing data BatChaMinW   [writeStart="40793", writeValueType="int32", writeType="holding", updateUnchangedValuesEveryMillis=1000 ]    // Minimale Batterieladeleistung
  Thing data BatChaMaxW   [writeStart="40795", writeValueType="int32", writeType="holding", updateUnchangedValuesEveryMillis=1000 ]    // Maximale Batterieladeleistung
  Thing data BatDschMinW  [writeStart="40797", writeValueType="int32", writeType="holding", updateUnchangedValuesEveryMillis=1000 ]    // Minimale Batterieentladeleistung
  Thing data BatDschMaxW  [writeStart="40799", writeValueType="int32", writeType="holding", updateUnchangedValuesEveryMillis=1000 ]    // Maximale Batterieentladeleistung
  Thing data GridWSpt     [writeStart="40801", writeValueType="int32", writeType="holding", updateUnchangedValuesEveryMillis=1000 ]    // Sollwert der Netzaustauschleistung
}
sbs25.items:

Code: Alles auswählen

Number SBS_Ladung "Aktuelle Ladung [%.0f %%]" { channel="modbus:data:inverter3:sbs_sma30845:SBS_Ladung:number" }
Number SBS_PIO "SBS PIO [%.0f W]"             { channel="modbus:data:inverter3:sbs_sma30775:SBS_PIO:number" }          // aktuelle Lade- bzw Entladeleistung
Number SBS_Status "Status [%.0f]"             { channel="modbus:data:inverter3:sbs_sma30201:SBS_Status:number" }
Number SBS_TagEntladung                       { channel="modbus:data:inverter3:sbs_sma30535:SBS_TagEntladung:number" }
Number SBS_Entladelimit "Entladelimit"        { channel="modbus:data:inverter3:sbs_sma31009:Entladelimit:number" }     // Untere Entladegrenze für Eigenverbrauchsbereich
Number SBS_Dev_Type  "Dev_Type"               { channel="modbus:data:inverter3:sbs_sma30053:Dev_Type:number" }         // Typnummer, 9326 = Sunny Boy Storage 2.5
Number SBS_WMaxCha   "WMaxCha"                { channel="modbus:data:inverter3:sbs_sma40189:WMaxCha:number" }          // 0 - 2500 W
Number SBS_WMaxDsch  "WMaxDsch"               { channel="modbus:data:inverter3:sbs_sma40191:WMaxDsch:number" }         // 0 - 2650 W
Number SBS_BatType   "BatType"                { channel="modbus:data:inverter3:sbs_sma40035:BatType:number"}           // Li-Ionen = 1785
Number SBS_Kommunikation                      { channel="modbus:data:inverter3:sbs_sma31061:Kommunikation:number"}
Number SBS_SOH "Kap [%.0f %%]"                { channel="modbus:data:inverter3:sbs_sma30847:SOH:number"}

// WO-Register für Prognosebasiertes Laden SBS 2.5
Number SBS_CmpBMSOpMod "Holding BMS"          { channel="modbus:data:inverter3:CmpBMSOpMod:number" }                   // Betriebsart BMS (2424,2289,2290,303,308)
Number SBS_BatChaMinW  "Holding BCMin"        { channel="modbus:data:inverter3:BatChaMinW:number"  }                   // Minimale Batterieladeleistung
Number SBS_BatChaMaxW  "Holding BCMax"        { channel="modbus:data:inverter3:BatChaMaxW:number"  }                   // Maximale Batterieladeleistung
Number SBS_BatDschMinW "Holding BDMin"        { channel="modbus:data:inverter3:BatDschMinW:number" }                   // Minimale Batterieentladeleistung
Number SBS_BatDschMaxW "Holding BDMax"        { channel="modbus:data:inverter3:BatDschMaxW:number" }                   // Maximale Batterieentladeleistung
}
Die Rule enthält nur die Schreibzugriffe um zu testen, ob sich der SBS 2.5 steuern lässt

Prognosebasiertes_Laden.rules:

Code: Alles auswählen

rule "Prognosebasiertes Laden"
when
    Time cron "0/15 * * * * ?"  // alle 15 Sekunden
then
    // Schreiben der 6 Register
    SBS_CmpBMSOpMod.postUpdate(2424)  // 40236, Steuerregister: 2424=Presetting, 2289=Charche Battery, 2290 = Discharche Battery.
    SBS_BatChaMinW.postUpdate(0)      // 40793, Minimale Batterieladeleistung
    SBS_BatChaMaxW.postUpdate(500)    // 40795, Maximale Batterieladeleistung, zu Testzwecke auf 500 W begrenzt
    SBS_BatDschMinW.postUpdate(0)     // 40797, Minimale Batterieentladeleistung
    SBS_BatDschMaxW.postUpdate(2500)  // 40799, Maximale Batterieentladeleistung
    SBS_SollAC.postUpdate(0)          // 40801, Sollwert der Netzaustauschleistung
end
Da die Register write-only (WO) sind, kann ich sie nicht durch zurücklesen prüfen.
In der events.log tauchen die items auch nicht auf.
Bitte schaut euch mal die Dateien an, ob das was nicht passt.
Besten Dank im Voraus!
openHAB 4.1.1 auf Raspberry Pi 4B

Benutzeravatar
udo1toni
Beiträge: 14067
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: OH2, Modbus TCP, write-only Register beschreiben

Beitrag von udo1toni »

postUpdate() ist eine Funktion, die lediglich den Zustand eines Items ändert, sonst nichts.
Willst Du einen Befehl an ein Gerät senden, welches über ein Binding mit openHAB verbunden ist, so musst Du dazu sendCommand() verwenden.


Gesendet von iPad mit Tapatalk
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

am66798
Beiträge: 13
Registriert: 11. Aug 2020 19:45
Answers: 0
Wohnort: Gisingen

Re: OH2, Modbus TCP, write-only Register beschreiben

Beitrag von am66798 »

Ohleck, "sendCommand()", das war's!

Seit Anfang April (mit Unterbrechungen) versuche ich schon das Problem zu lösen.
Großes Lob und 1000 Dank dafür!

Gruß
Andreas
openHAB 4.1.1 auf Raspberry Pi 4B

Benutzeravatar
udo1toni
Beiträge: 14067
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: OH2, Modbus TCP, write-only Register beschreiben

Beitrag von udo1toni »

Immer gerne :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

Maxe1983
Beiträge: 8
Registriert: 30. Mär 2022 09:03
Answers: 0

Re: OH2, Modbus TCP, write-only Register beschreiben

Beitrag von Maxe1983 »

Hallo am66798,

Ich hole deinen alten Beitrag nochmal hoch, da es nicht so viele Leute gibt, die den SunnyBoyStorage 2.5 in OH steuern wollen.

Ich möchte das Thema auch angehen, aber vorerst deutlich simpler...
Ich möchte nur den Max SOC oder die Max Ladeleistung gegrenzen.

Meine Frage an dich bevor ich mit dem ganzen Anlernen starte - geht das gut und bis du zufrieden?

Hast du vielleicht ein paar Tipps mit dem SBS 2.5 im Bezug auf OH?

Liebe Grüße Maxe

am66798
Beiträge: 13
Registriert: 11. Aug 2020 19:45
Answers: 0
Wohnort: Gisingen

Re: OH2, Modbus TCP, write-only Register beschreiben

Beitrag von am66798 »

Hallo Maxe,

ja, das funktioniert problemlos.
Ich beschränke mich aber inzwischen auf nur einige Register.
Hier die aktuelle .things-Datei und auszugsweise die .items-Datei.

sbs25.things:

Code: Alles auswählen

Bridge modbus:tcp:inverter3 [ host="192.168.178.20", port=502, id=3, connectMaxTries=3 ]   // SBS 2.5
{
// Bridge poller sbs_sma30197 [start=30197, length=2, refresh=10000, type="input"] { Thing data MODBUS_Meldung [readstart="30197", readValueType="uint32"] }
Bridge poller sbs_sma30201 [start=30201, length=2, refresh=60000, type="input"] { Thing data SBS_Status [readStart="30201", readValueType="uint32"] }  // siehe Modbus SMA
Bridge poller sbs_sma30845 [start=30845, length=4, refresh=10000, type="input"]  { Thing data SBS_Ladung [readStart="30845", readValueType="int32"] }   // Ladungszustand in %
Bridge poller sbs_sma30775 [start=30775, length=4, refresh=10000, type="input"]  { Thing data SBS_PIO [readStart="30775", readValueType="int32"] }      // Ladung bzw Entl. in W
Bridge poller sbs_sma30535 [start=30535, length=4, refresh=10000, type="input"] { Thing data SBS_TagEntladung [readStart="30535", readValueType="uint32"] } // heutige Entladung in Wh
Bridge poller sbs_sma30847 [start=30847, length=4, refresh=60000, type="input"] { Thing data SOH [readStart="30847", readValueType="uint32"] }            // Tatsächliche, restliche Batteriekapazität

Thing data CmpBMSOpMod  [writeStart="40236", writeValueType="int32", writeType="holding", updateUnchangedValuesEveryMillis=1000 ]    // Betriebsart des BMS
Thing data BatChaMinW   [writeStart="40793", writeValueType="int32", writeType="holding", updateUnchangedValuesEveryMillis=1000 ]    // Minimale Batterieladeleistung
Thing data BatChaMaxW   [writeStart="40795", writeValueType="int32", writeType="holding", updateUnchangedValuesEveryMillis=1000 ]    // Maximale Batterieladeleistung
Thing data BatDschMinW  [writeStart="40797", writeValueType="int32", writeType="holding", updateUnchangedValuesEveryMillis=1000 ]    // Minimale Batterieentladeleistung
Thing data BatDschMaxW  [writeStart="40799", writeValueType="int32", writeType="holding", updateUnchangedValuesEveryMillis=1000 ]    // Maximale Batterieentladeleistung
Thing data GridWSpt     [writeStart="40801", writeValueType="int32", writeType="holding", updateUnchangedValuesEveryMillis=1000 ]    // Sollwert der Netzaustauschleistung, item = SBS_SollAC
}
Die entsprechende .items-Datei, mit den notwendigen Items:

Code: Alles auswählen

Number SBS_Ladung "Aktuelle Ladung [%.0f %%]"        { channel="modbus:data:inverter3:sbs_sma30845:SBS_Ladung:number" }
Number SBS_PIO "SBS PIO [%.0f W]"                    { channel="modbus:data:inverter3:sbs_sma30775:SBS_PIO:number" }      // aktuelle Lade- bzw Entladeleistung
Number SBS_in "Ladung [%.0f W]"                                                                                           // aktuelle Ladung in Watt
Number SBS_aus "Entladung [%.0f W]"                                                                                       // aktuelle Entladung in Watt
Number SBS_Status "Status [%.0f]"                    { channel="modbus:data:inverter3:sbs_sma30201:SBS_Status:number" }
Number SBS_TagEntladung "Entladungsmenge [%.0f Wh]"  { channel="modbus:data:inverter3:sbs_sma30535:SBS_TagEntladung:number" }
Number SBS_TagLadung "Ladungsmenge [%.2f KWh]"
Number SBS_SOH "Kap [%.0f %%]"                       { channel="modbus:data:inverter3:sbs_sma30847:SOH:number"}

// WO-Register SBS
Number SBS_CmpBMSOpMod "Holding BMS"            { channel="modbus:data:inverter3:CmpBMSOpMod:number" }                   // 40236 - Betriebsart BMS (2424,2289,2290,303,308)
Number SBS_BatChaMinW  "Holding BCMin"          { channel="modbus:data:inverter3:BatChaMinW:number"  }                   // Minimale Batterieladeleistung
Number SBS_BatChaMaxW  "Holding BCMax [%.0f W]" { channel="modbus:data:inverter3:BatChaMaxW:number"  }                   // Maximale Batterieladeleistung
Number SBS_BatDschMinW "Holding BDMin"          { channel="modbus:data:inverter3:BatDschMinW:number" }                   // Minimale Batterieentladeleistung
Number SBS_BatDschMaxW "Holding BDMax"          { channel="modbus:data:inverter3:BatDschMaxW:number" }                   // Maximale Batterieentladeleistung
Number SBS_SollAC      "Holding GridWSpt"       { channel="modbus:data:inverter3:GridWSpt:number"    }
Ich denke, das sollte so auf Anhieb funktionieren, vorausgesetzt das Modbus-Binding funktioniert.
Es kann leider einige Tage dauern bis ich antworte.
Ich bin am Neubau meines Sohnes vielseitig eingebunden...

Gruß
Andreas
openHAB 4.1.1 auf Raspberry Pi 4B

Antworten