Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Tester
    4. Shelly >= 6.6.0 mit BLU-Geräten (Bluetooth Low Energy)

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

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

    This topic has been deleted. Only users with topic management privileges can see it.
    • Jey Cee
      Jey Cee Developer @Humidor last edited by

      @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.

      Humidor 1 Reply Last reply Reply Quote 0
      • Humidor
        Humidor @Jey Cee last edited by 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.

        Humidor 1 Reply Last reply Reply Quote 0
        • Humidor
          Humidor @Humidor last edited by

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

          1 Reply Last reply Reply Quote 0
          • A
            Apfelwurm last edited by

            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();
            });
            
            Humidor 1 Reply Last reply Reply Quote 1
            • K
              kg36304 last edited by kg36304

              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 Reply Quote 0
              • K
                kg36304 last edited by

                Hier noch ein Bild vom Blockly:

                Bildschirmfoto 2024-06-17 um 22.02.16.png

                A 1 Reply Last reply Reply Quote 0
                • A
                  Apfelwurm @kg36304 last edited by

                  @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 Reply Quote 0
                  • Humidor
                    Humidor @Apfelwurm last edited by

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

                    1 Reply Last reply Reply Quote 0
                    • K
                      kg36304 last edited by

                      Hallo,

                      danke für die Antworten. Funktioniert jetzt.

                      1 Reply Last reply Reply Quote 0
                      • spinotti
                        spinotti last edited by

                        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-automatisierung 1 Reply Last reply Reply Quote 0
                        • haus-automatisierung
                          haus-automatisierung Developer Most Active @spinotti last edited by

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

                          RV3Dtech created this issue in iobroker-community-adapters/ioBroker.shelly

                          closed [Bug]: BLU to MQTT Script does not run on new Gateway Gen3 #1072

                          spinotti 1 Reply Last reply Reply Quote 0
                          • spinotti
                            spinotti @haus-automatisierung last edited by

                            @haus-automatisierung
                            oh, vielen Dank!
                            LG

                            1 Reply Last reply Reply Quote 0
                            • R
                              rolfs last edited by

                              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-automatisierung 1 Reply Last reply Reply Quote 0
                              • haus-automatisierung
                                haus-automatisierung Developer Most Active @rolfs last edited by

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

                                1 Reply Last reply Reply Quote 0
                                • G
                                  grandslam18 last edited by

                                  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-automatisierung 1 Reply Last reply Reply Quote 0
                                  • haus-automatisierung
                                    haus-automatisierung Developer Most Active @grandslam18 last edited by

                                    @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 1 Reply Last reply Reply Quote 0
                                    • G
                                      grandslam18 @haus-automatisierung last edited by

                                      @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-automatisierung 1 Reply Last reply Reply Quote 0
                                      • haus-automatisierung
                                        haus-automatisierung Developer Most Active @grandslam18 last edited by

                                        @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.

                                        1 Reply Last reply Reply Quote 0
                                        • A
                                          Accuface @haus-automatisierung last edited by

                                          @haus-automatisierung

                                          Erst mal.....vielen Dank für das Script.

                                          Ich hab seid Sonntagabend 3x Shelly blu Door/Window im Einsatz.

                                          Eingebunden mit deinem Script über einen PM.

                                          Wozu dient die Angabe in dem Bild?
                                          Muss dass noch eingefügt werden, wenn ja, wo genau?

                                          payload DW.png

                                          haus-automatisierung 1 Reply Last reply Reply Quote 0
                                          • haus-automatisierung
                                            haus-automatisierung Developer Most Active @Accuface last edited by

                                            @accuface Nur zur Info. Die Schritte im YouTube Video sind noch aktuell

                                            A 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            921
                                            Online

                                            31.6k
                                            Users

                                            79.6k
                                            Topics

                                            1.3m
                                            Posts

                                            35
                                            153
                                            16820
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo