Sonntag, 20. Juli 2014

PCE-174 Luxmeter/-logger

Ich habe mal wieder ein neues Spielzeug: ein Luxmeter. Konkret handelt es sich um das PCE-174, dass angeblich baugleich zum Extech HD450 sein soll. Es misst, soweit ich das in meinen ersten Tests sehen konnte, ganz stabil. Die Bedienung ist ein wenig träge, aber ich will ja auch nicht beruflich die Lichtstärke messen, sondern nur mal so. Das Ding hat auch gleich einen internen Speicher, so dass man manuell Messwerte speichern kann und, was viel interessanter ist, Daten automatisch loggen kann. Wie bei preiswerteren Messgeräten üblich wurde die beiliegende Windows Software wohl von Chinesen programmiert und ist nicht so das Gelbe vom Ei und von einer LINUX Software kann man eh nur träumen. Also gilt das übliche Motto: Selbst ist der Mann. Das Gerät wird am USB Port als USB2RS232 Adapter erkannt – das stimmt ja schonmal hoffnungsvoll. Nur wie redet man mit dem Gerät? Auf der Homepage ist natürlich nichts zu finden und so habe ich eine ganze Weile rumprobiert, bin aber auf keinen grünen Zweig gekommen.

Ich hatte mir schon vorgenommen, in einer ruhigen Minute mal ein kleines Fuzzing-Skript zu basteln, um dem Teil eine Reaktion zu entlocken und der Windows-Software mal bei der Kommunikation zuzuhören. Aber zuvor habe ich das getan, was kein klar denkender Hacker je tut: Ich habe an den Hersteller geschrieben und um Info gebeten. Ich weiß – hahaha, viel Glück und so. Doch manchmal passieren auch Wunder: Keine 24h später hatte ich eine, wenn auch in knappem Chinglish verfasste, Doku in der Hand! Das muss ich mal echt lobend hervorheben – danke PCE! Die Doku ist extrem knapp und, wie ich inzwischen weiß, auch nicht ganz vollständig/korrekt, aber allemal gut genug, um den Rest selber raus zu kriegen. Also Daumen nach oben.

Die größte Hürde bei meinen Versuchen, das Protokoll selber zu erraten bestand, wie ich nun weiß, darin, dass das kein Klartext-Protokoll ist, sondern im Wesentlichen Bytes/Binärdaten hin- und her geschubst werden. Nicht schwierig, wenn man's weiß, aber eben nicht so einfach mit Minicom zu machen.

Da ich aber nun die Doku in Händen halte, hab ich angefangen, ein Python Skript zu schreiben, um mit dem Instrument zu reden. Erste Versuche sind bereits erfolgreich verlaufen. D.h. ich kann inzwischen diverse Modi des Messgeräts aufrufen bzw. umschalten und ebenso Daten vom Gerät auslesen. Noch ist das Skript nicht fertig – ich muss noch alle Funktionen implementieren, einen Decoder für die Rohdaten schreiben, das Ganze ordentlich testen, eine brauchbare usage message einbauen etc. etc. Aber so wie ich das sehe, ist das nur noch Handwerk :-)

Aber hier schon mal ein paar Eindrücke. Die Unterhaltungen mit dem Instrument laufen immer nach dem gleichen Schema:

2 byte "Hello" senden: 0x87 0x83
1 byte Kommando senden - z.B. 0x7f (Range Umschaltung)

wenn es sich um ein Kommando zum Daten auslesen handelt kommt als Antwort ein binärer Blob zurück. Die Doku erklärt die Blobs so leidlich und diese können nun decodiert werden.

Hier mal ein Beispiel für so eine Antwort:

00000000  bb 88 00 07 06 08 26 15  36 23 01 00 00 02 01 00  |......&.6#......|
00000010  07 06 08 26 15 36 23 02  00 00 02 01 00 07 06 08  |...&.6#.........|
00000020  26 15 36 25 03 00 00 02  01 00 07 06 08 26 23 28  |&.6%.........&#(|
00000030  02 04 27 1d 01 01 00 07  06 08 26 23 28 04 05 27  |..'.......&#(..'|
00000040  1a 01 01 00 07 06 08 26  23 28 04 06 27 1c 01 01  |.......&#(..'...|
00000050  00 07 06 08 26 23 28 05  07 27 14 01 01 00 07 06  |....&#(..'......|
00000060  08 26 23 28 07 08 27 17  01 01 00 07 06 08 26 23  |.&#(..'.......&#|
00000070  28 10 09 01 37 01 01 00  07 06 08 26 23 28 12 0a  |(...7......&#(..|
00000080  27 02 01 01 00 07 06 08  26 23 28 14 0b 27 00 01  |'.......&#(..'..|

[...]

Schon mit bloßem Auge kann man sehen, dass sich hier regelhaft was zu wiederholen scheint – und so ist es auch: das sind die data records (je 12 byte). Zwischen den records kommt dann immer noch ein 0x01 als Trenner, auch  wenn die Doku dazu nichts zu sagen hatte. Das führende 0xbb 0x88 ist die ID des Datenblobs und bedeutet hier, dass es Daten aus dem Datenspeicher für manuelle Datenpunkte sind. Darin codiert sind Datum und Uhrzeit,  Messert und Statusinfo, um den Datenwert interpretieren zu können (z.B. Lux/FC, oder der Messbereich).

Sobald ich fertig bin, stelle ich das Skript mal hier rein. Ich bemühe mich es übersichtlich zu gestalten und gut zu dokumentieren, damit das Protokoll sich einfach erschließt.

Update: das Skript liegt nun auf Github.