Courseware:IT Plus - PBX and Nodes
This book is about the PBX's node-tree concept.
Structured numbering plans
Numbering Plan, Node and Node Tree
Numbering Plan
In a VoIP PBX, all entities have a distinct name that can be used to call them (this is set in the object's Name property and sometimes also referred to as H.323-Id or SIP for historical reasons). However, like in traditional PBX systems, they can also have an (optional) number to call, often referred to as extension.
In a simple case all extensions are unique, forming a
flat numbering plan
. However, in some cases, a structured numbering plan is desired where extensions share the same number. For example,
a customer with several branch offices may want to have short, overlapping extensions per geographic region. When dialing an extension, it is interpreted in the context of the caller's region. Remote region extensions are called by means of a region dial prefix.This creates a
structured, multi-level numbering plan
.Node
In innovaphone speak, each scope in the numbering plan (that is, each range where extension numbers must not overlap) is called a numbering node. Each extension thus lives within exactly one numbering node.
In our
exemplary numbering plan, Region Italy would be a node (just like Region Southwest and Region North).Node Tree
Numbering nodes are hierarchically forming the
numbering node tree. The root of this tree is always called root. There is exactly one numbering node tree per system. Of course, if your numbering plan is
flat, the resulting numbering node tree is trivial: it consists of
the root node only. Independent Trees
Terminal devices (such as phones) register with PBXs and the PBX tree determines how calls are connected between the terminal devices via the PBXs as the call between two parties on different PBXs will be forwarded
along the PBX connections. For example, a call between devices registered on 2 different slave PBXs (registered to the master) will be forwarded from the originating PBX to the master and from the master to the target PBX. It is not sent directly between the 2 slave PBXs. How to name them best
When creating (and thus naming) nodes and PBXs you need to be careful. Of course there are no further restrictions regarding the choice of names. However, here are some guidelines which might be useful.
Both nodes and PBXs should not have names that sound like they could be useful for normal extensions.
Nodes (if you have some other than the root node) should be named in a way that they reflect some sort of logical grouping. innovaphone Holding and innovaphone Manufacturing Ltd might be good numbering node name choices if this is how extensions are grouped.
PBXs in contrast to that, should be named to reflect rather physical properties, such as the physical location of the PBX device. Berlin, Tokio or headquarter might be good choices. Or even Berlin, Kudamm 56, 2nd Floor. Some people find it convenient to use names with prefixes consistently, such as eg. PBX-Berlin, PBX-Tokio etc.
The simple node tree
Setting up the Node Tree
The root of the numbering node tree is always called root and there is no way to change this. Because of this, the root node does not need to be (in fact must not be) created explicitly. It exists implicitly.
In our
numbering node tree example, the required node definitions would look like this:
Objects (e.g. users) are placed into their appropriate node by setting their Node property to the name of this node:
You can log in to myApps on the IP411LEFT (hq.dvl-ckl2.net) using user ckl, password ip411. Remember that you probably will need to trust both the PBX's and the AP's certificate!
some nodes
: Region North (80), Region Southwest (82) and Region Italy (81). All of them are tied to the root node.
After loading the start configuration, please assign the users to nodes and give them extension numbers according to the following table:
User
Node
Extension
Edward Hyde
Region North
11
Henry Jekyll
Region North
12
Jane Doe
Region Southwest
11
John Doe
Region Southwest 12
Richard Roe
Region Italy
11
Christoph Künkel
root
42
The "full number from the root"
42 in to the search field, Christoph Künkel is shown.
The search field matches against the object's full number from the root of the numbering tree. For Christoph Künkel (being in the root node) this is identical to the user's own Number property. However, for objects in subnodes, this number is the concatenation of all node numbers from the root node down to the user's node, followed by the user's own Number property. So if you type
8111 in to the search field, you will see Richard Roe listed (as he is in the Region Italy node, which has Number 81). Number resolution
- The caller's position in the node tree is determined (that is, the value of the Node property in the PBX object the caller is registered with) and the evaluation context is set to this node
- If there is a matching non-node object in the evaluation context (i.e. the calling node) (that is, an object which has a Number defined that is equal to the called number or is equal to the beginning of the called number), then this object is the target and the call is delivered to this object
- Else if there is a matching node-object in the evaluation context, then the evaluation context is set to this node and the number defined for this node is stripped from the head of the called number. The algorithm then resumes with step b
- Else if there is no matching object at all, and the evaluation context is not the root node, and the current evaluation context's Parent Node has not been used as evaluation context so far, then the evaluation context is set to the Parent Node of the current evaluation context. The algorithm then resumes with step b
- Else if the evaluation context is already the root node, or its Parent Node has already been used as evaluation context then there is no target
In other words, the number is searched first in your node, and then up the tree to the root.
using the same number. The trunk line object would be put into the root numbering node then (usually with prefix 0). The steps taken from the above list then are the same from all the sub-nodes: a, d, b.
prefix the underlying nodes number. The steps taken are a, c, b.
prefix the sibling's node number. This works because the sibling's number is unknown in your node, so the prefixed node number will be evaluated in your parent node where it is known. The steps taken are a, d, c, b. Be careful not to shadow node prefixes
call objects in this sibling node
. Note that this is even true if the number of the object in your own node only starts with the node's number. Calling inside a node
Calling inside a node- call 11 from John Doe's IP111
Jane Doe's IP112 will ring
- John Doe resides in node Region Southwest
- when he dials a number, this number is evaluated in the Region Southwest context
- in node Region Southwest,
there is an object with number 11
(Jane Doe) - so the destination is found within the same node

Calling an object closer to the root
Before we can try this, you need to - start your myApps client (https://hq.dvl-ckl2.net/PBX0/APPCLIENT/137840/appclient.htm) (either in the launcher or in the Web UI)
- log in as ckl (password should be ip411)
- start the softphone (my softphone)
Calling towards the root node- call 42 from John Doe's IP111
your softphone will get a call
- when the PBX determines that there is no object with Number 42 in the current evaluation context (which is Region Southwest), it moves the evaluation context one level towards the root node (which then already is the root node itself, as we have a very simple one-layer node tree here)
- in node root,
there is an object with Number 42
(Christoph Künkel) - so the destination is found within the root node

Calling to a sibling node
To call towards the sibling node- call 8012 from John Doe's IP111
Henry Jekyll's analog phone will get a call
- when the PBX determines that there is no object with Number 8012 in the current evaluation context (which is Region Southwest), it moves the evaluation context one level towards the root node (which then already is the root node itself, as we have a very simple one-layer node tree here)
- in node root,there is also no user with Number 8012, but
there is a node (Region North) with Number 80
- so the node's Number is stripped from the called (8012->12) and the evaluation context is set to Region North
- in node Region North there is a callable object with Number 12 (Henry Jekyll), so the destination is found within the Region North node

Calling to a child node

Sharing a trunk throughout all nodes
appropriate PBX Trunk line object
already for this. The trunk is in Berlin, so someone has placed it into node Region North, probably the closest match that could be found. The trunk's "Number" property
it seems straight forward to - set the
Number property to 0
We can try that by- dialing 0 from Henry Jekyll's analog phone
You will hear a dial-tone first and after typing 0 an announcement saying "this is the German trunk line" (our trunk line is quite a fake, it does nothing but saying this)
The trunk's node
current node tree
. As the trunk is in node Region North, it is reachable to all objects in this node dialing a 0. This is why it works for Henry Jekyll.
To see how that works- dial 800 from John Doe's IP111
You will hear the trunk's announcement
move the trunk line to the root node, which is the parent node to all other nodes and is therefore searched from all nodes.
- change the trunk line's Node property to root
- call 0 from John Doe's IP111
You will hear the announcement - call 0 from Richard Roe's IP222
You will also hear the announcement
Override the trunk in a specific node
Trunk line object called trunk-italy. We only need to fix it a bit.
So the solution seems fairly simple:- change its Node property to Region Italy
- change trunk-italy's Number property to 0
If you save the trunk line object and receive a duplicate number error message, the password is removed from the object. As a result, the GW2 interface cannot register with the object. Please make sure that the password of Trunk Italy is ip411.
We can try it out now- call 0 from Richard Roe's IP222 (Region Italy)
You hear a slightly different announcement for the Italian trunk - call 0 from John Doe's IP111 (Region Southwest)
You hear the well-known announcement for the German trunk - call 0 from Henry Jekyll's analog phone (Region North)
again, you hear the well-known announcement for the German trunk
Anything wrong with this?
Looking at our
modified numbering node tree we can see that what we did to override the global trunk in Region Italy is a variation of shadowing node prefixes: the Italian trunk shadows the global trunk.
Richard calls back to this number, it will go through the object with Number 0 from his point of view (that is, the Region Italy node) which is trunk-italy.
If you use separate trunks and nodes, then you should consider using one individual trunk per node.Why do individual trunks help?
received through a trunk line in one node and the call is relayed to another Node, the Number of the trunk line (0) along with the Number of its Node (e.g. 81) is prefixed to the calling party number. This way, when the recipient calls back, the call will be routed back to the original trunk. More Node properties
some properties set in the
Setting up the Apps. In this course, we did not think about numbering nodes at all and potential multiple trunk lines in multiple locations. You must understand that these values are used to convert a calling number (e.g. 03092258541 in Germany) to its international equivalent (+493092258541) for reverse lookup. In this process, some initial digits (known as prefixes) are cut off (usually a sequence of 0s, like the first 0 in 030). Then the number is supplemented with the area code and country code (depending on how many 0s were removed).
As of this writing (firmware build 13.7377), the values are falsely taken from the node object of the user the call is delivered to. Also, the node prefix which is put in front of the calling number (81 in our example in the previous chapter) is not removed. So reverse lookup for calls between nodes won't work for now, at least not if they do not share the same country node properties such as prefixes and country code.
If there are no values configured for a node, the values are taken from those which are configured in PBX/Config/General.
To define the prefixes and area/country codes in our sample scenario, we obviously need to set the right values in both PBX/Config/General (so that they can be used for the root node) and in the Region Italy node (as they differ from the settings for all other nodes):- open PBX/Config/General in the advanced UI
- set Prefix for Intl/Ntl/Subscriber to 000, 00, 0
- set Country Code/Area Code/Subscriber to 49, 30, 92258541
A quick look at reverse number lookup
You can check that by - opening the Contacts App and
- searching for caller
You should see
Sindelfingen Germany +49703154321 Ospedaletto Italy +3904554321 Berlin Germany +493054321
You can check that as follows- go to Maintenance/Diagnostics/Config-Show on the IP411LEFT's advanced UI
- check the line config change REVERSE-LOOKUP
There must be a /trace on option - if this is not the case, then
- go to Maintenance/Diagnostics/Command
- type !config add REVERSE-LOOKUP /trace on in to the entry field
- click on the Command button
- type !config write in to the entry field
- click on the Command button
- type !config activate in to the entry field
- click on the Command button
In addition, make sure that the option to log PBX calls is also enabled. This should be enabled by default, but you never know, so please double check.- go to Maintenance/Diagnostics/Logging on the IP411LEFT's advanced UI
- the check mark next to PBX calls must be active
To simulate an incoming external call from a subscriber in the Sindelfingen area in Germany- go to Maintenance/Diagnostics/Tracing on the IP411LEFT's advanced UI
- click on trace(buffer)
This will clear the PBX's trace buffer (you can verify that by clicking on it again, there should be an empty trace shown then) - dial 700 from John Doe's IP111
Edward Hyde's IP232 will ring,
showing a call from 000493054321 known as Berlin Germany Caller (you can hang up the call) - click on trace(buffer) again
The conversion (000493054321 -> 493054321) shown above is done based on the prefixes set forth for the Node object as follows:2:0445:737:3 - LOG PBX0 19 John Doe(8212:john.doe) setup-> (700)
John Doe calls 700
2:0445:742:3 - LOG PBX0 6 trunk-germany(000493054321) setup-> (8011)
a call comes in from 000493054321 though the German Trunk line (this is our little magic: a call to 700 is echoed as call from a Berlin subscriber with a calling party number in international format)
2:0445:742:5 - LOG PBX0 20 Edward Hyde(8011:edward.hyde) <-setup (000493054321)
The incoming call is sent to Edward Hyde
2:0445:745:1 - OUT.20 -> REVERSE-LOOKUP-SESSION.4 0:325 REVERSE_LOOKUP_NUMBER(edward.hyde 000493054321:493054321)
The PBX is doing a reverse lookup on the incoming calling party number for Edward Hyde. The original number is 000493054321 which is converted to 493054321 for the lookup (actually, a + not shown in the trace is also prepended so that the lookup is done for +493054321)
2:0445:771:5 - REVERSE-LOOKUP-SESSION.4 -> OUT.20 0:327 REVERSE_LOOKUP_NUMBER_COMPLETE(000493054321:Berlin Germany Caller)
The number is found to be a contact called Berlin Germany Caller
- the incoming number 000493054321 is matched against the Prefix for Intl (which we have set to 000 before)
- the international prefix does match and is therefore removed from the number (leaving 49305432)
Now let's see what happens to an incoming subscriber number:- go to Maintenance/Diagnostics/Tracing on the IP411LEFT's advanced UI
- click on trace(buffer)
- dial 702 from John Doe's IP111
Edward Hyde's IP232 will ring,
showing a call from 054321 known as Berlin Germany Caller (you can hang up the call) - click on trace(buffer) again
In order to perform the reverse lookup, the PBX will0:1248:095:6 - LOG PBX0 10 trunk-germany(054321) setup-> (8011)
0:1248:098:4 - OUT.11 -> REVERSE-LOOKUP-SESSION.3 0:84 REVERSE_LOOKUP_NUMBER(edward.hyde 054321:493054321)
0:1248:168:0 - REVERSE-LOOKUP-SESSION.3 -> OUT.11 0:86 REVERSE_LOOKUP_NUMBER_COMPLETE(054321:Berlin Germany Caller)
- again match the incoming number (054321) against the Prefix for Intl (000)
- as this doesn't match, the Prefix for Ntl is tried (which we have set to 00 before)
- as this also doesn't match , the Prefix for Subscriber is tried (which we have set to 0 before)
- the subscriber prefix does match and therefore the prefix is removed (-> 54321), the area code (30) is prefixed (-> 3054321) and finally the country code (49) is prefixed (-> 493054321)
- so the same number as before is used for the reverse lookup (+493054321) and therefor, the same contact (Berlin Germany Caller) is found
If you like, you can also try it with a national number. Just call 701 from John Doe's IP111.Reverse lookup in a different node
To place a call from a subscriber in Ospedaletto through our Italian trunk line to Richard Roe (our Italian user) with a subscriber number as calling party- go to Maintenance/Diagnostics/Tracing on the IP411LEFT's advanced UI
- click on trace(buffer)
- dial 71211 from John Doe's IP111
An incoming call from 004554321 will
show up at Richard Roe's IP222 - Notice that no calling name is shown, so the reverse lookup failed
- to see what happened, click on trace(buffer) again
4:2425:859:3 - LOG PBX0 21 John Doe(8212:john.doe) setup-> (71211)John Doe calls 712114:2425:864:4 - LOG PBX0 12 trunk-italy(81004554321) setup-> (11)An incoming call from 004554321 comes through the Italian trunk line4:2425:867:3 - OUT.11 -> REVERSE-LOOKUP-SESSION.4 0:512 REVERSE_LOOKUP_NUMBER(richard.roe 004554321:494554321)A reverse lookup is done for +494554321 which yields no result (no REVERSE_LOOKUP_NUMBER_COMPLETE line in the trace)
To fix this, we need to edit the Prefixes Intl/Ntl/Subscriber and Country Code/Area Code/Subscriber properties in the Region Italy Node object as follow:- open the Region Italy Node object
- switch to the Node tab
- set Prefixes Intl/Ntl/Subscriber to 000, 0, 0, respectively
- set Country Code/Area Code/Subscriber to 39, <empty>, 04554321
Now we can try again calling 71211 from John Doe's IP111 and we'll
see that the reverse lookup now works.
Italy is in another way, hm, unusual let's say: subscriber numbers often start with 0 (such as in 04554321). What may look like a national dial prefix (0) + an area code (45) followed by a subscriber number (54321) is in fact a subscriber number in its entirety. You can see that when you try to call this number from abroad: you need to dial 0003904554321, not 000394554321 as you would expect if the 0 would be a national dial prefix.Local objects
In such a scenario, nodes with node prefixes do not make sense at first glance.
So let's convert our setup to a single-node setup (for simplicity, let's keep the full numbers for all extensions, so that, for example, Edward Hyde would have extension 8011 and Richard Roe would have extension 8111):- as we want to get rid of all these nodes, remove Region North, Region Southwest and Region Italy nodes (You really need to delete these objects in order for the Config Checker to detect your progress)
- move the users to the root node and modify their Number property as follows:
Edward Hyde
8011
Henry Jekyll
8012
Richard Roe
8111
Jane Doe
8211
John Doe
8212
You might have noticed that the user objects still had their initial Node configuration - although the nodes used were already deleted. This can happen easily when reworking a configuration and you should carefully fix all such inconsistencies.
part of the Node drop-down in the object configuration. In other words, you can set any PBX not only as a value for the PBX property but also as a value for the Node property.
- a-0. The callers physical location is determined and the evaluation context is set to this node. If there is a matching non-node object in the evaluation context that has its Local property set, then this object is the target and the call is delivered to this object. Otherwise...
- a. The caller's position in the node tree is determined (that is, the value of the Node property in the PBX object the caller is registered with) and the evaluation context is set to this node
- b. ...
So - set hq (which is the name of our master PBX and therefore also a node name) as Node for trunk-germany and
- also
set the Local flag
You can easily verify this by calling 0 from any of the phones. You will always reach the German trunk line (as all users are registered with hq).Setting up the PBX for the Italian trunk line
Let us integrate the new slave PBX:- the PBX name of the new slave PBX is set to italy on the IP811. So we need to create a PBX type object with the Name property set to italy
- its Long Name property doesn't matter really, but we recommend to set it to Italy
- the Parent Node property should be
set to to root. The three Region xyz nodes which are available in the drop-down too are not used anymore in our new scenario, hq is the master PBX and must not be used here (we will discuss later why this is the case) and italy, well, would create a loop of course - the Parent PBX property is easy. Of course, our slave needs to be connected to the master PBX and hence,
hq is the right choice here - an interesting case is the Number property. It must not be empty for a PBX type entry but the actual value doesn't matter during operation. This is why already the hq PBX has this strange **1 value for it (the best we can say is: it certainly does not conflict with a number you would want to use in real life). So we choose **2 here
- the Password finally, you guessed it, needs to be set to ip411 in our training scenario (and surely you undersign that you will never use this password in a real life scenario)
be registered with the master PBX.While we are at that: have you observed that the DNS name of our slave PBX is shown as branch-b.dvl-ckl2.net? Shouldn't it read italy.dvl-ckl2.net?
Here is what we need to do:- change the Node property of trunk-italy to italy
- change the PBX property of trunk-italy to italy
- add the local flag to trunk-italy
- change the PBX property of Richard Roe to italy
Take care not to change the Node property of the users. They should remain as root as we want to have all of them in the same flat numbering plan (hence node).Dynamic physical location
Let us check the registrations on our IP811- on PBX/Registrations we see Richard Roe registered from 172.31.31.5 which is what we expected
- however, on PBX/Objects we see
more information: 172.31.31.5@hq*tls in the rightmost column
registration configuration in his IP222
: the phone sends its registration request to the master PBX (hq.dvl-ckl2.net). From there, it is redirected to the slave PBX (branch-b.dvl-ckl2.net).
The physical location of a user (more precisely: of a registration on behalf of this user) is set to the first PBX that received the registration. Fixing the Italian site
sends the registration
to a PBX different from his configured registration PBX initially. Along with the redirect to the correct registration PBX, the name of the initial PBX is sent and remembered as physical location.Sending the registration to the proper PBX
provisioning category so that we can apply it selectively.
two differences between the new and the original device configuration entries:- the Category has changed from hq IP phone to italy IP phone
- the Primary gatekeeper is set to branch-b.dvl-ckl2.net instead of hq.dvl-ckl2.net
To apply this new configuration to Richard's phone and thereby fixing its physical location proceed as follows:
no deviated physical location.
If we now call 0 from Richard Roe's IP222, we will hear the announcement of the Italian trunk line.Disabling dynamic physical location
recommend this in our courses). Therefore, using a separate device configuration for phones in another location is easy to do.
options in the Advanced settings section for both an IP phone and an analog phone device configuration.
The dynamic physical location is a largely obsolete concept used before version 13, so we generally recommend to disable it.
To disable dynamic physical location for both IP and analog phones proceed as follows: - open the Devices App
- make sure you have the Domains tab selected
- select your dvl-ckl2.net domain
- select Device configuration
- tick the No physical location check-mark in [ Analog phone / fax ] dvl-ckl2.net Analog Phone hq Analog Phone, [ Analog phone / fax ] dvl-ckl2.net.net Fax Device hq Fax Device, [ Phone ] dvl-ckl2.net hq IP Phone and [ Phone ] dvl-ckl2.net italy IP Phone
- you will find the checkmark in the Advanced settings part of these device configurations
Note though that although the check-mark is labeled No physical location it does not disable the physical location entirely. It only disables the modification of the physical location when a registration redirection occurs. The physical location still is relevant as otherwise we would not be able to implement local trunk lines in a flat numbering plan.Calls from "Local" objects
PBX nodes used as physical location must be located underneath the nodes the users are in."Empty" Node and PBX entries
Empty PBX
Empty Node
Empty Node and PBX with Local flag
trunk-universal
object. Node tree with escapes
ITU E.164).
.
which are found in the Node tab?