[SOLVED] Prozentwert berechnen
- PeterA
- Beiträge: 1052
- Registriert: 8. Feb 2019 12:12
Re: Prozentwert berechnen
Hallo Peter,
ja die vermaledeiten Klammern
Aber jetzt funktioniert es! [SOLVED]!!!!
Vielen Dank Udo und Dir!
ja die vermaledeiten Klammern
Aber jetzt funktioniert es! [SOLVED]!!!!
Vielen Dank Udo und Dir!
- OpenHab 2.4
#PWRUP
#PWRUP
- PeterA
- Beiträge: 1052
- Registriert: 8. Feb 2019 12:12
Re: [SOLVED] Prozentwert berechnen
Hallo zusammen,
nun habe wieder eine Frage zu meiner Berechnungsrule.
Hier die Rule noch mal:
Nach einem Restart oder Reboot kommt folgendes im Log:
dann:
Und erst wenn ich die LuefterStufe einmal verändere:
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
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
Code: Alles auswählen
2019-03-06 17:00:13.890 [vent.ItemStateChangedEvent] - LuefterStufe changed from NULL to 1
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
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
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
#PWRUP
- udo1toni
- Beiträge: 13859
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: [SOLVED] Prozentwert berechnen
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:
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.
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
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
- PeterA
- Beiträge: 1052
- Registriert: 8. Feb 2019 12:12
Re: [SOLVED] Prozentwert berechnen
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.
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
#PWRUP
- udo1toni
- Beiträge: 13859
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: [SOLVED] Prozentwert berechnen
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.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.
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: [SOLVED] Prozentwert berechnen
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. Und hier nochmal die Rule dazu:
Kann das wilde hin und her verhindert werden?
Gruß
Peter
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. 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
Gruß
Peter
- OpenHab 2.4
#PWRUP
#PWRUP