Script-Time: Automatische Tasmota-Backups

Damit man es nie wieder vergisst ;-)

Script-Time: Automatische Tasmota-Backups
Photo by Mohammad Rahmani / Unsplash

Neulich fielen mehrere meiner Tasmota Geräte aus. Und wie es in so einem Fall immer ist, bedauert man, keine Backups zu haben.

Das soll mir nicht noch einmal passieren. Also fix ein Tool gebastelt, das einmal im Monat aufgerufen wird.

Kurzer Test

So sollte es aussehen:

./check_tasmota_backups
Scanne Netzwerk nach Tasmota-Geräten...

🔍 Prüfe 192.168.1.42 auf Tasmota...
🚫 192.168.1.42 ist kein Tasmota-Gerät.

🔍 Prüfe 192.168.1.44 auf Tasmota...
🚫 192.168.1.44 ist kein Tasmota-Gerät.

🔍 Prüfe 192.168.1.80 auf Tasmota...
✅ Tasmota-Gerät gefunden: 192.168.1.80
🌐 Hostname gefunden: rolougwztuer.meister.world
📂 Backup erfolgreich: /mnt/Backups/tasmota_backups/tasmota_rolougwztuer.meister.world.dmp

🔍 Prüfe 192.168.1.81 auf Tasmota...
✅ Tasmota-Gerät gefunden: 192.168.1.81
🌐 Hostname gefunden: roloegbad.meister.world
📂 Backup erfolgreich: /mnt/Backups/tasmota_backups/tasmota_roloegbad.meister.world.dmp

🔍 Prüfe 192.168.1.82 auf Tasmota...
✅ Tasmota-Gerät gefunden: 192.168.1.82
🌐 Hostname gefunden: roloegtoilette.meister.world
📂 Backup erfolgreich: /mnt/Backups/tasmota_backups/tasmota_roloegtoilette.meister.world.dmp

🔍 Prüfe 192.168.1.83 auf Tasmota...
✅ Tasmota-Gerät gefunden: 192.168.1.83
🌐 Hostname gefunden: roloegku.meister.world
📂 Backup erfolgreich: /mnt/Backups/tasmota_backups/tasmota_roloegku.meister.world.dmp
...

Sieht gut aus. Nun kann es in die /etc/crontab integriert werden.

Automatischer Start

Damit michael jeden Monat um 8:30 die Backups anfertigt, füge ich der /etc/crontab folgenden Eintrag hinzu:

30   8   1   *   *  michael  nice -n 19 /usr/local/bin/check_tasmota_backups > /dev/null 2>&1

Jetzt sollte ich mich darum nicht mehr kümmern müssen 😀.

Voraussetzung

Damit das Script funktioniert, benötigt man nmap und decode-config. Python3 und curl ist in den meisten Linux-Distributionen bereits enthalten.

Das Script

#!/bin/bash

# Einstellungen
NETZWERK="192.168.1.0/24"
BACKUP_DIR="/mnt/Backups/tasmota_backups/tasmota_backups"
DECODE_SCRIPT="/opt/decode-config.py"

# Sicherstellen, dass das Backup-Verzeichnis existiert
mkdir -p "$BACKUP_DIR"

echo "Scanne Netzwerk nach Tasmota-Geräten..."
# Suche nach Geräten mit Port 80 offen
HOSTS=$(nmap -p 80 --open -oG - "$NETZWERK" | awk '/Up$/{print $2}')

if [[ -z "$HOSTS" ]]; then
    echo "Keine Geräte mit Port 80 gefunden!"
    exit 1
fi

# Backup der Tasmota-Geräte
for IP in $HOSTS; do
    echo
    echo "🔍 Prüfe $IP auf Tasmota..."

    # Rufe die Webseite des Geräts ab und prüfe auf "Tasmota"
    if curl -m 3 -s "http://$IP" | grep -qi "Tasmota"; then
        echo "✅ Tasmota-Gerät gefunden: $IP"

        # Hostnamen per DNS auflösen
        HOSTNAME=$(nslookup "$IP" | awk -F'= ' '/name/ {print $2}' | sed 's/\.$//' )

        # Falls kein Hostname gefunden wird, nutze die IP als Fallback
        if [[ -z "$HOSTNAME" ]]; then
            echo "⚠ Kein Hostname für $IP gefunden, verwende IP als Name."
            HOSTNAME="$IP"
        else
            echo "🌐 Hostname gefunden: $HOSTNAME"
        fi

        BACKUP_FILE="$BACKUP_DIR/tasmota_${HOSTNAME}.dmp"

        # Führe das Backup mit decode-config.py aus
        python3 "$DECODE_SCRIPT" -t dmp -o "$BACKUP_FILE" -s "$IP" > /dev/null 2>&1

        # Überprüfen, ob das Backup erfolgreich war
        if [[ -s "$BACKUP_FILE" ]]; then
            echo "📂 Backup erfolgreich: $BACKUP_FILE"
        else
            echo "⚠ Fehler: Kein gültiges Backup von $IP erhalten."
            rm -f "$BACKUP_FILE"
        fi
    else
        echo "🚫 $IP ist kein Tasmota-Gerät."
    fi
done

echo "✅ Backup abgeschlossen. Dateien gespeichert in $BACKUP_DIR"

Fazit

Natürlich bemerkt man den Mangel erst, wenn es zu spät ist. Aber besser spät als nie. Diese Zeit hätte ich besser nutzen können...