Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Status negiert übertragen

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Status negiert übertragen

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

      Hallo TOBO,

      ich bin selber zwar auch eindeutig Anfänger, aber ich versuche mich mal an deinen Fragen. Eventuell lernen wir ja beide gemeinsam etwas.

      Teil 1 definiert die Variablen bei Skriptstart. ("Play button").

      Danach hast du schon richtig erkannt, wird der Teil ausgeführt bei "on. Wenn ich das richtig sehe, gilt "on" ohne weitere Spezifizierung immer als "change: any", d.h. bei jedem Statuswechsel wird die definierte Funktion ausgeführt.

      "dp" in Klammern ist eine Variable, Paul schreibt immer "dp" für Datenpunkt meine ich.

      Andere schreiben obj für object… Man kann auch Funktionen ohne diese Variablenm schreiben. Ob man die manchmal zwingend braucht oder nicht, soweit bin ich leider noch nicht mit ausreichender Sicherheit. Grundsätlich geht aber auch "function() {....}"

      Der Rest wird nicht zyklisch abgearbeitet. Das kann man imho über cron jobs einrichten, aber damit arbeite ich nicht.

      Der letzte Teil wird nur einmalig bei Start ausgeführt, quasi damit deine "destination Variable / Kehrwert" direkt beschrieben wird. Sonst müsstest du nämlich nach dem Start des Skript einmal an deiner Keymatic drehen, damit das "on... ausgelöst wird.

      Soweit mein Verständnis dieses kleinen Skripts. Vielleicht hilfts. Wenn etwas falsch ist, freue ich mich von den Profis korrigiert zu werden.

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

        @tempestas:

        Wenn ich das richtig sehe, gilt "on" ohne weitere Spezifizierung immer als "change: any", d.h. bei jedem Statuswechsel wird die definierte Funktion ausgeführt. Richtig: > Wenn ich das richtig sehe, gilt "on" bei Verwendung eines ID-Strings (anstelle eines Objekts) für das Triggermuster immer als "change: 'ne'", d.h. bei jeder Wertänderung wird die definierte Funktion ausgeführt. `
        @tempestas:

        "dp" in Klammern ist eine Variable,…Man kann auch Funktionen ohne diese Variablenm schreiben. Ob man die manchmal zwingend braucht oder nicht, soweit bin ich leider noch nicht mit ausreichender Sicherheit. Grundsätlich geht aber auch "function() {....}" `
        "dp" in Klammern ist der Name des Datenpunkt-Objektes für die Callback-Funktion. Einen Namen für das Objekt benötigt man, wenn Eigenschaften des Objektes innerhalb dieser Funktion ausgewertet werden. Werden keine Datenpunkt-Eigenschaften ausgewertet (typisch z.B. bei Reaktion auf einen Tastendruck), sollte keine Name angegeben werden.

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

          @paul53:

          @tempestas:

          Wenn ich das richtig sehe, gilt "on" ohne weitere Spezifizierung immer als "change: any", d.h. bei jedem Statuswechsel wird die definierte Funktion ausgeführt. Richtig: > Wenn ich das richtig sehe, gilt "on" bei Verwendung eines ID-Strings (anstelle eines Objekts) für das Triggermuster immer als "change: 'ne'", d.h. bei jeder Wertänderung wird die definierte Funktion ausgeführt. `
          @tempestas:

          "dp" in Klammern ist eine Variable,…Man kann auch Funktionen ohne diese Variablenm schreiben. Ob man die manchmal zwingend braucht oder nicht, soweit bin ich leider noch nicht mit ausreichender Sicherheit. Grundsätlich geht aber auch "function() {....}" "dp" in Klammern ist der Name des Datenpunkt-Objektes für die Callback-Funktion. Einen Namen für das Objekt benötigt man, wenn Eigenschaften des Objektes innerhalb dieser Funktion ausgewertet werden. Werden keine Datenpunkt-Eigenschaften ausgewertet (typisch z.B. bei Reaktion auf einen Tastendruck), sollte keine Name angegeben werden.

          Kommt gleich wieder in meine Sammlung der kleinen Wissensschnippsel.

          Danke!

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

            @TOBO:

            Wird dieser Teil nun zyklisch abgearbeitet?…Wie lange muss das Signal anstehen, dass es überhaupt bemerkt wird? `
            Nein, dieser Teil wird nur einmal bei Start des Skriptes abgearbeitet (so wie kommentiert). Javascript / nodejs arbeitet nicht zyklisch wie eine SPS, sondern Ereignis-gesteuert:

            on(Trigger-Muster, callback) reagiert auf Zustandsänderungen eines Datenpunktes

            schedule('Zeitmuster', callback) reagiert auf zeitliche Ereignisse

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

              Also ist es eigentlich egal, ob dies am Anfang, oder am Ende steht ?

              Es wird nur einmal nach drücken des Start Buttons ausgeführt.

              // Script start
              setState(idDst, !getState(idSrc).val);
              

              Noch mal zu der Pollzeit. Wie lange muss ein Signal an einem Eingang anstehen, dass es überhaupt bemerkt wird ?

              Sind das ms oder schon gar Sekunden ?

              Gruss.

              ToBo

              1 Reply Last reply Reply Quote 0
              • Dutchman
                Dutchman Developer Most Active Administrators last edited by

                @TOBO:

                Also ist es eigentlich egal, ob dies am Anfang, oder am Ende steht ?

                Es wird nur einmal nach drücken des Start Buttons ausgeführt.

                // Script start
                setState(idDst, !getState(idSrc).val);
                ```` `  
                

                correct

                @TOBO:

                Noch mal zu der Pollzeit. Wie lange muss ein Signal an einem Eingang anstehen, dass es überhaupt bemerkt wird ?

                Sind das ms oder schon gar Sekunden ? `

                millisekunden, komt der wert einmalig kurz rein ist das ein update (bzw weise change des objectes) damit triggert das script.

                Du hast einen reiter der heist events, da siehst du alle events vorbij kommen. mechtest du eine variable beobachten schau mal bei states und such nach deinem object.

                Darin steht zeit (letztes mal daten bekommen) und lc (last change, zeit das der wert letztesmal geaendert wurde)

                ~Dutch

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

                  Nunja, ich bin mir da bei ms nicht ganz so sicher. IOBroker ist ja eigentlich ein Datensammler und hat selbst direkt keine Hardware. Ist ja auch logisch. Die Hardware sitzt dann an einer anderen Komponente und die Kommunikation läuft in der Regel über LAN. Da die Hardware nicht pusht, sondern IOBroker die Komponenten pollt, muss die mindest Aktivzeit für zum Beispiel einen Eingang >Pollzeit sein.

                  1 Reply Last reply Reply Quote 0
                  • Dutchman
                    Dutchman Developer Most Active Administrators last edited by

                    @TOBO:

                    Nunja, ich bin mir da bei ms nicht ganz so sicher. IOBroker ist ja eigentlich ein Datensammler und hat selbst direkt keine Hardware. Ist ja auch logisch. Die Hardware sitzt dann an einer anderen Komponente und die Kommunikation läuft in der Regel über LAN. Da die Hardware nicht pusht, sondern IOBroker die Komponenten pollt, muss die mindest Aktivzeit für zum Beispiel einen Eingang >Pollzeit sein. `

                    Dem stimme ich dir nicht ganz zu, woher kommt die stellungname das iObroker pullt ?

                    Probiere es mal mit de HomeMatic componenten, da ist ein PULL von 30 secunden fuer HM-Rega, alle HM-RPC daten sind live und wen ich jetzt was aendere ist es direct da und nicht nach einer pull zeitspanne.

                    Openhab adapter benutze ich, selber fall. Die meisten API haben einen event moeglichkeit, mit anderen worden sie broadcasten jedes event und uebertragen damit die daten und iObroker "lauchst" anstatt zu pullen.

                    MQTT/IFTTT/HomeMatic/z.wave etc alle functionieren nach diesem princiep

                    ~Dutch

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

                      Wie soll es denn anders sein? Weiss die Homematic das dort ein IOBRoker ist und pusht die Daten bei Änderung zu Ihm ?

                      Die SPS weiss es mit Sicherheit nicht. Also muss IOBRoker zwangsweise in einem Zeitabstand Daten aus den diversen Adaptern

                      holen. Live kommt es einem vielleicht vor, weil ziemlich schnell geht.

                      Es tut mir wirklich leid, wenn ich Euch mit meinen Anfänger Dummy Fragen nerve.

                      Also ich habe nun gelernt, dass direkte unbedingte Befehle in einen Javascript nur einmalig bei Start bearbeitet werden und man immer auf ein Ereignis reagieren muss.

                      Bis jetzt beschäftige ich mich erst ein mal mit logischen Verknüpfungen.

                      Das habe ich bisher gelernt.

                      var idSrc = "Quelle";
                      var idDst = "Ziel";
                      
                      on(idSrc, function(dp) {  // Triggern bei Änderung
                         setState(idDst, !dp.state.val);
                      });
                      
                      

                      Überprüft eine Änderung der Quelle und überträgt den Zustand der Quelle negiert an das Ziel.

                      var idSrc = "Quelle";
                      var idDst = "Ziel";
                      
                      on(idSrc, function(dp) {  // Triggern bei Änderung
                         setState(idDst, dp.state.val);
                      });
                      
                      

                      Überprüft eine Änderung der Quelle und überträgt den Zustand der Quelle 1:1 an das Ziel.

                      Ich glaube das Ganze kann man auch so machen ?

                      var idSrc = "Quelle";
                      var idDst = "Ziel";
                      
                      on("Quelle", function(dp) {
                      
                          if (dp.newState.val == true) {
                              setState("Ziel",true); 
                          } else {
                              setState("Ziel",false); 
                          }
                      });
                      
                      

                      oder sogar so habe ich gesehen

                      var idSrc = "Quelle";
                      var idDst = "Ziel";
                      
                      on("Quelle", "Ziel");
                      
                      

                      Ist das richtig ?

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

                        Alles richtig. 😄

                        Die Homematic CCU gibt neue Stati von sich aus raus. Dabei ist ihr egal, ob ein ioBroker lauscht oder nicht.

                        Meine Homepilot Zentrale (für Rademacher Rollläden) tut das nicht (zumindest nicht über LAN). Daher muss ich im Adapter alle paar Sekunden den Zustand der Geräte abfragen. Die Zentrale kann aber auch ZWAVE und pusht darüber die Zustände live. Leider kann ich damit nicht umgehen und den Adapter dahingehend anpassen :oops: 😢

                        Übrigens: Der Playbutton/Pausebutton im Javascript-Adapter ist zum Starten/Anhalten des Skriptes. Das Skript startet aber auch jedesmal neu, wenn der ganze Javascript-Adapter bzw. die entsprechende Instanz oder eben der ganze ioBroker neu gestartet werden. Da die Aktionen in den Skripten meistens auf Zeitpunkte (schedule()) oder Ereignisse (on()) getriggert werden, können die Skripte dauerhaft eingeschaltet bleiben und reagieren eigentlich nicht besonders beim Neustart (außer man legt das natürlich explizit fest).

                        Gruß

                        Pix

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

                          var idSrc = "Quelle";
                          var idDst = "Ziel";
                          
                          on("Quelle", !"Ziel");
                          
                          

                          Funktioniert dies auch als Negation ?

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

                            @paul53:

                            var idSrc = "hm-rpc.0.OEQ0119091.1.STATE";
                            var idDst = "s7.0.Outputs.0.Status_Haustür";
                            
                            on(idSrc, function(dp) {  // Triggern bei Änderung
                               setState(idDst, !dp.state.val);
                            });
                            
                            // Script start
                            setState(idDst, !getState(idSrc).val);
                            
                            ```` `  
                            

                            Es gibt jetzt auch "toggle" block für Blockly (github)

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

                              Nun zwei letzte Fragen 🙂

                              Wie kann man mehrere logische Verknüpfungen machen ?

                              Also

                              ist Eingang 1 = 1

                              und Eingang 2 = 1

                              und Eingang 3 = 0

                              Setze Ausgang 1 = 1

                              und ich hätte gern einen "Stromstoßschalter" in Javascript

                              Eingang = 1

                              setze Ausgang

                              Eingang geht nach 0

                              mache nix

                              Eingang geht wieder 1

                              Rücksetze Ausgang

                              Hoffe ich konnte mich erklären 🙂

                              1 Reply Last reply Reply Quote 0
                              • Dutchman
                                Dutchman Developer Most Active Administrators last edited by

                                @TOBO:

                                Nun zwei letzte Fragen 🙂

                                Wie kann man mehrere logische Verknüpfungen machen ?

                                Also

                                ist Eingang 1 = 1

                                und Eingang 2 = 1

                                und Eingang 3 = 0

                                Setze Ausgang 1 = 1

                                und ich hätte gern einen "Stromstoßschalter" in Javascript

                                Eingang = 1

                                setze Ausgang

                                Eingang geht nach 0

                                mache nix

                                Eingang geht wieder 1

                                Rücksetze Ausgang

                                Hoffe ich konnte mich erklären 🙂 `

                                du meinst verschieden states mit einander vergleichen ? z.b.:

                                IF ( value_1 == "1" && value_2 == "1") {
                                      setstate(hier was du willst oder)
                                      log("Value 1 und 2 sind 1")
                                };
                                

                                Hast du dir die javascript adapter documentation mal angeschaut ?

                                && z.b. bedeuted UND, || bedeutet oder usw, ansonsten mal mit blockly anfangen und damit rumspielen dan sieht man auch welche code generiert wird.

                                ~Dutch

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

                                  @TOBO:

                                  ist Eingang 1 = 1

                                  und Eingang 2 = 1

                                  und Eingang 3 = 0 `

                                  if(Eingang_1 && Eingang_2 && !Eingang_3) {...}
                                  

                                  @TOBO:

                                  Eingang = 1

                                  setze Ausgang

                                  Eingang geht nach 0

                                  mache nix

                                  Eingang geht wieder 1

                                  Rücksetze Ausgang `

                                  // Toggle
                                  on({id: idEingang, val: 1}, function() {
                                     Ausgang = !Ausgang;
                                  });
                                  
                                  Z 1 Reply Last reply Reply Quote 0
                                  • Z
                                    Zimbl @paul53 last edited by Homoran

                                    @paul53

                                    irgendwie komme ich nun hier bei den ganzen etwas durcheinander.
                                    Aber ich habe etwas ähnlich, es ist auch mit mehr oder minder unterschiedlichen Typen. Bei dem der Ausgang auch negiert werden muss.

                                    Aber da aber irgendwie den Faden verloren.

                                    Ich habe eine Variable die den Name hat vom Typ Number "close 1 or. open 0"

                                    Diese muss ich auf einen GPIO schalten....nur in umgekehrter Reihenfolge....

                                    Das heisst wenn TRUE ist, soll nicht geschaltet werden und wenn FALSE soll geschaltet werden...

                                    Typ Number Open 0 = Typ Bool FALSE
                                    Typ Number Close 1 = Typ Bool TRUE

                                    Wenn ich das mit diesem mache, funktioniert das ja nicht, aber was muss ich ändern ?

                                    var idSrc = "tuya.0.658013063c6105ee34fe.36";
                                    
                                    var idDst = "rpi2.0.gpio.11.state";
                                    
                                     
                                    
                                    on(idSrc, function(dp) {  // Triggern bei Änderung
                                    
                                       setState(idDst, !dp.state.val);
                                    
                                    });
                                    
                                    
                                    // Script start
                                    
                                    setState(idDst, !getState(idSrc).val);
                                    

                                    MOD-EDIT: Code in code-tags gesetzt!

                                    Homoran bahnuhr paul53 3 Replies Last reply Reply Quote 0
                                    • Homoran
                                      Homoran Global Moderator Administrators @Zimbl last edited by

                                      @zimbl sagte in Status negiert übertragen:

                                      irgendwie komme ich nun hier bei den ganzen etwas durcheinander.

                                      wäre nach über 5 Jahren Ruhe im Thread nicht ein neuer angesagt?

                                      Z 1 Reply Last reply Reply Quote 0
                                      • Z
                                        Zimbl @Homoran last edited by

                                        @homoran

                                        ja sorry, wollte nicht unnötig wieder etwas neues beginne. Da das Thema ja ähnlich bzw. fast das gleiche ist.

                                        aber bei dem nächsten mal werde ich mich dran halten, es wird ja immer gesagt. Ob man die SuFu auch benutzt.

                                        Aber werde mich beim nächsten mal dran halten. Versprochen...

                                        1 Reply Last reply Reply Quote 0
                                        • bahnuhr
                                          bahnuhr Forum Testing Most Active @Zimbl last edited by

                                          @zimbl sagte in Status negiert übertragen:

                                          on(idSrc, function(dp) { // Triggern bei Änderung setState(idDst, !dp.state.val); });

                                          Ich habs nicht richtig verstanden was du willst.
                                          Aber baue doch einfach if Abfragen rein.

                                          z.B. so:

                                          var idSrc = "tuya.0.658013063c6105ee34fe.36";
                                          var idDst = "rpi2.0.gpio.11.state";
                                            
                                          on(idSrc, function(dp) {  // Triggern bei Änderung
                                             if (dp.state.val == 0) {
                                                setState(idDst, false);
                                             } else {
                                                setState(idDst, true);
                                             }
                                          });
                                          

                                          Wie gesagt, habe deine Bedingungen nicht ganz verstanden.
                                          Aber vielleicht ist dies ja ne Grundlage für dich.

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

                                            @zimbl sagte:

                                            Typ Number Open 0 = Typ Bool FALSE
                                            Typ Number Close 1 = Typ Bool TRUE

                                            setState(idDst, !!dp.state.val);
                                            

                                            @zimbl sagte in Status negiert übertragen:

                                            nur in umgekehrter Reihenfolge....

                                            Oder ist Quelle vom Typ "boolean" und Ziel vom Typ "number"? Dann

                                            setState(idDst, dp.state.val ? 1 : 0);
                                            
                                            Z 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            501
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            11
                                            34
                                            3452
                                            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