NEWS
[gelöst] SMI260 via WMBus Stick steuern
-
Ich hab da so ne kleine Solaranlage mit Batteriespeicher. Die deckt mir etwas den Grundbedarf und speichert den Rest in Akkus.
Meinen Wechselrichter (SMI 260) kann man mit einem Stick und einer bescheidenen Software streuern - unter Win…
Ich will erreichen, dass das ich die Ausgabe-Leistung des WR dynamisch über Iobroker anpassen kann, leider kenn ich mich mit Kommunikationsprotokollen nicht ausreichend aus.
Ich habe gelesen, dass manche sich die gesendeten Befehle gesnifft haben und diese dann alternativ via Bash unter Linux absenden.
Gesnifft hab ich - leider hab ich jetzt nur Alt-griechisch vor mir.
Hat jemand das ganze schonmal umgesetzt oder kennt sich jemand aus mit dem Protokoll und kann mir da unter die Arme greifen?
-
Nochmal mein aktuelle Zwischenstand.
Gesniffte Kommunikation sieht so aus:
Wenn ich das ganze Analog mit pySerial abschicke, dann zeigt mein Com Monitor die ausgehende Kommnukation identisch an, leider passiert aber nichts. Wo mach ich den Fehler?
import serial s = serial.Serial( port='COM4',\ baudrate=9600,\ parity=serial.PARITY_EVEN,\ stopbits=serial.STOPBITS_ONE,\ bytesize=serial.EIGHTBITS,\ timeout=2) command=b"\xA5\x81\x0F\x00\x34\x13" s.write(command) s.read() command=b"\xA5\x82\x01\x10\x5B\xB4\xB0\x62\x98\x00\x00\x01\x02\x51\x0C\x79\x00\x00\x00\x00\x50\x1D" s.write(command) s.read() command=b"\xA5\x82\x01\x13\x5B\xB4\xB0\x62\x98\x00\x00\x01\x02\x51\x0C\x79\x00\x00\x00\x00\x00\xFF\xA7\x58\x27" s.write(command) s.read() command=b"\xA5\x82\x01\x24\x44\xB4\xB0\x62\x98\x00\x00\x01\x02\x51\x0C\x79\x00\x00\x00\x00\x12\x2B\x0B\x00\x02\x7C\x07\x69\x68\x70\x5F\x73\x6F\x63\xE8\x03\x01\xFD\x66\x01\x06\x78" s.write(command) s.read() command=b"\xA5\x82\x01\x10\x5B\xB4\xB0\x62\x98\x00\x00\x01\x02\x51\x0C\x79\x00\x00\x00\x00\x50\x1D" s.write(command) s.read() command=b"\xA5\x82\x01\x13\x5B\xB4\xB0\x62\x98\x00\x00\x01\x02\x51\x0C\x79\x00\x00\x00\x00\x00\xFF\xA7\x58\x27" s.write(command) s.read() s.close() exit()
-
habs jetzt zum laufen gebracht.
Knackpunkt war die Parity, diese hatte ich falsch gesetzt und darum kamen die Befehle nicht an.
Mein Testscript läuft jetzt so:
import serial, time, sys watt = int(sys.argv[1]) print watt s = serial.Serial('/dev/ttyUSB1', 57600, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE,1) command=b"\xA5\x81\x0F\x00\x34\x13" command1=b"\xA5\x82\x01\x24\x44\xB4\xB0\x62\x98\x00\x00\x01\x02\x51\x0C\x79\x00\x00\x00\x00\x12\x2B\x0A\x00\x02\x7C\x07\x69\x68\x70\x5F\x73\x6F\x63\xE8\x03\x01\xFD\x66\x01\xE1\x80" s.write(command) s.readline() command=b"\xA5\x82\x01\x10\x5B\xB4\xB0\x62\x98\x00\x00\x01\x02\x51\x0C\x79\x00\x00\x00\x00\x50\x1D" s.write(command) s.readline() command=b"\xA5\x82\x01\x13\x5B\xB4\xB0\x62\x98\x00\x00\x01\x02\x51\x0C\x79\x00\x00\x00\x00\x00\xFF\xA7\x58\x27" s.write(command) s.readline() ##switch off if watt == 0: print "ausschalten" command=b"\xA5\x82\x01\x24\x44\xB4\xB0\x62\x98\x00\x00\x01\x02\x51\x0C\x79\x00\x00\x00\x00\x12\x2B\x00\x00\x02\x7C\x07\x69\x68\x70\x5F\x73\x6F\x63\xE8\x03\x01\xFD\x66\x00\xF8\x97" ## 20 Watt if watt == 20: print "20 Watt" command=b"\xA5\x82\x01\x24\x44\xB4\xB0\x62\x98\x00\x00\x01\x02\x51\x0C\x79\x00\x00\x00\x00\x12\x2B\x14\x00\x02\x7C\x07\x69\x68\x70\x5F\x73\x6F\x63\xE8\x03\x01\xFD\x66\x01\x51\x8B" ## 10 Watt if watt == 10: print "10 Watt" command=b"\xA5\x82\x01\x24\x44\xB4\xB0\x62\x98\x00\x00\x01\x02\x51\x0C\x79\x00\x00\x00\x00\x12\x2B\x0A\x00\x02\x7C\x07\x69\x68\x70\x5F\x73\x6F\x63\xE8\x03\x01\xFD\x66\x01\xE1\x80" ## 50Watt if watt == 50: print "50 Watt" command=b"\xA5\x82\x01\x24\x44\xB4\xB0\x62\x98\x00\x00\x01\x02\x51\x0C\x79\x00\x00\x00\x00\x12\x2B\x32\x00\x02\x7C\x07\x69\x68\x70\x5F\x73\x6F\x63\xE8\x03\x01\xFD\x66\x01\x2E\x6C" ## 75 Watt if watt == 75: print "75 Watt" command=b"\xA5\x82\x01\x24\x44\xB4\xB0\x62\x98\x00\x00\x01\x02\x51\x0C\x79\x00\x00\x00\x00\x12\x2B\x4B\x00\x02\x7C\x07\x69\x68\x70\x5F\x73\x6F\x63\xE8\x03\x01\xFD\x66\x01\x09\xBA" s.write(command) s.readline() s.close()
die Befehle hab ich mir mit "Serial Port Monitor" für die einzelnen Leistungsstufen aufgezeichnet.
Jetzt kann ich meinen Wechselrichter endlich dem Stromverbrauch und der Sonnensituation dynamisch anpassen.
Bei Fragen, gern PN oder hier.
-
Hallo DavidFD
Danke für deine Arbeit… habe die gleichen WR (4 Stück) in Netzkopplung an 260 Watt Paneelen.
Fragen: Du beeinflusst scheinbar mit diesem Code die Leistungsabgabe der WR (DC > AC). Hast du eine Methode herausgefunden wie die produzierte Leistung im Netzbetrieb ausgelesen werden kann? Auch interessant wäre die Unterscheidung von verschiedenen WR.
Hast du dafür einen Ansatz, wäre die Lösung eines grossen Problems bei mir...
Grüsse
Maestrone
Nebenbei: Dein publizierter Code ist javascript oder? Sorry bin absoluter Beginner
-
Hallo DavidFD,
ich habe deinen Beitrag zum SMI260 gelesen.
Sieht sehr interessant aus und hat mein Interesse geweckt.
Hast du dein Script noch erweitert?
Ich möchte mir gerne 2 Stück von den Wechselrichtern holen und in meine vorhanden Hausanlage aus Batteriewechselrichter einbauen. Die Dinger sollen dann zur Nullkompensation werkeln.
In deinem Script bis du bis 70Watt Ausgangsleistung gegangen. Hast du auch die Werte für bis Max-Watt?
Der WR gibt sicherlich noch andere Statusinformationen aus, hast du darauf auch mal einen Blick geworfen?
Ich hoffe ich nerve nicht zu sehr mit meinen Fragen.
Sonnige Grüße aus NRW.
Marc -
@maestrone Der Code ist Python. Python läuft auf den Linuxkisten wunderbar und ist meist schon vorhanden.
Ein Auslesen der Leistungsabgabe habe ich gar nicht probiert. Da stecke ich nicht tief genug in der Materie.
-
@Mahe3006 Hey, habs leider erst jetzt gesehen.
Die höheren Werte müsstest du dir selbst auslesen, da immer ein Zufallsanteil der zu deinem WR passt im Paket drin sein müsste.
Das Script hab ich mir noch ein bisschen erweitert, dass es mir immer nach meinem Verbrauch das anpasst und die Akkus im idealen Status hat. Jetzt sind wir aber umgezogen und ich habe es aktuell noch gar nicht in Betrieb - kommt aber hoffentlich bald wieder
Die Statusmeldungen vom WR hab ich mir gar nicht genauer angeschaut (Kommunkationprotokolle sind für mich bömische Dörfer). Ich habe mir einen Laderegler ( https://amzn.to/2O0sKLp ) mit Schnittstelle im gut dokumentierten Modbus Protokoll gekauft und diesen dann ausgelesen.
Die Leistungswerte etc haben mit dem SMI gut hingehauen und ich konnte damit auch Ladezustand der Akkus, Eingangsleistung Solar, Ausgangsleistung an den WR messen. Dafür hab ich mir ein kleines Script gebastelt, dass mir die Daten via MQTT an Iobroker gesandt hat.
Bei Fragen, gern Fragen