Shelly Rolladenmotor system ohne WLan, nur BLE

Ich habe jetzt mein Rolladensystem basierend auf 6 Shelly 2PM Gen4 fast fertig und möchte hier die Erfahrung und ein Paar Tips teilen:

Die Grundidee war letztlich alles per BLE (Bluetooth low energy) zu steuern, so dass es auch tadenlos funktioniert, wenn es kein Internet und nicht mal ein Haus WLAN gibt.

Dafür habe ich mir neben den Shellys und Motoren (ohne Funk) zwei Shelly Wall Switch 4 besorgt.
Die gewünschte Funktionalität ist, dass man mit nur einem einzelnen click am Taster jeweils zwischen rauf, stopp, runter, stopp wechseln kann, wobei an den Endanschlägen nur umgedreht werden soll (also ohne stopp).

Dies ist letztlich gelungen, indem ich die selben Wall Swicht 4 gleichzeitig an mehreren Shelly 2PM Gen4 registriert habe. Das ist mir gelungen, indem ich (nach update der Switch über die “Shelly BLE Debug” app) mit die MAC adressen abgeschrieben habe und diese dann in den 2PM als BLE Wall Switch 4 eingetragen habe.

Dabei war zu beachten, dass man ca. 30 sek warten muss und das Menu mehrfach aufrufen muss und nach dem Eintragen mindestens einmal einen Taster drücken muss, damit Shelly die 4 Schalter “sieht”. Sonst ist es irgendwie unvollständig und man hat später nicht alle optionen im Aktions-Menu.

Dann erstellt man die Aktionen und wählt vor allem aus welcher Shelly 2PM auf genau welche Schalter-ID reagieren soll.

Um die Toggle Funktion zu ermöglichen bin ich letztlich bei einem Java Skript gelandet, dass genau diesen Toggle durchführen kann:

// Configuration
let ROLLER_ID = 0; // Use the only existing roller (ID 0)
let LAST_COMMAND = "open"; // start the whole thing with the "open" direction

// Query the status and initiation the action
function toggleRollerStatus() {
    Shelly.call("Cover.GetStatus", { id: ROLLER_ID }, function(result) {
        if (result && result.state) {
            handleRollerCommand(result.state);
        }
    });
}

// Main toggle logic
function handleRollerCommand(currentState) {
    let nextCommand = "";
    print("state is "+currentState)
    if (currentState === "open") {
        nextCommand = "close";
        LAST_COMMAND = "close";      
    }
    else if (currentState == "closed") {
        nextCommand = "open";
        LAST_COMMAND = "open";      
    }
    // If currently stopped, start movement:
    else if (currentState === "stopped") {
        if (LAST_COMMAND === "open") {
            // Next step: move down
            nextCommand = "close";
            LAST_COMMAND = "close";
        } else {
            // next step: move up
            nextCommand = "open";
            LAST_COMMAND = "open";
        }
    } 
    // If currently moving but not at the end: stop movement
    else {
        // Next stop: stop
        nextCommand = "stop";
        // LAST_COMMAND is not changed so the next step will start the movement
    }

    // execute the command now
    if (nextCommand !== "") {
        if (nextCommand == "open")
                Shelly.call("Cover.Open", {'id': 0});
        if (nextCommand == "close")
                Shelly.call("Cover.Close", {'id': 0});
        if (nextCommand == "stop")
                Shelly.call("Cover.Stop", {'id': 0});
    }
}
// Make sure to start the script after saving and also on reboot

Damit bewegt sich dann der Motor wie gewollt.

Bei den Aktionen habe ich dann das Skript über einen lokalen Skript Eval befehlt gestartet:

http://localhost/rpc/Script.Eval?id=1&code=toggleRollerStatus()”

Achtung: Das Skript muss hier unter der ID 1 gespeichert sein, sonst muss man das Kommandu natürlich abändern. Vielleicht gibt es da auch eine bessere Möglichkeit. Interessanterweis kann man so auch einen der Shelly 2PM Gen4 zu einer Art server machen, der dann über solche calls die Skript Evals an die diversen anderen Shellys (“localhost” durch die jeweilige IP ersetzen!) in seinem Subnetz schickt. Allerdings weiss ich noch nicht richtig, wie man deren IPs herausfindet.

Ich hoffe dieser Post ist Hilfreich für andere, die ähnliches vor haben. Ich habe noch nicht getestet, ob das mit “localhost” auch wirklich funktioniert wenn das WLAN weg ist oder sogar beide WLANs an den Shellies abgestellt sind. Vielleicht wage ich das später mal.

Durch das Zuweisen diverser Aktionen kann man nun recht einfach sowohl jeden Rollladen einzeln steuern, als auch sich selbst Scenen (“Nacht”, “Tag”) basteln, wobei dann mehrere Shelly 2PM gleichzeitig auf das BLE signal reagieren und z.B. in eine bestimmte Stellung fahren.

1 „Gefällt mir“

… es funktioniert auch super, wenn das WLan nicht da ist. Als nächstes will ich integrieren, dass das WLan bei 3-fach-click automatisch eingeschaltet wird und sonst aus ist.

hier ist noch das Skript (id: 2) mit dem dann ein accesspoint generiert wird.

function inactivateAccessPoint() {
  Shelly.call("wifi.setconfig",
    {
        config: { "ap": {"enable": false} }
    }
  );  
  print("AccessPoint disabled!")
}

// Check ip from status
function activateAccessPoint() {
  Shelly.call("wifi.setconfig",
    {
        config: { "ap": {"enable": true } }
    }
  );
  print("AccessPoint enabled!")
  // Start a timer to automatically deactivate the access point after 15 min
  Timer.set(10 * 60 * 1000, false, inactivateAccessPoint);  // 10 minutes in milliseconds
}

activateAccessPoint(); // Also temporarily acitvate the accesspoint after a reboot / cold start

Der Accesspoint wird generiert, wenn der Strom kurz weg war. Ausserdem habe ich es nur über “actions” mit dem langen click des Wall Switch 4 verbunden mit folgender Zeile:

http://localhost/rpc/Script.Eval?id=2&code=activateAccessPoint()

Hier ist noch eine Kurzanleitung, wie man einen Shelly Wall Switch 4 mit mehreren Shellys verbinden kann. Damit kann man dann sehr leicht Scenen (z.B. alle Rolladen runterfahren) durch drücken eines einzigen Knopfes realisieren, ohne dass die Shellies im Internet sein müssen oder miteinander reden müssen. WLAN, Accesspoint können komplett abgeschaltet sein, weil die Buttons nur senden und somit mit beliebig vielen Shellys gekoppelt werden können:

To integrate a shelly Button/Wall switch into several Shelly devices:
1.) Pair the device via the Shelly BLE Debug App (e.g. on your phone)
2.) Download and install new firmware as requested. 
3.) Write down MAC address (in small letters!) of the device. Do not unpair the device.
4.) Open the local Shelly Network (in my case: 2 sec press on already paired button or reboot via power cut[see posts above], or use the long press on the button on the Shelly itself)
5.) Activate WiFi (without pressing "save" as this would delete the previously set password!). This connects each Shelly to the main WiFi network, which is much more stable and buys you time for the configurations.
5.) Declare a new component via the shelly menu (use type "Shelly Wall Switch 4") via entering its MAC address
6.) Press any button on the device, which makes the interface recognize the device-capabilities.
7.) Add action(s) for button presses or battery low on the "actions" tab

One Wall Switch can be paired with multiple shellys in this way!