Page 1 of 1
How to detect who/what activated a LUA script
Posted: Tuesday 18 April 2017 9:26
by lupo2a
Dear all,
in a Lua (device) script how can I detect if the script was activated by a user action or by a timer associated to the control?
I need it in order to adapt the behavior of the script without adding lot of "virtual switch" with dedicated timers
Version: 3.7165
Platform: Raspberry PI3
Hardware: Fibaro FGRM222 Roller Shutter Controller 2
Re: How to detect who/what activated a LUA script
Posted: Tuesday 18 April 2017 15:45
by bueno79
hi,
it could be great to know if user A or user B activate a specific switch...very good for security purpose.
regards
Re: How to detect who/what activated a LUA script
Posted: Wednesday 19 April 2017 22:55
by georgesattali
Hello,
to test whether a script was called by a user or a timer, I would create a second script calling the one you already have (in the exemple below, named "myinitialscript.lua").
the second script is
Code: Select all
calledByUser=true
dofile("/home/pi/domoticz/scripts/lua/myinitialscript.lua")
Then, in myinitialscript.lua you can test :
Code: Select all
if calledByUser == true then
-- code if I was called by the user
dothis
dothat
else
-- code if I was called by the timer
dothingsfortimer
end
is good?
See U, GD
Re: How to detect who/what activated a LUA script
Posted: Thursday 20 April 2017 23:00
by lupo2a
Sorry but I didn't get the answer.
How can I create the first script so that it's runned only if a user activate a switch?
If I create the LUA script (Setup->More Options->events) "first_script" - LUA - DEVICE this will be run either by the user pressing the switch or by the timer associated with the switch
Within first_script I can check whether the switch has changed
Code: Select all
if devicechanged[name_of_switch] then
calledByUser=true
dofile("/home/pi/domoticz/scripts/lua/myinitialscript.lua")
end
but this will be true for both the cases:
- user pushed the switch
- the timer associated with the switch as fired an event
What I'm missing?
Tx
Version: 3.7165
Platform: Raspberry PI3
Hardware: Fibaro FGRM222 Roller Shutter Controller 2
Re: How to detect who/what activated a LUA script
Posted: Friday 21 April 2017 7:38
by gerard76
You can create an extra (dummy) switch and call that dummy switch with the timer. Have that dummy switch switch the original switch.
Now you know the timer flipped the switch and not the user because the user flipped the switch directly (without going through the dummy switch).
If it's to detect manual override I store my scripts last action in a user variable and in the next run I compare current switch state with last program action. If they are not equal it's a manual override situation.
Re: How to detect who/what activated a LUA script
Posted: Sunday 21 May 2017 22:02
by ronnyandre
@gerard76 Can you show me how this script implements user variable?
Re: How to detect who/what activated a LUA script
Posted: Monday 22 May 2017 6:53
by gerard76
Look at the manual_override bit at the end. If the program switches the fan on it stores this in the 'fan_program' variable. In subsequent runs I check to see if the fan state is the same as what the program told it to do. If not, it was switched manually.
Code: Select all
require('scripts/lua/time')
require('scripts/lua/air')
commandArray = {}
measurements = {}
-- settings:
fan = 'WC ventilator'
light = 'WC licht'
inside_sensor = 'Woonkamer'
outside_sensor = 'Buiten'
max_humidity = 62 -- max humidity in room
max_run_time = 10 -- in minutes
fan_light_delay = 40 -- second after light is turned on to enable fan
DEBUG = false
--[[ user variables:
wc_fan_program - string - Off
--]]
inside_hum = tonumber(otherdevices_humidity[inside_sensor])
inside_temp = tonumber(otherdevices_temperature[inside_sensor])
outside_temp = tonumber(otherdevices_temperature[outside_sensor])
outside_hum = tonumber(otherdevices_humidity[outside_sensor])
if devicechanged[fan] or devicechanged[inside_sensor] or devicechanged[outside_sensor] or devicechanged[light] then
fan_on = otherdevices[fan] == "On"
light_on = otherdevices[light] == "On"
too_moist = inside_hum > max_humidity
useful = air.abs_humidity(inside_temp, inside_hum) > air.abs_humidity(outside_temp, outside_hum) + 1
on_too_long = fan_on and time.minutes_since(otherdevices_lastupdate[fan]) > max_run_time
on_by_light = light_on and time.seconds_since(otherdevices_lastupdate[light]) > fan_light_delay
program_wants_on = not on_too_long and (too_moist and useful) or on_by_light
-- it's doing something else as the last program command AND it's not doing what the the program currently wants
manual_override = (otherdevices[fan] ~= uservariables['fan_program']) and (fan_on ~= program_wants_on)
if DEBUG then
print("wc fan is " .. otherdevices[fan] .. " for " .. time.minutes_since(otherdevices_lastupdate[fan]) .. " mins")
print("wc light is "..otherdevices[light].." for "..time.seconds_since(otherdevices_lastupdate[light]).." secs; on_by_light: " .. tostring(on_by_light))
print("wc current hum: " .. inside_hum .. "% max_hum: " .. max_humidity .. "%")
print("wc abs hum inside: " .. air.abs_humidity(inside_temp, inside_hum) .. "; abs hum outside: " .. air.abs_humidity(outside_temp, outside_hum))
print("wc manual override = " .. tostring(manual_override) .. "; useful: " .. tostring(useful) .. "; on too long: " .. tostring(on_too_long))
print("wc last program command: " .. uservariables['fan_program'] .. "; program wants on: " .. tostring(program_wants_on))
end
if not fan_on and program_wants_on and not manual_override then
commandArray[fan] = "On"
commandArray['Variable:fan_program'] = "On"
elseif (fan_on and on_too_long) or (fan_on and not program_wants_on and not manual_override) then
commandArray[fan] = "Off"
commandArray['Variable:fan_program'] = "Off"
end
end
return commandArray
If you do not use dzVents then