Nachdem meine Versuche den M-BUS Wärmemengen- und Wasserzähler auszulesen vorerst beendet sind und ich auf den bestellten M-BUS-Pegelwandler warte, habe ich mich dem Auslesen des Gaszählers gewidmet. Das sollte erfolgsversprechender sein…
Als ich dann endlich den vor langer Zeit bestellten Reed-Kontakt mk 471 b (z.B. bei Reichelt) wieder gefunden habe, konnte es losgehen.
Der Gaszähler hat an der letzten Stelle des Zählwerkes bei der „0“ einen Magneten wodurch der Reedkontakt bei jeder vollen Umdrehung einmal geschlossen wird. Diese Impulse gilt es mit einem Raspberry über einen GPIO zu zählen.
Den Reedkontakt habe ich natürlich wieder professionell mit Klebeband fixiert…hält!
Angeschlossen ist der Reedkontakt über eine Zwillingslitze direkt an einen GPIO und Ground des Raspberry PI. Pull-Up braucht es keinen. Dieser wird per Software aktiviert.
Den GPIO lese ich mit einem Python-Script aus welches in einer Endlosschleife ausgeführt wird und den GPIO (im Beispiel Pin „21“) jede Sekunde abfragt. Sekundenweise sollte reichen, da ich nicht hoffe das unser Gaszähler so schnell läuft. Immer wenn der Reed geschlossen wird, wird eine „1“ und der Zeitstempel in die Spalten „timestamp“ und „zaehlerstand“ einer MySQL-Tabelle geschrieben. Das passiert immer nur beim Wechsel des Reed von „Offen“ nach „Geschlossen“. Sollte der Zähler genau mit dem Magnet am Reed stehen bleiben, passiert nichts.
[cc lang=“python“]
import RPi.GPIO as GPIO
import time
import MySQLdb
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
# GPIO definieren
REED_gas = 21
# definierten GPIO als Eingang setzen
GPIO.setup(REED_gas, GPIO.IN, pull_up_down=GPIO.PUD_UP)
status_alt=1
while True:
status_aktuell = GPIO.input(REED_gas)
# REEDKONTAKT geoeffnet
if status_aktuell == 1:
#print „Kontakt offen“
status_alt=GPIO.input(REED_gas)
# REEDKONTAKT geschlossen
elif status_aktuell==0:
#print „Kontakt geschlossen“
if status_alt!=status_aktuell:
status_alt=GPIO.input(REED_gas)
# Datenbankverbindung
db = MySQLdb.connect(host=“„, user=“„, passwd=“„, db=“„)
# Impuls in Datenbank eintragen
cursor = db.cursor()
cursor.execute(„““INSERT INTO gaszaehler (timestamp,zaehlerstand) VALUES (CURRENT_TIMESTAMP,1)“““)
db.commit()
cursor.close()
time.sleep(1)
[/cc]
Da das Python-Script sich ab und an mal verabschiedet, starte ich es per Cronjob wieder neu falls der Prozess nicht mehr vorhanden ist. Ich sollte vielleicht lieber das Problem im Python-Script suchen und das ein oder andere Try&Catch einbauen, aber es geht auch erstmal so…
#!/bin/sh
if ps -ef | grep -v grep | grep gaszaehler.py ; then
exit 0
else
sudo python /usr/local/bin/gaszaehler.py &
logger "gaszaehler.py neu gestartet"
exit 0
fi
Zur Auswertung benutze ich dann folgende SQL-Querys:
SELECT sum(zaehlerstand) FROM gaszaehler
Hiermit werden alle gespeicherten „Ticks“ summiert. Dazu muss noch ein Startwert addiert werden da der Gaszähler ja schon eine zeitlang lief.
Dieser Startwert muss ggf. ab und an mal korrigiert werden falls der Raspi mal einen Umlauf des Zählers nicht mitbekommt weil z.B. der unwahrscheinliche Fall eintritt, dass das Klebeband nicht gehalten hat oder wahrscheinlicher, das Python-Script bzw. der ganze Raspi nicht mehr läuft. Den Startwert gebe ich als eine Zahl inkl. der drei Nachkommastellen an und addiere das Ergebnis der SQL-Query dazu. Um die richtige „Einheit“ kümmere ich mich in der Ausgabe auf der PHP-Seite mit folgender PHP-Zeile:
[cc lang=“php“]
$sql = „SELECT sum(zaehlerstand) FROM gaszaehler“;
$query = mysql_query($sql) or die(„Anfrage nicht erfolgreich“);
while ($wert = mysql_fetch_array($query)) {
$gesamtwert=($wert[0]*10)+$gas_startwert;
}
$gesamtwert=substr($gesamtwert,0,-3).“.“.substr($gesamtwert,-3,2);
[/cc]
Der Faktor 10 muss hier beachtet werden, da ja nur alle 0,01m³ Impulse gezählt werden und ich den Startwert mit allen drei Nachkommastellen angegeben habe. Die zweite Zeile setzt das Komma in der Ausgabe an die richtige Stelle.
Eine tägliche Auswertung funktioniert z.B. mit folgender SQL-Query:
SELECT CASE DATE_FORMAT(timestamp,'%w')
WHEN 0 THEN 'Sonntag'
WHEN 1 THEN 'Montag'
WHEN 2 THEN 'Dienstag'
WHEN 3 THEN 'Mittwoch'
WHEN 4 THEN 'Donnerstag'
WHEN 5 THEN 'Freitag'
WHEN 6 THEN 'Samstag'
ELSE 'fehler' END,
sum(zaehlerstand)
FROM gaszaehler
WHERE DATE(timestamp)>=DATE_SUB(NOW(),INTERVAL 7 DAY)
GROUP BY day(timestamp)
ORDER BY timestamp
Auch hier bekommt man den korrekten Wert in m³ durch einfache Kommaverschieberei in der Ausgabe. Den Faktor 10 benötigt man bei der täglichen Auswertung nicht:
[cc lang=“php“]substr(($wert[1]),0,-2).“.“.substr(($wert[1]),-2)[/cc]
In der Webseite sieht das folgendermaßen aus:
Das alles läuft erst drei Tage und es gibt bestimmt noch Verbesserungspotential aber ein Anfang ist gemacht.
Gruß
Chris