Ein problem mit meinem Code auf Raspberry OS

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Hallo es geht um folgenden Code


    import RPi.GPIO as GPIO

    import time

    import datetime

    import os

    import subprocess


    GPIO.setmode(GPIO.BOARD)

    GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_UP)


    def play_sound():

    # Audiodatei abspielen

    subprocess.Popen(["vlc", "--play-and-exit", "/home/loxice/Desktop/test.mp3"])



    def log_vibration(duration):

    # Log-Datei erstellen/anhängen

    logfile_name = datetime.datetime.now().strftime("%Y-%m-%d") + ".txt"

    log_dir = "/home/loxice/Log A/"

    if not os.path.exists(log_dir):

    os.makedirs(log_dir)

    logfile_path = log_dir + logfile_name

    with open(logfile_path, "a") as logfile:

    logfile.write("Vibration detected at " + datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " for " + str(duration) + " seconds\n")


    def detect_vibration():

    vibration_start = None

    while True:

    if GPIO.input(12) == 0:

    if vibration_start is None:

    vibration_start = time.time()

    else:

    if vibration_start:

    vibration_duration = time.time() - vibration_start

    log_vibration(vibration_duration)

    if 6 <= datetime.datetime.now().hour <= 8 or 18 <= datetime.datetime.now().hour <= 20:

    play_sound()

    vibration_start = None

    time.sleep(0.1)


    detect_vibration()


    Ich habe das Problem das keine Soundausgabe stattfindet. das Log wird angelegt. Das Script startet automatisch mit dem Starten des Raspberry.


    es wird auch kein Fehler ausgespuckt... bin etwas am verzweifeln.

    kann mir bitte jemand helfen ?


    Ich bedanke mich bereits vielmals im vorraus

  • Post by Loxice ().

    The post was deleted, no further information is available.
  • Wie ? Als root ? vlc mag nicht als root gestartet werden.

    habe in der /etc/rc.local


    folgendes eingefügt


    python3 /home/loxice/Desktop/vibration_detector.py &


    startet es dann als root ? aber selbst wenn ich es iüber die console starte kommt kein mukks...


    liegt es ggf. an meinem Zeit Format ? da es ja jeweils für zwei stunden laufen soll so den angegebenen Zeiten ?


    habe bloß schon alles zusammen gepackt und für heute keine lust mehr ^^

    Edited once, last by Loxice ().

  • Loxice Bitte zeig das Skript in einem Codeblock! Klick auf pasted-from-clipboard.png und kopiere den Code da rein!



    startet es dann als root ?

    Ja.


    aber selbst wenn ich es iüber die console starte kommt kein mukks...

    Dann liegt der Fehler evtl. an anderer Stelle, aber es kommt auch darauf an, wie Du das Skript startest.

  • Kann ich morgen früh machen, da ich jetzt auf Arbeit bin, mit dem Code.


    Das Skript starte ich so:


    Öffne Konsole vom Desktop aus als normaler Benutzer und gebe folgenden Befehl ein:


    python3 /home/loxice/Desktop/vibration_detector.py


    Es läuft spukt keine Fehler aus. Erkennt die Vibration, schreibt ins log wie gewünscht, aber kein Audio. Weder über HDMI noch Klinke. Aber andere Töne kommen Audio kann ich so auch abspielen.

  • Hallo,

    habe in der /etc/rc.local

    rc.local ist total veraltet und das nutzt auch niemand mehr. Das gibt es nur noch aus Gründen der Rückwärtskompatibilität. Zum Starten von Skripten / Prozessen ist schon seit ein paar Jahren systemd Stand der Dinge, bei quasi alle Linux-Distributionen. Du solltest dir also eine systemd Service Unit schreiben, dann bekommst du auch das Logging via journald gratis dazu, was die Fehlersuche ggf. einfacher macht.


    Zum Skript:

    Statt RPi.GPIO nimmt man eigentlich seit mehreren Jahren das gpiozero Modul, weil das die einfachere / schönere / bessere API hat.
    Das os Modul für Verzeichnis Operation ist auch eher angestaubt, dafür gibt es das pathlib Modul.
    Für das Logging kann man auch das `logging` Modul nehmen, dass muss man nicht alles von Hand selber implementieren.
    Strings stückelt man nicht mit + zusammen, sondern nutzt f-Strings oder alternativ die format-Methode von Strings.


    Gruß, noisefloor

    Edited once, last by noisefloor: Modulname korrigiert ().

  • Und für python gibt es auch python3-vlc, dann kannst du dir das subprocess sparen.

    P.S.

    noisefloor rc.local mag alt sein, aber total veraltet ist es nicht. Es tut schnell und zuverlässig das, wofür es gemacht wurde, den

    VLC-Player zu starten gehört nicht dazu.

    gpiozero mag schöner sein, aber schneller oder gar schlanker als RPi.GPIO ist es nicht.

    Beim Rest gebe ich dir aber völlig Recht.

    Mit korrekten Einrückungen im Code funktioniert aber auch der Code mit Soundausgabe, ich habe nur den GPIO auf BCM26, den Pullup rausgeworfen und cvlc mit einer .wav genommen:

    Mit python3-vlc:

  • Also erstmal vielen Dank für die vielen Infos, hatte heute morgen keine Lust mehr nach dem Arbeitstag an den PC zu gehen. und habe nach dem Aufstehen einfach erstmal etwas weiter probiert. Mit VLC zum Beispiel hatte ich das gleiche Problem. Da die Logdatei zwar nice wäre, aber nicht unbedingt benötigt, habe ich einfach die Logfunktion rausgenommen. So funktioniert es jetzt erstmal. Habe einige Möglichkeiten probiert für die Soundausgabe. und mit simpleaudio hat es funktioniert. Die mir bekannten haben sich zum Teil gar nicht installieren lassen oder einfach danach immer noch gesagt, sie wäre nicht da, wie z.B. Playsound. Ich lasse das Skript jetzt von einem automatisch startenden Skript starten, um keine Probleme durch Root zu bekommen. und es klappt. werde mich die Tage mal ransetzen und eure Vorschläge/Verbesserungen umsetzen. Danke aber schonmal für die Hilfe


  • Da die Logdatei zwar nice wäre, aber nicht unbedingt benötigt, habe ich einfach die Logfunktion rausgenommen.

    Habs mal so getestet, beim Start verschluckt er zwar die erste Meldung, :conf: aber den Rest schreibt er brav.

    In der Log:

    Code
    Die Vibration dauerte 4 Sekunden
    Keine Vibration mehr seit 10:46:04
    
    Vibration erkannt um 10:46:00 Uhr
    Die Vibration dauerte 3 Sekunden
    Keine Vibration mehr seit 10:46:20
    
    Vibration erkannt um 10:46:17 Uhr
    GPIO zurückgesetzt, Programm wird beendet

    Ausgabe Terminal:

    Irgendwo habe ich beim Start und beim beenden einen Fehler drin. :denker:

    Vielleicht sieht ein Pythonianer das Problem auf den ersten Blick, nachdem er nach dem :@ sich den Code angesehen hat. :lol:

  • P.S.

    noisefloor rc.local mag alt sein, aber total veraltet ist es nicht. Es tut schnell und zuverlässig das, wofür es gemacht wurde, den

    Sicher?

    https://wiki.ubuntuusers.de/rc.local/

    1983 obsolet 🙈

    Außerdem

    https://kb.gtkc.net/enabling-rc-local-in-debian-9-4-stretch/


    Das hat man wohl der Foundation zu „verdanken“ dass es beim Raspberry Pi os doch vorhanden ist. Von mir aus kann es verschwinden und sollte auch nicht mehr empfohlen werden

  • Hallo,

    rc.local mag alt sein, aber total veraltet ist es nicht. Es tut schnell und zuverlässig das, wofür es gemacht wurde,

    Das ist schlichtweg falsch. Spätestens mit systemd ist rc.local obsolet und veraltet. rc.local wird bei den meisten Distros noch von systemd ausgewertet und on the fly in Units umgewandelt. D.h. systemd entscheidet alleine, wann wie wo das ausgeführt wird, nicht der Nutzer. Kann klappen, muss aber nicht.
    Mit einer systemd Service Unit ist man in jeder Hinsicht flexibler.


    Auch wenn ist old-school Linuxer gerne krampfhaft an der Vergangenheit festhalten - rc.local ist eine von den Sachen, die wirklich komplett zukunftslos sind.


    Gruß, noisefloor

  • Hallo,


    zu deinem Code gibt es ein, zwei Kleinigkeiten anzumerken:

    'as' wird zum umbenennen genutzt, du nennt 'GPIO' in 'GPIO' um. Wieso importierst du nicht 'GPIO' von 'RPi'?

    Auf Modulebene (der Code ohne Einrückungen) darf kein ausführbarer Code stehen, die Ausnahme dabei ist der Einstiegspunkt in die 'main'-Funktion. Auf Modulebene werden nur Konstanten, Klassen und Funktionen definiert, alles weitere gehört in eine Funktion.

    Die Pin-Nummer wäre hier ein Kandidat für eine Konstante. Das ist zum einen übersichtlicher und zum anderen muss man die bei Anpassungen genau einmal anpassen und es stimmt überall.

    Ich würde auch hier 'gpiozero' nehmen anstatt 'GPIO', das spart dir auch das nervige 'cleanup' der Code ist viel lesbarer und auch einfacher zu schreiben.

    Zeitmessungen macht man nicht mit 'time', für sowas gibt es 'monotonic'. Das ist auch unabhängig von der Systemzeit.

    Logdateien schreibt man nicht von Hand, da gibt es das logging-Modul in der Standardbibliothek oder das beliebte 'loguru'.

    Was man gar nicht macht ist Strings mit '+' zusammen puzzeln und was dann auch überhaupt nicht geht ist einen String als Pfad zu missbrauchen. Pfade haben Eigenschaften, die Strings nicht haben. Das sind zwei verschiedene Objekte.

    Für Strings kannst du 'f'-Strings benutzen, das ist auch am schönsten zu lesen.

    Für Pfade gibt es das pathlib-Modul.

    Der Pfad wäre hier wieder ein Kandidat für eine Konstante.

    'os' nutzt man auch nicht mehr für Pfadoperationen, auch das macht man mit 'pathlib'.

    Wieso wird keine Logdatei geschrieben, nachdem der Pfad angelegt wurde? Geschrieben wird nur im nächsten Schleifendurchgang, falls da der Pin überhaupt noch aktiv bzw. inaktiv ist.

    Beim öffnen von Dateien gibt man immer das Encoding an. Es ist nicht garantiert, dass immer das "richtige" erwischt wird.

    Ich würde keine weitere Dauerschleife schreiben, eher while GPIO.input(26) ==0.

    Ich würe auch während einer Zeitmessung nicht ne Sekunde schlafen, in der Zeit könnten Welten zusammenbrechen.

    Du fragst ob der Pin 0 ist, wenn nicht, dann kommt der 'else' -Block in dem du als erstes fragst ob der Pin == 1 ist. Wäre er nicht 1, wäre der Block nicht betreten worden. Das kann weg.

    Die Log-Datei ist noch offen, denn du befindest dich noch im 'with'-Block und du öffnest die Datei wieder. Das könnte zu Problemen führen.


    Jo, hau rein :bravo2:


    Grüße

    Dennis

    🎧 Marylin´s Befehle an meine Junge Seele hör ich in jedem Lied. Heimlich eingegeben, in mein Innenleben, durch den Hard-Rock Beat 🎧