automatisierte Wasserverbrauchsmessung durch Impulserfassung!!

OP #7214059
Lesenswert?

​Guten Morgen,

ich möchte die Werte von einem Wasseruhr digitalisieren und zwar mittels 
einen Sensor, der die Impulse misst und wenn sie gleich 200ms dann 
schickt er mir über einen esp8266 einen Impuls, der esp6288 schickt mir 
dann die abgelesene Impulse über mqtt Broker.

vorgestern hat es noch gut funktioniert aber heute bekomme ich leider 
keine Werte.. meine erste Frage wäre, wie kann ich einen MicroPython 
Programm automatisch neu starten? also falls der esp8266 nicht direkt 
mit Wlan oder mqtt server connected, dass das Programm nochmal 
ausgeführt wird?

eine Status-Led hilft ja auch in diesem Fall, habt ihr eine Idee, wie 
ich eine einsetze bzw programmiere, dass wenn der esp8266 mit Wlan und 
umqtt verbunden ist, die Led leuchtet?

viele Grüsse.
1
from machine import Pin, ADC
2
import network
3
from time import sleep
4
from umqttsimple import MQTTClient
5
import sys
6
import uasyncio
7
from machine import time_pulse_us
8

9
trigger_pin = Pin(12, Pin.IN, Pin.PULL_UP)
10
dataQueue = []
11
last = 0
12
count = 0
13
countall = 0
14

15
WIFI_SSID = 'xxxxx'
16
WIFI_PASSWORD = 'xxxxxxx'
17
mqtt_client_id = 'testclient' # Just a random client ID
18
ADAFRUIT_IO_URL = 'xxxxxx'
19
ADAFRUIT_USERNAME = ''
20
ADAFRUIT_IO_KEY = ''
21
TOGGLE_FEED_ID = 'TOPIC'
22

23
def pulse2liter(pin):
24
# Time a pulse on the given pin, and return the duration of the pulse in microseconds.
25
# The pulse_level argument should be 0 to time a low pulse or 1 to time a high pulse.
26

27
    result = time_pulse_us(pin, 1)
28
    if result in (-1, -2):
29
       return 0
30
    # alles was kürzer als 400 ms ist
31
    if result <= 400000:
32
        return 1
33
    else:
34
        return 0
35

36
wifi = network.WLAN(network.STA_IF)
37
wifi.active(True)
38
wifi.disconnect()
39
wifi.connect(WIFI_SSID,WIFI_PASSWORD)
40
if not wifi.isconnected():
41
    print('connecting..')
42
    timeout = 0
43
    while (not wifi.isconnected() and timeout < 100):
44
        print(100 - timeout)
45
        timeout = timeout + 1
46
        sleep(1)
47
    if(wifi.isconnected()):
48
        print('connected')
49
    else:
50
    print('not connected')
51
    sys.exit()
52
#connect_wifi() # Connecting to WiFi Router
53
client = MQTTClient(client_id=mqtt_client_id, keepalive=30, server=ADAFRUIT_IO_URL, port = 1883)
54
try:
55
    client.connect()
56
except Exception as e:
57
    print('could not connect to MQTT server {}{}'.format(type(e).__name__, e))
58
sys.exit()
59
print(count)
60
client.publish('testclient', str(count), qos=1)
61

62
while True:
63
   count = pulse2liter(trigger_pin)
64
   countall = count + countall
65
   if count > 0:
66
        print('Literverbrauch:',countall)
67
        client.publish('testclient', str(count), qos=1)
68
#sleep(0.1)
69

70
sleep(0.1)
Moderator (Firma: Titel) Persönliche Seite #7214106
Lesenswert?

Interessant, ich wusste gar nicht, dass man den Startbeitrag nach einem 
Folgepost noch bearbeiten kann. Aber dank der Tags ist jetzt wenigstens 
der eingefügte Code leserlich.

Neuling A. schrieb:
> meine erste Frage wäre, wie kann ich einen MicroPython Programm
> automatisch neu starten?
Warum mit dem Dapfhammer draufhauen? Gibt es nicht eine weniger 
"brutale" Mehtode, um gegen den Verbindungsabbruch vorzugehen?

> vorgestern hat es noch gut funktioniert aber heute bekomme ich leider
> keine Werte..
Ich würde vorneweg versuchen, diese einfache Frage zu beantworten: 
Warum?
#7214141
Lesenswert?

Du hast kein Fehlerhandling drinnen. Wenn die Verbindung zum MQTT-Server 
abbricht (DSL-Reconnect o.Ä.), dann fliegt beim client.publish eine 
Exception, entweder direkt aus dem umqttsimple, oder aus der socket-Lib, 
die es verwendet, oder aus einem assert im code ...

also:
try ... except

außenherum, bei Fehler entweder reset oder mqtt-reconnect oder 
Alarmsirene an oder, oder, oder...
OP #7214142
Lesenswert?

Εrnst B. schrieb:
> Du hast kein Fehlerhandling drinnen. Wenn die Verbindung zum
> MQTT-Server
> abbricht (DSL-Reconnect o.Ä.), dann fliegt beim client.publish eine
> Exception, entweder direkt aus dem umqttsimple, oder aus der socket-Lib,
> die es verwendet, oder aus einem assert im code ...

beim letzen Versuch kam diese Meldung an,:

Traceback (most recent call last):
  File "<stdin>", line 67, in <module>
  File "umqttsimple.py", line 144, in publish
  File "umqttsimple.py", line 184, in wait_msg
OSError: -1


umqttsimple:
        if qos == 1:
            while 1:
144             op = self.wait_msg()
                if op == 0x40:
                    sz = self.sock.read(1)
                    assert sz == b"\x02"
                    rcv_pid = self.sock.read(2)
                    rcv_pid = rcv_pid[0] << 8 | rcv_pid[1]
                    if pid == rcv_pid:
                        return


...

def wait_msg(self):
        res = self.sock.read(1)
        self.sock.setblocking(True)
        if res is None:
            return None
        if res == b"":
184         raise OSError(-1)
        if res == b"\xd0":  # PINGRESP
OP #7214153
Lesenswert?

du meinst, try.. except in der while true?

while True:
   count = pulse2liter(trigger_pin)
   countall = count + countall
   if count > 0:
        print('Literverbrauch:',countall)
        try:
            client.publish('testclient', str(count), qos=1)
        except:
           print('cound not publish')
sleep(0.1)

bin nicht so profi beim pragrammieren..
Gast #7214418
Lesenswert?

Wilhelm M. schrieb:
> Meinst Du die?:
> https://de.wikipedia.org/wiki/Aachener_Printen

Erinnere mich nicht dran. Wir hatten mal (zu viert) bei einem Ausflug 
nach Aachen frische Printen für 40 Euro gekauft und die allesamt auf dem 
Rückweg nach hause verschlungen. So war das eigentlich nicht geplant. 
Aber die Dinger machen süchtig. Da ist irgendwas drin, was verboten 
gehört.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren