From c7100f7776e3dc3b1b5982c744214479713e738a Mon Sep 17 00:00:00 2001 From: Michiel Post Date: Thu, 15 Sep 2016 22:49:26 +0200 Subject: [PATCH] Support for Capabilities API --- src/Q42.HueApi.Tests/CapabilitiesTest.cs | 34 ++++++ src/Q42.HueApi.Tests/Q42.HueApi.Tests.csproj | 1 + src/Q42.HueApi/HueClient-Capabilities.cs | 37 ++++++ src/Q42.HueApi/Interfaces/IHueClient.cs | 10 +- src/Q42.HueApi/Models/BridgeCapabilities.cs | 115 +++++++++++++++++++ src/Q42.HueApi/Q42.HueApi.csproj | 2 + 6 files changed, 197 insertions(+), 2 deletions(-) create mode 100644 src/Q42.HueApi.Tests/CapabilitiesTest.cs create mode 100644 src/Q42.HueApi/HueClient-Capabilities.cs create mode 100644 src/Q42.HueApi/Models/BridgeCapabilities.cs diff --git a/src/Q42.HueApi.Tests/CapabilitiesTest.cs b/src/Q42.HueApi.Tests/CapabilitiesTest.cs new file mode 100644 index 00000000..2aaff3a0 --- /dev/null +++ b/src/Q42.HueApi.Tests/CapabilitiesTest.cs @@ -0,0 +1,34 @@ +using System; +using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Configuration; +using System.Collections.Generic; +using System.Threading.Tasks; +using Q42.HueApi.Interfaces; + +namespace Q42.HueApi.Tests +{ + [TestClass] + public class CapabilitiesTest + { + private IHueClient _client; + + [TestInitialize] + public void Initialize() + { + string ip = ConfigurationManager.AppSettings["ip"].ToString(); + string key = ConfigurationManager.AppSettings["key"].ToString(); + + _client = new LocalHueClient(ip, key); + } + + [TestMethod] + public async Task GetCapabilitiesTest() + { + var result = await _client.GetCapabilitiesAsync(); + + Assert.IsNotNull(result); + } + + } +} diff --git a/src/Q42.HueApi.Tests/Q42.HueApi.Tests.csproj b/src/Q42.HueApi.Tests/Q42.HueApi.Tests.csproj index 1d7cc0c0..1428002b 100644 --- a/src/Q42.HueApi.Tests/Q42.HueApi.Tests.csproj +++ b/src/Q42.HueApi.Tests/Q42.HueApi.Tests.csproj @@ -67,6 +67,7 @@ + diff --git a/src/Q42.HueApi/HueClient-Capabilities.cs b/src/Q42.HueApi/HueClient-Capabilities.cs new file mode 100644 index 00000000..e095dd5f --- /dev/null +++ b/src/Q42.HueApi/HueClient-Capabilities.cs @@ -0,0 +1,37 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Q42.HueApi.Models; +using Q42.HueApi.Models.Groups; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +namespace Q42.HueApi +{ + /// + /// Partial HueClient, contains requests to the /config/ url + /// + public partial class HueClient + { + + /// + /// Get bridge capabilities + /// + /// + public async Task GetCapabilitiesAsync() + { + CheckInitialized(); + + HttpClient client = await GetHttpClient().ConfigureAwait(false); + var stringResult = await client.GetStringAsync(new Uri(ApiBase + "capabilities")).ConfigureAwait(false); + + BridgeCapabilities capabilities = DeserializeResult(stringResult); + + return capabilities; + } + + } +} diff --git a/src/Q42.HueApi/Interfaces/IHueClient.cs b/src/Q42.HueApi/Interfaces/IHueClient.cs index 51e50f58..f4920398 100644 --- a/src/Q42.HueApi/Interfaces/IHueClient.cs +++ b/src/Q42.HueApi/Interfaces/IHueClient.cs @@ -257,6 +257,12 @@ public interface IHueClient Task CreateResourceLinkAsync(ResourceLink resourceLink); Task UpdateResourceLinkAsync(string id, ResourceLink resourceLink); - #endregion - } + #endregion + + #region Capabilities + + Task GetCapabilitiesAsync(); + +#endregion + } } diff --git a/src/Q42.HueApi/Models/BridgeCapabilities.cs b/src/Q42.HueApi/Models/BridgeCapabilities.cs new file mode 100644 index 00000000..478449e3 --- /dev/null +++ b/src/Q42.HueApi/Models/BridgeCapabilities.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Q42.HueApi.Models +{ + public class BridgeCapabilities + { + public LightsCapability Lights { get; set; } + public SensorsCapability Sensors { get; set; } + public GroupsCapability Groups { get; set; } + public ScenesCapability Scenes { get; set; } + public SchedulesCapability Schedules { get; set; } + public RulesCapability Rules { get; set; } + public ResourceLinksCapability Resourcelinks { get; set; } + public Timezones Timezones { get; set; } + + } + + public class LightsCapability : Capability + { + } + + public class ClipCapability : Capability + { + } + + public class ZllCapability : Capability + { + } + + public class ZgpCapability : Capability + { + } + + public class SensorsCapability : Capability + { + /// + /// Capability information of resources which are directly created by POST + /// + public ClipCapability Clip { get; set; } + + /// + /// Capability information of Zigbee resources which are discovered by POST + /// + public ZllCapability Zll { get; set; } + + /// + /// Capability information of ZGP resources which are discovered by POST + /// + public ZgpCapability Zgp { get; set; } + } + + public class GroupsCapability : Capability + { + } + + public class LightstatesCapability : Capability + { + } + + public class ScenesCapability : Capability + { + /// + /// Represents the total pool of individual lightsstates (scene setting per lamp) which can be used across all scenes in /scenes/lightstates + /// + public LightstatesCapability Lightstates { get; set; } + } + + public class SchedulesCapability : Capability + { + } + + public class ConditionsCapability : Capability + { + } + + public class ActionsCapability : Capability + { + } + + public class RulesCapability : Capability + { + public ConditionsCapability Conditions { get; set; } + + /// + /// Represents the total pool of individual actions which can be used across all rules in /rules/actions + /// + public ActionsCapability Actions { get; set; } + } + + public class ResourceLinksCapability : Capability + { + + } + + public class Timezones + { + /// + /// List of supported time zones represented as tz database strings. Each value can be set in /config/timezone. Other values are not supported. + /// + public List Values { get; set; } + } + + public abstract class Capability + { + /// + /// Total (maximum) number of resources which still can be created by POST on this resource path. The number of creatable resources for a specific subresource type might be lower. + /// + public int Available { get; set; } + } + +} diff --git a/src/Q42.HueApi/Q42.HueApi.csproj b/src/Q42.HueApi/Q42.HueApi.csproj index 670eacf0..6fa6e76e 100644 --- a/src/Q42.HueApi/Q42.HueApi.csproj +++ b/src/Q42.HueApi/Q42.HueApi.csproj @@ -54,6 +54,7 @@ + @@ -74,6 +75,7 @@ +