[fixed, inc Lösung] DOIF probleme als statemachine

Begonnen von bofhbug, 14 August 2018, 16:49:31

Vorheriges Thema - Nächstes Thema

bofhbug

Hallo zusammen,

ich komme mit dem syntax hier einfach nicht weiter.

zwei fragen:

1. kann ich bei DOIF nur 4 verschiedene zustaende haben?
und

2. seht ihr hier den fehler warum beide DOIF sich trozdem beinflussen?



define button_CUL868mod dummy
attr button_CUL868mod alias CUL868modTaster
attr button_CUL868mod group Labor: Mehrfachnutzung eines Tasters
attr button_CUL868mod room DOIF_Labor
attr button_CUL868mod setList short long
attr button_CUL868mod webCmd short:long

define schrittSchalter_CUL868mod DOIF ## 1 \
(["button_CUL868mod:short"] and $cmd=~"0|4") \
   ({fhem"set CUL868 raw Nr1"})\
## 2\
DOELSEIF (["button_CUL868mod:short"] and $cmd==1) \
   ({fhem"set CUL868 raw Nr2"})\
## 3\
DOELSEIF (["button_CUL868mod:short"] and $cmd==2) \
   ({fhem"set CUL868 raw Nr3"})\
## 4\
DOELSEIF (["button_CUL868mod:short"] and $cmd==3) \
   ({fhem"set CUL868 raw X25"})
attr schrittSchalter_CUL868mod alias CUL868modSWTICH
attr schrittSchalter_CUL868mod cmdState Nr1 Schritt 1|raw Nr2 Schritt 2|raw Nr3 Schritt 3|X25 Schritt 4
attr schrittSchalter_CUL868mod group Labor: Mehrfachnutzung eines Tasters
attr schrittSchalter_CUL868mod room DOIF_Labor
define a1 at +*00:01:00 set button_CUL868mod short



define button_CUL868mod2 dummy
attr button_CUL868mod2 alias CUL868mod2Taster2
attr button_CUL868mod2 group Labor2: Mehrfachnutzung eines Tasters
attr button_CUL868mod2 room DOIF_Labor
attr button_CUL868mod2 setList short2 long2
attr button_CUL868mod2 webCmd short2:long2

define schrittSchalter_CUL868mod2 DOIF ## 1 \
(["button_CUL868mod2:short2"] and $cmd=~"0|4") \
   ({fhem"set CUL868 raw X61"})\
## 2\
DOELSEIF (["button_CUL868mod2:short2"] and $cmd==1) \
   ({fhem"set CUL868 raw X25"})\
## 3\
DOELSEIF (["button_CUL868mod2:short2"] and $cmd==2) \
   ({fhem"set CUL868 raw X2F"})\
## 4\
DOELSEIF (["button_CUL868mod2:short2"] and $cmd==3) \
   ({fhem"set CUL868 raw X80"})
attr schrittSchalter_CUL868mod2 alias CUL868mod2SWTICH
attr schrittSchalter_CUL868mod2 cmdState X61 Step s1|X25 Step s2|raw X2F Step s3|raw X80 Step s4
attr schrittSchalter_CUL868mod2 group Labor2: Mehrfachnutzung eines Tasters
attr schrittSchalter_CUL868mod2 room DOIF_Labor
define a2 at +*00:01:00 set button_CUL868mod2 short2

Damian

Zitat von: bofhbug am 14 August 2018, 16:49:31
Hallo zusammen,

ich komme mit dem syntax hier einfach nicht weiter.

zwei fragen:

1. kann ich bei DOIF nur 4 verschiedene zustaende haben?
und

wie kommst du darauf? Die Anzahl der DOIF-Zweige ist unbegrenzt.

Zitat2. seht ihr hier den fehler warum beide DOIF sich trozdem beinflussen?

ja, "button_CUL868mod:short" reagiert auf alles was short im Event beinhaltet insb. short2.

Wenn es genau "short" sein soll, dann musst du in der Regex den Anfang und das Ende des Events definieren.

"button_CUL868mod:^short$"

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

Ellert

Und statt beispielsweise ({fhem"set CUL868 raw Nr1"}) reicht es (set CUL868 raw Nr1) anzugeben.

bofhbug

ah die bedingung ist inclusive,
DANKE das hat zum verstaendnis schon sehr geholfen.
(in dem fall kann ich einfach umbauen so das ich es ohne komplexere Regex regeln machen kann.)

ich hatte den eindruck das es begrenzt ist weil das hier bei mir nicht "einladbar" ist
(im FHEMWEB-Frontend über Raw definition importiert).




define button_CUL868mod dummy
attr button_CUL868mod alias CUL868modTaster
attr button_CUL868mod group Labor: Mehrfachnutzung eines Tasters
attr button_CUL868mod room DOIF_Labor
attr button_CUL868mod setList short long
attr button_CUL868mod webCmd short:long

define schrittSchalter_CUL868mod DOIF ## 1 \
(["button_CUL868mod:short"] and $cmd=~"0|8") \
   ({fhem"set CUL868 raw Nr1"})\
## 2\
DOELSEIF (["button_CUL868mod:short"] and $cmd==1) \
   ({fhem"set CUL868 raw Nr2"})\
## 3\
DOELSEIF (["button_CUL868mod:short"] and $cmd==2) \
   ({fhem"set CUL868 raw Nr3"})\
## 4\
DOELSEIF (["button_CUL868mod:short"] and $cmd==3) \
   ({fhem"set CUL868 raw X61"})
## 5\
DOELSEIF (["button_CUL868mod:short"] and $cmd==4) \
   ({fhem"set CUL868 raw X25"})
## 6\
DOELSEIF (["button_CUL868mod:short"] and $cmd==5) \
   ({fhem"set CUL868 raw X2F"})
## 7\
DOELSEIF (["button_CUL868mod:short"] and $cmd==6) \
   ({fhem"set CUL868 raw X80"})
## 8\
DOELSEIF (["button_CUL868mod:short"] and $cmd==7) \
   ({fhem"set CUL868 raw X21"})
attr schrittSchalter_CUL868mod alias CUL868modSWTICH
attr schrittSchalter_CUL868mod cmdState raw Nr1 Schritt 1|raw Nr2 Schritt 2|raw Nr3 Schritt 3|raw X61 Schritt 4|X25 Schritt 5|raw X2F Schritt 6|raw X80 Schritt 7|raw X21 Schritt 8
attr schrittSchalter_CUL868mod room DOIF_Labor
define a1 at +*00:01:00 set button_CUL868mod short


Ellert


Damian

So etwas ist mit der neuen DOIF-Version ein Zweizeiler :)

defmod schrittSchalter DOIF init {@{$_a}=qw/Nr1 Nr2 Nr3 X61 X25 X2F X80 X21/;;$_counter=0}\
main {if (["button_CUL868mod:short"]) {fhem"set CUL868 raw $_a[$_counter++]";; $_counter=($_counter==@{$_a} ? 0:$_counter)}}


siehe https://forum.fhem.de/index.php/topic,84969.msg822560.html#msg822560
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Hier noch mal eine kommentierte Version, für Leute, die verstehen wollen, was da passiert (sieht ja alles etwas anders aus als gewohnt :)
defmod schrittSchalter DOIF init {            # der Block init wird ausgeführt, wenn das FHEM-System hochgefahren wird bzw. zum Definitionszeitpunkt des DOIFs
  @{$_a}=qw/Nr1 Nr2 Nr3 X61 X25 X2F X80 X21/; # ein Array namens $_a wird mit Werten vorbelegt, dieses Array ist global im definierten DOIF verfügbar
  $_counter=0;                                # die Instanzvariable $_counter wird vorbelegt, sie ist ebenfalls innerhalb des DOIF global verfügbar
}

main {                                        # dieser Block namens main (Name ist willkürlich), wird ausgeführt, wenn ["button_CUL868mod:short"] triggert
if (["button_CUL868mod:short"]) {
  fhem"set CUL868 raw $_a[$_counter++]";      # der set-Befehl wird mit dem aktuellen Wert des Arrays ausgeführt, gleichzeitig wird die Laufvariable $_counter um eins erhöht, damit beim nächsten mal der nächste Wert des Arrays genommen wird
  $_counter=($_counter==@{$_a} ? 0:$_counter);# hier wird geprüft, ob der Counter schon den letzten Wert des Arrays erreicht hat (Größe des Arrays wird mit @{$_a} abgefragt), wenn ja, beginne wieder bei Null
}
}


Für Perlprogrammierer ist lediglich die Angabe ["button_CUL868mod:short"] ungewohnt, dafür kennen sich damit DOIF-Anwender gut aus :)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Im "alten" Modus könnte man auch so schreiben:
define schrittSchalter_CUL868mod DOIF ## 1 \
(["button_CUL868mod:short"] and ([?$SELF:cmd]%8 == 0) \
   (set CUL868 raw Nr1) \
## 2\
DOELSEIF ([?$SELF:cmd] == 1) \
   (set CUL868 raw Nr2) \
## 3\
DOELSEIF ([?$SELF:cmd] == 2) \
   (set CUL868 raw Nr3) \
## 4\
DOELSEIF ([?$SELF:cmd] == 3) \
   (set CUL868 raw X61) \
## 5\
DOELSEIF ([?$SELF:cmd] == 4) \
   (set CUL868 raw X25) \
## 6\
DOELSEIF ([?$SELF:cmd] == 5) \
   (set CUL868 raw X2F) \
## 7\
DOELSEIF ([?$SELF:cmd] == 6) \
   (set CUL868 raw X80) \
## 8\
DOELSEIF ([?$SELF:cmd] == 7) \
   (set CUL868 raw X21)
attr schrittSchalter_CUL868mod checkall event


oder:
define schrittSchalter_CUL868mod DOIF \
## 1\
DOIF (0) \
   (set CUL868 raw Nr1) \
## 2\
DOELSEIF (0) \
   (set CUL868 raw Nr2) \
## 3\
DOELSEIF (0) \
   (set CUL868 raw Nr3) \
## 4\
DOELSEIF (0) \
   (set CUL868 raw X61) \
## 5\
DOELSEIF (0) \
   (set CUL868 raw X25) \
## 6\
DOELSEIF (0) \
   (set CUL868 raw X2F) \
## 7\
DOELSEIF (0) \
   (set CUL868 raw X80) \
## 8\
DOELSEIF (0) \
   (set CUL868 raw X21) \
## all\
DOELSEIF (["button_CUL868mod:short"]) (set $SELF ([?$SELF:cmd]%8 + 1)





Der neue Perl-Mode ist zwar für Perler ok, aber eigentlich hätte es auch ein separates Modul sein können/dürfen/müssen.

Damian

Zitat von: Per am 15 August 2018, 12:12:01
Der neue Perl-Mode ist zwar für Perler ok, aber eigentlich hätte es auch ein separates Modul sein können/dürfen/müssen.
Ein neues Modul hätte möglicherweise mehr Aufmerksamkeit bekommen. Ein Modul ist allerdings für mich einfacher zu pflegen als zwei. Es fehlen noch konkrete Anwendungsbeispiele, die werde ich im Laufe der Zeit immer wieder veröffentlichen. Es gibt genügend Anwendungen, für die sich die Programmierung eines eigenen Moduls nicht lohnt, deren Komplexität aber zu hoch ist, um sie im FHEM-Modus elegant abzubilden.

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

bofhbug

Danke dafur, so ist das doch mal logisch, wer/ wie kann das ins Wiki eintragen?

Zitat von: Damian am 14 August 2018, 19:02:54
So etwas ist mit der neuen DOIF-Version ein Zweizeiler :)

defmod schrittSchalter DOIF init {@{$_a}=qw/Nr1 Nr2 Nr3 X61 X25 X2F X80 X21/;;$_counter=0}\
main {if (["button_CUL868mod:short"]) {fhem"set CUL868 raw $_a[$_counter++]";; $_counter=($_counter==@{$_a} ? 0:$_counter)}}


siehe https://forum.fhem.de/index.php/topic,84969.msg822560.html#msg822560


Damian

Zitat von: bofhbug am 16 August 2018, 11:46:03
Danke dafur, so ist das doch mal logisch, wer/ wie kann das ins Wiki eintragen?

Wenn ich wieder Zeit finde, dann werde ich allgemeingültige Anwendungsbeispiele ins Wiki einstellen.

Dein Fall ist, denke ich, recht speziell, aber stufenweises Dimmen könnte man z. B. so realisieren. Zuerst muss ich aber erst die aktuelle DOIF-Version einchecken, wenn ich aus dem Urlaub komme.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

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