FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: mrbreil am 01 Februar 2015, 11:33:25

Titel: Eieruhr
Beitrag von: mrbreil am 01 Februar 2015, 11:33:25
Hallo, ich habe mir Led Streifen organisiert die ich in Fhem als Eieruhr/Kurzeitwecker/Countdown nutzen möchte.
Dazu habe ich folgenes definiert:

den Slider
define Countdown_slider dummy
attr Countdown_slider fp_fllicht3 370,260,7,
attr Countdown_slider setList minutes:slider,0,5,180
attr Countdown_slider webCmd minutes


dummy an
define Countdown_slider_an dummy
attr Countdown_slider_an devStateIcon .*:halb-an
attr Countdown_slider_an fp_fllicht3 450,300,0,
attr Countdown_slider_an setList on off


und dann den Notify

define nt_Countdown_slider_an notify Countdown_slider_an {\
  fhem ("delete at_countdown") if (Value("at_countdown") ne "");;\
  my @@min_gesamt = split(" ", $value{"Countdown_slider"});;\
  my $min = $min_gesamt[1];;\
  my $sec = $min * 60;;\
  my $m = int $sec / 60;;\
  my $s = $sec - ($m * 60);;\
  my $h = int $m / 60;;\
  $m = $m - ($h * 60);;\
  my $timestring = printf("%%02d:%%02d:%%02d",$h,$m,$s);;\
  fhem ("define at_lampTimer at +$timestring set Countdown_slider_aus off");;\
}


Ich raff das einfach nicht wie ich die Werte des Sliders in Form "minutes 30" in die Form für den at Befehl bekomme "00:30:00".
Bekomme immer folgende Fehlermeldung
2015.02.01 11:30:07 1: PERL WARNING: Use of uninitialized value $timestring in concatenation (.) or string at (eval 236314) line 11.
2015.02.01 11:30:07 3: eval: {
  fhem ("delete at_countdown") if (Value("at_countdown") ne "");
  my @min_gesamt = split(" ", $value{"Countdown_slider"});
  my $min = $min_gesamt[1];
  my $sec = $min * 60;
  my $m = int $sec / 60;
  my $s = $sec - ($m * 60);
  my $h = int $m / 60;
  $m = $m - ($h * 60);
  my $timestring = printf("%02d:%02d:%02d",$h,$m,$s);
  fhem ("define at_lampTimer at +$timestring set Countdown_slider_aus off");
}
2015.02.01 11:30:07 1: define at_lampTimer at_lampTimer at + set Countdown_slider_aus off: Wrong timespec : either HH:MM:SS or {perlcode}
2015.02.01 11:30:07 3: define at_lampTimer at + set Countdown_slider_aus off : Wrong timespec : either HH:MM:SS or {perlcode}
2015.02.01 11:30:07 3: nt_Countdown_slider_an return value: Wrong timespec : either HH:MM:SS or {perlcode}


Ich komme einfach nicht weiter, vielleicht hat einer von euch einen kleinen oder großen Denkanstoß.
Titel: Antw:Eieruhr
Beitrag von: mrbreil am 01 Februar 2015, 21:05:59
Ich kann mir bei weitem nicht vorstellen das es so umständlich funktionieren muss, aber leider bin ich kein Programmierer.
Aber wenigsten kann ich ein paar Bedingungen in Fhem schreiben.

Also hier meine "von hinten durch die Brust ins Auge Eieruhr"!

define nt_Countdown_slider_an notify Countdown_slider_an {\
   fhem ("delete at_countdown") if (Value("at_countdown") ne "");;\
   my @@min_gesamt = split(" ", $value{"Countdown_slider"});;\
   my $minn = $min_gesamt[1];;\
   my $abbruch = 0;;\
   if (($minn < 60) && ($abbruch == 0)) {\
     if (($minn <= 5) && ($abbruch == 0)) {\
       fhem ("define at_countdown at +00:0$minn:00 set Countdown_slider_aktion on");;\
       $abbruch = 1;;\
     }\
     if (($minn > 5) && ($abbruch == 0)) {\
       fhem ("define at_countdown at +00:$minn:00 set Countdown_slider_aktion on");;\
       $abbruch = 1;;\
     }\
   }\
   if (($minn >= 60) && ($minn <= 119) && ($abbruch == 0)) {\
     $minn = $minn - 60;;\
     if (($minn <= 5) && ($abbruch == 0)) {\
       fhem ("define at_countdown at +01:0$minn:00 set Countdown_slider_aktion on");;\
       $abbruch = 1;;\
     }\
     if (($minn > 5) && ($abbruch == 0)) {\
       fhem ("define at_countdown at +01:$minn:00 set Countdown_slider_aktion on");;\
       $abbruch = 1;;\
     }\
   }\
   if (($minn >= 120) && ($minn <= 179) && ($abbruch == 0)) {\
     $minn = $minn - 120;;\
     if (($minn <= 5) && ($abbruch == 0)) {\
       fhem ("define at_countdown at +02:0$minn:00 set Countdown_slider_aktion on");;\
       $abbruch = 1;;\
     }\
     if (($minn > 5) && ($abbruch == 0)) {\
       fhem ("define at_countdown at +02:$minn:00 set Countdown_slider_aktion on");;\
       $abbruch = 1;;\
     }\
   }\
   if (($minn == 180) && ($abbruch == 0)) {\
     fhem ("define at_countdown at +03:00:00 set Countdown_slider_aktion on");;\
     $abbruch = 1;;\
   }\
}
Titel: Antw:Eieruhr
Beitrag von: nesges am 02 Februar 2015, 14:01:06
Ich bin nicht ganz durchgestiegen, was deine eigentliche Frage ist. Wenn's um die Umrechnung von Sekunden in einen Timestring geht, ist das hier ganz handlich:

$time = sprintf "+%02d:%02d:%02d", (gmtime($time))[2,1,0]

Funktioniert aber nicht für beliebig große Zahlen, siehe http://www.perlmonks.org/?node_id=101511.