SHELLY BLU DOOR/WINDOW - in homee integrierbar?

Hallo,
die Shelly Blu Door interessieren mich. Ist es möglich diese über die homee anzusprechen? Ich weiß das ein Blue Gateway nötig ist. Habe einen Shelly Pro 1.

Ich verstehe die Vorgehensweise noch nicht so richtig.

Danke und Gruß

Aktuell kannst du den nur über webhooks einbinden.
Dazu einfach ein Script auf dem Bluetooth Gateway laufen lassen und dieses schickt dir dann Nachrichten an homee.

1 „Gefällt mir“

Hmmm, das Licht schalten wäre ja über Szenen direkt per Shelly möglich. Ich möchte aber die Alarmanlage im Betrieb halten. Dafür benötige ich auf der homee eine Aktion „Wenn Tür öffnet dann“. Ist es schwer ein Script zu schreiben? Das ist Neuland für mich. Das Script muss ich dann auf den Shelly Plus 1 erstellen?

Etwas Einarbeitungszeit ist da von Nöten aber es gibt ja eine Bibliothek wo Beispiele sind und außerdem können wir dir ja helfen.
Kann dir nur nen Beispiel für den Blu motion geben aber das sollte dann ja ähnlich für den door sein.

1 „Gefällt mir“

Ich habe mich etwas belesen. Erstmal 2 von den Dingern bestellt. :blush:

Ich habe entdeckt das es ja MQTT Skripte gibt und im Shelly sogar eine Bibliothek mit Skripten. Das ist schonmal sehr positiv!

Wenn ich das hinbekomme, dann könnte ich auch die BLU Motion als Ersatz für die Fibaro benutzen. Das sind für mich ja schonmal positive Aussichten!

Ich melde mich hier wenn die BLU Door eingetroffen sind…

Danke, Gruß und noch nette Weihnachtstage.

1 „Gefällt mir“

MQTT bringt dich aber nicht weiter wenn pur mit homee arbeitest.

In wiefern? Die Shelly’s kommunizieren doch alle über MQTT mit der homee?! Oder verstehe ich da etwas nicht richtig? :innocent:

Ich stelle mir das so vor, das die homee dann die „Schalter“ sieht und ich die nutzen kann…

Ja wenn du den Schalter nicht anders nutzen magst dann ja. Aber grundsätzlich kannst du das up Modul ja auch normal benutzen und lässt da einfach dein Script drauf laufen.

@Micha, ich weiß im Moment noch garnix… :sunglasses:
In kurzer Zeit werde ich 2 Shelly BLU bekommen. Dann versuche ich mich mal, wenn du/ihr mich unterstützt wäre das cool!

Ich bin echt gespannt. Denn die Shelly‘s machen für mich einen sehr guten Eindruck! Nicht nur der Preis sondern auch die Technik selbst. Batterielaufzeit von 5 Jahren… uff. Das überzeugt. :blush:

Gruß!

Ja sag einfach Bescheid wenn ich dir da helfen kann. VG

2 „Gefällt mir“

So, @Micha, ich habe die beiden Geräte bekommen. Beide sind in der Shelly-App eingebunden und funktionieren. Softwareupdates sind auch durchgelaufen.

Wie komme ich jetzt weiter? Ich brauche wie ich vermute ein Script welches den BLU Door via MQTT über den Shelly Plus 1PM an die homee meldet. Sind meine Gedanken soweit richtig?

Bin mal gespannt ob ich das hinbekomme. Ich habe da ein Script „Blu_to_MQTT v1.0“ versucht. Unter „var custom_Names=“ habe ich die MAC und den Namen vergeben, das Script aktiviert. Jetzt weiß ich nicht wie ich das Gerät in der homee finden kann, da dort unter Shelly ja nur vorgegebene WLAN Geräte eingetragen sind…. Uff!!

Danke und Gruß

Da ich keinen door habe kann ich dir nur mal den Code vom motion geben wo ich Anpassungen für den webhook eingebaut habe.
Die motion blu gibt es schon in der Bibliothek der Scripte.

1 „Gefällt mir“

Jo, evtl sehe ich was und ich komme weiter. :blush:

1 „Gefällt mir“

…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: