Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Zigbee2MQTT Name als ID verwenden

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Zigbee2MQTT Name als ID verwenden

    This topic has been deleted. Only users with topic management privileges can see it.
    • G
      Gaunt last edited by

      Hallo Zusammen,

      ich habe Zigbee2MQTT im Einsatz inklusiv dem dazugehörigen Adapter.

      Innerhalb von Zigbee2MQTT habe ich meinen Geräten Namen gegeben. Diese Namen werden in den Objekten unter MQTT auch korrekt angezeigt. Inklusiv der Daten die diese Geräte senden (Das Gerät mit der Endnummer b745 wurde nicht benannt).
      73bfa9c4-7692-40d6-af3a-38bca2ee72a4-image.png

      Wenn ich nun in die geparsten Daten aus dem Zigbee2MQTT Adapter Wechsel, wird in der Spalte "ID" die ID des Zigbee Gerätes angezeigt und unter "Name" der Name dem diesem Gerät zugewiesen wurde.
      1ee277a2-8475-448a-a354-b0a5a5ac013e-image.png .

      Ich bin davon ausgegangen, dass der Adapter Zigbee2MQTT den Zigbee Namen als ID für das Gerät/Verzeichnis vom IOBroker verwendet.
      Habe ich die Einstellung "Verwende ZigbeeName als ID im IOBroker anstelle ZigBeeID" übersehen oder gibt es diese Einstellung nicht?

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

        Vom Grundkonzept ioBroker gesehen ist das Verhalten so richtig.

        IDs sollten soweit wie möglich aus (nahezu) unveränderbaren und vor allem möglichst garantiert eindeutigen Eigenschaften des Geräts gebildet werden, z.B. MAC-Addresse, UUID, ...

        Insofern ist es also OK, dass der Adapter den frei wählbaren Text als Namen ablegt. Genau dafür ist dieses Feld auch gedacht,

        Für das Mapping auf beliebige IDs die durch den User festgelegt werden existiert das alias System. Damit ist bei einem Hardwaretausch nur eine Anpassung an einer Stelle erforderlich.

        Ob der Adapter eine Konfigurationsmöglichkeit bietet um "userfriendly" auch eher vom Standard abweichende IDs zu geneieren weiß ich leider auchnicht.

        1 Reply Last reply Reply Quote 1
        • G
          Gaunt last edited by

          Ja vom Gedanken her ist das verhalten vom IOBroker genau richtig. Eindeutige Namen die zugewiesen werden.
          Die Einstellung userfrindly wäre gut wenn es die gibt. der MQTT Adapter verwendet ja ebenfalls diesen userfrindly Namen.

          Das verlagert die eindeutige ID vergabe in die Verantwortung des Benutzers. Das macht ein späteres Austauschen der Geräte bei Gerätedefekt einfacher. Altes Gerät entfernen, neues Gerät anlernen und den Namen vom alten Gerät übernehmen.

          Dann werde ich wohl die ID nehmen müssen.

          T 1 Reply Last reply Reply Quote 1
          • T
            ticaki Developer @Gaunt last edited by ticaki

            @mcm57
            @gaunt sagte in Zigbee2MQTT Name als ID verwenden:

            Das verlagert die eindeutige ID vergabe in die Verantwortung des Benutzers. Das macht ein späteres Austauschen der Geräte bei Gerätedefekt einfacher. Altes Gerät entfernen, neues Gerät anlernen und den Namen vom alten Gerät übernehmen.

            Das wäre mir auch das liebste genau aus diesem Gedanken. Aber zumindest ich dürfte nicht mehr in die Gruppe "Standardnutzer" fallen und für den ist es ja gedacht 🙂

            Aber hab ein Skript geschrieben, dass das ganze vereinfacht. Erstellt im alias.0 Zweig eine "mirror" von zigbee2mqtt mit namen als ids.

            Ist ein Typescript und erfordert das setObject() im Javascript-Adapter erlaubt ist:

            const prefix = 'alias.0';
            async function init() {
                const jQstates = $('state[state.id=zigbee2mqtt.*]');
                 
                const objs: any = {}
                for (const dp of jQstates) {
                    if (await existsObjectAsync(dp)) objs[dp] = await getObjectAsync(dp);
                }
                for (const id in objs) {
                    const arr  = id.split('.');
                    
                    arr.pop()
                    while (arr.length>0) {
                        const tempId = arr.join('.');
                        
                        if (objs[tempId] === undefined && await existsObjectAsync(tempId)) {
                            objs[tempId] = await getObjectAsync(tempId);               
                        }
                        
                        arr.pop()
                    }
                }
                const checkUnique = {};
                for (const id in objs) {
                    const arr  = id.split('.');
                    if (arr.length == 3) {
                        const obj = objs[id];
                        if (obj.common.name == '') {
                            log(`common.name of ${id} is empty!`, 'warn')
                            obj._id = '';
                            continue;
                        }
                        const newName = obj.common.name.replace('.', '/');
                        arr.pop()
                        arr.push(newName)
                        const newId = arr.join('.')
                        if (checkUnique[newId] !== undefined) {
                            log(`common.name of ${id} and ${checkUnique[newId]} the same.`, 'error')
                            obj._id = '';
                            continue;
                        }
                        checkUnique[newId] = id;
                    }
                }
              
                let counter = 0;
                for (let id in objs) {
                    const obj = objs[id];
                    if (obj._id == '') continue;
                    let doit = false;
                    for (const newId in checkUnique) {
                        const oldId = checkUnique[newId]
                        if (id.startsWith(oldId)) {
                            id = id.replace(oldId, newId);
                            doit = true;
                        }
                    }
                    if (!doit && id.split('.').length >= 3) continue;
                    if (obj.type === 'state') {
                        obj.common.alias = {};
                        obj.common.alias.id = obj._id
                    }
                    obj._id = '';
                    counter++
                    await extendObjectAsync(`${prefix}.${id}`, obj);
                }
                log(`Create ${counter} alias.`)
            }
            init();
            

            Blöd ist nur das man keine Aliase auf Aliase zeigen lassen kann. Aber ist wohl wegen Kreisverkehr so 🙂

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

              @ticaki oh das sieht sehr Interessant aus. Das werde ich mir mal genau angucken und ausprobieren. Vielen Dank dafür
              🙂
              und deine kleine Skriptsammlung sieht auch gut aus. Die Anwesenheit werde ich mir auch mal angucken 😉
              Danke für eure Hilfe

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

              Support us

              ioBroker
              Community Adapters
              Donate
              FAQ Cloud / IOT
              HowTo: Node.js-Update
              HowTo: Backup/Restore
              Downloads
              BLOG

              698
              Online

              31.9k
              Users

              80.1k
              Topics

              1.3m
              Posts

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