M-Bus Gateway
← Tilbage til blog
· Node-RED· MQTT· smarthome· integration· forbrugsdata· dashboard· automatisering· IoT

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

  1. Træk en mqtt in-node ind
  2. Server: 178.105.90.8, Port: 1883 (dev) / 8883 (prod med TLS)
  3. Brugernavn: gateway, Adgangskode: fra /etc/mbus-gateway/mqtt_password
  4. Topic: meters/GW-0001/data
  5. 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.