Slowly getting the hang of it. Since it’s my first “bigger” rule, is it OK to ask for any kind of improvements/problems that it might have? It’s running fine now, it seems just sometimes a bit slow (especially for the first time after it was edited). But that might be due to the limitations of the raspberry pi as well.
For reference a picture of what it does - color-coding weather and forecast on my living room nanoleaf installation.
import java.util.Map
import java.util.ArrayList
val tempRange_min = -2
val tempRange_max = 35
val tempHue_min = 600
val tempHue_max = 300
val funcMap= [ Number x, Number in_min, Number in_max, Number out_min, Number out_max |
((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
]
val Map<Number, HSBType> mapUvIndexColors = newHashMap(1 -> HSBType::fromRGB(00, 100, 00),
2 -> HSBType::fromRGB(0, 140, 0),
3 -> HSBType::fromRGB(0, 255, 0),
4 -> HSBType::fromRGB(140, 245, 0),
5 -> HSBType::fromRGB(255, 255, 0),
6 -> HSBType::fromRGB(255, 127, 0),
7 -> HSBType::fromRGB(255, 90, 0),
8 -> HSBType::fromRGB(255, 0, 0),
9 -> HSBType::fromRGB(255, 0, 70),
10-> HSBType::fromRGB(230, 0, 108),
11-> HSBType::fromRGB(230, 0, 255)
)
rule "uvIndex"
when
Item switchNanoWeather changed to ON
then
var int currentUvIndex = (UVIndex_Current_UVIndex.state as Number + 0.5).intValue
var ArrayList<Number> alTemperatures = newArrayList( Wetterbericht_Current_ApparentTemperatureNumber.state as Number,
Wetterbericht_Current_OutdoorTemperatureNumber.state as Number,
Wetterbericht_ForecastHours03_ForecastedTemperatureNumber.state as Number,
Wetterbericht_ForecastHours06_ForecastedTemperatureNumber.state as Number,
Wetterbericht_ForecastHours09_ForecastedTemperatureNumber.state as Number,
Wetterbericht_ForecastHours12_ForecastedTemperatureNumber.state as Number,
Wetterbericht_ForecastHours15_ForecastedTemperatureNumber.state as Number,
Wetterbericht_ForecastHours18_ForecastedTemperatureNumber.state as Number,
Wetterbericht_ForecastHours21_ForecastedTemperatureNumber.state as Number,
Wetterbericht_ForecastHours24_ForecastedTemperatureNumber.state as Number
)
var ArrayList<HSBType> alTempColors = newArrayList
var ArrayList<Number> alCloudiness = newArrayList( Wetterbericht_Current_Cloudiness.state as Number,
Wetterbericht_ForecastHours03_ForecastedCloudiness.state as Number,
Wetterbericht_ForecastHours06_ForecastedCloudiness.state as Number,
Wetterbericht_ForecastHours24_ForecastedCloudiness.state as Number
)
var ArrayList<HSBType> alCloudinessColors = newArrayList
var ArrayList<Number> alWind = newArrayList( Wetterbericht_Current_WindSpeed.state as Number ,
Wetterbericht_ForecastHours03_ForecastedWindSpeed.state as Number,
Wetterbericht_ForecastHours06_ForecastedWindSpeed.state as Number,
Wetterbericht_ForecastHours24_ForecastedWindSpeed.state as Number
)
var ArrayList<HSBType> alWindColors = newArrayList
var ArrayList<Number> alRain = newArrayList( Wetterbericht_ForecastHours03_ForecastedRain.state as Number,
Wetterbericht_ForecastHours06_ForecastedRain.state as Number,
Wetterbericht_ForecastHours09_ForecastedRain.state as Number,
Wetterbericht_ForecastHours12_ForecastedRain.state as Number,
Wetterbericht_ForecastHours15_ForecastedRain.state as Number,
Wetterbericht_ForecastHours18_ForecastedRain.state as Number,
Wetterbericht_ForecastHours21_ForecastedRain.state as Number,
Wetterbericht_ForecastHours24_ForecastedRain.state as Number
)
var ArrayList<Number> alSnow = newArrayList( Wetterbericht_ForecastHours03_ForecastedSnow.state as Number,
Wetterbericht_ForecastHours06_ForecastedSnow.state as Number,
Wetterbericht_ForecastHours09_ForecastedSnow.state as Number,
Wetterbericht_ForecastHours12_ForecastedSnow.state as Number,
Wetterbericht_ForecastHours15_ForecastedSnow.state as Number,
Wetterbericht_ForecastHours18_ForecastedSnow.state as Number,
Wetterbericht_ForecastHours21_ForecastedSnow.state as Number,
Wetterbericht_ForecastHours24_ForecastedSnow.state as Number
)
if(currentUvIndex > 11) currentUvIndex=11
var int i =-1
while((i+=1)<alTemperatures.size)
{
if(alTemperatures.get(i) < tempRange_min) alTemperatures.set(i, tempRange_min)
if(alTemperatures.get(i) > tempRange_max) alTemperatures.set(i, tempRange_max)
alTempColors.add(new HSBType(new DecimalType(((funcMap.apply(alTemperatures.get(i), tempRange_min, tempRange_max, tempHue_min, tempHue_max) as Number).intValue) % 360), new PercentType(100), new PercentType(100)))
}
i =-1
while((i+=1)<alCloudiness.size)
{
alCloudinessColors.add(new HSBType(new DecimalType(funcMap.apply(alCloudiness.get(i).intValue, 0, 100, 210, 190)), new PercentType(funcMap.apply(alCloudiness.get(i).intValue, 0, 100, 100, 0)), new PercentType(funcMap.apply(alCloudiness.get(i).intValue, 0, 100, 100, 70))))
logInfo("cloud", "i {} -> {}", i, alCloudiness.get(i).intValue)
}
i =-1
while((i+=1)<alWind.size)
{
if(alWind.get(i) < 33)
{
alWindColors.add(new HSBType(new DecimalType(funcMap.apply(alWind.get(i).intValue, 0, 33, 140, 0)), new PercentType(100), new PercentType(100)))
}else{
alWindColors.add(new HSBType(new DecimalType(330), new PercentType(100), new PercentType(100)))
}
logInfo("wind", "i {} -> {}", i, alWind.get(i).intValue)
}
var totalRain6 = 0
var totalRain24 = 0
var Boolean willItSnow = false
while((i+=1)<alRain.size)
{
if(i<2) totalRain6 += alRain.get(i).intValue
totalRain24 += alRain.get(i).intValue
if(alSnow.get(1).intValue > 0) willItSnow = true
}
logInfo("rainNsnow", "rain6 -> {}, rain24 -> {}, WillItSnow? {}", totalRain6, totalRain24, willItSnow)
//Current uvIndex
LightPanel0101_Color.sendCommand(mapUvIndexColors.get(currentUvIndex))
//Current temp and what it feels like below
LightPanel0202_Color.sendCommand(alTempColors.get(0))
LightPanel0201_Color.sendCommand(alTempColors.get(1))
//Temperature forecasts
LightPanel0301_Color.sendCommand(alTempColors.get(2))
LightPanel0401_Color.sendCommand(alTempColors.get(3))
LightPanel0502_Color.sendCommand(alTempColors.get(4))
LightPanel0501_Color.sendCommand(alTempColors.get(5))
LightPanel0601_Color.sendCommand(alTempColors.get(6))
LightPanel0701_Color.sendCommand(alTempColors.get(7))
LightPanel0802_Color.sendCommand(alTempColors.get(8))
LightPanel0903_Color.sendCommand(alTempColors.get(9))
//Current Cloudiness
LightPanel0102_Color.sendCommand(alCloudinessColors.get(0))
//Cloudiness Forecast
LightPanel1001_Color.sendCommand(alCloudinessColors.get(1))
LightPanel1101_Color.sendCommand(alCloudinessColors.get(2))
LightPanel1201_Color.sendCommand(alCloudinessColors.get(3))
//Current Wind Speed
LightPanel0103_Color.sendCommand(alWindColors.get(0))
//Wind Speed Forecast
LightPanel0801_Color.sendCommand(alWindColors.get(1))
LightPanel0902_Color.sendCommand(alWindColors.get(2))
LightPanel0901_Color.sendCommand(alWindColors.get(3))
//Rain Forecast
//240 / 1-10
//300 - 330 / 10-45
// 0 -> snow
if(totalRain6 < 1 && !willItSnow )
{
LightPanel0104_Color.sendCommand(new HSBType(new DecimalType(240), new PercentType(100), new PercentType(0)))
}else if(totalRain6 < 10 && !willItSnow){
}else if(totalRain6 < 45 && !willItSnow){
LightPanel0104_Color.sendCommand(new HSBType(new DecimalType(funcMap.apply(totalRain6, 10, 45, 300, 330)), new PercentType(100), new PercentType(100)))
}else{
LightPanel0104_Color.sendCommand(new HSBType(new DecimalType(0), new PercentType(100), new PercentType(0)))
}
if(totalRain24 < 1 && !willItSnow )
{
LightPanel0904_Color.sendCommand(new HSBType(new DecimalType(240), new PercentType(100), new PercentType(0)))
}else if(totalRain24 < 10 && !willItSnow){
}else if(totalRain24 < 45 && !willItSnow){
LightPanel0904_Color.sendCommand(new HSBType(new DecimalType(funcMap.apply(totalRain24, 10, 45, 300, 330)), new PercentType(100), new PercentType(100)))
}else{
LightPanel0904_Color.sendCommand(new HSBType(new DecimalType(0), new PercentType(100), new PercentType(0)))
}
end