Sip state “busy” after app-dnd-on context

Dear all. I have switched to FreePBX 17 with Asterisk 21.4.1
(I originally posted this question at asterisk forum, but got redirected here.)

I am trying to get our SNOM phones to get notified about other extensions being in dnd.
As the standard dialplan [app-dnd-on] sets the device state to “BUSY”, I am trying to catch the corresponding sip presence notification. “core show hint” correctly returns “busy”.

In comparison, actually being in a call, the hint shows “InUse”.

However, the sip messages are identical for busy and InUse.

Here is from an actual call, state:InUse:

Received from Udp:192.168.20.16:5060 on Udp:192.168.130.201:5060 at Aug 15 19:27:00.246 (1077 bytes):

NOTIFY sip:[email protected]:5060;line=va5dklpj SIP/2.0
Via: SIP/2.0/UDP 192.168.20.16:5060;rport;branch=z9hG4bKPj3876f15a-88c4-4174-8091-53c75319a47a
From: <sip:[email protected]>;tag=778e2e5b-2e97-4f07-bd6d-4a509de9bf4b
To: <sip:[email protected]>;tag=aaw9twr0jt
Contact: <sip:192.168.20.16:5060>
Call-ID: 313732333734303433353434303435-8uzc9koqu63w
CSeq: 5986 NOTIFY
Event: presence
Subscription-State: active;expires=3240
Allow-Events: presence, dialog, message-summary, refer
Max-Forwards: 70
User-Agent: FPBX-17.0.19.1(21.4.1)
Content-Type: application/pidf+xml
Content-Length: 472

<?xml version="1.0" encoding="UTF-8"?> <presence entity="sip:[email protected]" xmlns="urn:ietf:params:xml:ns:pidf" xmlns:dm="urn:ietf:params:xml:ns:pidf:data-model" xmlns:rpid="urn:ietf:params:xml:ns:pidf:rpid"> <note>On the phone</note> <tuple id="12"> <status> <basic>open</basic> </status> <contact priority="1">sip:[email protected]</contact> </tuple> <dm:person> <rpid:activities> <rpid:on-the-phone /> </rpid:activities> </dm:person> </presence>

And the one for DND, state:busy I received 2! messages like the one below

Received from Udp:192.168.20.16:5060 on Udp:192.168.130.201:5060 at Aug 15 19:28:57.563 (1077 bytes):

NOTIFY sip:[email protected]:5060;line=va5dklpj SIP/2.0
Via: SIP/2.0/UDP 192.168.20.16:5060;rport;branch=z9hG4bKPj4e67f1b8-ef9b-4265-b70e-178c04fcf6d6
From: <sip:[email protected]>;tag=778e2e5b-2e97-4f07-bd6d-4a509de9bf4b
To: <sip:[email protected]>;tag=aaw9twr0jt
Contact: <sip:192.168.20.16:5060>
Call-ID: 313732333734303433353434303435-8uzc9koqu63w
CSeq: 5989 NOTIFY
Event: presence
Subscription-State: active;expires=3123
Allow-Events: presence, dialog, message-summary, refer
Max-Forwards: 70
User-Agent: FPBX-17.0.19.1(21.4.1)
Content-Type: application/pidf+xml
Content-Length: 472

<?xml version="1.0" encoding="UTF-8"?> <presence entity="sip:[email protected]" xmlns="urn:ietf:params:xml:ns:pidf" xmlns:dm="urn:ietf:params:xml:ns:pidf:data-model" xmlns:rpid="urn:ietf:params:xml:ns:pidf:rpid"> <note>On the phone</note> <tuple id="12"> <status> <basic>open</basic> </status> <contact priority="1">sip:[email protected]</contact> </tuple> <dm:person> <rpid:activities> <rpid:on-the-phone /> </rpid:activities> </dm:person> </presence>

To find out more, I changed the dialplan [app-dnd-on] to use state “ONHOLD”.
That made the phone receive one message with on hold, which would be correct. Sadly a few seconds later, the phone receives another message with on-the-phone and with that overrides the correct state.

Here is the corresponding part of the log:

-- Executing [*78@from-internal:5] Set("PJSIP/12-00000212", "STATE=ONHOLD") in new stack
    -- Executing [*78@from-internal:6] Gosub("PJSIP/12-00000212", "app-dnd-on,sstate,1()") in new stack
    -- Executing [sstate@app-dnd-on:1] Set("PJSIP/12-00000212", "DEVICE_STATE(Custom:DND12)=ONHOLD") in new stack
    -- Executing [sstate@app-dnd-on:2] Set("PJSIP/12-00000212", "DEVICES=12") in new stack
    -- Executing [sstate@app-dnd-on:3] GotoIf("PJSIP/12-00000212", "0?return") in new stack
    -- Executing [sstate@app-dnd-on:4] Set("PJSIP/12-00000212", "LOOPCNT=1") in new stack
    -- Executing [sstate@app-dnd-on:5] Set("PJSIP/12-00000212", "ITER=1") in new stack
    -- Executing [sstate@app-dnd-on:6] Set("PJSIP/12-00000212", "DEVICE_STATE(Custom:DEVDND12)=ONHOLD") in new stack
    -- Executing [sstate@app-dnd-on:7] Set("PJSIP/12-00000212", "ITER=2") in new stack
    -- Executing [sstate@app-dnd-on:8] GotoIf("PJSIP/12-00000212", "0?begin") in new stack
    -- Executing [sstate@app-dnd-on:9] Return("PJSIP/12-00000212", "") in new stack
    -- Executing [*78@from-internal:7] Playback("PJSIP/12-00000212", "do-not-disturb&activated") in new stack
    -- <PJSIP/12-00000212> Playing 'do-not-disturb.ulaw' (language 'de_DE')
    -- <PJSIP/12-00000212> Playing 'activated.ulaw' (language 'de_DE')
    -- Executing [*78@from-internal:8] Gosub("PJSIP/12-00000212", "macro-hangupcall,s,1()") in new stack
    -- Executing [s@macro-hangupcall:1] Set("PJSIP/12-00000212", "__MCVMSTATUS=") in new stack
    -- Executing [s@macro-hangupcall:2] Gosub("PJSIP/12-00000212", "app-missedcall-hangup,s,1()") in new stack
    -- Executing [s@app-missedcall-hangup:1] NoOp("PJSIP/12-00000212", "Dialed: s") in new stack
    -- Executing [s@app-missedcall-hangup:2] NoOp("PJSIP/12-00000212", "Caller: 12") in new stack
    -- Executing [s@app-missedcall-hangup:3] GotoIf("PJSIP/12-00000212", "0?exit") in new stack
    -- Executing [s@app-missedcall-hangup:4] Set("PJSIP/12-00000212", "EXTENNUM=s") in new stack
    -- Executing [s@app-missedcall-hangup:5] Set("PJSIP/12-00000212", "FEXTENNUM=s") in new stack
    -- Executing [s@app-missedcall-hangup:6] GotoIf("PJSIP/12-00000212", "0?exit") in new stack
    -- Executing [s@app-missedcall-hangup:7] AGI("PJSIP/12-00000212", "missedcallnotify.php,s,,s,0,,PJSIP/12-00000212,,,,") in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/missedcallnotify.php
    -- <PJSIP/12-00000212>AGI Script missedcallnotify.php completed, returning 0
    -- Executing [s@app-missedcall-hangup:8] Return("PJSIP/12-00000212", "") in new stack
    -- Executing [s@macro-hangupcall:3] GotoIf("PJSIP/12-00000212", "1?theend") in new stack
    -- Goto (macro-hangupcall,s,5)
    -- Executing [s@macro-hangupcall:5] ExecIf("PJSIP/12-00000212", "0?Set(CDR(recordingfile)=)") in new stack
    -- Executing [s@macro-hangupcall:6] Hangup("PJSIP/12-00000212", "") in new stack
  == Spawn extension (macro-hangupcall, s, 6) exited non-zero on 'PJSIP/12-00000212'
freepbx*CLI> core show hint 12
12@ext-local                  : PJSIP/12&Custom:DND12,CustomPresence:12                       State:Hold            Presence:available       Watchers  3
1234@default                  : SIP/1234                                                      State:Unavailable     Presence:not_set         Watchers  0
2 hints matching extension 12
freepbx*CLI> core show hint 12
12@ext-local                  : PJSIP/12&Custom:DND12,CustomPresence:12                       State:Busy            Presence:available       Watchers  3
1234@default                  : SIP/1234                                                      State:Unavailable     Presence:not_set         Watchers  0

As you can see, there is no action on the asterisk side, but the state changes from “hold” to “busy”.

Any help would be very welcome.