NEWS
[gelöst] SQL getHistory Abfrage
-
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()); -
@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 -
- 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
-
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@apollon77 said in SQL getHistory Abfrage:
Logge doch einfach mal
console.log(JSON.stringify(result.result[i]))dann sehen wir was wirklich zurückommt und raten nicht rumIn der query oder gethistory ?
-
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@apollon77 sagte in SQL getHistory Abfrage:
val ist was anderes.
val ist der Wert, wir müssen nicht raten, ich habe das schon geprüft

{'ts':1648832706691,'val':2.029} -
@apollon77 sagte in SQL getHistory Abfrage:
val ist was anderes.
val ist der Wert, wir müssen nicht raten, ich habe das schon geprüft

{'ts':1648832706691,'val':2.029}@fastfoot und @apollon77
sendTo('sql.0', 'query', 'SELECT id FROM iobroker.datapoints WHERE name="smartmeter.0.1-0:16_7_0__255.value"', function (result) { if (result.error) { console.error(result.error); } else { var now = new Date(); now.setMinutes(-3); sendTo('sql.0', 'query', 'SELECT AVG(val) AS Wert FROM iobroker.ts_number WHERE ts >= ' + now.getTime() + ' AND id=' + result.result[0].id, function (result) { console.log(JSON.stringify(result.result[0])); }); } });ergibt
21:54:35.208 info javascript.0 (149) Start javascript script.js.Logik.GleitDurchschnitt 21:54:35.226 info javascript.0 (149) script.js.Logik.GleitDurchschnitt: registered 0 subscriptions and 0 schedules 21:54:35.242 info javascript.0 (149) script.js.Logik.GleitDurchschnitt: {"Wert":3.6997549019607843} -
@fastfoot und @apollon77
sendTo('sql.0', 'query', 'SELECT id FROM iobroker.datapoints WHERE name="smartmeter.0.1-0:16_7_0__255.value"', function (result) { if (result.error) { console.error(result.error); } else { var now = new Date(); now.setMinutes(-3); sendTo('sql.0', 'query', 'SELECT AVG(val) AS Wert FROM iobroker.ts_number WHERE ts >= ' + now.getTime() + ' AND id=' + result.result[0].id, function (result) { console.log(JSON.stringify(result.result[0])); }); } });ergibt
21:54:35.208 info javascript.0 (149) Start javascript script.js.Logik.GleitDurchschnitt 21:54:35.226 info javascript.0 (149) script.js.Logik.GleitDurchschnitt: registered 0 subscriptions and 0 schedules 21:54:35.242 info javascript.0 (149) script.js.Logik.GleitDurchschnitt: {"Wert":3.6997549019607843}Wenn mir nun noch einer von euch Beiden bitte sagen könne wie ich die Zahl 3.699 in eine Variable extrahiert bekomme wäre mein Abend gerettet

-
@apollon77 said in SQL getHistory Abfrage:
Logge doch einfach mal
console.log(JSON.stringify(result.result[i]))dann sehen wir was wirklich zurückommt und raten nicht rumIn der query oder gethistory ?
@ostseeskipper probiere mal mit getHistory average statt minmax. Dann kannst du mit:
log(i+' : ' + new Date(result.result[i].ts).toLocaleString() + ' => ' + result.result[i].val);das Ergebnis anschauen22:01:19.335 info javascript.1 (527) script.js.Forum.getHistory: 0 : 1.4.2022, 19:14:39 => 2.0199999999999996 22:01:19.336 info javascript.1 (527) script.js.Forum.getHistory: 1 : 1.4.2022, 20:29:39 => 2.01 22:01:19.337 info javascript.1 (527) script.js.Forum.getHistory: 2 : 1.4.2022, 22:01:19 => 1.9977777777777777 -
Wenn mir nun noch einer von euch Beiden bitte sagen könne wie ich die Zahl 3.699 in eine Variable extrahiert bekomme wäre mein Abend gerettet

@ostseeskipper sagte: wie ich die Zahl 3.699 in eine Variable extrahiert bekomme
let wert = result.result[0].Wert; -
Wenn mir nun noch einer von euch Beiden bitte sagen könne wie ich die Zahl 3.699 in eine Variable extrahiert bekomme wäre mein Abend gerettet

@ostseeskipper sagte in SQL getHistory Abfrage:
Wenn mir nun noch einer von euch Beiden bitte sagen könne wie ich die Zahl 3.699 in eine Variable extrahiert bekomme wäre mein Abend gerettet

mit
let DeineVariable = result.result[0].Wertweist du das zu -
@ostseeskipper sagte: wie ich die Zahl 3.699 in eine Variable extrahiert bekomme
let wert = result.result[0].Wert;Danke Euch erst mal.

@fastfoot ist es mit gethistory performanter als über die letzte von mir gepostete Lösung mit queries und avg ?
fand das now.setMinutes(-3) relativ charmat auch wenn ich es noch nicht wirklich verstehe wie das alles mit den result.result verkapselt ist.Aber ein Auto muss ja auch nur fahren
schönen Abend euch -
Ich stimme aber zu das die Beispiele vllt nicht die besten sind. Ich kann mal schauen das ich das hier gesagt dort einfließen lasse.
Ich bin aber auch ehrlich das mir persönlich Gerade die Zeit fehlt das alles sinnvoll und vollständig durchzuspielen und zu überlegen welche Beispiele in welcher Form aus „User“ Sicht Sinn machen. Da freuen wir uns über konkrete Vorschläge Bzw auf github einem Pull request“ für die readme (ist ganz easy: Stift bei der readme klicken, ändern, Änderung vorschlagen, pull request erstellen)
-
Danke Euch erst mal.

@fastfoot ist es mit gethistory performanter als über die letzte von mir gepostete Lösung mit queries und avg ?
fand das now.setMinutes(-3) relativ charmat auch wenn ich es noch nicht wirklich verstehe wie das alles mit den result.result verkapselt ist.Aber ein Auto muss ja auch nur fahren
schönen Abend euch@ostseeskipper ob da performanter ist kann ich nicht sagen, für deinen gewählten Zeitraum ist das sicher egal. getHistory bietet einiges mehr, so kann man mit step noch einen Parameter mit angeben. Wie das genau funktioniert hat sich mir aber noch nicht erschlossen
Mit deiner Abfrage weisst du jedenfalls sicher was da passiert, das sehe ich erstmal als Vorteil. Wolltest du aber für den Zeitraum eines Jahres das jeweilige Tagesmittel errechnen, dann wäre getHistory einen näheren Blick wert 
-
Ich stimme aber zu das die Beispiele vllt nicht die besten sind. Ich kann mal schauen das ich das hier gesagt dort einfließen lasse.
Ich bin aber auch ehrlich das mir persönlich Gerade die Zeit fehlt das alles sinnvoll und vollständig durchzuspielen und zu überlegen welche Beispiele in welcher Form aus „User“ Sicht Sinn machen. Da freuen wir uns über konkrete Vorschläge Bzw auf github einem Pull request“ für die readme (ist ganz easy: Stift bei der readme klicken, ändern, Änderung vorschlagen, pull request erstellen)
@apollon77 ich schaue mal ob ich da was verschlimmbessern kann. Ist jedenfalls ein guter Tipp mit dem Stift! Dauert aber etwas, an Deine Schlagzahl komme ich in 100 Jahren nicht ran
Muss mich auch erst noch etwas einarbeiten, wäre aber cool dich da etwas 'entlasten' zu können -
@apollon77 ich schaue mal ob ich da was verschlimmbessern kann. Ist jedenfalls ein guter Tipp mit dem Stift! Dauert aber etwas, an Deine Schlagzahl komme ich in 100 Jahren nicht ran
Muss mich auch erst noch etwas einarbeiten, wäre aber cool dich da etwas 'entlasten' zu können -
Danke Euch erst mal.

@fastfoot ist es mit gethistory performanter als über die letzte von mir gepostete Lösung mit queries und avg ?
fand das now.setMinutes(-3) relativ charmat auch wenn ich es noch nicht wirklich verstehe wie das alles mit den result.result verkapselt ist.Aber ein Auto muss ja auch nur fahren
schönen Abend euch@ostseeskipper sagte in SQL getHistory Abfrage:
fand das now.setMinutes(-3) relativ charmat
sieht cool aus, ist aber nicht was Du erwartest. Wenn now z.B. 09:43 ist dann setzt dir dieser Befehl dein now auf 08:57, nicht auf 09:40

Richtig geht es so:now.setMinutes(now.getMinutes() - 3) -
@ostseeskipper sagte in SQL getHistory Abfrage:
fand das now.setMinutes(-3) relativ charmat
sieht cool aus, ist aber nicht was Du erwartest. Wenn now z.B. 09:43 ist dann setzt dir dieser Befehl dein now auf 08:57, nicht auf 09:40

Richtig geht es so:now.setMinutes(now.getMinutes() - 3)@fastfoot said in SQL getHistory Abfrage:
@ostseeskipper sagte in SQL getHistory Abfrage:
fand das now.setMinutes(-3) relativ charmat
sieht cool aus, ist aber nicht was Du erwartest. Wenn now z.B. 09:43 ist dann setzt dir dieser Befehl dein now auf 08:57, nicht auf 09:40

Richtig geht es so:now.setMinutes(now.getMinutes() - 3)Ohh, besten Dank,
Wäre denn das z.B. Beispiel eine Stunde zurück?var now = new Date(); now.setHours(-1); -
@fastfoot said in SQL getHistory Abfrage:
@ostseeskipper sagte in SQL getHistory Abfrage:
fand das now.setMinutes(-3) relativ charmat
sieht cool aus, ist aber nicht was Du erwartest. Wenn now z.B. 09:43 ist dann setzt dir dieser Befehl dein now auf 08:57, nicht auf 09:40

Richtig geht es so:now.setMinutes(now.getMinutes() - 3)Ohh, besten Dank,
Wäre denn das z.B. Beispiel eine Stunde zurück?var now = new Date(); now.setHours(-1);@ostseeskipper Naja nach gleiochem chema wie bei den Stunden:
now.setHours(now.setHours() - 1) -
@fastfoot said in SQL getHistory Abfrage:
@ostseeskipper sagte in SQL getHistory Abfrage:
fand das now.setMinutes(-3) relativ charmat
sieht cool aus, ist aber nicht was Du erwartest. Wenn now z.B. 09:43 ist dann setzt dir dieser Befehl dein now auf 08:57, nicht auf 09:40

Richtig geht es so:now.setMinutes(now.getMinutes() - 3)Ohh, besten Dank,
Wäre denn das z.B. Beispiel eine Stunde zurück?var now = new Date(); now.setHours(-1);@ostseeskipper sagte in SQL getHistory Abfrage:
Wäre denn das z.B. Beispiel eine Stunde zurück?
nein, in meinem Beispiel mit now = 09:43 setzt dir der Befehl die Zeit auf 23:43 des Vortages.
Abhilfe auch hier:now.setHours(now.getHours() - 1), apollon hat da noch einen typo drin.Bis Ende der Woche gibt es aktuelle Beispiele auch mit Erklärungen zu den Optionen, wobei das hier ja JS Grundkenntnisse betrifft und dort dann nicht näher behandelt wird. Ist aber alles kein Problem, dafür gibt es ja hier das Forum
