I dette holdningsstof udtrykker forfatteren sin personlige holdning om emnet.

Kamstrup Meter Protocol

26. februar 2012 kl. 17:1994
Artiklen er ældre end 30 dage

Da vi sidst forlod emnet, havde jeg fået en Kamstrup 382J elmåler, men manglede protokollen for at kunne få andet en IEC1107 informationerne ud af den.

Det problem er løst nu: PyKamstrup er et lille python program der via en seriel-port og et optisk hovede (se tidligere blogindlæg for diagram) kan hente brugbare data ud af ihvertfald min elmåler.

Jeg har prøvet at spørge Kamstrup efter protokol dokumentationen et par gange, men det kommer der ikke noget ud af, selv ikke når man henviser til at Kamstrup selv i deres produktblade beskriver "KMP" protokollen som "the KMP (Kamstrup Meter. Protocol), which is [also] an open protocol."

Vink med Vognstang til Kamstrup:

Artiklen fortsætter efter annoncen

Det er ikke en "åben protokol" når I ikke vil slippe dokumentationen.

Af hjemmestrikkede protokoller at være er det ikke den værste jeg har set, anvendelsen af CRC16 som checksum trækker opad, den klodsede frame- og escape-mekanisme tæller nedaf.

Jeg har ikke helt styr på hvordan/hvor godt Python virker under Windows, men i hvertfald alle nutidige UNIX dialekter burde kunne bruge ovenstående program.

At implementere protokollen på f.eks Arduino ligger lige til højrebenet.

Artiklen fortsætter efter annoncen

Samme protokol anvendes tilsyneladende også af mange af Kamstrups andre måleindretninger, men der har man formodentlig andre variabel-numre med andre betydninger.

God Fornøjelse,

phk

PS: Output fra min elmåler:

Energy in (kWh) 6745
Energy out (kWh) 0
Energy in hi-res (kWh) 6745.4191
Energy out hi-res (kWh) 0.0
Voltage p1 (V) 229
Voltage p2 (V) 226
Voltage p3 (V) 232
Current p1 (A) 5.58
Current p2 (A) 1.69
Current p3 (A) 2.36
Power p1 (kW) 1.029
Power p2 (kW) 0.322
Power p3 (kW) 0.438

94 kommentarer.  Hop til debatten
Debatten
Log ind eller opret en bruger for at deltage i debatten.
settingsDebatindstillinger
64
21. april 2016 kl. 14:26

@Søren Juhl Andreasen , fik du nogensinde fat på Dongs Kamstrup 382Mx3 måler. Jeg har forsøgt men, hvis du har fundet en løsning, så kunne jeg godt tænke mig et par tips :-)

Mvh. Flemming

63
28. marts 2015 kl. 23:26

Så fik vi software til at køre i esp8266 + modul til at sætte det i kamstrup 601

https://github.com/nabovarme/kamstrup-wifihttps://oshpark.com/shared_projects/uZ377Gru

resultatet kan ses her:

https://isp.skulp.net/nabovarme/

Vi forsyner en del af christiania med varme fra pillefyr (nabovarme) og bruger bl.a. multical 601 som målere ude hos brugerne. Planen er at sætte modulet i og både fjernaflæse og give brugerne mulighed for at følge med i deres forbrug.

62
15. marts 2015 kl. 16:50

Lars,

Det er min erfaring, at M-bus telegrammer er krypterede. Jeg var begyndt at kigge lidt på det via SDR, men kom ikke rigtig længere end også at kunne se headers.

61
15. marts 2015 kl. 14:37

Hej

Er der nogen af Jer der har prøvet at aflæse Jeres målere trådløst? Jeg har en Multical 402 med et wireless modul. Jeg har købt et wireless M-bus Radio modul som jeg har sat på et Beagleboard. Der er hul igennem og jeg modtager data fra måleren ca. hvert 4 minut. Men det ligner bare en header, som jeg dog ikke har afkodet endnu. Så hvis der er én af Jer der har hul igennem trådløst vil jeg gerne høre lidt om det.

60
10. marts 2015 kl. 00:42

Hej folkens

Ville bare lige høre om der er nogen der har prøvet at kommunikere med en Kamstrup 382Mx3 ?

Jeg har så småt bikset noget sammen efter instrukserne her : https://wiki.hal9k.dk/projects/kamstrup#test

Meeeeeeeeen, der går "Timed out listening for data" i den. Nogen der ved hvilken diode der skal være til hhv. venstre og højre?

59
10. marts 2015 kl. 00:42

Hej folkens

Ville bare lige høre om der er nogen der har prøvet at kommunikere med en Kamstrup 382Mx3 ?

Jeg har så småt bikset noget sammen efter instrukserne her : https://wiki.hal9k.dk/projects/kamstrup#test

Meeeeeeeeen, der går "Timed out listening for data" i den. Nogen der ved hvilken diode der skal være til hhv. venstre og højre?

58
5. september 2014 kl. 23:00

hmm... din udsender også trådløst og batteri holder 12 år....

de fleste værker skifter måler efter bare 6 år.... så ja hvis du kan nøjes med at aflæse hver 5 min eller sådan vil jeg ikke mene der skulle ske noget

det er jo kun når du beder om at få data det koster noget.... magneten er bare en besked til måleren om at nu kan der ske noget (tror jeg)

men du bestemmer selv... jeg vil ikke selv have noget problem i det

det eneste der kan drille er at man skal finde register id man skal spørge om... og dem kender jeg ikke... jeg har bare brugt de programmer der er lagt på nettet... de er sådan set ens... den eneste forskel er de register id'er man spørger på

57
5. september 2014 kl. 22:51

ja på din går den ikke uden magnet... nok heller ikke i mit tilfælde men jeg behøver ikke tænke på batteri

men hvis du byggede den her: https://wiki.hal9k.dk/projects/kamstrup

ja så er du så tæt på du kan komme... jeg kiggede ikke lige i datablad om der stod noget med levetid på batteri hvis man aflæser optisk

det kommer jo også an på hvor tit man gør det, kamnstrup sagde til mig at man ikke skulle gå under 1 min af hensyn til batteri... men de vidste jo heller ikke min er direkte forsynet med 24V

56
5. september 2014 kl. 22:43

Den du linkede til dog uden magnet, men tak for info, jeg tror bare jeg læser en gang om dagen.

55
5. september 2014 kl. 22:39

kiggede lige på databladet for din vand måler:

https://www.kamstrup.dk/media/16717/file.pdf

side 44:

Måleren har et optisk kommunikationsinterface på fronten. Interfacet kommunikerer med 1200 baud,

For at begrænse strømforbruget, er det optiske øje normalt slukket. Målerens optiske kommunikation tændes automatisk, 4 sek. efter et magnetisk optisk læsehoved er placeret på måleren.

det vil sige at det er slukket med mindre der kommer en magnet eller 2 til... så hvis du ikke bruger magnet på din måler sker der NADA :-D

det samme gælder for varme måleren:

https://www.kamstrup.dk/media/19756/file.pdf

side 105

min måler er forsynet med 24V fra en trafo i eltavlen, det er vist gældende på det meste af fyn...

hvis din ikke er det vil jeg tænke mig lidt om... batteriet kan hurtig tømmes... og man vil nok have et større forklaringsproblem. Værket kan jo sige at du er skyld i at der skal skiftes tidligt. at de så kunne have valgt at forsyne fra en 24V trafo er nok noget andet

men nok løftede pegefingre... i begge tilfælde taler de samme protokol... et par sider op i den sidste pdf kan du se nogen af de register id's der bruges....

hvad opstilling har du prøvet sidst?

54
5. september 2014 kl. 22:07

602 fjernvarme, 21 vand

53
5. september 2014 kl. 22:05

hvad måler har du da?

52
5. september 2014 kl. 21:58

Det er super det der er lavet, jeg kan bare ikke få det til at virke... men det er ikke den rigtige måler, håbede bare på man bare kunne få et svar man måske ikke kunne tyde... ved du om det er den samme kommando man sender til alle målere, også skal man bare bruge protokollen til at tyde svaret? Eller det også start kommando?

51
5. september 2014 kl. 21:45

ikke at jeg ved af, men det kan da ikke udelukkes at kamstrup og værk har snakket sammen direkte...

men nu er der hvert fald en opskrift som kan følges....det eneste jeg glemte at sige er at jeg startede med at sætte øjet på med kabelhul nedad... det skal vende op... omvendt er det sku heller ikke til at se på måleren hvad diode der er hvad.

50
5. september 2014 kl. 21:40

Ok bad Kamstrup ikke og se en godkendelse fra værket?

49
5. september 2014 kl. 21:35

hehe, har aldrig spurgt dem om lov... der er jo tale om ren aflæsning og det tror jeg næppe man skal have lov til... der bliver jo heller ikke lavet noget indgreb i måleren... så nej har ikke spurgt om lov, og vil heller ikke... og de fjernaflæser så kommer aldrig til at se det

og hvis de brokker sig får de bare lov at give mig mulighed for at aflæse hver 2. sek uden at stå ved måleren.... ellers kan de sku pille deres lort ned og plombere hanere i lukket tilstand

48
5. september 2014 kl. 21:31

Ja fra værket? det kunne være du havde gemt den mail?

47
5. september 2014 kl. 21:29

hvad for en godkendelse? til at sætte det optiske øje på?

46
5. september 2014 kl. 21:26

Det tror jeg vores gør de siger nej til alt :( har du stadig godkendelsen liggende? ;)

45
5. september 2014 kl. 21:17

Ja da jeg fik den var det direkte fra kamstrup, dog skulle jeg lige have varmeselskabets velsignelse, men den fik jeg nu meget nemt da de udemærket ved at man alligevel ikke kan ændre på måledata.

nogen selskaber siger nej da de ikke har en hat forstand på tingene.

44
5. september 2014 kl. 21:15

Hvor fik du fat i den? ved Kamstrup?

43
5. september 2014 kl. 20:56

skal prøve at lede... men havde engang et oprydnings flip på pc'en samtidig med jeg egentlig havde opgivet så ingen garantier

42
5. september 2014 kl. 19:45

Fedt! har du protokollen som jeg spurte til?

41
5. september 2014 kl. 18:48

Jubii.....

Så fik jeg data ud med det her øje:

https://wiki.hal9k.dk/projects/kamstrup

Sample data:

Energy: 102.47 Current Power: 0.00 Temperature t1: 35.45 Temperature t2: 30.84 Temperature diff: 4.61 Flow: 0.00 Volumen 1: 1208.96 Volumen 2: 0.00

Endelig sketch til arduino:

#include <SoftwareSerial.h></p>
<p>//Kamstrup setup
// Kamstrup Multical 601
word const kregnums[] = { 0x003C,0x0050,0x0056,0x0057,0x0059,0x004a,0x0044,0x0045 };
char* kregstrings[] = { "Energy","Current Power","Temperature t1","Temperature t2","Temperature diff", "Flow", "Volumen 1", "Volumen 2" };
#define NUMREGS 8 // Number of registers above
#define KAMBAUD 1200</p>
<p>// Units
char* units[65] = {"","Wh","kWh","MWh","GWh","j","kj","Mj",
"Gj","Cal","kCal","Mcal","Gcal","varh","kvarh","Mvarh","Gvarh",
"VAh","kVAh","MVAh","GVAh","kW","kW","MW","GW","kvar","kvar","Mvar",
"Gvar","VA","kVA","MVA","GVA","V","A","kV","kA","C","K","l","m3",
"l/h","m3/h","m3xC","ton","ton/h","h","hh:mm:ss","yy:mm:dd","yyyy:mm:dd",
"mm:dd","","bar","RTC","ASCII","m3 x 10","ton x 10","GJ x 10","minutes","Bitfield",
"s","ms","days","RTC-Q","Datetime"};</p>
<p>// Pin definitions
#define PIN_KAMSER_RX 9 // Kamstrup IR interface RX
#define PIN_KAMSER_TX 10 // Kamstrup IR interface TX
#define PIN_LED 13 // Standard Arduino LED</p>
<p>// Kamstrup optical IR serial
#define KAMTIMEOUT 2000 // Kamstrup timeout after transmit
#define POLLINTERVAL 20000 // Polling interval
SoftwareSerial kamSer(PIN_KAMSER_RX, PIN_KAMSER_TX, false); // Initialize serial</p>
<p>// last poll variable
long lastpoll;</p>
<p>void setup() {
// initialize serial interface
Serial.begin(57600);</p>
<p>pinMode(PIN_LED,OUTPUT);
digitalWrite(PIN_LED, 0);</p>
<p>// setup kamstrup serial
pinMode(PIN_KAMSER_RX,INPUT);
pinMode(PIN_KAMSER_TX,OUTPUT);
kamSer.begin(KAMBAUD);</p>
<p>// initialize lastpoll value
lastpoll = 0;
}</p>
<p>void loop() {</p>
<p>// check if it is time to do a poll
if(millis() - lastpoll > POLLINTERVAL or lastpoll == 0) {</p>
<p>// poll the Kamstrup registers for data
for (int kreg = 0; kreg < NUMREGS; kreg++) {
kamReadReg(kreg);
delay(100);
}</p>
<pre><code> digitalWrite(PIN_LED, digitalRead(PIN_KAMSER_RX));
</code></pre>
<p>delay(1000);</p>
<pre><code>// update lastpoll
lastpoll = millis();
</code></pre>
<p>}
}</p>
<p>// kamReadReg - read a Kamstrup register
float kamReadReg(unsigned short kreg) {</p>
<p>byte recvmsg[30]; // buffer of bytes to hold the received data
float rval; // this will hold the final value</p>
<p>// prepare message to send and send it
byte sendmsg[] = { 0x3f, 0x10, 0x01, (kregnums[kreg] >> 8), (kregnums[kreg] & 0xff) };
kamSend(sendmsg, 5);</p>
<p>// listen if we get an answer
unsigned short rxnum = kamReceive(recvmsg);</p>
<p>// check if number of received bytes > 0
if(rxnum != 0){</p>
<pre><code>// decode the received message
rval = kamDecode(kreg,recvmsg);

// print out received value to terminal (debug)
Serial.print(kregstrings[kreg]);
Serial.print(": ");
Serial.print(rval);
Serial.print(" ");
Serial.println();

return rval;
}
</code></pre>
<p>}</p>
<p>// kamSend - send data to Kamstrup meter
void kamSend(byte const *msg, int msgsize) {</p>
<p>// append checksum bytes to message
byte newmsg[msgsize+2];
for (int i = 0; i < msgsize; i++) { newmsg[i] = msg[i]; }
newmsg[msgsize++] = 0x00;
newmsg[msgsize++] = 0x00;
int c = crc_1021(newmsg, msgsize);
newmsg[msgsize-2] = (c >> 8);
newmsg[msgsize-1] = c & 0xff;</p>
<p>// build final transmit message - escape various bytes
byte txmsg[20] = { 0x80 }; // prefix
int txsize = 1;
for (int i = 0; i < msgsize; i++) {
if (newmsg[i] == 0x06 or newmsg[i] == 0x0d or newmsg[i] == 0x1b or newmsg[i] == 0x40 or newmsg[i] == 0x80) {
txmsg[txsize++] = 0x1b;
txmsg[txsize++] = newmsg[i] ^ 0xff;
} else {
txmsg[txsize++] = newmsg[i];
}
}
txmsg[txsize++] = 0x0d; // EOF</p>
<p>// send to serial interface
for (int x = 0; x < txsize; x++) {
kamSer.write(txmsg[x]);
}</p>
<p>}</p>
<p>// kamReceive - receive bytes from Kamstrup meter
unsigned short kamReceive(byte recvmsg[]) {</p>
<p>byte rxdata[50]; // buffer to hold received data
unsigned long rxindex = 0;
unsigned long starttime = millis();</p>
<p>kamSer.flush(); // flush serial buffer - might contain noise</p>
<p>byte r;</p>
<p>// loop until EOL received or timeout
while(r != 0x0d){</p>
<pre><code>// handle rx timeout
if(millis()-starttime > KAMTIMEOUT) {
Serial.println("Timed out listening for data");
return 0;
}

// handle incoming data
if (kamSer.available()) {

// receive byte
r = kamSer.read();
if(r != 0x40) { // don't append if we see the start marker
// append data
rxdata[rxindex] = r;
rxindex++;
}

}
</code></pre>
<p>}</p>
<p>// remove escape markers from received data
unsigned short j = 0;
for (unsigned short i = 0; i < rxindex -1; i++) {
if (rxdata[i] == 0x1b) {
byte v = rxdata[i+1] ^ 0xff;
if (v != 0x06 and v != 0x0d and v != 0x1b and v != 0x40 and v != 0x80){
Serial.print("Missing escape ");
Serial.println(v,HEX);
}
recvmsg[j] = v;
i++; // skip
} else {
recvmsg[j] = rxdata[i];
}
j++;
}</p>
<p>// check CRC
if (crc_1021(recvmsg,j)) {
Serial.println("CRC error: ");
return 0;
}</p>
<p>return j;</p>
<p>}</p>
<p>// kamDecode - decodes received data
float kamDecode(unsigned short const kreg, byte const *msg) {</p>
<p>// skip if message is not valid
if (msg[0] != 0x3f or msg[1] != 0x10) {
return false;
}
if (msg[2] != (kregnums[kreg] >> 8) or msg[3] != (kregnums[kreg] & 0xff)) {
return false;
}</p>
<p>// decode the mantissa
long x = 0;
for (int i = 0; i < msg[5]; i++) {
x <<= 8;
x |= msg[i + 7];
}</p>
<p>// decode the exponent
int i = msg[6] & 0x3f;
if (msg[6] & 0x40) {
i = -i;
};
float ifl = pow(10,i);
if (msg[6] & 0x80) {
ifl = -ifl;
}</p>
<p>// return final value
return (float )(x * ifl);</p>
<p>}</p>
<p>// crc_1021 - calculate crc16
long crc_1021(byte const *inmsg, unsigned int len){
long creg = 0x0000;
for(unsigned int i = 0; i < len; i++) {
int mask = 0x80;
while(mask > 0) {
creg <<= 1;
if (inmsg[i] & mask){
creg |= 1;
}
mask>>=1;
if (creg & 0x10000) {
creg &= 0xffff;
creg ^= 0x1021;
}
}
}
return creg;
}

40
3. september 2014 kl. 21:32

Hej bo, er det muligt at du vil sende protokollen der dækker disse målere. (dækker multical 21, 402, 801, 62, 602, 601+ og 601 samt SVM S6

Jeg har nemlig 602 og 21.

39
28. august 2014 kl. 20:01

jeg vil nu sige gid der var nogen som vidste lidt mere..

der går jo også rygter om at hvis ens måler er fjernaflæst så kan man i nogen tilfælde ikke selv aflæse med optisk øje osv....

mit eget problem er at jeg kun har aflæsning 4 gange i året når skraldebilen kommer forbi, der sidder et lille modem modul i.... hvorfor f.... de ikke har brugt el nettet lige som elmåleren nu den sidder 50cm fra eltavlen osv.... så kunne man i det mindste se aflæsninger hver time eller sådan..

endelig burde der være en lov at om at forbrugs data ikke er selskabets ejendom men forbrugeren og at forbrugeren skal kunne trække data ud lokalt hvis man ønsker det.

38
28. august 2014 kl. 19:49

ok, den har jeg også prøvet, gid man kunne komme i kontakt med kildal :)

37
28. august 2014 kl. 19:37

ja det er den kode jeg har sat ind her for ca 3 måneder siden.. og det er den samme kode jeg brugte igen idag

36
28. august 2014 kl. 19:28

Ja jeg har taget den ene del fra thingiverse og sat en transistor ind kildal's. jeg har lavet den komplette fra thingiverse og virker heller ikke, ir lyser men ikke kommuikere? Måske det er arduino koden?

Selve ir øjet burte ikke være så kunstværdig, så jeg forstår det ikke helt? Har du set kildals kode til hans fjv måler?

35
28. august 2014 kl. 19:18

https://imgur.com/Kd6z4QZ

er den næste jeg vil prøve af om end den kræver lidt mere finger arbejde at lave på fuglerede

34
28. august 2014 kl. 19:09

jeg kan se ud af billedet at delen til venstre stammer fra eagle...

kan det passe du har været inde på thingiverse og taget eagle filerne jeg har lavet?

og har du prøvet at lave opstillingen præcis som jeg har lavet den?

33
28. august 2014 kl. 17:30

Jeg har lavet 3 forskellige opstillinger den sidste jeg har lavet, vil jeg mene er den mest simple uden man skal bruge et alternativt SoftwareSerial bibliotek.

Men det virker ikke, jeg kan ikke finde ud af hvor fejlen ligger nogen der kan hjælpe?

https://test.timecheck.dk/txrx.jpg

32
28. august 2014 kl. 15:40

æv ingen data...

om sender dioden så vender til højre eller venstre gør ikke nogen forskel...

og jeg lade den gå helt til målerens lille optiske vindue og 2 gennemløb med dioden til højre og så 2 gennemløb til venstre...

kun komma'er fik jeg ud som adskiller data...

æv bæv

31
28. august 2014 kl. 14:18

så fik jeg lavet opskrifen på fuglereden som kildal giver

og brugte også den ir ting som han linker til.

der kommer lys ud, jeg kan se det med en mobil..

men det jeg gjorde for at teste om der er lys er at bede arduino om at tænde den konstant... den blinker så af og til men ellers konstant tændt...

det er meget svagt.. og når man køre på normal vis vil man slet ikke nå at se det via en mobil...

tester lidt senere på dagen om der rent faktisk kommer data ud

30
25. august 2014 kl. 22:39

https://www.el-supply.dk/?Vnr=455.IRRhttps://www.el-supply.dk/?Vnr=455.IRT

koden er kildal's uændret... vil imorgen se om jeg har nok til at lave en fugle rede

prøv evt også at kigge det her link: https://www.thingiverse.com/thing:264268

det er en gut ved mads som har lavet 3D tingen.. og han har fået det til at virke.

men vil se dyner... når jeg engang er i lodret plan vil jeg se om jeg fik stumper nok til at lave en fuglerede...

29
25. august 2014 kl. 22:32

Jeg har lige lavet diagrammet og testet med din kode til arduino, og jeg kan ikke via kamera se noget lys desværre, hvilke ir dioder har du købt?

28
25. august 2014 kl. 21:50

jo har lavet fuglereden sidst jeg forsøgte mig

men da vidste jeg ikke hvad IR dioder der skulle bruges, det har jeg via thingiverse nu fundet ud af

men også dengang kunne jeg med en mobil se ir lyset... tror jeg har været tæt på men bare ikke den rigtige bølgelængde

27
25. august 2014 kl. 18:24

Så du har slet ikke lavet en fuglerede og testet inden du laver den færdige? Jeg forsøgte at lave den som Nicolai havde lavet men jeg kan ikke få det til at virke, når den sidder til arduinoen, kan jeg ikke via et kamera se ir lyset.

Så jeg er i tvivl om det er det optiske hoved, eller arduinoen der ikke virker.

/Allan

26
25. august 2014 kl. 14:29

jeg har planer om at gøre forsøget. har komponenter til et læsehoved jeg fandt på thingiverse: https://www.thingiverse.com/thing:264268

også mig der har lavet eagle filerne ud fra kidcad ver.

har såmænd også printet "kassen" men skal lige finde tiden til at samle osv.

vi har samme måler i radioamatør klubben så hvis jeg får success med det skal der også noget op der.

og jo skal nok give besked hvis det lykkedes.

25
24. august 2014 kl. 22:13

Hej!

Er der nogle andre end Nicolai der har fået det til at virke med arduino?

23
12. juni 2014 kl. 14:42

Hej, så har vi kogt koden ned på en lille microprocessor der snakker med meteret og sender til iOS-device. Elektronikken er i produktion.

Er der nogen af der der har lyst til at teste i første omgang interfaceti app'en, så send en mail med dit UDID til meterlogger@skulp.net, så sender jeg app'en.

Dimsen - kan i første omgang læse Kamstrup Multical 601 og dem der bruger KMP > 2006.

Er ved at få den til at læse ældre multical også. Hvilken version af protokollen mener I denne her er? https://kamstrup.com/media/17009/mc-gb - det ligner ikke phk's eller søren bangs protokol?

21
28. maj 2014 kl. 22:30

q: er det ikke noget med at signalet skal være inverteret?

20
28. maj 2014 kl. 22:29

btw...

arduino kode jeg vil bruge:

#include <SoftwareSerial.h>

// Kamstrup Multical 601 word const kregnums[] = { 0x003C,0x0050,0x0056,0x0057,0x0059,0x004a,0x0044,0x0045 }; char* kregstrings[] = { "Energy","Current Power","Temperature t1","Temperature t2","Temperature diff", "Flow", "Volumen 1", "Volumen 2" }; #define NUMREGS 8 #define KAMBAUD 1200

// Units char* units[65] = {"","Wh","kWh","MWh","GWh","j","kj","Mj", "Gj","Cal","kCal","Mcal","Gcal","varh","kvarh","Mvarh","Gvarh", "VAh","kVAh","MVAh","GVAh","kW","kW","MW","GW","kvar","kvar","Mvar", "Gvar","VA","kVA","MVA","GVA","V","A","kV","kA","C","K","l","m3", "l/h","m3/h","m3xC","ton","ton/h","h","hh:mm:ss","yy:mm:dd","yyyy:mm:dd", "mm:dd","","bar","RTC","ASCII","m3 x 10","ton x 10","GJ x 10","minutes","Bitfield", "s","ms","days","RTC-Q","Datetime"};

// Pin definitions

#define PIN_KAMSER_RX 5 // Kamstrup IR interface RX #define PIN_KAMSER_TX 7 // Kamstrup IR interface TX #define PIN_DIAG_LED 13 // Diag LED to blink with for fun

// Kamstrup optical IR serial #define KAMTIMEOUT 2000 // Kamstrup timeout after transmit #define POLLINTERVAL 300000 // Polling interval SoftwareSerial kamSer(PIN_KAMSER_RX, PIN_KAMSER_TX, true); // Initialize serial

// last poll variable long lastpoll;

void setup() { // setup pins pinMode(PIN_DIAG_LED,OUTPUT); pinMode(PIN_KAMSER_RX,INPUT); pinMode(PIN_KAMSER_TX,OUTPUT);

// initialize kamstrup serial interface kamSer.begin(KAMBAUD);

// initialize serial interface Serial.begin(9600);

// initialize lastpoll value lastpoll = 0; }

void loop() {

// check if it is time to do a poll if(millis() - lastpoll > POLLINTERVAL or lastpoll == 0) {

// get Kamstrup data from meter
for (int kreg = 0; kreg < NUMREGS; kreg++) {
  kamReadReg(kreg);
  delay(100);
}



// send a newline to have linksys process the data
Serial.println("");    

// update lastpoll
lastpoll = millis();

}

// toggle LED to show we are alive togglePin(PIN_DIAG_LED);

// loop delay delay(500);

};

// Toggle pin void togglePin(int pinNum) { digitalWrite(pinNum, !digitalRead(pinNum)); }

// kamReadReg - read a Kamstrup register void kamReadReg(unsigned short kreg) {

byte recvmsg[30]; // buffer of bytes to hold the received data float rval; // this will hold the final value

// prepare message to send and send it byte sendmsg[] = { 0x3f, 0x10, 0x01, (kregnums[kreg] >> 8), (kregnums[kreg] & 0xff) }; kamSend(sendmsg, 5);

// listen if we get an answer unsigned short rxnum = kamReceive(recvmsg);

// check if number of received bytes > 0 if(rxnum != 0){

// decode the received message
rval = kamDecode(kreg,recvmsg);

// print out received value to terminal
if (rval != false) {
  Serial.print(rval);
}

}

Serial.print(",");

}

// kamSend - send data to Kamstrup meter void kamSend(byte const *msg, int msgsize) {

// append checksum bytes to message byte newmsg[msgsize+2]; for (int i = 0; i < msgsize; i++) { newmsg[i] = msg[i]; } newmsg[msgsize++] = 0x00; newmsg[msgsize++] = 0x00; int c = crc_1021(newmsg, msgsize); newmsg[msgsize-2] = (c >> 8); newmsg[msgsize-1] = c & 0xff;

// build final transmit message - escape various bytes byte txmsg[20] = { 0x80 }; // prefix int txsize = 1; for (int i = 0; i < msgsize; i++) { if (newmsg[i] == 0x06 or newmsg[i] == 0x0d or newmsg[i] == 0x1b or newmsg[i] == 0x40 or newmsg[i] == 0x80) { txmsg[txsize++] = 0x1b; txmsg[txsize++] = newmsg[i] ^ 0xff; } else { txmsg[txsize++] = newmsg[i]; } } txmsg[txsize++] = 0x0d; // EOF

// send to serial interface for (int x = 0; x < txsize; x++) { kamSer.write(txmsg[x]); }

}

// kamReceive - receive bytes from Kamstrup meter unsigned short kamReceive(byte recvmsg[]) {

byte rxdata[50]; // buffer to hold received data unsigned long rxindex = 0; unsigned long starttime = millis();

kamSer.flush(); // flush serial buffer - might contain noise

byte r;

// loop until EOL received or timeout while(r != 0x0d){

// handle rx timeout
if(millis()-starttime > KAMTIMEOUT) {
  return 0;
}

// handle incoming data
if (kamSer.available()) {

  // receive byte
  r = kamSer.read();
  if(r != 0x40) {  // don't append if we see the start marker
    // append data
    rxdata[rxindex] = r;
    rxindex++; 
  }

}

}

// remove escape markers from received data unsigned short j = 0; for (unsigned short i = 0; i < rxindex -1; i++) { if (rxdata[i] == 0x1b) { byte v = rxdata[i+1] ^ 0xff; if (v != 0x06 and v != 0x0d and v != 0x1b and v != 0x40 and v != 0x80){ Serial.print("Missing escape "); Serial.println(v,HEX); } recvmsg[j] = v; i++; // skip } else { recvmsg[j] = rxdata[i]; } j++; }

// check CRC if (crc_1021(recvmsg,j)) { Serial.println("CRC error: "); return 0; }

return j;

}

// kamDecode - decodes received data float kamDecode(unsigned short const kreg, byte const *msg) {

// skip if message is not valid if (msg[0] != 0x3f or msg[1] != 0x10) { return false; } if (msg[2] != (kregnums[kreg] >> 8) or msg[3] != (kregnums[kreg] & 0xff)) { return false; }

// decode the mantissa long x = 0; for (int i = 0; i < msg[5]; i++) { x <<= 8; x |= msg[i + 7]; }

// decode the exponent int i = msg[6] & 0x3f; if (msg[6] & 0x40) { i = -i; }; float ifl = pow(10,i); if (msg[6] & 0x80) { ifl = -ifl; }

// return final value return (float )(x * ifl);

}

// crc_1021 - calculate crc16 long crc_1021(byte const *inmsg, unsigned int len){ long creg = 0x0000; for(unsigned int i = 0; i < len; i++) { int mask = 0x80; while(mask > 0) { creg <<= 1; if (inmsg[i] & mask){ creg |= 1; } mask>>=1; if (creg & 0x10000) { creg &= 0xffff; creg ^= 0x1021; } } } return creg; }

19
28. maj 2014 kl. 22:11

hejsa

nej har først lige bestilt stumper til at bygge ir hovedet med..

som sagt har jeg printet det her ud på min 3d printer, https://www.thingiverse.com/thing:264268

stumper bestilt... gutten der lavede 3d tingen har vist nogen print liggende men hvis ikke så har jeg noget klar i eagle som så tager ca 3-4 uger at lave ude i kina...

men har en Arduino uno og en mega liggende jeg kan bruge til at teste med... når først jeg får data ud så skal jeg have et modul fra openenergymonitor til at hive data ud og logge dem med ca 1-5 min interval

17
24. maj 2014 kl. 16:04

ok men det er jo en anden protokol end hvad jeg har set tidligere...

Dims jeg putter i minijack'et i iPhone og så kan den aflæse via IR

Bruger pic18 processor.

16
24. maj 2014 kl. 09:35

jo den er god nok, protokol mæssigt var der ikke noget nyt i den udgave jeg har.

Du skriver det er en iphone logger... vil det sige du har tlf hængende over måleren hele tiden?

hvad hardware bruger du til at sende kommandoer etc?

15
24. maj 2014 kl. 00:32

vil kigge resten igennem imorgen... det er tid til en smule søvn

14
24. maj 2014 kl. 00:32

Det er sjovt nok NÆSTEN den samme jeg fik

dog er der flere målere listet på forsiden, sidste rev. dato nederst er fra 2012, Rev er ikke M1 men T1, Der er lidt andre initialer

men ellers nok den samme... har ikke bladret din kopi igennem endnu

12
24. maj 2014 kl. 00:20

Hejsa

rart at se der er nogen som gør lidt i det

jeg har samme måler som dig og sidst jeg forsøgte fik jeg ikke så meget som et komma ud af den

jeg brugte kredsløbet som er beskrevet her: https://kildal.dk/?page_id=117

men det kunne være jeg brugte forkerte ir dioder...

jeg fik endda dengang også protokollen udleveret fra kamstrup men det hjalp heller ikke noget...

min måler er fjernaflæst men med op til 3 mdr's forsinkelse eller lidt mere. noget jeg er lidt utilfreds med samt at man ikke kan få "read-only" adgang direkte på seriel udgangen.

Har jeg forstået rigtigt hvis IR altid er tilgængelig uanset hvad moduler fjernvarme selskabet har sat i?

mit næste forsøg på aflæsning er baseret på: https://www.thingiverse.com/thing:264268

har printet holderen, skal bare lige over den første så regner jeg med at bestille komponenter og lave en fuglerede og prøve at aflæse via min uno (som skal findes først)

11
23. maj 2014 kl. 23:53

Hej, er ved at lave logger til iphone, der via ir skal læse ovenstående måler, men det viser sig at det ikke er samme kode som phk's pykamstrup eller https://blog.bangbits.com/2013/08/talking-to-kamstrup-685-382-electricity.html

her er hvad jeg kan sniffe når jeg sender nogle simple kommandoer via Kamstrup MeterTool:

https://github.com/st0ff3r/MeterLogger/blob/master/kamstrup%20601%20protocol%20sniffing

jeg hentede data om målerens tid hvert minut - det ser ud til at det grundlæggende format der står på https://kamstrup.com/media/19757/file.pdf side 103 passer meget godt - starter med en start byte, destination address, cid (commando id?), så data'ene og to bits crc afsluttet med return (\r)

Nogen af jer der har erfaring med den?

10
5. januar 2014 kl. 17:57

sig endelig til hvis du har success med SDR... måske jeg kunne bruge det

lige pt havde jeg dog mest kig på arduino da løsningen til at logge med er der hos openenergymonitor.org

9
3. januar 2014 kl. 07:11

hmm

nu er min måler forsynet fra 230V via en trafo i eltavlen, så dræn er ikke noget problem...

problemet er at der ikke kommer en "ski" ud... har prøvet næsten alt, med og uden formodstand, haft sender i både højre og venstre side...

hvor kan den være gal? kunne bølgelængden på ir strålerne være forkerte? ie forkert valgt diode?

eller kan koden i arduinoen være forkert? mr. kildal har det kørende så jeg undre mig meget, det er jo ikke ligefrem pc'en til rumfærgen jeg er ved at samle....

8
3. januar 2014 kl. 07:00

Ifølge databladet for din LED, bør din formodstand være på (5V - 1.3V) / 0.05A = 74 Ohm (rund op til 82 Ohm i E12 serien).

Der skal ikke magnet til interfacet, det er blot en fysisk standbard måde læsehovederne bruger til at "hænge" foran IR øjet.

Det betyder intet den er fjernaflæst, du vil altid kunne kommunikere via IR hovedet. Så vidt jeg kan observere, sender mine målere trådløst ca. hver 2 minut.

For at opnå fysisk adskillelse (ikke blot galvanisk adskillelse, undgå at dræne batteri og ej rage uklar med forsyningsselskab mv.) er jeg dog så småt begyndt at kigge på en SDR løsning istedet [https://sdr-radio.com/], her på ISM båndet er data dog krypteret.

7
3. januar 2014 kl. 06:23

har så prøvet med og uden formodstand....

byttet rundt så tx dioden har været i både højre og venstre side af det lille optiske vindue

sågar prøvet med en magnet på

6
3. januar 2014 kl. 06:02

jeg prøvede så at fjerne formodstanden på tx dioden, bare for at se om det gjorde en forskel...

kun på mængden af udsendt ir lys.... mobilcam blev næsten overstyret...

men ingen data ud...

5
3. januar 2014 kl. 02:41

Hejsa

Jeg er en af de få som er så heldig at have en kopi af protokollen (dækker multical 21, 402, 801, 62, 602, 601+ og 601 samt SVM S6

jeg er ikke den helt store nørd så fatter ikke ret meget andet end register id's

og jeg vil som så mange andre "bare" udlæse forbrug.... jeg har prøvet at følge nicolai kildals opskift på et ir interface her https://kildal.dk/wordpress/wp-content/uploads/2010/10/kamstrup-ir-300x273.png

jeg har brugt disse her dioder/transistor

https://uk.rs-online.com/web/p/ir-leds/7269417/https://uk.rs-online.com/web/p/phototransistors/6548019/

men eller samme værdier for modstandende....

jeg kan med multimeter fint komme ned på ca 1.6 volt hvis jeg holder hånden over modtageren og næsten 5V når jeg fjerner hånden... så jeg vil næsten sige ok selv for den del

men når jeg så beder arduinoen til at aflæse sker der intet....

koden er her (dog rettet til hvad angår register id's) https://kildal.dk/?page_id=432

kan det være at modstandene ikke passer og ir senderen er for svag? jeg har med en mobil set at den blinker, men ja ikke noget der blænder.

skal der magnet til for at aktivere interfacet? nogen skriver ja hvis man googler, andre siger det virke uden...

betyder det spor at den er fjernaflæst? ved ikke hvilket modul der bruges men ved blot den bliver aflæst hver 3 måned, alt for sløvt til mig og nogen måneder er af selskabet markeret med grå som betyder "cirka".

planen er som nicolai at logge data, dog vil jeg gøre det lokalt så jeg selv har kontrollen.