Tchibo Wetterstation: Unterschied zwischen den Versionen

Aus Hobbyelektronik.org
K
Zeile 98: Zeile 98:
 
|-
 
|-
 
| 24,8°C || 50% || 0000 || 0101 || 0100 || 0001 || 1111 || 0000 || 0000 || 1010 || 1110
 
| 24,8°C || 50% || 0000 || 0101 || 0100 || 0001 || 1111 || 0000 || 0000 || 1010 || 1110
|-
 
| 16,8°C || 51% || 0000 || 0101 || 0100 || 1011 || 0101 || 0000 || 0000 || 1010 || 1110
 
 
|-
 
|-
 
| 24,6°C || 51% || 0000 || 0101 || 0100 || 0110 || 1111 || 0000 || 1000 || 1010 || 0001
 
| 24,6°C || 51% || 0000 || 0101 || 0100 || 0110 || 1111 || 0000 || 1000 || 1010 || 0001
Zeile 122: Zeile 120:
 
|-
 
|-
 
| 11,9°C || 61% || 0000 || 0101 || 0100 || 1110 || 1110 || 0000 || 1000 || 0110 || 0111
 
| 11,9°C || 61% || 0000 || 0101 || 0100 || 1110 || 1110 || 0000 || 1000 || 0110 || 0111
 +
|-
 +
| -0,1°C || 89% || 0000 || 0101 || 0000 || 1111 || 1111 || 1111 || 1001 || 0001 || 1110
 +
|-
 +
| -0,2°C || 89% || 0000 || 0101 || 0000 || 0111 || 1111 || 1111 || 1001 || 0001 || 0001
 +
|-
 +
| -2,5°C || 89% || 0000 || 0101 || 0000 || 1110 || 0111 || 1111 || 1001 || 0001 || 0000
 
|-
 
|-
 
|}
 
|}
Zeile 128: Zeile 132:
 
"Sie kam aus einem kleineren Ort, wo das Motto galt: 'Wenn du nicht weiter weißt, schlachte ein Schwein'" (na, welcher Film war's?)
 
"Sie kam aus einem kleineren Ort, wo das Motto galt: 'Wenn du nicht weiter weißt, schlachte ein Schwein'" (na, welcher Film war's?)
  
Wie dem auch sei, zu erst einmal kann man die Bits ausschließen, bei denen nichts passiert. Bei meinen Messungen waren dies Nibble 0 und 1.
+
Wie dem auch sei, zu erst einmal kann man die Bits ausschließen, bei denen nichts passiert. Bei meinen Messungen waren es Nibble 0 und 1.
  
 
==Luftfeuchtigkeit==
 
==Luftfeuchtigkeit==
Der Einfachheit halber kommt als erstes die Luftfeuchtigkeit dran. Dazu wurde die Excel-Tabelle nach dieser Spalte sortiertz
+
Der Einfachheit halber kommt als erstes die Luftfeuchtigkeit dran. Dazu wurde die Excel-Tabelle nach dieser Spalte sortiert
 
Da in einigen Datensätzen die Luftfeuchtigkeit konstant, die Temperatur jedoch unterschiedlich ist, kann man mit relativ wenig Aufwand die zuständigen Bits ermitteln.  
 
Da in einigen Datensätzen die Luftfeuchtigkeit konstant, die Temperatur jedoch unterschiedlich ist, kann man mit relativ wenig Aufwand die zuständigen Bits ermitteln.  
  
 
Dabei hilft es ungemein, die Bits in Gruppen zu unterteilen.
 
Dabei hilft es ungemein, die Bits in Gruppen zu unterteilen.
  
Da sich 36 Bits gut durch 4 teilen lassen, habe ich diese Aufteilung gewählt. Excel-Formeln können beim Auseinanderpflücken der Datenworte enorm helfen (siehe Excel-Sheet). Die entsprechenden Spalten waren schnell gefunden: Nibble 6 und 7
+
Da sich 36 Bits gut durch 4 teilen lassen, habe ich diese Aufteilung gewählt. Excel-Formeln können beim Auseinanderpflücken der Datenworte enorm helfen (siehe Excel-Sheet). Die entsprechenden Spalten waren schnell gefunden: Nibble 6 und 7.
 +
 
 +
Zum Dekodieren ist es am einfachsten, ähnliche Werte miteinander zu vergleichen. So sieht man z. B. bei den Werten 50% und 51% dass sich bei 51% das höchstwertigste Bit in Nibble 6 ändert. Bei 52% ist nur das zweithöchste Bit aktiv. Ein Muster?!
 +
 
 +
Hilfreich ist hier die Exce-Funktion BININDEZ(), die Binär- in Dezimalwerte umrechnet. Da sich hier aber die höherwertigen Bits "früher" ändern als die niederwertigen ist anzunehmen, dass das Bitmuster verdreht ist. Eine Funktion zum Umkehren von Strings gibt es in Excel anscheinend nicht, allerdings kann man in den Formeln selbstdefinierte Funktionen verwenden.
 +
 
 +
Diese ist in VBA schnell geschrieben:
 +
<source lang="VB">
 +
Public Function Reverse(str as String) As String
 +
Reverse = StrReverse(str)
 +
End Function
 +
</source>
 +
 
 +
BININDEZ(Reverse(<Zelle>)) angewendet auf Nibble 6 gibt die Einerstellen aus, Nibble 7 entspricht den Zehnerstellen. Volltreffer!
  
 
==Temperatur==
 
==Temperatur==
Im nachhinein ist der Datenaufbau der Temperatur ebenfalls trivial. Bis man dort hin kommt, können jedoch einige Gehirnwindungen verbogen werden.
+
Im Nachhinein ist der Datenaufbau der Temperatur ebenfalls trivial. Bis man dort hin kommt, können jedoch einige Gehirnwindungen verbogen werden.
  
 
Auf jeden Fall hilft es auch hier, einen größeren und guten Vorrat an Daten zu haben. Wenn man die Beispieldaten oben nach Temperatur sortiert ("ich hab' da schonmal etwas vorbereitet") sieht man die Temperaturen 11,7, 11,8 und 11,9°C, die sich ideal zum Finden der niederwertigsten Bits eignen.
 
Auf jeden Fall hilft es auch hier, einen größeren und guten Vorrat an Daten zu haben. Wenn man die Beispieldaten oben nach Temperatur sortiert ("ich hab' da schonmal etwas vorbereitet") sieht man die Temperaturen 11,7, 11,8 und 11,9°C, die sich ideal zum Finden der niederwertigsten Bits eignen.

Version vom 10. Mai 2012, 22:28 Uhr

Tchibo Wetterstation

Letztes Jahr gab es von meiner Schwester eine Funk-Wetterstation (TCM 279340) zu Weihnachten. Ich hatte zwar schon eine etwa gleichwertige, aber man will sich Neuerungen natürlich nicht querstellen.

Interessant an dem Teil war auf dem ersten Blick das Farbdisplay, das sich nach näherer Betrachtung als Farbfolie auf einem Schwarz-Weiß-LCD herausstellte. Diese Effekthascherei sieht ehrlich gesagt nicht einmal allzu schlecht aus, obwohl sie durch den massiv niedrigeren Kontrast eigentlich nur Nachteile bringt.

Aber bekanntlich zählen ja die inneren Werte; und die sind trotz der Preisklasse (und der angesetzten Zielgruppe) nicht allzu schlecht.

Aufgrund von Prüfungsvorbereitungen blieb das Teil relativ lange unbehelligt, bis mich endgültig die Neugierige weckte:

Hardware

Die Wetterstation selbst ist mit Thermo- und Hygrometer, sowie einem Barometer ausgestattet, dass auf dem Display lediglich eine Tendenz anzeigt. Neben dem 433MHz-Empfänger ist zugleich ein Zeitzeichenempfänger (DCF77) verbaut, der kein Meteotime empfängt. Da war wohl die Lizenz teurer als das Barometer ;-)

Im "Außenfühler" sitzt wiederum ein Thermo- und Hygrometer. Neben Kanalwahlschalter und Tx-Knopf war's das auch schon wieder. Ok, Batterien frisst das Teil auch noch.

Wie beim EMR7370: Am Anfang war der Schraubendreher. Das Innenleben der Station ist relativ modular aufgebaut. Jeweils eine eigene Platine für DCF77, 433MHz, Barometer und Hygrometer. Auf der Hauptplatine ist dann der Rest. Dadurch war es mehr als einfach, das Signal der Begierde abzufangen. Wenn man schon mal drin ist, habe ich mir auch gleich die Datenleitungen des Barometers herausgeschleift - man weiß ja nie.

Protokoll

Im zweiten Schritt kommt der Logic Analyzer ins Spiel:

Interessant bis ~130ms

Wie man sieht, sind die Pulsweiten (low-Zeiten) nach jedem Flankenwechsel unterschiedlich - darin muss also die Information stecken.

Um Muster besser zu erkennen schnappte ich mir die Daten, importierte sie in Excel und ließ sie mir visualisieren.

Dazu habe ich einfach die Zeitdifferenzen zwischen den einzelnen Zeilen ausgeben lassen und das Ergebnis durch bedingte Formatierung hinterlegt. Zusätzlich habe ich alle "1-Zeiten" herausgefiltert, da dort augenscheinlich keine Informationen übertragen werden

wie man im zweiten Bild deutlich sieht, gibt es Synchronisation und Daten. Dabei ist eine Pause (bzw. Sendepuls, so genau weiß ich es nicht) von 8,9ms das Synchronisationswort und knapp 2 bzw. 4ms eine 1 bzw. 0. Insgesamt werden die Daten 8 mal übertragen - ist zwar nicht gerade edel, aber es funktioniert. Das Wissen über Kanalkodierung, Codeverkettung und Faltungscodes ist bei den Herstellern von solchem Zeug wohl noch nicht angekommen. Hat immerhin den Vorteil, dass es Leute wie ich nicht zu schwer haben.

Bleibt nur noch die Frage der Zuordnung. Was ist eine 1 und was eine 0 - und vor allem: wo steht was? Sicher ist zumindest, dass 36 Bit übertragen werden.

Datenfarm

Nachdem ich über mehrere Abende hinweg sporadisch Werte aufzeichnete (und erzeugte) bekam ich schließlich knapp 50 Datensätze, die ausgewertet werden wollten.

Um Copy & Paste-Orgien in Excel zu ersparen, bastelte ich mir ein kleines PHP-Script, das die Zeitstempel in Binärdaten umwandelt:

function timing2data($filename) {
	$fh = fopen($filename, "r");
	$lasttime = -1;
	$data = array();
	while($line = fgets($fh)) {
		$time = explode(", ", $line);
		$time = floatval($time[0]);
		
		if($lasttime !== -1) {
			$val = round(($time - $lasttime) * 1000);
			switch($val) {
			case 9: echo "\n"; break;
			case 0: echo ""; break;
			case 2: echo "0"; break;
			case 4: echo "1"; break;
			default: echo "<".$val.">"; break;
			}
		}
		$lasttime = $time;
	}
	fclose($fh);
}

Hier habe ich auch die Annahme getroffen, dass ein kurzer Puls 0 und ein langer 1 entspricht (ich sollte richtig liegen).

Die Ausgabe sieht dann zum Beispiel wie folgt aus:

000001010000111001111111100100010000
0000010100001110011111<673><19>

die Werte in den spitzen Klammern sind Pausenzeiten, die nicht als 1, 0 oder Sync erkannt wurden und somit Übertragungsfehler darstellen.

Bei der Auswertung fanden sich dann auch einige Datensätze, bei denen die Auswertung nicht mehr allzu zuverlässig war - also gerade so zwei Übereinstimmungen in den Datenworten. Aber es hat gereicht.

In Excel ging dann die Suche nach der Antwort los.

Beispieldaten

Temperatur Luftfeuchtigkeit 0 1 2 3 4 5 6 7 8
24,1°C 43% 0000 0101 0010 1000 1111 0000 1100 0010 0101
24,6°C 45% 0000 0101 0010 0110 1111 0000 1010 0010 1100
17,6°C 49% 0000 0101 0100 0000 1101 0000 1001 0010 1101
24,8°C 49% 0000 0101 0100 0001 1111 0000 1001 0010 1111
24,9°C 49% 0000 0101 0100 1001 1111 0000 1001 0010 0111
24,7°C 50% 0000 0101 0100 1110 1111 0000 0000 1010 0001
24,8°C 50% 0000 0101 0100 0001 1111 0000 0000 1010 1110
24,6°C 51% 0000 0101 0100 0110 1111 0000 1000 1010 0001
15,7°C 52% 0000 0101 0100 1011 1001 0000 0100 1010 0110
15,9°C 52% 0000 0101 0100 1111 1001 0000 0100 1010 0010
16,1°C 52% 0000 0101 0100 1000 0101 0000 0100 1010 1000
16,3°C 52% 0000 0101 0100 1100 0101 0000 0100 1010 1111
14,9°C 53% 0000 0101 0100 1010 1001 0000 1100 1010 1011
15,1°C 53% 0000 0101 0100 1110 1001 0000 1100 1010 1101
15,5°C 53% 0000 0101 0100 1101 1001 0000 1100 1010 1110
11,7°C 62% 0000 0101 0100 1010 1110 0000 0100 0110 1111
11,8°C 61% 0000 0101 0100 0110 1110 0000 1000 0110 1111
11,9°C 61% 0000 0101 0100 1110 1110 0000 1000 0110 0111
-0,1°C 89% 0000 0101 0000 1111 1111 1111 1001 0001 1110
-0,2°C 89% 0000 0101 0000 0111 1111 1111 1001 0001 0001
-2,5°C 89% 0000 0101 0000 1110 0111 1111 1001 0001 0000

"Immer" gleich

"Sie kam aus einem kleineren Ort, wo das Motto galt: 'Wenn du nicht weiter weißt, schlachte ein Schwein'" (na, welcher Film war's?)

Wie dem auch sei, zu erst einmal kann man die Bits ausschließen, bei denen nichts passiert. Bei meinen Messungen waren es Nibble 0 und 1.

Luftfeuchtigkeit

Der Einfachheit halber kommt als erstes die Luftfeuchtigkeit dran. Dazu wurde die Excel-Tabelle nach dieser Spalte sortiert Da in einigen Datensätzen die Luftfeuchtigkeit konstant, die Temperatur jedoch unterschiedlich ist, kann man mit relativ wenig Aufwand die zuständigen Bits ermitteln.

Dabei hilft es ungemein, die Bits in Gruppen zu unterteilen.

Da sich 36 Bits gut durch 4 teilen lassen, habe ich diese Aufteilung gewählt. Excel-Formeln können beim Auseinanderpflücken der Datenworte enorm helfen (siehe Excel-Sheet). Die entsprechenden Spalten waren schnell gefunden: Nibble 6 und 7.

Zum Dekodieren ist es am einfachsten, ähnliche Werte miteinander zu vergleichen. So sieht man z. B. bei den Werten 50% und 51% dass sich bei 51% das höchstwertigste Bit in Nibble 6 ändert. Bei 52% ist nur das zweithöchste Bit aktiv. Ein Muster?!

Hilfreich ist hier die Exce-Funktion BININDEZ(), die Binär- in Dezimalwerte umrechnet. Da sich hier aber die höherwertigen Bits "früher" ändern als die niederwertigen ist anzunehmen, dass das Bitmuster verdreht ist. Eine Funktion zum Umkehren von Strings gibt es in Excel anscheinend nicht, allerdings kann man in den Formeln selbstdefinierte Funktionen verwenden.

Diese ist in VBA schnell geschrieben:

Public Function Reverse(str as String) As String
Reverse = StrReverse(str)
End Function

BININDEZ(Reverse(<Zelle>)) angewendet auf Nibble 6 gibt die Einerstellen aus, Nibble 7 entspricht den Zehnerstellen. Volltreffer!

Temperatur

Im Nachhinein ist der Datenaufbau der Temperatur ebenfalls trivial. Bis man dort hin kommt, können jedoch einige Gehirnwindungen verbogen werden.

Auf jeden Fall hilft es auch hier, einen größeren und guten Vorrat an Daten zu haben. Wenn man die Beispieldaten oben nach Temperatur sortiert ("ich hab' da schonmal etwas vorbereitet") sieht man die Temperaturen 11,7, 11,8 und 11,9°C, die sich ideal zum Finden der niederwertigsten Bits eignen.

Tatsächlich wird man auch bei Nibble 3 fündig. Allerdings ist die Anordnung der Bits etwas merkwürdig. Die Orientierung ist "verkehrt" herum und die Nachkommastelle scheint einen Offset von 0,2 zu haben. Bei anderen Zeilen scheint diese Regel jedoch keine Gültigkeit zu haben.

Also nochmal zurück auf Anfang.

Nach längerem herumprobieren bin ich dann auf die Idee gekommen, nicht in Nibbles zu denken, sondern die Bits im zusammengesetztem