Pylontech US2000B 48V Speicher - Modul zum auslesen

Guten Abend,
ich habe mir den oben erwähnten Speicher zugelegt und wollte diesen natürlich in Symcon einbinden.
Vielen Dank an dieser Stelle an Fonzo für sein IPSymconDataFlowGenerator welcher mir bei der Erstellung des Moduls Stunden an Zeit erspart hat.

Es ist noch nicht alles fertig. z.B. sind noch keine Variablenprofile mit eingebaut.
Aber falls jemand auch einen solchen Akku hat, kann damit schon mal getestet werden.

Angebunden ist der Speicher über RS-485 mithilfe eines USR-TCP232-306. Dieser ist etwas teurer als andere Versionen, hat aber einen Eingangsspannungsbereich von 5V - 36V und daher gut mit 12V passiv POE versorgbar und hat einige Status-LEDs sowie wahlweise RS-232, RS-422 und RS-485.

Sollte jemand den Speicher über RS-232/USB anbinden wollen, müssten noch ein paar kleine Änderungen im Modul gemacht werden.

Grüße
Stefan
IPSPylontech_0.1.zip (7.38 KB)

Beim Strom ist noch ein Fehler drin. Es müssen auch negative Werte dargestellt werden.

               if ($Strom == TRUE){
                        $short = hexdec($Data[101].$Data[102].$Data[103].$Data[104]);
                        if($short >= 32768) { $short -= 65536; }
                        $this->SetValue("Strom",$short/10);
                }

Bei der Kapazitätsanzeige hat sich auch noch ein Fehler beim durchkopieren eingeschlichen.

$this->SetValue("Kapa", hexdec($Data[109].$Data[110].$Data[111].$Data[112])/1000);

Ich werde das in die nächste zip-Version mit einbauen.

Guten Morgen,

Ich habe seit gestern auch so einen Speicher.

Bezüglich Schnittstelle bin ich noch am forschen. Mein Wechselrichter (Voltronic Infinisolar 10k Hybrid, auch etwas schönes aus der VR China) muss auch noch eingebunden werden. Protokoll und ein paar erste Skripte habe ich schon gefunden. Dort war auch von einem usr tcp Adapter die Rede.

Ich melde mich.

Gruß
Eric

Hallo Fuchskusu,
wenn ich dran denke, lade ich mal die aktuelle Version meines Moduls hoch.
Ich habe folgenden Artikel bei Amazon gekauft: „USR-TCP232-306 Serieller zu Ethernet Konverter Lan Ethernet TCP / IP zu RS232 RS485 RS422 Konverter“

Für deinen Wechselrichter könntest du die „SNMP web card“ verbauen. Da könnte ich dir auch weiterhelfen, da ich den Infinisolar Super 4K habe und diese dann wahrscheinlich exakt gleich auszulesen sind. Solltest du die Modbus-Karte haben, kann ich dir da nicht weiterhelfen.

Grüße
Stefan

Hallo,

Danke für die Unterstützung.

Den Hybrid-WR habe ich heute soweit durchschaut, dass der Rest jetzt Fleißarbeit ist. Bin über USB rangegangen, dann an den Symcon Raspi, einen HID, Cutter, Registervariable und entsprechend Variablen und Skripte. Das Protokoll ist ja leider nicht öffentlich zugänglich, und das hat einen Grund.

Die snmp Karte für den WR bekomme ich nicht rein, da steckt schon die rs485 für den Zähler drin :smiley:

Weiterhin habe ich am rs232 des WR eine externe Original-Box des Herstellers auf rs485 (da steckt tatsächlich die gleiche Karte drin wie im WR), damit der Pylone mit dem WR reden kann (SOC und Co.). Den Pylonen will ich derzeit via console port und rs232 zu USB verbinden, so wie es das Solaranzeige.de Projekt macht. Mal sehen, ob das mit Symcon auch so geschmeidig wie mit dem WR klappt. Dein Code kann da sicher helfen. Zum Pylonen gibt es zum Glück die Protokolle und einige Projekte öffentlich. Am Wochenende gehe ich das an, ich werde berichten.

Mfg
Eric

Das Protokoll für RS232 und RS485 müsste nahezu identisch sein. Die Adressierung ist um eins verschoben, so wie ich mich erinnern kann. Ich habe die RS485 gewählt, um die RS232 weiterhin für den Laptop frei zu haben, um auch mal auf die Konsole zu kommen.

Falls du die Protokolle noch nicht gefunden hast, kann du die hier laden: photovoltaikforum

Aktuell hole ich mir aus der Pylontech folgende Werte:

Hallo Stefan,

habe mir inzwischen einen USR N540 zugelegt, der hat 4 RS232, 442 bzw. 485 Ports. Ansonsten sollte er identisch zu Deinem sein.
Da mein Wechselrichter bei werksmäßiger Anbindung über RS485 zum Pylontech nicht ganz das macht, was ich möchte (z.B. entlädt er erst zu tief um danach aus dem Netz den Akku zu laden, keine Ahnung, was die Jungs aus Taiwan sich dabei gedacht haben:confused:), ist der RS485 plötzlich doch „frei“ und Dein Vorgehen ist für mich auch sinnvoll.

Einen SDM630 kann ich inzwischen auch mit dem USR auslesen (siehe: link). Diese Daten muss ich dem Wechselrichter wieder zur Verfügung stellen, damit der seine Netzeinspeisung hinbekommt. Dazu hat riogrande75 aus dem photovoltaikforum gute Arbeit geleistet (link).

Jetzt fehlt mir noch der Zugriff auf den Pylontech. Dann ist es möglich mit Symcon, den WR optimal zu betreiben und von außen zu optimieren.

Wenn ich das fertig habe, teile ich es gern. Mache dann einen neuen Threat auf.

Kannst Du bitte für dieses Projekt die Einstellungen Deines USR posten (z.B. mittels Screenshoot) sowie Dein aktuelles Modul hier einstellen?

Danke vielmals.

Eric

Hallo Eric,
es hat sich im Modul nur das oben genannte geändert. Aber hier der Einfachkeit halber die zip Datei im Anhang.

Hier noch der Screenshot:
settings.png

IPSPylontech_0.2.zip (7.69 KB)

Wenn du noch Anregungen oder Verbesserungen im Modul hast, sag bescheid.

Grüße
Stefan

Hier noch ein kleines Skript zum zusammenfassen der Module zu einem Stack - das will ich auch irgendwann noch in das Modul packen, aber aktuell keine Zeit und Lust.

//IPSPylontech = {AE6E37A8-7241-25CF-005E-9153F322250C}
$UpdateList = IPS_GetInstanceListByModuleID("{AE6E37A8-7241-25CF-005E-9153F322250C}");
//print_r($UpdateList);
$UpdateCount = count($UpdateList);
$m_count = 0;
$val_ah = 0;
$val_strom = 0;
$val_ges = 0;
foreach ($UpdateList as $UpdateListID) {
    
    $parent = ips_getparent($UpdateListID);
    if ($parent == $_IPS['SELF']){
        $KapaID = IPS_GetObjectIDByIdent ("Kapa",$UpdateListID);
        $val_ah = $val_ah + GetValueFloat($KapaID);
        $StromID = IPS_GetObjectIDByIdent ("Strom",$UpdateListID);
        $val_strom = $val_strom + GetValueFloat($StromID);
        $KapaGesID = IPS_GetObjectIDByIdent ("KapaGes",$UpdateListID);
        $val_ges = $val_ges + GetValueFloat($KapaGesID);
        //echo "Child";
        $m_count++;
    }
    if ($m_count == 0 ){
        echo "Keine Module gefunden";
    }
    else {
        SetValue(23966,$val_ah);
        SetValue(48387, $val_strom);
        SetValue(32103,$val_ges);
    }
}

Hallo in die Runde,

ich habe dank Steppe und anderen Quellen im Internet die Kommunikation zum Pylontech soweit durchschaut und zumindest den für mich derzeit interessanten Teil programmiert.

Anbei findet Ihr eine ganze Menge an Skripten und Doku. Diese sollen Euch als Startpunkt dienen. Besonders die Berechnung des Befehls, welcher zum Pylontech gesendet wird habe ich komplett umgesetzt.

Anmerkung: Hauptaugenmerk bei meiner „Spagetti-Programmierung“ war erstmal die Codierung / das Protokoll zu verstehen. Deshalb ist das alles sehr „offen“, d.h. anstatt vieles in einem Skript abzuhandeln werden „Zwischenstände“ in Variablen ausgegeben und danach wieder durch Ereignisse und Skripte weiterverarbeitet. Ist jetzt nicht unbedingt schön und Nutzerfreundlich, ich bin derzeit auch dabei, das ganze nochmal ordentlich zu machen.

Viel Spaß damit.

Eric

Skripte.zip (416 KB)

Hier eine aktualisierte Version meines Moduls.
Änderungen:
-Zusammenfassung mehrere Module zu einem Stack durch eigene Instanz
-Zusätzliche Fehlerbehandlungen bei der Kommunikation
-Namensänderung des Aliasnamens
-Ladezustand in Prozent für den Stack (auswählbar)
-Standardprofile für die Variablen hinzugefügt

Die Struktur ist im Screenshot erkennbar (Module müssen unterhalb des Stacks liegen)

Grüße
Stefan

IPSPylontech_0.3.zip (11.6 KB)

Whao, kommt jetzt genau richtig. :slight_smile:
Erwarte meine ersten Pylonen für Mitte nächste Woche.

Hatte mich die letzten Tage ins Protokoll eingelesen und wollte eigentlich etwas auf Basis ESP8266 + Modbus machen.
Aber wenn hier schon alles fertig ist nehme ich dankend an.
Hab zwar bis dato von fremden Modulen konsequent die Finger gelassen und lieber selbst gescriptet, aber man wird alt und faul. Mal sehen.

Du nutzt doch das Gatway aus dem ersten Post ? Ist das komplett transparent TCP->RS485 oder benbötigts dafür noch irgendwelche Steuerkomandos zusätzlich ?

schönen Grüße und vielen dank im Voraus
Bernhard

Hi Bernhard,
ja, der RS485-TCP/IP ist so geblieben. Für RS232 müsste man das Modul ein bisschen anpassen (Adressen verschieben sich um 1).
Hab auch nur weiter geschrieben, da ich mit 2 Modulen angefangen habe und soweit alles gut läuft, dass ich nochmal 2 dazu gesteckt habe.
Mit dem Ladezustand der Akkus steuere ich auch meinen Wechselrichter, da dieser nicht kompatibel mit den Pylontech Akkus ist (kein Modbus oder sonstiges - nur für Bleiakkus gedacht…)

Wenn du Ideen oder Probleme mit dem Modul hast, sag bescheid.

Grüße
Stefan

Servus Stefan
Meine Pylonen sind nun da und soweit alles installiert. Per RS485 kann ich sie auch mit meinem Wechselrichter verbinden und er zeigt mir ein paar Dinge an. Auch erkennt er alle vier Batteriepacks des Stacks. Soweit so gut.

Nun hab ich mich auch an deinem Modul versucht, aber da komme ich leider nicht weiter.
Wie muß ich denn konfigurieren damit ich die Daten von allen Batteriepacks eines Stacks abfragen kann ?
Ich habe mir einen Pylontech Stack angelegt, darunter vier Instanzen des Pylontech Modules.
Welche Adressen trage ich denn ein, und wie müssen die DIP Switch gesetzt sein ?

Ich habe an allen vier Modulen den Switch1 auf „On“ (9600bps) und alle anderen auf OFF. Also Adresse „1“
-> Mein Wechselrichter ist damit glücklich und erkennt alle vier Batteriepacks, also auch die Slaves.

Aber was trage ich den in den Instanzen deines Modules ein ? Bei „1“ kommen nur fürs erste Batteriepack Daten.
Wie kriege ich denn Daten der Slaves, also für die andern Instanzen des Pylontech Moduls ?

etwas verwirrt ich bin
bernhard

Übrigens geht dein Modul auch mit RS232 und der Konsolenschnittstelle. Eben probiert. Man muß nur Adresse +1 außm Code entfernen.

Hallo Bernhard,
du hast ja die Verbindung schon auf das erste Modul. Das ist dann der Master. Die anderen Module werden einfach aufsteigend adressiert. An den DIP-Schaltern musst du die Adresse nicht extra einstellen. Das regelt sich über die Reihenfolge, wie die Module zusammengesteckt werden.
Ich wollte mal noch einen Umschalter in das Modul einbauen, dass man RS232 oder RS485 wählen kann und dann die Adresse entsprechend gesetzt wird.

Grüße
Stefan

Servus
Komisch, bei mir kommt nichts.
Auch wenn ich im Debugger schaue sehe ich das nur Anfragen an 0x32
0x7E, 0x32, 0x30, 0x30, 0x32, 0x34, 0x36, 0x34, 0x32, 0x45, 0x30, 0x30, 0x32, 0x30, 0x32, 0x46, 0x44, 0x33, 0x32, 0x0D
beantwortet werden.
0x33 oder 0x34 usw. bringt keine Antwort.

Der Stack selbst scheint mir aber richtig konfiguriert. Denn mein Wechselrichter erkennt alle Module (über RS485) und auch wenn ich über RS232 und die Konsolenkomandos rangehe kriege ich die Daten aller Module.

Sehr komisch das ganze:confused:
bb

Hallo,

Naja, Du änderst ja nur die Adresse.
Die Berechnung der Checksummen ist auch erforderlich, weiterhin muss die Adresse noch im Block Info eingetragen werden.

Kannst ja mal meine Codeschnipsel weiter oben ansehen. Die berechnen das…

Grüße
Eric

Danke Eric

  • das die CRC noch geändert werden muß ist klar.
    Ich habe nur einen Screenshot aus dem Modul vom Stefan gepostet. Da macht er das natürlich.

Inzwischen hab ich mir das schon selbst hingestrickt.
Ich gehe über den Konsolenbefehl „pwr“. Man muß dann zwar den String parsen ist aber nicht schwer. Im Grunde finde ich das eh schöner da alles im Klartext und damit gut zu debuggen ist.
Das ein paar Byte mehr zu übertragen sind und die Rechenzeit fürs parsen stören ja net, will eh kein Hochgeschwindigkeitslogging.

Erst hab ich versucht die Definition fürs Binäre Protokoll (das was ihr nützt) zu verstehen, bin da aber nicht wirklich durchgestiegen. Über die Konsole in Ascii wars dann ganz einfach. 3 Stunden Arbeit und fertig. :cool:

Tolles Teil diese Pylonen. Muß jetzt noch meine alten Blei Blöcke entsorgen, das wird wieder Schlepperei.
Bernhard

Normal hast du einen Stack und unterhalb des Stacks 4 Module mit den Adressen 1,2,3,4.
Der CRC wird natürlich im Modul berechnet. Weiß nicht, warum Eric das nicht sieht. Hat er aber schon mal ein paar Beiträge vorher geschrieben…

Hier mal eine Aktualisierung von 4 Modulen - Debug am Client Socket.

Grüße
Stefan

@Stefan: Ja genau so sah es bei mir aus, nur das eben bei allen Abfragen wo das 5.Byte nicht 0x32 war keine Antwort kahm.
Naja, is egal. Wie gesagt über die Konsole gefällt mir eh besser, da leichter zu verstehen.

Kann ja nochmal versuchen zu debuggen. Jetzt wo ich weiß das mein Stack richtig funktioniert muß der Fehler ja wo anders sein.-

schöne Grüße
Bernhard