diff --git a/src/PepperDash.Essentials.Core/CrestronIO/GenericDigitalInputDevice.cs b/src/PepperDash.Essentials.Core/CrestronIO/GenericDigitalInputDevice.cs index 6f858144..20ed56d6 100644 --- a/src/PepperDash.Essentials.Core/CrestronIO/GenericDigitalInputDevice.cs +++ b/src/PepperDash.Essentials.Core/CrestronIO/GenericDigitalInputDevice.cs @@ -21,6 +21,7 @@ namespace PepperDash.Essentials.Core.CrestronIO public class GenericDigitalInputDevice : EssentialsBridgeableDevice, IDigitalInput, IHasFeedback { private DigitalInput inputPort; + private bool invertState; /// /// Gets or sets the InputStateFeedback @@ -41,7 +42,10 @@ namespace PepperDash.Essentials.Core.CrestronIO IOPortConfig config) : base(key, name) { - InputStateFeedback = new BoolFeedback("inputState", () => inputPort.State); + invertState = !string.IsNullOrEmpty(config.CircuitType) && + config.CircuitType.Equals("NC", StringComparison.OrdinalIgnoreCase); + + InputStateFeedback = new BoolFeedback("inputState", () => invertState ? !inputPort.State : inputPort.State); AddPostActivationAction(() => { diff --git a/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportInputDevice.cs b/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportInputDevice.cs index e2c4474a..43d97e9c 100644 --- a/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportInputDevice.cs +++ b/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportInputDevice.cs @@ -18,6 +18,7 @@ namespace PepperDash.Essentials.Core.CrestronIO public class GenericVersiportDigitalInputDevice : EssentialsBridgeableDevice, IDigitalInput, IPartitionStateProvider, IHasFeedback { private Versiport inputPort; + private bool invertState; /// /// Gets or sets the InputStateFeedback @@ -47,7 +48,10 @@ namespace PepperDash.Essentials.Core.CrestronIO public GenericVersiportDigitalInputDevice(string key, string name, Func postActivationFunc, IOPortConfig config) : base(key, name) { - InputStateFeedback = new BoolFeedback("inputState", () => inputPort.DigitalIn); + invertState = !string.IsNullOrEmpty(config.CircuitType) && + config.CircuitType.Equals("NC", StringComparison.OrdinalIgnoreCase); + + InputStateFeedback = new BoolFeedback("inputState", () => invertState ? !inputPort.DigitalIn : inputPort.DigitalIn); PartitionPresentFeedback = new BoolFeedback("partitionPresent", () => !inputPort.DigitalIn); AddPostActivationAction(() => diff --git a/src/PepperDash.Essentials.Core/CrestronIO/IOPortConfig.cs b/src/PepperDash.Essentials.Core/CrestronIO/IOPortConfig.cs index 8641df69..7b76958b 100644 --- a/src/PepperDash.Essentials.Core/CrestronIO/IOPortConfig.cs +++ b/src/PepperDash.Essentials.Core/CrestronIO/IOPortConfig.cs @@ -37,5 +37,12 @@ namespace PepperDash.Essentials.Core.CrestronIO /// [JsonProperty("minimumChange")] public int MinimumChange { get; set; } + + /// + /// Gets or sets the circuit type: "NO" (Normally Open) or "NC" (Normally Closed) + /// If set to "NC", the input state will be inverted. Defaults to "NO" if not specified. + /// + [JsonProperty("circuitType")] + public string CircuitType { get; set; } = "NO"; } } \ No newline at end of file