Seite 3 von 5

Re: Prozentwert berechnen

Verfasst: 18. Feb 2019 10:12
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 ?

Re: Prozentwert berechnen

Verfasst: 18. Feb 2019 21:14
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.

Re: Prozentwert berechnen

Verfasst: 18. Feb 2019 22:44
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)

Re: Prozentwert berechnen

Verfasst: 19. Feb 2019 12:04
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?

Re: Prozentwert berechnen

Verfasst: 19. Feb 2019 12:40
von PeterA
Nein noch nicht. (Weil Beruflich unterwegs)
Aber werde ich natürlich vorher machen.

Re: Prozentwert berechnen

Verfasst: 21. Feb 2019 21:41
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

Re: Prozentwert berechnen

Verfasst: 22. Feb 2019 15:15
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.

Re: Prozentwert berechnen

Verfasst: 22. Feb 2019 15:21
von PeterA
ja, rr4dj
Kann im Chart auch sehen wann die LuefterStufe 0 oder 1 ist.

Re: Prozentwert berechnen

Verfasst: 22. Feb 2019 15:36
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)

Re: Prozentwert berechnen

Verfasst: 22. Feb 2019 15:41
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. :-)