Probleme mit hoher CPU Last

  • Hallo,


    vielleicht kann mir jemand helfen. Ich versuche seit ein paar Wochen das Problem zu lösen und bekomme es nicht hin.

    Ich habe den folgenden Code geschrieben um meine Lichter in der Wohnung zu steuern. Es funktioniert auch ohne Probleme, aber leider ist die CPU Last bei meinem PI 3 bei 100% und er wird sehr warm.

    Die Temperatur liegt dauerhaft bei 70°C. Sobald ich aber in die Schleife auch nur die geringste sleep setze funktionieren die Lichtschalter nur noch sporadisch. Weiß jemand wie ich das lösen kann?


  • Code
    while True:
             pass

    Da rattert er endlos drüber - ohne Pause. Bau ein kleines Sleep ein, das sollte die Sache deutlich entlasten. Werte um die 0.1 sollten schon reichen

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

  • dbv hat da ganz recht – aber du löst das Problem IMHO falsch. Keine Endlosschleife, die nix tut, sondern signal.pause() (https://docs.python.org/3/library/signal.html#signal.pause, https://github.com/python/cpyt…/signalmodule.c#L364-L388) solltest du verwenden. Schau' dir außerdem mal gpiozero an, das ist deutlich eleganter und oft viel weniger Code, den du schreiben musst: https://gpiozero.readthedocs.io/en/stable/recipes.html

    (auch dort wird pause verwendet ;) )

  • Danke schon mal für die Hilfe. Wie aber oben schon geschrieben, sobald ich ein Sleep einsetze und wenn es nur 0.01 ist, dann geht die CPU Last runter, aber die Lichtschalter sprechen nur sporadisch an, was für mich keine befriedigende Lösung ist.

    Linus. Wie funktioniert das mit der signal.pause? Tut mir leid, mein Englisch ist so übel, da steige ich nicht durch.

  • Auch erscheint das if GPIO.input(channel) == GPIO.LOW: überflüssig, du wärst nicht in der Funktion, wenn es nicht so wäre

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

  • Die ganzen 100 Zeilen kann - sollte man auf ca. 30 Zeilen reduzieren.

    Gug

    Programmierer sind faule Leute und wenn sich ständig etwas wiederholt, schreibt man eine Funktion. Bei dir wäre das Zauberwort eine Liste oder ein Wörterbuch über welches du dann iterierst. Dann fällt die Hälfte weg.


    Auf Modulebene haben sich nur Konstanten, Klassen und/oder Funktionen zu befinden.

    GPIO.setwarnings(False) macht auch keinen Sinn, denn man will ja im Falle eines Absturzes wissen, was schief ging...


    Edit:

    - Eingerückt wird mit 4 Leerzeichen pro Ebene.

    - Funktionen werden danach benannt, was sie tun. zB schalte_licht(), setup_gpio()

  • Ok. Danke, aber ich komme trotzdem nicht weiter. Wenn ich in while pause anstatt time sleep setze, dann funktioniert es leider auch nicht.

    Ich denke ich werde mich wohl mit der hohen CPU Last zufrieden geben müssen. Wird schon nicht irgendwann der RPI in flammen aufgehen. :/

  • bootsmann und in diese Hauptfunktion meinen bisherigen Code oder sämtliche GPIO.add_event_detect wie verstehe ich das? Ich bin noch ziemlicher Laie auf dem Gebiet der Programmierung.

    dbv meine Funktionen kann ich nicht veränder, sobald ich etwas daran ändere schalten die Lichter wild durcheinander. Ich habe bereits 2 Wochen gebraucht, bis es so wie es gerade ist sicher funktioniert.

  • 1) Ich bin kein Freund vom RPi.GPIO Modul. Lieber ``pigpio`` oder ```gpiozero``

    2) Ich würde dir empfehlen, zB das offizielle Python Tutorial (oder dessen deutsche Übersetzung) durchzuarbeiten.

    3) Danach die Doku von den beiden genannten Modulen lesen und studieren.


    Flugendes Prinzip ist aber bei allen Modulen mehr oder weniger das selbe:

    Du kannst auch ein Wörterbuch nehmen

    Code
    RÄUME = {
        "Kürche": 23,
        "Büro": 25,
    }

    In Python 3 kannst du problemlos Umlaute verwenden. Wichtig ist auch noch, dass du Variablen etc. anständig benennst. Damit meine ich, dass ein Leser sofort wiess, was damit gemeint ist.

  • ok. Danke. werde mich da wohl noch mehr einlesen müssen. Vielleicht klappt es ja dann irgendwann. ::)

  • so, danke für die den Tip mit gpiozero. Damit habe ich das Problem in den Griff bekommen.

    Nur noch eine Frage. Wie kann ich die GPIO in gpiozero wieder freigeben? Finde nichts, daß mir weiter hilft