Seite 1 von 1

Update einer Number Variable

Verfasst: 6. Feb 2026 18:02
von klaus1
Ich kämpfe jetzt schon Stunden wegen folgendem Problem in openhab 4.3.6:
Sitemap:

Code: Alles auswählen

        
        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"    
Variablen:
Folgende rule:

Code: Alles auswählen

rule "current all safe"
when
    Item PV_Current changed or
    Item PV_Current_gen24 changed
then
    val pv1 = if (PV_Current.state != NULL && PV_Current.state != UNDEF) (PV_Current.state as Number).floatValue else 0
    val pv2 = if (PV_Current_gen24.state != NULL && PV_Current_gen24.state != UNDEF) (PV_Current_gen24.state as Number).floatValue else 0
    PV_Current_all.postUpdate(pv1 + pv2)
end

rule "verbrauch safe"
when
    Item SMARTMETER_Current changed or
    Item PV_Current changed or
    Item PV_Current_gen24 changed
then
    val sm = if (SMARTMETER_Current.state != NULL && SMARTMETER_Current.state != UNDEF) (SMARTMETER_Current.state as Number).floatValue else 0
    val pv1 = if (PV_Current.state != NULL && PV_Current.state != UNDEF) (PV_Current.state as Number).floatValue else 0
    val pv2 = if (PV_Current_gen24.state != NULL && PV_Current_gen24.state != UNDEF) (PV_Current_gen24.state as Number).floatValue else 0
    Verbrauch.postUpdate(sm + pv1 + pv2)
end
Variablendefinition im Backend:
label: PV_Current_all (Wert aktuell NULL)
type: Number:Power
category: ""
groupNames: []
tags:
- Point

label: Verbrauch (Wert aktuell NULL)
type: Number
category: ""
groupNames: []
tags: []

label: Bezug (Wert aktuell NULL)
type: Number
category: ""
groupNames: []
tags: []

label: PV_Current_gen24 (Wert aktuell 0W)
type: Number:Power
category: ""
groupNames: []
tags:
- Point

label: SMARTMETER_Current (wert aktuell 600W und ändert sich)
type: Number:Power
category: ""
groupNames: []
tags:
- Point

SMARTMETER_Current liefert im Backend laufen Werte vom Smartmeter.

Die anzeige in der sitemap sind daher immer mit - gekennzeichnet.
pv_bild.png
Ich bin am Ende. begonnen hat alles weil ich rrd4j installiert habe, die rrd files dann gehabt hab, und seitdem alles begonnen hat. hab dann rrd4j entfernt in den addons, die rrd files auch (kommen auch nicht nach).

Das hat jetzt jahrelang immer funktioniert. kann es mit der persistierung zusammenhängen?

Re: Update einer Number Variable

Verfasst: 6. Feb 2026 18:39
von klaus1
Verbrauch und Bezug kommen jetzt endlich richtig. PV_Current_all immer noch NULL:

Code: Alles auswählen

// ---------------------------
// Verbrauch safe
// ---------------------------
rule "verbrauch safe"
when
    Item SMARTMETER_Current changed or
    Item PV_Current changed or
    Item PV_Current_gen24 changed
then
    val sm = if (SMARTMETER_Current.state != NULL && SMARTMETER_Current.state != UNDEF) (SMARTMETER_Current.state as Number).floatValue else 0
    val pv1 = if (PV_Current.state != NULL && PV_Current.state != UNDEF) (PV_Current.state as Number).floatValue else 0
    val pv2 = if (PV_Current_gen24.state != NULL && PV_Current_gen24.state != UNDEF) (PV_Current_gen24.state as Number).floatValue else 0
    val total = sm + pv1 + pv2
    if (Verbrauch.state != total) {
        Verbrauch.postUpdate(total)
    }
end

// ---------------------------
// Bezug / Einspeisung safe
// ---------------------------
rule "einspeisungCalc safe"
when
    Item SMARTMETER_Current changed
then
    val smart = if (SMARTMETER_Current.state != NULL && SMARTMETER_Current.state != UNDEF) (SMARTMETER_Current.state as Number).floatValue else 0

    if (smart > 0) {
        if (Bezug.state != smart) Bezug.postUpdate(smart)
        if (Einspeisung.state != 0) Einspeisung.postUpdate(0)
    } else {
        if (Bezug.state != 0) Bezug.postUpdate(0)
        if (Einspeisung.state != -smart) Einspeisung.postUpdate(-smart)
    }
end

// ---------------------------
// PV Current all
// ---------------------------
rule "current all safe"
when
    Item PV_Current changed or
    Item PV_Current_gen24 changed
then
    val pv1 = if (PV_Current.state != NULL && PV_Current.state != UNDEF) (PV_Current.state as Number).floatValue else 0
    val pv2 = if (PV_Current_gen24.state != NULL && PV_Current_gen24.state != UNDEF) (PV_Current_gen24.state as Number).floatValue else 0
    val total = pv1 + pv2
    if (PV_Current_all.state != total) {
        PV_Current_all.postUpdate(total)
    }
end

Re: Update einer Number Variable

Verfasst: 7. Feb 2026 03:34
von udo1toni
Du brauchst nur eine Rule.
Außerdem solltest Du von dem Operator instanceof Gebrauch machen:

Code: Alles auswählen

rule "all pv und smart"
when
    Item SMARTMETER_Current changed or
    Item PV_Current changed or
    Item PV_Current_gen24 changed
then
    // Werte einsammeln
    val Number sm  = if(SMARTMETER_Current.state instanceof Number) (SMARTMETER_Current.state as Number).floatValue else 0
    val Number pv1 = if(PV_Current.state instanceof Number) (PV_Current.state as Number).floatValue else 0
    val Number pv2 = if(PV_Current_gen24.state instanceof Number) (PV_Current_gen24.state as Number).floatValue else 0

    // berechnen
    val Number pv  = pv1 + pv2
    val Number all = pv + sm
    val Number bezug = if(sm > 0) sm else 0
    val Number liefern = if(sm < 0) -sm else 0

    //Items ändern, falls nötig
    if(PV_Current_all.state instanceof Number)
        if((PV_Current_all.state as Number) != pv) PV_Current_all.postUpdate(pv)
    else PV_Current_all.postUpdate(pv)

    if(Verbrauch.state instanceof Number)
        if((Verbrauch.state as Number) != all) Verbrauch.postUpdate(all)
    else Verbrauch.postUpdate(all)

    if(Bezug.state instanceof Number)
        if((Bezug.state as Number) != bezug) Bezug.postUpdate(bezug)
    else Bezug.postUpdate(bezug)

    if(Einspeisung.state instanceof Number)
        if((Einspeisung.state as Number) != liefern) Einspeisung.postUpdate(liefern)
    else Einspeisung.postUpdate(liefern)
end
Wenn Du viele Rules parallel einsetzt, die identische Trigger nutzen, kann das zu Verzögerungen in der Codeausführung führen. Es ist nicht so, dass es nicht gestattet wäre :) aber man sollte es vermeiden, wenn es keine guten Gründe dafür gibt.