Einzelne Zweige eines DOIFs per Buttons triggern

Begonnen von chq, 25 März 2019, 09:14:00

Vorheriges Thema - Nächstes Thema

chq

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
So einfach wie möglich, so kompliziert wie nötig


chq

#2
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
So einfach wie möglich, so kompliziert wie nötig

Damian

#3
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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Eistee

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

chq

#5
Damin, ich habe mir auch das hier (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
So einfach wie möglich, so kompliziert wie nötig

Eistee


Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Eistee

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.

Damian

#9
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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

amenomade

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.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

amenomade

Es fehlt nur noch das FTUI Widget, um das ganze in TabletUI zu übertragen ;)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

chq

#13
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
So einfach wie möglich, so kompliziert wie nötig

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF