diff --git a/src/HassClient.Core.Tests/Converters/ColorConverterTests.cs b/src/HassClient.Core.Tests/Converters/ColorConverterTests.cs index 22eafde..8757bba 100644 --- a/src/HassClient.Core.Tests/Converters/ColorConverterTests.cs +++ b/src/HassClient.Core.Tests/Converters/ColorConverterTests.cs @@ -35,6 +35,7 @@ public static IEnumerable WriteReadJsonTestCases() yield return createData(new RGBColor(10, 20, 30)); yield return createData(new RGBWColor(10, 20, 30, 255)); + yield return createData(new RGBWWColor(10, 20, 30, 128, 255)); yield return createData(new HSColor(10, 20)); yield return createData(new XYColor(0.2f, 0.6f)); yield return createData(new NameColor("test_color")); @@ -51,7 +52,7 @@ public void WriteJson(Color color) var serializer = JsonSerializer.Create(); converter.WriteJson(jsonWriter, color, serializer); - Assert.AreEqual($"\"{color}\"", textWriter.ToString()); + Assert.AreEqual(GetJsonRepresentation(color), textWriter.ToString()); } [Test] @@ -74,6 +75,7 @@ public static IEnumerable ReadJsonWithExisingValueTestCases() yield return createData(new RGBColor(10, 20, 30), new RGBColor(40, 50, 60)); yield return createData(new RGBWColor(10, 20, 30, 255), new RGBWColor(40, 50, 60, 128)); + yield return createData(new RGBWWColor(10, 20, 30, 128, 255), new RGBWWColor(40, 50, 60, 64, 128)); yield return createData(new HSColor(10, 20), new HSColor(30, 40)); yield return createData(new XYColor(0.2f, 0.6f), new XYColor(0.4f, 0.8f)); yield return createData(new NameColor("test_color"), new NameColor("new_color")); @@ -111,7 +113,7 @@ private string GetJsonRepresentation(Color color) } else { - return color.ToString(); + return color.ToString().Replace(" ", string.Empty); } } } diff --git a/src/HassClient.Core.Tests/Models/ColorTests.cs b/src/HassClient.Core.Tests/Models/ColorTests.cs index eb8d53d..4a4ebfa 100644 --- a/src/HassClient.Core.Tests/Models/ColorTests.cs +++ b/src/HassClient.Core.Tests/Models/ColorTests.cs @@ -36,6 +36,24 @@ public void FromRGBW() Assert.AreEqual(white, color.W); } + [Test] + public void FromRGBWW() + { + byte red = 10; + byte green = 20; + byte blue = 30; + byte coldWhite = 128; + byte warmWhite = 255; + + var color = Color.FromRGBWW(red, green, blue, coldWhite, warmWhite); + + Assert.AreEqual(red, color.R); + Assert.AreEqual(green, color.G); + Assert.AreEqual(blue, color.B); + Assert.AreEqual(coldWhite, color.CW); + Assert.AreEqual(warmWhite, color.WW); + } + [Test] public void FromHS() { diff --git a/src/HassClient.Core/HassClient.Core.csproj b/src/HassClient.Core/HassClient.Core.csproj index 953fb76..2277a53 100644 --- a/src/HassClient.Core/HassClient.Core.csproj +++ b/src/HassClient.Core/HassClient.Core.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 1.0.13 + 1.0.14 VFerrer A shared package used by HassClient. Do not install this package manually, it will be added as a prerequisite by other packages that require it. https://github.com/vicfergar/HassClient diff --git a/src/HassClient.Core/Models/Color/Color.cs b/src/HassClient.Core/Models/Color/Color.cs index 313cc22..66ab6dd 100644 --- a/src/HassClient.Core/Models/Color/Color.cs +++ b/src/HassClient.Core/Models/Color/Color.cs @@ -30,6 +30,20 @@ public static RGBWColor FromRGBW(byte red, byte green, byte blue, byte white) return new RGBWColor(red, green, blue, white); } + /// + /// Creates a with the given values. + /// + /// The red color component value. + /// The green color component value. + /// The blue color component value. + /// The cold white color component value. + /// The warm white color component value. + /// A with the given values. + public static RGBWWColor FromRGBWW(byte red, byte green, byte blue, byte coldWhite, byte warmWhite) + { + return new RGBWWColor(red, green, blue, coldWhite, warmWhite); + } + /// /// Creates a with the given values. /// diff --git a/src/HassClient.Core/Models/Color/KelvinTemperatureColor.cs b/src/HassClient.Core/Models/Color/KelvinTemperatureColor.cs index d71b624..4991245 100644 --- a/src/HassClient.Core/Models/Color/KelvinTemperatureColor.cs +++ b/src/HassClient.Core/Models/Color/KelvinTemperatureColor.cs @@ -22,5 +22,8 @@ public KelvinTemperatureColor(uint kelvins) { this.Kelvins = Math.Min(Math.Max(kelvins, 1000), 40000); } + + /// + public override string ToString() => this.Kelvins.ToString(); } } diff --git a/src/HassClient.Core/Models/Color/MiredsTemperatureColor.cs b/src/HassClient.Core/Models/Color/MiredsTemperatureColor.cs index 32ceb2d..6ea404b 100644 --- a/src/HassClient.Core/Models/Color/MiredsTemperatureColor.cs +++ b/src/HassClient.Core/Models/Color/MiredsTemperatureColor.cs @@ -22,5 +22,8 @@ public MiredsTemperatureColor(uint mireds) { this.Mireds = Math.Min(Math.Max(mireds, 153), 500); } + + /// + public override string ToString() => this.Mireds.ToString(); } } diff --git a/src/HassClient.Core/Models/Color/RGBWWColor.cs b/src/HassClient.Core/Models/Color/RGBWWColor.cs new file mode 100644 index 0000000..d79a9fb --- /dev/null +++ b/src/HassClient.Core/Models/Color/RGBWWColor.cs @@ -0,0 +1,47 @@ +namespace HassClient.Models +{ + /// + /// Represents an RGBWW (red, green, blue, cold white, warm white) color. + /// + public class RGBWWColor : RGBColor + { + /// + /// Gets the cold white color component value. + /// + public byte CW { get; internal set; } + + /// + /// Gets the warm white color component value. + /// + public byte WW { get; internal set; } + + /// + /// Initializes a new instance of the class. + /// + /// The red color component value. + /// The green color component value. + /// The blue color component value. + /// The cold white color component value. + /// The warm white color component value. + public RGBWWColor(byte red, byte green, byte blue, byte coldWhite, byte warmWhite) + : base(red, green, blue) + { + this.CW = coldWhite; + this.WW = warmWhite; + } + + /// + /// Initializes a new instance of the class. + /// + /// A color. + public RGBWWColor(System.Drawing.Color color) + : this(color.R, color.G, color.B, color.A, color.A) + { + } + + public static implicit operator RGBWWColor(System.Drawing.Color x) => new RGBWWColor(x); + + /// + public override string ToString() => $"[{this.R}, {this.G}, {this.B}, {this.CW}, {this.WW}]"; + } +} diff --git a/src/HassClient.Core/Serialization/Converters/ColorConverter.cs b/src/HassClient.Core/Serialization/Converters/ColorConverter.cs index 1bfcc08..710706a 100644 --- a/src/HassClient.Core/Serialization/Converters/ColorConverter.cs +++ b/src/HassClient.Core/Serialization/Converters/ColorConverter.cs @@ -13,7 +13,22 @@ public class ColorConverter : JsonConverter /// public override void WriteJson(JsonWriter writer, Color value, JsonSerializer serializer) { - serializer.Serialize(writer, value.ToString()); + if (value is NameColor) + { + serializer.Serialize(writer, value.ToString()); + } + else if (value is KelvinTemperatureColor kelvinColor) + { + serializer.Serialize(writer, kelvinColor.Kelvins); + } + else if (value is MiredsTemperatureColor miredsColor) + { + serializer.Serialize(writer, miredsColor.Mireds); + } + else + { + serializer.Serialize(writer, JArray.Parse(value.ToString())); + } } /// @@ -34,6 +49,22 @@ public override Color ReadJson(JsonReader reader, Type objectType, Color existin return Color.FromRGBW((byte)values[0], (byte)values[1], (byte)values[2], (byte)values[3]); } + else if (objectType == typeof(RGBWWColor)) + { + var values = serializer.Deserialize(reader); + if (hasExistingValue) + { + var rgbwwColor = existingValue as RGBWWColor; + rgbwwColor.R = (byte)values[0]; + rgbwwColor.G = (byte)values[1]; + rgbwwColor.B = (byte)values[2]; + rgbwwColor.CW = (byte)values[3]; + rgbwwColor.WW = (byte)values[4]; + return rgbwwColor; + } + + return Color.FromRGBWW((byte)values[0], (byte)values[1], (byte)values[2], (byte)values[3], (byte)values[4]); + } else if (objectType == typeof(RGBColor)) { var values = serializer.Deserialize(reader); diff --git a/src/HassClient.WS/HassClient.WS.csproj b/src/HassClient.WS/HassClient.WS.csproj index 3cb85db..ce9da0f 100644 --- a/src/HassClient.WS/HassClient.WS.csproj +++ b/src/HassClient.WS/HassClient.WS.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 1.0.13 + 1.0.14 VFerrer A Home Assistant WebSocket client to communicate with Home Assistant instances. https://github.com/vicfergar/HassClient