What is the simplest way to add a delay to some luup code? i have read that luup.sleep is not a good candidate since it pauses all execution. i was trying to muck around with luup.call_delay, but it is very limited since i can only pass a single string as a variable. there has to be a better way, but in pouring throught the boards, i cannot seem to find one.
Just for clarification, i am trying to cobble together a couple of calls to sonos to play a mp3 and then speak some text, but since they happen so close together the text call one kills the mp3.
luup.sleep() is indeed to be avoided at all costs. luup.call_delay() is fine for your needs if you simply arrange that the data you want to share is within scope of the called routine. No need to limit yourself to the information you can pass in the single string variable. Equally, you could use that variable if you serialised the data structure you needed with, for example, a json.encode() call.
thanks for the prompt reply! i moved the variables out of the function (i.e. made them global in my file) and then created a function to speak that i call via the luup.call_delay. the code is as follows:
speakText = "Ooops, nothing passed"
speakVol = 50
function saySomething(callText, callVol)
speakText = callText
if callVol == nil then
speakVol = 50
else
speakVol = callVol
end
luup.call_action("urn:micasaverde-com:serviceId:Sonos1", "PlayURI", {URIToPlay="http://10.10.10.15/announce2.mp3", Volume=speakVol}, 59)
luup.call_delay("sonosSpeak", 4, "")
end
function sonosSpeak()
luup.call_action("urn:micasaverde-com:serviceId:Sonos1", "Say", {Text=speakText, Language="en-GB", Volume=speakVol}, 59)
end
for some reason this throws an error that i tried to call a function with a nil value. i suspect it has somethign to do with the scope, but i can’t figure out where i am going wrong with this. here is the error:
LuaInterface::CallFunction_Timer-5 function sonosSpeak failed attempt to call a nil value
So this means that your global function is not truly global, but merely available globally as “sebbyCode.sonosSpeak”. To make the function visible to call_delay, you need to define it as
function _G.sonosSpeak ()
but the delay call should remain as you have it already, simply “sonosSpeak”.
Actually, there really is no such thing as a global… everything is within closures. Within a module, that’s it. Dig into the ‘Programming in Lua’ book*, or the Reference Manual, to go deeper into this. Properly understanding closures and variable scope is really essential.
Chapter 14, “The Environment”
Best Home Automation shopping experience. Shop at Ezlo!