reverse engineering von hex-strings

Begonnen von macfly, 27 Januar 2021, 20:54:13

Vorheriges Thema - Nächstes Thema

macfly

Moin zusammen,

ich bin (mal wieder / immer noch) mit der Modulentwicklung des Nedap Wechselrichters beschäftigt. Die klassischen Metriken kann ich erfassen, damit bin ich glücklich. Nun liefert der Nedap Wechselrichter aber auch events, die ich nicht so ganz verstehe. Bzw. nur zum Teil.

Ich habe aktuell einen Proxy laufen, der alle Posts von Nedap abfängt, als fhem-Modul via events in die fhem-datenbank spielt und anschließend in die cloud weiterpostet. Damit habe ich die Events (und auch alle Metriken) lokal und in der cloud, kann also vergleichen.


Nun habe ich z.B. das folgende Event (Anhang, event_cloud.png). Dazu finde ich in meinem Log dieses event:

0646981809001D000200020000000000020000004A790709060020092C008A13881388130000000000000000

dieses Event habe ich über die Angaben aus event_cloud.png (dezimalwerte mit Faktor multipliziert um Nachkommastellen zu entfernen, umwandeln in hex, byte-reihenfolge umdrehen) zuordnen können (Anhang event_zuordnung.png).

Nun bleibt noch die vordere Zeichenkette 064698180900, die ich nicht zuordnen kann. Hat jemand eine Idee, wie mal "übliche" kodierungen dagegen testen kann? unix-zeit, zeitstempel oder ähnliches?

ich habe also aus der folgenden Zeichenkette alle mit X markierten Stellen zuordnen können, alle mit . nicht:
0646981809001D000200020000000000020000004A790709060020092C008A13881388130000000000000000
............XX..XXXX............XX......XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX................


nun bekomme ich aber *viele* andere events, die nicht in der cloud angezeigt werden (ich bin aber neugierig).

hat jemand eine idee, wie ich da weiter vorgehen könnte? Beispiele von solchen events sind:



2021-01-19 08:11:05  00FF8C181000150001000100000000009A02000000000E000409000000000000000000000000280900008613
2021-01-25 04:50:29  68CB94181000150001000100000000009A02000000000E0004090000000000000000000000002D0900008813
2021-01-25 11:55:42  3E2F95181000050002000000010000000000000000001100040B000000000000000000000000250901008713
2021-01-25 11:57:05  882F951888003000000000000B000000020000002014000000000000000000000E001A191919000000000000
2021-01-26 13:10:26  429296180C009000011100000000000002000000A864E8003F019001267E54000000DC001DE0E5DFBE000000
2021-01-26 13:45:54  929A96180C008D000111000000000000FE6500001A663A009F009A01B68D2F000000D20016C7D4C6BE000000
2021-01-26 14:04:14  DE9E96180C008E00011100000000000002000000B16FE1003B019001418D370000009600F6DFBFDFBE000000
2021-01-27 09:27:52  6BAF97181000150002000100010000009A02000000000E00030E000000000000000000000000FA0801008913
2021-01-27 15:51:02  6509981809001D000200020000000000020000001E78F008060007092C008613871386130000000000000000
2021-01-27 15:52:02  A109981809001D00070282000000000000000000000000000000000000008813000000000000000000000000


Wenn ich jetzt alle "bekannten" Stellen streiche, bleiben folgende Stellen übrig:

2021-01-19 08:11:05  00FF8C181000__00____010000000000__020000________________________________0000280900008613
2021-01-25 04:50:29  68CB94181000__00____010000000000__020000________________________________00002D0900008813
2021-01-25 11:55:42  3E2F95181000__00____000001000000__000000________________________________0000250901008713
2021-01-25 11:57:05  882F95188800__00____00000B000000__000000________________________________1919000000000000
2021-01-26 13:10:26  429296180C00__00____000000000000__000000________________________________1DE0E5DFBE000000
2021-01-26 13:45:54  929A96180C00__00____000000000000__650000________________________________16C7D4C6BE000000
2021-01-26 14:04:14  DE9E96180C00__00____000000000000__000000________________________________F6DFBFDFBE000000
2021-01-27 09:27:52  6BAF97181000__00____010001000000__020000________________________________0000FA0801008913
2021-01-27 15:51:02  650998180900__00____020000000000__000000________________________________0000000000000000
2021-01-27 15:52:02  A10998180900__00____820000000000__000000________________________________0000000000000000


hat jemand ein Tipp für mich, wie ich da weiter rückwärts analysiere?

auf jeden Fall schon mal vielen Dank fürs durchlesen bis hier unten ;-)

schöne Grüße,
Friedhelm


zap

Hast Du mal ne email an den Hersteller geschickt und um Unterstützung gebeten?
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

macfly

ja, keine Antwort. Der Cloudservice wird in wenigen Tagen eingestellt und bei nedap gibts nur noch ne Rumpfmannschaft für Garantiefälle ..

also nada.

immi

Zitat von: macfly am 27 Januar 2021, 20:54:13
hat jemand ein Tipp für mich, wie ich da weiter rückwärts analysiere?
interesting puzzle; maybe you can use it as starting point
#my $num="68CB9418";
#my $num="3E2F9518";
#my $num="882F9518";
my $num= "A1099818";
$num=(unpack("H*",pack("V*", unpack("N*", pack("H*", $num)))));  #this just turns around the string e.g. $num="189809a1";
print(hex($num),"\n");
my $offset=1199142000;         
$epoch=hex($num)+$offset;
print scalar localtime($epoch),"\n";
#2021-01-25 04:50:29  68CB9418  -->Mon Jan 25 04:49:44 2021 poor decoding
#2021-01-25 11:55:42  3E2F9518  -->Mon Jan 25 11:55:42 2021 very good decoding
#2021-01-25 11:57:05  882F9518  -->Mon Jan 25 11:56:56 2021 good decoding
#2021-01-27 15:52:02  A1099818  -->Wed Jan 27 15:52:01 2021 very good decoding

print "\n--------------\n";
$num=hex($num);
my $sec=$num%60; $num=($num-$sec)/60;
my $min=$num%60; $num=($num-$min)/60;
my $hour=$num%24; $num=($num-$hour)/24;
my $days=$num;
print $days,"------",($hour,":",$min,":",$sec, "\n");

macfly

looks very promising. The deocing is not poor, the events are sent with a lag of seconds to minutes, so the decoded timestamp is the better timestamp.

Thank you very much!

regards,
Friedhelm


Zitat von: immi am 30 Januar 2021, 10:38:43
interesting puzzle; maybe you can use it as starting point
#my $num="68CB9418";
#my $num="3E2F9518";
#my $num="882F9518";
my $num= "A1099818";
$num=(unpack("H*",pack("V*", unpack("N*", pack("H*", $num)))));  #this just turns around the string e.g. $num="189809a1";
print(hex($num),"\n");
my $offset=1199142000;         
$epoch=hex($num)+$offset;
print scalar localtime($epoch),"\n";
#2021-01-25 04:50:29  68CB9418  -->Mon Jan 25 04:49:44 2021 poor decoding
#2021-01-25 11:55:42  3E2F9518  -->Mon Jan 25 11:55:42 2021 very good decoding
#2021-01-25 11:57:05  882F9518  -->Mon Jan 25 11:56:56 2021 good decoding
#2021-01-27 15:52:02  A1099818  -->Wed Jan 27 15:52:01 2021 very good decoding

print "\n--------------\n";
$num=hex($num);
my $sec=$num%60; $num=($num-$sec)/60;
my $min=$num%60; $num=($num-$min)/60;
my $hour=$num%24; $num=($num-$hour)/24;
my $days=$num;
print $days,"------",($hour,":",$min,":",$sec, "\n");


macfly

just one question. How did you get the constant " Monday, 31. December 2007 23:00:00" (1199142000) ?

Trial and Error?

immi

Zitat von: macfly am 01 Februar 2021, 15:36:40
just one question. How did you get the constant " Monday, 31. December 2007 23:00:00" (1199142000) ?
Trial and Error?
I turned the string;
looked at the delta between the readings;
it was surprisingly accurate to be a conicidence......
then I took one reading as reference: simple subtraction

I am quite used to reverse engeeneering; In my tecalor heat-pump, I had to decode >100 different readings with very creative encodings  :(

happy it works for you