Hi all
I have the following Rule running in my SetUp (OH 2.5.0.M3) on a RPi 3b
Rule:
import org.eclipse.smarthome.model.script.ScriptServiceUtil
var logCount = 8
val rulename = "owm_forecasting"
rule "owm forecasting"
when
Item Dummy4 changed to ON
or Item owmTriggerSwitch received command ON or
Item localLastMeasurement_00 changed
then
val day = -1
val day0 = 7 - (now.getHourOfDay / 3).intValue
val day1 = day0 + 8
val day2 = day1 + 8
val day3 = day2 + 8
val day4 = day3 + 8
val Number day5 = 40
var counter = 0
var daymin = 0
var daymax = 0
// var day_format = new DateTime().plusDays(0).toString("EE, dd.MMM") // initial formatted DateType
if( logCount == 8 ) logInfo(rulename,"TriggerItem ist {}: / previous State: {} / new State {}: ", triggeringItem.name,previousState, newState) // log every eigth time - means four hours - to show that rule is alive
while (counter <= 5) {
switch counter {
case 0 : {
daymin = day
daymax = day0
}
case 1 : {
daymin = day0
daymax = day1
}
case 2 : {
daymin = day1
daymax = day2
}
case 3 : {
daymin = day2
daymax = day3
}
case 4 : {
daymin = day3
daymax = day4
}
case 5 : {
daymin = day4
daymax = day5
}
}
// Temperature
// Determine of relevant Items per day and sort them in ascending sequence by value for MIN/MAX detection
var myTempItemList = gTemp.members.sortBy[state].filter[ i|Integer.parseInt(i.name.split("_").get(1)) > daymin && Integer.parseInt(i.name.split("_").get(1)) <= daymax ]
var Number sumTemp = 0
var avgTemp = 0
myTempItemList.forEach[ g|sumTemp = sumTemp + ((g.state as Number ).floatValue) ]
avgTemp = sumTemp / myTempItemList.size
ScriptServiceUtil.getItemRegistry.getItem("localDayTempAVG_"+counter).postUpdate(avgTemp) // store daily average-temperature
var Number vIndex = myTempItemList.size - 1 // Index for highest Temp-Value per day
var minTemp = myTempItemList.get(0) // lowest Temperture per day
var maxTemp = myTempItemList.get(vIndex) // highest Temperature per day
ScriptServiceUtil.getItemRegistry.getItem("localDayTempMin_"+counter).postUpdate(minTemp.state)
ScriptServiceUtil.getItemRegistry.getItem("localDayTempMax_"+counter).postUpdate(maxTemp.state)
// Rain
var myRainItemList = gRain.members.filter[ i|Integer.parseInt(i.name.split("_").get(1)) > daymin && Integer.parseInt(i.name.split("_").get(1)) <= daymax ]
var Number sumRain = 0
myRainItemList.forEach[ g|sumRain = sumRain + (((g.state as Number ).floatValue)*3) ]
ScriptServiceUtil.getItemRegistry.getItem("localDayRainTotal_"+counter).postUpdate(sumRain)
// Snow
var mySnowItemList = gSnow.members.filter[ i| Integer.parseInt(i.name.split("_").get(1)) > daymin && Integer.parseInt(i.name.split("_").get(1)) <= daymax ]
var Number sumSnow = 0
mySnowItemList.forEach[ g|sumSnow = sumSnow + (((g.state as Number ).floatValue)*3) ]
ScriptServiceUtil.getItemRegistry.getItem("localDaySnowTotal_"+counter).postUpdate(sumSnow)
// Humidity
var myHumItemList = gHum.members.filter[ i| Integer.parseInt(i.name.split("_").get(1)) > daymin && Integer.parseInt(i.name.split("_").get(1)) <= daymax ]
var Number sumHum = 0
var avgHum = 0
myHumItemList.forEach[ g|sumHum = sumHum + ((g.state as Number ).floatValue) ]
avgHum = sumHum / myHumItemList.size
ScriptServiceUtil.getItemRegistry.getItem("localDayHumAVG_"+counter).postUpdate(avgHum)
// Pressure
var myPresItemList = gPres.members.filter[ i| Integer.parseInt(i.name.split("_").get(1)) > daymin && Integer.parseInt(i.name.split("_").get(1)) <= daymax ]
var Number sumPres = 0
var avgPres = 0
myPresItemList.forEach[ g|sumPres = sumPres + ((g.state as Number ).floatValue) ]
avgPres = sumPres / myPresItemList.size
ScriptServiceUtil.getItemRegistry.getItem("localDayPressureAVG_"+counter).postUpdate(avgPres)
//
// ++++++++++++++++++++++++++++++++++++++++ Concatenate for sitemap presentation ++++++++++++++++++++++++++++++++++++++++++++++++++++
ScriptServiceUtil.getItemRegistry.getItem("localDayTempForecast_"+counter).postUpdate( new DateTime().plusDays(counter).toString("EE, dd.MMM") + ": min/max/avg: " + " / " +
ScriptServiceUtil.getItemRegistry.getItem("localDayTempMin_"+counter).state.format("%.1f").toString + " / " +
ScriptServiceUtil.getItemRegistry.getItem("localDayTempMax_"+counter).state.format("%.1f").toString + " / " +
ScriptServiceUtil.getItemRegistry.getItem("localDayTempAVG_"+counter).state.format("%.1f").toString )
counter++
} // End While
if( logCount >= 8 ) {
logInfo (rulename, "End of Process - Aggregation daily Measures: " + logCount) // log every eigth time - means four hours - to show that rule is alive
logCount = 0
logCount = logCount + 1
}
else {
logCount = logCount +1
}
end
since some days. Last night I suddenly found the following error-message in the logger twice:
[ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'owm forecasting': Comparison method violates its general contract!
Before and after that I just get my normal logInfo:
2019-09-19 08:41:35.899 [INFO ] [arthome.model.script.owm_forecasting] - TriggerItem ist localLastMeasurement_00: / previous State: 2019-09-19T08:11:32.000+0200 / new State 2019-09-19T08:41:35.000+0200:
2019-09-19 08:41:43.785 [INFO ] [arthome.model.script.owm_forecasting] - End of Process - Aggregation daily Measures: 8
I have no idea what causes the error, maybe it’s the handling of the Groups.
Is there someone who can help me, or point me to the right direction ?
Thx in advance
Peter