Decoding Oregon Scientific wireless sensor data with RTL-SDR and GNU Radio
Kevin Mehall
http://kevinmehall.net
This script decodes the packets that Oregon Scientific remote thermometers (like the one pictured below) send to the display unit. It also serves as example code for accessing rtl-sdr / GNU Radio samples live from Python.
Each sensor transmits every 30 seconds on 433.9MHz. The packet is repeated twice. Modulation is On-off keying, and the 32 data bits are manchester encoded. Alexander Yerezeyev implemeted a decoder for AVR microcontrollers, and wrote up a description of the protocol.
My sensors use the V1 protocol, but if you have newer sensors, take a look at JeeLabs' description of the V2 protocol. It would probably be simple to adapt my code.
The GNU Radio osmosdr block captures from the device.
It's tuned slightly to the side to avoid the DC noise at the local oscillator
frequency. A freq_xlating_fir_filter_ccc
block selects and downsamples the
correct region of the captured frequency range. Then it AM demodulates that band, and
uses a message sink and queue to bring the samples into Python. (see gr_queue.py).
A Python state machine detects the preamble, manchester-decodes the bits, and
then parses the packet.
You can also (with the -a
flag) play the AM audio to your speakers. The sensor
packets sound like beeps, and you can hear other devices transmitting on the ISM
band.