Hi Leute,
habe die letzten Tage meine Shelly Blu und Plus Geräte aktualisiert.
Jetzt habe ich das Problem, das die Blu Motion Geräte nicht mehr im Skript funktionieren.
Alles andere funktioniert weiterhin wie App und Cloud.
Meine Vermutung ist, dass es wohl an den Blu Motion liegt. Diese wurden über App (BLE Debug) aktualisiert. Es wird jetzt auch Temperatur angezeigt, daher wird es wohl die neueste Firmware sein.
Skript läuft auf einen Shelly Plus 1 PM. Der ein oder zwei Tage vorher aktualisiert wurde.
Das es aktuelle API für die Blu Geräte gibt habe ich bereits registriert. Nur kann ich nicht wirklich was damit anfangen.
Das sind die Definitionen, die in Verwendung sind/waren, die auch funktioniert hatten.
BTH[0x00] = { n: "pid", t: uint8 };
BTH[0x01] = { n: "Battery", t: uint8, u: "%" };
BTH[0x02] = { n: "Temperature", t: int16, f: 0.01, u: "°C" };
BTH[0x03] = { n: "Humidity", t: uint16, f: 0.01, u: "%" };
BTH[0x05] = { n: "Illuminance", t: uint24, f: 0.01 };
BTH[0x1a] = { n: "Door", t: uint8 };
BTH[0x20] = { n: "Moisture", t: uint8 };
BTH[0x2d] = { n: "Window", t: uint8 };
BTH[0x3a] = { n: "Button", t: uint8 };
BTH[0x3f] = { n: "Rotation", t: int16, f: 0.1 };
BTH[0x21] = { n: "Motion", t: uint8 };
Egal was ich in dieser Richtung versuche, es klappt nicht. Was muss geändert, bzw. aktualisiert werden, damit es wieder funktioniert?
Erkannt werden sie. Nur weiter geht’s nicht.
Die anderen Blu (1x Button und 3x DoorWindow)Geräte funktionieren weiterhin.
Log zeigt diese Meldung bei den Blu Motion.
BTH: unknown type
Shelly BTH-Paket: {"encryption":false,"BTHome_version":2,"pid":161,"Bat…
Hier das Skript:
/**---Blu ALLE---
* Dieses Skript verwendet die BLE-Scan-Funktionalität bei der Skripterstellung
* Wählt Shelly BLU DoorWindow aus den ausgestrahlten Werbespots aus und dekodiert
* die Nutzdaten der Servicedaten und schaltet ein Relais am Gerät ein
* Knopfdruck
* Shelly BLU-Geräte:
* SBBT - Shelly BLU Button
* SBDW - Shelly BLU DoorWindow
* Beispiel Shelly DW service_data-Nutzlast
* Erstes Byte: BTHome-Geräteinformationen, 0x40 – keine Verschlüsselung, BTHome v.2
* Der Gerätename kann abgerufen werden, wenn ein aktiver Scan durchgeführt wird
* Sie können sich nur auf die Adressfilterung verlassen und auf den Abgleich von Gerätenamen verzichten
* HIER ÄNDERN
*/
let urlsPerCall = 3;
let urlsQueue = [];
let callsCounter = 0;
// Funktion für die erste Aktion AUF (Fenster Flur geöffnet)
function triggerAutomation(BTHparsed) {
console.log("Fenster Schlafzimmer ist geöffnet, schalte die Lampe ein");
//AUS//addToUrlQueue("http://192.168.178.22/relay/0?turn=on"); // Licht Schrank
// Weitere Aktionen hinzufügen, falls erforderlich
}
// Funktion für die erste Aktion ZU (Fenster Flur geschlossen)
function printClosed(BTHparsed) {
console.log("Fenster Schlafzimmer ist geschlossen, schalte die Lampe aus");
//AUS//addToUrlQueue("http://192.168.178.22/relay/0?turn=off"); // Licht Schrank
// Weitere Aktionen hinzufügen, falls erforderlich
}
// Funktion für die zweite Aktion AUF (Fenster Schlafzimmer geöffnet)
function triggerAutomationWindow2(BTHparsed) {
console.log("Fenster Bad ist geöffnet, schalte das Relais ein");
//AUS//addToUrlQueue("http://192.168.178.30/relay/0?turn=on"); // Licht Büro
// Weitere Aktionen hinzufügen, falls erforderlich
}
// Funktion für die zweite Aktion ZU (Fenster Schlafzimmer geschlossen)
function printClosedWindow2(BTHparsed) {
console.log("Fenster Bad ist geschlossen, schalte das Relais aus");
//AUS//addToUrlQueue("http://192.168.178.30/relay/0?turn=off"); // Licht Büro
// Weitere Aktionen hinzufügen, falls erforderlich
}
// Funktion für die dritte Aktion AUF (Fenster Wohnungstür geöffnet)
function triggerAutomationWindow3(BTHparsed) {
console.log("Fenster Wohnungstür ist geöffnet, schalte das Licht ein");
addToUrlQueue("http://192.168.178.30/relay/0?turn=on"); // Licht Büro
// Weitere Aktionen hinzufügen, falls erforderlich
}
// Funktion für die dritte Aktion ZU (Fenster Wohnungstür geschlossen)
function printClosedWindow3(BTHparsed) {
console.log("Fenster Wohnungstür ist geschlossen, schalte das Licht aus");
addToUrlQueue("http://192.168.178.30/relay/0?turn=off"); // Licht Büro
// Weitere Aktionen hinzufügen, falls erforderlich
}
// Funktion für Single Push auf Shelly BLU Button
function singlePushAction(BTHparsed) {
console.log("Single Push erkannt, führe Aktion aus");
addToUrlQueue("https://www.virtualsmarthome.xyz/url_routine_trigger/ac...=html");
}
// Funktion für Double Push auf Shelly BLU Button
function doublePushAction(BTHparsed) {
console.log("Double Push erkannt, führe Aktion aus");
addToUrlQueue("http://192.168.178.30/relay/0?turn=toggle"); // Licht Büro
}
// Funktion für Triple Push auf Shelly BLU Button
function triplePushAction(BTHparsed) {
console.log("Triple Push erkannt, führe Aktion aus");
addToUrlQueue("http://192.168.178.22/relay/0?turn=toggle"); // Licht Schrank
}
// Funktion für Long Push auf Shelly BLU Button
function longPushAction(BTHparsed) {
console.log("Long Push erkannt, führe Aktion aus");
addToUrlQueue("https://www.virtualsmarthome.xyz/url_routine_trigger/ac….=html");
}
// Funktion für Motion Detected auf Shelly BLU Motion Bad
function motionDetectedAction(BTHparsed) {
if (BTHparsed.Illuminance < 40) { // Helligkeit kleiner als 40
console.log("Bewegung erkannt und Helligkeit kleiner als 40, schalte das Licht im Bad ein");
// Schalte das Licht im Bad ein mit einem Timer von 240 Sekunden
addToUrlQueue("http://192.168.178.32/relay/0?turn=on&timer=600"); // Licht Bad EIN
addToUrlQueue("http://192.168.178.24/color/0?turn=off"); // Licht Flur AUS
addToUrlQueue("http://192.168.178.53/settings/actions?index=0&enabled=true&name=motion_on"); // WC: Blindtime Motion Flur zurücksetzen
} else {
console.log("Bewegung erkannt, aber Helligkeit ist ausreichend hoch");
}
}
// Funktion zum Überprüfen des Status von Licht Bad Decke
function checkLightBadDeckeStatus(BTHparsed) {
let shellyIP = "192.168.178.34";
let shellyEndpoint = "rpc/Switch.GetStatus?id=0";
let url = `http://${shellyIP}/${shellyEndpoint}`;
Shelly.call(
"HTTP.GET",
{
url: url,
timeout: 7,
},
function (_, error_code, _, data) {
if (error_code !== 0) {
console.log("Abfrage fehlgeschlagen für", url);
} else {
let lightStatus = JSON.parse(data.responseText).result.on;
console.log("Status abgefragt für Licht Bad Decke:", lightStatus);
// Hier kannst du den erhaltenen Lichtstatus weiterverarbeiten
// Z.B. überprüfen, ob das Licht eingeschaltet ist und dann entsprechende Aktionen ausführen
if (lightStatus) {
console.log("Licht Bad Decke ist eingeschaltet, Aktionen für Bewegung werden unterdrückt");
} else {
// Aktionen für Bewegung können hier ausgeführt werden, da das Licht ausgeschaltet ist
motionDetectedAction(BTHparsed);
}
}
},
{ url: url }
);
}
// Funktion zum Hinzufügen einer URL zur Warteschlange
function addToUrlQueue(url) {
urlsQueue.push(url);
callQueue();
}
// Funktion zum Ausführen der URL-Warteschlange
function callQueue() {
if (callsCounter < 6 - urlsPerCall) {
for (let i = 0; i < urlsPerCall && i < urlsQueue.length; i++) {
let url = urlsQueue.splice(0, 1)[0];
callsCounter++;
Shelly.call(
"HTTP.GET",
{
url: url,
timeout: 7,
},
function (_, error_code, _, data) {
if (error_code !== 0) {
console.log("Aufruf von", data.url, "fehlgeschlagen");
} else {
console.log("Aufruf von", data.url, "erfolgreich");
}
callsCounter--;
},
{ url: url }
);
}
}
// Wenn sich weitere URLs in der Warteschlange befinden
if (urlsQueue.length > 0) {
Timer.set(
1000, // Verzögerung
false,
function () {
callQueue();
}
);
}
}
// Hier füge die Konfiguration für die zusätzlichen 3 Shelly BLU Door/Window-Geräte hinzu
let CONFIG = {
shelly_blu_address: [
"60:ef:ab:4a:5b:85", // MAC-Fenster Schlafzimmer
"b0:c7:de:7f:f1:14", // MAC-Fenster Bad
"60:ef:ab:3e:46:ce", // MAC-Wohnungstür
"", // MAC-Adresse von Gerät 4
"e8:e0:7e:bd:37:33", // MAC-Adresse des BLU Buttons
"b0:c7:de:40:cc:d9", // MAC-Adresse des BLU Motion Bad
"b0:c7:de:7c:db:8f", // MAC-Adresse des BLU Motion WC
],
actions: [
{
cond: {
Window: 1,
addr: "60:ef:ab:4a:5b:85" // MAC-Fenster Schlafzimmer
},
action: triggerAutomation,
},
{
cond: {
Window: 0,
addr: "60:ef:ab:4a:5b:85" // MAC-Fenster Schlafzimmer
},
action: printClosed,
},
{
cond: {
Window: 1,
addr: "b0:c7:de:7f:f1:14" // MAC-Fenster Bad
},
action: triggerAutomationWindow2,
},
{
cond: {
Window: 0,
addr: "b0:c7:de:7f:f1:14" // MAC-Fenster Bad
},
action: printClosedWindow2,
},
{
cond: {
Window: 1,
addr: "60:ef:ab:3e:46:ce" // MAC-Wohnungstür
},
action: triggerAutomationWindow3,
},
{
cond: {
Window: 0,
addr: "60:ef:ab:3e:46:ce" // MAC-Wohnungstür
},
action: printClosedWindow3,
},
// Aktionen für Shelly BLU Button
{
cond: {
Button: 1,
addr: "e8:e0:7e:bd:37:33" // MAC-BLU Buttons
},
action: singlePushAction,
},
{
cond: {
Button: 2,
addr: "e8:e0:7e:bd:37:33" // MAC-BLU Buttons
},
action: doublePushAction,
},
{
cond: {
Button: 3,
addr: "e8:e0:7e:bd:37:33" // MAC-BLU Buttons
},
action: triplePushAction,
},
{
cond: {
Button: 4,
addr: "e8:e0:7e:bd:37:33" // MAC-BLU Buttons
},
action: longPushAction,
},
// Aktionen für Shelly BLU Motion Bad
{
cond: {
Motion: 1,
addr: "b0:c7:de:40:cc:d9" // MAC-Adresse des BLU Motion Bad
},
action: motionDetectedAction,
},
{
cond: {
Motion: 1,
addr: "b0:c7:de:7c:db:8f" // MAC-Adresse des BLU Motion WC
},
action: function(BTHparsed) {
let currentTime = new Date().getHours();
let currentLux = BTHparsed.Illuminance; // Annahme: Die Helligkeit wird im BTHparsed-Objekt als Illuminance gespeichert
// Fall 1: Uhrzeit von 04:00 bis 22:00 Uhr und Helligkeit kleiner als 40 Lux
if ((currentTime >= 4 && currentTime < 22) && currentLux < 40) {
console.log("Bewegung erkannt im WC während des Tages und bei geringer Helligkeit, schalte das Licht ein");
addToUrlQueue("http://192.168.178.36/relay/1?turn=on"); // Licht im WC einschalten
addToUrlQueue("http://192.168.178.24/color/0?turn=off"); // Licht Flur AUS
addToUrlQueue("http://192.168.178.53/settings/actions?index=0&enabled=true&name=motion_on"); // WC: Blindtime Motion Flur zurücksetzen
}
// Fall 2: Uhrzeit von 22:00 bis 04:00 Uhr
else if ((currentTime >= 22 || currentTime < 4)) {
console.log("Bewegung erkannt im WC während der Nacht, schalte das Licht über dem WC-Spiegel ein");
addToUrlQueue("http://192.168.178.36/relay/0?turn=on"); // Licht über dem WC-Spiegel einschalten
addToUrlQueue("http://192.168.178.24/color/0?turn=off"); // Licht Flur AUS
addToUrlQueue("http://192.168.178.53/settings/actions?index=0&enabled=true&name=motion_on"); // WC: Blindtime Motion Flur zurücksetzen
}
// Füge weitere Fälle hinzu, falls erforderlich
}
}
],
};
let ALLTERCO_MFD_ID_STR = "0ba9";
let BTHOME_SVC_ID_STR = "fcd2";
let ALLTERCO_MFD_ID = JSON.parse("0x" + ALLTERCO_MFD_ID_STR);
let BTHOME_SVC_ID = JSON.parse("0x" + BTHOME_SVC_ID_STR);
let SCAN_DURATION = BLE.Scanner.INFINITE_SCAN;
let ACTIVE_SCAN =
typeof CONFIG.shelly_blu_name_prefix !== "undefined" &&
CONFIG.shelly_blu_name_prefix !== null;
let uint8 = 0;
let int8 = 1;
let uint16 = 2;
let int16 = 3;
let uint24 = 4;
let int24 = 5;
function getByteSize(type) {
if (type === uint8 || type === int8) return 1;
if (type === uint16 || type === int16) return 2;
if (type === uint24 || type === int24) return 3;
// Unmöglich, da die Anzeigen viel kleiner sind
return 255;
}
let BTH = [];
BTH[0x00] = { n: "pid", t: uint8 };
BTH[0x01] = { n: "Battery", t: uint8, u: "%" };
BTH[0x02] = { n: "Temperature", t: int16, f: 0.01, u: "°C" };
BTH[0x03] = { n: "Humidity", t: uint16, f: 0.01, u: "%" };
BTH[0x05] = { n: "Illuminance", t: uint24, f: 0.01 };
BTH[0x1a] = { n: "Door", t: uint8 };
BTH[0x20] = { n: "Moisture", t: uint8 };
BTH[0x2d] = { n: "Window", t: uint8 };
BTH[0x3a] = { n: "Button", t: uint8 };
BTH[0x3f] = { n: "Rotation", t: int16, f: 0.1 };
BTH[0x21] = { n: "Motion", t: uint8 };
let BTHomeDecoder = {
utoi: function (num, bitsz) {
let mask = 1 << (bitsz - 1);
return num & mask ? num - (1 << bitsz) : num;
},
getUInt8: function (buffer) {
return buffer.at(0);
},
getInt8: function (buffer) {
return this.utoi(this.getUInt8(buffer), 8);
},
getUInt16LE: function (buffer) {
return 0xffff & ((buffer.at(1) << 8) | buffer.at(0));
},
getInt16LE: function (buffer) {
return this.utoi(this.getUInt16LE(buffer), 16);
},
getUInt24LE: function (buffer) {
return (
0x00ffffff & ((buffer.at(2) << 16) | (buffer.at(1) << 8) | buffer.at(0))
);
},
getInt24LE: function (buffer) {
return this.utoi(this.getUInt24LE(buffer), 24);
},
getBufValue: function (type, buffer) {
if (buffer.length < getByteSize(type)) return null;
let res = null;
if (type === uint8) res = this.getUInt8(buffer);
if (type === int8) res = this.getInt8(buffer);
if (type === uint16) res = this.getUInt16LE(buffer);
if (type === int16) res = this.getInt16LE(buffer);
if (type === uint24) res = this.getUInt24LE(buffer);
if (type === int24) res = this.getInt24LE(buffer);
return res;
},
unpack: function (buffer) {
// Beacons stellen möglicherweise keine BTH-Dienstdaten bereit
if (typeof buffer !== "string" || buffer.length === 0) return null;
let result = {};
let _dib = buffer.at(0);
result["encryption"] = _dib & 0x1 ? true : false;
result["BTHome_version"] = _dib >> 5;
if (result["BTHome_version"] !== 2) return null;
// Verschlüsselte Daten können nicht verarbeitet werden
if (result["encryption"]) return result;
buffer = buffer.slice(1);
let _bth;
let _value;
while (buffer.length > 0) {
_bth = BTH[buffer.at(0)];
if (_bth === undefined) {
console.log("BTH: unknown type");
break;
}
buffer = buffer.slice(1);
_value = this.getBufValue(_bth.t, buffer);
if (_value === null) break;
if (typeof _bth.f !== "undefined") _value = _value * _bth.f;
result[_bth.n] = _value;
buffer = buffer.slice(getByteSize(_bth.t));
}
return result;
},
};
let ShellyBLUParser = {
getData: function (res) {
let result = BTHomeDecoder.unpack(res.service_data[BTHOME_SVC_ID_STR]);
result.addr = res.addr;
result.rssi = res.rssi;
return result;
},
};
let last_packet_id = 0x100;
function scanCB(ev, res) {
if (ev !== BLE.Scanner.SCAN_RESULT) return;
// überspringen, wenn kein service_data-Mitglied vorhanden ist
if (
typeof res.service_data === "undefined" ||
typeof res.service_data[BTHOME_SVC_ID_STR] === "undefined"
)
return;
// Überspringen Sie, wenn wir nach einer Namensübereinstimmung suchen, aber keinen aktiven Scan haben, da wir keinen Namen haben
if (
typeof CONFIG.shelly_blu_name_prefix !== "undefined" &&
(typeof res.local_name === "undefined" ||
res.local_name.indexOf(CONFIG.shelly_blu_name_prefix) !== 0)
)
return;
// Überspringen, wenn wir keine Adressübereinstimmung haben
if (
typeof CONFIG.shelly_blu_address !== "undefined" &&
CONFIG.shelly_blu_address.indexOf(res.addr) === -1
)
return;
let BTHparsed = ShellyBLUParser.getData(res);
// überspringen, wenn das Parsen fehlgeschlagen ist
if (BTHparsed === null) {
console.log("Fehler beim Parsen der BTH-Daten");
return;
}
// berspringen, wir deduplizieren die Ergebnisse
if (last_packet_id === BTHparsed.pid) return;
last_packet_id = BTHparsed.pid;
console.log("Shelly BTH-Paket: ", JSON.stringify(BTHparsed));
// Aktionen aus CONFIG ausführen
let aIdx = null;
for (aIdx in CONFIG.actions) {
// überspringen, wenn keine Bedingung definiert ist
if (typeof CONFIG.actions[aIdx]["cond"] === "undefined") continue;
let cond = CONFIG.actions[aIdx]["cond"];
let cIdx = null;
let run = true;
for (cIdx in cond) {
if (typeof BTHparsed[cIdx] === "undefined") run = false;
if (BTHparsed[cIdx] !== cond[cIdx]) run = false;
}
// Wenn alle Bedingungen als wahr ausgewertet wurden, wird ausgeführt
if (run) CONFIG.actions[aIdx]["action"](BTHparsed);
}
}
BLE.Scanner.Start({ duration_ms: SCAN_DURATION, active: ACTIVE_SCAN }, scanCB);
Alles anzeigen