[Modul] SMA Wechselrichter (ModBus)

Hallo zusammen,

da mir die Lösung über SBFSpot nicht zu 100% gefallen hat und ich einzelne Werte zeitnaher ausgelesen haben möchte, habe ich ein Modul geschrieben, das über ModBus die Daten der Wechselrichter direkt in IP-Symcon ausliest und speichert. Zudem bin ich ein Fan davon so viel wie möglich zu zentralisieren und nicht auf externe Zusatzprogramme zurückgreifen zu müssen :slight_smile:

https://github.com/CodeKing/de.codeking.symcon.sma

Modul Funktionen

[ul]
[li]auslesen der gerätespezifischen Daten[/li][li]auslesen der Werte aller SMA Geräte[/li][li]zusätzliche Werte für die Gerätefamilie STP nn000TL-XX[/li][/ul]

Was wird benötigt

[ul]
[li]SMA Wechselrichter[/li][li]aktiviertes ModBus TCP Protokoll[/li][/ul]

Installation

[ol]
[li]Modul de.codeking.symcon.sma hinzufügen[/li][li]Instanz SMA ModBus hinzufügen[/li][li]In der Konfiguration IP-Adresse, ggf. Port und Unit ID (sofern geändert) hinterlegen[/li][li]Auf Gerät auslesen klicken[/li][li]Wenn das Gerät gefunden wurde, auf Werte auslesen klicken[/li][/ol]

Nun wird periodisch alle sich ändernden Werte ausgelesen und bereit gestellt.
Die aktuelle Wirkleistung über alle Phasen wird öfter ausgelesen (standardmäßig alle 30 Sekunden, bei mir läuft der Intervall alle 5 Sekunden).

Da nicht alle Geräte auch alle Register Adressen unterstützen, werden die nicht unterstützten Adressen beim erstmaligen auslesen abgefangen und gespeichert, diese werden zukünftig übersprungen.

In der Nacht findet keine Aktualisierung statt (über die Variable [i]Ist es Tag/I] im Location Module).

Screenshots
sma_1.PNG

Hinweise

  1. Die Aktualisierung aller Werte dauert rund 20 - 30 Sekunden. Ich überlege das noch zu ändern, damit die Werte einzeln innerhalb des eingestellten Intervalls abgefragt werden um den Thread nicht so lange zu blockieren. Da werde ich aber erst in 1-2 Wochen zu kommen.

  2. Anlagenspezifische Werte werden derzeit nur für Geräte der STP nn000TL-XX Familie (in meinem Fall STP 6000TL-20) ausgelesen. Wenn jemand für sein Gerät weitere Werte benötigt, können die Register hier nachgelesen werden: http://files.sma.de/dl/2585/WEBBOX-MODBUS-TB-de-19.pdf

Anschließend muss das Schema in der Datei SMAModBus/SMARegister.php erweitert werden. Idealerweise als Fork meiner Repository mit anschließendem Pull Request, damit ich die Änderungen übernehmen und für alle bereitstellen kann.

Viele Grüße,

Frank

1 „Gefällt mir“

Super Sache! Habe hier einen SMA SI 6.0 H11 mit aktiviertem Modbus/TCP Server. Aber nach Einbindung Deines Repos finde ich irgendwie nur Dein Plight Modul, kein mit SMA Modbus betiteltes. Wo finde ich das? Wird ja eine I/O Instanz werden, richtig?

Läuft - hatte die Instanz nur an der falschen Stelle gesucht. SUPER! Danke!
Werde mal schauen, dass ich die Batterieparameter noch ergänze… und mein SMA SB bekommt dann auch ein Speedwire denke ich :wink:

Habe mir versuchsweise mal den Batterie Ladestand (Bat SOC) dazugenommen und das funktioniert ebenfalls gut. Habe nur lokal bei mir geändert, denn ich habe noch nie irgendwas auf github geforked und ehrllich gesagt auch zu wenig Ahnung von den anzugebenden Parametern (den Prozentwert habe ich einfach über ~Valve gemacht…). Vermutlich ist meine Änderung so nach dem nächsten Update hinfällig…
Was ich anbieten könnte ist, die gerätespezifischen Parameter für SI / SBU am Wochenende zu erfassen und Dir separat zu senden. Dazu bräuchte ich aber noch einen Hinweis zu count/type/format/profile, damit ich da keinen Mist baue… kann man die irgendwo nachlesen? Der SI hat eklig viele Parameter und es wäre blöd, wenn ich einen Fehler durchschleppe.

Die einzelnen Register kannst du ja hier nachlesen:

http://files.sma.de/dl/2585/WEBBOX-MODBUS-TB-de-19.pdf

bzw. die englischen Bezeichnungen dann hier:

http://files.sma.de/dl/2585/WEBBOX-MODBUS-TB-en-19.pdf

Die Register habe ich z.B. so aufgebaut:

30231 => [ // Registernummer
            'name' => 'Power limit', // Name des Registers auf englisch (muss in der locale.json übersetzt werden)
            'count' => 2,                      // Spalte 'CNT' aus der PDF
            'type' => 'U32',                 // Spalte 'Typ' aus der PDF
            'format' => 'FIX0',            // Spalte 'Format' aus der PDF
            'profile' => 'Watt'             // IP-Symcon Variablen-Profil, das verwendet soll
        ],

Das Variablen-Profil kann entweder ein standardmäßiges sein (z.B. ~Electricity), oder aber ein eigenes. Letzteres müsste dann allerdings noch in der Datei ~/libs/ModuleHelper.class.php innerhalb der Funktion CreateCustomVariableProfile definiert werden.

Wenn du die Werte alle bei dir korrekt ausgelesen bekommst kannst du mir die Änderungen auch gerne so als Liste schicken, dann implementiere ich das ins Modul und stelle es bereit.

Viele Grüße,

Frank

Ok verstanden, danke! Hatte ich übersehen aber zufällig richtig erfasst. Kam am Wochenende nicht dazu, versuche es aber die Tage und attache das dann hier,

…puh - womit hast Du die neueste Version editiert? In der ersten von mir genutzten Version sah es aus wie oben und ich habe kleine Änderungen gemacht. Jetzt sieht die in meinem php-Editor so aus und ich finde nix bzw nicht leicht etwas und mache mir auch Sorgen, was kaputt zu machen:

<tr>
        <td id="L25" class="blob-num js-line-number" data-line-number="25"></td>
        <td id="LC25" class="blob-code blob-code-inner js-file-line"><span class="pl-s1">        <span class="pl-c1">30051</span> <span class="pl-k">=></span> [</span></td>
      </tr>

Sorry für die DAU-Frage :slight_smile:

Huch, da hat dein Editor aber irgendwas an HTML dazu gedichtet, was da definitiv nicht hin gehört :slight_smile:
Welchen Editor verwendest du denn? Ich nutze hauptsächlich phpStorm, würde dir aber den kostenlosen notepad++ empfehlen, damit sollte es eigentlich klappen.

Naja, das ist schon mit notepad++ :wink:
War die aus dem github heruntergeladene Version und ich hatte aus andere Editoren probiert. Die damals von mir installierte Version war „sauber“, sonst nehme ich die halt. Dort hatte ich ja schon ein paar Werte für mich ergänzt und nach Modulupdate damit überschrieben, um die Änderungen nicht nochmal machen zu müssen. Meine Ergänzungen für Dich wollte ich aber logischerweise in der neuesten Version machen, daher hatte ich die nochmal aus dem github geladen und dann den html code gesehen.

…so, das lag evtl. am „Ziel speichern als …php“ von Firefox. Habe es nun im Browser als „raw“ anzeigen lassen und über Clipboard kopiert, jetzt sieht es sauber aus. Werde es nun mit notepad++ editieren können.

Hallo, habe alles außer einem SMA Wechselrichter aber die Kommunikation läuft bei mir auch über Modbus.
Wenn ich also das SMA Meter oder die Batterie mit den kleinen Kisten an der Wand da eintrage müsste es doch auch funktionieren?
Hat das schon mal jemand versucht?
Ich denke das Beste währe es das SMA Meter abzufragen???
Michael

So - hier mal die weiteren Felder für die SI-Reihe, wobei ich den Ersatzstrom weggelassen habe. Wird sonst einfach unvernünftig viel…

		/**
		* Sunny Island
		*/
		30061 => [
            'name' => 'Firmware',
            'count' => 2,
            'type' => 'U32',
            'format' => 'FW',
        ],
		30577 => [
            'name' => 'Grid energy consumption today',
            'count' => 2,
            'type' => 'U32',
            'format' => 'FIX0',
            'profile' => '~Electricity'
        ],
		30579 => [
            'name' => 'Grid energy feed-in today',
            'count' => 2,
            'type' => 'U32',
            'format' => 'FIX0',
            'profile' => '~Electricity'
        ],
		30581 => [
            'name' => 'Grid reference counter reading',
            'count' => 2,
            'type' => 'U32',
            'format' => 'FIX0',
            'profile' => '~Electricity'
        ],
		30583 => [
            'name' => 'Grid feed-in counter reading',
            'count' => 2,
            'type' => 'U32',
            'format' => 'FIX0',
            'profile' => '~Electricity'
        ],
		30775 => [
            'name' => 'Power',
            'count' => 2,
            'type' => 'S32',
            'format' => 'FIX0',
            'profile' => '~Watt'
        ],
		30845 => [
            'name' => 'Current battery charge status',
            'count' => 2,
            'type' => 'U32',
            'format' => 'FIX0',
            'profile' => '~Valve'
        ],
		30849 => [
            'name' => 'Battery temperature',
            'count' => 2,
            'type' => 'S32',
            'format' => 'TEMP',
            'profile' => '~Temperature'
        ],
		30851 => [
            'name' => 'Battery voltage',
            'count' => 2,
            'type' => 'U32',
            'format' => 'FIX2',
            'profile' => '~Volt'
        ],
		30853 => [
            'name' => 'Active battery charging mode',
            'count' => 2,
            'type' => 'U32',
            'format' => 'ENUM',
            'mapping' => [
                1767 => 'Quick charge',
				1768 => 'Full charge'
                1769 => 'Compensation charge',
                1770 => 'Maintenance charge'
				2184 => 'Save energy while on mains'
            ]
			],
		30857 => [
            'name' => 'Number of battery charge throughputs',
            'count' => 2,
            'type' => 'S32',
            'format' => 'FIX0',
        ],
		30859 => [
            'name' => 'Battery maintenance charge status',
            'count' => 2,
            'type' => 'U32',
            'format' => 'ENUM',
            'mapping' => [
                803 => 'Inactive',
				1771 => 'Charge with solar power'
                1772 => 'Charge with solar and mains power',
            ]
			],
		30861 => [
            'name' => 'Consumer power',
            'count' => 2,
            'type' => 'S32',
            'format' => 'FIX0',
            'profile' => '~Watt'
        ],
    ];

Das SMA Energymeter frage ich auch ab, aber das gibt mir z.B. nicht den Ladestand der Batterie…

Geändert habe ich auch noch das hier, um einen weiteren Status „off“ zu ergänzen:

30201 => [
            'name' => 'Status',
            'count' => 2,
            'type' => 'U32',
            'format' => 'ENUM',
            'mapping' => [
                35 => 'Error',
				303 => 'Off'
                307 => 'OK',
                455 => 'Warning'
            ]
        ],
        

Beim Batterie Ladestatus oben müssen wir mal probieren. Wenn man den mit U32 FIX0 erfasst wie angegeben, kommt ein Float raus und man muss auf ~Valve.F setzen, um einen %-Wert zu bekommen. Ein Integer wäre sinniger, denn es werden nur ganze %-Werte ausgegeben und dort gibt es dann ~Battery.100 was besser als Format passen würde denke ich. Habe daher auf RAW gesetzt, das ist aber eine Abweichung von der Anleitung…

Vielen Dank für die Anpassungen für den Sunny Island, diese habe ich eben zum Modul hinzugefügt, sowie noch schnell die entsprechenden Übersetzungen rausgesucht.

Das mit dem Batterie Ladestatus muss ich mir in den nächsten Tagen mal in Ruhe anschauen und testen, bin momentan beruflich leider sehr eingespannt. Ich denke aber spätestens nächstes Wochenende werde ich dafür die Zeit finden (:

Viele Grüße,

Frank

Ja, kenne ich - deshalb dauerte das bei mir auch ewig. Hat Zeit, keine Sorge.
Läuft grundsätzlich - was mir auffällt ist:

  • Bezug und Einspeisung Heute werden als Wh ausgegeben, Einheit ist aber kWh - müsste also umgerechnet werden.[/li][li]Die Zählerstände sind auch um den Faktor 1000 zu hoch meine ich.[/li][li] Batterie Ladestand kommt immer noch als Float und nicht als Integer, dadurch ist das Format ~Battery.100 ungültig. Habe es einstweilen auf ~Valve.F gesetzt und bekomme nun den Wert.[/li][li] Die Batterietemperatur kommt als Integer und nicht als Float, dadurch ist das Format ~Temperature ungültig. Habe testweise auch mal auf ~Valve gestellt um was zu sehen. Die 168 müssten auch noch /10 geteilt werden (16.8 °C).

Hat Zeit wie gesagt. Das Modul läuft super, vielen Dank dafür! Habe auch meinen SB5000TL21 dran, der braucht gar keine Änderungen.

Viele Grüße!
Schorsch

Screenshot:

Bin weiter - mit diesen Einstellungen kommt der Batterieladezustand korrekt als Integer:

30845 => [
            'name' => 'Current battery charge status',
            'count' => 2,
            'type' => 'S32',
            'format' => 'RAW',
            'profile' => '~Battery.100'
        ], 

Und mit diesen die Temperatur zumindest als Float, aber natürlich immer noch Faktor 10 zu hoch:

30849 => [
            'name' => 'Battery temperature',
            'count' => 2,
            'type' => 'U32',
            'format' => 'FIX0',
            'profile' => '~Temperature'
        ], 

Sieht also so aus:

Und mit diesen die Temperatur zumindest als Float, aber natürlich immer noch Faktor 10 zu hoch:

30849 => [
            'name' => 'Battery temperature',
            'count' => 2,
            'type' => 'U32',
            'format' => 'FIX0',
            'profile' => '~Temperature'
        ], 

[/QUOTE]

Probier mal hier anstelle von FIX0 den Wert FIX1 zu verwenden, dann müsste es korrekt umgerechnet werden.

FIX0 = Standardausgabe
FIX1 = Ausgabe / 10
FIX2 = Ausgabe / 100
FIX3 = Ausgabe / 1000

Bei Bezug und Einspeisung könntest du FIX3 verwenden. Das habe ich beim Sunny Tripower auch eingestellt, da ModBus die Werte als Wh liefert, ich diese aber in kWh haben wollte.

Selbiges bei den Zählerstellen :slight_smile: Kann leider noch keine Beiträge editieren.

Cool - mit den FIX-Werten klappt es. Stimmt jetzt alles. Danke!!
Was macht denn U32 / S32?