Hallo!
Die Grafik sollte vor allem die Realität wiedergeben. Nach deiner Grafik ist die Therme nie komplett aus. Realität?
Impulse sind in der Hinsicht grundsätzlich schwierig und müssen immer interpretiert werden.
Da hier nur Impulse gemessen werden, kann man grundsätzlich nicht wissen, wann die Gasuhr zwischen den Impulsen weiter läuft bzw. wann sie steht. Grundsätzlich wird bei mir immer der Mittelwert des Verbrauchs zwischen 2 Impulsen angezeigt. Der Wert ist natürlich nie Null, sondern bestenfalls nahe Null.
Mir ist auch nicht klar, wie man mit längerer "aggtime" eine Darstellung wie oben bekommt. Der Ansatz NICHT mit vzlogger zu arbeiten lag auch daran, daß ich mit vzlogger mit meinem Sensor keine stabile Messung hin bekam, siehe hier.
Ich führe in der Datenbank den Zählerstand. Den jeweils richtigen Zählerstand (z.B. nach einem Neustart) habe ich natürlich nur, wenn ich den manuell vor dem Start in mein Programm eintrage. Ich lese hier zu beginn den letzten Zählerstand aus der Datenbank aus, sonst bekomme ich beim Start des Prgs. ohne aktuelle Zählereingabe bei der ersten Anzeige sogar einen negativen Verbrauch. Wie auch immer, ab der 2.Verbrauchsanzeige stimmt es in jedem Fall.
Die Fühung des Zählerstands in der Datenbank hat auch den Vorteil, daß man am Anfang mit Abfrage der Datenbank einfach kontrollieren kann, ob Sensor korrekt alle Zählerdurchläufe mitbekommt.
Ich hab das Programm mal hier gelistet, vielleicht schreibt mal jemand mit mehr Kenntnissen, ob es lohnt, daß ich es ins Wiki setze!
Gruss, wonk
#!/usr/bin/env python3
# Das Prg. ermittelt aus der Eingabe von Impulsen den Verbrauch in m3/h und schreibt sie in die Volkszaehler-Datenbank
# Vorgabe ist 1 Impuls pro 0,01m3, der Impuls muss von VCC-> auf 0 gehen und an Raspi-Pin 11 erfolgen
# nur falls fuer Zaehlerstandneu ein korrekter Anfangszaehlerstand eingegeben wird, sind Verbrauchswerte in Datenbank auch korrekt
# vor Start des Prgs. muss im Frontend der Kanal angelegt werden in die uuid hier eingetragen werden
# Die Aufloesung ist 1, der Typ "Gas, Zaehlerstaende" - nicht "Impulse"!
#
from gpiozero import InputDevice
from time import sleep
import os
import sys
import mysql
import mysql.connector
from mysql.connector import errorcode
uuid = "\'c8cef0f0-6886-11eb-96d3-c3b0baf830b6\'"
Zaehlerstandneu= 6482.46 # sonst erster Verbrauchswert evtl. voellig falsch
try:
connection=mysql.connector.connect(host = "localhost",
user = "vz",
passwd = "demo",
database = "volkszaehler")
except mysql.connector.Error as err:
print("Kein login Volkszähler-Datenbank "+ str(err))
ein_ausgabe = connection.cursor() # Instanziierung Cursor-Objekt
query="SELECT id FROM entities WHERE uuid = "+uuid
# print (query)
ein_ausgabe.execute(query)
for data in ein_ausgabe:
id = data[0]
if type(id) != int:
print ("Kanal mit " + uuid + " nicht vorhaden!")
sys.exit()
#print(id)
query = "SELECT MAX(value) FROM data WHERE channel_id ="+str(id)
ein_ausgabe.execute(query)
for data in ein_ausgabe:
Zaehlerstand = data[0]
#print("Zählerstand aus Datei:")
#print(Zaehlerstand)
ein_ausgabe.close()
connection.close()
Zaehlerstand = max(Zaehlerstand,Zaehlerstandneu) # Dadurch kann in keinem Fall der erste Verbrauchswert negativ sein
#print("Max Zählerstand aus Datei, Vorgabe")
#print(Zaehlerstand)
Eingang = InputDevice("BOARD11", pull_up=True)
lastSensorStatus=0
Zaehlerstand100 = int(Zaehlerstand * 100) #Das prg. arbeitet mit dem 100-fachen Zaehlerstand integer-Arithmetik verwenden zu koennen
#print(Zaehlerstand100)
while True:
SensorStatus = Eingang.value
#print(SensorStatus)
if SensorStatus != lastSensorStatus:
if SensorStatus == 1:
Zaehlerstand100 = Zaehlerstand100 + 1
Zaehlerstand = Zaehlerstand100 / 100
Zaehlereintrag = Zaehlerstand
#print (Zaehlerstand100)
print (Zaehlerstand)
os.system ("./vzclient -u "+ uuid +" add data value="+str(Zaehlerstand)+"> /dev/null")
#os.system ("./vzclient -u "+ uuid +" get data")
lastSensorStatus = SensorStatus
sleep(1)
Alles anzeigen