fix kamstrup protocol

This commit is contained in:
gemu2015 2022-10-03 16:08:49 +02:00
parent 7d8d51246f
commit abe6fd8eaa
1 changed files with 28 additions and 17 deletions

View File

@ -1648,18 +1648,20 @@ void sml_shift_in(uint32_t meters,uint32_t shard) {
if (iob == 0x40) {
meter_spos[meters] = 0;
} else if (iob == 0x0d) {
uint16_t crc = KS_calculateCRC(&smltbuf[meters][0], meter_spos[meters]);
if (!crc) {
uint8_t *ucp = &smltbuf[meters][0];
for (uint16_t cnt = 0; cnt < meter_spos[meters]; cnt++) {
uint8_t iob = smltbuf[meters][cnt];
if (iob == 0x1b) {
*ucp++ = smltbuf[meters][cnt + 1] ^ 0xff;
cnt++;
} else {
*ucp++ = iob;
}
uint8_t index = 0;
uint8_t *ucp = &smltbuf[meters][0];
for (uint16_t cnt = 0; cnt < meter_spos[meters]; cnt++) {
uint8_t iob = smltbuf[meters][cnt];
if (iob == 0x1b) {
*ucp++ = smltbuf[meters][cnt + 1] ^ 0xff;
cnt++;
} else {
*ucp++ = iob;
}
index++;
}
uint16_t crc = KS_calculateCRC(&smltbuf[meters][0],index);
if (!crc) {
SML_Decode(meters);
}
sml_empty_receiver(meters);
@ -2125,13 +2127,13 @@ void SML_Decode(uint8_t index) {
mp += 4;
// decode the mantissa
uint32_t x = 0;
for (uint16_t i = 0; i < cp[5]; i++) {
for (uint16_t i = 0; i < cp[1]; i++) {
x <<= 8;
x |= cp[i + 7];
x |= cp[i + 3];
}
// decode the exponent
int32_t i = cp[6] & 0x3f;
if (cp[6] & 0x40) {
int32_t i = cp[2] & 0x3f;
if (cp[2] & 0x40) {
i = -i;
};
//float ifl = pow(10, i);
@ -2139,10 +2141,11 @@ void SML_Decode(uint8_t index) {
for (uint16_t x = 1; x <= i; ++x) {
ifl *= 10;
}
if (cp[6] & 0x80) {
if (cp[2] & 0x80) {
ifl = -ifl;
}
mbus_dval = (double )(x * ifl);
} else if (!strncmp(mp, "bcd", 3)) {
mp += 3;
uint8_t digits = strtol((char*)mp, (char**)&mp, 10);
@ -2283,6 +2286,14 @@ void SML_Decode(uint8_t index) {
meter_id[mindex][p] = *cp++;
}
meter_id[mindex][p] = 0;
} else if (meter_desc_p[mindex].type == 'k') {
// 220901
uint32_t date = mbus_dval;
uint8_t year = date / 10000; // = 22
date -= year * 10000;
uint8_t month = date / 100; // = 09
uint8_t day = date % 100; // = 01
sprintf(&meter_id[mindex][0],"%02d.%02d.%02d",day, month, year);
} else {
sml_getvalue(cp,mindex);
}
@ -2493,7 +2504,7 @@ void SML_Show(boolean json) {
continue;
}
// skip compare section
cp=strchr(mp, '@');
cp = strchr(mp, '@');
if (cp) {
cp++;
tststr: