How to build a private weather monitoring system based on Raspberry Pi, RTL-SDR, MQTT, and NestJS that receives data from 433 MHz sensors and displays it in Grafana.

From Raw Radio Signals to Elegant Grafana Dashboards

At some point, checking the weather in an app stopped being enough. I wanted to know the temperature on the balcony—not from some cloud-based API, but from my own sensors, working in real time. That’s how the idea for a fully private weather monitoring system was born.

šŸ“” 1. Capturing Signals from the Air

The foundation of this project is the RTL-SDR dongle—a small radio receiver capable of intercepting transmissions from cheap 433 MHz sensors. With the help of rtl_433, I transformed raw radio signals into readable JSON data. This is the moment when ā€œradio magicā€ becomes actionable data.

dongle RTL-SDR + raspberry-pi

forecast sensors 433 MHz

šŸ”§ 2. Smart Filter: Only My Sensors, Only What Matters

I didn’t want noise in the system. That’s why I created bridge.js—a small, clever Node.js script that:

  • Recognizes only my sensors (by model and ID),

  • Maps them to friendly names: kitchen, balcony, garden,

  • Converts temperature from °F to °C,

  • Publishes clean, standardized data to MQTT (weather/<name>),

  • Records the timestamp of the last signal,

  • Sends notifications when a sensor’s battery starts dying.

This isn’t just a filter—it’s my private ā€œweather intelligence layer.ā€

🧠 3. A Backend That Understands Data

Next, the data flows into a NestJS-based backend. I built a custom MQTT client that:

  • Subscribes to weather/#,

  • Receives ready-to-use JSON data from bridge.js,

  • Updates a cache of recent readings,

  • Aggregates data and stores it in PostgreSQL.

The backend doesn’t need to know about radio protocols or sensor models. It receives clean, standardized data—and does what it does best.

šŸ—„ļø 4. Weather History in PostgreSQL

Each sensor generates multiple readings per minute. Instead of storing everything, the backend:

  • Buffers the data,

  • Calculates averages,

  • Saves elegant records to the weather_record table.

This keeps the database lightweight, fast, and ready for analysis.

šŸ“Š 5. Real-Time Weather in My Home

Finally, everything lands in Grafana, where I created a set of dashboards:

  • Temperature charts segmented by sensor,

  • Humidity over time,

  • A diagnostic panel (battery status, last signal),

  • A quick view of recent values.

This isn’t just a chart—it’s my private ā€œweather center,ā€ running 24/7.

šŸŽÆ Final Result

I built a system that:

  • Receives radio signals from 433 MHz sensors,

  • Filters and normalizes the data,

  • Publishes it to MQTT,

  • Aggregates and stores it in the backend,

  • Displays it beautifully in Grafana.

Zero cloud. Zero vendor lock-in. Everything runs locally, quickly, and exactly how I want.