Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. JS Script optimieren

    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

    JS Script optimieren

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

      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));
      
      
      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @ubecker last edited by 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); 
        });
        
        ubecker 1 Reply Last reply Reply Quote 1
        • ubecker
          ubecker @paul53 last edited by

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

          paul53 1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @ubecker last edited by 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));
            
            
            ubecker 1 Reply Last reply Reply Quote 0
            • ubecker
              ubecker @paul53 last edited by

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

              paul53 1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @ubecker last edited by 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.

                ubecker 2 Replies Last reply Reply Quote 1
                • ubecker
                  ubecker @paul53 last edited by

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

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

                    @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" 😊
                    Danke für die hilfe

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

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    982
                    Online

                    31.8k
                    Users

                    80.0k
                    Topics

                    1.3m
                    Posts

                    2
                    8
                    311
                    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