Johnny Kasuppke
Mein derzeit genutztes Skript ist für dein Ziel zu komplex. Ich will für dein Ziel ein Versuchs-Skript zusammenstellen und dies dann in diesem Beitrag ergänzen. Bis dahin ...
Johnny Kasuppke
Hier nun ein Skript, welches du nur geringfügig in der Konfiguration anzupassen brauchst. Das Skript ist in dieser Version nicht für die alten Shelly 2.5 geeignet. Wenn diese Kompatibilität gewünscht sein sollte, müsste ich das Skript dafür etwas umgestalten.
Entscheidend für das gewünschte Verhalten ist der Inhalt der Variablen (Struktur) "Config". Ich habe hier die Montage des i4 mit den Anschlussklemmen nach unten vorausgesetzt. Dann besitzen die Tastenanschlüsse folgende Id-Werte.
oben rechts: 0, oben links: 1, unten links: 2, unten rechts: 3
Jeder Taste ist ein Eintrag (Zeile) in Config zugeordnet, mit Id=0 beginnend (erste Zeile) und Id=3 endend (letzte Zeile). Nur wenn zwischen den eckigen Klammern hinter methods: etwas steht, wird der korrespondierende Tastendruck verarbeitet. Lasse dich nicht von den vielen id verwirren. Sie haben etwas unterschiedliche Aufgaben. Ich nutze aber lieber die Terminologie der Shelly API Dokumentation als mir neue Bezeichnungen aufzuzwingen.
Normalerweise wirst du die beiden IP Adressen hinter ip_addr: abändern müssen. Hier habe ich bewusst in jeder Zeile eine eigene IP Adresse vorgesehen, damit das Skript auch für andere Dinge relativ leicht anpassbar ist. Diese IP Adresse bezieht sich immer auf den Aktor, hier ein Shelly Plus 2PM im Cover Modus.
Falls du die Zeilen vertauschen musst, damit sie zu deiner Tastenanordnung passen, sind auch die "corr" Werte (hier 2 und 1) anzupassen - corr von correlation. Diese Werte beziehen sich auf die Tasten Id Werte und sorgen für eine besonders intuitive Bedienung, alles mit kurzen Tastendrücken.
Das Bedienverhalten
Taste links oben fährt nach Skriptstart den Rollladen hoch. Ein erneuter Druck auf diese Taste lässt den Rollladen stoppen. Der nächste Druck auf diese Taste lässt ihn weiter hochfahren.
Taste links unten fährt den Rollladen herunter. Ein erneuter Druck darauf lässt den Rollladen stoppen. ...
Wenn jemand die "falsche" Taste drückte und die Gegenrichtung wollte, genügt es, die andere Taste zu drücken. Dies wird mit den "corr" Werten ermöglicht. Ohne diese Werte kann es geschehen, dass mit dem anderen Tastendruck zunächst angehalten wird. Dieses Verhalten hängt dann davon ab, was mit dem letzten anderen Tastendruck bewirkt wurde und ist deshalb nicht immer gleich. Dies kannst du testen, indem du temporär die beiden corr:2 und corr:1 Teile entfernst.
Wichtig! Kopiere das Skript ausschließlich per Kopier-Icon im Rahmen oben rechts!
// created by Gerhard Eichelsdörfer alias eiche, 2024-04-27, V 1.1
// Application for a Shelly Plus 2PM as roller shutter, e.g. controlled by two buttons
//---- begin of configuration ----
let Config = [
{i:0, methods:[], id:0}, // top right, id=0
{i:0, ip_addr:"172.16.3.66", methods:["cover.open","cover.stop"], id:0, corr:2}, // top left, id=1
{i:0, ip_addr:"172.16.3.66", methods:["cover.close","cover.stop"], id:0, corr:1}, // bottom left, id=2
{i:0, methods:[], id:0} // bottom right, id=3
];
//---- end of configuration ----
function next(res, errc, errm, id) {
if(errc) {print(errc, errm); return;}
Config[id].i = (Config[id].i + 1) % Config[id].methods.length;
let corr = Config[id].corr;
if(corr!==undefined) Config[corr].i = 0;
}
function process(e) {
if(e.info!==undefined && e.info.event==="single_push") {
//print(JSON.stringify(e));
let id = e.info.id;
if(id<0 || id>=Config.length) return;
let i = Config[id].i;
if(i<0 || i>=Config[id].methods.length) return;
let method = Config[id].methods[i];
if(typeof(method)==="string") {
print(id, method);
Shelly.call("http.get", {url:"http://" + Config[id].ip_addr + "/rpc/" + method + "?id=" + Config[id].id}, next, id);
}
}
}
Shelly.addEventHandler(process);
Alles anzeigen
Bei Fragen stehe ich selbstverständlich zur Verfügung. Die Konsolenausgaben dienen ausschließlich der Überprüfbarkeit, welche Id der gedrückten Taste zugeordnet und welche Methode aktuell mit diesem Tastendruck verbunden sind.
Edit: Ich habe das Skript noch ein wenig robuster gestaltet - V 1.1.