NetLinx Programmer's Guide RMS 3.3
NetLinx Programmer's Guide RMS 3.3
NetLinx Programmer's Guide RMS 3.3
RMS
Resource Management Suite®
(v3.3 or higher)
Table of Contents
Overview ............................................................................................................1
System Requirements ............................................................................................... 1
Concepts................................................................................................................... 1
Network Configuration ................................................................................................... 1
Device Monitoring Framework........................................................................................ 2
Device Values .................................................................................................................. 3
Parameter Values ............................................................................................................ 3
Status Types.................................................................................................................... 5
Notification Process ........................................................................................................ 5
Alert Messages................................................................................................................ 5
Advise Messages............................................................................................................. 5
RFID Device Tracking ...................................................................................................... 6
Getting Started ..................................................................................................7
Overview .................................................................................................................. 7
Using RMS CodeCrafter............................................................................................ 7
RMS NetLinx Code Architecture ............................................................................... 8
Interfacing With the RMS SDK .................................................................................. 8
Service Mode ............................................................................................................ 9
Device Parameter Persistence ................................................................................ 10
Custom Device Monitoring Programming ........................................................11
Overview ................................................................................................................ 11
RMSCommon.axi..................................................................................................... 11
RMSDevMonRegisterCallback() ..................................................................................... 11
RMSDevMonSetParamCallback() ................................................................................... 11
RMS Engine Module ............................................................................................... 12
RMS Device Monitoring Support Modules.............................................................. 13
RMSBasicDeviceMod..................................................................................................... 13
RMSProjectorMod......................................................................................................... 14
RMSTransportMod ........................................................................................................ 14
RMSSldProjMod ............................................................................................................ 15
Programming ................................................................................................................ 15
Control Failure .............................................................................................................. 17
Device Information........................................................................................................ 17
Monitoring Source Usage ....................................................................................... 18
Source Select ................................................................................................................ 18
RMSNLDeviceMod Module..................................................................................... 48
Commands .................................................................................................................... 48
Module Definition ......................................................................................................... 48
Touch Panel Pages ........................................................................................................ 48
RMSProjectorMod Module ..................................................................................... 49
Commands .................................................................................................................... 49
Strings ........................................................................................................................... 49
Channels........................................................................................................................ 50
Module Definition ......................................................................................................... 50
Touch Panel Pages ........................................................................................................ 50
Reporting for Multiple Bulb Projectors (Limited Support) ...................................... 50
RMSMain.axi File Changes ............................................................................................ 50
RMSProjectorMod Module Changes ............................................................................. 51
RMSTransportMod Module..................................................................................... 53
Commands .................................................................................................................... 53
Strings ........................................................................................................................... 53
Channels........................................................................................................................ 54
Module Definition ......................................................................................................... 54
Touch Panel Pages ........................................................................................................ 54
RMSBasicDeviceMod Module ................................................................................. 55
Commands .................................................................................................................... 55
Strings ........................................................................................................................... 55
Channels........................................................................................................................ 56
Module Definition ......................................................................................................... 56
Touch Panel Pages ........................................................................................................ 56
RMSSldProjMod Module......................................................................................... 56
Commands .................................................................................................................... 56
Channels........................................................................................................................ 57
Module Definition ......................................................................................................... 57
Touch Panel Pages ........................................................................................................ 57
RMSSrcUsageMod Module ..................................................................................... 57
Commands .................................................................................................................... 57
Channels........................................................................................................................ 57
Module Definition ......................................................................................................... 58
Touch Panel Pages ........................................................................................................ 58
Anterus Duet Module ............................................................................................. 58
Module Definition ......................................................................................................... 58
i!-ConnectLinx ...................................................................................................59
Overview ................................................................................................................ 59
Using i!-ConnectLinx ............................................................................................... 59
Standard Actions .................................................................................................... 61
Action Arguments ................................................................................................... 62
Action Persistence and Distribution........................................................................ 63
International Issues / Localization ........................................................................... 63
Programming .......................................................................................................... 64
Channels........................................................................................................................ 64
Levels ............................................................................................................................ 64
Commands .................................................................................................................... 64
Strings ........................................................................................................................... 66
Module .......................................................................................................................... 66
i!-ConnectLinx Standard Function List..................................................................... 67
Multiple RMS Instances ....................................................................................71
Overview ................................................................................................................ 71
Declare a Dev Array of RMS Engine Instances ........................................................ 72
Module Defining ..................................................................................................... 72
Stacking and Handling Events................................................................................. 74
Multi-Instancing RFID Device Tracking in RMS........................................................ 75
Overview
The Resource Management Suite® products are PC server applications designed to manage rooms and
equipment. The RMS server also monitors equipment in the rooms and sends notifications for room problems
and help requests. The RMS server allows for the logging of room and device use, errors that occur, and offline
events. The RMS server offers a variety of build-in reports for historical and statistical analysis, as well as
device monitoring through a user extensible framework. This framework allows you to customize what devices
should be monitored, the conditions that indicates a problem or fault, and what type of problem or fault this
condition represents. The RMS server generates notifications and routes them to different personnel when a
fault condition occurs, routing such notifications to the appropriate personnel as determined by the notification
configuration.
The RMS Software Development Kit (SDK) is composed of a series of modules that allow users to monitor
equipment errors and usage, view appointments, display welcome images and messages, and view current
appointment details from any NetLinx compatible touch panel. Users can create presets to be executed when a
meeting starts from the actions available through i!-ConnectLinx.
i!-ConnectLinx provides the mechanism to expose actions to the RMS server and to manage action execution
on the NetLinx system. In the RMS web pages users can create control functions which are essentially macro
sequences of i!-ConnectLinx actions. These control function macros can be directly executed or scheduled
from the RMS web pages. i!-ConnectLinx handles these requests and presents it to the NetLinx program for
execution. See the i!-ConnectLinx help file for details on programming i!-ConnectLinx.
System Requirements
The RMS SDK is a set of NetLinx and TPDesign4 files that are included in your control system programs. To
utilize this SDK, you will need the following applications installed:
NetLinx Studio 2.5 (or later)
TPDesign4 v2.6 (or later) for G4 panels
Concepts
Network Configuration
The RMS application is a client/server application where the NetLinx system acts as the client and the RMS
application server listens for connections from NetLinx systems. NetLinx and the RMS application server
communicate using TCP/IP sockets. In order to establish communication, each NetLinx system must be able
to resolve and connect to the RMS application server. This can be accomplished with a variety of Network
configurations including local area networks (LAN), wide area networks (WAN), and the Internet.
In order to communicate with RMS, a NetLinx system must have the RMS modules added to its programming.
The RMSEngineMod module includes the core API and communication stack that allows NetLinx to
communicate with the RMS server.
Since each NetLinx system acts as the client, it must be configured to communicate to the RMS server using
the 'SERVER-' command in NetLinx programming. NetLinx can accept either an IP address or a HostName
for the server. NetLinx supports DNS so if you are using a HostName, the HostName must be registered with
the DNS server that NetLinx has been configured to use. The DNS server configuration will be picked up
automatically through DHCP if the DNS servers are registered with the DHCP server. For more information
on configuring DNS servers in NetLinx, see the NetLinx master’s instruction manual.
Optionally, the server IP or host name can be placed in a file called ServerInfo.txt and placed in the RMS
directory of the NetLinx master's file system. If this file is present, the RMS communication module ignores
the SERVER- command and uses the address supplied in the file. Enter the IP address or hostname on a single
line using a text editor and FTP the file to the NetLinx master. If the RMS directory does not exist, you can
create it and place the file in the directory.
By default, NetLinx and the RMS server will communicate using TCP/IP port 3839.
Port 3839 is registered to AMX Resource Management Suite with IANA (http://www.iana.org/assignments/
port-numbers). This can be changed to suit your particular facility but it must be changed in both the RMS
server software and each NetLinx system. In the RMS server, this is accomplished through the Configuration
Wizard. In NetLinx, this is accomplished through the 'SERVER-' command in NetLinx programming.
If using the ServerInfo.txt file, append a ":" and the port number to the server IP address or host name.
MeetingManager 1.0 used port 9090 for communications. If you are upgrading from MeetingManager 1.0, you
may wish to continue to use port 9090. During the upgrade process, you are prompted to change to port 3839
or continue to use port 9090. If you change to port 3839, you need to upgrade all NetLinx systems to use the
modules from the RMS 2.0 SDK. You can use port 9090 with both MeetingManager 1.0 and 2.0 NetLinx
systems.
Once a NetLinx system has been programmed with the RMS modules and the server's IP address or
HostName, the NetLinx system automatically connects to the RMS server.
Install Checklist
Is the RMS server's host name registered with your DNS server?
Yes • Configure each NetLinx system to point the correct DNS server and supply the HostName to the
NetLinx programmer to use in the 'SERVER-' command. The DNS server configuration will be
picked up automatically through DHCP if the DNS servers are registered with the DHCP server.
No • Determine the IP address of the RMS server and supply this to the NetLinx programmer to use in
the 'SERVER-' command.
Do you want to use 3839 as the TCP/IP port for communications between Netlinx and the
RMS server?
Yes • No changes need to be made in either the RMS server or NetLinx.
No • Configure the TCP/IP in the RMS server using the Configuration Wizard and supply the new port to
the NetLinx programmer to use in the 'SERVER-' command.
Device Values
Each monitored device has a set of values used in its description. These values are supplied when the device is
registered and consist of the following:
Device Values
• Device Number This is the device number of the device, as defined in the NetLinx program. Devices are
tracked by Device ID so this value must be unique within the devices of a given room.
For instance, you can have multiple "1:1:0" devices as long as there is only one device with
a Device ID of "1:1:0" in the room.
• Name This is the name of device. This name is displayed on the administrators console and read-
ily identifies the device.
• Manufacturer This is the manufacturer of the device. If this value is not supplied during registration, the
manufacturer of the NetLinx-connected device will be used.
• Model This is the model number of the device. If this value is not supplied during registration, the
model name of the NetLinx-connected device will be used.
• Device Type This is the device type of the NetLinx-connected device.
This might be "NI-2000" or "NXP-TPI/4 Touch Panel". This is available for Axcess and
NetLinx devices. This information is registered automatically by the RMS server.
• Serial Number This is the serial number of the NetLinx-connected Device.
This is only available for NetLinx devices. This information is registered automatically by
the RMS server.
• Firmware This is the firmware version of the NetLinx-connected device.
Version This is only available for NetLinx devices. This information is registered automatically be
the RMS server.
• Address and This is the physical address and address type for the Netlinx-connected device.
Address Type This information describes how the device is connected to the NetLinx master.
• A device connected via ICSNet will display "ICSNet" for the address type and the
hardware's network address for the address.
• A device connected via IP will display "TCP/IP" for the address type and the IP address
for the address.
• Axcess devices will display "AXLink" for both values.
This information may be useful for diagnosing device connectivity problems.
This information is registered automatically by the RMS server.
Parameter Values
Each parameter has a set of values used to determine what conditions indicate a problem and what type of
problem this condition represents. These values are supplied when the parameter is registered and consist of
the following:
Parameter Values
• Name This is the name of parameter. This name is displayed on the RMS server console and
readily identifies the parameter.
Parameters are tracked by name so this name must be unique within the parameters of a
given device.
For instance, you can have multiple "Lamp Hours" parameters as long as there is only
one "Lamp Hours" parameter per monitored device.
• Parameter This value indicates if this value is a number or a string.
Type This information is used to determine how to perform certain operation, such as addition
and comparisons between the new and threshold values.
For instance, comparing "10" and "2" as strings results in "10" less than "2" but comparing
them as numbers results in "2" less than "10".
All parameters must be registered by the NetLinx system. The administrator cannot add parameters from the
RMS console. The administrator can modify Threshold Value, Comparison Operator, and Status Type for any
parameter. This provides the administrator with the ability to set their own thresholds and re-classify messages
based on their facility.
For instance, an administrator can set the Video projector's "Lamp Hours" threshold to the expected lamp life
of a newly replaced lamp or change the "Device Communicating" parameter from a "Control System Error" to
a "Security" status if the projector is in danger of being stolen.
Status Types
RMS supports the following status types for device monitoring: "Help Request", "Maintenance Request",
"Room Communication Error", "Control System Error", "Network Error", "Security", and "Equipment
Usage."
While there are no firm rules for what these status types mean and how they are used, AMX provides the
following description of each status type and recommends that your usage is consistent with these
descriptions.
Status Types
• Help Request A user generated help request such as a help button on the touch panel.
• Maintenance A user or monitored equipment generated maintenance request. Maintenance
Request issues would include items that require a technician to visit the room.
• Room Communication A loss of communication between the room and the RMS server.
Error
• Control System Any error that represents a control system error, such as an offline device or loss of
Error communication with a device.
• Network Error Any network related error. These would most commonly be associated with loss of
communication with devices that communicate via IP.
• Security Any security related issue. It might be appropriate to classify issues that might nor-
mally be classified as Control System or Network errors as Security issues instead.
This might include a touch panel going offline or loss of communication with a
projector depending on the physical security of these devices.
• Equipment Usage Any issue that does not require repair or maintenance and that is mainly used for
status.
Notification Process
As NetLinx sends parameter updates to the RMS server, the RMS server checks to see if the parameter's
threshold value has been reached. This comparison is made by checking the previous value of the parameter
against the threshold and by checking the new version of the parameter against the threshold using the
threshold comparison operator. If the comparison for the old value is False and the comparison for the new
value is True, then the parameter triggers an Alert message. If the comparison for the old value is True and the
comparison for the new value is False, then the parameter triggers an Advise message. Therefore an Alert
message is generated when a parameter reaches its threshold, and an Advise message is generated when a
parameter returns to its normal operating range.
Alert Messages
When an Alert message occurs, the RMS server first checks to see if message should be logged to the various
log services. A message is created for each log service using the Log Text of the parameter's Alert template, or
the default template if a custom template has not been assigned. Next, the RMS server checks for any
notifications in the Notification List matching the group, room, and status type for the parameter and dispatch
any messages via SMTP or SNPP as needed using the appropriate text from the template assigned to the
parameter.
Advise Messages
When an Advise message occurs, the RMS server first checks to see if the parameter is configured for sending
Advise messages. If not, no messages are sent and no Log entries are created. If the parameter has been
configured for Advise messages, the message is logged and dispatched via SMTP an SNPP as described
above. However, the Advise template assigned to the parameter, or the default Advise template if no template
has been assigned to the parameter, is used to generate the text for the log entries and messages.
For instance, if the previous value for Projector Lamp Hours is 999 and the new value is 1001 and the
threshold is set to 1000 and the threshold operator is set as "Greater Than", the RMS server checks to see if the
previous value compared to the threshold, i.e. 999 is Greater than 1000 is False, has a different result than the
new value compared to the threshold, i.e. 1001 is Greater than 1000 is True. This change results in an Alert
message being logged using the RMS logging settings. Also, a message is sent to all users registers for a
notification matching the parameters group, room and status type.
If the Lamp Hours changes from 1001 to 999, the RMS server triggers an Advise message. If the parameter is
configured to send Advise messages, the message is sent to the log and to all users registered for a notification
matching the parameters group, room, and status type.
RFID Device Tracking
RMS supports device location tracking using radio frequency identification (RFID) technology. For more
information on how RFID works with RMS, please see the RFID section in the RMS Administrator's Guide.
Implementing RFID tracking with the RMS SDK is very simple. RMS makes use of the Anterus RFID
hardware and the Anterus RFID Duet Module to enable RFID functionality in RMS.
If you are using RMSCodeCrafter, then it already supports the options for RFID and prompts you for the
proper input criteria. However, if you prefer to manually implement the RFID tracking code, then the steps
required to include RFID tracking are as follows:
1. Download and install the Anterus Duet Module on the same computer where you are compiling the RMS
NetLinx project.
2. Define the Anterus RFID reader devices in the DEFINE_DEVICE section.
3. Define and include the Anterus Duet Device module using DEFINE_MODULE
4. Define and include the RMSRFIDTracking NetLinx module using DEFINE_MODULE
5. Send the 'PROPERTY-Identifiers' command to the Anterus Duet module virtual device and include all the
RFID readers the module should monitor. (see the Anterus documentation for more information on the
'PROPERTY-Identifiers' command.)
The Anterus RFID Duet Module monitors and manages all the physical RFID readers and RFID tags.
You can configure reader thresholds and sensitivity using the web based Anterus configuration pages hosted
on the NetLinx master. The purpose of the RMSRFIDTracking NetLinx module is to coordinate RFID tag
status, listen for all RFID tag changes, and communicate this information up to the RMS server.
The sample code included in the RMS SDK includes all the necessary code to implement the Anterus Duet
module and RFID tracking.
In the RMSMain.AXS file, search and find the #DEFINE RMS_RFID_ENABLED statement.
If this statement is un-commented, then the sample code will compile including all the necessary RFID
implementation code.
The implementation code can be found in the RMSMain.AXS and RMSMain.AXI files.
Getting Started
Overview
In order to monitor devices from an RMS system, you will need to add programming to your NetLinx project.
Only the devices and parameters that you register from NetLinx can be monitored; the administrator cannot
add parameters from the RMS console.
While all of the device monitoring programming can be done manually, RMS CodeCrafter can generate code
for your project. From this program, you can enter the information for the device monitoring and then generate
an Include (AXI) file. The Include (AXI) file contains the necessary code to register monitored devices. Once
the Include file is created, you need to include this file in your main program with an #INCLUDE statement
and make sure the RMS device is defined. Also, you need to add code to set the values of any custom
parameters.
For projectors, you will need to notify RMS when the lamp hours changes If your projector does not support
a lamp hours command, you need to make sure you notify RMS of the projector power using
RMSSetDevicePower(). The RMSProjectorMod module will estimate lamp hours using projector power, if
you are using an AMX Comm module to communicate to your device, the RMSProjectorMod will
communicate with the Comm module to determine lamp hours automatically.
If your projector supports a lamp hours command, it is recommended you add code to poll and parse lamp
hours. Once you have obtained lamp hours from your projector, notify RMS by calling this function:
RMSSetLampHours(DeviceIdentifier,Value)
Where DeviceIdentifier is the identifier for the real device, such as dvProj, and Value is the lamp hour's
value.
For transport devices, you will need to notify RMS when the transport state changes. If you are using an
AMX Comm module to communicate to your device, the RMSTransportMod will communicate with the
Comm module to determine transport state automatically. If you are using an AMX system call with no
feedback offset, i.e. FIRST is 0, RMSTransportMod will communicate with the SYSTEM_CALL to determine
transport state automatically.
To notify RMS of the transport state for a custom transport implementation, use this function:
RMSSetTransportState(DeviceIdentifier,State)
Where DeviceIdentifier is the identifier for the real device, such as dvVCR, and State is the transport
state: Play=1, stop-2, Pause=3, FFwd=4, Rew=5, SrchFwd=6, SrchRev=7, Record=8.
For serial devices, including, RS232 and IP controlled devices, you need to add some polling commands to
these device in order to allow the RMS support module to properly report the Device Communicating
parameter. The RMSBasicDeviceMod, RMSProjectorMod and RMSTransportMod expect to receive a string
from the device every 30 seconds. If a string is not received within the timeout period, a loss of device
communication is reported to the RMS server.
The default value for the Device Communicating timeout is 30 seconds. If this value works for your device, all
you need to do is add the polling for the device.
If you want to change the timeout, set the Device Communicating timeout for a monitored device, which will
in turn call RMSSetCommunicationTimeout() to change the default timeout.
The timeout time is specified in 1/10 seconds.
If you want to disable the Device Communicating parameter, set the timeout to 0.
Service Mode
RMS supports a Service mode where no errors will be reported from monitored devices.
Service mode is designed to allow a technician to work on a room without causing error reports. For instance,
if a projector needs to be replaced or serviced, RMS would report Device Not Communicating when the
technician disconnected the power cable or communication cable. To prevent this error from being reported to
RMS, put RMS in service mode using the 'SERVICE-ON' command. When the work is completed, exit service
mode using the 'SERVICE-OFF' command.
Service Mode does not prevent notifications from being sent if disconnection occurs
from the NetLinx Master.
Since service mode bypasses error reporting, it represents a security problem. For instance, in service mode no
error is reported when the projector stops communicating even if it is being disconnected by unauthorized
personnel. Therefore, service mode does not appear as a button on a touch panel.
Service mode should be implemented in an appropriate method for the facility. These methods may include:
A button on a protected touch panel page
A button on a protected web-based touch panel page
A switched connected to an IO port on a NetLinx system accessible only by technicians.
A key-activated switch connected to an IO port on a NetLinx system.
RMSCommon.axi
RMSCommon.axi is an included file designed to help perform many device monitoring tasks. This file
provides device-monitoring constants, functions that generate device monitoring SEND_COMMANDs to
RMS, as well as providing a "callback" function for important device monitoring RMS events.
In order to use this include file, your program will need to define the RMS device and a couple of functions.
The include file sends commands to and creates an event for the RMS device, vdvRMSEngine. You must
create this device in your program. In your code, the device definition needs to be defined as:
DEFINE_DEVICE
vdvRMSEngine = 33001:1:0
The virtual device number needs to be unique and not conflict with any other virtual device defined in your
program.
RMS will notify your program when it is time to register devices and parameters and when the administrator
resets a parameter from the RMS console. RMS sends these events to your program as a string from
vdvRMSEngine. The event processing section in this include file will process these strings, parse the
parameters and call a function in your program to notify you of the event.
These functions need to be defined in your program whether you use them or not, otherwise the compiler will
generate an error since it cannot find these functions.
The two functions you need to include are:
RMSDevMonRegisterCallback()
This function is called when RMS engine module connects to the RMS server. Since the RMS engine module
does not store any information about monitored devices and their parameters, this information must be sent to
the RMS only when the module is connected to the server. If you want to add any custom device monitoring
code, you can register your device and parameters in this function.
In your code, the function needs to be defined as:
DEFINE_FUNCTION RMSDevMonRegisterCallback()
{
}
RMSDevMonSetParamCallback()
The function is called when the RMS administrator chooses "Reset" for a parameter that can be reset on the
RMS console. You can determine which parameter was reset by checking the value of dvDPS and cName. All
parameters values are sent as a string so you will need to convert it appropriately.
In your code, the function needs to be defined as:
DEFINE_FUNCTION RMSDevMonSetParamCallback(DEV dvDPS, CHAR cName[], CHAR cValue[])
{
}
//This sets the parameters for the registered device - called in the online event for dvRelay//
RMSRegisterDeviceIndexParam(dvRELAY,'Rack Power',
1,RMS_COMP_LESS_THAN,RMS_STAT_MAINTENANCE,
FALSE,0,
RMS_PARAM_SET,nRMSRackPowerRackPower,
'OFF|ON')
CHANNEL_EVENT [dvRELAY,0]
{
// Channel On
ON:
{
SWITCH (CHANNEL.CHANNEL)
{
CASE 1:
RMSSetRackPowerRackPower(1)
break
}
}
// Channel Off
OFF:
{
SWITCH (CHANNEL.CHANNEL)
{
CASE 1:
RMSSetRackPowerRackPower(0)
break
}
}
}
RMSProjectorMod
This module monitors projectors. For each projector, this module will register and monitor online/offline
status, communication status, control failure, power, and lamp hours.
Communication status is registered only if the device is a two-way device. This includes serial
devices and IP sockets.
Control failure is registered only if enabled via a SEND_COMMAND, and is based on the ability to
control power.
If the device is an IP-based device, the IP address NetLinx is communicating with is also registered
with RMS.
Lamp hours are determined by counting the time that the device's power is On. However, this
module can also accept the value of lamp hours as a SEND_COMMAND when you have a
projector that can provide lamp hours. Since this module registers lamp hours, it is recommended
only for use with devices that have lamps that need to be replaced.
FIG. 3 provides a visual description of the architecture of the RMSProjectorMod module:
RMSTransportMod
This module monitors transport devices. For each transport device, this module will register and monitor
online/offline status, communication status, power, and run time.
Communication status is registered only if the device is a two-way device. This includes serial
devices and IP sockets.
Control failure is register only if enabled via a SEND_COMMAND, and is based on the ability to
control power.
If the device is an IP-based device, the IP address NetLinx is communicating with is also registered
with RMS.
Run time is determined by counting the time that the device is in a transport state other than stop
while the power is on.
FIG. 4 provides a visual description of the architecture of the RMSTransportMod module:
RMSSldProjMod
This module monitors slide projectors. For each projector, this module will register and monitor online/offline
status, power, and lamp hours.
Lamp hours are determined by counting the time that the device's power is On.
FIG. 5 provides a visual description of the architecture of the RMSSldProjMod module:
Programming
These modules require a virtual device, the real device of the device to be monitored, and the RMS Engine
module's device. If you are using an AMX module for communicating with a device, the virtual device used
for the Comm module can be passed to the device monitoring support module.
Since the support modules are written to listen for the messages for the particular device types they support, no
additional programming is needed. Simply define the devices, add the module, and pass the device numbers as
module parameters.
Example:
DEFINE_DEVICE
dvSlide = 96:1:0
dvVPROJ = 5001:1:0
dvVCR = 5001:2:0
dvSWT = 5001:3:0
vdvVPROJ = 33001:1:0
vdvVCR = 33002:1:0
vdvSWT = 33003:1:0
vdvRMSEngine = 33003:1:0
Notify Modules
• Turn Power On: RMSSetDevicePower(dvProj,TRUE)
SEND_STRING vdvVPROJ,'POWER=1'
PULSE[vdvVPROJ,27]
ON[vdvVPROJ,255]
• Turn Power Off: RMSSetDevicePower(dvProj,FALSE)
SEND_STRING vdvVPROJ,'POWER=0'
PULSE[vdvVPROJ,28]
OFF[vdvVPROJ,255]
• Set Lamp Hours RMSSetLampHours(dvProj,Value)
SEND_STRING vdvVProj,'LAMPTIME=Value'
• Set Transport State RMSSetTransportState(dvVCR,State)
(1=Play, 2=Stop, etc…): SEND_STRING vdvVCR, 'TRANSPORT=State'
PULSE[vdvVCR,State+240]
Transport States
1 Play
2 Stop
3 Pause
4 Fast Forward
5 Rewind
6 Search forward
7 Search Reverse
8 Record
Note that for power state, you can PULSE channel 27 or 28 to set the state.
Since most IR files store the power functions on these channels, no additional programming is needed to
send power state to the module when using these channels to control power.
Also, power status is monitored on channel 255 which is often linked to a power sensing device
connected to an IO device. If you are using an IO device to monitor power, the IO status should be set to
report on channel 255 of the real device.
In some cases, this requires a 'SET IO LINK' command to be sent to the real device. In these cases,
simply pass the real device as both the virtual and real device of the support module. However, in this
case, you cannot use SEND_STRING for notifying the module of transport state.
Note that for transport state, you can pulse a channel between 241-248 to set the transport state.
Since AMX SYSTEM_CALLs use those channels to store transport state, no additional programming is
needed to send transport state to the module when using a SYSTEM_CALL.
In this case, simply pass the real device as both the virtual and real device of RMSTransportMod.
However, in this case, you cannot use SEND_STRING for notifying the module of transport state.
Control Failure
When the device is IR, power status is monitored using channel 255.
Axcent3's, NXC_IRS4 cards, NXI's and NI series controllers can all provide an IO link that enables an IO
status to appear on channel 255 of the device.
These modules will watch for power attempts using channel 9, 27 or 28 and report a control failure if the
power of the device does not respond properly. Additionally, the module will monitor channel 254, used as a
power fail channel when using the 'PON' commands, and report control failure conditions when this channel is
on.
This functionality must be enabled via the RMSEnablePowerFailure() function, defined in the
RMSCommon.axi include file.
Example:
DATA_EVENT[vdvRMSEngine]
{
ONLINE:
{
RMSEnablePowerFailure(dvProj)
}
}
Device Information
You can define the name, manufacturer, and model using RMSSetDeviceInfo().
Device information is usually sent in a device registration message and can only be sent when the RMS engine
module connects to the RMS server. However, if the device is monitored by a support module, the device info
message can be sent at any time.
Example:
DATA_EVENT[vdvRMSEngine]
{
ONLINE:
{
RMSSetDeviceInfo(dvProj,'Name','Manufacturer','Model Number')
RMSSetDeviceInfo(dvVCR,'Name','Manufacturer','Model Number')
}
}
The RMSSetDeviceInfo() is defined in the RMSCommon.axi include file.
DATA_EVENT[vdvCLActions]
{
ONLINE:
{
// VCR Select
SEND_COMMAND vdvCLActions,"'ADD ACTION-1,Select Custom Source'"
}
To notify i!-ConnectLinx and RMSSrcUsageMod when no source is active, set the i!-ConnectLinx status for
Power Off using the standard Power Off action:
PULSE[vdvCLActions, 1002]
By default, RMS monitors a single source at a time. If a new source is selected, the previous selected source's
usage is tracked and the new source is selected. However, if you have more that one destination in your system,
such as two projectors, this operation is not desirable.
RMS can monitor each source independently based on the status of the source select channel. To enable this
mode in RMSSrcUsageMod, call RMSSetMultiSource() with a parameter of true.
Example:
DATA_EVENT[vdvRMSEngine]
{
ONLINE:
{
RMSSetMultiSource(TRUE)
}
}
FIG. 6 provides a visual description of the architecture of the RMSSrcUsageMod module:
DEFINE_VARIABLE
Registering Devices
The RMSCommon.axi include file provides some simple functions for registering devices. The functions can
be used in the RMSDevMonRegisterCallback() function, called when RMS engine module connects to the
RMS server.
These functions generate SEND_COMMANDs, which you can generate manually. However, using these
functions may help eliminate syntax issues.
To register a device, call this function:
RMSRegisterDevice(dvDPS, cName, cManufacturer, cModel)
This function needs to be called in two places:
Call RMSRegisterDevice () in the RMSDevMonRegisterCallback() function to make sure it is
registered when the RMS engine module connects to the RMS server.
Also, call RMSRegisterDevice () when the NetLinx-connected device reports online. This function
will automatically register the Online/Offline parameter and set this value to Online.
The RMSRegisterDevice() function and the corresponding RMS SEND_COMMAND that it generates will
only work for devices that are currently online. This is because RMS tracks information such as firmware
version and serial number that are only available when the device is online.
Registering Parameters
Before registering a parameter, the device with which the parameter is associated must have been previously
registered. However, if a support module RMS has registered the device already, you do not need to re-register
it. For instance, you may want to add a parameter to the "System" device, 0:1:0. In this case, simply register
the parameter for device 0:1:0.
The combination of Number and String parameters types and enumeration lists provide four unique kinds of
parameters to the NetLinx program. These are:
Registering Parameters
• Number Parameter Number parameters are parameters of type number with no enumeration list. These are
commonly used for values that are programmatically available and displayed in numeric
form.
Examples of number parameters are projector lamp hours and VCR run time.
• String Parameter String parameters are parameters of type string with no enumeration list. These are
commonly used for values that are programmatically available and displayed in text
form.
Examples of string parameters are help or maintenance request.
• Enum Parameter Enum parameters are parameters of type string with an enumeration list.
These are commonly used for values that are programmatically available and displayed
in text form where the text is expected to be limited to a list.
The value NetLinx sends for an enumeration parameter needs to exist in the enumera-
tion list. However, the administrator will only be allowed to pick a threshold or reset value
from the enumeration list.
An example of an enum parameter is the currently selected source.
The "|" character is used to separate values in the enumeration list.
• Index Parameter Index parameters are parameters of type number with an enumeration list and are
similar to the Enum parameter. However, these are commonly used for values that are
programmatically available numerically but displayed in text form where the text is
expected to be limited to a list.
The value NetLinx sends for an enumeration parameter must exist in the enumeration
list. However, the value sent from NetLinx represents the index into the enumerated list
instead of the actual value.
An example of Enum parameters is power. The value for power is often available
programmatically as a zero or a one but should be displayed as "Off" or "On."
This is accomplished by sending a value of zero or one to RMS and providing an
enumeration list of "Off|On" where the "|" character is used to separate values in the
enumeration list.
The include file provides four functions for registering these parameters:
RMSRegisterDeviceNumberParam(dvDPS,
cName,
slThreshold,
nThresholdCompare,
nThresholdStatus,
bCanReset,
slResetValue,
nInitialOp,
slInitial,
slMin,
slMax)
RMSRegisterDeviceIndexParam dvDPS,
cName,
nThreshold,
nThresholdCompare,
nThresholdStatus,
bCanReset,
nResetValue,
nInitialOp,
nInitial,
cEnumList)
RMSRegisterDeviceStringParam dvDPS,
cName,
cThreshold,
nThresholdCompare,
nThresholdStatus,
bCanReset,
cResetValue,
nInitialOp,
cInitial)
RMSRegisterDeviceEnumParam dvDPS,
cName,
cThreshold,
nThresholdCompare,
nThresholdStatus,
bCanReset,
cResetValue,
nInitialOp,
cInitial,
cEnumList)
Optionally, you can register a parameter with a Unit field. The Unit field will be displayed next to the
parameter value and threshold. Consider adding a "V" if you or monitoring voltage or a "%" if you are
monitoring percentage.
Two additional registration functions allow for the units field and can be used in place of the above functions:
RMSRegisterDeviceNumberParamWithUnits(dvDPS,
cName,
cUnits,
slThreshold,
nThresholdCompare,
nThresholdStatus,
bCanReset,
slResetValue,
nInitialOp,
slInitial,
slMin,
slMax)
RMSRegisterDeviceStringParamWithUnits(dvDPS,
cName,
cUnits,
cThreshold,
nThresholdCompare,
nThresholdStatus,
bCanReset,
cResetValue,
nInitialOp,
cInitial)
This function needs to be called in two places:
Call RMSRegisterDevicexxxParam () in the RMSDevMonRegisterCallback() function to make
sure it is registered when the RMS engine module connects to the RMS server.
Also, call RMSRegisterDevicexxxParam () when the NetLinx-connected device reports online.
Parameters
dvDPS is the device number of the device this parameter is associated with,
cName is the name of the parameter to register.
nThresholdCompare can be any of the following values:
RMS_COMP_NONE (0),
RMS_COMP_LESS_THAN (1),
RMS_COMP_LESS_THAN_EQ_TO (2),
RMS_COMP_GREATER_THAN (3),
RMS_COMP_GREATER_THAN_EQ_TO (4),
RMS_COMP_EQUAL_TO (5),
RMS_COMP_NOT_EQUAL_TO (6),
RMS_COMP_CONTAINS (7),
RMS_COMP_DOES_NOT_CONTAIN (8).
This value, along with slThreshold, nThreshold, or cThreshold is used to test to see when the
parameter indicates a fault, as determined by the threshold comparison changing from false to true
(i.e. Value > 10).
These constants allow you to control whether the supplied value is set, added to, subtracted from,
multiply with, divided by the number in the database or if you simply want the value in the database
reset to the values supplied during parameter registration.
slValue, nValue and cValue are the current value with which the operation will be performed.
Note that Index and Enum parameters so do not support the nOp argument. The results of
mathematical operation on an Index or Enum parameter are undefined.
Note that nValue for Index parameters are 0 based. The first element in cEnum, supplied during
registration, is index 0, the second element is index 1, etc...
Most commonly, you will use the RMS_PARAM_SET (0) operation. However, there may be instances where
you want to simply allow the database to keep track of the value and notify it of changes only. In these cases
RMS_PARAM_INC (1) and RMS_PARAM_DEC (2) are useful for adding and subtracting a value from the
current value in the database.
These operations can be used with both Number and String parameters.
RMS_PARAM_INC (1) appends the string value to the current string
RMS_PARAM_DEC (2) removes the string value from the current string.
The results of multiple and divide on a String parameter are undefined.
Note that values for slMin, slMax and cEnumList supplied during parameter registration are not used to
validate the value set using these functions.
If a Number parameter value falls outside the range of slMin or slMax, the value is stored in the
database and displayed.
If an Enum parameter value does not appear in the cEnum list, the value is stored in the database
and displayed.
If an Index parameter value does not have an associated index in the Enum List, the value is stored
in the database and displayed as an empty value.
Review the following listing of RMS modules to determine which you will need to include in your program.
Custom "Scheduling Only" Programming RMS modules
RMS Module Required for Description
Scheduling
RMSEngineMod Yes The RMSEngineMod is required to facilitate basic
communication between the RMS server and the NetLinx
master.
i!-ConnectLinxEngineMod Yes / Dependency The i!-ConnectLinxEngineMod is a required dependency of
the RMSEngineMod and must be included in the NetLinx
program.
RMSUIMod Optional The RMSUIMod is required if a touch panel is located inside
the room to display the room's schedule and meeting informa-
tion. Additionally, this module supports an external display
located outside the room.
RMSWelcomeOnlyUIMod Optional The RMSWelcomeOnlyUIMod is required only if a touch panel
is located outside a room for an external display of the room’s
schedule and meeting information, and no touch panel is
located inside the room. If the RMSUIMod is included in your
program, then the RMSWelcomeOnlyUIMod will not be
needed.
RMSHelpUIMod No This module is not required for RMS scheduling.
RMSNLDeviceMod No This module is not required for RMS scheduling.
RMSProjectorMod No This module is not required for RMS scheduling.
RMSTransportMod No This module is not required for RMS scheduling.
RMSBasicDeviceMod No This module is not required for RMS scheduling.
RMSSldProjMod No This module is not required for RMS scheduling.
RMSSrcUsageMod No This module is not required for RMS scheduling.
NetLinx Modules
RMSEngineMod Module
Commands
Strings
Channels
Levels
Module Definition
Commands
RMSEngineMod listens for the following commands from the vdvRMSEngine device:
Strings
RMSEngineMod listens for the following string from the vdvRMSEngine device:
RMSEngineMod - Strings and Descriptions
'POWER=[Power State]' Set the system power state. [PowerState] should be 0 for off and 1 for on.
Example: 'POWER=1'
Channels
RMSEngineMod - Channels
9 Toggle System Power State
27 Set system power to ON
28 Set system power to OFF
100 Run Preset for Current Appointment
248 RMS Server Socket Connected
This channel reflects the state of the actual TCP/IP connection between the master and the RMS Server.
249 RMS Database Online
This channel indicates the status of the RMS Database connection on the RMS server.
250 RMS Server Online
This channel is a composite channel that indicates that the RMS server is online or offline. Both the RMS
server TCP/IP socket must be connected and the RMS Database must be Online for this channel to be
set to the ON state. If one of these conditions is not met, this channel will be set to the OFF state.
251 Dynamic Images Enabled
Levels
RMSEngineMod - Levels
1 Current Appointment Index
2 Minutes Remaining In Appointment
3 Next Appointment Index
4 Minutes Until Next Appointment
5 First Appointment Index
6 Last Appointment Index
7 Number of Appointment Remaining today
Module Definition
DEFINE_MODULE 'RMSEngineMod' mdlRMSEng(vdvRMSEngine,
dvRMSSocket,
vdvCLActions).
Where mdlRMSEng is a unique module name.
RMSRFIDTrackingMod Module
Commands
Module Definition
Commands
RMSRFIDTrackingMod listens for the following commands from the vdvRMSEngine device:
Module Definition
The purpose of this module is to synchronize RFID tag changes received from the Anterus RFID Module with
the RMS Server. This module is only needed if using RFID tracking and the Anterus RFID Duet Module.
If you are deploying multiple instance of RMS to a single NetLinx master, then use
the module "RMSRFIDTrackingMod-Multi" instead of this module. More information
can be found describing the step required to support RFID device tracking with
multiple instances of RMS in the Multi-Instancing RFID Device Tracking in
RMS section on page 75.
DEFINE_MODULE 'RMSRFIDTrackingMod'
mdlRMSRFIDTracking(vdvAnterusGateway,vdvRMSEngine)
Where mdlRMSRFIDTracking is a unique module name.
RMSRFIDTrackingMod-Multi Module
Commands
Module Definition
Commands
RMSRFIDTrackingMod-Multi listens for the following commands from the vdvRMSEngine device:
Module Definition
The purpose of this module is to synchronize RFID tag changes received from the Anterus RFID Module with
a single instance of RMS in a multi-instance RMS NetLinx program. This module is only needed if using
RFID tracking and the Anterus RFID Duet Module in a multi-instance RMS configuration.
If not deploying multiple instance of RMS to a single NetLinx master, then use the module
"RMSRFIDTrackingMod" instead of this module.
DEFINE_MODULE 'RMSRFIDTrackingMod-Multi' mdlRMSRFIDTracking
(vdvAnterusGateway,vdvRMSEngine,cRFIDReaderAddresses[][])
Where mdlRMSRFIDTracking is a unique module name.
RMSUIMod Module
Commands
Module Definition
Touch Panel Pages
Constants
Commands
RMSUIMod listens for the following commands from the vdvRMSEngine device:
Module Definition
DEFINE_MODULE 'RMSUIMod' mdlRMSUI(vdvRMSEngine,
dvTp,
dvTP_Base,
dvTPWelcome,
dvTPWelcome_Base,
RMS_MEETING_DEFAULT_SUBJECT,
RMS_MEETING_DEFAULT_MESSAGE)
• RMS_MEETING_ A character array/string that defined the default subject text for meeting
DEFAULT_SUBJECT: appointments scheduled form the touch panel.
• RMS_MEETING_ A character array/string that defined the default message body text for
DEFAULT_MESSAGE: meeting appointments scheduled form the touch panel.
All channel and variable text numbers are defined inside the module. If you need to
change them, edit the module and re-compile the module and your program.
Constants
The following constants are defined in the RMSUIMod.axs file:
RMSUIMod - Constants
Constant Description
__RMS_UI_NAME__ RMS module name.
This constant should not be modified.
__RMS_UI_VERSION__ RMS module version.
This constant should not be modified.
RMS_BEEP_DOORBELL_REQUEST Panel Beep on Doorbell button push from outside welcome touch
panel.
1 = ENABLED / 0 = DISABLED
RMS_BEEP_DOORBELL_RECEIPT Panel Beep on Doorbell signal on in room touch panel.
1 = ENABLED / 0 = DISABLED
RMS_BEEP_PRESET_RUN Panel Beep on Meeting Preset Execute button press from in-room
touch panel.
1 = ENABLED / 0 = DISABLED
RMS_WELCOME_PREP_TIME_MIN Numbers of minutes before meeting start time to prepare for next
meeting.
RMS_WARN_TIME_MIN Number of minutes before meeting ends to display a warning dialog
on the touch panel.
RMS_EXTEND_TIME_MIN Number of minutes to extend meeting end time when the EXTEND
meeting button is pressed from the touch panel.
RMS_G4_USER_SCHEDULE_COLOR_0 Color 1 of 3
Alternating meeting block colors for daily schedule.
RMS_G4_USER_SCHEDULE_COLOR_1 Color 2 of 3
Alternating meeting block colors for daily schedule.
RMS_G4_USER_SCHEDULE_COLOR_2 Color 3 of 3
Alternating meeting block colors for daily schedule.
RMSWelcomeOnlyUIMod Module
Commands
Module Definition
Touch Panel Pages
Constants
Commands
RMSWelcomeOnlyUIMod listens for the following commands from the vdvRMSEngine device.
Module Definition
DEFINE_MODULE ' RMSWelcomeOnlyUIMod' mdlRMSUI(vdvRMSEngine,
dvTPWelcome,
dvTPWelcome_Base,
RMS_MEETING_DEFAULT_SUBJECT,
RMS_MEETING_DEFAULT_MESSAGE)
All channel and variable text numbers are defined inside the module. If you need to
change them, edit the module and re-compile the module and your program.
Constants
The following constants are defined in the RMSWelcomeOnlyUIMod.axs file:
RMSWelcomeOnlyUIMod - Constants
Constant Description
__RMS_UI_NAME__ RMS module name. This constant should not be modified.
__RMS_UI_VERSION__ RMS module version. This constant should not be modified.
RMS_BEEP_DOORBELL_REQUEST Panel Beep on Doorbell button push from outside welcome touch
panel.
1 = ENABLED / 0 = DISABLED
RMS_BEEP_DOORBELL_RECEIPT Panel Beep on Doorbell signal on in room touch panel.
1 = ENABLED / 0 = DISABLED
RMS_BEEP_PRESET_RUN Panel Beep on Meeting Preset Execute button press from in-room
touch panel.
1 = ENABLED / 0 = DISABLED
RMS_WELCOME_PREP_TIME_MIN Numbers of minutes before meeting start time to prepare for next
meeting.
RMS_WARN_TIME_MIN Number of minutes before meeting ends to display a warning dialog
on the touch panel.
RMS_EXTEND_TIME_MIN Number of minutes to extend meeting end time when the EXTEND
meeting button is pressed from the touch panel.
RMS_G4_USER_SCHEDULE_COLOR_0 Color 1 of 3
Alternating meeting block colors for daily schedule.
RMS_G4_USER_SCHEDULE_COLOR_1 Color 2 of 3
Alternating meeting block colors for daily schedule.
RMS_G4_USER_SCHEDULE_COLOR_2 Color 3 of 3
Alternating meeting block colors for daily schedule.
RMSHelpUIMod Module
Commands
Module Definition
Touch Panel Pages
Commands
RMSHelpUIMod listens for the following commands from the vdvRMSEngine device.
Module Definition
DEFINE_MODULE 'RMSHelpUIMod' mdlRMSHelpUI(vdvRMSEngine,
dvTp,
dvTP_Base)
All channel and variable text numbers are defined inside the module. If you need to
change them, edit the module and re-compile the module and your program.
RMSHelpUIMod requires the following touch panel pop-up pages for dvTp:
RMSNLDeviceMod Module
Commands
Module Definition
Commands
RMSNLDeviceMod listens for the following commands from the vdvRMSEngine device.
Module Definition
DEFINE_MODULE 'RMSNLDeviceMod' mdlNLD(dvMonitoredDevices,
vdvRMSEngine)
RMSProjectorMod Module
Commands
Strings
Channels
Module Definition
Commands
RMSProjectorMod listens for the following commands from the vdvRMSEngine device.
RMSProjectorMod listens for the following commands from the vdvProjModule device.
This set of commands is intended to provide monitoring for Duet-based modules.
Strings
RMSProjectorMod listens for the following strings from the vdvProjModule device.
Any string received from the physical device (dvProj) is an indication that the device is communicating.
As long as a string is received within the period set by the communication timeout command, the module will
notify RMS that the device is communicating. See the Communication Timeout command for more details.
If using a Duet module, strings from the physical device are captured inside the Duet
module are not bubbled up to the STRING data event.
For Duet devices, instead of monitoring string traffic on physical device, Channel 252
(DATA_INITIALIZED) is used to monitor device communication status.
Channels
RMSProjectorMod watches for these channels on the vdvProjModule device:
RMSProjectorMod - Channels
9 Toggle System Power State
27 Set system power to ON
28 Set system power to OFF
252 Device Communication/Initialized Status (Duet Modules)
254 Power failure
255 Power Status
Module Definition
DEFINE_MODULE 'RMSProjectorMod' mdlProj1(vdvProjModule,
dvProj,
vdvRMSEngine)
Where mdlProj1is a unique module name.
The following code shows how Code Crafter originally created the lamp hour parameter:
// RMSRegisterDeviceNumberParam(DVPROJ,'Lamp Hours A1',
// 1800,RMS_COMP_GREATER_THAN,RMS_STAT_MAINTENANCE,
// FALSE,0,
// RMS_PARAM_SET,slRMSPROJECTORLampHoursA1,0,0)
// RMSRegisterDeviceNumberParam(DVPROJ,'Lamp Hours A2',
// 1800,RMS_COMP_GREATER_THAN,RMS_STAT_MAINTENANCE,
// FALSE,0,
// RMS_PARAM_SET,slRMSPROJECTORLampHoursA2,0,0)
RMSTransportMod Module
Commands
Strings
Channels
Module Definition
Commands
RMSTransportMod listens for the following commands from the vdvRMSEngine device.
Strings
RMSTransportMod listens for the following strings from the vdvVCRModule device.
RMSTransportMod - Strings and Descriptions
'POWER=[Power State]' Set the system power state. [PowerState] should be 0 for off and 1
for on.
Example: 'POWER=1'
'TRANSPORT=[Transport State]' Set the system power state. Transport State can be 2 for Stop or
any other value for a non-stopped condition.
Any value other than 2 will enable the run-time counter.
'MODEL=[Model]' Set the model number.
'MANUFACTURER=[Manufacturer]' Set the manufacturer name.
Any string received from the physical device (dvProj) is an indication that the device is communicating.
As long as a string is received within the period set by the communication timeout command, the module will
notify RMS that the device is communicating. See the Communication Timeout command for more details.
If using a Duet module, strings from the physical device are captured inside the Duet
module are not bubbled up to the STRING data event.
For Duet devices, instead of monitoring string traffic on physical device, Channel 252
(DATA_INITIALIZED) is used to monitor device communication status.
Channels
RMSTransportMod watches for these channels on the physical device, and for Duet modules on the virtual
device:
RMSTransportMod - Channels
9 toggle System Power State
27 Set system power to ON
28 Set system power to OFF
241 Set transport state to play.
242 Set transport state to stop.
243 Set transport state to pause.
244 Set transport state to fast forward.
245 Set transport state to rewind.
246 Set transport state to search forward.
247 Set transport state to search reverse.
248 Set transport state to record.
252 Device Communication/Initialized Status (Duet Modules)
254 Power failure
255 Power Status
Module Definition
DEFINE_MODULE 'RMSTransportMod' mdlVCR1(vdvVCRModule,
dvVCR,
vdvRMSEngine)
Where mdlVCR1 is a unique module name.
RMSBasicDeviceMod Module
Commands
Strings
Channels
Module Definition
Commands
RMSBasicDeviceMod listens for the following commands from the vdvRMSEngine device.
Strings
RMSBasicDeviceMod listens for the following strings from the vdvModule device.
Any string received from the physical device (dvProj) is an indication that the device is communicating.
As long as a string is received within the period set by the communication timeout command, the module will
notify RMS that the device is communicating. See the Communication Timeout command for more details.
If using a Duet module, strings from the physical device are captured inside the Duet
module are not bubbled up to the STRING data event.
For Duet devices, instead of monitoring string traffic on physical device, Channel 252
(DATA_INITIALIZED) is used to monitor device communication status.
Channels
RMSBasicDeviceMod watches for these channels on the vdvModule device.
RMSBasicDeviceMod - Channels
9 toggle System Power State
27 Set system power to ON
28 Set system power to OFF
252 Device Communication/Initialized Status (Duet Modules)
254 Power failure
255 Power Status
Module Definition
DEFINE_MODULE 'RMSBasicdeviceMod' mdBasicDev1(vdvModule,
dvDevice,
vdvRMSEngine)
Where mdlBasicDev1 is a unique module name.
RMSSldProjMod Module
Commands
Channels
Module Definition
Commands
RMSSldProjMod listens for the following commands from the vdvRMSEngine device.
Channels
RMSSldProjMod watches for these channels on the dvSldProj device.
RMSSldProjMod - Channels
5 Slide Projector Power State
Module Definition
DEFINE_MODULE 'RMSSldProjMod' mdlSldProj1(dvSldProj,
vdvRMSEngine)
Where mdlSldProj1 is a unique module name.
RMSSrcUsageMod Module
Commands
Channels
Module Definition
Commands
RMSSrcUsageMod listens for the following commands from the vdvRMSEngine device.
Channels
RMSSrcUsageMod watches for these channels on the vdvConnectLinx device.
RMSSrcUsageMod - Channels
1001 Power On 1021 Rack Computer Select
1002 Power Off 1022 Aux PC Select
1011 VCR Select 1023 Aux Video Select
1012 HI8 VCR Select 1024 Slide Select
1013 Umatic VCR Select 1025 Digital Media Player Select
1014 DVD Select 1041 Music Select
1015 Laser Disc Select 1042 CD Select
1016 TV/DVD/Cable Select 1043 Cassette Select
1017 Video Conference Select 1044 DAT Select
1018 Document Camera Select 1045 Mini Disc Select
1019 Room Camera Select 1046 Aux Audio Select
1020 Whiteboard Select 1047 Digital Audio Player Select
RMSSrcUsageMod will also listen for i!-ConnectLinx registration of custom actions and attempt to determine
if they represent source selects.
Any custom action registered with a name that starts with "Select " is assumed to be a custom source.
RMSSrcUsageMod will register this source name with the RMS server and treat the associated channel as a
source select channel.
For more information on i!-ConnectLinx programming, refer to the i!-ConnectLinx help file installed with i!-
ConnectLinx as part of the RMS SDK.
Module Definition
DEFINE_MODULE 'RMSSrcUsageMod' mdlSrcUsage(vdvRMSEngine,
vdvCLActions)
Where mdlSrcUsage is a unique module name.
Only one instance of the Anterus Duet Module should be defined in your NetLinx
program.
This module is intended to operate as a single instance and does not support multiple
instances on a single NetLinx master.
Multiple instances of RMS can communicate with a single instance of the Anterus
Duet Module using the RMSRFIDTrackingMod-Multi module.
For more information see the RMSRFIDTrackingMod-Multi Module section on
page 41
Module Definition
DEFINE_MODULE 'AMX_Anterus_Comm_dr1_0_0' mdlAnterusDuetMod(vdvAnterusGateway,
dvAnterusReader1)
Additional RFID readers must be registered to the Anterus Duet module using the
'PROPERTY-Identifiers' command. Please consult the Anterus Duet module
documentation for more information.
i!-ConnectLinx
Overview
i!-ConnectLinx™ is a framework that allows you to expose NetLinx™ actions that can be utilized by other
user interfaces or processes outside the NetLinx Control System. For instance, i!-ConnectLinx can be
programmed to expose source select functions and i!-ConnectLinx compatible technologies, such as RMS, can
use this information to allow the source selects to be executed as a scheduled event.
i!-ConnectLinx also provides a mechanism to request actions to be executed on the NetLinx Control System.
Once a process outside the NetLinx Control System has obtained the action list, the process can then make a
request to i!-ConnectLinx to execute that action. i!-ConnectLinx handles this request and makes this request
available to the NetLinx program for execution.
i!-ConnectLinxEngineMod, is the main i!-ConnectLinx module that handles exposing and executing action
requests, see the Module section on page 66. To support i!-ConnectLinx, you simply include this module in
your program, define your actions and write programming to support those actions.
The i!-ConnectLinxEngineMod module makes the list of actions available to other processes, executes their
requests, and provides your program with a push when an action needs to be executed.
Using i!-ConnectLinx
Little work is required to add i!-ConnectLinx to your existing NetLinx code. i!-ConnectLinx is implemented
as a NetLinx module. Adding the module definition and all its parameters to your code is all that is required.
In order to use i!-ConnectLinx, you need to program and define a series of actions in the NetLinx Control
System. The key to the i!-ConnectLinx engine is the virtual device, vdvCLActions. For additional
information reference the Module section on page 66. Support the actions you want executed remotely using
this virtual device.
Think of the virtual device, vdvCLActions, as a touch panel. Normally, you write your NetLinx program to
respond to certain push channels from a touch panel; i!-ConnectLinx is exactly the same. Let’s say you want to
provide the user with the ability to play and stop a VCR. Imagine you have two touch panel buttons that do
these functions; write code that responds to the pushes:
BUTTON_EVENT[TP,1] (* VCR Play *)
{
PUSH:
{
PULSE[VCR,1]
}
}
BUTTON_EVENT[TP,2] (* VCR Stop *)
{
PUSH:
{
PULSE{VCR,2]
}
}
To expose these actions using i!-ConnectLinx, write the same code substituting the touch panel device for your
i!-ConnectLinx virtual device:
BUTTON_EVENT[vdvCLActions,1] (* VCR Play *)
{
PUSH:
{
PULSE[VCR,1]
}
}
BUTTON_EVENT[vdvCLActions,2] (* VCR Stop *)
{
PUSH:
{
PULSE{VCR,2]
}
}
When the i!-ConnectLinx engine gets a request to play the VCR, i!-ConnectLinx will "push" the button of the
virtual device just like a user pushes a button on a touch panel. There is now only one thing left to do: Tell the
user which actions are which.
In order to expose an action for execution via i!-ConnectLinx, you need to support the programming for the
action, as we have just seen, and you need to tell i!-ConnectLinx what that action is.
To specify the name of an action, send a command to the i!-ConnectLinx virtual device describing the name of
a given channel code. To specify the names of the actions in the above example, you would add some code like
this:
DATA_EVENT[vdvCLActions]
{
ONLINE:
{
(* Setup actions *)
(* VCR Play *)
SEND_COMMAND vdvCLActions,"'ADD ACTION-1,VCR Play"
(* VCR Stop *)
SEND_COMMAND vdvCLActions,"'ADD ACTION-2,VCR Stop' "
}
Once i!-ConnectLinx receives these commands, it stores this information in an XML file that can be used by
i!-ConnectLinx compatible technologies to browse available actions.
In addition to specifying the name of an action, you can also supply a help string and a folder name. The help
string helps a user understand the intent of the action more clearly. The folder name allows you to organize the
actions in a tree view so that actions are more easily browsed.
Standard Actions
So far, i!-ConnectLinx has handled custom actions where each action is likely to be different from system to
system. In the Using i!-ConnectLinx example on page 59, action 1 played the VCR. However, in another
system, it is very unlikely that action 1 plays the VCR.
i!-ConnectLinx uniquely identifies each action list. Once an i!-ConnectLinx compatible technology programs
itself to execute an action on a system, it also stores a copy of the system identifier from the action list. This
identifier is sent to i!-ConnectLinx along with this action execution request.
If the action identifier does not match the i!-ConnectLinx system that received the request, the action is not
executed. This eliminates any ambiguity that may exist, since each system’s action 1 may be different.
i!-ConnectLinx supports standard actions. Standard actions are actions defined by AMX and supported
natively by i!-ConnectLinx.
When adding actions to i!-ConnectLinx, it is best to use the standard action if it is available. That way, the
action can be executed regardless of which system the i!-ConnectLinx compatible technology was
programmed to control.
The list of standard actions are listed in the i!-ConnectLinxStdFunctionList.xls file. The standard actions ID
are the same as the channel number used to execute the action.
For instance, VCR Select has an ID of 1011 so the programming to support this standard action is:
BUTTON_EVENT[vdvCLActions,1011] (* VCR Select *)
{
PUSH:
{
// Switch the projector and switcher to select the VCR
}
}
To add a standard action, look up the action ID in the Standard Function List file, and send that in a send
command to i!-ConnectLinx to tell it you want to support that action.
To change the above example to standard action:
1. Lookup VCR Play and VCR Stop in the Standard Function List.
2. Find their IDs. VCR Play is 1131, and VCR Stop is 1132.
3. Send the IDs to i!-ConnectLinx:
DATA_EVENT[vdvCLActions]
{
ONLINE:
{
(* Setup actions *)
(* VCR Play *)
SEND_COMMAND vdvCLActions,"'ADD STD-1131'"
(* VCR Stop *)
SEND_COMMAND vdvCLActions,"'ADD STD-1132'"
}
Additionally, change the two BUTTON_EVENTs to trigger for channels 1131 and 1132 instead of 1 and 2.
There are other syntax’s of the add standard action command that allow you add multiple actions at a time. The
‘&’ character can be used to signify "AND" and the ‘-‘ character can be used to signify "through".
Since many of the standard actions are related, they can also be added by macros. A macro is a list of one or
more standard actions. In the case of a VCR, the full set of transports are needed, not just Play and Stop. Also,
if the VCR exists in the system then there is likely a way to select the VCR as the active source. Therefore, the
"vcr" macro includes the VCR source select and the standard transports. To load a set of actions by macro,
simply send a command to i!-ConnectLinx with the macro you want added.
Example:
DATA_EVENT[vdvCLActions]
{
ONLINE:
{
(* Setup actions *)
(* VCR Select and Play-Record *)
SEND_COMMAND vdvCLActions,"'ADD MACRO-vcr'"
}
Action Arguments
i!-ConnectLinx supports action arguments to supply additional information with each action. For instance, if
you wanted to support an action to set the program volume, the user needs to supply a volume level. This is
accomplished using arguments.
Each action can support zero or more arguments. Each argument can be one of the following types:
Number – A single number from –32767 to 32767. You can define the minimum value, maximum
value, desired step, and a default value. The user is presented with a text box in which to enter this
number.
Level – Similar to a Number argument, only the user is presented with a slider to enter the level.
String – A string. You can define the minimum length, maximum length, and default value. The
user is presented with a text box to enter this string.
Enumeration – A list or enumeration of values from which the user may choose. The user is
presented with a drop down list to choose and value from.
Each argument is numbered in the order they are added. Arguments are added by using the 'ADD NARG', 'ADD
LARG', 'ADD SARG', and 'ADD EARG' commands.
When an i!-ConnectLinx compatible technology requests an action with arguments to be executed, the
argument values are passed to i!-ConnectLinx.
i!-ConnectLinx then posts the argument values as levels for number and level arguments, and strings for string
and enumeration arguments. These values can be retrieved by using LEVEL_EVENTs and DATA_EVENTs in
your program and must be saved. Then, when an action request is triggered via a BUTTON_EVENT, you can
retrieve these argument values and use them (as appropriate) for the action to be executed.
Each argument is provided an ID at the time it is added. The ID’s start at one and are numbered sequentially to
each argument as they are added. When
i!-ConnectLinx posts the argument value, it supplies the ID number as well. For numbers and levels, this ID is
the level number to which the argument is posted. For strings and enumerations, this ID is included in the
string that posts the argument value.
For an example, see the i!-ConnectLinxStandardFunctionShell.axi file.
Programming
i!-ConnectLinx appears on the NetLinx bus as a NetLinx device. This device has 1 port with channels, levels,
commands and strings like most other devices.
Channels
i!-ConnectLinx supports the following channels:
i!-ConnectLinx Channels
All Action to be executed for this action ID.
Levels
i!-ConnectLinx supports the following levels:
i!-ConnectLinx Levels
All Action number and level arguments
Commands
i!-ConnectLinx supports the following out-bound commands (Master to device).
The commands are sent in the standard Send_Command format:
SEND_COMMAND dvMP, "'SET ROOM NAME-Tesla'"
SEND_COMMAND dvMP, "'ADD MACRO-vcr'"
i!-ConnectLinx Commands
'SET ROOM INFO-[Room Sets the room name, room location, and room owner to be displayed in the
Name],[Room Location], action list file.
[Room Owner]'
'SET ROOM NAME- Sets the room name to be displayed in the action list file.
[Room Name]'
'SET ROOM LOCATION- Sets the room location to be displayed in the action list file.
[Room Location]'
'SET ROOM OWNER- Sets the room owner to be displayed in the action list file.
[Owner Name]'
'ADD MACRO-[Macro Name]' Adds a group of standard actions. See i!-ConnectLinxStdFunction-
List.xls for a complete list of macro names.
'ADD STD-[ID]-[ID]&[ID]' Adds one or more standard actions by ID. The ‘&’ is used for "AND" and ‘-
‘ is used for "THROUGH".
'ADD FOLDER-[Folder Adds a folder to the action list.
Name],[Parent]' The parent specifies which parent folder the new folder is added to.
If parent is not supplied, this folder is added to the root of the action list.
Strings
i!-ConnectLinx supports the following in-bound string (device to Master).
i!-ConnectLinx Strings
String Description
"'ARG[Argument ID]- Argument String for string and enum arguments for an action exe-
[Argument String]'" cuted soon.
'PARENT-[Name], Describes a parent node. Returned by GET NODE command.
[Child Count],[Parent]'
'CHILD[Child#]-[Name], Describes a child of a node. Returned by GET NODE command.
[ChildCount],[Parent]'
'ACTION-[ID],[Action], Describes an action. Returned by GET ACTION command.
[Help String],[Folder]'
'NARG-[Action],[Arg Name], Describes a number argument to Action.
[Min],[Max],[Step,][Default]'
'LARG-[Action],[Arg Name], Describes a level argument to Action.
[Min],[Max],[Step],[Default]'
'SARG-[Action],[Arg Name], Describes a string argument to Action.
[Min],[Max],[Default]'
'EARG-[Action],[Arg Name], Describes an enum argument to Action.
[Default],[Enum1],[Enum2]...'
'UUID-[UUID]' Provides the UUID for this i!-ConnectLinx. This ID can be used to
identify this instance of i!-ConnectLinx from all other instances of i!-
ConnectLinx.
'ROOM NAME-[Room Name]' Provide the room name as displayed in the action list file.
'ROOM LOCATION- Provides the room location as displayed in the action list file.
[Room Location]'
'ROOM OWNER-[Owner Name]' Provides the room owner as displayed in the action list file.
'FILE WRITE' Notification that the i!-ConnectLinx file is being written.
'FILE SAVED' Notification that the i!-ConnectLinx file is has been saved.
Module
The i!-ConnectLinxEngineMod Module definition code is displayed below.
DEFINE_MODULE 'i!-ConnectLinxEngineMod' mdlCL(vdvCLActions)
(* RMS INSTANCE #2 *)
dvTPMain_2 = 10003:1:0 (* RMS Main Touch Panel *)
dvTPWelcome_2 = 10004:1:0 (* RMS Welcome Touch Panel *)
The rest of the multi instance information is in the include file RMSMain-Multi.axi in the SDK.
// create a touch panel device array for all main touch panels for each RMS
instance
VOLATILE DEV dvRMSTP_1[] = {dvTPMain_1}
VOLATILE DEV dvRMSTP_2[] = {dvTPMain_2}
// create a touch panel device array for all welcome touch panels for each RMS
instance
VOLATILE DEV dvRMSTPWelcome_1[] = {dvTPWelcome_1}
VOLATILE DEV dvRMSTPWelcome_2[] = {dvTPWelcome_2}
Module Defining
Each instance must define it's own modules, which directly affects how many instances can be run (memory
constraint). The example uses two instances.
// 1st RMS instance...
// RMSSrcUsageMod - Tracks equipment usage
DEFINE_MODULE 'RMSSrcUsageMod' mdlSrcUsage_1(vdvRMSEngine_1, vdvCLActions)
// Switcher
DEFINE_MODULE 'RMSBasicDeviceMod' mdlBasicDev_1(vdvSWTModule_1, dvSWT_1,
vdvRMSEngine_1)
// VCR
DEFINE_MODULE 'RMSTransportMod' mdlXport_1(vdvVCRModule_1, dvVCR_1,
vdvRMSEngine_1)
// Display
DEFINE_MODULE 'RMSProjectorMod' mdlProj_1(vdvProjModule_1, dvProj_1,
vdvRMSEngine_1)
// Switcher
DEFINE_MODULE 'RMSBasicDeviceMod' mdlBasicDev_2(vdvSWTModule_2, dvSWT_2,
vdvRMSEngine_2)
// VCR
DEFINE_MODULE 'RMSTransportMod' mdlXport_2(vdvVCRModule_2, dvVCR_2,
vdvRMSEngine_2)
// Display
DEFINE_MODULE 'RMSProjectorMod' mdlProj_2(vdvProjModule_2, dvProj_2,
vdvRMSEngine_2)
// RMS INSTANCE #1
dvAnterusReader1 = 84:1:0 (* AxLink Anterus RFID Reader #1 *)
dvAnterusReader2 = 85:1:0 (* AxLink Anterus RFID Reader #2 *)
dvAnterusReader3 = 86:1:0 (* AxLink Anterus RFID Reader #3 *)
dvAnterusReader4 = 87:1:0 (* AxLink Anterus RFID Reader #4 *)
// RMS INSTANCE #2
dvAnterusReader5 = 88:1:0 (* AxLink Anterus RFID Reader #5 *)
dvAnterusReader6 = 89:1:0 (* AxLink Anterus RFID Reader #6 *)
dvAnterusReader7 = 90:1:0 (* AxLink Anterus RFID Reader #7 *)
dvAnterusReader8 = 91:1:0 (* AxLink Anterus RFID Reader #8 *)
// RMS INSTANCE #3
dvAnterusReader9 = 92:1:0 (* AxLink Anterus RFID Reader #9 *)
dvAnterusReader10 = 93:1:0 (* AxLink Anterus RFID Reader #10 *)
dvAnterusReader11 = 94:1:0 (* AxLink Anterus RFID Reader #11 *)
dvAnterusReader12 = 95:1:0 (* AxLink Anterus RFID Reader #12 *)
// RMS INSTANCE #4
dvAnterusReader13 = 96:1:0 (* AxLink Anterus RFID Reader #13 *)
dvAnterusReader14 = 97:1:0 (* AxLink Anterus RFID Reader #14 *)
dvAnterusReader15 = 98:1:0 (* AxLink Anterus RFID Reader #15 *)
dvAnterusReader16 = 99:1:0 (* AxLink Anterus RFID Reader #16 *)
2. DEFINE_CONSTANT
Define a string array (two-dimensional array) constant for the list of RFID reader address labels for each
instance of RMS.
The third parameter of the 'RMSRFIDTrackingMod-Multi' module is used to identify which Anterus RFID
readers an instance of the 'RMSRFIDTrackingMod-Multi' module should monitor and relay RFID tag status to
the RMS server. Each RFID reader configured in Anterus supports a user defined reader address label. (This
address label is separate from the reader's physical AxLink DPS address).
By default, the Anterus module will automatically label each RFID reader's address label field using its
AxLink DPS address. Once a RFID reader address label is recorded in Anterus, that label is persisted unless
the RFID reader is deleted or manually renamed via the 'RFID Configuration Manager' web page hosted on the
NetLinx master.
Although Anterus does provide a default RFID reader address label, it is a user customizable field and can be
overridden and manually defined via the 'RFID Configuration Manager' web page hosted on the NetLinx
master.
It is important to note that if using the multi-instanced 'RMSRFIDTrackingMod-Multi' module, these RFID
reader address labels are required to be known by the module and the module will not work properly if the
RFID Reader address labels are changed by the user and are no longer in sync with the labels defined in code.
// IMPORTANT !!
//
// By default when Anterus creates a RFID reader address
// label, it uses the fully-qualifed
// D:P:S with the actual system number.
// The real system number, not '0', should be used
// in the RFID reader address labels listed below.
//
// RMS INSTANCE #1
CHAR RFID_READER_ADDRESS_LABELS_1[][15] = { '84:1:1',
'85:1:1',
'86:1:1',
'87:1:1' }
// RMS INSTANCE #2
CHAR RFID_READER_ADDRESS_LABELS_2[][15] = { '88:1:1',
'89:1:1',
'90:1:1',
'91:1:1' }
// RMS INSTANCE #3
CHAR RFID_READER_ADDRESS_LABELS_3[][15] = { '92:1:1',
'93:1:1',
'94:1:1',
'95:1:1' }
// RMS INSTANCE #4
CHAR RFID_READER_ADDRESS_LABELS_4[][15] = { '96:1:1',
'97:1:1',
'98:1:1',
'99:1:1' }
3. DEFINE_MODULE
Define modules. A single module definition is needed for the Anterus Duet module.
// Anterus RFID Duet Module
DEFINE_MODULE 'AMX_Anterus_Comm_dr1_0_0'
mdlAnterusDuetMod(vdvAnterusGateway,dvAnterusReaders[1])
Multiple module definitions are needed for the RFIDTrackingMod-Multi module. A module definition is
needed for each RMS instance supporting RFID device tracking.
The module parameters include: the global Anterus Duet module virtual device,
the unique RMS Engine virtual device instance and
the specific RFID reader address label array containing the RFID readers associated with this
instance of RMS.
// RMS INSTANCE #1
DEFINE_MODULE 'RMSRFIDTrackingMod-Multi' mdlRMSRFIDTracking_1
(vdvAnterusGateway,vdvRMSEngine_1,
RFID_READER_ADDRESS_LABELS_1)
// RMS INSTANCE #2
DEFINE_MODULE 'RMSRFIDTrackingMod-Multi' mdlRMSRFIDTracking_2(vdvAnterusGateway,
vdvRMSEngine_2,
RFID_READER_ADDRESS_LABELS_2)
// RMS INSTANCE #3
DEFINE_MODULE 'RMSRFIDTrackingMod-Multi' mdlRMSRFIDTracking_3
(vdvAnterusGateway,vdvRMSEngine_3,
RFID_READER_ADDRESS_LABELS_3)
// RMS INSTANCE #4
DEFINE_MODULE 'RMSRFIDTrackingMod-Multi' mdlRMSRFIDTracking_4
(vdvAnterusGateway,vdvRMSEngine_4,
RFID_READER_ADDRESS_LABELS_4)
4. DATA_EVENT
A data event is needed when the Anterus Duet module virtual device comes online to identify all of the RFID
reader devices to the Duet module.
See the Anterus documentation for more information on the 'PROPERTYIdentifiers' command.
DATA_EVENT[vdvAnterusGateway]
{
ONLINE:
{
// send the IDENTIFIERS property to the Anterus
// Duet module to identify additional reader devices
SEND_COMMAND vdvAnterusGateway,"'PROPERTY-
Identifiers,84;85;86;87;88;89;90;91;92;93;94;95;96;97;98;99'"
The multi-instance sample code included in the RMS SDK includes all the necessary code to implement the
Anterus Duet module and RFID tracking with multiple instances of RMS.
In the RMSMain-4Systems.AXS file, search and find the #DEFINE RMS_RFID_ENABLED statement.
If this statement is un-commented, then the multi-instance sample code will compile including all the
necessary RFID implementation code.
The implementation code can be found in the RMSMain-4Systems.AXS and RMSMain-Multi.AXI files.
3000 RESEARCH DRIVE, RICHARDSON, TX 75082 USA • 800.222.0193 • 469.624.8000 • 469-624-7153 fax • 800.932.6993 technical support • www.amx.com
93-3002-04 REV R