To FreeSWITCH users, I am currently experimenting with Lua scripts on FreeSWITCH (latest build) and found an interesting issue with FreeSWITCH default CDRs (inside log/cdr-csv/1000.csv). See below for my simple Lua script called from a diaplan as follows: <include> <!-- To test Lua script --> <extension name="ivr_demo"> <condition field="destination_number" expression="^(9101)$"> <action application="lua" data="myservice.lua"/> </condition> </extension> </include> What I noticed is that placing a call into FreeSWITCH via a SIP phone (calling 9101) and landing on myservice.lua everything processes as expected. If I hangup after 3 seconds then I should expect the CDR to show ${billsec} = 3. However this is not the case since both ${duration} and ${billsec} are actually set once the Lua script completes (not based on HANGUP). So inside 1000.csv I see duration and billsec both having 8 seconds. You will see below that inside my hangup handler (function myHangupHook(s, status, arg)) I fire an event and wait up to 5000ms for an event to be returned (currently I am not returning an event so the 5000ms will take place). This explains the extra 5 seconds after the 3 seconds of the call. My question is since FreeSWITCH knows that the HANGUP has taken place why is the ${billsec} not correct (ie. should be 3 seconds)? I tried adding "session:hangup()" as the first line inside my hangup handler (function myHangupHook(s, status, arg)) and this made no difference. Is there a solution to this issue? Perhaps there is a different CDR variable that will contain the correct duration based on when HANGUP was actually received. Thanks in advance for any assistance with this. Regards, Andrew Keil Simple Lua Script: -- myservice.lua -- To test a simple service function MainService() freeswitch.consoleLog("INFO", "MAIN SERVICE SECTION\n") -- answer the call freeswitch.consoleLog("INFO", "ANSWER CALLER\n") session:answer(); -- sleep a second freeswitch.consoleLog("INFO", "Sleep for 1000ms\n") session:sleep(1000); freeswitch.consoleLog("INFO", "Playing 12345\n") session:say("12345", "en", "number", "pronounced"); freeswitch.consoleLog("INFO", "Finished playing 12345\n") if (session:ready()) then -- hangup freeswitch.consoleLog("INFO", "HANGUP\n") session:hangup() end end -------------------------------------------------------------------------------------------- -- Functions section ... function myHangupHook(s, status, arg) freeswitch.consoleLog("INFO", "myHangupHook: " .. status .. "\n") -- send hangup event test (after caller hangs up) local event = freeswitch.Event("CUSTOM", "visytel::HANGUP?") event:addHeader("hi", "there") event:addHeader("channel-uuid", channeluuid) -- Add Event consumer if a response is required! local con = freeswitch.EventConsumer("CUSTOM", "visytel::HANGUP!") -- fire event freeswitch.consoleLog("INFO", "Fire HANGUP event\n") event:fire() -- Wait for 5000ms to test response local retevent = con:pop(1, 5000) if retevent then freeswitch.consoleLog("INFO", "Reply received!\n") freeswitch.consoleLog("INFO", string.format("Reply received: %s\n",retevent:getHeader("Result"))) end end -- Setup handlers here myparam="empty"; session:setHangupHook("myHangupHook", "myparam") -- Source channel-uuid here {used inside myHangupHook handler and for all fired events inside the header channeluuid = session:getVariable("uuid"); MainService() -- End of lua script