Hallo,
ich hoffe das Thema ist hier richtig aufgehoben.
Nachdem ich eine Reihe Engelmann HCAe2 in meine FHEM installation initial einbinden konnte (WMode_T, Kurztelegramm,
kein AES key), musste ich festgestellen, dass es mit WMBUS/TechemHKV nicht korrekt/unvollstaendig dekodiert wird. Das
Internet schweigt sich zum Format leider ebenfalls aus. Daraufhin habe ich Zeit investiert und das Telegramm
systematisch untersucht. Gluecklicherweise konnte ich ueber den IR-Adapter per "Device Monitor SW" die HCAe2 auslesen
und konfigurieren. Nun bin ich zumindest fuer das Kurztelegramm soweit fertig, dass ich die fuer mich wichtigen
Werte (haendisch) extrahieren kann.
Akt/Sti 44/46 ID 49/8 ???? 7A ?? 0000?? 2F2F F# 6D A-TM A-DT F# 6E A0????A1A2 F# 6C S-DT F# 6E S0S1S2 F# 7F ERR F# 6D E-TM E-DT 0000
LLLLLLLLLLLLLLLLLLLLLLLLLLLL AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ???? ??
|| Counter?--\\
**---beinflusst-------\\\\-------------\\ aktuelle aktueller Stichtags Stichtags Error Error
|| |||| || || Zeit/Datum Wert Datum Wert Code Zeit/Datum
|| vvvv vv vv
Wohn 65: x200/x10B (Vermutlich nicht im Telegramm: R 24,605, H 24,605, VLmax x2A, B x10F d, halbM x11, DAend x2, A x5F9, B x0)
2D44C514 65790132 3108 DEC4 7A EF 000020 2F2F 04 6D 2528 1038 03 6E 007A1D0200 42 6C FF2C 43 6E 0B0100 31 7F 00 34 6D 2BD7 0020 0000 F899 80
2024-08-16 10:30 2D44C514 65790132 3108 DEC4 7A FA 000020 2F2F 04 6D 1E2A 1038 03 6E 00B3F80200 42 6C FF2C 43 6E 0B0100 31 7F 00 34 6D 2BD7 0020 0000 F899 80
2024-08-16 11:42 2D44C514 65790132 3108 DEC4 7A 01 000020 2F2F 04 6D 2A2B 1038 03 6E 00BF660200 42 6C FF2C 43 6E 0B0100 31 7F 00 34 6D 2BD7 0020 0000 F899 81
2024-08-16 15:27 2D44C514 65790132 3108 DEC4 7A 17 000020 2F2F 04 6D 1B2F 1038 03 6E 0050A90200 42 6C FF2C 43 6E 0B0100 31 7F 00 34 6D 2BD7 0020 0000 F899 80
Schl 66: x196/x082 (Vermutlich nicht im Telegramm: R 23,289, H 23,421, VLmax x3F, B x110 d, halbM x12, DAend x2, A xB6, B xB0)
2D46C514 66790132 3108 BDFC 7A 98 000000 2F2F 04 6D 3928 1038 03 6E 9603790100 42 6C FF2C 43 6E 820000 31 7F 00 34 6D D774 0020 0000 F899 81
2024-08-16 10:44 2D44C514 66790132 3108 A139 7A 9F 000020 2F2F 04 6D 2C2A 1038 03 6E 9637280100 42 6C FF2C 43 6E 820000 31 7F 00 34 6D D774 0020 0000 F899 82
2024-08-16 15:22 2D44C514 66790132 3108 A139 7A BB 000020 2F2F 04 6D 162F 1038 03 6E 9666320100 42 6C FF2C 43 6E 820000 31 7F 00 34 6D D774 0020 0000 F899 80
Kell 67: x000/x000 (Vermutlich nicht im Telegramm: R 22,368, H 21,315, VLmax x15, B xDA d, halbM x0F, DAend x2, A x0, B x0)
2D46C514 67790132 3108 7C74 7A FA 000000 2F2F 04 6D 2328 1038 03 6E 00738E0000 42 6C 0000 43 6E 000000 31 7F 00 34 6D A43B 0020 0000 F899 A8
2024-08-16 09:08 2D46C514 67790132 3108 7C74 7A FA 000000 2F2F 04 6D 0829 1038 03 6E 0035ED0000 42 6C 0000 43 6E 000000 31 7F 00 34 6D A43B 0020 0000 F899 8F
2024-08-16 09:16 2D46C514 67790132 3108 7C74 7A FA 000000 2F2F 04 6D 1029 1038 03 6E 0051A80000 42 6C 0000 43 6E 000000 31 7F 00 34 6D A43B 0020 0000 F899 8D
2024-08-16 10:27 2D44C514 67790132 3108 60B1 7A 01 000020 2F2F 04 6D 1B2A 1038 03 6E 00445B0000 42 6C 0000 43 6E 000000 31 7F 00 34 6D A43B 0020 0000 F899 92
2024-08-16 15:24 2D44C514 67790132 3108 60B1 7A 1E 000020 2F2F 04 6D 182F 1038 03 6E 0092B50000 42 6C 0000 43 6E 000000 31 7F 00 34 6D A43B 0020 0000 F899 8F
DG-B 68: x019/x000 (Vermutlich nicht im Telegramm: R 28,690, H 28,452, VLmax x1E, B xDA d, halbM x0F, DAend x2, A x2C9, B x0)
2024-08-16 12:41 2D46C514 68790132 3108 C118 7A 58 000000 2F2F 04 6D 292C 1038 03 6E 190F270000 42 6C 0000 43 6E 000000 31 7F 00 34 6D A43B 0020 0000 F899 87
DG-Z 69: x00F/x000 (Vermutlich nicht im Telegramm: R 28,690, H 28,452, VLmax x1E, B xDA d, halbM x0F, DAend x2, A x228, B x0)
2024-08-16 12:56 2D46C514 69790132 3108 0090 7A 54 000000 2F2F 04 6D 382C 1038 03 6E 0F281F0000 42 6C 0000 43 6E 000000 31 7F 00 34 6D A43B0020 0000 F899 AB
Bad 70: x05A/x04B (Vermutlich nicht im Telegramm: R 24,868, H 24,605, VLmax x44, B x110 d, halbM x0F, DAend x2, A x921, B x192)
2024-08-16 13:29 2D46C514 70790132 3108 795F 7A 17 000000 2F2F 04 6D 1D2D 1038 03 6E 5A50FC0000 42 6C FF2C 43 6E 4B0000 31 7F 00 34 6D 9C040020 0000 F899 80
Das sieht ersteinmal wild aus :-), ich hoffe jedoch es sollte eine ausreichende Datenlage fuer jemanden sein, der den
WMBUS/TechemHKV Code gut kennt. Mindestens die Entscheidung, wo der Support am besten reinwandern sollte (WMBUS oder
sowas wie EngelmannHKV aus TechemHKV abgeleitet) koennte ich nur schwerlich treffen. Ich erklaere aber gerne die Tabelle
oben. Eine Tabelle fuer das Langtelegramm plane ich spaeter ebenfalls zu erstellen. Meine Hoffnung ist, dass sich in
diesem dann die Raumtemperatur befindet. Im Kurztelgramm konnte ich diese noch nicht entdecken.
VG Christoph
Gerade in WMBUS.pm gesehen, dass 2F2F wohl "filler bytes" sind.
Macht Sinn!
Dann gibt es wohl mind. einen Bug in WMBUS.pm ~ line 1660:
} elsif ($dataBlock->{dataField} == DIF_INT24) {
my @bytes = unpack('CCC', substr($payload, $offset, 3));
$offset += 3;
$value = $bytes[0] + $bytes[1] << 8 + $bytes[2] << 16;
in der letzten Zeile fehlen die Klammern, so ist es richtig:
$value = $bytes[0] + ($bytes[1] << 8) + ($bytes[2] << 16);
danach wird ein
# two's complement
$value = ~$value + 1;
gemacht. Leider kenne ich mich mit Perl Datentypen nicht richtig aus.
Macht das wirklich Sinn? Die Perl-Profis wissen da sicher mehr.
Zumindest fuer den HCA Datentypen wird der Wert an dieser Stelle abermals zerstoert.
Ich debugge weiter, komme der Loesung schon naeher :-)
Dies sollte der korrekte Fix fuer die Berechnung der DIF_INT24 und DIF_INT48 Formate in WMBUS.pm sein.
Zumindest werden die Werte in FHEM fuer meine HCAe2 nun richtig angezeigt.
Kann das jemand einchecken?
} elsif ($dataBlock->{dataField} == DIF_INT24) {
my @bytes = unpack('CCC', substr($payload, $offset, 3));
$offset += 3;
$value = $bytes[0] + ($bytes[1] << 8) + ($bytes[2] << 16);
if ($bytes[2] & 0x80) {
# two's complement
$value -= (1 << 24);
}
} elsif ($dataBlock->{dataField} == DIF_INT32) {
$value = unpack('l<', substr($payload, $offset, 4));
$offset += 4;
} elsif ($dataBlock->{dataField} == DIF_INT48) {
my @words = unpack('vvv', substr($payload, $offset, 6));
$value = $words[0] + ($words[1] << 16) + ($words[2] << 32);
if ($words[2] & 0x8000) {
# two's complement
$value -= (1 << 48);
}
$offset += 6;
} elsif ($dataBlock->{dataField} == DIF_INT64) {
Das Langtelegramm habe ich soweit nun auch verstanden. Dort sehe ich leider ebenfalls keine Temperatur.
Zusaetzlich zu den Infos aus dem Kurztelegramm befinden sich hier nur noch die Halbmonatswerte.
Wichtig zur Interpretation: Es werden nur die Differenzen gesendet. Der jeweilge Wert muss daher ueber eine Summation gebildet werden.
Ueber den Stichtag (neue Abrechnungsperiode) hinweg ist diese Differenz negativ, weil zum Stichtag der Zaehler auf 0 gesetzt wird.
VG Christoph