Wert in Regel als Variable zwischenspeichern

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Wert in Regel als Variable zwischenspeichern

Beitrag von Raptor »

Hallo zusammen,

ich habe mir ein Skript gebaut, welches den Verbrauch der Waschmaschine messen soll. Dazu speicher ich mir zu Beginn den Gesamtverbrauch in einer Variablen zwischen und substrahiere es nach Beendigung mit dem neuen Gesamtverbrauch. Das klappt leider nicht, da dann immer null in der Variablen steht.. Wenn ich die Werte aber bei jeder Leistungsänderung logge, funktioniert es plötzlich und die Variable merkt sich den Wert :?

Hier meine Regel:

Code: Alles auswählen

// Temporäre Variablen für Durchlauf
var Number var_Durchlauf_Verbrauch_Start_kwh
var Number var_Durchlauf_Verbrauch_kwh
var Number var_Durchlauf_Kosten_eur

rule "Durchlauf Aktionen Waschmaschine"
when
    Item Waschmaschine_Status changed
then
    if (Waschmaschine_Status.state == MODE_ACTIVE) {
        // Merke Start-Verbrauchsstand
        var_Durchlauf_Verbrauch_Start_kwh = Waschmaschine_Gesamtverbrauch_kwh.state as DecimalType
        logInfo("WASCHMASCHINE_KOSTEN_LOG", "BERECHNUNG GESTARTET - Startverbrauch: " + var_Durchlauf_Verbrauch_Start_kwh + " kWh - Gesamt: " + Waschmaschine_Gesamtverbrauch_kwh.state + " kWh")
        sendTelegram("mich", "Die Waschmaschine wurde gestartet.")
    } else if (Waschmaschine_Status.state == MODE_STANDBY) {
        sendTelegram("mich", "Die Waschmaschine wurde angeschaltet.")
    } else if (Waschmaschine_Status.state == MODE_OFF) {
        // Berechne Verbrauch des Durchlaufs mittels Startwert und aktuellem Gesamtwert
        var_Durchlauf_Verbrauch_kwh = Waschmaschine_Gesamtverbrauch_kwh.state as DecimalType - var_Durchlauf_Verbrauch_Start_kwh
        // Berechne Durchlaufskosten
        var_Durchlauf_Kosten_eur = var_Durchlauf_Verbrauch_kwh * ESSL_KWH
        logInfo("WASCHMASCHINE_KOSTEN_LOG", "BERECHNUNG BEENDET - Startverbrauch: " + var_Durchlauf_Verbrauch_Start_kwh + " kWh - Gesamt: " + Waschmaschine_Gesamtverbrauch_kwh.state + " kWh")
        sendTelegram("mich", "Die Waschmaschine wurde ausgeschaltet. Der Durchlauf hat " +
            var_Durchlauf_Verbrauch_kwh + " kWh verbraucht und " + 
            String::format("%.2f", var_Durchlauf_Kosten_eur.floatValue()) + " € gekostet.")
    }
end

In der Änderungsregel für die Leistungsänderung (wird im Schnitt alle 2 Sekunden durchlaufen) habe ich folgende Zeile stehen:

Code: Alles auswählen

logInfo("WASCHMASCHINE_KOSTEN_LOG", "Startverbrauch: " + var_Durchlauf_Verbrauch_Start_kwh + " kWh; Aktuell: " + Waschmaschine_Gesamtverbrauch_kwh.state + " kWh")
Wenn ich diese Zeile IMMER aktiv lasse, funktioniert alles.. Wenn ich sie aber entferne und erst nach einigen Minuten reinkopiere, erhalte ich folgenden Log:

Code: Alles auswählen

2018-11-18 16:32:59.876 [INFO ] [odel.script.WASCHMASCHINE_KOSTEN_LOG] - BERECHNUNG GESTARTET - Startverbrauch: 3.97 kWh - Gesamt: 3.97 kWh
[... einige Minuten später, ich habe die entsprechende Zeile in den Code kopiert...]
2018-11-18 16:36:19.898 [INFO ] [odel.script.WASCHMASCHINE_KOSTEN_LOG] - Startverbrauch: null kWh; Aktuell: 3.97 kWh
Vergisst das Framework diese Variablen wieder, wenn ich nicht regelmäßig darauf zugreife? (eben z.B. über Logging?)

Vielen Dank schon mal für eure Hilfe!

Grüße, Raptor
openHABian PI mit RaZberry 2 Modul für Z-Wave

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

Re: Wert in Regel als Variable zwischenspeichern

Beitrag von udo1toni »

Wenn Du den Code änderst, werden auch alle Variablen neu initialisiert.
Dass Du bei der Definition keinen Initialwert setzt, ändert daran nichts.

Du kannst z.B. statt der Variablen ein Number Item verwenden, dann kannst Du 1. jederzeit den Inhalt betrachten und 2. wird der Inhalt des Items nicht verändert, wenn Du das Rules-File anfasst.
Wenn Du das Logging ein- und ausschalten möchtest, gibt es einen wesentlich eleganteren Weg. Nutze statt logInfo() z.B. logDebug(). Du kannst das logging mit

Code: Alles auswählen

log:set DEBUG org.eclipse.smarthome.model.script.WASCHMASCHINE_KOSTEN_LOG
einschalten und mit

Code: Alles auswählen

log:set INFO org.eclipse.smarthome.model.script.WASCHMASCHINE_KOSTEN_LOG
wieder ausschalten. Diese Befehle gibst Du jeweils über die Karaf Konsole ein, dort kannst Du auch mit log:tail die aktuellen Logzeilen sehen.
Du kannst natürlich auch logInfo() stehen lassen und das Logging auf WARN ändern. Der Befehl wirkt sich nur auf exakt diese logInfo-Zeilen aus, spezifisch auf den Loggernamen bezogen (dessen letzter Teil im Befehl steht).
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

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

Re: Wert in Regel als Variable zwischenspeichern

Beitrag von Raptor »

Ich habe das Problem nun mit einem Item gelöst, danke für den Tipp :)
openHABian PI mit RaZberry 2 Modul für Z-Wave

Antworten