Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Status negiert übertragen

NEWS

  • Wartung am 15.11. – Forum ab 22:00 Uhr nicht erreichbar
    BluefoxB
    Bluefox
    11
    2
    203

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    7.9k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.7k

Status negiert übertragen

Status negiert übertragen

Scheduled Pinned Locked Moved Skripten / Logik
34 Posts 11 Posters 3.6k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • paul53P Offline
    paul53P Offline
    paul53
    wrote on last edited by
    #10

    @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

    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
    Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

    1 Reply Last reply
    0
    • T Offline
      T Offline
      TOBO
      wrote on last edited by
      #11

      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
      0
      • DutchmanD Offline
        DutchmanD Offline
        Dutchman
        Developer Most Active Administrators
        wrote on last edited by
        #12

        @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
        0
        • T Offline
          T Offline
          TOBO
          wrote on last edited by
          #13

          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
          0
          • DutchmanD Offline
            DutchmanD Offline
            Dutchman
            Developer Most Active Administrators
            wrote on last edited by
            #14

            @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
            0
            • T Offline
              T Offline
              TOBO
              wrote on last edited by
              #15

              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
              0
              • P Offline
                P Offline
                pix
                wrote on last edited by
                #16

                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

                ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                1 Reply Last reply
                0
                • T Offline
                  T Offline
                  TOBO
                  wrote on last edited by
                  #17
                  var idSrc = "Quelle";
                  var idDst = "Ziel";
                  
                  on("Quelle", !"Ziel");
                  
                  

                  Funktioniert dies auch als Negation ?

                  1 Reply Last reply
                  0
                  • BluefoxB Offline
                    BluefoxB Offline
                    Bluefox
                    wrote on last edited by
                    #18

                    @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
                    0
                    • T Offline
                      T Offline
                      TOBO
                      wrote on last edited by
                      #19

                      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
                      0
                      • DutchmanD Offline
                        DutchmanD Offline
                        Dutchman
                        Developer Most Active Administrators
                        wrote on last edited by
                        #20

                        @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
                        0
                        • paul53P Offline
                          paul53P Offline
                          paul53
                          wrote on last edited by
                          #21

                          @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;
                          });
                          

                          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                          Z 1 Reply Last reply
                          0
                          • paul53P paul53

                            @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 Offline
                            Z Offline
                            Zimbl
                            wrote on last edited by Homoran
                            #22

                            @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!

                            HomoranH bahnuhrB paul53P 3 Replies Last reply
                            0
                            • Z Zimbl

                              @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!

                              HomoranH Do not disturb
                              HomoranH Do not disturb
                              Homoran
                              Global Moderator Administrators
                              wrote on last edited by
                              #23

                              @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?

                              kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                              Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                              der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                              Z 1 Reply Last reply
                              0
                              • HomoranH Homoran

                                @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 Offline
                                Z Offline
                                Zimbl
                                wrote on last edited by
                                #24

                                @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
                                0
                                • Z Zimbl

                                  @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!

                                  bahnuhrB Online
                                  bahnuhrB Online
                                  bahnuhr
                                  Forum Testing Most Active
                                  wrote on last edited by
                                  #25

                                  @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.


                                  Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                                  Danke.
                                  gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                                  ScreenToGif :https://www.screentogif.com/downloads.html

                                  1 Reply Last reply
                                  0
                                  • Z Zimbl

                                    @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!

                                    paul53P Offline
                                    paul53P Offline
                                    paul53
                                    wrote on last edited by paul53
                                    #26

                                    @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);
                                    

                                    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                                    Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                                    Z 1 Reply Last reply
                                    0
                                    • Z Offline
                                      Z Offline
                                      Zimbl
                                      wrote on last edited by
                                      #27

                                      @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
                                      0
                                      • paul53P 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 Offline
                                        Z Offline
                                        Zimbl
                                        wrote on last edited by
                                        #28

                                        @paul53

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

                                        1 Reply Last reply
                                        0
                                        • T TOBO

                                          Das habe ich verstanden und schon mit Tante Google rausgefunden.

                                          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? Wird es Zyklusweise wieder aufgerufen? Dieses zum Beispiel besteht aus dem oberen Teil mit einer bedingten Aufgabe. Bei Änderung des Wertes mache was. Der untere Teil ist aber meiner Ansicht nach unbedingt und sagt, mache was ohne Bedingung. setState(idDst, !getState(idSrc).val);

                                          Wird dieser Teil nun zyklisch abgearbeitet?

                                          Und was bedeutet das dp in Klammern nach function?

                                          Sorry, noch eine Frage zur Zykluszeit, bzw. Pollzeit. Ich habe an IOBroker eine Homematic und eine SPS. Wenn ich nun auf ein Signal reagieren möchte. Zum Beispiel eine Lichtschranke, die an einem SPS Eingang angeschlossen ist. Wie lange muss das Signal anstehen, dass es überhaupt bemerkt wird?

                                          CodierknechtC Offline
                                          CodierknechtC Offline
                                          Codierknecht
                                          Developer Most Active
                                          wrote on last edited by
                                          #29

                                          @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.

                                          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                                          Proxmox 8.2.4 LXC|8 GB|Core i7-6700
                                          HmIP|ZigBee|Tasmota|Unifi + dies & das
                                          Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                                          Z 1 Reply Last reply
                                          1
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          132

                                          Online

                                          32.4k

                                          Users

                                          81.3k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe