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.
    • 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
                              • Z
                                Zimbl last edited by

                                @bahnuhr

                                das ist schon sehr gut.
                                Es scheint auch zu funktionieren, ich sehe das an anderer Stelle, das er einen Wertänderung mitbekommen hat. Aber wenn ich im RPI2 unter GPIO schaue, wird der Wert nicht geändert.
                                Obwohl er dazu einen Befehl bekommt.

                                Woran könnte das noch liegen ?

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

                                  @paul53

                                  genau rumgedreht.
                                  Das andere ist vom Typ Number und das Ziel ist ein GPIO...also vom Typ Bool.

                                  1 Reply Last reply Reply Quote 0
                                  • Codierknecht
                                    Codierknecht Developer Most Active @TOBO last edited by

                                    @tobo sagte in Status negiert übertragen:

                                    Ich habe noch eine prinzipielle Verständnisfrage zur Abarbeitung von Scripts. Ich erstelle ein Script, speichere es und drücke auf Ablauf. Ich denke mal, dann wird das Script einmal abgearbeitet. Wie gehts dann weiter?

                                    Nur für den Fall, dass die Funktionsweise noch nicht so klar wurde:

                                    ioBroker arbeitet Scripte prinzipiell nicht zyklisch ab, wie man das bei prozeduraler Programmierung gewohnt ist.
                                    Mit dem on() wird ein Trigger deklariert. In dem Sinne, dass hier eine Ereignisbehandlung registriert wird. Der Trigger "abonniert" also quasi Nachrichten, die bei Änderungen an einem Objekt gesendet werden.

                                    Hier mal @paul53 's Vorschlag etwas kommentiert:

                                    // In den Variablen werden die Namen der Datenpunkte gehalten
                                    // Könnte man durchaus auch als const deklarieren
                                    // Diese beiden Zeilen werden 1x beim Start des Scripts ausgeführt
                                    var idSrc = "hm-rpc.0.OEQ0119091.1.STATE";
                                    var idDst = "s7.0.Outputs.0.Status_Haustür";
                                     
                                    // hier wird ein Trigger "registriert"
                                    // er reagiert auf Änderungen am DP "idScr" und ruft dann die hier hinterlegte ANONYME Funktion auf
                                    // Diese Funktion setzt den DP "idDest" auf den gewünschten Wert (Wert des triggernden "dp" negiert)
                                    on(idSrc, function(dp) {  // Triggern bei Änderung
                                       setState(idDst, !dp.state.val);
                                    });
                                     
                                    // auch die folgende Zeile wird nur einmal beim Start des Scripts ausgeführt und setzt den Zieldatenpunkt initial auf einen definierten Wert (NICHT idSrc)
                                    setState(idDst, !getState(idSrc).val);
                                    

                                    Man muss sich grundsätzlich davon verabschieden, dass Programme (Scripte) Zeile für Zeile abgearbeitet werden.
                                    Was sich nicht innerhalb eines Triggers oder Zeitplans befindet, wird nur 1x beim Start des Script ausgeführt.
                                    Alles andere reagiert entweder auf Ereignisse (Trigger) oder wird zyklisch bzw. zu bestimmten Zeiten (Zeitplan) ausgeführt.
                                    Das heißt dann aber auch: Ein Script wird gespeichert und dann auch gestartet, Es wird in der Regel nicht gestoppt! Sonst könnte die Ereignisbehandlung ja nicht mehr reagieren.

                                    Insbesondere wenn man von SPS kommt, sollte man sich von zyklischen Dingen verabschieden.
                                    In ioBroker prüft man nicht zyklisch bestimmte Zustände.
                                    Man registriert Trigger, die genau dann feuern wenn sich ein Zustand ändert.
                                    Wozu sollte man auch z.B. alle 10 Sekunden einen Zustand überwachen, der sich möglicherweise nur alle paar Tage ändert?

                                    Signale müssen dazu auch nicht eine bestimmte Zeit lang anliegen. Ändert sich ein Wert, wird das erkannt und der Trigger feuert. Dazu reichen Mikrosekunden.
                                    Wenn ein Signal eine bestimmte Zeit lang anliegen muss, bevor eine Reaktion erfolgen soll, muss man da gesondert reagieren. Das kommt dann später.

                                    Auch von mir der Tipp: Fang erstmal mit Blockly an und schau Dir dann an, was da an JS-Code generiert wird.

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

                                      @codierknecht

                                      Ja du hast da völlig recht, im Blockly sollte man erstmal beginnen.

                                      Hast du auch alles wirklich gut erklärt....vielen Dank für deine Mühe.

                                      Ich habe ja nun das Skript angenommen, es funktioniert ja auch.

                                      Könnte es jetzt wirklich sein, das dass Signal zu kurz nur ansteht ?
                                      Weil ich sehe ja in einem anderem Skript das die Funktion ausgeführt wird, da die Änderung dort registriert wird. Aber wenn ich in den Objekten schaue, ist der Wechsel von FALSE zu TRUE oder rumgedreht nicht ausgeführt.

                                      Muss der Befehl dann länger anstehen ? wie kann man das machen ? oder hast du für mich generell eine vereinfachte Blockly ausführung, wo ich vielleicht dann noch ein paar Dinge hinzufügen kann...zu einem späteren Zeitpunkt...

                                      Codierknecht Homoran 2 Replies Last reply Reply Quote 0
                                      • Codierknecht
                                        Codierknecht Developer Most Active @Zimbl last edited by

                                        @zimbl
                                        Das wäre so ziemlich das einfachste Blockly für diesen Zweck.
                                        7f237d90-7624-4194-b1d3-b8ca4d2ddf70-image.png
                                        Die passenden Objekte musst Du allerdings noch selbst auswählen.

                                        <xml xmlns="https://developers.google.com/blockly/xml">
                                         <block type="on" id="9U[w!yJt78v$!lb!TS!/" x="-212" y="-388">
                                           <field name="OID">Object ID</field>
                                           <field name="CONDITION">ne</field>
                                           <field name="ACK_CONDITION"></field>
                                           <statement name="STATEMENT">
                                             <block type="debug" id="v?A*66$aiHG;Z4N59J;$">
                                               <field name="Severity">log</field>
                                               <value name="TEXT">
                                                 <shadow type="text" id="wZRVQ6SNaRdcOWw}t)OC">
                                                   <field name="TEXT">test</field>
                                                 </shadow>
                                                 <block type="on_source" id="b6P{{7~HJfK/|AaKEg-L">
                                                   <field name="ATTR">state.val</field>
                                                 </block>
                                               </value>
                                               <next>
                                                 <block type="control" id="OK0XhMdTXH04zJwz(~,o">
                                                   <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                                                   <field name="OID">Object ID</field>
                                                   <field name="WITH_DELAY">FALSE</field>
                                                   <value name="VALUE">
                                                     <block type="logic_negate" id="^;vQx/ZTOH6`r$LPLf$G">
                                                       <value name="BOOL">
                                                         <block type="on_source" id="Usf86VZt5:lU1dZJUba(">
                                                           <field name="ATTR">state.val</field>
                                                         </block>
                                                       </value>
                                                     </block>
                                                   </value>
                                                 </block>
                                               </next>
                                             </block>
                                           </statement>
                                         </block>
                                        </xml>
                                        

                                        1 Reply Last reply Reply Quote 0
                                        • Homoran
                                          Homoran Global Moderator Administrators @Zimbl last edited by

                                          @zimbl sagte in Status negiert übertragen:

                                          Muss der Befehl dann länger anstehen ?

                                          was meinst du damit?
                                          Sobald die Änderung des DP in ioBroker ankommt, würde ein darauf triggerndes Skript auch arbeiten.

                                          @zimbl sagte in Status negiert übertragen:

                                          Ich habe ja nun das Skript angenommen, es funktioniert ja auch.

                                          welches Skript?

                                          und wo ist das Problem wenn es funktioniert?

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

                                            @homoran

                                            mein Problem ist derzeit egal welche Änderung ansteht.
                                            Beim GPIO..state...switch findet keine Änderung statt....

                                            Der steht immer auf dem gleichen Wert....ich kann ihn
                                            von Hand aus umschalten...sowohl über APP als auch direkt
                                            unter Objekte...aber das Skript scheint nichts zu bewirken...

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            644
                                            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