Test GPIO am Raspberry 5 (ohne wiringpi)

Begonnen von Adimarantis, 28 Dezember 2023, 19:07:23

Vorheriges Thema - Nächstes Thema

Adimarantis

Nachdem ja WiringPi nicht mehr gewartet wird und auf dem Rapsberry 5 nicht mehr unterstützt wird und FHEM RPI_GPIO auch auf WiringPi angewiesen ist, heisst das m.E. aktuell, dass FHEM (sofern etwas mit GPIO gemacht werden soll) auf dem Raspi5 nicht funktioniert.

Ich hab mich heut mal hingesetzt und testweise eine Perl-Anbindung von libgpiod gebastelt. Das sollte ja die aktuell noch unterstützte API sein.

Das ist jetzt wirklich nur mal ein "Proof of Concept". Auf meinem Raspi400 funktioniert damit zumindest, dass ich eine LED ein- und ausschalten kann. Die API kann so sicher nicht bleiben und weiterführende Funktionen wie PWM oder Interrupts hab ich mir noch nichtmal angeschaut wie/ob die gehen.

Mich würde aber trotzdem mal interessieren ob zumindest das, was ich da zusammengestrickt habe auf einem Raspi 5 gehen würde.

Also wer Lust und Zeit hat, mal https://github.com/bublath/rpi-gpiod ansehen.

Jörg

Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Michael70

Hallo Jörg,
jetzt hast du mich tatsächlich (kurzfristig) ein wenig verunsichert, ich meine aber WiringPi wird nicht zwangsläufig benötigt.
Zumindest verwende ich FHEM 6.2 auf meinem Raspberry Pi mit Bullseye und auch dort ist schon kein WiringPi (per default) installiert.
Da ich alle meine Peripherie über die GPIO's schalte hätte ich sonst tatsächlkich ein (zukünftiges) Problem.

VG, Michael

define Pin22_RPL RPI_GPIO 25
attr Pin22_RPL direction output
#   DEF        25
#   FUUID      658ac8a0-f33f-11b5-aba0-22e2e294ee572986
#   GPIO_Basedir /sys/class/gpio
#   GPIO_Nr    25
#   NAME       Pin22_RPL
#   NR         44
#   STATE      on
#   TYPE       RPI_GPIO
#   WiringPi_gpio
#   eventCount 1
#   READINGS:
#     2023-12-29 19:13:07   Pinlevel        low
#     2023-12-29 19:13:19   state           on
#   fhem:
#     interfaces switch
#
setstate Pin22_RPL on
setstate Pin22_RPL 2023-12-29 19:13:07 Pinlevel low
setstate Pin22_RPL 2023-12-29 19:13:19 state on

Raspberry Pi 4 (Raspberry OS Bullseye), FHEM 6.2, 1-Wire USB Busmaster. Anwendung: Kellerlüftung und Heizung Zirkulationspumpe, Balkon PV Überschuss Steuerung

Adimarantis

Hab mir RPI_GPIO nochmal etwas näher angeschaut und ich vermute mal, dass WiringPi nur für bestimmte Varianten von Hardware und OS benötigt wird. Wann genau ist mir jetzt auf Anhieb auch nicht klar.
Ich weiss nur, dass ich bei meinem Raspberry1 mit BullsEye Probleme mit den GPIO hatte, bis ich WiringPi geupdated hatte.

Außerdem hatte ich irgendwo gelesen, dass sich mit dem Raspberry 5 und/oder Bookworm etwas ändert (ob das jetzt RPI_GPIO betrifft oder nicht ist unklar) und vorallem WiringPi nicht mehr funktioniert.

Da hab ich wohl mehr Panik geschürt als notwendig.

Gibt es Raspi5/Bookworm Nutzer die da mehr wissen?
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Stelaku

Hallo alle zusammen

Ich habe mein System auch kpl. über GPIO´s vom Raspberry Pi und mit den Port Expander MCP23017 Kabelgebunden am laufen.
Mein aktives System läuft noch auf einen 3er Pi mit Buster und wiringpi ohne Probleme.
Auf meinen 4er Pi und bis Bullseye geht auch noch alles.
Aber ab bookworm gehen nur noch die GPIO als Ausgänge zu schalten.
Als Eingänge mit dem Modul RPI_GPIO lassen sich mit bookworm nur noch
GPIO1
GPIO2
GPIO3
GPIO4
GPIO5
GPIO6
GPIO7
GPIO8
GPIO14
GPIO15
verwenden.

So wie ich das gelesen haben wird wiringpi nur bei Verwendung der GPIOs als Eingänge benötigt um die Pull up oder Pull downs zu setzten.
Ich habe mir jetzt mit einer kleinen Brücke über python-fhem und GPIOZero in einen Python script die Eingänge wieder nutzbar gemacht.
Keine schöne Lösung ich hoffe das sich da noch was tut.

Viele Grüsse

Stephan





Adimarantis

Ich hab jetzt mal testweise Bookworm (64 Bit) auf meinem Raspi400 installiert (komplette Neuinstallation, kein upgrade).
Obwohl kein wiringPi installiert ist, kann ich GPIO21 und GPIO12 (mehr hab ich jetzt Stichprobenartig nicht probiert) sowohl schalten, als auch als Eingang (inkl. Interrupt) verwenden.

Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

klausw

WiringPi ist für die Funktionalität des Moduls nicht vonnöten.
Auf die Gpios wird direkt über Sysfs zugegriffen (/sys/class/gpio).
WiringPi kann zur Ansteuerung verwendet werden, das ist noch aus historischen Gründen drin, aber nicht zu empfehlen. Außerdem konnte man über WiringPi bei Inputs einen internen Pullup Widerstand aktivieren, was über sysfs nicht möglich ist.
Ich habe testweise Raspberry Pi OS Lite 64bit Bookworm (December 11th 2023) auf einem Pi4 installiert und konnte beispielsweise Gpio 25 und 25 auch als Input nutzen.
Es ist möglich, das andere installierte Dienste die Gpios nutzen und diese teilweise blockieren.
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

CBUser

Habe einen Pi5 neu installiert, ein fhem-Backup des Pi4 (mit WiringPi) erstellt und ins frisch installierte fhem auf den Pi5 eingespielt. GPIOs kann ich auf dem Pi5 nicht mehr ansprechen, weder als Output noch als Input. Was mich sehr wundert, I2C über die GPIOs funktioniert. Problem:  leider kann ich durch den fehlenden GPIO-Eingang nicht mehr auf Interrupts des I2C reagieren. Kennt jemand eine Lösung, um zumindest einen GPIO als Input verwenden zu können? Muss ich ggf. durch das Einspielen der Sicherung mit dem nicht mehr funktionierenden WiringPi irgendetwas deaktivieren, verändern oder löschen?

Stelaku

#7
Hallo CBUser

Ich habe mir bei meinen PI 4 über ein Pyhton script das per mqtt an mein Fhem sendent provisorisch geholfen.
Folgendes habe im home Verzeichnis ausgeführt
Damit wird erstmal pip installiert um danach paho-mqtt über pip zu installiernen danach kommt python3-gpiozero
sudo apt-get install -y pip
pip install --break-system-packages "paho-mqtt<2.0.0"
pip install --break-system-packages paho-mqtt
sudo apt install python3-gpiozero

hier mal mein pyhton script
das ich auch im home Verzeichnis mit
sudo nano Taster.py
angelegt habe und diesen code eingefühgt habe.

import logging
import time
import paho.mqtt.client as mqtt
import sys
from gpiozero import LED
from gpiozero import Button

broker_address="localhost"
port = 1883
client = mqtt.Client("GPIO")
username = 'Dein username'
password = 'Dein password'
client.username_pw_set(username, password)
client.connect(broker_address, port)

client.loop_start()

block4  = 0
GPIO4   = Button(4)

block17 = 0
GPIO17  = Button(17)

block27 = 0
GPIO27  = Button(27)

block5 = 0
GPIO5  = Button(5)

block19 = 0
GPIO19  = Button(19)

block26 = 0
GPIO26  = Button(26)

block21 = 0
GPIO21  = Button(21)

block20 = 0
GPIO20  = Button(20)

block12 = 0
GPIO12  = Button(12)

block1 = 0
GPIO1  = Button(1)

block7 = 0
GPIO7  = Button(7)

block8 = 0
GPIO8  = Button(8)

block18 = 0
GPIO18  = Button(18)

while True:
    if GPIO4.is_pressed and block4 == 0:
        client.publish("GPIO4", "on", 0)
        block4 = 1
    if GPIO4.is_pressed == False and block4 == 1:
        client.publish("GPIO4", "off", 0)
        block4 = 0


    if GPIO17.is_pressed and block17 == 0:
        client.publish("GPIO4", "on", 0)
        block17 = 1
    if GPIO17.is_pressed == False and block17 == 1:
        client.publish("GPIO17", "off", 0)
        block17 = 0

    if GPIO27.is_pressed and block27 == 0:
        client.publish("GPIO27", "on", 0)
        block27 = 1
    if GPIO27.is_pressed == False and block27 == 1:
        client.publish("GPIO27", "off", 0)
        block27 = 0

    if GPIO5.is_pressed and block5 == 0:
        client.publish("GPIO5", "on", 0)
        block5 = 1
    if GPIO5.is_pressed == False and block5 == 1:
        client.publish("GPIO5", "off", 0)
        block5 = 0

    if GPIO19.is_pressed and block19 == 0:
        client.publish("GPIO19", "on", 0)
        block19 = 1
    if GPIO19.is_pressed == False and block19 == 1:
        client.publish("GPIO19", "off", 0)
        block19 = 0

    if GPIO26.is_pressed and block26 == 0:
        client.publish("GPIO26", "on", 0)
        block26 = 1
    if GPIO26.is_pressed == False and block26 == 1:
        client.publish("GPIO26", "off", 0)
        block26 = 0

    if GPIO21.is_pressed and block21 == 0:
        client.publish("GPIO21", "on", 0)
        block21 = 1
    if GPIO21.is_pressed == False and block21 == 1:
        client.publish("GPIO21", "off", 0)
        block21 = 0

    if GPIO20.is_pressed and block20 == 0:
        client.publish("GPIO20", "on", 0)
        block20 = 1
    if GPIO20.is_pressed == False and block20 == 1:
        client.publish("GPIO20", "off", 0)
        block20 = 0

    if GPIO12.is_pressed and block12 == 0:
        client.publish("GPIO12", "on", 0)
        block12 = 1
    if GPIO12.is_pressed == False and block12 == 1:
        client.publish("GPIO12", "off", 0)
        block12 = 0

    if GPIO1.is_pressed and block1 == 0:
        client.publish("GPIO1", "on", 0)
        block1 = 1
    if GPIO1.is_pressed == False and block1 == 1:
        client.publish("GPIO1", "off", 0)
        block1 = 0

    if GPIO7.is_pressed and block7 == 0:
        client.publish("GPIO7", "on", 0)
        block7 = 1
    if GPIO7.is_pressed == False and block7 == 1:
        client.publish("GPIO7", "off", 0)
        block7 = 0

    if GPIO8.is_pressed and block8 == 0:
        client.publish("GPIO8", "on", 0)
        block8 = 1
    if GPIO8.is_pressed == False and block8 == 1:
        client.publish("GPIO8", "off", 0)
        block8 = 0

    if GPIO18.is_pressed and block18 == 0:
        client.publish("GPIO18", "on", 0)
        block18 = 1
    if GPIO18.is_pressed == False and block18 == 1:
        client.publish("GPIO18", "off", 0)
        block18 = 0


    else:
        time.sleep(0.05)



Username und Password bitte anpassen und
natürlich nicht vergessen diese Datei ausführbar machen

sudo chmod +x Taster.py
dann noch mit systemd autostarten

folgende Datei mit öffnen
sudo nano /etc/systemd/system/Taster.serviceund mit diesem inhalt füllen bitte stephan mit Deinem Datei Pfad ersetzten
[Unit]
Description=Start TasterGPIO
After=multi-user.target

[Service]
Type=idle
User=stephan

ExecStart=/usr/bin/python3 /home/stephan/Taster.py

Restart=always
RestartSec=30

[Install]

WantedBy=multi-user.target

jetzt noch die systemdatei aktivieren
sudo systemctl enable Taster.serviceund mit
sudo systemctl start Taster.servicestarten
Wenn Du schon einen MQTT2_SERVER auf FHEM installiert hast sollte ein neues mqtt Device angelegt werden das MQTT2_GPIO heisst.
In diesen befindet sich dann die readings mit den GPIO Eingängen.
Bei mir ist GPIO4 als Interupt vorgesehen. Dieser wird high wenn ich einen Eingang am MCP schalte.

Ich habe bei mir die einzelnen Eingänge noch per readingsProxy besser sichtbar gemacht und meinreadingsProxy für den Interupt sieht so aus
defmod Interrupt readingsProxy MQTT2_GPIO:GPIO4
attr Interrupt alias Interupt
attr Interrupt group GPIO Eingänge
attr Interrupt room Eingänge
attr Interrupt sortby 20
attr Interrupt userReadings test {fhem ("get MCP0,MCP2,MCP4,MCP6");;;;;;;;;;;;;;;; "egal"}
attr Interrupt valueFn {($VALUE eq "on")?"on":"off"}
das userReading musst Du dann noch so anpassen das es auf Deine MCP´s passt.
So ich hoffe ich habe nichts vergessen und wünsche Dir viel Erfolg beim ausprobieren.
Aber wie gesagt es ist nur eine Notlösung. Die bei mir schon länger ohne Probleme läuft.

Viele Grüsse Stephan



CBUser

Hallo Stephan,
Danke für die ausführliche Beschreibung! Ja, der MQTT2-Server läuft auch bei mir. Werde es zum WE testen.
Christian

klausw

#9
Ich habe inzwischen FHEM auf einem Pi5 in Betrieb genommen.
Die GPIOs können nach wie vor mit dem Modul genutzt werden.
Nur die Bezeichnung hat sich geändert.

Über cat /sys/kernel/debug/gpio bekommmt man eine Übersicht aller GPIOs.
Dort sucht man sich den gewünschten GPIO und nutzt im Modul antelle der GPIO Nummer die dreistellige Zahl der ersten Bezeichnung.

Beispiel GPIO26:
cat /sys/kernel/debug/gpio | grep GPIO26
gpio-597 (GPIO26              |sysfs               ) in  lo

FHEM:
define GPIO26 RPI_GPIO 597
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Stelaku

Hallo klausw

Vielen dank für Deinen hinweis.
Habe ich auch gleich mal mit meinem PI 4 und Bookworm ausprobiert.
Ausgänge lassen sich so wieder ohne Probleme schalten.
Bei Eingängen geht es leider nicht.
Hier mein RPI_GPIO Device
defmod GPIO14 RPI_GPIO 526
attr GPIO14 active_low yes
attr GPIO14 alias Status_Eltako_Kueche
attr GPIO14 debounce_in_ms 0
attr GPIO14 direction input
attr GPIO14 event-on-change-reading state
attr GPIO14 group GPIO Eingänge
attr GPIO14 interrupt both
attr GPIO14 pud_resistor up
attr GPIO14 room Eingänge
attr GPIO14 sortby 04

setstate GPIO14 off
setstate GPIO14 2024-04-29 16:43:58 Dblclick off
setstate GPIO14 2024-04-29 16:43:58 Longpress off
setstate GPIO14 2024-04-29 16:44:26 Pinlevel low
setstate GPIO14 2024-04-29 16:43:58 state off


Habe wiring pi installiert aus dieser quelle. Das funktioniert auch bis Bullseye
wget https://github.com/WiringPi/WiringPi/releases/download/2.61-1/wiringpi-2.61-1-arm64.deb
hab auch dieses mal ausprobiert https://blog.gc2.at/post/wiringpi/sieht so aus als würde dort wirinpi weiterentwickelt werden.
klappt bei mir nur nicht.

Vieleicht hast Du noch eine Idee.

Viele Grüsse

Stephan

klausw

Ho Stefan,

Zitat von: Stelaku am 29 April 2024, 16:50:03Habe ich auch gleich mal mit meinem PI 4 und Bookworm ausprobiert.
Das Pi4 hat noch die normale GPIO Nummerierung, irgendwas passt da nicht.


Zitat von: Stelaku am 29 April 2024, 16:50:03Bei Eingängen geht es leider nicht.
Hier mein RPI_GPIO Device
defmod GPIO14 RPI_GPIO 526
attr GPIO14 active_low yes
attr GPIO14 alias Status_Eltako_Kueche
attr GPIO14 debounce_in_ms 0
attr GPIO14 direction input
attr GPIO14 event-on-change-reading state
attr GPIO14 group GPIO Eingänge
attr GPIO14 interrupt both
attr GPIO14 pud_resistor up
attr GPIO14 room Eingänge
attr GPIO14 sortby 04

Die Konfig scheint in Ordnung. Bis auf die Nummer. Das sollte beinm Pi4 auch die 14 sein.
Was geht denn nicht? Der Interrupt? ReadValue?
Steht was im Logfile?
wie sieht das komplette list vom Device aus?


Wiringpi habe ich nicht installiert. Ich würde es auch nicht mehr empfehlen. Das ist ein Überbleibsel aus der ersten Implementierung. Interrupts würden mit WiringPi auch nicht funktionieren. Nur für den internen Pullup hatte eine Art Mischbetrieb verwendet.
[/quote]
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Stelaku

Hallo Klaus

Ich glaube ich habe meinen Fehler gefunden.

Die als Eingänge deklarierten GPIO´s werden nicht erkannt weil der interne pull up Wiederstand im Pi anscheind nicht aktiviert wird.

Wenn ich den pull up wiederstand Hardware Seitig einbaue funktioniert mein GPIO14 mit den interupt both wie früher.

Das mit den pull up hat wiring pi früher mit erledigt oder ?

Gruß

Stephan


Frank_Huber

Zitat von: Stelaku am 30 April 2024, 18:08:17Hallo Klaus

Ich glaube ich habe meinen Fehler gefunden.

Die als Eingänge deklarierten GPIO´s werden nicht erkannt weil der interne pull up Wiederstand im Pi anscheind nicht aktiviert wird.

Wenn ich den pull up wiederstand Hardware Seitig einbaue funktioniert mein GPIO14 mit den interupt both wie früher.

Das mit den pull up hat wiring pi früher mit erledigt oder ?

Gruß

Stephan


Das war mehr oder weniger der einzige Grund wofür wiringpi benötigt wurde. 🙃

klausw

Zitat von: Stelaku am 30 April 2024, 18:08:17Das mit den pull up hat wiring pi früher mit erledigt oder ?

Genau, wie auch Frank schreibt ist wiringpi eigentlich nur deswegen dringeblieben.
Ich hätte es sonst liebend gern rausgeworfen, da es immer wieder zu Mißverständnissen gefürt hat.
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280