[SOLVED] Prozentwert berechnen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Prozentwert berechnen

Beitrag von PeterA »

Hallo Udo,
jupp, hab ich auch mal so abgeändert. Funktioniert auch sehr gut.
Jetzt ist noch eine weitere Sache aufgefallen:
Wenn die Anlage wieder anläuft, beginnt sofort die Berechnung der beiden Wirkungsgrade.
Da es aber ca 1-2 Minuten Dauert bis die Temperaturwerte aussagekräftig, sind hatte ich die Idee ob man
die Berechnung der Wirkungsgrade "zeitverzögert" starten lassen kann ?
Also erst zb. 2Min nach dem die Lüfter wieder laufen ?
- OpenHab 2.4
#PWRUP

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

Re: Prozentwert berechnen

Beitrag von udo1toni »

Ja, dazu muss man aber wissen, wann die Anlage angefahren wurde. Am besten persistierst Du dafür das Item Luefterstufe. Dann kannst Du mit

Code: Alles auswählen

if((Luefterstufe.state as Number) != 0 && !(Luefterstufe.changedSince(now.minusMinutes(2)))) 
schauen, ob der Lüfter seit mindestens 2 Minuten auf der aktuellen Stufe läuft.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Prozentwert berechnen

Beitrag von PeterA »

Ok, und wo kommt die Zeile dann in die Rule ?
Edit:
Ich vermute gegen diese hier Austauschen:
if(LuefterStufe.state.toString != "0" && LuefterStufe.state != NULL)
- OpenHab 2.4
#PWRUP

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

Re: Prozentwert berechnen

Beitrag von udo1toni »

Nein, nicht einfach austauschen. das ist eine zusätzliche Funktion, also muss sie auch zusätzlich eingebaut werden.
Lies Dir mal die Rule durch, und versuche zu verstehen, was da an welcher Stelle passiert.

Hast Du denn die Persistence schon eingebaut?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Prozentwert berechnen

Beitrag von PeterA »

Nein noch nicht. (Weil Beruflich unterwegs)
Aber werde ich natürlich vorher machen.
- OpenHab 2.4
#PWRUP

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Prozentwert berechnen

Beitrag von PeterA »

So hab ich das jetzt mal eingebaut:
Das Item "LuefterStufe" wird Persistiert
Aber es funktoniert noch nicht.
Wenn ich die Lüftung abstelle, und dann wieder Starte beginnt sofort wieder die Berechnung.

Code: Alles auswählen

rule "berechne Wirkungsgrad"
when
    Item Abluft changed or
    Item Zuluft changed or
    Item Aussenluft changed or
    Item Fort_Luft changed
then
    if(LuefterStufe.state.toString != "0" && LuefterStufe.state != NULL)

    if((LuefterStufe.state as Number) != 0 && !(LuefterStufe.changedSince(now.minusMinutes(2))))     
{
    if(!(Abluft.state instanceof Number)) {
        logWarn("Wirkungsgrad","Abluft.state not a Number: {}",Abluft.state)
        return;
    }
    if(!(Zuluft.state instanceof Number)) {
        logWarn("Wirkungsgrad","Zuluft.state not a Number: {}",Zuluft.state)
        return;
    }
    if(!(Aussenluft.state instanceof Number)) {
        logWarn("Wirkungsgrad","Aussenluft.state not a Number: {}",Aussenluft.state)
        return;
    }
    if(!(Fort_Luft.state instanceof Number)) {
        logWarn("Wirkungsgrad","Fort_Luft.state not a Number: {}",Fort_Luft.state)
        return;
    }
    val Number Aussenluft = (Aussenluft.state as Number)
    val Number Fort_Luft = (Fort_Luft.state as Number)
    val Number nDivisor = (Abluft.state as Number) - Aussenluft //Wert fuer Berechung gem. Westaflex
    val Number nFaktor = (Zuluft.state as Number) - Aussenluft //Wert fuer Berechung gem. Westaflex
    val Number nDivisor2 = (Abluft.state as Number) - Fort_Luft
    if(nDivisor == 0) {
        logWarn("Wirkungsgrad","Aussentemperatur = Ablufttemperatur, Division durch 0!")
        Wirkungsgrad.postUpdate(NULL)
    } else
    if(nDivisor2 == 0) {
        logWarn("Wirkungsgrad2","Ablufttemperatur = Aussentemperatur, Division durch 0!")
        Wirkungsgrad2.postUpdate(NULL)
    } else
        Wirkungsgrad.postUpdate((100*nFaktor/nDivisor).intValue) //Berechung gem. Westaflex
        Wirkungsgrad2.postUpdate((100*nDivisor2/nDivisor).intValue)
 }
end
- OpenHab 2.4
#PWRUP

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

Re: Prozentwert berechnen

Beitrag von udo1toni »

Welche Persistence verwendest Du? Ist das auch die Default Persistence?

Du hast außerdem im Code einen Fehler. In der letzten Phase der Rule überprüfst Du nDivisor und nDivisor2. Dort beachtest Du die Codeebene nicht. Die beiden Werte sind unabhängig voneinander, entsprechend sind die beiden Abfragen auch unabhängig voneinander, die 2. Abfrage gehört also nicht in den elst-Teil. der korrekte Code muss an dieser Stelle so aussehen:

Code: Alles auswählen

    if(nDivisor == 0) {
        logWarn("Wirkungsgrad","Aussentemperatur = Ablufttemperatur, Division durch 0!")
        Wirkungsgrad.postUpdate(NULL)
    } else
        Wirkungsgrad.postUpdate((100*nFaktor/nDivisor).intValue) //Berechung gem. Westaflex
    if(nDivisor2 == 0) {
        logWarn("Wirkungsgrad2","Ablufttemperatur = Aussentemperatur, Division durch 0!")
        Wirkungsgrad2.postUpdate(NULL)
    } else
        Wirkungsgrad2.postUpdate((100*nDivisor2/nDivisor).intValue)
Zum Verständnis: die bedingte Verweigung bezieht sich immer auf exakt einen folgenden Befehl. Danach muss else folgen, falls man else verwenden will. auch hier gilt das else nur für den ersten folgenden Befehl:

Code: Alles auswählen

if(true)
    logInfo("code","True!")
else
    logInfo("code","False!")
    logInfo("code","Always!")
    
wird die Ausgabe True! Always! ergeben, denn die letzte Zeile gehört schon nicht mehr zum else-Part. Wenn man mehrere Befehle gruppieren möchte, nutzt man dazu die geschweiften Klammern {}, diesen Codeblock betrachtet der Parser dann als einen Befehl

Code: Alles auswählen

if(true)
    logInfo("code","True!")
else {
    logInfo("code","False!")
    logInfo("code","Always!") }
    
Führt nur zur Ausgabe True!

Die eckigen Klammern [] haben eine ähnliche Wirkung, werden aber in einem anderen Zusammenhang verwendet. Was in den eckigen Klammern steht, ist ein Lambda. Solche Codeblöcke werden bei Funktionsaufrufen gebraucht, wenn ein Teil der Funktion das Ausführen von Code ist, also z.B. bei der Funktion createTimer(instant,procedure) wird als procedure ein Codeblock übergeben, der beim Erreichen der Zielzeit ausgeführt wird.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Prozentwert berechnen

Beitrag von PeterA »

ja, rr4dj
Kann im Chart auch sehen wann die LuefterStufe 0 oder 1 ist.
- OpenHab 2.4
#PWRUP

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

Re: Prozentwert berechnen

Beitrag von udo1toni »

rrd4j ist vermutlich nicht gut für diesen Job geeignet.

Ich hab meinen obigen Post noch ergänzt (war mir gerade noch aufgefallen)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Prozentwert berechnen

Beitrag von PeterA »

Und weshalb ist rrd4j nicht geeignet ?
Kann man da nicht ne art "Delay" einbauen, so das die Rule 120sec "hält" und dann weiter läuft ?
Dann brauch ich keine Datenbank.
Bei dem ganzen geklammere wirds einem böse schwindelig. :-)
- OpenHab 2.4
#PWRUP

Antworten