NEWS
[gelöst] JSON erstellen und filtern
-
Hallo,
wieder mal sitzt das Problem vor dem Bildschirm.
Ich ermittle jeden Tag um 00.01 den Zählerstand meines Discovergy-Zählers und ermittle den Verbrauch des Vortages durch Differenzbildung. Das Ergebnis schreibe ich dann jeden Tag um 00.10 Uhr auf einen Datenpunkt Täglicher Verbrauch. Der wird bei Änderung auch in die SQL-Datenbank (MariaDb) geschrieben. Aus der MariaDb hole ich mir die Werte des täglichen Verbrauchs mittels Blockly wieder zurück.Hier das Blockly:
und hier der Blockly-Export:
<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="/a.frbr+lSz-sv9itJ(m">obj</variable> <variable id="%,uKx.``R8Wb=f]P9h`.">result</variable> </variables> <block type="comment" id="GVW732OFexZ9HP[q]B3," x="-412" y="-262"> <field name="COMMENT">Send query to SQL adapter</field> <next> <block type="sendto_custom" id="84lYloO4o+RvLszPVHZ5"> <mutation xmlns="http://www.w3.org/1999/xhtml" items="" with_statement="true"></mutation> <field name="INSTANCE">sql.0</field> <field name="COMMAND">query</field> <field name="LOG">log</field> <field name="WITH_STATEMENT">TRUE</field> <value name="ARG0"> <shadow type="text" id=")faamoSD,nGPXawY4|(Z"> <field name="TEXT">SELECT Date_Format(FROM_UNIXTIME(Substr(TS,1,10)), '%d.%c.%Y') as Datum ,val Verbrauch FROM iobroker.ts_number where id = '159' and val <> '0' group by val order by Datum</field> </shadow> </value> <statement name="STATEMENT"> <block type="debug" id="Q#UJl]^_g/VHzM*G/a:f"> <field name="Severity">log</field> <value name="TEXT"> <shadow xmlns="http://www.w3.org/1999/xhtml" type="text" id="#!NJS43!0z@}z:6~_,9("> <field name="TEXT">test</field> </shadow> <block type="procedures_callcustomreturn" id="0E2fmQQduf4)-({z(om|"> <mutation name="JSON.stringify"> <arg name="obj"></arg> </mutation> <value name="ARG0"> <block type="variables_get" id=",^2E2eT#598hI^TvABD9"> <field name="VAR" id="%,uKx.``R8Wb=f]P9h`.">result</field> </block> </value> </block> </value> </block> </statement> </block> </next> </block> <block type="procedures_defcustomreturn" id="lm*.n3kQXll8o9X^*m,k" x="-412" y="13"> <mutation statements="false"> <arg name="obj" varid="/a.frbr+lSz-sv9itJ(m"></arg> </mutation> <field name="NAME">JSON.stringify</field> <field name="SCRIPT">cmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaik7</field> <comment pinned="false" h="80" w="160">Describe this function...</comment> </block> </xml>
Als Ergebnis erhalte ich aus diesem Blockly den folgenden Block:
javascript.0 (30863) script.js.Energie.Verbrauch_tabelle: {"error":null,"result":[{"Datum":"07.2.2021","Verbrauch":9.001},{"Datum":"07.2.2021","Verbrauch":10},{"Datum":"07.2.2021","Verbrauch":1},{"Datum":"07.2.2021","Verbrauch":2},{"Datum":"07.2.2021","Verbrauch":4},{"Datum":"10.2.2021","Verbrauch":44.43},{"Datum":"11.2.2021","Verbrauch":12.695},{"Datum":"12.2.2021","Verbrauch":13.905},{"Datum":"13.2.2021","Verbrauch":14.605},{"Datum":"14.2.2021","Verbrauch":14.989},{"Datum":"15.2.2021","Verbrauch":35.61},{"Datum":"16.2.2021","Verbrauch":16.162},{"Datum":"17.2.2021","Verbrauch":12.552},{"Datum":"18.2.2021","Verbrauch":11.776},{"Datum":"19.2.2021","Verbrauch":11.801},{"Datum":"20.2.2021","Verbrauch":15.435},{"Datum":"20.2.2021","Verbrauch":15.635},{"Datum":"20.2.2021","Verbrauch":16.958},{"Datum":"20.2.2021","Verbrauch":15.935},{"Datum":"20.2.2021","Verbrauch":15.735},{"Datum":"20.2.2021","Verbrauch":16.968},{"Datum":"20.2.2021","Verbrauch":15.835},{"Datum":"20.2.2021","Verbrauch":15},{"Datum":"20.2.2021","Verbrauch":15.135},{"Datum":"20.2.2021","Verbrauch":15.235},{"Datum":"20.2.2021","Verbrauch":15.335},{"Datum":"20.2.2021","Verbrauch":15.535},{"Datum":"21.2.2021","Verbrauch":14.467},{"Datum":"22.2.2021","Verbrauch":14.052},{"Datum":"23.2.2021","Verbrauch":12.648}]}
Jetzt möchte mit diesem Ergebnis einen Datenpunkt
aktualisieren. Der DP ist als Objekt angelegt.
Speichere ich den Block für result [ ... ] in diesen Datenpunkt, ist alles schick und ich kann in der VIS mittels json-table die Werte anzeigen.
Es gelingt mir in dem Blockly nicht, diesen Datenpunkt zu aktualisieren.
Kann mich da bitte jemand sehend machen? Vielen Dank. -
@opossum
Etwa so:
(Ich bin mir nicht sicher, ob Du das JSON.stringify benötigst, habe es mal weggelassen) -
Hallo, @ente34 ,
vielen Dank für die Antwort. Das ist es leider nicht. Der Zieldatenpunkt ist als Objekt definiert. Das JSON.stringify liefert mir ja schon im Objekt "result" die Struktur, die besteht aus "error" und "result", wenn ich das korrekt interpretiere.{"error":null,"result":[{"Datum":"07.2.2021","Verbrauch":4},{"Datum":"07.2.2021","Verbrauch":9.001},{"Datum":"07.2.2021","Verbrauch":10},{"Datum":"07.2.202 ... ]}
Ich müsste aus dem Objekt result halt den Ausdruck für result [ ... ] auf das Objekt schreiben. Aber da steige ich zur Zeit leider noch aus.
-
@opossum
Das ist doch dieser Block: -
Hallo, @ente34 ,
ja, das ist auch ok, ich bekomme aber im Log eine Fehlermeldung:
You are assigning a array to the state "0_userdata.0.Verbrauch.Strom.Taeglich_Tabelle" which expects a object. Please fix your code to use a object or change the state type to array
Ich möchte aber den DP nicht ändern, da ich diesen DP in einem JSON-Table-Widget weiter verwurste.
-
@opossum sagte: Der DP ist als Objekt angelegt ... ich kann in der VIS mittels json-table die Werte anzeigen.
json-table erwartet ein JSON, was ein String ist - kein Objekt.
Für JSON.stringify wird keine eigene Funktion benötigt. -
danke für Eure Hilfe. Die Formatierung des Datenpunktes war es. Ich habe den DP nun als Zeichenkette deklariert, dann den Schnipsel von @paul53 eingebaut, jetzt funktioniert es super. Vielen Dank.
Der Vollständigkeit halber, so sieht jetzt das Blockly aus:Hier der Export:
-
Hallo,
ich benötige noch einmal Hilfe. Ich habe jetzt ein json-file, in das ich via o.g. Blockly die täglichen Verbräuche speichere. Dieses File lasse ich mir in meiner Vis mittels json-Widget anzeigen. Ich habe das json etwas erweitert, so dass ich eine Spalte nur mit der Monatsnummer erhalte. Ich möchte nun in der Vis nur die Datensätze anzeigen, die für den laufenden Monat vorhanden sind. Aus der SQL-Datenbank hole ich mir mit folgendem Select die Werte:SELECT Date_Format(FROM_UNIXTIME(Substr(TS,1,10)), '%d.%c.%Y') as Datum ,Date_Format(FROM_UNIXTIME(Substr(TS,1,10)), '%c') as Monat,val Verbrauch FROM iobroker.ts_number where id = '159' and val <> '0' group by val order by Monat Desc, Datum
Das file sieht so aus:
Das Ergebnis in der Vis sieht dann wie folgt aus:Nun möchte ich, dass mir im Monat März nur die Datensätze des laufenden Monats angezeigt werden, zum Beispiel in Abhängigkeit vom Tagesdatum, wo man dann die Monatsnummer vergleichen kann. Eventuell geht ja auch was schon im Select, eventuell über ein Unterselect? Im json würden auch die Datensätze des lfd. Monats reichen. Das file wird täglich um 00:30 Uhr aktualisiert. Wäre schön, wenn Ihr mir da mal behilflich sein könntet, wenn es bei Euch zeitlich passt. Vielen Dank.
Der Ausreisser am 26.02.2021 ist der Tesla, der am Strom genuckelt hat
-
Hallo,
ich mache das jetzt über das SQL-Statement:
SELECT Date_Format(FROM_UNIXTIME(Substr(TS,1,10)), '%d.%c.%Y') as Datum ,Date_Format(FROM_UNIXTIME(Substr(TS,1,10)), '%m') as Monat,val Verbrauch FROM iobroker.ts_number where id = '159' and val <> '0' AND Date_Format(FROM_UNIXTIME(Substr(TS,1,10)), '%m') = (SELECT MONTH(CURRENT_DATE())) group by val order by Monat Desc, Datum
Das klappt jetzt. Im json sind nur noch die Werte des aktuellen Monats.