NEWS
JS Script optimieren
-
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 Scriptvar 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));
-
@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); });
-
@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?
-
@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));
-
@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.) -
@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.
-
@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. -
@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