MQTT
Broker
| Host | mqtt.finishing2026.sw2e-lab.de:11883 |
| Auth | Passwort-basiert, kein Anonymous |
| Backend-User | backend — Vollzugriff |
| ESP-User | esp_device (geteilt) — Client-ID = MAC |
Topics
| Topic | Richtung | Retained | Beschreibung |
|---|---|---|---|
devices/register |
ESP → Backend | Nein | Thing Model bei Boot |
devices/{mac}/telemetry |
ESP → Backend | Nein | Sensordaten |
devices/{mac}/status |
ESP → Backend | Ja | online / offline, LWT = offline |
devices/{mac}/command |
Backend → ESP | Nein | Commands (via REST ausgelöst) |
{mac} = MAC-Adresse des ESP (AA:BB:CC:DD:EE:FF).
ACL (Mosquitto)
ESP-Geräte nutzen esp_device als Username und ihre MAC als MQTT-Client-ID. %c im ACL-Pattern wird zur Client-ID — so kann jeder ESP nur seine eigenen Topics beschreiben und lesen.
user backend
topic readwrite #
user esp_device
topic write devices/register
pattern write devices/%c/telemetry
pattern read devices/%c/command/#
pattern write devices/%c/status
user gateway
topic write devices/register
topic write devices/+/telemetry
topic write devices/+/status
topic read devices/+/command
Payloads
Registration (devices/register)
{
"device_id": "motor-poc-01",
"mac": "AA:BB:CC:DD:EE:FF",
"metadata": { "label": "Motor PoC", "category": "Motor" },
"capabilities": [
{ "id": "power", "type": "ON_OFF", "label": "Motor", "direction": "both" },
{ "id": "speed", "type": "NUMBER", "label": "Geschwindigkeit",
"direction": "both", "min": 0, "max": 255, "unit": "PWM" }
],
"state": { "power": "OFF", "speed": 180 }
}
Das Backend generiert beim ersten Empfang eine UUID und legt den Gerätedatensatz an. Bei erneutem Boot wird der Datensatz per UPSERT (Konflikt auf mac) aktualisiert.
Telemetry (devices/{mac}/telemetry)
{
"timestamp": "2026-05-13T10:00:00.000Z",
"data": { "power": "ON", "speed": 200, "solar_v": 2.1 }
}
timestamp ist optional — fällt er weg, setzt das Backend die Serverzeit. data akzeptiert beliebige Key-Value-Paare.
Status (devices/{mac}/status)
{ "status": "online" }
Retained. LWT publiziert { "status": "offline" } bei unerwartetem Verbindungsabbruch.
Command (devices/{mac}/command)
{
"command_id": "550e8400-e29b-41d4-a716-446655440000",
"capability": "power",
"value": "ON",
"timestamp": "2026-05-13T10:00:00.000Z"
}
Wird vom Backend publiziert wenn POST /api/v1/devices/:uuid/command aufgerufen wird. Das Backend löst uuid → mac auf und published auf dem korrekten Topic.
ESP-Verbindung (Arduino/PlatformIO)
const char* MQTT_USER = "esp_device";
const char* MQTT_PASS = "...";
String MAC_ADDR; // nach WiFi.begin() befüllen
// Topics nach MAC aufbauen
snprintf(TOPIC_TELEM, sizeof(TOPIC_TELEM), "devices/%s/telemetry", MAC_ADDR.c_str());
// Verbinden: client_id = MAC, username = esp_device
mqtt.connect(MAC_ADDR.c_str(), MQTT_USER, MQTT_PASS, TOPIC_STATUS, 0, true, lwt_payload);