Node-RED og MQTT — forbrugsdata til dit smarthome
Integrer wM-Bus forbrugsdata fra M-Bus Gateway med Node-RED via MQTT. Konfiguration, flow-eksempler, dashboard og alarmrouting til Telegram, email og Home Assistant.
Af M-Bus Gateway
Node-RED er en populær low-code automatiseringsplatform. Med M-Bus Gateway kan du subscribere på MQTT og bygge dashboards, alarmer og automationer direkte i Node-RED.
MQTT topic-struktur fra M-Bus Gateway
meters/{gateway_id}/data ← Daglig payload (alle målere)
meters/{gateway_id}/status ← Heartbeat hvert 5. min
meters/{gateway_id}/alarm ← Alarm-events (JSON)
Payload-format (data topic):
{
"gateway_id": "GW-0001",
"timestamp": "2026-05-23T06:00:00Z",
"readings": [
{
"meter_id": "12345678",
"type": "heat",
"value": 4567.89,
"unit": "kWh",
"rssi_dbm": -78,
"battery_level_pct": 82
},
{
"meter_id": "87654321",
"type": "water_cold",
"value": 234.56,
"unit": "m3"
}
]
}
Node-RED installation og MQTT-konfiguration
# Installer Node-RED (via npm):
sudo npm install -g --unsafe-perm node-red
# Start:
node-red
# Tilgå UI: http://localhost:1880
MQTT-broker konfiguration i Node-RED
- Træk en
mqtt in-node ind - Server:
178.105.90.8, Port:1883(dev) /8883(prod med TLS) - Brugernavn:
gateway, Adgangskode: fra/etc/mbus-gateway/mqtt_password - Topic:
meters/GW-0001/data - Output: Parsed JSON object
Grundlæggende flow: Parse og gem aflæsninger
[
{
"id": "mqtt_in_1",
"type": "mqtt in",
"topic": "meters/+/data",
"broker": "broker_1",
"datatype": "json"
},
{
"id": "parse_readings",
"type": "function",
"func": "
const payload = msg.payload;\n
const readings = payload.readings || [];\n
const out = readings.map(r => ({\n
topic: `meter/${r.meter_id}/${r.type}`,\n
payload: { value: r.value, unit: r.unit, ts: payload.timestamp }\n
}));\n
return [out];\n
"
}
]
Node-RED Dashboard — forbrug i realtid
Installer node-red-dashboard:
cd ~/.node-red && npm install node-red-dashboard
Flow: Varmemåler-gauge:
[mqtt in] → [function: extract heat] → [ui_gauge]
→ [ui_chart]
Function-node (extract heat):
const readings = msg.payload.readings || []
const heat = readings.find(r => r.type === 'heat')
if (heat) {
msg.payload = heat.value
msg.topic = `Varme — ${heat.meter_id}`
}
return msg
Gauge-konfiguration:
- Type: Gauge
- Label: Samlet varme
- Value format:
{{msg.payload}} kWh - Range: 0–100000
Alarm-routing til Telegram
Installer node-red-contrib-telegrambot:
// Function-node: formater alarm til Telegram
const alarm = msg.payload
const text = `⚠️ Alarm fra gateway ${alarm.gateway_id}\n` +
`Måler: ${alarm.meter_id}\n` +
`Type: ${alarm.alarm_type}\n` +
`Tid: ${new Date(alarm.timestamp).toLocaleString('da-DK')}`
msg.payload = { chatId: CHAT_ID, type: 'message', content: text }
return msg
Topic: meters/+/alarm → [function: formater] → [telegram sender]
Integration med Home Assistant via MQTT
Node-RED kan sende forbrugsdata til Home Assistant via MQTT Discovery:
// Function-node: MQTT Discovery auto-config
const meter = msg.payload.readings[0]
const config = {
unique_id: `mbus_${meter.meter_id}`,
name: `M-Bus ${meter.type} ${meter.meter_id}`,
state_topic: `homeassistant/sensor/mbus_${meter.meter_id}/state`,
unit_of_measurement: meter.unit,
device_class: meter.type === 'heat' ? 'energy' : 'water',
state_class: 'total_increasing'
}
// Send config til homeassistant/sensor/mbus_{id}/config
// Send state til homeassistant/sensor/mbus_{id}/state
Daglig rapport via email
// Function-node: Generer daglig rapport
const readings = msg.payload.readings
const heatTotal = readings.filter(r => r.type === 'heat')
.reduce((sum, r) => sum + r.value, 0)
const waterTotal = readings.filter(r => r.type === 'water_cold')
.reduce((sum, r) => sum + r.value, 0)
msg.payload = {
to: 'admin@min-ejendom.dk',
subject: `M-Bus daglig rapport ${new Date().toLocaleDateString('da-DK')}`,
body: `Varme total: ${heatTotal.toLocaleString('da-DK')} kWh\n` +
`Vand total: ${waterTotal.toLocaleString('da-DK')} m³\n` +
`Antal m��lere: ${readings.length}`
}
return msg
Trigger: [inject node] kl. 06:30 → [function: rapport] → [email node]
REST API polling (alternativ til MQTT)
Hvis MQTT ikke er tilgængeligt:
// HTTP Request-node polling
msg.url = 'http://178.105.90.8:8000/api/v1/readings/latest'
msg.headers = { Authorization: `Bearer ${process.env.API_KEY}` }
return msg
Trigger: [inject: repeat every 1 hour] → [http request] → [parse] → [dashboard]
Datasikkerhed
Vær opmærksom på:
- MQTT-adgangskode er personhenførbar gateway-credentials — brug dedikerede read-only API-nøgler
- Persondata (lejerens forbrug) må ikke eksponeres til tredjeparts-services uden databehandleraftale
- Node-RED-instansen bør kun tilgås lokalt eller via VPN
Konklusion
Node-RED giver dig fuld fleksibilitet til at route, transformere og visualisere M-Bus forbrugsdata. Start med et simpelt MQTT-subscribe-flow og byg gradvist dashboards, alarmer og integrationer med andre smarthome-systemer.
Se REST API dokumentation eller kontakt os for integration-support.