Microsoft Teams and IOT controled Robotics — The BOT

Part 2 of 4 series into Teams Controlled Robotics

Part 1

Microsoft Teams is an excellent collaboration tool with person to person communication workloads like, Messaging, Voice and Video collaboration. Microsoft Teams can also use Microsoft AI and cognitive services to collaborate with machines and devices. The Azure suite of services allows person to machine control, remote diagnostics and telemetrics analytics of internet connected devices.

To demonstrate how Microsoft Teams can control remote robotics, I have created a fun project that allows Teams to manage a RoboRaptor through Teams natural language messages. The objective is to send control commands from Teams as natural language messages that are sent to a Microsoft AI BOT. The BOT will then use Azure  language understanding services (LUIS) to determine the command intent. The result is sent to the Internet of Things controller card attached to the RoboRaptor for translation into machine commands. Finally I have configured a Teams channel to the Azure BOT service. In Teams it looks like a contact with an application ID. When I type messages into the Teams client it is sent from Teams over the channel to the Azure BOT service for processing. The RoboRaptor command messages to the IoT device are sent from the BOT or functions to the Azure IoT HUB service for messaging to the physical device.

The overview of the logical connectivity is below:


The Azure services and infrastructure used in this IoT environment is extensive and fall into five key areas.



  1. The blue services belong to Azure AI and machine learning services and it includes chat bots and cognitive services.
  2. The services in orange belong to Azure compute, analytics.
  3. The services in green belong to Azure internet of things suite.
  4. The Services in yellow are IoT hardware, switches and sensors.
  5. The services in white are network connectivity infrastructure

The Azure Bot service plays an essential part in the artificial intelligence and personal assistant role by calling and controlling functions and cognitive services. As the developer, I create code that collects instant messages from web chats and Teams channels and tries to collect key information and then determines an intent of the user.

Question and Answer Service:

In this project I want to be able to deliver a help menu. When users type in a request for help with the commands that they can use with the RoboRaptor, I wish to be able to return a list in a Teams card of all commands and possible resultant actions. The Azure Q&A service is best suited for this task. The Q&A service is an excellent repository for a single question and a single reply with no processing. With the Q&A service you build a list of sample questions, and if you match you reply with the assigned text, it is best for Frequently asked Questions scenarios.

I can use the BOT to collect information from the user and store it in dialog tables for processing. For example, I can ask for a user’s name and store it for replies and future use.

Sending commands

I wanted to be able to use natural language to forward commands to the RoboRaptor. As Teams is a collaboration tool and for those who are part of the team have permissions for this BOT, so they too can send commands to IoT robotic devices. The Teams members can have many ways of saying a request. Sure, I can just assign a single word for an action like forward however if I want to string commands together I will need to use the Azure LUIS service BOT arrays to build action table. For example, I can build a BOT that replicates talking to a human through the teams chat window.

As you can see the LUIS service can generate a more natural conversation with robotics.

How I use the Luis service?:

The LUIS service is a repository and collection of intents and key phrases. The diagram below shows an entry I have created to determine the intent of a user requirement and check its intent confidence level.

I have a large list of intents that equates to a RoboRaptor command request, like move forward and Stop and it includes intents for other projects like collecting names and phone numbers, it can also contain all my home automation commands too.

In the example below, I have the intent that I want the RoboRaptor to dance. Under the dance intent I have several ways of asking the RoboRaptor to dance.


The LUIS service will return to the BOT the Intent of dance and a score of how confident it is of a match. The following is BOT code that evaluates the returned intent and score. If the confidence score is above 0.5 the BOT will initiate a process based on a case match. I created basic Azure BOT service from Visual Studio 2017. You can start with the Hello world template and then build dialogue boxes and middleware to other azure services like Q&A maker and the Luis service.

In our case the intent is dance so the Sendtoraptor process is called with the command string dance.


A series of direct method commands to the IoT using the direct call method is invoked. The method name= forward, and a message payload “dance fwd” is sent to the IoT-Hub service and IoT device name of “IOT3166keith” which is my registered MXCHIP. A series of other moves are sent to give the impression that the RoboRaptor is dancing.


 if (robocmd == “dance”)


//forward 4, then back 4 then right 4 then forward 4 left 4


//send stop signal

methodInvocation = new CloudToDeviceMethod(“forward”) { ResponseTimeout = TimeSpan.FromSeconds(300) };

methodInvocation.SetPayloadJson(JsonConvert.SerializeObject(new { message = “dance fwd” }));

response = await serviceClient.InvokeDeviceMethodAsync(“IOT3166keith”, methodInvocation);


methodInvocation = new CloudToDeviceMethod(“backward”) { ResponseTimeout = TimeSpan.FromSeconds(300) };

methodInvocation.SetPayloadJson(JsonConvert.SerializeObject(new { message = “dance back” }));

response = await serviceClient.InvokeDeviceMethodAsync(“IOT3166keith”, methodInvocation);


methodInvocation = new CloudToDeviceMethod(“right”) { ResponseTimeout = TimeSpan.FromSeconds(300) };

methodInvocation.SetPayloadJson(JsonConvert.SerializeObject(new { message = “dance right” }));

response = await serviceClient.InvokeDeviceMethodAsync(“IOT3166keith”, methodInvocation);


methodInvocation = new CloudToDeviceMethod(“left”) { ResponseTimeout = TimeSpan.FromSeconds(300) };

methodInvocation.SetPayloadJson(JsonConvert.SerializeObject(new { message = “dance left” }));

response = await serviceClient.InvokeDeviceMethodAsync(“IOT3166keith”, methodInvocation);





In the above code the method Invocation API attributes are configured, The new cloudToDeviceMethod(“forward”) sets up a direct call- Cloud to Device method with a methodname = forward and the setPayloadJson configurs a json payload message  “dance fwd”.

The await serviceClient.InvokeDeviceMethodAsync (“IOT3166keith”, methodInvocation); function initiate the asynchronous transmission of the message to the IoT Hub service and the device IOT3166keith.

The IOTHUB then sends the message to the physical device. The onboard oled display will show commands as they are received.


The MXCHIP has many environment sensors built in. I selected Temperature and Humidity as data I wish to send to Power BI for analytics. Every few seconds the Telemetric information is sent to the IoT hub service.

I have configured message routing for Telemetric messages to get to stream Analytics service in the IOT HUB service. I then parse the json files and save the data in Azure Blob storage, where Power BI can generate reports. More on this with next blog.

The next Blog will discover more about the IOT hardware and IOT HUB service.


Intelligent Man to Machine collaboration with Microsoft TEAMS. -Robo Raptor

Microsoft Teams is excellent collaboration tool with person to person communication workloads like, Messaging, Voice and Video collaboration. Microsoft Teams can also use Microsoft AI and cognitive services to collaborate with machines and devices. Together with the large suite of Azure services that allows me to call Azure apps to orchestrate  person to machine control, remote diagnostics and telemetrics analytics of internet connected devices.

My Teams BOT  is set up as a personal assistant that  manages communications between several of my projects. The fact I can use a single interface to run many purchased and custom built apps displays the flexibility of Azure BOT’s. I currently run three personal custom created applications, a Office 365 management Assistant, a lockdown and alert system, and IOT device control, all through this single Teams BOT.
To demonstrate how Microsoft teams can control remote robotics, I have created a fun project that allows Teams to manage a RoboRaptor through Teams natural language messages.
The objective is to send control commands from MS Teams as natural language messages that are sent to a Microsoft AI BOT. The BOT will then use Azure LUIS language understanding services to determine the command intent. The result is sent to the Internet of Things controller card attached to the robo raptor for translation into machine commands.

The Robo Raptor  and the MXCHIP is a working IOT device. Live telemetric data is sent back into Azure IOT HUB service to monitor environmental statistics which can be measured through Power BI. Temperature and humidity readings are typical of a standard IOT end point. The MXCHIP is configured with Arduino code which is very common microcontroller IDE platform.

The RoboRaptor project is complex and consumes multiple services from Azure. However, I have been able to build this solution with free tier services and so far I am up for $80 for the MXCHIP and dual relay module. The RoboRaptor was one of the kids old toys I saved from extinction.

The Robo Raptor Project uses the following Azure services.

The Project includes,
• Microsoft Teams for user interface
• BOTs for creating intelligent interaction and function calls to IOT and other Azure services
• Cognitive services, LUIS language understanding services to allow normal natural language, between user and robotics
• QNA, Question and Answer builder to create help menus and information repositories for users
• Facial Recognition Cognitive service, to scan people around the raptor and identify as owner or foe,
• Server-less Azure functions to control communications between IOT and Teams
• IOT, Azure internet of things services to manage and communicate with IOT hardware
• MXCHIP, A small microcontroller that I have attached to the raptor to provide secure internet communication to Azure IOT Hub. The MXCHIP will receive commands and send instructions to the Robo Raptor.
The Mxchip will activate power to the robotics and a fire a laser weapon through switched circuits. The MXCHIP also sends telemetry data back to AZURE for storage and analytics. Information include things like Temperature, Humidity, Pressure, Accelerometer, and Gyroscope info.

My choice of IOT hardware was the MX Chip. I found this development board easy to use and register to the Microsoft Azure IOT HUB. It is Arduino compatible and the board library easy to follow. I used a break out board to access IO pins to activate relays to turn on power and activate the laser. The hardware specs are as follows.
Device Summary:
Microcontroller: STM32F412RG ARM®32-bit Cortex®-M4 CPU
Operating Voltage: 3.3V
Input Voltage: 7-12V
Digital I/O Pins (DIO): 31
Analog Input Pins (ADC): 2
UARTs: 2
SPIs: 1
I2Cs: 1
Flash Memory: 1 MB
SRAM: 256 KB
Clock Speed: 100 MHz

The follow diagram shows the message flow between the MXChip and MS Teams.



Video footage in action

The project blogs is broken up into the following key milestones

Microsoft Teams BOTS and cognitive services. Part 2

Microsoft IOT and the MXCHIP Part 3

Robo raptor Facial recognition Part 4


Skype for Business Standard Edition – Unable to failback once DR is invoked

During the process of “Invoke-CsPoolFailover” the process changes the “PoolState” of the primary server from Active to FailedOver state, if this is not addressed after the restoration of the primary server the failback will not work.

Figure 1: Primary Server FailedOver State

In order to failback the pool back to the primary server the “PoolState” will need to be set back to Active. This can be done by running the following command:

PS C:\Set-CsRegistrarConfiguration -Identity “” -PoolState Active

Log into the restored primary frontend server and using Windows PowerShell start all the Skype for Business services by running the following command:

PS C:\Start-CsWindowsService

Once the above is done you can follow the listed blog for the failover process:

DR Failover for Skype for Business Standard Edition

DR Failover for Skype for Business Standard Edition

The article takes you through step by step of carrying out both health check and invoking disaster recovery (DR) a standard edition environment. The diagram below shows the layout of the environment where the DR was carried out on:

Figure 1 – Environment Overview

Before proceeding to test DR you need to make sure the appropriate registrar information is available/configured in the environment otherwise you will get the following error during Pool Failover process:

Please check that the pool <Prod_S4B> is healthy as conditions such as high CPU, low available memory
 or any disabled services can delay (or in some cases result in unsuccessful) fail over operations.
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is “Y”):
Get-CsRegistrarConfiguration -Identity ‘service:Registrar:<Prod_S4B>’
WARNING: Cannot find “RegistrarConfiguration” “Registrar:<Prod_S4B>” because it does not exist.
Get-CsRegistrarConfiguration -Identity ‘service:Registrar:<DR_S4B>’
Invoke-CsPoolFailOver : Microsoft.Rtc.Management.Hadr.ManagementCOMException: Version check failed. This cmdlet works
only on servers running Lync Server 2013 or later.
   at Microsoft.Rtc.Management.Hadr.InvokePoolFailOverCmdlet.Action()
At line:1 char:1
+ Invoke-CsPoolFailOver -PoolFqdn <DR_S4B>
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidResult: (:) [Invoke-CsPoolFailOver], ManagementCOMException
    + FullyQualifiedErrorId : Microsoft.Rtc.Management.Hadr.InvokePoolFailOverCmdlet
WARNING: Invoke-CsPoolFailOver encountered errors. Consult the log file for a detailed analysis, and ensure all errors
(2) and warnings (0) are addressed before continuing.
WARNING: Detailed results can be found at
Invoke-CsPoolFailOver : Microsoft.Rtc.Management.Hadr.ManagementCOMException: Version check failed. This cmdlet works
only on servers running Lync Server 2013 or later.
   at Microsoft.Rtc.Management.Hadr.InvokePoolFailOverCmdlet.Action()
At line:1 char:1
+ Invoke-CsPoolFailOver -PoolFqdn <DR_S4B>
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidResult: (:) [Invoke-CsPoolFailOver], ManagementCOMException
    + FullyQualifiedErrorId : Microsoft.Rtc.Management.Hadr.InvokePoolFailOverCmdlet

First run the following command in Skype Management Shell:

PS C:\Get-CsRegistrarConfigurtion

Output of the above command is:

Figure 2: Registrar Output

If incase you do not have the additional service level registrar’s pointing to the Frontend’s please run the following command:

PS C:\New-CsRegistrarConfiguration -Identity -EnableDHCPServer $true -PoolState $true

Note: Please replace “” with your own server FQDN. Run the command for each standard edition server.

Once the above is done, rerun the command:

PS C:\Get-CsRegistrarConfiguration

To ensure the service level information has been loaded correctly.

Now check to make sure there are no issues with the backup state of the environment. In order to do this run the following command:

PS C:\Get-CsBackupServiceStatus -PoolFqdn “”

Output of the above command is:

Figure 3: Primary Backup Status Output

To expand to see the BackupModules you can run the command as:

PS C:\Get-CsBackupServiceStatus -PoolFqdn “”  | Select BackupModules | fl

Figure 3.1: Backup Modules Output

Looking closer at Figure 3.1 you will note the line: CentralMgmt.CMSMaster: [FinalState,NotInitialized]}

Matching this to Figure 3, this actually references to:

Figure 3.2: CMS State on Primary Server

The reason why the CentralMgmt.CMSMaster “OverallImportStatus” is “NotInitialized” as there can only be one CMS Master. In this instance the is the CMS Master.

The table below shows the meaning of the various status output:

Table 1: Export States

When you run the same commands against the secondary frontend:

PS C:\Get-CsBackupServiceStatus -PoolFqdn “”

Output should be as follows:

Figure 4: Secondary Backup Status Output

To expand to see the BackupModules you can run the command as:

Figure 4.1: Backup Modules Output

Looking closer at Figure 4.1 you will note the line: CentralMgmt.CMSMaster: [NotInitialized,NormalState]}

Matching this to Figure 4, this actually references to:

Figure 4.2: CMS State on Secondary Server

The reason why the CentralMgmt.CMSMaster “OverallExportStatus” is “NotInitialized” as there can only be one CMS Master. In this instance the is not the CMS Master.

Note: There is no reason to check the Pool Fabric State as this is not an Enterprise Pool containing multiple frontend’s.

To test “Central Management Store (CMS)” run the following command:

On the Primary server:

PS C:\Test-CsDatabase -CentralManagementDatabase

Output should look like:

Figure 5: Primary CMS Output

Run the following command from the Secondary Server:

PS C:\Test-CsDatabase -CentralManagementDatabase

Output of the above command is as follows:

Figure 6: Secondary CMS Output

Please also test all database connectivity’s both to all locally running SQL Services and between frontend servers:

Testing local databases run the following command:

PS C:\Test-CsDatabase -LocalService

Testing database across servers:

From Primary Server run the following command to the opposing server:

PS C:\Test-CsDatabase -ConfiguredDatabases -SqlServerFqdn “”

The reason to do this is to ensure that the primary server can connect to the secondary server’s SQL database prior to initiating failover or putting the environment into production. Run the same command from the Secondary Server to the Primary Server. The command you run from the Secondary server is as follows:

PS C:\Test-CsDatabase -ConfiguredDatabases -SqlServerFqdn  “” 

Check the proposed state of the CMS failover by running the following command:

PS C:\Invoke-CsManagementServerFailover -WhatIf

Note: If this is a true DR situation most of the above health checks will fail as the query cannot communicate with the CMS Master server.

Once the health checks are done, run the invoke command to failover the CMS to the secondary server:

PS C:\Invoke-CsManagementServerFailover -BackSQLServerFqdn “Secondary Frontend Server” -BackupSQLInstanceName RTC

Check that the failover has been successful by running:

PS C:\Get-CsManagementStoreReplicationStatus -CentralManagementStoreStatus

Note: If the “ActiveMasterFqdn” is not populated, do not worry allow it takes a few mins to update. While this is happening you can launch the Topology Builder and verify that it has failed over.

On the main deployment page select “Skype for Business Server” and on the right hand pane under “Central Management Server” you should see a green tick next to the secondary frontend, example below:

Figure 7: Topology

As per “Figure 1” you will see that in this deployment there is only a single edge pool which is the next hop for the primary frontend server. In this deployment the servers are separate into their respective sites, primary being Site 1 and secondary being Site 2.

As such you cannot use Topology builder to failover edge services to the secondary frontend as the edge pool is physically configured under Site 1. The services will have to be failed over using PowerShell as below:

PS C:\Set-CsEdgeServer -Identity “Edgepool Fqdn” -Registrar Registrar:Secondary Frontend Fqdn

Once the command completes, publish the topology by running the following command:

PS C:\Enable-CsTopology

Once this completes you can now failover the pool for users and services by running the following command on the secondary server:

PS C:\Invoke-CsPoolFailOver -PoolFqdn “Secondary frontend server”

You have now successfully failed over the environment to the Secondary Frontend.

Transferring Individual Transformation Table between two Sonus Gateways

Quick Hack for Transferring Sonus Transformation Table between two Sonus gateways

Recently I been working on migration of users from an aging Cisco platform to Skype for Business 2015 on premise platform.

Customer has two Sonus 2000 Voice Gateways connected to Enterprise grade SIP trunks providing an Active-Active connection for inbound calls.

Both gateways are connected to CUCM via SIP using 5060 as below:

Note: To meet Disaster Recovery requirements for the Business they had their Datacentre 50km+ from each other.

The gateways are set as Upstream for the migration process.

As the Sonus SBC’s have identical configuration, in the Sonus gateways just backing up and restoring configuration has some quirks around “Contact Registrant Table”. I notice that the configuration even when “Import Partial Configuration” is used the registration does break.

A question you would be asking is “Why not just manually update the transformation table?”

This would have been the most convenient method if the Telephone number range assigned to each user per department or floor or site was consistent. Sadly, this was not the case for the customer and users had extension in various different number blocks.

Number blocks referred to here are within the 100 number block range, example:

02 7685 1000 à 02 7685 1199 (100 number block)

The requirement was to still maintain the users who are not being migrated to be able to receive, example:

All users on Floor 2 are being migrated to Skype for Business Enterprise Voice however users in all remain floors needed to remain in Cisco.

The easiest step initially was to create a separate transformation table purely for the users who were getting migrated and add all their extension within this table and place this in an appropriate Call Routing take.

Example of Transformation Table:

Note: You can use any naming convention that allows you to better understand the flow however I always use the word “Match” in my Transformation tables within Sonus as it makes more sense to me.

Within this Transformation Table (TT) I have multiple entries:

I have shorted the example above however I had over 100 extensions as you can see no real pattern. I had a separate Transformation Table to allow anything else not matching the above table to be handed over to Cisco.

Once all the changes have been applied to the first gateway follow the steps below to back-up the transformation table:

Change the tab from Setting –> Tasks:

On the left hand pane select “Import/Export Configuration Items” –> Select Transformation Tables –> Select Export as below:

This will save “Tranformation Table” configuration as an xml file:

File type;

Now open the “XML” file in either Notepad or Notepad++ (preferred)

Example of the XML file opened in Notepadd++ is as follows:

Look for the table you would like to export to Second gateway:

The table entry we are interested in is highlight in “Yellow”

Now delete all entries above this table so it looks like:

Now scroll down the document until you start hitting the actual transformation entries as shown below:

As note previously the actual Transformation table ID entry was “20”, if you missed it see below: (highlighted in yellow)

Based on the ID value, scroll down the “XML” document to identify all the Transformation Entry with “id=20” value as shown below (example truncated)

Above screenshot shows the start of the Transformation Entries for Transformation Table “id=20”.

Now identify all the entries and delete all values above this as shown below:

Do not worry too much about the inconsistent (transformationentry id=’20:X’) values.

Now identify all the Sequence for (transformationtable id=”20”) in the “XML” file and delete unwanted values and the outcome for the bottom half of the file should be as below:

Once all changes made safe the file and now go to the Second gateway and import the “XML” file following the steps below:

Change the tab from Setting –> Tasks:

On the left hand pane select “Import/Export Configuration Items” –> Select Transformation Tables –> Select Import as below:

Allow the gateway to import the “XML” file. Once imported you will be able to see the Table entry under transformation tables.

You will now be able to add this table to the necessary Call routing table.

TLS 1.0 no longer supported in Office 365

Today’s the day. You can mark this one in your Outlook calendars – from October 31st 2018, TLS 1.0 is no longer supported in Office 365.

What does this mean? Well, if you’re using older versions of office, Lync Phone Edition handsets, or an older OS and you run into an issue connecting to the service, Office 365 support will no longer be able to help if the device does not support at least TLS 1.2

This does not mean that your older devices and programs will suddenly stop working. Microsoft has said:

This doesn’t mean Office 365 will block TLS 1.0 and 1.1 connections. There is no official date for disabling or removing TLS 1.0 and 1.1 in the TLS service for customer connections. The eventual deprecation date will be determined by customer telemetry and is not yet known. After a decision is made, there will be an announcement six months in advance unless we become aware of a known compromise, in which case we may have to act in less than six months to protect customers who use the services.”

For further information on how to prepare your environment to support TLS 1.2, check out Microsoft’s helpful article:

You can also read a previous post of mine on the subject:

Skype for Business 2019 or Microsoft Teams – Which should you move to

Last week, I presented a “how to” guide on the current 5 methods of moving from Skype for Business to Microsoft Teams to a room of eager Government employees. The talk went well, everyone had great questions and the general feeling was of an energized bunch of people who were ready to walk back into their IT department and take a further look at Microsoft Teams.

From the many questions I received during the presentation, there was a question in particular that I found interesting, and pondered on the long drive home back to Sydney. “Why is there a Skype for Business Server 2019 if everyone should be moving to Teams, Craig?”

Great question. Teams is a fantastic product. The thing is (deep breath guys), your organisation may not be ready to make the move just yet.

There are many reasons why your organisation may not be ready to move to teams:

  • You’re running custom call recording software
  • You have a third party contact centre solution in place
  • You have legal requirements not yet met by the cloud
  • You’ve only recently implemented Skype for Business
  • Your on-premises hardware isn’t Teams compatible (yet)
  • Your organisation moves slowly and takes longer to accept change
  • You don’t have the resources or funds right now


  • You .. don’t want to.

Pick and choose your reasons from above, but that’s one of the reasons why Skype for Business server 2019 exists. For those who are not quite ready to make the move to Teams yet, but want to remain current and up to date.

Other great questions were asked too:

We’re running an older version. Should our organisation upgrade to Skype for Business Server 2019?

Yes. Not only will you be running the latest version of Skype for Business, the latest version includes tools that will make moving to Teams later on a lot simpler.

There are some things to consider with running the latest version such as voicemail and exchange integration, as well as if you’re running older Lync Phone Edition (LPE) handsets, so keep this in mind.

You can read more about this over on the Microsoft Tech Community:


We’re running older LPE handsets, or are running an older version of Lync. What should we do?

Older LPE handsets don’t support TLS 1.2 and cannot be upgraded, meaning that they will need to be replaced if you’re planning on using them with any Office 365 service.

You can find a list of compatible devices here:

You’re also going to need to consider if you want to upgrade your older version of Lync to Skype for Business server, and if you want to configure hybrid mode between your on-premises environment and Office 365. This will make moving users to the cloud, and ultimately to Microsoft Teams a whole lot simpler.


We’re running CISCO on-premises and moving to Teams seems like an enormous challenge. Help!

Deep breath! Remember that Teams isn’t just about IM, or voice and video. It’s a collaboration platform that has many, many uses. If you want to pilot Teams in your environment and only use it for meetings and document collaboration, go for it! There’s no reason as to why you need to move all of your workloads over straight away. Voice and IM could easily remain in CISCO until your organisation is ready to make the move. And when they are, you can look at using Direct Routing with an SBC on premises to allow you to route calls between your CISCO and Teams users with ease.


So, knowing all of that, should we still take a look at Teams?

Absolutely you should. Even if your organisation is running Lync or CISCO and has no plans to move to Teams today, spending the time to investigate it, play around with it and figure out how it fits your organisation is time well spent. Spin up a pilot within your IT team, or maybe get your devs across to it from Slack. Start exploring how much easier having IM, voice, video and shared document access makes collaborating easier.



One month until TLS 1.0 support is removed from Office 365

Not too long ago, I remember making the announcement at our user group that come October 31st, TLS 1.0 would no longer work in Office 365. “That’s ages away Craig!” was the cry from the audience. Well, in just under a months time, it’ll be upon us. The question is, are you ready?

What’s the deal with TLS 1.0 anyway?

Transport Layer Security version 1.0 is being removed as a supported secure protocol for connecting to Office 365. It’s being replaced with a new minimum requirement of at least TLS 1.2.

Am I affected?

If you’re running any of the following, you’re affected by this mandatory change.

  • Windows 7 or earlier
  • Windows 2008r2 or earlier
  • Office 2007 or earlier
  • Android 4.3 and earlier versions
  • Firefox version 5.0 and earlier versions
  • Internet Explorer 8-10 on Windows 7 and earlier versions
  • Internet Explorer 10 on Win Phone 8.0
  • Safari 6.0.4/OS X10.8.4 and earlier versions
  • Lync for Mac 2011
  • Lync 2013 for Mobile – iOS, iPad, Android or Windows Phone
  • Lync “MX” Windows Store client
  • All Lync 2010 clients
  • Lync Phone Edition.  There is further guidance provided for these devices is located here.
  • Lync Room System (a.k.a. SRSv1)
    • LRS Options – Upgrading SRSv1 (LRS) Systems to SRS v2 – Further guidance provided for these devices is located here

I’ve got devices or OS’s on that list, what can I do?

In short, disable, upgrade or replace.


You’re going to want to disable TLS 1.0 as the default security protocol within older versions of Windows. Microsoft has published the steps here:


If you’re running older versions of Internet explorer, firefox, safari, or an older Lync client on your desktops or mobile devices you’re going to need to update them to newer supported versions.

Install Internet Explorer 11 for Windows 7 –

Install the latest version of Microsoft Office on your end user devices

Ensure users are running the latest version of Skype for Business on their mobile devices


If you happen to have a deployment of Lync Phone Edition (LPE) handsets, you’re going to need to replace these with newer, supported devices.

LPE handsets include:

  • HP 4110 and 4120
  • Polycom CX500, CX600 and CX3000
  • Aastra 6721ip, 6725ip

The main reason for this change is that these devices run a version of Windows CE that does not support TLS 1.2.

Microsoft has published a list of supported devices here:

Is the 31st October 2018 a hard deadline?

Microsoft has said that come the 31st of October, devices that do not support TLS 1.2 may experience issues connecting to Office 365 and that no support tickets will be generated for devices that do not support TLS 1.2.

This does NOT mean that the 1st of November 2018, your TLS 1.0 devices will spontaneously combust, and they may continue to work for a while afterwards. TLS 1.0 will be decommissioned from Office 365 though, and so they will stop working at some point.

I still need help.

Microsoft has a whole heap of information available to assist you with the transition. You can check it out here:

Common Sonus SBC 1000/2000 Troubleshooting Tips

If you regularly work with Sonus 1000/2000 session boarder controllers, you may often be sat there scratching your head as to why a simple inbound call from ISDN to Skype for Business won’t ring your test handset.
Before you go and make yourself another cup of coffee and spin up LX, here’s a list of common issues I frequently encounter.
ISDN Channels
Alright, so you’ve set up your signalling groups, your transformation tables are a thing of beauty and your ISDN cables are connected and green. You go to test an inbound call and all you get is a busy single. What gives?
Be sure to check that you’ve configured the correct number of ISDN channels on the SBC. Your carrier will pick a channel at random, and if you’ve configured 10 channels on the gateway but the carrier is trying to send a call down channel 15, the call will fail.
The flip side of this is ensuring you don’t over-provision the number of channels. An outbound call will fail if the SBC attempts to send a call down channel 21 if you only have 20 channels available.
Skype for Business Servers
Are you having intermittent outbound call issues, or has your Skype for Business environment recently grown? Don’t forget to add the additional mediation servers to your SIP Server Tables and Signalling groups on the SBC! If a call happens to originate from a server not added to either of these lists, it’ll fail.
Calls not releasing upon hangup
You may notice (particularly with CAS analogue lines) that when a caller hands up the phone, the line remains in release mode. Your users may not immediately notice the issue unless they go to make another call right after the previous – only to receive a busy tone.
This issue is normally caused by an incorrectly configured tone table. There’s various places around the internet to find suitable tone tables for your carrier and country that a quick Google search will locate. Be sure to update your tone tables and assign the correct tables to the correct signalling groups.
Finding an unknown called number
Lift alarms, security gates, door controls – most sites have them, and you can be pretty guaranteed that they won’t come with details around what numbers they call when a user presses the button.
So far, I’ve encountered systems that dial 10 digits, 9 digits, 5 digits and even 2 digits.
the easiest way to locate these numbers is to build a catch all rule:
Called Number (.*)   translates to Called Number 0400123456 (your mobile number).
Have someone press the button to trigger an outbound call and then use the monitoring tab to capture the phone number dialled. Once you have it, you can then build your transformation rule to capture and transform it to any number you like! (Pizza Hut, anyone?)
Sending a call to two analogue extensions at the same time
A simple request that other phone systems can manage easily. You want to route an inbound call to ring on two analogue handsets at the same time, Or maybe you have a loud ringer and an analogue handset that must ring at the same time.
The easiest way of achieving this is to use an RJ12 (or 11) splitter connected directly to the CAS port on the SBC. You can then connect up two devices to the one port, and both will ring at the same time.
You should note that the FSX cards on a 1K/2K will deliver up to 45 volts to up to 3 devices at once (REN 3).
Do you have a tip that you’d like to share? Leave a comment below!.

Installing Skype for Business Server 2019

A few weeks ago, Microsoft announced the availability of Skype for Business 2019 server preview for download and I thought it was about time I checked it out!
Obtaining the installation media
You can obtain the installation media (a 1.68GB ISO file) from here:
The Lab
I’m running everything up at Windows Azure, but by all means feel free to spin up a new VM in your on premises lab if you have one.
My lab is pretty simple, and is setup as follows:

DC01.chiffers.comDomain ControllerAll servers are running Azure’s Windows 2016 base image.
SFB01.chiffers.comSkype for Business Standard Edition Server
CS01.chiffers.comAD Certificate Services

You’ll notice that for now, I’ve chosen to not deploy an Edge server, or Monitoring and Archiving databases.
Skype for Business server 2019 still requires a whole range of prerequisites to be installed, including .Net Framework 4.7

To speed things up, you can install almost all of the required features via powershell:
Add-WindowsFeature NET-Framework-Core, RSAT-ADDS, Windows-Identity-Foundation, Web-Server, Web-Static-Content, Web-Default-Doc, Web-Http-Errors, Web-Dir-Browsing, Web-Asp-Net, Web-Net-Ext, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Http-Logging, Web-Log-Libraries, Web-Request-Monitor, Web-Http-Tracing, Web-Basic-Auth, Web-Windows-Auth, Web-Client-Auth, Web-Filtering, Web-Stat-Compression, Web-Dyn-Compression, NET-WCF-HTTP-Activation45, Web-Asp-Net45, Web-Mgmt-Tools, Web-Scripting-Tools, Web-Mgmt-Compat, Server-Media-Foundation, BITS, Telnet-Client
(I removed Desktop-Experience from the above command).
Grab a copy of .Net Framework 4.7 from the Microsoft Download Centre if you don’t already have it installed.
A big thanks to Tom Arbuthnot who’s article outlines Microsoft’s recommended server requirements for running Skype for Business Server 2019 too.
Running the installer
The ISO contains a folder called OCS_EVAL (ah, memories). Within there we’ll find the setup.exe file we’re looking for.

After a quick Visual Studio Runtime install, we’re prompted for an installation location:

I allowed the installer to check for updates, but none were found

After clicking Next, the familiar looking deployment wizard appears

Prepping Active Directory
Alright, as this is a completely new lab environment that hasn’t had any version of Lync or Skype for Business installed, I’m going to need to extend the AD schema.

It’s just as easy as it was in previous versions, running through each of the 7 steps.

Installing the Administration Tools
Alright, green tick! Let’s move on to installing the Administration Tools, including the topology builder.

Once that’s complete, We can prepare the first (or in my case, the only) Standard Edition server. The option to install Enterprise Pools is still available, but as this is a lab I’m going to stick with a Standard Edition pool for now.

Note that it would appear that SQL Express 2014 is still automatically installed during the Standard Edition component installation process.
Creating the Topology
Once SQL is installed, you can fire up the 2019 Topology Builder and create a new topology. Keep in mind of course that unless you’re spinning up a brand new lab environment like me, you’re probably going to be opening up an existing SfB topology.

As this is a new topology, I’m going to enter a new SIP domain. sounds pretty good!

After completing the usual process of creating my first site (I’m calling mine Lab 01), my new topology appears – complete with the new Skype for Business Server 2019 folder.

Let’s create our new Standard Edition front end pool – named

I’m going to enable all available features for this pool (although I don’t have an Exchange server right now!)

And, of course we can still co-locate our Mediation services on the Front End server.

The wizard still prompts me for the usual Edge Server, Office Web Apps, Monitoring and Archiving details (If I want to deploy these too). Once complete, my server appears under the Skype for Business Server 2019 folder.

Publishing the Topology
Ok, time to publish the topology! This took less than 60 seconds.

Installing the Skype for Business 2019 Components
Now for the best bit. We get to deploy the SfB 2019 components to our Standard Edition Server.

There’s 4 steps in total to work through. My lab isn’t running super powerful VM’s and so this part took a while

Starting the Pool
Once the components are installed and certificates assigned, it’s time to start the pool!

Boom! the Skype For Business 2019 pool is up and running.
Stay tuned for part 2, where we’ll delve into the Control Panel and see what’s changed since SfB 2015.

Follow Us!

Kloud Solutions Blog - Follow Us!