Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken

Begonnen von Vorhand, 06 März 2018, 08:58:08

Vorheriges Thema - Nächstes Thema

Pfriemler

#15
So. Fahrt also auf Dauer der Betätigung (xx bitte anpassen, 10 Sekunden reichen bestimmt nicht, oder?)
gegenseitige Verriegelung ist hardwareseitig gegeben.


defmod n_RollAtlirNW_auf notify RollAtlirNW:Auf IF ([S39x1] ne "on") (set S39x0 on-for-timer xx) ELSE (set S39x1 off)
defmod n_RollAtlirNW_zu notify RollAtlirNW:Zu IF ([S39x0] ne "on") (set S39x1 on-for-timer xx) ELSE (set S39x0 off)

edit: hatte erst perl, fehlerhaft - diese Version bei vorhand im nächsten Beitrag richtig. Hier zum Spaß die IF-Variante.
Klartext: Wenn Rolladen auf hochfahren gesetzt, prüfe, ob Rolladen nicht zu dieser Zeit herunterfährt
  fährt nicht (trifft zu): Setze Fahrt nach oben
  fährt nach unten (trifft nicht zu): Stoppe die Fahrt.
Umgekehrt ähnlich.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Vorhand

Danke Priemler es geht.
Musste den Code etwas anpassen mit { und fhem
define n_RollAtlirNW_auf notify RollAtlirNW:Auf {if (Value("S39x1") ne "on") {fhem("set S39x0 on-for-timer 20")} else {fhem("set S39x1 off")}}
attr n_RollAtlirNW_auf room DG
define n_RollAtlirNW_zu notify RollAtlirNW:Zu {if (Value("S39x0") ne "on") {fhem("set S39x1 on-for-timer 20")} else {fhem("set S39x0 off")}}
attr n_RollAtlirNW_zu room DG


Frage:warum verwendest du defmod? Wenn ich in der Weboberfläche editiere, wird defmod durch define ersetzt.
Der Unterschied zu meinem ersten Code ist wohl die fehlende &-Bedingung, die ich im if hatte.
Danke
Viele Grüße
Raspi,Homatic,ESP,Fronius,KIA-PHEV,DHW300,Mi,Shelly

Pfriemler

#17
Ach ja, das fhem, sorry. Ich nutze halt nur DOIF und IF, da braucht man das eben nicht (mehr).
Versuche mal eine bestehende Definition mit "define <name> ... " zu ändern. Du musst die alte erst löschen. Mit defmod geht das einfach so.
Guck mal in einer Detailansicht in "die Raw definition" ganz unten. Was siehst Du? Genau.

edit: Da Vorhands Version über perl-if ja richtig ist (im Gegensatz zu meinem Vorschlag), habe ich meinen Vorschlag mal auf FHEM-IF umgebaut ...
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Vorhand

...geht auch mit IF von fhem. Hatte ich noch nie benutzt - der Code ist etwas kürzer.
Allerdings muss das 2. notify auf "Zu" reagieren und nicht wie das 1. auf "Auf".

Hättest du vielleicht auch eine Variante mit DOIF? Müsste ja noch eleganter sein!?
Danke

Viele Grüße
Raspi,Homatic,ESP,Fronius,KIA-PHEV,DHW300,Mi,Shelly

Pfriemler

Jo, copy&paste-Fehler von mir. Korrigiert.
DOIF wird nicht wirklich kürzer. Man kann beide Notifys in je einen DOIF-Zweig stecken und das IF in der Ausführung weiterverwenden oder in vier Zweige aufteilen.

defmod di_RollAtlirNW DOIF ([RollAtlirNW:"Auf"]) (IF ([S39x1] ne "on") (set S39x0 on-for-timer 20) ELSE (set S39x1 off)) \
DOELSEIF ([RollAtlirNW:"Zu"]) (IF ([S39x0] ne "on") (set S39x1 on-for-timer 20) ELSE (set S39x0 off))
attr di_RollAtlirNW do always

oder
defmod di_RollAtlirNW DOIF ([RollAtlirNW:"Auf"] and [?S39x1] ne "on") (set S39x0 on-for-timer 20) \
DOELSEIF ([RollAtlirNW:"Auf"]) (set S39x1 off) \
DOELSEIF ([RollAtlirNW:"Zu"] and [?S39x0] ne "on") (set S39x1 on-for-timer 20) \
DOELSEIF ([RollAtlirNW:"Zu"]) (set S39x0 off)
attr di_RollAtlirNW do always


Wie immer ohne Schusswaffe.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Damian

oder demnächst mit DOIF-Perl: https://forum.fhem.de/index.php/topic,84969.0.html

defmod di_RollAtlirNW DOIF  { #Auf
  if ([RollAtlirNW:"Auf"]) {
    if ([?S39x1] ne "on") {
      fhem"set S39x0 on-for-timer 20"
    } else {
      fhem"set S39x1 off"
    }
  }
}
{ #Zu
  if ([RollAtlirNW:"Zu"]) {
    if ([?S39x0] ne "on") {
      fhem"set S39x1 on-for-timer 20"
    } else {
      fhem"set S39x0 off"
    }
  }
}


ohne zusätzliche Attribute.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

ThomasMagnum

Kann man sich nicht für das im Ausgansthread beschriebene (Wunsch)Verhalten mit dem Module Sequenz https://fhem.de/commandref_DE.html#sequence behelfen?
Man hat dann zwar nicht die Unterscheidung von kurz vs. lang, aber sonst sind ja alle möglichen Kombinationen möglich.

Gruß, Thomas