NEWS
Test Adapter History 2.0.0
-
@apollon77
9 Jahre. Mein Anwendung ist meine Solarnanlage, die jetzt schon 12 Jahre läuft und wo ich in die History DB alle Werte per Script manuell eingetragen habe.
Da habe ich nur einen Wert pro Jahr, bzw. 12 wenn ich die Monatsdarstellung wähle.
Das sollte machbar sein. -
@marty56 sagte in Test Adapter History 2.0.0:
Da habe ich nur einen Wert pro Jahr, bzw. 12 wenn ich die Monatsdarstellung wähle.
Wie meinst Du das?
-
@apollon77 Ich glaube ihm ist nicht klar, dass alle Daten in einem Json (pro Tag) gehalten werden. Also nicht nur der State den er einal am Tag speichert. Wenn die Werte dieses States das einzige sind, was in der Hostiry liegt, dann sollte es tatschlich kein Problem sein.
@Marty56 Wenn da aber auch andere States geloggt werden, dann landen die mit den von Dir angesprochennen Werten zusammen in einer Json-Datei pro Tag. Die werden also auch alle mitgelesen (und gefiltert), um die Auswertung zu machen. Ist halt keine Datenbank. -
@sneak-l8 sagte: zusammen in einer Json-Datei pro Tag.
Bisher war es eine Json-Datei pro Datenpunkt und Tag. Hat sich das geändert?
-
@sneak-l8 sagte in Test Adapter History 2.0.0:
dann landen die mit den von Dir angesprochennen Werten zusammen in einer Json-Datei pro Tag
du hast pro Tag und Datenpunkt ein eigenes json
-
@paul53 Ne hat sich nicht geändert. Ein File pro Datenpunkt pro Tag
-
@sneak-l8 Ich habe das Verzeichnis angeschaut, in der die History ihre Jsons ablegt und bei mir wird nur dann eine Datei angelegt, wenn sich der Datenpunkt ändert.
Das wären in meinem Beispiel bei 10 Jahren, genau 10 Files, die die Jahreswerte speichern und 240 files, für die Monatswerte.
Muss ich woanders schauen?
Ich habe unter /opt/iobroker/history geschaut. IOB läuft unter Linux -
-
@paul53 Danke.
Ich habe gerade bemerkt, dass ich den Ordner nach /opt/iobroker/history konfiguriert habe.Was mich aber zur eigentlich Frage bringt, wie viele Jsons Files werden angelegt.
m.M. Ich habe unter der Option "trotzdem gleiche Werte aufzeichnen (Sekunden)" immer "0" angegeben. Vielleicht liegt es daran, dass bei mir nicht pro Tag ein Json mit dem konstanten Wert abgelegt wird, sondern nur ein Json an dem Tag bzw. der Zeit, wenn es sich geändert hat. -
@marty56 J natürlich. Wenn du wirklich so selten ändernde Daten hast mit den Einstellungen, dann ist deine Aussage korrekt
-
@apollon77
Ich schaffe es übrigens nicht, auch im Expertenmodus, beim History Adapter einen Wert zu ändern.
Es kommt zwar eine Abfrage, in der der Wert geändert werden kann, aber die Werte werden nicht übernommen.
Wäre schön, wenn man das fixen könnte.Außerdem schaffe ich es nicht, per Script in die History DB zu schreiben.
Das Script läuft durch, macht aber nichts.const timestamp = new Date("2021-01-01 00:01:00.000").getTime(); var value = 15 sendTo('history.0', 'store', [ {id: 'javascript.0.strom.Erz_Energie_Jahr', ts: timestamp,val: value} ], result => console.log('stored'));
Wie gesagt, die "Unkorrigierbarkeit" von Daten in der History DB ist für mich ein Issue und es wäre schön, wenn man da etwas machen könnte.
-
@marty56 Zum Editieren. Bitte mal Debug Log aktivieren und Debug log zeigen von so einer editieraktion ... bei mir tat es die Tage
Zum storeState ... ... ... liess nochmal genau die Readme https://github.com/ioBroker/ioBroker.history/tree/master/docs/en#storestate ... store -> storeState
-
@apollon77 Debug gibt keine weitere Ausgaben.
Die Syntax vermute ich nicht korrekt. Leider gibt die Dokumentation nichts dazu her.
-
@appollon
Vielleicht fragst Du Dich, warum will der den ganzen Quatsch.
Mein Use Case.
Ich habe zwei Balkendiagram meiner Solaranlage, die einmal Jahres bzw Monatsverbräuche darstellen sollen.
Jeweils am Monatsende schreibe ich einen Wert in das Monatsdiagramm bzw. Ende des Jahres in das Jahresdiagramm.Was schön wäre, wenn der Wert für den noch nicht abgeschlossenen Zeitraum auch angezeigt würde.
Was ich also machen will, als Beispiel das Jahresdiagramm, jeden Tag für den 31.12. des Jahres einen Wert schreiben. Am nächsten Tag möchte ich den alten Wert für den 31.12. löschen und danach wieder mit dem (erhöhten) Wert neu schreiben.
In der DB ist also immer nur ein Wert pro Jahr und der soll upgedatet werden.Ich hoffe, dass ist verständlich.
PS: was ich auch bemerkt habe, ist, dass die Beispiele in der Dokumentation auch syntaktisch nicht korrekt sind. z.B.
sendTo('sql.0', 'delete', [ {id: 'mbus.0.counter.xxx', state: {ts: 1589458809352}, {id: 'mbus.0.counter.yyy', state: {ts: 1589458809353} ], result => console.log('deleted')); code_text
fehlen wohl die Klammern, also
sendTo('sql.0', 'delete', [ {id: 'mbus.0.counter.xxx', state: {ts: 1589458809352}}, {id: 'mbus.0.counter.yyy', state: {ts: 1589458809353}} ], result => console.log('deleted'));
Ich habe mit verschiedenen Versionen der "store" oder "storeState" Commandos herumgespielt, die funktionieren aber alle nicht.
Was ich letztlich benötigen würde, ist ein Script Beispiel für die history.db
- einen State zu löschen
- einen State zu schreiben
-
Ich habe mir die gewünschte Funktion jetzt zusammengebastelt. Sie funktioniert, ich bin aber nicht sicher, ob ich etwas übersehen habe oder ich mir irgendwelche unerwünschten Probleme damit einfange.
Expertenfeedback wäre sehr wünschenswert.function write_history_db(id,date,value) { const fs = require('fs/promises'); const path = require('path'); var filename = "history." + id + ".json" var timestamp = new Date(date).getTime(); var folder = "/opt/iobroker/history/" + date.substring(0,10).replace("-","").replace("-","") + "/" var data = [ { "val": value, "ts": timestamp, "q": 0, "c": "script.js.common.Energie", "from": "system.adapter.javascript.0", "user": "system.user.admin" } ] var filecontent = JSON.stringify(data) async function isExists(path) { try { await fs.access(path); return true; } catch { return false; } }; async function writeFile(filePath, data) { try { const dirname = path.dirname(filePath); const exist = await isExists(dirname); if (!exist) { await fs.mkdir(dirname, {recursive: true}); } await fs.writeFile(filePath, data, 'utf8'); } catch (err) { throw new Error(err); } } (async () => { await writeFile(folder+filename, filecontent); })(); } write_history_db("javascript.0.strom.Erz_Energie_Jahr", "2022-12-31 12:00:00.000",3100)
-
Also wenn sollten wir die Funktionen fixen und nicht Du anfangen am Adapter vorbei die Files zu editieren
-
@Marty56 Nochmal Frage: geht es denn per admin zu ändern?
-
So GitHub Verison 2.0.0 hat ein neues Feature bekommen (@Diginix) ... Die Retention time kann nun auch Custom in tagen definiert werden.
Bitte checken
-
@marty56 Ja klammern fehlen im beispiel. Ist schon gefixt.
storeState tut ... das machen auch die tests. zeig doch mal deine beispiele von uüdate oder delete (warum eigentloch nicht update?)
-
Das folgende Beispiel funktioniert nicht.
var timestamp = new Date("2021-05-31 23:55:00.000").getTime(); sendTo('history.0', 'storeState', [ {id: 'javascript.0.Test', state: {ts: timestamp, val: 15, ack: true, q: 0}}, ], result => console.log('deleted')); var timestamp = new Date("2021-05-31 23:55:00.000").getTime(); sendTo('history.0', 'update', [ {id: 'javascript.0.Test', state: {ts: timestamp, val: 15, ack: true, q: 0}}, ], result => console.log('deleted'));
Mit Version 2.0 ausprobiert. Alle Varianten oben funktionieren nicht.
Hast Du es wirklich mit dem History Adapter ausprobiert? könnte mir vorstellen, dass mit SQL eher funktioniert.