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.
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.
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..
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.
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
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.
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.