NEWS
[gelöst] Werte mqtt auslesen - Datenpunkt schreiben
-
Hallo zusammen,
ich habe bei uns einige FlowerCare sensoren im Einsatz und wollte diese nun ins Smarthome einbinden. Dazu habe ich mir einen ESP32 zugelegt und mit dem openmqttgateway 0.95 geflashed. Das funktioniert soweit auch und ich sehe die Sticks auch. Ich weiß aber nicht wie ich die Werte jetzt weiterverwenden kann. Ich möchte moi, lux, tempc, tempf auslesen und in Datenpunkte reinschreiben.
So sieht es im IoBroker aus, was über MQTT nacheinander ankommt.
{"id":"C4:7C:8D:66:3E:E3","name":"Flower care","rssi":-84,"distance":13.81901,"model":"HHCCJCY01HHCC","lux":120} {"id":"C4:7C:8D:66:3E:E3","name":"Flower care","rssi":-85,"distance":15.12852,"model":"HHCCJCY01HHCC","tem":21.1,"tempc":21.1,"tempf":69.98} {"id":"C4:7C:8D:66:3E:E3","name":"Flower care","rssi":-74,"distance":5.270232,"model":"HHCCJCY01HHCC","moi":10}
Dachte das es mittels einem Java-Script gehen müsste, bin hier aber leider totaler Anfänger. Hat einer Tipp wie das geht? Habe es schonmal versucht, komme aber nicht weiter. Aktuell schaut das Skript so aus:
const idRaw = "mqtt.0.home.ESP.OpenMQTTGateway_ESP32_BLE_Flur.BTtoMQTT.C47C8D663EE3"; // Datenpunkt-ID MQTT const Lux_Yucca = 'lux'; // Datenpunkt erzeugen createState(Lux_Yucca, 0, { type: 'number', name: 'lux', }); function lux(json) { var obj = JSON.parse(json); var range = parseFloat(obj.lux); setState(Lux_Yucca, range, true); } lux(getState(idRaw).val); // Skriptstart on(idRaw, function(dp) { lux(dp.state.val); });
Danke!
-
@tigertim08
Versuche es mal so:function lux(json) { let obj = JSON.parse(json); let keys = Object.keys(obj); if(keys.includes('lux')) setState(Lux_Yucca, obj.lux, true); }
-
@paul53 Danke! das funktioniert. Noch eine andere Frage, wenn ich die anderen Werte auch mit auswerten möchte dann so:
const idRaw = "mqtt.0.home.ESP.OpenMQTTGateway_ESP32_BLE_Flur.BTtoMQTT.C47C8D663EE3"; // Datenpunkt-ID MQTT const Lux_Yucca = 'lux'; const Moi_Yucca = 'moi'; // Datenpunkt erzeugen createState(Lux_Yucca, 0, { type: 'number', name: 'lux', }); createState(Moi_Yucca, 0, { type: 'number', name: 'moi', }); function lux(json) { let obj = JSON.parse(json); let keys = Object.keys(obj); if(keys.includes('lux')) setState(Lux_Yucca, obj.lux, true); } function moi(json) { let obj = JSON.parse(json); let keys = Object.keys(obj); if(keys.includes('moi')) setState(Moi_Yucca, obj.moi, true); } lux(getState(idRaw).val); // Skriptstart on(idRaw, function(dp) { lux(dp.state.val); });
Habe jetzt mal nur den Moi Wert genommen. Passt das vom Aufbau?
Danke!
-
@tigertim08 sagte:
Passt das vom Aufbau?
Nein, zu umständlich.
function yucca(json) { let obj = JSON.parse(json); let keys = Object.keys(obj); if(keys.includes('lux')) setState(Lux_Yucca, obj.lux, true); if(keys.includes('moi')) setState(Moi_Yucca, obj.moi, true); }
@tigertim08 sagte in Werte openmqttgateway auslesen und in Datenpunkt schreiben:
const Lux_Yucca = 'lux'; const Moi_Yucca = 'moi';
Besser mit Ordnerstruktur:
const Lux_Yucca = 'Yucca.lux'; const Moi_Yucca = 'Yucca.moi';
-
@paul53 danke probiere ich morgen gleich mal aus
-
@paul53 Guten Morgen
Habe das Skript jetzt angepasst und es sieht wie folgt aus:
const idRaw = "mqtt.0.home.ESP.OpenMQTTGateway_ESP32_BLE_Flur.BTtoMQTT.C47C8D663EE3"; // Datenpunkt-ID MQTT const Lux_Yucca = 'Yucca.lux'; const Moi_Yucca = 'Yucca.moi'; const TempC_Yucca = 'Yucca.tempc'; const TempF_Yucca = 'Yucca.tempf'; // Datenpunkt erzeugen createState(Lux_Yucca, 0, { type: 'number', name: 'lux', }); createState(Moi_Yucca, 0, { type: 'number', name: 'moi', }); createState(TempC_Yucca, 0, { type: 'number', name: 'tempc', }); createState(TempF_Yucca, 0, { type: 'number', name: 'tempf', }); function yucca(json) { let obj = JSON.parse(json); let keys = Object.keys(obj); if(keys.includes('lux')) setState(Lux_Yucca, obj.lux, true); if(keys.includes('moi')) setState(Moi_Yucca, obj.moi, true); if(keys.includes('tempc')) setState(TempC_Yucca, obj.moi, true); if(keys.includes('tempf')) setState(TempF_Yucca, obj.moi, true); } lux(getState(idRaw).val); // Skriptstart on(idRaw, function(dp) { lux(dp.state.val); });
Er merkert aber leider noch rum beim Skriptstart in Zeile 34.
09:34:37.128 info javascript.0 (427) Start javascript script.js.common.Test.Flower_Care_Yucca 09:34:37.136 error javascript.0 (427) script.js.common.Test.Flower_Care_Yucca: script.js.common.Test.Flower_Care_Yucca:34 09:34:37.138 error javascript.0 (427) at script.js.common.Test.Flower_Care_Yucca:34:2 09:34:40.835 info javascript.0 (427) Stop script script.js.common.Test.Flower_Care_Yucca
Vielen Dank schonmal.
-
@tigertim08 sagte:
merkert aber leider noch rum beim Skriptstart in Zeile 34.
Wenn die Funktion umbenannt wird, muss auch der Aufruf angepasst werden.
yucca(getState(idRaw).val); // Skriptstart on(idRaw, function(dp) { yucca(dp.state.val); });
Brauchst Du wirklich die Temperatur in °F ?
-
@paul53 Danke! Stimmt °F bauch ich nicht wirklich habe ich gerade wieder rausgenommen