Taster zur Jalousie-Steuerung

Begonnen von Fistandantilus, 21 Juni 2016, 22:11:17

Vorheriges Thema - Nächstes Thema

Fistandantilus

Hallo,

ich habe einen Hoch-/Runtertaster zur Jalousie-Steuerung. Funktionieren soll er wie folgt:
- einmal nach unten drücken -> Jalousie fährt runter
- nochmal nach unten drücken -> Jalousie hält an
- wieder nach unten drücken -> Jalousie fährt weiter runter

Beim nach oben drücken analog.

Da mein Aktor (Eltako FSB14) die aktuelle Position nicht zurückmeldet, steht der beim Kommando schließen sofort auf closed, beim öffnen auf open. Somit kann ich mit dem Status allein nicht viel anfangen. Gelöst habe ich es aktuell über 2 Toggle dummies und ein doif.
- wenn der dummy 0 ist, wird beim Klick runter das close geschickt und danach der dummy auf 1 gesetzt
- wenn der dummy 1 ist, wird beim Klick runter ein Stop geschickt und danach der dummy auf 0 gesetzt
- hoch wieder analog mit dem anderen dummy

Grundsätzlich funktioniert das auch, ist aber nicht sonderlich elegant. Habt ihr eine einfachere oder bessere Lösung?


([EnO_00107EC6:state] eq "AI" && [EnO_00107EC6:buttons] eq "pressed")
  (IF ([EG.Wohnzimmer.Wandtaster2.downA.toggle:state] eq "0") (set FSB14_1_2 closes,set EG.Wohnzimmer.Wandtaster2.downA.toggle 1,set EG.Wohnzimmer.Wandtaster2.upA.toggle 0)
  ELSE (set FSB14_1_2 stop,set EG.Wohnzimmer.Wandtaster2.downA.toggle 0,set EG.Wohnzimmer.Wandtaster2.upA.toggle 0))
DOELSEIF ([EnO_00107EC6:state] eq "A0" && [EnO_00107EC6:buttons] eq "pressed")
  (IF ([EG.Wohnzimmer.Wandtaster2.upA.toggle:state] eq "0") (set FSB14_1_2 opens,set EG.Wohnzimmer.Wandtaster2.upA.toggle 1,set EG.Wohnzimmer.Wandtaster2.downA.toggle 0)
  ELSE (set FSB14_1_2 stop,set EG.Wohnzimmer.Wandtaster2.upA.toggle 0,set EG.Wohnzimmer.Wandtaster2.downA.toggle 0))
DOELSEIF ([EnO_00107EC6:state] eq "BI" && [EnO_00107EC6:buttons] eq "pressed")
  (IF ([EG.Wohnzimmer.Wandtaster2.downB.toggle:state] eq "0") (set FSB14_1_1 closes,set EG.Wohnzimmer.Wandtaster2.downB.toggle 1,set EG.Wohnzimmer.Wandtaster2.upB.toggle 0)
  ELSE (set FSB14_1_1 stop,set EG.Wohnzimmer.Wandtaster2.downB.toggle 0,set EG.Wohnzimmer.Wandtaster2.upB.toggle 0))
DOELSEIF ([EnO_00107EC6:state] eq "B0" && [EnO_00107EC6:buttons] eq "pressed")
  (IF ([EG.Wohnzimmer.Wandtaster2.upB.toggle:state] eq "0") (set FSB14_1_1 opens,set EG.Wohnzimmer.Wandtaster2.upB.toggle 1,set EG.Wohnzimmer.Wandtaster2.downB.toggle 0)
  ELSE (set FSB14_1_1 stop,set EG.Wohnzimmer.Wandtaster2.upB.toggle 0,set EG.Wohnzimmer.Wandtaster2.downB.toggle 0))


VG
F.
Raspberry Pi 3 + FHEM + Smartvisu/Fronthem, CUL, HMLAN, Enocean USB300, Eltako (FAM14, FSB14, FSR,FTS14EM,Multisensor,...) - MySQL DB + 2.Raspberry für Heizungsregelung und 3. Raspberry als Alarmanlage

Ellert

Mit DOIF etwa so:

(["Taster:unten"] and $cmd eq "0|3") (set Jalousie runter)
DOELSEIF (["Taster:oben"] and $cmd eq "0|3") (set Jalousie rauf)
DOELSEIF (["Taster:unten|oben"] and $cmd eq "1|2") (set Jalousie stop)

Damian

Zitat von: Ellert am 22 Juni 2016, 18:24:05
Mit DOIF etwa so:

(["Taster:unten"] and $cmd eq "0|3") (set Jalousie runter)
DOELSEIF (["Taster:oben"] and $cmd eq "0|3") (set Jalousie rauf)
DOELSEIF (["Taster:unten|oben"] and $cmd eq "1|2") (set Jalousie stop)


Regex ist bei eq nicht möglich,  stattdessen sollte man =~ verwenden:

(["Taster:unten"] and $cmd =~ "0|3") (set Jalousie runter)
DOELSEIF (["Taster:oben"] and $cmd =~ "0|3") (set Jalousie rauf)
DOELSEIF (["Taster:unten|oben"] and $cmd =~ "1|2") (set Jalousie stop)


Gruß

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

Fistandantilus

Was prüft $cmd =~ "0|3") bzw.$cmd =~ "1|2") ?
Raspberry Pi 3 + FHEM + Smartvisu/Fronthem, CUL, HMLAN, Enocean USB300, Eltako (FAM14, FSB14, FSR,FTS14EM,Multisensor,...) - MySQL DB + 2.Raspberry für Heizungsregelung und 3. Raspberry als Alarmanlage

Ellert

Aus der deutschsprachigen Befehlsreferenz:
Zitat$cmd
Perl-Variable mit der Bedeutung [$SELF:cmd]

Mehr siehe hier http://fhem.de/commandref_DE.html#DOIF_selftrigger

Fistandantilus

Danke, wieder was gelernt  :)
Die Lösung ist auf jeden Fall eleganter.
Raspberry Pi 3 + FHEM + Smartvisu/Fronthem, CUL, HMLAN, Enocean USB300, Eltako (FAM14, FSB14, FSR,FTS14EM,Multisensor,...) - MySQL DB + 2.Raspberry für Heizungsregelung und 3. Raspberry als Alarmanlage

Fistandantilus

Hi,

ich habe das Ganze jetzt umgesetzt, was grundsätzlich auch funktioniert, allerdings muss ich beim runterfahren erst immer zweimal drücken bevor es losgeht. Fährt die Jalousie los, funktioniert die Logik ohne Probleme. Habt Ihr eine Idee?

([EnO_00107EC6:state] eq "AI" and [EnO_00107EC6:buttons] eq "pressed" and $cmd =~ "0|3")
(set FSB14_1_2 closes)
DOELSEIF ([EnO_00107EC6:state] eq "A0" and [EnO_00107EC6:buttons] eq "pressed" and $cmd =~ "0|3")
(set FSB14_1_2 opens)
DOELSEIF (([EnO_00107EC6:state] eq "AI" or [EnO_00107EC6:state] eq "A0") and [EnO_00107EC6:buttons] eq "pressed" and $cmd =~ "1|2")
(set FSB14_1_2 stop)


VG
F.
Raspberry Pi 3 + FHEM + Smartvisu/Fronthem, CUL, HMLAN, Enocean USB300, Eltako (FAM14, FSB14, FSR,FTS14EM,Multisensor,...) - MySQL DB + 2.Raspberry für Heizungsregelung und 3. Raspberry als Alarmanlage

Ellert

Ich kenne das Eltako-Gerät nicht. Da Du  2 Vergleiche hast AI und pressed vermute ich, dass AI dem pressed folgt und die Bedingung erst beim 2. Tastendruck wahr wird. Mit einem Dummy Taster und dem state unten/oben dürfte das Problen nicht bestehen.

Dann müsstest nach einem Event des Tasters suchen das eindeutig zu "oben" oder "unten" passt und nur damit triggern.

Fistandantilus

Der Taster ist ein normaler Enocean Funktaster. Mehr Events gibt es da scheinbar nicht. Das was Du geschrieben hast, könnte aber durchaus stimmen. Die Readings der Channels oder vom state stehen immer auf dem letzten Wert. Wirklich weiter hilft mir das aber nicht  :(
Raspberry Pi 3 + FHEM + Smartvisu/Fronthem, CUL, HMLAN, Enocean USB300, Eltako (FAM14, FSB14, FSR,FTS14EM,Multisensor,...) - MySQL DB + 2.Raspberry für Heizungsregelung und 3. Raspberry als Alarmanlage

Ellert


Fistandantilus

Das Tauschen macht keinen Unterschied. Das Selbe Verhalten habe ich an einem Taster, der mit Draht angebunden ist (an einem Eltako FTS14EM).
Raspberry Pi 3 + FHEM + Smartvisu/Fronthem, CUL, HMLAN, Enocean USB300, Eltako (FAM14, FSB14, FSR,FTS14EM,Multisensor,...) - MySQL DB + 2.Raspberry für Heizungsregelung und 3. Raspberry als Alarmanlage

Ellert

Wie gesagt, ich kenne mich in der Enocean-Welt nicht aus. Meine Idee war: Wenn AI erst nach dem 1. pressed gesetzt wird, dann ist vorher noch A0 vorhanden, das war halt falsch geraten.

Warum werden die beiden Readings zum triggern benötigt?
Gibt es andere Events die eindeutiger sind, was sagt der Eventmonitor dazu?

Fistandantilus

Wirklich viele Optionen gibt es nicht. Im Event Log steht sowas in der Art:

2016-06-30 21:02:34 EnOcean EnO_00001011 buttons: pressed
2016-06-30 21:02:34 EnOcean EnO_00001011 channelB: B0
2016-06-30 21:02:34 EnOcean EnO_00001011 B0
2016-06-30 21:02:34 EnOcean EnO_00001011 buttons: released


Bei dem wired Eltako reicht es, wenn ich nur auf pressed prüfe, da jeder Taster seine eigene ID hat (gerade getestet und umgestellt - passt). Bei dem Enocean Funktaster (Doppelwippe) hat der Taster eine ID und jede Wippe kommt über einen separaten Channel mit AI/A0 bzw. BI/B0, hier kann ich wahrscheinlich nicht wirklich was tun.
Raspberry Pi 3 + FHEM + Smartvisu/Fronthem, CUL, HMLAN, Enocean USB300, Eltako (FAM14, FSB14, FSR,FTS14EM,Multisensor,...) - MySQL DB + 2.Raspberry für Heizungsregelung und 3. Raspberry als Alarmanlage

Ellert

Reicht es dann nicht, nur auf den Channel zu triggern, oder auf released statt pressed?
Vor released müsste der Channel schon gesetzt sein, so wie es aussieht.

Fistandantilus

#14
Nur Channel wird nicht gehen, da mir dann der Trigger beim 2. Tastendruck für das Stop fehlt. Das mit dem released probier ich morgen mal aus.
Vielleicht hab ich aber auch nur einen Denkfehler?
Raspberry Pi 3 + FHEM + Smartvisu/Fronthem, CUL, HMLAN, Enocean USB300, Eltako (FAM14, FSB14, FSR,FTS14EM,Multisensor,...) - MySQL DB + 2.Raspberry für Heizungsregelung und 3. Raspberry als Alarmanlage