SHELLY BLU DOOR/WINDOW - in homee integrierbar?

…kannst du mir den Code schicken? :innocent:

Hast ne PN .

@Micha

Jooooo…
habe ein webhook erstellt. Wenn ich den im Browser teste dann funktioniert der auch.
Habe die kpl. Webhook-URL im Script ersetzt:

"HTTP.GET",
  {url: "https://000?????????.hom.ee/api/v2/webhook_trigger?webhooks_key=dhgysdhdsrggbvrehjblabla...

Sollte dann ja klappen. Was mich jetzt noch verwirrt ist der

motionHandler: function (motion, eventData) {

Damit komme ich noch nicht richtig klar. Da muß was für den BLU Door angepasst werden, aber uff! Ich kann zwar schon ne Menge aber hier bin ich noch Jungfrau. :innocent: Welche Anpassung ist für den BLU Door nötig?!

Gruß!

Ich habe dir in den code mal ein Log für die cosole eingebaut und die Nachricht brauche ich um dir einen eventhandler zu schreiben.

Ich habe das ganze mit meinem Amazon Echo umgesetzt. In meinem Fall ein Shelly Blu Motion der an den Echo meldet und von da aus ein Homeegramm startet, das eine Lampe einschaltet. Fumktioniert bislang recht zuverlässig.

Wenn Alexa das macht ist das auch ein weg. Wer schon Shelly der 2.Gen hat kann da wie gesagt auch das script nehmen. Funzt auch sehr gut.

let CONFIG = {
  debug: true,
  active: false,
  homeeip: '000',
  webhookkey:'xxxxx',
trigger_motion_true:'xxxx',
  trigger_motion_false:'xxxx1',
  trigger_open:'xxxx',
  trigger_close:'xxxx1',
  allowedMacAddresses: [
    "00:00:00:00:00:00", // Filter MAC Adresse
  ],

  
  motionHandler: function (motion, eventData) {
    //Shelly.call("Switch.Set", { id: 0, on: motion });
    console.log(eventData);
    if ( eventData.motion === 1){
    Shelly.call(
      "HTTP.GET",
      {url: 'http://'+CONFIG.homeeip+':7681/api/v2/webhook_trigger?webhooks_key='+CONFIG.webhookkey+'&event='+CONFIG.trigger_motion_true},
      function(result, error_code, error_message) {
        if (error_code != 0) {
          // process error
        } else {
          // process result
        }
      });

  }
  else if ( eventData.motion === 0){
    Shelly.call(
      "HTTP.GET",
      {url: 'http://'+CONFIG.homeeip+':7681/api/v2/webhook_trigger?webhooks_key='+CONFIG.webhookkey+'&event='+CONFIG.trigger_motion_false},
      function(result, error_code, error_message) {
        if (error_code != 0) {
          // process error
        } else {
          // process result
        }
      });

  }
  },

  illuminanceHandler: function (illuminance, eventData) {
    let topic = eventData.address + "/illuminance";
    //MQTT.publish(topic, String(illuminance));
  },
  
  
  onStatusUpdate: function (eventData) {
    // Do nothing at the moment.
  },
  windowHandler: function (window , eventData){
if ( eventData.window === 1){
    Shelly.call(
      "HTTP.GET",
      {url: 'http://'+CONFIG.homeeip+':7681/api/v2/webhook_trigger?webhooks_key='+CONFIG.webhookkey+'&event='+CONFIG.trigger_open},
      function(result, error_code, error_message) {
        if (error_code != 0) {
          // process error
        } else {
          // process result
        }
      });

  }
  else if ( eventData.window === 0){
    Shelly.call(
      "HTTP.GET",
      {url: 'http://'+CONFIG.homeeip+':7681/api/v2/webhook_trigger?webhooks_key='+CONFIG.webhookkey+'&event='+CONFIG.trigger_close},
      function(result, error_code, error_message) {
        if (error_code != 0) {
          // process error
        } else {
          // process result
        }
      });

  }
    }
};



/******************* STOP CHANGE HERE *******************/


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;

//Logs the provided message with an optional prefix to the console.
function logger(message, prefix) {
  //exit if the debug isn't enabled
  if (!CONFIG.debug) {
    return;
  }

  let finalText = "";

  //if the message is list loop over it
  if (Array.isArray(message)) {
    for (let i = 0; i < message.length; i++) {
      finalText = finalText + " " + JSON.stringify(message[i]);
    }
  } else {
    finalText = JSON.stringify(message);
  }

  //the prefix must be string
  if (typeof prefix !== "string") {
    prefix = "";
  } else {
    prefix = prefix + ":";
  }

  //log the result
  console.log(prefix, finalText);
}

// The BTH object defines the structure of the BTHome data
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: "tC" };
BTH[0x03] = { n: "humidity", t: uint16, f: 0.01, u: "%" };
BTH[0x05] = { n: "illuminance", t: uint24, f: 0.01 };
BTH[0x21] = { n: "motion", t: uint8 };
BTH[0x2d] = { n: "window", t: uint8 };
BTH[0x3a] = { n: "button", t: uint8 };
BTH[0x3f] = { n: "rotation", t: int16, f: 0.1 };

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;
}

// functions for decoding and unpacking the service data from Shelly BLU devices
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;
  },

  // Unpacks the service data buffer from a Shelly BLU device
  unpack: function (buffer) {
    //beacons might not provide BTH service data
    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;
    //can not handle encrypted data
    if (result["encryption"]) return result;
    buffer = buffer.slice(1);

    let _bth;
    let _value;
    while (buffer.length > 0) {
      _bth = BTH[buffer.at(0)];
      if (typeof _bth === "undefined") {
        logger("unknown type", "BTH");
        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;
  },
};

function onReceivedPacket (data) {
  if(CONFIG._processedMacAddresses !== null) { 
    if(CONFIG._processedMacAddresses.indexOf(data.address) < 0) {
      logger(["Received event from", data.address, "outside of the allowed addresses"], "Info");
      return;
    }
  }
  if (
    typeof CONFIG.motionHandler === "function" &&
    typeof data.motion !== "undefined"
  ) {
    CONFIG.motionHandler(data.motion === 1, data);
    logger("Motion handler called", "Info");
  }
  if (
    typeof CONFIG.windowHandler === "function" &&
    typeof data.window !== "undefined"
  ) {
    CONFIG.windowHandler(data.motion === 1 , data);
    logger("window handler called", "Info");
  }
  if (
    typeof CONFIG.illuminanceHandler === "function" &&
    typeof data.illuminance !== "undefined"
  ) {
    CONFIG.illuminanceHandler(data.illuminance, data);
    logger("Illuminance handler called", "Info");
  }

  if (typeof CONFIG.onStatusUpdate === "function") {
    CONFIG.onStatusUpdate(data);
    logger("New status update", "Info");
  }
}

//saving the id of the last packet, this is used to filter the duplicated packets
let lastPacketId = 0x100;

// Callback for the BLE scanner object
function BLEScanCallback(event, result) {
  //exit if not a result of a scan
  if (event !== BLE.Scanner.SCAN_RESULT) {
    return;
  }

  //exit if service_data member is missing
  if (
    typeof result.service_data === "undefined" ||
    typeof result.service_data[BTHOME_SVC_ID_STR] === "undefined"
  ) {
    return;
  }

  let unpackedData = BTHomeDecoder.unpack(
    result.service_data[BTHOME_SVC_ID_STR]
  );

  //exit if unpacked data is null or the device is encrypted
  if (
    unpackedData === null ||
    typeof unpackedData === "undefined" ||
    unpackedData["encryption"]
  ) {
    logger("Encrypted devices are not supported", "Error");
    return;
  }

  //exit if the event is duplicated
  if (lastPacketId === unpackedData.pid) {
    return;
  }

  lastPacketId = unpackedData.pid;

  unpackedData.rssi = result.rssi;
  unpackedData.address = result.addr;
  //console.log(unpackedData);
  onReceivedPacket(unpackedData);
}

// Initializes the script and performs the necessary checks and configurations
function init() {
  //exit if can't find the config
  if (typeof CONFIG === "undefined") {
    console.log("Error: Undefined config");
    return;
  }

  //get the config of ble component
  let BLEConfig = Shelly.getComponentConfig("ble");

  //exit if the BLE isn't enabled
  if (!BLEConfig.enable) {
    console.log(
      "Error: The Bluetooth is not enabled, please enable it from settings"
    );
    return;
  }

  //check if the scanner is already running
  if (BLE.Scanner.isRunning()) {
    console.log("Info: The BLE gateway is running, the BLE scan configuration is managed by the device");
  }
  else {
    //start the scanner
    let bleScanner = BLE.Scanner.Start({
        duration_ms: BLE.Scanner.INFINITE_SCAN,
        active: CONFIG.active
    });

    if(!bleScanner) {
      console.log("Error: Can not start new scanner");
    }
  }

  if (
    typeof CONFIG.allowedMacAddresses !== "undefined"
  ) {
    if(CONFIG.allowedMacAddresses !== null) {
      // Process configured mac addresses all to lower case and remove duplicates. 
      CONFIG._processedMacAddresses = 
        CONFIG
          .allowedMacAddresses
          .map(function (mac) { return mac.toLowerCase(); })
          .filter(function (value, index, array) { return array.indexOf(value) === index; })
    }
    else {
      CONFIG._processedMacAddresses = null;
    }
  }

  //subscribe a callback to BLE scanner
  BLE.Scanner.Subscribe(BLEScanCallback);
}

init();

Das funktioniert bei mir so sehr ordentlich.

…wenn dann Siri! Alexa will ich auf keinen Fall benutzen. :innocent:

Sooo…

Also erstmal einen sehr fetten und lang anhaltenden Dank an @Micha !!! Was er heute für mich getan hat (PN) ist zumindest für mich ne große Nummer. Habe viel gelernt und kenne jetzt schonmal eine mögliche Richtung für meine BLU-Probleme mit der Einbindung.

Das von ihm angepasste Script läuft super. Ein Event vom BLU DorWindow wird über einen Webhook lokal direkt an die homee gesendet. So habe ich nun den Status „geöffnet“ und „geschlossen“ als homeegramm zur Verfügung. Klasse!

Jetzt habe ich erstmal eine volle Birne, und auch Beinmuskeln. Denn zum Testen musste ich jedes Mal 2 Treppen rennen :rofl:. Am PC war das arbeiten besser als am Handy oder so.

Also @Micha und auch alle anderen: Voll guten und unversehrten Rutsch ins 2024!!!

Gruß

3 „Gefällt mir“

Danke @Poi für deine netten Worte.
Ist schon super was mit den Shelly script so geht. Damit kannst du auch super eine Anwesenheitserkennung via Bluetooth erstellen und per webhook den Status in homee setzen.

3 „Gefällt mir“

Hallo Detlef,
das klingt ja spannend mit dem Door Windows Sensor. Wenn du etwas Zeit hast, magst du mal deine Erkenntnisse hier im Forum teilen?
Ich überlege gerade, ob die Shelly Blu Door Window Sensoren, meine Fibaros ablösen sollen. Da sind die Batterien so teuer und die Shellys ließen sich unsichtbar verbauen.

Viele Grüße und einen guten Start ins neue Jahr!

André

Kann ich machen. @Micha hat mir ja geholfen. Wenn ich Zeit habe dann kann ich das machen. Gerade bin ich voll am Z-Wave Abrüsten und muß meine Alarmanlage wieder in Gang bekommen.

Die Shelly BLU DoorWin gefallen mir super gut! Reagieren deutlich schneller als die Fibaros. Für mich steht jetzt fest das ich alle auswechseln werde. Das Script läuft zuverlässig. Will es mit @Micha noch erweitern, das ich dann ein Script für alle DoorWin habe…

Gesundes Neues!

2 „Gefällt mir“

Ich experimentiere trotz allem mit MQTT weiter. Ich habe ein entsprechendes Script am laufen, hatte Probleme die sich langsam lichten.

Ich habe nie verstanden weshalb ich den Shelly nicht im Broker sehe. Mit MQTT Explorer sehe ich alle Shellies aber nicht diesen. Bis ich durch Zufall den Broker Schiffern lies und plötzlich der DoorWin zu sehen war! Ich hatte aus Jux den kleinen Knopf am Sensor gedrückt, das was die einzige Maßnahme die anders war.
Da erinnerte ich mich das man die Dinger immer aktivieren/aufwecken muß um Resultate sehen zu können. Ja toll… das es auch für dieses MQTT Script gilt war mir jetzt nicht bewusst!

Jetzt stehe ich vor dem Problem das die homee dieses Gerät nicht sehen kann. Muß ich beim Einrichten des Gerätes wenn die Suche aktiv ist den Shelly drücken? Denn bei der Suche findet er das Gerät trotzdem nicht. Zum drücken muß ich weit rennen…
Welches Gerät wähle ich in der Gruppe Shelly um es zu inkludieren? Denn ein „Sonstiges“ existiert ja nicht…

Grübel.

Hallo Leute und @mtbz,
Habe es geschafft den Shelly BLU Move in die homee via Webhook zu integrieren! Habe das bestehende Script so angepasst das es eine Bewegung meldet und auch wieder zurücksetzt wenn der BLU Move keine Bewegung mehr meldet.

Das Script zum BLU DoorWin läuft schon einige Tage und funktioniert super. Wie schon weiter oben angesprochen hat mich @Micha da gewaltig unterstützt!

Ich teste das jetzt erstmal wie es so klappt. Dann kann ich das Script auch gern hier veröffentlichen.

Ick freue mir schonma… :grinning:

5 „Gefällt mir“

Generell wäre es sinnvoll, daraus ein Wiki mit den schon e4stellten Stripten zu erstellen. Tolle Arbeit von Euch beiden :+1::+1::+1:

4 „Gefällt mir“

Wenn ich dann soweit bin und mich mit @Micha abgesprochen habe dann gern!

Also bis auf das trottle von etwa 1 Sekunde ist das schonmal eine sehr brauchbare Sache! Ich stelle alle Bewegungsmelder und Fenster- Türkontakte um! Weg von Z-Wave, denn schon wieder ein Gerät nicht mehr verfügbar. Ausgerechnet die Alarmsirene! Geht nicht, sowas…

Wenn du von Zwave weg gehst, was für Rauchmelder oder Wassermelder nimmst du als Ersatz?

Hi…
Dann nehme ich Shelly, da gibt es welche die via MQTT (WLAN) kommunizieren. Ich mache damit zurzeit sehr gute Erfahrungen. Bewegungsmelder gibt es zwar auch von Shelly die MQTT sprechen, die fressen aber Batterie was ich nicht möchte. Deshalb befasse ich mich mit den BLU Geräten die echt nicht schlecht sind. Wenn homee es gebacken bekommt das auch Geräte die durch ein MQTT Script bereitgestellt werden erkannt und verarbeitet wäre das schlichtweg der Hammer!

Ein weiterer Grund sind die Preise und die Zuverlässigkeit der Shelly Plus Geräte! Ich war seeeehr positiv überrascht… Die Unterputz 1PM und 2PM schalten innerhalb Millisekunden. Bei den Fibaros merkst du wenn sie schalten, das dauert ne Sekunde.

Gruß!

1 „Gefällt mir“

Ich habe jetzt ein WiKi erstellt. Hoffe das es ausreichend erklärt ist. :innocent: :tumbler_glass:

Zum WiKi…

7 „Gefällt mir“

Super. Vielen Dank. Ich schau gleich morgen rein. Meine ersten Shelly Plus sind schon in Betrieb. Der Door Window liegt noch verpackt hier.

1 „Gefällt mir“

Hey super Arbeit von euch. :+1: Habe mir einen BLU Door/Window Sensor zugelegt und es funktioniert mit dem Script.

Einen Fehler hatte ich Anfangs: Die Mac Adresses des Shellys wird in der App ohne „:“ angezeigt. Die muss man dann noch mit einbauen.

Was mir noch aufgefallen ist Webhooks werden permanent getriggert.

Es gibt wohl auch Sensoren die den Neigungswinkel messen. Meiner kann es nicht oder wird nicht angezeigt. Wie siehts bei deinem aus? Das wäre ja auch sehr nützlich.