Blog der Heimetli Software AG

Drahtlose Temperaturmessung mit Linux

Letztes Jahr hatte ich zwar schon Flugzeugdaten mit dem Raspberry decodiert, aber dass man auch ganz andere Funksignale mit SDR decodieren könnte ist mir gar nicht eingefallen. Wahrscheinlich denke ich immer noch viel zu analog...

Dank einem Hinweis im Internet kam ich aber doch noch drauf, und es es ist mir gelungen, die Temperatur von einem drahtlosen Sensor zu empfangen und decodieren.

Der Sensor

Bei Pearl gab es einen einzelnen Sensor (NC-7159-675) günstig zu kaufen, und den habe ich mir beschafft. Vor allem weil auf dem Typenschild 433 MHz stand. Wie bei solchen Geräten üblich, gab es keine weiteren Angaben.

Obwohl die Verpackung mit "Funk-Aussensensor" angeschrieben ist, steht in der Bedienungsanleitung, dass man den Sensor an einem witterungsgeschützten Ort aufhängen soll, weil er weder direkte Sonneneinstrahlung, noch Regen oder Schnee verträgt...

Der Sensor NC-7159-675

Die Software

Die Beschreibung auf https://github.com/merbanan/rtl_433 ist eigentlich ausgezeichnet, ich habe sie hier nur zusammengeschrieben um die gesamte Installation zu dokumentieren.

Auf meinem System waren cmake und libusb-dev nicht vorhanden und mussten vorgängig installiert werden.

Die weitere Installation ist auch nicht schwierig. Zuerst braucht es rtl-sdr als Grundlage:

git clone git://git.osmocom.org/rtl-sdr.git
cd rtl-sdr
mkdir build
cd build
cmake -DDETACH_KERNEL_DRIVER=ON ../
make
sudo make install
sudo ldconfig

Die einzige Besonderheit ist die cmake-Option für den Driver. Sie sorgt dafür, dass rtl-sdr den DVB-Stick übernehmen kann. Mein Linux lädt automatisch einen Treiber für digitales Fernsehen, und den muss man loswerden damit rtl-sdr mit dem Stick arbeiten kann.

Dann kommt rtl_433 oben drauf, genau nach der Anleitung auf github:

git clone git://github.com/merbanan/rtl_433
cd rtl_433
mkdir build
cd build
cmake ../
make
sudo make install

Und schon kann rtl_433 gestartet werden:

rtl_433

Ohne weitere Optionen versucht das Programm selber einen passenden Decoder zu finden, was ihm auch fast gelungen ist. Es schwankte zwischen drei verschiedenen Typen hin und her, wobei der Decoder fuer "Prologue sensor" die besten Resultate lieferte.

Also Neustart mit einer Option:

rtl_433 -R 03

Et voilà, die Messwerte kommen etwa alle 30 Sekunden, schön stabil:

2016-07-31 22:16:13 :	Prologue sensor 	:	5 	:	72
	Channel:	 1
	Battery:	 OK
	Button:	 0
	Temperature:	 24.20 C
	Humidity:	 18 %
2016-07-31 22:16:48 :	Prologue sensor 	:	5 	:	72
	Channel:	 1
	Battery:	 OK
	Button:	 0
	Temperature:	 24.20 C
	Humidity:	 18 %
2016-07-31 22:17:23 :	Prologue sensor 	:	5 	:	72
	Channel:	 1
	Battery:	 OK
	Button:	 0
	Temperature:	 24.20 C
	Humidity:	 18 %
2016-07-31 22:17:58 :	Prologue sensor 	:	5 	:	72
	Channel:	 1
	Battery:	 OK
	Button:	 0
	Temperature:	 24.20 C
	Humidity:	 18 %

Channel 1 stimmt, das ist ein Wahlschalter auf dem Gerät. Der Button war nicht gedrückt, stimmt also auch. Die Temperatur entspricht genau der Anzeige auf dem Sensor.

Interessanterweise wird auch eine Feuchtigkeit angezeigt, aber weder auf der Anzeige noch in der Bedienungsanleitung gibt es irgendwelche Hinweise auf eine Feuchtigkeitsmessung. Ein anderes Gerät, direkt daneben gelegt, zeigte 55% rh an. Es ist deshalb anzunehmen, dass gar kein Feuchtesensor eingebaut ist.

Das Ausgabeformat kann man übrigens umschalten, zum Beispiel auf CSV:

2016-08-01 10:28:18,Prologue sensor,5,72,1,OK,0,24.000,18
2016-08-01 10:28:52,Prologue sensor,5,72,1,OK,0,24.000,18
2016-08-01 10:29:27,Prologue sensor,5,72,1,OK,0,24.000,18
2016-08-01 10:30:02,Prologue sensor,5,72,1,OK,0,23.900,18
2016-08-01 10:30:38,Prologue sensor,5,72,1,OK,0,23.900,18
2016-08-01 10:31:12,Prologue sensor,5,72,1,OK,0,23.900,18

Oder auch JSON:

{"time" : "2016-08-01 10:33:33", "model" : "Prologue sensor", "id" : 5, "rid" : 72, "channel" : 1, "battery" : "OK", "button" : 0, "temperature_C" : 23.800, "humidity" : 18}
{"time" : "2016-08-01 10:34:07", "model" : "Prologue sensor", "id" : 5, "rid" : 72, "channel" : 1, "battery" : "OK", "button" : 0, "temperature_C" : 23.800, "humidity" : 18}
{"time" : "2016-08-01 10:34:42", "model" : "Prologue sensor", "id" : 5, "rid" : 72, "channel" : 1, "battery" : "OK", "button" : 0, "temperature_C" : 23.800, "humidity" : 18}
{"time" : "2016-08-01 10:35:17", "model" : "Prologue sensor", "id" : 5, "rid" : 72, "channel" : 1, "battery" : "OK", "button" : 0, "temperature_C" : 23.800, "humidity" : 18}
{"time" : "2016-08-01 10:35:53", "model" : "Prologue sensor", "id" : 5, "rid" : 72, "channel" : 1, "battery" : "OK", "button" : 0, "temperature_C" : 23.800, "humidity" : 18}
{"time" : "2016-08-01 10:36:27", "model" : "Prologue sensor", "id" : 5, "rid" : 72, "channel" : 1, "battery" : "OK", "button" : 0, "temperature_C" : 23.800, "humidity" : 18}
{"time" : "2016-08-01 10:37:02", "model" : "Prologue sensor", "id" : 5, "rid" : 72, "channel" : 1, "battery" : "OK", "button" : 0, "temperature_C" : 23.800, "humidity" : 18}

Decodierung des Signals mit einem Arduino

Weil mir der DVB-Stick mit der Zeit etwas umständlich vorkam, gibt es eine jetzt eine Variante mit 433MHz-Empfänger und Arduino

Decodierung des Signals mit Raspberry Pico

Einen Decoder für den Raspberry Pico mit MicroPython gibt es jetzt auch.