Moin, moin zusammen!
Ich habe mal n paar Fragen an euch.
Ich betreibe bei mir zuhause Homematic, einen Arduino Mega und einen RaspberryPI2.
Als Energiezähler hab ich einen Stromzähler vom Typ Easymeter Q3DA1004 und einen Gaszähler vom Typ Kromschröder BK-4G.
Für den Stromzähler habe ich einen USB-IR-Schreib-Lesekopf
http://wiki.volkszaehler.org/h…reib-lesekopf-usb-ausgang
und für den Gaszähler Gaszähler-Lesekopf.
http://wiki.volkszaehler.org/h…llers/gaszaehler_lesekopf
Beides von Udo.
Den Easymeter hatte ich bis jetzt mit dem Pi anhand eines Skriptes ausgelesen und mir den Zählerstand und den Verbrauch an die Homematic-CCU2 gesendet.
Das mit senden an Homematic hat den Grund das ich mir dann die Werte auf einem Tablet im Flur über DahUI anzeigen lassen kann. Deshalb sende ich mir die Daten an eine Systemvariable die dann DashUI ausliest.
Zu erwähnen ist das der Easymeter keine Aufforderung zum Senden benötigt. Er sendet kontinuierlich folgende Zeilen mit aktualisierten Werten ( ausser die von mir hinzugefügten Kommentare :wink:
/ESY5Q3DA1004 V3.04
1-0:0.0.0*255(1ESY1160304493)
1-0:1.8.0*255(00000758.4697830*kWh) // Zählerstand
1-0:21.7.0*255(000042.10*W) // Leistung an L1
1-0:41.7.0*255(000590.02*W) // Leistung an L2
1-0:61.7.0*255(000247.33*W) // Leistung an L3
1-0:1.7.0*255(000879.45*W) // Gesamtleistung an L1+L2+L3
1-0:96.5.5*255(80)
0-0:96.1.255*255(1ESY1160304493)
!
Alles anzeigen
Ausgewertet hab ich den Stromzähler mit Hilfe folgender Skripte Danke nochmal an Knut hier aus m Forum für die Unterstützung):
- Verbrauch aktueller Monat ( ausgelöst durch crontab 5 Minuten nach jeder vollen Stunde)
- Sendet aktualisierte Werte an Homematic-CCU (aktueller Verbrauch, Zählerstand)
#!/bin/bash
######################################################
## Erfassung Monatsverbrauch/Jahresverbrauch
## Ausführen immer 05 Minuten nach jeder vollen Stunde
########################################################
## Variablen deklarieren
######################################################
#
## Ausgabebeispiel: 15-09-20_23:15
datumuhrzeit=$(date +%y-%m-%d_%H:%M)
## Ausgabebeispiel: Januar-2015
datumlang=$(date +%B-%Y)
## Deklarierung Monat-Aktuell und Vormonat
monataktuell=$(date +%B)
tag=$(date +%d)
vortag=$(date -d "1 day ago" '+%d')
vormonat=$(date --date="$(date +%Y-%m-15)-1 month" +%B-%Y)
vorvormonat=$(date --date="$(date +%Y-%m-15)-2 month" +%B-%Y)
jahr=$(date +%Y)
vorjahr=$(date -d "12 month ago" '+%Y')
## Schnittstelle definieren
device=/dev/lesekopf0
## Sonstige Variablen
pfad=~/easymeter-log/
## Wird zum Beispiel am 01.Mai der Verbrauch für den Monat April gemessen ## dann brauchen wir zum Verbrauch berechnen den Zählerendstand vom Monat ## März (die Messung vom 01.04.)
datei_vorvormonat=${vorvormonat}_zaehlerstand
datei_alt=${vormonat}_zaehlerstand
datei_vormonatsverbrauch=${vormonat}_monatsverbrauch
datei_vorvormonatsverbrauch=${vorvormonat}_monatsverbrauch
datei_verbrauchzwischenzaehler=verbrauchzwischenzaehler
datei_jahresverbrauch=${jahr}_jahresverbrauch
datei_vorjahresverbrauch=${vorjahr}_jahresverbrauch
backup=${pfad}${datei_alt}
backup_vorvormonat=${pfad}${datei_vorvormonat}
backup_vormonatsverbrauch=${pfad}${datei_vormonatsverbrauch}
backup_vorvormonatsverbrauch=${pfad}${datei_vorvormonatsverbrauch}
backup_verbrauchzwischenzaehler=${pfad}${datei_verbrauchzwischenzaehler}
backup_jahresverbrauch=${pfad}${datei_jahresverbrauch}
backup_vorjahresverbrauch=${pfad}${datei_vorjahresverbrauch}
## zum Rechnen alten Zählerstand auslesen und in Variable schreiben
vormonatsverbrauch=$(cat ${backup_vormonatsverbrauch})
zaehlerstand_alt=$(cat ${backup})
## Auslesen Zählerstand
##########################################################################
stty -F $device \
1:0:cad:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
## Auswerten Datenstrom, herausfiltern OBIS-Wert Zählerstand
while read -t10 line; do
zaehlerstand_neu=$(echo "$line" | awk -F '\(|\*' '/1\.8\.0/ { print $3 }')
[ "$zaehlerstand_neu" ] && break
done < $device
##########################################################################
## Anzeigen neuen Zählerstand auf Konsole – Debug-Modus
# echo $zaehlerstand_neu
[ -z "$zaehlerstand_neu" ] && echo "$0 : Missing 1.8.0 in data stream" && exit 127
## Verbrauch in kWh, 3 Nachkommastellen == Wh Genauigkeit
verbrauch_aktuell=$(echo $zaehlerstand_neu $zaehlerstand_alt | awk '{ printf "%.3f", $1-$2 }')
## Berechnung Gesamtverbrauch im aktuellen Jahr
v1=$(cat ${backup_jahresverbrauch})
gesamtverbrauch=$(echo $v1 $verbrauch_aktuell | awk '{printf "%.3f", $1+$2 }')
echo -n > ${backup_verbrauchzwischenzaehler}
echo "$gesamtverbrauch" > ${backup_verbrauchzwischenzaehler}
## Übertragen Monatsstromverbrauch an Homematic CCU2
url_aktuell="http://192.168.178.50/config/xmlapi/statechange.cgi?ise_id=8442&new_value="${verbrauch_aktuell}""
curl $url_aktuell > /dev/null 2>&1
#url_vormonat="http://192.168.178.50/config/xmlapi/statechange.cgi?ise_id=8446&new_value="${vormonatsverbrauch}""
#curl $url_vormonat > /dev/null 2>&1
url_zaehlerstand="http://192.168.178.50/config/xmlapi/statechange.cgi?ise_id=8443&new_value="${zaehlerstand_neu}""
curl $url_zaehlerstand > /dev/null 2>&1
url_gesamtverbrauch="http://192.168.178.50/config/xmlapi/statechange.cgi?ise_id=8444&new_value="${gesamtverbrauch}""
curl $url_gesamtverbrauch > /dev/null 2>&1
Alles anzeigen
- Verbrauch aktueller Monat ( ausgelöst durch crontab jeden 1. im Monat)
- Sendet aktualisierte Werte an Homematic-CCU (Vormonatsverbrauch, Zählerstand)
#!/bin/bash
########################################################
## Erfassung Monatsverbrauch/Jahresverbrauch
## Ausführen immer zum 01. Im Monat um 00:01
########################################################
## Variablen deklarieren
######################################################
#
## Ausgabebeispiel: 15-09-20_23:15
datumuhrzeit=$(date +%y-%m-%d_%H:%M)
## Ausgabebeispiel: Januar-2015
datumlang=$(date +%B-%Y)
## Deklarierung Monat-Aktuell und Vormonat
monataktuell=$(date +%B)
vormonat=$(date --date="$(date +%Y-%m-15)-1 month" +%B-%Y)
vorvormonat=$(date --date="$(date +%Y-%m-15)-2 month" +%B-%Y)
jahr=$(date +%Y)
vorjahr=$(date --date="$(date +%Y-%m-15)-12 month" +%B-%Y)
vorjahresverbrauch=0
## Schnittstelle definieren
device=/dev/lesekopf0
## Sonstige Variablen
pfad=~/easymeter-log/
## Wird zum Beispiel am 01.Mai der Verbrauch für den Monat April gemessen ## dann brauchen wir zum Verbrauch berechnen den Zählerendstand vom Monat ## März (die Messung vom 01.04.)
datei_vorvormonat=${vorvormonat}_zaehlerstand
datei_alt=${vormonat}_zaehlerstand
datei_vormonatsverbrauch=${vormonat}_monatsverbrauch
datei_vorvormonatsverbrauch=${vorvormonat}_monatsverbrauch
datei_jahresverbrauch=${jahr}_jahresverbrauch
datei_vorjahresverbrauch=${vorjahr}_jahresverbrauch
datei_verbrauchzwischenzaehler=verbrauchzwischenzaehler
backup=${pfad}${datei_alt}
backup_vorvormonat=${pfad}${datei_vorvormonat}
backup_vormonatsverbrauch=${pfad}${datei_vormonatsverbrauch}
backup_vorvormonatsverbrauch=${pfad}${datei_vorvormonatsverbrauch}
backup_verbrauchzwischenzaehler=${pfad}${datei_verbrauchzwischenzaehler}
backup_jahresverbrauch=${pfad}${datei_jahresverbrauch}
backup_vorjahresverbrauch=${pfad}${datei_vorjahresverbrauch}
## Es wird zuerst geprüft ob Datei jahreszahl vorhanden ist
## Jahreszahl in Datei schreiben
##
if [ -f ~/easymeter-log/jahreszahl ]
then
backupjahreszahl=$(cat ~/easymeter-log/jahreszahl)
else
echo -n > ~/easymeter-log/jahreszahl
echo "$jahr" > ~/easymeter-log/jahreszahl
backupjahreszahl=$(cat ~/easymeter-log/jahreszahl)
fi
##
## zum Rechnen alten Zählerstand auslesen und in Variable schreiben
##
zaehlerstand_alt=$(cat ${backup})
vormonatsverbrauch=$(cat ${backup_vormonatsverbrauch})
## Auslesen Zählerstand
##########################################################################
stty -F $device \
1:0:cad:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
## Auswerten Datenstrom, herausfiltern OBIS-Wert Zählerstand
while read -t10 line; do
zaehlerstand_neu=$(echo "$line" | awk -F '\(|\*' '/1\.8\.0/ { print $3 }')
[ "$zaehlerstand_neu" ] && break
done < $device
##########################################################################
## Anzeigen neuen Zählerstand auf Konsole – Debug-Modus
# echo $zaehlerstand_neu
[ -z "$zaehlerstand_neu" ] && echo "$0 : Missing 1.8.0 in data stream" && exit 127
## Verbrauch in kWh, 3 Nachkommastellen == Wh Genauigkeit
verbrauch=$(echo $zaehlerstand_neu $zaehlerstand_alt | awk '{ printf "%.3f", $1-$2 }')
v1=$(cat ${backup_jahresverbrauch})
gesamtverbrauch=$(echo $v1 $verbrauch | awk '{ printf "%.3f", $1+$2 }')
echo -n > ${backup_vormonatsverbrauch}
echo "$verbrauch" > ${backup_vormonatsverbrauch}
## Zählerstände sichern
echo -n > ~/easymeter-log/zaehlerstand_neu
echo -n "$zaehlerstand_neu" > ~/easymeter-log/zaehlerstand_neu
echo -n > $backup
echo -n "$zaehlerstand_neu" > $backup
echo -n > ~/easymeter-log/zaehlerstand_alt
echo -n "$zaehlerstand_neu" > ~/easymeter-log/zaehlerstand_alt
## Prufen ob ein neues Jahr (Jahresabschlussrechnung)
##
## Ist wahr wenn Jahr größer (-gt) als backupjahreszahl
## Es geht auch -ne = jahr ungleich backupjahreszahl
##
if [ $jahr -gt $backupjahreszahl ]
then
##
## Neues Jahr -> neue Jahreszahl in variable schreiben
##
echo -n > ~/easymeter-log/jahreszahl
echo "$jahr" > ~/easymeter-log/jahreszahl
## Jahresabschluss
echo -n > ${backup_vorjahresverbrauch}
echo "$gesamtverbrauch" > ${backup_vorjahresverbrauch}
vorjahresverbrauch=$(cat ${backup_vorjahresverbrauch})
## Jahresverbrauch auf 0 setzen
echo -n > ${gesamtverbrauch}
echo -n > ${backup_jahresverbrauch}
echo -n > ${backup_verbrauchzwischenzaehler}
else
## Gesamtverbrauch in Variable für aktuelles Jahr zurückschreiben
echo -n > ${backup_verbrauchzwischenzaehler}
echo "$gesamtverbrauch" > ${backup_verbrauchzwischenzaehler}
fi
## Übertragen aktueller Monatsstromverbrauch als Vormonatsverbrauchan Homematic CCU2
url_vormonatsverbrauch="http://192.168.178.50/config/xmlapi/statechange.cgi?ise_id=8446&new_value="${verbrauch}""
curl $url_vormonatsverbrauch > /dev/null 2>&1
## Übertragen aktueller Gesamtverbrauch an Homematic CCU2
url_gesamtverbrauch="http://192.168.178.50/config/xmlapi/statechange.cgi?ise_id=8444&new_value="${gesamtverbrauch}""
curl $url_gesamtverbrauch > /dev/null 2>&1
## Übertragen Vorjahresverbrauch an Homematic CCU2
url_vorjahresverbrauch="http://192.168.178.50/config/xmlapi/statechange.cgi?ise_id=8445&new_value="${vorjahresverbrauch}""
curl $url_vorjahresverbrauch > /dev/null 2>&1
## Übertragen aktueller Zählerstand an Homematic CCU2
url_zaehlerstand="http://192.168.178.50/config/xmlapi/statechange.cgi?ise_id=8443&new_value="${zaehlerstand_neu}""
curl $url_zaehlerstand > /dev/null 2>&1
## Übertragen Zählerstand Abschluss Vormonat an Homematic CCU2
url_zaehlerstand_vormonat="http://192.168.178.50/config/xmlapi/statechange.cgi?ise_id=8447&new_value="${zaehlerstand_neu}""
curl $url_zaehlerstand_vormonat > /dev/null 2>&1
Alles anzeigen
Den Gaszähler hatte ich bis jetzt über den S0-Ausgang des Gaszähler-Lesekopfes am Impulseingang des Arduino (dieser ist als homeduino konfiguriert. Projektseite: http://www.stall.biz/project/h…l-fuer-die-hausautomation ) hängen und die Counts an die Homematic-CCU2 gesendet.
Anhand eines Skriptes auf der CCU diese dann zu einem Monatsverbrauch und Zählerstand umgerechnet.
Leider erfüllt das alles nicht so ganz meinen Erwartungen (Auzeichnung Strom und Gasverbrauch mit monatlicher Abrechnung).
Jetzt hab ich mir auf meinen Pi das aktuelle Volkszählerimage installiert.
Ich habe beide Leseköpfe jetzt am PI hängen.
Über UDEV regeln ist der USB-IR-Schreiblesekopf -> lesekopf 0
und der Gaszähler-Lesekopf -> lesekopf1
Den vzlogger habe ich dann wie folgt konfiguriert ( Vielleicht kann sich das jemand mal genau ansehen ob das so in Ordnung ist):
vzlogger.conf
{
"retry": 30,
"daemon": true,
"verbosity": 15,
"log": "/var/log/vzlogger.log",
"local": {
"enabled": false,
"port": 8080,
"index": true,
"timeout": 30,
"buffer": -1
},
"meters": [
{
"enabled": true,
"interval": -1,
"aggtime": 30,
"aggfixedinterval": false,
"channels": [
{
"uuid": "<UUID von Gaszähler>",
"identifier": "Impulse",
"api": "volkszaehler",
"middleware": "http://localhost/middleware.php",
"type": "sensor",
"scaler": 1,
"aggmode": "sum",
}
],
"protocol": "s0",
"device": "/dev/lesekopf1",
},
{
"enabled": true,
"allowskip": false,
"interval": -1,
"aggtime": 30,
"aggfixedinterval": false,
"channels": [
{
"uuid": ""<UUID von Stromzähler-Zählerstand>",",
"identifier": "1-0:1.8.0*255",
"api": "volkszaehler",
"middleware": "http://localhost/middleware.php",
}, {
"uuid": " "<UUID von Stromzähler Gesamtleistung>", ",
"identifier": "1-0:1.7.0*255",
"api": "volkszaehler",
"middleware": "http://localhost/middleware.php",
}, {
"uuid": " "<UUID von Stromzähler Leistung L1>", ",
"identifier": "1-0:21.7.0*255",
"api": "volkszaehler",
"middleware": "http://localhost/middleware.php",
}, {
"uuid": " "< UUID von Stromzähler Leistung L2>", ",
"identifier": "1-0:41.7.0*255",
"api": "volkszaehler",
"middleware": "http://localhost/middleware.php",
}, {
"uuid": "< UUID von Stromzähler Leistung L3>",",
"identifier": "1-0:61.7.0*255",
"api": "volkszaehler",
"middleware": "http://localhost/middleware.php",
}
],
"protocol": "d0",
"device": "/dev/lesekopf0",
"baudrate": 9600,
"parity": "7e1",
}
]
}
Alles anzeigen
In der Middleware hab ich dann folgende Kanäle angelegt:
Titel: Stromzähler-Zählerstand
Typ: El. Energie (Zählerstände)
Auflösung: 1
Öffentlich: aktiv
Style: Steps
Cookie: aktiv
Titel: Stromzähler Leistung L1
Typ: El. Energie (Leistungswerte)
Auflösung: 1
Öffentlich: aktiv
Style: Steps
Cookie: aktiv
Titel: Stromzähler Leistung L2
Typ: El. Energie (Leistungswerte)
Auflösung: 1
Öffentlich: aktiv
Style: Steps
Cookie: aktiv
Titel: Stromzähler Leistung L3
Typ: El. Energie (Leistungswerte)
Auflösung: 1
Öffentlich: aktiv
Style: Steps
Cookie: aktiv
Titel: Stromzähler Gesamtleistung
Typ: El. Energie (Leistungswerte)
Auflösung: 1
Öffentlich: aktiv
Style: Steps
Cookie: aktiv
Titel: Gaszähler
Typ: Gas (S0-Impulse)
Auflösung: 100000
Öffentlich: aktiv
Style: Steps
Cookie: aktiv
Initialzählerstand: 11051,25 -> Muss hier Komma oder Punkt????????
Alles anzeigen
Die Aufzeichnung der Werte klappt auch wunderbar soweit, nur jetzt hab ich da n paar Verständnisprobleme.
1. Wie lösche ich die Demo-Kanäle??
2. Muss man beim Stromzähler auch einen Initialzählerstand mit angeben? Den liest er doch eigentlich mit aus, oder -> 1-0:1.8.0*255(00000758.4697830*kWh) ?
3. Wo sehe ich im Frontend bei „Stromzähler-Zählerstand“ den aktuellen Zählerstand? Von der Aufzeichnung sieht die Kurve genauso aus wie bei „Stromzähler Gesamtleistung“. Müsste da nicht ein steigender Zählerstand angezeigt werden?
Gib es für den Volkszähler auch eine Möglichkeit z.B. über ein Skript folgendes durchzuführen?
- Jede Stunde den aktualisierten derzeitigen Monatsgesamtverbrauch und den aktuellen Zählerstand auszulesen und an HM zu schicken (mit z.B. curl)
- Jeden 1. Im Monat Vormonatsverbrauch auszulesen und an HM zu schicken.
Sowohl für Stromzähler als auch für Gaszähler.
Ich hoffe ihr konntet einigermaßen folgen *fg*
Wäre super wenn mir da jemand helfen könnte!
Tausend Dank schon mal im voraus!
Johnny
P.S. Ich hab keinen Plan von PHP und SQL