Hallo,
ich hab einen Growatt mid4600TL-xd mit 6750Wp.
Mit der Growatt-App möchte ich jetzt nicht nur meine PV-Erzeugung sehen, sondern auch meinen Verbrauch und die Bilanz.
Statt einen Smartmeter zusätzlich einzubauen, möchte ich gerne meinen Stromzähler abfragen und die Werte dem Growatt WR per Raspi und rs485 übergeben.
Hab mir dazu einen IR-Lesekopf bestellt und kann jetzt mit python den Kamstrup 382jx3 abfragen.
Das Script: Pykamstrup habe ich aus dem Netz und im script sind auch die Power-out Register hinterlegt:
kamstrup_382_var = {
0x0001: "Energy in",
0x0002: "Energy out",
0x000d: "Energy in hi-res",
0x000e: "Energy out hi-res",
0x041e: "Voltage p1",
0x041f: "Voltage p2",
0x0420: "Voltage p3",
0x0434: "Current p1",
0x0435: "Current p2",
0x0436: "Current p3",
0x0438: "Power p1",
0x0439: "Power p2",
0x043a: "Power p3",
0x03ff: "Power In",
0x0438: "Power p1 In",
0x0439: "Power p2 In",
0x043a: "Power p3 In",
0x0400: "Power In",
0x0540: "Power p1 Out",
0x0541: "Power p2 Out",
0x0542: "Power p3 Out",
}
Und ich bekomme auch die Daten für den Verbrauch und die insgesamt eingespeiste Leistung.
Nicht aber die Daten der aktuellen Einspeiseleistung!?!…:
python3 kamstrup382-auslesen1.py
Energy in 19737.300000000003 kWh bytearray(b'?x10x00x01x02x04Ax00x03x02xfd')
Energy out 1.8 kWh bytearray(b'?x10x00x02x02x04Ax00x00x00x12')
Energy in hi-res None None None
Energy out hi-res 1.828 kWh bytearray(b'?x10x00x0ex02x04Dx00x00Gh')
Voltage p1 231.0 V bytearray(b'?x10x04x1e!x02x00x00xe7')
Voltage p2 233.0 V bytearray(b'?x10x04x1f!x02x00x00xe9')
Voltage p3 233.0 V bytearray(b'?x10x04 !x02x00x00xe9')
Current p1 0.55 A bytearray(b'?x10x044"x04Bx00x00x007')
Current p2 0.24 A bytearray(b'?x10x045"x04Bx00x00x00x18')
Current p3 0.02 A bytearray(b'?x10x046"x04Bx00x00x00x02')
Power p1 In 0.10200000000000001 kW bytearray(b'?x10x048x16x02Cx00f')
Power p2 In 0.05 kW bytearray(b'?x10x049x16x02Cx002')
Power p3 In 0.001 kW bytearray(b'?x10x04:x16x02Cx00x01')
Traceback (most recent call last):
File "/home/otto/scripts/py/kamstrup382-auslesen1.py", line 288, in <module>
x,u,b = foo.readvar(i)
File "/home/otto/scripts/py/kamstrup382-auslesen1.py", line 241, in readvar
if b[2] != nbr >> 8 or b[3] != nbr & 0xff:
IndexError: bytearray index out of range
Sobald die Abfrage der Power-In oder -Out Register gestellt wird , bricht das script ab…;-(.
Ich könnte natürlich die Werte auch vom WR holen und dann verrechnen, um auf die Bilanz zu kommen. Aber das wäre unschön… .
Es wird bei der Abfrage nur x10 zurückgegeben. Also keine Werte. Sind die Register falsch?
Im Netz finde ich keine Auflistung der abzufragenden Register..;-( . Kamstrup hält sich da sehr zurück und gibt scheinbar nichts raus..
Kennt sich hier einer aus? Kann jemand helfen?
Besten dank schon mal fürs lesen,
LG, tifo
Hast du die PIN eingegeben?
Ich glaube die brauchst du für spezielle Register.
Der Zähler spricht DLMS.
danke für den Hinweis...
nein Pin habe ich nicht...scheint nicht gesperrt zu sein...
Ich hab dann Mal heute abend alle Register abgeklappert und notiert.
Vll kanns ja jemand gebrauchen.
Sobald mein WR PV einspeist, kann ich dann hoffentlich auch die Register mit den Einspeise-Leistungangaben finden:
dez hex Beschreibung Wert Einheit
1 0x1 Energy in 19739.600000000002 kWh
2 0x2 Energy out 1.8 kWh
3 0x3 t 0.0 kvarh
4 0x4 t 0.0 kvarh
5 0x5 t 0.0 kvarh
6 0x6 t None None
13 0xd Energy in hi-res None None
14 0xe Energy out hi-res 1.828 kWh
15 0xf t 0.0 kvarh
16 0x10 t 0.0 kvarh
17 0x11 t 19739.600000000002 kWh
18 0x12 t 1.8 kWh
19 0x13 t 19739.600000000002 kWh
20 0x14 t 1.8 kWh
21 0x15 t 0.0 kvarh
22 0x16 t 0.0 kvarh
23 0x17 t 0.0 kWh
24 0x18 t 0.0 kWh
25 0x19 t None None
26 0x1a t 0.0 kvarh
27 0x1b t 0.0 kWh
28 0x1c t 0.0 kWh
29 0x1d t 0.0 kvarh
30 0x1e t 0.0 kvarh
31 0x1f t 0.0 kWh
32 0x20 t 0.0 kWh
33 0x21 t 0.0 kvarh
34 0x22 t 0.0 kvarh
37 0x25 t 0.0 kvar
38 0x26 t 0.0 kvar
39 0x27 t 2.4 kW
40 0x28 t 1.044 kW
41 0x29 t 0.0 kvar
44 0x2c t 0.0 kW
45 0x2d t 0.0 kvar
46 0x2e t 0.0 kvar
47 0x2f t 55.0
50 0x32 t 0.0
51 0x33 t None None
54 0x36 t None None
55 0x37 t 99901011.0
56 0x38 t 1000.0
58 0x3a t 0.0
199 0xc7 t None None
222 0xde t None None
1001 0x3e9 t 14806139.0
1002 0x3ea t 21146.0 hh:mm:ss
1003 0x3eb t None None
1004 0x3ec t 111993.0 h
1005 0x3ed t 53011101.0
1010 0x3f2 t 14806129.0
1021 0x3fd t 0.0
1023 0x3ff t 0.157 kW
1024 0x400 t 0.0 kW
1025 0x401 t 0.0 kvar
1026 0x402 t 0.0 kvar
1028 0x404 t 221105.0 yy:mm:dd
1029 0x405 t 100.0
1030 0x406 t 46362300.0
1031 0x407 t 19741.4 kWh
1032 0x408 t 1.0
1033 0x409 t 2.4 kW
1034 0x40a t 183000.0 hh:mm:ss
1035 0x40b t 221105.0 yy:mm:dd
1036 0x40c t 0.0 kW
1037 0x40d t 0.0 hh:mm:ss
1038 0x40e t 0.0 yy:mm:dd
1039 0x40f t 99.0 kW
1040 0x410 t 0.0
1045 0x415 t 0.0
1046 0x416 t 0.0
1049 0x419 t 1.10985584608505e+19 RTC
1050 0x41a t 1.10985584608505e+19 RTC
1051 0x41b t 0.0 RTC
1054 0x41e Voltage p1 234.0 V
1055 0x41f Voltage p2 234.0 V
1056 0x420 Voltage p3 234.0 V
1058 0x422 t 2.27691634996073e+23 ASCII
1059 0x423 t 0.0 kWh
1060 0x424 t 0.0 kWh
1061 0x425 t 0.0 kWh
1062 0x426 t 0.0 kWh
1063 0x427 t 0.0 kWh
1064 0x428 t 0.0 kWh
1066 0x42a t 0.0 kWh
1067 0x42b t 0.0 kvarh
1068 0x42c t 0.0 kvarh
1069 0x42d t 0.0 kvarh
1070 0x42e t None None
1071 0x42f t 0.0 kvarh
1073 0x431 t 0.0 kvarh
1074 0x432 t 0.0 kvarh
1075 0x433 t 0.0
1076 0x434 Current p1 0.68 A
1077 0x435 Current p2 0.06 A
1078 0x436 Current p3 0.02 A
1079 0x437 t 292.0 K
1080 0x438 Power p1 0.147 kW
1081 0x439 Power p2 0.01 kW
1082 0x43a Power p3 0.001 kW
1083 0x43b t 4544.0
1084 0x43c t 768.0
1085 0x43d t 0.0
1086 0x43e t 101111.0
1087 0x43f t 0.0
1088 0x440 t 0.0
1089 0x441 t 3.0
1090 0x442 t 5.0
1091 0x443 t 0.0
1092 0x444 t 3.0
1101 0x44d t 255.0
1102 0x44e t 0.0
1108 0x454 t 100.0 A
1109 0x455 t 1.0
1110 0x456 t 1.0
1111 0x457 t 1.0
1112 0x458 t 30.0 s
1113 0x459 t 30.0 s
1114 0x45a t 30.0 s
1115 0x45b t 60.0 s
1116 0x45c t 255.0 days
1117 0x45d t 0.0
1118 0x45e t 0.0
1119 0x45f t 0.0 A
1120 0x460 t 0.0 A
1121 0x461 t 0.0 kWh
1122 0x462 t 0.0 A
1126 0x466 t 3.82003174172655e+30 ASCII
1181 0x49d t 4.32675666992014e+17 RTC
1189 0x4a5 t 0.0
1206 0x4b6 t 3.4028236692095e+38
1207 0x4b7 t 3.4028236692095e+38
1208 0x4b8 t 3.4028236692095e+38
1209 0x4b9 t 3.4028236692095e+38
2010 0x7da t 1.0
zur info: ich mache das alles nur, weil ich keine zusätzliche Störquelle im Zählerkasten haben möchte und der geeichte Zähler von den Stadtwerke ja schon alle Daten hat.
Das Kamstrup keine Beschreibung der Schnittstelle rausgibt und lieber seine zusätzlichen Einsteckmodule und Adapter verkaufen will, kann ich nicht verstehen.
Umso mehr macht es mir Spaß, die Daten einfach zu analysieren...
Ziel soll es sein, das mein WR die Daten dann per RS482 vom raspi abfragt und in die shine-App mit anzeigt.
Und als Abfallprodukt habe ich dann mit dem Raspi eine Schaltzentrale, mit der ich dann nach eigenen Vorgaben anhand der PV-Leistung Verbraucher ein und ausschalten kann.
Hi Leute,
ich möchte hier mal kurz beschreiben, wie ich jetzt weiter gemacht habe. Vll kanns ja wer gebrauchen…:
Es gibt ja schon den Volkszähler als sehr schöne fertige Lösung (Image) für den Raspi. Das Teil ist mir einfach schon zu dick und anfällig. Daher zeige ich euch hier, wie man es auch ganz klein bauen kann.
Ich hatte ja schon das https://github.com/bsdphk/PyKamstrup/blob/master/kamstrup.py zum Suchen der Register abgeändert und mir dann die passenden Register rausgesucht (s.o.) und alles andere rausgenommen. Damit ich einen Einzeiler zur Übergabe der Werte an rrdtool erhalte habe ich das script nochmal angepasst:
Nur noch diese 2 Register werden festgelegt:
kamstrup_382_var = {
0x3ff : " Power_in " ,
0x400 : " Power-Out " ,
}
Und die Werte lege ich in ein array und gebe sie abschliessend aus:
for i in kamstrup_382_var:
x,u,b,nbr = foo.readvar(i)
nbrh=hex(nbr)
kam.append(x)
print( "%s:%s" %(kam[0] , kam[1] ) )
Anschliessend packe ich das Script.py in ein bash-script (strom.sh) und mache es ausführbar
chmod 755 strom.sh:
und nehme damit die Daten in $tmp auf
tmp=`python3 /home/otto/scripts/py/Stromzaehler/kamstrup382-Pin-Pout.py`
und gebe sie an rrdtool weiter:
https://oss.oetiker.ch/rrdtool/
rrdtool update $DIR/strom.rrd N:$tmp
die rrd muss natürlich auch angelegt werden:
(schneller Einstieg:
rrdtool create Energie.rrd --step 300 # 5min
DS:temp:GAUGE:600:-20:90 # DateSource, temp=frei wählbar
# Gauge: Zahl pos o. negativ wird unverändert gespeichert
# Counter: speichert die Differenz
# Derive: wie Counter , erlaubt auch negative Differenz
# Absolute: geht davon aus, das die Quelle immer einen Reset auf 0 macht.
# 600 timeout für verspätete Werte, Danach wird der Datenpunkt als undefined
# -20:90 Wertebereich ansonsten undefined
...
RRA:AVERAGE:0.5:12:24 # Average: Mittelwert bilden
# MAX: übernehmen
# MIN: übernehmen
...
# 0,5: maximal die Hälfte der Werte dürfen undefined sein.
# 12 Werte je 5min werden gemittelt 12*300sec=1Std Mittelwert,
# 24 Werte *1Std=1Tag
RRA:AVERAGE:0.5:288:31 # 288Werte je 5min =1TagMittelwert und davon 31 Werte (Monatsübersicht)
)
so jetzt in echt für mich angepasst (create für 2 Werte mit 3 gleichen RRAs (für Stunde, Tag und Monatsübersicht)):
rrdtool create strom.rrd --step 60 # Kommentare vor Benutzung entfernen.
DS:Bezug:GAUGE:600:-32:32 # 32:32 also bis +32kW
DS:Einspeisung:GAUGE:600:-32:32
RRA:AVERAGE:0.5:1:60 # 1 Wert und den 60-mal ablegen
RRA:AVERAGE:0.5:10:144 # 10 Werte=10min und den 144 mal ablegen=1 Tag
RRA:AVERAGE:0.5:1440:31 # 1440 Werte=1Tag 31-mal ablegen=1Monat
oder bei 10-sec Meßintervall:
rrdtool create strom.rrd --step 10 # Kommentare vor Benutzung entfernen.
DS:Bezug:GAUGE:15:-32:32
DS:Einspeisung:GAUGE:15:-32:32
RRA:AVERAGE:0.5:1:360 # 360Werte/(6promin)=60 min
RRA:AVERAGE:0.5:12:720 # 720W*12/(6promin)=1440/60min=24Std
RRA:AVERAGE:0.5:90:672 # 672W*90/(6promin)=60480/6/60/24=7Tage
RRA:AVERAGE:0.5:360:720 # 720*360/6promin)=43200/60/24=30Tage
RRA:AVERAGE:0.5:4320:730 # ../(6/min)=525600/60/24=365Tage
wenn dann erste Daten reinkommen sollen, erst mal testweise eine Schleife in der bash bauen:
while true; do tmp=`/DIR/strom.sh`; sleep60; done
Wenn das klappt kann man einen Graphen aus den abgelegten Daten bauen (hier: z.Bspl.Stunden-Ansicht):
rrdtool graph strom.gif --start -60m
--title "Strom-Bezug und Einspeisung"
--vertical-label "kW"
DEF:Bezug=strom.rrd:Bezug:AVERAGE LINE1:Bezug#ff0000:"Strom-Bezug"
DEF:Einspeisung=strom.rrd:Einspeisung:AVERAGE LINE1:Einspeisung#ffff00:"Einspeisung" ;
Und abschliessend das ganze über Crontab automatisieren:
* * * * /home/otto/scripts/py/Stromzaehler/rrd/strom.sh
läuft dann automatisch jede Minute
die Erzeugung des Graphen kann man dann entweder auch ständig mit crontab machen oder wenn ein Webserver läuft die Erzeugung beim Aufruf der Seite anstossen.
Im ersten Testbild sieht man sehr schön, dass ich um 10:04 den Wasserkocher für Kaffee benutzt habe und danach 2-mal den Toaster ;).
LG tifo15
Nachtrag:
Einstellung zur Abfrage der Zähler:
Stromzähler Kamstrup 382jx3 8N1 9600 baud (andere Modelle evtl. nur 1200)
Wärmezähler Kamstrup Multical 7E1 300/1200
Den magnetischen USB-IR-Lesekopf habe ich bei Ebay für 23,50 bestellt.
Es ist trotz des Fertiggerätes etwas fummelig den am Zähler richtig auszurichten.
Da hilft nur Geduld und Feingefühl bei der Ausrichtung mit einer schnellen Ausleserate:
while true; do python3 kamstrup.py; sleep 1; done
Vielen Dank an dieser Stelle an an Poul-Henning Kamp, der seinen Code auf https://github.com/bsdphk/PyKamstrup/blob/master/kamstrup.py
bereitgestellt hat.
LG tifo15
Hallo tifo15, Mega gut dass Du alle Register online gestellt hast, dafür vielen Dank!
Ich bin gerade seit ca 2 Wochen dran und versucht, meinen Kamstrup 382 Jx3 dazu zu überreden, dass er mir seine Daten verrät, idealerweise über den Hichi Tasmota der dran hängt, andernfalls aber auch egal mit was, Hauptsache ich bekomme den Kram in mein Home Assistant. Du hast nicht zufällig noch einen Kniff für mich parat, was dass auslesen der Werte angeht? Vielen Dank und viele Grüße, Jens aus Brühl
Hallo,
ich bin ganz neu in dem Bereich. Ich wollte mir mit einem Tasmota mit einem bitshake Lesekopf die Daten auslesen. Dafür braucht man ein Tasmota script. Der Hersteller gibt für meinen Kamstrup 382 keine scripte raus. Hat jemand eine Idee wie ich die Daten bekomme?
Hallo Jens,
sorry, war lange offline und jetzt erst wieder ...
also, oben habe ich ja beschrieben, wie ich unter linux in der bash mit dem python script die Daten abgerufen habe...
Leider habe ich jetzt schon einen neuen Stromzähler und auch vorschriftmäßig einen zusätzlichen Smartmeter einbauen lassen.
Daher kann ich leider nicht mehr testen.
LG