Raspberrys GPIOs per FHEM schalten und auslesen

Ich persönlich bevorzuge kabellose Systeme bzw. Sensoren / Aktoren. Wie zum Beispiel die WeMos-Boards im Zusammenhang mit ESP Easy. Durch den Funkkontakt kann man die Sensoren / Aktoren frei platzieren und ist somit unabhängiger. Dennoch kann es vorkommen, dass man Aktoren / Sensoren direkt am Raspberry anschließen möchte. Der Raspberry bietet ja durch seine Vielzahl an GPIOs bereits die besten Vorraussetzungen. 

In diesem Beitrag möchte ich euch zeigen, wie ihr die GPIOs vom Raspberry mit FHEM schalten und auslesen könnt. Im folgenden habe ich mit einem Raspberry Pi 3 gearbeitete. Da die GPIO-Anschlussleiste jedoch identisch mit den vorigen Modellen ist, kann diese Anleitung problemlos mit älteren Raspberrys durchgeführt werden.

Raspberry Pi 3 Model B ARM-Cortex-A53 4x 1,2GHz, 1GB RAM,...
RASPBERRY PI - Personal Computers
31,99 EUR

Letzte Aktualisierung am 22.05.2018 / Affiliate Links / Bilder von der Amazon Product Advertising API

Vorbereitung

Bevor mit der Definition in FHEM begonnen werden kann, sind ein paar Vorraussetzungen auf dem Raspberry selbst notwendig. 

Zum einen sollte "WiringPi" installiert werden. Es wird zwar nicht unbedingt benötigt, kann jedoch später Fehler verhindern, wenn man es dann doch noch benötigt. Um genau zu sein, wird WiringPi benötigt, wenn die internen PullUp-Wiederstände verwendet werden sollen oder wenn der FHEM-User keine Zugriffsrechte auf die GPIOs hat.

sudo apt-get install git-core
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build
sudo reboot

Alternativ könnt ihr wiringPi auch über apt-get installieren.

sudo apt-get install wiringPi
sudo reboot

Des Weiteren ist wichtig, dass FHEM zugriff auf die GPIOs erhält. Dazu einfach den Benutzer "fhem" der Gruppe "gpio" hinzufügen.

sudo adduser fhem gpio
sudo reboot

wiringPi - GPIOs steuern ohne FHEM

Bevor ich nun FHEM mit an Board hole, möchte ich euch zunächst kurz zeigen, wie ihr die GPIOs vom Raspberry mit wiringPi steuern könnt. 

Befehle für wiringPi werden mit einem "gpio" eingeleitet. Um den Modus des GPIOs festzulegen, kann man folgenden Befehl verwenden:

gpio mode <PIN> in / out / pwm / up / down / tri
  • in --> Eingang
  • out --> Ausgang
  • pwm --> Pulsweitenmodulation
  • up --> interner Pull-Up-Widerstand aktivieren
  • down --> interner Pull-Down-Widerstand
  • tri --> offener Kollektor

Standardmäßig verwendet wiringPi seine eigene Pin-Bezeichnung. Aufgerufen kann dieser über folgenden Befehl:

gpio readall

Unter "Physical" sieht man die eigentliche Bezeichnung der PINs. Unter "BCM" wird die GPIO-Bezeichnung des Raspberrys angezeigt. Unter "wPi" die verwendete Bezeichnung von "wiringPi". Möchte man nun also Pin12 (GPIO18) schalten, so ist dies bei wiringPi GPIO1. 

gpio mode <PIN> <Mode>
gpio mode 1 out
gpio write <PIN> <Wert>
gpio write 1 1

Wem das ein bisschen verwirrt, der kann durch eine zusätzliche Option beim Befehl auf die Bezeichnung vom Raspberry zurückgreifen. 

gpio -g write 18 1

Um den GPIO als Eingang zu betreiben und dessen Status abzufragen, geht man wie folgt vor:

gpio -g mode 18 in
gpio -g read 18

Betreibt man den GPIO im pwm-Mode, so können Werte zwischen 0-1023 verwendet werden.

gpio -g mode 18 pwm
gpio -g write 18 512

GPIOs schalten

Als erstes möchte ich den einfachsten Anwendungsfall zeigen, dass einfache An- und Ausschalten eines GPIOs. Also das Setzen einen Ausganges auf HIGH bzw. LOW. Um es zu besser zu visualisieren, habe ich eine LED an den entsprechenden PIN angeschlossen.  

FHEM bietet bereits ein Modul zum Schalten von GPIOs - das Modul "RPI_GPIO". 

define [Name] RPI_GPIO [port]

INFO: Es muss hier die GPIO-Nummer angegebene werden. Nicht die PIN-Nummer.

Für jeden Port (GPIO) den man schalten möchte, muss ein separates Device angelegt werden. Für GPIO18 lautet die Definition wie folgt:

define GPIO18 RPI_GPIO 18

Um den GPIO nun Schalten zu können, muss dieser noch als Ausgang definiert werden.

attr GPIO18 direction output

GPIO-Status einlesen

Das Gegenstück zum Schalten ist das Einlesen des aktuellen Pegels am GPIO. Die Vorgehensweise ist relativ ähnlich. Der Unterschied liegt im Attribut "direction". Definiert man den GPIO als Input, kann man den aktuellen Status des GPIOs auslesen.

define GPIO21 RPI_GPIO 21
attr GPIO21 direction input

Nach einem "set GPIO21 readValue" wird der aktuelle Status des GPIOs als Reading angezeigt.

Im jetzigen Zustand werden die Readings nur über den Set-Befehl "set GPIO21 readValue" aktualisiert.

Möchte man, nur zu bestimmten Zeiten den Status abfragen, so muss man das Attribut "poll_interval" setzen. Das Attribut gibt in Minuten den Aktualisierungsintervall an. Für eine Abfrage alle 5 Minuten lautet das Attribut wie folgt:

attr GPIO21 poll_intervall 5

Möchte man eine Änderung der Readings in Echtzeit, so kann man durch Setzen des Attributs "interrupt" eine Flankenerkennung einrichten.

attr GPIO21 interrupt <none | falling | rising | both>
  • none --> keine Flankenerkennung
  • falling --> fallende Flanken führen zu einer Reading-Aktualisierung
  • rising --> steigende Flanken führen zu einer Reading-Aktualisierung
  • both --> fallende und steigende Flanken führen zu einer Reading-Aktualisierung

Bei einem Taster oder Schalter am GPIO empfehle ich euch, das Attribut auf "both" zu setzen, damit neben dem Drücken auch das Loslassen bzw. erneutes Drücken erkannt wird.  

Pull-Up / Pull-Down Widerstände aktivieren

Dadurch, dass wiringPi installiert wurde, kann man über FHEM die Pull-Up bzw. Pull-Down Widerstände aktivieren. Dies geschieht über das Attribut "pud_resistor".

attr GPIO21 pud_resistor <off ] up | down>

Ich hoffe ich konnte euch verständlich erklären, wie ihr die GPIOs vom Raspberry über FHEM steuern könnt. Dank des FHEM-Moduls "RPI_GPIO" ist das Einrichten kinderleicht. 

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
Fotos und Bilder
 
 
 
sonstiges Dateiformat
 
 
 
  Subscribe  
Benachrichtige mich zu: