NEWS
Daten mit Blockly aus InfluxDB abrufen
-
@tobidd sagte in Daten mit Blockly aus InfluxDB abrufen:
Im Protokoll vom iobrocker steht folgendes drin:
@homoran sagte in Daten mit Blockly aus InfluxDB abrufen:
Warum so geizig mit dem gezeigten. Nur Schnipsel ohne Zusammenhang helfen nicht wirklich.
und jetzt noch was Tröpfchenweise
und Nein, ich kenne mich mit influx nicht aus
-
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? -
nein, erst jetzt und immer wieder nur das:
Error in received multiQuery: TypeError: queriesString.split is not a function
-
@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.
-
{"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}
-
@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. -
@spacerx ???
mit meiner Lösung gehts auch -
@stenmic ja klar. Viele Wege führen nach Rom.
-
@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); });
-
@kdtcat
siehe nächster Post -
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.