Ich würde gerne meine EDL21-Stromzählerdaten in Systemvariablen in meiner Homematic CCU2 anzeigen lassen bzw. in Systemvariablen auf der Homematic schreiben lassen.
Von Skripten habe ich leider keinerlei Ahnung.
Ich habe jedoch ein Skript vorliegen, welchen meinen Stromzähler aktuell auslesen kann. Das ganze läuft aktuell auf einem Raspberry und gehört zu einem Energiemanagement-Projekt, an dem ich
als Testperson teilgenommen hatte.
Dort wird der Stromzähler per Schreiblesekopf (com.met COM-IR) per TCP über Port 5000 ausgelesen und in eine Datenbank gespeichert und dann später per HTML angezeigt.
Ich möchte nun aber die Werte nicht in eine MySQL-Datenbank schreiben lassen, sondern mit DB-Access der CCU verknüpfen.
Das habe ich aktuell schon mit den Daten meiner PV-Anlage.Allerdings ist das eien Bash-Skript und dort werden die Daten mit wget gesendet. Das funktioniert auch wunderbar.
Code: Alles auswählen
#
# define common parameters for wget
#
COMMONWGETARGS="-q -O - --timeout=10"
:
wget $COMMONWGETARGS --http-user=<username> --http-password=<password> "http://inverter1.site/index.fhtml" | sed -e "s/nbsp/nbsp;/g" | sed -e "s/nbsp;;/nbsp;/g" | sed -e "s/\ //g" | html2text | tr -s " \t\r\n" | sed -e "s/^ //" | sed -e "s/x x x/0/g" >/tmp/power-inverter1.values
PHOTOVOLTAICS_DC1U=$( cat /tmp/power-inverter1.values | grep Spannung | head -1 | cut -f2 -d" " )
PHOTOVOLTAICS_DC2U=$( cat /tmp/power-inverter1.values | grep Spannung | head -2 | tail -1 | cut -f2 -d" " )
PHOTOVOLTAICS_DC1I=$( cat /tmp/power-inverter1.values | grep Strom | head -1 | cut -f2 -d" " | awk '{printf "%d\n",$1*1000}' )
PHOTOVOLTAICS_DC2I=$( cat /tmp/power-inverter1.values | grep Strom | head -2 | tail -1 | cut -f2 -d" " | awk '{printf "%d\n",$1*1000}' )
PHOTOVOLTAICS_DC1P=$(( $PHOTOVOLTAICS_DC1U * $PHOTOVOLTAICS_DC1I / 1000 ))
PHOTOVOLTAICS_DC2P=$(( $PHOTOVOLTAICS_DC2U * $PHOTOVOLTAICS_DC2I / 1000 ))
PHOTOVOLTAICS_ACCURP=$( cat /tmp/power-inverter1.values | grep aktuell | cut -f2 -d" " )
PHOTOVOLTAICS_ACTOTP=$( cat /tmp/power-inverter1.values | grep Gesamtenergie | cut -f5 -d" " )
PHOTOVOLTAICS_DAILYP=$( cat /tmp/power-inverter1.values | grep Tagesenergie | cut -f2 -d" " )
:
#
# update the system variables in the HomeMatic
#
wget $COMMONWGETARGS "http://homematic.site/addons/db/state.cgi?item=PV.DC1&value=$PHOTOVOLTAICS_DC1P"
wget $COMMONWGETARGS "http://homematic.site/addons/db/state.cgi?item=PV.DC2&value=$PHOTOVOLTAICS_DC2P"
wget $COMMONWGETARGS "http://homematic.site/addons/db/state.cgi?item=PV.AC&value=$PHOTOVOLTAICS_ACCURP"
wget $COMMONWGETARGS "http://homematic.site/addons/db/state.cgi?item=PV.DAILYP&value=$PHOTOVOLTAICS_DAILYP"
Wie in dem, oben aufgeführten, Skript (wget $COMMONWGETARGS "http://homematic.site/addons/db/state.c ... TAICS_DC1P"), nur eben in Python-Sprache.
Wenn mein Skript gestartet wird sieht das Ergebnis in Putty so aus:
Code: Alles auswählen
Reading Smart Meter Stream
Get Information from Smart Meter Stream
Zaehlerstand Methode A
Zaehlerstands Index mit Methode A
Index A: 22 Index B: 50
Zaehlerstand (HEX) : 0000000001CC7CFF
[b]Zaehlerstand :[/b] 3017
Wirkleistung Methode A
Wirkleistungs Index mit Methode A
Wirkleistung (HEX) : 00000115
[b]Wirkleistung : [/b]277.0 W
Zaehlerstand Produktion gefunden
Zaehlerstand Produktion Index mit Methode A
Z. Produktion (HEX) : 0000000007BA0F7E
[b]Z.Produktion : [/b]12963.0
2015-01-10 14:41:13.879632
Save Prod
Save Smart Meter Values to Database
INSERT INTO smart_meter_values (time,vendorid, serverid, wirkarbeittot, wirkleistung, wirkarbeitdelta, production) VALUES ('2015-01-10 14:41:13.879632','0','localhost','3017','277.0','0.0','12963.0')
Saved Successfull
Code: Alles auswählen
#!/usr/bin/python
# Auslesen EDL21 per IR-Lesekopf
def prodSystem():
#0 Nein
#1 Ja
return 1
import time
import pytz
import socket
from datetime import datetime, timedelta
def read_smart_meter():
print "Reading Smart Meter Stream"
TCP_IP = "192.168.126.129"
TCP_PORT = 5000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
dataBuffer = s.recv(1024)
data = s.recv(10000)
#print data
openbreak = 0
openbreak = data.index("(")
openbreak = openbreak + 1
closingbreak = data.index(")")
smlfilelength = closingbreak - openbreak
smlmsg = data[openbreak:openbreak+smlfilelength]
s.close()
calc_smart_meter(smlmsg)
def simulate_read_smart_meter():
#Daten Lesekopf
simulate_smart = "1B1B1B1B01010101760501FDE17462006200726301017601010
500A9F5D00B090149534B0003C1DB01010163F62400760501FDE175620062007263070177010B
090149534B0003C1DB01070100620AFFFF7262016500FB06907D77078181C78203FF010101010
449534B0177070100000009FF010101010B090149534B0003C1DB010177070100010800FF6500
01018201621E52FF5900000000008698BC0177070100010801FF0101621E52FF5900000000008
698BC0177070100010802FF0101621E52FF5900000000000000000177070100020800FF650001
018201621E52FF590000000002E6A1840177070100020801FF0101621E52FF590000000002E6A
1840177070100020802FF0101621E52FF5900000000000000000177070100100700FF0101621B
520055000003600177070100240700FF0101621B5200550000006A0177070100380700FF01016
21B520055000002D101770701004C0700FF0101621B520055000000240177078181C78205FF01
0101018302D9C7AD5BF636D3DD352E689E9EDF9EE83A2CE552649CE5E4323FFF16A838F704B3F
8C0806B2C646C2957CA9BF0F6397901010163CEAF00760501FDE1766200620072630201710163FBEE001B1B1B1B1A00871"
calc_smart_meter(simulate_smart)
def calc_smart_meter(smart_stream):
zaehlerstand = 0
wirkleistung = 0
#print smart_stream
print "Get Information from Smart Meter Stream"
j = 0
if "0100010800FF" in smart_stream:
print "Zaehlerstand Methode A"
try:
j = smart_stream.index("0100010800FF")
zahlerstandHEX = smart_stream[j:j+100]
j2 = 0
j3 = 0
if "01621E52FF59" in zahlerstandHEX:
print "Zaehlerstands Index mit Methode A"
j2 = zahlerstandHEX.index("01621E52FF59")
j3 = zahlerstandHEX.index("017707")
print "Index A: %s Index B: %s" % (j2,j3)
ZS_HEX = zahlerstandHEX[(j2+12):j3]
print "Zaehlerstand (HEX) : %s" % ZS_HEX
decZS = int(ZS_HEX,16)
zaehlerstand = (decZS / 10000)
print "Zaehlerstand : %s" % zaehlerstand
elif "01621E52FF56" in zahlerstandHEX:
print "Zaehlerstands Index mit Methode B"
j2 = zahlerstandHEX.index("01621E52FF56")
j3 = zahlerstandHEX.index("017707")
ZS_HEX = zahlerstandHEX[(j2+12):j3]
print "Zaehlerstand (HEX) : %s" % ZS_HEX
decZS = int(ZS_HEX,16)
zaehlerstand = (decZS / 10000)
print "Zaehlerstand : %s" % zaehlerstand
else:
print "Konnte den Zaehlerstand nicht finden"
except:
print "Fehler in Methode A beim Zaehlerstand"
elif "0100010801FF" in smart_stream:
print "Zaehlerstand Methode B"
try:
j = smart_stream.index("0100010801FF")
zahlerstandHEX = smart_stream[j:j+100]
j2 = 0
j3 = 0
if "01621E52FF69" in zahlerstandHEX:
print "Zaehlerstands Index mit Methode A"
j2 = zahlerstandHEX.index("01621E52FF69")
j3 = zahlerstandHEX.index("017707")
print "Index A: %s Index B: %s" % (j2,j3)
ZS_HEX = zahlerstandHEX[(j2+12):j3]
print "Zaehlerstand (HEX) : %s" % ZS_HEX
decZS = int(ZS_HEX,16)
zaehlerstand = (decZS / 10000)
print "Zaehlerstand : %s" % zaehlerstand
else:
print "Konnte den Zaehlerstand nicht finden"
except:
print "Fehler in Methode A beim Zaehlerstand"
elif "jh" in smart_stream:
print "Zaehlerstand Methode C"
else:
print "Zaehlerstand nicht Abrufbar"
zaehlerstand = 0
k = 0
if "0100100700FF" in smart_stream:
print "Wirkleistung Methode A"
try:
k = smart_stream.index("0100100700FF")
wirkleistungHEX = smart_stream[k:k+100]
k2 = 0
k3 = 0
if "55" in wirkleistungHEX:
print "Wirkleistungs Index mit Methode A"
k2 = wirkleistungHEX.index("55")
k3 = wirkleistungHEX.index("017707")
WL_HEX = wirkleistungHEX[k2+2:k3]
print "Wirkleistung (HEX) : %s" % WL_HEX
decWL = int(WL_HEX,16)
if WL_HEX[0:2] == "FF":
decWLL = int("FFFFFFFF", 16)
print "FULL: %s" % decWLL
print "CURR: %s" % decWL
decWL = decWL-decWLL
wirkleistung = float(decWL);
print "Wirkleistung : %s W" % wirkleistung
elif "3423432" in wirkleistungHEX:
print "Wirkleistungs Index mit Methode B"
else:
print "Konnte die Wirkleistung nicht finden"
except:
print "Fehler in Methode A beim Zaehlerstand"
elif "01000F0700FF" in smart_stream:
print "Wirkleistung Methode B"
try:
k = smart_stream.index("01000F0700FF")
wirkleistungHEX = smart_stream[k:k+100]
k2 = 0
k3 = 0
if "55" in wirkleistungHEX:
print "Wirkleistungs Index mit Methode A"
k2 = wirkleistungHEX.index("55")
k3 = wirkleistungHEX.index("017707")
WL_HEX = wirkleistungHEX[k2+2:k3]
decWL = int(WL_HEX,16)
print "Wirkleistung (HEX) : %s" % WL_HEX
wirkleistung = float(decWL);
print "Wirkleistung : %s W" % wirkleistung
elif "932323" in wirkleistungHEX:
print "Wirkleistungs Index mit Methode B"
else:
print "Konnte die Wirkleistung nicht finden"
except:
print "Fehler in Methode B beim Zaehlerstand"
elif "0100010700FF" in smart_stream:
print "Wirkleistung Methode C"
try:
k = smart_stream.index("0100010700FF")
wirkleistungHEX = smart_stream[k:k+50]
k2 = 0
if "55" in wirkleistungHEX:
print "Wirkleistungs Index mit Methode A"
k2 = wirkleistungHEX.index("55")
WL_HEX = wirkleistungHEX[k2+2:k2+10]
decWL = int(WL_HEX,16)
print "Wirkleistung (HEX) : %s" % WL_HEX
wirkleistung = float(decWL);
print "Wirkleistung : %s W" % wirkleistung
elif "932323" in wirkleistungHEX:
print "Wirkleistungs Index mit Methode B"
else:
print "Konnte die Wirkleistung nicht finden"
except:
print "Fehler in Methode C beim Zaehlerstand"
else:
print "Wirkleistung nicht Abrufbar"
wirkleistung = 0
if prodSystem() == 1:
x = 0
if "0100020800FF" in smart_stream:
print "Zaehlerstand Produktion gefunden"
x = smart_stream.index("0100020800FF")
prodZaHEX = smart_stream[x:x+100]
x2 = 0
x3 = 0
if "01621E52FF59" in prodZaHEX:
print "Zaehlerstand Produktion Index mit Methode A"
x2 = prodZaHEX.index("01621E52FF59")
x3 = prodZaHEX.index("017707")
PZ_HEX = prodZaHEX[x2+12:x3]
decWL = int(PZ_HEX,16)
print "Z. Produktion (HEX) : %s" % PZ_HEX
zaehlerprod = float(decWL/10000);
print "Z.Produktion : %s" % zaehlerprod
else:
print "Konnte die Zaehlerstand Produktion nicht finden"
else:
print "Produktion nicht abrufbar"
#berlinTZInt = pytz.timezone('Europe/Berlin')
#currentTimeBerlinInt = datetime.now(berlinTZInt)
#currentTimeBerlinInt = currentTimeBerlinInt.replace(tzinfo=None)
#print currentTimeBerlinInt
#cnx = mysql.connector.connect(**config)
#cursorModule = cnx.cursor()
queryModule = ("select wirkarbeittot from smart_meter_values where time=(select max(time) from smart_meter_values)")
#cursorModule.execute(queryModule)
lastWirk = 0
for wirkarbeittot in cursorModule:
lastWirk = wirkarbeittot[0]
wirkarbeitDelta = 0
if lastWirk >= 0:
wirkarbeitDelta = (zaehlerstand - lastWirk)
else:
wirkarbeitDelta = 0
if prodSystem() == 1:
print "Save Prod"
save_smart_meter_db_prod(currentTimeBerlinInt, 0,'localhost',zaehlerstand,wirkleistung,wirkarbeitDelta, zaehlerprod)
else:
print "Save Normal"
save_smart_meter_db(currentTimeBerlinInt, 0,'localhost',zaehlerstand,wirkleistung,wirkarbeitDelta)
def save_smart_meter_db(time, vendorid, serverid, wirktot, wirklei, wirkdelta):
print "Save Smart Meter Values to Database"
#cnx = mysql.connector.connect(**config)
#cursor = cnx.cursor()
query = """INSERT INTO smart_meter_values (time,vendorid, serverid, wirkarbeittot, wirkleistung, wirkarbeitdelta) VALUES ('%s','%s','%s','%s','%s','%s')""" % (time,vendorid,serverid,wirktot,wirklei,wirkdelta)
print query
cursor.execute(query)
cursor.close()
#cnx.commit()
#cnx.close()
print "Saved Successfull"
def save_smart_meter_db_prod(time, vendorid, serverid, wirktot, wirklei, wirkdelta,prod):
print "Save Smart Meter Values to Database"
#cnx = mysql.connector.connect(**config)
#cursor = cnx.cursor()
query = "delete from smart_meter_values where id NOT IN(select id from (select DISTINCT smart_meter_values.id from smart_meter_values group by year(time),month(time),day(time),hour(time)) as tmptable)"
print query
cursor.execute(query)
cursor.close()
#cnx.commit()
#cnx.close()
print "Saved Successfull"
timer = 0
while(1>0):
read_smart_meter()
timer = timer + 1
if(timer>=5000):
timer = 0
#cnx = mysql.connector.connect(**config)
#cursor = cnx.cursor()
query = "delete from smart_meter_values where id NOT IN(select id from (select DISTINCT smart_meter_values.i$
cursor.execute(query)
cursor.close()
#cnx.commit()
#cnx.close()
time.sleep(2)
Wie gesagt, von Skrpten so gut wie keine Ahnung. Mit guten Tipps und Iden würde ich aber evtl. weiterkommen.