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) ?












