DOIF RPI_GPIO Lonpress und Shortpress unterscheiden?

Begonnen von roman1528, 14 August 2021, 11:11:41

Vorheriges Thema - Nächstes Thema

roman1528

Moin zusammen,

ich habe einen Taster an einem GPIO der mein Garagentor steuert. Kurzer Tastendruck -> Wartezeit -> Relais für 1/2 Sekunde -> Tor fährt zu.
(habe das DOIF gerade komplett verbastelt... sonst würde ich es posten)

Tor ist aber auch über Funk steuerbar (Rademacher) und ich möchte jetzt über einen langen Tastendruck des selben Tasters eine bestimmt Position (80) anfahren.

Jetzt habe ich das Problem (vielleicht auch nur den Denkfehler) dass der GPIO grundsätzlich auf "high/on" geht bevor er auch nur daran denkt einen "Longpress" zu triggern. Quasi wäre das Tor zu bevor ich per Tastendruck überhaupt sagen kann, dass die Position angefahren werden soll...

Kurz zusammengefasst:
([taster:Longpress] eq "on") (set tor position 80)
DOELSEIF ([taster:Pinlevel] eq "high") (set tor_relais on-for-timer 0.5)


Hat das vielleicht schon jemand gelöst und kann am GPIO zwischen short- und longpress unterscheiden?

Grüße^^
i3-10305T 4x3GHz;8GB RAM;250GB & 1TB NVMe:
FHEM 6.2;FTUI;8" Tablet's+Fully;NsPanelPro;HUE;ESPRGBWW;HM(CCU3);Duofern; ASC;MQTT(Tasmota);netatmo;SONOS;eBus;DbLog;XiaomiDevice;NUT;ModbusAttr

RPi3+: FHEM 6.2;I²C;GPIO;RFID;G-Tag;XiaomiBTLESens
RPi3: FHEM 6.2;DIY Relais-Board;I²C;GPIO;RFID;Photovoltaik

Frank_Huber

Ich Taste gegen 0V.

  defmod Licht_Kammer DOIF ([GPIO_IN_15:"^on$"] and [?OUT_1:PortB3] eq "off") (set OUT_1 PortB3 on) (set OUT_1 PortB3 off)\
DOELSEIF ([GPIO_IN_15:"^on$"] and [?OUT_1:PortB3] eq "on") (set OUT_1 PortB3 off)\
DOELSEIF ([GPIO_IN_15:"^Longpress:.on$"]) (set OUT_1 PortB3 on)
attr Licht_Kammer cmdpause 2:2:2:2
attr Licht_Kammer devStateIcon on:on:cmd_2 initialize|initialized|off:off:cmd_1
attr Licht_Kammer do always
attr Licht_Kammer stateFormat [OUT_1:PortB3]
attr Licht_Kammer wait 0,180:0:0:0


   defmod GPIO_IN_15 RPI_GPIO 15
attr GPIO_IN_15 active_low yes
attr GPIO_IN_15 debounce_in_ms 20
attr GPIO_IN_15 direction input
attr GPIO_IN_15 event-on-change-reading state,Longpress
attr GPIO_IN_15 interrupt both
attr GPIO_IN_15 longpressinterval 1


Kurz drücken 3min Licht, lang drücken Dauerlicht.

roman1528

Danke schonmal... werde ich testen sobald mein RJ45 am Bridged-AP wieder abgekühlt ist... so ein Mist... erreiche meinen Pi in der Garage gerade nicht.

Gleiche GPIO-Konfiguration bei mir.

Wenn das so funktioniert cool...

Ich denke nämlich, dass "cmd_1" immer greift, egal ob ich kurz oder lang drücke weil der GPIO "state" auf "on" geht sobald ich drücke.
Bei dir wird es so sein, dass DOIF von "cmd_1" auf "cmd_3" umswiched sobald der Lonpress greift...

Du machst "nur" ein und das selbe Gerät an. Ich möchte zwei unterschiedliche  Ausführungsteile erreichen.

Grüße^^
i3-10305T 4x3GHz;8GB RAM;250GB & 1TB NVMe:
FHEM 6.2;FTUI;8" Tablet's+Fully;NsPanelPro;HUE;ESPRGBWW;HM(CCU3);Duofern; ASC;MQTT(Tasmota);netatmo;SONOS;eBus;DbLog;XiaomiDevice;NUT;ModbusAttr

RPi3+: FHEM 6.2;I²C;GPIO;RFID;G-Tag;XiaomiBTLESens
RPi3: FHEM 6.2;DIY Relais-Board;I²C;GPIO;RFID;Photovoltaik

Frank_Huber

Der Hauptunterschied liegt da drin dass du auf den Zustand prüfst, ich auf das Event.
Wenn Du auf Event unstellst musst eigentlich nur den Cmd des kurzen Taster
. Ittels wait verzögert ausführen und das do Attribut auf resetwait einstellen.
Dann kannst die zwei Geräte steuern und auch so dass der Lange Druck keinen kurzen Druck auslöst.