Manual Average Calculation - Values have degree symbol

I’ve got three items in an average group. I think the automatic parsing is fine. But I also have a rule that manually calculates it.

The three items are:

d1mini_andoni_temperature equals 18.40
2019-05-06 08:35:03.075 [INFO ] [home.model.script.TemperatureAverage] - xiaomi_ht_01_master_temperature equals 18.729999542236328 ℃
2019-05-06 08:35:03.111 [INFO ] [home.model.script.TemperatureAverage] - xiaomi_ht_13_andoni_temperature equals 18.540000915527344 ℃

So in my rule, obviously the ℃ is causing an issue when creating an average.
I’ve tried a split on it, but it never seems to pick up the first space.

Here’s the entire rule

import org.openhab.core.library.types.DecimalTypes
import org.openhab.core.library.types.Number

rule "Get Average Temperature from g_temperature_average group"
when
        Item temperature_average_check received update or
        Item g_temperature_average changed
then
        logInfo("TemperatureAverage","Received Update from one of the g_temperature_average items")
        var counter = 0
        var Number totaltemp = 0
        g_temperature_average.members.forEach [s | logInfo("TemperatureAverage", s.name + " equals " + s.state.toString)]
        g_temperature_average.members.forEach[ g |
                logInfo("TemperatureAverage",String::format("Item %s State: %s", g.name, g.state.toString))
                if (g.state != null)
                {
                        counter = counter + 1
                        var tempTemp = g.state
                        logInfo("TemperatureAverage",String::format("String Item: %s State: %s thing: %s", g.name , tempTemp, g))

                        var tempTemp2 = tempTemp.toString.split(" ")
                        logInfo("TemperatureAverage",String::format("Split Item: %s State: %s ", g.name , tempTemp2[0]))
                        var Number currenttemperature = tempTemp
                        logInfo("TemperatureAverage",String::format("Item: %s State: %s ", g.name , currenttemperature.toString))
                        totaltemp = totaltemp + currenttemperature
                        logInfo("TemperatureAverage",String::format("Item: %d Total: %f ", counter,totaltemp))
                } //if (g.state != null)
        ]
        logInfo("TemperatureAverage","Calculating average")
        var  BigDecimal averageTemperature = totaltemp / counter
        logInfo("TemperatureAverage","Average calculated")
        logInfo("TemperatureAverage",String::format("Calcuated average of %d items.  Total Temperature: %f = Average of %f.", counter,totaltemp ,averageTemperature ))
        //temperature_average.postUpdate(new Number(averageTemperature))
        var String formattedString = String::format("%1$.1f",averageTemperature)
        temperature_average.postUpdate(formattedString)

        //Notify_Info.postUpdate(String::format("Calcuated average of %d items.  Total Temperature: %f = Average of %f.", counter,totaltemp ,averageTemperature ))
end

with it’s current logging looking like this:

2019-05-06 08:33:27.094 [INFO ] [home.model.script.TemperatureAverage] - xiaomi_ht_01_master_temperature equals 18.729999542236328 ℃
2019-05-06 08:33:27.150 [INFO ] [home.model.script.TemperatureAverage] - xiaomi_ht_13_andoni_temperature equals 18.540000915527344 ℃
2019-05-06 08:33:27.187 [INFO ] [home.model.script.TemperatureAverage] - Item d1mini_andoni_temperature State: 18.40
2019-05-06 08:33:27.221 [INFO ] [home.model.script.TemperatureAverage] - String Item: d1mini_andoni_temperature State: 18.40 thing: d1mini_andoni_temperature (Type=NumberItem, State=18.40, Label=Andoni Temperature, Category=temperature, Groups=[g_d1mini_andoni, g_temperature, g_temperature_average])
2019-05-06 08:33:27.329 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Get Average Temperature from g_temperature_average group': Could not invoke method: org.apache.commons.lang.StringUtils.split(java.lang.String,java.lang.String,int) on instance: null

So i can see it pick up the d1mini item (no split needed) and crash. Removing the split I get it to look through all 3 items, but the calculation is wrong

2019-05-06 08:32:17.539 [INFO ] [home.model.script.TemperatureAverage] - d1mini_andoni_temperature equals 18.40
2019-05-06 08:32:17.571 [INFO ] [home.model.script.TemperatureAverage] - xiaomi_ht_01_master_temperature equals 18.729999542236328 ℃
2019-05-06 08:32:17.607 [INFO ] [home.model.script.TemperatureAverage] - xiaomi_ht_13_andoni_temperature equals 18.540000915527344 ℃
2019-05-06 08:32:17.674 [INFO ] [home.model.script.TemperatureAverage] - Item d1mini_andoni_temperature State: 18.40
2019-05-06 08:32:17.706 [INFO ] [home.model.script.TemperatureAverage] - String Item: d1mini_andoni_temperature State: 18.40 thing: d1mini_andoni_temperature (Type=NumberItem, State=18.40, Label=Andoni Temperature, Category=temperature, Groups=[g_d1mini_andoni, g_temperature, g_temperature_average])
2019-05-06 08:32:17.789 [INFO ] [home.model.script.TemperatureAverage] - Split Item: d1mini_andoni_temperature State: 18.40
2019-05-06 08:32:17.825 [INFO ] [home.model.script.TemperatureAverage] - Item: d1mini_andoni_temperature State: 18.40
2019-05-06 08:32:17.859 [INFO ] [home.model.script.TemperatureAverage] - Item: 1 Total: 18.400000
2019-05-06 08:32:17.887 [INFO ] [home.model.script.TemperatureAverage] - Item xiaomi_ht_01_master_temperature State: 18.729999542236328 ℃
2019-05-06 08:32:17.925 [INFO ] [home.model.script.TemperatureAverage] - String Item: xiaomi_ht_01_master_temperature State: 18.729999542236328 ℃ thing: xiaomi_ht_01_master_temperature (Type=NumberItem, State=18.729999542236328 ℃, Label=Master Temperature, Category=temperature, Groups=[g_xiaomi_ht_master, g_temperature, g_temperature_average])
2019-05-06 08:32:18.022 [INFO ] [home.model.script.TemperatureAverage] - Split Item: xiaomi_ht_01_master_temperature State: 18.729999542236328 ℃
2019-05-06 08:32:18.064 [INFO ] [home.model.script.TemperatureAverage] - Item: xiaomi_ht_01_master_temperature State: 18.729999542236328 ℃
2019-05-06 08:32:18.104 [INFO ] [home.model.script.TemperatureAverage] - Item: 2 Total: 310.280000
2019-05-06 08:32:18.133 [INFO ] [home.model.script.TemperatureAverage] - Item xiaomi_ht_13_andoni_temperature State: 18.540000915527344 ℃
2019-05-06 08:32:18.171 [INFO ] [home.model.script.TemperatureAverage] - String Item: xiaomi_ht_13_andoni_temperature State: 18.540000915527344 ℃ thing: xiaomi_ht_13_andoni_temperature (Type=NumberItem, State=18.540000915527344 ℃, Label=Andoni Temperature, Category=temperature, Groups=[g_xiaomi_ht_andoni, g_temperature, g_temperature_average])
2019-05-06 08:32:18.270 [INFO ] [home.model.script.TemperatureAverage] - Split Item: xiaomi_ht_13_andoni_temperature State: 18.540000915527344 ℃
2019-05-06 08:32:18.336 [INFO ] [home.model.script.TemperatureAverage] - Item: xiaomi_ht_13_andoni_temperature State: 18.540000915527344 ℃
2019-05-06 08:32:18.376 [INFO ] [home.model.script.TemperatureAverage] - Item: 3 Total: 601.970000

So it’s adding something weird with that degrees symbol.

Any ideas?

Are the xiaomi items defined with UoM ?

UoM?

Hmm the items file has:
Number:Temperature xiaomi_ht_01_master_temperature
Is that what that is?

So if I removed the :Temperature would that remove the symbol?

Most likely.

This will extract the numeric value from Number:Temperature

(temperatureItem.state as QuantityType<Number>).doubleValue

Seems to be the third time today for posting this

Ahh I did find a couple of posts about that…but I saw the quantity type, didn’t understand what it was and moved on.

@noppes123 removing the :Temperature part of it made my rule work as expected.

I saw a posting that I can’t find anymore where one can actually use QuantityType but it requires an import and I can’t find the import any more. Do you happen to know the package for the imports for this?

I’m really not sure. This stuff baffles me … why doesn’t (myItem.state as Number) just work?! :crazy_face:

Rules DSL is almost good enough at type conversions. I’ve avoided a lot of the UoM stuff because of all these quirks but the bindings have started to force me into using them. Thanks for the link! By searching skills are not working well for me recently.