FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Vorhand am 06 März 2018, 08:58:08

Titel: Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: Vorhand am 06 März 2018, 08:58:08
Gibt es eine elegante Möglichkeit kurze von langen Befehle zu unterscheiden?
Ich möchte bei meiner Rolladensteuerung den Auf- bzw. den Zulauf stoppen können.
Beide Befehle laufen ca. 60s.
Mit notify kann ich beim Aufbefehl, gleichzeitig den Zubefehl ausschalten - und umgekehrt.
Aber damit dreht er nur die Laufrichtung um.
Danke
Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: Beta-User am 06 März 2018, 09:41:14
Da du nicht mitteilst, um welche(s) device(s) es geht und welche events die generieren, mußt du das Problem am besten selbst hiermit lösen:
https://wiki.fhem.de/wiki/Event_monitor
Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: Vorhand am 07 März 2018, 10:07:41
Danke - wenn ich noch ergänzen darf...
Die Tast-Ereignisse kommen über eine FS20-Fernbedienung. Die Ansteuerung der Rollos erfolgt über normale Relais. Ein event SHORTPRESS oder so, wird hier nicht angeboten.
Kann man die Druck-Zeit irgendwie auswerten ?
Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: CoolTux am 07 März 2018, 10:17:03
Das wird so nicht gehen denke ich. Man kann wenn überhaupt mit zweimal drücken kurz hintereinander arbeiten.
Hierzu gibt es bereits den einen oder anderen Thread im Forum. Modulname sequenz
Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: nils_ am 07 März 2018, 10:36:09
Zitat von: Vorhand am 07 März 2018, 10:07:41
Die Ansteuerung der Rollos erfolgt über normale Relais.

ich hoffe da ist irgendwas zum verblocken drin !?
Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: Frank_Huber am 07 März 2018, 11:46:00
Hier mein DOIF mit welchem ich die Rollos steuere.
Pro Rollo zwei Relais, eines für AN/AUS, das zweite für AUF/AB.
Rollos sind über das ROLLO Modul angelegt. http://www.fhemwiki.de/wiki/ROLLO


defmod Rollo_Dachterrasse DOIF ([GPIO_IN_10:"^on$"] and [?Rollo4_Dachterrasse] ne "drive-up") (set Rollo4_Dachterrasse open)\
DOELSEIF ([GPIO_IN_11:"^on$"] and [?Rollo4_Dachterrasse] ne "drive-down") (set Rollo4_Dachterrasse closed)\
DOELSEIF (([GPIO_IN_10:"^on$"] or [GPIO_IN_11:"^on$"]) and [?Rollo4_Dachterrasse] =~ "drive-down|drive-up") (set Rollo4_Dachterrasse stop)\
attr Rollo_Dachterrasse checkReadingEvent 1
attr Rollo_Dachterrasse cmdpause 1:1:1
attr Rollo_Dachterrasse do always

Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: Vorhand am 14 März 2018, 13:59:21
besten Dank für die Antworten.
Ich hab mir folgendes ausgedacht.
Mit Taste Auf geht der Laden AUF. Jetzt Taste Zu, dann stoppt der Laden.
Mit Taste Zu geht er ZU. Jetzt Taste Auf, dann stoppt er wieder.
Eigenartigerweise geht es mit dem Befehl Zu - aber nicht mit Auf???
Mit folgendem Code:
attr RollAtlirNW devStateIcon Auf:fts_shutter_10 Zu:fts_shutter_100
attr RollAtlirNW eventMap on:Auf off:Zu
attr RollAtlirNW icon fts_window_2w
attr RollAtlirNW room DG
attr RollAtlirNW setList on:off
attr RollAtlirNW webCmd Auf:Zu
define n_RollAtlirNW_auf notify RollAtlirNW {if ( Value("RollAtlirNW") eq "Auf" and Value("S39x1") ne "on") {fhem("set S39x0 on-for-timer 20")} else {fhem("set S39x1 off")}}
define n_RollAtlirNW_zu notify RollAtlirNW {if (Value("RollAtlirNW") eq "Zu" and Value("39x0") ne "on") {fhem("set S39x1 on-for-timer 20")} else {fhem("set S39x0 off")}}


Was ist falsch?
Danke

Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: Beta-User am 14 März 2018, 14:28:48
Zitat von: Vorhand am 14 März 2018, 13:59:21
Was ist falsch?
1. keine code-tags (#-Button oberhalb des Eingabefelds für den Text).
2. vielleicht noch: Das eine Notify sagt "39x0", das andere "S39x1"). Dürfte eigentlich einheitlich sein, also immer mit oder ohne das "S"...

Gruß, Beta-User
Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: nils_ am 14 März 2018, 16:12:45
Zitat von: Beta-User am 14 März 2018, 14:28:48
2. vielleicht noch: Das eine Notify sagt "39x0", das andere "S39x1"). Dürfte eigentlich einheitlich sein, also immer mit oder ohne das "S"...
einmal das.


und du hast 2x notify mit dem gleichen Regex

define n_RollAtlirNW_auf notify RollAtlirNW .....
define n_RollAtlirNW_zu notify RollAtlirNW ....


ist das so gewollt??
wenn ja, warum? :D
Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: Vorhand am 14 März 2018, 23:02:20
Danke - tatsächlich hat einmal das S gefehlt. Fehler
Leider war das nicht die Ursache.
Wenn ich ohne die AND Bedingung arbeite, geht alles einwandfrei.
define n_RollAtlirNW_auf notify RollAtlirNW:Auf set S39x1 off;; sleep 1;; set S39x0 on-for-timer 10
define n_RollAtlirNW_zu notify RollAtlirNW:Zu  set S39x0 off;; sleep 1;; set S39x1 on-for-timer 10
Das aber, führt nur zur Umschaltung - ohne Stop.
Ich wollte über die IF-Bedingung: wenn die andere Richtung läuft, nur den "off" Befehl geben, ohne  dass die andere Richtung startet.
Danke
Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: Pfriemler am 14 März 2018, 23:26:57
Zitat von: Vorhand am 07 März 2018, 10:07:41
Kann man die Druck-Zeit irgendwie auswerten ?
FS20-Tasten kennen die Zustände "toggle" für kurze und "dimupdown" für längere Tastendrücke.
Abgesehen davon verstehe ich die Logik noch nicht ganz: RollAtlirNW ist ein Dummy, der den Sollzustand des Rolladens speichert? Wie kommen die Tastendrücke da rein?
Beim letzten Satz notifys hast Du einen Knick in der Logik. Abgesehen davon verstehe ich nicht, was S39x1 und S39x0 eigentlich genau sind: Relais, die kurzzeitig schalten um einen Hardwaretaster zu emulieren? Oder sind das direkt die Ansteuerrelais für die Motoren? Welche Verriegelung gegen gleichzeitige Ansteuerung beider Fahrrichtungen ist eingebaut?

Das Modul Rollo dürfte im übrigen wirklich eine überlegenswerte Lösung sein. Vorher hatte ich mit diversen Dummys gearbeitet, inzwischen werkelt bei mir ausnahmslos Hardwarelogik (HomeMatic, Rademacher).


Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: nils_ am 15 März 2018, 08:28:20
Zitat von: Vorhand am 14 März 2018, 23:02:20
Wenn ich ohne die AND Bedingung arbeite, geht alles einwandfrei.
define n_RollAtlirNW_auf notify RollAtlirNW:Auf set S39x1 off;; sleep 1;; set S39x0 on-for-timer 10
define n_RollAtlirNW_zu notify RollAtlirNW:Zu  set S39x0 off;; sleep 1;; set S39x1 on-for-timer 10
jetzt sieht dein regex schonmal anders aus.

Zitat von: Vorhand am 14 März 2018, 23:02:20
Ich wollte über die IF-Bedingung: wenn die andere Richtung läuft, nur den "off" Befehl geben, ohne  dass die andere Richtung startet.
deine if-bedingung könnte so klappen....
aber
Zitat von: Pfriemler am 14 März 2018, 23:26:57
Welche Verriegelung gegen gleichzeitige Ansteuerung beider Fahrrichtungen ist eingebaut?
das solltest du nicht vernachlässigen, sonst reden wir bald über einen kaputten/abgerauchten motor.


Zitat von: Beta-User am 14 März 2018, 14:28:48
1. keine code-tags (#-Button oberhalb des Eingabefelds für den Text).
bitte auch beachten :)
Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: Vorhand am 15 März 2018, 09:32:13
Noch etwas Hintergrund:
Vor den Rolladenantrieben 230V~ werkeln Schalk-Relais UMS504 mit 24VGS Steuerspannung. Die örtlichen Eingänge bediene ich mit einem einzelnen Taster +24V Auf, Halt,Zu.
Das funktioniert immer - auch ohne Raspi und FHEM.
Die Ferneingänge 24VGS haben prio - sie toggeln nicht. Der Laden läuft solange +24V am jeweiligen Eingang liegt. Wenn beide gleichzeitig +24 haben, hat AUF Vorrang.
Diese Eingänge steuere ich mit I2C_PCF8574 von Horter an - die können direkt 24V.
Benannt sind die Ausgänge nach der I2C Adresse - hier 39 und der Port 0 für Auf bzw. 1 für Zu.
Grundsätzlich will ich natürlich ein fertiges Rolladen-Programm mit Licht und Azimut und ... darauf loslassen.
Ich kämpfe jedoch noch mit den Basics, die u.a. auch eine Fernbedienung z.B. FS20  für das manuelle steuern ermöglicht.
Irgenwie hänge ich ein bisschen fest !??.
Danke
Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: Beta-User am 15 März 2018, 09:47:19
So wie ich das verstanden habe, funktionierte doch eines deiner "alten" notify. Da war hinten zum einen quasi die Event-Abfrage drin und dann noch eine Status-Abfrage.

Jetzt hast du die Event-Abfrage nach vorne gezogen. Das war sicher richtig. Jetzt sollte es doch gehen, hinten einfach die Status-Abfrage noch passend mit einzubauen, oder? Also ein reduziertes (und korrekt mit "S" ergänztes) "if {...}" in den Ausführungsteil der notify.

Ob ROLLO helfen kann, kann ich nicht sagen, aber vielleicht wäre das einen Blick wert? Dann könntest du auch die Rollosteuerung von Frini&Cluni (https://forum.fhem.de/index.php/topic,73964.0.html) verwenden...

Generell noch: Wenn du mehr von diesen Rollos hast, ROLLO aber nicht zu verwenden geht, würde ich an deiner Stelle versuchen, ein generalisiertes notify zu basteln und den Rest mit etwas Perl-code (myUtils) zu erschlagen. Hört sich komplizierter an, als es ist: Du könntest an jedem der potentiell auslösenden $DEVICE-Geräte ein oder zwei userattr definieren, in das du den/die zugehörigen Ausgang/Ausgänge schreibst und damit dann im Code entsprechend umgehen. Wäre im Ergebnis vermutlich übersichtlicher als viele notify.

Just my2ct
Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: nils_ am 15 März 2018, 09:48:27
RollAtlirNW ist ein dummy??
mit dem willst du nur erstmal(?) das schalten nachbilden. richtig?

dann sollten deine abfragen eigentlich funktionieren....  :o
(mit korrigiertem regex)

define n_RollAtlirNW_auf notify RollAtlirNW:Auf ....
define n_RollAtlirNW_zu notify RollAtlirNW:Zu ...


//edit:
beta-user  war schneller :)
Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: Pfriemler am 15 März 2018, 09:55:10
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.
Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: Vorhand am 15 März 2018, 13:37:37
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
Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: Pfriemler am 15 März 2018, 14:43: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 ...
Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: Vorhand am 15 März 2018, 22:31:01
...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

Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: Pfriemler am 15 März 2018, 23:04:34
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.
Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: Damian am 16 März 2018, 12:06:26
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.
Titel: Antw:Unterscheidung von kurzen und langen, bzw. mehreren Tastendrücken
Beitrag von: ThomasMagnum am 16 März 2018, 15:09:48
Kann man sich nicht für das im Ausgansthread beschriebene (Wunsch)Verhalten mit dem Module Sequenz https://fhem.de/commandref_DE.html#sequence (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