[SOLVED] Prozentwert berechnen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: Prozentwert berechnen

Beitrag 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)
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 »

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!
- OpenHab 2.4
#PWRUP

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

Re: Prozentwert berechnen

Beitrag von udo1toni »

Bleibt zu hoffen, dass die Abluft nie auf 0 sinkt...
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 »

Das ist die Warme Abluft aus den Beheizten Räumen....das wird nie 0 sein 😁
- OpenHab 2.4
#PWRUP

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

Re: Prozentwert berechnen

Beitrag 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?
- OpenHab 2.4
#PWRUP

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

Re: Prozentwert berechnen

Beitrag 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.)
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 baue ich die Formel ein: (tZuluft - tAussen) / (tAbluft - tAussen) ?
- OpenHab 2.4
#PWRUP

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

Re: Prozentwert berechnen

Beitrag 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.
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 »

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
- OpenHab 2.4
#PWRUP

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

Re: Prozentwert berechnen

Beitrag 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.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten