Hauptmenü

Repeat-Funktion

Begonnen von flurin, 01 Mai 2015, 12:30:44

Vorheriges Thema - Nächstes Thema

flurin

Die Aufgabenstellung ist meistens einfach, jedoch ist die Umsetzung oft umständlich.
Mit der Repeat-Funktion soll es einfacher werden:

Aufgabe:

Starte einen Befehl auf Grund eines Events sofort und nach einem Interval x mal.

Lösung:

Die Repeat-Funktion in 99_myUtils.pm einfügen.


# use {set_repeat_time("du_repeat","du_interval")}
# return none
sub set_repeat_time($$)
{
  my ($du_repeat,$du_interval) = @_;
   
  my $interval = Value($du_interval);
  my $repeat = Value($du_repeat);
 
  my $count = ReadingsVal($du_repeat,"count","0") + 1;
 
  if ($count >= $repeat) {
    fhem("setreading $du_repeat count 0");
    return;
  } else {
    fhem("setreading $du_repeat count $count");
  }
 
  my ($sec,$min,$hour) = localtime(time);
  my $now = $hour*3600 + $min*60 + $sec;
   
  my $r_time = $now + $interval;
  my $r_hour = int($r_time/3600);
  my $r_min = int(($r_time - $r_hour*3600)/60);
  my $r_sec = $r_time - $r_hour*3600 - $r_min*60;
 
  my $repeat_time = sprintf("%02d:%02d:%02d",$r_hour,$r_min,$r_sec);
  fhem("setreading $du_repeat time $repeat_time");
}


Definiere die Dummies:


define du_event dummy
attr du_event setList on off

define du_interval dummy
set du_interval 60

define du_repeat dummy
set du_repeat 3


Interval in Sekunden.

DOIF:

define di_repeat_cmd DOIF ([du_event:?on] or ([[du_repeat:time]] and [du_event] eq "on"))
({Log(3,"di_repeat_cmd")},
{set_repeat_time("du_repeat","du_interval")})
attr di_repeat_cmd do always


Gruss
flurin

Edit:

Um eine Fehlermeldung zu vermeiden, folgenden Befehl im FHEM-Eingabefeld vor der DOIF-Definition eingeben:


setreading du_repeat time 00:00

rudolfkoenig

Ich verstehe noch nicht die Vorteile gegenueber einem:
define n1 notify do_event:on set GERAET on;; defmod a1 at +{3}00:01 set GERAET on

oder gar
define n1 notify do_event:on set GERAET blink 3 30

flurin

Zitat von: rudolfkoenig am 01 Mai 2015, 12:54:51
Ich verstehe noch nicht die Vorteile gegenueber einem:
define n1 notify do_event:on set GERAET on;; defmod a1 at +{3}00:01 set GERAET on

oder gar
define n1 notify do_event:on set GERAET blink 3 30


Grundsätzlich verwende ich auch sowohl "notify" wie auch "at". Die Module sind einfach zu definieren und das gefällt mir.
Einige Anwender wie ich auch verwenden DOIF, weil das Modul einen grösseren Funktionsumfang bietet und Lösungen erlaubt, die mit anderen Modulen IMHO nicht möglich wären. Bei DOIF kann ich beispielsweise indirekte Zeitangaben sowie Werte aus einem Dummy in einer Bedingung einbauen. Diese Parameter können im Frontend definiert und verändert werden.