Homematic und SMA Sunny Boy mit SHM, PV Erzeugung lesen über ModBus

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

mschneider
Beiträge: 13
Registriert: 07.01.2017, 18:57

Re: Homematic und SMA Sunny Boy mit SHM, PV Erzeugung lesen über ModBus

Beitrag von mschneider » 12.03.2019, 23:14

Ich werde vermutlich in den nächsten Monaten eine Anleitung schreiben wie man mit der CCU3 Modbus Register schreiben kann ohne etwas Kompliziertes installieren zu müssen. Meine bisherigen Entwicklungen/Anleitungen (Modbus lesen, SMA Energy Meter lesen) habe ich mit Hilfe meiner SMA Geräte Programmieren und Testen können. Eine Wall-be Wallbox für ein Elektroauto ist bereits bestellt (verwendet einen Phoenix Contact EV Controller). Wenn die installiert ist, dann geht es los mit der Programmierung dafür. Ein Elektroauto habe ich auch noch nicht. Daher dauert es noch etwas mit einer Anleitung dafür (Modbus TCP Register schreiben mit CCU3).

rucksman007
Beiträge: 60
Registriert: 04.11.2018, 13:17

Re: Homematic und SMA Sunny Boy mit SHM, PV Erzeugung lesen über ModBus

Beitrag von rucksman007 » 15.03.2019, 18:07

Tolle Arbeit!

Bislang lese ich meinen SMA SB 3600SE-10 zur Überwachung über ein PHP-Skript aus und schreibe die Daten in eine Datenbank. Dazu nutze ich die Klasse https://github.com/krakorj/phpmodbus.

Der relevante Teil meines Skripts sieht wie folgt aus:

Code: Alles auswählen

$modbus = new ModbusMaster($wrip, $modbusprotocol);
$recDataTotal = $modbus->readMultipleRegisters(3, 30529, 2);
$recDataTotal = array_reverse($recDataTotal);
$total = PhpType::bytes2unsignedInt($recDataTotal, 1) / 1000;
Worauf ich hinaus will: Entscheidend in meinem PHP-Skript ist das array_reverse. Würde ich das nicht machen, würde totaler Schrott rauskommen. Das Register 30529 beinhaltet den "Total Yield (Wh)" und ist U32 FIX0 RO.

Beispiel: mit array_reverse erhalte ich als $total den korrekten Wert von 5581.941. Würde ich array_reverse weglassen, bekäme ich 1949062.4.

Mit Deiner Lösung erhalte ich bei Ausgabe von "lGetOut" das hier (also ohne StrValueByIndex):

Code: Alles auswählen

85 11385
Und nun die Frage: Da ich weder bei Modbus noch bei tcl der Held bin: Wie muss ich Dein(e) Skripte ändern bzw. lGetOut umformen, damit ich das korrekte Ergebnis bekomme?

mschneider
Beiträge: 13
Registriert: 07.01.2017, 18:57

Re: Homematic und SMA Sunny Boy mit SHM, PV Erzeugung lesen über ModBus

Beitrag von mschneider » 16.03.2019, 10:26

Hallo rucksman007,

Modbus register können 32 bit lang sein oder auch nur 16 bit. Mein Skript gibt immer 32 bit Werte zurück in Form von 2 Integer zahlen die durch ein Leerzeichen getrennt sind. In deinem Fall: 85 und 11385. Um den 32 bit Wert zu erhalten müsstest du folgendes machen:

32bitwert = 85 * 256 * 256 + 11385.

Code: Alles auswählen

32bitwert = lGetOut.StrValueByIndex(" ", 0) * 256 * 256 + lGetOut.StrValueByIndex(" ", 1) 
Gruss, M. Schneider

rucksman007
Beiträge: 60
Registriert: 04.11.2018, 13:17

Re: Homematic und SMA Sunny Boy mit SHM, PV Erzeugung lesen über ModBus

Beitrag von rucksman007 » 18.03.2019, 10:14

Super, vielen Dank! Es gibt auch den ein oder anderen Wert als U64 (in meinem Fall zB die Register 30513, 30517 oder 30521), aber da es die aus irgendwelchen Gründen zusätzlich auch als U32 gibt (Register 30529, 30535 und 30541), muss ich mich darum nicht kümmern...

Mrfree11
Beiträge: 6
Registriert: 18.04.2017, 00:10

Re: Homematic und SMA Sunny Boy mit SHM, PV Erzeugung lesen über ModBus

Beitrag von Mrfree11 » 31.03.2019, 23:13

SUPER - habe kürzlich meine PV-Anlage bekommen und total happy diese Anleitung gefunden zu haben.
Habe eine Ergänzung und eine Frage - die Frage zuerst:
Ich lasse das Script bei mir alle 5 Sekunden laufen, um zu Testzwecken zu schauen, ob es auch funktioniert, sprich die Änderungen anzeigt. Allerdings zeigt mein Zeitstempel immer nur dieselbe Uhrzeit und dies seit fast 40 Minuten, mit den Werten zu diesem Zeitpunkt. Es erfolgt scheinbar keine Aktualisierung. Woran kann es liegen?

Hier ist mein Script - mit der oben erwähnten Ergänzung: Ich habe auch eine Batterie und frage daher die Register vom Sunny Boy Storage 5.0 ab. Hier gibt es auch die Register für den Batterieladezustand (in%), sowie Batterielade- und entladeleistung.

! HomeMatic-Script
! SMA Modbus Register Abfragen
! viewtopic.php?f=31&t=47813

! Zielsystem: Sunny Boy Storage SBS 5.0
! IP Adresse: 192.168.178.100

! Register
! SMA AC Leistung 30775 2
! SMA DC Leistung String 1 30773 2
! SMA DC Leistung String 2 30961 2 (nicht getestet)
! SMA DC Leistung Gesamt 30983 2 (nicht getestet)
! SMA Netzbezug 30865 2
! SMA Netzeinspeisung 30867 2
! SMA Batterieladezustand 30845 2
! SMA Batterieladung 31393 2
! SMA Batterieentladung 31395 2

! SCRIPT
string lGetOut = "";
string lGetErr = "";
system.Exec("tclsh /usr/local/addons/modbus/sma.tcl 192.168.178.100 30865 2",&lGetOut,&lGetErr);
var SMAValue=dom.GetObject("SMA Netzbezug");
SMAValue.State(lGetOut.StrValueByIndex(" ", 1));

string lGetOut = "";
string lGetErr = "";
system.Exec("tclsh /usr/local/addons/modbus/sma.tcl 192.168.178.100 30867 2",&lGetOut,&lGetErr);
var SMAValue=dom.GetObject("SMA Netzeinspeisung");
SMAValue.State(lGetOut.StrValueByIndex(" ", 1));

string lGetOut = "";
string lGetErr = "";
system.Exec("tclsh /usr/local/addons/modbus/sma.tcl 192.168.178.100 30773 2",&lGetOut,&lGetErr);
var SMAValue=dom.GetObject("SMA DC Leistung String 1");
SMAValue.State(lGetOut.StrValueByIndex(" ", 1));

string lGetOut = "";
string lGetErr = "";
system.Exec("tclsh /usr/local/addons/modbus/sma.tcl 192.168.178.100 30961 2",&lGetOut,&lGetErr);
var SMAValue=dom.GetObject("SMA DC Leistung String 2");
SMAValue.State(lGetOut.StrValueByIndex(" ", 1));

string lGetOut = "";
string lGetErr = "";
system.Exec("tclsh /usr/local/addons/modbus/sma.tcl 192.168.178.100 30983 2",&lGetOut,&lGetErr);
var SMAValue=dom.GetObject("SMA DC Leistung Gesamt");
SMAValue.State(lGetOut.StrValueByIndex(" ", 1));

string lGetOut = "";
string lGetErr = "";
system.Exec("tclsh /usr/local/addons/modbus/sma.tcl 192.168.178.100 30775 2",&lGetOut,&lGetErr);
var SMAValue=dom.GetObject("SMA AC Leistung");
SMAValue.State(lGetOut.StrValueByIndex(" ", 1));

string lGetOut = "";
string lGetErr = "";
system.Exec("tclsh /usr/local/addons/modbus/sma.tcl 192.168.178.100 30845 2",&lGetOut,&lGetErr);
var SMAValue=dom.GetObject("SMA Batterieladezustand");
SMAValue.State(lGetOut.StrValueByIndex(" ", 1));

string lGetOut = "";
string lGetErr = "";
system.Exec("tclsh /usr/local/addons/modbus/sma.tcl 192.168.178.100 31393 2",&lGetOut,&lGetErr);
var SMAValue=dom.GetObject("SMA Batterieladung");
SMAValue.State(lGetOut.StrValueByIndex(" ", 1));

string lGetOut = "";
string lGetErr = "";
system.Exec("tclsh /usr/local/addons/modbus/sma.tcl 192.168.178.100 31395 2",&lGetOut,&lGetErr);
var SMAValue=dom.GetObject("SMA Batterieentladung");
SMAValue.State(lGetOut.StrValueByIndex(" ", 1));


! SMA Systemzeitstempel
var t = system.Date("%H:%M:%S");
dom.GetObject("SMA Zeitstempel").State(t);

#WriteLine(lGetErr.StrValueByIndex(" ", 1));

! Ende des Scripts

mschneider
Beiträge: 13
Registriert: 07.01.2017, 18:57

Re: Homematic und SMA Sunny Boy mit SHM, PV Erzeugung lesen über ModBus

Beitrag von mschneider » 31.03.2019, 23:58

Hallo Mrfree11,

ich würde das Skript zunächst nicht alle 5 Sekunden laufen lassen, sondern nur jede Minute. Der SMA Wechselrichter braucht manchmal etwas länger und dann höngt sich alles auf. Mein SMA Wechselrichter verkraftet nur maximal 4 TCP Verbindungen. Normalerweise wird ja nur 1 Verbindung aufgebaut, aber im Fehlerfall könnten noch "alte" Verbindungen bestehen/hängen. Der SMA Wechselrichter löscht diese nach 4 Stunden! Wenn also alle 4 Verbindungen belegt sind, dann kann keine weitere Verbindung aufgebaut werden. Starten der CCU könnte helfen diese abzubrechen. (Ein Neustart des Wechselrichters auch, ist aber schwieriger durchzuführen).

Wenn das Skript fehlerfrei ist, dann einfach 4 Stunden warten. Es sollte dann wieder funktionieren.

Gruß, M. Schneider

Mrfree11
Beiträge: 6
Registriert: 18.04.2017, 00:10

Re: Homematic und SMA Sunny Boy mit SHM, PV Erzeugung lesen über ModBus

Beitrag von Mrfree11 » 01.04.2019, 22:47

OK - vielen Dank für die prompte Antwort. Dann stoppe ich heute mal die Abfrageroutine und lass den WR bis morgen in Ruhe. Dann starte ich mit der Routine im 1-Minutentakt. Die Anzahl der Register ist wohl unerheblich? Oder sollte auf 1.30 Minute Abfrageroutine gehen?

Neustart des WR möchte ich wenn möglich vermeiden.

VG

Mrfree11
Beiträge: 6
Registriert: 18.04.2017, 00:10

Re: Homematic und SMA Sunny Boy mit SHM, PV Erzeugung lesen über ModBus

Beitrag von Mrfree11 » 01.04.2019, 23:04

HA! - Melde Erfolg! - Die Umstellung auf 1 Minute hat es schon gebracht. LÄUFT.... :-) ;-)

Morgen bei Tageslicht mal die Register für DC Strings und DC Gesamt testen aber der Rest sieht gut aus.

Happy!

VG

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“