diff --git a/PepperDashEssentials/ControlSystem.cs b/PepperDashEssentials/ControlSystem.cs index 4a5f720e..f33537ae 100644 --- a/PepperDashEssentials/ControlSystem.cs +++ b/PepperDashEssentials/ControlSystem.cs @@ -37,7 +37,7 @@ namespace PepperDash.Essentials //CrestronConsole.AddNewConsoleCommand(s => GoWithLoad(), "go", "Loads configuration file", // ConsoleAccessLevelEnum.AccessOperator); - CrestronConsole.AddNewConsoleCommand(S => { ConfigWriter.WriteConfigFile(null); }, "writeconfig", "writes the current config to a file", ConsoleAccessLevelEnum.AccessOperator); + // CrestronConsole.AddNewConsoleCommand(S => { ConfigWriter.WriteConfigFile(null); }, "writeconfig", "writes the current config to a file", ConsoleAccessLevelEnum.AccessOperator); CrestronConsole.AddNewConsoleCommand(s => { diff --git a/PepperDashEssentials/OTHER/Fusion/EssentialsHuddleSpaceFusionSystemControllerBase.cs b/PepperDashEssentials/OTHER/Fusion/EssentialsHuddleSpaceFusionSystemControllerBase.cs index 4ff9c48f..d6e307a8 100644 --- a/PepperDashEssentials/OTHER/Fusion/EssentialsHuddleSpaceFusionSystemControllerBase.cs +++ b/PepperDashEssentials/OTHER/Fusion/EssentialsHuddleSpaceFusionSystemControllerBase.cs @@ -33,13 +33,13 @@ namespace PepperDash.Essentials.Fusion public event EventHandler RoomInfoChange; + public FusionCustomPropertiesBridge CustomPropertiesBridge = new FusionCustomPropertiesBridge(); + protected FusionRoom FusionRoom; protected EssentialsRoomBase Room; Dictionary SourceToFeedbackSigs = new Dictionary(); - public RoomInformation RoomInfo {get; protected set;} - StatusMonitorCollection ErrorMessageRollUp; protected StringSigData CurrentRoomSourceNameSig; @@ -431,14 +431,11 @@ namespace PepperDash.Essentials.Fusion protected void GetCustomProperties() { - try + if (FusionRoom.IsOnline) { - if (FusionRoom.IsOnline) - { - string fusionRoomCustomPropertiesRequest = @"RoomConfigurationRequest"; + string fusionRoomCustomPropertiesRequest = @"RoomConfigurationRequest"; - FusionRoom.ExtenderFusionRoomDataReservedSigs.RoomConfigQuery.StringValue = fusionRoomCustomPropertiesRequest; - } + FusionRoom.ExtenderFusionRoomDataReservedSigs.RoomConfigQuery.StringValue = fusionRoomCustomPropertiesRequest; } } @@ -777,6 +774,8 @@ namespace PepperDash.Essentials.Fusion string roomConfigResponseArgs = args.Sig.StringValue.Replace("&", "and"); + Debug.Console(1, this, "Fusion Response: \n {0}", roomConfigResponseArgs); + try { XmlDocument roomConfigResponse = new XmlDocument(); @@ -787,13 +786,15 @@ namespace PepperDash.Essentials.Fusion if (requestRoomConfiguration != null) { + RoomInformation roomInformation = new RoomInformation(); + foreach (XmlElement e in roomConfigResponse.FirstChild.ChildNodes) { if (e.Name == "RoomInformation") { XmlReader roomInfo = new XmlReader(e.OuterXml); - RoomInfo = CrestronXMLSerialization.DeSerializeObject(roomInfo); + roomInformation = CrestronXMLSerialization.DeSerializeObject(roomInfo); } else if (e.Name == "CustomFields") { @@ -821,10 +822,8 @@ namespace PepperDash.Essentials.Fusion customProperty.CustomFieldValue = elm.InnerText; } } - if (!RoomInfo.FusionCustomProperties.ContainsKey(customProperty.ID)) - RoomInfo.FusionCustomProperties.Add(customProperty.ID, customProperty); - else - RoomInfo.FusionCustomProperties[customProperty.ID] = customProperty; + + roomInformation.FusionCustomProperties.Add(customProperty); } } } @@ -832,6 +831,8 @@ namespace PepperDash.Essentials.Fusion var handler = RoomInfoChange; if (handler != null) handler(this, new EventArgs()); + + CustomPropertiesBridge.EvaluateRoomInfo(roomInformation); } } catch (Exception e) @@ -1567,11 +1568,11 @@ namespace PepperDash.Essentials.Fusion public string BacklogMsg { get; set; } public string SubErrorMsg { get; set; } public string EmailInfo { get; set; } - public Dictionary FusionCustomProperties { get; set; } + public List FusionCustomProperties { get; set; } public RoomInformation() { - FusionCustomProperties = new Dictionary(); + FusionCustomProperties = new List(); } } public class FusionCustomProperty @@ -1580,5 +1581,15 @@ namespace PepperDash.Essentials.Fusion public string CustomFieldName { get; set; } public string CustomFieldType { get; set; } public string CustomFieldValue { get; set; } + + public FusionCustomProperty() + { + + } + + public FusionCustomProperty(string id) + { + ID = id; + } } } \ No newline at end of file diff --git a/PepperDashEssentials/OTHER/Fusion/FusionCustomPropertiesBridge.cs b/PepperDashEssentials/OTHER/Fusion/FusionCustomPropertiesBridge.cs new file mode 100644 index 00000000..03a5cd37 --- /dev/null +++ b/PepperDashEssentials/OTHER/Fusion/FusionCustomPropertiesBridge.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Crestron.SimplSharp; + +using PepperDash.Core; +using PepperDash.Essentials.Core; +using PepperDash.Essentials.Room.Behaviours; + +namespace PepperDash.Essentials.Fusion +{ + /// + /// Handles mapping Fusion Custom Property values to system properties + /// + public class FusionCustomPropertiesBridge + { + + /// + /// Evaluates the room info and custom properties from Fusion and updates the system properties aa needed + /// + /// + public void EvaluateRoomInfo(RoomInformation roomInfo) + { + var runtimeConfigurableDevices = DeviceManager.AllDevices.Where(d => d is IRuntimeConfigurableDevice); + + try + { + foreach (var device in runtimeConfigurableDevices) + { + var deviceConfig = (device as IRuntimeConfigurableDevice).GetDeviceConfig(); + + if (device is RoomOnToDefaultSourceWhenOccupied) + { + var devConfig = (deviceConfig as RoomOnToDefaultSourceWhenOccupiedConfig); + + var enableFeature = roomInfo.FusionCustomProperties.FirstOrDefault(p => p.ID.Equals("EnRoomOnWhenOccupied")); + if (enableFeature != null) + devConfig.EnableRoomOnWhenOccupied = bool.Parse(enableFeature.CustomFieldValue); + + var enableTime = roomInfo.FusionCustomProperties.FirstOrDefault(p => p.ID.Equals("RoomOnWhenOccupiedStartTime")); + if (enableTime != null) + devConfig.OccupancyStartTime = enableTime.CustomFieldValue; + + var disableTime = roomInfo.FusionCustomProperties.FirstOrDefault(p => p.ID.Equals("RoomOnWhenOccupiedEndTime")); + if (disableTime != null) + devConfig.OccupancyEndTime = disableTime.CustomFieldValue; + + var enableSunday = roomInfo.FusionCustomProperties.FirstOrDefault(p => p.ID.Equals("EnRoomOnWhenOccupiedSun")); + if (enableSunday != null) + devConfig.EnableSunday = bool.Parse(enableSunday.CustomFieldValue); + + var enableMonday = roomInfo.FusionCustomProperties.FirstOrDefault(p => p.ID.Equals("EnRoomOnWhenOccupiedMon")); + if (enableMonday != null) + devConfig.EnableMonday = bool.Parse(enableMonday.CustomFieldValue); + + var enableTuesday = roomInfo.FusionCustomProperties.FirstOrDefault(p => p.ID.Equals("EnRoomOnWhenOccupiedTue")); + if (enableTuesday != null) + devConfig.EnableTuesday = bool.Parse(enableTuesday.CustomFieldValue); + + var enableWednesday = roomInfo.FusionCustomProperties.FirstOrDefault(p => p.ID.Equals("EnRoomOnWhenOccupiedWed")); + if (enableWednesday != null) + devConfig.EnableWednesday = bool.Parse(enableWednesday.CustomFieldValue); + + var enableThursday = roomInfo.FusionCustomProperties.FirstOrDefault(p => p.ID.Equals("EnRoomOnWhenOccupiedThu")); + if (enableThursday != null) + devConfig.EnableThursday = bool.Parse(enableThursday.CustomFieldValue); + + var enableFriday = roomInfo.FusionCustomProperties.FirstOrDefault(p => p.ID.Equals("EnRoomOnWhenOccupiedFri")); + if (enableFriday != null) + devConfig.EnableFriday = bool.Parse(enableFriday.CustomFieldValue); + + var enableSaturday = roomInfo.FusionCustomProperties.FirstOrDefault(p => p.ID.Equals("EnRoomOnWhenOccupiedSat")); + if (enableSaturday != null) + devConfig.EnableSaturday = bool.Parse(enableSaturday.CustomFieldValue); + + deviceConfig = devConfig; + } + + (device as IRuntimeConfigurableDevice).SetDeviceConfig(deviceConfig); + } + } + catch (Exception e) + { + Debug.Console(1, "FusionCustomPropetiesBridge: Error mapping properties: {0}", e); + } + } + } +} \ No newline at end of file diff --git a/PepperDashEssentials/PepperDashEssentials.csproj b/PepperDashEssentials/PepperDashEssentials.csproj index 86d9cde3..59c180ee 100644 --- a/PepperDashEssentials/PepperDashEssentials.csproj +++ b/PepperDashEssentials/PepperDashEssentials.csproj @@ -133,6 +133,7 @@ + diff --git a/PepperDashEssentials/Room/Behaviours/RoomOnToDefaultSourceWhenOccupied.cs b/PepperDashEssentials/Room/Behaviours/RoomOnToDefaultSourceWhenOccupied.cs index 706ebca1..0c13c8af 100644 --- a/PepperDashEssentials/Room/Behaviours/RoomOnToDefaultSourceWhenOccupied.cs +++ b/PepperDashEssentials/Room/Behaviours/RoomOnToDefaultSourceWhenOccupied.cs @@ -10,6 +10,7 @@ using Newtonsoft.Json.Linq; using PepperDash.Core; using PepperDash.Essentials.Core; +using PepperDash.Essentials.Core.Config; using PepperDash.Essentials.Devices.Common.Occupancy; namespace PepperDash.Essentials.Room.Behaviours @@ -17,7 +18,7 @@ namespace PepperDash.Essentials.Room.Behaviours /// /// A device that when linked to a room can power the room on when enabled during scheduled hours. /// - public class RoomOnToDefaultSourceWhenOccupied : Device + public class RoomOnToDefaultSourceWhenOccupied : Device, IRuntimeConfigurableDevice { RoomOnToDefaultSourceWhenOccupiedConfig Config; @@ -72,6 +73,13 @@ namespace PepperDash.Essentials.Room.Behaviours } public override bool CustomActivate() + { + SetUpDevice(); + + return base.CustomActivate(); + } + + void SetUpDevice() { Room = DeviceManager.GetDeviceForKey(Config.RoomKey) as EssentialsRoomBase; @@ -109,20 +117,23 @@ namespace PepperDash.Essentials.Room.Behaviours Debug.Console(1, this, "Unable to parse a DateTime config value \n Error: {1}", e); } - AddEnableEventToGroup(); + if (!Config.EnableRoomOnWhenOccupied) + FeatureEventGroup.ClearAllEvents(); + else + { + AddEnableEventToGroup(); - AddDisableEventToGroup(); + AddDisableEventToGroup(); - FeatureEventGroup.UserGroupCallBack += new ScheduledEventGroup.UserEventGroupCallBack(FeatureEventGroup_UserGroupCallBack); + FeatureEventGroup.UserGroupCallBack += new ScheduledEventGroup.UserEventGroupCallBack(FeatureEventGroup_UserGroupCallBack); - FeatureEventGroup.EnableAllEvents(); + FeatureEventGroup.EnableAllEvents(); + } FeatureEnabled = CheckIfFeatureShouldBeEnabled(); } else Debug.Console(1, this, "Unable to get room from Device Manager with key: {0}", Config.RoomKey); - - return base.CustomActivate(); } /// @@ -134,6 +145,22 @@ namespace PepperDash.Essentials.Room.Behaviours return JToken.FromObject(Config); } + public object GetDeviceConfig() + { + return Config; + } + + public void SetDeviceConfig(object config) + { + var newConfig = config as RoomOnToDefaultSourceWhenOccupiedConfig; + + Config = newConfig; + + ConfigWriter.UpdateDeviceProperties(this.Key, GetLocalConfigProperties()); + + SetUpDevice(); + } + /// /// Subscribe to feedback from RoomIsOccupiedFeedback on Room /// @@ -185,11 +212,16 @@ namespace PepperDash.Essentials.Room.Behaviours { if (SchedulerUtilities.CheckIfDayOfWeekMatchesRecurrenceDays(DateTime.Now, CalculateDaysOfWeekRecurrence())) { - Debug.Console(1, this, "*****Feature Enabled by startup check.*****"); enabled = true; } } } + + if(enabled) + Debug.Console(1, this, "*****Feature Enabled*****"); + else + Debug.Console(1, this, "*****Feature Disabled*****"); + return enabled; } diff --git a/Release Package/PepperDashEssentials.cpz b/Release Package/PepperDashEssentials.cpz index 3f2a0e7d..8cc18d25 100644 Binary files a/Release Package/PepperDashEssentials.cpz and b/Release Package/PepperDashEssentials.cpz differ diff --git a/Release Package/PepperDashEssentials.dll b/Release Package/PepperDashEssentials.dll index e29bf02f..5c33078b 100644 Binary files a/Release Package/PepperDashEssentials.dll and b/Release Package/PepperDashEssentials.dll differ diff --git a/essentials-framework b/essentials-framework index a8c1e17b..09ff7fdc 160000 --- a/essentials-framework +++ b/essentials-framework @@ -1 +1 @@ -Subproject commit a8c1e17b127640400091a750c505b6cfa6f84e39 +Subproject commit 09ff7fdc86e72d4de5d8cf5dbc8cc057ef61bbc8