Odd issue with a Heater rule and timers

Hi Guys,

Odd issue with a Heater rule.This rule shuold only come into effect from 6am till 10am, Mon-Fri, June/July/Aug but whats happening is its kicking in at 4am when I am asleep - naturally I dont want the heater on at 4am :stuck_out_tongue:

Log: showing it coming on/off

openhab> log:tail
04:34:59.181 [INFO ] [smarthome.model.script.FibaroEye1Temp] - Living Room Temp below 17°C, Turning on Heater
05:00:00.005 [INFO ] [marthome.model.script.speedtest.rules] - --> speedtest executed...
05:00:26.202 [INFO ] [marthome.model.script.speedtest.rules] - --> speedtest finished.
05:35:06.526 [INFO ] [smarthome.model.script.FibaroEye1Temp] - Living Room Temp above 20°C, Turning off Heater

Rule:


rule "HeaterTimer ON"
when
    Time cron "0 0 6-9 ? 6-8 MON,TUE,WED,THU,FRI *" or
    Time cron "0 0 7-9 ? 6-8 SUN,SAT *"
then
    HeaterTimer.postUpdate(ON)
end

rule "HeaterTimer OFF"
when
    Time cron "0 0 9 ? 6-8 MON,TUE,WED,THU,FRI *" or
    Time cron "0 0 9 ? 6-8 SUN,SAT *"
then
    HeaterTimer.postUpdate(OFF)
end




rule "FibaroEye1 Temperature Controlled Gas Heater turns on when Temp is below 1                                                                                              7°C. Turns off when temp is above 20°C"
when
    Item FibaroEye1Temp received update
then
    val currentTemp = FibaroEye1Temp.state as Number
    if (HeaterTimer.state == ON) {
        if (currentTemp < 17 ) {
            logInfo("FibaroEye1Temp","Living Room Temp below 17°C, Turning on He                                                                                              ater")
            Heater.sendCommand("ON")
         } else if (currentTemp > 20) {
             logInfo("FibaroEye1Temp", "Living Room Temp above 20°C, Turning off                                                                                               Heater")
             Heater.sendCommand("OFF")
         }
    } else if (HeaterTimer.state == OFF) {
        if (Heater.state.toString == "ON") Heater.sendCommand("OFF")
    }
end

Any thoughts as to why?

Hey Kris

First lets check your system time is correct to your regional time.
Second I recommend to add a log to the time-cron jobs. Then you see, if the get triggered.

I stumble regulary on crons…and Im not sure if the expression is correct.
In an example here SUN,SAT are changed to SAT,SUN…

Without an check, you set your Heatertimer alway to on, when the cron is triggered, even it is on already.

Regards
Michael

There is a fault in your cron rules, because the “ON” rule will fire at 6:00, 7:00, 8:00 AND 9:00 where the OFF Rule will fire at 9:00, so there is a good chance the HeaterTimer is switched OFF and immediately ON again.
Would be better only to switch ON once:

rule "HeaterTimer ON"
when
    Time cron "0 0 6 ? 6-8 MON-FRI" or // Switch ON at 6:00:00 Monday to Friday from June to August
    Time cron "0 0 7 ? 6-8 SAT-SUN" // Switch ON at 7:00:00 Saturday and Sunday from June to August
then
    HeaterTimer.postUpdate(ON)
end

rule "HeaterTimer OFF"
when
    Time cron "0 0 9 * 6-8 ?" // Same OFF-Time for all weekdays
then
    HeaterTimer.postUpdate(OFF)
end

But you don’t need these rules to sort out the time.
Of course, the code is not as nice as the Time cron trigger:

rule "FibaroEye1 Temperature Controlled Gas Heater turns on when Temp is below 17°C. Turns off when temp is above 20°C"
when
    Item FibaroEye1Temp received update
then
    var bHeat = 1
    if (now.getMonthOfYear < 6 || now.getMonthOfYear > 8 ) {
        logInfo("FibaroEye1Temp","stop heating, Month = {}",now.getMonthOfYear)
        bHeat = 0
    }
    if (now.getHourOfDay < 6 || now.getHourOfDay > 8 ) {
        logInfo("FibaroEye1Temp","stop heating, Hour = {}",now.getHourOfDay)
        bHeat = 0
    }
    if (now.getHourOfDay < 7 && now.getDayOfWeek > 5 ) {
        logInfo("FibaroEye1Temp","stop heating, Hour = {} and DoW = {}",now.getHourOfDay,now.getDayOfWeek)
        bHeat = 0
    }
    val currentTemp = FibaroEye1Temp.state as Number
    if (currentTemp > 20) {
        logInfo("FibaroEye1Temp", "Living Room Temp above 20°C, Turning off Heater")
        bHeat = 0
    }
    if(bHeat == 1) {
        if (currentTemp < 17) 
            logInfo("FibaroEye1Temp","Living Room Temp below 17°C, Turning on Heater")
        else
            bHeat = -1             // do nothing
    }
    if (bHeat==1 && Heater.state.toString != "ON") Heater.sendCommand("ON")
    if (bHeat==0 && Heater.state.toString != "OFF") Heater.sendCommand("OFF")
end

I also did a slight change in condition:

if (Heater.state.toString == "ON") Heater.sendCommand("OFF")

vs.

if (Heater.state.toString != "OFF") Heater.sendCommand("OFF")

because there is potentially a third state “NULL” which would cause the rule never to switch OFF when heater state gets uninitialized for some reason.

1 Like

Hello Udo, thank you. I shall try this rule - I appreciate you taking the time to look at it.

Its way above my level :smiley:

I cant see where in your suggested rule you did the ‘slight change in condition’?

== vs. !=
You tested in your rule, if the Switch is ON, I’m testing if the switch is not OFF. I explained the difference between these two conditions :).

Fair enough! :slight_smile:

So the room this morning was 15 degrees, it didnt switch on because

openhab> smarthome:status Heater
OFF
openhab>

Did you take a look at the logs?
And by the way: what kind of Item is Heater? If it’s a switch item, we don’t need that .toString stuff:

if (bHeat==1 && Heater.state != ON ) Heater.sendCommand(ON )
if (bHeat==0 && Heater.state != OFF) Heater.sendCommand(OFF)

Heater is a string

String Heater "Heater" { channel="broadlink:rm3:78-0f-77-18-43-03:command" }

I did see it turned on the Heater once.

2018-08-10 08:49:15.248 [INFO ] [marthome.model.script.FibaroEye1Temp] - Living Room Temp below 17°C, Turning on Heater

And off, but nothing at 6am when it was very cold

2018-08-10 07:49:03.227 [INFO ] [marthome.model.script.FibaroEye1Temp] - Living Room Temp above 20°C, Turning off Heater


2018-08-10 08:49:15.248 [INFO ] [marthome.model.script.FibaroEye1Temp] - Living Room Temp below 17°C, Turning on Heater
2018-08-10 09:04:19.082 [INFO ] [marthome.model.script.FibaroEye1Temp] - stop heating, Hour = 9
2018-08-10 12:35:19.054 [INFO ] [marthome.model.script.FibaroEye1Temp] - stop heating, Hour = 12

Hmm. And do you see updates of FibaroEye1Temp with a temperature below 17°C?

Maybe add another logInfo() at the top of the rule, right after then:

when
    Item FibaroEye1Temp received update
then
    logInfo("FibaroEye1Temp","Temperature Update = {}",FibaroEye1Temp.state)  // additional log line
    var bHeat = 1
    if (now.getMonthOfYear < 6 || now.getMonthOfYear > 8 ) {

And maybe another at the bottom:

       else
            bHeat = -1             // do nothing
    }
    logInfo("FibaroEye1Temp","Desired state = {}",bHeat)
    if (bHeat==1 && Heater.state.toString != "ON") Heater.sendCommand("ON")
    if (bHeat==0 && Heater.state.toString != "OFF") Heater.sendCommand("OFF")
end
1 Like

Ill have to check the logs tomorrow morning when the temp drops! Ive added the logs in, so ill report back :slight_smile:Thank you!

Hi Udo, didnt turn on :confused:

It was below 17


2018-08-11 02:52:28.551 [INFO ] [marthome.model.script.FibaroEye1Temp] - Temperature Update = 17.6
2018-08-11 02:52:28.552 [INFO ] [marthome.model.script.FibaroEye1Temp] - stop heating, Hour = 2
2018-08-11 02:52:28.553 [INFO ] [marthome.model.script.FibaroEye1Temp] - stop heating, Hour = 2 and DoW = 6
2018-08-11 02:52:28.554 [INFO ] [marthome.model.script.FibaroEye1Temp] - Desired state = 0
2018-08-11 02:52:37.506 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 02:53:08.614 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 02:53:39.738 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 02:54:10.882 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 02:54:41.981 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 02:55:13.105 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 02:55:44.166 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 02:56:15.288 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 02:56:46.422 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 02:57:17.544 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 02:57:48.633 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 02:58:19.750 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 02:58:50.885 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 02:59:21.977 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 02:59:53.106 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:00:00.017 [INFO ] [arthome.model.script.speedtest.rules] - --> speedtest executed...
2018-08-11 03:00:23.881 [INFO ] [arthome.model.script.speedtest.rules] - --> speedtest finished.
2018-08-11 03:00:24.253 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:00:55.353 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:01:26.448 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:01:57.550 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:02:28.650 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:02:59.766 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:03:30.856 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:04:01.977 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:04:33.080 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:05:04.197 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:05:35.285 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:06:06.417 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:06:37.536 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:07:08.665 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:07:39.774 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:08:10.867 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:08:41.998 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:09:13.101 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:09:44.208 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:10:15.340 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:10:46.433 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:11:17.587 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:11:48.683 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:12:19.834 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:12:50.929 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:13:22.014 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:13:53.132 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:14:24.251 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:14:55.335 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:15:26.492 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 03:17:26.493 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 No Motion Detected! Turning OFF Living Room Lights
2018-08-11 04:00:00.007 [INFO ] [arthome.model.script.speedtest.rules] - --> speedtest executed...
2018-08-11 04:00:21.265 [INFO ] [arthome.model.script.speedtest.rules] - --> speedtest finished.
2018-08-11 05:00:00.005 [INFO ] [arthome.model.script.speedtest.rules] - --> speedtest executed...
2018-08-11 05:00:22.003 [INFO ] [arthome.model.script.speedtest.rules] - --> speedtest finished.
2018-08-11 05:38:10.814 [INFO ] [marthome.model.script.FibaroEye1Temp] - Temperature Update = 16.5
2018-08-11 05:38:10.816 [INFO ] [marthome.model.script.FibaroEye1Temp] - stop heating, Hour = 5
2018-08-11 05:38:10.817 [INFO ] [marthome.model.script.FibaroEye1Temp] - stop heating, Hour = 5 and DoW = 6
2018-08-11 05:38:10.820 [INFO ] [marthome.model.script.FibaroEye1Temp] - Desired state = 0
2018-08-11 06:00:00.005 [INFO ] [arthome.model.script.speedtest.rules] - --> speedtest executed...
2018-08-11 06:00:00.077 [INFO ] [marthome.model.script.crontest.rules] - Night mode off
2018-08-11 06:00:21.772 [INFO ] [arthome.model.script.speedtest.rules] - --> speedtest finished.
2018-08-11 06:21:50.078 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Motion Detected! Turning ON Living Room Lights
2018-08-11 06:21:50.080 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer created with 2 minutes
2018-08-11 06:22:30.769 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:23:01.912 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:23:33.110 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:24:14.305 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:24:45.487 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:25:16.660 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:25:47.863 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:26:18.999 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:26:50.194 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:27:21.365 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:27:52.509 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:28:23.696 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:28:54.881 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:29:26.038 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:30:07.246 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:30:38.438 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:31:09.632 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:31:40.795 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:32:11.908 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:33:06.196 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:34:02.528 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:35:13.926 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:35:45.107 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:36:16.294 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:36:47.469 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:37:18.592 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:37:49.796 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:38:20.930 [INFO ] [rthome.model.script.FibaroEye1Motion] - Eye1 Timer rescheduled for 2 minutes
2018-08-11 06:38:37.867 [INFO ] [marthome.model.script.FibaroEye1Temp] - Temperature Update = 16.4
2018-08-11 06:38:37.869 [INFO ] [marthome.model.script.FibaroEye1Temp] - stop heating, Hour = 6 and DoW = 6
2018-08-11 06:38:37.869 [INFO ] [marthome.model.script.FibaroEye1Temp] - Desired state = 0

It’s correct.
It execcuted this bit:

    if (now.getHourOfDay < 7 && now.getDayOfWeek > 5 ) {
        logInfo("FibaroEye1Temp","stop heating, Hour = {} and DoW = {}",now.getHourOfDay,now.getDayOfWeek)
        bHeat = 0

Saturday morning the heating will go on at 7am

OK :slight_smile: I will test it tomorrow. I had OH2 shutdown over night :stuck_out_tongue:

Guys, i believe its not turning on/off because in my broadlink transform map, the commands are not ‘on’ or ‘off’

they are HeaterOn, HeaterOff

Do I need to modify the last IF statements with the sendcommands? I assume yes :wink:

/* Rinnai Gas Heater*/
HeaterOn=2600840313000281110002840e0002821100027e13000284140002791300027f1500027d1600027c1400027e1400027e1300027f1400027e1400027e1300028112000280110002810d0002811500027f130002830f00027f130002801200027f1300027f130002810f0002830f000281130002830f0002831200027c120002811100027f1300027f1300027f14000280110002821500027a1300027f130002811200027e1600027c1400027d150002800f0002831000028014000280110002801400027b140002811200027f1200027f160002800f0002830f000281110002830f0002821000027f13000281130002810f00028111000283100002820f00027f130002811100027f1300027f1300027f120002801200027f140002801200027f120002811200027e1500027f120002820d00028111000285100002870b00028012000280120002820d0002811300027f130002811300027d1400027e13000281110002801400027d130002811200027e1300027f1400028012000281110002801100027f1300027f12000282100002811500027d1100027f130002811100027d1600027e140002811100027e1300027f0f000283120002801200027f110002860e0002811200027e130002810f0002811600027e1500027d110002811100027f1300027f1300027f130002801000028113e00900019c0c00014c00012d961114113912141114111411141114123911141139113a111411141139123911141114113912131214113911141114123911391114123911391114113a113911141169110002811200027e130002811100027f1300027f1500027d130002811200027e11000284110002820f0002830f00027f1400027e140002801200027e1400027e140002830e00027f1300027e1500027e1300027f13000282100002831200027f1000027f1400028210000280120002801100027f1400027e13000282100002840e00027f1300027e1500027e1300028012000280110002831000027e1300028117000279130002811400027d1200027f1400027e1300027f13000281110002811200027e130002811100027f12000281110002811300027f10000281120002821100028012000280110002811100027f140002800f0002811500027d130002830f00027f11000283120002830f00027e1300027f140002801600050f1100027f1300028011000281110002801100028012000280120002801200028111000282100002810f000d0500000000
HeaterOff=2600480000012996111411391213121411141114111411391214113911391214111411391139121411391114113a113911141114121312391114113912141114113911391239111411000d05
HeaterUp=2600480000012b931412133713121411141114121312133714111437133714111411143713371411143713121312133714121312131213371411143713371411143713371337141213000d05
HeaterDown=26004800000128961114113a111411141114111412141139111411391239111411141139123911131214113a1139111411141214111411391139121411141139113912391139111412000d05

I think you are assuming correctly. Try it and test

no change :frowning: temp is above 20, hasnt turned off

Heater.sendCommand(transform("MAP", "mapfile.map", "HeaterOn")

It worked ok in previous rules with just Heater.sendCommand(“HeaterOff”) though?

Ok, I don’t know the broadlink binding
Does it automatically transform the commands through the map file?

Yes, you just reference the name inside the .map file, HeaterOn, HeaterOff etc…