[Modul] SMA Wechselrichter (ModBus)

Jetzt durfte ich das Online miterleben …

Der letzt´ angezeigte Wert für diie „AC Wirkleistung über alle Phasen“ war 32.760W - analog zum internen SMA-Webinterface.

Schon bei 32.780W (lt internem SMA Web-Interface) kam bei IPS 0W an. Irgendwo dazwischen scheint die Limitierung zu sein.

Ich hoffe, das hilft Euch Spezialisten weiter. Schon mal Danke für die Unterstützung.

Hallo max,

ich bin beruflich bedingt etwas busy (noch). es ist definitiv ein Überlauf. (32767 16 Bit). Deckt sich mit deiner Beobachtung. Ich weiß noch nicht genau, ob eine Wandlungsroutine im Modul verantwortlich ist oder fehlerhafte Parameter im Modul oder und.

Es kann sich noch etwas ziehen, bis ich (oder jemand anders) die Lösung habe, da ich nur wenig Zeit habe, mir das genauer anzuschauen. Weiß denn jemand, ob codeking noch irgendwo aktiv ist. Lizenztechnisch habe ich das noch nicht geprüft. Erst das technische…

Zwischenergebnis: Quick and dirty funktioniert das bei mir jetzt. Hab mir eine Testing Umgebung gebastelt.
Ich versuche mal einen kurzen Fix hinzubekommen. Allerdings kann ich das nur für meinen Anwendungsfall kontrollieren.
Melde mich später nochmal, falls ich Zeit habe. Brauchte das als Fingerübung und Ablenkung…
Es ist ein Fehler bei bei der Auswertung.

Hallo Martin,

recht vielen Dank für Deine Unterstützung. Ich habe mal hier, hoffentlich zur Aufheiterung in dieser Zeit, den Graphen des Wechselrichters von der heutigen „Sonnenfinsternis“ angehängt :slight_smile:

Hi max,

ich kann den Fehler wohl reproduzieren. Bei dir ist es ja die AC Wirkleistung. Ich probiere gerade etwas rum. Bei manchen Dingen behebt man ja etwas, aber macht anderes kaputt.
Die Werte kommen sauber aus dem Wechselrichter. Aber die Auswertung der Daten läuft fehlerhaft.

In module.php des Moduls passiert hier der erste Fehler, zumindet bei mir. Bei Day yield (Adresse 30535) wird $endianness falsch bestimmt.


// set endianness
$endianness = in_array($config['format'], ['RAW', 'TEMP', 'DURATION_S', 'DURATION_H']) ? 2 : 0;

// fix bytes
$value = $endianness
   ? array_chunk($value, 4)[0]
   : array_chunk($value, 2)[1];

...

// ->  Hier tritt dein Problem mit der 0 auf "Sonnenfinsternis"; 

// set value to 0 if value is negative or invalid
if ((is_int($value) || is_float($value)) && $value < 0 || $value == 65535) {
  $value = (float)0;
 }


Die Auswertung, ob der ermittelte Wert gültig ist, müsste auch abgeändert werden. Ich werde jetzt mal endianness auf 2 und kommentiere die Sicherheitsabfrage aus. Meiner Ansicht nach müsste man bei type U32 nur auf negative Werte testen.
Sollte erstmal reichen, da in SMARegister.php nur U32 und S32 verwendet werden.
Fortsetzung folgt…

Teilerfolg, es werden dann aber andere Werte falsch berechnet. Muss das wohl auf den Tagesertrag (Day yield) und AC Wirkleistung beschränken. Dafür funktioniert meine Änderung wohl.

Hallo,

Anpassung in module.php ab Zeile 219:


// set endianness
$endianness = in_array($config['format'], ['RAW', 'TEMP', 'DURATION_S', 'DURATION_H']) ? 2 : 0;
if ( ($config['name'] == 'Day yield') || ($config['name'] == 'AC active power across all phases') ) {
    $endianness = 2;
}

und ab Zeile 239


 // set value to 0 if value is negative or invalid
 if ( $config['name'] != 'Day yield')) {
	if ((is_int($value) || is_float($value)) && $value < 0 || $value == 65535) {
               $value = (float)0;
	 }
 }

Das werd ich morgen mal beobachten. Ist erstmal nur ein Bugfix, da ich aktuell nicht viel Zeit habe, um das venünftig zu lösen.

So mittlerweile ist mir das ganze klar, was dieses float(0) soll. RTFM

Ergänzung:
Aus der Modbus Doku SMA
U16 Ein Wort (16 Bit/WORD) im lokalen Prozessor-Format 0xFFFF
S16 Vorzeichenbehaftetes Wort (16 Bit/WORD) im lokalen Prozessorformat 0x8000
U32 Ein Doppelwort (32 Bit/DWORD) im lokalen Prozessor-Format 0xFFFFFFFF
S32 Vorzeichenbehaftetes Doppelwort (32 Bit/DWORD) im lokalen Prozessor-
Format 0x80000000
U64 Ein Vierfachwort (64 Bit/2 x DWORD) im lokalen Prozessor-Format 0xFFFFFFFFFFFFFFFF

Das heisst, man sollte die endianness etwas anders bestimmen und die Sicherheitsabfrage mit float(0) - NAN Werte korrigieren. Man könnte das float(0) auch einfach fallen lassen, würde aber dann bei ungültigen Werten unschön aussehen.

So. Mittagspause im Homeoffice beendet. Sorry für meine losen Gedanken.
Warte gerade parallel auf einen Datenexport aus den VPN Systemen - das dauert…

Ich führe mal das Selbstgespräch fort:
meine temporäre Änderung hat schon mal Erfolg gehabt. Ich weiß nicht wieviel Zeit ich habe.
Man müßte das Modul dahingehend ein wenig überarbeiten. In dem Rahmen könnte man dann noch ein paar Kleinigkeiten anpassen wg. der PHP Version, wenn ich das bei einem schnellen Blick richtig gesehen habe.
Ob ich die Zeit finde weiß ich nicht, man bräuchte dann auch ein paar Tester, die andere WR im Einsatz haben. Ich kann das nur für den SMA Sunny Tripower STP 15000TL/30 BJ 2019 prüfen.

Optional könnte man fehlende Werte ergänzen.Vielleicht einstellbar. Vergleichbar mit Bumaas Ebus Modul - wer es zufällig kennt.

Selbstgespräche sind manchmal auch zielführend :slight_smile:

Wir haben hier eben 2 SMA STP50-40 BJ 2019 - selbstverstä¤ndlich gerne zum Testen bereit ! Das Modul ist zur Überwachung der Systeme gedacht, wir steuern hier nichts bzgl. Überschuss in einen Puffer oder dgl. Noch nicht :slight_smile:

@martin, Deinen Ausführungen kann ich nur zum Teil folgen - klingen aber für mich logisch.

Ich hatte mir schon überlegt, die php-Datei so abzuänderen, dass die Leistung L1/2/3 im schnellen Modus abgefragt wird und dann der „AC Gesamt“ in IPS berechnet wird. Wäre auch eine q&d Variante.

Jetzt hoffe ich mal darauf, dass Du an dem Thema weitermachst und lösen kannst. Danke.

Hallo Max,

ich habe Symcon unter Raspbian im Einsatz. Falls du Windows hast, befinden sich die Ordner unter c:\ProgramData.

Also für einen Bugfix:
1: Raspbian
/var/lib/symcon/modules/de.codeking.symcon.sma\SMAMODBUS
Windows wahrscheinlich
C:\ProgramData\Symcon\modules\de.codeking.symcon.sma\SMAMODBUS

  1. Sicherheitskopie der Datei modules.php anlegen
  2. Im Texteditor Zeile 220 suchen. unterhalb $endianness = in_array… die drei Zeilen ergänzen.

// set endianness
$endianness = in_array($config['format'], ['RAW', 'TEMP', 'DURATION_S', 'DURATION_H']) ? 2 : 0;
if ( ($config['name'] == 'Day yield') || ($config['name'] == 'AC active power across all phases') ) {
    $endianness = 2;
}

Obige Änderung sollte bei dir schon ausreichen. Ansonsten temporär deine Lösung, bis ich fertig werde.

Leider kann ich noch nichts versprechen, da ich bis Ende nächster Woche maximal busy bin - wobei ich in der aktuellen Sitution froh bin, Arbeit zu haben.
Da codeking hier nicht mehr aktiv ist, müsste ich das Projekt forken und unter github stellen. Da könnte ich dir dann Zugang geben zum testen. Aber wie gesagt, ich kann dir in den nächsten Tagen nichts fest versprechen.
Lizenztechnisch muss ich das auch nochmal checken (CC BY-NC-ND 4.0). Da würde ich gerne codeking fragen, bevor wir das über den privaten Kreis hinaus verteilen wollen.

https://creativecommons.org/licenses/by-nc-nd/4.0/deed.de
Keine Bearbeitungen, daher müsste da codeking sein ok geben, sobald es so veröffentlicht wird.Bin kein Lizenzprofi. Man möge mich korrigieren, wenn ich da falsch liege.

Hallo Martin,

besten Dank für den Fix. Ich pflege die Zeilen morgen früh gleich ein. Vielleicht bekommen wir ja nochmals solch einen Traum-Sonnentag.

Ich berichte bei 32767-Durchgang. Schönen Abend

Hi Martin,

dank´ dem Traumwetter konnte wir heute bereits den 16-bit Durchgang testen. Funktioniert, keine Limitierung und auch aus jetziger Sicht keine Fehlermeldungen ! Vielen Dank.

Wenn ich etwas testen / ändern / ausführen soll, sag´ mir bitte Bescheid.

Hallo Max,

danke für die Info. Ich hatte auch Kontakt zu Frank. Er hat nichts gegen die Weiterentwicklung des Moduls, solange diesee nicht kommerziell ist.

Ich möchte mich an dieser Stelle nochmal explizit bei Frank (codeking) für das Modul bedanken! Und für die Erlaubnis der Weiterverwendung!

Wie gesagt bin ich etwas knapp mit Zeit. Du kannst mich gerne auch per PN mal kontaktieren. Ich würde es schon gerne gerade ziehen.
PS: Sichere dir mal den ganzen SMA Modbus Ordner, falls du mal aus Versehen die Dateien überschreiben solltest.

Soviel in der Home Office Mittagspause :slight_smile:

Hallo,

ich bekomme in 2 Wochen meine PV-Anlage (nachdem China nach langer Wartezeit wieder angefangen hat Module zu produzieren…) mit einem SMD Sunny Tripower 10,0 - Wechselrichter. Ich kann’s kaum abwarten den in IPS zu integrieren, daher schon vorweg die Frage: Muss ich irgendwas bei der Einrichtung durch den Elektriker/Einrichter beachten bzw. dem irgendwas sagen, das die Modbus-Schnittstelle erreichbar ist, spricht freischalten lassen. Oder ist die immer frei zugänglich?

Danke
hardlog

Der Installateur wird Modbus/TCP aktivieren müssen, so war es jedenfalls bei mir

Tommi

Hallo Zusammen,

wir haben nun seit Samstag unsere PV-Anlage auf dem Dach, unter Anderem mit einem Batterie-Laderegler von SMA (SBS5.0) welcher ebenfalls „normal“ über ModBus abgefragt werden kann.

Leider scheinen die Register für die gesamte Batterieladung (in Wh) sowie die Batterieentladung (in Wh) nicht zu funktionieren:
SMARegister.php:

,	
            31397 => [
                'name' => 'Zählerstand Batterieladung, in Wh',
                'count' => 4,
				'type' => 'U64',
				'format' => 'FIX0',
				'profile' => 'Wh'
			],
            31401 => [
				'name' => 'Zählerstand Batterieentladung, in Wh',
				'count' => 4,
				'type' => 'U64',
				'format' => 'FIX0',
				'profile' => 'Wh'
			]

In Symcon wird die Variable zwar richtig angelegt, der Wert bleibt allerdings 0.
Mit dem von SMA empfohlenen Modbus Master Simulator kann das genannte Register korrekt ausgelesen werden (siehe Anhang).
2020-05-12 08_27_05-Radzio! Modbus Master Simulator.png

Habt ihr eine Idee?

Viele Grüße,
Markus

2020-05-12 08_32_45-Modbus - Parameter und Messwerte.png

Ich habe den Sunny Boy 2.0 (SB2.0-1VL-40).

Bei den Werten „Netzbezug heute“ und „Netzeinspeisung heute“ werden keine Daten gelesen/geschrieben.

In der SMARegister.php habe ich schon geschaut. Die Register 30577 und 30579 sollten doch die richtigen sein.

Gruß
richimaint

Hallo,

habe auch noch einen Bug entdeckt, da bei mir keine Spannungswerte der Strings angekommen sind.

Beim Register 30959 (String 2 DC Voltage, habe ich zusätzlich) sowie 30771(String 1 DC Voltage) muss Type U32, Format FIX2 eingetragen werden, dann kommen auch die Spannungswerte.

VG Obala

1 „Gefällt mir“

Ist aber übrigens in der SMA Modbus Doku falsch!

Da fällt mir noch eine Frage ein, ist es möglich die Werte auch Nachts auszulesen? Also wegen den Netzspannungen, Frequenz etc… Wäre für das Archiv was nützliches. Leider bleibt die Funktion im Modul „Werte nur tagsüber auslesen“ nicht statisch deaktiviert. Diese aktiviert sich beim speichern wieder.

VG obala