Wer mehrere Backup-Schichten betreibt, kennt das Problem: Man muss sich in PBS, DSM und andere Oberflächen einloggen, um zu prüfen ob die nächtlichen Backups erfolgreich durchgelaufen sind. Der HA Backup Monitor löst das — alle Jobs auf einen Blick direkt in Home Assistant.

Zwei Backup-Schichten, eine Übersicht
Die Heiminfrastruktur sichert sich auf zwei unabhängigen Wegen:
| Schicht | Tool | Was wird gesichert | Ziel |
|---|---|---|---|
| VM-Backups | Proxmox Backup Server (PBS) | VMs und Container (~120 GB) | Synology NAS |
| NAS-Backups | Synology Hyper Backup | NAS-Daten | Hetzner B2 / Synology C2 |
Bisher: manuelle Kontrolle durch Einloggen in PBS-Weboberfläche oder DSM. Jetzt: ein MQTT-Topic, eine HA-Karte, fertig.
Architektur
Ein Python-Skript läuft stündlich via DSM Task Scheduler auf der Synology. Es fragt beide APIs ab, baut eine HTML-Tabelle und publiziert alles als einzigen JSON-Payload an MQTT:
Synology NAS
├── DSM WebAPI (localhost:5000) → Hyper Backup Tasks + Versionen + Größen
└── PBS Docker (localhost:8007) → Backup-Tasks + Snapshot-Größen
└── Python-Skript (stündlich)
└── paho-mqtt → Mosquitto in HA
└── sensor.backup_status → Template-Sensoren → Lovelace-Karte
Die Karte in Home Assistant besteht nur aus einem Markdown-Block:
type: markdown
content: "{ state_attr('sensor.backup_status', 'table') }"
Die HTML-Tabelle wird vollständig im Skript vorberechnet und als Attribut mitpubliziert — kein Jinja2-For-Loop, kein Markdown/HTML-Konflikt.
Technische Stolpersteine
PBS: Session-Auth statt API-Token
Der PBS-API-Token gibt auf dem Node-Endpoint einen 403 zurück wenn er von der Synology (localhost) aus aufgerufen wird. Session-Auth mit Username/Passwort funktioniert dagegen problemlos — und wird nur lokal verwendet, verlässt die Synology also nie.
share:rsync — API-Limitation
Hyper-Backup-Tasks vom Typ share:rsync liefern über die DSM WebAPI dauerhaft nur Minimal-Felder (timestamp, version_id) — kein Status, keine Dauer, keine Größe. Das ist eine Synology-API-Limitation, nicht behebbar ohne Job-Umbau. Diese Tasks werden als ❓ angezeigt und zählen nicht als Fehler.
Schriftgröße in der HA Markdown-Karte
Home Assistants Markdown-Karte entfernt alle style-Attribute (DOMPurify). font-size im <table style="..."> hat keine Wirkung. Lösung: verschachtelte <small>-Tags direkt im Zellinhalt — konfigurierbar über TABLE_SMALL_DEPTH im Skript (Standard: 2 Ebenen ≈ 69%, passt auf Mobile).
Status-Icons
| Icon | Bedeutung |
|---|---|
| ✅ | Backup erfolgreich abgeschlossen |
| ❌ | Backup fehlgeschlagen |
| ⏳ | Backup läuft gerade |
| ❓ | Kein Status verfügbar (share:rsync — API-Limitation) |
Konfiguration
Das Skript hat einen kompakten Konfigurationsblock oben:
DSM_USER = "..." # DSM-User mit Hyper-Backup-Lesezugriff
DSM_PASS = "..."
PBS_USER = "admin@pbs"
PBS_PASS = "..."
PBS_NODE = "..." # Node-ID aus PBS-UI
MQTT_HOST = "..." # Home-Assistant-IP
MQTT_USER = "..."
MQTT_PASS = "..."
LOOKBACK_DAYS = 3 # wie viele Tage zurück PBS-Tasks suchen
DAILY_CUTOFF = 7 # Hyper-Tasks: ignorieren wenn letzter Run älter als X Tage
TABLE_SMALL_DEPTH = 2 # Schriftgrösse: Anzahl <small>-Ebenen
DEBUG_FILE = "" # "" = kein Debug, sonst Pfad zur JSON-Datei
Der vollständige Code und die HA-Konfigurationsdateien sind auf GitHub verfügbar:
