diff --git a/PepperDashEssentials/PepperDashEssentials.csproj b/PepperDashEssentials/PepperDashEssentials.csproj
index 14e916f9..4442a2fc 100644
--- a/PepperDashEssentials/PepperDashEssentials.csproj
+++ b/PepperDashEssentials/PepperDashEssentials.csproj
@@ -99,6 +99,10 @@
False
..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpReflectionInterface.dll
+
+ False
+ ..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpTimerEventInterface.dll
+
diff --git a/PepperDashEssentials/Properties/AssemblyInfo.cs b/PepperDashEssentials/Properties/AssemblyInfo.cs
index b603f138..36c70ef4 100644
--- a/PepperDashEssentials/Properties/AssemblyInfo.cs
+++ b/PepperDashEssentials/Properties/AssemblyInfo.cs
@@ -4,5 +4,5 @@
[assembly: AssemblyCompany("PepperDash Technology Corp")]
[assembly: AssemblyProduct("PepperDashEssentials")]
[assembly: AssemblyCopyright("Copyright © PepperDash Technology Corp 2018")]
-[assembly: AssemblyVersion("1.2.5.*")]
+[assembly: AssemblyVersion("1.2.6.*")]
diff --git a/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs b/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs
index eeb1e9cb..5912c6d1 100644
--- a/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs
+++ b/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs
@@ -1,334 +1,364 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-using Crestron.SimplSharp;
-using Newtonsoft.Json;
-
-using PepperDash.Core;
-using PepperDash.Essentials;
-using PepperDash.Essentials.Core;
-using PepperDash.Essentials.Core.Config;
-
-namespace PepperDash.Essentials.Room.Config
-{
- public class EssentialsRoomConfig : DeviceConfig
- {
- ///
- /// Returns a room object from this config data
- ///
- ///
- public Device GetRoomObject()
- {
- var typeName = Type.ToLower();
- if (typeName == "huddle")
- {
- var props = JsonConvert.DeserializeObject
- (this.Properties.ToString());
- var disp = DeviceManager.GetDeviceForKey(props.DefaultDisplayKey) as IRoutingSinkWithSwitching;
- var audio = DeviceManager.GetDeviceForKey(props.DefaultAudioKey) as IRoutingSinkNoSwitching;
- var huddle = new EssentialsHuddleSpaceRoom(Key, Name, disp, audio, props);
-
- if (props.Occupancy != null)
- huddle.SetRoomOccupancy(DeviceManager.GetDeviceForKey(props.Occupancy.DeviceKey) as
- PepperDash.Essentials.Devices.Common.Occupancy.IOccupancyStatusProvider, props.Occupancy.TimoutMinutes);
- huddle.LogoUrl = props.Logo.GetUrl();
- huddle.SourceListKey = props.SourceListKey;
- huddle.DefaultSourceItem = props.DefaultSourceItem;
- huddle.DefaultVolume = (ushort)(props.Volumes.Master.Level * 65535 / 100);
- return huddle;
- }
- //else if (typeName == "presentation")
- //{
- // var props = JsonConvert.DeserializeObject
- // (this.Properties.ToString());
- // var displaysDict = new Dictionary();
- // uint i = 1;
- // foreach (var dispKey in props.DisplayKeys) // read in the ordered displays list
- // {
- // var disp = DeviceManager.GetDeviceForKey(dispKey) as IRoutingSinkWithSwitching;
- // displaysDict.Add(i++, disp);
- // }
-
- // // Get the master volume control
- // IBasicVolumeWithFeedback masterVolumeControlDev = props.Volumes.Master.GetDevice();
-
-
- // var presRoom = new EssentialsPresentationRoom(Key, Name, displaysDict, masterVolumeControlDev, props);
- // return presRoom;
- //}
- else if (typeName == "huddlevtc1")
- {
- var props = JsonConvert.DeserializeObject
- (this.Properties.ToString());
- var disp = DeviceManager.GetDeviceForKey(props.DefaultDisplayKey) as IRoutingSinkWithSwitching;
-
- var codec = DeviceManager.GetDeviceForKey(props.VideoCodecKey) as
- PepperDash.Essentials.Devices.Common.VideoCodec.VideoCodecBase;
-
- var rm = new EssentialsHuddleVtc1Room(Key, Name, disp, codec, codec, props);
- // Add Occupancy object from config
-
- if (props.Occupancy != null)
- rm.SetRoomOccupancy(DeviceManager.GetDeviceForKey(props.Occupancy.DeviceKey) as
- PepperDash.Essentials.Devices.Common.Occupancy.IOccupancyStatusProvider, props.Occupancy.TimoutMinutes);
- rm.LogoUrl = props.Logo.GetUrl();
- rm.SourceListKey = props.SourceListKey;
- rm.DefaultSourceItem = props.DefaultSourceItem;
- rm.DefaultVolume = (ushort)(props.Volumes.Master.Level * 65535 / 100);
-
- rm.MicrophonePrivacy = GetMicrophonePrivacy(props, rm); // Get Microphone Privacy object, if any
-
- rm.Emergency = GetEmergency(props, rm); // Get emergency object, if any
-
- return rm;
- }
- else if (typeName == "ddvc01Bridge")
- {
- return new Device(Key, Name); // placeholder device that does nothing.
- }
-
- return null;
- }
-
- ///
- /// Gets and operating, standalone emergegncy object that can be plugged into a room.
- /// Returns null if there is no emergency defined
- ///
- EssentialsRoomEmergencyBase GetEmergency(EssentialsRoomPropertiesConfig props, EssentialsRoomBase room)
- {
- // This emergency
- var emergency = props.Emergency;
- if (emergency != null)
- {
- //switch on emergency type here. Right now only contact and shutdown
- var e = new EssentialsRoomEmergencyContactClosure(room.Key + "-emergency", props.Emergency, room);
- DeviceManager.AddDevice(e);
- }
- return null;
- }
-
- ///
- ///
- ///
- ///
- ///
- ///
- PepperDash.Essentials.Devices.Common.Microphones.MicrophonePrivacyController GetMicrophonePrivacy(
- EssentialsRoomPropertiesConfig props, EssentialsHuddleVtc1Room room)
- {
- var microphonePrivacy = props.MicrophonePrivacy;
- if (microphonePrivacy == null)
- {
- Debug.Console(0, "ERROR: Cannot create microphone privacy with null properties");
- return null;
- }
- // Get the MicrophonePrivacy device from the device manager
- var mP = (DeviceManager.GetDeviceForKey(props.MicrophonePrivacy.DeviceKey) as
- PepperDash.Essentials.Devices.Common.Microphones.MicrophonePrivacyController);
- // Set this room as the IPrivacy device
- if (mP == null)
- {
- Debug.Console(0, "ERROR: Selected device {0} is not MicrophonePrivacyController", props.MicrophonePrivacy.DeviceKey);
- return null;
- }
- mP.SetPrivacyDevice(room);
-
- var behaviour = props.MicrophonePrivacy.Behaviour.ToLower();
-
- if (behaviour == null)
- {
- Debug.Console(0, "WARNING: No behaviour defined for MicrophonePrivacyController");
- return null;
- }
- if (behaviour == "trackroomstate")
- {
- // Tie LED enable to room power state
- room.OnFeedback.OutputChange += (o, a) =>
- {
- if (room.OnFeedback.BoolValue)
- mP.EnableLeds = true;
- else
- mP.EnableLeds = false;
- };
-
- mP.EnableLeds = room.OnFeedback.BoolValue;
- }
- else if (behaviour == "trackcallstate")
- {
- // Tie LED enable to room power state
- room.InCallFeedback.OutputChange += (o, a) =>
- {
- if (room.InCallFeedback.BoolValue)
- mP.EnableLeds = true;
- else
- mP.EnableLeds = false;
- };
-
- mP.EnableLeds = room.InCallFeedback.BoolValue;
- }
-
- return mP;
- }
-
- }
-
- ///
- ///
- ///
- public class EssentialsRoomPropertiesConfig
- {
- [JsonProperty("addresses")]
- public EssentialsRoomAddressPropertiesConfig Addresses { get; set; }
-
- [JsonProperty("description")]
- public string Description { get; set; }
-
- [JsonProperty("emergency")]
- public EssentialsRoomEmergencyConfig Emergency { get; set; }
-
- [JsonProperty("help")]
- public EssentialsHelpPropertiesConfig Help { get; set; }
-
- [JsonProperty("helpMessage")]
- public string HelpMessage { get; set; }
-
- [JsonProperty("environment")]
- public EssentialsEnvironmentPropertiesConfig Environment { get; set; }
-
- [JsonProperty("logo")]
- public EssentialsLogoPropertiesConfig Logo { get; set; }
-
- [JsonProperty("microphonePrivacy")]
- public EssentialsRoomMicrophonePrivacyConfig MicrophonePrivacy { get; set; }
-
- [JsonProperty("occupancy")]
- public EssentialsRoomOccSensorConfig Occupancy { get; set; }
-
- [JsonProperty("oneButtonMeeting")]
- public EssentialsOneButtonMeetingPropertiesConfig OneButtonMeeting { get; set; }
-
- [JsonProperty("shutdownVacancySeconds")]
- public int ShutdownVacancySeconds { get; set; }
-
- [JsonProperty("shutdownPromptSeconds")]
- public int ShutdownPromptSeconds { get; set; }
-
- [JsonProperty("tech")]
- public EssentialsRoomTechConfig Tech { get; set; }
-
- [JsonProperty("volumes")]
- public EssentialsRoomVolumesConfig Volumes { get; set; }
-
- [JsonProperty("zeroVolumeWhenSwtichingVolumeDevices")]
- public bool ZeroVolumeWhenSwtichingVolumeDevices { get; set; }
- }
-
- public class EssentialsEnvironmentPropertiesConfig
- {
- public bool Enabled { get; set; }
-
- [JsonProperty("deviceKeys")]
- public List DeviceKeys { get; set; }
-
- public EssentialsEnvironmentPropertiesConfig()
- {
- DeviceKeys = new List();
- }
-
- }
-
- public class EssentialsRoomMicrophonePrivacyConfig
- {
- [JsonProperty("deviceKey")]
- public string DeviceKey { get; set; }
-
- [JsonProperty("behaviour")]
- public string Behaviour { get; set; }
- }
-
- ///
- /// Properties for the help text box
- ///
- public class EssentialsHelpPropertiesConfig
- {
- [JsonProperty("message")]
- public string Message { get; set; }
-
- [JsonProperty("showCallButton")]
- public bool ShowCallButton { get; set; }
-
- ///
- /// Defaults to "Call Help Desk"
- ///
- [JsonProperty("callButtonText")]
- public string CallButtonText { get; set; }
-
- public EssentialsHelpPropertiesConfig()
- {
- CallButtonText = "Call Help Desk";
- }
- }
-
- ///
- ///
- ///
- public class EssentialsOneButtonMeetingPropertiesConfig
- {
- [JsonProperty("enable")]
- public bool Enable { get; set; }
- }
-
- public class EssentialsRoomAddressPropertiesConfig
- {
- [JsonProperty("phoneNumber")]
- public string PhoneNumber { get; set; }
-
- [JsonProperty("sipAddress")]
- public string SipAddress { get; set; }
- }
-
-
- ///
- /// Properties for the room's logo on panels
- ///
- public class EssentialsLogoPropertiesConfig
- {
- [JsonProperty("type")]
- public string Type { get; set; }
-
- [JsonProperty("url")]
- public string Url { get; set; }
- ///
- /// Gets either the custom URL, a local-to-processor URL, or null if it's a default logo
- ///
- public string GetUrl()
- {
- if (Type == "url")
- return Url;
- if (Type == "system")
- return string.Format("http://{0}:8080/logo.png",
- CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, 0));
- return null;
- }
- }
-
- ///
- /// Represents occupancy sensor(s) setup for a room
- ///
- public class EssentialsRoomOccSensorConfig
- {
- [JsonProperty("deviceKey")]
- public string DeviceKey { get; set; }
-
- [JsonProperty("timoutMinutes")]
- public int TimoutMinutes { get; set; }
- }
-
- public class EssentialsRoomTechConfig
- {
- [JsonProperty("password")]
- public string Password { get; set; }
- }
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Crestron.SimplSharp;
+using Newtonsoft.Json;
+
+using PepperDash.Core;
+using PepperDash.Essentials;
+using PepperDash.Essentials.Core;
+using PepperDash.Essentials.Core.Config;
+
+namespace PepperDash.Essentials.Room.Config
+{
+ public class EssentialsRoomConfig : DeviceConfig
+ {
+ ///
+ /// Returns a room object from this config data
+ ///
+ ///
+ public Device GetRoomObject()
+ {
+ var typeName = Type.ToLower();
+ if (typeName == "huddle")
+ {
+ var props = JsonConvert.DeserializeObject
+ (this.Properties.ToString());
+ var disp = DeviceManager.GetDeviceForKey(props.DefaultDisplayKey) as IRoutingSinkWithSwitching;
+ var audio = DeviceManager.GetDeviceForKey(props.DefaultAudioKey) as IRoutingSinkNoSwitching;
+ var huddle = new EssentialsHuddleSpaceRoom(Key, Name, disp, audio, props);
+
+ if (props.Occupancy != null)
+ huddle.SetRoomOccupancy(DeviceManager.GetDeviceForKey(props.Occupancy.DeviceKey) as
+ PepperDash.Essentials.Devices.Common.Occupancy.IOccupancyStatusProvider, props.Occupancy.TimoutMinutes);
+ huddle.LogoUrl = props.Logo.GetUrl();
+ huddle.SourceListKey = props.SourceListKey;
+ huddle.DefaultSourceItem = props.DefaultSourceItem;
+ huddle.DefaultVolume = (ushort)(props.Volumes.Master.Level * 65535 / 100);
+ return huddle;
+ }
+ //else if (typeName == "presentation")
+ //{
+ // var props = JsonConvert.DeserializeObject
+ // (this.Properties.ToString());
+ // var displaysDict = new Dictionary();
+ // uint i = 1;
+ // foreach (var dispKey in props.DisplayKeys) // read in the ordered displays list
+ // {
+ // var disp = DeviceManager.GetDeviceForKey(dispKey) as IRoutingSinkWithSwitching;
+ // displaysDict.Add(i++, disp);
+ // }
+
+ // // Get the master volume control
+ // IBasicVolumeWithFeedback masterVolumeControlDev = props.Volumes.Master.GetDevice();
+
+
+ // var presRoom = new EssentialsPresentationRoom(Key, Name, displaysDict, masterVolumeControlDev, props);
+ // return presRoom;
+ //}
+ else if (typeName == "huddlevtc1")
+ {
+ var props = JsonConvert.DeserializeObject
+ (this.Properties.ToString());
+ var disp = DeviceManager.GetDeviceForKey(props.DefaultDisplayKey) as IRoutingSinkWithSwitching;
+
+ var codec = DeviceManager.GetDeviceForKey(props.VideoCodecKey) as
+ PepperDash.Essentials.Devices.Common.VideoCodec.VideoCodecBase;
+
+ var rm = new EssentialsHuddleVtc1Room(Key, Name, disp, codec, codec, props);
+ // Add Occupancy object from config
+
+ if (props.Occupancy != null)
+ rm.SetRoomOccupancy(DeviceManager.GetDeviceForKey(props.Occupancy.DeviceKey) as
+ PepperDash.Essentials.Devices.Common.Occupancy.IOccupancyStatusProvider, props.Occupancy.TimoutMinutes);
+ rm.LogoUrl = props.Logo.GetUrl();
+ rm.SourceListKey = props.SourceListKey;
+ rm.DefaultSourceItem = props.DefaultSourceItem;
+ rm.DefaultVolume = (ushort)(props.Volumes.Master.Level * 65535 / 100);
+
+ rm.MicrophonePrivacy = GetMicrophonePrivacy(props, rm); // Get Microphone Privacy object, if any
+
+ rm.Emergency = GetEmergency(props, rm); // Get emergency object, if any
+
+ return rm;
+ }
+ else if (typeName == "ddvc01Bridge")
+ {
+ return new Device(Key, Name); // placeholder device that does nothing.
+ }
+
+ return null;
+ }
+
+ ///
+ /// Gets and operating, standalone emergegncy object that can be plugged into a room.
+ /// Returns null if there is no emergency defined
+ ///
+ EssentialsRoomEmergencyBase GetEmergency(EssentialsRoomPropertiesConfig props, EssentialsRoomBase room)
+ {
+ // This emergency
+ var emergency = props.Emergency;
+ if (emergency != null)
+ {
+ //switch on emergency type here. Right now only contact and shutdown
+ var e = new EssentialsRoomEmergencyContactClosure(room.Key + "-emergency", props.Emergency, room);
+ DeviceManager.AddDevice(e);
+ }
+ return null;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ PepperDash.Essentials.Devices.Common.Microphones.MicrophonePrivacyController GetMicrophonePrivacy(
+ EssentialsRoomPropertiesConfig props, EssentialsHuddleVtc1Room room)
+ {
+ var microphonePrivacy = props.MicrophonePrivacy;
+ if (microphonePrivacy == null)
+ {
+ Debug.Console(0, "ERROR: Cannot create microphone privacy with null properties");
+ return null;
+ }
+ // Get the MicrophonePrivacy device from the device manager
+ var mP = (DeviceManager.GetDeviceForKey(props.MicrophonePrivacy.DeviceKey) as
+ PepperDash.Essentials.Devices.Common.Microphones.MicrophonePrivacyController);
+ // Set this room as the IPrivacy device
+ if (mP == null)
+ {
+ Debug.Console(0, "ERROR: Selected device {0} is not MicrophonePrivacyController", props.MicrophonePrivacy.DeviceKey);
+ return null;
+ }
+ mP.SetPrivacyDevice(room);
+
+ var behaviour = props.MicrophonePrivacy.Behaviour.ToLower();
+
+ if (behaviour == null)
+ {
+ Debug.Console(0, "WARNING: No behaviour defined for MicrophonePrivacyController");
+ return null;
+ }
+ if (behaviour == "trackroomstate")
+ {
+ // Tie LED enable to room power state
+ room.OnFeedback.OutputChange += (o, a) =>
+ {
+ if (room.OnFeedback.BoolValue)
+ mP.EnableLeds = true;
+ else
+ mP.EnableLeds = false;
+ };
+
+ mP.EnableLeds = room.OnFeedback.BoolValue;
+ }
+ else if (behaviour == "trackcallstate")
+ {
+ // Tie LED enable to room power state
+ room.InCallFeedback.OutputChange += (o, a) =>
+ {
+ if (room.InCallFeedback.BoolValue)
+ mP.EnableLeds = true;
+ else
+ mP.EnableLeds = false;
+ };
+
+ mP.EnableLeds = room.InCallFeedback.BoolValue;
+ }
+
+ return mP;
+ }
+
+ }
+
+ ///
+ ///
+ ///
+ public class EssentialsRoomPropertiesConfig
+ {
+ [JsonProperty("addresses")]
+ public EssentialsRoomAddressPropertiesConfig Addresses { get; set; }
+
+ [JsonProperty("description")]
+ public string Description { get; set; }
+
+ [JsonProperty("emergency")]
+ public EssentialsRoomEmergencyConfig Emergency { get; set; }
+
+ [JsonProperty("help")]
+ public EssentialsHelpPropertiesConfig Help { get; set; }
+
+ [JsonProperty("helpMessage")]
+ public string HelpMessage { get; set; }
+
+ [JsonProperty("environment")]
+ public EssentialsEnvironmentPropertiesConfig Environment { get; set; }
+
+ [JsonProperty("logo")]
+ public EssentialsLogoPropertiesConfig Logo { get; set; }
+
+ [JsonProperty("microphonePrivacy")]
+ public EssentialsRoomMicrophonePrivacyConfig MicrophonePrivacy { get; set; }
+
+ [JsonProperty("occupancy")]
+ public EssentialsRoomOccSensorConfig Occupancy { get; set; }
+
+ [JsonProperty("oneButtonMeeting")]
+ public EssentialsOneButtonMeetingPropertiesConfig OneButtonMeeting { get; set; }
+
+ [JsonProperty("shutdownVacancySeconds")]
+ public int ShutdownVacancySeconds { get; set; }
+
+ [JsonProperty("shutdownPromptSeconds")]
+ public int ShutdownPromptSeconds { get; set; }
+
+ [JsonProperty("tech")]
+ public EssentialsRoomTechConfig Tech { get; set; }
+
+ [JsonProperty("volumes")]
+ public EssentialsRoomVolumesConfig Volumes { get; set; }
+
+ [JsonProperty("zeroVolumeWhenSwtichingVolumeDevices")]
+ public bool ZeroVolumeWhenSwtichingVolumeDevices { get; set; }
+ }
+
+ public class EssentialsEnvironmentPropertiesConfig
+ {
+ public bool Enabled { get; set; }
+
+ [JsonProperty("deviceKeys")]
+ public List DeviceKeys { get; set; }
+
+ public EssentialsEnvironmentPropertiesConfig()
+ {
+ DeviceKeys = new List();
+ }
+
+ }
+
+ public class EssentialsRoomMicrophonePrivacyConfig
+ {
+ [JsonProperty("deviceKey")]
+ public string DeviceKey { get; set; }
+
+ [JsonProperty("behaviour")]
+ public string Behaviour { get; set; }
+ }
+
+ ///
+ /// Properties for the help text box
+ ///
+ public class EssentialsHelpPropertiesConfig
+ {
+ [JsonProperty("message")]
+ public string Message { get; set; }
+
+ [JsonProperty("showCallButton")]
+ public bool ShowCallButton { get; set; }
+
+ ///
+ /// Defaults to "Call Help Desk"
+ ///
+ [JsonProperty("callButtonText")]
+ public string CallButtonText { get; set; }
+
+ public EssentialsHelpPropertiesConfig()
+ {
+ CallButtonText = "Call Help Desk";
+ }
+ }
+
+ ///
+ ///
+ ///
+ public class EssentialsOneButtonMeetingPropertiesConfig
+ {
+ [JsonProperty("enable")]
+ public bool Enable { get; set; }
+ }
+
+ public class EssentialsRoomAddressPropertiesConfig
+ {
+ [JsonProperty("phoneNumber")]
+ public string PhoneNumber { get; set; }
+
+ [JsonProperty("sipAddress")]
+ public string SipAddress { get; set; }
+ }
+
+
+ ///
+ /// Properties for the room's logo on panels
+ ///
+ public class EssentialsLogoPropertiesConfig
+ {
+ [JsonProperty("type")]
+ public string Type { get; set; }
+
+ [JsonProperty("url")]
+ public string Url { get; set; }
+ ///
+ /// Gets either the custom URL, a local-to-processor URL, or null if it's a default logo
+ ///
+ public string GetUrl()
+ {
+ if (Type == "url")
+ return Url;
+ if (Type == "system")
+ return string.Format("http://{0}:8080/logo.png",
+ CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, 0));
+ return null;
+ }
+ }
+
+ ///
+ /// Represents occupancy sensor(s) setup for a room
+ ///
+ public class EssentialsRoomOccSensorConfig
+ {
+ [JsonProperty("deviceKey")]
+ public string DeviceKey { get; set; }
+
+ [JsonProperty("timoutMinutes")]
+ public int TimoutMinutes { get; set; }
+
+ [JsonProperty("enableRoomOnWhenOccupied")]
+ public bool EnableRoomOnWhenOccupied { get; set; }
+
+ [JsonProperty("occupancyStartTime")]
+ public string OccupancyStartTime { get; set; }
+
+ [JsonProperty("occupancyEndTime")]
+ public string OccupancyEndTime { get; set; }
+
+ [JsonProperty("enableSunday")]
+ public bool EnableSunday { get; set; }
+
+ [JsonProperty("enableMonday")]
+ public bool EnableMonday { get; set; }
+
+ [JsonProperty("enableTuesday")]
+ public bool EnableTuesday { get; set; }
+
+ [JsonProperty("enableWednesday")]
+ public bool EnableWednesday { get; set; }
+
+ [JsonProperty("enableThursday")]
+ public bool EnableThursday { get; set; }
+
+ [JsonProperty("enableFriday")]
+ public bool EnableFriday { get; set; }
+
+ [JsonProperty("enableSaturday")]
+ public bool EnableSaturday { get; set; }
+ }
+
+ public class EssentialsRoomTechConfig
+ {
+ [JsonProperty("password")]
+ public string Password { get; set; }
+ }
}
\ No newline at end of file
diff --git a/PepperDashEssentials/Room/Types/EssentialsHuddleSpaceRoom.cs b/PepperDashEssentials/Room/Types/EssentialsHuddleSpaceRoom.cs
index 5b7bdfde..999f3375 100644
--- a/PepperDashEssentials/Room/Types/EssentialsHuddleSpaceRoom.cs
+++ b/PepperDashEssentials/Room/Types/EssentialsHuddleSpaceRoom.cs
@@ -387,7 +387,7 @@ namespace PepperDash.Essentials
///
/// Will power the room on with the last-used source
///
- public void PowerOnToDefaultOrLastSource()
+ public override void PowerOnToDefaultOrLastSource()
{
if (!EnablePowerOnToLastSource || LastSourceKey == null)
return;
diff --git a/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs b/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs
index a5bdb1a6..67345f05 100644
--- a/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs
+++ b/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs
@@ -532,7 +532,7 @@ namespace PepperDash.Essentials
///
/// Will power the room on with the last-used source
///
- public void PowerOnToDefaultOrLastSource()
+ public override void PowerOnToDefaultOrLastSource()
{
if (!EnablePowerOnToLastSource || LastSourceKey == null)
return;
diff --git a/PepperDashEssentials/Room/Types/EssentialsRoomBase.cs b/PepperDashEssentials/Room/Types/EssentialsRoomBase.cs
index 686d18f3..736dcefe 100644
--- a/PepperDashEssentials/Room/Types/EssentialsRoomBase.cs
+++ b/PepperDashEssentials/Room/Types/EssentialsRoomBase.cs
@@ -59,7 +59,23 @@ namespace PepperDash.Essentials
///
/// Seconds after vacancy detected until prompt is displayed
///
- protected int RoomVacancyShutdownPromptSeconds;
+ protected int RoomVacancyShutdownPromptSeconds;
+
+ ///
+ /// The time of day at which the room occupancy power on feature should be enabled
+ ///
+ protected DateTime RoomOccpuancyPowerOnStart;
+
+ ///
+ /// The time of day at which the room occupancy power on feature should be disabled
+ ///
+ protected DateTime RoomOccupancyPowerOnEnd;
+
+ ///
+ /// Should the room power on to the default source if occupied between the start and end times
+ ///
+ protected bool RoomOccupancyPowerOnIsEnabled;
+
///
///
@@ -203,7 +219,12 @@ namespace PepperDash.Essentials
RoomOccupancy = statusProvider;
RoomOccupancy.RoomIsOccupiedFeedback.OutputChange += RoomIsOccupiedFeedback_OutputChange;
- }
+ }
+
+ ///
+ /// To allow base class to power room on to default source
+ ///
+ public abstract void PowerOnToDefaultOrLastSource();
void RoomIsOccupiedFeedback_OutputChange(object sender, EventArgs e)
{
@@ -217,16 +238,28 @@ namespace PepperDash.Essentials
{
Debug.Console(1, this, "Notice: Occupancy Detected");
// Reset the timer when the room is occupied
+ RoomVacancyShutdownTimer.Cancel();
- RoomVacancyShutdownTimer.Cancel();
+ if(RoomOccupancyPowerOnIsEnabled)
+ {
+ var currentTime = DateTime.Now.TimeOfDay;
+
+ if (currentTime.CompareTo(RoomOccpuancyPowerOnStart.TimeOfDay) > 0 && RoomOccupancyPowerOnEnd.TimeOfDay.CompareTo(currentTime) > 0)
+ {
+ PowerOnToDefaultOrLastSource();
+ }
+ }
}
+ }
+
+ ///
+ /// Sets up events in the scheduler for the start and end times of the appropriate days to enable and disable the RoomOccupancyPowerOnIsEnabled flag
+ ///
+ void SetUpOccupancyRoomOnEventsInScheduler()
+ {
+
}
- //void SwapVolumeDevices(IBasicVolumeControls currentDevice, IBasicVolumeControls newDevice)
- //{
-
- //}
-
///
/// Executes when RoomVacancyShutdownTimer expires. Used to trigger specific room actions as needed. Must nullify the timer object when executed
///
diff --git a/essentials-framework b/essentials-framework
index f28c5903..c9244a5d 160000
--- a/essentials-framework
+++ b/essentials-framework
@@ -1 +1 @@
-Subproject commit f28c59035c5de92dc2c957ad2bd56ada4538d0f3
+Subproject commit c9244a5d64b7ae915cba9536e2ef64f9abba2520