Skip to content
  • Home
  • 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
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. JS Script optimieren

NEWS

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

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

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.3k

JS Script optimieren

Scheduled Pinned Locked Moved JavaScript
8 Posts 2 Posters 517 Views 1 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.
  • ubeckerU Offline
    ubeckerU Offline
    ubecker
    wrote on last edited by
    #1

    Hallo kann mir jemand mein JS-Script optimieren.
    Es ist eine Mischung aus eigen und Blockly Elementen.
    Das Srcipt funktioniert, aber einige Stellen sind mir suspect. (besonnders der Teil der for Schleifen)
    Kurze Info dazu
    Das Script kopiert mir Werte von Datenpunkte von z-wave nach mqtt. Die Datenpunkte (IDs) stehen in einem JSON File.
    Zur Zeit sind es nur wenige DP, aber ich wollte bei Erweiterung nicht immer das Script ändern. So reicht es wenn die neuen DP in das JSON aufgenommen werden.
    Hier das Script

     var m_id, i, Eintrag_Nr, ID_Liste, z_id, innen, aussen;
    
    // copy  Werte von z-wave nach mqtt
    // benutzt die das Array array_z2m
    
    // Array lesen zur Initialisierung
    ID_Liste = (function () { try { return JSON.parse(getState('javascript.0.array_z2m').val); } catch (e) { return {}; }})();
    // Array neu lesen
    on({ id: [].concat(['javascript.0.array_z2m']), change: 'ne' }, async (obj) => {
      let value = obj.state.val;
      let oldValue = obj.oldState.val;
      ID_Liste = (function () { try { return JSON.parse(getState('javascript.0.array_z2m').val); } catch (e) { return {}; }})();
    });
    
    // Array Werte geändert?
    on({ id: [].concat(ID_Liste), change: 'ne' }, async (obj) => {
      let value = obj.state.val;
      let oldValue = obj.oldState.val;
      //  console.log((['nach Trigger: ',(obj.state ? obj.state.ts : ''),obj.id].join('')));
    
      // wenn ID mit mqtt dann nichts machen
      if (parseFloat((obj.id.indexOf("mqtt") + 1)) == 0) {
          // nur z-wave Ids bearbeiten
          z_id = obj.id;
    
           // Eintagsnummer in Liste suchen 
          var aussen_end = ID_Liste.length;
          var aussen_inc = 1;
          if (1 > aussen_end) {
            aussen_inc = -aussen_inc;
          }
          for (aussen = 1; aussen_inc >= 0 ? aussen <= aussen_end : aussen >= aussen_end; aussen += aussen_inc) {
              var innen_list = ID_Liste[(aussen - 1)];
                for (var innen_index in innen_list) {
                  innen = innen_list[innen_index];
                   if (z_id == innen) {
                    Eintrag_Nr = aussen - 1;
                  }
                  break;
                }
            }
     
        // ID holen
          let ID__list = ID_Liste[(Eintrag_Nr)];
          m_id = ID__list[1];
    
         // Werte nach mqtt Datenpunkt schreiben
          setStateDelayed(m_id, getState(z_id).val, true, parseInt(((0) || '').toString(), 10), false);
         // console.log((['Listenlänge Z: ',ID_Liste.length,' ; Name: ',obj.id,' : Wert von z_id: ',(obj.state ? obj.state.val : ''),' ; Eintrag_nr: ',Eintrag_Nr,' ; m_id. ',m_id,'',''].join('')));
        }
    });
    
    

    hier die JSON

    // nur zum ersten erzeugen der ID Liste für Daten z-wave 2 mgtt
    // 
    var ID_Liste;
    
    ID_Liste = 
     [
      [
        "alias.0.z-wave.1_brightness",
        "alias.0.mqtt.1_brigthness"
      ],
      [
        "alias.0.z-wave.2_motion",
        "alias.0.mqtt.2_motion"
     ],
      [
        "alias.0.z-wave.3_temp",
        "alias.0.mqtt.3_temp"
      ],
      [
        "alias.0.z-wave.4_rollo_wert",
        "alias.0.mqtt.4_rollo_value"
      ]
    
     ];
     // console.log(ID_Liste);
    setState('javascript.0.array_z2m' /*array z2m*/ , JSON.stringify(ID_Liste), true);
     // console.log((ID_Liste.length));
    
    

    Gruß Udo

    paul53P 1 Reply Last reply
    0
    • ubeckerU ubecker

      Hallo kann mir jemand mein JS-Script optimieren.
      Es ist eine Mischung aus eigen und Blockly Elementen.
      Das Srcipt funktioniert, aber einige Stellen sind mir suspect. (besonnders der Teil der for Schleifen)
      Kurze Info dazu
      Das Script kopiert mir Werte von Datenpunkte von z-wave nach mqtt. Die Datenpunkte (IDs) stehen in einem JSON File.
      Zur Zeit sind es nur wenige DP, aber ich wollte bei Erweiterung nicht immer das Script ändern. So reicht es wenn die neuen DP in das JSON aufgenommen werden.
      Hier das Script

       var m_id, i, Eintrag_Nr, ID_Liste, z_id, innen, aussen;
      
      // copy  Werte von z-wave nach mqtt
      // benutzt die das Array array_z2m
      
      // Array lesen zur Initialisierung
      ID_Liste = (function () { try { return JSON.parse(getState('javascript.0.array_z2m').val); } catch (e) { return {}; }})();
      // Array neu lesen
      on({ id: [].concat(['javascript.0.array_z2m']), change: 'ne' }, async (obj) => {
        let value = obj.state.val;
        let oldValue = obj.oldState.val;
        ID_Liste = (function () { try { return JSON.parse(getState('javascript.0.array_z2m').val); } catch (e) { return {}; }})();
      });
      
      // Array Werte geändert?
      on({ id: [].concat(ID_Liste), change: 'ne' }, async (obj) => {
        let value = obj.state.val;
        let oldValue = obj.oldState.val;
        //  console.log((['nach Trigger: ',(obj.state ? obj.state.ts : ''),obj.id].join('')));
      
        // wenn ID mit mqtt dann nichts machen
        if (parseFloat((obj.id.indexOf("mqtt") + 1)) == 0) {
            // nur z-wave Ids bearbeiten
            z_id = obj.id;
      
             // Eintagsnummer in Liste suchen 
            var aussen_end = ID_Liste.length;
            var aussen_inc = 1;
            if (1 > aussen_end) {
              aussen_inc = -aussen_inc;
            }
            for (aussen = 1; aussen_inc >= 0 ? aussen <= aussen_end : aussen >= aussen_end; aussen += aussen_inc) {
                var innen_list = ID_Liste[(aussen - 1)];
                  for (var innen_index in innen_list) {
                    innen = innen_list[innen_index];
                     if (z_id == innen) {
                      Eintrag_Nr = aussen - 1;
                    }
                    break;
                  }
              }
       
          // ID holen
            let ID__list = ID_Liste[(Eintrag_Nr)];
            m_id = ID__list[1];
      
           // Werte nach mqtt Datenpunkt schreiben
            setStateDelayed(m_id, getState(z_id).val, true, parseInt(((0) || '').toString(), 10), false);
           // console.log((['Listenlänge Z: ',ID_Liste.length,' ; Name: ',obj.id,' : Wert von z_id: ',(obj.state ? obj.state.val : ''),' ; Eintrag_nr: ',Eintrag_Nr,' ; m_id. ',m_id,'',''].join('')));
          }
      });
      
      

      hier die JSON

      // nur zum ersten erzeugen der ID Liste für Daten z-wave 2 mgtt
      // 
      var ID_Liste;
      
      ID_Liste = 
       [
        [
          "alias.0.z-wave.1_brightness",
          "alias.0.mqtt.1_brigthness"
        ],
        [
          "alias.0.z-wave.2_motion",
          "alias.0.mqtt.2_motion"
       ],
        [
          "alias.0.z-wave.3_temp",
          "alias.0.mqtt.3_temp"
        ],
        [
          "alias.0.z-wave.4_rollo_wert",
          "alias.0.mqtt.4_rollo_value"
        ]
      
       ];
       // console.log(ID_Liste);
      setState('javascript.0.array_z2m' /*array z2m*/ , JSON.stringify(ID_Liste), true);
       // console.log((ID_Liste.length));
      
      
      paul53P Offline
      paul53P Offline
      paul53
      wrote on last edited by paul53
      #2

      @ubecker sagte: hier die JSON

      So wie die Liste jetzt aufgebaut ist: Genügt es nicht eine Liste der Quell-IDs (z-wave) zu verwenden und in der Ziel-ID einfach "z-wave" durch "mqtt" zu ersetzen?
      Ein Listen-DP kann auch vom Typ "array" sein. Dann wandelt der JS-Adapter automatisch von / nach JSON.

      const ids = 'javascript.0.array_z2m'; // Typ: "array"
      const ID_Liste = getState(ids).val; 
      
      on(ID_Liste, function(dp) {
          const id = dp.id.replace('z-wave', 'mqtt');
          setState(id, dp.state.val); 
      });
      

      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

      ubeckerU 1 Reply Last reply
      1
      • paul53P paul53

        @ubecker sagte: hier die JSON

        So wie die Liste jetzt aufgebaut ist: Genügt es nicht eine Liste der Quell-IDs (z-wave) zu verwenden und in der Ziel-ID einfach "z-wave" durch "mqtt" zu ersetzen?
        Ein Listen-DP kann auch vom Typ "array" sein. Dann wandelt der JS-Adapter automatisch von / nach JSON.

        const ids = 'javascript.0.array_z2m'; // Typ: "array"
        const ID_Liste = getState(ids).val; 
        
        on(ID_Liste, function(dp) {
            const id = dp.id.replace('z-wave', 'mqtt');
            setState(id, dp.state.val); 
        });
        
        ubeckerU Offline
        ubeckerU Offline
        ubecker
        wrote on last edited by
        #3

        @paul53 said in JS Script optimieren:

        Dann wandelt der JS-Adapter automatisch von / nach JSON.

        interessant, ich muss noch viel lernen.
        Aber ich ersetze nichts in der Liste. Ich schaue in die Liste welcher DP sich geändert hat. Wenn es einer mit "mqtt" in der ID ist dann ignoriere ich das.

         if (parseFloat((obj.id.indexOf("mqtt") + 1)) == 0) {
              // nur z-wave Ids bearbeiten
        

        Wenn es nicht mqtt ist dann nehme ich den nächsten Wert aus der Liste

           // ID holen
              let ID__list = ID_Liste[(Eintrag_Nr)];
              m_id = ID__list[1];
         
        

        (hier weiss ich ja das es die richtige ID ist) und schreibe den Wert des DP (Beispiel "alias.0.z-wave.3_temp") in den Datenpunkt (Beispiel "alias.0.mqtt.3_temp")

        Wie kann man das besser machen?

        Gruß Udo

        paul53P 1 Reply Last reply
        0
        • ubeckerU ubecker

          @paul53 said in JS Script optimieren:

          Dann wandelt der JS-Adapter automatisch von / nach JSON.

          interessant, ich muss noch viel lernen.
          Aber ich ersetze nichts in der Liste. Ich schaue in die Liste welcher DP sich geändert hat. Wenn es einer mit "mqtt" in der ID ist dann ignoriere ich das.

           if (parseFloat((obj.id.indexOf("mqtt") + 1)) == 0) {
                // nur z-wave Ids bearbeiten
          

          Wenn es nicht mqtt ist dann nehme ich den nächsten Wert aus der Liste

             // ID holen
                let ID__list = ID_Liste[(Eintrag_Nr)];
                m_id = ID__list[1];
           
          

          (hier weiss ich ja das es die richtige ID ist) und schreibe den Wert des DP (Beispiel "alias.0.z-wave.3_temp") in den Datenpunkt (Beispiel "alias.0.mqtt.3_temp")

          Wie kann man das besser machen?

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

          @ubecker sagte: Wenn es einer mit "mqtt" in der ID ist dann ignoriere ich das.

          Lass die weg und verwende eine einfache Liste mit den Z-Wave-IDs. Dann genügt das gezeigte Skript, um den Z-Wave-Wert in den zugehörigen MQTT-DP zu übertragen.

          // nur zum ersten erzeugen der ID Liste für Daten z-wave 2 mgtt
          const ID_Liste = [
              "alias.0.z-wave.1_brightness",
              "alias.0.z-wave.2_motion",
              "alias.0.z-wave.3_temp",
              "alias.0.z-wave.4_rollo_wert"
          ];
           // DP-Typ: "array"
          setState('javascript.0.array_z2m' /*array z2m*/ , ID_Liste, true);
           // console.log((ID_Liste.length));
          
          

          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

          ubeckerU 1 Reply Last reply
          0
          • paul53P paul53

            @ubecker sagte: Wenn es einer mit "mqtt" in der ID ist dann ignoriere ich das.

            Lass die weg und verwende eine einfache Liste mit den Z-Wave-IDs. Dann genügt das gezeigte Skript, um den Z-Wave-Wert in den zugehörigen MQTT-DP zu übertragen.

            // nur zum ersten erzeugen der ID Liste für Daten z-wave 2 mgtt
            const ID_Liste = [
                "alias.0.z-wave.1_brightness",
                "alias.0.z-wave.2_motion",
                "alias.0.z-wave.3_temp",
                "alias.0.z-wave.4_rollo_wert"
            ];
             // DP-Typ: "array"
            setState('javascript.0.array_z2m' /*array z2m*/ , ID_Liste, true);
             // console.log((ID_Liste.length));
            
            
            ubeckerU Offline
            ubeckerU Offline
            ubecker
            wrote on last edited by
            #5

            @paul53 alles klar, verstanden. Baue ich mal um.
            gibt es denn noch eine Verbesserung an der "for" Schleife? Dieser Teil stammt aus blockly, da ich nicht wusste wie ich den in JS schreibe.
            (meine Versuche die Schleife zu schreiben haben immer dazu geführt das Javascript abgestürzt ist.):cold_sweat:

            Gruß Udo

            paul53P 1 Reply Last reply
            0
            • ubeckerU ubecker

              @paul53 alles klar, verstanden. Baue ich mal um.
              gibt es denn noch eine Verbesserung an der "for" Schleife? Dieser Teil stammt aus blockly, da ich nicht wusste wie ich den in JS schreibe.
              (meine Versuche die Schleife zu schreiben haben immer dazu geführt das Javascript abgestürzt ist.):cold_sweat:

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

              @ubecker sagte: "for" Schleife?

              // Kopieren aller Werte bei Skriptstart
              for(const idSrc of ID_Liste) {
                  const idDst = idSrc.replace('z-wave', 'mqtt');
                  const state = getState(idSrc);
                  setState(idDst, state.val, state.ack);     
              }
              

              ... für das einfache Array mit den Z-Wave-IDs.

              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

              ubeckerU 2 Replies Last reply
              1
              • paul53P paul53

                @ubecker sagte: "for" Schleife?

                // Kopieren aller Werte bei Skriptstart
                for(const idSrc of ID_Liste) {
                    const idDst = idSrc.replace('z-wave', 'mqtt');
                    const state = getState(idSrc);
                    setState(idDst, state.val, state.ack);     
                }
                

                ... für das einfache Array mit den Z-Wave-IDs.

                ubeckerU Offline
                ubeckerU Offline
                ubecker
                wrote on last edited by
                #7

                @paul53
                es war dieser Teil aus dem script oben gemeint,

                      // Eintagsnummer in Liste suchen 
                      var aussen_end = ID_Liste.length;
                      var aussen_inc = 1;
                      if (1 > aussen_end) {
                        aussen_inc = -aussen_inc;
                      }
                      for (aussen = 1; aussen_inc >= 0 ? aussen <= aussen_end : aussen >= aussen_end; aussen += aussen_inc) {
                          var innen_list = ID_Liste[(aussen - 1)];
                            for (var innen_index in innen_list) {
                              innen = innen_list[innen_index];
                               if (z_id == innen) {
                                Eintrag_Nr = aussen - 1;
                              }
                              break;
                            }
                        }
                 
                

                diese Teil brauche ich ja nicht mehr nicht mehr wenn ich das so mache wie du schreibst.
                hab es jetzt hoffendlich verstanden. Ich werde es umbauen.
                deine for Schleife verstehe ich. Das was Blockly gemacht hat verstehe ich nicht.

                Gruß Udo

                1 Reply Last reply
                0
                • paul53P paul53

                  @ubecker sagte: "for" Schleife?

                  // Kopieren aller Werte bei Skriptstart
                  for(const idSrc of ID_Liste) {
                      const idDst = idSrc.replace('z-wave', 'mqtt');
                      const state = getState(idSrc);
                      setState(idDst, state.val, state.ack);     
                  }
                  

                  ... für das einfache Array mit den Z-Wave-IDs.

                  ubeckerU Offline
                  ubeckerU Offline
                  ubecker
                  wrote on last edited by
                  #8

                  @paul53 kurze Info, es funktioniert wie es soll.
                  Von meinem langen code sind nur noch ein paar Zeilen übrig geblieben.
                  Ein DP wurde nicht aktualisiert, lange gesucht warum.
                  War ein Schreibfehler im Namen des Datenpunktes.
                  "alias.0.z-wave.1_brightness", "alias.0.mqtt.1_brigthness" :blush:
                  Danke für die hilfe

                  Gruß Udo

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


                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  342

                  Online

                  32.4k

                  Users

                  81.4k

                  Topics

                  1.3m

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

                  • Don't have an account? Register

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