FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: rallye am 03 Mai 2021, 09:24:00

Titel: FHEM commands vs. Perl commands
Beitrag von: rallye am 03 Mai 2021, 09:24:00
Ich möchte mein Gartenlicht mit einem DOIF bei Sonnenuntergang bis zu einem gewissen Zeitpunkt einschalten. Dafür verwende ich folgendes DOIF
Internals:
   DEF        ([{sunset_abs("HORIZON=3",0,"14:30","20:00")}])
   (set Licht.Garten on-till 20:45)

   FUUID      5e189785-f33f-55a1-c485-9709b0f9897d5e79
   MODEL      FHEM
   NAME       GartenlichtOnOff
   NOTIFYDEV  global
   NR         226
   NTFY_ORDER 50-GartenlichtOnOff
   STATE      cmd_1
   TYPE       DOIF
   VERSION    24274 2021-04-18 16:40:42
   READINGS:
     2021-05-02 19:45:27   cmd             1
     2021-05-02 19:45:27   cmd_event       timer_1
     2021-05-02 19:45:27   cmd_nr          1
     2021-05-02 11:01:15   mode            enabled
     2021-05-02 19:45:27   state           cmd_1
     2021-05-02 19:45:27   timer_01_c01    03.05.2021 19:45:27
   Regex:
     accu:
     collect:
   attr:
     cmdState:
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday)
   days:
   do:
     0:
       0          set Licht.Garten on-till 20:45
     1:
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     event      timer_1
     globalinit 1
     last_timer 1
     sleeptimer -1
     timerdev   
     timerevent timer_1
     triggerDev
     timerevents:
       timer_1
     timereventsState:
       timer_1
     triggerEvents:
       timer_1
     triggerEventsState:
       timer_1
   interval:
   intervalfunc:
   localtime:
     0          1620063927
   perlblock:
   realtime:
     0          19:45:27
   time:
     0          {sunset_abs("HORIZON=3",0,"14:30","20:00")}
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   triggertime:
     1620063927:
       localtime  1620063927
       hash:
   uiState:
   uiTable:

Num möchte ich das Licht nicht zu einem bestimmten Zeitpunkt ausschalten, sondern "variabel". Ich habe mir zu diesem Zweck eine Sub im 99_myUtils.pm geschrieben die so aussieht:
sub sub_randomtime($$){
  my ($MeH,$MeM,$MeS) = split(":", shift);
  my ($MeMp,$MeSp) = split(":", shift);
  my $ZtA = int($MeH*3600 + $MeM*60 + rand($MeMp*60) + $MeSp);
  my $ZtH = int($ZtA/3600);
  my $ZtM = int(($ZtA-$ZtH*3600)/60);
  my $ZtS = int($ZtA-($ZtH*3600+$ZtM*60));
  return sprintf("%2.2d:%2.2d:%2.2d",$ZtH,$ZtM,$ZtS);
und mir eine zufällige Zeit im Bereich der übergebenen Zeit zurück liefert. Diese Sub funktioniert für mich einwandfrei auch bei Aufrufen an anderer Stelle. Nur, wenn ich das eingangs erwähnte DOIF so umstelle
DEF        ([{sunset_abs("HORIZON=3",0,"14:30","20:00")}])
   (set Licht.Garten on-till {sub_randomtime('20:30:00','29:00')})

   FUUID      5e189785-f33f-55a1-c485-9709b0f9897d5e79
   MODEL      FHEM
   NAME       GartenlichtOnOff
   NOTIFYDEV  global
   NR         226
   NTFY_ORDER 50-GartenlichtOnOff
   STATE      initialized
   TYPE       DOIF
   VERSION    24274 2021-04-18 16:40:42
   READINGS:
     2021-05-03 09:22:13   cmd             0
     2021-05-03 09:22:13   mode            enabled
     2021-05-03 09:22:13   state           initialized
     2021-05-03 09:22:13   timer_01_c01    03.05.2021 19:46:47
   Regex:
     accu:
     collect:
   attr:
     cmdState:
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday)
   days:
   do:
     0:
       0          set Licht.Garten on-till {sub_randomtime('20:30:00','29:00')}
     1:
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     globalinit 1
     last_timer 1
     sleeptimer -1
   intervalfunc:
   localtime:
     0          1620064007
   realtime:
     0          19:46:47
   time:
     0          {sunset_abs("HORIZON=3",0,"14:30","20:00")}
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   triggertime:
     1620064007:
       localtime  1620064007
       hash:
   uiState:
   uiTable:

schaltet sich das Gartenlicht erst gar nicht ein. Muss ich das DOIF auf Perl umstellen ? Und wenn ja: warum ?
Titel: Antw:FHEM commands vs. Perl commands
Beitrag von: Otto123 am 03 Mai 2021, 10:15:43
Hi,

was Du machen willst nennt sich set magic (https://fhem.de/commandref_DE.html#set) - wenn Du da mal in die Doku schaust wirst Du sehen -> nicht {Perl} sondern {(Perl)}

Also zwei Klammern und es funktioniert bestimmt :) - hat nichts mit DOIF zu tun (obwohl es da sicher eine besondere Lösung gibt)

Gruß Otto
Titel: Antw:FHEM commands vs. Perl commands
Beitrag von: rallye am 03 Mai 2021, 13:30:03
Danke, wieder etwas gelernt. Ich bin zuversichtlich, dass das heute abends funktioniert ! Dass das mit DIOF nichts zu tun hat war mir schon klar aber hinbekommen hab ich es trotzdem ohne Hilfe nicht  8)