How to set timer - need to have active two sensors in specific time. [Solved]
Moderator: leecollings
How to set timer - need to have active two sensors in specific time.
Hi All,
I need dzvents script that will activate the switch if at least two any motion sensors (from 10 sensors) are active simultaneously in last 5 minutes.
So if first sensor detects the move then timer starts and if in the next 5 minutes second sensor discovers move then switch will be activated.
To be honest I didn't find option in doc how to achive it.
I need dzvents script that will activate the switch if at least two any motion sensors (from 10 sensors) are active simultaneously in last 5 minutes.
So if first sensor detects the move then timer starts and if in the next 5 minutes second sensor discovers move then switch will be activated.
To be honest I didn't find option in doc how to achive it.
- waaren
- Posts: 6028
- Joined: Tuesday 03 January 2017 14:18
- Target OS: Linux
- Domoticz version: Beta
- Location: Netherlands
- Contact:
Re: How to set timer - need to have active two sensors in specific time.
The wiki cannot give a dzVents solution for all automation challenges. It provides a description of the framework , methods and attributes you can use to create scripts up to your task.
Something like below should get you started.
I need dzvents script that will activate the switch if at least two any motion sensors (from 10 sensors) are active simultaneously in last 5 minutes.
Code: Select all
-- 2 out of 10
local sensors = -- table with names of all your motion sensors
{
'motion Sensor1',
'motion Sensor2',
'motion Sensor3',
'motion Sensor4',
'motion Sensor5',
'motion Sensor6',
'motion Sensor7',
'motion Sensor8',
'motion Sensor9',
'motion Sensor10',
}
local theSwitch = 'the switch' -- change to name of your switch
return
{
on =
{
devices = sensors,
},
data =
{
motionSensors =
{
initial = {},
},
},
logging =
{
level = domoticz.LOG_DEBUG, -- change to domoticz.LOG_ERROR when all OK
marker = 'scene Control',
},
execute = function(dz, item)
local function saveSensorActivationTime(str)
dz.data.motionSensors[str] = os.time()
end
local function twoOutOfTen()
local active = 0
for _, sensorName in ipairs(sensors) do
local seconds = os.time() -( dz.data.motionSensors[sensorName] or 0 )
if seconds < 300 then
dz.log(sensorName .. ' was activated ' .. seconds .. ' seconds ago.', dz.LOG_DEBUG )
active = active + 1
if active > 1 then return true end
end
end
end
if item.active then
saveSensorActivationTime(item.name)
if twoOutOfTen() then
dz.devices(theSwitch).switchOn()
end
end
end
}
Debian buster, bullseye on RPI-4, Intel NUC.
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
Re: How to set timer - need to have active two sensors in specific time.
Where should I place additional condition like if domoticz.devices('Alarm').state == 'On') then execute rest function so turn on the switch if at least these two sensors are active.
- waaren
- Posts: 6028
- Joined: Tuesday 03 January 2017 14:18
- Target OS: Linux
- Domoticz version: Beta
- Location: Netherlands
- Contact:
Re: How to set timer - need to have active two sensors in specific time.
There are multiple approaches to that but to keep it simple change
Code: Select all
if twoOutOfTen() then
dz.devices(theSwitch).switchOn()
end
Code: Select all
if twoOutOfTen() and dz.devices('Alarm').state == 'On' then
dz.devices(theSwitch).switchOn()
end
Debian buster, bullseye on RPI-4, Intel NUC.
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
Re: How to set timer - need to have active two sensors in specific time.
Tested and ...
Script works well when I added two tested switches and manually activated them but when I use my motion sensors scripts starts and right away finish. What can be wrong?
Here is current script I have
Script works well when I added two tested switches and manually activated them but when I use my motion sensors scripts starts and right away finish. What can be wrong?
Code: Select all
2020-10-22 00:15:14.624 Status: dzVents: Info: XXX: ------ Start internal script: Test: Device: "Garaż (Dummy)", Index: 135
2020-10-22 00:15:14.626 Status: dzVents: Info: XXX: ------ Finished Test
Code: Select all
local sensors = -- table with names of all your motion sensors
{
'Salon',
'Garaż',
'Kuchnia',
}
local theSwitch = 'Włamanie noc' -- change to name of your switch
return
{
on =
{
devices = sensors,
},
data =
{
motionSensors =
{
initial = {},
},
},
logging =
{
level = domoticz.LOG_DEBUG, -- change to domoticz.LOG_ERROR when all OK
marker = 'XXX',
},
execute = function(dz, item)
local function saveSensorActivationTime(str)
dz.data.motionSensors[str] = os.time()
end
local function twoOutOfTen()
local active = 0
for _, sensorName in ipairs(sensors) do
local seconds = os.time() -( dz.data.motionSensors[sensorName] or 0 )
if seconds < 300 then
dz.log(sensorName .. ' was activated ' .. seconds .. ' seconds ago.', dz.LOG_DEBUG )
active = active + 1
if active > 1 then return true end
end
end
end
if item.active then
saveSensorActivationTime(item.name)
if twoOutOfTen() and dz.devices('Alarm noc').state == 'On' then
dz.devices(theSwitch).switchOn()
end
end
end
}
- waaren
- Posts: 6028
- Joined: Tuesday 03 January 2017 14:18
- Target OS: Linux
- Domoticz version: Beta
- Location: Netherlands
- Contact:
Re: How to set timer - need to have active two sensors in specific time.
It seems that your motion sensors do not report that they are active or your Alarm does not report it has the 'On' state.
If a script does not work as expected and the log does not show sufficient information to understand why, a first step to find a possible cause is to add more (debug)log statements... I added some in below script.
Code: Select all
local sensors = -- table with names of all your motion sensors
{
'Salon',
'Garaż',
'Kuchnia',
}
local theSwitch = 'Włamanie noc' -- change to name of your switch
local myAlarm = 'Alarm noc' -- change to name of your alarm
return
{
on =
{
devices = sensors,
},
data =
{
motionSensors =
{
initial = {},
},
},
logging =
{
level = domoticz.LOG_DEBUG, -- change to domoticz.LOG_ERROR when all OK
marker = 'scene Control',
},
execute = function(dz, item)
local alarm = dz.devices(myAlarm)
local switch = dz.devices(theSwitch)
local function saveSensorActivationTime(str)
dz.data.motionSensors[str] = os.time()
dz.log('os.time() is now: ' .. os.time(), dz.LOG_DEBUG )
if _G.logLevel == dz.LOG_DEBUG then
dz.utils.dumpTable(dz.data) -- show the content of persistent data
end
end
local function twoOutOfTen()
local active = 0
for _, sensorName in ipairs(sensors) do
if dz.data.motionSensors[sensorName] ~= nil then
local seconds = os.time() - dz.data.motionSensors[sensorName]
dz.log(sensorName .. ' was activated ' .. seconds .. ' seconds ago.', dz.LOG_DEBUG )
if seconds < 300 then
active = active + 1
end
end
end
return active > 1
end
dz.log(item.name .. ' state: ' .. tostring(item.state) .. '; active state: ' .. tostring(item.active), dz.LOG_DEBUG)
if item.active then
saveSensorActivationTime(item.name)
dz.log(alarm.name .. ' state: ' .. tostring(alarm.state), dz.LOG_DEBUG)
if twoOutOfTen() and alarm.state == 'On' then
dz.log('Switch ' .. switch.name .. ' will be activated',dz.LOG_DEBUG)
switch.switchOn()
end
end
end
}
Debian buster, bullseye on RPI-4, Intel NUC.
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
Re: How to set timer - need to have active two sensors in specific time.
Here you are logs:
Code: Select all
2020-10-22 12:19:16.629 Status: dzVents: Info: scene Control: ------ Start internal script: Test: Device: "Garaż (Dummy)", Index: 135
2020-10-22 12:19:16.632 Status: dzVents: Debug: scene Control: Processing device-adapter for Alarm noc: Switch device adapter
2020-10-22 12:19:16.634 Status: dzVents: Debug: scene Control: Processing device-adapter for Włamanie noc: Switch device adapter
2020-10-22 12:19:16.634 Status: dzVents: Debug: scene Control: Garaż state: 21.70;48.64;1; active state: false
2020-10-22 12:19:16.635 Status: dzVents: Info: scene Control: ------ Finished Test
2020-10-22 12:19:21.935 Status: dzVents: Info: scene Control: ------ Start internal script: Test: Device: "Salon (Dummy)", Index: 183
2020-10-22 12:19:21.938 Status: dzVents: Debug: scene Control: Processing device-adapter for Alarm noc: Switch device adapter
2020-10-22 12:19:21.940 Status: dzVents: Debug: scene Control: Processing device-adapter for Włamanie noc: Switch device adapter
2020-10-22 12:19:21.940 Status: dzVents: Debug: scene Control: Salon state: 24.60;49.67;1; active state: false
2020-10-22 12:19:21.941 Status: dzVents: Info: scene Control: ------ Finished Test
2020-10-22 12:19:46.622 Status: dzVents: Info: scene Control: ------ Start internal script: Test: Device: "Garaż (Dummy)", Index: 135
2020-10-22 12:19:46.625 Status: dzVents: Debug: scene Control: Processing device-adapter for Alarm noc: Switch device adapter
2020-10-22 12:19:46.627 Status: dzVents: Debug: scene Control: Processing device-adapter for Włamanie noc: Switch device adapter
2020-10-22 12:19:46.627 Status: dzVents: Debug: scene Control: Garaż state: 21.63;48.62;1; active state: false
2020-10-22 12:19:46.628 Status: dzVents: Info: scene Control: ------ Finished Test
- waaren
- Posts: 6028
- Joined: Tuesday 03 January 2017 14:18
- Target OS: Linux
- Domoticz version: Beta
- Location: Netherlands
- Contact:
Re: How to set timer - need to have active two sensors in specific time. [Solved]
It looks like the devices that you put in the sensors table are temperature / humidity devices. The script expect motion sensors...
can you use this modified script (with an extra logline to identify the deviceType and deviceSubType)
Code: Select all
local sensors = -- table with names of all your motion sensors
{
'Salon',
'Garaż',
'Kuchnia',
}
local theSwitch = 'Włamanie noc' -- change to name of your switch
local myAlarm = 'Alarm noc' -- change to name of your alarm
return
{
on =
{
devices = sensors,
},
data =
{
motionSensors =
{
initial = {},
},
},
logging =
{
level = domoticz.LOG_DEBUG, -- change to domoticz.LOG_ERROR when all OK
marker = 'scene Control',
},
execute = function(dz, item)
local alarm = dz.devices(myAlarm)
local switch = dz.devices(theSwitch)
local function saveSensorActivationTime(str)
dz.data.motionSensors[str] = os.time()
dz.log('os.time() is now: ' .. os.time(), dz.LOG_DEBUG )
if _G.logLevel == dz.LOG_DEBUG then
dz.utils.dumpTable(dz.data) -- show the content of persistent data
end
end
local function twoOutOfTen()
local active = 0
for _, sensorName in ipairs(sensors) do
if dz.data.motionSensors[sensorName] ~= nil then
local seconds = os.time() - dz.data.motionSensors[sensorName]
dz.log(sensorName .. ' was activated ' .. seconds .. ' seconds ago.', dz.LOG_DEBUG )
if seconds < 300 then
active = active + 1
end
end
end
return active > 1
end
dz.log(item.name .. ' state: ' .. tostring(item.state) .. '; active state: ' .. tostring(item.active), dz.LOG_DEBUG )
dz.log(item.name .. ' (' .. item.idx ..'); deviceType: ' .. tostring(item.deviceType) .. '; deviceSubType: ' .. tostring(item.deviceSubType), dz.LOG_DEBUG )
if item.active then
saveSensorActivationTime(item.name)
dz.log(alarm.name .. ' state: ' .. tostring(alarm.state), dz.LOG_DEBUG)
if twoOutOfTen() and alarm.state == 'On' then
dz.log('Switch ' .. switch.name .. ' will be activated',dz.LOG_DEBUG)
switch.switchOn()
end
end
end
}
Debian buster, bullseye on RPI-4, Intel NUC.
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
Re: How to set timer - need to have active two sensors in specific time.
Sorry my fault I have also the temp+hum sensors behind the motion sensors - I disabled them to not confused log output.
Motion sensors are Light/Switch type (wireless 433MHz) with Sonoff RF Bridge.
Motion sensors are Light/Switch type (wireless 433MHz) with Sonoff RF Bridge.
Code: Select all
2020-10-22 14:14:26.580 Status: dzVents: Info: scene Control: ------ Finished Test
2020-10-22 14:14:30.212 MQTT: Topic: domoticz/in, Message: {"idx":10,"nvalue":0,"svalue":"15621550","Battery":59,"RSSI":6}
2020-10-22 14:14:30.579 (Dummy) Light/Switch (Salon)
2020-10-22 14:14:30.539 Status: EventSystem: Script event triggered: /home/pi/domoticz/dzVents/runtime/dzVents.lua
2020-10-22 14:14:31.368 MQTT: Topic: domoticz/in, Message: {"idx":59,"nvalue":0,"svalue":"15621550","Battery":57,"RSSI":9}
2020-10-22 14:14:39.083 MQTT: Topic: domoticz/in, Message: {"idx":10,"nvalue":0,"svalue":"15683422","Battery":59,"RSSI":6}
2020-10-22 14:14:39.206 MQTT: Topic: domoticz/in, Message: {"idx":59,"nvalue":0,"svalue":"15683422","Battery":57,"RSSI":9}
2020-10-22 14:14:43.750 MQTT: Topic: domoticz/in, Message: {"idx":10,"nvalue":0,"svalue":"7799975","Battery":59,"RSSI":6}
2020-10-22 14:14:44.522 MQTT: Topic: domoticz/in, Message: {"idx":59,"nvalue":0,"svalue":"15599950","Battery":57,"RSSI":9}
2020-10-22 14:14:50.174 MQTT: Topic: domoticz/in, Message: {"idx":10,"nvalue":0,"svalue":"15603710","Battery":60,"RSSI":6}
2020-10-22 14:14:51.431 MQTT: Topic: domoticz/in, Message: {"idx":10,"nvalue":0,"svalue":"15599950","Battery":59,"RSSI":6}
2020-10-22 14:14:51.556 MQTT: Topic: domoticz/in, Message: {"idx":59,"nvalue":0,"svalue":"15599950","Battery":57,"RSSI":9}
2020-10-22 14:14:57.082 MQTT: Topic: domoticz/in, Message: {"idx":59,"nvalue":0,"svalue":"15634430","Battery":57,"RSSI":9}
2020-10-22 14:14:57.205 MQTT: Topic: domoticz/in, Message: {"idx":10,"nvalue":0,"svalue":"15634430","Battery":59,"RSSI":7}
2020-10-22 14:15:04.637 MQTT: Topic: domoticz/in, Message: {"idx":10,"nvalue":0,"svalue":"14761994","Battery":59,"RSSI":5}
2020-10-22 14:15:04.961 Status: EventSystem: Script event triggered: /home/pi/domoticz/dzVents/runtime/dzVents.lua
2020-10-22 14:15:05.012 (Dummy) Light/Switch (Drzwi garaż)
2020-10-22 14:15:06.238 MQTT: Topic: domoticz/in, Message: {"idx":59,"nvalue":0,"svalue":"15506830","Battery":57,"RSSI":9}
2020-10-22 14:15:06.581 (Dummy) Light/Switch (Garaż)
2020-10-22 14:15:06.560 Status: EventSystem: Script event triggered: /home/pi/domoticz/dzVents/runtime/dzVents.lua
2020-10-22 14:15:07.131 MQTT: Topic: domoticz/in, Message: {"idx":10,"nvalue":0,"svalue":"15506830","Battery":59,"RSSI":5}
2020-10-22 14:15:11.861 MQTT: Topic: domoticz/in, Message: {"idx":59,"nvalue":0,"svalue":"14761994","Battery":57,"RSSI":9}
2020-10-22 14:15:12.221 (Dummy) Light/Switch (Drzwi garaż)
2020-10-22 14:15:12.508 MQTT: Topic: domoticz/in, Message: {"idx":1
Who is online
Users browsing this forum: No registered users and 1 guest