GenericComm - PepperDash/Essentials GitHub Wiki

GenericComm

One of the most common scenarios in control system development is utilizing RS232 to connect to a device. Essentials doesn't restrict you to connecting a native essentials device or plugin to the comport. You can directly access the comport, and even set baudrates on the fly if you so desire.

Similarly you can instantiate one of several socket types in this manner and bridge them directly to SIMPL.

Consider the following example.

{
    "template": {
        "roomInfo": [
            {}
        ],
        "devices": [
            {
                "key": "processor",
                "uid": 0,
                "type": "pro3",
                "name": "pro3",
                "group": "processor",
                "supportedConfigModes": [
                    "compliance",
                    "essentials"
                ],
                "supportedSystemTypes": [
                    "hudType",
                    "presType",
                    "vtcType",
                    "custom"
                ],
                "supportsCompliance": true,
                "properties": {}
            },
            {
                "key": "Comport-1",
                "uid": 3,
                "name": "Comport 1",
                "group": "api",
                "type": "genericComm",
                "properties": {
                    "control": {
                        "method": "com",
                        "comParams": {
                            "hardwareHandshake": "None",
                            "parity": "None",
                            "protocol": "RS232",
                            "baudRate": 115200,
                            "dataBits": 8,
                            "softwareHandshake": "None",
                            "stopBits": 1
                        },
                        "controlPortNumber": 1,
                        "controlPortDevKey": "processor",
                    }
                }
            },
            {
                "key": "Comport-2",
                "uid": 3,
                "name": "Comport 2",
                "group": "api",
                "type": "genericComm",
                "properties": {
                    "control": {
                        "method": "ssh",
                        "tcpSshProperties": {
                            "address": "192.168.1.57",
                            "port": 22,
                            "username": "",
                            "password": "",
                            "autoReconnect": true,
                            "autoReconnectIntervalMs": 10000
                        }
                    }
                }
            },
            {
                "key": "deviceBridge",
                "uid": 4,
                "name": "BridgeToDevices",
                "group": "api",
                "type": "eiscapiadv",
                "properties": {
                    "control": {
                        "tcpSshProperties": {
                            "address": "127.0.0.2",
                            "port": 0
                        },
                        "ipid": "03",
                        "method": "ipidTcp"
                    },
                    "devices": [
                        {
                            "deviceKey": "Comport-1",
                            "joinStart": 1
                        },
                        {
                            "deviceKey": "Comport-2",
                            "joinStart": 3
                        }
                    ]
                }
            }
        ]
    }
}

GenericComm Configuration Explanation

This configuration is meant for a Pro3 device, and instantiates one comport and one SSH session and links them to an eisc bridge to another processor slot on ipid 3. Let's break down the Comport-1 device.

{
    "key": "Comport-1",
    "uid": 3,
    "name": "Comport 1",
    "group": "comm",
    "type": "genericComm",
    "properties": {
        "control": {
            "comParams": {
                "hardwareHandshake": "None",
                "parity": "None",
                "protocol": "RS232",
                "baudRate": 115200,
                "dataBits": 8,
                "softwareHandshake": "None",
                "stopBits": 1
            },
            "controlPortNumber": 1,
            "controlPortDevKey": "processor",
            "method": "com"
        }
    }
}

Key

The Key is a unique identifier for essentials. The key allows the device to be linked to other devices also defined by key. All Keys MUST be unique, as every device is added to a globally-accessible dictionary. If you have accidentally utilized the same key twice, Essentials will notify you during startup that there is an issue with the device.

Uid

The Uid is reserved for use with an PepperDash internal config generation tool, and is not useful to Essentials in any way.

Name

The Name a friendly name assigned to the device. Many devices pass this data to the bridge for utilization in SIMPL.

Group

Utilized in certain Essentials devices. In this case, the value is unimportant.

Type

The Type is the identifier for a specific type of device in Essentials. A list of all valid types can be reported by using the consolecommand gettypes in Essentials. In this case, the type is genericComm. This type is valid for any instance of a serial-based communications channel such as a Serial Port, SSH, UDP, or standard TCP/IP Socket.

Properties

These are the properties essential to the instantiation of the identified type.

Control

The properties within this property are dependant on the type of genericComm you wish to instantiate. There is one common property for control of any type, and that is method. The method property requires a string that maps to the following enumerations in Essentials :

namespace PepperDash.Core
{
    // Summary:
    //     Crestron Control Methods for a comm object
    public enum eControlMethod
    {
        None = 0,
        Com = 1,
        IpId = 2,
        IpidTcp = 3,
        IR = 4,
        Ssh = 5,
        Tcpip = 6,
        Telnet = 7,
        Cresnet = 8,
        Cec = 9,
        Udp = 10,
    }
}

These enumerations are not case sensitive. Not all methods are valid for a genericComm device. For a comport, the only valid type would be Com. For a direct network socket, valid options are Ssh, Tcpip, Telnet, and Udp.

ComParams

A Com device requires a comParams object to set the propeties of the comport. The values of all proeprties are case-insensitive.

{
"comParams": {
    "hardwareHandshake": "None",
    "parity": "None",
    "protocol": "RS232",
    "baudRate": 115200,
    "dataBits": 8,
    "softwareHandshake": "None",
    "stopBits": 1
}

Valid hardwareHandshake values are as follows

"None"
"Rts"
"Cts"
"RtsCts"

Valid parity values are as follows

"None"
"Even"
"Odd"
"Mark"

Valid protocol values are as follows

"RS232"
"RS422"
"RS485"

Valid baudRate values are as follows

300
600
1200
1800
2400
3600
4800
7200
9600
14400
19200
28800
38400
57600
115200

Valid dataBits values are as follows

7
8

Valid softwareHandshake values are as follows

"None"
"XON"
"XONT"
"XONR"

Valid stopBits values are as follows

1
2

Additionally, a control object for a physical hardware port needs to map to that physical port. This is accomplished by utilizing the controlPortDevKey and port properties.

controlPortDevKey

This property maps to the key of the device upon which the port resides.

port

This property maps to the number of the port on the device you have mapped the relay device to. Even if the device has only a single port, port must be defined.

TcpSshParams

A Ssh, TcpIp, or Udp device requires a tcpSshProperties object to set the propeties of the socket.

{
    "tcpSshProperties": {
        "address": "192.168.1.57",
        "port": 22,
        "username": "",
        "password": "",
        "autoReconnect": true,
        "autoReconnectIntervalMs": 10000
    }
}

address

This is the IP address, hostname, or FQDN of the resource you wish to open a socket to. In the case of a UDP device, you can set either a single whitelist address with this data, or an appropriate broadcast address.

port

This is the port you wish to utilize for the socket connection. Certain protocols require certain ports - Ssh being 22 and Telnet being 23.

username

This is the username (if required) for authentication to the device you are connecting to. Typcally only required for Ssh connections.

password

This is the password (if required) for authentication to the device you are connecting to. Typcally only required for Ssh connections.

autoreconnect

This is a boolean value, therefore it is a case-sensitive true or false utilized to determine if the socket will attempt to reconnect upon loss of connection.

autoReconnectIntervalMs

This is the duration of time, in Miliseconds, that the socket will wait before discrete connection attempts if autoreconnect is set to true.

The JoinMap

The join map for a generic comms device is fairly simple.

namespace PepperDash.Essentials.Core.Bridges
{
    public class IBasicCommunicationJoinMap : JoinMapBaseAdvanced
    {
        [JoinName("TextReceived")]
        public JoinDataComplete TextReceived = new JoinDataComplete(new JoinData() { JoinNumber = 1, JoinSpan = 1 },
            new JoinMetadata() { Label = "Text Received From Remote Device", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });

        [JoinName("SendText")]
        public JoinDataComplete SendText = new JoinDataComplete(new JoinData() { JoinNumber = 1, JoinSpan = 1 },
            new JoinMetadata() { Label = "Text Sent To Remote Device", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Serial });

        [JoinName("SetPortConfig")]
        public JoinDataComplete SetPortConfig = new JoinDataComplete(new JoinData() { JoinNumber = 2, JoinSpan = 1 },
            new JoinMetadata() { Label = "Set Port Config", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Serial });

        [JoinName("Connect")]
        public JoinDataComplete Connect = new JoinDataComplete(new JoinData() { JoinNumber = 1, JoinSpan = 1 },
            new JoinMetadata() { Label = "Connect", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });

        [JoinName("Connected")]
        public JoinDataComplete Connected = new JoinDataComplete(new JoinData() { JoinNumber = 1, JoinSpan = 1 },
            new JoinMetadata() { Label = "Connected", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });

        [JoinName("Status")]
        public JoinDataComplete Status = new JoinDataComplete(new JoinData() { JoinNumber = 1, JoinSpan = 1 },
            new JoinMetadata() { Label = "Status", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });


        public IBasicCommunicationJoinMap(uint joinStart)
            : base(joinStart, typeof(IBasicCommunicationJoinMap))
        {
        }
    }
}

TextReceived is a stream of strings received FROM the connected device.

SendText is for any strings you wish to send TO the connected device.

Connect connects to a remote socket device on the rising edge of the signal.

Connected represents the current connection state. High for Connected, low for Disconnected.

Status is an analog value that is representative of the connection states as reported by the SIMPL TCP/IP socket symbol.

All of the preceeding joins are set to join 1. The second serial input join is reserved for 2. It allows you to send a comparams json object as a string, utilizing the same format mentioned previously in this document. Doing so will override the configured comport specifications.