Shelly Gen 3 + Loxone – Fallback bei Miniserver-Ausfall

Hinweis zur Nutzung von Skripten (für Nutzer)

Die Verwendung von Skripten erfolgt ausdrücklich auf eigene Gefahr. Weder Shelly noch die jeweiligen Autoren oder Entwickler der Skripte übernehmen irgendeine Form der Haftung für mögliche Schäden, Fehlfunktionen, Datenverluste oder anderweitige Beeinträchtigungen, die durch die Nutzung dieser Skripte entstehen könnten. Bitte stellen Sie vor dem Einsatz sicher, dass Sie den Quellcode verstehen und sich der möglichen Auswirkungen bewusst sind. Die Skripte werden ohne Gewähr bereitgestellt und unterliegen keiner regelmäßigen Wartung oder offiziellen Unterstützung.


Hinweis für Entwickler

Wenn Sie eigene Skripte bereitstellen, achten Sie bitte darauf, eine klare Beschreibung, eventuelle Einschränkungen und Sicherheitsaspekte zu dokumentieren. Beachten Sie zudem, dass Nutzer Ihre Skripte grundsätzlich auf eigenes Risiko verwenden. Eine Haftung für Schäden ist ausgeschlossen, sofern diese nicht vorsätzlich oder grob fahrlässig verursacht wurden oder gesetzlich anderweitig geregelt ist.

  • Guten Tag zusammen,

    ich habe eine Frage an euch und hoffe, dass mir jemand weiterhelfen kann. Vermutlich wurde das Thema schon einmal behandelt, allerdings habe ich bisher keine passende Lösung gefunden.

    In meiner Wohnung sind zahlreiche Shelly Gen 3 Geräte im Einsatz (u. a. Shelly Dimmer Gen 3 und Shelly 1 Gen 3), die erfolgreich mit Loxone Miniserver kommunizieren.

    Die Umsetzung ist so, dass die Eingänge der Shelly-Geräte nicht direkt mit den Ausgängen gekoppelt sind, sondern stattdessen per UDP Signale an den Miniserver senden. Dieser übernimmt dann die Logik und schaltet die entsprechenden Aktoren bzw. Dimmer. Das funktioniert im Normalbetrieb einwandfrei.

    Allerdings habe ich folgendes Problem:

    Sobald der Miniserver (oder das WLAN) nicht erreichbar ist, kann ich kein Licht mehr schalten, da die direkte Kopplung zwischen Eingang und Ausgang fehlt.

    Meine Idee wäre daher eine Art Fallback-Mechanismus:

    Solange der Miniserver erreichbar ist → normale Steuerung über Loxone

    Wenn der Miniserver nicht erreichbar ist → automatische lokale Kopplung von Eingang und Ausgang im Shelly

    Sobald der Miniserver wieder verfügbar ist → Rückkehr zum normalen Betrieb

    Meine Frage: Gibt es eine Möglichkeit (z. B. per Script, Szenen oder Geräteeinstellungen), so eine Logik umzusetzen?

    Oder hat jemand bereits eine ähnliche Lösung realisiert?

    Vielen Dank im Voraus für eure Unterstützung!

    Mit freundlichen Grüßen

  • Also "Szenen" gehen sicher nicht - diese sind ja Cloud-gebunden

    Ich weiß zwar nicht genau wie Shelly mit der Loxone-Steuerung kommuniziert => aber wenn das wirklich per UDP ist => "weiß" dann der Shelly überhaupt ob die Gegenstelle noch aktiv ist? Man müsste zyklisch jeden Shelly pollen um ein "Timeout" realisieren zu können - dies scheint eine relativ komplizierte Implementierung zu werden.

    Ich verwende bei mir Home Assistant in einer VM - und diese wird des öfteren mal absichtlich und unabsichtlich "deaktiviert".
    => Ich habe bei mir von Anfang an die Device verfolgt: Bei Ausfall der Steuereinheit (=> HA) müssen die lokalen Funktionen weiterlaufen

    Also meine Frage:
    Wenn dein "Fallback" auch funktioniert => warum lässt du dann nicht standardmäßig den "Fallback" aktiv (Input => Output) und lässt die Steuerung nur parallel laufen für "höhere Funktionen"?

    Verwendung wenn möglich von Off-Cloud-Geräten wie Shelly (Cover, H&T, ...), NUOS Tasmota, Velux, Nuki, Ecowitt (Weatherstation), aber auch Cloud-Geräten wie Anker Solix (BKW), Husquarna (Rasenmäherroboter) und Roborock (Staubsaugerroboter).
    Alles zentral gesteuert durch Home Assistant.

  • Die Shelly Geräte werden in dieser Konstellation über UDP von Loxone ausgelesen, während die Ansteuerung der Aktoren über HTTP-Befehle erfolgt. Diese Kommunikationsstruktur hat sich in der Praxis als stabil und zuverlässig erwiesen.

    Im Hinblick auf ein mögliches Ausfallszenario der zentralen Steuerung habe ich mich ebenfalls intensiv mit dem Thema beschäftigt. Dabei konnte ich ein entsprechendes Script implementieren, welches im Fehlerfall zuverlässig greift und die Funktionalität sicherstellt.

    Grundsätzlich ist dein Ansatz hinsichtlich eines permanent aktiven Fallback-Betriebs absolut nachvollziehbar. In meinem Fall wird die Logik jedoch bewusst so umgesetzt, dass die zentrale Steuerung priorisiert arbeitet und der Fallback gezielt nur im Störfall aktiv wird, um ungewollte Parallelzustände oder Konflikte in der Logik zu vermeiden.

  • let MINISERVER_IP = "---------";
    let CHECK_INTERVAL = 20000;
    let failCount = 0;
    let threshold = 3;
    let currentMode = "unknown";

    function setShellyMode(mode) {
    if (currentMode === mode) return;

    // Bei Gen 3 Button/Taster-Konfiguration nutzen wir 'Input.SetConfig'
    // mode ist hier entweder 'detached' oder 'momentary'
    Shelly.call("Input.SetConfig", {
    id: 0,
    config: {
    type: "button", // Sicherstellen, dass es als Taster erkannt wird
    enable: true,
    invert: false
    }
    });

    // Der entscheidende Befehl für die Trennung/Kopplung beim Taster
    Shelly.call("Switch.SetConfig", {
    id: 0,
    config: {
    in_mode: mode
    }
    }, function(res, error_code, error_msg) {
    if (error_code === 0) {
    currentMode = mode;
    print("Taster-Modus erfolgreich geändert auf:", mode);
    } else {
    print("Fehler beim Umstellen:", error_msg);
    }
    });
    }

    function checkLoxone() {
    Shelly.call("HTTP.GET", { url: "http://" + MINISERVER_IP + "/dev/sps/ping", timeout: 3 },
    function(res, error_code) {
    if (error_code === 0) {
    // Loxone erreichbar -> Taster vom Relais trennen
    if (failCount >= threshold || currentMode !== "detached") {
    setShellyMode("detached");
    }
    failCount = 0;
    } else {
    // Loxone offline -> Taster direkt mit Relais koppeln
    failCount++;
    print("Miniserver offline. Fail-Count:", failCount);
    if (failCount >= threshold && currentMode !== "momentary") {
    setShellyMode("momentary");
    }
    }
    }
    );
    }

    Timer.set(CHECK_INTERVAL, true, checkLoxone);
    print("Taster-Fallback-Script gestartet...");
    checkLoxone();

  • Bitte zur besseren Lesbarkeit Skripte in einen Code-Block einfügen

    Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen.

    Sonst passieren komische Dinge:

    Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen.

    Mehrere PRO 3EM im Einsatz