[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 Peter,
ja die vermaledeiten Klammern :)
Aber jetzt funktioniert es! [SOLVED]!!!!
Vielen Dank Udo und Dir!
- OpenHab 2.4
#PWRUP

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

Re: [SOLVED] Prozentwert berechnen

Beitrag von PeterA »

Hallo zusammen,

nun habe wieder eine Frage zu meiner Berechnungsrule.
Hier die Rule noch mal:

Code: Alles auswählen

// Beginn der Datei
// globale Variablen
var Long lLStufe

rule "luefter geändert"
when
    Item LuefterStufe changed
then
    lLStufe = now.millis
end

rule "berechne Wirkungsgrad"
when
    Item Abluft changed or
    Item Zuluft changed or
    Item Aussenluft changed
then
    if(lLStufe + 15*60*1000 < now.millis && LuefterStufe.state.toString != "0"){
    //Lüfter läuft bereits mindestens 15 Minuten auf der aktuellen Stufe

       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 //Wert fuer Berechung gem. Westaflex
       val Number nFaktor = (Zuluft.state as Number) - Aussenluft //Wert fuer Berechung gem. Westaflex
       if(nDivisor == 0) {
           logWarn("Wirkungsgrad","Aussentemperatur = Ablufttemperatur, Division durch 0!")
           Wirkungsgrad.postUpdate(NULL)
       } else
           Wirkungsgrad.postUpdate((100*nFaktor/nDivisor).intValue) //Berechung gem. Westaflex
          
 }
end
Nach einem Restart oder Reboot kommt folgendes im Log:

Code: Alles auswählen

2019-03-06 17:00:13.890 [vent.ItemStateChangedEvent] - LuefterStufe changed from NULL to 1
dann:

Code: Alles auswählen

2019-03-06 17:00:32.246 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'berechne Wirkungsgrad': An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.LongExtensions.operator_plus(long,int) on instance: null
Und erst wenn ich die LuefterStufe einmal verändere:

Code: Alles auswählen

2019-03-06 17:00:48.183 [ome.event.ItemCommandEvent] - Item 'LuefterStufe' received command 0
2019-03-06 17:00:48.202 [nt.ItemStatePredictedEvent] - LuefterStufe predicted to become 0
2019-03-06 17:00:48.216 [vent.ItemStateChangedEvent] - LuefterStufe changed from 1 to 0
2019-03-06 17:00:52.568 [ome.event.ItemCommandEvent] - Item 'LuefterStufe' received command 1
2019-03-06 17:00:52.575 [nt.ItemStatePredictedEvent] - LuefterStufe predicted to become 1
2019-03-06 17:00:52.590 [vent.ItemStateChangedEvent] - LuefterStufe changed from 0 to 1
Ist der Fehler weg.
Mit ist eigentlich klar wo her das kommt:

..."when
Item LuefterStufe changed
then
lLStufe = now.millis"

denn vom Zeitlichen Ablauf her bekommt die Rule den Change von NULL to 1 garnicht mit und dann kommt der Fehler.

Wie kann ich das lösen ?

Gruß
Peter
- OpenHab 2.4
#PWRUP

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

Re: [SOLVED] Prozentwert berechnen

Beitrag von udo1toni »

Das Problem ist hier, dass die Variable lLStufe noch nicht initialisiert ist. Das liegt aber nicht daran, dass die Rule nicht triggert. Ein Change ist ein Change, es spielt keine Rolle, ob der Ausgangswert nun NULL oder 0 oder sonstwas war, nur die Änderung zählt. Deshalb muss man allgemein in Rules, prüfen, ob der alte Status NULL war (die Variable previousState ist automatisch gesetzt, wenn die Rule wegen eines Change getriggert wurde).

Das Problem hier ist vermutlich, dass die Items für Abluft/Zuluft/Außenluft vor dem Item LuefterStufe gesetzt wird, das heißt, die Rule wurde noch nicht ausgeführt. Du kannst versuchen, das Symptom zu bekämpfen, indem Du der ersten Rule einen weiteren Trigger hinzufügst:

Code: Alles auswählen

rule "luefter geändert"
when
    System started or
    Item LuefterStufe changed
then
    lLStufe = now.millis
end
Damit wird die Rule jedesmal ausgeführt, wenn Du openHAB neu startest oder die *.rules Datei bearbeitest, in der die Rule liegt. Was natürlich dazu führt, dass auhc bei bereits laufender Anlage die Werte eine Zeit lang nicht aktualisiert werden. Irgendwas ist ja immer...

Alternativ könntest Du natürlich als erstes in der Rule prüfen, ob die Variable lLStufe != null ist und in diesem Fall auf now.minusMinutes(15) setzen, auf die Gefahr hin, dass dann doch (beim Neustart von openHAB kurz nach Änderung der Lüfterstufe) für einen kurzen Zeitraum falsche Werte angezeigt werden.

Code: Alles auswählen

if(lLStufe === null) lLStufe = now.minusMinute(15)
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: [SOLVED] Prozentwert berechnen

Beitrag von PeterA »

Hi Udo,
vielen Dank für den Tipp mit "System started" das scheint so zu passen.
Es kommt nun keine Fehlermeldung mehr.
Ausserdem musste ich die Pause bis zum Start der Berechnung sowieso auf 15min verändern, da erst ab diesem Zeitpunkt
die Werte der Anlage nach Wiederanlauf aussagekräftig sind.
- OpenHab 2.4
#PWRUP

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

Re: [SOLVED] Prozentwert berechnen

Beitrag von udo1toni »

Peter Aschinger hat geschrieben: 7. Mär 2019 20:28 Ausserdem musste ich die Pause bis zum Start der Berechnung sowieso auf 15min verändern, da erst ab diesem Zeitpunkt
die Werte der Anlage nach Wiederanlauf aussagekräftig sind.
Ja, aber das bezieht sich ja nur auf die Anlage, nicht auf openHAB. Wenn Du openHAB neu startest, dauert es halt 15 Minuten, bis das erste Mal Werte übermittelt werden, auch wenn Du die Anlage schon seit Stunden auf der gleichen Stufe laufen hast. Im Zweifel ist das zu verschmerzen.
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: [SOLVED] Prozentwert berechnen

Beitrag von PeterA »

Hallo Udo,

nun hätte ich noch eine Frage zu der Rule:
Wenn sich die Temperaturen angleichen, also zb. wie Heute. Aussenluft/Abluft und Zuluft alle so um die 19C
Dann beginnt der Wert des Wirkungsgrades stark zu "Springen" von 70% auf 350% und dann wieder auf -200% usw.
Im Log kommt keine Fehlermeldung aber im Chart sieht das sehr Wild aus.
chart.png
Und hier nochmal die Rule dazu:

Code: Alles auswählen

// Beginn der Datei
// globale Variablen
var Long lLStufe

rule "luefter geändert"
when
    System started or
    Item LuefterStufe changed
then
    lLStufe = now.millis
end

rule "berechne Wirkungsgrad"
when
    Item Abluft changed or
    Item Zuluft changed or
    Item Aussenluft changed
then
    if(lLStufe + 15*60*1000 < now.millis && LuefterStufe.state.toString != "0"){
    //Lüfter läuft bereits mindestens 15 Minuten auf der aktuellen Stufe

       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 //Wert fuer Berechung gem. Westaflex
       val Number nFaktor = (Zuluft.state as Number) - Aussenluft //Wert fuer Berechung gem. Westaflex
       if(nDivisor == 0) {
           logWarn("Wirkungsgrad","Aussentemperatur = Ablufttemperatur, Division durch 0!")
           Wirkungsgrad.postUpdate(NULL)
       } else
           Wirkungsgrad.postUpdate((100*nFaktor/nDivisor).intValue) //Berechung gem. Westaflex
          
 }
end
Kann das wilde hin und her verhindert werden?

Gruß
Peter
- OpenHab 2.4
#PWRUP

Antworten