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.


š§ 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_recordtable.
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.
