NEWS
[gelöst] SQL getHistory Abfrage
-
Guten Abend,
ich wollte gern die get Historyfunktion des SQL Adapters nutzen und habe mir das Beispiel aus https://github.com/ioBroker/ioBroker.sql/blob/master/README.md kopiert und meinen Datenpunkt eingetragen.
Allerdings gibt es einen Fehler undefined für Zeile 14
var end = Date.now(); log(new Date()); sendTo('sql.0', 'getHistory', { id: 'smartmeter.0.1-0:1_8_0__100.value', options: { start: end - 60000, end: end, aggregate: 'minmax' // or 'none' to get raw values } }, function (result) { for (var i = 0; i < result.result.length; i++) { console.log(i); console.log(result.result[i].id); console.log(new Date(result.result[i].ts).toISOString()); //console.log(result.result[i].id + ' hhh ' + new Date(result.result[i].ts).toISOString()); } });
Was mache ich falsch?
bekomme folgende Logausgabe20:06:43.678 info javascript.0 (27918) Stop script script.js.Logik.GleitDurchschnitt 20:06:43.679 info javascript.1 (29175) Stop script script.js.Logik.GleitDurchschnitt 20:06:43.684 info javascript.0 (27918) Start javascript script.js.Logik.GleitDurchschnitt 20:06:43.705 info javascript.0 (27918) script.js.Logik.GleitDurchschnitt: Wed Mar 30 2022 20:06:43 GMT+0200 (Mitteleuropäische Sommerzeit) 20:06:43.706 info javascript.0 (27918) script.js.Logik.GleitDurchschnitt: registered 0 subscriptions and 0 schedules 20:06:43.727 info javascript.0 (27918) script.js.Logik.GleitDurchschnitt: 0 20:06:43.727 info javascript.0 (27918) script.js.Logik.GleitDurchschnitt: undefined 20:06:43.727 info javascript.0 (27918) script.js.Logik.GleitDurchschnitt: 2022-03-30T18:05:43.705Z 20:06:43.728 info javascript.0 (27918) script.js.Logik.GleitDurchschnitt: 1 20:06:43.728 info javascript.0 (27918) script.js.Logik.GleitDurchschnitt: undefined 20:06:43.728 info javascript.0 (27918) script.js.Logik.GleitDurchschnitt: 2022-03-30T18:05:57.342Z 20:06:43.728 info javascript.0 (27918) script.js.Logik.GleitDurchschnitt: 2 20:06:43.728 info javascript.0 (27918) script.js.Logik.GleitDurchschnitt: undefined 20:06:43.728 info javascript.0 (27918) script.js.Logik.GleitDurchschnitt: 2022-03-30T18:06:12.344Z 20:06:43.728 info javascript.0 (27918) script.js.Logik.GleitDurchschnitt: 3 20:06:43.728 info javascript.0 (27918) script.js.Logik.GleitDurchschnitt: undefined 20:06:43.728 info javascript.0 (27918) script.js.Logik.GleitDurchschnitt: 2022-03-30T18:06:27.344Z 20:06:43.728 info javascript.0 (27918) script.js.Logik.GleitDurchschnitt: 4 20:06:43.728 info javascript.0 (27918) script.js.Logik.GleitDurchschnitt: undefined 20:06:43.729 info javascript.0 (27918) script.js.Logik.GleitDurchschnitt: 2022-03-30T18:06:42.345Z
Und BTW: warum steht an einigen Logzeilen am Ende eine Uhrzeit die 2Std abweicht?
-
@ostseeskipper sagte: warum steht an einigen Logzeilen am Ende eine Uhrzeit die 2Std abweicht?
Das ist UTC (sieht man am "Z" hinten).
-
@paul53 Danke,
das ist aber unschön da ich ja die Einträge der letzten 10 Minuten brauche und das mit Date GMT+0200 nicht passt. Oder macht der History das allein?
Daher vielleicht undefined oder warum liefert mir Zeile 14 :console.log(result.result[i].id);
??
-
@ostseeskipper sagte: Daher vielleicht undefined oder warum liefert mir Zeile 14
Nein. Enthält result.result[i] das Attribut "id"?
@ostseeskipper sagte in SQL getHistory Abfrage:
Oder macht der History das allein?
Ja.
-
@paul53 said in SQL getHistory Abfrage:
@ostseeskipper sagte: Daher vielleicht undefined oder warum liefert mir Zeile 14
Nein. Enthält result.result[i] das Attribut "id"?
Der Datenpunkt den ich auslsen möchte (id?) ist in zeile 5 definiert, der Rest war nur Copy Paste
Daher bin ich irritiert das ein Beispiel aus der Adapterbeschreibung so nicht funktioniert.
-
@apollon77 könntest du mir eventuell auf den richtigen weg helfen?
-
Ich denke das das Example falsch ist.
mach mal in die options von dem call ein `addIr: true´ dazu ... ist Sie dann da? Wenn ja muss ich das example fixen.
-
@apollon77 said in SQL getHistory Abfrage:
`addIr: true´
var end = Date.now(); log(new Date()); sendTo('sql.0', 'getHistory', { id: 'smartmeter.0.1-0:16_7_0__255.value', options: { addIr: true, start: end - 60000, end: end, aggregate: 'minmax' // or 'none' to get raw values } }, function (result) { for (var i = 0; i < result.result.length; i++) { console.log(i); console.log(result.result[i].id); console.log(new Date(result.result[i].ts).toISOString()); //console.log(result.result[i].id + ' ' + new Date(result.result[i].ts).toISOString()); } });
Das ändert leider nichts.
20:28:33.439 info javascript.0 (149) Stop script script.js.Logik.GleitDurchschnitt 20:28:33.439 info javascript.1 (16606) Stop script script.js.Logik.GleitDurchschnitt 20:28:33.442 info javascript.0 (149) Start javascript script.js.Logik.GleitDurchschnitt 20:28:33.447 info javascript.0 (149) script.js.Logik.GleitDurchschnitt: Thu Mar 31 2022 20:28:33 GMT+0200 (Mitteleuropäische Sommerzeit) 20:28:33.448 info javascript.0 (149) script.js.Logik.GleitDurchschnitt: registered 0 subscriptions and 0 schedules 20:28:33.458 info javascript.0 (149) script.js.Logik.GleitDurchschnitt: 0 20:28:33.458 info javascript.0 (149) script.js.Logik.GleitDurchschnitt: undefined 20:28:33.458 info javascript.0 (149) script.js.Logik.GleitDurchschnitt: 2022-03-31T18:27:33.447Z 20:28:33.459 info javascript.0 (149) script.js.Logik.GleitDurchschnitt: 1 20:28:33.459 info javascript.0 (149) script.js.Logik.GleitDurchschnitt: undefined 20:28:33.459 info javascript.0 (149) script.js.Logik.GleitDurchschnitt: 2022-03-31T18:27:37.042Z
Was bewirkt diese Option, finde auch keine weitere Doku dazu.
-
@apollon77
jetzt habe ich das Beispiel "copy paste" aus Github probiertsendTo('sql.0', 'query', 'SELECT id FROM datapoints WHERE name="system.adapter.admin.0.memRss"', function (result) { if (result.error) { console.error(result.error); } else { // show result console.log('Rows: ' + JSON.stringify(result.result)); var now = new Date(); now.setHours(-1); sendTo('sql.0', 'query', 'SELECT * FROM ts_number WHERE ts >= ' + now.getTime() + ' AND id=' + result.result[0].id, function (result) { console.log('Rows: ' + JSON.stringify(result.result)); }); } });
Das sagt mir
21:07:56.462 info javascript.0 (149) script.js.Logik.GleitDurchschnitt: registered 0 subscriptions and 0 schedules 21:07:56.469 error javascript.0 (149) script.js.Logik.GleitDurchschnitt: Error: ER_NO_DB_ERROR: No database selected
-
sorry hatte ein Type drin: addId: true ...
-
wenn die Beispiele schon nicht funktionieren was kann soll man dann tun?
Der SQL Adapter zeichnet Datenpunkte wie gewünscht auf und stellt die Infos auch bereit, also muss er doch eine Datenbank haben.
Könnt Ihr bitte euer Beispiel fixen damit man das nutzen und daran lernen kann.
lieben Dank -
auch mit addId: true ... gibt es undefined
-
@ostseeskipper bitte ganz locker bleiben. Was denkst du was wir in dieser Konversation gerade tun?! Du hast auf ein Problem hingewiesen und ich versuche zu helfen das wir die Beispiele fixen können und ich hab noch nicht mal um ein github issue gebeten.
Ich nehme also jetzt mit das es auch mit addId nicht geht. Dann muss ich wohl mal genauer schauen.
-
@apollon77
ich bleib locker und hab gesucht
hab den Fehler gefunden und auf Github was geschriebenedit: Sorry wenn es zu emotional rüber kam, Ihr macht schon tolle arbeit
-
@ostseeskipper Hi,
ok, aber das was Du jetzt af GitHub hast ist was anderes ... oder ist es quasi kombiniert?
Weil "query" ist was anderes als "getHistory"
-
- Bei query fehlt die Angabe der Datenbank vor den Tabellennamen, steht auch so im Readme. Also
SELECT id FROM iobroker.datapoints....
- Bei getHistory wird id nicht mit zurück geliefert, allerdings würde ich mich fragen wozu, denn die Id ist ja Bestandteil der Abfrage. Es werden nur ts und val geliefert.
- addId hat tatsächlich keinen Effekt, habe es im source auch nur einmal gefunden, genutzt scheint es nicht zu werden.
- Bei query fehlt die Angabe der Datenbank vor den Tabellennamen, steht auch so im Readme. Also
-
Es ist kombiniert, da ja query und gethistory BuildIn Funktionen sind
Da ich mit gethistory nicht weitergekommen bin hatte ich query versucht und auch da fehler bekommen
Query sagte mir das die Datenbank nicht angegeben ist.
also die Datenbank im ersten sendto für die id's hinzugefügt,dann ging es weiter, aber nun kam wieder diese 'undefined' Fehlermeldung wie aus der gethistory funktion
dann habe ich im 2ten sendto der 'query' funktion zum holen der values auch die Datenbank hinzugefügt.
Wenn es in der internen gethistory Funktion auch so abläuft nur halt intern im programmcode, vermute ich, das da der Datenbankname nicht sauber aus den Adaptereinstellungen ermittelt wird oder in die integrierten BuildIn-Funktionen wie gethistory übergeben werden.
-
@ostseeskipper sagte in SQL getHistory Abfrage:
Wenn es in der internen gethistory Funktion auch so abläuft nur halt intern im programmcode, vermute ich, das da der Datenbankname nicht sauber aus den Adaptereinstellungen ermittelt wird oder in die integrierten BuildIn-Funktionen wie gethistory übergeben werden.
Schmarrn. Deine Abfrage funktionierte doch für das Datum, id ist einfach nicht im Resultset vorhanden. Weshalb erwartest du das überhaupt? logge mal val statt id
console.log(result.result[i].id); console.log(new Date(result.result[i].ts).toISOString());
-
@fastfoot
ich hatte erst mal nur erwartet das das Beispiel in der readme funktioniert,console.log(result.result[i].id + ' ' + new Date(result.result[i].ts).toISOString());
für jemanden der nicht aus der JS Sprache kommt und lernen will etwas frustriend.
Auch im anderen Beispiel zu queries ist die Datenbank im Beispielscript nicht enthalten, aber ja du hast Recht es steht ein paar zeilen drunter.
Was ich möchte, ist von einem Datenpunkt den gleitenden Durchschnitt der letzten x Minuten in eine Variable bzw. einen Datenpunkt schreiben.
.ts muss ich vermutlich durch .val ersetzen um den Wert zu bekommenconsole.log(new Date(result.result[i].ts).toISOString());
-
Naja, schau mal hier https://github.com/ioBroker/ioBroker.sql#structure-of-the-dbs ... da steht elche Tabelle für welchen DB Typ wie heisst ... Ja ich kann gern in der Doku darauf hinweisen das das Beispiel zB für ne PostGres bzw sqlite ist und ggf andere Tabellennamen genutzt werden müssen.
.ts muss ich vermutlich durch .val ersetzen um den Wert zu bekommen
ts ist der Timestamp ... und val ist was anderes.
Logge doch einfach mal
console.log(JSON.stringify(result.result[i]))
dann sehen wir was wirklich zurückommt und raten nicht rum