Hallo Zusammen,
ich hab mich mal hingesetzt und alle möglichen Szenarien durchgespielt, bleibe aber irgendwie immer an dem Problem
QuantityType hängen.
Dazu habe ich zwei Items genommen. Ein Number Item und ein Item Quantity.
Code: Alles auswählen
Number CPU_Temp_num "CPU-OH2-Pi Temperatur [%.1f °C]" <temperature> (Chart_Sys_Temp)
Number:Temperature localCurrentTemperature "Current temperature [%.1f %unit%]" <temperature> (gOWM,gOWMOutlook) { channel="openweathermap:weather-and-forecast:api:local:current#temperature" }
Das Problem scheint sich in der Abfrage des Typs (instanceof) zu postulieren, bzw. danach, wenn der Item-Wert mit der Konstante (0, 5, 10) verglichen wird.
Hier mein Test-Rules-File:
Code: Alles auswählen
/*
rule "Temp_Stal_rule"
when
Item Dummyx changed to ON or
Item localCurrentTemperature changed
then
var nTempPrev = (localCurrentTemperature.previousState.state) as Number
logInfo("test","nTempPrev " + nTempPrev)
var nTemp = (localCurrentTemperature.state as Number).floatValue
logInfo("test","nTemp " + nTemp)
if(nTemp < 0) {
logInfo("test", "Stall Temperatur ist nun {}",nTemp)
}
end
// Stall_Temp mit Number Item
// Number CPU_Temp_num "CPU-OH2-Pi Temperatur [%.1f °C]" <temperature> (Chart_Sys_Temp)
rule "Temp_Stal1_rule"
when
Item CPU_Temp_num changed
then
logInfo("bot1", "Temperaturänderung erkannt.")
if(CPU_Temp_num.state instanceof Number) {
logInfo("bot1","Temperaturstatus ist vom Typ Number.") //ist das nicht der Fall, wird auch nichts ausgeführt
var Number nTemp = CPU_Temp_num.state as Number
var Number nTempPrev = previousState as Number
logInfo("bot1", "Neuer Wert: " + nTemp)
logInfo("bot1", "Letzter Wert: " + nTempPrev)
if(nTemp <= 0 && nTempPrev > 0) {
logInfo("bot1", "Temperatur unter 0")
//sendTelegram("bot1", "Stall Temperatur ist nun {}",nTemp)
}
if(nTemp <= -5 && nTempPrev > -5) {
logInfo("bot1", "Temperatur unter -5")
//sendTelegram("bot1", "Stall Temperatur ist nun {}",nTemp)
}
if(nTemp <= -10 && nTempPrev > -10) {
logInfo("bot1", "Temperatur unter -10")
//sendTelegram("bot1", "Stall Temperatur ist nun {}",nTemp)
}
}
end
// Stall 1 mit QuantityItem
// Number:Temperature localCurrentTemperature "Current temperature [%.1f %unit%]" <temperature> (gOWM,gOWMOutlook) { channel="openweathermap:weather-and-forecast:api:local:current#temperature" }
rule "Temp_Stal11_rule"
when
Item localCurrentTemperature changed
then
logInfo("bot2", "Temperaturänderung erkannt")
var Number nTemp = localCurrentTemperature.state as QuantityType<Number>
var Number nTempPrev = previousState as QuantityType<Number>
logInfo("bot2", "Neuer Wert: " + nTemp)
logInfo("bot2", "Letzter Wert: " + nTempPrev)
if(localCurrentTemperature.state as QuantityType<Number>) {
logInfo("bot2","Temperaturstatus ist vom Typ QuantityType.") //ist das nicht der Fall, wird auch nichts ausgeführt
var Number nTemp = localCurrentTemperature.state as QuantityType<Number>
var Number nTempPrev = previousState as QuantityType<Number>
logInfo("bot2", "Neuer Wert: " + nTemp)
logInfo("bot2", "Letzter Wert: " + nTempPrev)
if(nTemp <= 0 && nTempPrev > 0) {
logInfo("bot2", "Temperatur unter 0")
//sendTelegram("bot2", "Stall Temperatur ist nun {}",nTemp)
}
if(nTemp <= -5 && nTempPrev > -5) {
logInfo("bot2", "Temperatur unter -5")
//sendTelegram("bot2", "Stall Temperatur ist nun {}",nTemp)
}
if(nTemp <= -10 && nTempPrev > -10) {
logInfo("bot2", "Temperatur unter -10")
//sendTelegram("bot2", "Stall Temperatur ist nun {}",nTemp)
}
}
end
rule "Temp_Stal111_rule"
when
Item localCurrentTemperature changed
then
logInfo("bot3", "Temperaturänderung erkannt.")
if(localCurrentTemperature.state instanceof Number) {
logInfo("bot3","Temperaturstatus ist vom Typ Number.") //ist das nicht der Fall, wird auch nichts ausgeführt
var Number nTemp = localCurrentTemperature.state as Number
var Number nTempPrev = previousState as Number
logInfo("bot3", "Neuer Wert: " + nTemp)
logInfo("bot3", "Letzter Wert: " + nTempPrev)
if(nTemp <= 0 && nTempPrev > 0) {
logInfo("bot3", "Temperatur unter 0")
//sendTelegram("bot3", "Stall Temperatur ist nun {}",nTemp)
}
if(nTemp <= -5 && nTempPrev > -5) {
logInfo("bot3", "Temperatur unter -5")
//sendTelegram("bot3", "Stall Temperatur ist nun {}",nTemp)
}
if(nTemp <= -10 && nTempPrev > -10) {
logInfo("bot3", "Temperatur unter -10")
//sendTelegram("bot3", "Stall Temperatur ist nun {}",nTemp)
}
}
end
rule "Temp_Stal1111_rule"
when
Item localCurrentTemperature changed
then
logInfo("bot4", "Temperaturänderung erkannt.")
if(localCurrentTemperature.state instanceof Number) {
logInfo("bot4","Temperaturstatus ist vom Typ Number.") //ist das nicht der Fall, wird auch nichts ausgeführt
var Number nTemp = localCurrentTemperature.state as Number
var Number nTempPrev = previousState as Number
logInfo("bot4", "Neuer Wert: " + nTemp)
logInfo("bot4", "Letzter Wert: " + nTempPrev)
if(nTemp <= 0 && nTempPrev > 0) {
logInfo("bot4", "Temperatur unter 0")
//sendTelegram("bot4", "Stall Temperatur ist nun {}",nTemp)
}
if(nTemp <= -5 && nTempPrev > -5) {
logInfo("bot4", "Temperatur unter -5")
//sendTelegram("bot4", "Stall Temperatur ist nun {}",nTemp)
}
if(nTemp <= -10 && nTempPrev > -10) {
logInfo("bot4", "Temperatur unter -10")
//sendTelegram("bot4", "Stall Temperatur ist nun {}",nTemp)
}
}
end
*/
// Stall mit QuantityItem
// Number:Temperature localCurrentTemperature "Current temperature [%.1f %unit%]" <temperature> (gOWM,gOWMOutlook) { channel="openweathermap:weather-and-forecast:api:local:current#temperature" }
rule "Temp_Stal_x_rule"
when
Item Dummyx changed to ON or
Item localCurrentTemperature changed
then
var nTempPrev = (localCurrentTemperature.previousState.state) as Number
logInfo("bot5","nTempPrev " + nTempPrev)
var nTemp = (localCurrentTemperature.state as Number).floatValue
logInfo("bot5","nTemp " + nTemp)
if(nTemp < 0) {
logInfo("bot5", "Stall Temperatur ist nun {}",nTemp)
}
//erster If-Teil
//if(localCurrentTemperature.state as QuantityType<Number>) {
if(localCurrentTemperature.state instanceof QuantityType) {
/* if(localCurrentTemperature.state instanceof QuantityType) {
Es wird diese Meldung im Logger ausgegeben:
2019-02-06 16:03:57.650 [INFO ] [el.core.internal.ModelRepositoryImpl] - Validation issues found in configuration model 'stall_temp.rules', using it anyway:
QuantityType is a raw type. References to generic type QuantityType<T> should be parameterized
Aber auch das Anhängen von <Temperature> oder <Number> bringt Warnungen
*/
logInfo("bot5","Temperaturstatus ist vom Typ QuantityType.") //ist das nicht der Fall, wird auch nichts ausgeführt
var Number nTemp = localCurrentTemperature.state as QuantityType<Number>
var Number nTempPrev = previousState as QuantityType<Number>
logInfo("bot5", "Neuer Wert: " + nTemp)
logInfo("bot5", "Letzter Wert: " + nTempPrev)
if(nTemp <= 0 && nTempPrev > 0) {
logInfo("bot5", "Temperatur unter 0")
//sendTelegram("bot5", "Stall Temperatur ist nun {}",nTemp)
}
if(nTemp <= -5 && nTempPrev > -5) {
logInfo("bot5", "Temperatur unter -5")
//sendTelegram("bot5", "Stall Temperatur ist nun {}",nTemp)
}
if(nTemp <= -10 && nTempPrev > -10) {
logInfo("bot5", "Temperatur unter -10")
//sendTelegram("bot5", "Stall Temperatur ist nun {}",nTemp)
}
}
//zweiter If-Teil
if(localCurrentTemperature.state instanceof Number) {
logInfo("bot5","Temperaturstatus ist vom Typ Number.") //ist das nicht der Fall, wird auch nichts ausgeführt
var Number nTemp = (localCurrentTemperature.state as Number).floatValue
var Number nTempPrev = (previousState as Number).floatValue
logInfo("bot5", "Neuer Wert-Float: " + nTemp)
logInfo("bot5", "Letzter Wert-Float: " + nTempPrev)
if(nTemp <= 0 && nTempPrev > 0) {
logInfo("bot5", "Temperatur unter 0")
//sendTelegram("bot5", "Stall Temperatur ist nun {}",nTemp)
}
if(nTemp <= -5 && nTempPrev > -5) {
logInfo("bot5", "Temperatur unter -5")
//sendTelegram("bot5", "Stall Temperatur ist nun {}",nTemp)
}
if(nTemp <= -10 && nTempPrev > -10) {
logInfo("bot5", "Temperatur unter -10")
//sendTelegram("bot5", "Stall Temperatur ist nun {}",nTemp)
}
}
end
// Stall mit Number Item
// Number CPU_Temp_num "CPU-OH2-Pi Temperatur [%.1f °C]" <temperature> (Chart_Sys_Temp)
rule "Temp_Stal_y_rule"
when
Item Dummyx changed to ON or
Item CPU_Temp_num changed
then
var nTempPrev = (CPU_Temp_num.previousState.state) as Number
logInfo("bot6","nTempPrev " + nTempPrev)
var nTemp = (CPU_Temp_num.state as Number).floatValue
logInfo("bot6","nTemp " + nTemp)
// If-Clause ohne Type-Abfrage
if(nTemp < 0) {
logInfo("bot6", "Stall Temperatur ist nun {}",nTemp)
}
// erste If-Clause mit Quantity
if(CPU_Temp_num.state instanceof QuantityType) {
logInfo("bot6","Temperaturstatus ist vom Typ Quantity.") //ist das nicht der Fall, wird auch nichts ausgeführt
var Number nTemp = CPU_Temp_num.state as Number
var Number nTempPrev = previousState as Number
logInfo("bot6", "Neuer Wert: " + nTemp)
logInfo("bot6", "Letzter Wert: " + nTempPrev)
if(nTemp <= 0 && nTempPrev > 0) {
logInfo("bot6", "Temperatur unter 0")
//sendTelegram("bot6", "Stall Temperatur ist nun {}",nTemp)
}
if(nTemp <= -5 && nTempPrev > -5) {
logInfo("bot6", "Temperatur unter -5")
//sendTelegram("bot6", "Stall Temperatur ist nun {}",nTemp)
}
if(nTemp <= -10 && nTempPrev > -10) {
logInfo("bot6", "Temperatur unter -10")
//sendTelegram("bot6", "Stall Temperatur ist nun {}",nTemp)
}
}
// zweite If-Clause mit Number
if(CPU_Temp_num.state instanceof Number) {
logInfo("bot6","Temperaturstatus ist vom Typ Number.") //ist das nicht der Fall, wird auch nichts ausgeführt
var Number nTemp = CPU_Temp_num.state as Number
var Number nTempPrev = previousState as Number
logInfo("bot6", "Neuer Wert: " + nTemp)
logInfo("bot6", "Letzter Wert: " + nTempPrev)
if(nTemp <= 0 && nTempPrev > 0) {
logInfo("bot6", "Temperatur unter 0")
//sendTelegram("bot6", "Stall Temperatur ist nun {}",nTemp)
}
if(nTemp <= -5 && nTempPrev > -5) {
logInfo("bot6", "Temperatur unter -5")
//sendTelegram("bot6", "Stall Temperatur ist nun {}",nTemp)
}
if(nTemp <= -10 && nTempPrev > -10) {
logInfo("bot6", "Temperatur unter -10")
//sendTelegram("bot6", "Stall Temperatur ist nun {}",nTemp)
}
}
end
Nicht erschrecken, die meisten Tests sind auskommentiert. Lediglich die beiden Letzten Rules (Temp_Stal_x_rule und Temp_Stal_y_rule) sind noch interessant. Einmal mit Abfrage auf Quantity (erste grosse If-Clause) und einmal auf Number (zweite grosse If-Clause). Wobei für Matze die zweite (Temp_Stal_y_rule mit "bot6" Log) interessanter sein dürfte, da er ja ein Number-Item hat.
Es sollten dann solche, oder ähnliche Meldungen i,m Logger erscheinen:
Code: Alles auswählen
2019-02-06 16:59:30.340 [INFO ] [el.core.internal.ModelRepositoryImpl] - Validation issues found in configuration model 'stall_temp.rules', using it anyway:
QuantityType is a raw type. References to generic type QuantityType<T> should be parameterized
QuantityType is a raw type. References to generic type QuantityType<T> should be parameterized
2019-02-06 16:59:30.460 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'stall_temp.rules'
2019-02-06 17:03:23.740 [INFO ] [.eclipse.smarthome.model.script.bot6] - nTempPrev 49.38
2019-02-06 17:03:23.748 [INFO ] [.eclipse.smarthome.model.script.bot6] - nTemp 49.38
2019-02-06 17:03:23.756 [INFO ] [.eclipse.smarthome.model.script.bot6] - Temperaturstatus ist vom Typ Number.
2019-02-06 17:03:23.762 [INFO ] [.eclipse.smarthome.model.script.bot6] - Neuer Wert: 49.38
2019-02-06 17:03:23.768 [INFO ] [.eclipse.smarthome.model.script.bot6] - Letzter Wert: 48.31
2019-02-06 17:03:40.261 [INFO ] [.eclipse.smarthome.model.script.bot5] - nTempPrev -1.4
2019-02-06 17:03:40.269 [INFO ] [.eclipse.smarthome.model.script.bot5] - nTemp -15.0
2019-02-06 17:03:40.275 [INFO ] [.eclipse.smarthome.model.script.bot5] - Stall Temperatur ist nun -15.0
2019-02-06 17:03:40.280 [INFO ] [.eclipse.smarthome.model.script.bot5] - Temperaturstatus ist vom Typ QuantityType.
2019-02-06 17:03:40.287 [INFO ] [.eclipse.smarthome.model.script.bot5] - Neuer Wert: -15.0 °C
2019-02-06 17:03:40.293 [INFO ] [.eclipse.smarthome.model.script.bot5] - Letzter Wert: -6.0 °C
2019-02-06 17:03:40.319 [INFO ] [.eclipse.smarthome.model.script.bot5] - Temperaturstatus ist vom Typ Number.
2019-02-06 17:03:40.330 [INFO ] [.eclipse.smarthome.model.script.bot5] - Neuer Wert-Float: -15.0
2019-02-06 17:03:40.335 [INFO ] [.eclipse.smarthome.model.script.bot5] - Letzter Wert-Float: -6.0
2019-02-06 17:03:40.355 [INFO ] [.eclipse.smarthome.model.script.bot5] - Temperatur unter -10
2019-02-06 17:04:24.055 [INFO ] [.eclipse.smarthome.model.script.bot5] - nTempPrev -1.4
2019-02-06 17:04:24.067 [INFO ] [.eclipse.smarthome.model.script.bot5] - nTemp -8.0
Die inneren If-Statements habe ich nicht genauer betrachtet.
Aber wenn ich das Logging von Matze betrachte, läuft das letzte Rule_Beispiel von mamoel (ohne If's) ja, was mich in meiner Vermutung des Problems mit der äusseren If-Klausel bestärkt.
Hoffe ihr könnt damit was anfangen.
P.S. Beim Testen bitte die Item-Namen nicht vergessen zu ändern
