NEWS
Daten mit Blockly aus InfluxDB abrufen
-
Die Query funktioniert ja im Querybuilder von Influx, da kommt auch genau ein Wert zurück.
Ich wüsste gern wie das Array result innen aussieht, also ob es da Indizes gibt oder ob nicht. -
wieso nur Schnipsel?
Oben steht doch der gesamte Code?
Und der Logoutput gibt nun mal nur diese wenigen Infos her. Wenn ich wüsste, wie ich da mehr Informationen rausbekomme, würde ich es ja tun. Der Adapter steht auch schon auf Debug.@tobidd sagte in Daten mit Blockly aus InfluxDB abrufen:
wieso nur Schnipsel?
ehrlich jetzt?
hat früher nichts im iobroker log gestanden?
erst jetzt? -
@tobidd sagte in Daten mit Blockly aus InfluxDB abrufen:
wieso nur Schnipsel?
ehrlich jetzt?
hat früher nichts im iobroker log gestanden?
erst jetzt? -
Hallo liebe Gemeinde,
ich versuche jetzt schon seit 3 Tagen werte aus meiner InfluxDB 2 via Blockly Skripten abzurufen.
Da ich mich mit Java nicht auskenne, versuche ich das eben über Blockly.
Leider bin ich dabei überhaupt nicht erfolgreich.Ich habe es, wie in diesem Post beschrieben, versucht, natürlich mit meinen eigenen Werten aber es klappt nicht.
Re: Blockly InfluxDB2.0 Flux Abfrage
Ich habe zu erst im Influx Querybuilder eine Abfrage erstellt, die funktioniert.
from(bucket: "iobroker") |> range(start: -1m) |> filter(fn: (r) => r["_measurement"] == "mqtt.1.solaranzeige.huawei.pv1_leistung") |> filter(fn: (r) => r["_field"] == "value") |> last()Da kommt genau ein Wert raus (die Sinnhaftigkeit sei jetzt mal dahin gestellt, es geht erst mal darum, das es funktioniert)
Das ganze habe ich dann ins Blockly wie folgt eingebaut.

var flux, result; on({ id: 'mqtt.0.solaranzeige.sh10rt.hausverbrauch' /* solaranzeige/sh10rt/hausverbrauch */, change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; flux = ['from(bucket: "iobroker")','|> range(start: -1m)','|> filter(fn: (r) => r["_measurement"] == "mqtt.1.solaranzeige.huawei.pv1_leistung")','|> filter(fn: (r) => r["_field"] == "value")','|> last()'].join(''); sendTo('influxdb.1', 'query', { 'result': flux }, async (result) => { setState('0_userdata.0.Solar.pv_ertrag_heute' /* pv_ertrag_heute */, parseFloat(getAttr(JSON.stringify(result, null, 2), 'result.0.0._value'))); console.log(parseFloat(getAttr(JSON.stringify(result, null, 2), 'result.0.0._value'))); console.log(getAttr(JSON.stringify(result, null, 2), 'result.0.0._value')); }); console.log("influxdb.1: " + ""); });Wenn ich das Script starte, steht im Log folgendes:
11:27:21.080 info javascript.0 (421) Start JavaScript script.js.common.Berechnungen.solar (Blockly) 11:27:21.082 info javascript.0 (421) script.js.common.Berechnungen.solar: registered 1 subscription, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 11:28:12.350 info javascript.0 (421) script.js.common.Berechnungen.solar: influxdb.1: 11:28:12.374 info javascript.0 (421) script.js.common.Berechnungen.solar: NaN 11:28:12.378 info javascript.0 (421) script.js.common.Berechnungen.solar: nullDer Adapter influxdb.1 ist auch der richtige.
Was mache ich falsch?
Ich habe es vorher mit einer Influxdb 1.8 und Select Statements, welche mir ehrlich gesagt besser gefallen würden, versucht aber das Ergebnis war das gleiche.Ich hoffe, Ihr könnt mich auf den richtigen Pfad zurück bringen.
Grüße Tobi
@tobidd
Nach langem Probieren würd' ich so was aus der influxDB rausbekommen:


Inhalt der JS Funktion:var ergebnis; sendTo('influxdb.0', 'query', flux, function (result) { if (result.error) { console.error(result.error); } else { // show result // console.log('Rows: ' + JSON.stringify(result)); ergebnis = JSON.stringify(result); } }); await wait(1000); return ergebnis;Vielleicht kannst Du ja damit was anfangen.
Mit dem sendTo-Block klappt's irgendwie gar nicht. -
@tobidd
Nach langem Probieren würd' ich so was aus der influxDB rausbekommen:


Inhalt der JS Funktion:var ergebnis; sendTo('influxdb.0', 'query', flux, function (result) { if (result.error) { console.error(result.error); } else { // show result // console.log('Rows: ' + JSON.stringify(result)); ergebnis = JSON.stringify(result); } }); await wait(1000); return ergebnis;Vielleicht kannst Du ja damit was anfangen.
Mit dem sendTo-Block klappt's irgendwie gar nicht.@wolfi913 sagte in Daten mit Blockly aus InfluxDB abrufen:
würd' ich so was aus der influxDB rausbekommen:
bitte als Text in code-tags posten
@wolfi913 sagte in Daten mit Blockly aus InfluxDB abrufen:
Mit dem sendTo-Block klappt's irgendwie gar nicht.
wie gesagt kenne ich den nicht.
-
@wolfi913 sagte in Daten mit Blockly aus InfluxDB abrufen:
würd' ich so was aus der influxDB rausbekommen:
bitte als Text in code-tags posten
@wolfi913 sagte in Daten mit Blockly aus InfluxDB abrufen:
Mit dem sendTo-Block klappt's irgendwie gar nicht.
wie gesagt kenne ich den nicht.
{"result":[[{"result":"_result","table":0,"_start":"2024-05-30T10:16:41.25298107Z","_stop":"2024-05-30T11:16:41.25298107Z","_time":"2024-05-30T11:02:48.423Z","_value":74,"_field":"value","_measurement":"hmip.0.devices.3014F711A0000EDD89A1774D.channels.1.humidity","ts":1717066968423}]],"ts":1717067801258,"error":null} -
@tobidd
Nach langem Probieren würd' ich so was aus der influxDB rausbekommen:


Inhalt der JS Funktion:var ergebnis; sendTo('influxdb.0', 'query', flux, function (result) { if (result.error) { console.error(result.error); } else { // show result // console.log('Rows: ' + JSON.stringify(result)); ergebnis = JSON.stringify(result); } }); await wait(1000); return ergebnis;Vielleicht kannst Du ja damit was anfangen.
Mit dem sendTo-Block klappt's irgendwie gar nicht.@wolfi913 falls du es noch brauchst, so bekommt man den "value" raus.

-
@stenmic mal eine Variante um Daten aus influxdb mit Blockly zu bekommen.
https://forum.iobroker.net/topic/56125/blockly-influxdb2-0-flux-abfrage
@spacerx sagte in Daten mit Blockly aus InfluxDB abrufen:
@stenmic mal eine Variante um Daten aus influxdb mit Blockly zu bekommen.
https://forum.iobroker.net/topic/56125/blockly-influxdb2-0-flux-abfrage
Das ist der eingangs verlinkte Thread von @tobidd der ja bei ihm nicht funktioniert hatte.
falls du es noch brauchst, so bekommt man den "value" raus.
Danke. Aber ich hatte es ja nicht gebraucht. Und @tobidd hatte es ja oben schon korrekt in seinem Blockly drinnen wie der value zu extrahieren ist
result.0.0._value. Daher bin ich darauf nicht extra eingegangen. -
@stenmic mal eine Variante um Daten aus influxdb mit Blockly zu bekommen.
https://forum.iobroker.net/topic/56125/blockly-influxdb2-0-flux-abfrage
@spacerx ???
mit meiner Lösung gehts auch
-
nein, erst jetzt und immer wieder nur das:
Error in received multiQuery: TypeError: queriesString.split is not a function@tobidd Ich habe jetzt auch festgestellt, dass das Blockly "sendTo" nicht mehr funktioniert. Scheinbar ist durch ein Update die Query Funktion geändert worden. Blockly generiert jetzt immer ein Query Array, welches bei InfluxDb nicht erlaubt ist. Im Javascript Code erkennt man das am { Zeichen.
Meine bis jetzt einzige Lösung ist das Script als Native Script weiterzuführen.
-
@tobidd Ich habe jetzt auch festgestellt, dass das Blockly "sendTo" nicht mehr funktioniert. Scheinbar ist durch ein Update die Query Funktion geändert worden. Blockly generiert jetzt immer ein Query Array, welches bei InfluxDb nicht erlaubt ist. Im Javascript Code erkennt man das am { Zeichen.
Meine bis jetzt einzige Lösung ist das Script als Native Script weiterzuführen.
-
@kdtcat
Hallo, kannst du mir eventuell ein Beispiel zeigen, wie du das gelöst hast.
Ich hatte jetzt lange keine Lust mehr dem Thema nachzugehen. Jetzt bin ich wieder etwas motivierter.Grüße Tobi
@tobidd sagte in Daten mit Blockly aus InfluxDB abrufen:
@kdtcat
Hallo, kannst du mir eventuell ein Beispiel zeigen, wie du das gelöst hast.
Ich hatte jetzt lange keine Lust mehr dem Thema nachzugehen. Jetzt bin ich wieder etwas motivierter.Grüße Tobi
Hier als Beispiel die beiden ersten Werte meines Scripts:
schedule("*/2 * * * *", async () => { result = !''.length; sendTo('influxdb.0', 'query', 'from(bucket: "solar") |> range(start: -1m) |> filter(fn: (r) => r["_field"] == "Energy.Battery.Charge.Level") |> aggregateWindow(every: 2m, fn: mean)', async (result) => { test1 = (await jsonataExpression(result,'*[0]._value ')); setStateDelayed('0_userdata.0.Enpal.BatteryLevel', Math.round(test1 * 100) / 100, true, parseInt(((0) || '').toString(), 10), false); }); await wait(3000); result = !''.length; sendTo('influxdb.0', 'query', 'from(bucket: "solar") |> range(start: -1m) |> filter(fn: (r) => r["_field"] == "Power.Consumption.Total") |> aggregateWindow(every: 2m, fn: mean)', async (result) => { test2 = (await jsonataExpression(result,'*[0]._value ')); setStateDelayed('0_userdata.0.Enpal.PowerConsumptionTotal', test2, true, parseInt(((0) || '').toString(), 10), false); }); await wait(3000); }); -
@tobidd sagte in Daten mit Blockly aus InfluxDB abrufen:
@kdtcat
Hallo, kannst du mir eventuell ein Beispiel zeigen, wie du das gelöst hast.
Ich hatte jetzt lange keine Lust mehr dem Thema nachzugehen. Jetzt bin ich wieder etwas motivierter.Grüße Tobi
Hier als Beispiel die beiden ersten Werte meines Scripts:
schedule("*/2 * * * *", async () => { result = !''.length; sendTo('influxdb.0', 'query', 'from(bucket: "solar") |> range(start: -1m) |> filter(fn: (r) => r["_field"] == "Energy.Battery.Charge.Level") |> aggregateWindow(every: 2m, fn: mean)', async (result) => { test1 = (await jsonataExpression(result,'*[0]._value ')); setStateDelayed('0_userdata.0.Enpal.BatteryLevel', Math.round(test1 * 100) / 100, true, parseInt(((0) || '').toString(), 10), false); }); await wait(3000); result = !''.length; sendTo('influxdb.0', 'query', 'from(bucket: "solar") |> range(start: -1m) |> filter(fn: (r) => r["_field"] == "Power.Consumption.Total") |> aggregateWindow(every: 2m, fn: mean)', async (result) => { test2 = (await jsonataExpression(result,'*[0]._value ')); setStateDelayed('0_userdata.0.Enpal.PowerConsumptionTotal', test2, true, parseInt(((0) || '').toString(), 10), false); }); await wait(3000); }); -
ich habe das jetzt so gelöst:
var flux, hausverbrauch, bezug; // Beschreibe diese Funktion … async function query_influx(flux) { var ergebnis; sendTo('influxdb.0', 'query', flux, function (result) { if (result.error) { console.error(result.error); } else { //show result //console.log('Rows: ' + JSON.stringify(result)); ergebnis = JSON.stringify(result); } }); await wait(1000); return ergebnis; } on({ id: 'mqtt.0.solaranzeige.sh10rt.hausverbrauch' /* solaranzeige/sh10rt/hausverbrauch */, change: 'any' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; hausverbrauch = await query_influx(['from(bucket: "solaranzeige2")',' |> range(start: today(), stop: now())','|> filter(fn: (r) => r["_measurement"] == "mqtt.0.solaranzeige.sh10rt.hausverbrauch")','|> filter(fn: (r) => r["_field"] == "value")','|> sum()',''].join('')); hausverbrauch = parseFloat(getAttr((() => { try { return JSON.parse(hausverbrauch); } catch (e) { return {}; }})(), 'result.0.0._value')); bezug = await query_influx(['from(bucket: "solaranzeige2")',' |> range(start: today(), stop: now())','|> filter(fn: (r) => r["_measurement"] == "mqtt.0.solaranzeige.sh10rt.bezug")','|> filter(fn: (r) => r["_field"] == "value")','|> sum()',''].join('')); bezug = parseFloat(getAttr((() => { try { return JSON.parse(bezug); } catch (e) { return {}; }})(), 'result.0.0._value')); setState('0_userdata.0.Solar.autarkiegrad_heute' /* autarkiegrad_heute */, ((1 - bezug / hausverbrauch) * 100), true); });Ich hoffe an Hand der Bilder ist klar was wo hin gehört.
Vielleicht hilft es ja jemandem.
Einen Herzlichen Dank an ALLE, die mir Hinweise zur Lösungsfindung gegeben haben.


-
ich habe das jetzt so gelöst:
var flux, hausverbrauch, bezug; // Beschreibe diese Funktion … async function query_influx(flux) { var ergebnis; sendTo('influxdb.0', 'query', flux, function (result) { if (result.error) { console.error(result.error); } else { //show result //console.log('Rows: ' + JSON.stringify(result)); ergebnis = JSON.stringify(result); } }); await wait(1000); return ergebnis; } on({ id: 'mqtt.0.solaranzeige.sh10rt.hausverbrauch' /* solaranzeige/sh10rt/hausverbrauch */, change: 'any' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; hausverbrauch = await query_influx(['from(bucket: "solaranzeige2")',' |> range(start: today(), stop: now())','|> filter(fn: (r) => r["_measurement"] == "mqtt.0.solaranzeige.sh10rt.hausverbrauch")','|> filter(fn: (r) => r["_field"] == "value")','|> sum()',''].join('')); hausverbrauch = parseFloat(getAttr((() => { try { return JSON.parse(hausverbrauch); } catch (e) { return {}; }})(), 'result.0.0._value')); bezug = await query_influx(['from(bucket: "solaranzeige2")',' |> range(start: today(), stop: now())','|> filter(fn: (r) => r["_measurement"] == "mqtt.0.solaranzeige.sh10rt.bezug")','|> filter(fn: (r) => r["_field"] == "value")','|> sum()',''].join('')); bezug = parseFloat(getAttr((() => { try { return JSON.parse(bezug); } catch (e) { return {}; }})(), 'result.0.0._value')); setState('0_userdata.0.Solar.autarkiegrad_heute' /* autarkiegrad_heute */, ((1 - bezug / hausverbrauch) * 100), true); });Ich hoffe an Hand der Bilder ist klar was wo hin gehört.
Vielleicht hilft es ja jemandem.
Einen Herzlichen Dank an ALLE, die mir Hinweise zur Lösungsfindung gegeben haben.


-
@tobiddGute Idee mit der Function. Damit habe ich mein Script auch wieder "Blockly fähig" gemacht.
-
@kdtcat ```
var parm1, parm2, result, BatteryLevel, PowerConsumptionTotal, PowerProductionTotal, EnergyProductionTotalDay, EnergyConsumptionTotalDay, EnergyExternalTotalOutDay, EnergyBatteryChargeDay, EnergyStorageTotalOutDay, StromverbrauchAnteilSolarTag, STromverbrauchAlleTag; // Beschreibe diese Funktion … async function iq(parm1, parm2) { // Beschreibe diese Funktion var ergebnis, fparm, fparm2; fparm = 'from(bucket: "solar") |> range(start: -1m) |> filter(fn: (r) => r["_field"] == ' + parm1 + ') |> aggregateWindow(every: 2m, fn: mean)'; fparm2 = '0_userdata.0.Enpal.' + parm2; sendTo('influxdb.0', 'query', fparm, async (result) => { test0 = (await jsonataExpression(result,'*[0]._value ')); setStateDelayed(fparm2, test0, true, parseInt(((0) || '').toString(), 10), false); }); return ergebnis; } schedule("*/2 * * * *", async () => { result = await iq('"Energy.Battery.Charge.Level"', 'BatteryLevel'); await wait(3000); BatteryLevel = Math.round(getState('0_userdata.0.Enpal.BatteryLevel').val * 100) / 100; setStateDelayed('0_userdata.0.Enpal.BatteryLevel', { val: BatteryLevel, ack: false }, parseInt(((0) || '').toString(), 10), false); result = await iq('"Power.Consumption.Total"', 'PowerConsumptionTotal'); await wait(3000); PowerConsumptionTotal = getState('0_userdata.0.Enpal.PowerConsumptionTotal').val; result = await iq('"Power.Production.Total"', 'PowerProductionTotal'); await wait(3000); PowerProductionTotal = getState('0_userdata.0.Enpal.PowerProductionTotal').val; result = await iq('"Energy.Production.Total.Day"', 'EnergyProductionTotalDay'); await wait(3000); EnergyProductionTotalDay = getState('0_userdata.0.Enpal.EnergyProductionTotalDay').val; result = await iq('"Energy.Consumption.Total.Day"', 'EnergyConsumptionTotalDay'); await wait(3000); EnergyConsumptionTotalDay = getState('0_userdata.0.Enpal.EnergyConsumptionTotalDay').val; result = await iq('"Energy.External.Total.Out.Day"', 'EnergyExternalTotalOutDay'); await wait(3000); EnergyExternalTotalOutDay = getState('0_userdata.0.Enpal.EnergyExternalTotalOutDay').val; result = await iq('"Energy.Battery.Charge.Day"', 'EnergyBatteryChargeDay'); await wait(3000); EnergyBatteryChargeDay = getState('0_userdata.0.Enpal.EnergyBatteryChargeDay').val; result = await iq('"Energy.Storage.Total.Out.Day"', 'EnergyStorageTotalOutDay'); await wait(3000); EnergyStorageTotalOutDay = getState('0_userdata.0.Enpal.EnergyStorageTotalOutDay').val; StromverbrauchAnteilSolarTag = EnergyProductionTotalDay - EnergyExternalTotalOutDay; StromverbrauchAnteilSolarTag = StromverbrauchAnteilSolarTag - EnergyBatteryChargeDay; setStateDelayed('0_userdata.0.Enpal.StromverbrauchAnteilSolarTag', { val: StromverbrauchAnteilSolarTag, ack: false }, parseInt(((0) || '').toString(), 10), false); STromverbrauchAlleTag = StromverbrauchAnteilSolarTag + EnergyStorageTotalOutDay + EnergyConsumptionTotalDay; setStateDelayed('0_userdata.0.Enpal.StromverbrauchAlleTag', { val: STromverbrauchAlleTag, ack: false }, parseInt(((0) || '').toString(), 10), false); console.info((['1: ',BatteryLevel,', 2: ',PowerConsumptionTotal,', 3: ',PowerProductionTotal,', 4: ',EnergyProductionTotalDay,', 5: ',EnergyConsumptionTotalDay,', 6: ',EnergyExternalTotalOutDay,', 7: ',EnergyBatteryChargeDay,', 8: ',EnergyStorageTotalOutDay,', 9: ',StromverbrauchAnteilSolarTag,', 10: ',STromverbrauchAlleTag].join(''))); });
