Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Werte on Objekten aktualisieren sich nicht

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Werte on Objekten aktualisieren sich nicht

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

      Hallo zusammen
      Ich befasse mich seit kurzen mit iobroker und Javascript.
      Ich übertrage ein Word, in welchem die 16 bit’s, Zustände von Ausgängen einer SPS sind (Lampen Steckdosen usw.). In iobroker möchte ich diese nun bitweise auslesen und Objekten zuweisen, welche ich dann in der Vis darstellen kann. Einmalig funktioniert das auch, jedoch werden die Werte bei Änderungen nicht aktualisiert. Was muss ich anpassen, dass die Werte aktualisiert werden? unterstehend mein bisheriger Code.

      Besten Dank im Voraus für eure Inputs.

      var SPSOutWord_02 = getState('modbus.2.inputRegisters.30003_SPSEingangssWord_2').val;
      
      
      //Check of Bit in Word 1 oder 0 ist
      function BitCheck(Word, Bit) {
          if ((Word >> Bit)&1)
                  return 1;
              else
                  return 0;}
      
      
      // Bit Check SPS Ausgang Word 2
      var word = 'QW00_'
      var schritt=0
      var schrittst
      for (schritt = 0; schritt <16; schritt ++){
          schrittst = String(schritt);
          if (schritt < 10){
                 schrittst = '0' + String(schritt);}
              else {
                 schrittst = String(schritt);}
      
          createState('WagoSPS.Out.'+ word + schrittst);
          setState('WagoSPS.Out.'+ word + schrittst, BitCheck(SPSOutWord_02, schritt));
      }
      
      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @chucky last edited by paul53

        @chucky sagte:

        werden die Werte bei Änderungen nicht aktualisiert.

        Es fehlt der Trigger. getState() liest nur bei Skriptstart ein.

        Anmerkung: In Javascript / ioBroker verwendet man keine binären Werte (0/1), sondern boolesche Werte (false/true).

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

          @paul53 sagte in Werte on Objekten aktualisieren sich nicht:

          Es fehlt der Trigger.

          Ein Trigger ist on() oder auch subscribe() (ist beides dasselbe).

          C 1 Reply Last reply Reply Quote 0
          • C
            chucky @UncleSam last edited by

            Hallo UncleSam und paul53

            Besten Dank für eure Rückmeldung und Hinweis.
            OK. Das bedeutet, das Programm wird nicht zyklisch durchlaufen sondern reagiert nur auf einen Trigger?

            Ich habe ein paar Beispiele mit dem Trigger gefunden. Könnt ihr mir einen Tipp geben wie ich das mit der Schlaufe aufbauen kann?

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

              @chucky sagte:

              Könnt ihr mir einen Tipp geben

              Etwa so:

              const idWord2 = 'modbus.2.inputRegisters.30003_SPSEingangssWord_2';
              const path = '0_userdata.0.WagoSPS.Out.QW00_';
              
              function word2bits(word) {
                  for (let schritt = 0; schritt < 16; schritt++){
                      let schrittst = String(schritt);
                      if (schritt < 10) schrittst = '0' + schrittst;
                      if(existsState(path + schrittst)) setState(path + schrittst, (word >> schritt) & 1, true);
                      else createState(path + schrittst, (word >> schritt) & 1, {type: 'number', role: 'value'});
                  }
              }
              
              word2bits(getState(idWord2).val); // Skriptstart
              
              on(idWord2, function(dp) {
                  word2bits(dp.state.val);
              });
              

              Aber: @paul53 sagte in Werte on Objekten aktualisieren sich nicht: Anmerkung: In Javascript / ioBroker verwendet man keine binären Werte (0/1), sondern boolesche Werte (false/true):

              const idWord2 = 'modbus.2.inputRegisters.30003_SPSEingangssWord_2';
              const path = '0_userdata.0.WagoSPS.Out.QW00_';
              
              function word2bits(word) {
                  for (let schritt = 0; schritt < 16; schritt++){
                      let schrittst = String(schritt);
                      if (schritt < 10) schrittst = '0' + schrittst;
                      if(existsState(path + schrittst)) setState(path + schrittst, !!((word >> schritt) & 1), true);
                      else createState(path + schrittst, !!((word >> schritt) & 1), {type: 'boolean', role: 'indicator'});
                  }
              }
              
              word2bits(getState(idWord2).val); // Skriptstart
              
              on(idWord2, function(dp) {
                  word2bits(dp.state.val);
              });
              
              C 1 Reply Last reply Reply Quote 0
              • C
                chucky @paul53 last edited by

                @paul53

                Vielen Dank für das Beispiel. Habe es soeben getestet, funktioniert einwandfrei! Habe die werte "0 und 1" durch "true und false" ersetzt. Ebenfalls "number" durch "boolean".

                Noch für mein Verständnis:
                der Funktionsaufruf in Zeile 13, ruft die Funktion bei Skript Start auf.
                Der Trigger "on" in Zeile 15, überwacht den Wert von "idword2" und ruft bei Veränderung die Funktion(in Zeile) wieder auf. Der Wert in Klammern (dp.state.val) bezieht sich auf "idWord2" von der Zeile 15?

                Ach übrigens: das Überprüfen des bestehendes Objekt mittels "existState" finde ich ein sehr elegante Lösung

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

                  @chucky sagte:

                  Funktionsaufruf in Zeile 13, ruft die Funktion bei Skript Start auf.

                  Ja.

                  @chucky sagte in Werte on Objekten aktualisieren sich nicht:

                  Der Trigger "on" in Zeile 15, überwacht den Wert von "idword2" und ruft bei Veränderung die Funktion(in Zeile) wieder auf.

                  Ja, wenn sich der Wert ändert.

                  @chucky sagte in Werte on Objekten aktualisieren sich nicht:

                  Der Wert in Klammern (dp.state.val) bezieht sich auf "idWord2" von der Zeile 15?

                  Ja, das ist der Wert des Trigger-Datenpunktes.

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

                    @paul53
                    Beten Dank für deine Rückmeldung und Hilfe, ist eine super Sache!

                    Ich wünsche dir einen schönen Abend
                    Gruss Chucky

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

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    644
                    Online

                    31.9k
                    Users

                    80.2k
                    Topics

                    1.3m
                    Posts

                    communication javascript
                    3
                    8
                    469
                    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