NEWS
[gelöst] Integral in Query bilden und Result verarbeiten?
-
Hallo
ich baue derzeit an einer influxDB Abfrage um damit Datenpunkte zu beschreiben. Hier als ersten Versuch ein Integral über einen Leistungswert (Watt) um daraus die elektr. Arbeit (kwh) zu ermitteln.
Das Query lautet:SELECT integral("value") /3600000 FROM "shelly.0.SHBDUO-1#D0CE26#1.lights.Power" WHERE time >='2020-11-20T00:00:00Z' AND time<'2020-11-21T22:35:50Z'
Grob erscheint mir die Funktion des Blocklys für eine Abfrage für den Zeitbereich Gestern 0h bis Jetzt zu funktionieren.
Zu dieser Aussage komme ich, da die Query Abfrage über einen GUI-Client mir folgendes Ergebnis liefert:
Der Debug Eintrag im Log liefert:
javascript.0 2020-11-21 23:51:00.080 info (1155) script.js.Testen.InfluxTest: {"result":[[{"integral":44718.38777000003,"ts":0}]],"ts":1605999060072,"error":null}
Der Timestamp passt zum Client Ergebnis für den 1.1.1970 (UnixTimeStamp) aber mir fällt nichts ein, warum und wie das Ergebnis des Integrals formatiert ist.
Habt ihr eine Idee?
Client: 0,0124217743805556 kwh
Blockly: 44718.38777000003 ???Vielen Dank!
-
mit frischen Augen sieht man mehr......
Im Text des Blocklys zur Abfrage fehlt die Umrechnung von Ws auf kwh also /3600000
jetzt funktioniert es
Nun geht es an das Zerlegen der Ausgabe um das Ergebnis des Intergrals als Zahl/Datenpunkt zu haben.
Leider verzweifel ich gerade daran diese JSON Funktion Stringify mit Blockly Text Funktionen zu zerlegen.
Egal welches "grüne Text Blockly" ich verwende, es gibt für JSON.stringify einen error im Log.
Diese Funktion habe ich mir auch aus der Dokumentation kopiert und mehr als dass es eine Umwandlung zu Text bedeutet /bedeuten kann, ist mir nicht bewusst. Denk hier liegt mein Problem...
Habt Ihr einen Tip wie ich das (0.012931285780555562) in einen Datenpunkt "Zahl" auswerten kann?
2020-11-22 12:33:30.082 - info: javascript.0 (30275) script.js.Testen.InfluxTest: {"result":[[{"integral":0.012931285780555562,"ts":0}]],"ts":1606044810076,"error":null}
Thx!
-
Soooo.... lange probiert und falls es jemand auch versucht hier wie ich es jetzt gelöst habe.
Also zuerst die Antwort des Query aus der Datenbank nicht in den Debug geschrieben, sondern mal in einen String Datenpunkt. Dort herausgefunden, dass es wirklich so zurück kommt:
{"result":[[{"integral":0.011766770013888896,"ts":0}]],"ts":1606062090132,"error":null}
Also nun daran gemacht diesen String in eine Liste aus Text mit Trennzeichen ":" zu zerlegen und das 3te Element wieder in eine Liste aus Text geschrieben. Diesmal mit dem Trennzeichen "," und das 1. Element genommen.
Bleibt der String aus Zahlen 0.011766770013888896.
Diesen noch nach Zahl konvertiert und in einen Datenpunkt vom Typ Zahl geschrieben.Somit klappt es. Mit einer definierbaren Zeitspanne z.B. heute eine Datenbankabfrage auf influxdB machen und in einem das Integral der gewählten Datenpunkte bilden lassen. Das Ergebnis wiederum in einen Datenpunkt schreiben.
-
@Pete0815 Du benötigst keine extra JS-Funktion. Dein Ergebnis ist bereits entweder ein Objekt oder ein JSON(ich kenne Influx-DB nicht). Aber egal welches es ist, Blockly erledigt das bereits.
Hier mal ein auf deine Daten zugeschnittenes Beispiel, die erste Zeile simuliert lediglich deine Abfrage, ab dort kannst du es einsetzen. Ist übersichtlicher und universeller
-
@fastfoot vielen Dank. Das sieht übersichtlicher aus und die Nutzung von "Attribut" im Blockly kenne ich noch nicht. Vereinfacht es aber erheblich.
Ist es Absicht, dass Du zweimal Daten setzt? Liegt das an den 2 eckigen Klammern im result?
Deine Info bzgl. JS-Funktion verstehe ich noch nicht, da ich Objekt oder JSON erst auch noch (grob) verstehen muß. Bleibt spannend, macht aber Spaß.
Vielen Dank und Grüße!