ESP32 weather station — parses 35-byte serial packets from Fine Offset sensor.
Low-cost weather stations like the Fine Offset WH1080 use proprietary 35-byte serial packet formats transmitted over 868 MHz RF. The sensor protocol is undocumented — there is no official specification for the byte layout, field encoding, or scaling factors.
Without understanding the packet structure, developers cannot interface these sensors with modern microcontrollers like the ESP32. The sensor data remains trapped inside the vendor's closed ecosystem — a USB dongle that only works with Windows software, preventing integration with IoT cloud platforms and open-source weather networks.
Reverse-engineering the 35-byte packet required capturing raw serial data over hundreds of transmission cycles, identifying field boundaries by correlating byte changes with known physical stimuli (heating the thermometer, spinning the anemometer, blocking the solar sensor), and validating the CRC-16 checksum algorithm through exhaustive search.
Each 35-byte packet is received via Serial UART at the ESP32. The parser validates the 0x55 sync byte, unpacks little-endian integer fields, applies scaling factors, verifies the CRC-16 checksum, and uploads decoded readings to Firebase Realtime Database every 5 minutes.
The system consists of a Fine Offset WH1080-compatible outdoor sensor array transmitting 35-byte packets over 868 MHz RF every 48 seconds. An RF receiver bridge connected to the ESP32's UART RX pin captures these packets as raw serial bytes.
The ESP32 parser validates the 0x55 sync byte, unpacks each field using little-endian byte ordering (uint8 for single-byte fields, uint16 for two-byte fields, int16 for signed temperature-derived values), applies the correct scaling factors (0.1°C for temperature, 0.1 m/s for wind, 0.3 mm/tip for rain, 0.1 hPa for pressure), and verifies the CRC-16 checksum before accepting a packet.
Validated readings are buffered and uploaded to Firebase Realtime Database every 5 minutes via Wi-Fi. The ESP32 runs on FreeRTOS with a dual-core architecture: Core 0 handles the UART receive and packet parsing, while Core 1 manages Wi-Fi connectivity and Firebase uploads.
7-day temperature (°c) timeline. Each bar represents a 3-hour interval decoded from the 35-byte serial packet. Hover for exact values.
Synthetic 7-day weather data simulating a tropical microclimate in East Java, Indonesia. All values derived from decoded 35-byte Fine Offset sensor packets.
The ESP32 parser successfully decodes all 19 fields from each 35-byte packet with zero CRC failures over the 7-day test period. Temperature ranged from 22.8°C to 32.5°C (tropical microclimate), humidity from 48% to 91%, wind speeds from calm (0.3 m/s) to moderate gusts (5.8 m/s), and solar radiation peaked at 960 W/m² on clear days.
The 48-second sensor sampling interval combined with 5-minute Firebase batching provides sufficient temporal resolution for microclimate monitoring while staying within Firebase's free-tier limits. The ESP32's deep-sleep mode between uploads achieves approximately 72 hours of runtime on a single 18650 cell.
The reverse-engineering process used a logic analyzer to capture raw UART waveforms from the RF receiver module. Byte sequences were logged over 10,000+ packet transmissions under controlled conditions: temperature was varied using a heat gun and ice pack, humidity with a humidifier, wind speed with a desk fan at known distances, and solar radiation by covering/uncovering the sensor under known irradiance conditions measured by a calibrated pyranometer.
Field boundaries were identified through differential analysis: comparing packets before and after a known physical change revealed which byte positions changed. Multi-byte fields were confirmed by checking for carry-over patterns (e.g., byte[4] increments when byte[5] rolls from 255 to 0, confirming a uint16 LE encoding). The CRC-16 polynomial was found through exhaustive search of common CRC polynomials, matched against known packet payloads.
Limitations: the 868 MHz RF link has a range of approximately 100 m line-of-sight, reduced to 30–40 m with walls. The sensor's 48-second update interval limits real-time wind gust detection. Fine Offset sensors are consumer-grade with ±1°C temperature accuracy and ±5% humidity accuracy — not suitable for scientific-grade meteorology but adequate for microclimate monitoring and IoT applications.
ESP32 weather station firmware — 35-byte packet parser, Firebase upload, deep-sleep power management.
github.com/sigitdanip/airfeelwsdev
Shares the same embedded instrumentation approach — low-cost microcontrollers for environmental sensing with open-source calibration.
ESP32 sensor platform with similar Firebase telemetry architecture and multi-sensor data pipeline.
Same ESP32 MCU, environmental sensor monitoring, and cloud-connected instrumentation philosophy.
Part of a series of ESP32-based instrumentation projects for environmental monitoring and embedded sensing. The 35-byte packet parser is reusable across any Fine Offset WH1080-compatible sensor, enabling low-cost weather data collection for IoT and citizen science.