Trouble with rule since all values present as decimals, how can i rectify this

rule "high kwh"
when
        Item TibberLiveAveragePower changed //snittforbruk
then
        // If the avarage is above 4800 kWh we need to bring the current usage below 3500w
        if ((TibberLiveAveragePower.state as Number) > 3500) {
                var current_w = TibberLivePower.state as Number //liveforbruk

                // Turn off Stue
                if (current_w > 3500 && ZWave13ThermostatStueThermostatMode.state == 1) {
                        ZWave13ThermostatStueThermostatMode.sendCommand(0)
                        current_w -= ZWave13ThermostatStueMeterWatts.state as Number
                }

                // Turn off bad oppe
                if (current_w > 3500 && (ZWave14ThermostatBadOEtgThermostatMode.state as Number) == 1) {
                        ZWave14ThermostatBadOEtgThermostatMode.sendCommand(0)
                        current_w -= ZWave14ThermostatBadOEtgMeterWatts.state as Number
                }

                // Turn off barnerom oppe
                if (current_w > 3500 && (ZWave15TermostatBarneromOEtgThermostatMode.state as Number) == 1) {
                        ZWave15TermostatBarneromOEtgThermostatMode.sendCommand(0)
                        current_w -= ZWave15TermostatBarneromOEtgMeterWatts.state as Number
                }

                // Turn off Entre
                if (current_w > 3500 && ZWave17ThermostatGangUEtgSone1ThermostatMode.state == 1) {
                        ZWave17ThermostatGangUEtgSone1ThermostatMode.sendCommand(0)
                        current_w -= ZWave17ThermostatGangUEtgSone1MeterWatts.state as Number
                }
                // Turn off kjellergang
                if (current_w > 3500 && (ZWave16ThermostatGangUEtgSone2ThermostatMode.state as Number) == 1) {
                        ZWave16ThermostatGangUEtgSone2ThermostatMode.sendCommand(0)
                        current_w -= ZWave16ThermostatGangUEtgSone2MeterWatts.state as Number
                }
                // Turn off bad nede
                if (current_w > 3500 && (ZWave22BadUEtgThermostatMode.state as Number) == 1) {
                        ZWave22BadUEtgThermostatMode.sendCommand(0)
                        current_w -= ZWave22BadUEtgMeterWatts.state as Number
                }
                // Turn off vaskerom 
                if (current_w > 3500 && (ZWave19ThermostatVaskeromThermostatMode.state as Number) == 1) {
                        ZWave19ThermostatVaskeromThermostatMode.sendCommand(0)
                        current_w -= ZWave19ThermostatVaskeromMeterWatts.state as Number
                }
                // Turn off Soverom1
                if (current_w > 3500 && (ZWave21ThermostatSoverom1ThermostatMode.state as Number) == 1) {
                        ZWave21ThermostatSoverom1ThermostatMode.sendCommand(0)
                        current_w -= ZWave21ThermostatSoverom1MeterWatts.state as Number
                }
                // Turn off Soverom2
                if (current_w > 3500 && (ZWave20ThermostatSoverom2ThermostatMode.state as Number) == 1) {
                        ZWave20ThermostatSoverom2ThermostatMode.sendCommand(0)
                        current_w -= ZWave20ThermostatSoverom2MeterWatts.state as Number
                }
                // Turn off Soverom3
                if (current_w > 3500 && (ZWave18ThermostatSoverom3ThermostatMode.state as Number) == 1) {
                        ZWave18ThermostatSoverom3ThermostatMode.sendCommand(0)
                        current_w -= ZWave18ThermostatSoverom3MeterWatts.state as Number
                }
                // Turn off Varmtvannsbereder
                if (current_w > 3500 && (ZWave23PowerVVTSwitchBinary.state as Number) == ON) {
                        ZWave23PowerVVTSwitchBinary.sendCommand(OFF)
                        current_w -= ZWave23PowerVVTMeterWatts.state as Number
                }




        }
end

rule "low kwh"
when
        Item TibberLiveAveragePower changed
then
        //logDebug("ams", "LOW KWH START")
        // If the avarage is below 4600 kWh we can start to bring the current usage up to (max) 6000w
        if ((TibberLiveAveragePower.state as Number) < 4600) {
                var current_w = TibberLivePower.state as Number

                // Turn on stue
                if (current_w < 6000 && ZWave13ThermostatStueThermostatMode.state == 0) {
                        ZWave13ThermostatStueThermostatMode.sendCommand(1)
                        current_w += 2470 // Estimate 2470w for now
                }

                // Turn on bad oppe
                if (current_w < 6000 && (ZWave14ThermostatBadOEtgThermostatMode.state as Number) == 0) {
                        ZWave14ThermostatBadOEtgThermostatMode.sendCommand(1)
                        current_w += 925 
                }

                // Turn on barnerom oppe
                if (current_w < 6000 && (ZWave15TermostatBarneromOEtgThermostatMode.state as Number) == 0) {
                        ZWave15TermostatBarneromOEtgThermostatMode.sendCommand(1)
                        current_w += 489 
                }

                // Turn on entre
                if (current_w < 6000 && ZWave17ThermostatGangUEtgSone1ThermostatMode.state == 0) {
                        ZWave17ThermostatGangUEtgSone1ThermostatMode.sendCommand(1)
                        current_w += 605 
                }
                // Turn on kjellergang
                if (current_w < 6000 && ZWave16ThermostatGangUEtgSone2ThermostatMode.state == 0) {
                        ZWave16ThermostatGangUEtgSone2ThermostatMode.sendCommand(1)
                        current_w += 1327 
                }
                // Turn on bad nede
                if (current_w < 6000 && ZWave22BadUEtgThermostatMode.state == 0) {
                        ZWave22BadUEtgThermostatMode.sendCommand(1)
                        current_w += 526
                }
                // Turn on vaskerom
                if (current_w < 6000 && ZWave19ThermostatVaskeromThermostatMode.state == 0) {
                        ZWave19ThermostatVaskeromThermostatMode.sendCommand(1)
                        current_w += 561 
                }
                // Turn on soverom1
                if (current_w < 6000 && ZWave21ThermostatSoverom1ThermostatMode.state == 0) {
                        ZWave21ThermostatSoverom1ThermostatMode.sendCommand(1)
                        current_w += 741 
                }
                // Turn on soverom2
                if (current_w < 6000 && ZWave20ThermostatSoverom2ThermostatMode.state == 0) {
                        ZWave20ThermostatSoverom2ThermostatMode.sendCommand(1)
                        current_w += 737 
                }
                // Turn on soverom3
                if (current_w < 6000 && ZWave18ThermostatSoverom3ThermostatMode.state == 0) {
                        ZWave18ThermostatSoverom3ThermostatMode.sendCommand(1)
                        current_w += 822 
                }
                // Turn on Varmtvannsbereder
                if (current_w < 6000 && ZWave23PowerVVTSwitchBinary.state == OFF) {
                        ZWave23PowerVVTSwitchBinary.sendCommand(ON)
                        current_w += 3000 
                }
        }
end

For example current_w -= ZWave13ThermostatStueMeterWatts.state as Number (number has decimals in it, therefore current_w=null 
Type mismatch: cannot convert from BigDecimal to Number(org.eclipse.xtext.xbase.validation.IssueCodes.incompatible_types)

sitemap formatting is ok, but how to do it in the item.txt file itself so the rule stop complaining about decimals. I think that is the problem


For example current_w -= ZWave13ThermostatStueMeterWatts.state as Number (number has decimals in it, therefore current_w=null
Type mismatch: cannot convert from BigDecimal to Number(org.eclipse.xtext.xbase.validation.IssueCodes.incompatible_types)

sitemap formatting is ok, but how to do it in the item.txt file itself so the rule stop complaining about decimals. I think that is the problem

Having decimals is not the problem. A BigDecimal is a Number.

When Rules DSL cannot convert between types it will often complain about something being NULL.

What is the type of Item? If it’s more than just a Number, for example Number:Power, you have to handle it differently.

Hello thanks for the answer, the items involved are:

Number:Power               TibberLivePower                    "Power consumption/production"   (persist)   {channel="tibber:tibberapi:tibber:live_power"}

Number:Power TibberLiveAveragePower "Snitt idag [%s] " (persist) {channel=“tibber:tibberapi:tibber:live_averagePower”}

Number ZWave13ThermostatStueMeterWatts “Electric meter [%.0f]” (Stromforbrukvarme) {channel=“zwave:device:16954503:node13:meter_watts1”}

maybe put :power on the last one? or remove :power from the other ones?

Tried removing :power frim items, still same result.

You can’t just remove the :Power. You will have to work with the Units for that Item.

I’m not where I can write it out right now but if you look at the docs for Units of Measurement and search the forum for Quantity type you will see lots of examples.

Don’t do that, do this

`if (TibberLiveAveragePower.state > 3500 | W)

see

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