diff --git a/Dirigera.Lib/Dirigera.Lib/Api/ApiClient.cs b/Dirigera.Lib/Dirigera.Lib/Api/ApiClient.cs index 2e90667..043253f 100644 --- a/Dirigera.Lib/Dirigera.Lib/Api/ApiClient.cs +++ b/Dirigera.Lib/Dirigera.Lib/Api/ApiClient.cs @@ -81,6 +81,13 @@ public async Task CheckAuthToken() return res; } + public async Task?> GetScenes() + { + string url = $"{_apiBaseUrl}/scenes"; + var res = await _httpClient.GetFromJsonAsync>(url); + return res; + } + public async Task GetDevice(string id) { string url = $"{_apiBaseUrl}/devices/{id}"; @@ -118,6 +125,21 @@ public async Task PatchAttributesRoom(string roomId, Dictio return res; } + public async Task TriggerScene(string sceneId) + { + string url = $"{_apiBaseUrl}/scenes/{sceneId}/trigger"; + var res = await _httpClient.PostAsync(url, null); + return res; + } + + public async Task UndoScene(string sceneId) + { + string url = $"{_apiBaseUrl}/scenes/{sceneId}/undo"; + var res = await _httpClient.PostAsync(url, null); + return res; + } + + public async Task SendChallenge(string codeVerifier) { string authUrl = $"{_apiBaseUrl}/oauth/authorize"; diff --git a/Dirigera.Lib/Dirigera.Lib/Api/Dto/SceneDto.cs b/Dirigera.Lib/Dirigera.Lib/Api/Dto/SceneDto.cs new file mode 100644 index 0000000..52bb10d --- /dev/null +++ b/Dirigera.Lib/Dirigera.Lib/Api/Dto/SceneDto.cs @@ -0,0 +1,13 @@ +namespace Dirigera.Lib.Api.Dto +{ + internal class SceneDto + { + public string? Id { get; set; } + public SceneInfoDto? Info { get; set; } + public string? Type { get; set; } + public string? CreatedAt { get; set; } + public string? LastCompleted { get; set; } + public string? LastTriggered { get; set; } + public int UndoAllowedDuration { get; set; } + } +} diff --git a/Dirigera.Lib/Dirigera.Lib/Api/Dto/SceneInfoDto.cs b/Dirigera.Lib/Dirigera.Lib/Api/Dto/SceneInfoDto.cs new file mode 100644 index 0000000..7fda896 --- /dev/null +++ b/Dirigera.Lib/Dirigera.Lib/Api/Dto/SceneInfoDto.cs @@ -0,0 +1,8 @@ +namespace Dirigera.Lib.Api.Dto +{ + internal class SceneInfoDto + { + public string? Name { get; set; } + public string? Icon { get; set; } + } +} diff --git a/Dirigera.Lib/Dirigera.Lib/DirigeraManager.cs b/Dirigera.Lib/Dirigera.Lib/DirigeraManager.cs index b5325e7..a44ccd8 100644 --- a/Dirigera.Lib/Dirigera.Lib/DirigeraManager.cs +++ b/Dirigera.Lib/Dirigera.Lib/DirigeraManager.cs @@ -1,8 +1,8 @@ using Dirigera.Lib.Api; using Dirigera.Lib.Api.Dto.Base; using Dirigera.Lib.Constants; -using Dirigera.Lib.Devices; -using Dirigera.Lib.Devices.Base; +using Dirigera.Lib.Models; +using Dirigera.Lib.Models.Base; using Dirigera.Models; using System.Drawing; using Zeroconf; @@ -20,6 +20,7 @@ public class DirigeraManager public Hub? Hub { get; set; } public List Rooms { get; set; } = new(); + public List Scenes { get; set; } = new(); public List Devices { get; set; } = new(); public List Lights { get; set; } = new(); public List Blinds { get; set; } = new(); @@ -40,11 +41,12 @@ public DirigeraManager(string ipAddress, string? authToken = null) _apiClient = new ApiClient(ipAddress, authToken); } - public async Task Refresh() + public async Task LoadAll() { await GetHubDetails(); await GetDevices(); await GetRooms(); + await GetScenes(); } @@ -92,6 +94,27 @@ private async Task GetRooms() .ToList(); } + private async Task GetScenes() + { + var scenes = await _apiClient.GetScenes(); + if (scenes is null) return; + + Scenes = scenes + .Select(x => new Scene(this) + { + Id = x.Id, + Name = x.Info?.Name, + Icon = x.Info?.Icon, + Type = x.Type, + CreatedAt = x.CreatedAt, + LastCompleted = x.LastCompleted, + LastTriggered = x.LastTriggered, + UndoAllowedDuration = x.UndoAllowedDuration + }) + .Where(x => x != null) + .ToList(); + } + public async Task SetLightState(Light light, bool state) { if (light is null || light.Id is null) return; @@ -203,6 +226,18 @@ public async Task SetOutlet(Outlet outlet, bool state) }); } + public async Task TriggerScene(Scene scene) + { + if (scene is null || scene.Id is null) return; + await _apiClient.TriggerScene(scene.Id); + } + + public async Task UndoScene(Scene scene) + { + if (scene is null || scene.Id is null) return; + await _apiClient.UndoScene(scene.Id); + } + /// /// Create a object by automatically discovering your IKEA DIRIGERA hub on your network. diff --git a/Dirigera.Lib/Dirigera.Lib/Devices/Base/Device.cs b/Dirigera.Lib/Dirigera.Lib/Models/Base/Device.cs similarity index 99% rename from Dirigera.Lib/Dirigera.Lib/Devices/Base/Device.cs rename to Dirigera.Lib/Dirigera.Lib/Models/Base/Device.cs index b668830..441bee1 100644 --- a/Dirigera.Lib/Dirigera.Lib/Devices/Base/Device.cs +++ b/Dirigera.Lib/Dirigera.Lib/Models/Base/Device.cs @@ -1,7 +1,7 @@ using Dirigera.Lib.Api.Dto.Base; using System.Text.Json; -namespace Dirigera.Lib.Devices.Base +namespace Dirigera.Lib.Models.Base { public class Device { diff --git a/Dirigera.Lib/Dirigera.Lib/Devices/Blind.cs b/Dirigera.Lib/Dirigera.Lib/Models/Blind.cs similarity index 97% rename from Dirigera.Lib/Dirigera.Lib/Devices/Blind.cs rename to Dirigera.Lib/Dirigera.Lib/Models/Blind.cs index 3e790ef..eef60f9 100644 --- a/Dirigera.Lib/Dirigera.Lib/Devices/Blind.cs +++ b/Dirigera.Lib/Dirigera.Lib/Models/Blind.cs @@ -1,6 +1,6 @@ using Dirigera.Lib; using Dirigera.Lib.Api.Dto.Base; -using Dirigera.Lib.Devices.Base; +using Dirigera.Lib.Models.Base; namespace Dirigera.Models { diff --git a/Dirigera.Lib/Dirigera.Lib/Devices/EnvironmentSensor.cs b/Dirigera.Lib/Dirigera.Lib/Models/EnvironmentSensor.cs similarity index 98% rename from Dirigera.Lib/Dirigera.Lib/Devices/EnvironmentSensor.cs rename to Dirigera.Lib/Dirigera.Lib/Models/EnvironmentSensor.cs index 2dffce1..6942a4c 100644 --- a/Dirigera.Lib/Dirigera.Lib/Devices/EnvironmentSensor.cs +++ b/Dirigera.Lib/Dirigera.Lib/Models/EnvironmentSensor.cs @@ -1,6 +1,6 @@ using Dirigera.Lib; using Dirigera.Lib.Api.Dto.Base; -using Dirigera.Lib.Devices.Base; +using Dirigera.Lib.Models.Base; namespace Dirigera.Models { diff --git a/Dirigera.Lib/Dirigera.Lib/Devices/Hub.cs b/Dirigera.Lib/Dirigera.Lib/Models/Hub.cs similarity index 82% rename from Dirigera.Lib/Dirigera.Lib/Devices/Hub.cs rename to Dirigera.Lib/Dirigera.Lib/Models/Hub.cs index 7f209f4..8be02d7 100644 --- a/Dirigera.Lib/Dirigera.Lib/Devices/Hub.cs +++ b/Dirigera.Lib/Dirigera.Lib/Models/Hub.cs @@ -1,7 +1,7 @@ using Dirigera.Lib.Api.Dto; -using Dirigera.Lib.Devices.Base; +using Dirigera.Lib.Models.Base; -namespace Dirigera.Lib.Devices +namespace Dirigera.Lib.Models { public class Hub : Device { diff --git a/Dirigera.Lib/Dirigera.Lib/Devices/Light.cs b/Dirigera.Lib/Dirigera.Lib/Models/Light.cs similarity index 98% rename from Dirigera.Lib/Dirigera.Lib/Devices/Light.cs rename to Dirigera.Lib/Dirigera.Lib/Models/Light.cs index a4af12d..147f165 100644 --- a/Dirigera.Lib/Dirigera.Lib/Devices/Light.cs +++ b/Dirigera.Lib/Dirigera.Lib/Models/Light.cs @@ -1,7 +1,7 @@ using Dirigera.Lib; using Dirigera.Lib.Api.Dto.Base; using Dirigera.Lib.Constants; -using Dirigera.Lib.Devices.Base; +using Dirigera.Lib.Models.Base; using System.Drawing; namespace Dirigera.Models diff --git a/Dirigera.Lib/Dirigera.Lib/Devices/Outlet.cs b/Dirigera.Lib/Dirigera.Lib/Models/Outlet.cs similarity index 97% rename from Dirigera.Lib/Dirigera.Lib/Devices/Outlet.cs rename to Dirigera.Lib/Dirigera.Lib/Models/Outlet.cs index 1528923..b3a1a8f 100644 --- a/Dirigera.Lib/Dirigera.Lib/Devices/Outlet.cs +++ b/Dirigera.Lib/Dirigera.Lib/Models/Outlet.cs @@ -1,6 +1,6 @@ using Dirigera.Lib; using Dirigera.Lib.Api.Dto.Base; -using Dirigera.Lib.Devices.Base; +using Dirigera.Lib.Models.Base; namespace Dirigera.Models { diff --git a/Dirigera.Lib/Dirigera.Lib/Devices/Room.cs b/Dirigera.Lib/Dirigera.Lib/Models/Room.cs similarity index 79% rename from Dirigera.Lib/Dirigera.Lib/Devices/Room.cs rename to Dirigera.Lib/Dirigera.Lib/Models/Room.cs index 796aa93..ec15b46 100644 --- a/Dirigera.Lib/Dirigera.Lib/Devices/Room.cs +++ b/Dirigera.Lib/Dirigera.Lib/Models/Room.cs @@ -1,6 +1,4 @@ -using Dirigera.Lib.Api.Dto; - -namespace Dirigera.Lib.Devices +namespace Dirigera.Lib.Models { public class Room { diff --git a/Dirigera.Lib/Dirigera.Lib/Models/Scene.cs b/Dirigera.Lib/Dirigera.Lib/Models/Scene.cs new file mode 100644 index 0000000..11d5309 --- /dev/null +++ b/Dirigera.Lib/Dirigera.Lib/Models/Scene.cs @@ -0,0 +1,31 @@ +namespace Dirigera.Lib.Models +{ + public class Scene + { + private readonly DirigeraManager _dirigeraManager; + + public string? Id { get; internal set; } + public string? Name { get; internal set; } + public string? Icon { get; internal set; } + public string? Type { get; set; } + public string? CreatedAt { get; set; } + public string? LastCompleted { get; set; } + public string? LastTriggered { get; set; } + public int UndoAllowedDuration { get; set; } + + internal Scene(DirigeraManager dirigeraManager) + { + _dirigeraManager = dirigeraManager; + } + + public async Task Trigger() + { + await _dirigeraManager.TriggerScene(this); + } + + public async Task Undo() + { + await _dirigeraManager.UndoScene(this); + } + } +}