Wrong results with a subtraction (dsl rule)

Hello everyone,

i have a strange behavior of my OH3 when I want to calculate something in a rule. I just want to calculate the difference in a quantity of energy (diff = currently - energy at the time 0:00:00)

Items:

Number:Energy heatMeter_Heating "Heat meter heating [%s kWh]" <Energy> (gHeatpump) { channel="luxtronikheatpump:heatpump:heatpump:heatMeterHeating" }

Number:Energy heatMeter_Heating_today "Heat meter heating today [%.4s kWh]" <Energy> (gHeatpump) 
Number:Energy heatMeter_Heating_today_1000 "Heat meter Hot Water today  [%.4s kWh]" <Energy> (gHeatpump) 
Number:Energy heatMeter_Heating_today_max "Heat meter heating today [%.4s kWh]" <Energy> (gHeatpump) 
Number:Energy heatMeter_Heating_today_min "Heat meter heating today [%.4s kWh]" <Energy> (gHeatpump) 

For better understanding, I first set all values ​​to 1 and use a new variables for each “possibility”.

Rules:

// all values 1
        heatMeter_Heating_today.postUpdate(1)
        heatMeter_Heating_today_max.postUpdate(1)
        heatMeter_Heating_today_min.postUpdate(1)
        heatMeter_Heating_today_1000.postUpdate(1)
        heatMeter_Heating_today_diff.postUpdate(1)

        // my favorite code
        heatMeter_Heating_today.postUpdate(((heatMeter_Heating.state as Number) - (heatMeter_Heating.minimumSince(now.with(LocalTime.of(0,0,0,0)), "influxdb").state))/1)
        heatMeter_Heating_today_1000.postUpdate(((heatMeter_Heating.state as Number) - (heatMeter_Heating.minimumSince(now.with(LocalTime.of(0,0,0,0)), "influxdb").state))/10000000)
   
        // step by step
        var Number max = (heatMeter_Heating.state as Number)
        var Number min = ((heatMeter_Heating.minimumSince(now.with(LocalTime.of(0,0,0,0)), "influxdb").state))

        heatMeter_Heating_today_max.postUpdate(heatMeter_Heating.state as Number)
        heatMeter_Heating_today_min.postUpdate(heatMeter_Heating.minimumSince(now.with(LocalTime.of(0,0,0,0)), "influxdb").state)
        heatMeter_Heating_today_diff.postUpdate(max - min)
    
                logInfo("loggerName_max", "MAX is {}", max)
                logInfo("loggerName_min", "MIN is {}", min)
==> /var/log/openhab/openhab.log <==
2022-03-28 14:41:20.100 [INFO ] [hab.core.model.script.loggerName_max] - MAX is 109.6 kWh
2022-03-28 14:41:20.106 [INFO ] [hab.core.model.script.loggerName_min] - MIN is 94.8

==> /var/log/openhab/events.log <==
2022-03-28 13:36:04.537 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'dummy' received command OFF
2022-03-28 13:36:04.545 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'dummy' changed from ON to OFF
2022-03-28 13:36:04.584 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'HeatPump_Temp_Outside_Min' changed from 0.1 °C to 1 °C
2022-03-28 13:36:04.594 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'HeatPump_Temp_Outside_Max' changed from 14.9 °C to 1 °C
2022-03-28 13:36:04.631 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'HeatPump_Temp_Outside_Min' changed from 1 °C to 0.1 °C
2022-03-28 13:36:04.682 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'HeatPump_Temp_Outside_Max' changed from 1 °C to 14.9 °C
2022-03-28 13:36:04.713 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'heatMeter_Heating_today' changed from 3.945599052E8 kWh to 1 kWh
2022-03-28 13:36:04.718 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'heatMeter_Heating_today_max' changed from 109.6 kWh to 1 kWh
2022-03-28 13:36:04.722 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'heatMeter_Heating_today_min' changed from 94.8 kWh to 1 kWh
2022-03-28 13:36:04.728 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'heatMeter_Heating_today_1000' changed from 39.45599052 kWh to 1 kWh
2022-03-28 13:36:04.744 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'heatMeter_Heating_today' changed from 1 kWh to 3.945599052E8 kWh
2022-03-28 13:36:04.782 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'heatMeter_Heating_today_1000' changed from 1 kWh to 39.45599052 kWh
2022-03-28 13:36:04.827 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'heatMeter_Heating_today_max' changed from 1 kWh to 109.6 kWh
2022-03-28 13:36:04.866 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'heatMeter_Heating_today_min' changed from 1 kWh to 94.8 kWh
2022-03-28 13:36:04.964 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'heatMeter_Heating_today_diff' changed from 1 kWh to 3.945599052E8 kWh

real:
109.6 kWh - 94.8 kWh = 14.8 kWh

calculated OH3: 3.945599052E8 kWh
At first I thought it was a unit error, hence the /100000. But the value is wrong. Only the variable min has no unit. is that an approach?

That’s my first article - i hope i mentioned all important points.

Your Items appear to be Quantity types.
Either extract states using known units, or do maths with quantities (with units) throughout.

This is probably not giving you what you think.

None of the items has a unit unless you’ve set that in some earlier executed code you don’t show us.
As @rossko57 said either use units everywhere, that also means you must not use arithmetic operations with constants such as /1 or /100000 as those are not of QuantityType.

Or consequently do math using (item.state as Number).floatvalue.
In assignments to UoM items you would then need to use something like
new QuantityType(<float var>.toString + “<unit of var>”)

This topic was automatically closed 41 days after the last reply. New replies are no longer allowed.