Hauptmenü

FHEM un GPIO

Begonnen von Patrick, 28 Februar 2013, 16:11:54

Vorheriges Thema - Nächstes Thema

Patrick

Hallo,

ich habe jetzt schon das halbe Internet abgesucht aber leider noch nichts brauchbares gefunden..:-(

Wie kann ich im FHEM den Status der der GPIOs auslesen?

Ich habe den GPIO18 als Eingang definiert und testweise eine Platinie mit einem Taster und Wiederstand angeschlossen. Wenn ich den Taster betätige ändert sich der Wert in der /sys/class/gpio/gpio18/value von 0 auf 1. Genau diese Änderung bräuchte ich irgendwie im FHEM

Vielen Dank

Patrick

fladdy

Zitat von: Patrick schrieb am Do, 28 Februar 2013 16:11Hallo,

Wie kann ich im FHEM den Status der der GPIOs auslesen?

Ich habe den GPIO18 als Eingang definiert und testweise eine Platinie mit einem Taster und Wiederstand angeschlossen. Wenn ich den Taster betätige ändert sich der Wert in der /sys/class/gpio/gpio18/value von 0 auf 1. Genau diese Änderung bräuchte ich irgendwie im FHEM

Hallo Patrick,

Soweit ich weiß gibt es kein FHEM-Modul, das die Sache vereinfacht. Ich habe ein Script geschrieben, das man als Startpunkt nehmen könnte. Abgelegt ist es hier im Forum unter Link. Das perl-script benötig ein übersetztes C-Programm zum vereinfachten Management der GPIO-Ports; die entsprechende URL, wo das heruntergeladen werden kann, ist im Quellcode angegeben. Das muss aber noch übersetzt, mit den richtigen Attributen versehen und in den richtigen Pfad kopiert werden.

Um das Script einsetzen zu können, müsstest Du im Quelltext den/die Port (18, ..) einstellen, der/die überwacht werden sollen.  An der Stelle, an der die Interrupts ausgewertet werden, müsstest Du dann einen in FHEM von Dir definierten Dummy "schalten". (Ich habe übrigens festgestellt, dass ein wget viel schneller als ein fhem-Aufruf zur gewünschten Aktion führt.

Dann kannst Du erst einmal an der Linux-Konsole testen, ob das funktioniert. Später kannst Du dann eventuell das Script, wenn Du es Deinen Wünschen entsprechend angepasst hast, automatisch starten. Hier http://www.debian-administration.org/articles/28 könntest Du fündig werden.

Eine "Problem" könnte es aber geben. Alle mechanischen Taster prellen. Das kann man per Hardware abfangen; in der Regel wird das aber über Software gelöst (google "taster entprellen" oder "switch debouncing"). Ich war aber zu faul, weil ich das Script nur verwende, um einen über ein Relais sauber geschalteten GPIO-Port auszuwerten. Irgendwann werde ich das Script sicher mal anpassen oder vielleicht sogar mal ein Modul daraus machen - momentan steht aber der Frühling vor der Tür ... :)

Also ... insgesamt vielleicht ein wenig zu viel Gefrickel ... aber dafür bist Du am Ende schlauer, wenn es läuft ;-)

Grüße
Fladdy

Patrick

Hallo fladdy,

Vielen Dank für die Antwort, werde es heute abend mal testen.

Gruß
Patrick

Patrick

Hallo Fladdy,

in der Shell bekomme ich jetzt mit Hilfe der Scripte die korrekten Rückgabewerte des GPIO 18 heraus, in Fehm dachte ich jetzt an sowas....

define GPIO18 dummy

define act_on_gpio_18 notify GPIO18 {\
 if ("%" ne "0") {\
   perl("GPIOinterrupt 18 1 &")\
 } else {\
   perl("GPIOinterrupt 18 0 &")\
 }\
}

könnte das so hinkommen?

Gruß
Patrick

fladdy

Zitat von: Patrick schrieb am Di, 05 März 2013 14:25Hallo Fladdy,

in der Shell bekomme ich jetzt mit Hilfe der Scripte die korrekten Rückgabewerte des GPIO 18 heraus, in Fehm dachte ich jetzt an sowas....

define GPIO18 dummy

define act_on_gpio_18 notify GPIO18 {\
 if ("%" ne "0") {\
   perl("GPIOinterrupt 18 1 &")\
 } else {\
   perl("GPIOinterrupt 18 0 &")\
 }\
}

könnte das so hinkommen?

Das geht so leider nicht.

Zumindest nicht mit dem GPIOinterrupt-Script, das ich geschrieben und hochgeladen hatte. Denn ein Aufruf "GPIOinterrupt 18 0 &" würde ja bedeuten, dass das Script zwei Übergabeparameter (18 und 0) auswertet. Meine Quick-and-Dirty-Variante kann das nicht. Da musst Du im Quellcode ändern, welche GPIO-Ports überwacht werden. Die Stelle ist:

my @pins = qw(23 24 25); # GPIO ports to be set as input and monitored

und müsste jetzt so aussehen:

my @pins = qw(18);        # GPIO ports to be set as input and monitored

Hast Du da was angepasst?

Außerdem war mein Script nicht dafür gedacht, aus FHEM heraus aufgrund eines notify aufgerufen zu werden.

Stattdessen rufst Du es an der Konsole auf (wie es bei Dir ja schon geklappt zu haben scheint) oder Du startest es automatisch beim Hochfahren (Link hatte ich in meinem vorherigen Post genannt).

Im Code des Beispielscripts müsstest Du eigentlich sowas haben:

# interface FHEM
if ($handlePins{$fh} == 18) {
system('/opt/fhem/fhem.pl 7072 "set GPIO18 toggle"');
}

oder alternativ (geht bei mir schneller, "deinRaspi" natürlich ersetzen)

# interface FHEM
if ($handlePins{$fh} == 18) {
                 system('wget -q --delete-after http://deinRaspi:8083/fhem?cmd=set+GPIO18++toggle');
}

Anschließend könntest Du innerhalb von FHEM mit einem Notify auf Änderungen vom dummy Namens GPIO18 reagieren.

Grüße
Fladdy

Patrick

Hallo fladdy,

jetzt konnte ich das ganze gestern mal testen und ich muss sagen es hat auf Anhieb geklappt.

Irgendwie habe ich das in dem Beispielscript gar nicht gesehen (Manchmal sieht mal halt den Wald vor lauter Bäumen nicht) aber im nachhinein leuchtet das ganze dann ein.


Vielen Dank für die Weiterhilfe und die ausführliche Beschreibung.

Gruß Patrick