PepperDash.Essentials.Plugin.BiampTesira 2.5.2-hotfix-98

This is a prerelease version of PepperDash.Essentials.Plugin.BiampTesira.
There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package PepperDash.Essentials.Plugin.BiampTesira --version 2.5.2-hotfix-98                
NuGet\Install-Package PepperDash.Essentials.Plugin.BiampTesira -Version 2.5.2-hotfix-98                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="PepperDash.Essentials.Plugin.BiampTesira" Version="2.5.2-hotfix-98" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add PepperDash.Essentials.Plugin.BiampTesira --version 2.5.2-hotfix-98                
#r "nuget: PepperDash.Essentials.Plugin.BiampTesira, 2.5.2-hotfix-98"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install PepperDash.Essentials.Plugin.BiampTesira as a Cake Addin
#addin nuget:?package=PepperDash.Essentials.Plugin.BiampTesira&version=2.5.2-hotfix-98&prerelease

// Install PepperDash.Essentials.Plugin.BiampTesira as a Cake Tool
#tool nuget:?package=PepperDash.Essentials.Plugin.BiampTesira&version=2.5.2-hotfix-98&prerelease                

3Series Tested 4Series-Tested

Tesira DSP Essentials Plugin (c) 2023

NOTE : INVALID TAGS BREAK THIS RELEASE

License

Provided under MIT license

Overview

The Tesira plugin provides device control over the Biamp Tesira family of DSPs with regards to the most commonly used and requested attriute and control types.

Compatibility

This plugin has been tested with both Crestron 3-Series and 4-Series processors. It implements all available essentials interfaces relevant to a device of this type. This includes but is not limited to AudioCodecBase, IHasDspPresets, IBasicVolumeWithFeedback, IRoutingWithFeedback and IDeviceInfoProvider. Documentation for which controls implement each interface will be documented in each relevant controls section. Additionally, every component implements IKeyed and all devices are added to the DeviceManager unpon instantiation.

Cloning Instructions

After forking this repository into your own GitHub space, you can create a new repository using this one as the template. Then you must install the necessary dependencies as indicated below.

Dependencies

The Essentials libraries are required. They referenced via nuget. You must have nuget.exe installed and in the PATH environment variable to use the following command. Nuget.exe is available at nuget.org.

Installing Dependencies

To install dependencies once nuget.exe is installed, run the following command from the root directory of your repository: nuget install .\packages.config -OutputDirectory .\packages -excludeVersion. To verify that the packages installed correctly, open the plugin solution in your repo and make sure that all references are found, then try and build it.

Feature Notes

Version 2.0.0+ now offers developers the opportunity to individually bridge each control rather than the entire DSP object. This should lead to more flexibility in development. In documentation below, all references to the original object type will be referred to as Legacy, while new object data will be referred to as Standalone

When utilizing a standalone object within a Eisc bridge, it is addressed utilizing first the name of the base device, followed by a pair of two hyphens, then the key of the component.

It is exceptionally important that all keys are unique. In a future version, it's likely that this naming convention will become more verbose, but as of now, to prevent key names from being ridiculously long, I've opted to trust users to police themselves.

For a parent device with a key of dsp-1 and a component with the key of Fader01, the Standalone component key is dsp-1--Fader01.

The only exception to this rule is for the Base Standalone object, which has a key suffix of DeviceInfo

Important to note this version of the plugin currently implements both eiscApi and EiscApiAdvanced as valid bridge types

"type": "eiscApiAdvanced"

Installation

This plugin is provided as a published nuget package for your convenience.

Place the *.cplz file in the /users/programxx/plugins folder, and restart your program.


Controls and Configs

DeviceInfo

This object is built by default with a Biamp Tesira DSP and provides a method to send hardware-specific data across the bridge to SIMPL

This data is only accessible by linking the device to the bridge. The component key is always DeviceInfo - therefore when a Biamp Tesira DSP with the key dsp-1 is instantiated, a DeviceInfo component with the key of dsp-1--DeviceInfo will be added to the DeviceManager and will be accessible to any Essentials Bridge.

This device will also allow a direct passthru connection to the device if necessary and a method by which to trigger control resubscription.

If you do not choose to bridge a Standalone object, limited data is available on the Legacy object.

This control implements Essentials interfaces IDeviceInfoProvider and IKeyed

Digitals
Legacy Join Standalone Join Type (RW) Description
1 1 R Device Online
N/A 1 W Resubscribe Controls
Analogs

None

Serials
Legacy Join Standalone Join Type (RW) Description
N/A 1 R Device Name
N/A 2 RW Command Passthrough
N/A 3 R Serial Number
N/A 4 R Firmware Version
N/A 5 R Hostname
N/A 6 R IP Address
N/A 7 R MAC Address
Config Notes

This configuration matches a standard essentials device configuration at the base level, with only the type being different. This may have the type tesira, tesiraforte, tesiraserver, tesiradsp, or tesira-dsp.

"key": "TesiraDsp-1",
    "name": "TesiraDspTesting",
    "type": "tesiraDsp",
    "group": "dsp",
    "properties": {
        "control": {
            "endOfLineString": "\n",
            "deviceReadyResponsePattern": "",
            "method": "ssh",
            "tcpSshProperties": {
                "address": "10.11.50.191",
                "port": 22,
                "autoReconnect": true,
                "AutoReconnectIntervalMs": 10000,
                "username": "default",
                "password": "default"
            }
        }
    }
}

Level / Mute

Controls objects with the attribute type of "level" or "mute" and subscribes to them as necessary.

This component only reports the level of the audio signal relative the the adjustable range

Within the Legacy object, this Join map represents a control that is part of an array of controls. Each join number = Join Map Number + fader bridgeIndex as defined by the config.

Within the Standalone object, this join map represents a single control as defined by the key in the bridge.

This Control implements Essentials interfaces IKeyed and IBasicVolumeWithFeedback

Digitals
Legacy Join Standalone Join Type (RW) Description
200 6 R Channel Visible
400 5 RW Mute Toggle
600 3 RW Mute On
800 4 RW Mute Off
1000 1 W Volume Up
1200 2 W Volume Down
Analogs
Legacy Join Standalone Join Type (RW) Description
200 1 RW Volume Level
400 2 R Icon (0 - Level, 1 - Mic)
600 3 R ControlType (0 Mute/Level, 1 LevelOnly, 2 MuteOnly)
800 4 R Permissions (Pass From Config)
Serials
Legacy Join Standalone Join Type (RW) Description
200 1 R Control Label (Pass From Config)
Config Example

All Level/Mute configs must be part of a dictionary called faderControlBlocks.

"faderControlBlocks": {
    "LevelControl01": {
        "enabled": true,
        "isMic": false,
        "hasLevel": true,
        "hasMute": true,
        "index1" : 1,
        "index2" : 0,
        "label": "Room",
        "levelInstanceTag": "ROOMVOL",
        "muteInstanceTag": "ROOMVOL",
        "unmuteOnVolChange" : true,
        "incrementAmount" : "2.0",
        "permissions" : 0,
        "bridgeIndex" : 1
    }
Config Notes

enabled - enables the control to be subscribed and controlled. label - Passed directly across the eisc as the Label value. isMic - drives the icon feedback. hasLevel - in conjunction with hasMute, sets the ControlType. hasMute - in conjunction with hasStatus, sets the ControlType. index1 - Index 1 of the control point. index2 - Index 2 of the control point. levelInstanceTag - Instance tag of the level control. muteInstanceTag - Instance tag of the mute control. unmuteOnVolChange - if true, will unmute a muted control when the level increases. incrementAmount - the value in decimals by which a mute increment or decrement command will manipulate the level. permissions - Passed directly across the eisc as the Permissions value. bridgeIndex - The index of the control on a Legacy object

In the provided example config object, given a base object key of dsp-1, this control would have a standalone key of dsp-1--LevelControl01.


Switcher

Note - Version 2.5.0 added the ability to configure SourceSelectors and Routers as different objects. It is recommended to use this mechanism in new projects.

Controls objects with the attribute type of sourceSelection and subscribes to them as necessary; input is not subscribed to.

Within the Legacy object, this Join map represents a control that is part of an array of controls. Each join number = Join Map Number + fader bridgeIndex as defined by the config.

Within the Standalone object, this join map represents a single control as defined by the key in the bridge.

This control implements Essentials interfaces IKeyed and IRoutingWithFeedback

Digitals
Legacy Join Standalone Join Type (RW) Description
150 1 W Poll
Analogs
Legacy Join Standalone Join Type (RW) Description
150 1 RW Source Selection
Serials
Legacy Join Standalone Join Type (RW) Description
150 1 R Control Label (Pass From Config)
N/A 2 R Source List XSIG (If Configured) or Routed Source
Config Example

All sourceSelector and router configs must be part of a dictionary called switcherControlBlocks. Router configs require that the "type" be set to "router"

"switcherControlBlocks" : {
    "SwitcherControl01" : {
        "enabled" : true,
        "label" : "switcher01",
        "index1" : 1
        "switcherInstanceTag" : "SourceSelector1",
        "type": "router",
        "bridgeIndex" : 1,
        "showRoutedStringFeedback": true,
        "pollIntervalMs" : 90000,
        "switcherInputs" : {
            "1" : {"label": "Input1" },
            "2" : {"label": "Input2" },
        },
        "switcherOutputs" : {
            "1" : { "label": "Output1" },
            "2" : { "label": "Output2" },
        }
    }
}
Config Notes

enabled - enables the control to be subscribed and controlled. label - Passed directly across the eisc as the Label value. index1 - Index 1 of the control point. type - Valid Types are sourceSelector or router switcherInstanceTag - Instance tag of the sourceSelection control bridgeIndex - The index of the control on a Legacy object switcherInputs - This is a dictionary of labels for inputs of the switcher. The keys must be integers. switcherOutputs - This is a dictionary of labels for outputs of the switcher. This is earmarked for future usage. The keys must be integers.

In the provided example config object, given a base object key of dsp-1, this control would have a standalone key of dsp-1--SwitcherControl01.


Router

Controls objects with the attribute type of input. No Subscriptions available on this control block

Within the Legacy object, this Join map represents a control that is part of an array of controls. Each join number = Join Map Number + fader bridgeIndex as defined by the config.

Within the Standalone object, this join map represents a single control as defined by the key in the bridge.

This control implements Essentials interfaces IKeyed and IRoutingWithFeedback

Digitals
Legacy Join Standalone Join Type (RW) Description
150 1 W Poll
Analogs
Legacy Join Standalone Join Type (RW) Description
150 1 RW Source Selection
Serials
Legacy Join Standalone Join Type (RW) Description
150 1 R Control Label (Pass From Config)
N/A 2 R Source List XSIG (If Configured) or Routed Source
Config Example

All sourceSelector and router configs must be part of a dictionary called routerControlBlocks.

"routerControlBlocks" : {
    "RouterControl01" : {
        "enabled" : true,
        "label" : "switcher01",
        "index1" : 1
        "routerInstanceTag" : "Router1",
        "bridgeIndex" : 1,
        "showRoutedStringFeedback": true,
        "pollIntervalMs" : 90000,
        "routerInputs" : {
            "1" : {"label": "Input1" },
            "2" : {"label": "Input2" },
        },
        "routerOutput" : {
            "label": "Output1" }
        }
    }
}
Config Notes

enabled - enables the control to be subscribed and controlled. label - Passed directly across the eisc as the Label value. index1 - Index of the output number on the router that you wish to control. routerInstanceTag - Instance tag of the router input selection control bridgeIndex - The index of the control on a Legacy object routerInputs - This is a dictionary of labels for inputs of the router block. The keys must be integers. routerOutput - This is an object defining the label of the associated output. This is earmarked for future usage.

In the provided example config object, given a base object key of dsp-1, this control would have a standalone key of dsp-1--RouterControl01.


SourceSelector

Controls and subscribes to objects with the attribute type of sourceSelector.

Within the Legacy object, this Join map represents a control that is part of an array of controls. Each join number = Join Map Number + fader bridgeIndex as defined by the config.

Within the Standalone object, this join map represents a single control as defined by the key in the bridge.

This control implements Essentials interfaces IKeyed and IRoutingWithFeedback

Digitals
Legacy Join Standalone Join Type (RW) Description
150 1 W Poll
Analogs
Legacy Join Standalone Join Type (RW) Description
150 1 RW Source Selection
Serials
Legacy Join Standalone Join Type (RW) Description
150 1 R Control Label (Pass From Config)
N/A 2 R Source List XSIG (If Configured) or Routed Source
Config Example

All sourceSelector and router configs must be part of a dictionary called routerControlBlocks.

"sourceSelectorControlBlocks" : {
    "sourceSelectorControl01" : {
        "enabled" : true,
        "label" : "sourceSelector01",
        "index1" : 1
        "sourceSelectorInstanceTag" : "SourceSelector1",
        "bridgeIndex" : 1,
        "showRoutedStringFeedback": true,
        "pollIntervalMs" : 90000,
        "sourceSelectorInputs" : {
            "1" : {"label": "Input1" },
            "2" : {"label": "Input2" },
        }
    }
}
Config Notes

enabled - enables the control to be subscribed and controlled. label - Passed directly across the eisc as the Label value. index1 - Index of the output number on the sourceSelector that you wish to control. sourceSelectorInstanceTag - Instance tag of the sourceSelection control bridgeIndex - The index of the control on a Legacy object sourceSelectorInputs - This is a dictionary of labels for inputs of the source selector block. The keys must be integers.

In the provided example config object, given a base object key of dsp-1, this control would have a standalone key of dsp-1--sourceSelectorControl01.


State

Controls objects with the attribute type of "state" and subscribes to them as necessary.

Within the Legacy object, this Join map represents a control that is part of an array of controls. Each join number = Join Map Number + fader bridgeIndex as defined by the config.

Within the Standalone object, this join map represents a single control as defined by the key in the bridge.

This control implements Essentials interface IKeyed

Digitals
Legacy Join Standalone Join Type (RW) Description
1300 1 RW State Toggle
1450 2 RW State On
1600 3 RW State Off
Analogs

None

Serials
Legacy Join Standalone Join Type (RW) Description
1300 1 R Control Label (Pass From Config)
Config Example

All state configs must be part of a dictionary called stateControlBlocks.

"stateControlBlocks" : {
    "StateControl1" : {
        "enabled" : true,
        "label" : "State01",
        "stateInstanceTag" : "LogicState1",
        "subscriptionInstanceTag" : "LogicMeter1",
        "index" : 1,
        "bridgeIndex" : 1
    }
}

In the provided example config object, given a base object key of dsp-1, this control would have a standalone key of dsp-1--StateControl1.

Config Notes

enabled - enables the control to be subscribed and controlled. label - Passed directly across the eisc as the Label value. index - Index of the control point. stateInstanceTag - Instance tag of the state control subscriptionInstanceTag - (Optional) Instance tag of the meter control for subscribing to feedback. If null or empty, will attempt to subscribe to stateInstanceTag bridgeIndex - The index of the control on a Legacy object


Presets

If you intend to ONLY do direct preset calling by string, this object is NOT required to recall presets. This activity is provided by the base level device object for the Tesira DSP. It is also provided by the Standalone object Presets. This config object is required regardless of control object if preset control iby index is required.

This control implements Essentials interfaces IHasDspPreset and IKeyed

Digitals
Legacy Join Standalone Join Type (RW) Description
100 1 W Select Preset By Index
N/A 1 R Preset is Available By Index
Analogs

None

Serials
Legacy Join Join Type (RW) Description
100 1 R Preset Name by Index
100 1 W Recall Preset By Name
Config Example

All preset configs must be part of a dictionary called presets.

"presets" : {
    "SomeUniqueKey": {
        "label" : "Default",
        "presetName" : "Default Levels",
        "presetId" : 1101,
        "presetIndex" : 1
        }
}

In the provided example config object, given a base object key of dsp-1, this control would have a standalone key of dsp-1--Presets.

Config Notes

label - Passed directly across the eisc as the Label value. presetName - the actual name of the preset as defined in biamp software presetID - the ID of the preset as defined in biamp software presetIndex - the index of the preset for the digital press recall

If a presetName is defined, you don't need a presetId and vice versa. One or the other will be fine. If you are utilizing the "select preset by name" methodology, no presets need be defined in config.


Dialer

VoIP Controls are tested

POTS Controls are added, but as of yet untested.

DTMF is automatically managed based on current hook state.

Within the Legacy object, this Join map represents a control that is part of an array of controls. Each join number = Join Map Number + (1 + (50 * (n- 1))), where n is the index of the dialer as defined by bridgeIndex.

For example, Incoming Call for Line 1 would be at join 3101, while the incoming call for Line 2 would be at join 3151.

Within the Standalone object, this join map represents a single control as defined by the key in the bridge.

This control implements Essentials interfaces AudioCodecBase and IKeyed

Digitals
Legacy Join Standalone Join Type (RW) Description
3100 1 R Incoming Call
3106 2 W Answer
3107 3 W End Call
3110 4 W Keypad 0
3111 5 W Keypad 1
3112 6 W Keypad 2
3113 7 W Keypad 3
3114 8 W Keypad 4
3115 9 W Keypad 5
3116 10 W Keypad 6
3117 11 W Keypad 7
3118 12 W Keypad 8
3119 13 W Keypad 9
3120 14 W Keypad *
3121 15 W Keypad #
3122 16 W Keypad Clear
3123 17 W Keypad Backspace
3124 18 RW Dial
3125 19 RW Auto Answer On
3126 20 RW Auto Answer Off
3127 21 RW Auto Answer Toggle
3129 22 RW On Hook
3130 23 RW Off Hook
3132 24 RW Do Not Disturb Toggle
3133 25 RW Do Not Disturb On
3134 26 RW Do Not Disturb Off
Analogs
Legacy Join Standalone Join Type (RW) Description
3100 1 R CallState Value
Serials
Legacy Join Standalone Join Type (RW) Description
3100 1 RW Dial String
3101 2 RW Dialer Label
3102 3 RW Last Number Dialed
3104 4 R Caller ID Number
3105 5 R Caller ID Name
Config Example

All dialer configs must be part of a dictionary called dialerControlBlocks.

"dialerControlBlocks" : {
    "Dialer1" : {
        "enabled" : true,
        "label" : "Dialer 01",
        "isVoip" : true,
        "dialerInstanceTag" : "Dialer1",
        "controlStatusInstanceTag" : "VoIPControlStatus1",
        "index" : 1,
        "callAppearance" : 1,
        "clearOnHangup" : true,
        "appendDtmf" : false,
        "bridgeIndex" : 1
    }
}

In the provided example config object, given a base object key of dsp-1, this control would have a standalone key of dsp-1--Dialer1.

Config Notes

enabled - enables the control to be subscribed and controlled. label - Passed directly across the eisc as the Label value. index - Index of the line you wish to manage. dialerInstanceTag - Instance tag of the dialer control controlStatusInstanceTag - Instance tag of the controlStatus control isVoip - sets the device type to VoIP for internal configuration. callAppearance - the index of the call appearance you wish to contorl in a VoIP line. clearOnHangup - if true will clear the Dial String whenever the line goes on hook. appendDtmf - if true will append DTMF digit presses to Dial String bridgeIndex - The index of the control on a Legacy object


Meter

Enables metering on the sepecified meter.
Using this is a bad idea, please avoid unless specifically requested.

Within the Legacy object this Join map represents a control that is part of an array of controls. Each join number = Join Map Number + bridgeIndex as defined by the config.

Within the Standalone object, this join map represents a single control as defined by the key in the bridge.

This control implements Essentials interface IKeyed

Digitals
Legacy Join Standalone Join Type (RW) Description
3501 1 RW Meter Toggle
Analogs
Legacy Join Standalone Join Type (RW) Description
3501 1 R Meter Feedback
Serials
Legacy Join Standalone Join Type (RW) Description
3501 1 R Control Label (Pass From Config)
Config Example

All state configs must be part of a dictionary called meterControlBlocks.

"meterControlBlocks" : {
    "Meter1" : {
        "enabled" : true,
        "label" : "State01",
        "meterInstanceTag" : "Meter1",
        "index" : 1,
        "bridgeIndex" : 1
    }
}

In the provided example config object, given a base object key of dsp-1, this control would have a standalone key of dsp-1--Meter1.

Config Notes

enabled - enables the control to be subscribed and controlled. label - Passed directly across the eisc as the Label value. meterInstanceTag - Instance tag of the meter control index - Index of the control point. bridgeIndex - The index of the control on a Legacy object


Crosspoint State Control

Provides a control point for a single crosspoint on a MatrixMixer.

This Join map represents a control that is part of an array of controls. Each join number = Join Map Number + State Index as defined by the config.

This control implements Essentials interface IKeyed

Digitals
Legacy Join Standalone Join Type (RW) Description
2001 1 RW Crosspoint Toggle
2002 2 W Crosspoint On
2003 3 W Crosspoint Off
Analogs

None

Serials
Legacy Join Standalone Join Type (RW) Description
2001 1 R Control Label (Pass From Config)
Config Example

All state configs must be part of a dictionary called crosspointStateControlBlocks.

"crosspointStateControlBlocks" : {
    "Crosspoint1" : {
        "enabled" : true,
        "label" : "Crosspoint1-2",
        "matrixInstanceTag" : "Meter1",
        "index1" : 1,
        "index2" : 2,
        "bridgeIndex" : 1
    }
}

In the provided example config object, given a base object key of dsp-1, this control would have a standalone key of dsp-1--Crosspoint1.

Config Notes

enabled - enables the control to be subscribed and controlled
label - Passed directly across the eisc as the Label value
index1 - Input of the crosspoint to be controlled
index2 - Output of the crosspoint to be controlled
stateInstanceTag - Instance tag of the meter block
bridgeIndex - The index of the control on a Legacy object


RoomCombiner

Controls Biamp Tesira RoomCombiner objects. Control of LevelOut, MuteOut, and group selection is supported.

MuteOut is not a subscribed control for this block. Polling is simulated on each trigger of the mute, but there is no unsolicited feedback for mute status.

In order to keep the types of joins similar to a standard fader object, the choice was made to not provide direct control for wall states in this component. If direct wall state control is required, utilize a State Control block.

Within the Legacy object, this Join map represents a control that is part of an array of controls. Each join number = Join Map Number + roomCombiner bridgeIndex as defined by the config.

Within the Standalone object, this join map represents a single control as defined by the key in the bridge.

This control implements Essentials interfaces IBasicVolumeWithFeedback and IKeyed

Digitals
Legacy Join Standalone Join Type (RW) Description
2206 6 R Channel Visible
2203 5 RW Mute Toggle
2204 3 RW Mute On
2205 4 RW Mute Off
2201 1 W Volume Up
2202 2 W Volume Down
Analogs
Legacy Join Standalone Join Type (RW) Description
2201 1 RW Volume Level
2202 2 R Icon (0 - Level, 1 - Mic)
2204 3 RW Set/Get the Combine Group Number for Room Combination
2203 4 R Permissions (Pass From Config)
Serials
Legacy Join Standalone Join Type (RW) Description
2201 1 R Control Label (Pass From Config)
Config Example

All RoomCombiner configs must be part of a dictionary called roomCombinerControlBlocks.

"roomCombinerControlBlocks": {
    "Room01": {
        "enabled": true,
        "label": "Room 1",
        "isMic": false,
        "roomIndex" : 1,
        "roomCombinerInstanceTag": "RoomCombiner1",
        "unmuteOnVolChange" : true,
        "incrementAmount" : "2.0",
        "permissions" : 0,
        "bridgeIndex" : 1
    }
Config Notes

enabled - enables the control to be subscribed and controlled. label - Passed directly across the eisc as the Label value. isMic - drives the icon feedback. roomIndex - Index of the room on the combiner block. roomCombinerInstanceTag - Instance tag of the room combiner control. unmuteOnVolChange - if true, will unmute a muted control when the level increases. incrementAmount - the value in decimals by which a mute increment or decrement command will manipulate the level. permissions - Passed directly across the eisc as the Permissions value. bridgeIndex - The index of the control on a Legacy object

In the provided example config object, given a base object key of dsp-1, this control would have a standalone key of dsp-1--Room01.


Tesira Expanders

Provides status updates for tesira expander devices related to health and device properties

Tesira Expander block is not supported in the Legacy bridge API. In order to utilize this control, one must directly bridge the control using the key <dspKey>--Expanders

Within the Standalone object, this join map represents each element in a list of Expander Devices

Digitals
Legacy Join Standalone Join Type (RW) Description
N/A 1 R Device Online
Analogs
Legacy Join Standalone Join Type (RW) Description
N/A N/A N/A N/A
Serials
Legacy Join Standalone Join Type (RW) Description
N/A 1 R Expander Hostname
N/A 2 R Expander Serial Number
N/A 3 R Expander Firmware
N/A 4 R Expaner MAC Address
Config Example

All Tesira Expander config objects must be part of a dictionary called tesiraExpanderBlocks.

"tesiraExpanderBlocks": {
    "Expander01": {
        "hostname" : "MIC-01"
        "index" : 1
    },
    "Expander02": {
        "hostname" : "AMP-01"
        "index" : 2
    }
}
Config Notes

hostname - The hostname of the expander to be tracked. This value must match the configured expander index - The index within the bridged control where this device ins mapped. The joinmap of a device is equal to the join multipled by the index

In the provided example config object, given a base object key of dsp-1, this control would have a standalone key of dsp-1--Expanders.


Full Example Essentials Device Config

This config will create an internal loopback EISC on IPID D1 for a ssh-controlled tesira.

{
    "system": {},
    "system_url": "http://portal-QA.devcloud.pepperdash.com/templates/0f50640b-bc89-42d5-998f-81d137d3fc98#/template_summary",
    "template": {
        "devices": [
            {
                "key": "processor",
                "uid": 0,
                "type": "rmc3",
                "name": "RMC3",
                "group": "processor",
                "supportedConfigModes": [
                    "compliance",
                    "essentials"
                ],
                "supportedSystemTypes": [
                    "hudType",
                    "presType",
                    "vtcType",
                    "custom"
                ],
                "supportsCompliance": true,
                "properties": {}
            },
            {
                "key": "TesiraDsp-1",
                "name": "TesiraDspTesting",
                "type": "tesiraDsp",
                "group": "dsp",
                "properties": {
                    "control": {
                        "endOfLineString": "\n",
                        "deviceReadyResponsePattern": "",
                        "method": "ssh",
                        "tcpSshProperties": {
                            "address": "10.11.50.191",
                            "port": 22,
                            "autoReconnect": true,
                            "AutoReconnectIntervalMs": 10000,
                            "username": "default",
                            "password": "default"
                        }
                    },
                    "faderControlBlocks": {
                        "Fader1": {
                            "enabled": true,
                            "isMic": false,
                            "hasLevel": true,
                            "hasMute": true,
                            "index1" : 1,
                            "index2" : 0,
                            "label": "Room",
                            "levelInstanceTag": "ROOMVOL",
                            "muteInstanceTag": "ROOMVOL",
                            "unmuteOnVolChange" : true,
                            "incrementAmount" : "2.0",
                            "permissions" : 0,
                            "bridgeIndex" : 1

                        },
                        "Fader2": {
                            "enabled": true,
                            "isMic": false,
                            "hasLevel": true,
                            "hasMute": true,
                            "index1" : 1,
                            "index2" : 0,
                            "label": "VTC",
                            "levelInstanceTag": "VTCRXVOL",
                            "muteInstanceTag": "VTCRXVOL",
                            "unmuteOnVolChange" : true,
                            "incrementAmount" : "2.0"
                            "permissions" : 1,
                            "bridgeIndex" : 2
                        },
                        "Fader3": {
                            "enabled": true,
                            "isMic": false,
                            "hasLevel": true,
                            "hasMute": true,
                            "index1" : 1,
                            "index2" : 0,
                            "label": "ATC",
                            "levelInstanceTag": "ATCRXVOL",
                            "muteInstanceTag": "ATCRXVOL",
                            "unmuteOnVolChange" : true,
                            "incrementAmount" : "2.0"
                            "permissions" : 2,
                            "bridgeIndex" : 3
                        },
                        "Fader4": {
                            "enabled": true,
                            "isMic": false,
                            "hasLevel": true,
                            "hasMute": true,
                            "index1" : 1,
                            "index2" : 0,
                            "label": "PGM",
                            "levelInstanceTag": "PGMVOL",
                            "muteInstanceTag": "PGMVOL",
                            "unmuteOnVolChange" : true,
                            "incrementAmount" : "2.0"
                            "permissions" : 0,
                            "bridgeIndex" : 4
                        }
                    },
                    "dialerControlBlocks" : {
                        "Dialer1" : {
                            "enabled" : true,
                            "label" : "Dialer 1",
                            "isVoip" : true,
                            "dialerInstanceTag" : "Dialer1",
                            "controlStatusInstanceTag" : "VoIPControlStatus1",
                            "index" : 1,
                            "callAppearance" : 1,
                            "clearOnHangup" : true,
                            "appendDtmf" : false
                            "bridgeIndex" : 1
                        }
                    },
                    "stateControlBlocks" : {
                        "State1" : {
                            "enabled" : true,
                            "label" : "State01",
                            "stateInstanceTag" : "LogicState1",
                            "index" : 1,
                            "bridgeIndex" : 1
                        },
                        "State2" : {
                            "enabled" : true,
                            "label" : "State02",
                            "stateInstanceTag" : "LogicState1",
                            "index" : 2,
                            "bridgeIndex" : 2
                        },
                        "State3" : {
                            "enabled" : true,
                            "label" : "State02",
                            "stateInstanceTag" : "LogicState1",
                            "index" : 3,
                            "bridgeIndex" : 3
                        },
                        "State4" : {
                            "enabled" : true,
                            "label" : "State02",
                            "stateInstanceTag" : "LogicState1",
                            "index" : 4
                            "bridgeIndex" : 4
                        }
                    },
                    "switcherControlBlocks" : {
                        "switcherControl1" : {
                            "enabled" : true,
                            "label" : "switcher01",
                            "switcherInstanceTag" : "SourceSelector1",
                            "index1" : 1,
                            "bridgeIndex" : 1,
                            "switcherInputs" : {
                                "1" : {"label": "Input1" },
                                "2" : {"label": "Input2" },
                            },
                            "switcherOutputs" : {
                                "1" : {"label": "Output1" },
                                "2" : {"label": "Output2" },
                            }
                        }
                    },
                    "crosspointStateControlBlocks" : {
                        "Crosspoint1" : {
                            "enabled" : true,
                            "label" : "Crosspoint1-2",
                            "matrixInstanceTag" : "Meter1",
                            "index1" : 1,
                            "index2" : 2,
                            "bridgeIndex" : 1
                        }
                    },
                    "meterControlBlocks" : {
                        "Meter1" : {
                            "enabled" : true,
                            "label" : "State01",
                            "meterInstanceTag" : "Meter1",
                            "index" : 1,
                            "bridgeIndex" : 1
                        }
                    },
                    "roomCombinerControlBlocks": {
                        "Room01": {
                            "enabled": true,
                            "label": "Room 1",
                            "isMic": false,
                            "roomIndex" : 1,
                            "roomCombinerInstanceTag": "RoomCombiner1",
                            "unmuteOnVolChange" : true,
                            "incrementAmount" : "2.0",
                            "permissions" : 0,
                            "bridgeIndex" : 1
                        }
                     },
                    "presets" : {
                        "1": {
                            "label" : "Default",
                            "preset" : "Default Levels"
                            "presetIndex" : 1  
                        },
                        "2" : {
                            "label" : "High",
                            "Preset" : "Noise Reduction High"
                            "presetIndex" : 2
                        }
                    },
                    "tesiraExpanderBlocks": {
                        "Expander01": {
                            "hostname" : "MIC-01"
                            "index" : 1
                        },
                        "Expander02": {
                            "hostname" : "AMP-01"
                            "index" : 2
                        }
                    }
                }
            },
            {
                "key": "eisc-Dsp",
                "uid": 4,
                "name": "Bridge Dsp",
                "group": "api",
                "type": "eiscApiAdvanced",
                "properties": {
                    "control": {
                        "tcpSshProperties": {
                            "address": "127.0.0.2",
                            "port": 0
                        },
                        "ipid": "D1",
                        "method": "ipidTcp"
                    },
                    "devices": [
                        {
                            "deviceKey": "TesiraDsp-1",
                            "joinStart": 1
                        }
                    ]
                }
            }
        ],
        "info": {
            "comment": "",
            "lastModifiedDate": "2017-03-06T23:14:40.290Z",
            "lastUid": 12,
            "processorType": "Rmc3",
            "requiredControlSofwareVersion": "",
            "systemType": "MPR"
        },
        "rooms": [],
        "tieLines": []
    }
}

RoadMap

A Method by which we can continue even with "bad" instance tags in the config. Currently, this causes everything to fail upon subscription.

Product Compatible and additional computed target framework versions.
.NET Framework net35 is compatible.  net40 was computed.  net403 was computed.  net45 was computed.  net451 was computed.  net452 was computed.  net46 was computed.  net461 was computed.  net462 was computed.  net463 was computed.  net47 is compatible.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
2.5.2-hotfix-99 132 1/19/2024
2.5.2-hotfix-98 115 1/19/2024
2.5.2-hotfix-97 91 1/19/2024
2.5.2-hotfix-95 104 1/19/2024
2.5.2-hotfix-105 93 6/3/2024
2.5.2-hotfix-102 116 4/22/2024
2.5.2-hotfix-101 143 3/4/2024
2.5.2-hotfix-100 115 1/19/2024
2.5.2-feature-4-series.2 57 5/17/2024
2.5.2-alpha-96 101 1/19/2024
2.5.2-alpha-93 135 7/5/2023
2.5.2-alpha-92 147 7/5/2023
2.5.2-alpha-91 127 6/21/2023
2.5.2-alpha-90 128 6/21/2023
2.5.2-alpha-103 108 5/1/2024
2.5.1 308 6/9/2023
2.5.1-hotfix-89 140 6/9/2023
2.5.1-alpha-88 161 6/7/2023
2.5.0 229 5/18/2023
2.4.2-alpha-87 144 5/18/2023
2.4.2-alpha-86 158 5/18/2023
2.4.1 216 5/16/2023
2.4.1-hotfix-85 151 5/16/2023
2.4.0 223 5/16/2023
2.3.5-hotfix-82 157 5/16/2023
2.3.5-hotfix-79 134 5/16/2023
2.3.5-hotfix-73 152 4/26/2023
2.3.5-beta-83 156 5/16/2023
2.3.5-alpha-84 149 5/16/2023
2.3.5-alpha-81 142 5/16/2023
2.3.5-alpha-80 126 5/16/2023
2.3.5-alpha-78 132 5/16/2023
2.3.5-alpha-77 155 5/16/2023
2.3.5-alpha-76 169 5/15/2023
2.3.5-alpha-75 142 5/11/2023
2.3.5-alpha-74 122 5/5/2023
2.3.5-alpha-72 172 4/19/2023
2.3.4 293 4/11/2023
2.3.4-hotfix-71 176 4/11/2023
2.3.4-hotfix-70 172 3/21/2023
2.3.4-hotfix-66 163 3/16/2023
2.3.4-hotfix-65 145 3/15/2023
2.3.4-alpha-69 201 3/16/2023
2.3.4-alpha-68 198 3/16/2023
2.3.4-alpha-67 207 3/16/2023
2.3.3 287 3/15/2023
2.3.3-hotfix-64 184 3/14/2023
2.3.3-hotfix-63 163 3/14/2023
2.3.2 334 2/28/2023
2.3.1 304 2/21/2023
2.3.1-hotfix-62 139 2/20/2023
2.3.0 328 2/17/2023
2.2.2-hotfix-58 157 2/9/2023
2.2.2-alpha-61 155 2/17/2023
2.2.2-alpha-60 182 2/17/2023
2.2.2-alpha-59 156 2/17/2023
2.2.2-alpha-57 172 2/4/2023
2.2.1 383 1/26/2023
2.2.1-alpha-56 195 1/26/2023
2.2.1-alpha-55 194 1/23/2023
2.2.0 374 1/16/2023
2.1.2-hotfix-48 176 9/21/2022
2.1.2-hotfix-47 173 9/19/2022
2.1.2-hotfix-46 170 9/10/2022
2.1.2-hotfix-45 174 8/28/2022
2.1.2-alpha-54 156 1/13/2023
2.1.2-alpha-53 184 1/13/2023
2.1.2-alpha-52 177 1/13/2023
2.1.2-alpha-51 161 12/21/2022
2.1.2-alpha-50 197 9/22/2022
2.1.2-alpha-49 175 9/22/2022
2.1.1 560 7/19/2022
2.1.0 506 7/19/2022
2.0.12-hotfix-38 212 4/29/2022
2.0.12-alpha-44 188 7/18/2022
2.0.12-alpha-37 190 4/13/2022
2.0.11 546 3/4/2022
2.0.11-hotfix-33 174 2/21/2022
2.0.11-beta-34 182 3/4/2022
2.0.11-alpha-36 195 3/4/2022
2.0.10 382 12/16/2021
2.0.10-hotfix-26 249 10/21/2021
2.0.10-alpha-29 201 12/7/2021
2.0.10-alpha-28 245 12/6/2021
2.0.10-alpha-27 207 12/6/2021
2.0.10-alpha-25 294 10/20/2021
2.0.9 455 9/29/2021
2.0.9-hotfix-24 269 9/28/2021
2.0.9-alpha-23 227 8/9/2021
2.0.8 462 7/12/2021
2.0.8-alpha-22 261 7/12/2021
2.0.8-alpha-21 285 6/25/2021
2.0.8-alpha-20 256 6/25/2021
2.0.8-alpha-19 247 6/15/2021
2.0.8-alpha-18 323 6/11/2021
2.0.7 393 5/20/2021
2.0.7-alpha-17 311 5/14/2021
2.0.7-alpha-16 207 5/14/2021
2.0.7-alpha-15 194 5/14/2021
2.0.7-alpha-12 220 5/13/2021
2.0.7-alpha-11 213 5/12/2021
2.0.7-alpha-10 279 5/12/2021
2.0.6 385 5/11/2021
2.0.6-alpha-7 223 5/11/2021
2.0.6-alpha-6 224 5/11/2021
2.0.5 398 4/16/2021
2.0.5-alpha-5 214 4/14/2021
2.0.2-beta-47 448 11/2/2020
2.0.2-beta-42 515 10/23/2020
2.0.2-beta-31 429 9/17/2020
2.0.2-alpha-46 530 10/30/2020
2.0.2-alpha-45 355 10/27/2020
2.0.2-alpha-44 432 10/26/2020
2.0.2-alpha-43 380 10/26/2020
2.0.2-alpha-41 424 10/23/2020
2.0.2-alpha-40 479 10/23/2020
2.0.2-alpha-39 370 10/12/2020
2.0.2-alpha-38 397 10/12/2020
2.0.2-alpha-33 390 9/18/2020
2.0.2-alpha-29 378 9/17/2020