more timers executing at the same time ?

Easy to use, 100% Lua-based event scripting framework.

Moderator: leecollings

Post Reply
pvklink
Posts: 822
Joined: Wednesday 12 November 2014 15:01
Target OS: Raspberry Pi / ODroid
Domoticz version: latest b
Contact:

more timers executing at the same time ?

Post by pvklink »

Hi, i thought my irrigationscript was running perfect. But it is not working 100%.
i have three section(swiches) with programm 10 that seems to work perfect!
I have one section Tuinirrigatie_planten_timer with programm 20, every other day that did not start at all...

Could it be that a script cant execute twice at the same time (10 every day at sunset and 20 each other day ?)
No errors in the log...

Code: Select all

--local Tuinirrigatietimer10 = 'at 15:20 on mon,tue,wed,thu,fri,sat,sun'
local Tuinirrigatietimer10 = 'every day at sunset'
local Tuinirrigatietimer20 = 'every other day at sunset'
local Tuinirrigatietimer30 = 'at sunset on mon,thu,sun'
local Tuinirrigatietimer40 = 'every saturday at sunset'
local Tuinirrigatietimer50 = 'every month on the first at sunset'

return {
    on =    { timer = {Tuinirrigatietimer10,Tuinirrigatietimer20,Tuinirrigatietimer30,Tuinirrigatietimer40,Tuinirrigatietimer50},
              devices = {'Tuinirrigatie','Tuinirrigatie_border_links_timer','Tuinirrigatie_border_rechts_timer','Tuinirrigatie_gazon_timer','Tuinirrigatie_planten_timer'}},

    logging =   { level   = domoticz.LOG_INFO ,                  
                  marker  = "Timers irrigatie"},
              
    execute = function(dz,item,info)
        
    local iswitch1      = dz.devices('Tuinirrigatie_border_links_timer')
    local iswitch2      = dz.devices('Tuinirrigatie_border_rechts_timer')
    local iswitch3      = dz.devices('Tuinirrigatie_gazon_timer')
    local iswitch4      = dz.devices('Tuinirrigatie_planten_timer')
    local switch2       = dz.devices('hetregent')
    local switch3       = dz.devices('Tuinirrigatie')
    local now           = os.time(os.date('*t'))      
    local devduur1      = tonumber(dz.devices('Tuinirrigatie_border_links_waarde').levelName)
    local devduur2      = tonumber(dz.devices('Tuinirrigatie_border_rechts_waarde').levelName)
    local devduur3      = tonumber(dz.devices('Tuinirrigatie_gazon_waarde').levelName)
    local devduur4      = tonumber(dz.devices('Tuinirrigatie_planten_waarde').levelName)
    local devpauze      = 1
    
   if devduur1 >0 then 
        aftertimer1   = devduur1 + devpauze
    else
        aftertimer1   = 0
    end
    if devduur2 > 0 then 
        aftertimer2   = aftertimer1 + devduur2 + devpauze
    else
        aftertimer2   = aftertimer1
    end
    if devduur3 > 0 then 
        aftertimer3   = aftertimer2 + devduur3 + devpauze
    else 
        aftertimer3   = aftertimer2
    end
    if devduur4 > 0 then 
        aftertimer4   = aftertimer3 + devduur4 + devpauze
    else 
        aftertimer4   = aftertimer3
    end

    if (item.isTimer and iswitch1.level == 0 and iswitch2.level == 0 and iswitch3.level == 0 and iswitch4.level == 0) then
        dz.log("Script: " .. info.scriptName .. " Timerevent gestart maar alle timerzones staat uit", dz.LOG_INFO)

    elseif (item.isTimer and switch3.level == 0 ) then
        dz.log("Script: " .. info.scriptName .. " Timerevent gestart maar timerssysteem staat uit", dz.LOG_INFO)

    elseif (item.isTimer and switch3.level == 10 and switch2.state == 'On') then
        dz.log("Script: " .. info.scriptName .. " Timerevent is gestart, maar is niet aangezet, het is aan t regenen... ", dz.LOG_INFO)

    elseif ((item.isTimer and switch2.state == 'Off' and switch3.level == 10) or (item.isDevice and switch3.level == 20)) then     

        --dz.devices('usb lamp').switchSelector(20)               -- anders gaat t wel aan maar staat de selector niet op aan
        --dz.variables('ledlampkleur').set('blauw')
    
        if  (item.isTimer  and iswitch1.level == 10 and item.trigger == Tuinirrigatietimer10) or
            (item.isTimer  and iswitch1.level == 20 and item.trigger == Tuinirrigatietimer20) or 
            (item.isTimer  and iswitch1.level == 30 and item.trigger == Tuinirrigatietimer30) or 
            (item.isTimer  and iswitch1.level == 40 and item.trigger == Tuinirrigatietimer40) or
            (item.isTimer  and iswitch1.level == 50 and item.trigger == Tuinirrigatietimer50) or 
            (item.isDevice and switch3.level == 20) then
    
                if devduur1 >0 then 
                    dz.devices('Tuinirrigatie_border_links').switchOn().checkFirst()                            --.forMin(devtimer1) wordt in DZ_irrigatie_source bepaalt
                    dz.log("Script: " .. info.scriptName .. ", device: Tuinirrigatie_border_links, aangezet, om:" .. dz.time.rawTime .. " voor " .. devduur1 .. " minuten....", dz.LOG_INFO)
                else
                    dz.log("Script: " .. info.scriptName .. ", device: Tuinirrigatie_border_links is niet aangezet, de timer stond uit", dz.LOG_INFO)
                end
        end
        
        if  (item.isTimer  and iswitch2.level == 10 and item.trigger == Tuinirrigatietimer10) or
            (item.isTimer  and iswitch2.level == 20 and item.trigger == Tuinirrigatietimer20) or 
            (item.isTimer  and iswitch2.level == 30 and item.trigger == Tuinirrigatietimer30) or 
            (item.isTimer  and iswitch2.level == 40 and item.trigger == Tuinirrigatietimer40) or
            (item.isTimer  and iswitch2.level == 50 and item.trigger == Tuinirrigatietimer50) or 
            (item.isDevice and switch3.level == 20) then

                if devduur2 > 0 then 
                    dz.devices('Tuinirrigatie_border_rechts').switchOn().checkFirst().afterMin(aftertimer1) 
                    dz.log("Script: " .. info.scriptName .. ", device: Tuinirrigatie_border_rechts, wordt aangezet " .. tostring(aftertimer1) .. " min na " .. dz.time.rawTime .. " en voor " .. devduur2 .. " minuten....", dz.LOG_INFO)    
                else
                    dz.log("Script: " .. info.scriptName .. ", device: Tuinirrigatie_border_rechts is niet aangezet, de timer stond uit", dz.LOG_INFO)
               end
        end

        if  (item.isTimer  and iswitch3.level == 10 and item.trigger == Tuinirrigatietimer10) or
            (item.isTimer  and iswitch3.level == 20 and item.trigger == Tuinirrigatietimer20) or 
            (item.isTimer  and iswitch3.level == 30 and item.trigger == Tuinirrigatietimer30) or 
            (item.isTimer  and iswitch3.level == 40 and item.trigger == Tuinirrigatietimer40) or
            (item.isTimer  and iswitch3.level == 50 and item.trigger == Tuinirrigatietimer50) or 
            (item.isDevice and switch3.level == 20) then

                if devduur3 > 0 then 
                    dz.devices('Tuinirrigatie_gazon').switchOn().checkFirst().afterMin(aftertimer2) 
                    dz.log("Script: " .. info.scriptName .. ", device: Tuinirrigatie_gazon, wordt aangezet " .. tostring(aftertimer2) .. " min na " .. dz.time.rawTime .. " en voor " .. devduur3 .. " minuten....", dz.LOG_INFO)    
                else 
                    dz.log("Script: " .. info.scriptName .. ", device: Tuinirrigatie_gazon is niet aangezet, de timer stond uit", dz.LOG_INFO)
                end
        end
    
        if  (item.isTimer  and iswitch4.level == 10 and item.trigger == Tuinirrigatietimer10) or
            (item.isTimer  and iswitch4.level == 20 and item.trigger == Tuinirrigatietimer20) or 
            (item.isTimer  and iswitch4.level == 30 and item.trigger == Tuinirrigatietimer30) or 
            (item.isTimer  and iswitch4.level == 40 and item.trigger == Tuinirrigatietimer40) or
            (item.isTimer  and iswitch4.level == 50 and item.trigger == Tuinirrigatietimer50) or 
            (item.isDevice and switch3.level == 20) then

                if devduur4 > 0 then 
                    dz.devices('Tuinirrigatie_planten').switchOn().checkFirst().afterMin(aftertimer3) 
                    dz.log("Script: " .. info.scriptName .. ", device: Tuinirrigatie_planten, wordt aangezet " .. tostring(aftertimer3) .. " min na " .. dz.time.rawTime .. " en voor " .. devduur4 .. " minuten....", dz.LOG_INFO)    
                else 
                    dz.log("Script: " .. info.scriptName .. ", device: Tuinirrigatie_planten is niet aangezet, de timer stond uit", dz.LOG_INFO)
                end
        end
    
        if switch3.level == 20 then -- deze naar oude level zetten !! na x mn
            switch3.switchSelector(switch3.lastLevel).afterMin(aftertimer4)
            dz.log("Script: " .. info.scriptName .. ", device: Tuinirrigatie, wordt uitgezet " .. tostring(aftertimer4) .. " min na " .. dz.time.rawTime .. " ", dz.LOG_INFO)    
        end    

        --dz.devices('usb lamp').switchSelector(dz.variables('ledlampkleuroud').value) -- op t goede timermoment alles uit of weer terugzetten naar oorspronkelijke kleur

    elseif (switch3.level == 0 or iswitch1.level == 0  or iswitch2.level == 0 or iswitch3.level == 0 or iswitch4.level == 0) then                                                       
        if (switch3.level == 0 or iswitch1.level == 0) then 
            dz.devices('Tuinirrigatie_border_links').cancelQueuedCommands() 
        end
        if (switch3.level == 0 or iswitch2.level == 0) then 
            dz.devices('Tuinirrigatie_border_rechts').cancelQueuedCommands() 
        end
        if (switch3.level == 0 or iswitch3.level == 0) then 
            dz.devices('Tuinirrigatie_gazon').cancelQueuedCommands() 
        end
        if (switch3.level == 0 or iswitch4.level == 0) then 
            dz.devices('Tuinirrigatie_planten').cancelQueuedCommands() 
        end

        if (switch3.level == 0 or iswitch1.level == 0) then 
            dz.devices('Tuinirrigatie_border_links').switchOff().checkFirst()  
        end       -- nadeel is ook 4 maal spraak dat het uit gaat en die had je al gehoord bij t autom uitgaan
        if (switch3.level == 0 or iswitch2.level == 0) then 
            dz.devices('Tuinirrigatie_border_rechts').switchOff().checkFirst() 
        end
        if (switch3.level == 0 or iswitch3.level == 0) then 
            dz.devices('Tuinirrigatie_gazon').switchOff().checkFirst()   
        end             -- staat waarschijnlijk al uit, maar it het bijbehorende script wordt de queue geleegd en device ook uit als dit niet zo was
        if (switch3.level == 0 or iswitch4.level == 0) then 
            dz.devices('Tuinirrigatie_planten').switchOff().checkFirst() 
        end             -- voordeel is als je halverwege afbreekt, dat ook de switches direct uitgaan, nu moet je zelf n switch die loopt uitzetten

        dz.log("Script: " .. info.scriptName .. " irrigatie timers/queue verwijderd... ", dz.LOG_INFO)
    
    else
        dz.log("Script: " .. info.scriptName .. " is niet aangezet, onbekende reden... ", dz.LOG_INFO)
    end
end
}
Raspberry (raspbian on rpi 3) , Domoticz Beta, dzVents , RFXtrx433e, P1, Hue, Yeelight, Zwave+, X10, ESP(easy), MQTT,Weather Underground, System Alive Checker, Domoticz Remote Server to RPI with Google Assistant,
Jablotron connection, Ikea
User avatar
waaren
Posts: 6028
Joined: Tuesday 03 January 2017 14:18
Target OS: Linux
Domoticz version: Beta
Location: Netherlands
Contact:

Re: more timers executing at the same time ?

Post by waaren »

pvklink wrote: Thursday 23 May 2019 22:54 Could it be that a script cant execute twice at the same time (10 every day at sunset and 20 each other day ?)
Bingo !!
Check this

Code: Select all

return {
	on = { timer = {'at 23:47', 'every day at 23:47'}},
    
	execute = function(dz)
             dz.log("Only one !!! greetings from waaren......................",dz.LOG_FORCE) 
	end
}
a solution coiuld be to start it with timer "at sunset" and in the script use dz.time.matchesRule
Debian buster, bullseye on RPI-4, Intel NUC.
dz Beta, Z-Wave, RFLink, RFXtrx433e, P1, Youless, Hue, Yeelight, Xiaomi, MQTT
==>> dzVents wiki
pvklink
Posts: 822
Joined: Wednesday 12 November 2014 15:01
Target OS: Raspberry Pi / ODroid
Domoticz version: latest b
Contact:

Re: more timers executing at the same time ?

Post by pvklink »

ok, when executing the same script twice at the same time, is not possible i can change the start time by make a difference of 5min.
within 5 min it can start itself again.. i think this can work....

local Tuinirrigatietimer10 = 'every day at sunset'
local Tuinirrigatietimer20 = 'every other day 5 minutes after sunset'
local Tuinirrigatietimer30 = '10 minutes after sunset on mon,thu,sun'
local Tuinirrigatietimer40 = '10 minutes before sunset on sat'
local Tuinirrigatietimer50 = '5 minutes before sunset on 1/*'
Raspberry (raspbian on rpi 3) , Domoticz Beta, dzVents , RFXtrx433e, P1, Hue, Yeelight, Zwave+, X10, ESP(easy), MQTT,Weather Underground, System Alive Checker, Domoticz Remote Server to RPI with Google Assistant,
Jablotron connection, Ikea
Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest