NEWS
Hisotry auswerten und aufbereiten
-
Hallo Leute,
hat jemand von euch eine Idee, wie ich am simpelsten die Daten des History-Adapters auslesen und verarbeiten kann?
Der History Adapter zeichnet fleißig die Temperaturen meiner HDDs auf:
Diese werden unter /opt/iobroker/history/DATUM als. json gespeichert
Habe in einem anderen Eintrag dieses Forums bereits einen Scriptschnipsel gefunden. Vielleicht kann man den dazu verwenden (siehe unten)
Mein ziel wäre es, pro Datenpunkt den durchschnitt zu berechnen.
Dazu müsste ich quasi "nur" eine bestimmte Anzahl der unterschiedlichen "val" Einträge der JSON-Datei nehmen, addieren und durch die gleiche Anzahl teilen.Leider habe ich keine Ahnung wie ich das angehen soll und leider auch nichts vergleichbares gefunden.
Bitte steinigt mich nicht, falls ich doch ein Foreneintrag übersehen habe!DANKE und Grüße
TomilyAchtung, geklaut. NICHT von mir
#copyrighthoffentlichnichtverletzt
// History Daten einlesen var fs = require('fs'); var heute = formatDate(new Date(),"YYYY") + formatDate(new Date(),"MM") + formatDate(new Date(),"DD"); var id = "history.synology.0.DiskStationManager.hdd_info.laufwerk_1.temperature"; var fn = "/opt/iobroker/history/" + heute + "/history." + id + ".json"; var buffer = JSON.parse(fs.readFileSync(fn)); // array of objects var len = buffer.length; var lastval = buffer[len - 1].val; log(len + " " + lastval);
-
@tomily sagte:
Daten des History-Adapters auslesen und verarbeiten kann?
@tomily sagte in Hisotry auswerten und aufbereiten:
Mein ziel wäre es, pro Datenpunkt den durchschnitt zu berechnen.
Dazu sind die History-Daten wenig geeignet, da die Werte in sehr unterschiedlichen Zeitabständen aufgezeichnet werden.
Man kann natürlich auch die Werte über die Zeit integrieren und dann durch die Gesamtzeit dividieren. -
Danke für die schnelle Antwort.
Darauf bin ich schon gestoßen....vielleicht sollte ich die Finger davon lassen, wenn ich zu wenig Ahnung vom Scripten habeHat zufällig jemand schonmal soetwas gemacht, bei dem ich die Anfänge es abschauen kann?
Mich interessiert im Prinzip nur jeweils die Zeile "val" und der dahinter zugehörige Wert.
Inhalt der Json-DAtei:[ { "val": 31, "ack": 1, "ts": 1605569925521, "q": 0, "from": "system.adapter.synology.0", "user": "system.user.admin" }, { "val": 32, "ack": 1, "ts": 1605571704871, "q": 0, "from": "system.adapter.synology.0", "user": "system.user.admin" }, { "val": 31, "ack": 1, "ts": 1605574513277, "q": 0, "from": "system.adapter.synology.0", "user": "system.user.admin" }, { "val": 30, "ack": 1, "ts": 1605575480922, "q": 0, "from": "system.adapter.synology.0", "user": "system.user.admin" }, { "val": 30, "ack": 1, "ts": 1605598853205, "q": 0, "from": "system.adapter.history.0", "user": "system.user.admin" }, { "val": null, "ts": 1605598853206, "lc": 1605598853206, "q": 64, "from": "system.adapter.history.0" }, { "val": null, "ts": 1605599011287, "ack": 1, "q": 64, "from": "system.adapter.history.0" }, { "val": 30, "ack": 1, "ts": 1605599011287, "q": 0, "from": "system.adapter.history.0", "user": "system.user.admin" }, { "val": 30, "ack": 1, "ts": 1605599180650, "q": 0, "from": "system.adapter.synology.0", "user": "system.user.admin" }, { "val": 31, "ack": 1, "ts": 1605636192964, "q": 0, "from": "system.adapter.synology.0", "user": "system.user.admin" }, { "val": 30, "ack": 1, "ts": 1605636797724, "q": 0, "from": "system.adapter.synology.0", "user": "system.user.admin" }, { "val": 29, "ack": 1, "ts": 1605644054896, "q": 0, "from": "system.adapter.synology.0", "user": "system.user.admin" }, { "val": 30, "ack": 1, "ts": 1605646473967, "q": 0, "from": "system.adapter.synology.0", "user": "system.user.admin" } ]
-
@tomily
Hier noch ein kleiner Nachtrag. Mit diesen Zeilen, kann ich wenigstens schonmal die Werte in das Log bringen:var end = Date.now(); sendTo('history.0', 'getHistory', { id: 'synology.0.DiskStationManager.hdd_info.laufwerk_1.temperature', options: { start: end - 3600000, end: end, aggregate: 'onchange' } }, function (result) { for (var i = 0; i < result.result.length; i++) { console.log(result.result[i].val + ' ' + new Date(result.result[i].ts).toISOString()); } }); Ergebnis ![b6e0b651-bc01-4e51-8866-e6ca963074f8-grafik.png](/assets/uploads/files/1605709192483-b6e0b651-bc01-4e51-8866-e6ca963074f8-grafik.png)
Bin ich da auf der richtigen Spur?
-
Hallo Leute, sorry für das halbe Selstgespräch. Wollte meine letzte 2 Antworten löschen, darf ich aber nicht
Konnte durch ein weiteres Beispielscript fast ans Ziel kommen. Hier mein aktueller Zwischenstand:var summe = 0; var counter = 0; var end = Date.now(); sendTo('history.0', 'getHistory', { id: 'synology.0.DiskStationManager.hdd_info.laufwerk_2.temperature', options: { start: end - 7200000, end: end, aggregate: 'onchange' } }, function (result) { for (var i = 0; i < result.result.length; i++) { console.log(result.result[i].val + ' ' + new Date(result.result[i].ts).toISOString()); //console.log(result.result[i].val); (summe = summe + result.result[i].val); (counter = counter + 1) } //Zusammenfassung ausgeben console.log("Summe = " + summe) console.log("Anzahl = " + counter) console.log("Durchschnitt = " + (summe / counter)) });
Ergebnis:
-
@tomily
Die Variable counter ist unnötig, denn die Anzahl steht schon in result.result.length. -
@paul53 Mercie für den Hinweis. Das baue ich direkt um.
Hast du mir evlt. noch nen Tipp, wie ich es hinbekomme, dass das Script ausomatisch los läuft?
Vermutlich ist es am Sinnvollsten, das bei einer Änderung der ID zu tun? Oder jede volle Stunde.
LG
-