IoT #10: Dekodierung eines Funk-Außensensors (2)

Ausgangssituation

Über die Dekodierung der Funk-Außensensors habe ich bereits berichtet:

Prinzipiell funktioniert das Empfangen und Dekodieren dessen Daten gut. Es gibt vereinzelt jedoch Ausreißer bei der Luftfeuchtigkeit und der Temperatur. Selten jedoch beider Weite auf einmal.
Dies ist im Folgenden gut zu sehen:

Die Ausreißer bzw. Sprünge oder Peaks sind unterschiedlich groß, auch wenn es bei der Temperatur konstant aussieht.

Mögliche Ursachen

Sensoren in der Nachbarschaft

Die empfangenen Daten (Sensor-ID, Kanal-Nr., …) sind alle plausibel. Daher kommen diese Daten nicht aus ähnlichen Sensoren in der Nachbarschaft. Selbst bei unterschiedlicher Platzierung (Sonne, Schatten) kann die Luftfeuchtigkeit nicht so extrem von meinem Sensor abweichen, wie oben dargestellt (ca. 50%).

Dekodierungsfehler

Die Erkennung der Low- und High-Bits, die über Zeitmessungen ermittelt werden (vgl. oben verlinkter Beitrag), ist sehr eng toleriert (±200 μs). Daher kann ich ausschließen, dass ein Bit aufgrund von zu großen Toleranzen falsch erkannt wird. Aktuell besteht eher die Gefahr, dass Daten aufgrund dieser Toleranzen verworfen und somit ignoriert werden.

➡ Mir fällt sonst keine weitere Ursache ein, die dieses Verhalten zur Folgt hat.

Ursachenbehebung

Da die Ursache nicht bekannt ist, kann diese aktuell nicht direkt behoben werden. Es gibt jedoch Möglichkeiten, diese Ausreißer zu erkennen und diese Daten zu ignorieren.

Plausibilitätsprüfung

Relativ ungenau ist die Plausibilitätsprüfung der Werte. Hier ist es denkbar, nur kleine Wertänderungen zwischen 2 aufeinanderfolgenden Daten zuzulassen.
Es kann jedoch in der Praxis vorkommen, dass sich Temperaturen „sprunghaft“ ändern. Die Erfassung läuft zukünftig mit einem Intervall von 10 min. Gibt es dazwischen einen Wechsel von Schatten und Sonne, ist eine Temperaturänderung um einige Grad/Kelvin zu erwarten.

D. h. die Plausibilitätsprüfung anhand der Wertänderung ist nicht sinnvoll (und auch keine zufriedenstellende Lösung).

Mittelwertfilter oder Medianfilter

Analoge Messwerte müssen gefiltert werden. Bewährt haben sich der Mittelwert- und Medianfilter. Vereinfacht gesagt, glättet der Mittelwertfilter sämtliche Werte, bezieht jedoch jeden Wert (auch Ausreißer) mit ein. Starke Ausreißer beeinflussen somit das Ergebnis. Der Medianfilter ignoriert die Ausreißer komplett.

Alle Filter haben jedoch den Nachteil, dass der aktuelle Messwert (Temperatur, Luftfeuchtigkeit) verzögert ermittelt wird. Ich möchte jedoch den aktuellen Wert sehen. Eine Erhöhung der Erfassungsrate von 10 min auf z. B. 1 min bei einer Filterung über die letzten 10 Werte möchte ich aufgrund des erhöhten Stromverbrauchs nicht vornehmen.

Überprüfung der Checksumme

Der Sensor sendet zusammen mit den Werten u. a. eine 8-Bit-Checksumme. Diese ändert sich sobald sich Werte wie die Temperatur oder die Luftfeuchte ändern. Das ist die zu bevorzugende Methode, um fehlerhafte Daten zu erkennen.

Der Algorithmus zur Berechnung der Checksumme ist natürlich nicht vom Hersteller dokumentiert, da der Sensor nur mit seiner zugehörigen Auswerteeinheit des Herstellers funktionieren muss. Auch konnte ich im Internet nichts genaueres zur Berechnung finden.

Gleich vorweg: Ich habe es bisher nicht geschafft, die Checksumme zu „knacken“. Dennoch im Folgenden die ersten Ansätze bzw. eine mögliche Datenbasis. Ich werde ich den Beitrag zukünftig aktualisieren, wenn ich neue Erkenntnisse habe.

Dekodierung der Checksumme

Um den Algorithmus einer Checksumme per Reverse-Engineering ermitteln zu können, sind plausible Daten erforderlich, die sich nur in einem Bit unterscheiden. Nur so kann die Auswirkung des einen Bits auf die Checksumme nachvollzogen werden.

Ich habe die Kanalnummer manuell geändert und die Batterie entfernt. Letzteres führt zur Generierung einer neuen Sensor-ID. Beides führte dazu, dass die Checksumme sich ändert bei gleicher Temperatur und Luftfeuchte. Daher setzt sich die Checksumme nicht nur aus den 2 gemessenen Werten zusammen, sondern bezieht sämtliche anderen Werte mit ein.

Diese Daten habe ich aus der Datenbank herausgesucht. Die 40 Bits, die der Sensor sendet, gruppiere ich dazu in seine Einzelwerte. Die Checksumme haben ich bewusst in 2 x 4 Bits aufgeteilt, da ich den Eindruck habe, dass sich der 2. Teil deutlich weniger ändert und ggf. separat berechnet wird (TEMP = Temperatur, HUM = Humidity = Luftfeuchtigkeit, CHK = Checksumme, B = Batteriestatus, ? = Funktion des Bits nicht bekannt)

Änderung der Kanalnummer:

01:	6,1°C, 78%, Ch 3	BITS:0001111001101001010100110011011110000011	HEX:1e69533783	ID:00011110 CHK:0110 CHK:1001 TEMP:010100110011 HUM:01111000 B:0 ?:0 CH:11 -> andere Checksum als drunter bei Zeile #04?
02:	6,1°C, 78%, Ch 1	BITS:0001111001000001010100110011011110000001	HEX:1e41533781	ID:00011110 CHK:0100 CHK:0001 TEMP:010100110011 HUM:01111000 B:0 ?:0 CH:01
03:	6,1°C, 78%, Ch 2	BITS:0001111010010001010100110011011110000010	HEX:1e91533782	ID:00011110 CHK:1001 CHK:0001 TEMP:010100110011 HUM:01111000 B:0 ?:0 CH:10
04:	6,1°C, 78%, Ch 3	BITS:0001111000110001010100110011011110000011	HEX:1e31533783	ID:00011110 CHK:0011 CHK:0001 TEMP:010100110011 HUM:01111000 B:0 ?:0 CH:11

05:	7,0°C, 84%, Ch 1	BITS:0001111001000001010101000010100001000001	HEX:1e41542841	ID:00011110 CHK:0100 CHK:0001 TEMP:010101000010 HUM:10000100 B:0 ?:0 CH:01
06:	7,0°C, 84%, Ch 2	BITS:0001111000010001010101000010100001000010	HEX:1e11542842	ID:00011110 CHK:0001 CHK:0001 TEMP:010101000010 HUM:10000100 B:0 ?:0 CH:10
07:	7,0°C, 84%, Ch 3	BITS:0001111000110001010101000010100001000011	HEX:1e31542843	ID:00011110 CHK:0011 CHK:0001 TEMP:010101000010 HUM:10000100 B:0 ?:0 CH:11

08:	21,1°C, 49%, Ch 3	BITS:1000011001010001011001000000010010010011	HEX:8651640493	ID:10000110 CHK:0101 CHK:0001 TEMP:011001000000 HUM:01001001 B:0 ?:0 CH:11
09:	21,1°C, 49%, Ch 1	BITS:1000011000100001011001000000010010010001	HEX:8621640491	ID:10000110 CHK:0010 CHK:0001 TEMP:011001000000 HUM:01001001 B:0 ?:0 CH:01
10:	21,1°C, 49%, Ch 2	BITS:1000011011110001011001000000010010010010	HEX:86f1640492	ID:10000110 CHK:1111 CHK:0001 TEMP:011001000000 HUM:01001001 B:0 ?:0 CH:10
11:	21,1°C, 49%, Ch 3	BITS:1000011001010001011001000000010010010011	HEX:8651640493	ID:10000110 CHK:0101 CHK:0001 TEMP:011001000000 HUM:01001001 B:0 ?:0 CH:11

12:	21,2°C, 49%, Ch 1	BITS:1000011010000001011001000010010010010001	HEX:8681642491	ID:10000110 CHK:1000 CHK:0001 TEMP:011001000010 HUM:01001001 B:0 ?:0 CH:01
13:	21,2°C, 49%, Ch 2	BITS:1000011001010001011001000010010010010010	HEX:8651642492	ID:10000110 CHK:0101 CHK:0001 TEMP:011001000010 HUM:01001001 B:0 ?:0 CH:10
14:	21,2°C, 49%, Ch 3	BITS:1000011011110001011001000010010010010011	HEX:86f1642493	ID:10000110 CHK:1111 CHK:0001 TEMP:011001000010 HUM:01001001 B:0 ?:0 CH:11

Batterietausch (Änderung der Sensor-ID):

15:	21,7°C, 56%, Ch 1	BITS:1100000010100000011001001100010101100001	HEX:c0a064c561	ID:11000000 CHK:1010 CHK:0000 TEMP:011001001100 HUM:01010110 B:0 ?:0 CH:01
16:	21,7°C, 56%, Ch 1	BITS:0110101011110000011001001100010101100001	HEX:6af064c561	ID:01101010 CHK:1111 CHK:0000 TEMP:011001001100 HUM:01010110 B:0 ?:0 CH:01

17:	22,0°C, 55%, Ch 1	BITS:0111101100110000011001010000010101010001	HEX:7b30650551	ID:01111011 CHK:0011 CHK:0000 TEMP:011001010000 HUM:01010101 B:0 ?:0 CH:01
18:	22,0°C, 55%, Ch 1	BITS:1011010000010000011001010000010101010001	HEX:b410650551	ID:10110100 CHK:0001 CHK:0000 TEMP:011001010000 HUM:01010101 B:0 ?:0 CH:01

19:	22,0°C, 56%, Ch 1	BITS:1000011110100000011001010000010101100001	HEX:87a0650561	ID:10000111 CHK:1010 CHK:0000 TEMP:011001010000 HUM:01010110 B:0 ?:0 CH:01
20:	22,0°C, 56%, Ch 1	BITS:0110010111100000011001010000010101100001	HEX:65e0650561	ID:01100101 CHK:1110 CHK:0000 TEMP:011001010000 HUM:01010110 B:0 ?:0 CH:01

Mit 8-Bit-CRC oder XOR-Verknüpfung der 4-Bit-Blöcke komme ich leider nicht voran. Sollte euch ein weiterer Ansatz einfallen oder ihr habt das Ganze sogar dekodieren können, so teilt mir das bitte mit. Das würde mich freuen. 🙂 Aber ich werde noch weiter probieren, das hin zu bekommen. Das kann eigentlich keine komplizierte Berechnung sein, denn der Mikrocontroller des Sensors ist sicherlich nicht leistungsstark. 🤔

Schreibe einen Kommentar