Target release1.0
Epic

Document status
Document owner
Designer
Developers
QA


Goals

Background and strategic fit

BLF is a valuable feature for Snom customers, like enterprises who are looking to assist in connecting their customers to a live, available person as well as save business phone use time. Overall, it enables businesses to streamline their communication and better serve customers. BLF aka Extension monitoring has been utilized in numerous ways by businesses using Snom phone systems with multiple extensions. 

Use cases

Requirements

#

Requirement title

Functionality 

ImportanceImplementation status
1

D8XX_BLF-XML_FR-1

On Snom IP phones acting as UAS, any SIP extension having an active subscription of its state changes, shall sent a notification SIP message (NOTIFY) to the UAC, when one of the following state changes occur:

  • from any state => terminated
  • from any state => trying
  • from any state => early/proceeding
  • from any state => confirmed

Must Have

2

D8XX_BLF-XML_FR-2

On D8xx IP phones, any PFK (programmable function key - physical or virtual) can be assigned to a key type called "BLF-XML", and a key number, which corresponds to a SIP extension on another IP phone in the same VoIP environment. The following functionality is required:

  • Monitoring certain states of the configured SIP extension, see details below
  • Quick-dial to the configured SIP extension in idle state
  • Pick-up an incoming call to the configured SIP extension

Dialog states of the configured SIP extension shall be monitored, processed, and translated according to its direction. 

UAS stateDialog state (NOTIFY)DirectionTranslated state
idle modeterminated-idle

offhook

trying

initiatoroffhook
incoming call ringing

early/proceeding

recipientringing

incoming call accepted

confirmed

recipienttalking

outgoing call ringing

early/proceeding

initiatorcalling

outgoing call accepted

confirmed

initiatortalking

According to the translated state the following actions are allowed, when the PFK is pressed:

Dialog stateterminated

trying

early/proceeding

confirmed
Translated stateidleoffhookcallingringingtalking
Direction-initiatorinitiatorrecipientinitiator/recipient
Allowed actionsQuick-dial--Pick-up-


Must Have

3D8XX_BLF-XML_FR-3The assignment shall be configured either manually via web user interface (WUI) and/or phone user interface (PUI), and automatically via auto-provisioning (HTTP/TFTP setting server), SRAPS, or remote management (TR-069).

Must Have

4D8XX_BLF-XML_FR-2-1

On D8xx series, during an active subscription, state changes of the monitored SIP extension shall be visualized on both, PFK LED and PFK label.

Must Have

5D8XX_BLF-XML_FR-2-1-1

The PFK LED behaviour and colour shall be according to this table

Dialog stateterminated

trying

early/proceeding

confirmed
Translated stateidleoffhookcallingringingtalking
Direction-initiatorinitiatorrecipientinitiator/recipient
LED behaviouroffononblinkingon
LED colour-redredredred


Must Have

6D8XX_BLF-XML_FR-2-1-2

The PFK label shall be composed of 3 areas:

(A) icon area(B) name area
(C) state area


Must Have

7D8XX_BLF-XML_FR-2-1-2-1

The label icon area (A) shall contain the following graphical symbol and colour

Dialog stateterminated

trying

early/proceeding

confirmed
Translated stateidleoffhookcallingringingtalking
Direction-initiatorinitiatorrecipientinitiator/recipient
Graphical symbol
tbd
tbd
tbd
tbd
tbd
Colourwhite/tbdwhite/tbdwhite/tbdwhite/tbdwhite/red


Must Have

8D8XX_BLF-XML_FR-2-1-2-2

The label name area (B) shall contain a text using either the display name or number (configurable) of the monitored / calling party. Depending on the available space, the text shall be scrolled.

Dialog stateterminated

trying

early/proceeding

confirmed
Translated stateidleoffhookcallingringingtalking
Direction-initiatorinitiatorrecipientinitiatorrecipient
Text (based on target)locallocal >local > remoteremote > localremote <> locallocal <> remote
Text colourwhitewhitewhitewhitewhitewhite
Example (using number)101101 > 

101 > 102102 > 101102 <> 101

101 <> 102

Example (using display name)AlexAlex >Alex > AliceAlice > AlexAlice <> AlexAlex <> Alice


Must Have

9D8XX_BLF-XML_FR-2-1-2-3

The label state area (C) shall contain a text and colour representing the translated state

Dialog stateterminated

trying

early/proceeding

confirmed
Translated stateidleoffhookcallingringingtalking
Direction-initiatorinitiatorrecipientinitiator/recipient
textidleoffhookcallingringingtalking
colourwhitewhitewhitewhitewhite


Must Have

Interactions and output

InteractionsSIP NOTIFY XML bodyXML definitionResult
UASUAS => UACUAC translation rulesPFK LED & label
goes offhook

dialog state => trying

NOTIFY
...
<?xml version="1.0"?>
<dialog-info
	xmlns="urn:ietf:params:xml:ns:dialog-info"
	version="..."
	state="full"
	entity="sip:101@...">
	<dialog id="..." >
		<state>trying</state>
	</dialog>
</dialog-info>


translate state => offhook

  • quick dial not allowed
  • pick-up not allowed
...
<NotifyParsingRules type="state">
	...
  	<level3
		translates_to="offhook">/dialog-info/dialog/state[.="trying"]
	</level3>
  	...
</NotifyParsingRules>
...
<action>
	<invite target="$(subscr_uri)"
		when="on press"
		states="idle"/>
	<invite target="$(remote_uri)"
		when="on press"
		state="ringing"
		request_uri="$(remote_uri)"
		replaces="$(call_id);to-tag=$(remote_tag);from-tag=$(local_tag)"/>
</action>



🔴101 >
offhook


goes onhook

dialog state => terminated

NOTIFY
...
<?xml version="1.0"?>
<dialog-info
	xmlns="urn:ietf:params:xml:ns:dialog-info"
	version="..."
	state="full"
	entity="sip:101@...">
	<dialog id="..."
		direction='initiator'
		call-id='...'
		local-tag=""
		remote-tag="">
		<state>terminated</state>
		<local>
			<identity display="B">sip:101@...</identity>
			<target uri="sip:101@...;line=...">
				<param pname="x-line-id" pval="0" />
			</target>
		</local>
	</dialog>
</dialog-info>


translate state => idle

  • quick dial allowed
  • pick-up not allowed
...
<NotifyParsingRules type="state">
	...
  	<level5 translates_to="idle"/>
</NotifyParsingRules>
...
<action>
	<invite target="$(subscr_uri)"
		when="on press"
		states="idle"/>
	<invite target="$(remote_uri)"
		when="on press"
		state="ringing"
		request_uri="$(remote_uri)"
		replaces="$(call_id);to-tag=$(remote_tag);from-tag=$(local_tag)"/>
</action>



⚪️101
idle


incoming call ringing

dialog state => early/proceeding

NOTIFY
...
<?xml version="1.0"?>
<dialog-info
	xmlns="urn:ietf:params:xml:ns:dialog-info"
	version="..."
	state="full" entity="...">
	<dialog
		id="..."
		direction='recipient'
		call-id='...'
		local-tag="..."
		remote-tag="...">
		<state>early</state>
		<local>
			<identity display="B">
				sip:101@...
			</identity>
			<target uri="sip:101@...;line=...">
				<param pname="x-line-id" pval="0" />
			</target>
		</local>
		<remote>
			<identity display="C">
				sip:102@...
			</identity>
			<target uri="sip:102@..."/>
		</remote>
	</dialog>
</dialog-info>


translate state => ringing

  • quick dial not allowed
  • pick-up allowed
...
<NotifyParsingRules type="state">
	<level1
		translates_to="ringing">/dialog-info/dialog/state[.="early"]
	</level1>
	...
	<level2
		translates_to="ringing">/dialog-info/dialog/state[.="proceeding"]
	</level2>
  ...
</NotifyParsingRules>
<NotifyParsingRules
	type="variable"
	id="call_id"
	state="ringing">
	<level1 fetch_attribute="call-id">/dialog-info/dialog[@call-id]</level1>
</NotifyParsingRules>
<NotifyParsingRules
	type="variable"
	id="remote_tag"
	state="ringing">
	<level1 fetch_attribute="remote-tag">/dialog-info/dialog[@remote-tag]</level1>
</NotifyParsingRules>
<NotifyParsingRules
	type="variable"
	id="local_tag"
	state="ringing">
	<level1 fetch_attribute="local-tag">/dialog-info/dialog[@local-tag]</level1>
</NotifyParsingRules>
<NotifyParsingRules
	type="variable"
	id="remote_uri"
	state="ringing">
	<level1 fetch_attribute="uri">/dialog-info/dialog/remote/target[@uri]</level1>
</NotifyParsingRules>
<action>
	<invite target="$(subscr_uri)"
		when="on press"
		states="idle"/>
	<invite target="$(remote_uri)"
		when="on press"
		state="ringing"
		request_uri="$(remote_uri)"
		replaces="$(call_id);to-tag=$(remote_tag);from-tag=$(local_tag)"/>
</action>



🟠102 > 101
ringing


incoming call accepted

dialog state => confirmed

NOTIFY
...
<?xml version="1.0"?>
<dialog-info
	xmlns="urn:ietf:params:xml:ns:dialog-info"
	version="..."
	state="full"
	entity="sip:101@...">
	<dialog
		id="..."
		direction='recipient'
		call-id='...'
		local-tag="..."
		remote-tag="...">
		<state>confirmed</state>
		<local>
			<identity display="B">sip:101@...</identity>
			<target uri="sip:101@...;line=...">
				<param pname="x-line-id" pval="0" />
				<param pname="+sip.rendering" pval='yes' />
			</target>
		</local>
			<remote>
				<identity display="C">sip:102@...</identity>
				<target uri="sip:102@..."/>
			</remote>
	</dialog>
</dialog-info>


translate state => talking

  • quick dial not allowed
  • pick-up not allowed
...
<NotifyParsingRules type="state">
	...
	<level4
		translates_to="talking">/dialog-info/dialog/state[.="confirmed"]
	</level4>
</NotifyParsingRules>
...
<action>
	<invite target="$(subscr_uri)"
		when="on press"
		states="idle"/>
	<invite target="$(remote_uri)"
		when="on press"
		state="ringing"
		request_uri="$(remote_uri)"
		replaces="$(call_id);to-tag=$(remote_tag);from-tag=$(local_tag)"/>
</action>



🔴102 <> 101
talking


Incoming call terminated

dialog state => terminated

NOTIFY
...
<?xml version="1.0"?>
<dialog-info
	xmlns="urn:ietf:params:xml:ns:dialog-info"
	version="8"
	state="full"
	entity="sip:101@...">
	<dialog id="..."
		direction='recipient'
		call-id='...'
		local-tag="..."
		remote-tag="...">
		<state>terminated</state>
		<local>
			<identity display="B">sip:101@...</identity>
			<target uri="sip:101@...;line=...">
				<param pname="x-line-id" pval="0" />
			</target>
		</local>
		<remote>
			<identity display="C">sip:102@...</identity>
			<target uri="sip:102@..."/>
		</remote>
	</dialog>
</dialog-info>


translate state => idle

  • quick dial allowed
  • pick-up not allowed
...
<NotifyParsingRules type="state">
  ...
  <level5 translates_to="idle"/>
</NotifyParsingRules>
... 
<action>
	<invite target="$(subscr_uri)"
		when="on press"
		states="idle"/>
	<invite target="$(remote_uri)"
		when="on press"
		state="ringing"
		request_uri="$(remote_uri)"
		replaces="$(call_id);to-tag=$(remote_tag);from-tag=$(local_tag)"/>
</action>



⚪️101
idle


Outgoing call ringing

dialog state => early/proceeding

NOTIFY
...
<?xml version="1.0"?>
<dialog-info
	xmlns="urn:ietf:params:xml:ns:dialog-info"
	version="13"
	state="full"
	entity="sip:101@...">
	<dialog
		id="..."
		direction='initiator'
		call-id='...'
		local-tag="..."
		remote-tag="">
		<state>early</state>
		<local>
			<identity display="B">sip:101@...</identity>
			<target uri="sip:101@...;line=...">
				<param pname="x-line-id" pval="0" />
			</target>
		</local>
		<remote>
			<identity display="D">sip:103@...;user=phone</identity>
			<target uri="sip:103@...;user=phone"/>
		</remote>
	</dialog>
</dialog-info>


translate state => calling

  • quick dial not allowed
  • pick-up not allowed
...
<NotifyParsingRules type="state">
	<level1
		translates_to="ringing">/dialog-info/dialog/state[.="early"]
	</level1>
	<level1-1
		translates_to="calling">/dialog-info/dialog[@direction="initiator"]
	</level1-1>
	<level2
		translates_to="ringing">/dialog-info/dialog/state[.="proceeding"]
	</level2>
	<level2-1
		translates_to="calling">/dialog-info/dialog[@direction="initiator"]
	</level2-1>
</NotifyParsingRules>
...
<action>
	<invite target="$(subscr_uri)"
		when="on press"
		states="idle"/>
	<invite target="$(remote_uri)"
		when="on press"
		state="ringing"
		request_uri="$(remote_uri)"
		replaces="$(call_id);to-tag=$(remote_tag);from-tag=$(local_tag)"/>
</action>



🔴101 > 103
calling


Outgoing call accepted

dialog state => confirmed

NOTIFY
...
<?xml version="1.0"?>
<dialog-info
	xmlns="urn:ietf:params:xml:ns:dialog-info"
	version="..."
	state="full"
	entity="sip:101@...">
	<dialog
		id="..."
		direction='initiator'
		call-id='...'
		local-tag="..."
		remote-tag="...">
		<state>confirmed</state>
		<local>
			<identity display="B">sip:101@...</identity>
			<target uri="sip:101@...;line=...">
				<param pname="x-line-id" pval="0" />
				<param pname="+sip.rendering" pval='yes' />
			</target>
		</local>
		<remote>
			<identity display="D">sip:103@...</identity>
			<target uri="sip:103@..."/>
		</remote>
	</dialog>
</dialog-info>


translate state => talking

  • quick dial not allowed
  • pick-up not allowed
...
<NotifyParsingRules type="state">
	...
	<level4
		translates_to="talking">/dialog-info/dialog/state[.="confirmed"]
	</level4>
</NotifyParsingRules>
... 
<action>
	<invite target="$(subscr_uri)"
		when="on press"
		states="idle"/>
	<invite target="$(remote_uri)"
		when="on press"
		state="ringing"
		request_uri="$(remote_uri)"
		replaces="$(call_id);to-tag=$(remote_tag);from-tag=$(local_tag)"/>
</action>



🔴101 <> 103
talking


Outgoing call terminated

dialog state => terminated

NOTIFY
...
<?xml version="1.0"?>
<dialog-info
	xmlns="urn:ietf:params:xml:ns:dialog-info"
	version="..."
	state="full"
	entity="sip:101@...">
	<dialog
		id="..."
		direction='initiator'
		call-id='...'
		local-tag="..."
		remote-tag="...">
		<state>terminated</state>
		<local>
			<identity display="B">sip:101@...</identity>
			<target uri="sip:101@...;line=...">
				<param pname="x-line-id" pval="0" />
			</target>
		</local>
		<remote>
			<identity display="D">sip:103@...</identity>
			<target uri="sip:103@..."/>
		</remote>
	</dialog>
</dialog-info>


translate state => idle

  • quick dial allowed
  • pick-up not allowed
...
<NotifyParsingRules type="state">
	...
  	<level5 translates_to="idle"/>
</NotifyParsingRules>
... 
<action>
	<invite target="$(subscr_uri)"
		when="on press"
		states="idle"/>
	<invite target="$(remote_uri)"
		when="on press"
		state="ringing"
		request_uri="$(remote_uri)"
		replaces="$(call_id);to-tag=$(remote_tag);from-tag=$(local_tag)"/>
</action>



⚪️101
idle






Questions

Below is a list of questions to be addressed as a result of this requirements document:

QuestionOutcome
(e.g. How we make users more aware of this feature?)Communicate the decision reached

Not Doing