Shelly Scripting â Shelly BLU Aktionen programmieren
Mit den GerĂ€ten der Shelly BLU Serie â vom BLU Button ĂŒber den BLU Button Tough 1 bis hin zu BLU Motion oder dem BLU Door/Window Sensor â kannst du dein Smarthome per Bluetooth flexibel erweitern. Jeder Tastendruck oder Sensor-Event lĂ€sst sich in individuelle Aktionen ĂŒbersetzen, die z. B. Relais schalten, Lampen aktivieren oder Abfragen an andere GerĂ€te senden.
https://youtu.be/MCSYiK0NFRk
FĂŒr die meisten AnwendungsfĂ€lle reicht es, eine Szene mit dem Shelly Wizard zu erstellen â das geht schnell und ohne Programmierkenntnisse. Doch Szenen funktionieren in erster Linie innerhalb des Shelly-Ăkosystems. Wenn du allerdings auch andere GerĂ€te oder Dienste ĂŒber REST-APIs ansteuern möchtest, die nicht Teil deines Shelly-Netzwerks sind, stöĂt du mit Szenen schnell an Grenzen.
Genau hier kommt Shelly Scripting ins Spiel: Mit einem eigenen Script kannst du die BLU Events flexibel auswerten und beliebige HTTP-Requests absetzen â egal ob an einen anderen Shelly, einen ESP32, ein Smarthome-Gateway oder einen Webservice.
Shelly BLU Button Tough 1
Shelly Blu Button 1
Shelly BLU Motion
Shelly BLU Door / Window
Shelly BLU H&T
In diesem Beitrag zeige ich dir, wie du am Beispiel des Shelly BLU Button ein Script erstellst, das TastendrĂŒcke erkennt und daraufhin beliebige HTTP-Befehle ausfĂŒhrt. Das Script ist universell gehalten, sodass du es mit wenigen Anpassungen auch fĂŒr andere Shelly BLU GerĂ€te nutzen kannst.
Benötigte Hardware
Um die Aktionen mit Shelly Scripting umzusetzen, brauchen wir zunÀchst die passende Hardware:
- Shelly BLU GerĂ€t FĂŒr dieses Beispiel nutze ich den bereits etwas Ă€lteren, aber immer noch sehr praktischen Shelly BLU Button 1. Er eignet sich hervorragend zum Testen, da er verschiedene Events wie Single, Double, Triple oder Long Press unterstĂŒtzt. - Gateway fĂŒr die BLU-Signale Damit die Signale des BLU Buttons im Netzwerk ankommen, benötigen wir ein Shelly BLU Gateway. Alternativ kann jedes andere Bluetooth-fĂ€hige Shelly GerĂ€t der 2. Generation (oder neuer) als Gateway eingesetzt werden. Das bedeutet: auch ein Shelly Plus Plug S oder ein Shelly Pro GerĂ€t mit aktiviertem BLE kann die Signale aufnehmen und im lokalen Netz verfĂŒgbar machen.
Damit haben wir die Grundausstattung, um die BLU-Events zu empfangen und anschlieĂend mit unserem Script weiterzuverarbeiten.
Shelly BLU verbinden
Bevor wir mit dem eigentlichen Script starten, mĂŒssen wir den Shelly BLU Button (oder ein anderes BLU-GerĂ€t) mit unserem Gateway koppeln. Dieser Schritt ist wichtig, damit die Signale zuverlĂ€ssig erkannt und verarbeitet werden.
Eine ausfĂŒhrliche Schritt-fĂŒr-Schritt-Anleitung zur Kopplung findest du in meinem YouTube Video:
https://youtu.be/2XsbCDfVOOM
Offizielle Vorlage von Shelly
Die Grundlage fĂŒr dieses Projekt stammt aus der offiziellen Shelly Script Library. Dort findest du den ursprĂŒnglichen Blogbeitrag von Shelly mit einem Beispielscript fĂŒr die Integration des Shelly BLU Button1:
đ Shelly Gen2 BLE Gateway Script for BLU Button1 Integration
In diesem Beitrag gehe ich einen Schritt weiter:
- Das Script ist vollstĂ€ndig kommentiert, - um einige praktische Funktionen erweitert (z. B. NONE-Konstante, flexible Logging-Funktion, HTTP-Queue mit Retry), - und lĂ€sst sich damit einfach fĂŒr andere Shelly BLU GerĂ€te (z. B. BLU Motion, BLU Door/Window Sensor oder BLU Button Tough 1) adaptieren.
So profitierst du von der offiziellen Basis, bekommst aber gleichzeitig eine auf Praxis ausgelegte Version, die sofort einsatzbereit ist.
Wie reagiert man auf Shelly BLU Aktoren wie Button, Button Tough, Door/Window und Motion?
In diesem Abschnitt zeige ich, wie du die wichtigsten Shelly BLU Aktoren mit dem Script nutzt. Die Basis ist immer gleich:
- BLU-Frames werden per BTHome v2 empfangen, - das Script dekodiert die Daten, - und löst je nach Event HTTP-Aktionen aus (CONFIG.actions).
Nachfolgend das gesamte Script welches alle drei GerÀte behandelt, du musst hier lediglich deine MAC Adresse eintragen. Diese findest du in der Shelly Cloud oder der App Shelly Smart Control unter den GerÀteinformationen.
ermitteln der MAC-Adresse eines Shelly BLU GerĂ€tes Script fĂŒr das reagieren auf Events von den BLU Button, Tough, Door/Window und Motion /* =========CHANGE HERE========= */ let CONFIG = { bluButtonAddress: "28:76:81:f9:69:6d", //the mac address of shelly blu button1 that will trigger the actions actions: { //urls to be called on a event //when adding urls you must separate them with commas and put them in quotation marks singlePush: , doublePush: , triplePush: , longPush: } }; /** =============================== STOP CHANGING HERE =============================== */ let urlsPerCall = 3; let urlsQueue = ; let callsCounter = 0; let ALLTERCO_MFD_ID_STR = "0ba9"; let BTHOME_SVC_ID_STR = "fcd2"; let uint8 = 0; let int8 = 1; let uint16 = 2; let int16 = 3; let uint24 = 4; let int24 = 5; let BTH = {}; BTH = { n: "pid", t: uint8 }; BTH = { n: "Battery", t: uint8, u: "%" }; BTH = { n: "Illuminance", t: uint24, f: 0.01 }; BTH = { n: "Door", t: uint8 }; BTH = { n: "Moisture", t: uint8 }; BTH = { n: "Window", t: uint8 }; BTH = { n: "Button", t: uint8 }; function getByteSize(type) { if (type === uint8 || type === int8) return 1; if (type === uint16 || type === int16) return 2; if (type === uint24 || type === int24) return 3; //impossible as advertisements are much smaller; return 255; } let BTHomeDecoder = { utoi: function (num, bitsz) { let mask = 1 5; if (ver!==2) return null; if (enc) return { encryption:true }; var buf = sd.slice(1); var out = { encryption:false, version:2 }; while (buf.length>0){ var id = buf.at(0), spec = BTH; if (!spec) break; // unbekannt â abbrechen (minimal) buf = buf.slice(1); var need = (spec.t===T.u8||spec.t===T.i8)?SZ.u8:(spec.t===T.u16||spec.t===T.i16)?SZ.u16:SZ.u24; var raw = readTyped(spec.t, buf); if (raw===null) break; var val = (typeof spec.f==="number") ? raw*spec.f : raw; out = val; buf = buf.slice(need); } return out; } /******************************************************/ /************* STATES *************/ var lastPid = -1; var lastTemp = null, lastHum = null; var tempState = "unknown"; // "low" | "normal" | "high" var humState = "unknown"; /**********************************/ /************* OPTIONAL: Werte pushen *************/ function pushValues(t, h, bat){ if (!CONFIG.push || !CONFIG.push.enabled) return; var url = CONFIG.push.urlBase + "?temp=" + t + "&hum=" + h + "&bat=" + bat; Shelly.call("HTTP.GET", { url:url, timeout: (CONFIG.push.timeoutSec||5) }, function(res, code, msg, ctx){ if (code===0) log("debug","PUSH OK", ctx.url); else log("warn","PUSH FAIL", ctx.url, msg); }, { url:url } ); } /**************************************************/ /************* GRENZWERTE + HYSTERESE *************/ function evalTemp(t){ var cfg = CONFIG.sensors && CONFIG.sensors.ht ? CONFIG.sensors.ht.temp : null; if (!cfg) return; var lowOn = cfg.low, lowOff = cfg.low + cfg.hyst; var highOn = cfg.high, highOff = cfg.high - cfg.hyst; if (tempState==="unknown"){ tempState = (t=highOn) ?












