Restore on Startup rrd / influx geht nur ab und zu

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

goerdi
Beiträge: 110
Registriert: 21. Dez 2019 23:44
Answers: 0

Restore on Startup rrd / influx geht nur ab und zu

Beitrag von goerdi »

Hallo !

vorab ich hab es schon mit rrd und / oder influxdb ausprobiert ... hier mal die rrd config , die influxdb wäre ja ähnlich

Code: Alles auswählen

Strategies {
    everyMinute : "0 * * * * ?"
    everyHour : "0 0 * * * ?"
    everyDay : "0 0 0 * * ?"
    default = everyChange
}

Items {
*               : strategy = everyChange, everyMinute, restoreOnStartup
}
Zum Probem.. ich hab bei meiner homematic wetterstation eine rule die besagt das jeden tag um mitternacht quasi der neue Nullwert für den Tag gespeichert wird. der sollte ja bei einem neustart wieder hergestellt wird.
Allerdings scheint das nicht zu 100% zu funktionieren (eher nur zu 10%)... da ich nach einem Neustart immer einen Tagesregenwert von 2000 mm habe, sprich der 0 wert aus dem sich der Tageswert letztendlich errechnet ist 0 und nicht der letzte Wert im speicher (egal ob rrd oder influxdb.
Kann ich noch irgendwo was einstellen das dieser Effekt weggeht ?

Gruss Gerd

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

Re: Restore on Startup rrd / influx geht nur ab und zu

Beitrag von udo1toni »

Vielleicht drückst Du Dich nur ungünstig aus, aber:

Die Persistence speichert mit everyChange jede Änderung eines Zustands. Mit everyMinute wird wie definiert der Status jede Minute persistiert.
restoreOnStartup schließlich stellt den Status wieder her, und zwar exakt wenn openHAB gestartet wird.
Es ist keine gute Idee, einfach alle Items per restoreOnStartup blind wiederherstellen zu lassen, weil mutmaßlich ein Gutteil der Status gar nicht mit den tatsächlichen Status übereinstimmen. Besser ist es, nur die Status wiederherstellen zu lassen, bei denen das nicht anders möglich ist.

Was Deine 2000 mm betrifft, so kann dieser Wert nicht aus der Persistence stammen, sondern Du hast vermutlich eine Rule, welche schlicht fehlerhaft ist, das kannst Du nicht mit einer Persistence korrigieren, stattdessen musst Du die Rule korrigieren.

InfluxDB sollte nach Möglichkeit nicht mit everyMinute persistieren (unnötig viele Messwerte). Es gibt bei InfluxDB eigentlich nur den Grund, dass man die gesammelten Daten mittels (z.B.) Grafana darstellen möchte, dort aber möglichst mehrere Messwerte für den betrachteten Zeitraum zur Verfügung stehen sollten. Man wird aber die Daten nicht in Minutenauflösung betrachten, vor allem, wenn diese Daten gar nicht vorliegen, sondern nur künstlich geschaffen wurden.
Anders sieht es mit rrd4j aus, hier ist everyMinute als Strategy zwingend, weil rrd4j die Daten zur korrekten Funktion benötigt - es spielt dabei nur eine untergeordnete Rolle, ob die Daten aktuell sind oder Copy&Paste aus dem letzten Update genommen werden.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

goerdi
Beiträge: 110
Registriert: 21. Dez 2019 23:44
Answers: 0

Re: Restore on Startup rrd / influx geht nur ab und zu

Beitrag von goerdi »

Hi !

Irgendwie hast du recht und doch nicht.... es kommt halt drauf an was beim Start zuerst "passiert" spricht werden erst die Werte wiederhergestellt oder laufen die Rules auch durchlaufen...
Diese Rule "holt" nimmt ja den Nullwert und macht dann den Tageswert daraus...

Code: Alles auswählen

rule "Save Rain Data"
when
    Item WS_COUNT_RAIN  changed  //
then
    if(!(RAIN_OLD.state instanceof Number)) {                                       // Falls RAIN_OLD keine gültige Zahl enthält
        RAIN_OLD.postUpdate(0)                                                      // Item initialisieren
        logWarn("rain","RAIN_OLD mit 0 initialisiert!")                             // Meldung ausgeben
        Thread::sleep(300)                                                          // openHAB Bedenkzeit geben
    }
    if(!(WS_COUNT_RAIN.state instanceof Number)) {                                  // Falls WS_COUNT_RAIN keine gültige Zahl enthält
        logWarn("rain","WS_COUNT_RAIN ungültig! Abbruch!")                           // Meldung ausgeben
        return;                                                                     // und Rule abbrechen
    }
    var Number nRain = (WS_COUNT_RAIN.state as Number) - (RAIN_OLD.state as Number) // Differenz bestimmen
    if(nRain < 0)                                                                   // falls kleiner 0
        nRain = nRain + 1000                                                        // 1000 addieren
    RAIN_CHART.postUpdate(nRain)                                                    // RAIN_CHART aktualisieren
end
mit der wird der Tageswert beschrieben und hier wird der Nullwert jeden Nacht gesetzt

Code: Alles auswählen

rule "Reset Daily Data"
when
    Time cron "57 59 23  ? * *"                                                   // täglich 23:59:59

then
    if(!(RAIN_OLD.state instanceof Number)) {                                       // Falls RAIN_OLD keine gültige Zahl enthält
        RAIN_OLD.postUpdate(0)                                                      // Item initialisieren
        logWarn("rain","RAIN_OLD mit 0 initialisiert!")                             // Meldung ausgeben
        Thread::sleep(300)                                                          // openHAB Bedenkzeit geben
    }
     RAIN_OLD.postUpdate(WS_COUNT_RAIN.state as Number)                              // zuletzt RAIN_OLD aktualisieren
   end
Gruss Gerd

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

Re: Restore on Startup rrd / influx geht nur ab und zu

Beitrag von udo1toni »

Was willst Du denn tatsächlich erreichen? Was soll RAIN_OLD sein, was soll WS_COUNT_RAIN sein? Wozu dient RAIN_CHART?
Der Ansatz, etwas in ein Item zu schreiben, dann (weil es nicht anders geht) eine Wartezeit einzulegen und zu hoffen (!) dass das Item bis dahin den korrekten Wert hat, ist von vornherein falsch.
Es gibt eine (!) Situation, in der diese Art (in einer Abwandlung) sinnvoll ist, nämlich wenn Du auf die Persistence zugreifen willst, z.B. den aktuellen Wert persistieren und anschließend den Durchschnitt der letzten Minuten (incl. dem letzten Wert...) auslesen.

Hier (default Wert falls ungültig) nutzt man eine Variable:

Code: Alles auswählen

    var nRainOld = 0.0                                                              // Default Wert ist vom Typ Float 0.0
    if(RAIN_OLD.state instanceof Number)                                            // Falls RAIN_OLD eine gültige Zahl enthält
        nRainOld = RAIN_OLD.state as Number
    else 
        logWarn("rain","RAIN_OLD mit 0 initialisiert!")                             // Meldung ausgeben
Die Meldung kannst du auch noch weg lassen, die Kurzform wäre

Code: Alles auswählen

var nRainOld = if(RAIN_OLD.state instanceof Number) (RAIN_OLD.state as Number) else 0
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

goerdi
Beiträge: 110
Registriert: 21. Dez 2019 23:44
Answers: 0

Re: Restore on Startup rrd / influx geht nur ab und zu

Beitrag von goerdi »

Hallo !
die namen sind vielleicht etwas verwirrend gewaehlt...
WS_COUNT_RAIN ist der Wert der von der Wetterstation geliefert wird
RAIN_OLD ist der WS_COUNT_RAIN Wert von 0 Uhr
RAIN_CHART ist der Tageswert der aus WS_COUNT_RAIN - RAIN_OLD errechnet wurde.
Und wie gesagt das Problem ist das beim Start allem Anschein nach RAIN_OLD 0 ist und er mir dann als Tageswert den aktuellen WS_COUNT_RAIN reinschreibt..

Gruss Gerd

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

Re: Restore on Startup rrd / influx geht nur ab und zu

Beitrag von udo1toni »

Und WS_COUNT_RAIN ist dann monoton steigend? Sollte dieser Wert nicht von der Wetterstation regelmäßig zurückgesetzt werden?
Wie sind die Items definiert? Handelt es sich um QuantityType Items?

Angenommen, es handelt sich um einen Absolutwert, Regenmenge, die jemals gefallen ist (seit Inbetriebnahme der Wetterstation, natürlich), gemessen in mm, dann wäre der korrekte Ansatz:
1. Item WS_COUNT_RAIN als Number:Length definieren (mit unit=mm) (Item wird automatisch persistiert, falls nicht anders konfiguriert, um springende Werte zu vermeiden als Strategy zusätzlich zu everyChange, everyMinute noch restoreOnStartup setzen)
2. Item RAIN_CHART als Number:Length (mit unit=mm) für die Regenmenge pro Tag. Evtl. als Strategy zusätzlich zu everyChange, everyMinute noch restoreOnStartup setzen
2. Eine Rule um den Tageswert ins Item RAIN_CHART zu schreiben:

Code: Alles auswählen

rule "Save Rain Data"
when
    Item WS_COUNT_RAIN changed
then
    var nDiff = 0.0
    if(WS_COUNT_RAIN.deltaSince(now.with(LocalTime.MIDNIGHT),"rrd4j") instanceof Number)
        nDiff = WS_COUNT_RAIN.deltaSince(now.with(LocalTime.MIDNIGHT),"rrd4j") as Number

    RAIN_CHART.postUpdate(nDiff)
end
Die Variable nDiff wird automatisch als Float Objekt erzeugt (weil der Wert 0.0 übergeben wird)
Falls die Persistence-Funktion .deltaSince einen gültigen Wert liefert, wird dieser in die Variable übernommen.
Der Wert aus nDiff wird ins Item geschrieben.

Um sicher täglich mit 0 zu beginnen, kannst Du noch eine zweite Regel definieren:

Code: Alles auswählen

rule "Reset Daily Data"
when
    Time cron "0 0 0 * * ?"                                                   // täglich um 00:00:00 Uhr
then
     RAIN_CHART.postUpdate(0)
end
Um 0 Uhr wird das Chart-Item auf 0 gesetzt.

Im Chart ist dann pro Tag (an dem es regnet) eine steigende Kurve zu sehen, die um 0 Uhr bei 0 startet und bis 24 Uhr zur Tagesgesamtregenmenge ansteigt. An regenfreien Tagen gibt es eine 0-Linie.

Sollte in WS_COUNT_RAIN kein Absolutwert vorliegen, muss man evtl. noch mal drüber nachdenken, dazu fehlen aber noch notwendige Informationen :)
restoreOnStartup ist hier lediglich wichtig, um bei Ausbleiben von neuen Messwerten zu verhindern, dass die gemalten Linien seltsam aussehen :) Die Angabe des Persistence Service ,"rrd4j" kann natürlich auch auf andere Services eingestellt werden, falls dort sicher gültige Werte für die betrachteten Zeiträume vorliegen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

goerdi
Beiträge: 110
Registriert: 21. Dez 2019 23:44
Answers: 0

Re: Restore on Startup rrd / influx geht nur ab und zu

Beitrag von goerdi »

Hi !

WS_COUNT_RAIN ist der monoton steigende wert aus der Homematic Wetterstation.. es gibt noch einen "Tages" Regenwert aus der CCU2 welcher aber nicht beim Tageswechsel sondern bei Sonnenaufgang zurueckgesetzt wird....

Gruss Gerd

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

Re: Restore on Startup rrd / influx geht nur ab und zu

Beitrag von udo1toni »

Dann sollten die beiden Rules aus meinem Vorpost funktionieren.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

goerdi
Beiträge: 110
Registriert: 21. Dez 2019 23:44
Answers: 0

Re: Restore on Startup rrd / influx geht nur ab und zu

Beitrag von goerdi »

HI !
Ich hab mal probehalber die erste Rule reingeworfen

Code: Alles auswählen

The expression of type DecimalType is already of type Number
Ist aber wahrscheinlich nur ne Meldung ohne Effekt..
Aber noch ne Frage zu dieser Zeile

Code: Alles auswählen

if(WS_COUNT_RAIN.deltaSince(now.with(LocalTime.MIDNIGHT),"rrd4j") instanceof Number)
1. geht das nur mit RRD ?
2. gibts auch noch anderen Möglichkeiten ausser MIDNIGHT ? wie z.B. last Hour , last Month oder so ?

CIao Gerd

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

Re: Restore on Startup rrd / influx geht nur ab und zu

Beitrag von udo1toni »

goerdi hat geschrieben: 22. Dez 2023 16:28

Code: Alles auswählen

The expression of type DecimalType is already of type Number
Ist aber wahrscheinlich nur ne Meldung ohne Effekt..
Ja. Du kannst hier

Code: Alles auswählen

if(WS_COUNT_RAIN.deltaSince(now.with(LocalTime.MIDNIGHT),"rrd4j") instanceof Number)
        nDiff = WS_COUNT_RAIN.deltaSince(now.with(LocalTime.MIDNIGHT),"rrd4j") as Number
das as Number weg machen. Manchmal ist openHAB mäkelig, was die Typen betrifft, aber wenn es selbst sagt, "is' doch eh schon..." kann an der Stelle nichts mehr schief gehen und Du kannt ohne Probleme auf das Casting verzichten.
goerdi hat geschrieben: 22. Dez 2023 16:28geht das nur mit RRD?
Nein, das geht mit jeder Persistence, die eine Historie bereitstellt (also NICHT mit mapDB).
goerdi hat geschrieben: 22. Dez 2023 16:28gibts auch noch anderen Möglichkeiten ausser MIDNIGHT ? wie z.B. last Hour , last Month oder so?
Ja, allerdings ist das dann nicht LocalTime :) und teilweise muss man die TemporalAdjuster importieren, um sie nutzen zu können. LocalTime steht ohne Import zur Verfügung (MIDNIGHT und NOON dürften dabei die einzig sinnvollen sein, es gäbe auch noch MIN und MAX, was man dann in anderem Kontext nutzen kann.)
lastHour wäre im Übrigen einfacher mit .minusHours(1) abzudecken :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

Antworten