DOIF: PERL WARNING: Use of uninitialized value

Begonnen von alpha1974, 15 April 2015, 08:11:19

Vorheriges Thema - Nächstes Thema

alpha1974

Folgendes "Problem" (eher eine Unvollkommenheit) taucht hier beim Neustart von FHEM (aktuellste geupdatete Fassung) im Logfile auf:
2015.04.15 08:02:11 1: PERL WARNING: Use of uninitialized value $end in string gt at ./FHEM/98_DOIF.pm line 476.
2015.04.15 08:02:11 1: PERL WARNING: Use of uninitialized value $begin in string gt at ./FHEM/98_DOIF.pm line 476.
2015.04.15 08:02:11 1: PERL WARNING: Use of uninitialized value $begin in string ge at ./FHEM/98_DOIF.pm line 481.


Die DOIF-Devices sehen wie folgt aus und funktionieren auch:
define di_WZLampe DOIF ([[Sonnenuntergang]] or ([WZ_Helligkeit]<=10 and [?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]])) (set ZWave_stehlampe_wz_power on) \
DOELSEIF ([[WZLampe_Ausschaltzeit_abends]] or ([WZ_Helligkeit]>10 and [?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]])) (set ZWave_stehlampe_wz_power off)
attr di_WZLampe room Wohnzimmer

define di_ZWDongle_0 DOIF ([ZWDongle_0] eq "disconnected") ({\
send_mail('mail@xxxxxxxxxx.net','FHEM ZWDongle di-Watchdog','ZWDongle_0 disconnected: DOIF-Watchdog is trying to reconnect....'),\
restart_usbip_7490\
})

define di_temperaturtest DOIF ([ZWave_wassersensor_keller_temperatur]) ({\
Log 1, "Notify Temperatur-Event Keller: OldValue:".OldValue("ZWave_wassersensor_keller_temperatur")." Value:".Value("ZWave_wassersensor_keller_temperatur")\
})
attr di_temperaturtest do always
attr di_temperaturtest room Keller,Tests

define di_LuefterKeller DOIF ([+02:00]) (set ZWave_luefter_waschkeller_power on-for-timer 600)
attr di_LuefterKeller do always
attr di_LuefterKeller room Keller,Tests


Vermutlich fehlt wieder irgendwo ein Semikolon oder ein Klämmerchen oder es eines überflüssig...  ::) Jedenfalls war das schon bei anderen Fehlermeldungen des Rätsels Lösung. Leider finde ich diesmal die Ursache nicht und wäre daher für einen hilfreichen Tipp dankbar.
FHEM/Z-Wave USB-Dongle + div. Devices

flurin

Zitat von: alpha1974 am 15 April 2015, 08:11:19
Folgendes "Problem" (eher eine Unvollkommenheit) taucht hier beim Neustart von FHEM (aktuellste geupdatete Fassung) im Logfile auf:
2015.04.15 08:02:11 1: PERL WARNING: Use of uninitialized value $end in string gt at ./FHEM/98_DOIF.pm line 476.
2015.04.15 08:02:11 1: PERL WARNING: Use of uninitialized value $begin in string gt at ./FHEM/98_DOIF.pm line 476.
2015.04.15 08:02:11 1: PERL WARNING: Use of uninitialized value $begin in string ge at ./FHEM/98_DOIF.pm line 481.


Die DOIF-Devices sehen wie folgt aus und funktionieren auch:
define di_WZLampe DOIF ([[Sonnenuntergang]] or ([WZ_Helligkeit]<=10 and [?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]])) (set ZWave_stehlampe_wz_power on) \
DOELSEIF ([[WZLampe_Ausschaltzeit_abends]] or ([WZ_Helligkeit]>10 and [?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]])) (set ZWave_stehlampe_wz_power off)
attr di_WZLampe room Wohnzimmer

define di_ZWDongle_0 DOIF ([ZWDongle_0] eq "disconnected") ({\
send_mail('mail@xxxxxxxxxx.net','FHEM ZWDongle di-Watchdog','ZWDongle_0 disconnected: DOIF-Watchdog is trying to reconnect....'),\
restart_usbip_7490\
})

define di_temperaturtest DOIF ([ZWave_wassersensor_keller_temperatur]) ({\
Log 1, "Notify Temperatur-Event Keller: OldValue:".OldValue("ZWave_wassersensor_keller_temperatur")." Value:".Value("ZWave_wassersensor_keller_temperatur")\
})
attr di_temperaturtest do always
attr di_temperaturtest room Keller,Tests

define di_LuefterKeller DOIF ([+02:00]) (set ZWave_luefter_waschkeller_power on-for-timer 600)
attr di_LuefterKeller do always
attr di_LuefterKeller room Keller,Tests


Vermutlich fehlt wieder irgendwo ein Semikolon oder ein Klämmerchen oder es eines überflüssig...  ::) Jedenfalls war das schon bei anderen Fehlermeldungen des Rätsels Lösung. Leider finde ich diesmal die Ursache nicht und wäre daher für einen hilfreichen Tipp dankbar.

Diese Fehlermeldung hatte ich auch schon. Ich vermute hier ist die Ursache:


define di_WZLampe DOIF ([[Sonnenuntergang]] or ([WZ_Helligkeit]<=10 and [?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]])) (set ZWave_stehlampe_wz_power on) \
DOELSEIF ([[WZLampe_Ausschaltzeit_abends]] or ([WZ_Helligkeit]>10 and [?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]])) (set ZWave_stehlampe_wz_power off)
attr di_WZLampe room Wohnzimmer


Versuch mal den Fehler einzukreisen, indem Du die Bedingungen zum Testen vereinfachst:


define di_WZLampe DOIF ([[Sonnenuntergang]]) (set ZWave_stehlampe_wz_power on)
attr di_WZLampe room Wohnzimmer


oder


define di_WZLampe DOIF ([WZ_Helligkeit]<=10 and [?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]]) (set ZWave_stehlampe_wz_power on)
attr di_WZLampe room Wohnzimmer


evtl. ist Sonnenuntergang beim Starten noch nicht definiert?

Damian

Zitat von: flurin am 15 April 2015, 10:25:34
Diese Fehlermeldung hatte ich auch schon. Ich vermute hier ist die Ursache:


define di_WZLampe DOIF ([[Sonnenuntergang]] or ([WZ_Helligkeit]<=10 and [?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]])) (set ZWave_stehlampe_wz_power on) \
DOELSEIF ([[WZLampe_Ausschaltzeit_abends]] or ([WZ_Helligkeit]>10 and [?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]])) (set ZWave_stehlampe_wz_power off)
attr di_WZLampe room Wohnzimmer


Versuch mal den Fehler einzukreisen, indem Du die Bedingungen zum Testen vereinfachst:


define di_WZLampe DOIF ([[Sonnenuntergang]]) (set ZWave_stehlampe_wz_power on)
attr di_WZLampe room Wohnzimmer


oder


define di_WZLampe DOIF ([WZ_Helligkeit]<=10 and [?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]]) (set ZWave_stehlampe_wz_power on)
attr di_WZLampe room Wohnzimmer


evtl. ist Sonnenuntergang beim Starten noch nicht definiert?

ja, mit der aktuellen Version des Moduls:

  $Id: 98_DOIF.pm 8432 2015-04-13 19:34:11Z damian-s $

sollte in solchen Fällen beim entsprechendem Timer-Reading (timer_c...) ein Hinweis stehen,  der Realtimer intern mit 00:00:00 belegt werden und damit die Perl-Warnung nicht mehr kommen.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

flurin

#3
Zitat von: Damian am 15 April 2015, 11:08:52
ja, mit der aktuellen Version des Moduls:

  $Id: 98_DOIF.pm 8432 2015-04-13 19:34:11Z damian-s $

sollte in solchen Fällen beim entsprechendem Timer-Reading (timer_c...) ein Hinweis stehen,  der Realtimer intern mit 00:00:00 belegt werden und damit die Perl-Warnung nicht mehr kommen.

Gruß

Damian

Ich hatte bei mir in DOIF_time($$$$$) noch Folgendes eingefügt:


+ return undef if (!$end or !$begin);
   if ($end gt $begin) {
     if ($hms ge $begin and $hms lt $end) {
       $ret=1;
     }   
...


oder return 0, ich erinnere mich nicht mehr.

Gruss
flurin

alpha1974

#4
Hier liegt wohl irgendwo die Ursache:
([WZ_Helligkeit]>10 and [?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]]) (set ZWave_stehlampe_wz_power off)

Mit vorstehender Definition kommen die Warnungen, während das hier problemlos geht:


([WZ_Helligkeit]<=10 and [?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]]) (set ZWave_stehlampe_wz_power off)


Einziger Unterschied ">" und "<="...

Merkwürdig: Bei [WZ_Helligkeit]<10 kommt auch keine Warnung, nur bei ">".
FHEM/Z-Wave USB-Dongle + div. Devices

flurin

#5
Zitat von: alpha1974 am 15 April 2015, 13:20:13
Hier liegt wohl irgendwo die Ursache:
([WZ_Helligkeit]>10 and [?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]]) (set ZWave_stehlampe_wz_power off)

Mit vorstehender Definition kommen die Warnungen, während das hier problemlos geht:


([WZ_Helligkeit]<=10 and [?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]]) (set ZWave_stehlampe_wz_power off)


Einziger Unterschied ">" und "<="...

Merkwürdig: Bei [WZ_Helligkeit]<10 kommt auch keine Warnung, nur bei ">".

Vermutlich, weil die 1. Bedingung nicht wahr ist, dann wird die 2. Bedingung nicht geprüft.

was zeigt:


version 98_DOIF.pm


Poste folgende Lists:


list WZLampe_BeginnReaktionszeit_morgens
list Sonnenuntergang

alpha1974

#6
Zitat von: flurin am 15 April 2015, 13:57:49

version 98_DOIF.pm


# $Id: 98_DOIF.pm 8432 2015-04-13 19:34:11Z damian-s $


list WZLampe_BeginnReaktionszeit_morgens
list Sonnenuntergang



Internals:
   NAME       WZLampe_BeginnReaktionszeit_morgens
   NR         63
   STATE      07:45:00
   TYPE       dummy
   Readings:
     2015-03-21 18:02:48   state           07:45:00
Attributes:

Internals:
   NAME       Sonnenuntergang
   NR         65
   STATE      20:08:54
   TYPE       dummy
   Readings:
     2015-04-15 00:05:00   state           20:08:54
Attributes:


Nur mit nachstehender Bedingung kommt auch keine Warnung:

(?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]) (set ZWave_stehlampe_wz_power on)


Noch zur Erläuterung (auch wenn es sich für den Kenner vermutlich von selbst erschließt): Die Lampe soll angehen
- bei Sonnenuntergang
- tagsüber (zwischen Reaktionszeit_morgens und Sonnenuntergang), wenn die WZ_Helligkeit <= 10 ist.
FHEM/Z-Wave USB-Dongle + div. Devices

flurin

#7
Zitat von: alpha1974 am 15 April 2015, 14:40:49
# $Id: 98_DOIF.pm 8432 2015-04-13 19:34:11Z damian-s $


list WZLampe_BeginnReaktionszeit_morgens
list Sonnenuntergang



Internals:
   NAME       WZLampe_BeginnReaktionszeit_morgens
   NR         63
   STATE      07:45:00
   TYPE       dummy
   Readings:
     2015-03-21 18:02:48   state           07:45:00
Attributes:

Internals:
   NAME       Sonnenuntergang
   NR         65
   STATE      20:08:54
   TYPE       dummy
   Readings:
     2015-04-15 00:05:00   state           20:08:54
Attributes:


Nur mit nachstehender Bedingung kommt auch keine Warnung:

(?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]) (set ZWave_stehlampe_wz_power on)


Noch zur Erläuterung (auch wenn es sich für den Kenner vermutlich von selbst erschließt): Die Lampe soll angehen
- bei Sonnenuntergang
- tagsüber (zwischen Reaktionszeit_morgens und Sonnenuntergang), wenn die WZ_Helligkeit <= 10 ist.

Ich vermute, Damian arbeitet bereits an einer Lösung  :)

Aber wenn Du nicht warten willst, könntest folgendes ausprobieren:

in 98_DOIF.pm vor der Zeile 476 einfügen:


  if (!$end or !$begin) {
    Log (3,"begin = $begin - end = $end");
    return 0;
  }


"attr global verbose 3" sollte auf 3 gesetzt sein.

Deine ursprünglichen DOIF's wieder einbauen.

Nach der Änderung:

shutdown restart ausführen und in fhem-2015-04.log nachschauen.

alpha1974

#8
Gesagt, getan. Mit den Änderungen und meinen ursprünglichen DOIF´s steht im Log:

2015.04.15 15:47:22 1: PERL WARNING: Use of uninitialized value $begin in concatenation (.) or string at ./FHEM/98_DOIF.pm line 477.
2015.04.15 15:47:22 1: PERL WARNING: Use of uninitialized value $end in concatenation (.) or string at ./FHEM/98_DOIF.pm line 477.
2015.04.15 15:47:22 3: begin =  - end =


Bestätigt im Grunde Deine Annahme, dass begin und end nicht gesetzt sind? Komischerweise ist das kein Problem mit

(?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]) (set ZWave_stehlampe_wz_power on)


Bin mal gespannt, ob Damian noch einen Tipp hat. Jetzt erstmal wieder raus in die Sonne  8)
FHEM/Z-Wave USB-Dongle + div. Devices

Damian

Zitat von: alpha1974 am 15 April 2015, 15:54:59
Gesagt, getan. Mit den Änderungen und meinen ursprünglichen DOIF´s steht im Log:

2015.04.15 15:47:22 1: PERL WARNING: Use of uninitialized value $begin in concatenation (.) or string at ./FHEM/98_DOIF.pm line 477.
2015.04.15 15:47:22 1: PERL WARNING: Use of uninitialized value $end in concatenation (.) or string at ./FHEM/98_DOIF.pm line 477.
2015.04.15 15:47:22 3: begin =  - end =


Bestätigt im Grunde Deine Annahme, dass begin und end nicht gesetzt sind? Komischerweise ist das kein Problem mit

(?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]) (set ZWave_stehlampe_wz_power on)


Bin mal gespannt, ob Damian noch einen Tipp hat. Jetzt erstmal wieder raus in die Sonne  8)

ja, ich habe die Vorbelegung mit 00:00:00 programmiert, wenn das Reading oder Device nicht existiert, das kann ich zukünftig auch bei nicht gültigen Zeiten machen.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

flurin

Zitat von: Damian am 15 April 2015, 16:02:09
ja, ich habe die Vorbelegung mit 00:00:00 programmiert, wenn das Reading oder Device nicht existiert, das kann ich zukünftig auch bei nicht gültigen Zeiten machen.

Gruß

Damian

Ich möchte Dir keine Ratschläge geben aber ich würde Folgendes auch einbauen:


return 0 if (!$end or !$begin);


Damian

Zitat von: Damian am 15 April 2015, 16:02:09
ja, ich habe die Vorbelegung mit 00:00:00 programmiert, wenn das Reading oder Device nicht existiert, das kann ich zukünftig auch bei nicht gültigen Zeiten machen.

Gruß

Damian

Also ich kann den Fall bei mir nicht nachstellen, egal ob Device nicht existiert oder nicht belegt oder sonst wie belegt ist, Realtime wird immer mit 00:00:00 belegt und es gibt keine Warnings bei mir.

Du musst mal von solch einem Fall list von deinem DOIF-Modul hier posten.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

alpha1974

Das hier ist das Device, das die Warnungen erzeugt:


Internals:
   DEF        ([[Sonnenuntergang]] or ([WZ_Helligkeit]<=10 and [?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]])) (set ZWave_stehlampe_wz_power on)
DOELSEIF ([[WZLampe_Ausschaltzeit_abends]] or ([WZ_Helligkeit]>10 and [?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]])) (set ZWave_stehlampe_wz_power off)
   NAME       di_WZLampe
   NR         60
   NTFY_ORDER 50-di_WZLampe
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2015-04-15 16:00:38   cmd_event       WZ_Helligkeit
     2015-04-15 16:00:38   cmd_nr          2
     2015-04-15 18:39:00   e_WZ_Helligkeit_STATE 189
     2015-04-15 16:00:38   state           cmd_2
     2015-04-15 18:39:00   timer_1_c1      15.04.2015 20:08:54
     2015-04-15 18:39:00   timer_2_c1      16.04.2015 07:45:00
     2015-04-15 18:39:00   timer_3_c1      15.04.2015 20:08:54
     2015-04-15 18:39:00   timer_4_c2      15.04.2015 22:45:00
     2015-04-15 18:39:00   timer_5_c2      16.04.2015 07:45:00
     2015-04-15 18:39:00   timer_6_c2      15.04.2015 20:08:54
   Condition:
     0          DOIF_time_once($hash->{timer}{0},$wday,"") or (InternalDoIf('WZ_Helligkeit','STATE','')<=10 and DOIF_time($hash->{realtime}{1},$hash->{realtime}{2},$wday,$hms,""))
     1          DOIF_time_once($hash->{timer}{3},$wday,"") or (InternalDoIf('WZ_Helligkeit','STATE','')>10 and DOIF_time($hash->{realtime}{4},$hash->{realtime}{5},$wday,$hms,""))
   Days:
   Devices:
     0           WZ_Helligkeit
     1           WZ_Helligkeit
     all         WZ_Helligkeit
   Do:
     0          set ZWave_stehlampe_wz_power on
     1          set ZWave_stehlampe_wz_power off
   Helper:
     last_timer 6
     sleeptimer -1
   Internals:
     0           WZ_Helligkeit:STATE
     1           WZ_Helligkeit:STATE
     all         WZ_Helligkeit:STATE
   Itimer:
     all         Sonnenuntergang WZLampe_BeginnReaktionszeit_morgens WZLampe_Ausschaltzeit_abends
   Readings:
   Realtime:
     0          20:08:54
     1          07:45:00
     2          20:08:54
     3          22:45:00
     4          07:45:00
     5          20:08:54
   State:
   Time:
     0          [Sonnenuntergang]
     1          [WZLampe_BeginnReaktionszeit_morgens]
     2          [Sonnenuntergang]
     3          [WZLampe_Ausschaltzeit_abends]
     4          [WZLampe_BeginnReaktionszeit_morgens]
     5          [Sonnenuntergang]
   Timecond:
     0          0
     1          0
     2          0
     3          1
     4          1
     5          1
   Timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
   Timerfunc:
   Timers:
     0           0
     1           3
   Trigger:
Attributes:
   room       Wohnzimmer
FHEM/Z-Wave USB-Dongle + div. Devices

Damian

Zitat von: alpha1974 am 15 April 2015, 18:40:17
Das hier ist das Device, das die Warnungen erzeugt:


Internals:
   DEF        ([[Sonnenuntergang]] or ([WZ_Helligkeit]<=10 and [?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]])) (set ZWave_stehlampe_wz_power on)
DOELSEIF ([[WZLampe_Ausschaltzeit_abends]] or ([WZ_Helligkeit]>10 and [?[WZLampe_BeginnReaktionszeit_morgens]-[Sonnenuntergang]])) (set ZWave_stehlampe_wz_power off)
   NAME       di_WZLampe
   NR         60
   NTFY_ORDER 50-di_WZLampe
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2015-04-15 16:00:38   cmd_event       WZ_Helligkeit
     2015-04-15 16:00:38   cmd_nr          2
     2015-04-15 18:39:00   e_WZ_Helligkeit_STATE 189
     2015-04-15 16:00:38   state           cmd_2
     2015-04-15 18:39:00   timer_1_c1      15.04.2015 20:08:54
     2015-04-15 18:39:00   timer_2_c1      16.04.2015 07:45:00
     2015-04-15 18:39:00   timer_3_c1      15.04.2015 20:08:54
     2015-04-15 18:39:00   timer_4_c2      15.04.2015 22:45:00
     2015-04-15 18:39:00   timer_5_c2      16.04.2015 07:45:00
     2015-04-15 18:39:00   timer_6_c2      15.04.2015 20:08:54
   Condition:
     0          DOIF_time_once($hash->{timer}{0},$wday,"") or (InternalDoIf('WZ_Helligkeit','STATE','')<=10 and DOIF_time($hash->{realtime}{1},$hash->{realtime}{2},$wday,$hms,""))
     1          DOIF_time_once($hash->{timer}{3},$wday,"") or (InternalDoIf('WZ_Helligkeit','STATE','')>10 and DOIF_time($hash->{realtime}{4},$hash->{realtime}{5},$wday,$hms,""))
   Days:
   Devices:
     0           WZ_Helligkeit
     1           WZ_Helligkeit
     all         WZ_Helligkeit
   Do:
     0          set ZWave_stehlampe_wz_power on
     1          set ZWave_stehlampe_wz_power off
   Helper:
     last_timer 6
     sleeptimer -1
   Internals:
     0           WZ_Helligkeit:STATE
     1           WZ_Helligkeit:STATE
     all         WZ_Helligkeit:STATE
   Itimer:
     all         Sonnenuntergang WZLampe_BeginnReaktionszeit_morgens WZLampe_Ausschaltzeit_abends
   Readings:
   Realtime:
     0          20:08:54
     1          07:45:00
     2          20:08:54
     3          22:45:00
     4          07:45:00
     5          20:08:54
   State:
   Time:
     0          [Sonnenuntergang]
     1          [WZLampe_BeginnReaktionszeit_morgens]
     2          [Sonnenuntergang]
     3          [WZLampe_Ausschaltzeit_abends]
     4          [WZLampe_BeginnReaktionszeit_morgens]
     5          [Sonnenuntergang]
   Timecond:
     0          0
     1          0
     2          0
     3          1
     4          1
     5          1
   Timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
   Timerfunc:
   Timers:
     0           0
     1           3
   Trigger:
Attributes:
   room       Wohnzimmer


Also hier sind alle Realtimer korrekt belegt, die können keine Warnings bringen.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

alpha1974

Hmmm... ich habe das DOIF-Device gerade mal gelöscht und alle Warnungen sind verschwunden... Mysteriös!
FHEM/Z-Wave USB-Dongle + div. Devices