Script wird immer wieder unterbrochen

  • Hallo

    habe einen nose red flow, der ein python script startet, je nach Stromverbrauch der WP.

    Debug sagt, dass das script ca. alle 30sec ausgefuehrt wird.

    Das script steuert eine Lampe, high > 400w, low > 50w

    Leider gibt es immer wieder Unterbrüche, d.h. Lampe ist nicht dauern an, sondern geht an, nach ca. 30 sec wieder aus und 5 sec später wieder an.

    Was kann ich tun damit die Lampe dauerhaft an ist?

  • gwaag Das ist ja ein bisschen unübersichtlich wie da das Hauptprogramm und eine Funktion auf Modulebene vermischt werden. Konstantendefinitionen sind da auch noch versteckt. Okay, das Programm ist kurz, aber die gehören trotzdem an den Anfang, nach den Importen, und auch alle wie Konstanten geschrieben.

    `time` und `datetime` (das Modul) werden importiert, aber nirgends verwendet.

    Die Namen `now` und `Now` werden im gleichen Namensraum beide für den den gleichen Zeitpunkt in verschiedenen Repräsentationen verwendet. Das ist verwirrend. Warum existiert `Now` überhaupt so umständlich mit selbst ausgerechneter Minutenzahl? Das ganze wäre wesentlich einfacher lesbar wenn man einfach `datetime.time`-Objekte vergleichen würde, statt da händisch Minuten auszurechnen. Oder noch einfacher wenn eh nur die Stunden zählen ``5 <= now.hour < 22``.

    Und warum ``+0`` in den Rechnungen? Und warum die 1 bei `timewindow1`?

    Ungetestet:

    Wie sieht denn der Netzwerkverkeher aus? Also was wird wann, von wem an die Lampe gesendet? Dazu dann noch die Zeiten wann das Programm `send_command()` aufruft mitprotokollieren und schauen ob das überhaupt zu den Zeiten wo die Lampe schaltet, etwas sendet.

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

  • Danke _blackjack-

    Dein script funktioniert, werde es mal weiter beobachten.

    Deines ist zugegebenermassen viel übersichtlicher.

    time modul ist noch ein ueberbleibsel von einem script das ich kopiert habe

    Das ganz mit dem now and Now habe ich mal von irgend wo kopiert, funktioniert aber ( auch mit minuten)

    timewindow1, es kann später auch mal noch timewindow2 geben

    Danke und Gruss

    gwaag

  • Aber was bedeutet denn dann `timewindow1` und `timewindow2`? Der Leser will ja nicht wissen welches das erste und welches das zweite Zeitfenster ist, das sieht er ja an der Reihenfolge im Quelltext, sondern was diese Zeitfenster bedeuten. Und muss es dann beide Werte zur gleichen Zeit geben? Wird mit denen das gleiche gemacht weil sie im Grunde das gleiche bedeuten? Dann gehören die Werte in eine Liste und nicht an nummerierte Namen gebunden.

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

  • Code
    timewindow1 = (5*60+0) <= Now < (22*60+0)      # ein

    Zwischen 5.00h und 22.00h ist die Lampe ein. (Zeitfenster1)

    Schaltet um 5.00h ein und um 22.00h aus

    Wenn ein Ereignis aber erst um 8.06h eintritt, schaltet es ebenfalls ein.

    z.B.

    Ueberschuss PV Anlage

    timewindow1 am Morgen, timewindow2 am Nachmittag

    Code
    if einspeisung < -1000 and timewindow1 or einspeisung < -1000 and timewindow2:
        conn = http.client.HTTPConnection("[192.168.0.135]")
        conn.request("GET", "/relay/0?turn=on")   # ON
        logging.info('Boiler on')  # Logeintrag
        # subprocess.run("/home/pi/th/test_ein.py")   # LED ein
        sleep(7200)        # mindestens  2h eingeschaltet lassen
        logging.info('sleep')  # Logeintrag
  • gwaag Naja und da würde man halt entweder im Namen erwähnen das es sich um Morgen und Nachmittag handelt, oder eben keine einzelnen Namen sondern eine Liste mit Zeitfenstern verwenden. Und den ``einspeisung < -1000``-Teil würde man auch nicht wiederholen.

    Der Name `timewindow` ist für einen Wahrheitswert auch nicht wirklich geeignet, denn bei einem Zeitfenster erwartet man ja eher einen Paar aus Zeitwerten die den Anfang und das Ende beschreiben.

    Was auch sehr stiefmütterlich behandelt wird ist die HTTP-Verbindung und die tatsächliche Verbindung zum Webserver. Beides sollte man eigentlich sauber wieder schliessen, und bei der Antwort vom Server wäre es auch sinnvoll zu prüfen, ob die Anfrage überhaupt erfolgreich war. Ein Grund für mich auch bei so einfachen Sachen auf das externe `requests`-Modul zurück zu greifen.

    Für ein Zeitfenster lohnt es sich schon fast eine eigene Klasse zu schreiben und das Schalten eines Relais könnte man in eine Funktion heraus ziehen, damit die Programmlogik nicht in den ganzen Details untergehen kann.

    “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!