Python Schleife funktioniert nicht

  • Hallo liebe Forum User,

    ich hätte eine Frage zu einem kleinen Python Programm. Mit diesem möchte ich die Heizung überwachen und bei einer Störung eine Telefonanruf auslösen. Leider funktioniert die Schleife nicht richtig. Es wird im Log nicht immer "Störung Ende: " geschrieben.

    So wäre meine Logik:
    Falls eine Störung erkannt wird (GPIO.LOW Port 18) soll noch 15 Sekunden gewartet werden, wenn die Störung dann immer noch aktiv ist, soll im Log Störung Anfang (Def) geschrieben werden, sowie die beiden Telefonanrufe getätigt werden. Danach soll überprüft werden ob die Störung immer nocht aktiv ist und am Ende, wenn die Störung behoben ist "Störung Ende" ins Log geschrieben werden.

    Habt ihr vielleicht eine Idee, wo der Fehler liegt oder, wie das schöner abbildbar ist?

    Vielen Dank im Voraus!

  • Morgen,

    schöner abbilden geht mit GpioZero.

    Da gibt es auch Beispiele.

    Was du dann brauchst ist das Button bzw. das DigitalInputDevice.

    Du kannst da beim Button eine hold_time angeben, wenn der Input 15 sek. anliegt könnte man mit Button.value oder Button.is_pressed weiter prüfen.

    Schau dir das Mal an. Die Doku ist super und ich finde das ganze lesbarer.

    Im Hintergrund nutzt die Lib. dann Rpi.gpio.

    Edit:

    Wenn die Heizung ausfällt, liegt dann keine Spannung mehr am Pin an?

    Einmal editiert, zuletzt von keepfear (19. September 2022 um 10:14)

  • Hallo keepfear,

    vielen Dank für deine Antwort. Ich werde mir definitiv GpioZero anschauen. Ich glaube, dass bei einer Störung eine Spannung auf dem Pin anliegt. Aktuell, wenn keine Störung vorhanden ist, ist der GPIO auf Low, bzw. schwenkt immer zwischen Low und kurzen High.

    GPIO LOW: 2022-09-19 10:29:57

    GPIO LOW: 2022-09-19 10:29:58

    GPIO LOW: 2022-09-19 10:29:59

    GPIO High: 2022-09-19 10:30:00

    GPIO LOW: 2022-09-19 10:30:01

    GPIO High: 2022-09-19 10:30:02

    GPIO LOW: 2022-09-19 10:30:03

    GPIO LOW: 2022-09-19 10:30:04

    GPIO LOW: 2022-09-19 10:30:05

    GPIO LOW: 2022-09-19 10:30:06

    GPIO LOW: 2022-09-19 10:30:07

    GPIO LOW: 2022-09-19 10:30:08

    GPIO LOW: 2022-09-19 10:30:09

    GPIO High: 2022-09-19 10:30:10

    GPIO High: 2022-09-19 10:30:11

    GPIO LOW: 2022-09-19 10:30:12

    GPIO LOW: 2022-09-19 10:30:13

    GPIO LOW: 2022-09-19 10:30:14

    GPIO LOW: 2022-09-19 10:30:15

    Oder muss ich vielleicht "nur" den GPIO am Anfang auf LOW und nicht auf HIGH setzen?

    Das habe ich am Anfang meines Programms noch (Sorry, hab ich ganz vergessen zu erwähnen)

    GPIO.setmode(GPIO.BOARD)

    GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

  • Hallo Tell,

    ich hoffe ich kann deine Frage korrekt beantworten. Ich habe von einem Elektiker ein Kabel bekommen mit dem Hinweis: "Wenn es eine Störung gibt, bekommst du das über dieses Kabel mit."

    Dieses Kabel habe ich auf den PIN18 (Board zählweise) gesteckt und gehofft, mit meinem Programm Störungen zu erkennen. Das Programm funktioniert auch ab und zu. Sprich es wird auch eine Störung erkannt, aber er hüpft nie in die while Schleife mit Störung immer noch aktiv rein. Ich weiß aber nicht wirklich, warum.

    Code
    while GPIO.input(18) == GPIO.LOW:                
    write_log3 = wr_log("Störung immer noch aktiv: ")                
    time.sleep(60)
  • Hallo,

    einen Fehler im Sinne der Logik nicht. Schöner gestalten ja, aber das kann man später noch.

    Ich bin kein Elektronikprofi, aber was ist mit der gemeinsamen Masse? Sollte der Pin nicht auf Masse gezogen werden, wenn kein Signal anliegt? Ich denke dass ist auch das was Tell meinte. Dazu gibt dir bestimmt bald jemand detailliertere Antworten, falls ich recht habe.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • PhiGer2525: Zu dem schöner/besser: Statt "Hauptprogramm" als Kommentar hin zu schreiben würde man das besser in eine `main()`-Funktion stecken. Dann ist auch ohne Kommentar klar, dass es sich um die Hauptfunktion handelt, und es gibt keine globalen Variablen mehr.

    Magische Zahlen im Quelltext sollte man vermeiden. Die Pin-Nummer würde man als Konstante am Anfang definieren. Dann weiss man an jeder Stelle wo die benutzt wird, was die Zahl bedeutet, und man kann den Pin auch leichter und vor allem sicherer ändern, weil man das nur a einer Stelle im Quelltext machen muss, und nicht Gefahr läuft vorkommen von 18 zu übersehen, oder eine 18 zu ersetzen die eine andere Bedeutung hatte.

    `a` ist ein schlechter Name und auch überflüssig, weil der Vergleich wo das benutzt wird *immer* das Ergebnis `True` haben wird. Also kann man da auch einfach `True` hin schreiben.

    Namen sollten keine kryptischen Abkürzungen enthalten. Besonders verwirrend ist hier das es die Funktion `wr_log()` gibt, deren Ergebnis an einen Namen `write_log` gebunden wird, der eigentlich der passende Name für die Funktion wäre. Bei `make_call` (das Ergebnis!) und `call()` ist es ähnlich. Funktionen/Methoden werden nach Tätigkeiten benannt, um sie leichter von eher passiven Werten unterscheiden zu können. Was nicht mehr funktioniert wenn man die eher passiven Werte auch nach Tätigkeiten benennt.

    Man nummeriert auch keine Namen. `call1()` und `call2()` verraten dem Leser nichts darüber was diese Anrufe *bedeuten* — genau dass ist doch aber wesentlich wichtiger zu wissen, als welches der erste und welches der zweite Anruf ist. *Die* Information wird bereits aus der Aufrufreihenfolge der beiden Funktionen deutlich.

    Mit vielen Rückgabewerten wird in dem Code auch überhaupt nichts gemacht — dann sollte man die auch nicht an Namen binden. Damit erledigt sich dann auch gleich ein Teil der nummerierten Namen.

    Zwischenstand (ungetestet):

    Die API von der `wr_log()`-Funktion ist nicht so schön. Man muss da immer ": " mit übergeben um das Datum von der Nachricht getrennt zu protokollieren. Und das der Zeitstempel nicht wie in jeder anderen Protokolldatei am *Anfang* steht, halte ich auch für ungünstig. Überhaupt würde ich da nichts selber programmieren was es nicht schon gibt, entweder in der Standardbibliothek im `logging`-Modul, oder in externen Bibliotheken wie `loguru` in bunt und in Farbe.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!