Beacon-Mode der Shelly BLU-Geräte nutzen

Mit ** gekennzeichnete Links auf dieser Seite sind Affiliate-Links.

Suchergebnisse

Beacon-Mode der Shelly BLU-Geräte nutzen
Beacon-Mode der Shelly BLU-Geräte nutzen
  • 22.07.2026
  • Level 4
  • Bluetooth
  • Sicherheit

Vor ein paar Monaten habe ich die Shelly BLU Geräte genauer angeschaut. Auch die Verschlüsselung habe ich ausführlich vorgestellt. Was noch gar nicht auf meinem Zettel stand, ist der Beacon-Mode. Dieser sendet im Falle des Shelly BLU Button Tough 1 regelmäßig (alle 8 Sekunden) ein Button-Event. Das ist leider nicht sehr sauber gelöst und ich wünschte, es gäbe ein separates Event. Glücklicherweist ist das Event immer 0. Man kann die Beacon-Nachrichten also von den normalen unterscheiden (die wären > 0). Über die Custom Components (ab Shelly Generation 3) kann man leider nur auf die normalen Ereignisse (kurzer Tastendruck, langer Tastendruck, usw.) reagieren. Es ist also ein kleines Script nötig.

Um das folgende Script zu nutzen, brauchst Du als erstes eine Custom Component bzw. Virtual Component vom Typ boolean. Diese sollte ebenfalls einer Gruppe zugeordnet sein, damit die Infos auch auf der Weboberfläche und in der App sichtbar sind. Bei mir hat diese dann die ID 200 bekommen. Dieser Wert muss im Script unten angepasst werden.

Außerdem muss der Beacon-Mode über die Shelly-Debug-App (oder die normale Shelly App) aktiviert werden. Diese hatte ich damals schon gezeigt, weil man auf diesem Wege auch Firmware-Updates der Shelly-Geräte durchführen kann. Das würde ich auch in jedem Fall empfehlen!

Über diese App wird dann auch die Mac-Adresse des Bluetooth-Gerätes angezeigt, welche ebenfalls im Script angepasst werden muss.

Shelly feiert den 8. Geburtstag – finde tolle Angebote

** Affiliate-Link

Beacon-Script für Gen3+#

// v0.1
const TARGET_MAC = "38:39:8f:8b:62:b1"; // Mac des Button 1
const TIMEOUT_MS = 60 * 1000; // 60 Sekunden nicht gesehen -> abwesend
const CHECK_MS   = 11 * 1000; // Alle 11 Sekunden den Timer laufen lassen
const BTHOME_SVC_ID_STR = "fcd2";

let present  = Virtual.getHandle("boolean:200");
let lastSeen = 0;
let curState = null;

function setPresence(v) {
  if (curState === v) return;
  curState = v;
  present.setValue(v);
}

Timer.set(CHECK_MS, true, function () {
  let now = Date.now();
  if (lastSeen === 0 || now - lastSeen > TIMEOUT_MS) {
    setPresence(false);
  }
});

function skipLen(id) {
  if (id === 0x00) return 1;
  if (id === 0x01) return 1;
  if (id === 0x3a) return 1;
  return -1;
}

function getButton(sd) {
  if (typeof sd !== "string" || sd.length < 1) return null;
  let dib = sd.at(0);
  if (dib & 0x1) return null;        // verschlüsselt -> ignorieren
  if ((dib >> 5) !== 2) return null; // nicht BTHome v2
  let i = 1;
  while (i < sd.length) {
    let id = sd.at(i);
    if (id === 0x3a) return sd.at(i + 1);
    let len = skipLen(id);
    if (len < 0) return null;
    i += 1 + len;
  }
  return null;
}

function onScan(ev, res) {
  if (ev !== BLE.Scanner.SCAN_RESULT) return;
  if (res.addr.toLowerCase() !== TARGET_MAC) return;
  if (typeof res.service_data === "undefined") return;
  let sd = res.service_data[BTHOME_SVC_ID_STR];
  if (typeof sd === "undefined") return;

  lastSeen = Date.now();
  setPresence(true);

  let btn = getButton(sd);
  if (btn !== null) {
    if (btn > 0) {
        // (1=single, 2=double, 3=triple, 4=long, ...)
        // console.log("Button event: " + btn);
    }
  }
}

BLE.Scanner.Subscribe(onScan);

if (!BLE.Scanner.isRunning()) {
  BLE.Scanner.Start({
    duration_ms: BLE.Scanner.INFINITE_SCAN,
    active: false,
    interval_ms: 240,
    window_ms: 80
  });
}

Was passiert hier?#

Das Script macht im Kern nur eine Sache: Es lauscht dauerhaft auf die Bluetooth-Beacons des BLU Buttons und leitet daraus einen Anwesenheits-Status ab, den es in die Virtual Component (boolean:200) schreibt. Sobald der Button regelmäßig gesehen wird, ist der Wert true (anwesend), bleibt er zu lange aus, wird er false (abwesend).

Die Parameter am Anfang#

Diese vier Konstanten sind die einzigen Werte, die Du anpassen musst bzw. anpassen kannst:

  • TARGET_MAC — Die MAC-Adresse Deines BLU Buttons (aus der Shelly-Debug-App). Muss zwingend angepasst werden und in Kleinbuchstaben stehen.
  • TIMEOUT_MS — Wie lange (in Millisekunden) das Gerät nicht gesehen werden soll, bevor es als abwesend gilt. Standard: 60 Sekunden. Da der Beacon alle 8 Sekunden sendet, ist das ein guter Puffer.
  • CHECK_MS — In welchem Intervall der Timer prüft, ob der Timeout überschritten wurde. Standard: 11 Sekunden.
  • BTHOME_SVC_ID_STR — Die Bluetooth-Service-ID der BTHome-Daten (fcd2). Diese ist bei allen Shelly BLU Geräten identisch und muss normalerweise nicht geändert werden.

Zusätzlich muss weiter unten die ID der Virtual Component angepasst werden — im Handle Virtual.getHandle("boolean:200") steht die 200, die Du bei Dir ggf. auf Deine ID ändern musst.


Transparenz-Hinweis (Level 4: Bezahltes Video)

Bei diesem Beitrag handelt es sich um ein bezahltes Video. Zusätzlich wurden mir ggf. Produkte kostenfrei zur Verfügung gestellt (beispielsweise als Leihgabe). In den meisten Fällen wurden die Inhalte nicht mit dem Auftraggeber abgestimmt. Es handelt sich in jedem Fall um meine persönliche Meinung! In extrem seltenen Fällen findet eine Abnahme der Inhalte durch den Auftraggeber/Hersteller statt, welcher damit falsche oder irreführende Aussagen vor Veröffentlichung verhindern möchte. Das ist auch in meinem Interesse.

» Mehr erfahren

Du willst mehr?

Smart-Home-Trainings von A-Z

Steig' noch tiefer in die Themen ein und meistere Deine Projekte! Über 17.000 Teilnehmer konnten sich schon von der Qualität der Online-Kurse überzeugen.

Abonniere jetzt den Newsletter für
spannende Neuigkeiten! interessante Angebote! neue Kurs-Inhalte!
* Durch Angabe meiner E-Mail-Adresse erkläre ich mich damit einverstanden, dass mir unregelmäßig Informationen und Produktempfehlungen aus dem Themengebiet »Smart Home« zugesendet werden. Mit dem Eintrag akzeptiere ich die Datenschutzbestimmungen. Meine Einwilligung kann ich jederzeit widerrufen.