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.