Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
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

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.5k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.1k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    2.7k

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

Geplant Angeheftet Gesperrt Verschoben Tester
157 Beiträge 36 Kommentatoren 34.0k Aufrufe 33 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • HumidorH Humidor

    @haus-automatisierung Hallo, ich habe weitere BL Geräte (Fenster/Türkontakte) in mein Shelly-System integriert, dh ich habe aktuell 5 Stück. Die ersten 2 zeigen nun keine Veränderung mehr? Die neuen funktionieren soweit.
    Ich habe das Script auf den Pro laufen, wo die BLE beheimatet sind, kann das Script ev. nur auf einem im Shellysystem laufen?

    bekomme die ersten 2 einfach nicht mehr ans laufen...

    Joesch80J Offline
    Joesch80J Offline
    Joesch80
    schrieb am zuletzt editiert von Joesch80
    #83

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

    @haus-automatisierung Hallo, ich habe weitere BL Geräte (Fenster/Türkontakte) in mein Shelly-System integriert, dh ich habe aktuell 5 Stück. Die ersten 2 zeigen nun keine Veränderung mehr? Die neuen funktionieren soweit.
    Ich habe das Script auf den Pro laufen, wo die BLE beheimatet sind, kann das Script ev. nur auf einem im Shellysystem laufen?

    bekomme die ersten 2 einfach nicht mehr ans laufen...

    bei mir läuft das script auf 11 shellyplus 2pm

    HumidorH 1 Antwort Letzte Antwort
    0
    • Joesch80J Joesch80

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

      @haus-automatisierung Hallo, ich habe weitere BL Geräte (Fenster/Türkontakte) in mein Shelly-System integriert, dh ich habe aktuell 5 Stück. Die ersten 2 zeigen nun keine Veränderung mehr? Die neuen funktionieren soweit.
      Ich habe das Script auf den Pro laufen, wo die BLE beheimatet sind, kann das Script ev. nur auf einem im Shellysystem laufen?

      bekomme die ersten 2 einfach nicht mehr ans laufen...

      bei mir läuft das script auf 11 shellyplus 2pm

      HumidorH Offline
      HumidorH Offline
      Humidor
      schrieb am zuletzt editiert von
      #84

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

      BG

      Joesch80J Jey CeeJ 2 Antworten Letzte Antwort
      0
      • HumidorH Humidor

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

        Joesch80J Offline
        Joesch80J Offline
        Joesch80
        schrieb am zuletzt editiert von
        #85

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

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

        Siehst du denn eine Statusänderung bei Betätigung der ersten beiden Sensoren in der Shelly-App?

        1 Antwort Letzte Antwort
        0
        • HumidorH Humidor

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

          Jey CeeJ Online
          Jey CeeJ Online
          Jey Cee
          Developer
          schrieb am zuletzt editiert von
          #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 Antwort Letzte Antwort
          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 Offline
            HumidorH Offline
            Humidor
            schrieb am zuletzt editiert von
            #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 Antwort Letzte Antwort
            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
              schrieb am zuletzt editiert von
              #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 Antwort Letzte Antwort
              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 Offline
                HumidorH Offline
                Humidor
                schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
                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 Offline
                  HumidorH Offline
                  Humidor
                  schrieb am zuletzt editiert von
                  #90

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

                  BG

                  1 Antwort Letzte Antwort
                  0
                  • A Offline
                    A Offline
                    Apfelwurm
                    schrieb am zuletzt editiert von
                    #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 Antwort Letzte Antwort
                    1
                    • K Offline
                      K Offline
                      kg36304
                      schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
                      0
                      • K Offline
                        K Offline
                        kg36304
                        schrieb am zuletzt editiert von
                        #93

                        Hier noch ein Bild vom Blockly:

                        Bildschirmfoto 2024-06-17 um 22.02.16.png

                        A 1 Antwort Letzte Antwort
                        0
                        • K kg36304

                          Hier noch ein Bild vom Blockly:

                          Bildschirmfoto 2024-06-17 um 22.02.16.png

                          A Offline
                          A Offline
                          Apfelwurm
                          schrieb am zuletzt editiert von
                          #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 Antwort Letzte Antwort
                          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 Offline
                            HumidorH Offline
                            Humidor
                            schrieb am zuletzt editiert von
                            #95

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

                            BG

                            1 Antwort Letzte Antwort
                            0
                            • K Offline
                              K Offline
                              kg36304
                              schrieb am zuletzt editiert von
                              #96

                              Hallo,

                              danke für die Antworten. Funktioniert jetzt.

                              1 Antwort Letzte Antwort
                              0
                              • spinottiS Offline
                                spinottiS Offline
                                spinotti
                                schrieb am zuletzt editiert von
                                #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 Antwort Letzte Antwort
                                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
                                  schrieb am zuletzt editiert von
                                  #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 Antwort Letzte Antwort
                                  0
                                  • haus-automatisierungH haus-automatisierung

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

                                    spinottiS Offline
                                    spinottiS Offline
                                    spinotti
                                    schrieb am zuletzt editiert von
                                    #99

                                    @haus-automatisierung
                                    oh, vielen Dank!
                                    LG

                                    1 Antwort Letzte Antwort
                                    0
                                    • R Offline
                                      R Offline
                                      rolfs
                                      schrieb am zuletzt editiert von
                                      #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 Antwort Letzte Antwort
                                      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
                                        schrieb am zuletzt editiert von
                                        #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 Antwort Letzte Antwort
                                        0
                                        • G Offline
                                          G Offline
                                          grandslam18
                                          schrieb am zuletzt editiert von
                                          #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 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          858

                                          Online

                                          32.4k

                                          Benutzer

                                          81.5k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe