DOIF prüft vor Initialisierung von FHEM

Begonnen von Prof. Dr. Peter Henning, 17 März 2017, 16:47:35

Vorheriges Thema - Nächstes Thema

Prof. Dr. Peter Henning

Seit Jahren ist der Ausführungsteil meines Weckers:

define House.Wakeup DOIF ([Weckzeit:today] eq "none") () DOELSEIF ([([Weckzeit:today] + [00:05])]) ({HouseTimeHelper("wakeup")})

Seit wenigen Wochen tritt folgendes Problem auf: Beim Start von FHEM hat Weckzeit:today noch nicht den Wert einer Zeit - und prompt steigt die Definition aus mit

Zitat([([Weckzeit:today] + [00:05:00])]) ({HouseTimeHelper("wakeup")}): House.Wakeup DOIF: Wrong timespec : either HH:MM:SS or {perlcode}: ([Weckzeit:today]+[00:05:00])
    2017.03.17 07:22:53 1: configDB: House.Wakeup DOIF: Wrong timespec : either HH:MM:SS or {perlcode}: ([Weckzeit:today]+[00:05:00])

Kann man diese Überprüfung auf die Zeit nach der Initialisierung verschieben ?

LG

pah

Damian

Zitat von: Prof. Dr. Peter Henning am 17 März 2017, 16:47:35
Seit Jahren ist der Ausführungsteil meines Weckers:

define House.Wakeup DOIF ([Weckzeit:today] eq "none") () DOELSEIF ([([Weckzeit:today] + [00:05])]) ({HouseTimeHelper("wakeup")})

Seit wenigen Wochen tritt folgendes Problem auf: Beim Start von FHEM hat Weckzeit:today noch nicht den Wert einer Zeit - und prompt steigt die Definition aus mit

Kann man diese Überprüfung auf die Zeit nach der Initialisierung verschieben ?

LG

pah

Das wundert mich aber, da die Zeitangaben schon lange erst nach der Initialisierung des Systems gesetzt werden. Zuvor wird lediglich Klammer-Check gemacht und nicht mehr. Die Auswertung der Readings findet bei der Definition nicht statt.

Das kann für mich nur bedeuten, dass nach der Initialisierung des Systems Weckzeit:today keine gültige Zeitangabe hat.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Prof. Dr. Peter Henning

No, Sir.

Das Ganze tritt erst in der neuen Version 5.8 auf - und nach der Initialisierung steht das auf einer korrekten Zeitangabe.

LG

pah

Damian

Zitat von: Prof. Dr. Peter Henning am 17 März 2017, 19:07:37
No, Sir.

Das Ganze tritt erst in der neuen Version 5.8 auf - und nach der Initialisierung steht das auf einer korrekten Zeitangabe.

LG

pah

Dann haben sich offenbar irgendwelche Mechanismen in 5.8 geändert, die ich nicht kenne:

Das ist die Stelle im Code:

if ($dev->{NAME} eq "global" and (EventCheckDoif($dev->{NAME},"global",$eventa,"INITIALIZED") or EventCheckDoif($dev->{NAME},"global",$eventa,"REREADCFG")))
    $hash->{helper}{globalinit}=1;
    # delete old timer-readings
    foreach my $key (keys %{$defs{$hash->{NAME}}{READINGS}}) {
      delete $defs{$hash->{NAME}}{READINGS}{$key} if ($key =~ "^timer_");
    }
    if ($hash->{helper}{last_timer} > 0){
      for (my $j=0; $j<$hash->{helper}{last_timer};$j++)
      {
        DOIF_SetTimer($hash,"DOIF_TimerTrigger",$j);
      }


DOIF_SetTimer zum Setzen der Zeit (von dort kommt die Meldung) wir erst gesetzt, wenn der Trigger "global: INITIALIZED" oder "global: REREADCFG" kommt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Ich habe eine verdächtige Stelle im Code gefunden:

Du kannst die angehängte Version mal testen. Die sollte das Problem beheben.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Prof. Dr. Peter Henning

Nein, diese angehängte Version steigt aus mit
Zitat2017.03.17 20:18:50 1: reload: Error:Modul 98_DOIF deactivated:
Global symbol "$lastWarningMsg" requires explicit package name at /opt/fhem/FHEM/98_DOIF.pm line 1071.
Global symbol "$lastWarningMsg" requires explicit package name at /opt/fhem/FHEM/98_DOIF.pm line 1078.
Global symbol "$lastWarningMsg" requires explicit package name at /opt/fhem/FHEM/98_DOIF.pm line 1079.
Global symbol "$lastWarningMsg" requires explicit package name at /opt/fhem/FHEM/98_DOIF.pm line 1080.
Global symbol "$lastWarningMsg" requires explicit package name at /opt/fhem/FHEM/98_DOIF.pm line 1084.

2017.03.17 20:18:50 0: Global symbol "$lastWarningMsg" requires explicit package name at /opt/fhem/FHEM/98_DOIF.pm line 1071.
Global symbol "$lastWarningMsg" requires explicit package name at /opt/fhem/FHEM/98_DOIF.pm line 1078.
Global symbol "$lastWarningMsg" requires explicit package name at /opt/fhem/FHEM/98_DOIF.pm line 1079.
Global symbol "$lastWarningMsg" requires explicit package name at /opt/fhem/FHEM/98_DOIF.pm line 1080.
Global symbol "$lastWarningMsg" requires explicit package name at /opt/fhem/FHEM/98_DOIF.pm line 1084.

LG

pah

Damian

Zitat von: Prof. Dr. Peter Henning am 17 März 2017, 21:33:58
Nein, diese angehängte Version steigt aus mit
LG

pah

ja, es gab letztens ein Update. Dazu musst du die aktuelle fhem.pl nehmen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Prof. Dr. Peter Henning

Macht es jetzt nicht besser. Die Definition steigt aus, weil unmittelbar bei der Definition der Wert von [Weckzeit:today] geprüft wird. Und wenn der "none" ist => Fehler.

Ist vermutlich eine Folge des von Rudi eingeführten frühen PerlSyntaxCheck...

LG

pah

Damian

#8
Zitat von: Prof. Dr. Peter Henning am 18 März 2017, 05:22:45
Macht es jetzt nicht besser. Die Definition steigt aus, weil unmittelbar bei der Definition der Wert von [Weckzeit:today] geprüft wird. Und wenn der "none" ist => Fehler.

Ist vermutlich eine Folge des von Rudi eingeführten frühen PerlSyntaxCheck...

LG

pah

Dann scheint die Abfrage auf $init_done, dann wohl nicht mehr zu greifen. Ich habe mal den harten Ausstieg ausgebaut.

Edit: Ich habe noch einiges im Modul geändert:

Es werden jetzt grundsätzlich DOIF-Module definiert, auch wenn indirekte Timer nicht sauber definiert sind. Das entspricht der bisherigen Vorgehensweise bei Readingangaben. Intervalle bei ungültigen Timerangaben sind dann nicht wahr.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF