Seite 2 von 5
Re: Prozentwert berechnen
Verfasst: 12. Feb 2019 22:24
von udo1toni
Komma, Punkt... Stimmt.
Code: Alles auswählen
rule "berechne Wirkungsgrad"
when
Item Abluft changed or
Item Zuluft changed
then
if(LuefterStufe.state.toString != "0" && LuefterStufe.state != NULL) {
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;
}
val Number nDivisor = 273.15 + (Abluft.state as Number)
val Number nFaktor = 273.15 + (Zuluft.state as Number)
Wirkungsgrad.postUpdate((100/nDivisor*nFaktor).intValue)
}
end
Wie sind die Items definiert? Abluft, Zuluft, LuefterStufe, Wirkungsgrad.
Siehst Du in openhab.log Zeilen mit "Wirkungsgrad" im Kontext (Der Kontext ist der Bereich in [eckigen] Klammern)
Re: Prozentwert berechnen
Verfasst: 12. Feb 2019 23:28
von PeterA
So jetzt funktionierts:
Code: Alles auswählen
rule "berechne Wirkungsgrad"
when
Item Abluft changed or
Item Zuluft changed
then
if(LuefterStufe.state.toString != "0" && LuefterStufe.state != NULL)
{
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;
}
val Number nDivisor = (Abluft.state as Number)
val Number nFaktor = (Zuluft.state as Number)
Wirkungsgrad.postUpdate((100/nDivisor*nFaktor).intValue)
}
end
2019-02-12 23:25:17.644 [vent.ItemStateChangedEvent] - Aussenluft changed from 1.3 to 1.2
2019-02-12 23:25:22.803 [vent.ItemStateChangedEvent] - Fort_Luft changed from 4.9 to 4.8
2019-02-12 23:25:22.875 [vent.ItemStateChangedEvent] - Aussenluft changed from 1.2 to 1.3
2019-02-12 23:25:23.007 [vent.ItemStateChangedEvent] - Abluftfeuchte changed from 50 to 49
2019-02-12 23:25:28.045 [vent.ItemStateChangedEvent] - Fort_Luft changed from 4.8 to 4.9
2019-02-12 23:25:28.100 [vent.ItemStateChangedEvent] - Abluft changed from 17.9 to 17.8
2019-02-12 23:25:28.131 [vent.ItemStateChangedEvent] - Wirkungsgrad changed from 70 to 71
Vielen Dank!
Re: Prozentwert berechnen
Verfasst: 12. Feb 2019 23:38
von udo1toni
Bleibt zu hoffen, dass die Abluft nie auf 0 sinkt...
Re: Prozentwert berechnen
Verfasst: 12. Feb 2019 23:42
von PeterA
Das ist die Warme Abluft aus den Beheizten Räumen....das wird nie 0 sein

Re: Prozentwert berechnen
Verfasst: 14. Feb 2019 23:48
von PeterA
Leider ist die Formel die ich hier verwende so nicht ganz richtig.
(Bin ja kein Lüftungs Fachmann)

Wie wie ich recherchiert habe, kann man das so Berechnen:
Die Rückwärmzahl bezogen auf die Außenluft wird nach dieser Formel berechnet:
(tZuluft - tAussen) / (tAbluft - tAussen)
also zb:
(15.2 - 1.5) / (18.1 - 1.5) = 0.82
Wie müsste das denn in meiner Rules Datei aussehen?
Re: Prozentwert berechnen
Verfasst: 15. Feb 2019 11:52
von udo1toni
Na ja, Du musst halt noch die Außentemperatur mit einfließen lassen (sah mir gleich so komisch aus...

)
Code: Alles auswählen
rule "berechne Wirkungsgrad"
when
Item Abluft changed or
Item Zuluft changed or
Item Aussen changed
then
if(LuefterStufe.state.toString != "0" && LuefterStufe.state != NULL)
{
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(!(Aussen.state instanceof Number)) {
logWarn("Wirkungsgrad","Aussen.state not a Number: {}",Aussen.state)
return;
}
val Number tAussen = (Aussen.state as Number)
val Number nDivisor = (Abluft.state as Number) - tAussen
val Number nFaktor = (Zuluft.state as Number) - tAussen
if(nDivisor == 0) {
logWarn("Wirkungsgrad","Außentemperatur = Ablufttemperatur, Division durch 0!")
Wirkungsgrad.postUpdate(NULL)
} else
Wirkungsgrad.postUpdate((100/nDivisor*nFaktor).intValue)
}
end
Jetzt ist allerdings der Punkt erreicht, wo es durchaus passieren kann, dass die Ablufttemperatur gleich der Außentemperatur ist. Ob Du dann die Zuweisung des konkreten Werts einfach nicht ausführst, oder das Item auf NULL setzt, kannst Du halten wie Du willst. (in ersterem Fall lässt Du einfach die Zeile
Wirkungsgrad.postUpdate(NULL) weg.)
Re: Prozentwert berechnen
Verfasst: 15. Feb 2019 12:49
von PeterA
Ok,
Und wo baue ich die Formel ein: (tZuluft - tAussen) / (tAbluft - tAussen) ?
Re: Prozentwert berechnen
Verfasst: 15. Feb 2019 14:38
von udo1toni
Wieso? Die ist doch schon drin?
Code: Alles auswählen
val Number tAussen = (Aussen.state as Number)
val Number nDivisor = (Abluft.state as Number) - tAussen
val Number nFaktor = (Zuluft.state as Number) - tAussen
if(nDivisor == 0) {
logWarn("Wirkungsgrad","Außentemperatur = Ablufttemperatur, Division durch 0!")
Wirkungsgrad.postUpdate(NULL)
} else
Wirkungsgrad.postUpdate((100/nDivisor*nFaktor).intValue)
In er ersten Zeile wird die Außentemperatur in eine Konstante geschrieben
In der zweiten Zeile wird die Außentemperatur von der Abluft abgezogen (und in eine Konstante geschrieben - das ist die zweite Klammer)
In der zweiten Zeile wird die Außentemperatur von der Zuluft abgezogen (und in eine Konstante geschrieben - das ist die erste Klammer)
In der letzten Zeile wird die Division durchgeführt. Man könnte das natürlich auch
100*nFaktor/nDivisor schreiben, das bleibt sich gleich. Die 100 sind die Umrechnung nach Prozent.
Re: Prozentwert berechnen
Verfasst: 15. Feb 2019 21:41
von PeterA
Hallo,
so jetzt hab ich einigermaßen verstanden.
Und so sieht jetzt die Rule aus und funktioniert auch:
Code: Alles auswählen
rule "berechne Wirkungsgrad"
when
Item Abluft changed or
Item Zuluft changed or
Item Aussenluft changed
then
if(LuefterStufe.state.toString != "0" && LuefterStufe.state != NULL)
{
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;
}
val Number Aussenluft = (Aussenluft.state as Number)
val Number nDivisor = (Abluft.state as Number) - Aussenluft
val Number nFaktor = (Zuluft.state as Number) - Aussenluft
if(nDivisor == 0) {
logWarn("Wirkungsgrad","Aussentemperatur = Ablufttemperatur, Division durch 0!")
Wirkungsgrad.postUpdate(NULL)
} else
Wirkungsgrad.postUpdate((100/nDivisor*nFaktor).intValue)
}
end
Jetzt gibt es aber auch noch ein weitere Methode um einen Wirkungsgrad zu berechnen. Und zwar im Bezug auf die Fortluft:
Formel: tAbluft – tFortluft / tAbluft – tAußenluft
Wie sähe dann die rule aus?
etwa so?
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(!(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
val Number nFaktor = (Zuluft.state as Number) - Aussenluft
val Number nDivisor2 = (Abluft.state as Number) - Fort_Luft
if(nDivisor == 0) {
logWarn("Wirkungsgrad","Aussentemperatur = Ablufttemperatur, Division durch 0!")
Wirkungsgrad.postUpdate(NULL)
} else
Wirkungsgrad.postUpdate((100/nDivisor*nFaktor).intValue)
Wirkungsgrad2.postUpdate((100/nDivisor2*nFaktor).intValue)
}
end
Scheint zu funktionieren
2019-02-15 21:39:26.165 [vent.ItemStateChangedEvent] - Wirkungsgrad changed from 65 to 66
2019-02-15 21:39:26.173 [vent.ItemStateChangedEvent] - Wirkungsgrad2 changed from 80 to 81
Re: Prozentwert berechnen
Verfasst: 17. Feb 2019 22:13
von udo1toni
Ja, aber es gilt für nDivisor2 natürlich das gleiche wie für nDivisor. Wenn nDivisor2 wegen ungünstiger Bedingungen 0 wird (in diesem Fall also Abluft = Fortluft) wirst Du eine Division by Zero mit nachfolgender NullPointer Exception haben, das sind dann ca 50 Zeilen (eventuell sind es auch mehr) Log, nur weil Du diesen Fall nicht sauber abgefangen hast. Nicht, dass openHAB deshalb abstürzt, aber es ist einfach schlechter Stil.