Software Defined Radio

Receiving, decoding and displaying weather data from a WT440 Wireless Weather Transmitter


UPM PROTOCOL

Source: http://wiki.nethome.nu/doku.php/upmprotocol

The RF-Protocol used by the UPM-Devices uses OOK-modulation of a 433.92 MHz carrier signal.

The digital signal is encoded using an Biphase Differential Manchester Encoding.

The transmitter sends a burst of three messages (for redundancy) every 60 seconds.

One message consists of 32 bits of data prepended by a 4 bit wake up code.

  /*
   * The message consists of four bytes.
   * x = Wake Up Code (1100)
   * c = House Code  (0 - 15)
   * d = Device Code (1 -  4) ?
   * p = Primary value - Temperature/Rain/Wind speed value (low bits)
   * P = Primary value - Temperature/Rain/Wind speed value (high bits)
   * s = Secondary value - Humidity/Wind direction (low bits)
   * S = Secondary value - Humidity/Wind direction (high bits)
   * b = Low battery indication
   * z = Sequence number 0 - 2. Messages are sent in bursts of 3. For some senders this is always 0
   * C = Checksum. bit 1 is XOR of odd bits, bit 0 XOR of even bits in message
   * 
   * If HouseCode = 10 and deviceCode = 2, then p and P is Wind speed
   * and h and H is Wind direction
   * 
   * If HouseCode = 10 and deviceCode = 3, then p and P is rain
   * 
   * ____Byte 0_____  ____Byte 1_____  ____Byte 2_____  ____Byte 3_____  _Nib4__
   * 7 6 5 4 3 2 1 0  7 6 5 4 3 2 1 0  7 6 5 4 3 2 1 0  7 6 5 4 3 2 1 0  3 2 1 0
   * x x x x c c c c  d d 1 1 b S S S  s s s s 0 P P P  p p p p p p p p  z z C C
   *                                            
   * Temp (C) = RawValue / 16 - 50
   * Rain (total mm) = RawValue * 0.7
   * Wind Speed (mph)= RawValue (* 1/3.6 for km/h)
   * Humidity (%) = RawValue
   * Wind direction (deg) = RawValue * 45
   * 
   */

dmesg :: Connecting a RTL2832U to a USB port

Turn on your machine and let it boot up.

Plug the RTL2832U into a USB port.

Type in dmesg to see the system log entries of linux finding and configuring the RTL2832U

Here is the log from a Raspberry Pi 3 Model B Plus Rev 1.3


$ dmesg

[5875793.155531] usb 1-1.3: USB disconnect, device number 5
[6276815.400286] usb 1-1.2: new high-speed USB device number 6 using dwc_otg
[6276815.542226] usb 1-1.2: New USB device found, idVendor=0bda, idProduct=2838, bcdDevice= 1.00
[6276815.542242] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[6276815.542252] usb 1-1.2: Product: RTL2832UHIDIR
[6276815.542261] usb 1-1.2: Manufacturer: Realtek
[6276815.542270] usb 1-1.2: SerialNumber: 00000001
[6276815.666401] usb 1-1.2: dvb_usb_v2: found a 'Realtek RTL2832U reference design' in warm state
[6276815.719837] usb 1-1.2: dvb_usb_v2: will pass the complete MPEG2 transport stream to the software demuxer
[6276815.719869] dvbdev: DVB: registering new adapter (Realtek RTL2832U reference design)
[6276815.736801] i2c i2c-3: Added multiplexed i2c bus 4
[6276815.736809] rtl2832 3-0010: Realtek RTL2832 successfully attached
[6276815.736861] usb 1-1.2: DVB: registering adapter 0 frontend 0 (Realtek RTL2832 (DVB-T))...
[6276815.750811] r820t 4-001a: creating new instance
[6276815.757629] r820t 4-001a: Rafael Micro r820t successfully identified
[6276815.766751] Registered IR keymap rc-empty
[6276815.766845] rc rc0: Realtek RTL2832U reference design as /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/rc/rc0
[6276815.766947] input: Realtek RTL2832U reference design as /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/rc/rc0/input0
[6276815.767063] rc rc0: lirc_dev: driver dvb_usb_rtl28xxu registered at minor = 0, raw IR receiver, no transmitter
[6276815.767163] usb 1-1.2: dvb_usb_v2: schedule remote query interval to 200 msecs
[6276815.779587] usb 1-1.2: dvb_usb_v2: 'Realtek RTL2832U reference design' successfully initialized and connected
[6276815.779788] usbcore: registered new interface driver dvb_usb_rtl28xxu

GQRX Receiver

GQRX Screenshot of UPM Burst of Three Messages
GQRX Screenshot of UPM Three Message Burst

Watch GRXQ. When you see the burst, note exactly where the second hand is on an analog clock.

My WT440 transmits exactly every 60 seconds and does so when the second hand is at "FIVE TO".


Install and Test RTL-SDR Command line tools

$ apt-get install libusb-1.0-0-dev

$ apt-get install rtl-sdr

$ rtl_test

Found 1 device(s):
  0:  Generic, RTL2832U, SN: 77771111153705700

Using device 0: Generic RTL2832U
Detached kernel driver
Found Rafael Micro R820T tuner

Supported gain values (29): 
      0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 
      19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 
      38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6 
      
[R82XX] PLL not locked!
Sampling at 2048000 S/s.

Info: This tool will continuously read from the device, and report if
samples get lost. If you observe no further output, everything is fine.

Reading samples in async mode...

^C

Signal caught, exiting!


$ rtl_sdr

rtl_sdr, an I/Q recorder for RTL2832 based DVB-T receivers

Usage:	 -f frequency_to_tune_to [Hz]
	[-s samplerate (default: 2048000 Hz)]
	[-d device_index (default: 0)]
	[-g gain (default: 0 for auto)]
	[-p ppm_error (default: 0)]
	[-b output_block_size (default: 16 * 16384)]
	[-n number of samples to read (default: 0, infinite)]
	[-S force sync output (default: async)]
	filename (a '-' dumps samples to stdout)


Capturing a Burst using RTL-SDR

Close GQRX so the RTL_SDR can use the USB Dongle.

Otherwise you will get this message:

   Failed to open rtlsdr device #0.

Start the capture 2 seconds before it transmits so that linux has enough time to intialize everything.

I captured only 5 seconds to make the burst easier to find and captured at 1024000 bits/second so the file is smaller.

I tried different gain numbers until I got one (28.0 dB) that did not clip and gave a good strong signal.

I used 433889000 HZ as the frequency as that was closer to the actual frequency.

# rtl_sdr capture.bin -f 433889000 -s 1024000 -g 28.0 -n 5120000

Found 1 device(s):
  0:  Generic, RTL2832U, SN: 77771111153705700

Using device 0: Generic RTL2832U
Detached kernel driver
Found Rafael Micro R820T tuner
[R82XX] PLL not locked!
Sampling at 1024000 S/s.
Tuned to 433889000 Hz.
Tuner gain set to 28.00 dB.
Reading samples in async mode...

User cancel, exiting...
Reattached kernel driver

Importing and Displaying RTL2832U Data with Audacity


Settings for File Import of "capture.bin"


References