Motion sensor disable during a Movie

Thanks SiLeX, but what keeps the PIR disabled ?

For instance I have a Kodi Rule and a Motion rule. I want to disable the Motion rule, whilst Kodi is active

What prevents the Motion rule rerunning under motion even if I set the Motion switch as off in the Kodi rule?

The PIR is not disabled, only the lights that would normally turn on when motion is detected.

So, if i’ve got my Kodi rule like so, which dims the lights down when Play is running, how would I incorporate that ? I assume at the end after its dimmed.

I have item for the Motion Alarm, Dimmer and the Light Switch. I assume I set the switch as off, somewhere


Switch LivingRoomSw1  "Living Room" (gInsideLights)                                       { channel="zwave:device:512:node6:switch_dimmer" }
Dimmer LivingRoomDim1 "Living Room [%d %%]"                                               { channel="zwave:device:512:node6:switch_dimmer" }
Number LivingRoomNum1 "Living Room - Current Consumption [%.1f W]"                        { channel="zwave:device:512:node6:meter_watts" }
Number LivingRoomNum2 "Living Room - Usage [%.1f kW]" (gPowerUsage)                       { channel="zwave:device:512:node6:meter_kwh" }



rule "When Kodi Player changed to PLAY"
when
        Item myKodi_control changed to PLAY
then
    //Slowly Dim the Lights if they are above 50%
    if (LivingRoomSw1.state == ON) {
        if (fade_timer === null) {
           percent = LivingRoomDim1.state as Number
           fade_timer = createTimer(now.plusMillis(350), [ |
                if (percent > 0) {
                    percent = percent - 5
                    if (percent < 0) percent = 0
                    LivingRoomDim1.sendCommand(percent)
                    fade_timer.reschedule(now.plusMillis(350))
                } else {
                    fade_timer = null
                }
            ])
        }
    }
end

The PIR continues to work and fire. But the rule that normally reacts to this change does something else, when the cinema mode switch is ON.

If the switch is ON, only the logWarn part of the rule is executed. If the switch is not ON, only the else part is executed. The else part contains everything that controls the lights.

@dastrix80 No need to change anything there. I assume you have another rule that controls the lights (when you are not watching Kodi), don’t you?

Hi Silex

Yes I do.

Heres my light rule. Would you suggest I change the ‘when’ to:

when
Item FibaroEye1Motion changed to on && Kodi_Control = PLAY


rule "FibaroEye1 motion detection turns ON Living Room Lights when Lux is less than 20, with a 2 Minute Inactivity Timer"
when
        Item FibaroEye1Motion changed to ON
then
      var int Dim = 0
      try {Dim = Integer::parseInt(LivingRoomDim1.state.toString)} catch (Exception e) {}
        if (FibaroEye1Lux.state < 20 && Dim < 6) {
                if (Eye1_Timer !== null) {
                        LivingRoomDim1.sendCommand("5")
                        logInfo("FibaroEye1Motion","Living Room Motion Timer rescheduled for " + Eye1_TimeOut + " minutes")
                        Eye1_Timer.reschedule(now.plusMinutes(Eye1_TimeOut))
                } else {
                        logInfo("FibaroEye1Motion", "Living Room Motion Detected! Turning ON Living Room Lights")
                        LivingRoomDim1.sendCommand("5")
                        logInfo("FibaroEye1Motion","Living Room Timer created with " + Eye1_TimeOut + " minutes")
                        Eye1_Timer = createTimer(now.plusMinutes(Eye1_TimeOut))
                        [ |
                                if (FibaroEye1Motion.state ==  ON) {
                                        logInfo("FibaroEye1Motion","Living Room Motion triggered, but rescheduled again for " + Eye1_TimeOut + " minutes")
                                        Eye1_Timer.reschedule(now.plusMinutes(Eye1_TimeOut))
                                } else {
                                        logInfo("FibaroEye1Motion", "Living Room, No Motion Detected! Turning OFF Living Room Lights")
                                        LivingRoomSw1.sendCommand("OFF")
                                        Eye1_Timer = null
                                }
                        ]
                }
        }
end

No. Conditions won’t work in the when part. Only events. I would suggest to wrap your rule code with if (Kodi_Control.state == PLAY){ [...] }

This way, your normal lighting rule will still fire when you watch Kodi and move, but it will do nothing. Your rule block would look like this:

rule "FibaroEye1 motion detection turns ON Living Room Lights when Lux is less than 20, with a 2 Minute Inactivity Timer"
when
        Item FibaroEye1Motion changed to ON
then
  if(Kodi_Control.state == PLAY){
      var int Dim = 0
      try {Dim = Integer::parseInt(LivingRoomDim1.state.toString)} catch (Exception e) {}
        if (FibaroEye1Lux.state < 20 && Dim < 6) {
                if (Eye1_Timer !== null) {
                        LivingRoomDim1.sendCommand("5")
                        logInfo("FibaroEye1Motion","Living Room Motion Timer rescheduled for " + Eye1_TimeOut + " minutes")
                        Eye1_Timer.reschedule(now.plusMinutes(Eye1_TimeOut))
                } else {
                        logInfo("FibaroEye1Motion", "Living Room Motion Detected! Turning ON Living Room Lights")
                        LivingRoomDim1.sendCommand("5")
                        logInfo("FibaroEye1Motion","Living Room Timer created with " + Eye1_TimeOut + " minutes")
                        Eye1_Timer = createTimer(now.plusMinutes(Eye1_TimeOut))
                        [ |
                                if (FibaroEye1Motion.state ==  ON) {
                                        logInfo("FibaroEye1Motion","Living Room Motion triggered, but rescheduled again for " + Eye1_TimeOut + " minutes")
                                        Eye1_Timer.reschedule(now.plusMinutes(Eye1_TimeOut))
                                } else {
                                        logInfo("FibaroEye1Motion", "Living Room, No Motion Detected! Turning OFF Living Room Lights")
                                        LivingRoomSw1.sendCommand("OFF")
                                        Eye1_Timer = null
                                }
                        ]
                }
        }
  }
end

It basically does exacly what you suggested, in properly working code. :slight_smile:

1 Like

This is awesome, didnt think you could ‘wrap’ it like this. The power of rules blows my mind!

Thank you, ill give this a try :smiley:

Just a thought: I use a dummy “Armed” item (no binding attached) for all my motions and use that in my rules where it would normally do something like turn on a light (if motion is “Armed”, then do stuff). It might be worth considering a similar approach instead of hard coding the " Kodi_Control.state == PLAY" into your rule logic. That way, if another situation arises where you want to disable that motion sensor from turning on the lights all you need to do is toggle that dummy switch instead of changing your lighting logic again.

Thanks, may you show me how youve done this?

@gersilex - your rule example works perfectly :smiley: Thank you!

Here’s how I would do it, in a nutshell. You would need another rule to re-arm the motion sensor like in “myKodi_control changed to STOP” or some other event though, so there is that slight bit of extra work there to think about.

Add an item like this, somewhere:

Switch FibaroEye1Motion_Armed

Change your Kodi PLAY rule as such:

rule "When Kodi Player changed to PLAY"
when
        Item myKodi_control changed to PLAY
then
   FibaroEye1Motion_Armed.sendCommand(OFF)
   if (LivingRoomSw1.state == ON) {
   ...
end

And change your motion rule so instead of “if(Kodi_Control.state == PLAY){”, it looks like this

```php
rule "FibaroEye1 motion detection turns ON Living Room Lights when Lux is less than 20, with a 2 Minute Inactivity Timer"
when
        Item FibaroEye1Motion changed to ON
then
  if(FibaroEye1Motion_Armed == ON){
      var int Dim = 0
      ...
  }
end

In this way, you can have any number of rules change the state of FibaroEye1Motion_Armed to control if you want it to act on the motion or not, for example in the middle of the night if you have to get up and pass that sensor to get a glass of water or something and don’t necessarily to have all the lights turn on. In my case, I have a rule that gets fired when I tell my Alexa “goodnight” that goes through and among other things like turning all the lights off and locking the doors disables all my motions that turn on lights. They all get re-set to ON at sunrise automatically with the Astro plugin.

Hi Zolakk

I dont know why - I feel stupid the last couple of days. Am I reading this right?

So reading through your suggested motion rule
 If the Motion sensor triggers from movement, then if your dummy trigger is OFF, it wont run the motion lighting rule and will do the other items inside the Kodi Play rule, right?

However, if Motion triggers and the Dummy Trigger is ON, then it will run through the normal lighting motion rule.

Is the Dummy switch effectively always on then? If not, how is it trigger to ON so the motion rule runs?

You basically have it. The motion rule only turns on lights if the dummy switch is ON. If you wanted it to normally always turn on the lights then yes, it would effectively need to be ON by default. The Kodi rule switches the dummy item OFF as part of everything else it does. You would either need another rule to toggle it back ON or you could alter your Kodi rule like this, if you don’t already also have rules for the other myKodi_control states.

I prefer this method because it moves all the logic around the “PLAY” state into the same rule so it’s easier to manage, for me anyway. Either solution is perfectly valid, they are just different ways to do the same thing so I would encourage you to use whichever approach makes the most sense to you.

rule "When Kodi Player changed"
when
        Item myKodi_control changed
then
if (myKodi_control.state == "PLAY"){
    FibaroEye1Motion_Armed.sendCommand(OFF) // Disable the motion sensor from turning the lights on
    //Slowly Dim the Lights if they are above 50%
    if (LivingRoomSw1.state == ON) {
        if (fade_timer === null) {
           percent = LivingRoomDim1.state as Number
           fade_timer = createTimer(now.plusMillis(350), [ |
                if (percent > 0) {
                    percent = percent - 5
                    if (percent < 0) percent = 0
                    LivingRoomDim1.sendCommand(percent)
                    fade_timer.reschedule(now.plusMillis(350))
                } else {
                    fade_timer = null
                }
            ])
        }
    }
}
else {
    FibaroEye1Motion_Armed.sendCommand(ON) // Enable the motion sensor for any other state of myKodi_control
}
end

Thanks, this is a bit advanced for me being a newbie. I think ill leave my rule as it is until I have a better grip on the logic of rules and how they work

Hi Silex, so very odd.

When I use your if statement above the var int dim, my lights fail to switch on under motion. myKodi_control == PAUSE)

So it should trigger.

When I remove the statement, the lights function correctly again.


openhab> smarthome:status myKodi_control
PAUSE
openhab>


Any thoughts?

It is totally fine and a good practise to define your variables at the top of the rule. I just wrapped everything to make it clear what I mean with “wrapping” code in something.

Just move the var definition to the top of the rule (so, above the if-statement) and you’ll be fine, if it works for you.

No joy im afraid :frowning:

Here is my full rule:


var Timer Eye1_Timer = null
val Integer Eye1_TimeOut = 2

rule "FibaroEye1 motion detection turns ON Living Room Lights when Lux is less than 20, with a 2 Minute Inactivity Timer"
when
      Item FibaroEye1Motion changed to ON
then
      var int Dim = 0
        if(myKodi_control.state == PLAY){
           try {Dim = Integer::parseInt(LivingRoomDim1.state.toString)} catch (Exception e) {}
               if (FibaroEye1Lux.state < 20 && Dim < 6) {
                if (Eye1_Timer !== null) {
                        LivingRoomDim1.sendCommand("5")
                        logInfo("FibaroEye1Motion","Living Room Motion Timer rescheduled for " + Eye1_TimeOut + " minutes")
                        Eye1_Timer.reschedule(now.plusMinutes(Eye1_TimeOut))
                } else {
                        logInfo("FibaroEye1Motion", "Living Room Motion Detected! Turning ON Living Room Lights")
                        LivingRoomDim1.sendCommand("5")
                        logInfo("FibaroEye1Motion","Living Room Timer created with " + Eye1_TimeOut + " minutes")
                        Eye1_Timer = createTimer(now.plusMinutes(Eye1_TimeOut))
                        [ |
                                if (FibaroEye1Motion.state ==  ON) {
                                        logInfo("FibaroEye1Motion","Living Room Motion triggered, but rescheduled again for " + Eye1_TimeOut + " minutes")
                                        Eye1_Timer.reschedule(now.plusMinutes(Eye1_TimeOut))
                                } else {
                                        logInfo("FibaroEye1Motion", "Living Room, No Motion Detected! Turning OFF Living Room Lights")
                                        LivingRoomSw1.sendCommand("OFF")
                                        Eye1_Timer = null
                                }
                        ]
                }
        }
}
end

Hi Zolakk

I’ve made your suggeste changes, I had to tweak the Kodi rule to put PLAY instead of “PLAY” and it appears to be doing what I required.

However, what has broken is my standard motion lighting rule. I can see the FIbaroEye1Motion trigger, but it doesnt turn the lights on.

Any thoughts? When i remove your suggested edits to the light rule, motion lighting works again.

 openhab>
smarthome:status LivingRoomDim1
0
openhab> smarthome:status FibaroEye1Motion
ON
openhab> smarthome:status FibaroEye1Motion_Armed
ON
openhab>
openhab> smarthome:status FibaroEye1Lux
0
openhab>



var Timer Eye1_Timer = null
val Integer Eye1_TimeOut = 2

rule "FibaroEye1 motion detection turns ON Living Room Lights when Lux is less than 20, with a 2 Minute Inactivity Timer"
when
      Item FibaroEye1Motion changed to ON
then
      if(FibaroEye1Motion_Armed == ON){
         var int Dim = 0
           try {Dim = Integer::parseInt(LivingRoomDim1.state.toString)} catch (Exception e) {}
               if (FibaroEye1Lux.state < 20 && Dim < 31) {
                if (Eye1_Timer !== null) {
                        LivingRoomDim1.sendCommand("5")
                        logInfo("FibaroEye1Motion","Living Room Motion Timer rescheduled for " + Eye1_TimeOut + " minutes")
                        Eye1_Timer.reschedule(now.plusMinutes(Eye1_TimeOut))
                } else {
                        logInfo("FibaroEye1Motion", "Living Room Motion Detected! Turning ON Living Room Lights")
                        LivingRoomDim1.sendCommand("5")
                        logInfo("FibaroEye1Motion","Living Room Timer created with " + Eye1_TimeOut + " minutes")
                        Eye1_Timer = createTimer(now.plusMinutes(Eye1_TimeOut))
                        [ |
                                if (FibaroEye1Motion.state ==  ON) {
                                        logInfo("FibaroEye1Motion","Living Room Motion triggered, but rescheduled again for " + Eye1_TimeOut + " minutes")
                                        Eye1_Timer.reschedule(now.plusMinutes(Eye1_TimeOut))
                                } else {
                                        logInfo("FibaroEye1Motion", "Living Room, No Motion Detected! Turning OFF Living Room Lights")
                                        LivingRoomSw1.sendCommand("OFF")
                                        Eye1_Timer = null
                                }
                        ]
                }
        }
}
end

I’m pretty sure this line:

if(FibaroEye1Motion_Armed == ON){

needs to be like this

if(FibaroEye1Motion_Armed.state == ON){

Give that a try and see if it works

1 Like

Ta da! :slight_smile:

Yes, that was it :wink: thanks zolakk. Ill do some testing over the coming days but so far so good.