FHEM mit neuem GPIO unter Linux 6.x
Worum geht es
Ich hatte über Jahre mir FHEM und dessen RPI_GPIO Modul auf einem Raspberry Pi 3B mit 32 Bit Debian 5.x meinen Gas- und Wasserverbrauch über die GPIO Anschlüsse des Pi ausgewertet. Leider musste ich das System neu aufsetzen wofür ich das neuste DietPi als OS nahm. Nach dem Einspielen der alten FHEM Config in das frisch installierte FHEM ging aber leider nichts mehr und ich habe mich durch etliche Forenbeiträge gekämpft und mit viel try & error das Ganze wieder zum Laufen gebracht. Hier möchte ich in einer kurzen Zusammenfassung zeigen wie es geht.
Das Vorgehen
Als erstes muss man eine aktuelle Version der WiringPi Library installieren. Das Projekt wurde irgendwann eingestellt, aber wird inzwischen wieder weiterentwickelt so das man aktuelle Binaries bekommt. Ihr findet das Projekt unter https://github.com/WiringPi/WiringPi.
Für den Pi geht man so vor:
Auf der Seite https://github.com/WiringPi/WiringPi/releases schaut man nach welche die aktuelle Version ist. Zu diesem Zeitpunkt ist das die 3.14. In der bash/sh Konsole folgendes eingeben:
cd /home
wget https://github.com/WiringPi/WiringPi/releases/download/3.14/wiringpi_3.14_arm64.deb
apt install -y /home/wiringpi_3.14_arm64.deb
Nachdem das erledigt ist könnt ihr mit dem Befehl gpio readall
das Layout eures Pi anzeigen lassen. Das sieht bei mir so aus:
+-----+-----+---------+------+---+---Pi 3B--+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5v | | |
| 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 0 | IN | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | IN | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 1 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+---Pi 3B--+---+------+---------+-----+-----+
MERKE: Die BCM Spalten sind die die eure GPIO Nummern enthalten die ihr später konvertieren müsst!!!
Nun könnt ihr mit dem Befehl cat /sys/kernel/debug/gpio
sehen welche GPIO Nummern jetzt gültig sind. Bei mir sieht das so aus:
gpiochip0: GPIOs 512-565, parent: platform/3f200000.gpio, pinctrl-bcm2835:
gpio-512 (ID_SDA )
gpio-513 (ID_SCL )
gpio-514 (GPIO2 )
gpio-515 (GPIO3 )
gpio-516 (GPIO4 )
gpio-517 (GPIO5 )
gpio-518 (GPIO6 )
gpio-519 (GPIO7 )
gpio-520 (GPIO8 )
gpio-521 (GPIO9 )
gpio-522 (GPIO10 )
gpio-523 (GPIO11 )
gpio-524 (GPIO12 )
gpio-525 (GPIO13 )
gpio-526 (GPIO14 )
gpio-527 (GPIO15 )
gpio-528 (GPIO16 )
gpio-529 (GPIO17 |sysfs ) in lo IRQ ACTIVE LOW
gpio-530 (GPIO18 )
gpio-531 (GPIO19 )
gpio-532 (GPIO20 )
gpio-533 (GPIO21 )
gpio-534 (GPIO22 )
gpio-535 (GPIO23 |sysfs ) in hi IRQ ACTIVE LOW
gpio-536 (GPIO24 |sysfs ) in hi IRQ ACTIVE LOW
gpio-537 (GPIO25 )
gpio-538 (GPIO26 )
gpio-539 (GPIO27 )
gpio-540 (NC )
gpio-541 (LAN_RUN_BOOT )
gpio-542 (CTS0 )
gpio-543 (RTS0 )
gpio-544 (TXD0 )
gpio-545 (RXD0 )
gpio-546 (SD1_CLK )
gpio-547 (SD1_CMD )
gpio-548 (SD1_DATA0 )
gpio-549 (SD1_DATA1 )
gpio-550 (SD1_DATA2 )
gpio-551 (SD1_DATA3 )
gpio-552 (PWM0_OUT )
gpio-553 (PWM1_OUT )
gpio-554 (ETH_CLK )
gpio-555 (WIFI_CLK )
gpio-556 (SDA0 )
gpio-557 (SCL0 )
gpio-558 (SMPS_SCL )
gpio-559 (SMPS_SDA )
gpio-560 (SD_CLK_R )
gpio-561 (SD_CMD_R )
gpio-562 (SD_DATA0_R )
gpio-563 (SD_DATA1_R )
gpio-564 (SD_DATA2_R )
gpio-565 (SD_DATA3_R )
gpiochip1: GPIOs 566-567, parent: platform/soc:firmware:virtgpio, brcmvirt-gpio, can sleep:
gpio-566 ( |ACT ) out hi
gpiochip2: GPIOs 568-575, parent: platform/soc:firmware:expgpio, raspberrypi-exp-gpio, can sleep:
gpio-568 (BT_ON |shutdown ) out hi
gpio-569 (WL_ON )
gpio-570 (STATUS_LED )
gpio-571 (LAN_RUN )
gpio-572 (HDMI_HPD_N )
gpio-573 (CAM_GPIO0 |cam1_regulator ) out lo
gpio-574 (CAM_GPIO1 )
gpio-575 (PWR_LOW_N |PWR ) in hi
gpiochip3: GPIOs 576-579, parent: usb/1-1.4:1.0, ftdi-cbus, can sleep:
Anhand dieser beiden Tabellen könnt ihr nun die GPIO Nummer bestimmen die ihr in FHEM bei der Definition eures Geräts eingeben müsst.
Beispiel:
Wenn eure FHEM Definition bislang lautete defmod MyDevice RPI_GPIO 23
dann sucht ihr in der ersten Tabelle in der BCM Spalte nach 23, dann schaut ihr in der 2. Tabelle nach den in Klammern stehen Werten nach GPIO23 und dann ist der neue Wert gpio-535. Ihr nehmt nur die 535 und dann lautet die neue Definition defmod MyDevice RPI_GPIO 535
.
Falls das nicht funktioniert kann es sein das manche Berechtigungen noch nicht richtig gesetzt sind. Diese könnt ihr mit sudo chown -R fhem:root /sys/class/gpio/*
erledigen und auch noch zusätzlich fhem als User in der Gruppe gpio angeben mit sudo adduser fhem gpio
Leider kann es auch sein dass in FHEM im RPI_GPIO die Attribute direction
und pud_resistor
nicht funktionieren. Dafür gibt es einen einfache Workaround. Mit dem Bash Befehl pinctrl
bekommt ihr eine Aufstellung die bei mit so aussieht:
0: ip -- | hi // ID_SDA/GPIO0 = input
1: ip -- | hi // ID_SCL/GPIO1 = input
2: ip -- | hi // GPIO2 = input
3: ip -- | hi // GPIO3 = input
4: ip -- | hi // GPIO4 = input
5: ip -- | hi // GPIO5 = input
6: ip -- | hi // GPIO6 = input
7: ip -- | hi // GPIO7 = input
8: ip -- | hi // GPIO8 = input
9: ip -- | lo // GPIO9 = input
10: ip -- | lo // GPIO10 = input
11: ip -- | lo // GPIO11 = input
12: ip -- | lo // GPIO12 = input
13: ip -- | lo // GPIO13 = input
14: ip -- | lo // GPIO14 = input
15: ip -- | hi // GPIO15 = input
16: ip -- | lo // GPIO16 = input
17: ip -- | lo // GPIO17 = input
18: ip -- | lo // GPIO18 = input
19: ip -- | lo // GPIO19 = input
20: ip -- | lo // GPIO20 = input
21: ip -- | lo // GPIO21 = input
22: ip -- | lo // GPIO22 = input
23: ip -- | hi // GPIO23 = input
24: ip -- | hi // GPIO24 = input
25: ip -- | lo // GPIO25 = input
26: ip -- | lo // GPIO26 = input
27: ip -- | lo // GPIO27 = input
28: ip -- | lo // NC/GPIO28 = input
29: ip -- | hi // LAN_RUN_BOOT/GPIO29 = input
30: ip -- | lo // CTS0/GPIO30 = input
31: ip -- | lo // RTS0/GPIO31 = input
32: a3 -- | hi // TXD0/GPIO32 = TXD0
33: a3 -- | hi // RXD0/GPIO33 = RXD0
34: ip -- | hi // SD1_CLK/GPIO34 = input
35: ip -- | hi // SD1_CMD/GPIO35 = input
36: ip -- | hi // SD1_DATA0/GPIO36 = input
37: ip -- | hi // SD1_DATA1/GPIO37 = input
38: ip -- | hi // SD1_DATA2/GPIO38 = input
39: ip -- | hi // SD1_DATA3/GPIO39 = input
40: a0 -- | lo // PWM0_OUT/GPIO40 = PWM0
41: a0 -- | lo // PWM1_OUT/GPIO41 = PWM1
42: a0 -- | hi // ETH_CLK/GPIO42 = GPCLK1
43: a0 -- | lo // WIFI_CLK/GPIO43 = GPCLK2
44: ip -- | hi // SDA0/GPIO44 = input
45: ip -- | hi // SCL0/GPIO45 = input
46: ip -- | hi // SMPS_SCL/GPIO46 = input
47: op -- -- | hi // SMPS_SDA/GPIO47 = output
48: a0 -- | lo // SD_CLK_R/GPIO48 = SD0_CLK
49: a0 -- | hi // SD_CMD_R/GPIO49 = SD0_CMD
50: a0 -- | hi // SD_DATA0_R/GPIO50 = SD0_DAT0
51: a0 -- | hi // SD_DATA1_R/GPIO51 = SD0_DAT1
52: a0 -- | hi // SD_DATA2_R/GPIO52 = SD0_DAT2
53: a0 -- | hi // SD_DATA3_R/GPIO53 = SD0_DAT3
Zum Testen könnt ihr wenn ihr z.B. GPIO23 auf input und den pud resistor auf up setzen wollt mit dem Bash Befehl pinctrl set 23 ip pu
erledigen und beobachten ob euer FHEM Device das tut was es tun soll. Empfehlenswert ist auch ein shutdown restart
Befehl in FHEM um die Änderungen zu übernehmen.
Leider gehen die pinctrl set
Einstellungen nach einem Reboot eures Pi’s verloren. Um diese dauerhaft zu machen müsst ihr mit dem Bash Befehl sudo nano /boot/config.txt
den Texteditor starten und in der letzten Zeile der geladenen Datei folgendes anfügen (in meine Beispiel für GPIO Port 23):
#-------GPIO settings-------
gpio=23=pu,ip
Falls ihr mehrere GPIO Ports mit den selben Einstellungen verewigen wollt dann kann die Zeile z.B. so aussehen: gpio=17,23,24=pu,ip
Mir Steuerung+o speichern und mit Steuerung+x den Nano Editor verlassen.
Tipp
Bei mir hat es nicht gereicht in FHEM bei den schon vorhadenen Devices in der Definition einfach die GPIO Nummer auszutauschen, sondern ich musste die Devices löschen und neu anlegen. Erst danach hat es funktioniert wie es soll.
Ich würde jetzt den Pi nochmal neu starten und schauen ob alles noch geht.
Viel Erfolg und Spass damit!
Neueste Kommentare