-
Autor
Hallo zusammen die Idee ist ein Shelly relay auszulösen wenn sich der blue button beacon Modus nähert.
Der simpelste Versuch war mir von der KI ein Script schreiben zu lassen was leider aber nicht auf Anhieb funktioniert und jetzt wäre ich euch sehr dankbar wenn ihr mir dazu ein paar Kommentare hier lasst.
// =========================================================================
// Shelly BLU Beacon Anwesenheitserkennung per Skript auf Shelly Plus/Pro
// Steuerung für DREI verschiedene Shelly BLU Buttons
// =========================================================================
// ====== 1. KONFIGURATION: Diese Stellen müssen Sie anpassen ======
// Liste der BLU Buttons (MAC-Adresse und zugehörige ID für die Logik)
let BLU_BUTTONS = [
{ mac: "b0:c7:de:2b:4c:5a", name: "Schluessel_Max" }, // <--- MAC 1 ANPASSEN
{ mac: "AA:BB:CC:22:22:22", name: "Schluessel_Anna" }, // <--- MAC 2 ANPASSEN
{ mac: "AA:BB:CC:33:33:33", name: "Schluessel_Gast" } // <--- MAC 3 ANPASSEN
];
let RSSI_THRESHOLD = -65; // <--- 2. RSSI-Grenzwert: Entspricht ca. 1 Meter Entfernung.
let SWITCH_ID = 0; // <--- 3. ID des Relais, das geschaltet werden soll (meist 0)
let OFF_DELAY_MS = 1000; // <--- 4. Wartezeit in Millisekunden (1 Sekunde) bis zum Ausschalten.
// =========================================================================
// Speichert den Timer-Handle für jeden Button, um ihn separat zurücksetzen zu können
let timers = {};
// Funktion zum Schalten des lokalen Relais
function setLocalSwitch(on, buttonName) {
// Optional: Logik zur Unterscheidung, welcher Button das Relais schalten darf.
// In diesem Beispiel schaltet jeder Button das gleiche Relais (SWITCH_ID).
Shelly.call("Switch.Set", { id: SWITCH_ID, on: on }, function(res, err_code, err_msg) {
if (err_code === 0) {
console.log("Relais erfolgreich geschaltet (" + (on ? "EIN" : "AUS") + ") durch:", buttonName);
} else {
console.log("Fehler beim Schalten des Relais:", err_msg);
}
});
}
// Haupt-Callback-Funktion für gescannte Bluetooth-Geräte
function bleScanCallback(ev, res) {
if (ev === "GATT_ServiceData") {
let mac = res.addr;
// Finde den Button in der Konfigurationsliste
let currentButton = BLU_BUTTONS.find(btn => btn.mac === mac);
// Nur auf konfigurierte BLU Buttons reagieren
if (!currentButton) return;
// Überprüfen der Signalstärke (RSSI)
if (res.rssi >= RSSI_THRESHOLD) {
console.log("Beacon gefunden. Button:", currentButton.name, "RSSI:", res.rssi);
// Relais einschalten
setLocalSwitch(true, currentButton.name);
// Bestehenden Ausschalt-Timer für DIESEN Button zurücksetzen
if (timers[mac] !== undefined) {
Timer.clear(timers[mac]);
}
// Neuen Timer für DIESEN Button starten
timers[mac] = Timer.set(OFF_DELAY_MS, false, function() {
// Nur ausschalten, wenn KEIN anderer konfigurierter Button gerade anwesend ist.
// ACHTUNG: Das ist eine erweiterte Logik und muss sorgfältig geplant werden.
// Da wir in diesem Skript nur eine Aktion (Relais schalten) pro Beacon-Erkennung ausführen,
// gehen wir davon aus, dass das Relais ausgeschaltet werden kann, wenn DIESER Button
// für die definierte Zeit verschwunden ist.
console.log("Button " + currentButton.name + " seit " + (OFF_DELAY_MS/1000) + " Sekunde(n) nicht gesehen. Schalte Relais aus.");
setLocalSwitch(false, currentButton.name);
// Timer aus der Liste entfernen
delete timers[mac];
});
}
}
}
// Bluetooth-Scanner starten
function bleStart() {
Shelly.call("BLE.SetConfig", { config: { enable: true } });
Scanner.Start({ duration: 0, active: true }, bleScanCallback);
console.log("Bluetooth Scanner für 3 Buttons gestartet.");
}
bleStart();