Basic extension to extensions calls not working

I am completely new to Freepbx / Asterix … so i am probably overlooking something simple but I am stuck

My setup uses Freepbx 16 with Asterix 20 on Ubuntu 24LTS …

The phones I am trying to use are CISCO : CP-9951, 7970 and SPA508 …

Each of the phones appear to register properly as chan_pjsip extentions … pjsip show enpoints show them as “avail” …

however when I attempt to dial any of the phones from any other phone the only thing i get is a fast busy … and the asterix log trace gives me 2 warnings "no application “Macro” for extension …

ubs24asterix*CLI> 
  == Using SIP RTP Audio TOS bits 184
  == Using SIP RTP Audio CoS mark 5
    -- Executing [181@from-internal:1] Set("PJSIP/888-00000034", "__RINGTIMER=15") in new stack
    -- Executing [181@from-internal:2] ExecIf("PJSIP/888-00000034", "0?Set(__CWIGNORE=)") in new stack
[2024-11-07 09:21:21] WARNING[403793][C-00000035]: pbx.c:2928 pbx_extension_helper: No application 'Macro' for extension (from-internal, 181, 3)
  == Spawn extension (from-internal, 181, 3) exited non-zero on 'PJSIP/888-00000034'
[2024-11-07 09:21:21] WARNING[403793][C-00000035]: pbx.c:2928 pbx_extension_helper: No application 'Macro' for extension (from-internal, h, 1)
  == Spawn extension (from-internal, h, 1) exited non-zero on 'PJSIP/888-00000034'
ubs24asterix*CLI> 

It seem to suggest that Macro (a deprecated module) is missing while the replacement “gosub” is installed (That’s what I am seeing in menuselect … )

I have tried to locate a tutorial that would show step by step how to get 2 extensions to call each other with no luck … I am tempted to think that plain extension to extension should be working out of the box once the extensions are defined and the phones are registered …

What should I look at ? what am I doing wrong ?

Thanks !

Seems to me your Extension(s) Context is not setup, check that 1st.

I haven’t configured anything myself for extension context … I dont recall seeing the screenshot you shared when i was creating my extensions (Applications / Extensions / Add new sip (chan_pjsip) extension )

I did noticed that freepbx added a section [ext-local] in /etc/asterisk/extensions_additional.conf … with a lot of lines for each of the extensions i had created …

[ext-local]
include => ext-local-custom
exten => *115,1,Set(CONNECTEDLINE(name-charset,i)=utf8)
exten => *115,n,Set(CONNECTEDLINE(name,i)=115 Voicemail)
exten => *115,n,Set(CONNECTEDLINE(num,i)=115)
exten => *115,n,Macro(vm,115,DIRECTDIAL,${IVR_RETVM})
exten => *115,n,Goto(vmret,1)

exten => *888,1,Set(CONNECTEDLINE(name-charset,i)=utf8)
exten => *888,n,Set(CONNECTEDLINE(name,i)=888 Voicemail)
exten => *888,n,Set(CONNECTEDLINE(num,i)=888)
exten => *888,n,Macro(vm,888,DIRECTDIAL,${IVR_RETVM})
exten => *888,n,Goto(vmret,1)

exten => *889,1,Set(CONNECTEDLINE(name-charset,i)=utf8)
exten => *889,n,Set(CONNECTEDLINE(name,i)=889 Voicemail)
exten => *889,n,Set(CONNECTEDLINE(num,i)=889)
exten => *889,n,Macro(vm,889,DIRECTDIAL,${IVR_RETVM})
exten => *889,n,Goto(vmret,1)

exten => 115,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/115/ringtimer)}" > "0"]?${DB(AMPUSER/115/ringtimer)}:${RINGTIMER_DEFAULT})})
exten => 115,n,ExecIf($["${REGEX("from-queue" ${CHANNEL})}"="1" && "${CONTEXT}"="from-internal-xfer"]?Set(__CWIGNORE=))
exten => 115,n,Macro(exten-vm,115,115,0,0,0)
exten => 115,n(dest),Set(__PICKUPMARK=)
exten => 115,n,Macro(vm,115,${DIALSTATUS},${IVR_RETVM})
exten => 115,n,Goto(vmret,1)
exten => 115,hint,PJSIP/115,CustomPresence:115

exten => vmb115,1,Macro(vm,115,BUSY,${IVR_RETVM})
exten => vmb115,n,Goto(vmret,1)

exten => vmu115,1,Macro(vm,115,NOANSWER,${IVR_RETVM})
exten => vmu115,n,Goto(vmret,1)

exten => vms115,1,Macro(vm,115,NOMESSAGE,${IVR_RETVM})
exten => vms115,n,Goto(vmret,1)

exten => vmi115,1,Macro(vm,115,INSTRUCT,${IVR_RETVM})
exten => vmi115,n,Goto(vmret,1)

exten => 116,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/116/ringtimer)}" > "0"]?${DB(AMPUSER/116/ringtimer)}:${RINGTIMER_DEFAULT})})
exten => 116,n,ExecIf($["${REGEX("from-queue" ${CHANNEL})}"="1" && "${CONTEXT}"="from-internal-xfer"]?Set(__CWIGNORE=))
exten => 116,n,Macro(exten-vm,novm,116,0,0,0)
exten => 116,n(dest),Set(__PICKUPMARK=)
exten => 116,n,GotoIf($["${IVR_CONTEXT}" != ""]?${IVR_CONTEXT},return,1)
exten => 116,hint,PJSIP/116,CustomPresence:116

exten => 181,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/181/ringtimer)}" > "0"]?${DB(AMPUSER/181/ringtimer)}:${RINGTIMER_DEFAULT})})
exten => 181,n,ExecIf($["${REGEX("from-queue" ${CHANNEL})}"="1" && "${CONTEXT}"="from-internal-xfer"]?Set(__CWIGNORE=))
exten => 181,n,Macro(exten-vm,novm,181,0,0,0)
exten => 181,n(dest),Set(__PICKUPMARK=)
exten => 181,n,GotoIf($["${IVR_CONTEXT}" != ""]?${IVR_CONTEXT},return,1)
exten => 181,hint,PJSIP/181,CustomPresence:181

exten => 182,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/182/ringtimer)}" > "0"]?${DB(AMPUSER/182/ringtimer)}:${RINGTIMER_DEFAULT})})
exten => 182,n,ExecIf($["${REGEX("from-queue" ${CHANNEL})}"="1" && "${CONTEXT}"="from-internal-xfer"]?Set(__CWIGNORE=))
exten => 182,n,Macro(exten-vm,novm,182,0,0,0)
exten => 182,n(dest),Set(__PICKUPMARK=)
exten => 182,n,GotoIf($["${IVR_CONTEXT}" != ""]?${IVR_CONTEXT},return,1)
exten => 182,hint,PJSIP/182,CustomPresence:182

exten => 183,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/183/ringtimer)}" > "0"]?${DB(AMPUSER/183/ringtimer)}:${RINGTIMER_DEFAULT})})
exten => 183,n,ExecIf($["${REGEX("from-queue" ${CHANNEL})}"="1" && "${CONTEXT}"="from-internal-xfer"]?Set(__CWIGNORE=))
exten => 183,n,Macro(exten-vm,novm,183,0,0,0)
exten => 183,n(dest),Set(__PICKUPMARK=)
exten => 183,n,GotoIf($["${IVR_CONTEXT}" != ""]?${IVR_CONTEXT},return,1)
exten => 183,hint,PJSIP/183,CustomPresence:183

exten => 184,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/184/ringtimer)}" > "0"]?${DB(AMPUSER/184/ringtimer)}:${RINGTIMER_DEFAULT})})
exten => 184,n,ExecIf($["${REGEX("from-queue" ${CHANNEL})}"="1" && "${CONTEXT}"="from-internal-xfer"]?Set(__CWIGNORE=))
exten => 184,n,Macro(exten-vm,novm,184,0,0,0)
exten => 184,n(dest),Set(__PICKUPMARK=)
exten => 184,n,GotoIf($["${IVR_CONTEXT}" != ""]?${IVR_CONTEXT},return,1)
exten => 184,hint,PJSIP/184,CustomPresence:184

exten => 185,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/185/ringtimer)}" > "0"]?${DB(AMPUSER/185/ringtimer)}:${RINGTIMER_DEFAULT})})
exten => 185,n,ExecIf($["${REGEX("from-queue" ${CHANNEL})}"="1" && "${CONTEXT}"="from-internal-xfer"]?Set(__CWIGNORE=))
exten => 185,n,Macro(exten-vm,novm,185,0,0,0)
exten => 185,n(dest),Set(__PICKUPMARK=)
exten => 185,n,GotoIf($["${IVR_CONTEXT}" != ""]?${IVR_CONTEXT},return,1)
exten => 185,hint,PJSIP/185,CustomPresence:185

exten => 186,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/186/ringtimer)}" > "0"]?${DB(AMPUSER/186/ringtimer)}:${RINGTIMER_DEFAULT})})
exten => 186,n,ExecIf($["${REGEX("from-queue" ${CHANNEL})}"="1" && "${CONTEXT}"="from-internal-xfer"]?Set(__CWIGNORE=))
exten => 186,n,Macro(exten-vm,novm,186,0,0,0)
exten => 186,n(dest),Set(__PICKUPMARK=)
exten => 186,n,GotoIf($["${IVR_CONTEXT}" != ""]?${IVR_CONTEXT},return,1)
exten => 186,hint,PJSIP/186,CustomPresence:186

exten => 187,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/187/ringtimer)}" > "0"]?${DB(AMPUSER/187/ringtimer)}:${RINGTIMER_DEFAULT})})
exten => 187,n,ExecIf($["${REGEX("from-queue" ${CHANNEL})}"="1" && "${CONTEXT}"="from-internal-xfer"]?Set(__CWIGNORE=))
exten => 187,n,Macro(exten-vm,novm,187,0,0,0)
exten => 187,n(dest),Set(__PICKUPMARK=)
exten => 187,n,GotoIf($["${IVR_CONTEXT}" != ""]?${IVR_CONTEXT},return,1)
exten => 187,hint,PJSIP/187,CustomPresence:187

exten => 188,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/188/ringtimer)}" > "0"]?${DB(AMPUSER/188/ringtimer)}:${RINGTIMER_DEFAULT})})
exten => 188,n,ExecIf($["${REGEX("from-queue" ${CHANNEL})}"="1" && "${CONTEXT}"="from-internal-xfer"]?Set(__CWIGNORE=))
exten => 188,n,Macro(exten-vm,novm,188,0,0,0)
exten => 188,n(dest),Set(__PICKUPMARK=)
exten => 188,n,GotoIf($["${IVR_CONTEXT}" != ""]?${IVR_CONTEXT},return,1)
exten => 188,hint,PJSIP/188,CustomPresence:188

exten => 198,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/198/ringtimer)}" > "0"]?${DB(AMPUSER/198/ringtimer)}:${RINGTIMER_DEFAULT})})
exten => 198,n,ExecIf($["${REGEX("from-queue" ${CHANNEL})}"="1" && "${CONTEXT}"="from-internal-xfer"]?Set(__CWIGNORE=))
exten => 198,n,Macro(exten-vm,novm,198,0,0,0)
exten => 198,n(dest),Set(__PICKUPMARK=)
exten => 198,n,GotoIf($["${IVR_CONTEXT}" != ""]?${IVR_CONTEXT},return,1)
exten => 198,hint,PJSIP/198,CustomPresence:198

exten => 199,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/199/ringtimer)}" > "0"]?${DB(AMPUSER/199/ringtimer)}:${RINGTIMER_DEFAULT})})
exten => 199,n,ExecIf($["${REGEX("from-queue" ${CHANNEL})}"="1" && "${CONTEXT}"="from-internal-xfer"]?Set(__CWIGNORE=))
exten => 199,n,Macro(exten-vm,novm,199,0,0,0)
exten => 199,n(dest),Set(__PICKUPMARK=)
exten => 199,n,GotoIf($["${IVR_CONTEXT}" != ""]?${IVR_CONTEXT},return,1)
exten => 199,hint,PJSIP/199,CustomPresence:199

exten => 888,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/888/ringtimer)}" > "0"]?${DB(AMPUSER/888/ringtimer)}:${RINGTIMER_DEFAULT})})
exten => 888,n,ExecIf($["${REGEX("from-queue" ${CHANNEL})}"="1" && "${CONTEXT}"="from-internal-xfer"]?Set(__CWIGNORE=))
exten => 888,n,Macro(exten-vm,888,888,0,0,0)
exten => 888,n(dest),Set(__PICKUPMARK=)
exten => 888,n,Macro(vm,888,${DIALSTATUS},${IVR_RETVM})
exten => 888,n,Goto(vmret,1)
exten => 888,hint,PJSIP/888,CustomPresence:888

exten => vmb888,1,Macro(vm,888,BUSY,${IVR_RETVM})
exten => vmb888,n,Goto(vmret,1)

exten => vmu888,1,Macro(vm,888,NOANSWER,${IVR_RETVM})
exten => vmu888,n,Goto(vmret,1)

exten => vms888,1,Macro(vm,888,NOMESSAGE,${IVR_RETVM})
exten => vms888,n,Goto(vmret,1)

exten => vmi888,1,Macro(vm,888,INSTRUCT,${IVR_RETVM})
exten => vmi888,n,Goto(vmret,1)

exten => 889,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/889/ringtimer)}" > "0"]?${DB(AMPUSER/889/ringtimer)}:${RINGTIMER_DEFAULT})})
exten => 889,n,ExecIf($["${REGEX("from-queue" ${CHANNEL})}"="1" && "${CONTEXT}"="from-internal-xfer"]?Set(__CWIGNORE=))
exten => 889,n,Macro(exten-vm,889,889,0,0,0)
exten => 889,n(dest),Set(__PICKUPMARK=)
exten => 889,n,Macro(vm,889,${DIALSTATUS},${IVR_RETVM})
exten => 889,n,Goto(vmret,1)
exten => 889,hint,PJSIP/889,CustomPresence:889

exten => vmb889,1,Macro(vm,889,BUSY,${IVR_RETVM})
exten => vmb889,n,Goto(vmret,1)

exten => vmu889,1,Macro(vm,889,NOANSWER,${IVR_RETVM})
exten => vmu889,n,Goto(vmret,1)

exten => vms889,1,Macro(vm,889,NOMESSAGE,${IVR_RETVM})
exten => vms889,n,Goto(vmret,1)

exten => vmi889,1,Macro(vm,889,INSTRUCT,${IVR_RETVM})
exten => vmi889,n,Goto(vmret,1)

exten => vmret,1,GotoIf($["${IVR_RETVM}" = "RETURN" & "${IVR_CONTEXT}" != ""]?playret)
exten => vmret,n,Hangup()
exten => vmret,n(playret),Playback(exited-vm-will-be-transfered&silence/1)
exten => vmret,n,Goto(${IVR_CONTEXT},return,1)

exten => h,1,Macro(hangupcall,)

exten => _nointercomX.,hint,${DB(AMPUSER/${EXTEN:10}/hint)}
;--== end of [ext-local] ==--;

You haven’t built, or haven’t installed, Asterisk correctly.

Asterisk 20 will not build/install app_macro by default. Asterisk 21 and 22 do not include it in the source code. You need FreePBX 17 to use an Asterisk without Macro, or you will need to enable Macro when building Asterisk 20 and disable any noload directive, for it, in modules.conf.

Macro has been slated for removal for many years, but FreePBX ignored the deprecation warning before FreePBX 17.

1 Like

Thanks David55 … i did a complete compile/reinstall of Asterix 20 making sure the macro module was added in the make menuselect phase … and that was it … .it works …
At some point i will look at Freepbx 17 but for now my problem is solved !
Thank you …