Mehrfachbelegung Schalter DOIF

Begonnen von Abercrombie1892, 20 Januar 2019, 20:11:10

Vorheriges Thema - Nächstes Thema

Abercrombie1892

hallo leute,

ich habe die Xiaomi Aqara Double Rocker Schalter im Einsatz. Beide Tasten senden beim Druck ein Event an Fhem.

ich habe jetzt über ein DOIF eine Mehrfachbelegung auf die Taster gelegt. Ich hätte es aber gerne so, das wenn ich die Taste 1xbetätige soll CMD1 geschaltet werden,wenn jetzt nach 10 Sekunden die Taste nicht erneut betätigt wird, soll beim nächsten Tastendruck CMD4 (off) aktiviert werden. Ich nutze den Schalter zum Einschalten/Ausschalten der Lampe und verschiedene Helligkeitstufen.

mfg.

(["frank:channel_0:.*"] and $cmd=~"0|5") (set Deckenlampe_SZ color 2300 : pct 50) DOELSEIF (["frank:channel_0:.*"] and $cmd==1) (set Deckenlampe_SZ color 2300 : pct 60) DOELSEIF (["frank:channel_0:.*"] and $cmd==2) (set Deckenlampe_SZ color 2300 : pct 70) DOELSEIF (["frank:channel_0:.*"] and $cmd==3) (set Deckenlampe_SZ color 2300 : pct 80) DOELSEIF (["frank:channel_0:.*"] and $cmd==4) (set Deckenlampe_SZ off)

Ellert

Du könntest den Zweig 1 in der Bedingung ergänzen mit

and ![?$SELF:nach_zweig_4,0]

und im Befehlsteil die Sequenz (setreading $SELF nach_zweig_4 1)

im Zweig 4
and ($cmd==4 or [?$SELF:nach_zweig_4,0])

und im Befehlsteil die den Befehl ,setreading $SELF nach_zweig_4 0

und zusätzlich  das Attribut wait setzen
wait 10

Das Prinzip:
Speichern einer Umleitungsmarke 10 s nach Befehl1, ergänzen der Bedingung 1 und 4 um die Abfrage der Umleitung und zurücksetzen der Umleitungsmarke in Zweig 4.

Abercrombie1892

Zitat von: Ellert am 21 Januar 2019, 18:19:02
Du könntest den Zweig 1 in der Bedingung ergänzen mit

and ![?$SELF:nach_zweig_4,0]

und im Befehlsteil die Sequenz (setreading $SELF nach_zweig_4 1)

im Zweig 4
and ($cmd==4 or [?$SELF:nach_zweig_4,0])

und im Befehlsteil die den Befehl ,setreading $SELF nach_zweig_4 0

und zusätzlich  das Attribut wait setzen
wait 10

Das Prinzip:
Speichern einer Umleitungsmarke 10 s nach Befehl1, ergänzen der Bedingung 1 und 4 um die Abfrage der Umleitung und zurücksetzen der Umleitungsmarke in Zweig 4.

vielen dank für deine antwort. klingt echt spannend.

ich habe mal versucht mein doif zu ergänzen, aber leider nimmt er es so nicht an.

(["frank:channel_0:.*"] and $cmd=~"0|5") and ![?$SELF:nach_zweig_4,0] (set Deckenlampe_SZ color 2300 : pct 50) (setreading $SELF nach_zweig_4 1) DOELSEIF (["frank:channel_0:.*"] and $cmd==1) (set Deckenlampe_SZ color 2300 : pct 60) DOELSEIF (["frank:channel_0:.*"] and $cmd==2) (set Deckenlampe_SZ color 2300 : pct 70) DOELSEIF (["frank:channel_0:.*"] and $cmd==3) (set Deckenlampe_SZ color 2300 : pct 80) DOELSEIF (["frank:channel_0:.*"] and ($cmd==4 or [?$SELF:nach_zweig_4,0]) (set Deckenlampe_SZ off,setreading $SELF nach_zweig_4 0)

Ellert

Zitat...aber leider nimmt er es so nicht an.
Keine Ahnung, was Du damit meinst, siehe https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche

Abercrombie1892

Zitat von: Ellert am 23 Januar 2019, 11:35:00
Keine Ahnung, was Du damit meinst, siehe https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche

war gestern schon etwas spät sorry. eine klammer musste ich entfernen, dann hat er den code genommen.

hab es jetzt mal probiert. der schalter schaltet cmd1 cmd2 cmd3 und cmd4 jeweils durch und beim wechsel von cmd4 auf cmd1 kommt der wait timer und ich kann in der zeit nix mehr schalten.
es sollte ja eher wenn cmd1 betätigt wird und unter 10 sekunden nochmal dann schaltet er alle zustände durch. wird getastet bei cmd1 und der taster nach 10 sekunden betätigt wird, soll cmd4 schalten  :-\

hier mein test doif
(["testschalter:channel_1:.*"] and $cmd=~"0|4" and ![?$SELF:nach_zweig_3,0]) (set Lampen_Wohnzimmer hue 6225 : pct 20,setreading $SELF nach_zweig_3 1) DOELSEIF (["testschalter:channel_1:.*"] and $cmd==1) (set Lampen_Wohnzimmer hue 6225 : pct 40) DOELSEIF (["testschalter:channel_1:.*"] and $cmd==2) (set Lampen_Wohnzimmer hue 6225 : pct 60) DOELSEIF (["testschalter:channel_1:.*"] and $cmd==3 or [?$SELF:nach_zweig_3,0]) (set Lampen_Wohnzimmer hue 6225 : pct 80,setreading $SELF nach_zweig_3 0)

wait 10

Ellert


Abercrombie1892

Zitat von: Ellert am 24 Januar 2019, 13:04:22
Mache es mir einfacher zu helfen, strukturiere den Quelltext, siehe https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche#Strukturierung_der_Definition

## 1 Schlafzimmer mit 20% anschalten
(["frank:channel_1:.*"] and $cmd=~"0|5" and ![?$SELF:nach_zweig_4,0])
   (set Lampen_Schlafzimmer color 2300 : pct 20) (setreading $SELF nach_zweig_4 1)
## 2 Schlafzimmer 30%
DOELSEIF (["frank:channel_1:.*"] and $cmd==1)
   (set Lampen_Schlafzimmer color 2300 : pct 30)
## 3 Schlafzimmer 40%
DOELSEIF (["frank:channel_1:.*"] and $cmd==2)
   (set Lampen_Schlafzimmer color 2300 : pct 40)
## 4 Schlafzimmer 50%
DOELSEIF (["frank:channel_1:.*"] and $cmd==3)
   (set Lampen_Schlafzimmer color 2300 : pct 50)
## 5 Schlafzimmer Ausschalten
DOELSEIF (["frank:channel_1:.*"] and $cmd==4 or [?$SELF:nach_zweig_4,0])
   (set Lampen_Schlafzimmer off) (setreading $SELF nach_zweig_4 0)


wait 10


Ellert

Jetz müsstest Du eigentlich sehen, warum es innerhalb des wait nicht weiter geht.
Kleiner Tipp, Zweig 2 schaltet nur auf cmd==1 und nicht auf den Zwischenzustand, der nach Abarbeitung der ersten Sequenz eingenommmen wird. Den müsstest Du zusätzlich eintragen.

Abercrombie1892

Zitat von: Ellert am 24 Januar 2019, 20:48:08
Jetz müsstest Du eigentlich sehen, warum es innerhalb des wait nicht weiter geht.
Kleiner Tipp, Zweig 2 schaltet nur auf cmd==1 und nicht auf den Zwischenzustand, der nach Abarbeitung der ersten Sequenz eingenommmen wird. Den müsstest Du zusätzlich eintragen.

habs jetzt hinbekommen. musste aber deinen code etwas abändern.

vielen dank für deine hilfe, hab wieder ne menge gelernt  ;D

##
(["testschalter:channel_1:.*"] and $cmd=~"0|4" and ![?$SELF:nach_zweig_3,0])
(set Lampen_Wohnzimmer hue 6225 : pct 20) (setreading $SELF nach_zweig_3 1)
##
DOELSEIF (["testschalter:channel_1:.*"] and $cmd==1.1)
(set Lampen_Wohnzimmer hue 6225 : pct 40)
##
DOELSEIF (["testschalter:channel_1:.*"] and $cmd==2)
(set Lampen_Wohnzimmer hue 6225 : pct 60)
##
DOELSEIF (["testschalter:channel_1:.*"] and $cmd==3 or [?$SELF:nach_zweig_3,1])
(set Lampen_Wohnzimmer hue 6225 : pct 80,setreading $SELF nach_zweig_3 0)


wait 0,10

evtl siehst du ja hier doch noch etwas verbesserungsbedarf.

Ellert

#9
Vielleicht kannst Du auf das Zwischenspeichern in einem Reading verzichten und  im 1.u 4. Zweig statt der Readingabfrage $cmd==1.1 bzw !($cmd==2) verwenden, das müsstest Du ausprobieren..