Using the Milestone Plugin

Milestone is a Video Management System that can store recordings and manage multiple cameras. The Milestone Plugin pack allows Milestone - Witness integration, creating a cohesive security system that is able to detect incidents, control PTZ cameras to point at these, report on the situation and store all relevant information on the security incident for future analysis.

This document describes the process of setting up this integration.

The Milestone Plugin

Witness Canary supports integration with many different types of external systems through the use of plugins. These are stand-alone software libraries which are dynamically loaded by Canary and contain code which knows how to convert the Witness data into the required format for the external system.

On this page:

The milestone plugin file is entitled Witness.Plugin.Milestone.dll and must be present in the Witness Plugin folder which is inside the main application folder. The plugin depends on Witness.Milestone.Common.dll which must be placed in the same folder.

The plugin can be selected during setup and will automatically install the files in the correct locations.

If you have already installed Witness without the Milestone plugin, you can run the setup to modify your installation to include the Milestone plugin.

Canary plugin and Cyclops milestone camera support both depend on the Milestone x86 redistributable files. Please ensure the following files are located in Witness application root folder:

Milestone Requirements

  • Milestone XProtext 2016 Professional or higher
  • Version 2016 or 2016 R2
  • Edition Professional or higher
  • Basic User must be set up for a Witness system user with full camera permissions.
    Minimum required permissions shown in screenshot below - this should be allowed for all cameras.

Camera Control through Milestone

You can control cameras through Milestone or directly from Witness. If a camera is supported by Witness, we recommend direct control. If no cameras are controlled through milestone, skip to "Camera not controlled through Milestone" section.

Witness is able to support the majority of PTZ cameras on the market directly, but may also control a camera through Milestone. In terms of functionality, controlling the camera directly generally allows faster camera response and thus more accurate camera tracking. If a camera is not directly supported by Witness or which the Witness Cyclops service cannot get direct network access to, we can also use the Milestone camera connection to control the camera, assuming that this camera has successfully been set up as a PTZ camera on Milestone.

To control a camera through a Milestone server, we can set this camera using a Milestone camera connection through Sentinel UI.

Prerequisite configuration on Milestone




  • Cameras to be controlled must be configured in Milestone as PTZ absolute positioning cameras.
  • Verify: in Milestone Live workspace, check that the camera has the PTZ controls. (and that clicking them actually moves the camera)

  • Verify: Hardware Device has a PTZ Devices tab and has Absolute on PTZ type.

Add Milestone cameras in Sentinel

  • Add a new Milestone Camera Connection for each Milestone server in Sentinel.

In Milestone Expert OR Corporate:

  • Open the Milestone Management Client and navigate to Cameras
  • Expand the cameras and camera groups under the "Devices" tree until you see the individual cameras.
  • Hold CTRL and select a camera
  • Copy out the ID from the bottom of the info tab (make sure you do not also copy the "ID = " text from that field).

  • Paste the camera Guid in External System Id field.
  • For camera type, select an Onvif compatible camera - even if the actual camera is not Onvif (use Generic Onvif if none other are suitable).
  • You may need to modify zoom coefficients depending on your camera.
  • We are also able to support multiple Milestone cameras through a single sentinel camera by separating the camera Guids with a comma: ",". This is useful when a single ptz controls multiple video feed e.g. for a camera with separate thermal and normal videos.

In other versions of Milestone:

  • Navigate to the Milestone server installation directory and open the configuration.xml file.
  • Here, search for the PTZ camera (by camera name), and copy out the guid. Take care to copy the camera guid rather that the hardware device guid.

    Example Milestone Configuration.xml Camera Guid
    <Device1>
    	<Cameras>
    		<Camera0>
    			...{nodes}
    			<Schedule>
    				...{nodes}
    			</Schedule>
    			<Guid>843D2EF9-324F-4AD3-82BB-D4155632EE3B</Guid>
    			<DisplayName>360vision</DisplayName>
    			<NumLabel>
    			</NumLabel>
    			...{nodes}
    		</Camera0>
    	</Camera>
    </Device1>
  • Add new camera under the corresponding Milestone Camera Connection
  • Paste the camera Guid in External System Id field.
  • For camera type, select an Onvif compatible camera - even if the actual camera is not Onvif (use Generic Onvif if none other are suitable).
  • You may need to modify zoom coefficients depending on your camera.
  • We are also able to support multiple Milestone cameras through a single sentinel camera by separating the camera Guids with a comma: ",". This is useful when a single ptz controls multiple video feed e.g. for a camera with separate thermal and normal videos.

Witness should now be able to control that camera.

Configure Cameras not Controlled Through Milestone

If a camera is controlled directly by Cyclops through a different protocol, e.g. Onvif, but is displayed through Milestone, we can still use that camera for Milestone integration by obtaining its Guid and linking our sentinel camera to it through the External System Id.

In Milestone Expert OR Corporate:

  • Open the Milestone Management Client and navigate to Cameras
  • Expand the cameras and camera groups under the "Devices" tree until you see the individual cameras.
  • Hold CTRL and select a camera
  • Copy out the ID from the bottom of the info tab (make sure you do not also copy the "ID = " text from that field).

  • Paste the camera Guid in External System Id field.
  • For camera type, select an Onvif compatible camera - even if the actual camera is not Onvif (use Generic Onvif if none other are suitable).
  • We are also able to support multiple Milestone cameras through a single sentinel camera by separating the camera Guids with a comma: ",". This is useful when a single ptz controls multiple video feed e.g. for a camera with separate thermal and normal videos.

In other versions of Milestone:

  • Navigate to the Milestone server installation directory and open the configuration.xml file.
  • Here, search for the camera (by camera name), and copy out the guid. Take care to copy the camera guid rather that the hardware device guid.

    Example Milestone Configuration.xml Camera Guid
    <Device1>
    	<Cameras>
    		<Camera0>
    			...{nodes}
    			<Schedule>
    				...{nodes}
    			</Schedule>
    			<Guid>843D2EF9-324F-4AD3-82BB-D4155632EE3B</Guid>
    			<DisplayName>360vision</DisplayName>
    			<NumLabel>
    			</NumLabel>
    			...{nodes}
    		</Camera0>
    	</Camera>
    </Device1>
  • Paste the camera Guid in External System Id field in Sentinel.
  • We are also able to support multiple Milestone cameras through a single sentinel camera by separating the camera Guids with a comma: ",". This is useful when a single ptz controls multiple video feed e.g. for a camera with separate thermal and normal videos.

Alarm Integration with Milestone

To store Witness alarms in Milestone, additional configuration is required

  • Ensure Sentinel Image server is enabled (check Configure Sentinel MJPEG Streaming article).
  • Add this as a camera in Milestone server using the Universal Single Channel Milestone driver.

  • Copy out the camera Guid of this new camera source and place this in the Witness Piccadilly plugin config "Sentinel Map" field.

    IMPORTANT: If changing Sentinel camera host instead of adding a new one Sentinel Camera, you need to Delete the hardware device and add new - do not just change the IP on the hardware device.
    Example Milestone Configuration.xml Camera Guid
    <Device1>
    	<Cameras>
    		<Camera0>
    			...{nodes}
    			<Schedule>
    				...{nodes}
    			</Schedule>
    			<Guid>843D2EF9-324F-4AD3-82BB-D4155632EE3B</Guid>
    			<DisplayName>360vision</DisplayName>
    			<NumLabel>
    			</NumLabel>
    			...{nodes}
    		</Camera0>
    	</Camera>
    </Device1>
  • If you do not have a section for Milestone config in the plugin config file, you can get the system to automatically generate the defaults by starting Canary after making sure that the following are installed in the Canary plugins folder:


  • Check that all Milestone servers are added in the plugin configuration.

    Witness PluginConfig.xml Example
    <?xml version="1.0" encoding="utf-8"?>
    <Config>
      <Plugins>
        <Milestone>
          <PluginConfig>
            <EventServer>										<!--Milestone event server. Can also include camera image server.-->
              <ServerIp>10.0.6.123:80</ServerIp>				<!--Server IP and optionally port-->
              <Username>Marvin</Username>						
              <Password>MarvinsPassword</Password>						
              <Authmode>Basic</Authmode>
              <Critical>True</Critical>
            </EventServer>
            <ServerList>										<!--Other Milestone camera image servers can be added under server list - serverconnectionparams.-->
              <ServerConnectionParams>
                <ServerIp>10.0.6.123:8080</ServerIp>
                <Username>Marvin</Username>
                <Password>MarvinsPassword</Password>
                <Authmode>Basic</Authmode>
                <Critical>false</Critical>
              </ServerConnectionParams>
    		</ServerList>
            <TimerTick>10</TimerTick>
            <AlarmTimeout>60</AlarmTimeout>
            <SentinelMapCameraGuid>C89D3014-7E31-4C22-BA34-154AD5C17A8B</SentinelMapCameraGuid>
    		<!--Insert Sentinel Camera Guid from Milestone config. Even if not using Sentinel map MPEG output, a valid camera Guid MUST be included here-->
            <HeartbeatInterval>1000</HeartbeatInterval>
          </PluginConfig>
        </Milestone>
      </Plugins>
    </Config>

    Once you have made changes to the plugin configuration file then you must restart the Canary application / service for the new settings to be applied. No other modules need to be restarted.


SerNodeDescription
1EventServerThis node contains the connection information to the main Milestone Event server
2ServerListThis node contains a list of ServerConnectionParams to support Milestone environments with multiple Milestone servers. The event server should not be included again in the server list.
3ServerIp

Address of the Milestone Server. This can be an IP or URI. By default Milestone Servers will use port 80. You can also specify a different port e.g. :8080.

4UsernameMilestone user. This should be a user specifically created on Milestone for Witness to use.
5PasswordMilestone user password
6AuthmodeAuthentication mode. Should always be set to Basic.
7CriticalTo indicate if this server is critical for Witness-Milestone integration. For example, this could be the Image server for the Sentinel Map. Event Server should always be marked as critical.
8TimerTickTime in seconds between Ticks for doing periodic actions e.g. closing old alarms.
9AlarmTimeoutTimeout in seconds before alarms are closed by Canary if no updates to the alarm are received.
10SentinelMapCameraGuidCamera Guid on Milestone of the Sentinel Map camera. A valid Milestone Camera Guid must be input here even if the Sentinel Map is not output.
11HeartbeatIntervalNot currently used


  • Obtain the Milestone camera Guid for every camera used in Witness and ensure that this Guid is on the Witness Camera External System Id. (see above Camera not controlled through Milestone section)
  • On the Milestone Server, Alarm, Event and Video retention period for each camera must be the same. This should be determined by your requirements and storage capacity.


Check that the Witness System can access the Milestone Event Server

  • Milestone Event Service is installed and running and configured within the Milestone server
  • Witness user has rights to create and modify alarms and events
  • If Milestone was installed with a hostname, check that Witness machine can resolve that hostname and can access port 22331 through any firewall.
    • If hostname cannot be resolved, you can change the connection to IP through Milestone Management Client by going to → Tools → Registered Services...
    • Select the "Event Server" and click Edit...

  • Change the address to the machine's IP and click OK





Related information