DIY Davis Vantage Vue Sensor Suite receiver

A basic receiver built with an RFM69, an ESP32 and Rust. Compatible with WeeWX and the MeteoStick driver running on a Pi Zero W

The goal of this project was to build a receiver for my Davis Vantage Vue (European version) as I didn’t like the official console. Since then, I think they released a new model, but anyway I prefer to have total control and the flexibility of a DIY solution. I did a first version in C++ more than a year ago, then decided it was a good little project to start learning Rust. Everything is working quite well, but as it’s my first Rust program, things may look odd to a seasoned rustacean. It was also a good occasion to design my first PCB. The prototype is functional but with some flaws. I’m planning to design a new version that I’ll share here when ready.

It shouldn’t be too difficult to adapt the project to work in North America (the RF Transceiver exists in 915 Mhz).

Overview

The main components are :

  • RFM69HCW 868Mhz module : the RF Transceiver used to receive data from the weather station sensors.
  • AHT20 + BMP280 module:
    • AHT20 is a humidity and temperature sensor
    • BMP280 is an absolute barometric pressure and temperature sensor
  • ESP32-S3: the MCU that glues everything together
  • Raspberry Pi Zero W: run WeeWX and a Web server to store and display the data

The ESP32 is the central part. It talks to the RFM69 over SPI, to the AHT20 and the BMP80 over a shared I2C bus and to the Raspberry Pi through a UART.

The circuit on a breadboard The PCB prototype

Total Cost

The total cost in France in 2024, is less than 30€ (thanks to AliExpress except for the Raspberry). And less than 10€ for the receiver part only. The Raspberry can be mutualised with other home automation projects. Or even removed by updating the ESP32 program to send the data directly to the cloud or an existing local server.

  • ESP32-S3 Devboard : 5€
  • RFM69HCW : 2.7€
  • AHT20 + BMP280 : 1.5€
  • Raspberry Pi Zero 2 W : 19€

Wiring

ESP32RFM69AHT20+BMP280RaspberryComment
15DIO0
16SCK
17MOSI
18MISO
ANTConnect a wire of about 8.5 cm or a proper antenna
3SDA
9SCL
GNDGNDGND6 or 9, 14, 20, …
3V33.3VVDD
5Vin2 or 4 (5V power)Solder the IN-OUT jumper on the dev board
110 (GPIO 15 - RXD)
28 (GPIO 14 - TXD)

The ESP32 code

Github project repository

Nothing in the code or the hardware is specific to the ESP32 S3 variant. It just happens to be my go to ESP. It should be easy to modify the “.cargo/config.toml” and maybe some GPIO to target another variant (ESP32, C3, C6, etc.)

Setup the Environment

The ESP32-S3 has Xtensa cores which are not supported yet by the default Rust toolchain. So we need to install tools provided by Espressif to compile the project. More info

Installing the Raspberry Pi

The following steps are for a “Pi Zero W” or “Pi Zero 2 W” with a Raspberry Pi OS based on Debian Bookworm. As for the ESP variant, it shouldn’t be too difficult to use another version of the Raspberry if needed.

Step 1

: Prepare the SD-Card

Download Raspberry Pi imager on the official website

We are going for a headless and lite configuration of the Raspberry Pi (no screen, no keyboard, no desktop environment). Choose the lite version of the OS “Raspberry Pi OS Lite” 32-bit for the Zero and 64-bit for the Zero 2.

Pi imager - Choose OS

Then properly customise the settings in Pi Imager. Otherwise the Raspberry won’t connect to the WiFi and SSH will be disabled.

Pi imager - Customization General Pi imager - Customization Services

Step 2

: Connect to the Raspberry Pi

Be patient, the first boot is very, very slow (between 5 and 10 minutes on the Zero). Once the Pi is connected to the WiFi, we need to find its IP address. We can use the following command or go to the admin interface of the router.

ifconfig | grep broadcast | arp -a

...
weather-station.home (192.168.1.19) at b8:27:eb:9a:b5:ea on en1 ifscope [ethernet]
...

ssh [email protected]

We are now logged in the Pi.

Step 3

: Disable the Bluetooth

The Pi Zero W and Zero 2 have 2 UART. A shitty one and a good one. By default the good one is used for the Bluetooth but we need it. So we must change the configuration.

sudo nano /boot/firmware/config.txt

Add dtoverlay=disable-bt at the end of the file and save.

sudo systemctl disable hciuart

Step 4

: Disable the login console on the UART

sudo nano /boot/firmware/cmdline.txt

Delete console=serial0,115200 and save.

sudo systemctl disable hciuart
sudo reboot

Step 5

: Check if we receive data from the ESP [Optional]

Once the Pi has rebooted and everything is wired together, we can check if we receive data from the ESP on the serial port.

sudo apt update
sudo apt install tio
tio /dev/ttyAMA0
tio command screenshot

Step 6

: Install WeeWX

wget -qO - https://weewx.com/keys.html | \
    sudo gpg --dearmor --output /etc/apt/trusted.gpg.d/weewx.gpg
echo "deb [arch=all] https://weewx.com/apt/python3 buster main" | \
    sudo tee /etc/apt/sources.list.d/weewx.list
sudo apt update
sudo apt install weewx

For now, when asked for the weather station type, choose Simulator not Vantage.

Allow the weewx user to access the serial port by adding it to the dialout group.

sudo usermod -aG dialout weewx

Step 7

: Install the MeteoStick driver

The ESP emulates a MeteoStick device so we need to install an extension to WeeWX.

wget -O weewx-meteostick.zip https://github.com/matthewwall/weewx-meteostick/archive/master.zip
sudo weectl extension install weewx-meteostick.zip
sudo weectl station reconfigure

When asked to:

  • Choose a driver => select Meteostick
  • Specify the port => type /dev/ttyAMA0
  • Specify the type of the rain bucket => probably 0.2 mm per tip for a European station

We must restart WeeWX to enable our modifications.

sudo systemctl restart weewx

Wait a bit, and check for errors.

sudo systemctl status weewx

Step 8

: Install a Web Server

To access the WeeWX reports WeeWX we need to install a Web Server.

sudo apt install nginx

The reports are generated every 5 minutes, so we should wait a bit before seeing any data.

In the Web browser go to http://weather-station.local/weewx/ or http://192.168.1.19/weewx

WeeWX screenshot