diff --git a/csharp/App/Backend/DataTypes/Methods/Installation.cs b/csharp/App/Backend/DataTypes/Methods/Installation.cs index 074b62638..fd01696cc 100644 --- a/csharp/App/Backend/DataTypes/Methods/Installation.cs +++ b/csharp/App/Backend/DataTypes/Methods/Installation.cs @@ -1,5 +1,6 @@ using InnovEnergy.App.Backend.Database; using InnovEnergy.App.Backend.Relations; +using InnovEnergy.Lib.Mailer; using InnovEnergy.Lib.Utils; namespace InnovEnergy.App.Backend.DataTypes.Methods; @@ -171,5 +172,39 @@ public static class InstallationMethods return true; } - + + private const String SupportEmail = "support@inesco.energy"; + private const String SupportName = "inesco energy Support Team"; + + public static Task SendAlarmNotificationToSupport(this Installation installation, Int32 prevStatus) + { + var productName = ProductName(installation.Product); + var fromStatus = StatusName(prevStatus); + + var subject = $"[inesco energy] Alarm: {installation.Name}"; + var body = + $"Installation \"{installation.Name}\" (ID {installation.Id}, {productName})\n" + + $"status changed from {fromStatus} to Alarm.\n\n" + + "Please check the Log tab on the Monitor to see detailed errors and warnings.\n"; + + return Mailer.Send(SupportName, SupportEmail, subject, body); + } + + private static String StatusName(Int32 status) => status switch + { + -1 => "Offline", + 0 => "Green", + 1 => "Warning", + 2 => "Alarm", + _ => "Unknown" + }; + + private static String ProductName(Int32 product) => product switch + { + 2 => "Sodistore Home", + 3 => "Sodistore Max", + 4 => "Sodistore Grid", + 5 => "Sodistore Pro", + _ => $"Product {product}" + }; } \ No newline at end of file diff --git a/csharp/App/Backend/Websockets/RabbitMQManager.cs b/csharp/App/Backend/Websockets/RabbitMQManager.cs index 5d4328224..39f67a6e4 100644 --- a/csharp/App/Backend/Websockets/RabbitMQManager.cs +++ b/csharp/App/Backend/Websockets/RabbitMQManager.cs @@ -2,6 +2,7 @@ using System.Text; using System.Text.Json; using InnovEnergy.App.Backend.Database; using InnovEnergy.App.Backend.DataTypes; +using InnovEnergy.App.Backend.DataTypes.Methods; using InnovEnergy.Lib.Utils; using RabbitMQ.Client; using RabbitMQ.Client.Events; @@ -186,6 +187,20 @@ public static class RabbitMqManager Db.UpdateInstallationStatus(installationId, receivedStatusMessage.Status); + const int AlarmStatus = 2; + var isSodistore = installation.Product is 2 or 3 or 4 or 5; + if (isSodistore + && prevStatus != AlarmStatus + && receivedStatusMessage.Status == AlarmStatus) + { + var prev = prevStatus; + _ = Task.Run(async () => + { + try { await installation.SendAlarmNotificationToSupport(prev); } + catch (Exception ex) { Console.WriteLine($"[AlarmNotify] failed for {installationId}: {ex.Message}"); } + }); + } + //Console.WriteLine("----------------------------------------------"); //If the status has changed, update all the connected front-ends regarding this installation if(prevStatus != receivedStatusMessage.Status && WebsocketManager.InstallationConnections[installationId].Connections.Count > 0)