Inhaltsverzeichnis
Kamstrup Multical 401
Der Kamstrup Multical 401 kann nach DIN EN 62056-21 über die IR-Schnittstelle ausgelesen werden. Wahrscheinlich geht es auch mit anderen Zählern der Firma Kamstrup, bitte bei erfolgreichen Versuchen das Wiki entsprechend ergänzen.
Hardware
Man benötigt den IR-Schreib-Lesekopf, da der Zähler erst angesprochen werden muss, bevor er sendet. Je nachdem woran man den IR-Kopf anschließen will, braucht man die USB-Version, RS232-Version oder die TTL-Version.
Kommunikation
Für den Zähler gibte es mehrere Dokumentierte Befehle auf denen er antwortet.
Folgende Befehle sind seitens Kamstrup dokumentiert:
Befehl:
/?![CR][LF][ACK]000[CR][LF]
Antwort:
/KAM[0]MCC[CR][LF][STX] 0.0(11 digits C/N)6.8(Energy * unit) 6.26(Volume * m3) 6.31(Hours * h) ! [CR] [LF] [ETX] [BCC]
Befehl (STANDARD DATA 1):
/#1
Antwort Beispiel:
0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000
Bedeutung:
- Zählerstand - Volumen - Betriebstunden - T Vorlauf - T Rücklauf - T Vorlauf - T Rücklauf - mom. Leistung - mom. Durchfluß - Max Leistung - Info
Befehl (STANDARD DATA 2):
/#2
Antwort Beispiel:
00000000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000
Bedeutung laut tech. Dok:
- Cust. No. - TA2 - TL2 - TA3 - TL3 - In-A - In-B - ABCCC - DDEFFGG - Date
Befehl (Target Data):
/#3
Antwort Beispiel:
00000000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000
Bedeutung laut tech. Dok:
- Cust. No. - Reading day - Energy - Volume - TA2 - TA3 - In-A - In-B - Peak power/flow year
Befehl (Montly Data):
/#5
Antwort Beispiel:
00000000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000
Bedeutung laut tech. Dok:
- Cust. No. - Reading date - Energy - Volume - TA2 - TA3 - In-A - In-B - Peak power/flow actual
Beispielcode in Python
Dieser Beispielcode füttert ein RRD-tool alle etwa 30 Sekunden mit den Daten, die dann mit rrd-graph geplottet werden können:
import serial import rrdtool from time import sleep mc401 = serial.Serial(port='/dev/ttyUSB0', bytesize=serial.SEVENBITS, parity=serial.PARITY_EVEN, stopbits=serial.STOPBITS_ONE, timeout=2) while True: mc401.baudrate = 300 mc401.write("/#1") mc401.flush() sleep(1) mc401.baudrate = 1200 mc401.flushInput() data = mc401.read(87).split() try: rrdtool.update('multical401.rrd', 'N:%s:%s:%s:%s:%s:%s:%s' % (data[0], data[1], data[3], data[4], data[5], data[6], data[7])) except IndexError: pass sleep(26) mc401.close()