# Linux - MQTT

# MQTT - Retained Message

Diese Anleitung erklärt kurz, was **retained messages** sind, wie du eine retained Nachricht gezielt **löschen** kannst, und was es mit der **LWT** (Last Will and Testament) auf sich hat.

---

## Was ist eine retained message?

Eine retained message ist die *zuletzt veröffentlichte* Nachricht einer Topic, die der Broker speichert und **sofort** an neue Subscriber ausliefert, sobald sie das Topic abonnieren. Das ist praktisch für Statuswerte (z. B. „online“), kann aber zu unerwünschtem Verhalten führen, wenn versehentlich ein Steuerbefehl mit `retain` veröffentlicht wurde.

> **Symptom:** Du abonnierst ein Topic und ein alter Befehl wird sofort wieder angewendet – obwohl niemand gerade etwas sendet. Das ist fast immer eine retained message.

---

## Retained message löschen

Löschen geht, indem du auf **genau dieselbe Topic** eine **leere Payload** mit **gesetztem Retain-Flag** veröffentlichst.

### Beispiel (Mosquitto-Tools)

```
# -r = retained publish, -n = empty payload
mosquitto_pub -h <broker> -t 'dein/topic' -r -n

# mit Benutzer/Passwort:
mosquitto_pub -h <broker> -u <user> -P <pass> -t 'dein/topic' -r -n

# mit TLS (falls benötigt), Zertifikat prüfen:
mosquitto_pub -h <broker> -p 8883 --capath /etc/ssl/certs -t 'dein/topic' -r -n

```

- Wildcards (`+`, `#`) funktionieren hier **nicht**. Es muss exakt dieselbe Topic sein.
- Nach dem Löschen erhalten neue Subscriber beim ersten Abo **keine** alte Nachricht mehr (bis wieder retained gepublished wird).

---

## Retained Nachrichten prüfen / sichtbar machen

Beim Abonnieren sendet der Broker retained Nachrichten sofort. So siehst du, ob noch eine da ist:

```
# zeigt auch retained beim Start
mosquitto_sub -v -h <broker> -t 'dein/topic'

# retained unterdrücken (nur Live-Nachrichten)
mosquitto_sub -v -h <broker> -t 'dein/topic' -R

```

---

## Vermeiden, dass es wieder passiert

- Beim Senden **kein** Retain-Flag setzen (bei `mosquitto_pub` also **ohne** `-r`).
- In deinem MQTT-Client die Option „retain“ bzw. „Retained Message“ deaktivieren, sofern nicht bewusst benötigt.
- Für Statuswerte (z. B. Sensorzustände) ist *retain* okay; für *Steuerbefehle* (z. B. „schalte an“) meist **nicht**.

---

## Unterscheidung: Retained vs. LWT (Last Will and Testament)

Die **LWT** ist eine Nachricht, die der Broker automatisch sendet, wenn ein Client unerwartet die Verbindung verliert. Sie kann optional ebenfalls retained sein.

- **Löschen einer bereits veröffentlichten LWT (falls retained):** Genau wie oben – leere retained Payload auf die LWT-Topic publishen.
- **Verhindern künftiger LWT-Nachrichten:** Im Client die LWT-Konfiguration anpassen oder Verbindungen sauber schließen; außerdem LWT ohne `retain` konfigurieren, wenn sie nicht persistieren soll.

---

## Häufige Fehler

- **Falsche Topic:** Die Löschung wirkt nur auf exakt dieselbe Topic.
- **Ohne Retain gelöscht:** Eine leere *nicht-retained* Nachricht löscht nichts.
- **Mehrere Quellen:** Ein anderes System veröffentlicht die Nachricht erneut retained. Ursache identifizieren und dort das Retain-Flag entfernen.

---

## Kurze Checkliste

1. `mosquitto_sub` starten und prüfen, ob beim Abo sofort eine Nachricht kommt.
2. Mit `mosquitto_pub -r -n` auf die *exakte* Topic leere Payload senden.
3. Nochmals abonnieren und verifizieren, dass nichts retained kommt.
4. In Sender-Clients Retain-Flag für Steuer-Themen deaktivieren.

---

## Beispiele mit Platzhaltern

```
# Platzhalter ersetzen:
# <broker> = Hostname/IP des Brokers
# <user> / <pass> = Zugangsdaten (falls gesetzt)
# 'dein/topic' = exakte Topic der alten retained Nachricht

mosquitto_pub -h mqtt.example.lan -u haus -P geheim -t 'haus/wohnzimmer/licht/set' -r -n
mosquitto_sub -v -h mqtt.example.lan -t 'haus/wohnzimmer/licht/set'

```

**Sicherheit:** Nutze nach Möglichkeit TLS am Broker (Port 8883) und Accounts mit eng zugeschnittenen Berechtigungen (*ACLs*), damit nicht versehentlich auf falsche Topics geschrieben wird.