diff --git a/src/Elektrifikatsiya/Elektrifikatsiya/Components/Layout/NewFile.txt b/src/Elektrifikatsiya/Elektrifikatsiya/Components/Layout/NewFile.txt deleted file mode 100644 index 5f28270..0000000 --- a/src/Elektrifikatsiya/Elektrifikatsiya/Components/Layout/NewFile.txt +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/Elektrifikatsiya/Elektrifikatsiya/Components/Layout/SideMenu.razor b/src/Elektrifikatsiya/Elektrifikatsiya/Components/Layout/SideMenu.razor index 956a1a0..e81b308 100644 --- a/src/Elektrifikatsiya/Elektrifikatsiya/Components/Layout/SideMenu.razor +++ b/src/Elektrifikatsiya/Elektrifikatsiya/Components/Layout/SideMenu.razor @@ -1,4 +1,5 @@ - @@ -15,14 +16,18 @@ Dashboard - - - - - - Admin + + + + + + Admin + + + + diff --git a/src/Elektrifikatsiya/Elektrifikatsiya/Pages/Admin.razor b/src/Elektrifikatsiya/Elektrifikatsiya/Pages/Admin.razor index 05dc402..ab7bf62 100644 --- a/src/Elektrifikatsiya/Elektrifikatsiya/Pages/Admin.razor +++ b/src/Elektrifikatsiya/Elektrifikatsiya/Pages/Admin.razor @@ -1,5 +1,6 @@ @page "/Admin" @using Blazorise.Components; +@using Elektrifikatsiya.Components @using Elektrifikatsiya.Models; @using System.Net @using Elektrifikatsiya.Services; @@ -10,190 +11,193 @@ @inject IMessageService MessageService @inject IAuthenticationService AuthenthicationService; @inject NavigationManager NavigationManager; -
- -
- - - - - Users - - - - - - - - - - - - - - - - - - - @context.Item.Name - - - - - Name: @context.Item.Name -
- Rolle: @context.Item.Role -
- E-Mail: @context.Item.Email -
-
+ + +
+ +
+ + + + + Users - - - - - - - - - Add User - - - - - User Name - - - - User E-Mail - - - - User Password - - - - - - - - - + + + + + + + + + + + @context.Item.Name + + + + + Name: @context.Item.Name +
+ Rolle: @context.Item.Role +
+ E-Mail: @context.Item.Email +
+
+
+ + + + + + + + + Add User + + + + + User Name + + + + User E-Mail + + + + User Password + + + + + + + + + + +
+
+ + + + + + +
+
+
+
+
+ + @if (SelectedUser is not null) + { + + } + +
+
-
-
+ + + Bro no! this page is only for admins! 😠 + + @code { List users = new List(); diff --git a/src/Elektrifikatsiya/Elektrifikatsiya/Pages/Dashboard.razor b/src/Elektrifikatsiya/Elektrifikatsiya/Pages/Dashboard.razor index b5149d5..db23e16 100644 --- a/src/Elektrifikatsiya/Elektrifikatsiya/Pages/Dashboard.razor +++ b/src/Elektrifikatsiya/Elektrifikatsiya/Pages/Dashboard.razor @@ -12,6 +12,7 @@ @inject IDeviceStatusService DeviceStatusService; @inject IDeviceManagmentService DeviceManagmentService; @inject IEventService EventService; +@inject IAuthenticationService AuthenticationService; @inject IEnergyPriceService EnergyPriceService; @inject MainDatabaseContext MainDatabaseContext; diff --git a/src/Elektrifikatsiya/Elektrifikatsiya/Pages/Dashboard.razor.cs b/src/Elektrifikatsiya/Elektrifikatsiya/Pages/Dashboard.razor.cs index 91b8687..56abfce 100644 --- a/src/Elektrifikatsiya/Elektrifikatsiya/Pages/Dashboard.razor.cs +++ b/src/Elektrifikatsiya/Elektrifikatsiya/Pages/Dashboard.razor.cs @@ -8,94 +8,94 @@ namespace Elektrifikatsiya.Pages; public partial class Dashboard { - private readonly List labels = new List(); + private readonly List labels = new List(); - //TODO: insert new event here if plug produces one - private List events = new List() { new Event("Text", "Text", DateTime.Today, null) }; + //TODO: insert new event here if plug produces one + private List events = new List() { new Event("Text", "Text", DateTime.Today, null) }; - //code for graph - private LineChart lineChart; + //code for graph + private LineChart lineChart; - //TODO: insert new Device here if user adds one - private List plugs = new List(); + //TODO: insert new Device here if user adds one + private List plugs = new List(); - protected override async Task OnAfterRenderAsync(bool firstRender) - { - if (firstRender) - { - await HandleRedraw(); - } - } + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + await HandleRedraw(); + } + } - protected override void OnInitialized() - { - plugs = DeviceStatusService.GetDevices().ValueOrDefault ?? new List(); - events = EventService.Events; + protected override async Task OnInitializedAsync() + { + plugs = DeviceManagmentService.GetDevices((await AuthenticationService.GetUserAsync()).ValueOrDefault).ValueOrDefault ?? new List(); + events = EventService.Events; - EventService.OnEventCalled += (__, e) => - { - _ = InvokeAsync(StateHasChanged); - }; - DeviceStatusService.OnDeviceStatusChanged += (__, e) => - { - _ = InvokeAsync(StateHasChanged); - }; - } + EventService.OnEventCalled += (__, e) => + { + _ = InvokeAsync(StateHasChanged); + }; + DeviceStatusService.OnDeviceStatusChanged += (__, e) => + { + _ = InvokeAsync(StateHasChanged); + }; + } - private async Task> GetData() - { - if (plugs.Count == 0) - { - return new(); - } - PrometheusQuery promQueryer = new PrometheusQuery("http://localhost:9090"); + private async Task> GetData() + { + if (plugs.Count == 0) + { + return new(); + } + PrometheusQuery promQueryer = new PrometheusQuery("http://localhost:9090"); - string plugnames = ""; - foreach (Device device in plugs) - { - plugnames += $"shellyplug-s-{device.MacAddress}/relay/0|"; - } - plugnames = plugnames[0..^1]; + string plugnames = ""; + foreach (Device device in plugs) + { + plugnames += $"shellyplug-s-{device.MacAddress}/relay/0|"; + } + plugnames = plugnames[0..^1]; - double energyPrice = MainDatabaseContext.EnergyPriceChanges.OrderByDescending(e => e.DateTime).FirstOrDefault()?.EnergyPrice ?? 0; + double energyPrice = MainDatabaseContext.EnergyPriceChanges.OrderByDescending(e => e.DateTime).FirstOrDefault()?.EnergyPrice ?? 0; - PrometheusDataWrapper? deviceData = (await promQueryer.Query($$"""sum(power{sensor=~"{{plugnames}}"})[1h:1m]"""))?.Data; - //PrometheusDataWrapper? priceData = (await promQueryer.Query($$"""sum(sum_over_time(power{sensor=~"{{plugnames}}"}[1y])*{{energyPrice}})"""))?.Data; + PrometheusDataWrapper? deviceData = (await promQueryer.Query($$"""sum(power{sensor=~"{{plugnames}}"})[1h:1m]"""))?.Data; + //PrometheusDataWrapper? priceData = (await promQueryer.Query($$"""sum(sum_over_time(power{sensor=~"{{plugnames}}"}[1y])*{{energyPrice}})"""))?.Data; - //Console.WriteLine(priceData.VectorTypeToTimestampFloatTuple()); + //Console.WriteLine(priceData.VectorTypeToTimestampFloatTuple()); - Random r = new Random(DateTime.Now.Millisecond); + Random r = new Random(DateTime.Now.Millisecond); - return deviceData?.MatrixTypeToTimestampFloatTuple().ValueOrDefault?.Select(x => - { - labels.Add(DateTimeOffset.FromUnixTimeSeconds(long.Parse($"1{x.Item1}0")).UtcDateTime.ToLocalTime().ToShortTimeString()); - return x.Item2; - }).ToList() ?? new List(); - } + return deviceData?.MatrixTypeToTimestampFloatTuple().ValueOrDefault?.Select(x => + { + labels.Add(DateTimeOffset.FromUnixTimeSeconds(long.Parse($"1{x.Item1}0")).UtcDateTime.ToLocalTime().ToShortTimeString()); + return x.Item2; + }).ToList() ?? new List(); + } - //TODO: insert dataset of current and last voltage usages - private async Task> GetLineChartDataset() - { - return new LineChartDataset - { - Label = "Wattage", - Data = await GetData(), - Fill = true, - PointRadius = 3, - CubicInterpolationMode = "monotone", - }; - } + //TODO: insert dataset of current and last voltage usages + private async Task> GetLineChartDataset() + { + return new LineChartDataset + { + Label = "Wattage", + Data = await GetData(), + Fill = true, + PointRadius = 3, + CubicInterpolationMode = "monotone", + }; + } - private async Task HandleRedraw() - { - labels.Clear(); - await lineChart.Clear(); - await lineChart.AddLabelsDatasetsAndUpdate(labels, await GetLineChartDataset()); - } + private async Task HandleRedraw() + { + labels.Clear(); + await lineChart.Clear(); + await lineChart.AddLabelsDatasetsAndUpdate(labels, await GetLineChartDataset()); + } - private async Task Switch(Device device) - { - device.Enabled = !device.Enabled; - _ = await DeviceManagmentService.UpdateDevice(device); - } + private async Task Switch(Device device) + { + device.Enabled = !device.Enabled; + _ = await DeviceManagmentService.UpdateDevice(device); + } } \ No newline at end of file diff --git a/src/Elektrifikatsiya/Elektrifikatsiya/Pages/Settings.razor b/src/Elektrifikatsiya/Elektrifikatsiya/Pages/Settings.razor index 1274419..f6ae112 100644 --- a/src/Elektrifikatsiya/Elektrifikatsiya/Pages/Settings.razor +++ b/src/Elektrifikatsiya/Elektrifikatsiya/Pages/Settings.razor @@ -10,6 +10,7 @@ @inject IDeviceManagmentService DeviceManagmentService @inject IMessageService MessageService +@inject IAuthenticationService AuthenticationService @inject MainDatabaseContext MainDatabaseContext
@@ -157,9 +158,9 @@ Device? SelectedDevice = null; Device? DeviceCopy = null; - protected override void OnInitialized() + protected override async Task OnInitializedAsync() { - Result> getDevicesResult = DeviceManagmentService.GetDevices(); + Result> getDevicesResult = DeviceManagmentService.GetDevices((await AuthenticationService.GetUserAsync()).ValueOrDefault); if (getDevicesResult.IsSuccess) { diff --git a/src/Elektrifikatsiya/Elektrifikatsiya/Services/IDeviceManagmentService.cs b/src/Elektrifikatsiya/Elektrifikatsiya/Services/IDeviceManagmentService.cs index 764ee22..b372442 100644 --- a/src/Elektrifikatsiya/Elektrifikatsiya/Services/IDeviceManagmentService.cs +++ b/src/Elektrifikatsiya/Elektrifikatsiya/Services/IDeviceManagmentService.cs @@ -8,17 +8,17 @@ namespace Elektrifikatsiya.Services; public interface IDeviceManagmentService { - public Task> RegisterDevice(IPAddress ip, User user, string? name = null, string room = "default"); + public Task> RegisterDevice(IPAddress ip, User user, string? name = null, string room = "default"); - public Task UnregisterDevice(string macAdress); + public Task UnregisterDevice(string macAdress); - public Result GetDevice(string macAdress); + public Result GetDevice(string macAdress); - public Result> GetDevices(); + public Result> GetDevices(User user); - public Result> GetDevicesInRoom(string room); + public Result> GetDevicesInRoom(string room); - public Result> GetDevicesOfUser(int userId); + public Result> GetDevicesOfUser(int userId); - public Task UpdateDevice(Device device); + public Task UpdateDevice(Device device); } \ No newline at end of file diff --git a/src/Elektrifikatsiya/Elektrifikatsiya/Services/Implementations/DeviceManagmentService.cs b/src/Elektrifikatsiya/Elektrifikatsiya/Services/Implementations/DeviceManagmentService.cs index 57f2180..1bbc3c3 100644 --- a/src/Elektrifikatsiya/Elektrifikatsiya/Services/Implementations/DeviceManagmentService.cs +++ b/src/Elektrifikatsiya/Elektrifikatsiya/Services/Implementations/DeviceManagmentService.cs @@ -15,168 +15,168 @@ namespace Elektrifikatsiya.Services.Implementations; public class DeviceManagmentService : IDeviceManagmentService { - private readonly IServiceScopeFactory serviceScopeFactory; - private readonly IDeviceStatusService deviceStatusService; - private readonly ILogger logger; - private readonly IHiveMQClient hiveMQClient; - private readonly HttpClient httpClient; + private readonly IServiceScopeFactory serviceScopeFactory; + private readonly IDeviceStatusService deviceStatusService; + private readonly ILogger logger; + private readonly IHiveMQClient hiveMQClient; + private readonly HttpClient httpClient; - public DeviceManagmentService(IServiceScopeFactory serviceScopeFactory, IDeviceStatusService deviceStatusService, ILogger logger, IHiveMQClient hiveMQClient, HttpClient httpClient) - { - this.serviceScopeFactory = serviceScopeFactory; - this.deviceStatusService = deviceStatusService; - this.logger = logger; - this.hiveMQClient = hiveMQClient; - this.httpClient = httpClient; - } + public DeviceManagmentService(IServiceScopeFactory serviceScopeFactory, IDeviceStatusService deviceStatusService, ILogger logger, IHiveMQClient hiveMQClient, HttpClient httpClient) + { + this.serviceScopeFactory = serviceScopeFactory; + this.deviceStatusService = deviceStatusService; + this.logger = logger; + this.hiveMQClient = hiveMQClient; + this.httpClient = httpClient; + } - public Result GetDevice(string macAdress) - { - Result> getDevicesResult = deviceStatusService.GetDevices(); + public Result GetDevice(string macAdress) + { + Result> getDevicesResult = deviceStatusService.GetDevices(); - if (getDevicesResult.IsFailed) - { - return getDevicesResult.ToResult(); - } + if (getDevicesResult.IsFailed) + { + return getDevicesResult.ToResult(); + } - Device? device = getDevicesResult.Value.FirstOrDefault(d => d.MacAddress == macAdress); + Device? device = getDevicesResult.Value.FirstOrDefault(d => d.MacAddress == macAdress); - if (device is null) - { - return Result.Fail("Device does not exist!"); - } + if (device is null) + { + return Result.Fail("Device does not exist!"); + } - return device; - } + return device; + } - public Result> GetDevices() - { - Result> getDevicesResult = deviceStatusService.GetDevices(); + public Result> GetDevices(User user) + { + Result> getDevicesResult = deviceStatusService.GetDevices(); - if (getDevicesResult.IsFailed) - { - return getDevicesResult.ToResult(); - } + if (getDevicesResult.IsFailed) + { + return getDevicesResult.ToResult(); + } - return getDevicesResult.Value.ToList(); - } + return getDevicesResult.Value.Where(d => d.User.Id == user.Id || user.Role == Role.Admin).ToList(); + } - public Result> GetDevicesInRoom(string room) - { - Result> getDevicesResult = deviceStatusService.GetDevices(); + public Result> GetDevicesInRoom(string room) + { + Result> getDevicesResult = deviceStatusService.GetDevices(); - if (getDevicesResult.IsFailed) - { - return getDevicesResult.ToResult(); - } + if (getDevicesResult.IsFailed) + { + return getDevicesResult.ToResult(); + } - return getDevicesResult.Value.Where(d => d.Room == room).ToList(); - } + return getDevicesResult.Value.Where(d => d.Room == room).ToList(); + } - public Result> GetDevicesOfUser(int userId) - { - Result> getDevicesResult = deviceStatusService.GetDevices(); + public Result> GetDevicesOfUser(int userId) + { + Result> getDevicesResult = deviceStatusService.GetDevices(); - if (getDevicesResult.IsFailed) - { - return getDevicesResult.ToResult(); - } + if (getDevicesResult.IsFailed) + { + return getDevicesResult.ToResult(); + } - return getDevicesResult.Value.Where(d => d.User.Id == userId).ToList(); - } + return getDevicesResult.Value.Where(d => d.User.Id == userId).ToList(); + } - public async Task> RegisterDevice(IPAddress ip, User user, string? name = null, string room = "default") - { - using IServiceScope scope = serviceScopeFactory.CreateScope(); - MainDatabaseContext mainDatabaseContext = scope.ServiceProvider.GetRequiredService(); + public async Task> RegisterDevice(IPAddress ip, User user, string? name = null, string room = "default") + { + using IServiceScope scope = serviceScopeFactory.CreateScope(); + MainDatabaseContext mainDatabaseContext = scope.ServiceProvider.GetRequiredService(); - ShellyResponse? shellyResponse = null; + ShellyResponse? shellyResponse = null; - try - { - shellyResponse = await httpClient.GetFromJsonAsync($"http://{ip}/shelly"); - } - catch (Exception ex) - { - logger.LogError("HTTP request failed! {message}", ex.Message); - } + try + { + shellyResponse = await httpClient.GetFromJsonAsync($"http://{ip}/shelly"); + } + catch (Exception ex) + { + logger.LogError("HTTP request failed! {message}", ex.Message); + } - if (shellyResponse is null || shellyResponse.Type != "SHPLG-S") - { - return Result.Fail("Device is not reachable or not a \"SHPLG-S\"!"); - } + if (shellyResponse is null || shellyResponse.Type != "SHPLG-S") + { + return Result.Fail("Device is not reachable or not a \"SHPLG-S\"!"); + } - string mac = shellyResponse.Mac; + string mac = shellyResponse.Mac; - if (!PhysicalAddress.TryParse(mac, out _)) - { - return Result.Fail("Invalid mac address!"); - } + if (!PhysicalAddress.TryParse(mac, out _)) + { + return Result.Fail("Invalid mac address!"); + } - Device device = new Device(mac, name ?? mac, ip, user, room); + Device device = new Device(mac, name ?? mac, ip, user, room); - mainDatabaseContext.Entry(user).State = EntityState.Unchanged; + mainDatabaseContext.Entry(user).State = EntityState.Unchanged; - _ = mainDatabaseContext.Add(device); - Result saveDatabaseChangesResult = await Result.Try(Task () => mainDatabaseContext.SaveChangesAsync()); + _ = mainDatabaseContext.Add(device); + Result saveDatabaseChangesResult = await Result.Try(Task () => mainDatabaseContext.SaveChangesAsync()); - if (saveDatabaseChangesResult.IsFailed) - { - return saveDatabaseChangesResult; - } + if (saveDatabaseChangesResult.IsFailed) + { + return saveDatabaseChangesResult; + } - return deviceStatusService.TrackDevice(device); - } + return deviceStatusService.TrackDevice(device); + } - public async Task UnregisterDevice(string macAdress) - { - using IServiceScope scope = serviceScopeFactory.CreateScope(); - MainDatabaseContext mainDatabaseContext = scope.ServiceProvider.GetRequiredService(); + public async Task UnregisterDevice(string macAdress) + { + using IServiceScope scope = serviceScopeFactory.CreateScope(); + MainDatabaseContext mainDatabaseContext = scope.ServiceProvider.GetRequiredService(); - Result getDeviceResult = GetDevice(macAdress); + Result getDeviceResult = GetDevice(macAdress); - if (getDeviceResult.IsFailed) - { - return getDeviceResult.ToResult(); - } + if (getDeviceResult.IsFailed) + { + return getDeviceResult.ToResult(); + } - Result untrackDeviceResult = deviceStatusService.UntrackDevice(macAdress); + Result untrackDeviceResult = deviceStatusService.UntrackDevice(macAdress); - if (untrackDeviceResult.IsFailed) - { - return untrackDeviceResult; - } + if (untrackDeviceResult.IsFailed) + { + return untrackDeviceResult; + } - _ = mainDatabaseContext.Remove(getDeviceResult.Value); + _ = mainDatabaseContext.Remove(getDeviceResult.Value); - return await Result.Try(Task () => mainDatabaseContext.SaveChangesAsync()); - } + return await Result.Try(Task () => mainDatabaseContext.SaveChangesAsync()); + } - public async Task UpdateDevice(Device device) - { - using IServiceScope scope = serviceScopeFactory.CreateScope(); - MainDatabaseContext mainDatabaseContext = scope.ServiceProvider.GetRequiredService(); + public async Task UpdateDevice(Device device) + { + using IServiceScope scope = serviceScopeFactory.CreateScope(); + MainDatabaseContext mainDatabaseContext = scope.ServiceProvider.GetRequiredService(); - Result getDeviceResult = GetDevice(device.MacAddress); + Result getDeviceResult = GetDevice(device.MacAddress); - if (getDeviceResult.IsFailed) - { - return getDeviceResult.ToResult(); - } + if (getDeviceResult.IsFailed) + { + return getDeviceResult.ToResult(); + } - Result updateDeviceResult = deviceStatusService.UpdateDeviceStatus(device); + Result updateDeviceResult = deviceStatusService.UpdateDeviceStatus(device); - if (updateDeviceResult.IsFailed) - { - return updateDeviceResult; - } + if (updateDeviceResult.IsFailed) + { + return updateDeviceResult; + } - PublishResult res = await hiveMQClient.PublishAsync($"shellies/shellyplug-s-{device.MacAddress}/relay/0/command", device.Enabled ? "on" : "off"); + PublishResult res = await hiveMQClient.PublishAsync($"shellies/shellyplug-s-{device.MacAddress}/relay/0/command", device.Enabled ? "on" : "off"); - device.User = mainDatabaseContext.Users.First(u => u.Id == device.User.Id); + device.User = mainDatabaseContext.Users.First(u => u.Id == device.User.Id); - _ = mainDatabaseContext.Update(device); + _ = mainDatabaseContext.Update(device); - return await Result.Try(Task () => mainDatabaseContext.SaveChangesAsync()); - } + return await Result.Try(Task () => mainDatabaseContext.SaveChangesAsync()); + } } \ No newline at end of file diff --git a/src/Elektrifikatsiya/Elektrifikatsiya/Services/Implementations/EventService.cs b/src/Elektrifikatsiya/Elektrifikatsiya/Services/Implementations/EventService.cs index 3fa5e9a..d886efb 100644 --- a/src/Elektrifikatsiya/Elektrifikatsiya/Services/Implementations/EventService.cs +++ b/src/Elektrifikatsiya/Elektrifikatsiya/Services/Implementations/EventService.cs @@ -1,55 +1,53 @@ using Elektrifikatsiya.Models; -using FluentResults; + using System.Reflection; -namespace Elektrifikatsiya.Services.Implementations +namespace Elektrifikatsiya.Services.Implementations; + +public class EventService : IEventService { - public class EventService : IEventService + public event EventHandler? OnEventCalled; + + public List Events { get; } = new(); + + public EventService(IDeviceStatusService deviceStatusService, IDeviceManagmentService deviceManagmentService) { - private readonly ILogger logger; - public event EventHandler OnEventCalled; - public List Events { get; } = new(); + List deviceList = deviceStatusService.GetDevices().ValueOrDefault.Select(x => x.CopyDevice()).ToList(); - public EventService(ILogger logger, IDeviceStatusService deviceStatusService, IDeviceManagmentService deviceManagmentService) + deviceStatusService.OnDeviceStatusChanged += (_, e) => { - this.logger = logger; - List deviceList = deviceManagmentService.GetDevices().ValueOrDefault.Select(x=>x.CopyDevice()).ToList(); + bool newDevice = true; + Device currentDevice = deviceManagmentService.GetDevice(e.MacAddress).ValueOrDefault; - deviceStatusService.OnDeviceStatusChanged += (_, e) => + for (int i = 0; i < deviceList.Count; i++) { - bool newDevice = true; - Device currentDevice = deviceManagmentService.GetDevice(e.MacAddress).ValueOrDefault; - - for (int i = 0; i < deviceList.Count; i++) + if (deviceList[i].MacAddress == currentDevice.MacAddress) { - if (deviceList[i].MacAddress == currentDevice.MacAddress) + PropertyInfo[] properties = typeof(Device).GetProperties(); + + foreach (PropertyInfo property in properties) { - PropertyInfo[] properties = typeof(Device).GetProperties(); - - foreach(PropertyInfo property in properties) { - var currentvalue = property.GetValue(deviceList[i], null); - var newvalue = property.GetValue(currentDevice, null); - if(newvalue is not null && !newvalue.ToString().Equals(currentvalue.ToString())) - { - string eventName = $"Plug {deviceList[i].Name} changed: {property.Name}"; - string description = $"Changed {property.Name} of plug [{currentvalue}] to [{newvalue}]"; - DateTime dateTime = DateTime.Now; - - Event newEvent = new Event(eventName, description, dateTime, currentDevice); - Events.Insert(0,newEvent); - OnEventCalled?.Invoke(this, new EventServiceEventArgs(newEvent)); - } + object? currentvalue = property.GetValue(deviceList[i], null); + object? newvalue = property.GetValue(currentDevice, null); + if (newvalue is not null && !newvalue?.ToString()?.Equals(currentvalue?.ToString()) == true) + { + string eventName = $"Plug {deviceList[i].Name} changed: {property.Name}"; + string description = $"Changed {property.Name} of plug [{currentvalue}] to [{newvalue}]"; + DateTime dateTime = DateTime.Now; + Event newEvent = new Event(eventName, description, dateTime, currentDevice); + Events.Insert(0, newEvent); + OnEventCalled?.Invoke(this, new EventServiceEventArgs(newEvent)); } - deviceList[i].OverwiteDevice(currentDevice); - newDevice = false; break; } + deviceList[i].OverwiteDevice(currentDevice); + newDevice = false; break; } - if (newDevice) - { - deviceList.Add(deviceManagmentService.GetDevice(e.MacAddress).ValueOrDefault); - } - }; - } + } + if (newDevice) + { + deviceList.Add(deviceManagmentService.GetDevice(e.MacAddress).ValueOrDefault); + } + }; } -} +} \ No newline at end of file