NEWS
SQL-Adapter: Mittelwerte schon beim Speichern?
-
Hallo,
wenn ich das richtig sehe, kann ich problemlos konfigurieren, wie oft der SQL-Adapter (oder auch History) Werte speichern soll. Das ist ja auch sehr sinnvoll, um die Speichermengen in einem sinnvollen Rahmen zu halten.
Das bedeutet aber, dass ggfs. einfach der aktuelle Wert zum nächsten zulässigen Zeitpunkt gespeichert wird.
In manchen Fällen wäre es aber hilfreicher, hier den Mittelwert des gesamten Zeitfensters seit dem letzten Wert zu speichern. Damit könnte man dann hinterher z.B. bei einer Leistungsmessung auch eine sinnvolle Gesamtenergiemenge eines Zeitintervalls ermitteln, ohne Peaks zu ignorieren, die zufälligerweise zwischen den gespeicherten Werten auftraten.
Im SQL-Adapter scheint es hierfür nichts zu geben.
Gibt es hierfür schon eine "Standard-Lösung", z.B. in Form eines Scriptes oder speziellen Adapters?
Ich habe eine vage Vorstellung, wie ich sowas in einem Script umsetzen würde, möchte das Rad aber ungern neu erfinden, wenn das schon hundertmal von kompetenteren Leuten gemacht wurde
Vielen Dank für sachdienliche Hinweise!
Rico
-
Hi,
aktuell gibt es soetwas nicht und ich bin mir auch nicht sicher ob das sinnvoll ist.
Auf der einen Seite ist "average" eigentlich nicht sehr sinnvoll wenn man wissen will was in einem Zeitraum los war. Da wären "percentile" deutlich besser (https://www.dynatrace.com/blog/why-aver … are-great/). Aber da scheiden sich die Geister.
Auf der anderen Seite muss die "Durchschnittsfunktion" ja durchaus auch die Zeiträume zwischen den Werten berücksichtigen. Das ist nicht so wirklich einfach.
Am Ende ist das Best practice denke ich das man den Adapter so konfiguriert das die Datenmenge für seine Anwendungsfälle die hinreichende Analyse/Darstellungsgenauigkeit liefert. ALso über "Gleiche Werte Ja/Nein" und ggf "Minimale Werte-Abweichung" (die ich z.B. gar nicht nutze).
Wenn man was anderes braucht sind das Skripte.
Wie würdest Du es denn umsetzen?
-
In meinem Anwendungsfall geht es um Leistungswerte. Wenn ich da einen arithmetischen Mittelwert über einen Zeitraum habe, kann ich durch eine Multiplikation mit dieser Zeit den korrekten Energie-Wert berechnen (aus W werden dann z.B. kWh).
Damit kann ich letztlich über die Zeit aufsummieren/integrieren und so etwas wie Leistungs-Zählerwerte berechnen.
Für statistische Auswertungen ist der Median oft tatsächlich besser geeignet, weil er Ausreißer eliminiert.
Letztlich hängt es immer von der konkreten Fragestellung ab, was hilfreicher ist. Für meine Anwendung möchte ich die Ausreißer berücksichtigt wissen.
Ich habe mir auch schon überlegt, ob es vielleicht bei manchen Größen sinnvoll wäre, jeweils Min/Max/Mean (und vielleicht auch Median) in separaten Kanälen aufzuzeichnen.
Bei meinen Leistungsdaten ist mir (insbes. beim Hausverbrauch) aufgefallen, dass die sekündlichen Werte teils sehr starke Schwankungen haben, d.h. von einer Sekunde zur nächsten gibt es erhebliche Sprünge in beide Richtungen. Offenbar ziehen mache Geräte sehr sprunghaft aber periodisch schwankende Leistungen.
Wenn ich hier nur einen der Messwerte in einem Zeitintervall verwende, ist es vom Zufall abhängig, ob es gerade einen Berg oder ein Tal erwischt. Wenn Speichertakt und Verbrauchsfrequenz zufällig Vielfache voneinander sind, könnte es sogar dazu kommen, dass ich auch über längere Zeiträume hinweg immer wieder einen besonders hohen oder besonders niedrigen Wert erwische und so die Statistik verfälsche.
Wenn ich stattdessen den Mittelwert aller Messwerte des Intervalls verwende, kommt das Ergebnis der Realität wesentlich näher.
Ordentlich implementiert müsste man - wie Du schon angedeutet hast - auch die tatsächlichen Zeitstempel der Messwerte berücksichtigen, das sollte aber vom Algorithmus nicht allzu schwierig sein.
Ich würde einfach immer eine Zeit lang alle Messwerte und Zeiten aufaddieren und nach Erreichen / Überschreiten der gewünschten Gesamtzeit durch die tatsächliche Gesamtzeit teilen.
Dann die Variablen wieder auf 0 setzen und auf zur nächsten Runde. Das sollte auch noch sinnvolle Werte liefern, wenn zwischendrin mal Werte fehlen.
Ganz ordentlich müsste man dem Mittelwert dann aber auch den mittleren Zeitstempel des Intervalls geben. Ich hoffe es gibt eine passende Funktion, um das dem SQL-Adapter nachträglich zu verfüttern.
Das könnte man natürlich noch beliebig komplizierter machen - z.B. indem man sich immer ein Array aller Einzelwerte und Zeiten des betrachteten Intervalls merkt. Damit könnte man dann am Ende jedes Intervalls beliebige statistische Kenngrößen berechnen, z.B. den Median.
Mal schaun, wann ich Zeit finde, was passendes zu scripten… Mein Hauptproblem dürfte weniger der Algorithmus an sich sein, als die Tatsache, dass ich die ganze ioBroker-Infrastruktur erst langsam kennenlernen musss.
-
Ich beschäftige mich auch gerade mit verbrauch und so.
Meine Idee ist es wirklich per DB zu machen. Also im ersten Schritt so viel speichern wie nur geht. Dann kann man über die DB und DB-Funktionen runteraggregieren. Bzw aktuell ist mir das sogar egal weil der Platz da ist
So kann man in intervallen die DB querien, dort die Arbeit der Durchschnittsbildung und so machen lassen, und dann einen Aggregierten Wert (z.B. pro Minute, pro 10 Minuten oder so) speichern für die Weitere Lanzeitverwendung.
Ich experimentiere gerade mit der "INTEGRAL" Funktion der InfluxDB … die sollte an sich das lösen aus vielen "Watt"-Werten einen kWh-Wert zu machen ... mal schauen