Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [Frage] Direkte Verknüfpung von Werten

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [Frage] Direkte Verknüfpung von Werten

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

      OK, da brauche ich noch eine Weile um das zu verstehen.

      Eigentlich programmiere ich alle Steueraufgaben in der SPS und muss dann nur die Ausgabe in diesem Fall auf das Dimmer Modul weiterleiten.

      Wenn ich nun 5 Dimmer Module habe, muss ich für jedes ein neues Script anlegen, oder kann ich den obigen Code einfach kopieren und

      mit geänderten Datenpunkten untereinander in ein Script packen ?

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

        @TOBO:

        Wenn ich nun 5 Dimmer Module habe, muss ich für jedes ein neues Script anlegen, oder kann ich den obigen Code einfach kopieren und mit geänderten Datenpunkten untereinander in ein Script packen ? `
        Alle 5 Dimmer können in einem Skript behandelt werden: 5 mal on(idSrc, idDst), so wie von pix angegeben.

        Falls alle Dimmer den gleichen Wert aus der SPS erhalten sollen, dann so:

        on('s7.0.DBs.DB1.VW0', function(dp) {  // Auslösung bei Wertänderung
          setState(idDst1, dp.state.val);
          setState(idDst2, dp.state.val);
          setState(idDst3, dp.state.val);
          setState(idDst4, dp.state.val);
          setState(idDst5, dp.state.val);
        });
        
        1 Reply Last reply Reply Quote 0
        • T
          TOBO last edited by

          Nur noch mal zum Verständnis.

          on('s7.0.DBs.DB1.VW0', function(dp) {  // Auslösung bei Wertänderung
            setState(idDst1, dp.state.val);
          });
          

          Bedeutet dieses "on" am Anfang das jedesmal überprüft wird, ob sich der Zustand des Datenpunktes geändert hat und dann wird die Funktion ausgeführt, oder wird die Funktion einfach immer bei jedem Zyklus ausgeführt ?

          on({id: 's7.0.DBs.DB1.VW0', change: "ne"}, function (obj) {
            var value = obj.state.val;
            var oldValue = obj.oldState.val;
            setState("hm-rpc.1.MEQ0312049.3.LEVEL", getState("s7.0.DBs.DB1.VW0").val);
          });
          

          Hier steht ja immerhin noch ein "change", was ich verstehe. SetState verstehe ich auch noch, aber alles nach dem "Change" ist mir unerklärlich.

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

            @TOBO:

            Bedeutet dieses "on" am Anfang das jedesmal überprüft wird, ob sich der Zustand des Datenpunktes geändert hat und dann wird die Funktion ausgeführt…? `
            Das hängt vom change: ab. Wenn des Muster im on(Muster, callback) als ID-Zeichenkette angegeben ist, gilt change: 'ne' (default). Ist das Muster als Objekt angegeben und kein change:, wird 'any' als default genommen.
            @TOBO:

            …aber alles nach dem "Change" ist mir unerklärlich. `
            Kennst Du die https://github.com/ioBroker/ioBroker.javascript#on–-subscribe-on-changes-or-updates-of-some-state auf Github ?

            1 Reply Last reply Reply Quote 0
            • T
              TOBO last edited by

              @paul53:

              Kennst Du die https://github.com/ioBroker/ioBroker.javascript#on–-subscribe-on-changes-or-updates-of-some-state auf Github ? `

              Bis jetzt nicht. Werde es aber sofort nachholen.

              1 Reply Last reply Reply Quote 0
              • T
                TOBO last edited by

                Ehrlich gesagt sind das ziemlich viele Böhmische Dörfer.

                1 Reply Last reply Reply Quote 0
                • P
                  ple last edited by

                  Tja, so geht es mir im Moment auch.

                  Die Dokus habe ich soweit alle durch, aber einen neuen Syntax zu lernen wenn man nur awl, scl kennt

                  Ist nicht gerade einfach, aber man wird hier ja super aufgeklärt und beraten.

                  Da ich anscheinend auf dem gleichen Level wie du bist kann ich dir empfehlen erst mal die Funktionen mit internen variablen aufzubauen um die Funktionen zu testen und zu verstehen. Dann alles ins log schreiben, damit man weiß das er dadurchgegangen ist.

                  Habe letztens an einer if Anweisung 2 Tage verbracht, bis ich rausfand das der Syntax so geht.

                  on({id: "radar.0.Christian_iPhone.here", change: "any"}, function (obj) {
                      log("State: " + obj.val);
                      if ((obj.state.val) === true){
                      log("if ausgelöst");
                      } else {
                          log("else hat ausgelöst");
                      }
                  });
                  

                  Gibt leider keine variablentabelle, Aber mit log("State: " + obj.val) Kann man wenigsten sehen was drin steht.

                  Gruß

                  1 Reply Last reply Reply Quote 0
                  • P
                    pix last edited by

                    Okay, dann gebe ich auch einen kleinen Hinweis:

                    on und subscribe sind identisch. Subscribe erklärt vielleicht etwas mehr, was der Befehl macht. Er überwacht einen Datenpunkt (in ple's Fall "radar.0.Christian_iPhone.here"). Wenn any angegeben ist, dann wird bei jeder Aktualisierung die angehängte Funktion ausgeführt. Bei change passiert das nur bei Änderung des Wertes des Datenpunktes.

                    Der Teil "function (obj) {}" ist der Teil, in dem die abzuarbeitenden Befehle stehen. Das obj steht dabei für das Objekt, aus dem der Datenpunkt kommt. Diese Funktion soll also mit dem (Mutter-)Objekt des Datenpunktes arbeiten. Es ist dabei aber egal, ob man das "obj" oder "data" oder "dp" (Pauls Lieblingsbezeichnung) oder "Elsa" oder "Eisprinzessin" nennt. Es ist nur eine neue Bezeichnung für das Objekt. Das habe ich damals nicht gleich verstanden und lange gerätselt, wann die damals unter CCU.IO üblichen Bezeichnungen "data" oder "obj" jeweils zu verwenden waren.

                    Dann kommen in den geschweiften Klammern die Befehle. Zum Datenpunkt gehören einige Werte (val für Wert/Inhalt, oldVal (für alten Inhalt), lc (für Lastchange/letzte Änderung) oder ts (für Timestamp/letzte Aktualisierung). Diese Werte lassen sich dann so abfragen und zum Beispiel als Log ausgeben:

                    log('Alter Wert: '  + obj.oldState.val); // oder eben Elsa.oldState.val :-D
                    log('Zeitstempel: ' + obj.state.ts);
                    log('Neuer Wert: ' + obj.state.val); // früher auch obj.newState.val
                    
                    

                    Naja, das war's fürs Erste. Will man einen weiteren Wert eines anderen Datenpunktes abfragen, dann geht das mit geState(idDatenpunkt).val

                    Wenn das innerhalb der function(obj) {} steht, dann wird dieser Wert dann abgefragt, wenn die Funktion aufgerufen wird (also zB bei Änderung von "radar.0.Christian_iPhone.here" (siehe oben)).

                    Hoffe, es kommt etwas Licht ins Dunkel. 8-)

                    Gruß

                    Pix

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

                      @pix:

                      Wenn any angegeben ist, dann wird bei jeder Aktualisierung die angehängte Funktion ausgeführt. Bei change passiert das nur bei Änderung des Wertes des Datenpunktes. Kleine Korrektur: > Wenn change: 'any' angegeben ist, dann wird bei jeder Aktualisierung die angehängte Funktion ausgeführt. Bei change: 'ne' passiert das nur bei Änderung des Wertes des Datenpunktes. `
                      @pix:

                      Das obj steht dabei für das Objekt, aus dem der Datenpunkt kommt. `
                      Das obj steht für den Datenpunkt, der sowohl das statische Objekt als auch den dynamischen Zustand (state) enthält. Deshalb bevorzuge ich das Kürzel dp für on(pattern, function(dp) {…});.
                      @pix:

                      Zum Datenpunkt gehören einige Werte (val für Wert/Inhalt, oldVal (für alten Inhalt), lc (für Lastchange/letzte Änderung) oder ts (für Timestamp/letzte Aktualisierung). Genauer: > Zum Zustand des Datenpunktes gehören einige Werte (state.val für Wert/Inhalt, oldState.val (für alten Inhalt), state.lc (für Lastchange/letzte Änderung) oder state.ts (für Timestamp/letzte Aktualisierung). `

                      1 Reply Last reply Reply Quote 0
                      • P
                        ple last edited by

                        Super erklärt;-) Danke

                        1 Reply Last reply Reply Quote 0
                        • T
                          TOBO last edited by

                          Gut, gut…. Da brauch ich noch eine Weile. Bis jetzt sind in meinem Neubau nur Standardschaltungen geplant und das mache ich SPS Seitig.

                          Ich möchte aber noch mal auf den Code zurück kommen, den ich aus dem Blocky geklaut habe.

                          on({id: 's7.0.DBs.DB1.VW0', change: "ne"}, function (obj) {
                            var value = obj.state.val;
                            var oldValue = obj.oldState.val;
                            setState("hm-rpc.1.MEQ0312049.3.LEVEL", getState("s7.0.DBs.DB1.VW0").val);
                          });
                          

                          Die Erste und die letzte Zeile verstehe ich nun, kann mir aber absolut keinen Reim aus den beiden in der Mitte machen.

                            var value = obj.state.val;
                            var oldValue = obj.oldState.val;
                          
                          

                          Was macht das und wozu ?

                          Würde das ganze nicht aus so funktionieren ?

                          on({id: 's7.0.DBs.DB1.VW0', change: "ne"}, function (obj) {
                            setState("hm-rpc.1.MEQ0312049.3.LEVEL", getState("s7.0.DBs.DB1.VW0").val);
                          });
                          
                          1 Reply Last reply Reply Quote 0
                          • paul53
                            paul53 last edited by

                            @TOBO:

                            Die Erste und die letzte Zeile verstehe ich nun, kann mir aber absolut keinen Reim aus den beiden in der Mitte machen. `
                            Blockly ist eben nur eine Hilfestellung zu Javascript. Deshalb werden hier JS-Variablen für die am häufigsten verwendeten gebildet.@TOBO:

                            Würde das ganze nicht aus so funktionieren ? `
                            Ja, hat aber den Nachteil, dass (im Prinzip) mit getState(id).val ein Datenbankzugriff erfolgt, der die CPU entsprechend belastet, obwohl die Werte bereits an die callback-Funktion übergeben wurden. Deshalb ist dies besser:

                            on({id: 's7.0.DBs.DB1.VW0', change: "ne"}, function (obj) {
                              var value = obj.state.val;
                              setState("hm-rpc.1.MEQ0312049.3.LEVEL", value);
                            });
                            

                            oder

                            on({id: 's7.0.DBs.DB1.VW0', change: "ne"}, function (obj) {
                              setState("hm-rpc.1.MEQ0312049.3.LEVEL", obj.state.val);
                            });
                            
                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            480
                            Online

                            31.7k
                            Users

                            79.8k
                            Topics

                            1.3m
                            Posts

                            4
                            18
                            2115
                            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