M-Bus Gateway
← Tilbage til blog
· API· API-nøgle· integration· webhook· REST· tredjepart· automatisering· developer

API-nøgler og tredjeparts-integration — hvad kan du bygge?

M-Bus Gateway REST API: authentication med API-nøgler, tilgængelige endpoints, webhook-events, rate limiting, og eksempler på hvad du kan bygge med forbrugsdata.

Af M-Bus Gateway

M-Bus Gateway eksponerer et fuldt REST API til tredjeparts-integration. Her er hvad du kan gøre med API-nøgler — fra simpel dataeksport til realtids-automatisering.


API-nøgle-oprettelse

API-nøgler oprettes i portalen under Indstillinger → API-nøgler.

Navn: "e-conomic integration"
Rettigheder: read:readings, read:settlements
Udløb: 365 dage (eller ingen udløb)
IP-whitelist: 10.0.0.0/8 (valgfrit)

→ Genereret nøgle: mbk_live_AbCdEf1234567890...

Nøglen vises kun én gang — gem den sikkert.


Authentication

# Alle API-kald kræver Authorization-header:
curl https://api.mbus-gateway.dk/api/v1/readings \
  -H "Authorization: Bearer mbk_live_AbCdEf1234567890..."

# Eller som query parameter (ikke anbefalet):
curl "https://api.mbus-gateway.dk/api/v1/readings?api_key=mbk_live_..."

Nøgle-endpoints

Aflæsninger

# Seneste aflæsning pr. installation:
GET /api/v1/readings?property_id=EJD-001&limit=100

# Historik for én installation:
GET /api/v1/readings?meter_installation_id=MI-001&from=2025-01-01&to=2025-05-31

# Månedlig aggregering:
GET /api/v1/readings/monthly?property_id=EJD-001&year=2025

# Response:
{
  "data": [
    {
      "meter_installation_id": "MI-001",
      "unit_id": "U-3th",
      "address": "Eksempelvej 3, 3. th.",
      "meter_type": "hca",
      "timestamp": "2025-05-23T06:15:00Z",
      "value": 1847.3,
      "unit": "units",
      "battery_level_pct": 78,
      "rssi_dbm": -82
    }
  ],
  "total": 847,
  "page": 1
}

Afregninger

# Liste over årsafregninger:
GET /api/v1/settlements?property_id=EJD-001&status=sent

# Én afregning med alle linjer:
GET /api/v1/settlements/SET-2025-001

# OIOUBL-faktura:
GET /api/v1/settlements/SET-2025-001/oioubl
# → XML-fil download

# CSV-eksport:
GET /api/v1/export/readings?property_id=EJD-001&year=2025
# → CSV-fil download

Ejendomme og enheder

# Alle ejendomme:
GET /api/v1/properties

# Enheder i ejendom:
GET /api/v1/properties/EJD-001/units

# Aktive beboere:
GET /api/v1/properties/EJD-001/occupancies?active=true

Webhooks

Webhooks sender POST-requests til din URL ved hændelser:

# Registrér webhook:
POST /api/v1/webhooks
{
  "url": "https://din-server.dk/webhook/mbus",
  "events": ["settlement.sent", "reading.anomaly", "alarm.battery_low"],
  "secret": "din-hemmelighed"  # HMAC-SHA256 signatur
}

Tilgængelige events

EventTriggerPayload
settlement.sentAfregning udsendt til lejeresettlement_id, lines, period
reading.anomalyStuk/backwards/jump detekteretmeter_id, type, value
alarm.battery_lowBatteri under 20%meter_id, battery_pct
alarm.silentIngen aflæsning i 72tmeter_installation_id, last_seen
gateway.offlineGateway offline i 24tgateway_id, last_seen
mid.expiry_soonMID-certifikat udløber inden 6 mdr.meter_id, mid_expiry_date

Webhook-verifikation

import hmac, hashlib

def verify_webhook(payload: bytes, signature: str, secret: str) -> bool:
    expected = hmac.new(
        secret.encode(),
        payload,
        hashlib.sha256,
    ).hexdigest()
    return hmac.compare_digest(f"sha256={expected}", signature)

# I din Flask-route:
@app.route("/webhook/mbus", methods=["POST"])
def handle_webhook():
    sig = request.headers.get("X-MBus-Signature")
    if not verify_webhook(request.data, sig, WEBHOOK_SECRET):
        return "Unauthorized", 401
    data = request.json
    # Håndter event...

Rate limiting

PlanRate limit
Basis60 requests/minut
Pro300 requests/minut
Enterprise3.000 requests/minut
# Rate limit-headers i response:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 47
X-RateLimit-Reset: 1716505260

Hvad kan du bygge?

1. Realtids-dashboard i Power BI

# Power BI REST API push dataset:
import requests

readings = fetch_from_mbus_api("/api/v1/readings/monthly?property_id=EJD-001&year=2025")

for row in readings:
    requests.post(
        "https://api.powerbi.com/beta/.../datasets/.../rows",
        headers={"Authorization": f"Bearer {PBI_TOKEN}"},
        json={"rows": [{"unit": row["address"], "kWh": row["value_kwh"], "month": row["month"]}]},
    )

2. Automatisk bogføring i e-conomic

Se e-conomic integrations-guide.

3. Grafana-overvågning

# Grafana datasource via JSON API plugin:
url: https://api.mbus-gateway.dk/api/v1/readings
method: GET
headers:
  Authorization: Bearer ${MBUS_API_KEY}
params:
  property_id: EJD-001
  limit: 1000

4. Telegram-alarm ved batteri

import requests

def check_batteries():
    alarms = requests.get(
        "https://api.mbus-gateway.dk/api/v1/alarms?type=battery_low&resolved=false",
        headers={"Authorization": f"Bearer {API_KEY}"},
    ).json()

    for alarm in alarms["data"]:
        requests.post(
            f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage",
            json={
                "chat_id": CHAT_ID,
                "text": f"⚠️ Batteri lavt: {alarm['meter_id']} — {alarm['battery_pct']}%",
            },
        )

5. Automatisk á conto-regulering

# Hent anbefalede á conto fra API:
GET /api/v1/properties/EJD-001/a-conto-recommendations
# → [{unit_id, current_a_conto, recommended_a_conto, diff_pct}, ...]

# Send varslingsbrev automatisk via dit eget system

SDK-support

Officielle SDK'er er planlagt:

  • Python SDK (Q3 2026)
  • TypeScript/Node SDK (Q4 2026)
  • PHP SDK (Q1 2027)

Indtil da: Brug standard HTTP-biblioteker (requests, axios, Guzzle).


Konklusion

API'et eksponerer alle platformens kernedata: aflæsninger, afregninger, alarmer, ejendomme og beboere. Med webhooks kan du bygge realtids-automatiseringer uden polling. Rate limiting er generøst på Pro-planen (300 req/min). API-nøgler oprettes direkte i portalen.

Opret API-nøgle i portalen eller se fuld API-dokumentation.