Schalter auswerten und Status in Datei schreiben

  • Servus zusammen,

    meine Python-Skills sind leider mehr als nur dürftig.

    Meine Anforderungen:

    Ich möchte einen Schalter überwachen, welcher über GPIO27 nach GND schaltet und dessen Zustand (Aus = 0 / Ein = 1) in eine Textdatei schreibt. Dieses Script soll bei Systemstart gestartet werden und im Hintergrund ständig laufen. Damit soll konkret der geöffnete/geschlossene Gehäusedeckel überwacht werden!

    Dazu habe ich mir in meiner Unbedarftheit folgendes Script zusammengestoppelt:

    Wenn ich die Schleife jeweils mit exit() verlasse, wird der Wert in die Datei geschrieben.
    Wenn ich die Schleife nicht verlasse, sondern so arbeite wie vorstehend, wird nichts geschrieben - und die Datei bleibt leer. D.h. sie wurde geöffnet zum schreiben und damit der Inhalt gelöscht.

    Ich bin einigermaßen verwirrt.

  • Go to Best Answer
  • Willst du den aktuellen Zustand oder ein Log?

    Setz mal ein Sleep in den Loop, sonst wird das File so schnell geloescht dass du es nicht siehst.

    - - -

    Versuche auch mal den Modus "w+". Die offizielle Dok behauptet dass das File truncated wird, aber alle anderen sind der Ansicht dass das nicht der Fall ist...

    Edited 2 times, last by Tell (July 8, 2025 at 10:34 PM).

  • Das würde man nicht mit einer Busy-Waiting-Schleife machen, auch nicht mit sleep(). Es gibt da ja beispielsweise die when_*-Rückrufe, die man setzen kann und wo man Ereignisse in eine Queue schreiben lassen kann, bei der man dann im Hauptprogramm die Werte heraus holt und in eine Datei schreibt.

    Am besten in eine temporäre Datei, die dann zu der eigentlichen Datei umbenannt wird, damit das aus Sicht von anderen Programmen halbwegs atomar aussieht.

    “I am Dyslexic of Borg, Your Ass will be Laminated” — unknown

  • Ist das ein Taster oder ein Schalter?

    Wenn der Status des Deckels erfasst werden soll, ist es wohl ein Taster. Doch egal, wie es, ich würde in diesem Fall mit Interrups arbeiten, dann kannst du dem System jeden anderen Kram überlassen, Bunte Punkte malen, Kreise zeichnen, Musike spielen, Texte verarbeiten, die du eintippst, Filme abspielen .... Und wenn ein Interrupt ausgelöst wird, springt dein Programm an.

    Computer ..... grrrrrr

  • Meine Python Skils sind sicher noch schlechter wie deine aber ich würde das so ähnlich lösen und nur schreiben wenn sich der Status wirklich geändert hat.

    Offizieller Schmier und Schmutzfink des Forum.
    Meine PI:

    Display Spoiler

    #1 : Pi1 - Packet Radio Digi mit TNC-PI
    #2 : Pi2 - ADSB Feeder
    #3 : Pi3 - DHCP/DNS Server für 4 VLAN
    #4 : Pi3 - Wireguard Gateway Umgezogen nach Proxmox
    #5 : Pi3 - FM Funknetz Gateway mit Shari SA818
    #6 : PI Zero W mit DMR Hotspot
    #7 : Pi4 4GB - Kiosk Browser
    #8 : Pi4 4GB - Kiosk Browser
    #9 : Pi4 8GB - Test Pi
    #10 : Pi2 - Auto CD Ripper abcde

    Dazu noch ein paar Zero und Pi1/2 die noch auf einen sinnvollen Einsatz warten.

  • Im Grund ist es doch ganz einfach. :green_wink: Ein Beispiel an dem man sich orientieren kann, gibt es in der Doku auch.

    Ich bin gerade am Telefon, dashalb erstmal nur Prosa.

    Wir brauchen nur eine Funktion in der in die Datei geschrieben wird. Wie ich bereits oben schrieb gibt es den value Wert, der je nach Schalterstatus 0 oder 1 ist. Also gibt button.value den aktuellen Status zurück, den man auch so in der Callbackfunktion in die Datei schreiben kann.

    Vielleicht schreibe ich das später, wenn ich am Monitor bin, auch nochmals hier im ganzen als Skript, wenn das nicht schon jemand anderes gemacht haben sollte.

  • Oder so, wenns ein Python-Profi macht.
    Ich werde einfach nicht warm mit Python.
    Mir fehlen die Klammern und das Einrücken geht mir auch auf den Zeiger. Ich bin Tabs gewohnt. :)

    Offizieller Schmier und Schmutzfink des Forum.
    Meine PI:

    Display Spoiler

    #1 : Pi1 - Packet Radio Digi mit TNC-PI
    #2 : Pi2 - ADSB Feeder
    #3 : Pi3 - DHCP/DNS Server für 4 VLAN
    #4 : Pi3 - Wireguard Gateway Umgezogen nach Proxmox
    #5 : Pi3 - FM Funknetz Gateway mit Shari SA818
    #6 : PI Zero W mit DMR Hotspot
    #7 : Pi4 4GB - Kiosk Browser
    #8 : Pi4 4GB - Kiosk Browser
    #9 : Pi4 8GB - Test Pi
    #10 : Pi2 - Auto CD Ripper abcde

    Dazu noch ein paar Zero und Pi1/2 die noch auf einen sinnvollen Einsatz warten.

  • Beim öffnen von Dateien sollte man with verwenden wenn das geht, und bei Textdateien ist es besser immer explizit die Kodierung anzugeben um Überraschungen zu vermeiden.

    Und wie gesagt: Temporäre Datei und umbenennen wenn man vermeiden möchte irgendwann auch mal mit einer Leeren Datei dazustehen.

    Pin-Nummer und Dateinamen würde man üblicherweise als Konstante definieren, damit man das leicht ändern kann ohne den ganzen Code durchgehen zu müssen.

    Der_Imperator Die Klammern kannst Du als Kommentare hinschreiben 😉 und das Problem beim Einrücken verstehe ich nicht so ganze, denn ich benutze einfach die Tab Taste zum Ein- und Ausrücken (mit Shift) und der Editor kümmert sich darum, dass das die entsprechende Zahl von Leerzeichen wird.

    Ungetestet:

    “I am Dyslexic of Borg, Your Ass will be Laminated” — unknown

  • Hallo,

    etwas kürzer file.write(str(int(state))), aber ob das lesbarer ist :/


    Grüße
    Dennis

    🎧 Hate the jocks, the preps, the hippie fuckin' scumbags.
    Heavy-metalers with their awful, pussy hairbands.
    Counting seconds until we can get away.
    Ditching school almost every single day, oh, yeah 🎧

  • __blackjack__ Ich hätte mir den state erspart und stattdessen button der Funktion übergeben. Dann sähe das so aus:

    Auch ungetestet.

    //Edit

    Oder halt direkt per partial(write_state, button.value) . Dann muss man das auch nicht nochmals prüfen.

  • button.value müsste man noch in eine Zeichenkette wandeln, und wenn beide Rückruffunktionen gleich sind, kann man auch ein partial-Objekt erstellen. Aaaaber man kann auch einfach write_state direkt übergeben, denn wenn die Rückruffunktion genau ein (nicht-optionales) Argument erwartet, dann wird da bereits das Objekt übergeben für das die Funktion registriert wurde.

    Ungetestet:

    “I am Dyslexic of Borg, Your Ass will be Laminated” — unknown

  • Daaaanke ... funtktioniert, wie ich es brauche. :thumbup:

  • funtktioniert, wie ich es brauche

    Was, ausgerechnet das nimmst du? :shocked::lol:

    Nichts gegen Dich Der_Imperator aber wie Du selber schrubst

    Meine Python Skils sind sicher noch schlechter

    dem ich nicht widersprechen werde. :biggrin:

    DJ1NG Bitte teste wenigstens eines von den Skripten, die __blackjack__ vorgeschlagen hat. Die sind um einiges pythonischer als eine Wahl. :wink1:

  • Wenn wir `pathlib` schon nutzen, könnten wir es noch etwas mehr nutzen:


    Grüße
    Dennis

    🎧 Hate the jocks, the preps, the hippie fuckin' scumbags.
    Heavy-metalers with their awful, pussy hairbands.
    Counting seconds until we can get away.
    Ditching school almost every single day, oh, yeah 🎧

  • funtktioniert, wie ich es brauche.

    also ich würde das so auf gar keinen Fall implementieren. Da hier pausenlos eine Endlosschleife läuft, ist der Raspi zu nahezu 100% beschäftigt, was aus meiner Erfahrung heraus nicht nur den Raspi erhitzt sondern auch das gesamte System instabil macht. Du kannst das leicht überprüfen indem du die CPU Auslastung mit top im Terminal überprüfst. Bei mir sind das 98% Auslastung. Der richtige Ansatz ist meiner Meinung der von hyle in Beitrag #7 mit dem Auszug aus der Dokumentation.

    Der Rest ist auch OK wenn man schönes Python schreiben will. Ob es auch effizienter ist, weiß ich nicht.

    Edited once, last by nurazur (July 9, 2025 at 11:45 PM).

  • Danke für den Input ... schaue ich mir an, weil leider auch mein Testpi hier auf hochtouren läuft ... er soll aber so wenig wie möglich Strom verbrauchen.

    Inzwischen klappt alles, so wie ich mir das Vorstelle .... und der Pi merkt das noch nicht einmal mit dem Service ;)

    Edited once, last by DJ1NG (July 14, 2025 at 5:11 PM).

  • Ich habe Deins genommen.:thumbup:

    Edited once, last by DJ1NG (July 14, 2025 at 5:10 PM).

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!