Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
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
    2.0k

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

JS Script optimieren

Geplant Angeheftet Gesperrt Verschoben JavaScript
8 Beiträge 2 Kommentatoren 517 Aufrufe 1 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • ubeckerU Online
    ubeckerU Online
    ubecker
    schrieb am zuletzt editiert von
    #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 Antwort Letzte Antwort
    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
      schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
      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 Online
        ubeckerU Online
        ubecker
        schrieb am zuletzt editiert von
        #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 Antwort Letzte Antwort
        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
          schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
          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 Online
            ubeckerU Online
            ubecker
            schrieb am zuletzt editiert von
            #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 Antwort Letzte Antwort
            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
              schrieb am zuletzt editiert von 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 Antworten Letzte Antwort
              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 Online
                ubeckerU Online
                ubecker
                schrieb am zuletzt editiert von
                #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 Antwort Letzte Antwort
                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 Online
                  ubeckerU Online
                  ubecker
                  schrieb am zuletzt editiert von
                  #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 Antwort Letzte Antwort
                  0
                  Antworten
                  • In einem neuen Thema antworten
                  Anmelden zum Antworten
                  • Älteste zuerst
                  • Neuste zuerst
                  • Meiste Stimmen


                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  717

                  Online

                  32.4k

                  Benutzer

                  81.4k

                  Themen

                  1.3m

                  Beiträge
                  Community
                  Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                  ioBroker Community 2014-2025
                  logo
                  • Anmelden

                  • Du hast noch kein Konto? Registrieren

                  • Anmelden oder registrieren, um zu suchen
                  • Erster Beitrag
                    Letzter Beitrag
                  0
                  • Home
                  • Aktuell
                  • Tags
                  • Ungelesen 0
                  • Kategorien
                  • Unreplied
                  • Beliebt
                  • GitHub
                  • Docu
                  • Hilfe