Anfänger bittet um Perl Hilfe

Begonnen von Zenz, 19 Juni 2015, 20:33:33

Vorheriges Thema - Nächstes Thema

Zenz

Liebe Gemeinde!

Da ich leider keine Ahnung von Perl habe und eigentlich nur div. Code-Schnipsel für mich zusammen suche,
bin ich nun leider an einem Punkt, wo ich nicht weiter komme.

Ich habe eine Variable (day_energy) die mir die Tagesleistung meiner Photovoltaik darstellt.
Nun möchte ich gerne diese "Tageswerte" innerhalb eines Monats zusammen addieren und am letzten
des Monats in eine Variable speichern (month_energy).

sub
sungrow_statistik()
{
  my $day_energy=ReadingsVal("Sungrow","Daily_energy","42");
  fhem ("set Sungrow_day $day_energy" ); 

  my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
  my ($sec2,$min2,$hour2,$mday2,$month2,$year2,$wday2,$yday2,$isdst2) = localtime(time - (60*60*24) );
 
  my $month_energy = $month_energy + $day_energy;
  if ( $month2 > $month ){
      fhem ("set Sungrow_month $month_energy" );
      my $month_energy = 0;
      }
}



Leider erhalte ich beim Abspeichern der 99_myUtils.pm  folgende Fehlermeldung:

Global symbol "$month_energy" requires explicit package name at ./FHEM/99_myUtils.pm line 62.


Alles was ich gefunden habe, habe ich probiert, leider ohne Erfolg :-\


Lg
Zenz

justme1968

statt  my $month_energy = $month_energy + $day_energy;brauchst du etwas in der art:  my $month_energy = ReadingsVal('Sungrow_month', 'state', 0)+ $day_energy;

übrigens brauchst du nicht unbedingt einen dummy pro wert. du kannst mehrere werte in einen dummy stecken oder sogar ins original device.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Zenz

#2
Hallo justme1968!

Zuerst einmal recht herzlichen Dank für deine Hilfestellung.

Aber irgendwie verstehe ich es nicht ganz, denn eigentlich habe ich ja vom ersten bis zum
letzten Tag des Monats kein "ReadingsVal('Sungrow_month', 'state', 0)"

Mein Gedanke ist, dass ich am erste Tag des Monats beginne den Tageswert ($day_energy=ReadingsVal("Sungrow","Daily_energy","42")
mit den darauf folgenden Tageswerten zu addieren.
Am letzten Tag des Monats soll die Summe aller Tageswerte in den Dummy "Sungrow_month" geschrieben werden.
Für "Sungrow_month" habe ich ein FileLog angelegt in dem eigentlich dann nur ein Eintrag pro Monat vorhanden sein sollte.

Im nächsten Monat soll das Spiel wieder von neuem starten...


Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt, aber wie bereits erwähnt ich bin leider noch Anfänger :-[

PS.:
mit " ReadingsVal("Sungrow","Daily_energy","42") " lese ich über Modbus die Tagesleistung meiner Photovoltaik-Anlage um 23h55
mit Hilfe eines at aus.
Leider wird von der Photovoltaik-Anlage kein Monats- bzw. Jahreswert zur Verfügung gestellt


franky08

Hallo, dann sieh dir mal das Statistics Modul an. Das dürfte dafür das Richtige sein.

VG
Frank
Debian Bookworm auf HUNSN / Debian Bullseye auf 2.ter HUNSN F2F an 2x RaspiB
mit FHEM aktuell
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu, raspmatic_rpi3, HMIP-HCU1

micha80

Zitat von: justme1968 am 19 Juni 2015, 23:05:57
brauchst du etwas in der art:  my $month_energy = ReadingsVal('Sungrow_month', 'state', 0)+ $day_energy;


Wenn du eine Variable und eine Zeile Code mehr verwendest, wirds vielleicht klarer:
Du willst doch den alten und den neuen Wert addieren?


  my $month_energy_old = ReadingsVal('Sungrow_month', 'month_energy', 0);

  my $month_energy_new = $month_energy_old + $day_energy;
  # und dann den neuen Wert speichen:
  fhem ("set Sungrow_month $month_energy_new" );


Mit

  my $day_energy=ReadingsVal("Sungrow","Daily_energy","42");

holst du dir ordentlich einen Wert für $day_energy, dass machst du aber nicht für $month_energy !


mfg
micha

Zenz

#5
@ micha80

Zitatholst du dir ordentlich einen Wert für $day_energy, dass machst du aber nicht für $month_energy !
Ja, du hast recht.
Es gibt keinen Wert für $month_energy vom Wechselrichter, den ich auslesen könnte, deshalb möchte ich gerne
aus dem vorhandenen Wert $day_energy, den Monatswert errechnen - und da scheitere ich leider :'(

ZitatDu willst doch den alten und den neuen Wert addieren?
Ja, und nur dieser errechnete Wert sollte mit Hilfe einer if-Schleife am letzten jedes Monats mit
[fhem ("set Sungrow_month $month_energy_new" )]
gespeichert werden um infolge damit ein Jahres-Plot mit den einzelnen Monaten zu erstellen.



@ franky08

Statistics und Average Modul habe ich bereits probiert, aber leider in meinem Fall nicht anwendbar.
Es ist so, dass ich alle 60s mir den Wert für die Momentanleistung und Tagesleistung (day_energy) hole.
Die Tagesleistung erhöht sich natürlich im laufe des Tages und ist für mich eigentlich nur nach Sonnenuntergang
von Bedeutung.
Nun ist es leider so , dass es ca. alle 2-3 Tage zu einem Fehlwert kommt, wobei ich nicht weiß ob vom Wechselrichter oder
bei der Übertragung mit ModBus.
Dieser Fehlwert, der meist um dass 20-30fache zu groß ist, geht natürlich voll in die Statistic bzw. Average ein
und damit stimmt meine Monatsleistung überhaupt nicht mehr.
Aus diesem Grund möchte ich ja gerne wie oben beschrieben meinen Monatswert "händisch" errechnen.

mfG
Zenz


PS.: Siehe Anhang - so, sehen meine momentanen Plots mit aktueller Leistung und Tagesleistung aus...

Zenz

Konnte inzwischen die Stelle, die für folgende Fehlermeldung zuständig ist, lokalisieren.
ZitatGlobal symbol "$month_energy" requires explicit package name at ./FHEM/99_myUtils.pm line 63.


my $month_energy = $month_energy + $day_energy=ReadingsVal("Sungrow","Daily_energy","42");

Wenn ich zu Testzwecken $month_energy entferne, kommt es zu keiner Fehlermeldung.



Kann mir bitte jemand mit dem richtigen Syntax fur

neuer Monatswert = alter Monatswert + Tageswert

helfen.


mfG Zenz

justme1968

du hast dir aber schon mal angesehen was ich dir vorgeschlagen hatte?
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Zenz

Ja, hab ich.
Aber bitte "schlag" mich nicht gleich, falls ich es nicht richtig verstanden habe :),
bin noch ein absoluter Anfänger.

Ich habe ja kein Reading Sungrow_month - es wird mir vom Wechselrichter nur eine
Reading $day_energy=ReadingsVal("Sungrow","Daily_energy","42");
zur Verfügung gestellt.

Danke für deine Geduld.

justme1968

du legst das reading doch 2 zeilen darunter selber an: fhem ("set Sungrow_month $month_energy" );

die variable die du vermisst musst du durch ein selber erstelltes reading ersetzen. wenn du zusätzlich zum täglich akkumulierten wert auch noch einen möchtest der monatsweise springt brauchst du zwei eigene readings.

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Zenz

Ups, ich glaub schön langsam wird es hell am Ende des Tunnels...

Danke für deine Hilfe, ich glaube ich habe es nun verstanden.
Der Knackpunkt ist/war das zweite Reading.

Werde gleich versuchen die Codezeilen zusammen zu stoppeln.

Nochmals recht herzlichen Dank für deine Hilfe
Zenz