Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

InteractionsSIP NOTIFY XML bodyXML definitionDisplay
UASUAS => UACUAC translation rulesComplete rule setPFK LED & label (number)PFK LED & label (display name)
goes offhook

dialog state => trying

Code Block
languagexml
titleNOTIFY
linenumberstrue
collapsetrue
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
Code Block
languagexml
themeConfluence
titleXML definition
linenumberstrue
collapsetrue
...
<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>



It can be useful to use the same XML definition code for more buttons so that we don't have to write the same code repeatedly. Also, sometimes we would like to allow phone users to configure their own buttons based on our custom XML but without them having to know XML to make the configuration. For these reasons, Snom phones allow replacement_plan elements. These allow you to change the default functionality of a function key button to your own (designed with XML Definition Code). Once you have provisioned the replacement (and rebooted the phone) there will be a new value (its name is according to the key id from the XML definition code) in the Function Keys page under Type:

Code Block
languagexml
themeConfluence
titleXML definition
linenumberstrue
collapsetrue
<ReplacementPlan>
	<!-- This defines the name of the entry in the Function Keys page under Type -->
	<key id="BLF-new">
	<general type="BLFSampleDefinition" />
		<initialization>
 		<!-- only add the UAS IP here, extension number is replaced from WUI as variable $(ui_argument) -->
		<variable name="subscr_proxy" value="10.110.22.35"/>
		<!-- initial value for the state variable: off means, that after bootup this button has state off -->
		<state value="off"/>
		</initialization>
		<!-- a subscription of event-type dialog will be initiated to the URI defined -->
		<subscription type="dialog" to="<sip:$(ui_argument)@$(subscr_proxy)>" for="$(ui_argument)@$(subscr_proxy)"/>
		<!-- checks if a SIP NOTIFY message belongs to this particular button
		level is ok, if the condition inside the tags is matched -->
		<NotifyParsingRules type="applies">
			<level1 translates_to='OK'>/dialog-info[@entity="sip:$(ui_argument)@$(subscr_proxy)"]</level1>
		</NotifyParsingRules>
		<!-- translates the button state based on the body of the SIP NOTIFY -->
		<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>
			<level3 translates_to="offhook">/dialog-info/dialog/state[.="trying"]</level3>
			<level4 translates_to="talking">/dialog-info/dialog/state[.="confirmed"]</level4>
			<level5 translates_to="idle"/>
		</NotifyParsingRules>
		<!-- Call pickup: fetch variable call_id from call-id of NOTIFY body -->
		<NotifyParsingRules type="variable" id="call_id" state="ringing">
			<level1 fetch_attribute="call-id">/dialog-info/dialog[@call-id]</level1>
        </NotifyParsingRules>
		<!-- Call pickup: fetch variable remote_tag from remote-tag of NOTIFY body -->
		<NotifyParsingRules type="variable" id="remote_tag" state="ringing">
			<level1 fetch_attribute="remote-tag">/dialog-info/dialog[@remote-tag]</level1>
		</NotifyParsingRules>
		<!-- Call pickup: fetch variable local_tag from local-tag of NOTIFY body -->
		<NotifyParsingRules type="variable" id="local_tag" state="ringing">
			<level1 fetch_attribute="local-tag">/dialog-info/dialog[@local-tag]</level1>
		</NotifyParsingRules>
		<!-- Call pickup: fetch variable remote_uri from uri of NOTIFY body -->
		<NotifyParsingRules type="variable" id="remote_uri" state="ringing">
			<level1 fetch_attribute="uri">/dialog-info/dialog/remote/target[@uri]</level1>
		</NotifyParsingRules>
		<action>
		 	<!-- Quick dial: depending in which states we want to allow this action -->
            <invite target="$(ui_argument)" when="on press" states="calling, talking, offhook, idle"/>
 		 	<!-- Pick up --> 
            <invite target="$(remote_name)<$(remote_uri)>" when="on press" state="ringing" request_uri="$(remote_uri)" replaces="$(call_id);to-tag=$(remote_tag);from-tag=$(local_tag)"/>
			<assign when="on notify" state="ringing">
   				<source value="kIconTypeFkeyBlfRinging"/>
   				<destination id="icon"/>
			</assign>
			<assign when="on notify" state="idle">
   				<source value="kIconTypeFkeyBlfIdle"/>
   				<destination id="icon"/>
 			</assign> 
 			<assign when="on notify" state="ringing">
   				<source value="kIconTypeFkeyBlfRinging"/>
   				<destination id="icon"/>
			</assign>
			<assign when="on notify" state="calling">
   				<source value="kIconTypeFkeyBlfCalling"/>
   				<destination id="icon"/>
			</assign> 
 			<assign when="on notify" state="talking">
   				<source value="kIconTypeFkeyBlfTalking"/>
   				<destination id="icon"/>
			</assign>
		</action>
    </key>
</ReplacementPlan>



🔴101 >
offhook



🔴
Alex >
offhook


goes onhook

dialog state => terminated

Code Block
languagexml
titleNOTIFY
linenumberstrue
collapsetrue
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
Code Block
languagexml
themeConfluence
titleXML definition
linenumberstrue
collapsetrue
...
<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



⚪️
Alex
idle


incoming call ringing

dialog state => early/proceeding

Code Block
languagexml
titleNOTIFY
linenumberstrue
collapsetrue
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
Code Block
languagexml
themeConfluence
titleXML definition
linenumberstrue
collapsetrue
...
<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



🟠
Alice > Alex
ringing


incoming call accepted

dialog state => confirmed

Code Block
languagexml
titleNOTIFY
linenumberstrue
collapsetrue
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
Code Block
languagexml
themeConfluence
titleXML definition
linenumberstrue
collapsetrue
...
<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



🔴
Alice <> Alex
talking


Incoming call terminated

dialog state => terminated

Code Block
languagexml
titleNOTIFY
linenumberstrue
collapsetrue
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
Code Block
languagexml
themeConfluence
titleXML definition
linenumberstrue
collapsetrue
...
<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



⚪️
Alex
idle


Outgoing call ringing

dialog state => early/proceeding

Code Block
languagexml
titleNOTIFY
linenumberstrue
collapsetrue
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
Code Block
languagexml
themeConfluence
titleXML definition
linenumberstrue
collapsetrue
...
<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



🔴
Alex > Tita
calling


Outgoing call accepted

dialog state => confirmed

Code Block
languagexml
titleNOTIFY
linenumberstrue
collapsetrue
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
Code Block
languagexml
themeConfluence
titleXML definition
linenumberstrue
collapsetrue
...
<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



🔴
Alex <> Tita
talking


Outgoing call terminated

dialog state => terminated

Code Block
languagexml
titleNOTIFY
linenumberstrue
collapsetrue
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
Code Block
languagexml
themeConfluence
titleXML definition
linenumberstrue
collapsetrue
...
<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



⚪️
Alex
idle








...

QuestionOutcome
Shall we visualize all possible translation states?

Alexander Feldt  I'd agree, for these reasons:

  1. Snom phones (acting as UAS) already provide all information in NOTIFY body
  2. It's cleaner, e.g. when the UAS goes offhook or calls somebody, currently "talking" is visualized, which is not true. 
  3. It could be an advanced sales feature?

Shall we allow quick dial only in idle state?

Alexander Feldt Technically, we could allow quick dial in any state, except ringing...

Shall we create new icons or reuse those already existing ones?

Alexander Feldt I really question icons, that are so small, that there is no visible difference to the user, like  and , therefore - if we use them at all - I vote for better distinguishable icons.

How can a specific LED behaviour be addressed using XML definitions?

Alexander Feldt Currently not within XML definitions, it has to be configured via settings.

How can a specific label be addressed using XML definitions?

Alexander Feldt see label, but I haven't figured out how to define it correctly

How can a specific icon be addressed using XML definitions?

Alexander Feldt see icon, but I haven't figured out how to define it correctly

How shall the D8XX:PFK-mapping:BLF-XML:Monitoring:Visualization:Label:name-area be configured to use either number or display name?

Alexander Feldt The topic is even more complex: I assume the PFK label is generally too short to show longer extension number or names, i.e. some kind of scrolling must be used. But is this really helpful for the customer at all?

From the UX point of view: which visual aid is more important for the customer: LED or PFK label?

Alexander Feldt 

  1. The colour of the LED and if it is blinking => very important
  2. The label icon => basically not important, the LED is already showing everything, also the PFK label is not even shown by default
  3. The label name => important when it comes to call pickup, less important for other scenarios, so is it worth adding scrolling or should we keep it simpler?
  4. The label state => It is definitely an additional information, which cannot be shown with LED only, e.g. the difference between offhook, calling and talking

Tita Petre Is the above list of requirements enough input to create a proper testplan?


...