Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. trigger, triggert zu oft ...

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    trigger, triggert zu oft ...

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

      Hallo,

      ich habe ein Bosch Zwischenstecker, der leider nur ON und OFF als Wert hat. Aber der "Schalter" in ioBroker nur true/false kennt.

      Da habe ich mir gedacht, schreibst ein Script welches bei True ein ON rein schreibt und bei False ein OFF. Nur leider triggert mein Script sofort bei jeder Änderung. Eigentlich hätte ich gedacht, dass erst dann wieder getriggert wird, wenn das Script zu Ende gearbeitet hat.

      Hier mein blockly:

      b42a2ba9-e2be-43a3-b4c8-7374881767a4-image.png

      Weiß jemand wie man das lösen kann?

      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @JB1985 last edited by

        @jb1985 sagte: nur ON und OFF als Wert hat. Aber der "Schalter" in ioBroker nur true/false kennt.

        Typischer Fall für einen Alias.

        Hast Du zwei Datenpunkte mit gleichem Namen oder beschreibst Du den selben Datenpunkt mal mit "ON" und mal mit true?

        JB1985 1 Reply Last reply Reply Quote 0
        • JB1985
          JB1985 @paul53 last edited by

          @paul53 das ist der gleiche. Einmal ON damit der Zwischenstecker schaltet und einmal true damit meine Visualisierung weiß, das geschaltet wurde.

          Das mit den Alias verstehe ich nicht so ganz.

          paul53 UncleSam 2 Replies Last reply Reply Quote 0
          • paul53
            paul53 @JB1985 last edited by paul53

            @jb1985 sagte in trigger, triggert zu oft ...:

            das ist der gleiche.

            Das funktioniert nicht.

            @jb1985 sagte in trigger, triggert zu oft ...:

            Das mit den Alias verstehe ich nicht so ganz.

            Der Alias bildet den Original-Datenpunkt von Typ "string" in einen Alias-Datenpunkt vom Typ "boolean" ab. Führe das folgende Skript nach Eingabe der richtigen idOrigin einmal kurz aus, um den Alias-Datenpunkt zu erstellen.

            // Original-Datenpunkt
            const idOrigin = '...'; 
            // Optional: Status-Datenpunkt, wenn Kommando und Status getrennt.
            // Bei Nicht-Verwendung Leerstring '' zuweisen
            const idRead = '';
             
            // Alias-Datenpunkt
            const idAlias = 'KG_Flur.Zwischenstecker.Status';
            var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk;
            
            // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich
            nameAlias = 'Zwischenstecker KG Flur';
            desc = 'per Script erstellt';
            typeAlias = 'boolean'; // oder 'number'
            // read = "val == 'ON' ? true : false"; // Erkennung "OFF" --> false erfolgt automatisch  
            write = "val ? 'ON' : 'OFF'";
            // role = 'value';
            // min = 0; // nur Zahlen
            // max = 100; // nur Zahlen
            // unit = '%'; // nur für Zahlen
            // states = {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein)
            custom = []; // verhindert doppelte Ausführung von history, ...
            // raum = 'EG_Flur'; // Groß-/Kleinschreibung in der ID beachten !
            // gewerk = 'Licht'; // Groß-/Kleinschreibung in der ID beachten !
            
            // Ab hier nichts ändern !!
            function createAlias(idDst, idSrc, idRd) {
               if(existsState(idDst)) log(idDst + ' schon vorhanden !', 'warn');
               else {
                  var obj = {};
                  obj.type = 'state';
                  obj.common = getObject(idSrc).common;
                  obj.common.alias = {};
                  if(idRd) {
                      obj.common.alias.id = {};
                      obj.common.alias.id.read = idRd;
                      obj.common.alias.id.write = idSrc;
                      obj.common.read = true;
                  } else obj.common.alias.id = idSrc;
                  if(typeAlias) obj.common.type = typeAlias;
                  if(obj.common.read !== false && read) obj.common.alias.read = read;
                  if(obj.common.write !== false && write) obj.common.alias.write = write;
                  if(nameAlias) obj.common.name = nameAlias;
                  if(role) obj.common.role = role;
                  if(desc) obj.common.desc = desc;
                  if(obj.common.type == 'number') {
                     if(min !== undefined) obj.common.min = min;
                     if(max !== undefined) obj.common.max = max;
                     if(unit) obj.common.unit = unit;
                  } else {
                     if(obj.common.min !== undefined) delete obj.common.min;
                     if(obj.common.max !== undefined) delete obj.common.max;
                     if(obj.common.unit) delete obj.common.unit;
                  }
                  if(states) obj.common.states = states;
                  if(custom && obj.common.custom) obj.common.custom = custom;
                  obj.native = {};
                  setObject(idDst, obj, function() {
                     if(idRd) setState(idRd, getState(idRd).val, true);
                     else setState(idSrc, getState(idSrc).val, true); 
                  });
                  if(raum && existsObject('enum.rooms.' + raum)) {
                     let obj = getObject('enum.rooms.' + raum)
                     obj.common.members.push(idDst);
                     setObject('enum.rooms.' + raum, obj);
                  }
                  if(gewerk && existsObject('enum.functions.' + gewerk)) {
                     let obj = getObject('enum.functions.' + gewerk)
                     obj.common.members.push(idDst);
                     setObject('enum.functions.' + gewerk, obj);
                  }
               } 
            }
             
            createAlias('alias.0.' + idAlias, idOrigin, idRead);
            
            JB1985 1 Reply Last reply Reply Quote 0
            • UncleSam
              UncleSam Developer @JB1985 last edited by

              @jb1985 sagte in trigger, triggert zu oft ...:

              @paul53 das ist der gleiche. Einmal ON damit der Zwischenstecker schaltet und einmal true damit meine Visualisierung weiß, das geschaltet wurde.

              Das kommt nicht gut. Ein Datenpunkt hat einen Typ und der ist entweder "boolean" (wahr/falsch) oder "string". Du kannst die zwei nicht einfach mischen.

              Du solltest, wie @paul53 geschrieben hat, mit einem Alias arbeiten, der den Wert "übersetzt". Aliasse kannst du entweder per Skript erstellen oder mit dem Devices Adapter.

              1 Reply Last reply Reply Quote 0
              • JB1985
                JB1985 @paul53 last edited by

                @paul53 sagte in trigger, triggert zu oft ...:

                // Original-Datenpunkt const idOrigin = '...'; // Optional: Status-Datenpunkt, wenn Kommando und Status getrennt. // Bei Nicht-Verwendung Leerstring '' zuweisen const idRead = ''; // Alias-Datenpunkt const idAlias = 'KG_Flur.Zwischenstecker.Status'; var typeAlias, read, write, nameAlias, role, desc, min, max, unit, states, custom, raum, gewerk; // Folgende kommentieren, wenn keine Änderung der Eigenschaft erforderlich nameAlias = 'Zwischenstecker KG Flur'; desc = 'per Script erstellt'; typeAlias = 'boolean'; // oder 'number' // read = "val == 'ON' ? true : false"; // Erkennung "OFF" --> false erfolgt automatisch write = "val ? 'ON' : 'OFF'"; // role = 'value'; // min = 0; // nur Zahlen // max = 100; // nur Zahlen // unit = '%'; // nur für Zahlen // states = {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein) custom = []; // verhindert doppelte Ausführung von history, ... // raum = 'EG_Flur'; // Groß-/Kleinschreibung in der ID beachten ! // gewerk = 'Licht'; // Groß-/Kleinschreibung in der ID beachten ! // Ab hier nichts ändern !! function createAlias(idDst, idSrc, idRd) { if(existsState(idDst)) log(idDst + ' schon vorhanden !', 'warn'); else { var obj = {}; obj.type = 'state'; obj.common = getObject(idSrc).common; obj.common.alias = {}; if(idRd) { obj.common.alias.id = {}; obj.common.alias.id.read = idRd; obj.common.alias.id.write = idSrc; obj.common.read = true; } else obj.common.alias.id = idSrc; if(typeAlias) obj.common.type = typeAlias; if(obj.common.read !== false && read) obj.common.alias.read = read; if(obj.common.write !== false && write) obj.common.alias.write = write; if(nameAlias) obj.common.name = nameAlias; if(role) obj.common.role = role; if(desc) obj.common.desc = desc; if(obj.common.type == 'number') { if(min !== undefined) obj.common.min = min; if(max !== undefined) obj.common.max = max; if(unit) obj.common.unit = unit; } else { if(obj.common.min !== undefined) delete obj.common.min; if(obj.common.max !== undefined) delete obj.common.max; if(obj.common.unit) delete obj.common.unit; } if(states) obj.common.states = states; if(custom && obj.common.custom) obj.common.custom = custom; obj.native = {}; setObject(idDst, obj, function() { if(idRd) setState(idRd, getState(idRd).val, true); else setState(idSrc, getState(idSrc).val, true); }); if(raum && existsObject('enum.rooms.' + raum)) { let obj = getObject('enum.rooms.' + raum) obj.common.members.push(idDst); setObject('enum.rooms.' + raum, obj); } if(gewerk && existsObject('enum.functions.' + gewerk)) { let obj = getObject('enum.functions.' + gewerk) obj.common.members.push(idDst); setObject('enum.functions.' + gewerk, obj); } } } createAlias('alias.0.' + idAlias, idOrigin, idRead);

                Cool Danke, das funktioniert! Muss das Script immer an bleiben oder kann man das wieder löschen?

                paul53 1 Reply Last reply Reply Quote 0
                • paul53
                  paul53 @JB1985 last edited by paul53

                  @jb1985 sagte: Muss das Script immer an bleiben oder kann man das wieder löschen?

                  Nein, stoppe das Skript. Löschen solltest Du es nicht, denn mit kleinen Anpassungen (idOrigin, idAlias, nameAlias, ...) kannst Du es zur Erstellung weiterer Alias-Datenpunkte nutzen.

                  JB1985 1 Reply Last reply Reply Quote 0
                  • JB1985
                    JB1985 @paul53 last edited by

                    @paul53 Danke Dir!

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

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    870
                    Online

                    32.0k
                    Users

                    80.4k
                    Topics

                    1.3m
                    Posts

                    3
                    8
                    375
                    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