Page 1 of 2

Problem with the blockly script turning on the light

Posted: Sunday 04 January 2026 3:09
by Maciek90
I have two lamps that I want to turn on with a motion sensor at specific times. I created a Blockly script as shown below. It turns the lamp on when the sensor detects motion, and turns it off after a set period of time after the motion sensor switches to off. It usually works well, but occasionally it won't turn off the lamp 30 seconds after the motion sensor switches to off, leaving it on continuously until I turn it off in Domoticz. Could someone explain why this is happening and help me improve the script?

Re: Problem with the blockly script turning on the light

Posted: Sunday 04 January 2026 10:59
by madpatrick
Hi,
Maybe it is easier to use a DZvents script.
More flexibel and options

Maybe this example can help you

Code: Select all

local SCRIPT_NAME             = 'PIR '
local LOG_LEVEL               = domoticz.LOG_FORCE

return {
    on = {
        devices  = {450,451,452,453 },
    },

    logging = {
        level = LOG_LEVEL,
        marker = SCRIPT_NAME
    },

    execute = function(dz, device)

        local pirDevice1      = dz.devices(450)
        local pirDevice2      = dz.devices(451)
        local lamp1           = dz.devices(452)
        local lamp1           = dz.devices(453)


            if pirDevice1.state == "On" and lamp1.state == "On"
                then pirDevice1.switchOn().checkFirst()
                dz.log('Switch lamp1 ON', LOG_LEVEL)
            elseif pirDevice1.state == "Off" and lamp1.state == "On"
                then pirDevice1.switchOff().checkFirst().afterSec(30)
                dz.log('Switch lamp1 OFF', LOG_LEVEL)
            end
            
            if pirDevice2.state == "On" and lamp2.state == "On"
                then pirDevice2.switchOn().checkFirst()
                dz.log('Switch lamp2 ON', LOG_LEVEL)
            elseif pirDevice2.state == "Off" and lamp2.state == "On"
                then pirDevice2.switchOff().checkFirst().afterSec(30)
                dz.log('Switch lamp2 OFF', LOG_LEVEL)
            end
end
}

Re: Problem with the blockly script turning on the light

Posted: Sunday 04 January 2026 16:18
by Maciek90
Thank you for your reply. I changed the IDX in the script to match my devices, but unfortunately it doesn't work. My lights don't turn on when the motion sensor is activated. DzVents isn't my strong suit, unfortunately.

Code: Select all

local SCRIPT_NAME             = 'PIR '
local LOG_LEVEL               = domoticz.LOG_FORCE

return {
    on = {
        devices  = {68,69,1574,1575 },
    },

    logging = {
        level = LOG_LEVEL,
        marker = SCRIPT_NAME
    },

    execute = function(dz, device)

        local pirDevice1      = dz.devices(69)
        local pirDevice2      = dz.devices(1575)
        local lamp1           = dz.devices(68)
        local lamp1           = dz.devices(1574)


            if pirDevice1.state == "On" and lamp1.state == "On"
                then pirDevice1.switchOn().checkFirst()
                dz.log('Switch lamp1 ON', LOG_LEVEL)
            elseif pirDevice1.state == "Off" and lamp1.state == "On"
                then pirDevice1.switchOff().checkFirst().afterSec(30)
                dz.log('Switch lamp1 OFF', LOG_LEVEL)
            end
            
            if pirDevice2.state == "On" and lamp2.state == "On"
                then pirDevice2.switchOn().checkFirst()
                dz.log('Switch lamp2 ON', LOG_LEVEL)
            elseif pirDevice2.state == "Off" and lamp2.state == "On"
                then pirDevice2.switchOff().checkFirst().afterSec(30)
                dz.log('Switch lamp2 OFF', LOG_LEVEL)
            end
end
}

Re: Problem with the blockly script turning on the light

Posted: Sunday 04 January 2026 16:36
by madpatrick
Hi,

Let add some log to see what is happening

Code: Select all

local SCRIPT_NAME = 'PIR '
local LOG_LEVEL = domoticz.LOG_FORCE

return {
    on = {
        devices  = {68, 69, 1574, 1575},
    },

    logging = {
        level = LOG_LEVEL,
        marker = SCRIPT_NAME
    },

    execute = function(dz, device)

        -- Log which device triggered the script 
        dz.log('Script triggered by device: ' .. device.name .. ' (ID: ' .. device.id .. ')', LOG_LEVEL)

        -- Apparaten ophalen
        local pirDevice1 = dz.devices(69)
        local pirDevice2 = dz.devices(1575)
        local lamp1 = dz.devices(68)
        local lamp2 = dz.devices(1574)

        -- PIR1 and lamp1
        if pirDevice1.state == "On" and lamp1.state == "On" then
            pirDevice1.switchOn().checkFirst()
            dz.log('PIR1 triggered. Switching Lamp1 ON', LOG_LEVEL)
        elseif pirDevice1.state == "Off" and lamp1.state == "On" then
            pirDevice1.switchOff().checkFirst().afterSec(30)
            dz.log('PIR1 triggered. Switching Lamp1 OFF in 30 sec', LOG_LEVEL)
        end

        -- PIR2 andlamp2
        if pirDevice2.state == "On" and lamp2.state == "On" then
            pirDevice2.switchOn().checkFirst()
            dz.log('PIR2 triggered. Switching Lamp2 ON', LOG_LEVEL)
        elseif pirDevice2.state == "Off" and lamp2.state == "On" then
            pirDevice2.switchOff().checkFirst().afterSec(30)
            dz.log('PIR2 triggered. Switching Lamp2 OFF in 30 sec', LOG_LEVEL)
        end

    end
}

Re: Problem with the blockly script turning on the light

Posted: Sunday 04 January 2026 16:53
by Maciek90
2026-01-04 16:52:38.875 dzVents: !Info: PIR : Script triggered by device: Drzwi wejściowe sensor (ID: 69)
2026-01-04 16:52:58.322 dzVents: !Info: PIR : Script triggered by device: Drzwi wejściowe sensor (ID: 69)

Re: Problem with the blockly script turning on the light

Posted: Sunday 04 January 2026 18:11
by madpatrick
my mistake
I switchon the PIR

Code: Select all

local SCRIPT_NAME = 'PIR '
local LOG_LEVEL = domoticz.LOG_FORCE

return {
    on = {
        devices  = {68, 69, 1574, 1575},
    },

    logging = {
        level = LOG_LEVEL,
        marker = SCRIPT_NAME
    },

    execute = function(dz, device)

        -- Log which device triggered the script 
        dz.log('Script triggered by device: ' .. device.name .. ' (ID: ' .. device.id .. ')', LOG_LEVEL)

        -- Apparaten ophalen
        local pirDevice1 = dz.devices(69)
        local pirDevice2 = dz.devices(1575)
        local lamp1 = dz.devices(68)
        local lamp2 = dz.devices(1574)

        -- PIR1 and lamp1
        if pirDevice1.state == "On" and lamp1.state == "On" then
            lamp1.switchOn().checkFirst()
            dz.log('PIR1 triggered. Switching Lamp1 ON', LOG_LEVEL)
        elseif pirDevice1.state == "Off" and lamp1.state == "On" then
            lamp1.switchOff().checkFirst().afterSec(30)
            dz.log('PIR1 triggered. Switching Lamp1 OFF in 30 sec', LOG_LEVEL)
        end

        -- PIR2 andlamp2
        if pirDevice2.state == "On" and lamp2.state == "On" then
            lamp2.switchOn().checkFirst()
            dz.log('PIR2 triggered. Switching Lamp2 ON', LOG_LEVEL)
        elseif pirDevice2.state == "Off" and lamp2.state == "On" then
            lamp2.switchOff().checkFirst().afterSec(30)
            dz.log('PIR2 triggered. Switching Lamp2 OFF in 30 sec', LOG_LEVEL)
        end

    end
}

Re: Problem with the blockly script turning on the light

Posted: Sunday 04 January 2026 20:37
by Maciek90
Still not working

2026-01-04 20:34:26.691 dzVents: !Info: PIR : Script triggered by device: Drzwi wejściowe sensor (ID: 69)
2026-01-04 20:34:39.419 dzVents: !Info: PIR : Script triggered by device: Drzwi wejściowe sensor (ID: 69)
2026-01-04 20:34:49.283 dzVents: !Info: PIR : Script triggered by device: Dom światło sensor (ID: 1575)
2026-01-04 20:34:58.025 dzVents: !Info: PIR : Script triggered by device: Dom światło sensor (ID: 1575)

Re: Problem with the blockly script turning on the light

Posted: Sunday 04 January 2026 20:46
by madpatrick
Sorry.. i was too quick

When the lamp = On switch On doesn't make sense
Lamp should be Off to switch On


Code: Select all

local SCRIPT_NAME = 'PIR '
local LOG_LEVEL = domoticz.LOG_FORCE

return {
    on = {
        devices  = {68, 69, 1574, 1575},
    },

    logging = {
        level = LOG_LEVEL,
        marker = SCRIPT_NAME
    },

    execute = function(dz, device)

        -- Log which device triggered the script 
        dz.log('Script triggered by device: ' .. device.name .. ' (ID: ' .. device.id .. ')', LOG_LEVEL)

        -- Apparaten ophalen
        local pirDevice1 = dz.devices(69)
        local pirDevice2 = dz.devices(1575)
        local lamp1 = dz.devices(68)
        local lamp2 = dz.devices(1574)

        -- PIR1 and lamp1
        if pirDevice1.state == "On" and lamp1.state == "Off" then
            lamp1.switchOn()
            dz.log('PIR1 triggered. Switching Lamp1 ON', LOG_LEVEL)
        elseif pirDevice1.state == "Off" and lamp1.state == "On" then
            lamp1.switchOff().afterSec(30)
            dz.log('PIR1 triggered. Switching Lamp1 OFF in 30 sec', LOG_LEVEL)
        end

        -- PIR2 and lamp2
        if pirDevice2.state == "On" and lamp2.state == "Off" then
            lamp2.switchOn()
            dz.log('PIR2 triggered. Switching Lamp2 ON', LOG_LEVEL)
        elseif pirDevice2.state == "Off" and lamp2.state == "On" then
            lamp2.switchOff().afterSec(30)
            dz.log('PIR2 triggered. Switching Lamp2 OFF in 30 sec', LOG_LEVEL)
        end

    end
}

Re: Problem with the blockly script turning on the light

Posted: Sunday 04 January 2026 23:11
by Maciek90
It seems to be working perfectly now. However, I'd like to expand this script a bit. I think I can handle most of the issues myself, but I'm not sure how to approach one particular issue. I'd like the lights to stay on after I turn them on in Domoticz with the motion sensor disabled until I turn them off again via Domoticz. Could you please help?

Re: Problem with the blockly script turning on the light

Posted: Monday 05 January 2026 18:58
by madpatrick
Can you try this.
Not sure if it will work

Basically we want to check if the lamp1 is on before PIR1

Code: Select all

local SCRIPT_NAME = 'PIR '
local LOG_LEVEL = domoticz.LOG_FORCE

return {
    on = {
        devices  = {68, 69, 1574, 1575},
    },

    logging = {
        level = LOG_LEVEL,
        marker = SCRIPT_NAME
    },

    execute = function(dz, device)

        -- Log which device triggered the script 
        dz.log('Script triggered by device: ' .. device.name .. ' (ID: ' .. device.id .. ')', LOG_LEVEL)

        -- Apparaten ophalen
        local pirDevice1 = dz.devices(69)
        local pirDevice2 = dz.devices(1575)
        local lamp1 = dz.devices(68)
        local lamp2 = dz.devices(1574)
        local diff1 = lamp1.lastUpdate < pirDevice1.lastUpdate
        local diff2 = lamp2.lastUpdate < pirDevice2.lastUpdate


        -- PIR1 and lamp1
        if pirDevice1.state == "On" 
            and lamp1.state == "Off" 
             and diff1 then
            lamp1.switchOn()
            dz.log('PIR1 triggered. Switching Lamp1 ON', LOG_LEVEL)
        elseif pirDevice1.state == "Off" and lamp1.state == "On" then
            lamp1.switchOff().afterSec(30)
            dz.log('PIR1 triggered. Switching Lamp1 OFF in 30 sec', LOG_LEVEL)
        end

        -- PIR2 and lamp2
        if pirDevice2.state == "On" 
            and lamp2.state == "Off" 
            and diff2 then
            lamp2.switchOn()
            dz.log('PIR2 triggered. Switching Lamp2 ON', LOG_LEVEL)
        elseif pirDevice2.state == "Off" and lamp2.state == "On" then
            lamp2.switchOff().afterSec(30)
            dz.log('PIR2 triggered. Switching Lamp2 OFF in 30 sec', LOG_LEVEL)
        end

    end
}

Re: Problem with the blockly script turning on the light

Posted: Tuesday 06 January 2026 23:00
by Maciek90
Doesn't work, doesn't turn on the lights. Logs below.

2026-01-06 22:51:24.270 dzVents: !Info: PIR2 : Script triggered by device: Dom światło sensor (ID: 1575)
2026-01-06 22:51:25.249 dzVents: !Info: PIR2 : Script triggered by device: Drzwi wejściowe sensor (ID: 69)

Re: Problem with the blockly script turning on the light

Posted: Wednesday 07 January 2026 8:57
by habahabahaba
I think you need 2 different scripts and 1 user variable.

A user variable will be a flag - were your lights turned on from Dz by hands or not (0 or 1 value)

Create a dummy switch and put a script on it where:
a) if you turning it on - change the flag( user varible) to 1, turn on all lights you need
b) at off action - chenge the flag to 0, turn off all lights

And in the current working script just add the IF condition where you chek whether the flag is "1" or not

Re: Problem with the blockly script turning on the light

Posted: Friday 09 January 2026 20:16
by madpatrick
You can try this

This wil use the last update of the device

Code: Select all

local SCRIPT_NAME = 'PIR'
local LOG_LEVEL = domoticz.LOG_FORCE

return {
    on = {
        devices = {68, 69, 1574, 1575}, -- Lamp and PIR devices
    },

    logging = {
        level = LOG_LEVEL,
        marker = SCRIPT_NAME
    },

    execute = function(dz, device)
        local pir1 = dz.devices(69)
        local pir2 = dz.devices(1575)
        local lamp1 = dz.devices(68)
        local lamp2 = dz.devices(1574)

        ----------------------------------------------------------------
        -- PIR 1 / Lamp 1 logic
        ----------------------------------------------------------------
        -- PIR triggers → turn lamp on
        if pir1.state == 'On' and lamp1.state == 'Off' then
            lamp1.switchOn().checkFirst()
            dz.log('PIR1 → Lamp1 ON', LOG_LEVEL)
        end

        -- Only turn off if PIR turned lamp on (lamp last updated before PIR)
        if pir1.state == 'Off' and lamp1.state == 'On' then
            if lamp1.lastUpdate < pir1.lastUpdate then
                lamp1.switchOff().afterSec(30)
                dz.log('PIR1 → Lamp1 OFF in 30 sec', LOG_LEVEL)
            else
                dz.log('Lamp1 manually turned on, not turning off', LOG_LEVEL)
            end
        end

        ----------------------------------------------------------------
        -- PIR 2 / Lamp 2 logic
        ----------------------------------------------------------------
        if pir2.state == 'On' and lamp2.state == 'Off' then
            lamp2.switchOn().checkFirst()
            dz.log('PIR2 → Lamp2 ON', LOG_LEVEL)
        end

        if pir2.state == 'Off' and lamp2.state == 'On' then
            if lamp2.lastUpdate < pir2.lastUpdate then
                lamp2.switchOff().afterSec(30)
                dz.log('PIR2 → Lamp2 OFF in 30 sec', LOG_LEVEL)
            else
                dz.log('Lamp2 manually turned on, not turning off', LOG_LEVEL)
            end
        end
    end
}

Or by using User variables which is better/more secure
Make 2 new User Variables in Domoticz Setup

Lamp1_PIR (Type: Boolean, false)
Lamp2_PIR (Type: Boolean, false)

Code: Select all

local SCRIPT_NAME = 'PIR'
local LOG_LEVEL = domoticz.LOG_FORCE

return {
    on = {
        devices = {68, 69, 1574, 1575}, -- Lamp and PIR devices
    },

    logging = {
        level = LOG_LEVEL,
        marker = SCRIPT_NAME
    },

    execute = function(dz, device)

        local pir1 = dz.devices(69)
        local pir2 = dz.devices(1575)
        local lamp1 = dz.devices(68)
        local lamp2 = dz.devices(1574)

        -- Get user variables for tracking PIR-controlled lamps
        local lamp1PirVar = dz.variables('Lamp1_PIR')
        local lamp2PirVar = dz.variables('Lamp2_PIR')

        ----------------------------------------------------------------
        -- PIR 1 / Lamp 1 logic
        ----------------------------------------------------------------

        -- PIR triggers → turn lamp on and mark as PIR-controlled
        if pir1.state == 'On' and lamp1.state == 'Off' then
            lamp1.switchOn().checkFirst()
            lamp1PirVar.set(true)
            dz.log('PIR1 → Lamp1 ON (PIR mode)', LOG_LEVEL)
        end

        -- PIR stops → only turn off if lamp was turned on by PIR
        if pir1.state == 'Off' and lamp1.state == 'On' and lamp1PirVar.value == true then
            lamp1.switchOff().afterSec(30)
            dz.log('PIR1 → Lamp1 OFF in 30 sec (PIR mode)', LOG_LEVEL)
        end

        -- Manual lamp activation → disable PIR mode
        if device.id == lamp1.id and lamp1.state == 'On' then
            lamp1PirVar.set(false)
            dz.log('Lamp1 manually turned on → PIR mode disabled', LOG_LEVEL)
        end

        ----------------------------------------------------------------
        -- PIR 2 / Lamp 2 logic
        ----------------------------------------------------------------

        if pir2.state == 'On' and lamp2.state == 'Off' then
            lamp2.switchOn().checkFirst()
            lamp2PirVar.set(true)
            dz.log('PIR2 → Lamp2 ON (PIR mode)', LOG_LEVEL)
        end

        if pir2.state == 'Off' and lamp2.state == 'On' and lamp2PirVar.value == true then
            lamp2.switchOff().afterSec(30)
            dz.log('PIR2 → Lamp2 OFF in 30 sec (PIR mode)', LOG_LEVEL)
        end

        if device.id == lamp2.id and lamp2.state == 'On' then
            lamp2PirVar.set(false)
            dz.log('Lamp2 manually turned on → PIR mode disabled', LOG_LEVEL)
        end
    end
}

Re: Problem with the blockly script turning on the light

Posted: Tuesday 13 January 2026 19:43
by Maciek90
I tried the variable script, and it doesn't work correctly. When the PIR detects motion and turns on the lamp, Domoticz thinks the lamp was manually turned on and leaves it on continuously. This can be seen in the log screenshot.

One more question: Is a Boolean variable the same as a string?

Re: Problem with the blockly script turning on the light

Posted: Wednesday 14 January 2026 12:41
by habahabahaba
1. Create a user variable and Name it LightHandMode , Type - integer, default value - 0
2. Create a virtual Dummy switch, name as you want
3. create a Dzvents script and put this code (check Idx of your devices) :
Spoiler: show

Code: Select all

local dummySwitchId = 101  -- Idx of virtual switch

return {

	on = {
		devices = {dummySwitchId},

	    },
	
    logging = {
	            level = domoticz.LOG_INFO,
	             marker = 'Hand mode light',
	           },
	
	execute = function(domoticz, device)
	    
	    local handSwitch = domoticz.devices(dummySwitchId)
		
		local SwitchLightIds = { 
            68, 1574 -- Ids of light switches for hand mode, just add or remove
        }
		
		if handSwitch.state == 'On' then
		    
		    for _, SwitchLightId in ipairs(SwitchLightIds) do
                domoticz.devices(SwitchLightId).switchOn().checkFirst()
                domoticz.log('Device '.. domoticz.devices(SwitchLightId).name .. ' is ON', domoticz.LOG_INFO)
            end
        
            domoticz.variables('LightHandMode').set('1')
            domoticz.log('User variable <LightHandMode> set to 1', domoticz.LOG_INFO)
		    
		else
		    
		    for _, SwitchLightId in ipairs(SwitchLightIds) do
                domoticz.devices(SwitchLightId).switchOff().checkFirst()
                domoticz.log('Device '..domoticz.devices(SwitchLightId).name .. 'is OFF', domoticz.LOG_INFO)
            end
        
            domoticz.variables('LightHandMode').set('0')
            domoticz.log('User variable <LightHandMode> set to 0', domoticz.LOG_INFO)

        end
		
	end
}
4. Edit your working script
Spoiler: show

Code: Select all

local SCRIPT_NAME = 'PIR '
local LOG_LEVEL = domoticz.LOG_FORCE

return {
    on = {
        devices  = { 69, 1575}, -- only PIR sensors, no switches
    },

    logging = {
        level = LOG_LEVEL,
        marker = SCRIPT_NAME
    },

    execute = function(dz, device)
        
        
        if dz.variables('LightHandMode').value = 0 then

            -- Log which device triggered the script 
            dz.log('Script triggered by device: ' .. device.name .. ' (ID: ' .. device.id .. ')', LOG_LEVEL)
    
            -- Apparaten ophalen
            local pirDevice1 = dz.devices(69)
            local pirDevice2 = dz.devices(1575)
            local lamp1 = dz.devices(68)
            local lamp2 = dz.devices(1574)
    
            -- PIR1 and lamp1
            if pirDevice1.state == "On" and lamp1.state == "Off" then
                lamp1.switchOn()
                dz.log('PIR1 triggered. Switching Lamp1 ON', LOG_LEVEL)
            elseif pirDevice1.state == "Off" and lamp1.state == "On" then
                lamp1.switchOff().afterSec(30)
                dz.log('PIR1 triggered. Switching Lamp1 OFF in 30 sec', LOG_LEVEL)
            end
    
            -- PIR2 and lamp2
            if pirDevice2.state == "On" and lamp2.state == "Off" then
                lamp2.switchOn()
                dz.log('PIR2 triggered. Switching Lamp2 ON', LOG_LEVEL)
            elseif pirDevice2.state == "Off" and lamp2.state == "On" then
                lamp2.switchOff().afterSec(30)
                dz.log('PIR2 triggered. Switching Lamp2 OFF in 30 sec', LOG_LEVEL)
            end
        else
        
            dz.log('Hand mode is ON, do nothing', LOG_LEVEL)
        
        end


end
}


Re: Problem with the blockly script turning on the light

Posted: Sunday 18 January 2026 13:12
by madpatrick
Hi,

This script should work. I've tested is shortly with some dumy devices

Code: Select all

local SCRIPT_NAME = 'PIR'
local LOG_LEVEL = domoticz.LOG_FORCE

return {
    on = {
        devices = {68, 69, 1574, 1575},
    },

    logging = {
        level = LOG_LEVEL,
        marker = SCRIPT_NAME
    },

    execute = function(dz, device)

        local pir1 = dz.devices(69)
        local pir2 = dz.devices(1575)
        local lamp1 = dz.devices(68)
        local lamp2 = dz.devices(1574)
        local lamp1PirVar = dz.variables('Lamp1_PIR')
        local lamp2PirVar = dz.variables('Lamp2_PIR')
        ----------------------------------------------------------------
        -- PIR 1 / Lamp 1 logic
        ----------------------------------------------------------------

        -- PIR triggers → turn lamp on and mark as PIR-controlled
        if device.id == pir1.id and pir1.state == 'On' and lamp1.state == 'Off' and lamp1PirVar.value == 0 then
            lamp1.switchOn().checkFirst()
            lamp1PirVar.set(1)
            dz.log('PIR1 → Lamp1 ON (PIR mode)', LOG_LEVEL)
        end

        -- PIR stops → only turn off if lamp was turned on by PIR
        if device.id == pir1.id and pir1.state == 'Off' and lamp1.state == 'On' and lamp1PirVar.value == 1 then
            lamp1.switchOff().afterSec(30)
            lamp1PirVar.set(0)
            dz.log('PIR1 → Lamp1 OFF in 30 sec (PIR mode)', LOG_LEVEL)
        end

        -- Manual lamp activation → disable PIR mode
        if device.id == lamp1.id and lamp1.state == 'On' and pir1.state == 'Off' and lamp1PirVar.value == 0 then
            dz.log('Lamp1 manually turned on → PIR mode remains disabled', LOG_LEVEL)
        end

        ----------------------------------------------------------------
        -- PIR 2 / Lamp 2 logic
        ----------------------------------------------------------------

        -- PIR triggers → turn lamp on and mark as PIR-controlled
        if device.id == pir2.id and pir2.state == 'On' and lamp2.state == 'Off' and lamp2PirVar.value == 0 then
            lamp2.switchOn().checkFirst()
            lamp2PirVar.set(1)
            dz.log('PIR2 → Lamp2 ON (PIR mode)', LOG_LEVEL)
        end

        -- PIR stops → only turn off if lamp was turned on by PIR
        if device.id == pir2.id and pir2.state == 'Off' and lamp2.state == 'On' and lamp2PirVar.value == 1 then
            lamp2.switchOff().afterSec(30)
            lamp2PirVar.set(0)
            dz.log('PIR2 → Lamp2 OFF in 30 sec (PIR mode)', LOG_LEVEL)
        end

        -- Manual lamp activation → disable PIR mode
        if device.id == lamp2.id and lamp2.state == 'On' and pir2.state == 'Off' and lamp2PirVar.value == 0 then
            dz.log('Lamp2 manually turned on → PIR mode remains disabled', LOG_LEVEL)
        end
    end
}
You need to make a UserVariable

Name : Lamp1_PIR
Type : Integer
Value : 0

Name : Lamp2_PIR
Type : Integer
Value : 0

Re: Problem with the blockly script turning on the light

Posted: Monday 19 January 2026 19:06
by akamming
Maciek90 wrote: Tuesday 13 January 2026 19:43 I tried the variable script, and it doesn't work correctly. When the PIR detects motion and turns on the lamp, Domoticz thinks the lamp was manually turned on and leaves it on continuously. This can be seen in the log screenshot.

One more question: Is a Boolean variable the same as a string?
Just a hint: ask ChatGPT these questions while referring to the dzvents socumentation. You’ll be surprised how well it can do dzvents scriptie. Sometime the scripts have bugs, But if you aso ChatGPT to solve them (just feed with the error or behaviour) it Will also correct them…

Re: Problem with the blockly script turning on the light

Posted: Tuesday 20 January 2026 23:08
by Maciek90
This script should work. I've tested is shortly with some dumy devices
I ran your script today and it's working fine so far. I'll try to test all the possibilities in the next few days and let you know if everything works as it should.
Just a hint: ask ChatGPT these questions while referring to the dzvents socumentation. You’ll be surprised how well it can do dzvents scriptie. Sometime the scripts have bugs, But if you aso ChatGPT to solve them (just feed with the error or behaviour) it Will also correct them…
Last year, I tried to write what turned out to be a fairly simple script using chatGPT, and unfortunately, I gave up after a few days. I managed to get the script working on the forum within a day :)
ChatGPT is constantly evolving, and perhaps dzvents is as well. Maybe I'll give it another try some other time.

Re: Problem with the blockly script turning on the light

Posted: Tuesday 03 February 2026 9:32
by Maciek90
Unfortunately, the script doesn't work perfectly. There's a similar problem to the Blockly script presented in the first post: sometimes, the script won't turn off the light even though 30 seconds have passed since the motion sensor signal went off. This happens very rarely, once every few days. Below are screenshots of the Domoticz logs and the light button logs. You can see that the light turned on at 8:38 PM, and at 9:13 PM, I manually turned it off because it didn't automatically turn off after 30 seconds. There's also another problem with this script. If the light doesn't turn off after 30 seconds, the value of the variable doesn't change from 1 to 0. Therefore, when I manually turn off the light, I also have to manually change the value of the variable to 0. Otherwise, the motion sensor signal doesn't turn on the light.

Code: Select all

2026-01-28 20:30:58.924 Status: Set UserVariable Lamp2_PIR = 1
2026-01-28 20:31:07.483 Status: Set UserVariable Lamp2_PIR = 0
2026-01-28 20:35:11.881 Status: Set UserVariable Lamp1_PIR = 1
2026-01-28 20:35:20.750 Status: Set UserVariable Lamp1_PIR = 0
2026-01-28 20:38:11.479 Status: Set UserVariable Lamp2_PIR = 1
2026-01-28 20:45:48.930 Status: Set UserVariable Lamp1_PIR = 1
2026-01-28 20:45:57.460 Status: Set UserVariable Lamp1_PIR = 0 

Re: Problem with the blockly script turning on the light

Posted: Thursday 05 February 2026 10:57
by habahabahaba
Do you need to turn on the lights individually or together?