Problem mit averageSince

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
Raptor
Beiträge: 84
Registriert: 26. Sep 2018 16:46

Problem mit averageSince

Beitrag von Raptor »

Hallo Community,

ich habe seit heute ein Problem mit der Funktion averageSince und habe daher ein paar Verständnisfragen.
Und zwar geht es darum, dass ich von Waschmaschine & Trockner den Stromverbrauch messe um eine Benachrichtigung bei Fertigstellung verschicken zu können. Da die Geräte in ihrer Leistungsaufnahme aber während dem Betrieb stark schwanken, konnte ich keine Grenzwerte bestimmen, sondern musste mit averageSince den Durchschnittsverbrauch messen. Das hat bisher auch immer gut funktioniert.
Seit heute bekomme ich dabei aber regelmäßig NULL als Ergebnis und die ganze Regel funktioniert dadurch nicht mehr.
Ich habe vor einiger Zeit influxDB auf meiner NAS aufgesetzt und influx als Default Persistence Service eingestellt (openhab läuft auf einem Raspberry Pi). Kann es sein, dass openhab damit nun plötzlich nicht mehr klar kommt? Wenn ich nämlich auf rrd4j zurück wechsel, funktioniert es wieder. Allerdings funktioniert es auch, wenn ich in der rrd4j Konfiguration den entsprechenden Wert, von dem der Durchschnitt berechnet wird, gar nicht eintrage. Also es gibt keine Strategie für diesen Wert und trotzdem klappt die Average Berechnung.

Kann mir jemand verraten, mit welchen Werten der average berechnet wird? Speichert die openhab zusätzlich oder ist dafür eine Persistenz notwendig? Und falls ja, klappt das nur mit rrd4j und nicht mit influxDB?

Besten Dank und viele Grüße!
openHABian PI mit RaZberry 2 Modul für Z-Wave

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Problem mit averageSince

Beitrag von udo1toni »

averageSince greift auf die Daten der Persistence zurück.
Das wirft in Deinem Fall gleich mehrere Fragen auf:
  1. Warum persistiert rrd4j ohne dass Du eine Strategie gesetzt hast?
  2. Warum werden NULL-Werte von influxDB persistiert?
Beide Fragen lassen sich nicht ohne genaue Kenntnis Deiner Installation beantworten :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Raptor
Beiträge: 84
Registriert: 26. Sep 2018 16:46

Re: Problem mit averageSince

Beitrag von Raptor »

udo1toni hat geschrieben: 19. Dez 2018 22:18 averageSince greift auf die Daten der Persistence zurück.
Das wirft in Deinem Fall gleich mehrere Fragen auf:
  1. Warum persistiert rrd4j ohne dass Du eine Strategie gesetzt hast?
  2. Warum werden NULL-Werte von influxDB persistiert?
Beide Fragen lassen sich nicht ohne genaue Kenntnis Deiner Installation beantworten :)
Ich muss sagen, das hat mich auch stutzig gemacht :shock:
  1. Scheinbar reagiert rrd4j etwas verspätet, einige Minuten nachdem ich den Eintrag hier geschrieben habe kamen auch da dann NULL Werte zurück. Erst als ich die Werte dann wieder in die Konfig aufgenommen habe, wurde der average dann wieder korrekt berechnet.
  2. Es werden eigentlich keine NULL Werte persistiert, ich habe eine Select Query auf das entsprechende Item laufen lassen, es gibt keinen einzigen NULL Eintrag. Auch Grafana sieht gut aus. Warum allerdings openhab NULL Werte ausliest weiß ich auch nicht... Es klappt ja auch manchmal. Die Average Berechnung funktioniert immer einige Sekunden lang problemlos, dann kommen plötzlich wieder einige Sekunden lang NULL Werte, dann klappt es irgendwann plötzlich wieder... Könnte es möglicherweise daran liegen, dass openhab auf dem Raspberry Pi läuft und InfluxDB + Grafana auf meiner Synology NAS? Und es da irgendwie Netzwerkprobleme gibt? Wobei es in die andere Richtung ja scheinbar problemlos läuft.
Ich habe mir jetzt dadurch beholfen, dass ich rrd4j als Standard-Persistenz gesetzt habe, dort allerdings wirklich nur die Werte persistiere, die ich irgendwo für eine Average-Berechnung benötige. Und die Werte, die ich tatsächlich dokumentieren möchte kommen in InfluxDB. Spricht da eurer Meinung nach was dagegen?
openHABian PI mit RaZberry 2 Modul für Z-Wave

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Problem mit averageSince

Beitrag von udo1toni »

Grundsätzlich kannst Du persistieren, wie Du Lust hast. Ich habe mapdb um restoreOnStartup für bestimmte Items zu nutzen, Influxdb für schöne Grafiken mit Grafana, rrd4j für die schnelle hässliche Variante (die dafür aber auch in HABdroid komplett gezeichnet wird) und jdbc mit MariaDB für die Protokollierung. Ist natürlich ein Stück weit gewachsen, MariaDB lief eh schon, da war es naheliegend, die datenbank auch zu nutzen, Grafana unterstützt SQL erst seit "kurzem" (oder andersrum: als ich mit Grafana anfing, ging nur influxDB) und mit rrd4j habe ich die ersten Schritte gemacht. mapdb ist echt sparsam und auch ziemlich schnell.

Was mich etwas stutzig macht, ist Deine Aussage
Die Average Berechnung funktioniert immer einige Sekunden lang problemlos, dann kommen plötzlich wieder einige Sekunden lang NULL Werte,
Wenn Du tatsächlich sekündlich solche Berechnungen durchführst, ist es kein Wunder, dass da (viele) Ausreißer drunter sind.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Raptor
Beiträge: 84
Registriert: 26. Sep 2018 16:46

Re: Problem mit averageSince

Beitrag von Raptor »

udo1toni hat geschrieben: 21. Dez 2018 11:18 Was mich etwas stutzig macht, ist Deine Aussage
Die Average Berechnung funktioniert immer einige Sekunden lang problemlos, dann kommen plötzlich wieder einige Sekunden lang NULL Werte,
Wenn Du tatsächlich sekündlich solche Berechnungen durchführst, ist es kein Wunder, dass da (viele) Ausreißer drunter sind.
Ich führe die Berechnung eben bei jeder Änderung der Leistungsaufnahme durch. Da ich sonst ja nicht beurteilen kann, wann die Waschmaschine wirklich fertig ist.
openHABian PI mit RaZberry 2 Modul für Z-Wave

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Problem mit averageSince

Beitrag von udo1toni »

Ich könnte mir vorstellen, dass openHAB die Daten noch nicht fertig persistiert hat, aber schon Berechnungen anstellt, wenn Die Rule ausgeführt wird. Du könntest als Test mal als ersten Befehl nach dem then ein Thread::sleep(250) einbauen, das verzögert die Ausführung des Codes um 250 msec.
Achtung! Thread::sleep() sollte nicht verwendet werden, um Verzögerungen größer 500msec zu erreichen.
Aber eventuell kommt openHAB auch nicht mit der Berechnung des Durchschnittswertes hinterher...
Ich hab so was nicht im Einsatz, da kann ich also nur raten.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Raptor
Beiträge: 84
Registriert: 26. Sep 2018 16:46

Re: Problem mit averageSince

Beitrag von Raptor »

udo1toni hat geschrieben: 21. Dez 2018 11:48 Ich könnte mir vorstellen, dass openHAB die Daten noch nicht fertig persistiert hat, aber schon Berechnungen anstellt, wenn Die Rule ausgeführt wird. Du könntest als Test mal als ersten Befehl nach dem then ein Thread::sleep(250) einbauen, das verzögert die Ausführung des Codes um 250 msec.
Achtung! Thread::sleep() sollte nicht verwendet werden, um Verzögerungen größer 500msec zu erreichen.
Aber eventuell kommt openHAB auch nicht mit der Berechnung des Durchschnittswertes hinterher...
Ich hab so was nicht im Einsatz, da kann ich also nur raten.
Also es klappt inzwischen leider auch mit rrd4j nicht mehr. Ich verwende folgenden Code zum Ändern des Trockner-Status:

Code: Alles auswählen

rule "Aenderung des Trockner Status"
when
    Item Trockner_Leistung_w changed
then
    Thread::sleep(250)
    var Number Average_Leistung = Trockner_Leistung_w.averageSince(now.minusMinutes(1))
    logInfo("TROCKNER_LEISTUNG_CHANGED", "Wert " + Trockner_Leistung_w.state + " ergibt einen Durschnitt von " + Average_Leistung)
    if (Average_Leistung != null) {
        switch (Trockner_Status.state) {
            case MODE_OFF: {
                if (Average_Leistung > THRESHOLD_ACTIVE) {
                    Trockner_Status.postUpdate(MODE_ACTIVE)
                    logInfo("TROCKNER_MODE_CHANGE", "Von OFF to ACTIVE - Wert: " + Average_Leistung)
                    
                    ... und so weiter
                    
                } 
            }
        }
    }
end
Ergibt folgendes Ergebnis im Log:

Code: Alles auswählen

2018-12-22 14:53:52.256 [vent.ItemStateChangedEvent] - Trockner_Leistung_w changed from 455.2 to 176.3
2018-12-22 14:53:56.604 [INFO ] [del.script.TROCKNER_LEISTUNG_CHANGED] - Wert 176.3 ergibt einen Durschnitt von null
2018-12-22 14:53:56.610 [INFO ] [del.script.TROCKNER_LEISTUNG_CHANGED] - Wert 176.3 ergibt einen Durschnitt von null
2018-12-22 14:53:59.262 [vent.ItemStateChangedEvent] - Trockner_Leistung_w changed from 176.3 to 35.4
2018-12-22 14:53:59.524 [INFO ] [del.script.TROCKNER_LEISTUNG_CHANGED] - Wert 35.4 ergibt einen Durschnitt von null
2018-12-22 14:54:00.263 [vent.ItemStateChangedEvent] - Trockner_Leistung_w changed from 35.4 to 4.4
2018-12-22 14:54:00.522 [INFO ] [del.script.TROCKNER_LEISTUNG_CHANGED] - Wert 4.4 ergibt einen Durschnitt von null
2018-12-22 14:56:11.254 [vent.ItemStateChangedEvent] - Trockner_Leistung_w changed from 4.4 to 458.5
2018-12-22 14:56:11.521 [INFO ] [del.script.TROCKNER_LEISTUNG_CHANGED] - Wert 458.5 ergibt einen Durschnitt von 231.45
2018-12-22 14:56:12.256 [vent.ItemStateChangedEvent] - Trockner_Leistung_w changed from 458.5 to 176.4
2018-12-22 14:56:12.524 [INFO ] [del.script.TROCKNER_LEISTUNG_CHANGED] - Wert 176.4 ergibt einen Durschnitt von 90.4
2018-12-22 14:56:19.256 [vent.ItemStateChangedEvent] - Trockner_Leistung_w changed from 176.4 to 38.9
2018-12-22 14:56:19.537 [INFO ] [del.script.TROCKNER_LEISTUNG_CHANGED] - Wert 38.9 ergibt einen Durschnitt von null

.. und ab da kommen wieder nur null Werte
Meine rrd4j Konfiguration beinhaltet folgendes:

Code: Alles auswählen

Strategies {
 everyMinute : "0 * * * * ?"
   everyHour : "0 0 * * * ?"
    everyDay : "0 0 0 * * ?"
}
 
Items {
 Waschmaschine_Leistung_w : strategy = everyMinute
 Trockner_Leistung_w : strategy = everyMinute

}
Das ist doch echt zum Mäuse melken...
openHABian PI mit RaZberry 2 Modul für Z-Wave

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Problem mit averageSince

Beitrag von udo1toni »

Du musst auf jeden Fall zusätzlich zu everyMinute auch everyChange als Persistence Strategy setzen, damit alle Werte erfasst werden. Ob das gegen die null-Werte hilft, kann ich aber nicht sagen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Raptor
Beiträge: 84
Registriert: 26. Sep 2018 16:46

Re: Problem mit averageSince

Beitrag von Raptor »

udo1toni hat geschrieben: 22. Dez 2018 22:38 Du musst auf jeden Fall zusätzlich zu everyMinute auch everyChange als Persistence Strategy setzen, damit alle Werte erfasst werden. Ob das gegen die null-Werte hilft, kann ich aber nicht sagen.
Das scheint tatsächlich zu helfen, danke!

Wegen der Masse an Daten, die dadurch produziert werden muss ich ja keine Sorgen haben oder? rrd4j speichert ja soweit ich weiß immer mit der selben Datenspeicher-Belegung?
openHABian PI mit RaZberry 2 Modul für Z-Wave

Benutzeravatar
udo1toni
Beiträge: 13864
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Problem mit averageSince

Beitrag von udo1toni »

rrd4j hat einen festen Speicherbedarf je Item, die Daten werden imer weiter ausgedünnt, je älter sie werden. Das übernimmt rrd selbst. Man kann also z.B. für die letzten Stunden minutengenau auf die Daten schauen, für die letzte Woche aber vielleicht nur mit einer Genauigkeit von einer Stunde , für die letzten Monate dann nur noch mit mehreren Stunden Aufösung.

Es kommt also darauf an, ob Du die Daten auch für die weitere Vergangenheit mit hoher Auflösung benötigst. Für die Ermittlung des Durchschnittsverbrauchs der letzten Minuten spielt das sicher keine Rolle.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten