Decoder for Oregon Scientific v1 protocol wireless temperature sensors with RTL-SDR and GNU Radio.
Latest commit 91f9d4b Apr 23, 2012 @kevinmehall Update osmo-sdr API
Failed to load latest commit information. Command line options Apr 23, 2012 Update osmo-sdr API Apr 23, 2012 Optimize gr_queue Apr 19, 2012

Decoding Oregon Scientific wireless sensor data with RTL-SDR and GNU Radio

Kevin Mehall

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.

Picture of sensor

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 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.