Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Datenpunkte triggern sich gegenseitig

    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

    Datenpunkte triggern sich gegenseitig

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

      Hallo zusammen!

      Ich habe folgendes Problem: Ich benötige insgesamt 7 Datenpunkte: jeweils einen für einen der drei RGB-Kanäle mit einem Wertebereich von 0-255, jeweils einen der frei RGB-Kanäle mit dem prozentualen Wert von 0-100 und einmal den vollständigen RGB-Wert im HEX-Format. Beispiel: Rot: 255, 100%; Grün: 25, 9.8%; Blau: 33, 13%; RGB: #FF1921
      Ich habe nun ein Skript erstellt, dass diese 7 Datenpunkte überwacht und bei Aktualisierung umrechnet und abhängige Datenpunkte aktualisiert. Ändere ich z.B. Grün auf 100% wird der grüne RGB-Wert auf 255 und der HEX-Wert auf FFFF21 gesetzt. Bei Änderungen am HEX-Wert ebenfalls. Allerdings habe ich das Problem, dass durch die Änderungen der anderen Datenpunkte diese ebenfalls triggern und somit findet das kein Ende. Eine Änderung löst 2 Trigger aus, diese zwei wieder jeweils 2 und so weiter. Wie erreiche ich es nun, dass bei einer Änderung durch das Skript der Trigger feuert?

      Asgothian paul53 2 Replies Last reply Reply Quote 0
      • Asgothian
        Asgothian Developer @Zeebo last edited by

        @Zeebo
        Das ist ganz einfach. Du triggers auf Wertänderungen „mit acknowledge“, und setzt die Updates ohne acknowledge, wenn deine scripte die Werte umrechnen.

        A.

        Z 1 Reply Last reply Reply Quote 0
        • Z
          Zeebo @Asgothian last edited by

          @Asgothian
          Verstehe ich jetzt nicht ganz.
          Hier mal der Code:

          var r=0, g=0, b=0;
          var rp=0, gp=0, bp=0;
          var hex = "#000000";
          var dp_r = "javascript.0.tpm2net.rgb.r";
          var dp_g = "javascript.0.tpm2net.rgb.g";
          var dp_b = "javascript.0.tpm2net.rgb.b";
          var dp_rp = "javascript.0.tpm2net.rgb.rp";
          var dp_gp = "javascript.0.tpm2net.rgb.gp";
          var dp_bp = "javascript.0.tpm2net.rgb.bp";
          var dp_hex = "javascript.0.tpm2net.rgb.rgb";
          
          on({id: dp_r, change: "ne"}, function (obj) {
             console.log(1);
             r = getState(dp_r).val
             rp = Math.round((100/255)*r);
             setHex();
             setState(dp_rp, rp, false);
          });
          
          on({id: dp_rp, change: "ne"}, function (obj) {
             console.log(2);
             rp = getState(dp_rp).val
             r = Math.round((255/100)*rp);
             setHex();
             setState(dp_r, r, false);
          });
          
          on({id: dp_g, change: "ne"}, function (obj) {
             console.log(3);
             g = getState(dp_g).val
             gp = Math.round((100/255)*g);
             setHex();
             setState(dp_gp, gp, false);
          });
          
          on({id: dp_gp, change: "ne"}, function (obj) {
             console.log(4);
             gp = getState(dp_gp).val
             g = Math.round((255/100)*gp);
             setHex();
             setState(dp_g, g, false);
          });
          
          on({id: dp_b, change: "ne"}, function (obj) {
             console.log(5);
             b = getState(dp_b).val
             bp = Math.round((100/255)*b);
             setHex();
             setState(dp_bp, bp, false);
          });
          
          on({id: dp_bp, change: "ne"}, function (obj) {
             console.log(6);
             bp = getState(dp_bp).val
             b = Math.round((255/100)*bp);
             setHex();
             setState(dp_b, b, false);
          });
          
          on({id: dp_hex, change: "ne"}, function (obj) {
             console.log(7);
             hex = getState(dp_hex).val
             var rgb = hexToRgb(hex);
             r = rgb.r;
             g = rgb.g;
             b = rgb.b;
             console.log("ROT "+r)
             rp = Math.round((100/255)*r);
             gp = Math.round((100/255)*g);
             bp = Math.round((100/255)*b);
             setState(dp_r, r, false);
             setState(dp_g, g, false);
             setState(dp_b, b, false);
             /*
             setState(dp_rp, rp, false);
             setState(dp_gp, gp, false);
             setState(dp_bp, bp, false);
             */
          });
          
          function setHex() {
             hex = rgbToHex(r, g, b);
             setState(dp_hex, hex, false);
          }
          


          Wenn ich zb. den Datenpunkt dp_r ändere, wird u.a. mit setHex() der Hex-Wert aktualisiert, dadurch wird dann dp_hex getriggert, in dem wieder die drei States gesetzt werden. Das soll ja nicht.
          Das mit dem ACK habe ich wohl noch nicht ganz verstanden (auch nicht anhand der Doku)

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

            @Zeebo sagte:

            durch die Änderungen der anderen Datenpunkte diese ebenfalls triggern und somit findet das kein Ende.

            Das kann man mit fromNe in jedem Trigger verhindern. Hier für den ersten Trigger:

            const js = 'system.adapter.javascript.0';
            
            on({id: dp_r, change: "ne", fromNe: js}, function (obj) {
            
            1 Reply Last reply Reply Quote 0
            • First post
              Last post

            Support us

            ioBroker
            Community Adapters
            Donate

            943
            Online

            31.9k
            Users

            80.2k
            Topics

            1.3m
            Posts

            3
            4
            380
            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