NEWS
Schleife über Datenpunkte (JSON) inkl. DP ERstellung
-
Hallo zusammen,
ich brauche Hilfe bei der Umsetzung einer Programmieraufgabe.
Ich möchte gerne in Blockly eine Schleife über mehrere Datenpunkte laufen lassen und aus den darin enthaltenen Daten (eindimensionale JSON Strings) dynamisch die für mich wichtigen Daten in einzelne Datenpunkte schreiben. Temperatur, Luftfeuchtigkeit und Name des Geräts.
Der Inhalt des JSON ist immer gleich - es sind 8 Thermometer die per BLE und OpenMQTTGateway in den MQTT-Adapter gesendet werden.Speicherort der neuen DP: 0_Userdata.0.Klima...
Pfad des Datenpunkts: mqtt.0.omg.OpenMQTTGateway_LOLIN32LITE_BLE.BTtoMQTT.0423832779CB
JSON eines Datenpunkts:{ "id": "04:23:83:27:79:CB", "mac_type": 1, "rssi": -50, "brand": "ThermoPro", "tempc": "21", "hum": "47", "name": "TP(348)", "aem": "215037e3" etc.......... }
Hat das schon mal jemand gemacht?
Danke für Input vorab.
-
@nukleuz sagte in Schleife über Datenpunkte (JSON) inkl. DP ERstellung:
mqtt.0.omg.OpenMQTTGateway_LOLIN32LITE_BLE.BTtoMQTT.
Gemacht nicht, aber das sollte ja keine Raketenwissenschaft sein.
Sind die 8 Thermometer über eine einheitliche Struktur ansprechbar?
Also sowas wiemqtt.0.omg.OpenMQTTGateway_LOLIN32LITE_BLE.BTtoMQTT.*
.
Wenn nicht, könnte man die in eine Aufzählung packen und über diese "enumeration" eine Schleife laufen lassen. -
Sind die 8 Thermometer über eine einheitliche Struktur ansprechbar?
Also sowas wiemqtt.0.omg.OpenMQTTGateway_LOLIN32LITE_BLE.BTtoMQTT.*
.
Wenn nicht, könnte man die in eine Aufzählung packen und über diese "enumeration" eine Schleife laufen lassen.Ja, korrekt - genau da sind alle DP drin...
EDIT: Die Aufzählung ist tatsächlich die bessere Variante, da ich nicht weiss, wie gut die White-/Blacklists funktionieren.
-
@nukleuz
Und der Trigger wäre was?
Von den 8 Thermometern kommen ja jeweils mehrere Werte an.
Wann sollen die neuen DP geschrieben werden? Bei Änderung von Temperatur oder Luftfeuchte? Das wären dann schon mal 16 Elemente in der Aufzählung. -
Ich würde erst mal alle 1-5min die Werte holen, um ein Gefühl dafür zu bekommen, ob die im Intervall senden oder nur bei Änderung.
Da bin ich noch nicht richtig schlüssig, aber für jede Anregung dankbar.
Erst dachte ich daran die 8 DP mit JSON zu nehmen, doch dann würden mit ODER verknüpft immer alle DP aktualisiert werden, auch wenn es keine Änderung gab...Mhhh...
-
@nukleuz
Ich würde die168 relevanten DP (sind ja nur 8 weil Temperatur und Luftfeuchte in einem JSON stecken) in eine Aufzählung packen und auf Änderung triggern. Wenn's zu viel wird, kann man auf zyklisch umstellen.Im Prinzip sähe das so aus:
-
Das werde ich in der Mittagspause gleich testen - gebe Feedback
-
Prinzipiell funktioniert das, nur wie lege ich die Datenpunkte an, ohne Sie vorab manuell anlegen zu müssen?
Es gibt zwar den Baustein: "Datenpunkt erzeugen", doch wie kann ich dort den Pfad variabel gestalten?Danke...
-
@nukleuz
Am besten mit JS. Blockly ist da leider nicht wirklich geeignet.const id = '0_userdata.0.klima.'; const aName = getObject(dpName).common.name; if (!existsObject(id + aName)) { setObject(id + aName, {type: 'device', common: {name: 'Temperatursensor'}, native: {}}); createState(id + aName + '.temp', 0, {name: 'Temperatur', type: 'number', unit: '°C'}); createState(id + aName + '.hum', 0, {name: 'Luftfeuchtigkeit', type: 'number', unit: '%'}); }
-
Ich habe es für meine Zwecke hinbekommen.
Danke für die Hilfestellung...Hier das Skript, falls jemand vor dem gleichen oder ähnlichem Problem steht:
var json, name2; const idDP = '0_userdata.0.Klima.Test.'; on({id: [].concat(Array.prototype.slice.apply($("state[id=*](functions=thermo)"))), change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; json = (obj.state ? obj.state.val : ""); name2 = [idDP,getAttr(json, 'name'),'.temperatur'].join(''); name2 = name2.replace("(", ""); name2 = name2.replace(")", ""); name2 = name2.replace(/\s/g, '-'); console.log(name2); createState(name2, 0, {name: 'Temperatur', type: 'number', role: 'sensor.humidity', unit: '°C'}); setStateDelayed(name2, getAttr(json, 'tempc'), true, parseInt(((3000) || "").toString(), 10), false); name2 = [idDP,getAttr(json, 'name'),'.humidity'].join(''); name2 = name2.replace("(", ""); name2 = name2.replace(")", ""); name2 = name2.replace(/\s/g, '-'); console.log(name2); createState(name2, 0, {name: 'Luftfeuchtigkeit', type: 'number', role: 'sensor.temperature', unit: '%'}); setStateDelayed(name2, getAttr(json, 'hum'), true, parseInt(((3000) || "").toString(), 10), false); name2 = [idDP,getAttr(json, 'name'),'.rssi'].join(''); name2 = name2.replace("(", ""); name2 = name2.replace(")", ""); name2 = name2.replace(/\s/g, '-'); console.log(name2); createState(name2, 0, {name: 'Empfangsstärke', type: 'number', role: 'value.rssi', unit: 'dBm'}); setStateDelayed(name2, getAttr(json, 'hum'), true, parseInt(((3000) || "").toString(), 10), false); });