Wiki source for CodeanalysePoolThermometer
=====Codeanalyse eines Pool-Thermometers=====
Marke: TFA Dostmann/Wertheim
MODEL NO. KW-9043
{{image url="images/poolTempPhoto.jpg" alt=""}}
Das Thermometer sendet auf 433 MHz mit OOK.
Ich habe einen DVB-T-Stick verwendet um die Signale ins Basisband zu demodulieren und habe mir den Rest dann in Octave angeschaut.
==a==Symbol-Kodierung==a==
Wenn man sich eine Zeitreihe anschaut, dann sieht man, dass es 3 Symbole gibt. Ein 0-, ein 1- und ein Sync-Symbol
Ein Symbol besteht immer aus einem ca. 207 µs breiten positiven Puls gefolgt von einer variablen Pause. Die Pause entscheidet darüber, um welches Symbol es sich handelt.
{{image url="images/poolTempSymbols.png" alt=""}}
Gemessene Werte:
0-Symbol
HI 0.207 ms
LO 2.258 ms
1-Symbol
HI 0.207 ms
LO 4.825 ms
Sync-Symbol
HI 0.207 ms
LO 9.811 ms
==a==Informations-Kodierung==a==
Da die Symbole nun bekannt sind, kann man also eine Sequenz von Symbolen auf einer [[AbstraktionsEbenen Abstraktionsebene]] höher untersuchen. Ich habe die Sequenzen rausgesucht, die zwischen zwei Sync liegen und habe die dazu immer die Temperatur aufgeschrieben, sobald sich diese geändert hat.
Sequenz A bei 25,5 °C auf der Anzeige
%%(matlab)
seqA='1101100100100000111111110101'
%%
Sequenz B bei 25,8 °C auf der Anzeige
%%(matlab)
seqB='0010100100100001000000100101'
%%
Mir ist aufgefallen, dass die 9 Bits 16 bis 24, die Temperatur sein könnten. Man fängt bei Octave bei 1 (nicht bei 0!) an zu zählen.
Man muss also die Bits 16 bis 24 in einen Integer-Wert wandeln. Ich mache das mit Octave, weil es schnell geht.
Octave-Befehl
%%(matlab)
>> bin2dec(seqA(16:24))
ans =
255
>> bin2dec(seqB(16:24))
ans =
258
%%
Tatsächlich die 9 Bits beinhalten die Temperatur.
Man teilt den Wert noch durch 10 und hat dann die Temperatur.
Octave-Befehl
%%(matlab)
>> bin2dec(seqA(16:24)) / 10
ans =
25.5000
>> bin2dec(seqB(16:24)) / 10
ans =
25.8000
%%
Die Daten sind also unverschlüsselt und in einem sehr überschaubaren Format. Vielleicht möchte jemand die anderen Bits herausfinden.
----
Siehe auch {{backlinks}}
Marke: TFA Dostmann/Wertheim
MODEL NO. KW-9043
{{image url="images/poolTempPhoto.jpg" alt=""}}
Das Thermometer sendet auf 433 MHz mit OOK.
Ich habe einen DVB-T-Stick verwendet um die Signale ins Basisband zu demodulieren und habe mir den Rest dann in Octave angeschaut.
==a==Symbol-Kodierung==a==
Wenn man sich eine Zeitreihe anschaut, dann sieht man, dass es 3 Symbole gibt. Ein 0-, ein 1- und ein Sync-Symbol
Ein Symbol besteht immer aus einem ca. 207 µs breiten positiven Puls gefolgt von einer variablen Pause. Die Pause entscheidet darüber, um welches Symbol es sich handelt.
{{image url="images/poolTempSymbols.png" alt=""}}
Gemessene Werte:
0-Symbol
HI 0.207 ms
LO 2.258 ms
1-Symbol
HI 0.207 ms
LO 4.825 ms
Sync-Symbol
HI 0.207 ms
LO 9.811 ms
==a==Informations-Kodierung==a==
Da die Symbole nun bekannt sind, kann man also eine Sequenz von Symbolen auf einer [[AbstraktionsEbenen Abstraktionsebene]] höher untersuchen. Ich habe die Sequenzen rausgesucht, die zwischen zwei Sync liegen und habe die dazu immer die Temperatur aufgeschrieben, sobald sich diese geändert hat.
Sequenz A bei 25,5 °C auf der Anzeige
%%(matlab)
seqA='1101100100100000111111110101'
%%
Sequenz B bei 25,8 °C auf der Anzeige
%%(matlab)
seqB='0010100100100001000000100101'
%%
Mir ist aufgefallen, dass die 9 Bits 16 bis 24, die Temperatur sein könnten. Man fängt bei Octave bei 1 (nicht bei 0!) an zu zählen.
Man muss also die Bits 16 bis 24 in einen Integer-Wert wandeln. Ich mache das mit Octave, weil es schnell geht.
Octave-Befehl
%%(matlab)
>> bin2dec(seqA(16:24))
ans =
255
>> bin2dec(seqB(16:24))
ans =
258
%%
Tatsächlich die 9 Bits beinhalten die Temperatur.
Man teilt den Wert noch durch 10 und hat dann die Temperatur.
Octave-Befehl
%%(matlab)
>> bin2dec(seqA(16:24)) / 10
ans =
25.5000
>> bin2dec(seqB(16:24)) / 10
ans =
25.8000
%%
Die Daten sind also unverschlüsselt und in einem sehr überschaubaren Format. Vielleicht möchte jemand die anderen Bits herausfinden.
----
Siehe auch {{backlinks}}