NEWS
Objekte unterhalb eines Odners lesen
-
Hallo,
bezüglich einer MQQT Schnittstelle zu einem Hersteller liefert dieser "NUR" in den Topics einen Wert in Form eine JSONs aus.
Im MQTT State steht dann bspw.{value: 2.5}
Ich würde gerne ein Skript erstellen, das mir mit Eingabe des Startverzeichnisses alle unterlagerten Objekte in einem angegeben Zielverzeichnis erstellt und deren Wert anlegt.
Gibt es eine Möglichkeit im Javascript Adapter Die Verzeichnisse zu durchlaufen, sodass ich auch wirklich abfragen kann ist es ein folder, oder channel, state etc.?
Oder wäre ein gängiger Weg mit einer Regex einfach den Hauptpfad zu subscriben und dann auf Änderungen zu reagieren?
Dann hätte man allerdings die States erst nach einer änderung. und die channels wären grundsätzlich alle folders... ps. sind sie aber glaube im falle vom mqtt adapter sowieso alle, da dies ja einfach die topic darstellt glaube ich. -
So ganz verstehe ich dein Anliegen zwar nicht, aber wenn es um das Zerlegen einer mqtt-Nachricht in Datenpunkte gehen sollte:
// where the mqtt messages arrive const mqttDatenpunktObjectId = 'mqtt.0.solix.site.device.scenInfo'; // where the states should appear const userDataFolder = '0_userdata.0.device'; // ############## end user config // receive on(mqttDatenpunktObjectId, (obj) => { // log(JSON.stringify(obj.state.val)) const jsonString = obj.state.val; const jsonData = JSON.parse(jsonString); function createObjectsRecursively(parent, data) { for (const key in data) { const obj = data[key]; const stateName = `${parent}.${key}`; if (typeof obj === 'object') { createObjectsRecursively(stateName, obj); } else { let value = obj; // Check if the state already exists. If it does, just update the value. // If it does not exist create the states. if (!existsState(stateName)) { // If the state does not exist, create it and set the value createState(stateName, value, { name: key, type: typeof value, role: "value", read: true, write: true }); log(`Created state ${stateName}`); } else { // log(stateName + ': ' + value) setState(stateName, value, true); } } } } createObjectsRecursively(userDataFolder, jsonData); });
-
@thomas-braun Danke, hatte so gelöst:
const quelle = "mqtt.0.N.c0619ab24727"; const ziel = "0_userdata.0.Tests.Victron"; const quelleRegEx = new RegExp(quelle); on({id:quelleRegEx,change:"any"},async (dp)=>{ const zielId = ziel + dp.id.substring(quelle.length,dp.id.length); const stateJson = JSON.parse(dp.state.val); if(typeof stateJson === "object"){ for(const att in stateJson){ const attId = `${zielId}.${att}`; await createStateAsync(attId); await setStateAsync(attId,stateJson[att],true); } } else{ await createStateAsync(zielId); await setStateAsync(zielId,dp.state.val,true); } });
Allerdings kommt wohl sehr viel über den MQTT Adapter rein.... Ich bekam eine Meldung, dass setState mehr als 1000 mal ausgeführt wurde pro Minute