[gelöst] DOIF - Wiederholung eines Unterprogramms

Begonnen von grossmaggul, 24 Januar 2019, 18:36:52

Vorheriges Thema - Nächstes Thema

grossmaggul

Hallo,

irgendwie stecke ich fest, ich habe mir ein Unterprogramm gebaut mit dem mein Wifilight RGBW LED Streifen, wenn er eingeschaltet wird, langsam durchs Farbspektrum läuft, das klappt auch.
Allerdings wird das Programm natürlich nur einmal durchlaufen. Setze ich DOIF auf "do always" läuft das Programm zwar dauernd durch, allerdings auch dann, wenn ich den LED Streifen ausschalte.
Das Unterprogramm ist eine Aneinanderreihung von mehreren "for"-Schleifen.

Mein DOIF sieht so aus:

Zitat([wz.theke] eq "on")

{spektralDurchlauf();}

Wie kann ich das Problem lösen, ich habe mich jetzt schon durch's halbe Internet gelesen, aber irgendwie stehe ich heftigst auf dem Schlauch.
Möglicherweise ist DOIF ja auch gar nicht der richtige Ansatz.

Vielleicht kann mir jemand einen Schubser in die richtige Richtung geben.

gm
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1

Damian

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

grossmaggul

Here it comes:

Internals:
   DEF        ([wz.theke] eq "on")


{

   spektralDurchlauf();
 
}

   FUUID      5c49b404-f33f-f310-d32a-adc91a1a7ec816d3
   MODEL      FHEM
   NAME       wz.theke_spektral_lauf
   NR         209
   NTFY_ORDER 50-wz.theke_spektral_lauf
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2019-01-24 19:46:52   Device          wz.theke
     2019-01-24 18:24:56   cmd             1
     2019-01-24 18:24:56   cmd_event       wz.theke
     2019-01-24 18:24:56   cmd_nr          1
     2019-01-24 19:46:52   e_wz.theke_STATE on
     2019-01-24 18:21:59   last_cmd        cmd_1
     2019-01-24 18:24:46   mode            enabled
     2019-01-24 18:24:56   state           cmd_1
   Regex:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::InternalDoIf($hash,'wz.theke','STATE') eq "on"
   devices:
     0           wz.theke
     all         wz.theke
   do:
     0:
       0          {      spektralDurchlauf();    }
     1:
   helper:
     event      programm: colorchange 100
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   wz.theke
     timerevent programm: colorchange 100
     triggerDev wz.theke
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: wz.theke
       state: cmd_1
     timerevents:
       programm: colorchange 100
     timereventsState:
       programm: colorchange 100
     triggerEvents:
       programm: colorchange 100
     triggerEventsState:
       programm: colorchange 100
   internals:
     0           wz.theke:STATE
     all         wz.theke:STATE
   itimer:
   perlblock:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   group      Licht
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1

Damian

Also, nach dieser Definition kann er im cmd_2-Fall nichts ausführen, weil nichts definiert ist. Und cmd_1 wird nur ausgeführt, wenn die Bedingung wahr ist, das ist so sicher wie das Amen in der Kirche ;)

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

grossmaggul

Jetzt müsste ich nur noch verstehen, was Du mir damit sagen willst. :(

Ich habe mir die DOIF Commandref jetzt schon einige Male durchgelesen, ich fürchte mein "Intellekt" reicht nicht aus um da durchzusteigen. :-\
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1

Frank_Huber

stochwort: repeatcmd.

Aber: wie machst es wieder aus? Dieses doif macht das nicht.

Gesendet von meinem Doogee S60 mit Tapatalk


Damian

Zitat von: grossmaggul am 24 Januar 2019, 22:30:47
Jetzt müsste ich nur noch verstehen, was Du mir damit sagen willst. :(

Ich habe mir die DOIF Commandref jetzt schon einige Male durchgelesen, ich fürchte mein "Intellekt" reicht nicht aus um da durchzusteigen. :-\

Wenn [wz.theke] eq "off" ist, dann kann dieses DOIF deine Funktion nicht ausführen.

Was du noch machen kannst, ist ([wz.theke:state] eq "on") definieren. Dann wird die Bedingung nur geprüft, wenn sich der Status ändert.



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

grossmaggul

ZitatAber: wie machst es wieder aus? Dieses doif macht das nicht.
Ja, das ist ja mein Problem.

Könnte man denn repeatcmd auch ([wz.theke:state] eq "on") übergeben, zumindest habe ich das so verstanden.

ZitatWas du noch machen kannst, ist ([wz.theke:state] eq "on") definieren. Dann wird die Bedingung nur geprüft, wenn sich der Status ändert.
O.K., aber wie sage ich dann dem Unterprogramm es soll seinen Dienst einstellen, das ist doch das Problem, oder?
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1

Damian

Also, wenn spektralDurchlauf() aufgerufen wird, dann läuft es durch und beendet sich doch von selbst - hoffe ich.

Du musst nur schauen, dass es nur dann aufgerufen wird, wenn du es willst und sonst nicht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

grossmaggul

ZitatAlso, wenn spektralDurchlauf() aufgerufen wird, dann läuft es durch und beendet sich doch von selbst - hoffe ich.
Ja, das tut es und ist eigentlich auch Teil des Problems, es soll ja ständig durchlaufen, bis ich den LED Streifen ausschalte.

ZitatDu musst nur schauen, dass es nur dann aufgerufen wird, wenn du es willst und sonst nicht.
Ja, schon klar, das ist ja mein Problem, ich habe bisher keine Lösung gefunden.:-(
Ich werde es wohl jetzt erstmal so machen, daß ich das Programm über ein at starte alle paar Minuten starte, mal sehen ob ich das wenigstens hinbekomme.
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1

Byte09

moin,

bevor ich mich damit beschäftige , soll es in jedem fall per DOIF gelöst werden ?

falls nicht , zieg mir doch bitt mal das aufzurufende Unterprogramm 'spektralDurchlauf();'

gruss Byte09

grossmaggul

Zitatsoll es in jedem fall per DOIF gelöst werden ?
Nein, das muß nicht, ich bin offen für jede andere Lösung, die funktioniert.
Ich hatte auch schonmal versucht im Unterprogramm eine do/until Schleife zu setzen, dann wird aber bei Ausführung fhem blockiert.:-/


Das Unterprogramm:

###############################################################################
#
#  Spektraldurchlauf LED Streifen
#
###############################################################################

sub spektralDurchlauf()
{
  my $rot;
  my $gruen;
  my $blau;
 
  my $rgb;
  my $count;

   
   # GELB - Grünwert erhöhen (FF0000 -> FFFF00)
   for($count=0;$count<=255;$count++)
    {

    # Rotwert erhöhen
    $gruen = sprintf ("%02x", $count);
 
    #in RGB Wert wandeln
    $rgb = sprintf "FF${gruen}00";
 
    # Farbe in LEDs setzen
    fhem("set wz.theke RGB $rgb");
 
   }
   
   # GRÜN - Rotwert erniedrigen (FFFF00 -> 00FF00)
   for($count=255;$count>=0;$count--)
    {

    # Rotwert verringern
    $rot = sprintf ("%02x", $count);
 
    #in RGB Wert wandeln
    $rgb = sprintf "${rot}FF00";
 
    # Farbe in LEDs setzen
    fhem("set wz.theke RGB $rgb");
 
   }
   
   
   # CYAN - Blauwert erhöhen (00FF00 -> 00FFFF)
   for($count=0;$count<=255;$count++)
    {

    # Blauwert erhöhen
    $blau = sprintf ("%02x", $count);
 
    #in RGB Wert wandeln
    $rgb = sprintf "00FF${blau}";
 
    # Farbe in LEDs setzen
    fhem("set wz.theke RGB $rgb");
 
   
   }
   
   # BLAU - Grünwert verringern (00FFFF -> 0000FF)
   for($count=255;$count>=0;$count--)
    {

    # Grünwert verringern
    $gruen = sprintf ("%02x", $count);
 
    #in RGB Wert wandeln
    $rgb = sprintf "00${gruen}FF";
 
    # Farbe in LEDs setzen
    fhem("set wz.theke RGB $rgb");
 
   
   }


   # MAGENTA - Rotwert erhöhen (0000FF -> FF00FF)
   for($count=0;$count<=255;$count++)
    {

    # Rotwert erhöhen
    $rot = sprintf ("%02x", $count);
 
    #in RGB Wert wandeln
    $rgb = sprintf "${rot}00FF";
 
    # Farbe in LEDs setzen
    fhem("set wz.theke RGB $rgb");
 
   }

# ROT - Blauwert verringern (FF00FF -> FF0000)
    for($count=255;$count>=0;$count--)
    {

    # Rotwert erhöhen
    $blau = sprintf ("%02x", $count);
 
    #in RGB Wert wandeln
    $rgb = sprintf "FF00${blau}";
 
    # Farbe in LEDs setzen
    fhem("set wz.theke RGB $rgb");
 
   }
   


Möglicherweise könnte man das effizienter programmieren, ich bin allerdings noch perl Anfänger, deshalb so.:-)
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1

Byte09

Zitat von: grossmaggul am 25 Januar 2019, 11:22:34
Nein, das muß nicht, ich bin offen für jede andere Lösung, die funktioniert.
Ich hatte auch schonmal versucht im Unterprogramm eine do/until Schleife zu setzen, dann wird aber bei Ausführung fhem blockiert.:-/


Das Unterprogramm:

###############################################################################
#
#  Spektraldurchlauf LED Streifen
#
###############################################################################

sub spektralDurchlauf()
{
  my $rot;
  my $gruen;
  my $blau;
 
  my $rgb;
  my $count;

   
   # GELB - Grünwert erhöhen (FF0000 -> FFFF00)
   for($count=0;$count<=255;$count++)
    {

    # Rotwert erhöhen
    $gruen = sprintf ("%02x", $count);
 
    #in RGB Wert wandeln
    $rgb = sprintf "FF${gruen}00";
 
    # Farbe in LEDs setzen
    fhem("set wz.theke RGB $rgb");
 
   }
   
   # GRÜN - Rotwert erniedrigen (FFFF00 -> 00FF00)
   for($count=255;$count>=0;$count--)
    {

    # Rotwert verringern
    $rot = sprintf ("%02x", $count);
 
    #in RGB Wert wandeln
    $rgb = sprintf "${rot}FF00";
 
    # Farbe in LEDs setzen
    fhem("set wz.theke RGB $rgb");
 
   }
   
   
   # CYAN - Blauwert erhöhen (00FF00 -> 00FFFF)
   for($count=0;$count<=255;$count++)
    {

    # Blauwert erhöhen
    $blau = sprintf ("%02x", $count);
 
    #in RGB Wert wandeln
    $rgb = sprintf "00FF${blau}";
 
    # Farbe in LEDs setzen
    fhem("set wz.theke RGB $rgb");
 
   
   }
   
   # BLAU - Grünwert verringern (00FFFF -> 0000FF)
   for($count=255;$count>=0;$count--)
    {

    # Grünwert verringern
    $gruen = sprintf ("%02x", $count);
 
    #in RGB Wert wandeln
    $rgb = sprintf "00${gruen}FF";
 
    # Farbe in LEDs setzen
    fhem("set wz.theke RGB $rgb");
 
   
   }


   # MAGENTA - Rotwert erhöhen (0000FF -> FF00FF)
   for($count=0;$count<=255;$count++)
    {

    # Rotwert erhöhen
    $rot = sprintf ("%02x", $count);
 
    #in RGB Wert wandeln
    $rgb = sprintf "${rot}00FF";
 
    # Farbe in LEDs setzen
    fhem("set wz.theke RGB $rgb");
 
   }

# ROT - Blauwert verringern (FF00FF -> FF0000)
    for($count=255;$count>=0;$count--)
    {

    # Rotwert erhöhen
    $blau = sprintf ("%02x", $count);
 
    #in RGB Wert wandeln
    $rgb = sprintf "FF00${blau}";
 
    # Farbe in LEDs setzen
    fhem("set wz.theke RGB $rgb");
 
   }
   


Möglicherweise könnte man das effizienter programmieren, ich bin allerdings noch perl Anfänger, deshalb so.:-)

hmm, ich habe das gerade mal mit dummys nachgestellt. der aufruf der sub blockiert bei mir bei einmaligem anruf fhem schon für ca. 9 sekunden.

ich schaue mal , wie ich das umsetzen würde. dauert aber einen moment

gruss Byte09

grossmaggul

Zitatder aufruf der sub blockiert bei mir bei einmaligem anruf fhem schon für ca. 9 sekunden.
Bei mir nicht, wenn ich es direkt per DOIF starte.

Zitatdauert aber einen moment
Macht nix, ich hab Zeit.;)
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1

Byte09

Zitat von: grossmaggul am 25 Januar 2019, 11:56:18
Bei mir nicht, wenn ich es direkt per DOIF starte.
Macht nix, ich hab Zeit.;)


also, kann sein , dass ich das jetzt auch nicht optimal angehe, wäre aber mein ansatz - diesen habe ich auch getestet.

die ganze unterroutine würde ich erstmal nonblocking aufrufen. https://wiki.fhem.de/wiki/Blocking_Call

( edit :

ZitatBei mir nicht, wenn ich es direkt per DOIF starte.

dann tut DIOF das wohl sowieso schon )


in meinem hilfsmodul ( welches auch immer )  würde ich den rückgabewert nutzen , um die routine erneut zu starten , aber nur dann , wenn der state von wz.theke noch on ist.

wie das konkret in einem DOIF umzusetzen ist weiss ich leider nicht , da ich es nicht nutze. wenn du es versuchen willst könnte ich dir das aber in einem MSwitch bauen . Da könntest du in der Ansicht des MSwitches selber relativ gut einsehen , wie es funktioniert.

gruss Byte09