From 4c929db053c911fd4ad6e6aa39a88e7636fba560 Mon Sep 17 00:00:00 2001 From: jdevito Date: Thu, 21 Apr 2022 09:31:23 -0500 Subject: [PATCH 1/5] Update README.md Updated main branch readme --- README.md | 344 ++++++++++++++++++++---------------------------------- 1 file changed, 124 insertions(+), 220 deletions(-) diff --git a/README.md b/README.md index 4ee19ac..ea1e7eb 100644 --- a/README.md +++ b/README.md @@ -1,104 +1,10 @@ -# Internal Essentials Plugin Template (c) 2020 +![PepperDash Logo](/images/logo_pdt_no_tagline_600.png) -## License - -Provided under MIT license - -## Overview - -Use this repo as a template when creating a new plugin for Essentials. For more information about plugins, refer to the Essentials Wiki [Plugins](https://github.com/PepperDash/Essentials/wiki/Plugins) article. - -## 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. It is recommended to use [Scoop](https://scoop.sh/) to install nuget using the command: - -``` -scoop install nuget -``` - -### Manually Installing Dependencies - -To install dependencies once nuget.exe is installed, after cloning the template or creating your template repo, run the following command: - -``` -nuget install .\packages.config -OutputDirectory .\packages -excludeVersion -``` - -Verify you are using the proper "\\" or "/" per the console used. To verify that the packages installed correctly, open Essentials and make sure that all references are found, then try and build it. **This issue will be found when using WSL on Windows10.** - -Once the nuget package has been installed locally you will need to update your project references. -1. Right click on **References** -2. Select **Add Reference** -3. Browse to the **packages** folder -4. Select the required references. - -### Installing Different versions of PepperDash Essentials - -If you need a different version of PepperDash Essentials, use the command: -``` -nuget install PepperDashEssentials -OutputDirectory .\packages -excludeVersion -Version {versionToGet} -``` - -Omitting the **-Version** option will pull the latest version available. - -## Github Actions - -Github Action workflow Templates will build this project automatically. Any branches named `feature/*`, `release/*`, `hotfix/*` or `development` will automatically be built with the action and create a release in the repository with a version number based on the latest release on the main branch. If there are no releases yet, the version number will be 0.0.1. The version number will be modified based on what branch triggered the build: - -- `feature` branch builds will be tagged with an `alpha` descriptor, with the Action run appended: `0.0.1-alpha-1` -- `development` branch builds will be tagged with a `beta` descriptor, with the Action run appended: `0.0.1-beta-2` -- `release` branches will be tagged with an `rc` descriptor, with the Action run appended: `0.0.1-rc-3` -- `hotfix` branch builds will be tagged with a `hotfix` descriptor, with the Action run appended: `0.0.1-hotfix-4` - -Builds on the Main branch will ONLY be triggered by manually creating a release using the web interface in the repository. They will be versioned with the tag that is created when the release is created. The tags MUST take the form `major.minor.revision` to be compatible with the build process. A tag like `v0.1.0-alpha` is NOT compatabile and may result in the build process failing. - -To trigger a Main branch build follow the steps: -1. Click ***Releases*** on the left of the repo file window. -2. On the Releases page, click the ***Draft*** a new release" button on the right. -3. Enter a ***Tag version*** in the form `major.minor`. -4. Select the ***Target***, typically this will be the `Main` branch. -5. Enter a ***Release title***, typically this will be the same as the ***Tag version***. -6. Click ***Publish Release*** - -## Intial steps to build a plugin - -When building a plugin the following steps can be followed to get you up and running quickly. The steps below assume you have cloned the template repo and installed the necessary NuGet packages. - -1. In GitHub click the ***Use This Template*** to create a new repo from the template. -2. In GitHub click the ***Actions*** tab at the top of the repo created. -3. From GitHub ***Actions*** page, click ***New Workflow*** to setup build actions. -4. From GitHub ***Actions Workflow Template*** page, find ***Workflows created by PepperDash-Engineering***, there should be 2 actions: - - **Essentials Plugins Beta Builds Workflow** - - **Essentials Plugins Release Builds Workflow**. -5. Click ***Set up this workflow*** for both workflow actions -6. Clone the newly created template repo to begin working locally. -7. Rename the ***EssentialsPluginTemplate*** folder to represent the plugin being built -8. Rename the ****.sln*** and the ****.nuspec*** files to represent the plugin being built -9. Install Essentials as a Nuget package. - - You can click on the ***GetPackages.bat*** file to automate installation of the nuget packages. -10. Update the ***.nuspec*** file. The file contains comments providing additional directions on what updates are required. -11. Open the solution and resolve the reference issues - - Right click on ***References*** - - Select ***Add References*** - - Select ***Browse*** - - Navigate the the ***packages*** folder created when installing the NuGet packages - - Select the necessary ****.dll's*** to resolve all reference warnings -12. Review the ***EssentialsPluginFactoryTemplate.cs*** and remove the unused classes and associated ****.cs*** files from the solution. -13. Rename the classes to represent the device plugin being built. - - ***Plugin Template*** - ``` - EssentialsPluginFactoryTemplate.cs - ``` - ***Plugin Example*** - ``` - TacoTuesdayCalculatorFactory.cs - ``` -14. Follow the ***TODO [ ]*** comments found within the template solution. -15. Update the readme.md information below to help document your plugin. -16. When development is complete, commit the changes and push back to GitHub. +# IN DEVELOPMENT +The plugin is current in development +# Acuity Fresco Lighting Plugin ## Device Specific Information @@ -108,94 +14,74 @@ Update the below readme as needed to support documentation of the plugin Update the communication settings as needed for the plugin being developed. -| Setting | Value | -|--------------|-------------| -| Baud rate | 9600 | -| Data bits | 8 | -| Stop bits | 1 | -| Parity | None | -| Flow Control | None | -| Delimiter | "\r" | -| Default IP | 169.254.1.1 | -| Default Port | 23 | -| Username | admin | -| Password | password | +| Setting | Value | +| ------------ | ------- | +| Baud rate | 115,200 | +| Data bits | 8 | +| Stop bits | 1 | +| Parity | None | +| Flow Control | None | +| Delimiter | "\n" | #### Plugin Valid Communication methods -Reference PepperDash Core eControlMethods Enum for valid values, (currently listed below). Update to reflect the valid values for the plugin device being developed. - ```c# -Cec -Comm -Cresnet -IpId -IpIdTcp -IR -None -Ssh -Tcpip -Telnet -Udp +Com ``` -##### Communication Method Note - ***DELETE WHEN UPDATING PLUGIN README*** - -As of PepperDash Core 1.0.41, HTTP and HTTPS are not valid control mehtods and will throw an exception in the plugin factory if not properly handled. The plugin template is currently setup to check the method before attempting to create the comms for the device. When using HTTP or HTTPS you will need to create a custom comm object and modify the constructor as needed. - -For reference see the [Watt Box PDU Plugin](https://github.com/PepperDash-Engineering/epi-pdu-wattbox) as a working example of implementing both HTTP and standard socket communications. - ### Plugin Configuration Object Update the configuration object as needed for the plugin being developed. ```json { - "devices": [ - { - "key": "essentialsPluginKey", - "name": "Essentials Plugin Name", - "type": "essentialsPluginTypeName", - "group": "pluginDevices", - "properties": { - "control": { - "method": "See PepperDash.Core.eControlMethod for valid control methods", - "controlPortDevKey": "exampleControlPortDevKey", - "controlPortNumber": 1, - "comParams": { - "baudRate": 9600, - "dataBits": 8, - "stopBits": 1, - "parity": "None", - "protocol": "RS232", - "hardwareHandshake": "None", - "softwareHandshake": "None" - }, - "tcpSshProperties": { - "address": "172.22.0.101", - "port": 22, - "username": "admin", - "password": "password", - "autoReconnect": true, - "autoReconnectIntervalMs": 10000 - } - }, - "pollTimeMs": 30000, - "warningTimeoutMs": 180000, - "errorTimeoutMs": 300000, - "pluginCollection": { - "item1": { - "name": "Item 1", - "value": 1 - }, - "item2": { - "name": "Item 2", - "value": 2 - } - } - } - } - ] + "devices": [ + { + "key": "lights-1", + "name": "Acuity Fresco Lighting Scenes", + "type": "acuityfresco", + "group": "pluginDevices", + "properties": { + "control": { + "method": "com", + "controlPortDevKey": "processor", + "controlPortNumber": 1, + "comParams": { + "baudRate": 115200, + "dataBits": 8, + "stopBits": 1, + "parity": "None", + "protocol": "RS232", + "hardwareHandshake": "None", + "softwareHandshake": "None" + } + }, + "pollTimeMs": 30000, + "warningTimeoutMs": 180000, + "errorTimeoutMs": 300000, + "scenes": [ + { + "name": "Scene 1", + "id": 1, + "roomId": "A", + "level": 100 + }, + { + "name": "Scene 2", + "id": 5, + "roomId": "B", + "level": 50 + }, + { + "name": "Scene 3", + "id": 36, + "roomId": "X", + "level": 0 + } + ] + } + } + ] } ``` @@ -205,60 +91,78 @@ Update the bridge configuration object as needed for the plugin being developed. ```json { - "devices": [ - { - "key": "essentialsPluginBridgeKey", - "name": "Essentials Plugin Bridge Name", - "group": "api", - "type": "eiscApiAdvanced", - "properties": { - "control": { - "ipid": "1A", - "tcpSshProperties": { - "address": "127.0.0.2", - "port": 0 - } - }, - "devices": [ - { - "deviceKey": "essentialsPluginKey", - "joinStart": 1 - } - ] - } - } - ] + "devices": [ + { + "key": "lights-1-bridge", + "uid": 11, + "name": "Example Plugin Bridge", + "group": "api", + "type": "eiscApiAdvanced", + "properties": { + "control": { + "tcpSshProperties": { + "address": "127.0.0.2", + "port": 0 + }, + "ipid": "B1" + }, + "devices": [ + { + "deviceKey": "lights-1", + "joinStart": 1 + } + ] + } + } + ] } ``` ### SiMPL EISC Bridge Map -The selection below documents the digital, analog, and serial joins used by the SiMPL EISC. Update the bridge join maps as needed for the plugin being developed. - #### Digitals -| dig-o (Input/Triggers) | I/O | dig-i (Feedback) | -|---------------------------------------|-----|------------------| -| | 1 | Is Online | -| Connect (Held) / Disconnect (Release) | 2 | Connected | -| | 3 | | -| | 4 | | -| | 5 | | + +| dig-o (Input/Triggers) | I/O | dig-i (Feedback) | +| ---------------------- | --- | ------------------------- | +| | 1 | Is Online | +| Scene 1 Select | 11 | Scene 1 Feedback | +| Scene 2 Select | 12 | Scene 2 Feedback | +| Scene 3 Select | 13 | Scene 3 Feedback | +| Scene 4 Select | 14 | Scene 4 Feedback | +| Scene 5 Select | 15 | Scene 5 Feedback | +| Scene 6 Select | 16 | Scene 6 Feedback | +| Scene 7 Select | 17 | Scene 7 Feedback | +| Scene 8 Select | 18 | Scene 8 Feedback | +| Scene 9 Select | 19 | Scene 9 Feedback | +| Scene 10 Select | 20 | Scene 10 Feedback | +| | 41 | Scene 1 Visible Feedback | +| | 42 | Scene 2 Visible Feedback | +| | 43 | Scene 3 Visible Feedback | +| | 44 | Scene 4 Visible Feedback | +| | 45 | Scene 5 Visible Feedback | +| | 46 | Scene 6 Visible Feedback | +| | 47 | Scene 7 Visible Feedback | +| | 48 | Scene 8 Visible Feedback | +| | 49 | Scene 9 Visible Feedback | +| | 50 | Scene 10 Visible Feedback | + #### Analogs -| an_o (Input/Triggers) | I/O | an_i (Feedback) | -|-----------------------|-----|-----------------| -| | 1 | Socket Status | -| | 2 | Monitor Status | -| | 3 | | -| | 4 | | -| | 5 | | +| an_o (Input/Triggers) | I/O | an_i (Feedback) | +| --------------------- | --- | -------------------- | +| Select Scene by Index | 1 | Scene Index Feedback | #### Serials -| serial-o (Input/Triggers) | I/O | serial-i (Feedback) | -|---------------------------|-----|---------------------| -| | 1 | Device Name | -| | 2 | | -| | 3 | | -| | 4 | | -| | 5 | | +| serial-o (Input/Triggers) | I/O | serial-i (Feedback) | +| ----------------------------- | --- | ------------------- | +| Integration ID Set (NOT USED) | 1 | | + +### DEVJSON Commands + +```plaintext +devjson:1 {"deviceKey":"lights-1", "methodName":"GetScenes", "params":[]} + +devjson:1 {"deviceKey":"lights-1", "methodName":"ResetDebugLevels", "params":[]} +devjson:1 {"deviceKey":"lights-1", "methodName":"SetDebugLevels", "params":[{level 0-2}]} +``` From 09d74851785f9c282839c703b952e072c2b98e9d Mon Sep 17 00:00:00 2001 From: Jason DeVito Date: Thu, 21 Apr 2022 09:56:32 -0500 Subject: [PATCH 2/5] feat: updated packages.config to reference Essentials 1.9.7, added image folder --- .../EssentialsPluginBridgeJoinMapTemplate.cs | 151 --------- .../EssentialsPluginConfigObjectTemplate.cs | 244 -------------- .../EssentialsPluginCrestronDeviceTemplate.cs | 95 ------ .../EssentialsPluginDeviceTemplate.cs | 303 ------------------ .../EssentialsPluginFactoryTemplate.cs | 267 --------------- .../EssentialsPluginLogicDeviceTemplate.cs | 86 ----- .../EssentialsPluginTemplate.csproj | 118 ------- .../EssentialsPluginTemplate.nuspec | 26 -- .../EssentialsPluginTemplate.sln | 20 -- .../Properties/AssemblyInfo.cs | 10 - .../Properties/ControlSystem.cfg | 0 .../configurationFile.json | 94 ------ images/logo_pdt_no_tagline_600.png | Bin 0 -> 350979 bytes packages.config | 2 +- 14 files changed, 1 insertion(+), 1415 deletions(-) delete mode 100644 EssentialsPluginTemplate/EssentialsPluginBridgeJoinMapTemplate.cs delete mode 100644 EssentialsPluginTemplate/EssentialsPluginConfigObjectTemplate.cs delete mode 100644 EssentialsPluginTemplate/EssentialsPluginCrestronDeviceTemplate.cs delete mode 100644 EssentialsPluginTemplate/EssentialsPluginDeviceTemplate.cs delete mode 100644 EssentialsPluginTemplate/EssentialsPluginFactoryTemplate.cs delete mode 100644 EssentialsPluginTemplate/EssentialsPluginLogicDeviceTemplate.cs delete mode 100644 EssentialsPluginTemplate/EssentialsPluginTemplate.csproj delete mode 100644 EssentialsPluginTemplate/EssentialsPluginTemplate.nuspec delete mode 100644 EssentialsPluginTemplate/EssentialsPluginTemplate.sln delete mode 100644 EssentialsPluginTemplate/Properties/AssemblyInfo.cs delete mode 100644 EssentialsPluginTemplate/Properties/ControlSystem.cfg delete mode 100644 EssentialsPluginTemplate/configurationFile.json create mode 100644 images/logo_pdt_no_tagline_600.png diff --git a/EssentialsPluginTemplate/EssentialsPluginBridgeJoinMapTemplate.cs b/EssentialsPluginTemplate/EssentialsPluginBridgeJoinMapTemplate.cs deleted file mode 100644 index 54ef3d9..0000000 --- a/EssentialsPluginTemplate/EssentialsPluginBridgeJoinMapTemplate.cs +++ /dev/null @@ -1,151 +0,0 @@ -using PepperDash.Essentials.Core; - -namespace EssentialsPluginTemplate -{ - /// - /// Plugin device Bridge Join Map - /// - /// - /// Rename the class to match the device plugin being developed. Reference Essentials JoinMaps, if one exists for the device plugin being developed - /// - /// - /// - /// "EssentialsPluginBridgeJoinMapTemplate" renamed to "SamsungMdcBridgeJoinMap" - /// - public class EssentialsPluginBridgeJoinMapTemplate : JoinMapBaseAdvanced - { - #region Digital - - // TODO [ ] Add digital joins below plugin being developed - - /// - /// Plugin online join map - /// - /// - /// Reports the plugin online sate to SiMPL as a boolean value - /// - [JoinName("IsOnline")] - public JoinDataComplete IsOnline = new JoinDataComplete( - new JoinData - { - JoinNumber = 1, - JoinSpan = 1 - }, - new JoinMetadata - { - Description = "Is Online", - JoinCapabilities = eJoinCapabilities.ToSIMPL, - JoinType = eJoinType.Digital - }); - - // TODO [ ] If connection state is managed by Essentials, delete the following. If connection is managed by SiMPL, uncomment the following - /// - /// Plugin connect join map - /// This property would only be needed if the plugin connection needs to be managed by SiMPL via the bridge - /// - /// - /// Typically used with socket based communications. Connects (held) and disconnects (released) socket based communcations when triggered from SiMPL. - /// Additionally, the connection state feedback will report to SiMP Las a boolean value. - /// - //[JoinName("Connect")] - //public JoinDataComplete Connect = new JoinDataComplete( - // new JoinData - // { - // JoinNumber = 2, - // JoinSpan = 1 - // }, - // new JoinMetadata - // { - // Description = "Connect (Held)/Disconnect (Release) & Connect state feedback", - // JoinCapabilities = eJoinCapabilities.ToFromSIMPL, - // JoinType = eJoinType.Digital - // }); - - #endregion - - - #region Analog - - // TODO [ ] Add analog joins below plugin being developed - - /// - /// Plugin socket status join map - /// - /// - /// Typically used with socket based communications. Reports the socket state to SiMPL as an analog value. - /// - /// - [JoinName("SocketStatus")] - public JoinDataComplete SocketStatus = new JoinDataComplete( - new JoinData - { - JoinNumber = 1, - JoinSpan = 1 - }, - new JoinMetadata - { - Description = "Socket SocketStatus", - JoinCapabilities = eJoinCapabilities.ToSIMPL, - JoinType = eJoinType.Analog - }); - - /// - /// Plugin monitor status join map - /// - /// - /// Typically used with comms monitor to report plugin monitor state for system status page and Fusion monitor state. - /// - /// - [JoinName("MonitorStatus")] - public JoinDataComplete MonitorStatus = new JoinDataComplete( - new JoinData - { - JoinNumber = 2, - JoinSpan = 1 - }, - new JoinMetadata - { - Description = "Monitor Status", - JoinCapabilities = eJoinCapabilities.ToSIMPL, - JoinType = eJoinType.Analog - }); - - #endregion - - - #region Serial - - // TODO [ ] Add serial joins below plugin being developed - - /// - /// Plugin device name - /// - /// - /// Reports the plugin name, as read from the configuration file, to SiMPL as a string value. - /// - [JoinName("DeviceName")] - public JoinDataComplete DeviceName = new JoinDataComplete( - new JoinData - { - JoinNumber = 1, - JoinSpan = 1 - }, - new JoinMetadata - { - Description = "Device Name", - JoinCapabilities = eJoinCapabilities.ToSIMPL, - JoinType = eJoinType.Serial - }); - - #endregion - - /// - /// Plugin device BridgeJoinMap constructor - /// - /// This will be the join it starts on the EISC bridge - public EssentialsPluginBridgeJoinMapTemplate(uint joinStart) - : base(joinStart, typeof(EssentialsPluginBridgeJoinMapTemplate)) - { - } - } -} diff --git a/EssentialsPluginTemplate/EssentialsPluginConfigObjectTemplate.cs b/EssentialsPluginTemplate/EssentialsPluginConfigObjectTemplate.cs deleted file mode 100644 index 5cdfcfd..0000000 --- a/EssentialsPluginTemplate/EssentialsPluginConfigObjectTemplate.cs +++ /dev/null @@ -1,244 +0,0 @@ -using System.Collections.Generic; -using Newtonsoft.Json; -using PepperDash.Essentials.Core; - -namespace EssentialsPluginTemplate -{ - /// - /// Plugin device configuration object - /// - /// - /// Rename the class to match the device plugin being created - /// - /// - /// "EssentialsPluginConfigObjectTemplate" renamed to "SamsungMdcConfig" - /// - /// { - /// "devices": [ - /// { - /// "key": "essentialsPluginKey", - /// "name": "Essentials Plugin Name", - /// "type": "essentialsPluginTypeName", - /// "group": "pluginDevices", - /// "properties": { - /// "control": { - /// "method": "PepperDash.Core.eControlMethod", - /// "controlPortDevKey": "examplePortDevKey", - /// "controlPortNumber": 1, - /// "comParams": { - /// "baudRate": 9600, - /// "dataBits": 8, - /// "stopBits": 1, - /// "parity": "None", - /// "protocol": "RS232", - /// "hardwareHandshake": "None", - /// "softwareHandshake": "None" - /// }, - /// "tcpSshProperties": { - /// "address": "172.22.0.101", - /// "port": 23, - /// "username": "admin", - /// "password": "password", - /// "autoReconnect": true, - /// "autoReconnectIntervalMs": 10000 - /// } - /// }, - /// "pollTimeMs": 30000, - /// "warningTimeoutMs": 180000, - /// "errorTimeoutMs": 300000, - /// "pluginCollection": { - /// "item1": { - /// "name": "Item 1", - /// "value": 1 - /// } - /// "item2": { - /// "name": "Item 2",, - /// "value": 2 - /// } - /// } - /// } - /// } - /// ] - /// } - /// - /// - [ConfigSnippet("{\"devices\":[{\"key\":\"essentialsPluginKey\",\"name\":\"Essentials Plugin Name\",\"type\":\"essentialsPluginTypeName\",\"group\":\"pluginDevices\",\"properties\":{\"control\":{\"method\":\"PepperDash.Core.eControlMethod\",\"controlPortDevKey\":\"exampleControlPortDevKey\",\"controlPortNumber\":1,\"comParams\":{\"baudRate\":9600,\"dataBits\":8,\"stopBits\":1,\"parity\":\"None\",\"protocol\":\"RS232\",\"hardwareHandshake\":\"None\",\"softwareHandshake\":\"None\"},\"tcpSshProperties\":{\"address\":\"172.22.0.101\",\"port\":22,\"username\":\"admin\",\"password\":\"password\",\"autoReconnect\":true,\"autoReconnectIntervalMs\":10000}},\"pollTimeMs\":30000,\"warningTimeoutMs\":180000,\"errorTimeoutMs\":300000,\"pluginCollection\":{\"item1\":{\"name\":\"Item 1\",\"value\":1},\"item2\":{\"name\":\"Item 2\",\"value\":2}}}}]}")] - public class EssentialsPluginConfigObjectTemplate - { - /// - /// JSON control object - /// - /// - /// Typically this object is not required, but in some instances it may be needed. For example, when building a - /// plugin that is using Telnet (TCP/IP) communications and requires login, the device will need to handle the login. - /// In order to do so, you will need the username and password in the "tcpSshProperties" object. - /// - /// - /// - /// "control": { - /// "method": "tcpIp", - /// "controlPortDevKey": "processor", - /// "controlPortNumber": 1, - /// "comParams": { - /// "baudRate": 9600, - /// "dataBits": 8, - /// "stopBits": 1, - /// "parity": "None", - /// "protocol": "RS232", - /// "hardwareHandshake": "None", - /// "softwareHandshake": "None" - /// }, - /// "tcpSshProperties": { - /// "address": "172.22.0.101", - /// "port": 23, - /// "username": "admin", - /// "password": "password", - /// "autoReconnect": true, - /// "autoReconnectIntervalMs": 10000 - /// } - /// } - /// - /// - [JsonProperty("control")] - public EssentialsControlPropertiesConfig Control { get; set; } - - /// - /// Serializes the poll time value - /// - /// - /// This is an exmaple device plugin property. This should be modified or deleted as needed for the plugin being built. - /// - /// - /// PollTimeMs property gets/sets the value as a long - /// - /// - /// - /// "properties": { - /// "polltimeMs": 30000 - /// } - /// - /// - [JsonProperty("pollTimeMs")] - public long PollTimeMs { get; set; } - - /// - /// Serializes the warning timeout value - /// - /// - /// This is an exmaple device plugin property. This should be modified or deleted as needed for the plugin being built. - /// - /// - /// WarningTimeoutMs property gets/sets the value as a long - /// - /// - /// - /// "properties": { - /// "warningTimeoutMs": 180000 - /// } - /// - /// - [JsonProperty("warningTimeoutMs")] - public long WarningTimeoutMs { get; set; } - - /// - /// Serializes the error timeout value - /// - /// /// - /// This is an exmaple device plugin property. This should be modified or deleted as needed for the plugin being built. - /// - /// - /// ErrorTimeoutMs property gets/sets the value as a long - /// - /// - /// - /// "properties": { - /// "errorTimeoutMs": 300000 - /// } - /// - /// - [JsonProperty("errorTimeoutMs")] - public long ErrorTimeoutMs { get; set; } - - /// - /// Example dictionary of objects - /// - /// - /// This is an example collection configuration object. This should be modified or deleted as needed for the plugin being built. - /// - /// - /// - /// "properties": { - /// "presets": { - /// "preset1": { - /// "enabled": true, - /// "name": "Preset 1" - /// } - /// } - /// } - /// - /// - /// - /// - /// "properties": { - /// "inputNames": { - /// "input1": "Input 1", - /// "input2": "Input 2" - /// } - /// } - /// - /// - [JsonProperty("pluginCollection")] - public Dictionary PluginCollection { get; set; } - - /// - /// Constuctor - /// - /// - /// If using a collection you must instantiate the collection in the constructor - /// to avoid exceptions when reading the configuration file - /// - public EssentialsPluginConfigObjectTemplate() - { - PluginCollection = new Dictionary(); - } - } - - /// - /// Example plugin configuration dictionary object - /// - /// - /// This is an example collection of configuration objects. This can be modified or deleted as needed for the plugin being built. - /// - /// - /// - /// "properties": { - /// "dictionary": { - /// "item1": { - /// "name": "Item 1 Name", - /// "value": "Item 1 Value" - /// } - /// } - /// } - /// - /// - public class EssentialsPluginConfigObjectDictionaryTemplate - { - /// - /// Serializes collection name property - /// - /// - /// This is an example collection of configuration objects. This can be modified or deleted as needed for the plugin being built. - /// - [JsonProperty("name")] - public string Name { get; set; } - - /// - /// Serializes collection value property - /// - /// - /// This is an example collection of configuration objects. This can be modified or deleted as needed for the plugin being built. - /// - [JsonProperty("value")] - public uint Value { get; set; } - } -} \ No newline at end of file diff --git a/EssentialsPluginTemplate/EssentialsPluginCrestronDeviceTemplate.cs b/EssentialsPluginTemplate/EssentialsPluginCrestronDeviceTemplate.cs deleted file mode 100644 index 275b8c6..0000000 --- a/EssentialsPluginTemplate/EssentialsPluginCrestronDeviceTemplate.cs +++ /dev/null @@ -1,95 +0,0 @@ -using Crestron.SimplSharpPro; -using Crestron.SimplSharpPro.DeviceSupport; -using PepperDash.Core; -using PepperDash.Essentials.Core; -using PepperDash.Essentials.Core.Bridges; - -namespace EssentialsPluginTemplate -{ - /// - /// Plugin device - /// - /// - /// Rename the class to match the device plugin being developed. - /// - /// - /// "EssentialsPluginDeviceTemplate" renamed to "SamsungMdcDevice" - /// - public class EssentialsPluginCrestronDeviceTemplate : CrestronGenericBridgeableBaseDevice - { - /// - /// It is often desirable to store the config - /// - private EssentialsPluginConfigObjectTemplate _config; - - - #region Constructor for Devices without IBasicCommunication. Remove if not needed - - /// - /// Plugin device constructor for Crestron devices - /// - /// A string - /// A string - /// An EssentialsPluginConfigObjectTemplate object - /// A GenericBase object - public EssentialsPluginCrestronDeviceTemplate(string key, string name, EssentialsPluginConfigObjectTemplate config, GenericBase hardware) - : base(key, name, hardware) - { - Debug.Console(0, this, "Constructing new {0} instance", name); - - // The base class takes care of registering the hardware device for you - - // TODO [ ] Update the constructor as needed for the plugin device being developed - - _config = config; - } - - #endregion - - - #region Overrides of EssentialsBridgeableDevice - - /// - /// Links the plugin device to the EISC bridge - /// - /// A BasicTriList object - /// A uint - /// A string - /// An EiscApiAdvanced object - public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge) - { - var joinMap = new EssentialsPluginBridgeJoinMapTemplate(joinStart); - - // This adds the join map to the collection on the bridge - if (bridge != null) - { - bridge.AddJoinMap(Key, joinMap); - } - - var customJoins = JoinMapHelper.TryGetJoinMapAdvancedForDevice(joinMapKey); - - if (customJoins != null) - { - joinMap.SetCustomJoinData(customJoins); - } - - Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X")); - Debug.Console(0, "Linking to Bridge Type {0}", GetType().Name); - - // TODO [ ] Implement bridge links as needed - - // links to bridge - trilist.SetString(joinMap.DeviceName.JoinNumber, Name); - - trilist.OnlineStatusChange += (o, a) => - { - if (!a.DeviceOnLine) return; - - trilist.SetString(joinMap.DeviceName.JoinNumber, Name); - }; - } - - #endregion - - } -} \ No newline at end of file diff --git a/EssentialsPluginTemplate/EssentialsPluginDeviceTemplate.cs b/EssentialsPluginTemplate/EssentialsPluginDeviceTemplate.cs deleted file mode 100644 index f06f9bc..0000000 --- a/EssentialsPluginTemplate/EssentialsPluginDeviceTemplate.cs +++ /dev/null @@ -1,303 +0,0 @@ -using Crestron.SimplSharpPro.DeviceSupport; -using PepperDash.Core; -using PepperDash.Essentials.Core; -using PepperDash.Essentials.Core.Bridges; - -namespace EssentialsPluginTemplate -{ - /// - /// Plugin device - /// - /// - /// Rename the class to match the device plugin being developed. - /// - /// - /// "EssentialsPluginDeviceTemplate" renamed to "SamsungMdcDevice" - /// - public class EssentialsPluginDeviceTemplate : EssentialsBridgeableDevice - { - /// - /// It is often desirable to store the config - /// - private EssentialsPluginConfigObjectTemplate _config; - - #region IBasicCommunication Properties and Constructor. Remove if not needed. - - // TODO [ ] Add, modify, remove properties and fields as needed for the plugin being developed - private readonly IBasicCommunication _comms; - private readonly GenericCommunicationMonitor _commsMonitor; - - // TODO [ ] Delete the properties below if using a HEX/byte based API - // _comms gather is commonly used for ASCII based API's with deelimiters - private readonly CommunicationGather _commsGather; - - /// - /// Set this value to that of the delimiter used by the API (if applicable) - /// - private const string CommsDelimiter = "\r"; - - // TODO [ ] Delete the properties below if using an ASCII based API - // _comms byte buffer is commonly used for HEX/byte based API's - private byte[] _commsByteBuffer = { }; - - // TODO [ ] If connection state is managed by Essentials, delete the following. If connection is managed by SiMPL, uncomment the following - /// - /// Connects/disconnects the comms of the plugin device - /// This property would only be needed if the plugin connection needs to be managed by SiMPL via the bridge - /// - /// - /// triggers the _comms.Connect/Disconnect as well as thee comms monitor start/stop - /// - //public bool Connect - //{ - // get { return _comms.IsConnected; } - // set - // { - // if (value) - // { - // _comms.Connect(); - // _commsMonitor.Start(); - // } - // else - // { - // _comms.Disconnect(); - // _commsMonitor.Stop(); - // } - // } - //} - - /// - /// Reports connect feedback through the bridge - /// - public BoolFeedback ConnectFeedback { get; private set; } - - /// - /// Reports online feedback through the bridge - /// - public BoolFeedback OnlineFeedback { get; private set; } - - /// - /// Reports socket status feedback through the bridge - /// - public IntFeedback SocketStatusFeedback { get; private set; } - - /// - /// Reports monitor status feedback through the bridge - /// Typically used for Fusion status reporting and system status LED's - /// - public IntFeedback MonitorStatusFeedback { get; private set; } - - /// - /// Plugin device constructor - /// - /// device key - /// device name - /// device configuration object - /// device communication as IBasicCommunication - /// - /// - public EssentialsPluginDeviceTemplate(string key, string name, EssentialsPluginConfigObjectTemplate config, IBasicCommunication comms) - : base(key, name) - { - Debug.Console(0, this, "Constructing new {0} instance", name); - - // TODO [ ] Update the constructor as needed for the plugin device being developed - - _config = config; - - ConnectFeedback = new BoolFeedback(() => _comms.IsConnected); - OnlineFeedback = new BoolFeedback(() => _commsMonitor.IsOnline); - MonitorStatusFeedback = new IntFeedback(() => (int)_commsMonitor.Status); - - _comms = comms; - _commsMonitor = new GenericCommunicationMonitor(this, _comms, _config.PollTimeMs, _config.WarningTimeoutMs, _config.ErrorTimeoutMs, Poll); - - var socket = _comms as ISocketStatus; - if (socket != null) - { - // device comms is IP **ELSE** device comms is RS232 - socket.ConnectionChange += socket_ConnectionChange; - SocketStatusFeedback = new IntFeedback(() => (int)socket.ClientStatus); - } - - #region Communication data event handlers. Comment out any that don't apply to the API type - - // TODO [ ] Delete the properties below if using a HEX/byte based API - // _comms gather is commonly used for ASCII based API's that have a defined delimiter - _commsGather = new CommunicationGather(_comms, CommsDelimiter); - // Event fires when the defined delimter is found - _commsGather.LineReceived += Handle_LineRecieved; - - // TODO [ ] Delete event if the device has a delimiter - // Event fires as data is recieved - _comms.TextReceived += Handle_TextReceived; - - // TODO [ ] Delete the properties below if using an ASCII based API - // _comms byte buffer for HEX/byte based API's in raw format. Commonly used for API's such as Samsung MDC - // Event fires as data is recieved - _comms.BytesReceived += Handle_BytesReceived; - - #endregion Communication data event handlers. Comment out any that don't apply to the API type - - Debug.Console(0, this, "Constructing new {0} instance complete", name); - Debug.Console(0, new string('*', 80)); - Debug.Console(0, new string('*', 80)); - } - - /// - /// Use the custom activiate to connect the device and start the comms monitor. - /// This method will be called when the device is built. - /// - /// - public override bool CustomActivate() - { - // Essentials will handle the connect method to the device - _comms.Connect(); - // Essentialss will handle starting the comms monitor - _commsMonitor.Start(); - - return base.CustomActivate(); - } - - private void socket_ConnectionChange(object sender, GenericSocketStatusChageEventArgs args) - { - if (ConnectFeedback != null) - ConnectFeedback.FireUpdate(); - - if (SocketStatusFeedback != null) - SocketStatusFeedback.FireUpdate(); - } - - // TODO [ ] Delete the properties below if using a HEX/byte based API - // commonly used with ASCII based API's with a defined delimiter - private void Handle_LineRecieved(object sender, GenericCommMethodReceiveTextArgs args) - { - // TODO [ ] Implement method - throw new System.NotImplementedException(); - } - - // TODO [ ] Delete the properties below if using a HEX/byte based API - // commonly used with ASCII based API's without a delimiter - void Handle_TextReceived(object sender, GenericCommMethodReceiveTextArgs e) - { - // TODO [ ] Implement method - throw new System.NotImplementedException(); - } - - // TODO [ ] Delete the properties below if using an ASCII based API - private void Handle_BytesReceived(object sender, GenericCommMethodReceiveBytesArgs args) - { - // TODO [ ] Implement method - throw new System.NotImplementedException(); - } - - // TODO [ ] Delete the properties below if using a HEX/byte based API - /// - /// Sends text to the device plugin comms - /// - /// - /// Can be used to test commands with the device plugin using the DEVPROPS and DEVJSON console commands - /// - /// Command to be sent - public void SendText(string text) - { - if (string.IsNullOrEmpty(text)) return; - - _comms.SendText(string.Format("{0}{1}", text, CommsDelimiter)); - } - - // TODO [ ] Delete the properties below if using an ASCII based API - /// - /// Sends bytes to the device plugin comms - /// - /// - /// Can be used to test commands with the device plugin using the DEVPROPS and DEVJSON console commands - /// - /// Bytes to be sent - public void SendBytes(byte[] bytes) - { - if (bytes == null) return; - - _comms.SendBytes(bytes); - } - - /// - /// Polls the device - /// - /// - /// Poll method is used by the communication monitor. Update the poll method as needed for the plugin being developed - /// - public void Poll() - { - // TODO [ ] Update Poll method as needed for the plugin being developed - // Example: SendText("getStatus"); - throw new System.NotImplementedException(); - } - - #endregion IBasicCommunication Properties and Constructor. Remove if not needed. - - - #region Overrides of EssentialsBridgeableDevice - - /// - /// Links the plugin device to the EISC bridge - /// - /// - /// - /// - /// - public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge) - { - var joinMap = new EssentialsPluginBridgeJoinMapTemplate(joinStart); - - // This adds the join map to the collection on the bridge - if (bridge != null) - { - bridge.AddJoinMap(Key, joinMap); - } - - var customJoins = JoinMapHelper.TryGetJoinMapAdvancedForDevice(joinMapKey); - - if (customJoins != null) - { - joinMap.SetCustomJoinData(customJoins); - } - - Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X")); - Debug.Console(0, "Linking to Bridge Type {0}", GetType().Name); - - // TODO [ ] Implement bridge links as needed - - // links to bridge - trilist.SetString(joinMap.DeviceName.JoinNumber, Name); - - // TODO [ ] If connection state is managed by Essentials, delete the following. If connection is managed by SiMPL, uncomment the following - //trilist.SetBoolSigAction(joinMap.Connect.JoinNumber, sig => Connect = sig); - //ConnectFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Connect.JoinNumber]); - - SocketStatusFeedback.LinkInputSig(trilist.UShortInput[joinMap.SocketStatus.JoinNumber]); - OnlineFeedback.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]); - - UpdateFeedbacks(); - - trilist.OnlineStatusChange += (o, a) => - { - if (!a.DeviceOnLine) return; - - trilist.SetString(joinMap.DeviceName.JoinNumber, Name); - UpdateFeedbacks(); - }; - } - - private void UpdateFeedbacks() - { - // TODO [ ] Update as needed for the plugin being developed - ConnectFeedback.FireUpdate(); - OnlineFeedback.FireUpdate(); - SocketStatusFeedback.FireUpdate(); - } - - #endregion Overrides of EssentialsBridgeableDevice - } -} - diff --git a/EssentialsPluginTemplate/EssentialsPluginFactoryTemplate.cs b/EssentialsPluginTemplate/EssentialsPluginFactoryTemplate.cs deleted file mode 100644 index 30d973b..0000000 --- a/EssentialsPluginTemplate/EssentialsPluginFactoryTemplate.cs +++ /dev/null @@ -1,267 +0,0 @@ -using System; -using System.Collections.Generic; -using Crestron.SimplSharpPro.UI; -using PepperDash.Core; -using PepperDash.Essentials.Core; -using PepperDash.Essentials.Core.Config; - -namespace EssentialsPluginTemplate -{ - /// - /// Plugin factory for devices that require communications using IBasicCommunications or custom communication methods - /// - /// - /// Rename the class to match the device plugin being developed and update the factory as needed. - /// If this class is not used, delete the class and delete the associated EssentialsPluginDeviceTemplate.cs file from the solution - /// - /// - /// "EssentialsPluginFactoryTemplate" renamed to "SamsungMdcFactory" - /// - public class EssentialsPluginFactoryTemplate : EssentialsPluginDeviceFactory - { - /// - /// Plugin device factory constructor - /// - /// - /// Update the MinimumEssentialsFrameworkVersion & TypeNames as needed when creating a plugin - /// - /// - /// Set the minimum Essentials Framework Version - /// - /// MinimumEssentialsFrameworkVersion = "1.5.5"; - /// - /// In the constructor we initialize the list with the typenames that will build an instance of this device - /// - /// TypeNames = new List() { "SamsungMdc", "SamsungMdcDisplay" }; - /// - /// - public EssentialsPluginFactoryTemplate() - { - // Set the minimum Essentials Framework Version - // TODO [ ] Update the Essentials minimum framework version which this plugin has been tested against - MinimumEssentialsFrameworkVersion = "1.6.5"; - - // In the constructor we initialize the list with the typenames that will build an instance of this device - // only include unique typenames, when the constructur is used all the typenames will be evaluated in lower case. - // TODO [ ] Update the TypeNames for the plugin being developed - TypeNames = new List() { "examplePluginDevice" }; - } - - /// - /// Builds and returns an instance of EssentialsPluginDeviceTemplate - /// - /// device configuration - /// plugin device or null - /// - /// The example provided below takes the device key, name, properties config and the comms device created. - /// Modify the EssetnialsPlugingDeviceTemplate constructor as needed to meet the requirements of the plugin device. - /// - /// - public override EssentialsDevice BuildDevice(DeviceConfig dc) - { - try - { - Debug.Console(0, new string('*', 80)); - Debug.Console(0, new string('*', 80)); - Debug.Console(0, "[{0}] Factory Attempting to create new device from type: {1}", dc.Key, dc.Type); - - // get the plugin device properties configuration object & check for null - var propertiesConfig = dc.Properties.ToObject(); - if (propertiesConfig == null) - { - Debug.Console(0, "[{0}] Factory: failed to read properties config for {1}", dc.Key, dc.Name); - return null; - } - - // If using a communication method not supported in PepperDash.Core.eControlMethod reference the EXAMPLE below of pulling out control method properties - // ** Update as needed for YOUR plugin ** - // get the plugin device control properties configuratin object & check for null - var controlConfig = CommFactory.GetControlPropertiesConfig(dc); - if (controlConfig == null) - { - Debug.Console(0, "[{0}] Factory: failed to read control config for {1}", dc.Key, dc.Name); - } - // TODO [ ] If using an unsupported PepperDash.Core.eControlMethod, you can selective pull property values out of the JSON control block with the examples below - else if(controlConfig.Method.ToString().Contains("http")) - { - - var address = controlConfig.TcpSshProperties.Address; - var port = controlConfig.TcpSshProperties.Port; - Debug.Console(0, "[{0}] {1} will attempt to connect using: {2}:{3}", dc.Key, dc.Name, address, port); - - var username = controlConfig.TcpSshProperties.Username; - var password = controlConfig.TcpSshProperties.Password; - Debug.Console(1, "[{0}] {1} will attempt to use authorization credentials: {2}:{3}", dc.Key, dc.Name, username, password); - - // TODO [ ] Update with the proper constructor to instantiate the device using HTTPS - throw new NotImplementedException(); - } - - // TODO [ ] If your device is using a PepperDash.Core.eControlMethod supported enum, the snippet below will support standard comm methods - // build the plugin device comms (for all other comms methods) & check for null - var comms = CommFactory.CreateCommForDevice(dc); - if (comms != null) return new EssentialsPluginDeviceTemplate(dc.Key, dc.Name, propertiesConfig, comms); - Debug.Console(0, "[{0}] Factory: failed to create comm for {1}", dc.Key, dc.Name); - return null; - } - catch (Exception ex) - { - Debug.Console(0, "[{0}] Factory BuildDevice Exception: {1}", dc.Key, ex); - return null; - } - } - } - - - - /// - /// Plugin factory for devices that don't require communications using IBasicCommunications or custom communication methods ** logic only plugin ** - /// - /// - /// Rename the class to match the device plugin being developed and update the factory as needed. - /// If this class is not used, delete the class and delete the associated EssentialsPluginLogicDeviceTemplate.cs file from the solution - /// - /// - /// "EssentialsPluginFactoryTemplate" renamed to "MyLogicDeviceFactory" - /// - public class EssentialsPluginFactoryLogicDeviceTemplate : EssentialsPluginDeviceFactory - { - /// - /// Plugin device factory constructor - /// - /// - /// Update the MinimumEssentialsFrameworkVersion & TypeNames as needed when creating a plugin - /// - /// - /// Set the minimum Essentials Framework Version - /// - /// MinimumEssentialsFrameworkVersion = "1.6.4; - /// - /// In the constructor we initialize the list with the typenames that will build an instance of this device - /// - /// TypeNames = new List() { "SamsungMdc", "SamsungMdcDisplay" }; - /// - /// - public EssentialsPluginFactoryLogicDeviceTemplate() - { - // Set the minimum Essentials Framework Version - // only include unique typenames, when the constructur is used all the typenames will be evaluated in lower case. - // TODO [ ] Update the Essentials minimum framework version which this plugin has been tested against - MinimumEssentialsFrameworkVersion = "1.6.5"; - - // In the constructor we initialize the list with the typenames that will build an instance of this device - // TODO [ ] Update the TypeNames for the plugin being developed - TypeNames = new List() { "examplePluginLogicDevice" }; - } - - /// - /// Builds and returns an instance of EssentialsPluginTemplateLogicDevice - /// - /// device configuration - /// plugin device or null - /// - /// The example provided below takes the device key, name, properties config and the comms device created. - /// Modify the EssetnialsPlugingDeviceTemplate constructor as needed to meet the requirements of the plugin device. - /// - /// - public override EssentialsDevice BuildDevice(PepperDash.Essentials.Core.Config.DeviceConfig dc) - { - - Debug.Console(1, "[{0}] Factory Attempting to create new device from type: {1}", dc.Key, dc.Type); - - // get the plugin device properties configuration object & check for null - var propertiesConfig = dc.Properties.ToObject(); - if (propertiesConfig == null) - { - Debug.Console(0, "[{0}] Factory: failed to read properties config for {1}", dc.Key, dc.Name); - return null; - } - - // get the plugin device control properties configuratin object & check for null - var controlConfig = CommFactory.GetControlPropertiesConfig(dc); - if (controlConfig == null) - { - return new EssentialsPluginLogicDeviceTemplate(dc.Key, dc.Name, propertiesConfig); - } - Debug.Console(0, "[{0}] Factory: Unable to get control properties from device config for {1}", dc.Key, dc.Name); - return null; - } - } - - - - /// - /// Plugin factory for Crestron wrapper devices - /// - /// - /// Rename the class to match the device plugin being developed and update the factory as needed. - /// If this class is not used, delete the class and delete the associated EssentialsPluginCrestronDeviceTemplate.cs file from the solution - /// - /// - /// "EssentialsPluginFactoryTemplate" renamed to "MyCrestronDeviceFactory" - /// - public class EssentialsPluginFactoryCrestronDeviceTemplate : EssentialsPluginDeviceFactory - { - /// - /// Plugin device factory constructor - /// - /// - /// Update the MinimumEssentialsFrameworkVersion & TypeNames as needed when creating a plugin - /// - /// - /// Set the minimum Essentials Framework Version - /// - /// MinimumEssentialsFrameworkVersion = "1.6.4; - /// - /// In the constructor we initialize the list with the typenames that will build an instance of this device - /// - /// TypeNames = new List() { "SamsungMdc", "SamsungMdcDisplay" }; - /// - /// - public EssentialsPluginFactoryCrestronDeviceTemplate() - { - // Set the minimum Essentials Framework Version - // only include unique typenames, when the constructur is used all the typenames will be evaluated in lower case. - // TODO [ ] Update the Essentials minimum framework version which this plugin has been tested against - MinimumEssentialsFrameworkVersion = "1.6.5"; - - // In the constructor we initialize the list with the typenames that will build an instance of this device - // TODO [ ] Update the TypeNames for the plugin being developed - TypeNames = new List() { "examplePluginCrestronDevice" }; - } - - /// - /// Builds and returns an instance of EssentialsPluginTemplateCrestronDevice - /// - /// device configuration - /// plugin device or null - /// - /// The example provided below takes the device key, name, properties config and the comms device created. - /// Modify the EssetnialsPlugingDeviceTemplate constructor as needed to meet the requirements of the plugin device. - /// - /// - public override EssentialsDevice BuildDevice(PepperDash.Essentials.Core.Config.DeviceConfig dc) - { - - Debug.Console(1, "[{0}] Factory Attempting to create new device from type: {1}", dc.Key, dc.Type); - - // get the plugin device properties configuration object & check for null - var propertiesConfig = dc.Properties.ToObject(); - if (propertiesConfig == null) - { - Debug.Console(0, "[{0}] Factory: failed to read properties config for {1}", dc.Key, dc.Name); - return null; - } - - // get the plugin device control properties configuratin object & check for null - var controlConfig = CommFactory.GetControlPropertiesConfig(dc); - if (controlConfig != null) - { - var myTouchpanel = new Tsw760(controlConfig.IpIdInt, Global.ControlSystem); - return new EssentialsPluginCrestronDeviceTemplate(dc.Key, dc.Name, propertiesConfig, myTouchpanel); - } - Debug.Console(0, "[{0}] Factory: Unable to get control properties from device config for {1}", dc.Key, dc.Name); - return null; - } - } -} \ No newline at end of file diff --git a/EssentialsPluginTemplate/EssentialsPluginLogicDeviceTemplate.cs b/EssentialsPluginTemplate/EssentialsPluginLogicDeviceTemplate.cs deleted file mode 100644 index 9408340..0000000 --- a/EssentialsPluginTemplate/EssentialsPluginLogicDeviceTemplate.cs +++ /dev/null @@ -1,86 +0,0 @@ -using Crestron.SimplSharpPro.DeviceSupport; -using PepperDash.Core; -using PepperDash.Essentials.Core; -using PepperDash.Essentials.Core.Bridges; - -namespace EssentialsPluginTemplate -{ - /// - /// Plugin device template for logic devices that don't communicate outside the program - /// - /// - /// Rename the class to match the device plugin being developed. - /// - /// - /// "EssentialsPluginLogicDeviceTemplate" renamed to "SamsungMdcDevice" - /// - public class EssentialsPluginLogicDeviceTemplate : EssentialsBridgeableDevice - { - /// - /// It is often desirable to store the config - /// - private EssentialsPluginConfigObjectTemplate _config; - - - /// - /// Plugin device constructor - /// - /// A string - /// A string - /// An EssentialsPluginConfigObjectTemplate object - public EssentialsPluginLogicDeviceTemplate(string key, string name, EssentialsPluginConfigObjectTemplate config) - : base(key, name) - { - Debug.Console(0, this, "Constructiong new {0} instance", name); - - // store the config - _config = config; - - // TODO [ ] Update the constructor as needed for the plugin device being developed - } - - #region Overrides of EssentialsBridgeableDevice - - /// - /// Links the plugin device to the EISC bridge - /// - /// - /// - /// - /// - public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge) - { - var joinMap = new EssentialsPluginBridgeJoinMapTemplate(joinStart); - - // This adds the join map to the collection on the bridge - if (bridge != null) - { - bridge.AddJoinMap(Key, joinMap); - } - - var customJoins = JoinMapHelper.TryGetJoinMapAdvancedForDevice(joinMapKey); - - if (customJoins != null) - { - joinMap.SetCustomJoinData(customJoins); - } - - Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X")); - Debug.Console(0, "Linking to Bridge Type {0}", GetType().Name); - - // TODO [ ] Implement bridge links as needed - - // links to bridge - trilist.SetString(joinMap.DeviceName.JoinNumber, Name); - - trilist.OnlineStatusChange += (o, a) => - { - if (!a.DeviceOnLine) return; - - trilist.SetString(joinMap.DeviceName.JoinNumber, Name); - }; - } - - #endregion - } -} \ No newline at end of file diff --git a/EssentialsPluginTemplate/EssentialsPluginTemplate.csproj b/EssentialsPluginTemplate/EssentialsPluginTemplate.csproj deleted file mode 100644 index ffdcdac..0000000 --- a/EssentialsPluginTemplate/EssentialsPluginTemplate.csproj +++ /dev/null @@ -1,118 +0,0 @@ - - - Release - AnyCPU - 9.0.30729 - 2.0 - {9D249E47-8F95-4437-A6BB-563510287AD1} - Library - Properties - EssentialsPluginTemplate - EssentialsPluginTemplate - {0B4745B0-194B-4BB6-8E21-E9057CA92300};{4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - WindowsCE - E2BECB1F-8C8C-41ba-B736-9BE7D946A398 - 5.0 - SmartDeviceProject1 - v3.5 - Windows CE - - - - - .allowedReferenceRelatedFileExtensions - true - full - false - bin\Debug\ - DEBUG;TRACE; - prompt - 4 - 512 - true - true - off - bin\Debug\EssentialsPluginTemplate.xml - - - .allowedReferenceRelatedFileExtensions - none - true - bin\Release\ - prompt - 4 - 512 - true - true - off - - - - False - ..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.UI.dll - - - False - ..\packages\PepperDashEssentials\lib\net35\Essentials Devices Common.dll - - - - False - ..\packages\PepperDashEssentials\lib\net35\PepperDashEssentials.dll - - - False - ..\packages\PepperDashEssentials\lib\net35\PepperDash_Core.dll - - - False - ..\packages\PepperDashEssentials\lib\net35\PepperDash_Essentials_Core.dll - - - False - ..\packages\PepperDashEssentials\lib\net35\PepperDash_Essentials_DM.dll - - - False - ..\..\..\..\ProgramData\Crestron\SDK\SimplSharpCustomAttributesInterface.dll - False - - - False - ..\..\..\..\ProgramData\Crestron\SDK\SimplSharpHelperInterface.dll - False - - - False - ..\..\..\..\ProgramData\Crestron\SDK\SimplSharpNewtonsoft.dll - - - False - ..\..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpPro.exe - False - - - False - ..\..\..\..\ProgramData\Crestron\SDK\SimplSharpReflectionInterface.dll - - - - - - - - - - - - - - - - - - rem S# Pro preparation will execute after these operations - - - - \ No newline at end of file diff --git a/EssentialsPluginTemplate/EssentialsPluginTemplate.nuspec b/EssentialsPluginTemplate/EssentialsPluginTemplate.nuspec deleted file mode 100644 index 92c44d5..0000000 --- a/EssentialsPluginTemplate/EssentialsPluginTemplate.nuspec +++ /dev/null @@ -1,26 +0,0 @@ - - - - - EssentialsPluginTemplate - 1.0.0 - - Essentials Plugin Template - PepperDash Technologies - pepperdash - false - MIT - - https://github.com/PepperDash-Engineering/template-essentials_plugin - Copyright 2020 - - Essentials Plugin Template is a Crestron SIMPL# plugin used with SIMPL# Pro applications such as Essentials to expose functionality in SIMPL Windows programs using Bridges. - crestron 3series 4series - - - - - - - - \ No newline at end of file diff --git a/EssentialsPluginTemplate/EssentialsPluginTemplate.sln b/EssentialsPluginTemplate/EssentialsPluginTemplate.sln deleted file mode 100644 index 3919262..0000000 --- a/EssentialsPluginTemplate/EssentialsPluginTemplate.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EssentialsPluginTemplate", "EssentialsPluginTemplate.csproj", "{9D249E47-8F95-4437-A6BB-563510287AD1}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {9D249E47-8F95-4437-A6BB-563510287AD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9D249E47-8F95-4437-A6BB-563510287AD1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9D249E47-8F95-4437-A6BB-563510287AD1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9D249E47-8F95-4437-A6BB-563510287AD1}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/EssentialsPluginTemplate/Properties/AssemblyInfo.cs b/EssentialsPluginTemplate/Properties/AssemblyInfo.cs deleted file mode 100644 index d80b3c1..0000000 --- a/EssentialsPluginTemplate/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Reflection; - -[assembly: AssemblyTitle("EssentialsPluginTemplate")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("EssentialsPluginTemplate")] -[assembly: AssemblyCopyright("Copyright © 2020")] -[assembly: AssemblyVersion("1.0.0.*")] -[assembly: AssemblyInformationalVersion("0.0.0-buildType-build#")] -[assembly: Crestron.SimplSharp.Reflection.AssemblyInformationalVersion("0.0.0-buildType-build#")] - diff --git a/EssentialsPluginTemplate/Properties/ControlSystem.cfg b/EssentialsPluginTemplate/Properties/ControlSystem.cfg deleted file mode 100644 index e69de29..0000000 diff --git a/EssentialsPluginTemplate/configurationFile.json b/EssentialsPluginTemplate/configurationFile.json deleted file mode 100644 index c5027c1..0000000 --- a/EssentialsPluginTemplate/configurationFile.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "system_url": "", - "template": { - "info": { - "comment": "", - "requiredControlSofwareVersion": "", - "systemType": "huddle", - "lastModifiedDate": "2018-07-09T20:00:47.873Z", - "lastUid": 23, - "processorType": "rmc3" - }, - "devices": [ - { - "key": "processor", - "group": "processor", - "uid": 0, - "supportsCompliance": true, - "type": "rmc3", - "properties": {}, - "name": "RMC3" - }, - { - "key": "example-plugin-1", - "name": "Example Plugin Name", - "type": "examplePluginDevice", - "group": "pluginDevices", - "properties": { - "control": { - "method": "tcpIp", - "controlPortDevKey": "processor", - "controlPortNumber": 1, - "comParams": { - "baudRate": 9600, - "dataBits": 8, - "stopBits": 1, - "parity": "None", - "protocol": "RS232", - "hardwareHandshake": "None", - "softwareHandshake": "None" - }, - "tcpSshProperties": { - "address": "10.0.0.200", - "port": 23, - "username": "admin", - "password": "password", - "autoReconnect": true, - "autoReconnectIntervalMs": 10000 - } - }, - "pollTimeMs": 30000, - "warningTimeoutMs": 180000, - "errorTimeoutMs": 300000, - "pluginCollection": { - "1": { - "name": "Item 1", - "value": 1 - }, - "2": { - "name": "Item 2", - "value": 2 - } - } - } - }, - { - "key": "example-plugin-bridge-1", - "uid": 11, - "name": "Example Plugin Bridge", - "group": "api", - "type": "eiscApiAdvanced", - "properties": { - "control": { - "tcpSshProperties": { - "address": "127.0.0.2", - "port": 0 - }, - "ipid": "B1" - }, - "devices": [ - { - "deviceKey": "example-plugin-1", - "joinStart": 1 - } - ] - } - } - ], - "rooms": [], - "sourceLists": {}, - "tieLines": [] - }, - "template_url": "", - "system": {} -} \ No newline at end of file diff --git a/images/logo_pdt_no_tagline_600.png b/images/logo_pdt_no_tagline_600.png new file mode 100644 index 0000000000000000000000000000000000000000..6fc11ff1413bf7b6d9ec00319930bc389c9c7317 GIT binary patch literal 350979 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

2sLjZ+64;=KYp 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 - + \ No newline at end of file From 97e2e91919180f125d491e24e592151d7224799a Mon Sep 17 00:00:00 2001 From: jdevito Date: Thu, 21 Apr 2022 09:57:08 -0500 Subject: [PATCH 3/5] Update README.md fixed typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ea1e7eb..a014855 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # IN DEVELOPMENT -The plugin is current in development +The plugin is currently in development # Acuity Fresco Lighting Plugin From 7629888d72dc16aa382d4b22b0a578a96f44fbd6 Mon Sep 17 00:00:00 2001 From: jdevito Date: Thu, 5 May 2022 12:36:18 -0500 Subject: [PATCH 4/5] Update essentialsplugins-betabuilds.yml --- .github/workflows/essentialsplugins-betabuilds.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/essentialsplugins-betabuilds.yml b/.github/workflows/essentialsplugins-betabuilds.yml index 9ad00cb..7c8c8f4 100644 --- a/.github/workflows/essentialsplugins-betabuilds.yml +++ b/.github/workflows/essentialsplugins-betabuilds.yml @@ -123,7 +123,8 @@ jobs: Write-Output "Unable to apply version to AssemblyInfo.cs files"; } - name: add PepperDash Eng Feed - run: nuget sources add -name github -source https://nuget.pkg.github.com/pepperdash-engineering/index.json -username ${{ secrets.GH_PACKAGE_USER }} -password ${{ secrets.GH_PACKAGE_PASSWORD }} + # run: nuget sources add -name github -source https://nuget.pkg.github.com/pepperdash-engineering/index.json -username ${{ secrets.GH_PACKAGE_USER }} -password ${{ secrets.GH_PACKAGE_PASSWORD }} + run: nuget sources add -name github -source https://nuget.pkg.github.com/pepperdash/index.json -username Pepperdash -password ${{ secrets.GITHUB_TOKEN }} - name: restore Nuget Packages run: nuget install .\packages.config -OutputDirectory .\packages -ExcludeVersion # Set the SOLUTION_PATH From 6776d6efb286fe44700bdcaba7a53b2b9a681aeb Mon Sep 17 00:00:00 2001 From: jdevito Date: Thu, 5 May 2022 12:38:04 -0500 Subject: [PATCH 5/5] Update essentialsplugins-releasebuilds.yml --- .github/workflows/essentialsplugins-releasebuilds.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/essentialsplugins-releasebuilds.yml b/.github/workflows/essentialsplugins-releasebuilds.yml index f5606d9..672d49a 100644 --- a/.github/workflows/essentialsplugins-releasebuilds.yml +++ b/.github/workflows/essentialsplugins-releasebuilds.yml @@ -78,7 +78,8 @@ jobs: Write-Output "Unable to apply version to AssemblyInfo.cs files"; } - name: add PepperDash Eng Feed - run: nuget sources add -name github -source https://nuget.pkg.github.com/pepperdash-engineering/index.json -username ${{ secrets.GH_PACKAGE_USER }} -password ${{ secrets.GH_PACKAGE_PASSWORD }} + # run: nuget sources add -name github -source https://nuget.pkg.github.com/pepperdash-engineering/index.json -username ${{ secrets.GH_PACKAGE_USER }} -password ${{ secrets.GH_PACKAGE_PASSWORD }} + run: nuget sources add -name github -source https://nuget.pkg.github.com/pepperdash/index.json -username Pepperdash -password ${{ secrets.GITHUB_TOKEN }} - name: restore Nuget Packages run: nuget install .\packages.config -OutputDirectory .\packages -ExcludeVersion # Set the SOLUTION_PATH