Raspberry Pi mit langen Tastendruck herunterfahren

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Hallo,
ich habe im Moment ein Problem bei dem ich nicht weiter komme.

Ich habe einen RPi den ich mit einem Taster herunterfahren kann. Leider wirken die Adern die den GPIO kontakt schließen als Antenne wenn ich einen anderen Taster Drücke (nicht am Pi angeschlossen) und ein Stromstoßrelai anzieht (jedoch nicht wenn ich per Handbedienung statt über die Spule schalte).
Deshalb möchte ich das der Pi erst runter fahren tut wenn der GPIO eine Mindestzeit den Kontakt geschlossen hat.
Ich bekomme es einfach nicht hin das in mein vorhandenes Skript zu implementieren.

Das ist im moment mein skript
--------------------------------------------------------------
#! /usr/bin/env python
import os
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
# GPIO5 (pin 29) set up as input. It is pulled up to stop false signals
GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP)

try:
while True:
# wait for the pin to be sorted with GND and, if so, halt the system
GPIO.wait_for_edge(5, GPIO.FALLING)
print ("Shutting down...")
os.system("/sbin/shutdown -h now")
except:
GPIO.cleanup()
------------------------------------------------------------------

Wenn ihr mir helfen könntet wäre das echt super
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Python2 ist veraltet und sollte nicht mehr verwendet werden.
Nackte excepts sollte man nicht verwenden, weil es damit unmöglich wird, Programmierfehler zu finden.
`as` bei `import` ist zum Umbenennen da, GPIO wird aber gar nicht umbenannt.
os.system sollte nicht verwendet werden, statt dessen subprocess.run.

Wenn der Knopf eine Zeitlang gedrückt sein muß, dann mußt Du einfach auf die andere Flanke warten und falls der angegebene Timeout überschritten wird, kannst Du shutdown aufrufen.

Code: Alles auswählen

#!/usr/bin/env python3
from RPi import GPIO
from subprocess import run

BUTTON_PIN = 5
TIMEOUT = 3000 # ms

def main():
    try:
        GPIO.setmode(GPIO.BCM)
        # GPIO5 (pin 29) set up as input. It is pulled up to stop false signals
        GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        while True:
            # wait for the pin to be sorted with GND and, if so, halt the system
            GPIO.wait_for_edge(BUTTON_PIN, GPIO.FALLING)
            channel = GPIO.wait_for_edge(BUTTON_PIN, GPIO_RISING, timeout=TIMEOUT)
            if channel is None:
                print("Shutting down...")
                run(["/sbin/shutdown", "-h", "now"])
    finally:
        GPIO.cleanup()

if __name__ == "__main__":
    main()
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Super danke das ging schnell, das werd ich in den gleich mal probieren. Mit den Flanken sollte es kein problem geben da es ein wechselkontakt von einem Relai ist.
Ich melde mich wenn ich es probiert hab

P.S. Das kann ich aber 1:1 kopieren in die datei, oder muss eine neue angelegt werden?
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Schade ich bekomme es nicht zum laufen,

ich hatte das alte skript damals so hinzugefügt

Das obige Python-Script wird in einer Datei gespeichert (z.B. "/home/pi/shutdown_btn.py") und dann ausgeführt:
sudo python /home/pi/shutdown_btn.py
Sobald jetzt der Taster gedrückt wird (oder im alternativen Fall: der Jumper entfernt wird), fährt der RPi sofort herunter und kann wenige Sekunden später vom Strom getrennt werden.

Soll dieses Verhalten permanent zur Verfügung stehen, dann muss das Script per crontab beim Start des RPi ausgeführt werden:
sudo nano /etc/crontab
Nun wird folgende Zeile eingefügt und gespeichert:
@reboot root /usr/bin/python /home/pi/shutdown_btn.py
Das gewünschte Verhalten ist nun bei jedem Start vorhanden.

Muss ich jetzt noch was grundlegendes ändern?
Benutzeravatar
Dennis89
User
Beiträge: 1125
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

du solltest 'python3' verwenden , da das Programm von Sirus3 auch in Python3 geschrieben wurden. Mit 'python' rufst du Python2 auf, das ist seit einem Jahr ohne Unterstützung durch die Entwickler.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Dennis89 hat geschrieben: Donnerstag 25. Februar 2021, 22:05 Hallo,

du solltest 'python3' verwenden , da das Programm von Sirus3 auch in Python3 geschrieben wurden. Mit 'python' rufst du Python2 auf, das ist seit einem Jahr ohne Unterstützung durch die Entwickler.

Grüße
Dennis
Sry ich hab von linux o.ä. nicht wirklich viel Ahnung. Ich hab das vor einiger zeit mal eingerichet und dann war ich wieder fertig mit Linux -.-
Wo sag ich ihm jetzt das er python3 verwenden soll?
:cry:
Benutzeravatar
Dennis89
User
Beiträge: 1125
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

das machst du in deinem Aufruf 'sudo python /home/pi/shutdown_btn.py' wird ersetzt durch 'sudo python3 /home/pi/shutdown_btn.py'


@Sirus3 Es gibt hier auch etwas von 'gpiozero', Auszug aus der Doku:

Code: Alles auswählen

from gpiozero import Button
from subprocess import check_call
from signal import pause

def shutdown():
    check_call(['sudo', 'poweroff'])

shutdown_btn = Button(17, hold_time=2)
shutdown_btn.when_held = shutdown

pause()
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Ah ok
und dann in der crontab dann
@reboot root /usr/bin/python3 /home/pi/shutdown_btn.py eintragen damit er auch nach dem reboot den dienst startet?!
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Jetzt bekomme ich eine Meldung das 'run' nicht geht

Traceback (most recent call last):
File "/home/pi/shutdown_btn.py", line 3, in <module>
from subprocess import run
ImportError: cannot import name 'run'

P.S. Ich denke es liegt an der version, 'run' soll wohl erst ab 3.5 implementiert sein
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

So nach der installation von python3.8 kann er zwar mit dem 'run' umgehen aber dafür mag er das 'RPi' nicht weil kein Modul diesen Namen trägt.

Traceback (most recent call last):
File "/home/pi/shutdown_btn.py", line 2, in <module>
from pi import GPIO
ModuleNotFoundError: No module named 'pi'

Welchen Namen mag er denn genannt bekommen?
Benutzeravatar
Dennis89
User
Beiträge: 1125
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

sieht deine zweite Zeile so aus:

Code: Alles auswählen

from pi import GPIO
?

Sie sollte so aussehen:

Code: Alles auswählen

from RPi import GPIO
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Morgen,

Die 2. Zeile war "from RPi import GPIO" ich hatte einpach mal getestet ob es mit "pi'"

Also die Meldung kommt bei "from RPi import GPIO" auch.

Ist halt nur komisch das Python3 (3.4.x) nicht mit 'run' umgehen kann und Python3.8 dafür mit 'RPi' nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Dogma2k: Das ist nicht wirklich komisch. `subprocess` gehört zur Standardbibliothek, also den Modulen die bei Python direkt dabei sind. `RPi` nicht. Damit könnte man ausser dem Raspi ja auch gar nichts anfangen. Das ist ein Modul das man extra installieren muss.

Edit: Was eher komisch ist, ist das Du da ein Python 3.4 hast — wie alt ist denn das System? Das sollte man vielleicht generell mal aktualisieren.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Das hab ich heute früh auch gelesen, werde wenn ich zuhause bin mal -> "sudo apt install python3-rpi.gpio" machen. Dann müsste er das benötigte Modul doch haben oder?

Das system hab ich gestern mit "sudo apt update" und "sudo apt upgrade" gemacht, hab auch gut lange gedauert
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

So jetzt weiß ich wiede nicht weiter, ich habe eben nochmal ein "sudo apt install python3-rpi.gpio" aber er hat nichts installiert weil schon alles da war.
Danach hab ich diesen "echo "alias python=python3.8" >> ~/.bashrc" Alias erstellt und mit "source ~/.bashrc" neu geladen.
Wenn ich jetzt python3 -V eingebe sehen ich die 3.8.0 Version.

Wenn ich jetzt "sudo python3 /home/pi/shutdown_btn.py" eingebe kommt

Traceback (most recent call last):
File "/home/pi/shutdown_btn.py", line 3, in <module>
from subprocess import run
ImportError: cannot import name 'run'

Wenn ich sudo python3.8 /home/pi/shutdown_btn.py eingebe kommt wieder

Traceback (most recent call last):
File "/home/pi/shutdown_btn.py", line 2, in <module>
from RPi import GPIO
ModuleNotFoundError: No module named 'RPi'

obwohl es doch jetzt jedesmal die selbe Version ist die genutzt wird.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Dein System hat Python 3.4, also ist auch das apt-Paket für Python 3.4.
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Also muss ich "sudo apt install python3.8-rpi.gpio" statt "sudo apt install python3-rpi.gpio" machen? Weil ich ja 3.8 nachinstalliert hab?
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Ich glaub jetzt weiß ich wieder warum ich früher Abstand von Linux genommen hatte. Ich bekomme es nicht mal hin für die nach installierte python 3.8 die RPi Module zu installieren weil es keine python3.8-rpi.gpio gibt mit dem o.g. Befehl.

Kann mir da jemand mal unter die Arme greifen bitte, das wäre echt super
Benutzeravatar
Dennis89
User
Beiträge: 1125
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

ich habe den Überblick verloren, was du jetzt alles installiert hast. Was bekommst du im Terminal für eine Ausgabe wenn du 'pip3 install RPi.GPIO' eingibst?
Alternativ:
sudo apt-get install python-rpi.gpio python3-rpi.gpio

Das habe ich von https://sourceforge.net/p/raspberry-gpi ... i/install/
Dort steht auch, das Raspbian das Modul eigentlich schon vorinstalliert hat.
Habe das gerade auf einem frischen Raspberry-Pi OS mit dem Programm von Sirus3 getestet. Es funktioniert, ich musste kein Modul nachinstallieren. Habe auch kein Python hin und her installiert.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Dogma2k: Der Alias gilt für die Bash in der er gesetzt ist. Wenn Du mit ``sudo`` ausführst wird das mit einer Shell von dem Benutzer ausgeführt den Du zum Ausführen benutzt und *dessen* ``.bashrc`` wird verwendet. Und ich würde beim `root`-Benutzer nicht ``python`` per Alias auf irgendetwas anderes umbiegen. Das würde ich nicht mal für einen regulären Benutzer machen.

Ich würde an Deiner Stelle wirklich als erstes mal schauen welches Linux da in welcher Version installiert ist und ob das überhaupt noch unterstützt wird und ggf. das System aktualisieren. Also nicht das alte System auf seinen aktuellsten Stand bringen, sondern das System selbst auf einen neueren Stand bringen.

Ansonsten ist `RPi.GPIO` halt nicht für Python 3.8 installiert. Wie hast Du das denn installiert? Wenn das nicht aus den Paketquellen von der Linuxdistribution kommt, dann wird man auch `RPi.GPIO` dafür nicht über ``apt`` installieren können.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten