76_SMAInverter.pm - Abfrage von SMA Wechselrichter

Begonnen von sct14675, 28 Juli 2016, 11:01:16

Vorheriges Thema - Nächstes Thema

buschmann88

#60
Hallo

Erst mal super Arbeit was ihr hier macht aber ich habe ein Problem meinen Sunny boy 2.5 mit dem Modul zum laufen zu bekommen!

Ich bekomme immer die Meldung "state timeout" woran könnte das liegen und wo müsste ich anfangen zu suchen!

im Log sind nur diese einträge

2016.11.26 15:25:02 1: Timeout for getstatus_DoParse reached, terminated process 4275
2016.11.26 15:25:02 1: SMAInverter SMA_Sunny_Boy_2.5 -> BlockingCall getstatus_DoParse timed out
2016.11.26 15:25:02 5: Triggering SMA_Sunny_Boy_2.5 (1 changes)
2016.11.26 15:25:02 5: Starting notify loop for SMA_Sunny_Boy_2.5, first event timeout
2016.11.26 15:25:22 4: ebus1 GetUpdates2 is disabled
2016.11.26 15:25:52 4: BlockingCall (getstatus_DoParse): created child (4277), uses telnetPort to connect back
2016.11.26 15:25:52 4: SMAInverter SMA_Sunny_Boy_2.5 -> Start BlockingCall getstatus_DoParse
2016.11.26 15:25:52 5: Compute sunrise/sunset for latitude 50.112 , longitude 8.686
2016.11.26 15:25:52 5: Compute sunrise/sunset for latitude 50.112 , longitude 8.686
2016.11.26 15:25:52 4: SMA_Sunny_Boy_2.5 - current time: 26.11.2016 15:25:52
2016.11.26 15:25:52 4: SMA_Sunny_Boy_2.5 - operation time begin: 26.11.2016 07:19:41
2016.11.26 15:25:52 4: SMA_Sunny_Boy_2.5 - operation time end: 26.11.2016 17:05:50
2016.11.26 15:25:52 4: SMA_Sunny_Boy_2.5: Send login to 192.168.178.xx on Port 9522 with password xxxx
2016.11.26 15:25:52 5: SMA_Sunny_Boy_2.5: Send: 534D4100000402A000000001003A001060650EA0FFFFFFFFFFFF0001E90023BB590700010000000001800C04FDFF0700000084030000709B395800000000B9C0B8BBB9C1C0C08888888800000000
2016.11.26 15:25:52 5: SMA_Sunny_Boy_2.5: Received: 534d4100000402a000000001002e001060650be0e90023bb590700012f018ad1097300010000000001800d04fdff0700000084030000709b39580000000000000000
2016.11.26 15:25:52 5: SMA_Sunny_Boy_2.5: Logged in now
2016.11.26 15:25:52 3: SMA_Sunny_Boy_2.5: Send request 00020058001E8200FF208200 to 192.168.178.xx on port 9522
2016.11.26 15:25:52 5: SMA_Sunny_Boy_2.5: send: 534D4100000402A00000000100260010606509A0FFFFFFFFFFFF0000E90023BB5907000000000000028000020058001E8200FF20820000000000

über Hilfe würde ich mich freuen

Gruß Christian

Waldmensch

Nö, die Arrays spuckst du auf verbose5 nicht aus, da hätte ich dann schon mal geguckt. Bisschen Saft kommt ja bei mir noch vom Dach. Die averages bleiben aber hartnäckig unter 10, ändern sich aber. mal 7, 8 oder 9

2016.11.26 14:55:36 4 : SMAInverter Wechselrichter1 -> Start BlockingCall getstatus_ParseDone
2016.11.26 14:55:36 5 : Wechselrichter1 -> row_array after decoding:
2016.11.26 14:55:36 5 : Wechselrichter1 -> modulstate normal
2016.11.26 14:55:36 5 : Wechselrichter1 -> opertime_start 26.11.2016 07:10:42
2016.11.26 14:55:36 5 : Wechselrichter1 -> opertime_stop 26.11.2016 16:46:15
2016.11.26 14:55:36 5 : Wechselrichter1 -> avg_energy_lastcycles_05 7
2016.11.26 14:55:36 5 : Wechselrichter1 -> avg_energy_lastcycles_10 6
2016.11.26 14:55:36 5 : Wechselrichter1 -> avg_energy_lastcycles_15 6
2016.11.26 14:55:36 5 : Wechselrichter1 -> SPOT_ETOTAL 25061195
2016.11.26 14:55:36 5 : Wechselrichter1 -> SPOT_ETODAY 3625
2016.11.26 14:55:36 5 : Wechselrichter1 -> SPOT_PDC1 303
2016.11.26 14:55:36 5 : Wechselrichter1 -> SPOT_PDC2 95
2016.11.26 14:55:36 5 : Wechselrichter1 -> SPOT_PAC1 125
2016.11.26 14:55:36 5 : Wechselrichter1 -> SPOT_PAC2 129
2016.11.26 14:55:36 5 : Wechselrichter1 -> SPOT_PAC3 120
log'>2016.11.26 14:55:36 5 : Wechselrichter1 -> SPOT_PACTOT 3752016.11.26 14:55:36 5 : Wechselrichter1 -> state 3752016-11-26 14:55:36 SMAInverter Wechselrichter1 modulstate: normal
2016-11-26 14:55:36 SMAInverter Wechselrichter1 opertime_start: 26.11.2016 07:10:42
2016-11-26 14:55:36 SMAInverter Wechselrichter1 opertime_stop: 26.11.2016 16:46:15
2016-11-26 14:55:36 SMAInverter Wechselrichter1 avg_energy_lastcycles_05: 7
2016-11-26 14:55:36 SMAInverter Wechselrichter1 avg_energy_lastcycles_10: 6
2016-11-26 14:55:36 SMAInverter Wechselrichter1 avg_energy_lastcycles_15: 6
2016-11-26 14:55:36 SMAInverter Wechselrichter1 SPOT_ETOTAL: 25061195
2016-11-26 14:55:36 SMAInverter Wechselrichter1 SPOT_ETODAY: 3625
2016-11-26 14:55:36 SMAInverter Wechselrichter1 SPOT_PDC1: 303
2016-11-26 14:55:36 SMAInverter Wechselrichter1 SPOT_PDC2: 95
2016-11-26 14:55:36 SMAInverter Wechselrichter1 SPOT_PAC1: 125
2016-11-26 14:55:36 SMAInverter Wechselrichter1 SPOT_PAC2: 129
2016-11-26 14:55:36 SMAInverter Wechselrichter1 SPOT_PAC3: 120
2016-11-26 14:55:36 SMAInverter Wechselrichter1 SPOT_PACTOT: 375
2016-11-26 14:55:36 SMAInverter Wechselrichter1 375
2016-11-26 14:55:36 SMAInverter Wechselrichter1 EV: 2805
2016-11-26 14:55:36 SMAInverter Wechselrichter1 FeedIN: 0
2016.11.26 14:55:36 4 : SMAInverter Wechselrichter1 -> BlockingCall getstatus_ParseDone finished2016-11-26 14:55:43 ESPEasy ESPEasy_Temperature1_Temp1 Temperature: 36.56
2016-11-26 14:55:43 ESPEasy ESPEasy_Temperature1_Temp1 Tem: 36.56
2016-11

DS_Starter

ZitatNö, die Arrays spuckst du auf verbose5 nicht aus, da hätte ich dann schon mal geguckt.

Doch, schau mal so ist das Log bei mir:

Zitat2016.11.26 15:08:35.909 3: MySTP_5000: Logged out now.
2016.11.26 15:08:35.909 5: MySTP_5000: Content of Averagebuffer:
2016.11.26 15:08:35.909 5: MySTP_5000: 12406685,12406685,12406685,12406684,12406683,12406683,12406682,12406681,12406680,12406680,12406679,12406678,12406677,12406676,12406675,12406673
2016.11.26 15:08:35.909 5: MySTP_5000: avg_energy_lastcycles_05 = 0, avg_energy_lastcycles_10 = 0, avg_energy_lastcycles_15 = 0
2016.11.26 15:08:35.910 5: MySTP_5000 -> row_array before encoding:
2016.11.26 15:08:35.910 5: MySTP_5000 -> modulstate normal
2016.11.26 15:08:35.910 5: MySTP_5000 -> opertime_start 26.11.2016 07:09:50
2016.11.26 15:08:35.910 5: MySTP_5000 -> opertime_stop 26.11.2016 16:48:41
2016.11.26 15:08:35.910 5: MySTP_5000 -> avg_energy_lastcycles_05 0
2016.11.26 15:08:35.910 5: MySTP_5000 -> avg_energy_lastcycles_10 0
2016.11.26 15:08:35.910 5: MySTP_5000 -> avg_energy_lastcycles_15 0

Du siehst auch das Array ... komisch. Den Arraywert kann ich noch anheben. Mache noch eine Version und stelle hier zur Verfügung.
Werde auch den Timeoutwert hochziehen. Vielleicht hilft das dem Buschmann.

Bisschen Geduld ...

Gruß Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Waldmensch

Ich glaube, du hast da einen Denkfehler
# calculate average energy and write to array for generate readings
     my $AvP05 = int(($averagebuf[0] - $averagebuf[5]) / 5  );
     my $AvP10 = int(($averagebuf[0] - $averagebuf[10]) / 10 );
     my $AvP15 = int(($averagebuf[0] - $averagebuf[15]) / 15 );


Du subtrahierst den 5. Wert vom Ersten und teilst dann durch 5
eigentlich müsste es doch so sein (natürlich in einer Schleife):
int(($averagebuf[0] + $averagebuf[1] + $averagebuf[2] + $averagebuf[3] + $averagebuf[4]) / 5  );

DS_Starter

Also die Werte im Array verschieben sich links beginnend bei jeder Abfrage eins nach rechts. D.h. was bei der ersten Abfrage $averagebuf[0] war ist nach fünf weiteren Abfragen auf $averagebuf[5]. Die Stellen laufen also bei jeder Abfage von links beginndend nach rechts durch. Sollte also schon so stimmen wie ich es gemacht habe.
Komisch dass bei dir log5 nicht geht. Mal restartet. ??
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Waldmensch

mit "list" kriege ich mehr angezeigt, aber was sind das für riesige Werte im Buffer? ich hätte da was erwartet wie 251,249,230,....

Internals:
   CFGFN
   DEF        0000 192.168.178.86
   Host       192.168.178.86
   INTERVAL   60
   LASTUPDATE 26.11.2016 / 15:20:37
   NAME       Wechselrichter1
   NR         348
   Pass       0000
   STATE      151
   TYPE       SMAInverter
   Helper:
     AVERAGEBUF 25061282,25061280,25061277,25061275,25061272,25061269,25061266,25061263,25061260,25061257,25061254,25061251,25061248,25061246,25061243,25061239
     DEFAULT_TARGET_SERIAL 4294967295
     DEFAULT_TARGET_SUSYID 65535
     INTERVAL   60
     MAXBYTES   300
     MYSERIALNUMBER 123321123
     MYSUSYID   233
     PKT_ID     32769
     TARGET_SERIAL 4294967295
     TARGET_SUSYID 65535
   Helper:
     Dblog:
       Ev:
         Logdb:
           TIME       1480170037.09852
           VALUE      797
       Feedin:
         Logdb:
           TIME       1480170037.09852
           VALUE      0
       Spot_etoday:
         Logdb:
           TIME       1480170037.09852
           VALUE      3713
       Spot_etotal:
         Logdb:
           TIME       1480170037.09852
           VALUE      25061282
       Spot_pac1:
         Logdb:
           TIME       1480170037.09852
           VALUE      51
       Spot_pac2:
         Logdb:
           TIME       1480170037.09852
           VALUE      51
       Spot_pac3:
         Logdb:
           TIME       1480170037.09852
           VALUE      49
       Spot_pactot:
         Logdb:
           TIME       1480170037.09852
           VALUE      151
       Spot_pdc1:
         Logdb:
           TIME       1480170037.09852
           VALUE      143
       Spot_pdc2:
         Logdb:
           TIME       1480170037.09852
           VALUE      50
       Avg_energy_lastcycles_05:
         Logdb:
           TIME       1480170037.09852
           VALUE      2
       Avg_energy_lastcycles_10:
         Logdb:
           TIME       1480170037.09852
           VALUE      2
       Avg_energy_lastcycles_15:
         Logdb:
           TIME       1480170037.09852
           VALUE      2
       Modulstate:
         Logdb:
           TIME       1480170037.09852
           VALUE      normal
       Opertime_start:
         Logdb:
           TIME       1480170037.09852
           VALUE      26.11.2016 07:10:42
       Opertime_stop:
         Logdb:
           TIME       1480170037.09852
           VALUE      26.11.2016 16:46:15
       State:
         Logdb:
           TIME       1480170037.09852
           VALUE      151
   Readings:
     2016-11-26 15:20:37   EV              797
     2016-11-26 15:20:37   FeedIN          0
     2016-11-26 15:20:37   SPOT_ETODAY     3713
     2016-11-26 15:20:37   SPOT_ETOTAL     25061282
     2016-11-26 15:20:37   SPOT_PAC1       51
     2016-11-26 15:20:37   SPOT_PAC2       51
     2016-11-26 15:20:37   SPOT_PAC3       49
     2016-11-26 15:20:37   SPOT_PACTOT     151
     2016-11-26 15:20:37   SPOT_PDC1       143
     2016-11-26 15:20:37   SPOT_PDC2       50
     2016-11-26 15:20:37   avg_energy_lastcycles_05 2
     2016-11-26 15:20:37   avg_energy_lastcycles_10 2
     2016-11-26 15:20:37   avg_energy_lastcycles_15 2
     2016-11-26 15:20:37   modulstate      normal
     2016-11-26 15:20:37   opertime_start  26.11.2016 07:10:42
     2016-11-26 15:20:37   opertime_stop   26.11.2016 16:46:15
     2016-11-26 15:20:37   state           151
Attributes:
   room       SHM
   userReadings EV { ReadingsVal("FS20_EVU_Leistung","raw",0);; }, FeedIN { ((ReadingsVal("Wechselrichter1","SPOT_PACTOT",0) == 0) || (ReadingsVal("Wechselrichter1","SPOT_PACTOT",0) - ReadingsVal("FS20_EVU_Leistung","raw",0) < 0 ) ) ? 0 : ReadingsVal("Wechselrichter1","SPOT_PACTOT",0) - ReadingsVal("FS20_EVU_Leistung","raw",0);; }
   verbose    5

Waldmensch

#66
Das sich die Werte verschieben ist klar, aber trotzdem musst Du doch 5 werte addieren und durch 5 teilen um den Durchschnitt zu kriegen.

Habe das mit den großen Werten jetzt geschnallt, du hast da noch eine ID davor: 25061-282 , die fließt dann aber in die Berechnung ein?!  :o

DS_Starter

#67
Ähhm ... du hast natürlich recht. Ich berechne nach meiner Variante ja nur die Differenz (/5 usw.).

Die ID kapier ich nicht. Es ist das was als $inv_SPOT_ETOTAL geliefert wird, d.h. es müßte dein Total im WR in Wh sein.  Ich gehe da nochmal tiefer...

Hier mal der komplette Code des Buffers. zur Anschauung:

     # Durchschnittswerteberechnung Energieerzeugung der letzten 5, 10, 15 Messungen
my @averagebuf = split(/,/, $hash->{HELPER}{AVERAGEBUF});
     if ($sup_TypeLabel && $sup_EnergyProduction && $inv_CLASS eq 8001) {
         if ($averagebuf[0] == 0) {
     shift(@averagebuf);
         for my $count (0..15) {
         # fill with new values
     push(@averagebuf, $inv_SPOT_ETOTAL);
     }
     }

     # rechtes Element aus average buffer löschen
     pop(@averagebuf);
     # und links mit neuem Wert füllen
     unshift(@averagebuf, $inv_SPOT_ETOTAL);
     $avg = join(',', @averagebuf);

             # calculate average energy and write to array for generate readings
     my $AvP05 = int(($averagebuf[0] - $averagebuf[5]) / 5  );
     my $AvP10 = int(($averagebuf[0] - $averagebuf[10]) / 10 );
     my $AvP15 = int(($averagebuf[0] - $averagebuf[15]) / 15 );
         Log3 $name, 5, "$name: Content of Averagebuffer:";
     Log3 $name, 5, "$name: $avg";
     Log3 $name, 5, "$name: avg_energy_lastcycles_05 = $AvP05, avg_energy_lastcycles_10 = $AvP10, avg_energy_lastcycles_15 = $AvP15";

     push(@row_array, "avg_energy_lastcycles_05 ".$AvP05."\n");   # Average Energy (last) 5 measures
         push(@row_array, "avg_energy_lastcycles_10 ".$AvP10."\n");   # Average Energy (last) 10 measures
         push(@row_array, "avg_energy_lastcycles_15 ".$AvP15."\n");   # Average Energy (last) 15 measures

     }
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Waldmensch

Ne ist doch keine ID, aber du nimmst SPOT_ETOTAL was der kumulierende Wert ist. Sollte man nicht SPOT_PACTOT nehmen, und aus Diesen den Durchschnitt bilden?

DS_Starter

Ich hatte mich erstmal an Volkers SMASTP angelehnt. Er hatte AlltimeTotal verwendet was dem ETOTAL entspricht.
Aber wenn ich es mir recht überlege wäre es tatsächlich besser die gegenwärtige Energieerzeugung heranzuziehen.
Ich mache uns heute noch eine Version 2.5 in die ich unsere Überlegungen einfließen lasse. Dann können wir morgen wieder schauen ob es dann passt (wenn die Sonne scheint).

ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Waldmensch

Eventuell auch berücksichtigen, das ein Intervall != 60 eingestellt ist. Also erstmal eine integer Division 300\intervall um auf die Anzahl Messwerte innerhalb 5 Minuten zu kommen. Diese dann per Schleife addieren und durch die Anzahl teilen. Das wäre zumindest mein Ansatz.


Gesendet von iPhone mit Tapatalk

Waldmensch

#71
Guck mal ob es in etwa so geht Buffer mit SPOT_PACTOT füllen und shiften wie gehabt):

# calculate average energy and write to array for generate readings
my $divider05 = 300\$interval; # Messungen per 5 Minuten integer Division
my $divider10 = 600\$interval; # Messungen per 10 Minuten
my $divider15 = 900\$interval; # Messungen per 15 Minuten
my $divident = 0; # kumulierender Wert
my $idx = 0; # Laufvariable

foreach my $val (@averagebuf}{ # Buffer durchlaufen
$idx = $idx + 1; # Laufwariable setzen 1-basiert
$divident = $divident + $val; # kumulieren
if ($divider05 == $idx) { my $AvP05 = $divident / $divider05; } # Werte ausschleusen
if ($divider10 == $idx) { my $AvP10 = $divident / $divider10; } # ...
if ($divider15 == $idx) { my $AvP15 = $divident / $divider15; } # ...
}

DS_Starter

Hallo zusammen,

die Version 2.5 ist anbei.
Umgesetzt ist:

* timeout für blocking-Call auf default 60s gesetzt. Über ein Attribut "timeout" kann man diesen default auf seinen Bedürfnisse anpassen.
* die Average Berechnung umgestellt auf $inv_SPOT_PACTOT.

Dabei habe ich auch den Vorschlag von Waldmensch mit umgesetzt zunächst aus dem gesetzten Interval (default 60s) die Anzahl der Zyklen für 5, 10 bzw. 15 Minuten zu berechnen. Über die Anzahl der Zyklen wird dann der Durchschnitt für 5,10,15 Minuten gebildet.

Wenn ihr das Modul im den manuellen Modus betreibt müßt ihr darauf achten dass das Attr Interval dann näherungsweise auf das tatsächliche Abfrageinterval gesetzt wird damit die Average-Readings auch in diesem Fall aussagekräftig sind (intervall wird auch im manuellen Mode dazu ausgewertet).

Morgen sehen wir weiter ...

@Christian, schau mal ob dein Timeout Geschichte ist.

@ Waldmensch, ja so ähnlich habe ich es auch gemacht ...

Bis dann
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Waldmensch

Ich spiele es noch ein, aber berichten kann ich erst morgen, aus Gründen ;)


Gesendet von iPhone mit Tapatalk

Waldmensch

Habs grad eingespielt, stürzt nicht ab  ;)

allerdings solltest Du die festen Divisoren noch durch $cnt05-15 ersetzen. Ansonsten wird es ungenau

my $AvP05 = int( $sum05 / 5  ); #hier /$cnt05 rechnen
     my $AvP10 = int( $sum10 / 10 );
     my $AvP15 = int( $sum15 / 15 );