skript restart

  • Guten Morgen zusammen, ich habe hier eine Simulation eines Programms, der Daten aus einer Sensor bekommt und über mqtt publisht

    zwar wird gepublischt aber in der while-Schleife success kommt es anscheinend zu Problemen.

    ich bekomme in den mqtt pycharm skript keine Daten mehr.. dafür muss ich den Kabel von den esp8266 unplugen und wieder plugen damit es neu gestartet wird.. was ja keine optimale Lösung ist..

  • Zur hilfreichsten Antwort springen
  • jesuisla: Das sieht alles etwas verwirrend aus mit `count`, `counter`, und `errorCounter`.

    `sys.exit()` ist schon mal ganz grundsätzlich keine gute Idee falls man damit nicht tatsächlich mindestens potentiell einen Rückgabecode ungleich 0 an den Aufrufer übermitteln möchte. So sieht das so aus als wenn das so eine Art Notausgang wäre um sich keine Gedanken über einen sauberen Programmfluss machen zu müssen, der einfach ohne irgendwas zu machen das Programm beendet wenn die Funktion in der Ausführung am Ende angekommen ist.

    Um etwas zu wiederholen gibt es Schleifen. Wenn das Programm mehrfach wiederholt werden soll, muss halt alles was das Programm bisher ausmacht in einer Schleife ausgeführt werden. Statt das Programm zu verlassen, müsstest Du nur die Schleife verlassen in der der bisherige Code steckt, damit die umgebende Schleife die ”das Programm” wiederholt ihre nächste Iteration machen kann.

    Wobei die bisherige äussere ``while``-Schleife komisch ist. Muss die mitten drin abbrechen? Kann man da nicht einfach eine ``for``-Schleife schreiben die 5 mal tatsächlich komplett durchlaufen wird?

    Die innere ``while``-Schleife ist noch verwirrender. Es sieht ja irgendwie so aus als sollte die maximal 10 mal versuchen die Nachricht zu senden. Dann ist `success` aber falsch benannt, denn es ist anscheinend kein Erfolg wenn die Nachricht gesendet wurde, was ja genau falsch herum ist. Zudem: Wozu ein Fehlerzähler *und* ein Flag? Das wäre hier auf jeden Fall einfach eine ``for``-Schleife die 10 mal ausgeführt wird, und im Erfolgsfall einfach abgebrochen wird.

    Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase). Also `error_counter`.

    Man sieht ja die Ausnahmebehandlung nicht mehr, da sollte irgendwie protokolliert werden was da nicht funktioniert, damit man eine Chance hat Fehler zu suchen und zu beheben.

    Ungetestet:

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

  • hallo @__blackjack__ und danke für die Antwort.

    an sich sieht mein Programm so aus, die Counter schleife und errorcounter war nur zum Testen, bzw einen Fehler provozieren und gucken, was bei sys.exit() so passiert,

    ich möchte den Skript dauerthaft laufen lassen, und neu starten, wenn es zu Problemen mit Wlan verbindung oder MQTT-Broker gibt

  • ich möchte den Skript dauerthaft laufen lassen, und neu starten, wenn es zu Problemen mit Wlan verbindung oder MQTT-Broker gibt

    Warum neu starten? Durch neu starten werden die Probleme mit der WLAN-Verbindung bzw. mit dem MQTT-Broker, doch nicht behoben bzw. nicht beseitigt, oder?

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Warum neu starten? Durch neu starten werden die Probleme mit der WLAN-Verbindung bzw. mit dem MQTT-Broker, doch nicht behoben bzw. nicht beseitigt, oder?

    also wenn zB iwann keine Verbindung mit Wlan möglich ist, dann wirds von Vorteil, den Skript immer wieder zu starten, bis eine Verbindung wieder möglich ist oder? sowas wie sys.restart() aber das gibts bei micropython leider nicht

  • Eigentlich stellt paho.mqtt alles zur Verfügung, um bei Problemen die Verbindung automatisch wieder aufzubauen. Hier ein Beispiel mit Vererbung:


    Die Hauptschleife kannst du auch in einer Funktion packen.

    Dann hat man weniger Müll auf der Modulebene.

  • also wenn zB iwann keine Verbindung mit Wlan möglich ist, dann wirds von Vorteil, den Skript immer wieder zu starten, bis eine Verbindung wieder möglich ist oder? sowas wie sys.restart() aber das gibts bei micropython leider nicht

    D. h. Du gehst davon aus, dass eine (warum auch immer) unterbrochene Wlan-Verbindung, durch Versuche zum herstellen der mqtt-Verbindung, wieder zustande kommen kann? Dann war die Wlan-Verbindung evtl. gar nicht unterbrochen oder sie war unterbrochen und wäre auch ohne die Versuche zur Herstellung der mqtt-Verbindung, wieder zustande gekommen.

    BTW: Mit wpa_cli und einem action-Script kannst Du in Echtzeit den Zustand des wpa_supplicant ("CONNECTED" oder "DISCONNECTED") überwachen(/loggen) und entsprechend darauf reagieren lassen. Wenn Du Wlan-Verbindungen im produktiven Einsatz benutzt, solltest/könntest Du den wpa_supplicant und seine Konfiguration optimieren (bzw. überwachen).

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Ach, Micropython. Zu spät gelesen.

    Das Beispiel, dass ich gepostet habe, ist für den PC.

    Ich vermute mal, dass du umqtt2-simple und umqtt.robust2 nutzt.

    Am besten noch mal den gesamten Quellcode posten.

    umqtt unterscheidet sich stark von paho.mqtt.

  • 2 Mal editiert, zuletzt von jesuisla (13. November 2022 um 16:26)

  • Hallo,

    der Code aus 9 und aus 10 laufen doch gar nicht? Es gibt kein 'sys.atexit' und auch die Einrückung stimmt nicht

    Im anderen ist 'verbrauch' nicht definiert.

    Welches Skript läuft denn wirklich?

    Grüße

    Dennis

    🎧 Strahlend soll die Zukunft sein, gut wir werden seh'n, ob wir wie ein Strahlemann lächelnd untergeh'n.  🎧

  • Hallo,

    an sich funktionieren beide Codes

    Dann hast du andere Codes laufen, wie die die du hier gepostet hast. Bei dem Code aus #9 müsste so eine Meldung kommen:

    Code
    IndentationError: unexpected indent

    Und bei dem Code aus #10 so eine Meldung:

    Code
    NameError: name 'verbrauch' is not defined

    Bitte poste dann jetzt genau den Code, den du mit PyCharm gestartet hast und der nach einer Zeit keine Werte mehr anzeigt.

    Nicht richtig eingesetzte try/except-Behandlungen können dazu führen, das Fehlermeldungen verschluckt werden. Wenn ich mir unsicher bin, lasse ich die immer erst mal weg, bis der Code funktioniert. Dann in der Testphase und beim provozieren von Fehlern kann man die dann immer noch einbauen.

    Grüße

    Dennis

    🎧 Strahlend soll die Zukunft sein, gut wir werden seh'n, ob wir wie ein Strahlemann lächelnd untergeh'n.  🎧

  • Bitte poste dann jetzt genau den Code, den du mit PyCharm gestartet hast und der nach einer Zeit keine Werte mehr anzeigt.

Jetzt mitmachen!

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