FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: chq am 25 März 2019, 09:14:00

Titel: Einzelne Zweige eines DOIFs per Buttons triggern
Beitrag von: chq am 25 März 2019, 09:14:00
Hallo,

ich würde gerne einzelne Zweige eines DOIFs per Buttons triggern.

Was ich schon kenne ist eine Triggerung per Text.

Z.B. triggert "trigger testDoif run" den Zweig, in dem das hier hinterlegt ist: ["^testDoif$:^run$"]

Für Buttons auf der FHEM-Oberfläche (hier beispielhaft drei Stück) würde ich gerne so verfahren:

webCmd: cmd_1:cmd_2:cmd:3
cmdIcon: cmd_1:scene_cleaning cmd_2:scene_dinner cmd_3:scene_cubby

Die cmd_x-Angaben sind leider noch Platzhalter für das, was mir an Infos noch fehlt.

Wer kann helfen?

Gruß Chris
Titel: Antw:Einzelne Zweige eines DOIFs per Buttons triggern
Beitrag von: Esjay am 25 März 2019, 09:27:39
Sowas wie hier unter Beispiel C?

https://wiki.fhem.de/wiki/DOIF/Einsteigerleitfaden,_Grundfunktionen_und_Erl%C3%A4uterungen

Grüße
Titel: Antw:Einzelne Zweige eines DOIFs per Buttons triggern
Beitrag von: chq am 25 März 2019, 19:14:31
Im Prinzip ja, nur mit dem Unterschied, dass ich keinen Zustand des DOIFs im devStateIcon angezeigt bekommen möchte, sondern lediglich Buttons per cmdIcon erstellen möchte.

Kann man das in Beispiel C Geschriebene (attr di_lamp devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1) auch unter cmdIcon so angeben und falls ja, was könnte ich da anstatt des Zustands angeben (Beispiel: cmd_1:general_an:cmd_2)?

Gruß Chris
Titel: Antw:Einzelne Zweige eines DOIFs per Buttons triggern
Beitrag von: Damian am 25 März 2019, 20:56:21
Zitat von: chq am 25 März 2019, 19:14:31
Im Prinzip ja, nur mit dem Unterschied, dass ich keinen Zustand des DOIFs im devStateIcon angezeigt bekommen möchte, sondern lediglich Buttons per cmdIcon erstellen möchte.

Kann man das in Beispiel C Geschriebene (attr di_lamp devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1) auch unter cmdIcon so angeben und falls ja, was könnte ich da anstatt des Zustands angeben (Beispiel: cmd_1:general_an:cmd_2)?

Gruß Chris

Im DOIF ist folgender Mechanismus eingebaut:

Wenn man den Status über cmdState umbenennt z. B. cmdState on|off und
mit setList die definierten Zustände, hier im Beispiel also on off angibt, dann kommen automatisch beim set-Auswahlmenü die angegebenen Optionen on off hinzu.

Damit kann man den cmd_1/cmd_2-Ausführungzweig entweder über set Modulnamen on/off schalten oder direkt in der Statuszeile wo on off aufgrund der setList-Angabe erscheint.

Man muss in der Bedingung dafür nichts ändern, insbesondere nicht den eigenen Status abfragen. Die Ausführung des jeweiligen Zweiges wird durch Anklicken der setList-Angaben hier on off in der Statuszeile wie beim set-Befehl bedingungslos vorgenommen.
Titel: Antw:Einzelne Zweige eines DOIFs per Buttons triggern
Beitrag von: Eistee am 25 März 2019, 21:39:06
Weiß nicht ob du sowas meinst. Hier mal ein Beispiel welches ich nehme um mich ans Blumen gießen zu erinnern. Mit dem Button setze ich einen Zweig aktiv im DOIF:
defmod xx.Blumen DOIF ([$SELF:reset] and [$SELF:cmd] ne 1)\
( setreading $SELF reset 1,\
  msg Die Blumen wurden gegossen. )\
\
DOELSEIF ([18:00] and [$SELF:reset:sec] >= 604800) \
( msg Bitte die Blumen gießen. )
attr xx.Blumen alias Blumen
attr xx.Blumen cmdState gegossen|gießen
attr xx.Blumen cmdpause 3600:3600
attr xx.Blumen devStateIcon gießen:sani_irrigation@red:gegossen gegossen:sani_irrigation@green:gegossen
attr xx.Blumen do always
attr xx.Blumen group Status
attr xx.Blumen icon hue_room_garden
attr xx.Blumen readingList reset
attr xx.Blumen room 0 Home
attr xx.Blumen setList gegossen reset:1
attr xx.Blumen widgetOverride cmdState:textField-long
Titel: Antw:Einzelne Zweige eines DOIFs per Buttons triggern
Beitrag von: chq am 26 März 2019, 09:31:33
Damin, ich habe mir auch das hier (https://forum.fhem.de/index.php/topic,66153.msg574144.html#msg574144 (https://forum.fhem.de/index.php/topic,66153.msg574144.html#msg574144)) angeschaut, aber auch dort geht es ja ausschließluch um das devStateIcon; ich hätte aber gerne mehrere Icons unter cmdIcon.

Was ich aber möchte sind lediglich mehrere Schalter (Icons) die immer gleich aussehen, über die ich einzelne DOIF-Zweige abrufen kann. Ich dachte immer, dass es sich beim devStateIcon um ein Icon handeln würde. Ist das nicht so?

Auch dieser Teil der Commandref hat mich nicht erleuchtet, da "cool" (siehe list meines testDoifs ganz unten) nicht auf der Oberfläche erscheint:

Wenn mit cmdState eigene Zuständsbezeichnungen definiert werden, so können diese ebenfalls per set-Befehl angegeben werden.

define di_lamp DOIF ([FB:"on"]) (set lamp on) DOELSEIF ([FB:"off"]) (set lamp off)

attr di_lamp cmdState on|off
attr di_lamp setList on off

set di_lamp on entspricht hier set di_lamp cmd_1 und set di_lamp off set di_lamp cmd_2
Zusätzlich führt die Definition von setList zur Ausführung von set di_lamp on/off durch das Anlicken des Lampensymbols wie im vorherigen Beispiel.


Gruß Chris

Internals:
   CFGFN     
   DEF        ([FB:"on"]) ()
DOELSEIF ([FB:"off"]) ()
DOELSEIF ([FB:"cool"]) ()
DOELSEIF ([04:00]) ()
DOELSEIF ([05:00]) ()
   FUUID      5c99df40-f33f-b9fb-8248-904f445106f61c33
   MODEL      FHEM
   NAME       testDoif
   NR         27175
   NTFY_ORDER 50-testDoif
   STATE      on
   TYPE       DOIF
   VERSION    18890 2019-03-13 18:56:41
   READINGS:
     2019-03-26 10:06:40   cmd             1
     2019-03-26 10:06:40   cmd_event       set_on_cmd_1
     2019-03-26 10:06:40   cmd_nr          1
     2019-03-26 10:06:13   mode            enabled
     2019-03-26 10:06:40   state           on
     2019-03-26 10:06:13   timer_01_c04    27.03.2019 04:00:00
     2019-03-26 10:06:13   timer_02_c05    27.03.2019 05:00:00
   Regex:
     accu:
   attr:
     cmdState:
       0:
         on
       1:
         off
       2:
         cool
   condition:
     0          ::EventDoIf('FB',$hash,'on',1)
     1          ::EventDoIf('FB',$hash,'off',1)
     2          ::EventDoIf('FB',$hash,'cool',1)
     3          ::DOIF_time_once($hash,0,$wday)
     4          ::DOIF_time_once($hash,1,$wday)
   days:
   devices:
     0           FB
     1           FB
     2           FB
     all         FB
   do:
     0:
       0         
     1:
       0         
     2:
       0         
     3:
       0         
     4:
       0         
     5:
   helper:
     globalinit 1
     last_timer 2
     sleeptimer -1
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: set_on_cmd_1
       state: on
   intervalfunc:
   itimer:
   localtime:
     0          1553655600
     1          1553659200
   realtime:
     0          04:00:00
     1          05:00:00
   time:
     0          04:00:00
     1          05:00:00
   timeCond:
     0          3
     1          4
   timer:
     0          0
     1          0
   timers:
     3           0
     4           1
   trigger:
     all         FB
   triggertime:
     1553655600:
       localtime  1553655600
       hash:
     1553659200:
       localtime  1553659200
       hash:
   uiState:
   uiTable:
Attributes:
   cmdState   on|off|cool
   room       Zentrale
   setList    on off cool
Titel: Antw:Einzelne Zweige eines DOIFs per Buttons triggern
Beitrag von: Eistee am 26 März 2019, 13:32:53
Ja dann mach doch on und off ins webcmd
Titel: Antw:Einzelne Zweige eines DOIFs per Buttons triggern
Beitrag von: Damian am 26 März 2019, 14:38:42
setList ist ein vererbtes Attribut von fhem, die Funktionalität wird im DOIF zur Verfügung gestellt, was geht und was nicht geht wird nicht von DOIF entschieden.

Eigentlich reicht zu cmdState on|off|cool

die Definiton von webCmd on:off:cool

um die Punkte in der Statuszeile anzeigen zu lassen und durch Anklicken den entsprechenden DOIF-Zweig auszuführen.

setList sowie ReadingList braucht gar nicht erst definiert zu werden.
Titel: Antw:Einzelne Zweige eines DOIFs per Buttons triggern
Beitrag von: Eistee am 26 März 2019, 15:03:29
Naja es geht auch ohne setlist aber ein DOIF beinhaltet ja alles was ein DUMMY kann. Daher ist das schon sinvoll wenn man sich das DOIF noch hübsch bedienbar machen möchte. Ich habe z.B. für meine Waschmaschine ein DOIF welches auch die waschvorgänge in einem reading mit zählt. Man muss ja nich alles in 5 DUMMYs packen nur weil man nicht versteht das DOIF das alles schon kann und mitbringt.
Titel: Antw:Einzelne Zweige eines DOIFs per Buttons triggern
Beitrag von: Damian am 26 März 2019, 19:13:33
Zitat von: Eistee am 26 März 2019, 15:03:29
Naja es geht auch ohne setlist aber ein DOIF beinhaltet ja alles was ein DUMMY kann. Daher ist das schon sinvoll wenn man sich das DOIF noch hübsch bedienbar machen möchte. Ich habe z.B. für meine Waschmaschine ein DOIF welches auch die waschvorgänge in einem reading mit zählt. Man muss ja nich alles in 5 DUMMYs packen nur weil man nicht versteht das DOIF das alles schon kann und mitbringt.

Natürlich, es macht keinen Sinn Dummys zu definieren, um sie im DOIF abzufragen. ReadingList und setList sind insbesondere interessant, wenn man eigene Readings im DOIF definieren und über die Statusleiste des DOIFs! schalten möchte. Wenn es nur darum geht, einzelne Ausführungszweige des DOIFs ausführen zu lassen ohne dabei auf die Bedingung zu achten, reicht, wie ich vorhin getestet habe, cmdState und webCmd zu setzen. Die Bezeichnungen müssen namentlich übereinstimmen.

Noch eleganter mit viel mehr Möglichkeiten bietet DOIF über das Attribut uiTable. Im Anhang ist ein DOIF mit Zeitsteuerung des Lichtes und passenden Icons der zugehörigen Lampen, die man nicht nur mit Ihrem Status visualisieren, sondern durch Anklicken auch schalten kann.
Titel: Antw:Einzelne Zweige eines DOIFs per Buttons triggern
Beitrag von: amenomade am 26 März 2019, 19:37:53
Erstaunlich, alles was DOIF kann! Dank dem DOIF kriegt sogar der Goldfisch Licht in seiner Schüssel.  ;) :P Aber nur wenn die Tür auf ist, und der Topf nicht kocht.
Titel: Antw:Einzelne Zweige eines DOIFs per Buttons triggern
Beitrag von: Damian am 26 März 2019, 19:50:24
Zitat von: amenomade am 26 März 2019, 19:37:53
Erstaunlich, alles was DOIF kann! Dank dem DOIF kriegt sogar der Goldfisch Licht in seiner Schüssel.  ;) :P Aber nur wenn die Tür auf ist, und der Topf nicht kocht.

Naja, das war ja nur ein DOIF als kleiner Ausschnitt des Ganzen, hier sind alle 7 DOIFs, die ja nicht nur steuern, sondern auch visualisieren und über WEB-Oberfläche schalten können.
Titel: Antw:Einzelne Zweige eines DOIFs per Buttons triggern
Beitrag von: amenomade am 26 März 2019, 20:22:36
Es fehlt nur noch das FTUI Widget, um das ganze in TabletUI zu übertragen ;)
Titel: Antw:Einzelne Zweige eines DOIFs per Buttons triggern
Beitrag von: chq am 26 März 2019, 20:34:48
Danke Damian, Antwort #7 war sehr hilfreich. :)

Ich hab jetzt fünf Buttons definiert:

cmdState: alles|esszimmer|speisekammer|rausfahren|laden
setList: alles esszimmer speisekammer rausfahren laden
webCmd: alles:esszimmer:speisekammer:rausfahren:laden
cmdIcon: alles:control_building_empty esszimmer:scene_dinner speisekammer:scene_cubby reinigung:dustbin rausfahren:vacuum_top laden:message_socket

Wie kann ich nun als Letztes noch unterbinden, dass mir der zuletzt gewählte Befehl in Textform jeweils links neben den Buttons angezeigt wird?

Ist das praktisch das devStateIcon, was man da sieht?

Gruß Chris
Titel: Antw:Einzelne Zweige eines DOIFs per Buttons triggern
Beitrag von: Damian am 26 März 2019, 20:47:00
Zitat von: amenomade am 26 März 2019, 20:22:36
Es fehlt nur noch das FTUI Widget, um das ganze in TabletUI zu übertragen ;)

Wir haben bewusst die Schnittstelle zu FHEM-Widgets und nicht zu TabletUI gewählt, um das Modul schlank und performant zu halten.
Titel: Antw:Einzelne Zweige eines DOIFs per Buttons triggern
Beitrag von: Damian am 26 März 2019, 22:04:06
Zitat von: chq am 26 März 2019, 20:34:48
Danke Damian, Antwort #7 war sehr hilfreich. :)

Ich hab jetzt fünf Buttons definiert:

cmdState: alles|esszimmer|speisekammer|rausfahren|laden
setList: alles esszimmer speisekammer rausfahren laden
webCmd: alles:esszimmer:speisekammer:rausfahren:laden
cmdIcon: alles:control_building_empty esszimmer:scene_dinner speisekammer:scene_cubby reinigung:dustbin rausfahren:vacuum_top laden:message_socket

Wie kann ich nun als Letztes noch unterbinden, dass mir der zuletzt gewählte Befehl in Textform jeweils links neben den Buttons angezeigt wird?

Ist das praktisch das devStateIcon, was man da sieht?

Gruß Chris

Ich weiß nicht, was du für einen Link meinst. Wenn die Symbole existieren, dann werden entsprechende Symbole dargestellt - zumindest ist es bei mir so.

Warum hast du denn jetzt wieder das Attribut setList definiert? Dass man es für diese Funktionalität nicht benötigt, habe ich ja bereits schon geschrieben.

Edit: Eventuell entspricht der angezeigte Begriff einem FHEM-Device, daher der Link
Titel: Antw:Einzelne Zweige eines DOIFs per Buttons triggern
Beitrag von: chq am 27 März 2019, 12:09:36
Was Du mit Link meinst verstehe ich wiederum nicht.  ::)

Auch wenn ich setList entferne, bekomme ich trotzdem den jeweils zuletzt hinterlegten Button als Text links neben den Buttons angezeigt (siehe Bild). Mitterweile ist es zwar ein Button mehr, aber das Problem ist natürlich noch das selbe. Ansonsten passt das so für mich-. super. Danke vielmals!  :)

Gruß Chris

Titel: Antw:Einzelne Zweige eines DOIFs per Buttons triggern
Beitrag von: Ellert am 28 März 2019, 17:36:16
Zitat von: amenomade am 26 März 2019, 20:22:36
Es fehlt nur noch das FTUI Widget, um das ganze in TabletUI zu übertragen ;)
Es ist möglich das readingsGroup-Widget (https://wiki.fhem.de/wiki/FTUI_Widget_Readingsgroup) zu nutzen, um uiTable anzuzeigen.