NEWS
Gaszähler vzlogger in iobroker
-
Guten Abend allerseits,
in der Kiste mit dem Sammelsurium aus alten vzlogger Tagen habe ich den USB-Lesekopf mit Reed-Kontakt für den Gaszähler gefunden. Mir ist klar, dass ich den verbauten Reed Kontakt wie in diesem Thread einfach auf ein GPIO des Raspis umbauen kann und damit eine Lösung hätte.
Re: Gelöst: Gaszähler-Ersatz für vorhandene vzlogger-Anbindung
Allerdings würde ich gerne eine Lösung finden um den per /dev/ttyUSB0 an einem Raspi empfangenen S0 Impuls an iobroker zu übermitteln (iobroker löuft auf einem anderen Host).
Generell kommt ein Impuls wie folgt am Raspi an:
strace -ttt -e read cat < /dev/ttyUSB0 1696117178.933970 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0\267\0\1\0\0\0`\17\2\0\0\0\0\0"..., 832) = 832 1696117178.939941 read(0, "\0", 131072) = 1 1696118200.629333 read(0, ^C0x7fb4b2c000, 131072) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) strace: Process 1083 detached
Vielleicht stehe ich auf dem Schlauch, aber ich suche nach einer Möglichkeit den S0 Impuls zu loggen.
-
Hab es nun selbst mit einem Python-Skript gelöst. Das Skript liest kontinuierlich Impulse von dem über USB angeschlossenen USB-Lesekopf, aktualisiert basierend auf dessen Impulsen den Gaszählerstand, und sendet den aktuellen Zählerstand in Echtzeit an einen MQTT-Broker, während es den Zählerstand in einer Datei speichert, um den Fortschritt zwischen Neustarts beizubehalten.
Hier mein Python-Skripts, falls das für jemanden hilfreich ist:
1. Python-Skript
import serial import paho.mqtt.client as mqtt import os # Konfiguration serial_port = '/dev/ttyUSB0' mqtt_broker = 'BROKER_ADDRESS' mqtt_port = 1883 mqtt_topic = 'gaszaehler/stand' mqtt_username = None mqtt_password = None zaehlerstand_file = 'zaehlerstand.txt' # Überprüfen, ob die Zählerstand-Datei existiert if os.path.exists(zaehlerstand_file): with open(zaehlerstand_file, 'r') as file: zaehlerstand = float(file.read()) else: zaehlerstand = float(input("Bitte geben Sie den aktuellen Zählerstand ein: ")) with open(zaehlerstand_file, 'w') as file: file.write(str(zaehlerstand)) # Callback, wenn mit dem MQTT-Broker verbunden def on_connect(client, userdata, flags, rc): if rc == 0: print("Connected to MQTT Broker!") else: print("Failed to connect, return code %d\n", rc) # MQTT-Client konfigurieren client = mqtt.Client() client.on_connect = on_connect if mqtt_username and mqtt_password: client.username_pw_set(mqtt_username, mqtt_password) # Verbindung zum MQTT-Broker herstellen client.connect(mqtt_broker, mqtt_port, 60) client.loop_start() # Seriellen Port öffnen ser = serial.Serial(serial_port, baudrate=9600, timeout=1) try: while True: raw_data = ser.readline() print(f"Raw: {raw_data}") if raw_data: zaehlerstand += 0.01 print(f"Sending: {zaehlerstand}") client.publish(mqtt_topic, str(zaehlerstand)) with open(zaehlerstand_file, 'w') as file: file.write(str(zaehlerstand)) except KeyboardInterrupt: pass finally: ser.close() client.loop_stop() client.disconnect()
2. Systemd-Service erstellen
Um das ganze beim Systemstart auszuführen erstelle ich noch den
gaszaehler.service
im Verzeichnis/etc/systemd/system/
mit folgendem Inhalt:[Unit] Description=Gaszaehler MQTT Service After=network.target [Service] ExecStart=/usr/bin/python3 /pfad/zum/skript.py WorkingDirectory=/pfad/zum Restart=always User=pi [Install] WantedBy=multi-user.target
Ersetzen Sie
/pfad/zum/skript.py
mit dem vollständigen Pfad zu Ihrem Python-Skript und/pfad/zum
mit dem Verzeichnis, in dem sich Ihr Skript befindet.3. Service aktivieren und starten
Nachdem Sie dann der systemd-Service erstellt ist, kann man ihn mit folgendem Befehlen aktivieren und starten:
sudo systemctl enable gaszaehler.service sudo systemctl start gaszaehler.service
Nun sollte das Python-Skript beim Systemstart automatisch ausgeführt werden, und beim ersten Start wird es nach dem Zählerstand fragen. Der Zählerstand wird in der Datei
zaehlerstand.txt
gespeichert und bei jedem Neustart des Skripts daraus gelesen.