Page 1 of 1

goto lastlevel from a selectorswitch

Posted: Wednesday 22 May 2019 14:21
by pvklink
Hi,

I have an selector switch with 0,10,20
When i push it from 10 to 20 a script fires and at the end of the script i want to go back to 10 or the setting before 20

at the end of my script i added: switch3.switchSelector(lastlevel).afterMin(aftertimer4)

i declared local switch3 = dz.devices('Tuinirrigatie')

It does not select 10 but 0 ?

Code: Select all

--local Tuinirrigatietimer10 = 'at 13:13 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 timers staat uit", dz.LOG_INFO)

    elseif ((item.isTimer and switch2.state == 'Off') 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.switchOff().checkFirst().afterMin(aftertimer4) 
            switch3.switchSelector(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, het is aan t regenen... ", dz.LOG_INFO)
    end
end
}

Re: goto lastlevel from a selectorswitch

Posted: Wednesday 22 May 2019 14:30
by waaren
pvklink wrote: Wednesday 22 May 2019 14:21 at the end of my script i added: switch3.switchSelector(lastlevel).afterMin(aftertimer4)
lastlevel is not declared anywhere so it is nil

what I think you want is it to go to the lastLevel of switch3 so the line should be

Code: Select all

           switch3.switchSelector(switch3.lastLevel).afterMin(aftertimer4) -- case matters !! lastlevel ~= lastLevel

Re: goto lastlevel from a selectorswitch

Posted: Wednesday 22 May 2019 18:31
by pvklink
Ok, and yes that works!
I now have 5 default timers that i can use for each irrigation zone.... i can manage my irrigation program manual , for each part and for all and i can use timers.. It looks like a heating thermostat.

i will put the scripts in this post for anyone who want to use it..
Which must thanks to @waaren he did the hardest part!

Code: Select all

return {
    on = {devices = {'Tuinirrigatie_gazon','Tuinirrigatie_border_links','Tuinirrigatie_planten','Tuinirrigatie_border_rechts'}},

    logging = { 
                    level   = domoticz.LOG_INFO,
                    marker  = "Tuinirrigatie",
              },

    execute = function(dz, device, info)
    local devtimer  = tonumber(dz.devices(device.name .. '_waarde').levelName)  -- timer ophalen. timer heeft altijd de naam van het device met _waarde erachter

    if device.state == 'Off' then
        device.cancelQueuedCommands()
        dz.log("Script: " .. info.scriptName .. ", device: " .. device.name .. " Uitgezet....", dz.LOG_INFO)    
    else 
        device.switchOff().afterMin(devtimer).silent()
        dz.log("Script: " .. info.scriptName .. ", device: " .. device.name .. " aangezet om: " .. dz.time.rawTime .. " voor " .. devtimer .. " minuten....", dz.LOG_INFO)    
    end

end
}

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
}