Hallo Forum,
ich bitte mal wieder um eure Hilfe.
Zum Auslesen von meinem neuen smarten Stromzähler habe ich mir ein python3-Script geschrieben.
Problem ist die Übergabe in die RRD-Datenbank – oder die Bildung der Grafiken mit rrdtool.graph.
Gemäß dem Befehl rrdtool lastupdate wird auch der letzte Wert wiedergegeben. Mit rrdtool dump bekomme ich aber nicht die Anzahl der Datensätze, die ich erwarten würde. Sind deswegen die erzeugten Auswertungsgrafiken leer?
Wo liegt der Fehler ??
Python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import serial, time, rrdtool
kennung_zaehlerstand="0100010800ff" # gemäß ORBIS-Nr.
# weil nach dem OBIS-Kennzahlnoch weitere auszusortierende Zeichen kommen:
kennung2="ff56"
string = ''
teil = []
zaehlerstand=''
pos=''
start=0
i=0
dif=0
letzter_wert=0
filename_sel= "/usr/local/shellscripts/verbrauch/rrd/verbrauch_sel.rrd"
graphname="/usr/local/shellscripts/verbrauch/bilder/"
# RRD-Datenbank anlegen, wenn nicht vorhanden
try:
with open(filename_sel):
pass
print("Datenbankdatei gefunden: " + filename_sel)
except IOError:
print("Ich erzeuge eine neue Datenbank: " + filename_sel)
rrdtool.create(
filename_sel,
"--start","now",
"--step","60",
"DS:strom:GAUGE:120:U:U",
"RRA:AVERAGE:0.5:1:1",
"RRA:AVERAGE:0.5:10:1",
"RRA:AVERAGE:0.5:300:1")
if __name__ == "__main__":
ser = serial.Serial("/dev/serial0", 9600, timeout=1)
if (ser.isOpen() == False):
ser.open()
while True:
ser.flushInput() # puffer leeren und einen frischen Datensatz holen
string = ser.readline().hex() # im Format Hex
print("|", string, "|")
if kennung_zaehlerstand not in string:
pass # wenn der Zählerstand nicht enthalten ist: nächster Datensatz holen
else:
teil=string.split(kennung_zaehlerstand) # aufteilen
string = teil.pop(1) # relevanter Teil übernehmen
teil=[] # Tupel leeren
teil=string.split(kennung2,2) # weiter aufteilen
string=teil.pop(1) # hier beginnt der Zählerstand
# print(string)
zaehlerstand=string[0:10] # zählerstand extrahieren
print(zaehlerstand)
# zählerstand = mit einer Kommastelle, in KWh umrechnen (=/10.000):
zeige= (int(zaehlerstand,base=16))/10000
# für die rrd-db muss der wert ohne Kommastelle gewählt werden
i=(int(zaehlerstand,base=16))
# Differenz ermitteln
if start !=0:
dif = i - letzter_wert
else:
start=1
letzter_wert=i
j=int(dif*60/10) # wert in Wh in die DB schreiben
print("Messwert: ",zeige, 'kWh Differenz:', j, 'Wh',time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
# Messwerte in die RRD-Datei schreiben
rrdtool.update(filename_sel, 'N:%s' %(j))
#Grafiken erzeugen erfolgt seperatem script
time.sleep(58)
ser.close()
print("Ende")
Alles anzeigen
Erzeugung der Grafik:
Code
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time, rrdtool
rrdtool.graph(("/usr/local/shellscripts/verbrauch/bilder/verbrauch_1.png"),
"--start","-1h",
"-w 800",
"-h 800",
"--alt-autoscale",
"--slope-mode",
"DEF:data=/usr/local/shellscripts/verbrauch/rrd/verbrauch_sel.rrd:strom:AVERAGE",
"AREA:data#FF00FF:legende")
Alles anzeigen
Code
pi@raspberrypi3:/usr/local/shellscripts/verbrauch/rrd $ rrdtool dump verbrauch_sel.rrd
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rrd SYSTEM "http://oss.oetiker.ch/rrdtool/rrdtool.dtd">
<!-- Round Robin Database Dump -->
<rrd>
<version>0003</version>
<step>60</step> <!-- Seconds -->
<lastupdate>1618604231</lastupdate> <!-- 2021-04-16 22:17:11 CEST -->
<ds>
<name> strom </name>
<type> GAUGE </type>
<minimal_heartbeat>120</minimal_heartbeat>
<min>NaN</min>
<max>NaN</max>
<!-- PDP Status -->
<last_ds>660</last_ds>
<value>7.587592320e+03</value>
<unknown_sec> 0 </unknown_sec>
</ds>
<!-- Round Robin Archives -->
<rra>
<cf>AVERAGE</cf>
<pdp_per_row>1</pdp_per_row> <!-- 60 seconds -->
<params>
<xff>5.000000000e-01</xff>
</params>
<cdp_prep>
<ds>
<primary_value>6.402409255e+02</primary_value>
<secondary_value>9.608962455e+02</secondary_value>
<value>NaN</value>
<unknown_datapoints>0</unknown_datapoints>
</ds>
</cdp_prep>
<database>
<!-- 2021-04-16 22:17:00 CEST / 1618604220 --> <row><v>6.402409255e+02</v></row>
</database>
</rra>
<rra>
<cf>AVERAGE</cf>
<pdp_per_row>10</pdp_per_row> <!-- 600 seconds -->
<params>
<xff>5.000000000e-01</xff>
</params>
<cdp_prep>
<ds>
<primary_value>1.030017683e+03</primary_value>
<secondary_value>8.301081858e+02</secondary_value>
<value>4.830783347e+03</value>
<unknown_datapoints>0</unknown_datapoints>
</ds>
</cdp_prep>
<database>
<!-- 2021-04-16 22:10:00 CEST / 1618603800 --> <row><v>1.030017683e+03</v></row>
</database>
</rra>
<rra>
<cf>AVERAGE</cf>
<pdp_per_row>300</pdp_per_row> <!-- 18000 seconds -->
<params>
<xff>5.000000000e-01</xff>
</params>
<cdp_prep>
<ds>
<primary_value>0.000000000e+00</primary_value>
<secondary_value>0.000000000e+00</secondary_value>
<value>3.840359518e+04</value>
<unknown_datapoints>107</unknown_datapoints>
</ds>
</cdp_prep>
<database>
<!-- 2021-04-16 20:00:00 CEST / 1618596000 --> <row><v>NaN</v></row>
</database>
</rra>
</rrd>
pi@raspberrypi3:/usr/local/shellscripts/verbrauch/rrd $ rrdtool lastupdate verbrauch_sel.rrd
strom
1618604231: 660
pi@raspberrypi3:/usr/local/shellscripts/verbrauch/rrd $
Alles anzeigen
Grüße
Andreas