Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Tester
  4. Shelly >= 6.6.0 mit BLU-Geräten (Bluetooth Low Energy)

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    774

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    18
    1
    6.2k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.5k

Shelly >= 6.6.0 mit BLU-Geräten (Bluetooth Low Energy)

Scheduled Pinned Locked Moved Tester
159 Posts 37 Posters 37.9k Views 37 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • HumidorH Humidor

    @joesch80 dann liegt es nicht an der mehrfach Verwendung, aber woran dann?

    Jey CeeJ Online
    Jey CeeJ Online
    Jey Cee
    Developer
    wrote on last edited by
    #86

    @humidor Batterien mal geprüft? Bei meinen Blu Buttons waren die nach kurzer Zeit leer. Ein Firmware Update soll das beheben.
    Hab mir das changelog angesehen und die Firmware ist auch für die Motion und noch ein anderes Gerät.
    Vielleicht hilft ja ein Firmware update bei deinem Problem.

    Persönlicher Support
    Spenden -> paypal.me/J3YC33

    HumidorH 1 Reply Last reply
    0
    • Jey CeeJ Jey Cee

      @humidor Batterien mal geprüft? Bei meinen Blu Buttons waren die nach kurzer Zeit leer. Ein Firmware Update soll das beheben.
      Hab mir das changelog angesehen und die Firmware ist auch für die Motion und noch ein anderes Gerät.
      Vielleicht hilft ja ein Firmware update bei deinem Problem.

      HumidorH Online
      HumidorH Online
      Humidor
      wrote on last edited by
      #87

      @jey-cee sind grad mal 2 Wochen im Einsatz, bei Montage habe ich die Batterien getestet und das FW-Update gemacht. In der Shelly-App sehe ich die Änderung. Nur im Objektbau wird nicht aktualisiert.

      BG

      Jey CeeJ 1 Reply Last reply
      0
      • HumidorH Humidor

        @jey-cee sind grad mal 2 Wochen im Einsatz, bei Montage habe ich die Batterien getestet und das FW-Update gemacht. In der Shelly-App sehe ich die Änderung. Nur im Objektbau wird nicht aktualisiert.

        Jey CeeJ Online
        Jey CeeJ Online
        Jey Cee
        Developer
        wrote on last edited by
        #88

        @humidor es gibt ja zwei Einträge im Adapter für BLE, einmal die Allgemeine Übersicht und dann nochmal unter dem jeweiligen shelly. Da tut sich in keinem davon etwas?
        Sind noch weitere BLE Geräte über diesen Shelly eingebunden und kommen da Daten an?
        Weiteres was mir einfällt:
        Hast du vielleicht versehentlich das Skript auf dem Shelly deaktiviert?
        Ist in den BLE Einstellungen auf dem Shelly das Bluetooth Gateway (die dritte Option bei Bluetooth) aktiviert? Die verhindert auch das Daten an den Adapter geschickt werden.

        Persönlicher Support
        Spenden -> paypal.me/J3YC33

        HumidorH 1 Reply Last reply
        0
        • Jey CeeJ Jey Cee

          @humidor es gibt ja zwei Einträge im Adapter für BLE, einmal die Allgemeine Übersicht und dann nochmal unter dem jeweiligen shelly. Da tut sich in keinem davon etwas?
          Sind noch weitere BLE Geräte über diesen Shelly eingebunden und kommen da Daten an?
          Weiteres was mir einfällt:
          Hast du vielleicht versehentlich das Skript auf dem Shelly deaktiviert?
          Ist in den BLE Einstellungen auf dem Shelly das Bluetooth Gateway (die dritte Option bei Bluetooth) aktiviert? Die verhindert auch das Daten an den Adapter geschickt werden.

          HumidorH Online
          HumidorH Online
          Humidor
          wrote on last edited by Humidor
          #89

          @jey-cee das Script läuft auf einem 1 PM, der Übermittelt mir Daten, das Gateway ist deaktiviert.
          allerdings sehe ich gerade, dass am 0-10V Dimmer das Gateway aktiviert ist, wo die 3 neuen BLE hängen und diese funktionieren.
          Script läuft natürlich.

          BG

          HumidorH 1 Reply Last reply
          0
          • HumidorH Humidor

            @jey-cee das Script läuft auf einem 1 PM, der Übermittelt mir Daten, das Gateway ist deaktiviert.
            allerdings sehe ich gerade, dass am 0-10V Dimmer das Gateway aktiviert ist, wo die 3 neuen BLE hängen und diese funktionieren.
            Script läuft natürlich.

            HumidorH Online
            HumidorH Online
            Humidor
            wrote on last edited by
            #90

            @humidor die 2 ersten BL‘s kommen nicht mehr rein, die neuen 3 fkt einwandfrei?

            BG

            1 Reply Last reply
            0
            • A Offline
              A Offline
              Apfelwurm
              wrote on last edited by
              #91

              Ich hab mal das Script angepasst.
              MAC Adresse in Namen übersetzen und die Zeile ersetzt damit ein BLU H&T die Werte richtig überträgt. Vielleicht hilft es ja dem ein oder anderen.

              // v0.2 custom 
              let SCRIPT_VERSION = '0.2';
              let BTHOME_SVC_ID_STR = 'fcd2';
              
              let uint8 = 0;
              let int8 = 1;
              let uint16 = 2;
              let int16 = 3;
              let uint24 = 4;
              let int24 = 5;
              
              let BTH = {};
              let SHELLY_ID = undefined;
              
              const BTH = {
                  0x00: { n: 'pid', t: uint8 },
                  0x01: { n: 'battery', t: uint8, u: '%' },
                  0x02: { n: 'temperature', t: int16, f: 0.01, u: 'tC' },
                  0x45: { n: 'temperature', t: int16, f: 0.1, u: 'tC' },
                  0x03: { n: 'humidity', t: uint16, f: 0.01, u: '%' },
                  0x2e: { n: 'humidity', t: uint8, u: '%' },
                  0x05: { n: 'illuminance', t: uint24, f: 0.01 },
                  0x1a: { n: 'door', t: uint8 },
                  0x20: { n: 'moisture', t: uint8 },
                  0x21: { n: 'motion', t: uint8 },
                  0x2d: { n: 'window', t: uint8 },
                  0x3a: { n: 'button', t: uint8 },
                  0x3f: { n: 'rotation', t: int16, f: 0.1 }
              };
              
              // Mapping of MAC addresses to individual names
              let macToName = {
                  'aa:bb:cc:dd:ee:ff': 'Device1',
                  '11:22:33:44:55:66': 'Device2'
              };
              
              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;
              }
              
              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 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') {
                              console.log('Error: unknown type ' + buffer.at(0));
                              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 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'
                  ) {
                      // console.log('Error: Missing service_data member');
                      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"]
                  ) {
                      console.log('Error: Encrypted devices are not supported');
                      return;
                  }
              
                  // exit if the event is duplicated
                  if (lastPacketId === unpackedData.pid) {
                      return;
                  }
              
                  lastPacketId = unpackedData.pid;
              
                  unpackedData.rssi = result.rssi;
                  unpackedData.address = result.addr;
              
                  // Convert MAC address to lowercase for case insensitive matching
                  let macLower = result.addr.toLowerCase();
                  let deviceName = macToName[macLower] || result.addr;
              
                  // create MQTT-Payload
                  let message = {
                      scriptVersion: SCRIPT_VERSION,
                      src: SHELLY_ID,
                      srcBle: {
                          type: result.local_name,
                          mac: deviceName
                      },
                      payload: unpackedData
                  };
              
                  console.log('Received ' + JSON.stringify(unpackedData));
              
                  if (MQTT.isConnected()) {
                      MQTT.publish(SHELLY_ID + '/events/ble', JSON.stringify(message));
                  }
              }
              
              // Initializes the script and performs the necessary checks and configurations
              function init() {
                  // 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 in the 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: true
                      });
              
                      if (!bleScanner) {
                          console.log('Error: Can not start new scanner');
                      }
                  }
              
                  BLE.Scanner.Subscribe(bleScanCallback);
              }
              
              Shelly.call('Mqtt.GetConfig', '', function (res, err_code, err_msg, ud) {
                  SHELLY_ID = res['topic_prefix'];
              
                  init();
              });
              
              HumidorH 1 Reply Last reply
              1
              • K Offline
                K Offline
                kg36304
                wrote on last edited by kg36304
                #92

                Hallo, ich habe aktuell ein Problem.

                Ich habe den Shelly blu Motion soweit ins Syytem bekommen.
                Wenn ich den Raum betrete schalten die Lichter auch an und im Iobroker steht detection (1).
                Nach einiger Zeit steht Clear(0) und er springt nach der Blindzeit wieder auf Detection(1).
                Das macht er 5-6 mal und immer geht das Licht an und aus. Nach einiger Zeit. hört es auf und er bleibt auf clear(0).

                Woran liegt das???

                Was mache ich falsch???

                Hier das script dazu

                on({ id: [].concat(['shelly.1.ble.e8:e0:7e:bf:46:63.motion']), change: 'ne' }, async (obj) => {
                  let value = obj.state.val;
                  let oldValue = obj.oldState.val;
                  if (getState('shelly.1.ble.e8:e0:7e:bf:46:63.motion').val == true && getState('shelly.1.ble.e8:e0:7e:bf:46:63.illuminance').val < 10) {
                    // Licht Vorraum
                    setState('shelly.1.shelly1minig3#84fce63a1670#1.Relay0.Switch' /* Schalter */, true);
                    // Licht Stufe
                    setState('shelly.0.SHDM-2#C8C9A33BF8AF#1.lights.Switch' /* Schalter */, true);
                  } else if (getState('shelly.1.ble.e8:e0:7e:bf:46:63.motion').val == false) {
                    // Licht Vorraum
                    setStateDelayed('shelly.1.shelly1minig3#84fce63a1670#1.Relay0.Switch' /* Schalter */, false, 1800000, false);
                    // Licht Tablet
                    setStateDelayed('shelly.1.shelly1minig3#84fce638dec0#1.Relay0.Switch' /* Schalter */, false, 1800000, false);
                    // Stufe
                    setStateDelayed('shelly.0.SHDM-2#C8C9A33BF8AF#1.lights.Switch' /* Schalter */, false, 1800000, false);
                  }
                });
                on({ id: [].concat(['shelly.1.ble.e8:e0:7e:bf:46:63.motion']), change: 'ne' }, async (obj) => {
                  let value = obj.state.val;
                  let oldValue = obj.oldState.val;
                  if (getState('shelly.1.ble.e8:e0:7e:bf:46:63.motion').val == true) {
                    // Licht Tablet
                    setState('shelly.1.shelly1minig3#84fce638dec0#1.Relay0.Switch' /* Schalter */, true);
                  }
                });
                
                //JTNDeG1sJTIweG1sbnMlM0QlMjJodHRwcyUzQSUyRiUyRmRldmVsb3BlcnMuZ29vZ2xlLmNvbSUyRmJsb2NrbHklMkZ4bWwlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJvbl9leHQlMjIlMjBpZCUzRCUyMkR4dVZmJTNCZkVqJTI0ZGdXTiU3Q21PMnhRJTIyJTIweCUzRCUyMjExMyUyMiUyMHklM0QlMjItODclMjIlM0UlM0NtdXRhdGlvbiUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYxOTk5JTJGeGh0bWwlMjIlMjBpdGVtcyUzRCUyMjElMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkNPTkRJVElPTiUyMiUzRW5lJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJBQ0tfQ09ORElUSU9OJTIyJTNFJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJPSUQwJTIyJTNFJTNDc2hhZG93JTIwdHlwZSUzRCUyMmZpZWxkX29pZCUyMiUyMGlkJTNEJTIycGx5bDdBTi4lM0QlNDAlN0NTJTI0JTNGVmZrUGk4JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyb2lkJTIyJTNFc2hlbGx5LjEuYmxlLmU4JTNBZTAlM0E3ZSUzQWJmJTNBNDYlM0E2My5tb3Rpb24lM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQyUyRnZhbHVlJTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMlNUQVRFTUVOVCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmNvbnRyb2xzX2lmJTIyJTIwaWQlM0QlMjJnLTZBbFh0aDMofjNTJTI1JTI0ITUufjclMjIlM0UlM0NtdXRhdGlvbiUyMGVsc2VpZiUzRCUyMjElMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMklGMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX29wZXJhdGlvbiUyMiUyMGlkJTNEJTIyMWtqJTdCckFRYm93VS5QJTdERiUzRFZIVy4lMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJPUCUyMiUzRUFORCUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2NvbXBhcmUlMjIlMjBpZCUzRCUyMiUzQSU1QjQlM0RCcGVkNCU3RCU1RDNmaSUyNCU2MHBzOSU0MCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk9QJTIyJTNFRVElM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMkElMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJnZXRfdmFsdWUlMjIlMjBpZCUzRCUyMjRwQmdJJTJGUTklMkNPJTVEJTVFUjFsKkNxJTNEWiUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkFUVFIlMjIlM0V2YWwlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk9JRCUyMiUzRXNoZWxseS4xLmJsZS5lOCUzQWUwJTNBN2UlM0FiZiUzQTQ2JTNBNjMubW90aW9uJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQiUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2Jvb2xlYW4lMjIlMjBpZCUzRCUyMiUzQiUzRHpFJTNCKmJWSE96JTI0RyUyM0NrSSUzQSUzRnAlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJCT09MJTIyJTNFVFJVRSUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJCJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIybG9naWNfY29tcGFyZSUyMiUyMGlkJTNEJTIyJTdEblFFOUVqJTJCKThzM28lMjNSaTZfJTVERSUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk9QJTIyJTNFTFQlM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMkElMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJnZXRfdmFsdWUlMjIlMjBpZCUzRCUyMiUzQWFFKnZpXzkoUyUzRlJmLig0dSU2MGVmJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQVRUUiUyMiUzRXZhbCUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyT0lEJTIyJTNFc2hlbGx5LjEuYmxlLmU4JTNBZTAlM0E3ZSUzQWJmJTNBNDYlM0E2My5pbGx1bWluYW5jZSUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMkIlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJtYXRoX251bWJlciUyMiUyMGlkJTNEJTIyTnMlMjUlM0FfJTYwYypTJTYwUWclM0FsdHY0NSElNjAlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOVU0lMjIlM0UxMCUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMkRPMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmNvbW1lbnQlMjIlMjBpZCUzRCUyMiUyNSU3QiU3QiUyNG82Vm9OeiUyQlYlNUUlM0EqQng3UGUlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJDT01NRU5UJTIyJTNFTGljaHQlMjBWb3JyYXVtJTNDJTJGZmllbGQlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIyY29udHJvbCUyMiUyMGlkJTNEJTIyRjclNjBLYmElMkY0dSU2MCU1QnBoaERCJTI0aE91JTIyJTNFJTNDbXV0YXRpb24lMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhodG1sJTIyJTIwZGVsYXlfaW5wdXQlM0QlMjJmYWxzZSUyMiUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyT0lEJTIyJTNFc2hlbGx5LjEuc2hlbGx5MW1pbmlnMyUyMzg0ZmNlNjNhMTY3MCUyMzEuUmVsYXkwLlN3aXRjaCUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyV0lUSF9ERUxBWSUyMiUzRUZBTFNFJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJWQUxVRSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2Jvb2xlYW4lMjIlMjBpZCUzRCUyMlhlUnUlNURQJTVET0glM0IlMkZBVSU2MDMlNUVFdiU0MFclMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJCT09MJTIyJTNFVFJVRSUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJjb21tZW50JTIyJTIwaWQlM0QlMjI3ZnpVLXZKX09vMkolMkY1Um9mSVI3JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQ09NTUVOVCUyMiUzRUxpY2h0JTIwU3R1ZmUlM0MlMkZmaWVsZCUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJjb250cm9sJTIyJTIwaWQlM0QlMjJBJTVCeUglNUVvVTdFSG03Rkp0b3glM0JZSCUyMiUzRSUzQ211dGF0aW9uJTIweG1sbnMlM0QlMjJodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjE5OTklMkZ4aHRtbCUyMiUyMGRlbGF5X2lucHV0JTNEJTIyZmFsc2UlMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk9JRCUyMiUzRXNoZWxseS4wLlNIRE0tMiUyM0M4QzlBMzNCRjhBRiUyMzEubGlnaHRzLlN3aXRjaCUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyV0lUSF9ERUxBWSUyMiUzRUZBTFNFJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJWQUxVRSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2Jvb2xlYW4lMjIlMjBpZCUzRCUyMiUyQiUyNCUyQiU3RGVaNEZqJTdEWX5IJTIzYXZZeEpoJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQk9PTCUyMiUzRVRSVUUlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnN0YXRlbWVudCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMklGMSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2NvbXBhcmUlMjIlMjBpZCUzRCUyMng3RFElMjUqR3AxeUdkJTJGR25hZ2dYSyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk9QJTIyJTNFRVElM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMkElMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJnZXRfdmFsdWUlMjIlMjBpZCUzRCUyMigtJTVEZ3g0JTI0fjNxTUMlMkJpZH4lMjRrViU1RSUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkFUVFIlMjIlM0V2YWwlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk9JRCUyMiUzRXNoZWxseS4xLmJsZS5lOCUzQWUwJTNBN2UlM0FiZiUzQTQ2JTNBNjMubW90aW9uJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQiUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2Jvb2xlYW4lMjIlMjBpZCUzRCUyMiEybSkzJTJGSSUzQSUzRlYxcW9lJTIzUi1XOUYlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJCT09MJTIyJTNFRkFMU0UlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMkRPMSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmNvbW1lbnQlMjIlMjBpZCUzRCUyMndHUHduWSUyNTQlM0IuMCU3QipoLjJJRWFQJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQ09NTUVOVCUyMiUzRUxpY2h0JTIwVm9ycmF1bSUzQyUyRmZpZWxkJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmNvbnRyb2wlMjIlMjBpZCUzRCUyMjJGLlNJaDRxJTNBT3FqQSpCckwlM0FSJTVCJTIyJTNFJTNDbXV0YXRpb24lMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhodG1sJTIyJTIwZGVsYXlfaW5wdXQlM0QlMjJ0cnVlJTIyJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJPSUQlMjIlM0VzaGVsbHkuMS5zaGVsbHkxbWluaWczJTIzODRmY2U2M2ExNjcwJTIzMS5SZWxheTAuU3dpdGNoJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJXSVRIX0RFTEFZJTIyJTNFVFJVRSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyREVMQVlfTVMlMjIlM0UzMCUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVU5JVCUyMiUzRW1pbiUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQ0xFQVJfUlVOTklORyUyMiUzRUZBTFNFJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJWQUxVRSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2Jvb2xlYW4lMjIlMjBpZCUzRCUyMn5pTTZsZyUzQkw0RWRLJTJCRzBxJTIzUmpLJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQk9PTCUyMiUzRUZBTFNFJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmNvbW1lbnQlMjIlMjBpZCUzRCUyMjZrUXFfUyU3Q3MubEhsMyg2dCU1RHgtbiUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkNPTU1FTlQlMjIlM0VMaWNodCUyMFRhYmxldCUzQyUyRmZpZWxkJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmNvbnRyb2wlMjIlMjBpZCUzRCUyMnN2R2ZYJTI1ZXdaOXdoJTI0JTNCTDFZaCFnJTIyJTNFJTNDbXV0YXRpb24lMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhodG1sJTIyJTIwZGVsYXlfaW5wdXQlM0QlMjJ0cnVlJTIyJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJPSUQlMjIlM0VzaGVsbHkuMS5zaGVsbHkxbWluaWczJTIzODRmY2U2MzhkZWMwJTIzMS5SZWxheTAuU3dpdGNoJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJXSVRIX0RFTEFZJTIyJTNFVFJVRSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyREVMQVlfTVMlMjIlM0UzMCUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVU5JVCUyMiUzRW1pbiUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQ0xFQVJfUlVOTklORyUyMiUzRUZBTFNFJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJWQUxVRSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2Jvb2xlYW4lMjIlMjBpZCUzRCUyMmNSZXUlMjRueSgwaSU3QiUyQ3QoZnYlM0YlNDAlM0YlM0IlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJCT09MJTIyJTNFRkFMU0UlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIyY29tbWVudCUyMiUyMGlkJTNEJTIyZGhqcHVvLnNzZiU1QmYqSVQ3JTJCc1ZGJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQ09NTUVOVCUyMiUzRVN0dWZlJTNDJTJGZmllbGQlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIyY29udHJvbCUyMiUyMGlkJTNEJTIyRipRTCUyQ0gyQ0slNUJuJTIzJTNCNVdJJTdDMGNzJTIyJTNFJTNDbXV0YXRpb24lMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhodG1sJTIyJTIwZGVsYXlfaW5wdXQlM0QlMjJ0cnVlJTIyJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJPSUQlMjIlM0VzaGVsbHkuMC5TSERNLTIlMjNDOEM5QTMzQkY4QUYlMjMxLmxpZ2h0cy5Td2l0Y2glM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMldJVEhfREVMQVklMjIlM0VUUlVFJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJERUxBWV9NUyUyMiUzRTMwJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJVTklUJTIyJTNFbWluJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJDTEVBUl9SVU5OSU5HJTIyJTNFRkFMU0UlM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlZBTFVFJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIybG9naWNfYm9vbGVhbiUyMiUyMGlkJTNEJTIyMnglNUUob3YlN0QlMjQ2OGVXMiU0MG4wLW5PaiUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkJPT0wlMjIlM0VGQUxTRSUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGc3RhdGVtZW50JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZzdGF0ZW1lbnQlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIyb25fZXh0JTIyJTIwaWQlM0QlMjIlNUJXa2slN0JvITRaVEJPJTI1aiUzREtJJTJDJTI0WSUyMiUzRSUzQ211dGF0aW9uJTIweG1sbnMlM0QlMjJodHRwJTNBJTJGJTJGd3d3LnczLm9yZyUyRjE5OTklMkZ4aHRtbCUyMiUyMGl0ZW1zJTNEJTIyMSUyMiUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQ09ORElUSU9OJTIyJTNFbmUlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkFDS19DT05ESVRJT04lMjIlM0UlM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMk9JRDAlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIyZmllbGRfb2lkJTIyJTIwaWQlM0QlMjJWcyUyNWllRzklM0FoYWJfcWZWJTNBVjBiQSUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMm9pZCUyMiUzRXNoZWxseS4xLmJsZS5lOCUzQWUwJTNBN2UlM0FiZiUzQTQ2JTNBNjMubW90aW9uJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0MlMkZ2YWx1ZSUzRSUzQ3N0YXRlbWVudCUyMG5hbWUlM0QlMjJTVEFURU1FTlQlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJjb250cm9sc19pZiUyMiUyMGlkJTNEJTIyJTVEUy1+WCUzRGxIbX4wbHBtY3lLJTJCJTJDJTNGJTIyJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIySUYwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIybG9naWNfY29tcGFyZSUyMiUyMGlkJTNEJTIyYmxNSGV5dU8lN0QlM0JTSCUyNFIwbmQlM0ZfNyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk9QJTIyJTNFRVElM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMkElMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJnZXRfdmFsdWUlMjIlMjBpZCUzRCUyMnlKZlIzV1FEN1A4bU51MGV4JTNCJTNCXyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkFUVFIlMjIlM0V2YWwlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk9JRCUyMiUzRXNoZWxseS4xLmJsZS5lOCUzQWUwJTNBN2UlM0FiZiUzQTQ2JTNBNjMubW90aW9uJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQiUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2Jvb2xlYW4lMjIlMjBpZCUzRCUyMk0lNUUlNUJhM1glMkYlMjNFRiUzQiU3RFAlNUQlNDAlNDBWdnIyJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQk9PTCUyMiUzRVRSVUUlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMkRPMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmNvbW1lbnQlMjIlMjBpZCUzRCUyMiUyRjlORUlWYkElNDAlM0ElM0JoJTIzdSUyQlclNDAucWglMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJDT01NRU5UJTIyJTNFTGljaHQlMjBUYWJsZXQlM0MlMkZmaWVsZCUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJjb250cm9sJTIyJTIwaWQlM0QlMjJQJTdCdnVlQyUyM1UlMjRnQiU1RG9pMXlKT1VZJTIyJTNFJTNDbXV0YXRpb24lMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhodG1sJTIyJTIwZGVsYXlfaW5wdXQlM0QlMjJmYWxzZSUyMiUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyT0lEJTIyJTNFc2hlbGx5LjEuc2hlbGx5MW1pbmlnMyUyMzg0ZmNlNjM4ZGVjMCUyMzEuUmVsYXkwLlN3aXRjaCUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyV0lUSF9ERUxBWSUyMiUzRUZBTFNFJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJWQUxVRSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2Jvb2xlYW4lMjIlMjBpZCUzRCUyMiUyQ0RZZ3olNDBNVSU2MGY2a1dPbXVubE95JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQk9PTCUyMiUzRVRSVUUlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnN0YXRlbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGc3RhdGVtZW50JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ4bWwlM0U=
                
                
                1 Reply Last reply
                0
                • K Offline
                  K Offline
                  kg36304
                  wrote on last edited by
                  #93

                  Hier noch ein Bild vom Blockly:

                  Bildschirmfoto 2024-06-17 um 22.02.16.png

                  A 1 Reply Last reply
                  0
                  • K kg36304

                    Hier noch ein Bild vom Blockly:

                    Bildschirmfoto 2024-06-17 um 22.02.16.png

                    A Offline
                    A Offline
                    Apfelwurm
                    wrote on last edited by
                    #94

                    @kg36304

                    Wenn ich es richtig verstehe willst du wenn Bewegung erkannt das Licht für Zeit x an ist.

                    Dann müsst ja noch einen Timer einbauen der immer von vorne beginnt wenn eine neue Bewegung erkannt wird.

                    Aber so macht er es ja richtig Bewegung an keine Bewegung aus dann wieder Bewegung an.

                    1 Reply Last reply
                    0
                    • A Apfelwurm

                      Ich hab mal das Script angepasst.
                      MAC Adresse in Namen übersetzen und die Zeile ersetzt damit ein BLU H&T die Werte richtig überträgt. Vielleicht hilft es ja dem ein oder anderen.

                      // v0.2 custom 
                      let SCRIPT_VERSION = '0.2';
                      let BTHOME_SVC_ID_STR = 'fcd2';
                      
                      let uint8 = 0;
                      let int8 = 1;
                      let uint16 = 2;
                      let int16 = 3;
                      let uint24 = 4;
                      let int24 = 5;
                      
                      let BTH = {};
                      let SHELLY_ID = undefined;
                      
                      const BTH = {
                          0x00: { n: 'pid', t: uint8 },
                          0x01: { n: 'battery', t: uint8, u: '%' },
                          0x02: { n: 'temperature', t: int16, f: 0.01, u: 'tC' },
                          0x45: { n: 'temperature', t: int16, f: 0.1, u: 'tC' },
                          0x03: { n: 'humidity', t: uint16, f: 0.01, u: '%' },
                          0x2e: { n: 'humidity', t: uint8, u: '%' },
                          0x05: { n: 'illuminance', t: uint24, f: 0.01 },
                          0x1a: { n: 'door', t: uint8 },
                          0x20: { n: 'moisture', t: uint8 },
                          0x21: { n: 'motion', t: uint8 },
                          0x2d: { n: 'window', t: uint8 },
                          0x3a: { n: 'button', t: uint8 },
                          0x3f: { n: 'rotation', t: int16, f: 0.1 }
                      };
                      
                      // Mapping of MAC addresses to individual names
                      let macToName = {
                          'aa:bb:cc:dd:ee:ff': 'Device1',
                          '11:22:33:44:55:66': 'Device2'
                      };
                      
                      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;
                      }
                      
                      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 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') {
                                      console.log('Error: unknown type ' + buffer.at(0));
                                      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 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'
                          ) {
                              // console.log('Error: Missing service_data member');
                              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"]
                          ) {
                              console.log('Error: Encrypted devices are not supported');
                              return;
                          }
                      
                          // exit if the event is duplicated
                          if (lastPacketId === unpackedData.pid) {
                              return;
                          }
                      
                          lastPacketId = unpackedData.pid;
                      
                          unpackedData.rssi = result.rssi;
                          unpackedData.address = result.addr;
                      
                          // Convert MAC address to lowercase for case insensitive matching
                          let macLower = result.addr.toLowerCase();
                          let deviceName = macToName[macLower] || result.addr;
                      
                          // create MQTT-Payload
                          let message = {
                              scriptVersion: SCRIPT_VERSION,
                              src: SHELLY_ID,
                              srcBle: {
                                  type: result.local_name,
                                  mac: deviceName
                              },
                              payload: unpackedData
                          };
                      
                          console.log('Received ' + JSON.stringify(unpackedData));
                      
                          if (MQTT.isConnected()) {
                              MQTT.publish(SHELLY_ID + '/events/ble', JSON.stringify(message));
                          }
                      }
                      
                      // Initializes the script and performs the necessary checks and configurations
                      function init() {
                          // 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 in the 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: true
                              });
                      
                              if (!bleScanner) {
                                  console.log('Error: Can not start new scanner');
                              }
                          }
                      
                          BLE.Scanner.Subscribe(bleScanCallback);
                      }
                      
                      Shelly.call('Mqtt.GetConfig', '', function (res, err_code, err_msg, ud) {
                          SHELLY_ID = res['topic_prefix'];
                      
                          init();
                      });
                      
                      HumidorH Online
                      HumidorH Online
                      Humidor
                      wrote on last edited by
                      #95

                      @apfelwurm leider, auch dieses Script bringt mir kein Event in den ioBroker

                      BG

                      1 Reply Last reply
                      0
                      • K Offline
                        K Offline
                        kg36304
                        wrote on last edited by
                        #96

                        Hallo,

                        danke für die Antworten. Funktioniert jetzt.

                        1 Reply Last reply
                        0
                        • spinottiS Offline
                          spinottiS Offline
                          spinotti
                          wrote on last edited by
                          #97

                          Hi zusammen

                          ich hätte mal eine Frage zu diesem Thema.
                          Ich habe jetzt ein neues Shelly Gateway und darauf ein das neue Shelly BLU TRV verbunden.

                          Ich schaffe es leider nicht per MQTT die Daten in den iobroker zu bringen. Hab schon mehrere Anpassungen am Script versucht.
                          Das ist der Script den ich drin hab im BLU Gateway Gen.3

                          Ich habe alles nach der Anleitung hier gemacht:
                          https://github.com/iobroker-community-adapters/ioBroker.shelly/blob/master/docs/en/ble-devices.md

                          Das neueste Script ist drin.

                          // v0.4
                          const SCRIPT_VERSION = '0.4';
                          const BTHOME_SVC_ID_STR = 'fcd2';
                          
                          const uint8 = 0;
                          const int8 = 1;
                          const uint16 = 2;
                          const int16 = 3;
                          const uint24 = 4;
                          const int24 = 5;
                          const uint32 = 6;
                          const int32 = 7;
                          
                          let SHELLY_ID = undefined;
                          
                          const BTH = {
                              // Misc
                              0x00: { n: 'pid', t: uint8 },
                              0xf0: { n: 'device_type', t: uint16 },
                              0xf1: { n: 'firmware_version', t: uint32 },
                              0xf2: { n: 'firmware_version', t: uint24 },
                              // Sensor data
                              0x51: { n: 'acceleration', t: uint16, f: 0.001, u: 'm/s²' },
                              0x01: { n: 'battery', t: uint8, u: '%' },
                              0x12: { n: 'co2', t: uint16, u: 'ppm' },
                              0x09: { n: 'count', t: uint8 },
                              0x3d: { n: 'count', t: uint8 },
                              0x3e: { n: 'count', t: uint8 },
                              0x43: { n: 'current', t: uint16, f: 0.001, u: 'A' },
                              0x08: { n: 'dewpoint', t: int16, f: 0.01, u: '°C' },
                              0x40: { n: 'distance_mm', t: uint16, u: 'mm' },
                              0x41: { n: 'distance_m', t: uint16, f: 0.1, u: 'm' },
                              0x42: { n: 'duration', t: uint24, f: 0.001, u: 's' },
                              0x4d: { n: 'energy', t: uint32, f: 0.001, u: 'kWh' },
                              0x0a: { n: 'energy', t: uint24, f: 0.001, u: 'kWh' },
                              0x4b: { n: 'gas', t: uint24, f: 0.001, u: 'm3' },
                              0x4c: { n: 'gas', t: uint32, f: 0.001, u: 'm3' },
                              0x52: { n: 'gyroscope', t: uint16, f: 0.001, u: '°/s' },
                              0x03: { n: 'humidity', t: uint16, f: 0.01, u: '%' },
                              0x2e: { n: 'humidity', t: uint8, u: '%' },
                              0x05: { n: 'illuminance', t: uint24, f: 0.01, u: 'lux' },
                              0x06: { n: 'mass_kg', t: uint16, f: 0.01, u: 'kg' },
                              0x07: { n: 'mass_lb', t: uint16, f: 0.01, u: 'lb' },
                              0x14: { n: 'moisture', t: uint16, f: 0.01, u: '%' },
                              0x2f: { n: 'moisture', t: uint8, u: '%' },
                              0x0d: { n: 'pm2_5', t: uint16, u: 'ug/m3' },
                              0x0e: { n: 'pm10', t: uint16, u: 'ug/m3' },
                              0x0b: { n: 'power', t: uint24, f: 0.01, u: 'W' },
                              0x04: { n: 'pressure', t: uint24, f: 0.01, u: 'hPa' },
                              0x3f: { n: 'rotation', t: int16, f: 0.1, u: '°' },
                              0x44: { n: 'speed', t: uint16, f: 0.01, u: 'm/s' },
                              0x45: { n: 'temperature', t: int16, f: 0.1, u: '°C' },
                              0x02: { n: 'temperature', t: int16, f: 0.01, u: '°C' },
                              0x13: { n: 'tvoc', t: uint16, u: 'ug/m3' },
                              0x0c: { n: 'voltage', t: uint16, f: 0.001, u: 'V' },
                              0x4a: { n: 'voltage', t: uint16, f: 0.1, u: 'V' },
                              0x4e: { n: 'volume', t: uint32, f: 0.001, u: 'l' },
                              0x47: { n: 'volume', t: uint16, f: 0.1, u: 'l' },
                              0x48: { n: 'volume', t: uint16, u: 'ml' },
                              0x55: { n: 'volume', t: uint32, f: 0.001, u: 'l' },
                              0x49: { n: 'volume', t: uint16, f: 0.001, u: 'm3/h' },
                              0x46: { n: 'uv_index', t: uint8, f: 0.1 },
                              0x4f: { n: 'water', t: uint32, f: 0.001, u: 'l' },
                              // Binary Sensor data
                              0x15: { n: 'battery', t: uint8 },
                              0x16: { n: 'battery_charging', t: uint8 },
                              0x17: { n: 'carbon_monoxide', t: uint8 },
                              0x18: { n: 'cold', t: uint8 },
                              0x19: { n: 'connectivity', t: uint8 },
                              0x1a: { n: 'door', t: uint8 },
                              0x1b: { n: 'garage_door', t: uint8 },
                              0x1c: { n: 'gas', t: uint8 },
                              0x0f: { n: 'generic_boolean', t: uint8 },
                              0x1d: { n: 'heat', t: uint8 },
                              0x1e: { n: 'light', t: uint8 },
                              0x1f: { n: 'lock', t: uint8 },
                              0x20: { n: 'moisture', t: uint8 },
                              0x21: { n: 'motion', t: uint8 },
                              0x22: { n: 'moving', t: uint8 },
                              0x23: { n: 'occupancy', t: uint8 },
                              0x11: { n: 'opening', t: uint8 },
                              0x24: { n: 'plug', t: uint8 },
                              0x10: { n: 'power', t: uint8 },
                              0x25: { n: 'presence', t: uint8 },
                              0x26: { n: 'problem', t: uint8 },
                              0x27: { n: 'running', t: uint8 },
                              0x28: { n: 'safety', t: uint8 },
                              0x29: { n: 'smoke', t: uint8 },
                              0x2a: { n: 'sound', t: uint8 },
                              0x2b: { n: 'tamper', t: uint8 },
                              0x2c: { n: 'vibration', t: uint8 },
                              0x2d: { n: 'window', t: uint8 },
                              // Events
                              0x3a: { n: 'button', t: uint8, b: 1 },
                              0x3c: { n: 'dimmer', t: uint8 }
                          };
                          
                          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;
                          }
                          
                          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);
                              },
                              getUInt32LE: function (buffer) {
                                  return (
                                      0x00ffffffff & ((buffer.at(3) << 24) | (buffer.at(2) << 16) | (buffer.at(1) << 8) | buffer.at(0))
                                  );
                              },
                              getInt32LE: function (buffer) {
                                  return this.utoi(this.getUInt32LE(buffer), 32);
                              },
                              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);
                                  if (type === uint32) res = this.getUInt32LE(buffer);
                                  if (type === int32) res = this.getInt32LE(buffer);
                                  return res;
                              },
                              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;
                                  let _name;
                                  let _btnNum = 1;
                                  while (buffer.length > 0) {
                                      _bth = BTH[buffer.at(0)];
                                      if (typeof _bth === 'undefined') {
                                          console.log('Error: unknown type ' + buffer.at(0));
                                          break;
                                      }
                                      buffer = buffer.slice(1);
                                      _value = this.getBufValue(_bth.t, buffer);
                                      if (_value === null) break;
                                      if (typeof _bth.f !== 'undefined') _value = _value * _bth.f;
                          
                                      _name = _bth.n;
                                      if (typeof _bth.b !== "undefined") {
                                          _name = _name + '_' + _btnNum.toString();
                                          _btnNum++;
                                      }
                          
                                      result[_name] = _value;
                                      buffer = buffer.slice(getByteSize(_bth.t));
                                  }
                                  return result;
                              }
                          };
                          
                          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'
                              ) {
                                  // console.log('Error: Missing service_data member');
                                  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']
                              ) {
                                  console.log('Error: Encrypted devices are not supported');
                                  return;
                              }
                          
                              // exit if the event is duplicated
                              if (lastPacketId === unpackedData.pid) {
                                  return;
                              }
                          
                              lastPacketId = unpackedData.pid;
                          
                              unpackedData.rssi = result.rssi;
                              unpackedData.address = result.addr;
                          
                              // create MQTT-Payload
                              let message = {
                                  scriptVersion: SCRIPT_VERSION,
                                  src: SHELLY_ID,
                                  srcBle: {
                                      type: result.local_name,
                                      mac: result.addr
                                  },
                                  payload: unpackedData
                              };
                          
                              console.log('Received ' + JSON.stringify(unpackedData));
                          
                              if (MQTT.isConnected()) {
                                  MQTT.publish(SHELLY_ID + '/events/ble', JSON.stringify(message));
                              }
                          }
                          
                          // Initializes the script and performs the necessary checks and configurations
                          function init() {
                              // 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 in the 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: true
                                  });
                          
                                  if (!bleScanner) {
                                      console.log('Error: Can not start new scanner');
                                  }
                              }
                          
                              BLE.Scanner.Subscribe(bleScanCallback);
                          }
                          
                          Shelly.call('Mqtt.GetConfig', '', function (res, err_code, err_msg, ud) {
                              SHELLY_ID = res['topic_prefix'];
                          
                              init();
                          });
                          

                          alle Adapter sind aktualisiert
                          Shelly Geräte auch alle,
                          JS Controller upgedatet.
                          Shelly Adapter ist auf : V8.2.1

                          Ich bekomme vom Script immer die Meldung 84 zurück, weiß vielleicht jemand von euch woran das liegen könnte?
                          2024-11-01 12_55_02-Shelly BLU Gateway Gen3.png

                          Dadurch hab ich auch bei den Objekten unter BLE nichts drin
                          2024-11-01 12_53_18-objects - glt.png

                          Für einen Tipp wäre ich sehr dankbar.

                          Vielen Dank
                          LG Mathias

                          haus-automatisierungH 1 Reply Last reply
                          0
                          • spinottiS spinotti

                            Hi zusammen

                            ich hätte mal eine Frage zu diesem Thema.
                            Ich habe jetzt ein neues Shelly Gateway und darauf ein das neue Shelly BLU TRV verbunden.

                            Ich schaffe es leider nicht per MQTT die Daten in den iobroker zu bringen. Hab schon mehrere Anpassungen am Script versucht.
                            Das ist der Script den ich drin hab im BLU Gateway Gen.3

                            Ich habe alles nach der Anleitung hier gemacht:
                            https://github.com/iobroker-community-adapters/ioBroker.shelly/blob/master/docs/en/ble-devices.md

                            Das neueste Script ist drin.

                            // v0.4
                            const SCRIPT_VERSION = '0.4';
                            const BTHOME_SVC_ID_STR = 'fcd2';
                            
                            const uint8 = 0;
                            const int8 = 1;
                            const uint16 = 2;
                            const int16 = 3;
                            const uint24 = 4;
                            const int24 = 5;
                            const uint32 = 6;
                            const int32 = 7;
                            
                            let SHELLY_ID = undefined;
                            
                            const BTH = {
                                // Misc
                                0x00: { n: 'pid', t: uint8 },
                                0xf0: { n: 'device_type', t: uint16 },
                                0xf1: { n: 'firmware_version', t: uint32 },
                                0xf2: { n: 'firmware_version', t: uint24 },
                                // Sensor data
                                0x51: { n: 'acceleration', t: uint16, f: 0.001, u: 'm/s²' },
                                0x01: { n: 'battery', t: uint8, u: '%' },
                                0x12: { n: 'co2', t: uint16, u: 'ppm' },
                                0x09: { n: 'count', t: uint8 },
                                0x3d: { n: 'count', t: uint8 },
                                0x3e: { n: 'count', t: uint8 },
                                0x43: { n: 'current', t: uint16, f: 0.001, u: 'A' },
                                0x08: { n: 'dewpoint', t: int16, f: 0.01, u: '°C' },
                                0x40: { n: 'distance_mm', t: uint16, u: 'mm' },
                                0x41: { n: 'distance_m', t: uint16, f: 0.1, u: 'm' },
                                0x42: { n: 'duration', t: uint24, f: 0.001, u: 's' },
                                0x4d: { n: 'energy', t: uint32, f: 0.001, u: 'kWh' },
                                0x0a: { n: 'energy', t: uint24, f: 0.001, u: 'kWh' },
                                0x4b: { n: 'gas', t: uint24, f: 0.001, u: 'm3' },
                                0x4c: { n: 'gas', t: uint32, f: 0.001, u: 'm3' },
                                0x52: { n: 'gyroscope', t: uint16, f: 0.001, u: '°/s' },
                                0x03: { n: 'humidity', t: uint16, f: 0.01, u: '%' },
                                0x2e: { n: 'humidity', t: uint8, u: '%' },
                                0x05: { n: 'illuminance', t: uint24, f: 0.01, u: 'lux' },
                                0x06: { n: 'mass_kg', t: uint16, f: 0.01, u: 'kg' },
                                0x07: { n: 'mass_lb', t: uint16, f: 0.01, u: 'lb' },
                                0x14: { n: 'moisture', t: uint16, f: 0.01, u: '%' },
                                0x2f: { n: 'moisture', t: uint8, u: '%' },
                                0x0d: { n: 'pm2_5', t: uint16, u: 'ug/m3' },
                                0x0e: { n: 'pm10', t: uint16, u: 'ug/m3' },
                                0x0b: { n: 'power', t: uint24, f: 0.01, u: 'W' },
                                0x04: { n: 'pressure', t: uint24, f: 0.01, u: 'hPa' },
                                0x3f: { n: 'rotation', t: int16, f: 0.1, u: '°' },
                                0x44: { n: 'speed', t: uint16, f: 0.01, u: 'm/s' },
                                0x45: { n: 'temperature', t: int16, f: 0.1, u: '°C' },
                                0x02: { n: 'temperature', t: int16, f: 0.01, u: '°C' },
                                0x13: { n: 'tvoc', t: uint16, u: 'ug/m3' },
                                0x0c: { n: 'voltage', t: uint16, f: 0.001, u: 'V' },
                                0x4a: { n: 'voltage', t: uint16, f: 0.1, u: 'V' },
                                0x4e: { n: 'volume', t: uint32, f: 0.001, u: 'l' },
                                0x47: { n: 'volume', t: uint16, f: 0.1, u: 'l' },
                                0x48: { n: 'volume', t: uint16, u: 'ml' },
                                0x55: { n: 'volume', t: uint32, f: 0.001, u: 'l' },
                                0x49: { n: 'volume', t: uint16, f: 0.001, u: 'm3/h' },
                                0x46: { n: 'uv_index', t: uint8, f: 0.1 },
                                0x4f: { n: 'water', t: uint32, f: 0.001, u: 'l' },
                                // Binary Sensor data
                                0x15: { n: 'battery', t: uint8 },
                                0x16: { n: 'battery_charging', t: uint8 },
                                0x17: { n: 'carbon_monoxide', t: uint8 },
                                0x18: { n: 'cold', t: uint8 },
                                0x19: { n: 'connectivity', t: uint8 },
                                0x1a: { n: 'door', t: uint8 },
                                0x1b: { n: 'garage_door', t: uint8 },
                                0x1c: { n: 'gas', t: uint8 },
                                0x0f: { n: 'generic_boolean', t: uint8 },
                                0x1d: { n: 'heat', t: uint8 },
                                0x1e: { n: 'light', t: uint8 },
                                0x1f: { n: 'lock', t: uint8 },
                                0x20: { n: 'moisture', t: uint8 },
                                0x21: { n: 'motion', t: uint8 },
                                0x22: { n: 'moving', t: uint8 },
                                0x23: { n: 'occupancy', t: uint8 },
                                0x11: { n: 'opening', t: uint8 },
                                0x24: { n: 'plug', t: uint8 },
                                0x10: { n: 'power', t: uint8 },
                                0x25: { n: 'presence', t: uint8 },
                                0x26: { n: 'problem', t: uint8 },
                                0x27: { n: 'running', t: uint8 },
                                0x28: { n: 'safety', t: uint8 },
                                0x29: { n: 'smoke', t: uint8 },
                                0x2a: { n: 'sound', t: uint8 },
                                0x2b: { n: 'tamper', t: uint8 },
                                0x2c: { n: 'vibration', t: uint8 },
                                0x2d: { n: 'window', t: uint8 },
                                // Events
                                0x3a: { n: 'button', t: uint8, b: 1 },
                                0x3c: { n: 'dimmer', t: uint8 }
                            };
                            
                            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;
                            }
                            
                            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);
                                },
                                getUInt32LE: function (buffer) {
                                    return (
                                        0x00ffffffff & ((buffer.at(3) << 24) | (buffer.at(2) << 16) | (buffer.at(1) << 8) | buffer.at(0))
                                    );
                                },
                                getInt32LE: function (buffer) {
                                    return this.utoi(this.getUInt32LE(buffer), 32);
                                },
                                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);
                                    if (type === uint32) res = this.getUInt32LE(buffer);
                                    if (type === int32) res = this.getInt32LE(buffer);
                                    return res;
                                },
                                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;
                                    let _name;
                                    let _btnNum = 1;
                                    while (buffer.length > 0) {
                                        _bth = BTH[buffer.at(0)];
                                        if (typeof _bth === 'undefined') {
                                            console.log('Error: unknown type ' + buffer.at(0));
                                            break;
                                        }
                                        buffer = buffer.slice(1);
                                        _value = this.getBufValue(_bth.t, buffer);
                                        if (_value === null) break;
                                        if (typeof _bth.f !== 'undefined') _value = _value * _bth.f;
                            
                                        _name = _bth.n;
                                        if (typeof _bth.b !== "undefined") {
                                            _name = _name + '_' + _btnNum.toString();
                                            _btnNum++;
                                        }
                            
                                        result[_name] = _value;
                                        buffer = buffer.slice(getByteSize(_bth.t));
                                    }
                                    return result;
                                }
                            };
                            
                            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'
                                ) {
                                    // console.log('Error: Missing service_data member');
                                    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']
                                ) {
                                    console.log('Error: Encrypted devices are not supported');
                                    return;
                                }
                            
                                // exit if the event is duplicated
                                if (lastPacketId === unpackedData.pid) {
                                    return;
                                }
                            
                                lastPacketId = unpackedData.pid;
                            
                                unpackedData.rssi = result.rssi;
                                unpackedData.address = result.addr;
                            
                                // create MQTT-Payload
                                let message = {
                                    scriptVersion: SCRIPT_VERSION,
                                    src: SHELLY_ID,
                                    srcBle: {
                                        type: result.local_name,
                                        mac: result.addr
                                    },
                                    payload: unpackedData
                                };
                            
                                console.log('Received ' + JSON.stringify(unpackedData));
                            
                                if (MQTT.isConnected()) {
                                    MQTT.publish(SHELLY_ID + '/events/ble', JSON.stringify(message));
                                }
                            }
                            
                            // Initializes the script and performs the necessary checks and configurations
                            function init() {
                                // 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 in the 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: true
                                    });
                            
                                    if (!bleScanner) {
                                        console.log('Error: Can not start new scanner');
                                    }
                                }
                            
                                BLE.Scanner.Subscribe(bleScanCallback);
                            }
                            
                            Shelly.call('Mqtt.GetConfig', '', function (res, err_code, err_msg, ud) {
                                SHELLY_ID = res['topic_prefix'];
                            
                                init();
                            });
                            

                            alle Adapter sind aktualisiert
                            Shelly Geräte auch alle,
                            JS Controller upgedatet.
                            Shelly Adapter ist auf : V8.2.1

                            Ich bekomme vom Script immer die Meldung 84 zurück, weiß vielleicht jemand von euch woran das liegen könnte?
                            2024-11-01 12_55_02-Shelly BLU Gateway Gen3.png

                            Dadurch hab ich auch bei den Objekten unter BLE nichts drin
                            2024-11-01 12_53_18-objects - glt.png

                            Für einen Tipp wäre ich sehr dankbar.

                            Vielen Dank
                            LG Mathias

                            haus-automatisierungH Online
                            haus-automatisierungH Online
                            haus-automatisierung
                            Developer Most Active
                            wrote on last edited by
                            #98

                            @spinotti https://github.com/iobroker-community-adapters/ioBroker.shelly/issues/1072

                            🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
                            🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
                            📚 Meine inoffizielle ioBroker Dokumentation

                            spinottiS 1 Reply Last reply
                            0
                            • haus-automatisierungH haus-automatisierung

                              @spinotti https://github.com/iobroker-community-adapters/ioBroker.shelly/issues/1072

                              spinottiS Offline
                              spinottiS Offline
                              spinotti
                              wrote on last edited by
                              #99

                              @haus-automatisierung
                              oh, vielen Dank!
                              LG

                              1 Reply Last reply
                              0
                              • R Offline
                                R Offline
                                rolfs
                                wrote on last edited by
                                #100

                                Hi,
                                hat sich schon jemand mit dem shelly blu wall switch 4 bzw. dem shelly blu rc button 4
                                beschäftigt. Habe das v0.3-Script im Einsatz und empfange darüber auch payloads von den o.g. Devices, aber so wie es aussieht muss wohl das Script für die o.g. Devices angepasst werden.
                                Hat sich schon jemand damit beschäftigt und kann mir ggf. einen Tip geben - danke vorab !

                                haus-automatisierungH 1 Reply Last reply
                                0
                                • R rolfs

                                  Hi,
                                  hat sich schon jemand mit dem shelly blu wall switch 4 bzw. dem shelly blu rc button 4
                                  beschäftigt. Habe das v0.3-Script im Einsatz und empfange darüber auch payloads von den o.g. Devices, aber so wie es aussieht muss wohl das Script für die o.g. Devices angepasst werden.
                                  Hat sich schon jemand damit beschäftigt und kann mir ggf. einen Tip geben - danke vorab !

                                  haus-automatisierungH Online
                                  haus-automatisierungH Online
                                  haus-automatisierung
                                  Developer Most Active
                                  wrote on last edited by
                                  #101

                                  @rolfs Ist längst erledigt. Funktioniert mit der aktuellen Beta und dem neuesten Script

                                  🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
                                  🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
                                  📚 Meine inoffizielle ioBroker Dokumentation

                                  1 Reply Last reply
                                  0
                                  • G Offline
                                    G Offline
                                    grandslam18
                                    wrote on last edited by
                                    #102

                                    Hallo Community,

                                    @haus-automatisierung, danke für das Script und die Anleitungen, ein Shelly Blu Button und ein Shelly Blu Button Tough kommen super in iobroker an, keine Probleme oder Abweichungen zu den Beschreibungen. Gedanklich seh ich mich schon mit Lokalisierungs-Use Cases spielen, aber dafür müsste ich viel mehr Empfänger (Plus Plugs o.Ä.) kaufen und das steht aktuell nicht dafür.

                                    Vielleicht nur ein kleiner Gedankengang (teils dem Script, teils BT Home geschuldet): ist es aus Security-Sicht sinnvoll, das Script komplett transparent zu halten, ohne irgendwelche Pairing-Aktionen zwischen Buttons und Plugs? Was ich damit meine: ich hab meinen Tough Button nach Einrichtung aller Scripts usw. gekauft, FW mit der Debug App aktualisiert und der erste Tastendruck führt sofort zur Einrichtung der Datenpunkte in iobroker mit der MAC-Adresse des Buttons. Kein Pairing durch Shelly App oder sonst was nötig. Wenn mein Nachbar seinen Blu Button in Reichweite meiner Installation hat, wird der auch an Bord geholt, wenn ein Attacker N mac Adressen "simuliert" hab ich N Datenpunkte drin, etc...

                                    Kann das über Einstellungen am Shelly unterbunden werden oder müsste das Script um ein Whitelisting erweitert werden? Bluetooth Einstellungen am Plug: Bluetooth, RPC und Bluetooth Gateway aktiviert.

                                    Liebe Grüße!

                                    haus-automatisierungH 1 Reply Last reply
                                    0
                                    • G grandslam18

                                      Hallo Community,

                                      @haus-automatisierung, danke für das Script und die Anleitungen, ein Shelly Blu Button und ein Shelly Blu Button Tough kommen super in iobroker an, keine Probleme oder Abweichungen zu den Beschreibungen. Gedanklich seh ich mich schon mit Lokalisierungs-Use Cases spielen, aber dafür müsste ich viel mehr Empfänger (Plus Plugs o.Ä.) kaufen und das steht aktuell nicht dafür.

                                      Vielleicht nur ein kleiner Gedankengang (teils dem Script, teils BT Home geschuldet): ist es aus Security-Sicht sinnvoll, das Script komplett transparent zu halten, ohne irgendwelche Pairing-Aktionen zwischen Buttons und Plugs? Was ich damit meine: ich hab meinen Tough Button nach Einrichtung aller Scripts usw. gekauft, FW mit der Debug App aktualisiert und der erste Tastendruck führt sofort zur Einrichtung der Datenpunkte in iobroker mit der MAC-Adresse des Buttons. Kein Pairing durch Shelly App oder sonst was nötig. Wenn mein Nachbar seinen Blu Button in Reichweite meiner Installation hat, wird der auch an Bord geholt, wenn ein Attacker N mac Adressen "simuliert" hab ich N Datenpunkte drin, etc...

                                      Kann das über Einstellungen am Shelly unterbunden werden oder müsste das Script um ein Whitelisting erweitert werden? Bluetooth Einstellungen am Plug: Bluetooth, RPC und Bluetooth Gateway aktiviert.

                                      Liebe Grüße!

                                      haus-automatisierungH Online
                                      haus-automatisierungH Online
                                      haus-automatisierung
                                      Developer Most Active
                                      wrote on last edited by
                                      #103

                                      @matthiasb85 sagte in Shelly >= 6.6.0 mit BLU-Geräten (Bluetooth Low Energy):

                                      Kann das über Einstellungen am Shelly unterbunden werden oder müsste das Script um ein Whitelisting erweitert werden?

                                      Könnte man schon machen. Auch im Adapter. Aber was hilft Dir das bei dem Szenario?

                                      Richtig wäre, encryption auf den BLE-Geräten zu aktivieren. Aber da findet man keine Infos, wie genau das mit dem Pairing und den Schlüsseln ablaufen muss. Ich nutze die BLE-Komponenten nicht, und bin da nicht so hinterher.

                                      Wenn Du ein funktionierendes Beispiel mit aktiver encryption hast, implementiere ich das aber gern.

                                      🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
                                      🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
                                      📚 Meine inoffizielle ioBroker Dokumentation

                                      G 1 Reply Last reply
                                      0
                                      • haus-automatisierungH haus-automatisierung

                                        @matthiasb85 sagte in Shelly >= 6.6.0 mit BLU-Geräten (Bluetooth Low Energy):

                                        Kann das über Einstellungen am Shelly unterbunden werden oder müsste das Script um ein Whitelisting erweitert werden?

                                        Könnte man schon machen. Auch im Adapter. Aber was hilft Dir das bei dem Szenario?

                                        Richtig wäre, encryption auf den BLE-Geräten zu aktivieren. Aber da findet man keine Infos, wie genau das mit dem Pairing und den Schlüsseln ablaufen muss. Ich nutze die BLE-Komponenten nicht, und bin da nicht so hinterher.

                                        Wenn Du ein funktionierendes Beispiel mit aktiver encryption hast, implementiere ich das aber gern.

                                        G Offline
                                        G Offline
                                        grandslam18
                                        wrote on last edited by
                                        #104

                                        @haus-automatisierung
                                        Mir geht's an sich nur darum rogue devices vom Netzwerk / iobroker fern zu halten, welches Mittel auch immer das Richtige ist. Bin aber weder BLE- noch Security Experte um dazu eine qualifizierte Meinung zu haben, wie man Fremdgeräte am besten draußen hält. Ich versuch mich mal in die Encryption einzulesen und schaue mir auch an, wie das in anderen veröffentlichten Scripts gelöst ist, die ShellyBlu zu MQTT umsetzen.

                                        haus-automatisierungH 1 Reply Last reply
                                        0
                                        • G grandslam18

                                          @haus-automatisierung
                                          Mir geht's an sich nur darum rogue devices vom Netzwerk / iobroker fern zu halten, welches Mittel auch immer das Richtige ist. Bin aber weder BLE- noch Security Experte um dazu eine qualifizierte Meinung zu haben, wie man Fremdgeräte am besten draußen hält. Ich versuch mich mal in die Encryption einzulesen und schaue mir auch an, wie das in anderen veröffentlichten Scripts gelöst ist, die ShellyBlu zu MQTT umsetzen.

                                          haus-automatisierungH Online
                                          haus-automatisierungH Online
                                          haus-automatisierung
                                          Developer Most Active
                                          wrote on last edited by
                                          #105

                                          @matthiasb85 sagte in Shelly >= 6.6.0 mit BLU-Geräten (Bluetooth Low Energy):

                                          und schaue mir auch an, wie das in anderen veröffentlichten Scripts gelöst ist

                                          Ich kenne kein Beispiel, was mit aktivierter Encryption arbeitet.

                                          🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
                                          🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
                                          📚 Meine inoffizielle ioBroker Dokumentation

                                          1 Reply Last reply
                                          0

                                          Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                                          Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                                          With your input, this post could be even better 💗

                                          Register Login
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          611

                                          Online

                                          32.8k

                                          Users

                                          82.7k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Home
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe