[SOLVED] Prozentwert berechnen
- PeterA
- Beiträge: 1052
- Registriert: 8. Feb 2019 12:12
Re: Prozentwert berechnen
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 ?
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
#PWRUP
- udo1toni
- Beiträge: 13944
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Prozentwert berechnen
Ja, dazu muss man aber wissen, wann die Anlage angefahren wurde. Am besten persistierst Du dafür das Item Luefterstufe. Dann kannst Du mit
schauen, ob der Lüfter seit mindestens 2 Minuten auf der aktuellen Stufe läuft.
Code: Alles auswählen
if((Luefterstufe.state as Number) != 0 && !(Luefterstufe.changedSince(now.minusMinutes(2))))
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet
- PeterA
- Beiträge: 1052
- Registriert: 8. Feb 2019 12:12
Re: Prozentwert berechnen
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)
Edit:
Ich vermute gegen diese hier Austauschen:
if(LuefterStufe.state.toString != "0" && LuefterStufe.state != NULL)
- OpenHab 2.4
#PWRUP
#PWRUP
- udo1toni
- Beiträge: 13944
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Prozentwert berechnen
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?
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
- PeterA
- Beiträge: 1052
- Registriert: 8. Feb 2019 12:12
Re: Prozentwert berechnen
Nein noch nicht. (Weil Beruflich unterwegs)
Aber werde ich natürlich vorher machen.
Aber werde ich natürlich vorher machen.
- OpenHab 2.4
#PWRUP
#PWRUP
- PeterA
- Beiträge: 1052
- Registriert: 8. Feb 2019 12:12
Re: Prozentwert berechnen
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.
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
#PWRUP
- udo1toni
- Beiträge: 13944
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Prozentwert berechnen
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:
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:
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
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.
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)
Code: Alles auswählen
if(true)
logInfo("code","True!")
else
logInfo("code","False!")
logInfo("code","Always!")
Code: Alles auswählen
if(true)
logInfo("code","True!")
else {
logInfo("code","False!")
logInfo("code","Always!") }
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
- PeterA
- Beiträge: 1052
- Registriert: 8. Feb 2019 12:12
Re: Prozentwert berechnen
ja, rr4dj
Kann im Chart auch sehen wann die LuefterStufe 0 oder 1 ist.
Kann im Chart auch sehen wann die LuefterStufe 0 oder 1 ist.
- OpenHab 2.4
#PWRUP
#PWRUP
- udo1toni
- Beiträge: 13944
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Prozentwert berechnen
rrd4j ist vermutlich nicht gut für diesen Job geeignet.
Ich hab meinen obigen Post noch ergänzt (war mir gerade noch aufgefallen)
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
- PeterA
- Beiträge: 1052
- Registriert: 8. Feb 2019 12:12
Re: Prozentwert berechnen
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.
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
#PWRUP