Sunny Tripower 6000TL-20

Begonnen von SpenZerX, 21 Oktober 2015, 20:39:47

Vorheriges Thema - Nächstes Thema

Waldmensch

#45
ich habe die ersten Pakete mal in eine Reihe gesetzt und alles was nach SN aussieht hervorgehoben. SBF scheint eine eigene Serial zu benutzen 6112fc32. ich habe die nirgendwo eingegeben in der SBF config. Das Erste Paket scheint eine Art Rundruf zu sein, da keine Ziel SN angegeben ist. Der WR antwortet und packt hinten scheinbar eine Liste mit SN dran. Dann sendet SBF irgendwas - ein "Dankeschön"? Gleich darauf sendet SBF das Login, worauf die Antwort vom WR kommt.

SBF: 45000056a32c40004011b193c0a8b22fc0a8b256253225320042e62a534d4100000402a00000000100260010606509a0ffff ffffffff 00007d00 6112fc32 000000000000018000020000000000000000000000000000
WR : 4500007e0000000040119498c0a8b256c0a8b22f25322532006a3d5f534d4100000402a000000001004e0010606513907d00 6112fc32 00008000 59f3cc7d 00000000000001800102000000000000000000000003000000ff0000406b002001008000 59f3cc7d 00000a000c00000000000000030000000101000000000000
SBF: 45000052a32f40004011b194c0a8b22fc0a8b25625322532003ee626534d4100000402a00000000100220010606508a0ffff ffffffff 00037d00 6112fc32 00030000000002800e01fdffffffffff00000000
SBF: 4500006a534f40004011015dc0a8b22fc0a8b256253225320056e63e534d4100000402a000000001003a001060650ea0ffff ffffffff 00017d00 6112fc32 00010000000003800c04fdff0700000084030000d555115700000000b8b8b8b8888888888888888800000000
WR : 4500006a00000000401194acc0a8b256c0a8b22f2532253200563413534d4100000402a000000001003a001060650ed07d00 6112fc32 00018000 59f3cc7d 00010000000003800d04fdff0700000084030000d555115700000000b8b8b8b8888888888888888800000000


Dann habe ich mal das, was ich als Login vermute, weil es das Passwort enthält mit dem verglichen, was das Modul sendet und die SN hervorgehoben. Dabei fällt auf, das die Pakete vom Modul vorne kürzer sind. Zudem ist Source und Destination SN irgendwie vertauscht. Das Modul sendet die Destination als FFFFFFFFF und die Source als WR SN. Zurück kommt vom WR ein Paket mit Source und Destination als WR SN. Kann das so stimmen? Ich vermute mal, das dem WR die SN völlig egal ist und nur in den Antworten halt, bei mehreren WR, die Daten der passenden SN zugeordnet werden können.

Edit: vergesst das mit der Source/Dest SN - da hatte ich im Code rumgefummelt. Im Modul ist es richtig
Login?

Modul:                                                       534d4100000402a000000001003a001060650ea0ffff ffffffff 00017800 59f3cc7d 00010000000004800c04fdff07000000840300004c20cb5100000000B8B8B8B8888888888888888800000000
WR :                                                         534d4100000402a000000001003a001060650ed07800 59f3cc7d 00018000 59f3cc7d 00010000000004800d04fdff07000000840300004c20cb5100000000b8b8b8b8888888888888888800000000
SBF: 4500006a534f40004011015dc0a8b22fc0a8b256253225320056e63e534d4100000402a000000001003a001060650ea0ffff ffffffff 00017d00 6112fc32 00010000000003800c04fdff0700000084030000d555115700000000b8b8b8b8888888888888888800000000
WR : 4500006a00000000401194acc0a8b256c0a8b22f2532253200563413534d4100000402a000000001003a001060650ed07d00 6112fc32 00018000 59f3cc7d 00010000000003800d04fdff0700000084030000d555115700000000b8b8b8b8888888888888888800000000


Vielleicht hilft das irgendwie?

Waldmensch

#46
Halleluja!!!!! Es läuft!!!

wenn man die dest_Serial immer auf FFFFFFFFFF setzt rennt es. Man braucht also die WR Serial überhaupt nicht für die Abfragen. Vermutlich nimmt man sie nur, um bei mehreren Wechselrichtern die Daten zuzuordnen. Wenn es bei bei anderen im Moment funktioniert, mit der dest_Serial, dann wohl eher zufällig.

Da die src_Serial ja auch hardcoded ist, kann man sich das Einfügen in das Kommando eigentlich auch schenken. Bleibt als einzige einzufügende Variable das Passwort. Ich denke mal, mit dieser Erkenntnis kann das Modul sogar noch wesentlich verschlankt werden  :D

Der Fehler besteht auch schon in dem Python script, was diesem Modul zugrunde liegt https://gist.github.com/hdo/6027504 Ich habe meine Erkenntnisse dort auch in den Kommentaren gepostet. Weil mir das testen mit dem Modul zu mühsam war, habe ich nämlich mit dem Python script auf dem Raspberry getestet.

  $hash->{cmd_login}     = "534d4100000402a000000001003a001060650ea0ffffffffffff00017800".(unpack("H8",(pack("V",$src_serial))))."00010000000004800c04fdff07000000840300004c20cb5100000000".($encpw)."00000000";
  $hash->{cmd_logout}     = "534d4100000402a00000000100220010606508a0ffffffffffff00037800".(unpack("H8",(pack("V",$src_serial))))."000300000000d7840e01fdffffffffff00000000";
  $hash->{cmd_query_total_today} = "534d4100000402a00000000100260010606509e0ffffffffffff00007800".(unpack("H8",(pack("V",$src_serial))))."000000000000f1b10002005400002600ffff260000000000";
  $hash->{cmd_query_spot_ac_power} = "534d4100000402a00000000100260010606509e0ffffffffffff00007800".(unpack("H8",(pack("V",$src_serial))))."00000000000081f00002005100002600ffff260000000000";


Sieht dann im Log auch gleich viel schicker aus
2016.04.16 13:42:28 5 : InVERTER_CoNNECT_SW: Recived: (534d4100000402a000000001003a001060650ed07800c8e803380001800059f3cc7d00010000000004800d04fdff07000000840300004c20cb5100000000b8b8b8b8888888888888888800000000)!
2016.04.16 13:42:28 5 : InVERTER_CoNNECT_SW: Recived: (534d4100000402a00000000100460010606511d07800c8e8033800a0800059f3cc7d000000000000f1b101020054000000000100000001012600232512575ce20b01000000000122260021251257de1a00000000000000000000)!
2016.04.16 13:42:28 5 : InVERTER_CoNNECT_SW: Recived: (534d4100000402a00000000100420010606510d07800c8e8033800a0800059f3cc7d00000000000081f0010200510000000000000000013f264022251257750600007506000075060000750600000100000000000000)!
2016.04.16 13:42:28 4 : InVERTER_CoNNECT_SW_GetStatus (Wechselrichter) from (192.168.178.86): (SP:1653 W AvP1:1620 W TTP:6878 Wh ATP:17556060 Wh)

Waldmensch

#47
Ich habe rausgefunden, wie man die DC Power der beiden Strings ausliest. Wäre net, wenn Du das mit in das Modul einbauen könntest, da das interessante Anlagenwerte sind, die man in einem Chart darstellen kann. Folgendes brauchst Du (ich habs mit dem Python script getestet)

Python Codeteile :

code_spot_dc_power = 0x53800201

cmd_query_spot_dc_power = '534d4100000402a00000000100260010606509e0FFFFFFFFFFFF00007800375fd73a00000000000081f00002805300002500ffff260000000000'

      if code == code_spot_dc_power:
         print "received package code: spot dc power"
         string1 = get_long_value_at(datagram, 62)
         string2 = get_long_value_at(datagram, 90)
         print "string1: %d" % string1
         print "string2: %d" % string2
         sma_data['string1'] = string1
         sma_data['string2'] = string2
         output_data = json.dumps(sma_data)
         print output_data
         out = open('sma_data.json','w')
         out.write(output_data)
         out.close()
         reactor.stop()



Output des Python Script:
sending command: 534d4100000402a00000000100260010606509e0FFFFFFFFFFFF00007800375fd73a00000000000081f00002805300002500ffff260000000000
received 114 bytes
data: 534d4100000402a000000001005e0010606517d07800375fd73a00a0800059f3cc7d00000000000081f0010280530000000001000000011e2540d05a1357ae090000ae090000ae090000ae09000001000000021e2540d05a13570e0300000e0300000e0300000e0300000100000000000000
01028053
code: 1400898049
received package code: spot dc power
string1: 2478
string2: 782
{"spotacpower": 3131, "total": 17575451, "string2": 782, "today": 7190, "string1": 2478}


Die Werte sind mit SBFspot gegegengeprüft und plausibel



Herangehensweise, vielleicht noch für andere Kommandos, ich gebe zu: sehr abenteuerlich ;)

SBFspot:
    case SpotDCPower:
        // SPOT_PDC1, SPOT_PDC2
        command = 0x53800200;
        first = 0x00251E00;
        last = 0x00251EFF;
        break;


Das command genommen und warum auch immer hinten eine 1 statt der 0 geschrieben, wie bei den anderen Commands. Vermutlich ist 0 der Befehl und 1 die Antwort
code_spot_dc_power = 0x53800201

In den Abfragebefehl das Command eingetragen und dahinter "try & error" 2500 (die anderen commands haben dort 2600 und first/last enthält bei denen in SBFspot auch 26)
cmd_query_spot_dc_power = '534d4100000402a00000000100260010606509e0FFFFFFFFFFFF00007800375fd73a00000000000081f0 00028053 0000 2500 ffff260000000000'

Die Antwort enthält 2 Datenpakete ab Byte 52 von je 28 Byte Länge (siehe SBFspot.cpp Zeile 2809 ff). Nach einem Header von 8 Byte kommen dann die Daten in mehrfacher Wiederholung
534d4100000402a000000001005e0010606517d07800375fd73a00a0800059f3cc7d00000000000081f0010280530000000001000000
011e2540d05a1357 ae090000ae090000ae090000ae09000001000000
021e2540d05a1357 0e0300000e0300000e0300000e03000001000000
00000000


SpenZerX

Hi,

ja generell müsste überlegt werden welche Werte Sinn machen.

Dazu müsste analysiert werden mit welchen Kommandos diese abgerufen werden können.

Wichtig wäre es mir das der Nutzer entscheidet welche Werte er bekommt. -> Mehr Werte, mehr Kommandos, mehr Traffic, mehr Systemlast und auch Blockierung!(denke ich)

Ich werde das in der nächsten Woche ein bischen umbauen. Modular und erweiterbar - also zwischen Login und Logoff abrufen der Kommandos die der Nutzer konfiguriert.

Abfrage Intervall möchte ich nicht ändern (1 Min). Also für alle Werte die der Nutzer wählt!


Generell würde ich in das Thema auch nicht zu viel Zeit investieren wenn das wichtigste Reading vorhanden ist ,
dann schon lieber überlegen wie FHEM hinsichtlich Energie Management erweitert werden kann. Wie Verbrauchern z.B. eine Leistung zugewiesen werden kann.
Oder ein Tool das Einschaltzeiten plant und Ertragsprognosen für die kommenden Stunden kennt.






Waldmensch

Ich habe meinen Beitrag oben nochmal editiert, mit meiner Herangehensweise bzw wie ich drauf gekommen bin. Das geht bei anderen Kommandos sicher ähnlich einfach.

User-konfigurierbar wäre ideal! Ein Array was der User kommasepariert übergibt. Default wird nur die Aktuelle WR Leistung ausgegeben und der User kann verschiedene Readings "dazubuchen"

Ich werd aus dem Modulcode irgendwie nicht schlau, warum Du da nicht einfach so eine straight "IF Kombination" machst, wie im Python script. Die Paketlänge brauchst Du glaube ich auch nicht unbedingt im IF auswerten. Lieber einmal ganz oben, ob eine Mindestlänge vorliegt. Ich komm mit der Perl Syntax aber nicht so gut klar und will Dir da auch nicht reinpfuschen

Waldmensch

Ich habe mal versucht das Modul umzubauen (Anhang). Leider kriege ich einen Syntax Error, den ich absolut nicht sehe. Wenn Du ihn findest ist es gemachte Arbeit. Die PDC1 und PDC2 sind schon mit drin. Bevor ich das eingebaut habe, hat es mit der IF Konstruktion so in der Art funktioniert.


Waldmensch

#51
Hab den Fehler gefunden, Kopf->Tisch

Anhang ist ungetestet, sollte aber funktionieren funzt, und PDC ist mit drin  ;)

Waldmensch

#52
Auch die PDC liefern nachts den Wert 0x80000000 - gefixt
Wenn eine zu kurze Antwort kommt hat sich das Modul aufgehängt - gefixt: Ausstieg aus dem loop mit "Message to short"
Die Abfragen haben sich irgendwann verdoppelt und verdreifacht - ich vermute, durch das setzen des neuen Timers _bevor_ die WR Abfrage stattfindet. Timer wird jetzt erst Nach der WR Abfrage neu gesetzt.

Edit: Anhang noch mal neu hochgeladen. Wenn die WR Abfrage schiefgegangen ist, werden auch die Readings nicht gesetzt. Da würde eh nur Mist drinstehen.

Kann sein, das diese Maßnahmen gegen Korrupte Pakete oder Timeouts bei den meisten nicht nötig sind. Ich habe allerdings eine ab und zu wackelige Powerlan Verbindung auf dem Weg zum Wechselrichter. Damit renne ich ab und zu in Timeouts oder fehlerhafte Pakete. M.E. ist es sinnvoller, die Abfrage dann zu verwerfen als invalide Werte in den Readings zu haben.

Edit: Seltsam, wenn ich das Update der Readings im Fehlerfall übergehe, bleibt das Script stehen, der Timer scheint in dem Fall nicht neu gesetzt zu werden  >:(

Michael

Moin Waldmensch

Vielen Dank.
Jetzt läuft das Modul auch bei mir. (sh. Anhang)

Zitat... wackelige Powerlan Verbindung auf dem Weg zum Wechselrichter.
Da hat mein Installateur mir von abgeraten, es schient das er Recht hat.
Habe alles über Lan verbunden.

Ich frage mich allerdings was die Readings aussagen.
Kannst du mich aufschlauen.  :-[
Gruß, Michael

FHEM 6.0 auf RPi 3
CUL V3 868 Mhz | JeeLink LaCrosse & PCA301 | CCU3
BMP085(180) | 14x TX29DTH-IT | 5x PCA 301 | SMA Peripheries | MobileAlerts MA-10(100,120PRO,200,251,410,650,660,800) | HM IP

Waldmensch

- Alltime Total ist das was der WR in seinem Leben generiert hat
- AvPxx sind  Durchschnitswerte die im Modul berechnet werden, da muss SpenZerX was zu sagen, da steig ich nicht durch
- SpotP ist der wichtigste Wert, was der Wechselrichter gerade an Leistung produziert
- SpotPDC1 + 2 ist das was Deine Strings grad an Gleichstrom vom Dach liefern. Du hast nur einen String wie man sieht. Differenz zu SpotP ist übrigens der Verlust des WR
- TotalTodayP ist die Tagesleistung des WR bis zu dem Moment

SpenZerX

Hi,

AvP01,AvP05,AvP15 sind die Durchschnittsleistung der letzten 1,5,15 Minuten.

Also eigentlich eine Glättung.

Damit lassen sich die Schaltfrequenzen reduzieren, wenn du Verbraucher schalten willst.
Kühlschränke(für Getränke im Sommer), Kühltruhen (Speicherung von Kälte für die Nacht) mögen es nicht wenn sie oft geschaltet werden.

Waldmensch

#56
Habe den Fehler gefunden, warum es sich bei mir weghängt, wenn das Script keine Netzwerkantwort bekommt. Jetzt sollte es recht robust sein. Bei UDP weiß man ja nie, ob was verloren geht. Die commands habe ich aus dem hash rausgenommen, die interessieren den Endnutzer eh nicht und verstören eher. Die src_serial habe ich fest verdrahtet, die ist eh immer gleich.

Den averagebuffer habe ich auch aus dem hash rausgenommen. Nachteil ist, das der Puffer nach fhem Neustart wieder leer ist. Keine Ahnung wie die Berechnung der Avg Werte funktioniert und wie sich viele Nullwerte auf den Durchschnitt auswirken. Ich habe es nicht hinbekommen den buffer im Hash zu verstecken. Sollte eigentlich laut http://www.fhemwiki.de/wiki/DevelopmentModuleIntro#Readings mit einem Punkt davor gehen. Ich kriege da aber einen Syntax Error. Ich habe die Stellen mit dem buffer nur auskommentiert. Das lässt sich leicht rückgängig machen.

Überlegenswert wäre noch, auf die Serial des Wechselrichters im DEF zu verzichten. Da kann man jetzt schon eine Phantasiezahl eintragen, weil sie intern gar nicht mehr benutzt wird. Ich wollte nur das DEF nicht verändern, damit es bei den Nutzern keine Fehler gibt.

im Anhang die gefixte Version

Edit: heute Nacht hat es sich wieder weggehangen, nach der 2. aufeinanderfolgenden fehlerhaften Antwort. Scheinbar kann man "last" nur 2 mal anwenden  >:( Habe noch was anderes versucht und nochmal das Script im Anhang geändert.

Waldmensch

#57
Also das letzte Script lief heute den ganzen Tag durch ab ca 8:00 morgens. Einmal hatte ich Nullwerte, wie man am Chart sieht. Ansonsten würde ich sagen Daumen hoch.

Was man vielleicht noch einbauen könnte, wäre ein Nachtmodus, ein Zeitfenster, bei dem das script zwar weiterläuft, aber den WR einfach nicht befragt.


Waldmensch

Ich habe mal eine hartverdrahtete Schlafphase von 22-5 Uhr eingebaut. Das Script wird weiter jede Minute ausgeführt, fragt aber den Wechselrichter nicht mehr ab. Überlegenswert wäre, das Ganze über Attribute nach außen einstellbar zu machen oder intern mit sunrise/sunset zu arbeiten + Korrekturwert als Attribut (so wie es SFBspot macht). Ein drittes Attribut "force" sollte aber dann auch mit rein, um auf Userverlangen die Schlafphase auszuhebeln.

mit verbose 5 kommen dann nur diese Meldungen im Log wobei 3 die aktuelle Stunde ist. Im Chart sieht man, das ab 5 Uhr wieder Werte abgefragt werden

2016.04.21 03:00:58 5 : Wechselrichter: 3 is out of working hours 5 - 22


Im angefügten Script kann man erstmal das Zeitfenster nur im Code ändern
my $starthour = 5;
my $endhour = 22;



Michael

Moin Waldmensch

ZitatWas man vielleicht noch einbauen könnte, wäre ein Nachtmodus, ein Zeitfenster, bei dem das script zwar weiterläuft, aber den WR einfach nicht befragt.
Die Idee ist super.

Aber wäre es nicht besser den Nachtmodus am Ertrag zu koppeln (kleine Abfrage =0 > 0) ?  :-\
Gruß, Michael

FHEM 6.0 auf RPi 3
CUL V3 868 Mhz | JeeLink LaCrosse & PCA301 | CCU3
BMP085(180) | 14x TX29DTH-IT | 5x PCA 301 | SMA Peripheries | MobileAlerts MA-10(100,120PRO,200,251,410,650,660,800) | HM IP