Hallo,
mit welcher Funktion kann ich eine lange und kurze Betätigung von einem Taster erkennen um unterschiedliche Evens auszuführen.
Im Moment schalte ich mit dem Taster das Licht einfach ein und aus:
define Taster_Licht_Flur_OG readingsProxy INPUT_07:Port6
define Licht_Flur_ObenNotify notify Taster_Licht_Flur_OG:off { \
if (Value("Licht_Flur_Oben") eq "off") {fhem"set Licht_Flur_Oben on"} \
else{fhem"set Licht_Flur_Oben off"}}
Ich möchte dass bei kurze Betätigung das Licht für eine bestimmte Zeit an bleibt:
define Taster_Licht_Flur_OG readingsProxy INPUT_07:Port6
define Licht_Flur_ObenNotify notify Taster_Licht_Flur_OG:off { \
if (Value("Licht_Flur_Oben") eq "off") {fhem"set Licht_Flur_Oben on-for-timer 60"} \
else{fhem"set Licht_Flur_Oben off"}}
und bei lange Betätigung das Licht so lange an bleibt biss der Taster noch mal betätigt wird.
Hi,
wenn Du noch verraten würdest was das für Taster sind?
readingsProxy INPUT_07:Port6 kann ja praktisch alles sein :-X
Gruß Otto
Das sind i2c Porterweiterungsmodule PCF8574. Als Eingang konfiguriert mit angezogenem Pul-Up widerstand. Angeschlossen sind ganz normale UP Taster.
Huch, das ist mir zu kompliziert ???
Eigentlich haben ja alle Schalter/Input Module diese Funktionen schon eingebaut - dachte ich.
Und dein Licht_Flur_Oben kann kein toggle? Damit wäre zumindest Dein erstes notify kürzer :)
Gruß Otto
Hat keiner eine Idee?
Zitat von: butaluk am 27 Januar 2017, 14:09:40
Hat keiner eine Idee?
Doch: Aktiviere mal den Event monitor und drücke kurz bzw. lang auf Deinen Taster. Dann zeig' und mal, was der Event monitor anzeigt.
Gruß,
Thorsten
Zitat von: butaluk am 27 Januar 2017, 14:09:40
Hat keiner eine Idee?
Gestern beim Lesen fiel noch auf ->
ZitatErmöglicht die Verwendung eines PCF8574 I2C 8 Bit Portexenders. Auf einem Raspberry Pi kann der Interrupt Pin des PCF8574 mit einem GPIO verbunden werden und ¨ber die Interrupt Funktionen von RPI_GPIO l&aml;sst sich dann ein get für den PCF8574 bei Pegel&aml;nderung ausl&oml;sen.
I2C-Botschaften werden über ein I2C Interface Modul wie beispielsweise das RPII2C, FRM oder NetzerI2C gesendet. Daher muss dieses vorher definiert werden.
Das Attribut IODev muss definiert sein.
Musst Du alle Module kombinieren und die Taste schlussendlich über RPI_GPIO auslesen? Dort hättest Du dann sofort die Funktion (short, long, entprellen ) die Du hier zu Fuß bauen willst.
Gruß Otto
Folgendes wird im Event Monitor bei kurzer Betätigung eingetragen:
2017-01-27 22:08:37 readingsProxy Licht_Flur_Oben on
2017-01-27 22:08:37 I2C_PCA9685 OUT_00 Port07: on
2017-01-27 22:08:37 I2C_PCA9685 OUT_00 Ok
2017-01-27 22:08:37 readingsProxy Taster_Licht_Flur_OG off
2017-01-27 22:08:37 I2C_PCF8574 INPUT_07 Port6: off
2017-01-27 22:08:37 I2C_PCF8574 INPUT_07 191
2017-01-27 22:08:37 RPI_GPIO int Pinlevel: high
2017-01-27 22:08:37 RPI_GPIO int on
2017-01-27 22:08:37 RPI_GPIO int Toggle: off
2017-01-27 22:08:37 RPI_GPIO int Counter: 146
und das bei langer Betätigung:
2017-01-27 22:10:09 readingsProxy Licht_Flur_Oben on
2017-01-27 22:10:09 I2C_PCA9685 OUT_00 Port07: on
2017-01-27 22:10:09 I2C_PCA9685 OUT_00 Ok
2017-01-27 22:10:09 readingsProxy Taster_Licht_Flur_OG off
2017-01-27 22:10:09 I2C_PCF8574 INPUT_07 Port6: off
2017-01-27 22:10:09 I2C_PCF8574 INPUT_07 191
2017-01-27 22:10:09 RPI_GPIO int Pinlevel: high
2017-01-27 22:10:09 RPI_GPIO int on
2017-01-27 22:10:09 RPI_GPIO int Toggle: off
2017-01-27 22:10:09 RPI_GPIO int Counter: 150
Wie man sieht, kein Unterschied.
ZitatWie man sieht, kein Unterschied.
Was zu erwarten war ...
Hi,
soweit ich das verstehe hat das I2C_PCF8574 nur Readings (und Events) für Pegel (bzw. Pegeländerungen). Allerdings verstehe ich bei den zur Verfügung gestellten Event Logs nicht, dass nur "off" sichtbar ist. Wenn eine Taste gedrückt wird, dann müsste man ja einmal "on" und einmal "off" sehen, oder?
Sind die Event Logs wirklich komplett?
Gruß,
Thorsten
Hi,
Ich habe nur das Teil herauskopiert wo der Taster betätigt wird, so sieht der Komplette log aus:
2017-01-28 11:00:44 I2C_PCF8574 INPUT_00 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_01 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_02 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_03 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_04 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_05 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_06 255
2017-01-28 11:00:44 readingsProxy Licht_Flur_Oben on
2017-01-28 11:00:44 I2C_PCA9685 OUT_00 Port07: on
2017-01-28 11:00:44 I2C_PCA9685 OUT_00 Ok
2017-01-28 11:00:44 readingsProxy Taster_Licht_Flur_OG off
2017-01-28 11:00:44 I2C_PCF8574 INPUT_07 Port6: off
2017-01-28 11:00:44 I2C_PCF8574 INPUT_07 191
2017-01-28 11:00:44 RPI_GPIO int Pinlevel: high
2017-01-28 11:00:44 RPI_GPIO int on
2017-01-28 11:00:44 RPI_GPIO int Toggle: off
2017-01-28 11:00:44 RPI_GPIO int Counter: 256
2017-01-28 11:00:44 I2C_PCF8574 INPUT_00 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_01 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_02 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_03 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_04 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_05 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_06 255
2017-01-28 11:00:44 readingsProxy Taster_Licht_Flur_OG on
2017-01-28 11:00:44 I2C_PCF8574 INPUT_07 Port6: on
2017-01-28 11:00:44 I2C_PCF8574 INPUT_07 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_00 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_01 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_02 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_03 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_04 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_05 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_06 255
2017-01-28 11:00:44 I2C_PCF8574 INPUT_07 255
ich habe 8xPCF8574 an Raspberry mittels I2C angebunden. Die Gesamten Taster im Haus sind dran angebunden.
Definition vom PCF8574(am Beispiel nur ein Port):
##GPIO 00
define INPUT_00 I2C_PCF8574 0x38
attr INPUT_00 IODev i2c
attr INPUT_00 InputPorts 0 1 2 3 4 5 6 7
Definition vom Interrupt:
define int RPI_GPIO 21
attr int direction input
attr int active_low yes
attr int interrupt rising
attr int pud_resistor up
attr int userReadings get_INPUT_00 {fhem ("get INPUT_00,INPUT_01,INPUT_02,INPUT_03,INPUT_04,INPUT_05,INPUT_06,INPUT_07")}
Hi,
Zitat von: butaluk am 28 Januar 2017, 11:07:24
Ich habe nur das Teil herauskopiert wo der Taster betätigt wird, so sieht der Komplette log aus:
2017-01-28 11:00:44 I2C_PCF8574 INPUT_07 Port6: off
2017-01-28 11:00:44 I2C_PCF8574 INPUT_07 191
2017-01-28 11:00:44 I2C_PCF8574 INPUT_07 Port6: on
2017-01-28 11:00:44 I2C_PCF8574 INPUT_07 255
Ich habe das jetzt mal auf das gefiltert, von dem ich vermute, dass es die Taste ist. Ich nehme mal an, dass "off" beim Drücken der Taste kommt und "on" beim Loslassen. Das, was wir hier sehen, ist vermutlich der kurze Tastendruck.
Mach jetzt nochmal einen langen Tastendruck und zeige das Entsprechende. Da muss es ja auch irgendwo ein "off" und "on" geben.
Gruß,
Thorsten
Hi,
hier ist der log vom langen drücken:
2017-01-28 11:24:32 I2C_PCF8574 INPUT_00 255
2017-01-28 11:24:32 I2C_PCF8574 INPUT_01 255
2017-01-28 11:24:33 I2C_PCF8574 INPUT_02 255
2017-01-28 11:24:33 I2C_PCF8574 INPUT_03 255
2017-01-28 11:24:33 I2C_PCF8574 INPUT_04 255
2017-01-28 11:24:33 I2C_PCF8574 INPUT_05 255
2017-01-28 11:24:33 I2C_PCF8574 INPUT_06 255
2017-01-28 11:24:33 readingsProxy Licht_Flur_Oben on
2017-01-28 11:24:33 I2C_PCA9685 OUT_00 Port07: on
2017-01-28 11:24:33 I2C_PCA9685 OUT_00 Ok
2017-01-28 11:24:33 readingsProxy Taster_Licht_Flur_OG off
2017-01-28 11:24:33 I2C_PCF8574 INPUT_07 Port6: off
2017-01-28 11:24:33 I2C_PCF8574 INPUT_07 191
2017-01-28 11:24:33 I2C_PCF8574 INPUT_00 255
2017-01-28 11:24:33 I2C_PCF8574 INPUT_01 255
2017-01-28 11:24:33 I2C_PCF8574 INPUT_02 255
2017-01-28 11:24:33 I2C_PCF8574 INPUT_03 255
2017-01-28 11:24:33 I2C_PCF8574 INPUT_04 255
2017-01-28 11:24:33 I2C_PCF8574 INPUT_05 255
2017-01-28 11:24:33 I2C_PCF8574 INPUT_06 255
2017-01-28 11:24:33 I2C_PCF8574 INPUT_07 191
2017-01-28 11:24:38 I2C_PCF8574 INPUT_00 255
2017-01-28 11:24:38 I2C_PCF8574 INPUT_01 255
2017-01-28 11:24:38 I2C_PCF8574 INPUT_02 255
2017-01-28 11:24:38 I2C_PCF8574 INPUT_03 255
2017-01-28 11:24:38 I2C_PCF8574 INPUT_04 255
2017-01-28 11:24:38 I2C_PCF8574 INPUT_05 255
2017-01-28 11:24:38 I2C_PCF8574 INPUT_06 255
2017-01-28 11:24:38 readingsProxy Taster_Licht_Flur_OG on
2017-01-28 11:24:38 I2C_PCF8574 INPUT_07 Port6: on
2017-01-28 11:24:38 I2C_PCF8574 INPUT_07 255
2017-01-28 11:24:38 RPI_GPIO int Pinlevel: high
2017-01-28 11:24:38 RPI_GPIO int on
2017-01-28 11:24:38 RPI_GPIO int Toggle: off
2017-01-28 11:24:38 RPI_GPIO int Counter: 268
An der Zeit sieht man das der Taster 5 sec. lang gedrückt war.
Zitat von: butaluk am 28 Januar 2017, 11:27:26
2017-01-28 11:24:33 I2C_PCF8574 INPUT_07 Port6: off
2017-01-28 11:24:33 I2C_PCF8574 INPUT_07 191
2017-01-28 11:24:38 I2C_PCF8574 INPUT_07 Port6: on
2017-01-28 11:24:38 I2C_PCF8574 INPUT_07 255
An der Zeit sieht man das der Taster 5 sec. lang gedrückt war.
Ja, genau. Jetzt musst Du sozusagen nur noch die Zeit zwischen "off" und "on" messen. Das könnte mit FHEM-"Bordmitteln" in etwa so gehen. (Vielleicht gibt es dazu aber auch schon eine andere Lösung, die müsstest Du dann vielleicht im ensprechenden Forumsbereich erfragen. (Also in dem, wo auch PCF8574 besprochen wird.))
- Du legst ein notify an, das bei "off" triggert und ein "at" anlegt, das nach einer Sekunde (oder wie lange auch immer ein langer Tastendruck ist) das macht, was Du bei einem langen Tastendruck machen willst. Zusätzlich setzt Du in dem "at" noch ein Reading, das den langen Tastendruck anzeigt.
- Ein anderes notify triggert bei "on" und löscht das "at". Außerdem prüft es, ob das "long"-Reading gesetzt ist. Falls ja, dann das "long"-Reading zurücksetzen. Falls nein, dann ist das ein kurzer Tastendruck. In dem Fall das machen, was Du bei einem kurzen Tastendruck machen willst.
Ich habe das nicht ausprobiert, aber so würde ich es ggf. angehen.
Gruß,
Thorsten
Zitat von: Thorsten Pferdekaemper am 28 Januar 2017, 11:43:50
Ja, genau. Jetzt musst Du sozusagen nur noch die Zeit zwischen "off" und "on" messen. Das könnte mit FHEM-"Bordmitteln" in etwa so gehen. (Vielleicht gibt es dazu aber auch schon eine andere Lösung, die müsstest Du dann vielleicht im ensprechenden Forumsbereich erfragen. (Also in dem, wo auch PCF8574 besprochen wird.))
- Du legst ein notify an, das bei "off" triggert und ein "at" anlegt, das nach einer Sekunde (oder wie lange auch immer ein langer Tastendruck ist) das macht, was Du bei einem langen Tastendruck machen willst. Zusätzlich setzt Du in dem "at" noch ein Reading, das den langen Tastendruck anzeigt.
- Ein anderes notify triggert bei "on" und löscht das "at". Außerdem prüft es, ob das "long"-Reading gesetzt ist. Falls ja, dann das "long"-Reading zurücksetzen. Falls nein, dann ist das ein kurzer Tastendruck. In dem Fall das machen, was Du bei einem kurzen Tastendruck machen willst.
Ich habe das nicht ausprobiert, aber so würde ich es ggf. angehen.
Gruß,
Thorsten
Moin,
gute Idee. Löscht sich ein temporäres at nicht von selbst?
Ich würde trotzdem nochmal forschen ob man nicht wie in meinem Zitat die RPI_GPIO mit einbinden kann? In der wäre ja für Taster quasi schon alles geklärt. Oder hältst Du das für ausgeschlossen?
Gruß Otto
Zitat von: Otto123 am 28 Januar 2017, 11:49:43gute Idee. Löscht sich ein temporäres at nicht von selbst?
Doch, aber wenn es sich nur um einen kurzen Tastendruck handelt, dann ist das at noch da, wenn die Taste losgelassen wird. In dem Fall würde das at nach einer Sekunde ausgelöst werden und das machen, was bei einem langen Tastendruck passieren soll. Deshalb muss das at bei "on", also beim Loslassen gelöscht werden. Natürlich könnte man zuerst prüfen, ob es nicht ein langer Tastendruck war, aber ich habe festgestellt, dass es nichts ausmacht, ein at zu löschen, das es sowieso nicht mehr gibt.
Zitat
Ich würde trotzdem nochmal forschen ob man nicht wie in meinem Zitat die RPI_GPIO mit einbinden kann? In der wäre ja für Taster quasi schon alles geklärt. Oder hältst Du das für ausgeschlossen?
Ich weiß es nicht. Mir kommt es aber so vor, dass RPI_GPIO sozusagen darunter liegt und nicht darüber. ...aber da kann ich mich irren.
Gruß,
Thorsten
hier mal was Konkretes (lässt sich per Raw definition mit copy und paste übernehmen):
defmod di_t DOIF ([INPUT_07:"Port6: on"])()(set etwas langer Tastendruck) DOELSEIF ([INPUT_07:"Port6: off"] and $cmd == 1.1) (set etwas kurzer Tastendruck)
attr di_t do always
attr di_t wait 0,2
langer Tastendruck gilt hier ab zwei Sekunden.
Gruß
Damian
Zitat von: Damian am 28 Januar 2017, 12:20:18
[INPUT_07:"Port6: off"] and $cmd == 1.1)
Welche Wirkung hat dieser Ausdruck?
Zitat von: butaluk am 28 Januar 2017, 13:09:43
Welche Wirkung hat dieser Ausdruck?
Den folgenden Befehl nur innerhalb von 2 Sekunden ausführen. Das Modul arbeitet mit Zuständen, die man abfragen kann. Genauere Infos zum Modul findest du wie immer in der deutschen Commandref.
Hallo,
habe es jetzt so ausprobiert:
define Taster_Licht_Flur_OG readingsProxy INPUT_07:Port6
defmod di_t DOIF ([Taster_Licht_Flur_OG: on"])()(set Licht_Flur_Oben on) DOELSEIF ([Taster_Licht_Flur_OG: off"] and $cmd == 1.1) (set Licht_Flur_Oben on-for-timer 60)
attr di_t do always
attr di_t wait 0,2
Funktioniert leider nicht.
In der Logfile wird nichts eingetragen, egal ob kurz oder lange gedruckt wird.
Zu DOIF kann ich nichts sagen...
Gruß,
Thorsten
Zitat von: butaluk am 29 Januar 2017, 11:35:58
Hallo,
habe es jetzt so ausprobiert:
define Taster_Licht_Flur_OG readingsProxy INPUT_07:Port6
defmod di_t DOIF ([Taster_Licht_Flur_OG: on"])()(set Licht_Flur_Oben on) DOELSEIF ([Taster_Licht_Flur_OG: off"] and $cmd == 1.1) (set Licht_Flur_Oben on-for-timer 60)
attr di_t do always
attr di_t wait 0,2
Funktioniert leider nicht.
In der Logfile wird nichts eingetragen, egal ob kurz oder lange gedruckt wird.
Klar nicht, wenn du nur jedes zweite Anführungszeichen setzt, siehe mein Beispiel.
Versuche gerade die Funktion:
https://forum.fhem.de/index.php/topic,47219.0.html (https://forum.fhem.de/index.php/topic,47219.0.html)