Howto? Device ON, execute script after x seconds Topic is solved

Moderator: leecollings

Post Reply
BarryT
Posts: 369
Joined: Tuesday 31 March 2015 22:06
Target OS: Linux
Domoticz version: 2024.3
Location: east netherlands
Contact:

Howto? Device ON, execute script after x seconds

Post by BarryT »

Hi,

I just want a lua script that will execute a script after turning on an device..
For example, if an device has turned on, it has at least the need for 30 seconds to connect to wi-fi, after that i can execute my script.
Is it possible to add a sleep in lua, or something?

Thanks!!
User avatar
waaren
Posts: 6028
Joined: Tuesday 03 January 2017 14:18
Target OS: Linux
Domoticz version: Beta
Location: Netherlands
Contact:

Re: Howto? Device ON, execute script after x seconds

Post by waaren »

BarryT wrote: Saturday 12 December 2020 8:59 For example, if an device has turned on, it has at least the need for 30 seconds to connect to wi-fi, after that i can execute my script.
Is it possible to add a sleep in lua, or something?
In classic Lua you need a dummy device to do this because the script will be canceled by domoticz after 10 seconds. In dzVents (100% Lua) you could do it without an extra dummy, using emitEvent() triggering a customEvent.
Debian buster, bullseye on RPI-4, Intel NUC.
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
BarryT
Posts: 369
Joined: Tuesday 31 March 2015 22:06
Target OS: Linux
Domoticz version: 2024.3
Location: east netherlands
Contact:

Re: Howto? Device ON, execute script after x seconds

Post by BarryT »

waaren wrote: Saturday 12 December 2020 10:12
BarryT wrote: Saturday 12 December 2020 8:59 For example, if an device has turned on, it has at least the need for 30 seconds to connect to wi-fi, after that i can execute my script.
Is it possible to add a sleep in lua, or something?
In classic Lua you need a dummy device to do this because the script will be canceled by domoticz after 10 seconds. In dzVents (100% Lua) you could do it without an extra dummy, using emitEvent() triggering a customEvent.
Thanks for answering!
Could you share the script for a classic lua then?
And what is the meaning of the dummy device compared to a normal device to do this?
User avatar
waaren
Posts: 6028
Joined: Tuesday 03 January 2017 14:18
Target OS: Linux
Domoticz version: Beta
Location: Netherlands
Contact:

Re: Howto? Device ON, execute script after x seconds

Post by waaren »

BarryT wrote: Saturday 12 December 2020 17:22 What is the meaning of the dummy device compared to a normal device to do this?
A dummy (virtual) device does not send a real command to a physical device.
Could you share the script for a classic lua then?
Could look like this

Code: Select all

local myWifiConnectedDevice = 'WifiConnectedDevice' -- change to name of your wifi connected device
local dummy = 'virtual switch'  -- change to name of your virtual (dummy) helper device

local delay = 30 -- set to required delay
local debug = true -- set to false when everything is OK


commandArray = {}

    local function dPrint(data)

        local function tPrint (t, indent, done)  -- table print function for debugging purposes
            local done = done or {}
            indent = indent or 0
             for key, value in pairs (t) do
                pre = (string.rep (" ", indent)) -- indent it
                if type (value) == "table" and not done[value] then
                    done [value] = true
                    print (pre .. tostring (key) .. ":");
                    tPrint (value, indent + 2, done)
                elseif type(value) == 'function' and not done[value] then
                    print( pre .. (tostring (key) .. "()"))
                else
                    pre = pre .. (tostring (key) .. ": ")
                    print (pre .. tostring(value))
                end
            end
        end
    
        if debug and type(data) ~= 'table' then
            print('Debug: ' .. tostring(data) )
        elseif debug then
            tPrint(data)
        end

    end

    local function state (name)
        if devicechanged[name]  then return devicechanged[name], true
        elseif otherdevices[name] then return otherdevices[name], false
        else return false, false
        end 
     end

    local function isChanged(name)
        return devicechanged[name] ~= nil
    end

    local function afterSec(switch, action, delay)
        commandArray[switch] = action .. ' AFTER ' .. delay
        dPrint(switch .. ' will be set to ' .. action .. ' after ' .. delay .. ' seconds.')
    end

    if isChanged(myWifiConnectedDevice) and tostring( state(myWifiConnectedDevice) ) == 'On' then
        afterSec(dummy, 'On', delay )
        return
    elseif isChanged(dummy) and tostring( state(dummy) ) == 'On' then
        dPrint(devicechanged[dummy])
    else
        return 
    end

-- Rest of your script (to be executed 30 seconds after 'myWifiConnectedDevice' is activated below this line.

return commandArray

Debian buster, bullseye on RPI-4, Intel NUC.
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
BarryT
Posts: 369
Joined: Tuesday 31 March 2015 22:06
Target OS: Linux
Domoticz version: 2024.3
Location: east netherlands
Contact:

Re: Howto? Device ON, execute script after x seconds

Post by BarryT »

waaren wrote: Saturday 12 December 2020 21:13
BarryT wrote: Saturday 12 December 2020 17:22 What is the meaning of the dummy device compared to a normal device to do this?
A dummy (virtual) device does not send a real command to a physical device.
Could you share the script for a classic lua then?
Could look like this

Code: Select all

local myWifiConnectedDevice = 'WifiConnectedDevice' -- change to name of your wifi connected device
local dummy = 'virtual switch'  -- change to name of your virtual (dummy) helper device

local delay = 30 -- set to required delay
local debug = true -- set to false when everything is OK


commandArray = {}

    local function dPrint(data)

        local function tPrint (t, indent, done)  -- table print function for debugging purposes
            local done = done or {}
            indent = indent or 0
             for key, value in pairs (t) do
                pre = (string.rep (" ", indent)) -- indent it
                if type (value) == "table" and not done[value] then
                    done [value] = true
                    print (pre .. tostring (key) .. ":");
                    tPrint (value, indent + 2, done)
                elseif type(value) == 'function' and not done[value] then
                    print( pre .. (tostring (key) .. "()"))
                else
                    pre = pre .. (tostring (key) .. ": ")
                    print (pre .. tostring(value))
                end
            end
        end
    
        if debug and type(data) ~= 'table' then
            print('Debug: ' .. tostring(data) )
        elseif debug then
            tPrint(data)
        end

    end

    local function state (name)
        if devicechanged[name]  then return devicechanged[name], true
        elseif otherdevices[name] then return otherdevices[name], false
        else return false, false
        end 
     end

    local function isChanged(name)
        return devicechanged[name] ~= nil
    end

    local function afterSec(switch, action, delay)
        commandArray[switch] = action .. ' AFTER ' .. delay
        dPrint(switch .. ' will be set to ' .. action .. ' after ' .. delay .. ' seconds.')
    end

    if isChanged(myWifiConnectedDevice) and tostring( state(myWifiConnectedDevice) ) == 'On' then
        afterSec(dummy, 'On', delay )
        return
    elseif isChanged(dummy) and tostring( state(dummy) ) == 'On' then
        dPrint(devicechanged[dummy])
    else
        return 
    end

-- Rest of your script (to be executed 30 seconds after 'myWifiConnectedDevice' is activated below this line.

return commandArray

Thanks Waaren, works perfect!
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest