skript restart

Gast #7248461
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.
1
counter = 0
2
while True:
3
    count = count + 1
4
    counter += 1
5
    if count > 0:
6
        print('Literverbrauch:',count)
7
        if counter > 5:
8
            sys.exit()      ----->       # hier habe ich einen Fehler 
9
        success = True                   # provoziert und möchte alternativ
10
        errorCounter = 0                 # für sys.exit den Skript neu 
11
        while success:                   # starten, um daten neu zu bekommen. 
12
            try:
13
                client.publish('testclient', str(count), qos=1)
14
                success = False
15
                sleep(0.5)
16
                errorCounter += 1
17
                if errorCounter > 10: 
18
                    sys.exit()
Gast
okey schrieb:
> aber in der while-Schleife success kommt es
> anscheinend zu Problemen.

Welche Probleme, und was scheint (was hast du gesehen)?

Ich sehe da folgende Unlogik: In der "while success" Schleife setzt du 
schon beim ersten Durchlauf success=False, deswegen wird sie nur einmal 
durchlaufen. Innerhalb der Schleife erhöhst du aber den errorcounter um 
bei >10 auszusteigen. So weit kommt der Counter aber nie, weil die 
Schleife ja nur einmal durchlaufen wird.
Gast
Stefan F. schrieb:
> okey schrieb:
>> aber in der while-Schleife success kommt es
>> anscheinend zu Problemen.
>
> Welche Probleme, und was scheint (was hast du gesehen)?

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..
Gast
okey schrieb:
> 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..

Naja, wenn du dein Script mit sys.exit() beendest, dann ist es beendet. 
Ich frage mich, warum du etwas anderes erwartet hast.

Wenn das Script weiter laufen soll, dann musst du das auch so 
programmieren. Auf Mikrocontrollern ist es üblich, dass das 
Hauptprogramm aus einer Endlosschleife ohne Abbruch besteht.

Noch was: Wenn du das Programm schon 0,5s nach dem Absetzen einer 
Message abbrichst, dann kann es ganz gut sein, dass die Message bis 
dahin noch nicht gesendet wurde. Du musst schon warten, bis der 
Sende-Puffer leer ist. Leider hat der MQTTClient keine entsprechende 
Funktion, mit der man den Puffer kontrollieren kann.

Eventuell hilft es, vor dem exit die disconnect() Funktion vom 
MQTTClient aufzurufen. Ich habe im Quelltext gesehen, dass dadurch der 
darunter liegende Socket geschlossen wird.
Gast
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.

1
while True:
2
    count = pulse2liter(trigger_pin) 
3
    countall = count + countall
4
    #count = count + 1
5
    if count > 0:
6
        print('Literverbrauch:',countall)
7
        success = True
8
        while success:
9
            try:
10
                client.publish('testclient', str(count), qos=1)
11
                success = False
12
                sleep(0.5)   --->  # und genau hier scheint der Programm iwann zu 
13
            except Exception as e:       # crashen, also sys.exit() war mein erster  
14
                print(e) # rote LED an   # Gedanke, aber da springt der raus und hört  
15
        #rote LED aus                    # halt auf, also ich brauche eine Alternative
16
        #sleep(0.1)                      # damit ich den Skript automatisch neu 
17
    sleep(0.1)                           # starte, wenn der crasht.
Gast
Ich denke nicht, dass sys.exit() auf einem Mikrocontroller Sinn ergibt. 
Benutze das einfach nicht. Überlege dir was anderes wie du dein Programm 
neu startest. Man Kann Schleifen auch mit break verlassen, bzw. mit 
continue zurück an den Anfang springen.

Zur Not kann man auch den eventuell vorhandenen Watchdog triggern, damit 
der einen Hardware-Reset auslöst.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 3 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.