Page 1 of 1
script doesn't do what I want
Posted: Monday 15 April 2024 14:30
by Jan Jansen
Code: Select all
return {
on = {
devices =
{
'Bed José (Action)_single', -- zigbee push button
'Bed MJ (Action)_single', -- zigbee push button
'Beweging slaapkamer (Pir)', -- zigbee motion sensor
},
},
logging =
{
level = domoticz.LOG_DEBUG,
marker = 'nachtverlichting slaapkamer',
},
execute = function(dz, device)
local bj = dz.devices('Bed José (Action)_single')
local bmj = dz.devices('Bed MJ (Action)_single')
local nvs = dz.devices('Nachtverlichting slaapkamer') -- zigbee outlet
local pirslpkmr = dz.devices('Beweging slaapkamer (Pir)')
dz.log('Beweging slaapkamer (Pir), state: ' .. pirslpkmr.state, dz.LOG_DEBUG)
if (bj.state == 'On' or bmj.state == 'On' or pirslpkmr.state == 'On') and nvs.state == 'Off' then
nvs.switchOn().forMin(10)
elseif (bj.state == 'On' or bmj.state == 'On') and nvs.state == 'On' then
nvs.switchOff()
end
end
}
When using the push buttons, the script works as intended. When the PIR is activated, the "Nachtverlichting" turns 'On' as intended.
Code: Select all
2024-04-15 13:16:39.655 Zigbee2mqtt: Light/Switch/Switch (Beweging slaapkamer (Pir))
2024-04-15 13:16:39.681 Zigbee2mqtt: General/Voltage (Beweging slaapkamer)
2024-04-15 13:16:39.821 Status: dzVents: Info: Handling events for: "Beweging slaapkamer (Pir)", value: "On"
2024-04-15 13:16:39.825 Status: dzVents: Info: nachtverlichting slaapkamer: ------ Start internal script: Script #1: Device: "Beweging slaapkamer (Pir) (Zigbee2mqtt)", Index: 251
2024-04-15 13:16:39.825 Status: dzVents: Debug: nachtverlichting slaapkamer: Beweging slaapkamer (Pir), state: On
2024-04-15 13:16:39.825 Status: dzVents: Debug: nachtverlichting slaapkamer: Constructed timed-command: On
2024-04-15 13:16:39.825 Status: dzVents: Debug: nachtverlichting slaapkamer: Constructed timed-command: On FOR 600 SECONDS
2024-04-15 13:16:39.825 Status: dzVents: Info: nachtverlichting slaapkamer: ------ Finished Script #1
2024-04-15 13:16:39.828 Status: EventSystem: Script event triggered: /home/mj/domoticz/dzVents/runtime/dzVents.lua
2024
After PIR activation, the Domoticz motion sensor (switch) remains 'On' for 1 minute. It then switches 'Off' and the "Nachtverlichting" also switches 'Off' (the 'Nachtverlichting' was intended to only switch off after 10 minutes). The log then shows
Code: Select all
2024-04-15 13:17:47.945 Zigbee2mqtt: Light/Switch/Switch (Beweging slaapkamer (Pir))
2024-04-15 13:17:47.959 Zigbee2mqtt: General/Voltage (Beweging slaapkamer)
2024-04-15 13:17:48.089 Status: dzVents: Info: Handling events for: "Beweging slaapkamer (Pir)", value: "Off"
2024-04-15 13:17:48.094 Status: dzVents: Info: nachtverlichting slaapkamer: ------ Start internal script: Script #1: Device: "Beweging slaapkamer (Pir) (Zigbee2mqtt)", Index: 251
2024-04-15 13:17:48.094 Status: dzVents: Debug: nachtverlichting slaapkamer: Beweging slaapkamer (Pir), state: Off
2024-04-15 13:17:48.094 Status: dzVents: Debug: nachtverlichting slaapkamer: Constructed timed-command: Off
2024-04-15 13:17:48.094 Status: dzVents: Info: nachtverlichting slaapkamer: ------ Finished Script #1
2024-04-15 13:17:48.097 Status: EventSystem: Script event triggered: /home/mj/domoticz/dzVents/runtime/dzVents.lua
2024
I don't understand why the "Nachtverlichting" turns 'Off' when the Domoticz motion sensor (switch) turns 'Off'. Nowhere in the script is this requested. What's going wrong?
Thanks in advance!
Re: script doesn't do what I want
Posted: Monday 15 April 2024 14:45
by jvdz
Jan Jansen wrote: ↑Monday 15 April 2024 14:30
I don't understand why the "Nachtverlichting" turns 'Off' when the Domoticz motion sensor (switch) turns 'Off'. Nowhere in the script is this requested. What's going wrong?
Thanks in advance!
Well, the PIR Off does trigger an event, so the second if is somehow true at that time the PIR goes off:
Code: Select all
elseif (bj.state == 'On' or bmj.state == 'On') and nvs.state == 'On' then
nvs.switchOff()
end
So could it be that either bj.state or bmj.state is still "On" at that time?
Maybe add a debug log message to the code to check that?
Re: script doesn't do what I want
Posted: Monday 15 April 2024 16:36
by Jan Jansen
@jvdz,
You're right, that's the problem.
I tried to solve it with:
Code: Select all
elseif (bj.state == 'On' or bmj.state == 'On') and pirslpkmr.lastUpdate.secondsAgo > 70 and nvs.state == 'On' then
nvs.switchOff()
But that change does not solve the problem
Re: script doesn't do what I want
Posted: Monday 15 April 2024 17:02
by jvdz
Just so I understand what you like to accomplish: This second test is to be able to interrupt the 10 minutes on by pressing one of the 2 buttons so it should only do something when the event is originating from either of those buttons?
Re: script doesn't do what I want
Posted: Monday 15 April 2024 19:04
by habahabahaba
May be
Code: Select all
elseif (bj.state == 'On' or bmj.state == 'On') and nvs.state == 'On' then
if pirslpkmr.state == 'Off' then
nvs.cancelQueuedCommands()
nvs.switchOff().afterSec(600)
else
nvs.switchOff()
end
end
?
Re: script doesn't do what I want
Posted: Monday 15 April 2024 19:53
by Jan Jansen
First of all, thank you both for your time and attention.
What do I want to achieve:
1. Lighting on for a maximum of 10 minutes after PIR activation or after activation of 1 of the 2 push buttons.
2. Lighting off after activation of 1 of the 2 push buttons.
The adjustment suggested by @habahabahaba does not work as intended.
Code: Select all
2024-04-15 19:35:15.956 Zigbee2mqtt: Light/Switch/Switch (Beweging slaapkamer (Pir))
2024-04-15 19:35:15.988 Zigbee2mqtt: General/Voltage (Beweging slaapkamer)
2024-04-15 19:35:16.133 Status: dzVents: Info: Handling events for: "Beweging slaapkamer (Pir)", value: "On"
2024-04-15 19:35:16.138 Status: dzVents: Info: nachtverlichting slaapkamer: ------ Start internal script: Script #1: Device: "Beweging slaapkamer (Pir) (Zigbee2mqtt)", Index: 251
2024-04-15 19:35:16.138 Status: dzVents: Debug: nachtverlichting slaapkamer: Beweging slaapkamer (Pir), state: On
2024-04-15 19:35:16.138 Status: dzVents: Debug: nachtverlichting slaapkamer: Bed José (Action)_single, state: On
2024-04-15 19:35:16.138 Status: dzVents: Debug: nachtverlichting slaapkamer: Bed MJ (Action)_single, state: On
2024-04-15 19:35:16.138 Status: dzVents: Debug: nachtverlichting slaapkamer: Constructed timed-command: Off
2024-04-15 19:35:16.138 Status: dzVents: Info: nachtverlichting slaapkamer: ------ Finished Script #1
2024
Re: script doesn't do what I want
Posted: Monday 15 April 2024 20:00
by jvdz
Jan Jansen wrote: ↑Monday 15 April 2024 19:53
2. Lighting off after activation of 1 of the 2 push buttons.
In that case I think you should test for the device that triggered the event by reading the event data.
Something like this maybe ( I am not able to test this easily)
Code: Select all
elseif (device.name == 'Bed José (Action)_single' or device.name == 'Bed MJ (Action)_single') and nvs.state == 'On' Then
nvs.switchOff()
end
Maybe this is a nicer/shorter version of your logic using the Event device data:
Code: Select all
if nvs.state == 'Off' and device.state == 'On' then
nvs.switchOn().forMin(10)
elseif nvs.state == 'On' and device.state == 'On' and device.name ~= 'Beweging slaapkamer (Pir)' Then
nvs.switchOff()
end
Re: script doesn't do what I want
Posted: Tuesday 16 April 2024 9:30
by habahabahaba
Code: Select all
return {
on = {
devices = {58, 59, 68}, -- Idx of 2 buttons and Motion sensor, change to yours
},
logging = {
level = domoticz.LOG_DEBUG,
marker = 'nachtverlichting slaapkamer',
},
execute = function(domoticz, device)
--local nvs = domoticz.devices(25) -- idx of your zigbee outlet
local nvs = dz.devices('Nachtverlichting slaapkamer')
if (device.name =='Bed José (Action)_single' or device.name =='Bed MJ (Action)_single' and device.state == 'On' ) then
if nvs.state == 'On' then
nvs.switchOff()
else
nvs.switchOn().forMin(10).checkFirst() -- CheckFirst is needed cause some time forMin() doesn't work without it
end
elseif (device.name =='Beweging slaapkamer (Pir)' and device.state == 'On') then
nvs.switchOn().forMin(10).checkFirst()
end
end
}
Re: script doesn't do what I want
Posted: Wednesday 17 April 2024 14:23
by Jan Jansen
jvdz wrote: ↑Monday 15 April 2024 20:00
Maybe this is a nicer/shorter version of your logic using the Event device data:
Code: Select all
if nvs.state == 'Off' and device.state == 'On' then
nvs.switchOn().forMin(10)
elseif nvs.state == 'On' and device.state == 'On' and device.name ~= 'Beweging slaapkamer (Pir)' Then
nvs.switchOff()
end
Thanks, this is what I was looking for. Using device.state was new to me