tbully,
Here is some Luup code I use to slow dim the lights in our parrot room. (it helps simulate natural sunset for them and uses a variable step value based on the actual sunset time and 9:00pm - their bedtime). Its a 3% drop over 20 loop cycles with each loop cycle 1/20th of the total minutes between sunset (+/- an offset) and 9pm. Theres a lot of extra stuff going on here with pushing variables out to V-Container and bypasses if the lights fall below a certain level that you could trim out, but the core routine works flawlessly. I have it running on Alt-UI on a Raspberry Pi3 but you could insert the code into a scene or PLEG at your discretion. Feel free to ask about variable namers if you can’t figure out what they do. I’d be glad to help.
var_txt = "Bird Room Slow Dim Lights"
var_txt = "ALTUI: " .. var_txt
var_url = require "socket.url"
var_txt = var_url.escape(var_txt)
luup.inet.wget ("http://192.168.0.11/port_3480/data_request?id=lr_EventWatcher&event=" .. var_txt)
varMin = 5
varMax = 65
varEWDev = 6
varLoopCnt = 0
varDimStep = (varMax-varMin)/20
varDevice1 = 10052
varDevice2 = 10053
varDimLevel1 = varMax
varDimLevel2 = luup.variable_get("urn:upnp-org:serviceId:Dimming1","LoadLevelStatus",varDevice2)
varLupSS = luup.sunset()
varLuaSST = os.date("*t", varLupSS)
varSunsetTime = varLuaSST.hour * 60 + varLuaSST.min
varSSTHr = math.floor(varSunsetTime/60)
varSSTMin = varSunsetTime-(varSSTHr*60)
varSSTMin = string.format("%02d",varSSTMin)
varSST = varSSTHr .. ":" .. varSSTMin
varSSoffset = 30
varStartTime = varSunsetTime - varSSoffset
varSTHr = math.floor(varStartTime/60)
varSTMin = varStartTime-(varSTHr*60)
varSTMin = string.format("%02d",varSTMin)
varST = varSTHr .. ":" .. varSTMin
varEndTime = "21:00"
varETHr = tonumber( varEndTime:sub( varEndTime:find("%d+") ) )
varETMin = tonumber(varEndTime:sub(-2))
varEndTime = varETHr * 60 + varETMin
varDelayPeriod = ((varEndTime - varStartTime)*3)
varCurDate = os.date("%m/%d/%Y")
varHumanTime = os.date("%m/%d/%Y %H:%M:%S")
varCurTime = os.date("*t")
varCurrentTime = varCurTime.hour * 60 + varCurTime.min
function DimLights()
varLoopCnt = varLoopCnt + 1
varCurTime = os.date("*t")
varCurTm = os.time()
varCurrentTime = varCurTime.hour * 60 + varCurTime.min
varNextAction = (os.date("%m/%d/%Y %H:%M:%S",varCurTm + varDelayPeriod))
varHumanTime = os.date("%m/%d/%Y %H:%M:%S")
luup.variable_set("urn:upnp-org:serviceId:VContainer1","VariableName3","Next Action",varEWDev)
luup.variable_set("urn:upnp-org:serviceId:VContainer1","VariableName4","Delay:Step:Loop",varEWDev)
luup.variable_set("urn:upnp-org:serviceId:VContainer1","VariableName5","Max:Min:Sec",varEWDev)
if varStartTime <= varCurrentTime and varCurrentTime <= varEndTime then
varDimLevel2 = luup.variable_get("urn:upnp-org:serviceId:Dimming1","LoadLevelStatus",varDevice2)
varDimLevel2 = varDimLevel2 - varDimStep
if varDimLevel2 < 0 then varDimLevel2 = 0 end
if (varDimLevel2 == 0 and varLoopCnt >= 16) then
var_txt = "Bird Room Slow Dim Aborted"
var_txt = "ALTUI: " .. var_txt
var_txt = var_url.escape(var_txt)
luup.inet.wget ("http://192.168.0.11/port_3480/data_request?id=lr_EventWatcher&event=" .. var_txt)
luup.variable_set("urn:upnp-org:serviceId:VContainer1","VariableName2","Aborted at ",varEWDev)
luup.variable_set("urn:upnp-org:serviceId:VContainer1","Variable2", varHumanTime,varEWDev)
luup.variable_set("urn:upnp-org:serviceId:VContainer1","Variable3","",varEWDev)
return false
end
if varDimLevel2 > varMin then
luup.call_action("urn:upnp-org:serviceId:Dimming1","SetLoadLevelTarget",{ newLoadlevelTarget=varDimLevel2 },varDevice2)
luup.variable_set("urn:upnp-org:serviceId:VContainer1","VariableName2","This Action",varEWDev)
var_txt = "Bird Room Lights to " .. varDimLevel2 .. "%" .. ", #" .. varLoopCnt .. " @ " .. varDelayPeriod .." sec."
var_txt = "ALTUI: " .. var_txt
var_txt = var_url.escape(var_txt)
luup.inet.wget ("http://192.168.0.11/port_3480/data_request?id=lr_EventWatcher&event=" .. var_txt)
else
if varDimLevel2 < varMin then varDimLevel2 = varMin end
luup.call_action("urn:upnp-org:serviceId:Dimming1","SetLoadLevelTarget",{ newLoadlevelTarget=varMin },varDevice2)
luup.variable_set("urn:upnp-org:serviceId:VContainer1","VariableName2","This Bypass",varEWDev)
var_txt = "Bird Room Lights bypassed at " .. varDimLevel2 .. "%" .. " : " .. varDelayPeriod.." sec."
var_txt = "ALTUI: " .. var_txt
var_txt = var_url.escape(var_txt)
luup.inet.wget ("http://192.168.0.11/port_3480/data_request?id=lr_EventWatcher&event=" .. var_txt)
end
luup.variable_set("urn:upnp-org:serviceId:VContainer1","Variable2", varHumanTime,varEWDev)
luup.variable_set("urn:upnp-org:serviceId:VContainer1","Variable3",varNextAction,varEWDev)
luup.variable_set("urn:upnp-org:serviceId:VContainer1","Variable4",varDelayPeriod/60 .. " min : " .. varDimStep .. "% : " .. varLoopCnt,varEWDev)
luup.variable_set("urn:upnp-org:serviceId:VContainer1","Variable5",varMax .. " : " .. varMin .. " : " .. varDelayPeriod,varEWDev)
luup.sleep (2000)
luup.call_timer("DimLights",1,varDelayPeriod, "", "")
else
luup.variable_set("urn:upnp-org:serviceId:VContainer1","VariableName2","Final Action",varEWDev)
luup.variable_set("urn:upnp-org:serviceId:VContainer1","VariableName3","End Dim Loop",varEWDev)
luup.variable_set("urn:upnp-org:serviceId:VContainer1","Variable3",varHumanTime,varEWDev)
var_txt = "End Bird Room Lights Dim"
var_txt = "ALTUI: " .. var_txt
var_txt = var_url.escape(var_txt)
luup.inet.wget ("http://192.168.0.11/port_3480/data_request?id=lr_EventWatcher&event=" .. var_txt)
luup.sleep (2000)
return false
end
return false
end
StartDelaySecs = 5
if varStartTime <= varCurrentTime and varCurrentTime <= varEndTime then
if varDimLevel2 == 0 then
varDimLevel2 = varMax
end
varCurTm = os.time()
varCurTime = os.date("*t")
varCurrentTime = varCurTime.hour * 60 + varCurTime.min
varNextAction = (os.date("%m/%d/%Y %H:%M:%S",varCurTm + varDelayPeriod))
varHumanTime = os.date("%m/%d/%Y %H:%M:%S")
luup.variable_set("urn:upnp-org:serviceId:VContainer1","VariableName2","Started at ",varEWDev)
luup.variable_set("urn:upnp-org:serviceId:VContainer1","Variable2",varHumanTime,varEWDev)
luup.variable_set("urn:upnp-org:serviceId:VContainer1","VariableName3","Next Action ",varEWDev)
luup.variable_set("urn:upnp-org:serviceId:VContainer1","Variable3",varNextAction,varEWDev)
luup.call_timer("DimLights",1,StartDelaySecs, "", "")
else
luup.sleep (2000)
luup.variable_set("urn:upnp-org:serviceId:VContainer1","VariableName3","Bypassed at ",varEWDev)
luup.variable_set("urn:upnp-org:serviceId:VContainer1","Variable3",varHumanTime,varEWDev)
end