Hallo zusammen,
ich kann die Stelle mit dem Fehler einfach nicht finden.
Beim ersten Durchlauf des Perl Codes innerhalb eines DOELSEIF kommt diese Warnung:
PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.
Der selbe Code wird ab diesem Zeitpunkt dann alle drei Minuten durchlaufen und es treten keine weiteren Meldungen, außer die gewünschten, auf.
Auch die Funktionalität ist exakt wie gewünscht.
In der 99_myUtils isr es diese Stelle:
use Time::Local;
Der Perl Code verwendet einige Zeit Berechnungen:
Ich habe es mal etwas lesbarer mit Zeilenumbrüchen, formatiert...
Die Vergleichsoperationen wurden bereits durch set Magic aufgelöst
eval: {
if (1 == 1 ) { <<<<<<<<<<<<<<< dieser Zweig wird durchlaufen
if ( time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." 09:00") ) { <<<<<< hier wäre die erste "time" Funktion
CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs 0");
if (AttrVal("WR_1_Speicher_1_ExternControl","verbose",0) >=3) {
Log 3, "WR_1_Speicher_1_ExternControl cmd_6 : SpeicherMiddayControl vor 09:00 Uhr noch nicht laden"; <<<<<<< Das ist die Meldung im Log
};
} else {
if ( time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." 10:00") ) {
CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs 450");
CommandSet(undef, "WR_1_API 23_09_Battery_ExternControl_MaxSocRel 30");
if (AttrVal("WR_1_Speicher_1_ExternControl","verbose",0) >=3) {
Log 3, "WR_1_Speicher_1_ExternControl cmd_6 : SpeicherMiddayControl vor 10:00 limitieren";
Log 3, "WR_1_Speicher_1_ExternControl cmd_6 : Battery_ExternControl_MaxChargePowerAbs auf 450 limitiert";
Log 3, "WR_1_Speicher_1_ExternControl cmd_6 : Battery_ExternControl_MaxSOC auf 30 % limitiert";
};
};
};
if (time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." 10:00") <= time and <<<<<<< Das kommt erst mittags dran, läuft dann auch ohne weiter Perl Warning
time <= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." 14:00") ) {
if (0 == 1 and
time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." 12:00") ) {
CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs 0");
if (AttrVal("WR_1_Speicher_1_ExternControl","verbose",0) >=3)
{Log 3, "WR_1_Speicher_1_ExternControl cmd_6 : SpeicherMiddayControlActive laden wegen MaxSoc von 10:00 auf 12:00 Uhr verschoben"};
} else {
CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs 1000");
if (AttrVal("WR_1_Speicher_1_ExternControl","verbose",0) >=3) {
Log 3, "WR_1_Speicher_1_ExternControl cmd_6 : SpeicherMiddayControlActive laden von 10:00 bis 14:00 freigegeben"
};
};
};
if (time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." 14:00") ) { <<<<<<< Das kommt erst nachmittags dran, läuft dann auch ohne weiter Perl Warning
CommandSetReading(undef, "WR_1_Speicher_1_ExternTrigger SpeicherMiddayControlRunning 0");
if (AttrVal("WR_1_Speicher_1_ExternControl","verbose",0) >=3)
{Log 3, "WR_1_Speicher_1_ExternControl cmd_6 : SpeicherMiddayControl nach 14:00 beendet"};
};
};
if (0 == 1 and <<<<<<<< Und diese Bedingung ist ja auch noch nicht erfüllt.
100 <= 100 ) {
CommandSet(undef, "WR_1_API 23_09_Battery_ExternControl_MaxSocRel 100");
if (AttrVal("WR_1_Speicher_1_ExternControl","verbose",0) >=3)
{Log 3, "WR_1_Speicher_1_ExternControl cmd_6 : Battery_ExternControl_MaxSocRel 100 % halten"};
};
if (AttrVal("WR_1_Speicher_1_ExternControl","verbose",0) >=4)
{Log 3, "WR_1_Speicher_1_ExternControl cmd_6 : ExternControl Kommandowiederholung erledigt"};
}
Hier die original Meldungen aus dem Log.
2021.05.24 07:01:14.009 1: PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.
2021.05.24 07:01:14.010 3: eval: { if (1 == 1 ) { if ( time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." 09:00") ) { CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs 0"); if (AttrVal("WR_1_Speicher_1_ExternControl","verbose",0) >=3) { Log 3, "WR_1_Speicher_1_ExternControl cmd_6 : SpeicherMiddayControl vor 09:00 Uhr noch nicht laden"; }; } else { if ( time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." 10:00") ) { CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs 450"); CommandSet(undef, "WR_1_API 23_09_Battery_ExternControl_MaxSocRel 30"); if (AttrVal("WR_1_Speicher_1_ExternControl","verbose",0) >=3) { Log 3, "WR_1_Speicher_1_ExternControl cmd_6 : SpeicherMiddayControl vor 10:00 limitieren"; Log 3, "WR_1_Speicher_1_ExternControl cmd_6 : Battery_ExternControl_MaxChargePowerAbs auf 450 limitiert"; Log 3, "WR_1_Speicher_1_ExternControl cmd_6 : Battery_ExternControl_MaxSOC auf 30 % limitiert"; }; }; }; if (time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." 10:00") <= time and time <= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." 14:00") ) { if (0 == 1 and time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." 12:00") ) { CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs 0"); if (AttrVal("WR_1_Speicher_1_ExternControl","verbose",0) >=3) {Log 3, "WR_1_Speicher_1_ExternControl cmd_6 : SpeicherMiddayControlActive laden wegen MaxSoc von 10:00 auf 12:00 Uhr verschoben"}; } else { CommandSet(undef, "WR_1_API 23_07_Battery_ExternControl_MaxChargePowerAbs 1000"); if (AttrVal("WR_1_Speicher_1_ExternControl","verbose",0) >=3) { Log 3, "WR_1_Speicher_1_ExternControl cmd_6 : SpeicherMiddayControlActive laden von 10:00 bis 14:00 freigegeben" }; }; }; if (time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." 14:00") ) { CommandSetReading(undef, "WR_1_Speicher_1_ExternTrigger SpeicherMiddayControlRunning 0"); if (AttrVal("WR_1_Speicher_1_ExternControl","verbose",0) >=3) {Log 3, "WR_1_Speicher_1_ExternControl cmd_6 : SpeicherMiddayControl nach 14:00 beendet"}; }; }; if (0 == 1 and 100 <= 100 ) { CommandSet(undef, "WR_1_API 23_09_Battery_ExternControl_MaxSocRel 100"); if (AttrVal("WR_1_Speicher_1_ExternControl","verbose",0) >=3) {Log 3, "WR_1_Speicher_1_ExternControl cmd_6 : Battery_ExternControl_MaxSocRel 100 % halten"}; }; if (AttrVal("WR_1_Speicher_1_ExternControl","verbose",0) >=4) {Log 3, "WR_1_Speicher_1_ExternControl cmd_6 : ExternControl Kommandowiederholung erledigt"}; }
2021.05.24 07:01:14.066 3: WR_1_Speicher_1_ExternControl cmd_6 : SpeicherMiddayControl vor 09:00 Uhr noch nicht laden
Ich würde liebend gerne die Warning beseitigen, kann jedoch leider nicht die fehlerhafte Stelle finden.
VG
Christian
Zitat von: ch.eick am 24 Mai 2021, 16:06:43
In der 99_myUtils isr es diese Stelle:
use Time::Local;
Es mag ja sein, dass das in Zeile 21 Deiner 99_myUtils.pm steht, aber:
PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.
die Warnung kommt aus einer ganz anderen Datei, nämlich 99_Utils.pm! Dort steht in Zeile 21 (diese befindet sich innerhalb der Funktion time_str2num()):
return mktime($a[5],$a[4],$a[3],$a[2],$a[1]-1,$a[0]-1900,0,0,-1);
Also wird vermutlich aus irgendwelchen Gründen beim ersten Durchlauf die Funktion time_str2num() ohne gültigen Wert aufgerufen.
Aktiviere mal stacktrace, dann sieht man vielleicht mehr.
Zitat von: betateilchen am 25 Mai 2021, 13:27:31
Es mag ja sein, dass das in Zeile 21 Deiner 99_myUtils.pm steht, aber:
PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.
die Warnung kommt aus einer ganz anderen Datei, nämlich 99_Utils.pm! Dort steht in Zeile 21 (diese befindet sich innerhalb der Funktion time_str2num()):
Okay, wer lesen kann ist im Vorteil, sorry.
Zitat
return mktime($a[5],$a[4],$a[3],$a[2],$a[1]-1,$a[0]-1900,0,0,-1);
Also wird vermutlich aus irgendwelchen Gründen beim ersten Durchlauf die Funktion time_str2num() ohne gültigen Wert aufgerufen.
Aktiviere mal stacktrace, dann sieht man vielleicht mehr.
Ich habe die Funktion dann mal auf der FHEM command line aufgerufen und einmal glück gehabt.
attr global stacktrace 1
{time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." 09:00")}
2021.05.25 15:45:10.894 1: PERL WARNING: Use of uninitialized value in subroutine entry at ./FHEM/99_Utils.pm line 21.
2021.05.25 15:45:10.895 3: eval: {time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." 09:00")}
2021.05.25 15:45:10.895 1: stacktrace:
2021.05.25 15:45:10.895 1: main::__ANON__ called by ./FHEM/99_Utils.pm (21)
2021.05.25 15:45:10.895 1: main::time_str2num called by (eval 272946) (1)
2021.05.25 15:45:10.895 1: (eval) called by fhem.pl (1161)
2021.05.25 15:45:10.895 1: main::AnalyzePerlCommand called by fhem.pl (1190)
2021.05.25 15:45:10.896 1: main::AnalyzeCommand called by fhem.pl (1117)
2021.05.25 15:45:10.896 1: main::AnalyzeCommandChain called by ./FHEM/01_FHEMWEB.pm (2775)
2021.05.25 15:45:10.896 1: main::FW_fC called by ./FHEM/01_FHEMWEB.pm (1006)
2021.05.25 15:45:10.896 1: main::FW_answerCall called by ./FHEM/01_FHEMWEB.pm (598)
2021.05.25 15:45:10.896 1: main::FW_Read called by fhem.pl (3893)
2021.05.25 15:45:10.896 1: main::CallFn called by fhem.pl (774)
EDIT: Kann es eventuell sein,dass ich anstelle von "09:00" die Zeit mit Sekunden angeben muss, also "09:00:00" ? Aber warum dann nur beim ersten Mal???
Gruß
Christian
Zitat von: ch.eick am 25 Mai 2021, 15:56:12
EDIT: Kann es eventuell sein,dass ich anstelle von "09:00" die Zeit mit Sekunden angeben muss, also "09:00:00" ?
Das kannst Du doch einfach durch ausprobieren herausfinden.
Ich glaube übrigens, dass Du diese Berechnungen viel einfacher haben könntest.
Eigentlich willst Du doch nur gegen heute (!) 09:00, 10:00 oder 14:00 vergleichen.
Das würde ich machen, indem ich gegen die Sekunden seit Mitternacht prüfe (32400/36000/50400)
Zitat von: betateilchen am 25 Mai 2021, 17:52:44
Das kannst Du doch einfach durch ausprobieren herausfinden.
Das habe ich natürlich bereits gemacht, jedoch tritt es ja nicht immer auf. Beim zweiten Aufruf klappt es mit 09:00 ohne Fehler.
Zitat
Ich glaube übrigens, dass Du diese Berechnungen viel einfacher haben könntest.
Eigentlich willst Du doch nur gegen heute (!) 09:00, 10:00 oder 14:00 vergleichen.
Das würde ich machen, indem ich gegen die Sekunden seit Mitternacht prüfe (32400/36000/50400)
Einfacher wäre toll, jedoch gibt der Anwender die zeit mit "hh:mm" ein. Wenn Du da noch eine Idee hast wäre das echt toll, ich habe mir schon sehr das Hirn mit den Zeitumwandelungen zerbrochen und bin etwas blind auf dem Auge :-)
VG
Christian
Hallo Christian,
Beispiel: einfach zu "Fuß" ;)
{my ($stunden,$minuten)=split ':',"09:23";;return $stunden*3600+$minuten*60}
Gruß Otto
Zitat von: ch.eick am 25 Mai 2021, 18:56:44
jedoch gibt der Anwender die zeit mit "hh:mm" ein.
09:00 Uhr sind 9*3600 Sekunden + 0*60 Sekunden.
Zitat von: ch.eick am 25 Mai 2021, 18:56:44
Wenn Du da noch eine Idee hast wäre das echt toll, ich habe mir schon sehr das Hirn mit den Zeitumwandelungen zerbrochen
in meiner 99_myUtils.pm gibt es zwei Funktionen
sub secondsFromMidnight{
my @time = localtime();
return (($time[2] * 3600) + ($time[1] * 60) + $time[0]);
}
sub secondsToMidnight{
my @time = localtime();
return 86400 - (($time[2] * 3600) + ($time[1] * 60) + $time[0]);
}
die solche Vergleiche innerhalb des laufenden Tages erheblich vereinfachen.
Okay, wenn Ihr schon zu zweit seit, dann muss da was dran sein.
Ich durchdenke das dann mal morgen :-)
Ihr meint also als Ersatz für solch ein Konstrukt, da "time" ja die Zeit in Sekunden liefert.
if ( time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." 10:00") )
Vielen Dank mal wieder für Eure Hilfe
Christian