Compare commits

...

10 Commits

Author SHA1 Message Date
Neil Dorin
4f5d4ef87a fix: ensure proper disposal of help request timeout timer and improve logging 2025-11-26 11:02:31 -07:00
Neil Dorin
5de1e2d7bb feat: add help request timeout functionality to IEssentialsRoomFusionController 2025-11-26 10:26:41 -07:00
Neil Dorin
d17394cdd7 feat: add logging to ExecuteSwitch method in GenericSink 2025-11-25 11:06:48 -07:00
Neil Dorin
8467afde38 Update src/PepperDash.Essentials.Core/Fusion/IEssentialsRoomFusionController.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-24 17:23:38 -07:00
Neil Dorin
5c016fb4b8 feat: implement IHasFeedback interface in IEssentialsRoomFusionController 2025-11-24 17:14:34 -07:00
Neil Dorin
2fbc32947c Merge pull request #1357 from PepperDash/url-parsing
fix: check for multiple URL patterns for both template & system URLS
2025-11-18 14:14:16 -05:00
Andrew Welker
c06b57a5f9 fix: check for multiple URL patterns for both template & system URLS 2025-11-18 12:30:54 -06:00
Neil Dorin
6d64fffc50 Merge pull request #1356 from PepperDash/mc-subscription-logging
Multiple Fixes
2025-11-14 15:44:58 -05:00
Andrew Welker
0c4ebdaf1d fix: change how subscription state is logged to reduce traffic to console 2025-11-13 09:56:29 -06:00
Andrew Welker
2c49fb9321 fix: parse current Portal URLS for system and template UUIDs correctly 2025-11-12 16:58:23 -06:00
6 changed files with 152 additions and 57 deletions

View File

@@ -36,20 +36,29 @@ namespace PepperDash.Essentials.Core.Config
{ {
get get
{ {
if (string.IsNullOrEmpty(SystemUrl)) string uuid;
return "missing url";
if (SystemUrl.Contains("#")) if (string.IsNullOrEmpty(SystemUrl))
{
uuid = "missing url";
}
else if (SystemUrl.Contains("#"))
{ {
var result = Regex.Match(SystemUrl, @"https?:\/\/.*\/systems\/(.*)\/#.*"); var result = Regex.Match(SystemUrl, @"https?:\/\/.*\/systems\/(.*)\/#.*");
string uuid = result.Groups[1].Value; uuid = result.Groups[1].Value;
return uuid; }
} else else if (SystemUrl.Contains("detail"))
{
var result = Regex.Match(SystemUrl, @"https?:\/\/.*\/systems\/detail\/(.*)\/.*");
uuid = result.Groups[1].Value;
}
else
{ {
var result = Regex.Match(SystemUrl, @"https?:\/\/.*\/systems\/(.*)\/.*"); var result = Regex.Match(SystemUrl, @"https?:\/\/.*\/systems\/(.*)\/.*");
string uuid = result.Groups[1].Value; uuid = result.Groups[1].Value;
return uuid;
} }
return uuid;
} }
} }
@@ -61,20 +70,29 @@ namespace PepperDash.Essentials.Core.Config
{ {
get get
{ {
if (string.IsNullOrEmpty(TemplateUrl)) string uuid;
return "missing template url";
if (TemplateUrl.Contains("#")) if (string.IsNullOrEmpty(TemplateUrl))
{
uuid = "missing template url";
}
else if (TemplateUrl.Contains("#"))
{ {
var result = Regex.Match(TemplateUrl, @"https?:\/\/.*\/templates\/(.*)\/#.*"); var result = Regex.Match(TemplateUrl, @"https?:\/\/.*\/templates\/(.*)\/#.*");
string uuid = result.Groups[1].Value; uuid = result.Groups[1].Value;
return uuid; }
} else else if (TemplateUrl.Contains("detail"))
{
var result = Regex.Match(TemplateUrl, @"https?:\/\/.*\/system-templates\/detail\/(.*)\/system-template-versions\/detail\/(.*)\/.*");
uuid = result.Groups[2].Value;
}
else
{ {
var result = Regex.Match(TemplateUrl, @"https?:\/\/.*\/system-templates\/(.*)\/system-template-versions\/(.*)\/.*"); var result = Regex.Match(TemplateUrl, @"https?:\/\/.*\/system-templates\/(.*)\/system-template-versions\/(.*)\/.*");
string uuid = result.Groups[2].Value; uuid = result.Groups[2].Value;
return uuid;
} }
return uuid;
} }
} }

View File

@@ -14,13 +14,14 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Timers;
namespace PepperDash.Essentials.Core.Fusion namespace PepperDash.Essentials.Core.Fusion
{ {
/// <summary> /// <summary>
/// Represents a EssentialsHuddleSpaceFusionSystemControllerBase /// Represents a EssentialsHuddleSpaceFusionSystemControllerBase
/// </summary> /// </summary>
public class IEssentialsRoomFusionController : EssentialsDevice, IOccupancyStatusProvider, IFusionHelpRequest public class IEssentialsRoomFusionController : EssentialsDevice, IOccupancyStatusProvider, IFusionHelpRequest, IHasFeedback
{ {
private IEssentialsRoomFusionControllerPropertiesConfig _config; private IEssentialsRoomFusionControllerPropertiesConfig _config;
@@ -87,15 +88,17 @@ namespace PepperDash.Essentials.Core.Fusion
/// <inheritdoc /> /// <inheritdoc />
public StringFeedback HelpRequestStatusFeedback { get; private set; } public StringFeedback HelpRequestStatusFeedback { get; private set; }
private Timer _helpRequestTimeoutTimer;
#region System Info Sigs /// <summary>
/// Gets the DefaultHelpRequestTimeoutMs
/// </summary>
public int HelpRequestTimeoutMs => _config.HelpRequestTimeoutMs;
//StringSigData SystemName; /// <summary>
//StringSigData Model; /// Gets whether to use a timer for help requests
//StringSigData SerialNumber; /// </summary>
//StringSigData Uptime; public bool UseHelpRequestTimer => _config.UseTimeoutForHelpRequests;
#endregion
#region Processor Info Sigs #region Processor Info Sigs
@@ -240,6 +243,19 @@ namespace PepperDash.Essentials.Core.Fusion
this.LogDebug("Occupancy setup complete"); this.LogDebug("Occupancy setup complete");
HelpRequestResponseFeedback = new StringFeedback("HelpRequestResponse", () => FusionRoom.Help.OutputSig.StringValue);
HelpRequestSentFeedback = new BoolFeedback("HelpRequestSent", () => _helpRequestSent);
HelpRequestStatusFeedback = new StringFeedback("HelpRequestStatus", () => _helpRequestStatus.ToString());
Feedbacks.Add(HelpRequestResponseFeedback);
Feedbacks.Add(HelpRequestSentFeedback);
Feedbacks.Add(HelpRequestStatusFeedback);
if (RoomOccupancyRemoteStringFeedback != null)
Feedbacks.Add(RoomOccupancyRemoteStringFeedback);
if (RoomIsOccupiedFeedback != null)
Feedbacks.Add(RoomIsOccupiedFeedback);
} }
catch (Exception e) catch (Exception e)
{ {
@@ -303,10 +319,6 @@ namespace PepperDash.Essentials.Core.Fusion
FusionRVI.GenerateFileForAllFusionDevices(); FusionRVI.GenerateFileForAllFusionDevices();
HelpRequestResponseFeedback = new StringFeedback("HelpRequestResponse", () => FusionRoom.Help.OutputSig.StringValue);
HelpRequestSentFeedback = new BoolFeedback("HelpRequestSent", () => _helpRequestSent);
HelpRequestStatusFeedback = new StringFeedback("HelpRequestStatus", () => _helpRequestStatus.ToString());
} }
/// <summary> /// <summary>
@@ -339,6 +351,11 @@ namespace PepperDash.Essentials.Core.Fusion
#endregion #endregion
/// <inheritdoc />
public FeedbackCollection<Feedback> Feedbacks { get; private set; } = new FeedbackCollection<Feedback>();
/// <summary> /// <summary>
/// ScheduleChange event /// ScheduleChange event
/// </summary> /// </summary>
@@ -1772,7 +1789,7 @@ namespace PepperDash.Essentials.Core.Fusion
{ {
if (args.EventId == FusionEventIds.HelpMessageReceivedEventId) if (args.EventId == FusionEventIds.HelpMessageReceivedEventId)
{ {
this.LogInformation( "Help message received from Fusion for room '{0}'", this.LogInformation("Help message received from Fusion for room '{0}'",
Room.Name); Room.Name);
this.LogDebug("Help message content: {0}", FusionRoom.Help.OutputSig.StringValue); this.LogDebug("Help message content: {0}", FusionRoom.Help.OutputSig.StringValue);
@@ -1791,7 +1808,7 @@ namespace PepperDash.Essentials.Core.Fusion
break; break;
case "Please call the helpdesk.": case "Please call the helpdesk.":
// this.LogInformation("Please call the helpdesk."); // this.LogInformation("Please call the helpdesk.");
// _helpRequestStatus = eFusionHelpResponse.CallHelpDesk; _helpRequestStatus = eFusionHelpResponse.CallHelpDesk;
break; break;
case "Please wait, I will reschedule your meeting to a different room.": case "Please wait, I will reschedule your meeting to a different room.":
// this.LogInformation("Please wait, I will reschedule your meeting to a different room.", // this.LogInformation("Please wait, I will reschedule your meeting to a different room.",
@@ -1818,13 +1835,21 @@ namespace PepperDash.Essentials.Core.Fusion
_helpRequestStatus = eFusionHelpResponse.None; _helpRequestStatus = eFusionHelpResponse.None;
} }
if(_helpRequestStatus == eFusionHelpResponse.None) if (_helpRequestStatus == eFusionHelpResponse.None)
{ {
_helpRequestSent = false; _helpRequestSent = false;
HelpRequestSentFeedback.FireUpdate(); HelpRequestSentFeedback.FireUpdate();
} }
HelpRequestStatusFeedback.FireUpdate(); HelpRequestStatusFeedback.FireUpdate();
if (_helpRequestTimeoutTimer != null)
{
_helpRequestTimeoutTimer.Stop();
_helpRequestTimeoutTimer.Elapsed -= OnTimedEvent;
_helpRequestTimeoutTimer.Dispose();
_helpRequestTimeoutTimer = null;
}
} }
@@ -1895,10 +1920,33 @@ namespace PepperDash.Essentials.Core.Fusion
_helpRequestSent = true; _helpRequestSent = true;
HelpRequestSentFeedback.FireUpdate(); HelpRequestSentFeedback.FireUpdate();
if (UseHelpRequestTimer)
{
if (_helpRequestTimeoutTimer == null)
{
_helpRequestTimeoutTimer = new Timer(HelpRequestTimeoutMs);
_helpRequestTimeoutTimer.AutoReset = false;
_helpRequestTimeoutTimer.Enabled = true;
_helpRequestTimeoutTimer.Elapsed += OnTimedEvent;
}
_helpRequestTimeoutTimer.Interval = HelpRequestTimeoutMs;
_helpRequestTimeoutTimer.Start();
this.LogDebug("Help request timeout timer started for room '{0}' with timeout of {1} ms.",
Room.Name, HelpRequestTimeoutMs);
}
_helpRequestStatus = eFusionHelpResponse.HelpRequested; _helpRequestStatus = eFusionHelpResponse.HelpRequested;
HelpRequestStatusFeedback.FireUpdate(); HelpRequestStatusFeedback.FireUpdate();
} }
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
CancelHelpRequest();
}
/// <inheritdoc /> /// <inheritdoc />
public void CancelHelpRequest() public void CancelHelpRequest()
{ {
@@ -1909,7 +1957,18 @@ namespace PepperDash.Essentials.Core.Fusion
HelpRequestSentFeedback.FireUpdate(); HelpRequestSentFeedback.FireUpdate();
_helpRequestStatus = eFusionHelpResponse.None; _helpRequestStatus = eFusionHelpResponse.None;
HelpRequestStatusFeedback.FireUpdate(); HelpRequestStatusFeedback.FireUpdate();
Debug.LogMessage(LogEventLevel.Information, this, "Help request cancelled in Fusion for room '{0}'", Room.Name); Debug.LogMessage(LogEventLevel.Information, this, "Help request cancelled for room '{0}'", Room.Name);
}
if(_helpRequestTimeoutTimer != null)
{
_helpRequestTimeoutTimer.Stop();
_helpRequestTimeoutTimer.Elapsed -= OnTimedEvent;
_helpRequestTimeoutTimer.Dispose();
_helpRequestTimeoutTimer = null;
this.LogDebug("Help request timeout timer stopped for room '{0}'.",
Room.Name);
} }
} }

View File

@@ -56,4 +56,16 @@ public class IEssentialsRoomFusionControllerPropertiesConfig
/// </summary> /// </summary>
[JsonProperty("use24HourTimeFormat")] [JsonProperty("use24HourTimeFormat")]
public bool Use24HourTimeFormat { get; set; } = false; public bool Use24HourTimeFormat { get; set; } = false;
/// <summary>
/// Gets or sets whether to use a timeout for help requests
/// </summary>
[JsonProperty("useTimeoutForHelpRequests")]
public bool UseTimeoutForHelpRequests { get; set; } = false;
/// <summary>
/// Gets or sets the timeout duration for help requests in milliseconds
/// </summary>
[JsonProperty("helpRequestTimeoutMs")]
public int HelpRequestTimeoutMs { get; set; } = 30000;
} }

View File

@@ -1,5 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using PepperDash.Core; using PepperDash.Core;
using PepperDash.Core.Logging;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Config; using PepperDash.Essentials.Core.Config;
using Serilog.Events; using Serilog.Events;
@@ -73,7 +74,7 @@ namespace PepperDash.Essentials.Devices.Common.Generic
/// <inheritdoc /> /// <inheritdoc />
public void ExecuteSwitch(object inputSelector) public void ExecuteSwitch(object inputSelector)
{ {
throw new System.NotImplementedException(); this.LogDebug("GenericSink Executing Switch to: {inputSelector}", inputSelector);
} }
} }

View File

@@ -194,7 +194,6 @@ namespace PepperDash.Essentials.AppServer.Messengers
{ {
if (!enableMessengerSubscriptions) if (!enableMessengerSubscriptions)
{ {
this.LogWarning("Messenger subscriptions not enabled");
return; return;
} }
@@ -218,7 +217,6 @@ namespace PepperDash.Essentials.AppServer.Messengers
{ {
if (!enableMessengerSubscriptions) if (!enableMessengerSubscriptions)
{ {
this.LogWarning("Messenger subscriptions not enabled");
return; return;
} }
@@ -238,7 +236,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
return; return;
} }
this.LogInformation("Client with ID {clientId} unsubscribed", clientId); this.LogDebug("Client with ID {clientId} unsubscribed", clientId);
} }
/// <summary> /// <summary>
@@ -272,7 +270,8 @@ namespace PepperDash.Essentials.AppServer.Messengers
} }
catch (Exception ex) catch (Exception ex)
{ {
this.LogError(ex, "Exception posting status message for {messagePath} to {clientId}", MessagePath, clientId ?? "all clients"); this.LogError("Exception posting status message for {messagePath} to {clientId}: {message}", MessagePath, clientId ?? "all clients", ex.Message);
this.LogDebug(ex, "Stack trace: ");
} }
} }
@@ -301,7 +300,8 @@ namespace PepperDash.Essentials.AppServer.Messengers
} }
catch (Exception ex) catch (Exception ex)
{ {
this.LogError(ex, "Exception posting status message for {type} to {clientId}", type, clientId ?? "all clients"); this.LogError("Exception posting status message for {type} to {clientId}: {message}", type, clientId ?? "all clients", ex.Message);
this.LogDebug(ex, "Stack trace: ");
} }
} }

View File

@@ -1312,6 +1312,11 @@ namespace PepperDash.Essentials
/// <inheritdoc /> /// <inheritdoc />
public override void Initialize() public override void Initialize()
{ {
if (!Config.EnableMessengerSubscriptions)
{
this.LogWarning("Messenger subscriptions disabled. add \"enableMessengerSubscriptions\": true to config for {key} to enable.", Key);
}
foreach (var messenger in _messengers) foreach (var messenger in _messengers)
{ {
try try