item Wert persistieren und automatisch laden beim Openhab3 Start

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

klaus1
Beiträge: 116
Registriert: 11. Jan 2022 13:48
Answers: 0

Re: item Wert persistieren und automatisch laden beim Openhab3 Start

Beitrag von klaus1 »

Da ich den Wasserzähler nur stündlich bekomme reicht doch hier ein everyHour, und everyChange. Rechnen dann mit historicState( )
Es wäre ja sinnlos jede Minute denselben Wert zu speichern.

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

Re: item Wert persistieren und automatisch laden beim Openhab3 Start

Beitrag von udo1toni »

Nein. Ich hab es oben erklärt, everyMinute ist - anders als bei allen anderen Persistence Services - nicht optional, es ist ZWINGEND.

Es spielt auch keine Rolle, es tut nicht weh, es erzeugt keinerlei Speicherprobleme (rrd4j ist statisch, was den Speicherverbrauch betrifft).

Möchtest Du, dass rrd4j funktioniert, dann belasse es bitte bei everyMinute.
Sobald Du weniger als einen Messwert pro Minute in die Datenbank schreibst, ist die Datenbank für das betreffende Item kaputt und lässt sich auch nicht mehr reparieren, d.h. Du musst dann die entsprechende Datei löschen, damit (mit everyMinute als Strategy) die Daten für Analyze wieder korrekt zur Verfügung stehen.

Das ist im Übrigen "schon immer" so, seit es Persistence in openHAB gibt, und diese Regel gilt auch für alle anderen Systeme, die rrd4j einsetzen (es sei denn, die zweite Stufe hat eine andere zeitliche Auflösung als minütlich, wie gesagt, rrd4j ist konfigurierbar)
openHAB5.1.2 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.1.5 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte

klaus1
Beiträge: 116
Registriert: 11. Jan 2022 13:48
Answers: 0

Re: item Wert persistieren und automatisch laden beim Openhab3 Start

Beitrag von klaus1 »

Danke für die Hilfe!
Ich denke das war der Grund meiner Probleme vor Deaktivierung rrd4j. Habe nun alle rrd Files gelöscht und setze jetzt sauber das config File neu auf.
Muss ich sonst noch wo Daten bereinigen?
Danke

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

Re: item Wert persistieren und automatisch laden beim Openhab3 Start

Beitrag von udo1toni »

Nein, die rrd Dateien zu löschen und rrd4j.persist korrekt zu konfigurieren sollte hinreichend sein.
openHAB5.1.2 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.1.5 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte

klaus1
Beiträge: 116
Registriert: 11. Jan 2022 13:48
Answers: 0

Re: item Wert persistieren und automatisch laden beim Openhab3 Start

Beitrag von klaus1 »

das ist doch seltsam. aktuell aktiviert habe ich rrd4j, und folgende Anpassung im rrd4j.persist file vorgenommen:

Code: Alles auswählen

Strategies {
    everyMinute  : "0 * * * * ?"  // sichert alle 60 Sekunden → verhindert Stufenprobleme in RRD
}

Items {
    PV_Current, PV_Current_gen24, SMARTMETER_Current : strategy = everyChange, everyMinute
    WasserZaehlerstand : strategy = everyChange, everyMinute
}

Problem habe ich jetzt mit ganz anderen Items / Rules, nämlich der PV Leistung, Aktueller Verbrauch, Netz-Bezug und Netz-Einspeisung (jeweils eingefrorener Wert)
pv_anzeige_openhab.png
die zugehörige Sitemap:

Code: Alles auswählen

	Frame label="Photovoltaik 9.775 kWP - Symo" {
        Text item=PV_Current label="PV Leistung: [%.0f W]" icon="none"
		Text item=PV_Prozent label="PV Auslastung: [%.2f %%]" icon="none"
        Text item=PV_DaySum label="PV Leistung Tag: [%.2f kWh]" icon="none"
        Text item=PV_YearSum label="PV Leistung Jahr: [%.2f MWh]" icon="none"
		Text item=PV_Total label="PV Leistung Total: [%.2f MWh]" icon="none" 
	}
    Frame label="Photovoltaik 11.15 kWP - GEN24" {
        Text item=PV_Current_gen24 label="PV Leistung: [%.0f W]" icon="none"
		Text item=PV_Prozent_gen24 label="PV Auslastung: [%.2f %%]" icon="none"
        Text item=PV_DaySum_gen24 label="PV Leistung Tag: [%.2f kWh]" icon="none"
        Text item=PV_YearSum_gen24 label="PV Leistung Jahr: [%.2f MWh]" icon="none"
		Text item=PV_Total_gen24 label="PV Leistung Total: [%.2f MWh]" icon="none"   
	}
    Frame label="Photovoltaik 20.925 kWP - Gesamt" {
        Text item=PV_Current_all label="PV Leistung: [%.0f W]" icon="none"
        Text item=Verbrauch label="Aktueller Verbrauch: [%.2f W]" icon="none"
        Text item=Bezug label="Netz-Bezug: [%.2f W]" icon="none"    
        Text item=Einspeisung label="Netz-Einspeisung: [%.2f W]" icon="none"
        Text item=PV_DaySum_all label="PV Leistung Tag: [%.2f kWh]" icon="none"
        Text item=SMARTMETER_Current label="Smartmeter: [%.2f W]" icon="none"
    }


und die rule (unangegriffen, und funktionsfähig vor rrd4j aktivierung!

Code: Alles auswählen

rule "PV_Main_Calculation"
when
    System started or
    Item PV_Current changed or
    Item PV_Current received update or
    Item PV_Current_gen24 changed or
    Item PV_Current_gen24 received update or
    Item SMARTMETER_Current changed or
    Item SMARTMETER_Current received update
then
    try {
        // -----------------------------
        // Eingangswerte sauber lesen
        // -----------------------------
        val pv1 = if (PV_Current !== null && PV_Current.state instanceof Number) (PV_Current.state as Number).doubleValue else 0.0
        val pv2 = if (PV_Current_gen24 !== null && PV_Current_gen24.state instanceof Number) (PV_Current_gen24.state as Number).doubleValue else 0.0
        val smart = if (SMARTMETER_Current !== null && SMARTMETER_Current.state instanceof Number) (SMARTMETER_Current.state as Number).doubleValue else 0.0

        logInfo("SOLAR_Rules", "Eingangswerte: PS1=" + pv1 + " SV2=" + pv2 + " Smart=" + smart)

        // -----------------------------
        // Runde PV Werte auf ganze Watt
        // -----------------------------
        val pv1Rounded = Math::round(pv1)
        val pv2Rounded = Math::round(pv2)
        val pvTotal = pv1Rounded + pv2Rounded
        logInfo("SOLAR_Rules", "Rundung SV: SV1=" + pv1Rounded + " SV2=" + pv2Rounded + " Total=" + pvTotal)

        // -----------------------------
        // PV Gesamtleistung
        // -----------------------------
        if (PV_Current_all !== null) {
            PV_Current_all.postUpdate(new DecimalType(pvTotal))
            logInfo("SOLAR_Rules", "SV_Current_all aktualisiert: " + pvTotal)
        } else {
            logWarn("SOLAR_Rules", "PV_Current_all existiert nicht – Update übersprungen!")
        }

        // -----------------------------
        // Auslastung Symo (9.775 kWp)
        // -----------------------------
        val percent1 = Math::round((pv1Rounded / 9775.0) * 100.0 * 100) / 100.0
        if (PV_Prozent !== null) {
            PV_Prozent.postUpdate(new DecimalType(percent1))
            logInfo("SOLAR_Rules", "SV_Prozent aktualisiert: " + percent1)
        }

        // -----------------------------
        // Auslastung GEN24 (11.15 kWp)
        // -----------------------------
        val percent2 = Math::round((pv2Rounded / 11150.0) * 100.0 * 100) / 100.0
        if (PV_Prozent_gen24 !== null) {
            PV_Prozent_gen24.postUpdate(new DecimalType(percent2))
            logInfo("SOLAR_Rules", "SV_Prozent_gen24 aktualisiert: " + percent2)
        }

        // -----------------------------
        // Netzbezug / Einspeisung
        // -----------------------------
        val smartRounded = Math::round(smart)
        if (Bezug !== null && Einspeisung !== null) {
            if (smartRounded > 0) {
                Bezug.postUpdate(new DecimalType(smartRounded))
                Einspeisung.postUpdate(new DecimalType(0))
            } else {
                Bezug.postUpdate(new DecimalType(0))
                Einspeisung.postUpdate(new DecimalType(Math::abs(smartRounded)))
            }
            logInfo("SOLAR_Rules", "SBezug=" + Bezug.state + " SEinspeisung=" + Einspeisung.state)
        }

        // -----------------------------
        // Verbrauch berechnen
        // -----------------------------
        val netzbezug = if (smartRounded > 0) smartRounded else 0
        val verbrauchTotal = pvTotal + netzbezug
        if (Verbrauch !== null) {
            Verbrauch.postUpdate(new DecimalType(verbrauchTotal))
            logInfo("SOLAR_Rules", "SVerbrauch aktualisiert: " + verbrauchTotal)
        }

    } catch (Exception e) {
        logError("SOLAR_Rules", "Fehler in PV_Main_Calculation: " + e.toString)
    }
end

Logging vollständig, da kommt sonst nichts mehr: (PV gegen SV usw. getauscht, da manche Schlüsselwerte vom log4j geblockt sind weil zu viele änderungen)
2026-02-12 13:02:54.441 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'pvcalculations.rules'
2026-02-12 13:02:58.780 [INFO ] [penhab.core.model.script.SOLAR_Rules] - Eingangswerte: PS1=2858.0 SV2=2909.5146484375 Smart=353.2
2026-02-12 13:02:58.797 [INFO ] [penhab.core.model.script.SOLAR_Rules] - Rundung SV: SV1=2858 SV2=2910 Total=5768
2026-02-12 13:06:14.303 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'pvcalculations.rules'
2026-02-12 13:06:18.311 [INFO ] [penhab.core.model.script.SOLAR_Rules] - Eingangswerte: PS1=3211.0 SV2=3317.31591796875 Smart=-123.7
2026-02-12 13:06:18.322 [INFO ] [penhab.core.model.script.SOLAR_Rules] - Rundung SV: SV1=3211 SV2=3317 Total=6528
danach kommen keine logs mehr von der rule... sieht so aus als ist das nur beim einspielen der Rule.. danach wird die rule nicht mehr getriggert...
Es läuft nur RRD4J lt. openhab4. aber ich denke das mir rrd4j die rules nicht mehr sauber triggert.

Wo ist das hier das Problem ?
openhab> bundle:list | grep -i persist
103 x Active x 80 x 2.16.0.v20190528-0725 x EMF XML/XMI Persistence
203 x Active x 80 x 4.3.6 x openHAB Core :: Bundles :: Model Persistence
204 x Active x 80 x 4.3.6 x openHAB Core :: Bundles :: Model Persistence IDE
205 x Active x 80 x 4.3.6 x openHAB Core :: Bundles :: Model Persistence Runtime
219 x Active x 80 x 4.3.6 x openHAB Core :: Bundles :: Persistence
339 x Active x 80 x 4.3.6 x openHAB Add-ons :: Bundles :: Persistence Service :: RRD4j
openhab>

Danke
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

klaus1
Beiträge: 116
Registriert: 11. Jan 2022 13:48
Answers: 0

Re: item Wert persistieren und automatisch laden beim Openhab3 Start

Beitrag von klaus1 »

so meine rules klappen wieder, ich habe das everyChange bei allen Items entfernt die alle 2sec. upgedatet werden. dürfte wohl ein Performance Problem sein?

Code: Alles auswählen

Strategies {
    everyMinute : "0 * * * * ?"   // verhindert Stufenprobleme in RRD
}

Items {
    PV_Current, PV_Current_gen24, SMARTMETER_Current : strategy = everyMinute
    WasserZaehlerstand : strategy = everyChange, everyMinute
}

Antworten