From 317ae9b68293caf2cd294fe86de5daa4efa1a385 Mon Sep 17 00:00:00 2001 From: BlubbFish Date: Thu, 3 May 2018 14:35:02 +0000 Subject: [PATCH] [NF] Create Senml Messages for Linksmart --- Zway/Devices/CommandClasses/Alarm.cs | 39 +++++-- Zway/Devices/CommandClasses/AlarmSensor.cs | 41 ++++--- Zway/Devices/CommandClasses/Battery.cs | 47 +++++--- Zway/Devices/CommandClasses/CentralScene.cs | 104 +++++++++++------- .../CommandClassSubs/Alarmsensorsub.cs | 47 ++++++-- .../CommandClassSubs/Configurationsub.cs | 39 +++++-- .../CommandClassSubs/MeterSub.cs | 48 ++++++-- .../SceneControllerConfSub.cs | 38 +++++-- .../CommandClassSubs/SensorBinarySub.cs | 42 +++++-- .../CommandClassSubs/SensorMultilevelSub.cs | 47 ++++++-- .../CommandClassSubs/ThermostatSetPointSub.cs | 60 +++++++--- Zway/Devices/CommandClasses/Configuration.cs | 17 ++- Zway/Devices/CommandClasses/Indicator.cs | 41 +++++-- Zway/Devices/CommandClasses/Meter.cs | 39 ++++--- .../CommandClasses/SceneControllerConf.cs | 39 ++++--- Zway/Devices/CommandClasses/SensorBinary.cs | 39 ++++--- .../CommandClasses/SensorMultilevel.cs | 39 ++++--- Zway/Devices/CommandClasses/SwitchBinary.cs | 53 ++++++--- .../CommandClasses/SwitchMultilevel.cs | 47 +++++--- Zway/Devices/CommandClasses/ThermostatMode.cs | 44 +++++--- .../CommandClasses/ThermostatSetPoint.cs | 39 ++++--- Zway/Devices/CommandClasses/Wakeup.cs | 55 +++++---- Zway/Interfaces/ACommandClass.cs | 63 ++++++++--- Zway/Properties/AssemblyInfo.cs | 6 +- Zway/Zway.csproj | 12 +- Zway/bin/Release/Iot-Interfaces.dll | Bin 0 -> 6144 bytes Zway/bin/Release/LitJson.dll | Bin 54272 -> 50688 bytes Zway/bin/Release/Zway.dll | Bin 59904 -> 61440 bytes Zway/packages.config | 4 - 29 files changed, 748 insertions(+), 341 deletions(-) create mode 100644 Zway/bin/Release/Iot-Interfaces.dll delete mode 100644 Zway/packages.config diff --git a/Zway/Devices/CommandClasses/Alarm.cs b/Zway/Devices/CommandClasses/Alarm.cs index 1baf3b2..33cef64 100644 --- a/Zway/Devices/CommandClasses/Alarm.cs +++ b/Zway/Devices/CommandClasses/Alarm.cs @@ -4,6 +4,7 @@ using System.Text.RegularExpressions; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses { @@ -13,9 +14,18 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { class Alarm : ACommandClass { public override event UpdatedValue Update; + #region Properties + /// + /// Unklar + /// public Int32 Level { get; private set; } + /// + /// unklar + /// public Int32 AlarmType { get; private set; } + #endregion + #region Constructor public Alarm(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.InitComplex(json); } @@ -28,9 +38,22 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { this.Level = Int32.Parse(json["data"]["V1event"]["level"]["value"].ToString()); } } + #endregion + + #region ACommandClass + public override String ToString() { + return "Alarm " + this.Name + " [" + this.Id + "]: " + this.AlarmType + " " + this.Level; + } + + public override Dictionary ToDictionary() { + return new Dictionary { + { "AlarmType", this.AlarmType }, + { "Level", this.Level }, + }; + } internal override void SetUpdate(JsonData json, Match match) { - if(match.Groups[4].Value == ".data.V1event") { + if (match.Groups[4].Value == ".data.V1event") { if (json.Keys.Contains("alarmType") && json["alarmType"].Keys.Contains("value") && json.Keys.Contains("level") && json["level"].Keys.Contains("value") && this.CheckSetUpdateTime(json)) { @@ -43,17 +66,13 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } - public override String ToString() { - return "Alarm " + this.Name + " [" + this.Id + "]: " + this.AlarmType + " " + this.Level; - } - internal override void Poll() => this.PollNone(); + #endregion - public override Dictionary ToDictionary() { - return new Dictionary { - { "AlarmType", this.AlarmType }, - { "Level", this.Level }, - }; + #region ISenml + protected override List ToSenmlList() { + return new List() { }; } + #endregion } } diff --git a/Zway/Devices/CommandClasses/AlarmSensor.cs b/Zway/Devices/CommandClasses/AlarmSensor.cs index 486024c..64c6032 100644 --- a/Zway/Devices/CommandClasses/AlarmSensor.cs +++ b/Zway/Devices/CommandClasses/AlarmSensor.cs @@ -6,6 +6,7 @@ using BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses { @@ -15,6 +16,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { public class Alarmsensor : ACommandClass { public override event UpdatedValue Update; + #region Constructor public Alarmsensor(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.HasSub = true; this.InitComplex(json); @@ -23,21 +25,6 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } - private void DeviceUpdate(Object sender, DeviceUpdateEvent e) { - this.Update?.Invoke(this, e); - } - - internal override void SetUpdate(JsonData json, Match match) { - if (match.Groups[4].Value.StartsWith(".data.")) { - Int32 subid = Int32.Parse(match.Groups[5].Value); - if (this.Sub.ContainsKey(subid)) { - this.Sub[subid].SetUpdate(json, match); - } - } else { - Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); - } - } - private void InitComplex(JsonData json) { if (json.Keys.Contains("data")) { JsonData data = json["data"]; @@ -55,8 +42,30 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } - internal override void Poll() => this.PollSubGlobal(); + private void DeviceUpdate(Object sender, DeviceUpdateEvent e) { + this.Update?.Invoke(this, e); + } + #endregion + + #region ACommandClass + internal override void SetUpdate(JsonData json, Match match) { + if (match.Groups[4].Value.StartsWith(".data.")) { + Int32 subid = Int32.Parse(match.Groups[5].Value); + if (this.Sub.ContainsKey(subid)) { + this.Sub[subid].SetUpdate(json, match); + } + } else { + Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); + } + } public override Dictionary ToDictionary() => this.ToDictionarySub(); + + internal override void Poll() => this.PollSubGlobal(); + #endregion + + #region ISenml + protected override List ToSenmlList() => this.ToSenmlListSub(); + #endregion } } diff --git a/Zway/Devices/CommandClasses/Battery.cs b/Zway/Devices/CommandClasses/Battery.cs index 71f5f1b..0b7a785 100644 --- a/Zway/Devices/CommandClasses/Battery.cs +++ b/Zway/Devices/CommandClasses/Battery.cs @@ -4,6 +4,7 @@ using System.Text.RegularExpressions; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses { @@ -11,15 +12,37 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { /// 128 = Battery /// public class Battery : ACommandClass { - - public Double Level { get; private set; } - public override event UpdatedValue Update; + #region Properties + /// + /// Batterylevel in Percent + /// + public Double Level { get; private set; } + #endregion + + #region Constructor public Battery(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.InitComplex(json); } + private void InitComplex(JsonData json) { + if (json.Keys.Contains("data") && json["data"].Keys.Contains("last") && json["data"]["last"].Keys.Contains("value")) { + this.Level = Double.Parse(json["data"]["last"]["value"].ToString()); + } + } + #endregion + + #region ACommandClass + public override String ToString() { + return "Battery " + this.Name + " [" + this.Id + "]: " + this.Level; + } + + public override Dictionary ToDictionary() { + return new Dictionary { + { "Level", this.Level }, + }; + } internal override void SetUpdate(JsonData json, Match match) { Boolean success = false; if (match.Groups[4].Value == ".data") { @@ -41,21 +64,13 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { this.Update?.Invoke(this, new DeviceUpdateEvent(this.Level, this.LastUpdate, this)); } } + #endregion - private void InitComplex(JsonData json) { - if (json.Keys.Contains("data") && json["data"].Keys.Contains("last") && json["data"]["last"].Keys.Contains("value")) { - this.Level = Double.Parse(json["data"]["last"]["value"].ToString()); - } + #region ISenml + protected override List ToSenmlList() { + return new List() { new SenmlDouble("chargelevel", Senml.Units.Percent, this.Level) }; } + #endregion - public override String ToString() { - return "Battery " + this.Name + " [" + this.Id + "]: " + this.Level; - } - - public override Dictionary ToDictionary() { - return new Dictionary { - { "Level", this.Level }, - }; - } } } diff --git a/Zway/Devices/CommandClasses/CentralScene.cs b/Zway/Devices/CommandClasses/CentralScene.cs index 55e475f..d4a9a96 100644 --- a/Zway/Devices/CommandClasses/CentralScene.cs +++ b/Zway/Devices/CommandClasses/CentralScene.cs @@ -5,6 +5,7 @@ using System.Text.RegularExpressions; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses { @@ -14,15 +15,72 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { public class Centralscene : ACommandClass { public override event UpdatedValue Update; + #region Properties + /// + /// Combination of Scenes and Modes + /// public ReadOnlyDictionary> ValidScenesModes { get; private set; } + /// + /// Current active Senes + /// public Int32 Scene { get; private set; } + /// + /// Current active mode + /// public Int32 Key { get; private set; } + #endregion + #region Constructor public Centralscene(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.ValidScenesModes = new ReadOnlyDictionary>(new Dictionary>()); this.InitComplex(json); } + private void InitComplex(JsonData json) { + if (json.Keys.Contains("data")) { + JsonData data = json["data"]; + if (data.Keys.Contains("sceneSupportedKeyAttributesMask")) { + Dictionary> scenes = new Dictionary>(); + foreach (String item in data["sceneSupportedKeyAttributesMask"].Keys) { + if (Int32.TryParse(item, out Int32 mode) && + data["sceneSupportedKeyAttributesMask"][item].Keys.Contains("value") && + data["sceneSupportedKeyAttributesMask"][item]["value"].IsArray) { + JsonData values = data["sceneSupportedKeyAttributesMask"][item]["value"]; + List modes = new List(); + foreach (JsonData value in values) { + modes.Add(Int32.Parse(value.ToString())); + } + scenes.Add(mode, new ReadOnlyCollection(modes)); + } + } + this.ValidScenesModes = new ReadOnlyDictionary>(scenes); + if (data.Keys.Contains("currentScene") && + data["currentScene"].Keys.Contains("value") && + data["currentScene"]["value"] != null) { + this.Scene = Int32.Parse(data["currentScene"]["value"].ToString()); + } + if (data.Keys.Contains("keyAttribute") && + data["keyAttribute"].Keys.Contains("value") && + data["keyAttribute"]["value"] != null) { + this.Key = Int32.Parse(data["keyAttribute"]["value"].ToString()); + } + } + } + } + #endregion + + #region ACommandClass + public override String ToString() { + return "CentralScene " + this.Name + " [" + this.Id + "]: " + this.Scene + "-" + this.Key; + } + + public override Dictionary ToDictionary() { + return new Dictionary { + { "Scene", this.Scene }, + { "Key", this.Key }, + }; + } + internal override void SetUpdate(JsonData json, Match match) { if (match.Groups[4].Value == ".data.currentScene") { if (json.Keys.Contains("value")) { @@ -38,49 +96,13 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } - private void InitComplex(JsonData json) { - if (json.Keys.Contains("data")) { - JsonData data = json["data"]; - if(data.Keys.Contains("sceneSupportedKeyAttributesMask")) { - Dictionary> scenes = new Dictionary>(); - foreach (String item in data["sceneSupportedKeyAttributesMask"].Keys) { - if (Int32.TryParse(item, out Int32 mode) && - data["sceneSupportedKeyAttributesMask"][item].Keys.Contains("value") && - data["sceneSupportedKeyAttributesMask"][item]["value"].IsArray) { - JsonData values = data["sceneSupportedKeyAttributesMask"][item]["value"]; - List modes = new List(); - foreach (JsonData value in values) { - modes.Add(Int32.Parse(value.ToString())); - } - scenes.Add(mode, new ReadOnlyCollection(modes)); - } - } - this.ValidScenesModes = new ReadOnlyDictionary>(scenes); - if (data.Keys.Contains("currentScene") && - data["currentScene"].Keys.Contains("value") && - data["currentScene"]["value"] != null) { - this.Scene = Int32.Parse(data["currentScene"]["value"].ToString()); - } - if (data.Keys.Contains("keyAttribute") && - data["keyAttribute"].Keys.Contains("value") && - data["keyAttribute"]["value"] != null) { - this.Key = Int32.Parse(data["keyAttribute"]["value"].ToString()); - } - } - } - } - - public override String ToString() { - return "CentralScene " + this.Name + " [" + this.Id + "]: " + this.Scene+"-"+this.Key; - } - internal override void Poll() => this.PollNone(); + #endregion - public override Dictionary ToDictionary() { - return new Dictionary { - { "Scene", this.Scene }, - { "Key", this.Key }, - }; + #region ISenml + protected override List ToSenmlList() { + return new List() { new SenmlDouble("scene", Senml.Units.CounterValue, this.Scene), new SenmlDouble("key", Senml.Units.CounterValue, this.Key) }; } + #endregion } } diff --git a/Zway/Devices/CommandClasses/CommandClassSubs/Alarmsensorsub.cs b/Zway/Devices/CommandClasses/CommandClassSubs/Alarmsensorsub.cs index a72b2f4..5f1fbd8 100644 --- a/Zway/Devices/CommandClasses/CommandClassSubs/Alarmsensorsub.cs +++ b/Zway/Devices/CommandClasses/CommandClassSubs/Alarmsensorsub.cs @@ -4,17 +4,33 @@ using System.Text.RegularExpressions; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { public class Alarmsensorsub : ACommandClass { public override event UpdatedValue Update; + #region Properties + /// + /// + /// public Int32 Source { get; private set; } + /// + /// + /// public Int32 Level { get; private set; } + /// + /// + /// public Int32 Time { get; private set; } + /// + /// + /// public String Type { get; private set; } + #endregion + #region Constructor public Alarmsensorsub(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.IsSub = true; InitComplex(json); @@ -31,6 +47,21 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { this.Type = json["typeString"]["value"].ToString(); } } + #endregion + + #region ACommandClass + public override String ToString() { + return "AlarmSensor " + this.Name + " [" + this.Id + "]: " + this.Type + " " + this.Source + " " + this.Level + " " + this.Time + " " + this.Type; + } + + public override Dictionary ToDictionary() { + return new Dictionary { + { "Source", this.Source }, + { "Level", this.Level }, + { "Time", this.Time }, + { "Type", this.Type } + }; + } internal override void SetUpdate(JsonData json, Match match) { if (json.Keys.Contains("srcId") && json["srcId"].Keys.Contains("value") && @@ -46,19 +77,13 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { } } - public override String ToString() { - return "AlarmSensor " + this.Name + " [" + this.Id + "]: " + this.Type + " " + this.Source + " " + this.Level + " " + this.Time + " " + this.Type; - } - internal override void Poll() => this.PollNone(); + #endregion - public override Dictionary ToDictionary() { - return new Dictionary { - { "Source", this.Source }, - { "Level", this.Level }, - { "Time", this.Time }, - { "Type", this.Type } - }; + #region ISenml + protected override List ToSenmlList() { + return new List() { }; } + #endregion } } \ No newline at end of file diff --git a/Zway/Devices/CommandClasses/CommandClassSubs/Configurationsub.cs b/Zway/Devices/CommandClasses/CommandClassSubs/Configurationsub.cs index bcc3b89..30ab86a 100644 --- a/Zway/Devices/CommandClasses/CommandClassSubs/Configurationsub.cs +++ b/Zway/Devices/CommandClasses/CommandClassSubs/Configurationsub.cs @@ -4,13 +4,18 @@ using System.Text.RegularExpressions; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { class Configurationsub : ACommandClass { public override event UpdatedValue Update; - private Int64 _level; + #region Properties + private Int64 _level; + /// + /// Value of the Configuration Item + /// public Int64 Level { get { return this._level; @@ -25,8 +30,13 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { } } } + /// + /// Size of the Configuration slot + /// public Int32 Size { get; private set; } + #endregion + #region Constructor public Configurationsub(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.IsSub = true; InitComplex(json); @@ -42,8 +52,19 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { this.Size = Int32.Parse(json["size"]["value"].ToString()); } } + #endregion - internal override void Poll() => this.PollSub(); + #region ACommandClass + public override String ToString() { + return "Configuration " + this.Name + " [" + this.Id + "]: " + this.Level; + } + + public override Dictionary ToDictionary() { + return new Dictionary { + { "Level", this.Level }, + { "Size", this.Size }, + }; + } internal override void SetUpdate(JsonData json, Match match) { if (json.Keys.Contains("val") && json["val"].Keys.Contains("value") && json["val"]["value"] != null && @@ -55,15 +76,13 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { } } - public override String ToString() { - return "Configuration " + this.Name + " [" + this.Id + "]: " + this.Level; - } + internal override void Poll() => this.PollSub(); + #endregion - public override Dictionary ToDictionary() { - return new Dictionary { - { "Level", this.Level }, - { "Size", this.Size }, - }; + #region ISenml + protected override List ToSenmlList() { + return new List() { }; } + #endregion } } \ No newline at end of file diff --git a/Zway/Devices/CommandClasses/CommandClassSubs/MeterSub.cs b/Zway/Devices/CommandClasses/CommandClassSubs/MeterSub.cs index 562510d..e8aebd8 100644 --- a/Zway/Devices/CommandClasses/CommandClassSubs/MeterSub.cs +++ b/Zway/Devices/CommandClasses/CommandClassSubs/MeterSub.cs @@ -4,15 +4,29 @@ using System.Text.RegularExpressions; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { public class Metersub : ACommandClass { public override event UpdatedValue Update; + #region Properties + /// + /// Type of the Sensor + /// public String Type { get; private set; } + /// + /// Actual value of the Sensor + /// public Double Level { get; private set; } + /// + /// Scale of the Sensor + /// public String Scale { get; private set; } + #endregion + + #region Constructor public Metersub(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.HasReset = true; this.IsSub = true; @@ -31,6 +45,20 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { this.Scale = json["scaleString"]["value"].ToString(); } } + #endregion + + #region ACommandClass + public override String ToString() { + return "Meter " + this.Name + " [" + this.Id + "]: " + this.Type + " " + this.Level + "" + this.Scale; + } + + public override Dictionary ToDictionary() { + return new Dictionary { + { "Level", this.Level }, + { "Type", this.Type }, + { "Scale", this.Scale }, + }; + } internal override void SetUpdate(JsonData json, Match match) { if (json.Keys.Contains("val") && json["val"].Keys.Contains("value") && @@ -44,18 +72,18 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { } } - public override String ToString() { - return "Meter " + this.Name + " [" + this.Id + "]: " + this.Type + " " + this.Level + "" + this.Scale; - } - internal override void Poll() => this.PollNone(); + #endregion - public override Dictionary ToDictionary() { - return new Dictionary { - { "Level", this.Level }, - { "Type", this.Type }, - { "Scale", this.Scale }, - }; + #region ISenml + protected override List ToSenmlList() { + if (this.Scale == "W") { + return new List() { new SenmlDouble("power", Senml.Units.Watt, this.Level) }; + } else if(this.Scale == "kWh") { + return new List() { new SenmlDouble("consumption", Senml.Units.Joule, this.Level * 1000 * 3.6 * 1000) }; + } + return new List() {}; } + #endregion } } \ No newline at end of file diff --git a/Zway/Devices/CommandClasses/CommandClassSubs/SceneControllerConfSub.cs b/Zway/Devices/CommandClasses/CommandClassSubs/SceneControllerConfSub.cs index c89b7d7..0da79ae 100644 --- a/Zway/Devices/CommandClasses/CommandClassSubs/SceneControllerConfSub.cs +++ b/Zway/Devices/CommandClasses/CommandClassSubs/SceneControllerConfSub.cs @@ -4,14 +4,25 @@ using System.Text.RegularExpressions; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { public class Scenecontrollerconfsub : ACommandClass { public override event UpdatedValue Update; + #region Properties + /// + /// + /// public Int32 Scene { get; private set; } + /// + /// + /// public Int32 Duration { get; private set; } + #endregion + + #region Constructor public Scenecontrollerconfsub(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.IsSub = true; InitComplex(json); @@ -24,6 +35,19 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { this.Duration = Int32.Parse(json["duration"]["value"].ToString()); } } + #endregion + + #region ACommandClass + public override String ToString() { + return "SceneControllerConf " + this.Name + " [" + this.Id + "]: " + this.Scene + " " + this.Duration; + } + + public override Dictionary ToDictionary() { + return new Dictionary { + { "Scene", this.Scene }, + { "Duration", this.Duration } + }; + } internal override void SetUpdate(JsonData json, Match match) { if (json.Keys.Contains("scene") && json["scene"].Keys.Contains("value") && @@ -35,17 +59,13 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { } } - public override String ToString() { - return "SceneControllerConf " + this.Name + " [" + this.Id + "]: " + this.Scene + " " + this.Duration; - } - internal override void Poll() => this.PollSub(); + #endregion - public override Dictionary ToDictionary() { - return new Dictionary { - { "Scene", this.Scene }, - { "Duration", this.Duration } - }; + #region ISenml + protected override List ToSenmlList() { + return new List() { }; } + #endregion } } \ No newline at end of file diff --git a/Zway/Devices/CommandClasses/CommandClassSubs/SensorBinarySub.cs b/Zway/Devices/CommandClasses/CommandClassSubs/SensorBinarySub.cs index 35586e6..883212f 100644 --- a/Zway/Devices/CommandClasses/CommandClassSubs/SensorBinarySub.cs +++ b/Zway/Devices/CommandClasses/CommandClassSubs/SensorBinarySub.cs @@ -4,20 +4,33 @@ using System.Text.RegularExpressions; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { public class Sensorbinarysub : ACommandClass { public override event UpdatedValue Update; + #region Properties + /// + /// + /// public String Type { get; private set; } + /// + /// + /// public Boolean State { get; private set; } + /// + /// + /// public Int32 Level { get { return (this.State) ? 1 : 0; } } + #endregion + #region Constructor public Sensorbinarysub(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.IsSub = true; InitComplex(json); @@ -32,6 +45,20 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { this.State = (Boolean)json["level"]["value"]; } } + #endregion + + #region ACommandClass + public override String ToString() { + return "SensorBinary " + this.Name + " [" + this.Id + "]: " + this.Type + " " + this.State.ToString(); + } + + public override Dictionary ToDictionary() { + return new Dictionary { + { "State", this.State }, + { "Type", this.Type }, + { "Level", this.Level } + }; + } internal override void SetUpdate(JsonData json, Match match) { if (json.Keys.Contains("level") && json["level"].Keys.Contains("value") && @@ -43,18 +70,13 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { } } - public override String ToString() { - return "SensorBinary " + this.Name + " [" + this.Id + "]: " + this.Type + " " + this.State.ToString(); - } - internal override void Poll() => this.PollNone(); + #endregion - public override Dictionary ToDictionary() { - return new Dictionary { - { "State", this.State }, - { "Type", this.Type }, - { "Level", this.Level } - }; + #region ISenml + protected override List ToSenmlList() { + return new List() { }; } + #endregion } } \ No newline at end of file diff --git a/Zway/Devices/CommandClasses/CommandClassSubs/SensorMultilevelSub.cs b/Zway/Devices/CommandClasses/CommandClassSubs/SensorMultilevelSub.cs index 887f892..c473c42 100644 --- a/Zway/Devices/CommandClasses/CommandClassSubs/SensorMultilevelSub.cs +++ b/Zway/Devices/CommandClasses/CommandClassSubs/SensorMultilevelSub.cs @@ -4,16 +4,29 @@ using System.Text.RegularExpressions; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { public class Sensormultilevelsub : ACommandClass { public override event UpdatedValue Update; + #region Properties + /// + /// Type of the Sensor + /// public String Type { get; private set; } + /// + /// Level of the sensor + /// public Double Level { get; private set; } + /// + /// Scale of the sensor + /// public String Scale { get; private set; } + #endregion + #region Constructor public Sensormultilevelsub(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.IsSub = true; InitComplex(json); @@ -31,6 +44,20 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { this.Scale = json["scaleString"]["value"].ToString(); } } + #endregion + + #region ACommandClass + public override String ToString() { + return "SensorMultilevel " + this.Name + " [" + this.Id + "]: " + this.Type + " " + this.Level + "" + this.Scale; + } + + public override Dictionary ToDictionary() { + return new Dictionary { + { "Level", this.Level }, + { "Type", this.Type }, + { "Scale", this.Scale }, + }; + } internal override void SetUpdate(JsonData json, Match match) { if(json.Keys.Contains("val") && json["val"].Keys.Contains("value") && json.Keys.Contains("sensorTypeString") && json["sensorTypeString"].Keys.Contains("value")) { @@ -53,18 +80,18 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { } } - public override String ToString() { - return "SensorMultilevel " + this.Name + " [" + this.Id + "]: " + this.Type + " " + this.Level + "" + this.Scale; - } - internal override void Poll() => this.PollNone(); + #endregion - public override Dictionary ToDictionary() { - return new Dictionary { - { "Level", this.Level }, - { "Type", this.Type }, - { "Scale", this.Scale }, - }; + #region ISenml + protected override List ToSenmlList() { + if(this.Scale == "W") { + return new List() { new SenmlDouble("power", Senml.Units.Watt, this.Level) }; + } else if(this.Scale == "°C") { + return new List() { new SenmlDouble("temperatur", Senml.Units.Celsius, this.Level) }; + } + return new List() { }; } + #endregion } } \ No newline at end of file diff --git a/Zway/Devices/CommandClasses/CommandClassSubs/ThermostatSetPointSub.cs b/Zway/Devices/CommandClasses/CommandClassSubs/ThermostatSetPointSub.cs index cb9c139..2aee6bf 100644 --- a/Zway/Devices/CommandClasses/CommandClassSubs/ThermostatSetPointSub.cs +++ b/Zway/Devices/CommandClasses/CommandClassSubs/ThermostatSetPointSub.cs @@ -4,13 +4,18 @@ using System.Text.RegularExpressions; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { class Thermostatsetpointsub : ACommandClass { public override event UpdatedValue Update; + #region Properties private Double _level; + /// + /// Target-Temperatur + /// public Double Level { get { return this._level; @@ -21,12 +26,29 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { } } } + /// + /// Scale of the actor + /// public String Scale { get; private set; } + /// + /// Maximum Temperatur of the actor + /// public Double TempMax { get; private set; } + /// + /// Minimum Temperatur of the actor + /// public Double TempMin { get; private set; } + /// + /// Has Maximum and Minimum + /// public Boolean HasMinMax { get; private set; } + /// + /// Type of the actor + /// public String Type { get; private set; } + #endregion + #region Constructor public Thermostatsetpointsub(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.IsSub = true; InitComplex(json); @@ -49,6 +71,23 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { this.HasMinMax = false; } } + #endregion + + #region ACommandClass + public override String ToString() { + return "ThermostatSetPoint " + this.Name + " [" + this.Id + "]: " + this.Type + " " + this.Level + "" + this.Scale + " [" + this.TempMin + "," + this.TempMax + "," + this.HasMinMax + "]"; + } + + public override Dictionary ToDictionary() { + return new Dictionary { + { "Level", this.Level }, + { "Type", this.Type }, + { "Scale", this.Scale }, + { "TempMax", this.TempMax }, + { "TempMin", this.TempMin }, + { "HasMinMax", this.HasMinMax }, + }; + } internal override void SetUpdate(JsonData json, Match match) { Boolean ret = false; @@ -74,21 +113,16 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { } } - public override String ToString() { - return "ThermostatSetPoint " + this.Name + " [" + this.Id + "]: " + this.Type + " " + this.Level + "" + this.Scale + " [" + this.TempMin + "," + this.TempMax + "," + this.HasMinMax + "]"; - } - internal override void Poll() => this.PollSub(); + #endregion - public override Dictionary ToDictionary() { - return new Dictionary { - { "Level", this.Level }, - { "Type", this.Type }, - { "Scale", this.Scale }, - { "TempMax", this.TempMax }, - { "TempMin", this.TempMin }, - { "HasMinMax", this.HasMinMax }, - }; + #region ISenml + protected override List ToSenmlList() { + if(this.Scale == "°C") { + return new List() { new SenmlDouble("temperatur", Senml.Units.Celsius, this.Level) }; + } + return new List() { }; } + #endregion } } \ No newline at end of file diff --git a/Zway/Devices/CommandClasses/Configuration.cs b/Zway/Devices/CommandClasses/Configuration.cs index ec99a4b..eecfb7a 100644 --- a/Zway/Devices/CommandClasses/Configuration.cs +++ b/Zway/Devices/CommandClasses/Configuration.cs @@ -6,6 +6,7 @@ using BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses { @@ -15,6 +16,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { class Configuration : ACommandClass { public override event UpdatedValue Update; + #region Constructor public Configuration(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.HasSub = true; this.InitComplex(json); @@ -23,10 +25,6 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } - private void DeviceUpdate(Object sender, DeviceUpdateEvent e) { - this.Update?.Invoke(this, e); - } - private void InitComplex(JsonData json) { if (json.Keys.Contains("data")) { JsonData data = json["data"]; @@ -44,6 +42,12 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } + private void DeviceUpdate(Object sender, DeviceUpdateEvent e) { + this.Update?.Invoke(this, e); + } + #endregion + + #region ACommandClass internal override void SetUpdate(JsonData json, Match match) { if (match.Groups[4].Value.StartsWith(".data.")) { Int32 subid = Int32.Parse(match.Groups[5].Value); @@ -58,5 +62,10 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { internal override void Poll() => this.PollPerSub(); public override Dictionary ToDictionary() => this.ToDictionarySub(); + #endregion + + #region ISenml + protected override List ToSenmlList() => this.ToSenmlListSub(); + #endregion } } diff --git a/Zway/Devices/CommandClasses/Indicator.cs b/Zway/Devices/CommandClasses/Indicator.cs index 2de3502..6261636 100644 --- a/Zway/Devices/CommandClasses/Indicator.cs +++ b/Zway/Devices/CommandClasses/Indicator.cs @@ -4,6 +4,7 @@ using System.Text.RegularExpressions; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses { @@ -11,9 +12,13 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { /// 135 = Indicator /// class Indicator : ACommandClass { - private Boolean _state; - public override event UpdatedValue Update; + + #region Properties + private Boolean _state; + /// + /// Status of the Indicator + /// public Boolean State { get { return this._state; @@ -22,7 +27,9 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { this.SetInt(value ? 255 : 0); } } - + /// + /// Int-Representation of the Indicator + /// public Int32 Level { get { return (this.State) ? 1 : 0; @@ -31,7 +38,9 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { this.State = (value == 1); } } + #endregion + #region Constructor public Indicator(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.InitComplex(json); } @@ -41,6 +50,19 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { this._state = Int32.Parse(json["data"]["stat"]["value"].ToString()) == 255; } } + #endregion + + #region ACommandClass + public override String ToString() { + return "Indicator " + this.Name + " [" + this.Id + "]: " + this.State; + } + + public override Dictionary ToDictionary() { + return new Dictionary { + { "State", this.State }, + { "Level", this.Level } + }; + } internal override void SetUpdate(JsonData json, Match match) { if(match.Groups[4].Value == ".data.stat") { @@ -52,16 +74,13 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); } } + #endregion - public override String ToString() { - return "Indicator " + this.Name + " [" + this.Id + "]: " + this.State; + #region ISenml + protected override List ToSenmlList() { + return new List() { new SenmlBool("status", Senml.Units.CounterValue, this.State) }; } + #endregion - public override Dictionary ToDictionary() { - return new Dictionary { - { "State", this.State }, - { "Level", this.Level } - }; - } } } diff --git a/Zway/Devices/CommandClasses/Meter.cs b/Zway/Devices/CommandClasses/Meter.cs index c0836f0..d41f060 100644 --- a/Zway/Devices/CommandClasses/Meter.cs +++ b/Zway/Devices/CommandClasses/Meter.cs @@ -6,6 +6,7 @@ using BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses { @@ -15,6 +16,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { public class Meter : ACommandClass { public override event UpdatedValue Update; + #region Constructor public Meter(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.HasSub = true; this.InitComplex(json); @@ -23,21 +25,6 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } - private void DeviceUpdate(Object sender, DeviceUpdateEvent e) { - this.Update?.Invoke(this, e); - } - - internal override void SetUpdate(JsonData json, Match match) { - if (match.Groups[4].Value.StartsWith(".data.")) { - Int32 subid = Int32.Parse(match.Groups[5].Value); - if (this.Sub.ContainsKey(subid)) { - this.Sub[subid].SetUpdate(json, match); - } - } else { - Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); - } - } - private void InitComplex(JsonData json) { if (json.Keys.Contains("data")) { JsonData data = json["data"]; @@ -54,8 +41,30 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } + private void DeviceUpdate(Object sender, DeviceUpdateEvent e) { + this.Update?.Invoke(this, e); + } + #endregion + + #region ACommandClass + internal override void SetUpdate(JsonData json, Match match) { + if (match.Groups[4].Value.StartsWith(".data.")) { + Int32 subid = Int32.Parse(match.Groups[5].Value); + if (this.Sub.ContainsKey(subid)) { + this.Sub[subid].SetUpdate(json, match); + } + } else { + Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); + } + } + internal override void Poll() => this.PollSubGlobal(); public override Dictionary ToDictionary() => this.ToDictionarySub(); + #endregion + + #region ISenml + protected override List ToSenmlList() => this.ToSenmlListSub(); + #endregion } } diff --git a/Zway/Devices/CommandClasses/SceneControllerConf.cs b/Zway/Devices/CommandClasses/SceneControllerConf.cs index ee0ab33..a99f7bf 100644 --- a/Zway/Devices/CommandClasses/SceneControllerConf.cs +++ b/Zway/Devices/CommandClasses/SceneControllerConf.cs @@ -6,6 +6,7 @@ using BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses { @@ -15,6 +16,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { public class Scenecontrollerconf : ACommandClass { public override event UpdatedValue Update; + #region Constructor public Scenecontrollerconf(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.HasSub = true; this.InitComplex(json); @@ -23,21 +25,6 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } - private void DeviceUpdate(Object sender, DeviceUpdateEvent e) { - this.Update?.Invoke(this, e); - } - - internal override void SetUpdate(JsonData json, Match match) { - if (match.Groups[4].Value.StartsWith(".data.")) { - Int32 subid = Int32.Parse(match.Groups[5].Value); - if (this.Sub.ContainsKey(subid)) { - this.Sub[subid].SetUpdate(json, match); - } - } else { - Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); - } - } - private void InitComplex(JsonData json) { if (json.Keys.Contains("data")) { JsonData data = json["data"]; @@ -53,8 +40,30 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } + private void DeviceUpdate(Object sender, DeviceUpdateEvent e) { + this.Update?.Invoke(this, e); + } + #endregion + + #region ACommandClass + internal override void SetUpdate(JsonData json, Match match) { + if (match.Groups[4].Value.StartsWith(".data.")) { + Int32 subid = Int32.Parse(match.Groups[5].Value); + if (this.Sub.ContainsKey(subid)) { + this.Sub[subid].SetUpdate(json, match); + } + } else { + Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); + } + } + internal override void Poll() => this.PollPerSub(); public override Dictionary ToDictionary() => this.ToDictionarySub(); + #endregion + + #region ISenml + protected override List ToSenmlList() => this.ToSenmlListSub(); + #endregion } } diff --git a/Zway/Devices/CommandClasses/SensorBinary.cs b/Zway/Devices/CommandClasses/SensorBinary.cs index 9e59265..5255ae1 100644 --- a/Zway/Devices/CommandClasses/SensorBinary.cs +++ b/Zway/Devices/CommandClasses/SensorBinary.cs @@ -6,6 +6,7 @@ using BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses { @@ -15,6 +16,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { public class Sensorbinary : ACommandClass { public override event UpdatedValue Update; + #region Constructor public Sensorbinary(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.HasSub = true; this.InitComplex(json); @@ -23,21 +25,6 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } - private void DeviceUpdate(Object sender, DeviceUpdateEvent e) { - this.Update?.Invoke(this, e); - } - - internal override void SetUpdate(JsonData json, Match match) { - if (match.Groups[4].Value.StartsWith(".data.")) { - Int32 subid = Int32.Parse(match.Groups[5].Value); - if (this.Sub.ContainsKey(subid)) { - this.Sub[subid].SetUpdate(json, match); - } - } else { - Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); - } - } - private void InitComplex(JsonData json) { if (json.Keys.Contains("data")) { JsonData data = json["data"]; @@ -53,8 +40,30 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } + private void DeviceUpdate(Object sender, DeviceUpdateEvent e) { + this.Update?.Invoke(this, e); + } + #endregion + + #region ACommandClass + internal override void SetUpdate(JsonData json, Match match) { + if (match.Groups[4].Value.StartsWith(".data.")) { + Int32 subid = Int32.Parse(match.Groups[5].Value); + if (this.Sub.ContainsKey(subid)) { + this.Sub[subid].SetUpdate(json, match); + } + } else { + Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); + } + } + internal override void Poll() => this.PollSubGlobal(); public override Dictionary ToDictionary() => this.ToDictionarySub(); + #endregion + + #region ISenml + protected override List ToSenmlList() => this.ToSenmlListSub(); + #endregion } } diff --git a/Zway/Devices/CommandClasses/SensorMultilevel.cs b/Zway/Devices/CommandClasses/SensorMultilevel.cs index fd10cd4..47a2cdd 100644 --- a/Zway/Devices/CommandClasses/SensorMultilevel.cs +++ b/Zway/Devices/CommandClasses/SensorMultilevel.cs @@ -6,6 +6,7 @@ using BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses { @@ -15,6 +16,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { public class Sensormultilevel : ACommandClass { public override event UpdatedValue Update; + #region Constructor public Sensormultilevel(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.HasSub = true; this.InitComplex(json); @@ -23,21 +25,6 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } - private void DeviceUpdate(Object sender, DeviceUpdateEvent e) { - this.Update?.Invoke(this, e); - } - - internal override void SetUpdate(JsonData json, Match match) { - if (match.Groups[4].Value.StartsWith(".data.")) { - Int32 subid = Int32.Parse(match.Groups[5].Value); - if (this.Sub.ContainsKey(subid)) { - this.Sub[subid].SetUpdate(json, match); - } - } else { - Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); - } - } - private void InitComplex(JsonData json) { if (json.Keys.Contains("data")) { JsonData data = json["data"]; @@ -54,8 +41,30 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } + private void DeviceUpdate(Object sender, DeviceUpdateEvent e) { + this.Update?.Invoke(this, e); + } + #endregion + + #region ACommandClass + internal override void SetUpdate(JsonData json, Match match) { + if (match.Groups[4].Value.StartsWith(".data.")) { + Int32 subid = Int32.Parse(match.Groups[5].Value); + if (this.Sub.ContainsKey(subid)) { + this.Sub[subid].SetUpdate(json, match); + } + } else { + Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); + } + } + internal override void Poll() => this.PollSubGlobal(); public override Dictionary ToDictionary() => this.ToDictionarySub(); + #endregion + + #region ISenml + protected override List ToSenmlList() => this.ToSenmlListSub(); + #endregion } } diff --git a/Zway/Devices/CommandClasses/SwitchBinary.cs b/Zway/Devices/CommandClasses/SwitchBinary.cs index cf469de..5b7d68d 100644 --- a/Zway/Devices/CommandClasses/SwitchBinary.cs +++ b/Zway/Devices/CommandClasses/SwitchBinary.cs @@ -4,6 +4,7 @@ using System.Text.RegularExpressions; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses { @@ -11,10 +12,12 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { /// 37 = SwitchBinary /// public class Switchbinary : ACommandClass { - private Boolean _state; - public override event UpdatedValue Update; + #region Properties + /// + /// Int representation of Boolean + /// public Int32 Level { get { return (this.State) ? 1 : 0; @@ -23,7 +26,10 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { this.State = (value == 1); } } - + private Boolean _state; + /// + /// State if Switch is activated + /// public Boolean State { get { return this._state; @@ -32,11 +38,32 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { this.SetInt(value ? 255 : 0); } } + #endregion + #region Constructor public Switchbinary(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.InitComplex(json); } + private void InitComplex(JsonData json) { + if (json.Keys.Contains("data") && json["data"].Keys.Contains("level") && json["data"]["level"].Keys.Contains("value") && json["data"]["level"]["value"].IsBoolean) { + this._state = (Boolean)json["data"]["level"]["value"]; + } + } + #endregion + + #region ACommandClass + public override String ToString() { + return "SwitchBinary " + this.Name + " [" + this.Id + "]: " + this.State; + } + + public override Dictionary ToDictionary() { + return new Dictionary { + { "State", this.State }, + { "Level", this.Level } + }; + } + internal override void SetUpdate(JsonData json, Match match) { if(match.Groups[4].Value == ".data.level") { if (json.Keys.Contains("value") && json["value"].IsBoolean && this.CheckSetUpdateTime(json)) { @@ -47,22 +74,12 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); } } + #endregion - private void InitComplex(JsonData json) { - if (json.Keys.Contains("data") && json["data"].Keys.Contains("level") && json["data"]["level"].Keys.Contains("value") && json["data"]["level"]["value"].IsBoolean) { - this._state = (Boolean)json["data"]["level"]["value"]; - } - } - - public override String ToString() { - return "SwitchBinary " + this.Name + " [" + this.Id + "]: " + this.State; - } - - public override Dictionary ToDictionary() { - return new Dictionary { - { "State", this.State }, - { "Level", this.Level } - }; + #region ISenml + protected override List ToSenmlList() { + return new List() { new SenmlBool("state", Senml.Units.CounterValue, this.State) }; } + #endregion } } diff --git a/Zway/Devices/CommandClasses/SwitchMultilevel.cs b/Zway/Devices/CommandClasses/SwitchMultilevel.cs index d663771..94b8638 100644 --- a/Zway/Devices/CommandClasses/SwitchMultilevel.cs +++ b/Zway/Devices/CommandClasses/SwitchMultilevel.cs @@ -4,6 +4,7 @@ using System.Text.RegularExpressions; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses { @@ -11,10 +12,13 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { /// 38 = SwitchMultilevel /// public class Switchmultilevel : ACommandClass { - private Int32 _level; - public override event UpdatedValue Update; + #region Properties + private Int32 _level; + /// + /// Level of thw Switch + /// public Int32 Level { get { return this._level; @@ -25,11 +29,31 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } } + #endregion + #region Constructor public Switchmultilevel(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.InitComplex(json); } + private void InitComplex(JsonData json) { + if (json.Keys.Contains("data") && json["data"].Keys.Contains("level") && json["data"]["level"].Keys.Contains("value")) { + this._level = Int32.Parse(json["data"]["level"]["value"].ToString()); + } + } + #endregion + + #region ACommandClass + public override String ToString() { + return "SwitchMultilevel " + this.Name + " [" + this.Id + "]: " + this.Level; + } + + public override Dictionary ToDictionary() { + return new Dictionary { + { "Level", this.Level } + }; + } + internal override void SetUpdate(JsonData json, Match match) { if(match.Groups[4].Value == ".data.level") { if(json.Keys.Contains("value") && this.CheckSetUpdateTime(json)) { @@ -41,21 +65,12 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); } } + #endregion - private void InitComplex(JsonData json) { - if (json.Keys.Contains("data") && json["data"].Keys.Contains("level") && json["data"]["level"].Keys.Contains("value")) { - this._level = Int32.Parse(json["data"]["level"]["value"].ToString()); - } - } - - public override String ToString() { - return "SwitchMultilevel " + this.Name + " [" + this.Id + "]: " + this.Level; - } - - public override Dictionary ToDictionary() { - return new Dictionary { - { "Level", this.Level } - }; + #region ISenml + protected override List ToSenmlList() { + return new List() { new SenmlDouble("state", Senml.Units.Percent, (Double)this.Level/255) }; } + #endregion } } diff --git a/Zway/Devices/CommandClasses/ThermostatMode.cs b/Zway/Devices/CommandClasses/ThermostatMode.cs index b83a4bd..412923a 100644 --- a/Zway/Devices/CommandClasses/ThermostatMode.cs +++ b/Zway/Devices/CommandClasses/ThermostatMode.cs @@ -5,6 +5,7 @@ using System.Text.RegularExpressions; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses { @@ -12,11 +13,17 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { /// 64 = ThermostatMode /// public class Thermostatmode : ACommandClass { - private Int32 _level; - public override event UpdatedValue Update; + #region Properties + /// + /// Allowd Modes + /// public ReadOnlyDictionary ValidModes { get; private set; } + private Int32 _level; + /// + /// Actual mode + /// public Int32 Level { get { return this._level; } set { @@ -25,23 +32,14 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } } + #endregion + #region Constructor public Thermostatmode(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.ValidModes = new ReadOnlyDictionary(new Dictionary()); this.InitComplex(json); } - internal override void SetUpdate(JsonData json, Match match) { - if(match.Groups[4].Value == ".data.mode") { - if(json.Keys.Contains("value") && this.CheckSetUpdateTime(json)) { - this._level = Int32.Parse(json["value"].ToString()); - this.Update?.Invoke(this, new DeviceUpdateEvent(this.Level, this.LastUpdate, this)); - } - } else { - Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); - } - } - private void InitComplex(JsonData json) { if (json.Keys.Contains("data")) { JsonData data = json["data"]; @@ -60,7 +58,9 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } } + #endregion + #region ACommandClass public override String ToString() { return "ThermostatMode " + this.Name + " [" + this.Id + "]: " + this.ValidModes[this.Level]; } @@ -76,5 +76,23 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { }; return json; } + + internal override void SetUpdate(JsonData json, Match match) { + if(match.Groups[4].Value == ".data.mode") { + if(json.Keys.Contains("value") && this.CheckSetUpdateTime(json)) { + this._level = Int32.Parse(json["value"].ToString()); + this.Update?.Invoke(this, new DeviceUpdateEvent(this.Level, this.LastUpdate, this)); + } + } else { + Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); + } + } + #endregion + + #region ISenml + protected override List ToSenmlList() { + return new List() { new SenmlDouble("mode", Senml.Units.CounterValue, this.Level) }; + } + #endregion } } diff --git a/Zway/Devices/CommandClasses/ThermostatSetPoint.cs b/Zway/Devices/CommandClasses/ThermostatSetPoint.cs index dd1d66d..9cc92ca 100644 --- a/Zway/Devices/CommandClasses/ThermostatSetPoint.cs +++ b/Zway/Devices/CommandClasses/ThermostatSetPoint.cs @@ -6,6 +6,7 @@ using BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses { @@ -15,6 +16,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { public class Thermostatsetpoint : ACommandClass { public override event UpdatedValue Update; + #region Constructor public Thermostatsetpoint(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.HasSub = true; this.InitComplex(json); @@ -23,21 +25,6 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } - private void DeviceUpdate(Object sender, DeviceUpdateEvent e) { - this.Update?.Invoke(this, e); - } - - internal override void SetUpdate(JsonData json, Match match) { - if (match.Groups[4].Value.StartsWith(".data.")) { - Int32 subid = Int32.Parse(match.Groups[5].Value); - if (this.Sub.ContainsKey(subid)) { - this.Sub[subid].SetUpdate(json, match); - } - } else { - Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); - } - } - private void InitComplex(JsonData json) { if (json.Keys.Contains("data")) { JsonData data = json["data"]; @@ -54,8 +41,30 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } + private void DeviceUpdate(Object sender, DeviceUpdateEvent e) { + this.Update?.Invoke(this, e); + } + #endregion + + #region ACommandClass + internal override void SetUpdate(JsonData json, Match match) { + if (match.Groups[4].Value.StartsWith(".data.")) { + Int32 subid = Int32.Parse(match.Groups[5].Value); + if (this.Sub.ContainsKey(subid)) { + this.Sub[subid].SetUpdate(json, match); + } + } else { + Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); + } + } + internal override void Poll() => this.PollPerSub(); public override Dictionary ToDictionary() => this.ToDictionarySub(); + #endregion + + #region ISenml + protected override List ToSenmlList() => this.ToSenmlListSub(); + #endregion } } diff --git a/Zway/Devices/CommandClasses/Wakeup.cs b/Zway/Devices/CommandClasses/Wakeup.cs index 19f2234..747cff2 100644 --- a/Zway/Devices/CommandClasses/Wakeup.cs +++ b/Zway/Devices/CommandClasses/Wakeup.cs @@ -4,6 +4,7 @@ using System.Text.RegularExpressions; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.Interfaces; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Devices.CommandClasses { @@ -11,10 +12,10 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { /// 132 = Wakeup /// class Wakeup : ACommandClass { - private Int32 _interval; - private Int32 _againstNode; - public override event UpdatedValue Update; + + #region Properties + private Int32 _interval; public Int32 Interval { get { return this._interval; @@ -25,6 +26,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } } + private Int32 _againstNode; public Int32 AgainstNode { get { return this._againstNode; } @@ -41,7 +43,9 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { public Int32 HasDefaultLevel { get { return (this.HasDefaultState) ? 1 : 0; } } public DateTime LastWakeup { get; private set; } public DateTime LastSleep { get; private set; } + #endregion + #region Constructor public Wakeup(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.InitComplex(json); } @@ -77,6 +81,28 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } } } + #endregion + + #region ACommandClass + public override String ToString() { + return "Wakeup " + this.Name + " [" + this.Id + "]: " + this.LastWakeup + "-" + this.LastSleep + " " + this.Interval + " [" + this.WakeupMin + "," + this.WakeupMax + "," + this.WakeupDefault + "," + this.AgainstNode + "]"; + } + + public override Dictionary ToDictionary() { + return new Dictionary { + { "Interval", this.Interval }, + { "AgainstNode", this.AgainstNode }, + { "WakeupMin", this.WakeupMin }, + { "WakeupMax", this.WakeupMax }, + { "HasMinMaxState", this.HasMinMaxState }, + { "HasMinMaxLevel", this.HasMinMaxLevel }, + { "WakeupDefault", this.WakeupDefault }, + { "HasDefaultState", this.HasDefaultState }, + { "HasDefaultLevel", this.HasDefaultLevel }, + { "LastWakeup", this.LastWakeup.ToString() }, + { "LastSleep", this.LastSleep.ToString() } + }; + } internal override void SetUpdate(JsonData json, Match match) { Boolean success = false; @@ -131,25 +157,12 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { this.Update?.Invoke(this, new DeviceUpdateEvent(0, this.LastUpdate, this)); } } + #endregion - public override String ToString() { - return "Wakeup " + this.Name + " [" + this.Id + "]: " + this.LastWakeup + "-" + this.LastSleep + " " + this.Interval + " [" + this.WakeupMin + "," + this.WakeupMax + "," + this.WakeupDefault + "," + this.AgainstNode + "]"; - } - - public override Dictionary ToDictionary() { - return new Dictionary { - { "Interval", this.Interval }, - { "AgainstNode", this.AgainstNode }, - { "WakeupMin", this.WakeupMin }, - { "WakeupMax", this.WakeupMax }, - { "HasMinMaxState", this.HasMinMaxState }, - { "HasMinMaxLevel", this.HasMinMaxLevel }, - { "WakeupDefault", this.WakeupDefault }, - { "HasDefaultState", this.HasDefaultState }, - { "HasDefaultLevel", this.HasDefaultLevel }, - { "LastWakeup", this.LastWakeup.ToString() }, - { "LastSleep", this.LastSleep.ToString() } - }; + #region ISenml + protected override List ToSenmlList() { + return new List() { }; } + #endregion } } diff --git a/Zway/Interfaces/ACommandClass.cs b/Zway/Interfaces/ACommandClass.cs index d8252dd..cbb1cf4 100644 --- a/Zway/Interfaces/ACommandClass.cs +++ b/Zway/Interfaces/ACommandClass.cs @@ -4,10 +4,12 @@ using System.Collections.ObjectModel; using System.Text.RegularExpressions; using BlubbFish.IoT.Zway.Events; using BlubbFish.IoT.Zway.lib; +using BlubbFish.Utils.IoT.Interfaces; +using BlubbFish.Utils.IoT.Interfaces.Language; using LitJson; namespace BlubbFish.IoT.Zway.Interfaces { - public abstract class ACommandClass { + public abstract class ACommandClass : IMqtt, ISenml { protected HttpConnection http; public delegate void UpdatedValue(Object sender, DeviceUpdateEvent e); @@ -58,6 +60,7 @@ namespace BlubbFish.IoT.Zway.Interfaces { AlarmSensor = 156 } + #region Properties public Int32 DeviceId { get; } public Int32 Instance { get; } public Classes Commandclass { get; } @@ -71,9 +74,9 @@ namespace BlubbFish.IoT.Zway.Interfaces { public Boolean HasSub { get; protected set; } public Boolean IsSub { get; protected set; } public Boolean HasReset { get; protected set; } + #endregion #region Constructor - protected ACommandClass(JsonData json, Tuple id, HttpConnection http, Boolean polling) { this.DeviceId = id.Item1; this.Instance = id.Item2; @@ -119,7 +122,7 @@ namespace BlubbFish.IoT.Zway.Interfaces { return GetInstanceConcrete(objectName, json, http, id, polling); } if (!Enum.IsDefined(typeof(IgnoredClasses), (Int32)id.Item3) && !Enum.IsDefined(typeof(Classes), id.Item3)) { - Helper.WriteError("CommandClass " + id.Item3 + " not exist."); + Helper.WriteError("CommandClass " + id.Item3 + " not exist. (" + id.Item1 + ", " + id.Item2 + ")"); } return null; } @@ -182,7 +185,6 @@ namespace BlubbFish.IoT.Zway.Interfaces { #endregion #region SetValues - protected void SetInt(Int32 value) { this.http.GetVoid("ZWave.zway/Run/devices[" + this.DeviceId + "].instances[" + this.Instance + "].commandClasses[" + ((Int32)this.Commandclass).ToString() + "].Set(" + value + ")"); } @@ -217,8 +219,25 @@ namespace BlubbFish.IoT.Zway.Interfaces { #endregion - #region Output + #region InternalHelper + protected Dictionary ToDictionarySub() { + Dictionary json = new Dictionary(); + foreach (KeyValuePair item in this.Sub) { + json.Add(item.Key.ToString(), item.Value.ToDictionary()); + } + return json; + } + protected List ToSenmlListSub() { + List list = new List(); + foreach (KeyValuePair item in this.Sub) { + list.AddRange(item.Value.ToSenmlList()); + } + return list; + } + #endregion + + #region IMqtt public String MqttTopic() { return this.DeviceId + "/" + this.Instance + "/" + ((Int32)this.Commandclass).ToString() + (this.IsSub ? "/" + this.SensorId : ""); } @@ -230,19 +249,31 @@ namespace BlubbFish.IoT.Zway.Interfaces { json.Add("Commandclass", this.Commandclass.ToString()); return JsonMapper.ToJson(json); } - - public abstract Dictionary ToDictionary(); - - protected Dictionary ToDictionarySub() { - Dictionary json = new Dictionary(); - foreach (KeyValuePair item in this.Sub) { - json.Add(item.Key.ToString(), item.Value.ToDictionary()); - } - return json; - } - #endregion + #region ISenml + public String ToSenml() { + List l = this.ToSenmlList(); + if(l.Count == 0) { + return null; + } + Dictionary json = new Dictionary { + { "e", l }, + { "bn", "urn:dev:id:" + this.SenmlTopic() }, + { "bt", ((DateTimeOffset)this.LastUpdate).ToUnixTimeSeconds() } + }; + return JsonMapper.ToJson(json); + } + + public String SenmlTopic() { + return this.DeviceId + "/" + this.Instance + "/" + ((Int32)this.Commandclass).ToString() + (this.IsSub ? "/" + this.SensorId : ""); + } + #endregion + + #region Abstract + protected abstract List ToSenmlList(); + public abstract Dictionary ToDictionary(); internal abstract void SetUpdate(JsonData json, Match match); + #endregion } } diff --git a/Zway/Properties/AssemblyInfo.cs b/Zway/Properties/AssemblyInfo.cs index 87b8ea8..2df5c27 100644 --- a/Zway/Properties/AssemblyInfo.cs +++ b/Zway/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Zway")] -[assembly: AssemblyCopyright("Copyright © 2017 - 01.01.2018")] +[assembly: AssemblyCopyright("Copyright © 2017 - 03.05.2018")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, // indem Sie "*" wie unten gezeigt eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.3.6.0")] -[assembly: AssemblyFileVersion("1.3.6.0")] +[assembly: AssemblyVersion("1.4.0.0")] +[assembly: AssemblyFileVersion("1.4.0.0")] diff --git a/Zway/Zway.csproj b/Zway/Zway.csproj index 1725bf6..43f3b2d 100644 --- a/Zway/Zway.csproj +++ b/Zway/Zway.csproj @@ -31,9 +31,6 @@ 4 - - ..\packages\LitJson.0.9.0\lib\LitJson.dll - @@ -77,7 +74,14 @@ - + + {91a14cd2-2940-4500-8193-56d37edddbaa} + litjson_4.7.1 + + + {4daada29-c600-4cf3-8ad3-9c97c8d7f632} + Iot-Interfaces + \ No newline at end of file diff --git a/Zway/bin/Release/Iot-Interfaces.dll b/Zway/bin/Release/Iot-Interfaces.dll new file mode 100644 index 0000000000000000000000000000000000000000..8c2cb2c0f9b46fecbf9b02605de65ba637058538 GIT binary patch literal 6144 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 Y+ulJLFv7nX{_L@LP|WX!TFt<}0In~izW@LL literal 0 HcmV?d00001 diff --git a/Zway/bin/Release/LitJson.dll b/Zway/bin/Release/LitJson.dll index f00f11f11441dcc457ea0684ac462e466bf8df54..d4fa685d54917a38e272d5039a6864d1a4495b94 100644 GIT binary patch literal 50688 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 diff --git a/Zway/bin/Release/Zway.dll b/Zway/bin/Release/Zway.dll index 991904efca52ffcc98770b8ada9eacf332c25790..35c2912bde45804b1eca8b4a2a29585ce148b57b 100644 GIT binary patch literal 61440 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�Egb9p z8C3{25WK7qdqNtkc^6iU_5Pe{H18`F2K}6-YTh02hezo+&3hRB@F>mEye~qQ$7q?x z^2-@pqjQeN?E4t4*St$n%P;5*&D)1senCmiI}^1$PW>7?yXZ#G<8-0U`Ng98;Nx_; z<}C&93HqAmoetg;be-af|2;`RP&|nmPt%*Hh(2XLdWN1lRbd<%o}mM$F{Z}onUsk6 z96hyOa!Q^U-f;@dkx)AAUo-1XF$ZP0Aeb z3f;4jbE=5)3cV|s@~T&;c9Ya1GuNxsE|~JF-_nbMDZBnXz1hJzRYZA%=nTeGdw)o= z>$g(u`mGeZev9swa;o*W=v|GmKHsJZo4HOETi>ChHO8^^9h#*vj>&&aiOGMY6BSQ% z_FvR0n3DRxX?Q2ssp9Sjv{7TMvk&N6!BihUpv${Br_$1gbgN)W&JXD|jj^16qEX$P zb9eC4lHQz;s9Lar;I$~9>d$C zFqYF}TqT&2(_?Jk!aOCX&$wDJC8y7LLSrna-|!_kr_yJ@$k!Ol5-_GIOk@cf3j|X- z%QK!6Ov#dOM3P*Knyd1S1%fGA@{JRFnWtnKX7mcCWEp1MqA`}G(0D~KWm#e4)IKh! z+AA?Sw0>pj9) zDcC^pQ=BUtVVtgcY-bT;gXZzrMvS=Tbs+XkFwWGx1Y*wwqhIs9q1{G}aiQkrhYG32 zxLon1w-b$96i<44q*1=p>21Anx5l`)^~QMIU9n<8z2RPePD$zQ6yv#bRR4I@JjE#N zR~V1cRAa7SyMr7trx}X`8whg5oMx=jytgrP9c7%Zc^_luI?C9ncp~-D#xBJZsizw= z1_&Qz$;TPjX^f>l&Uj8RHAcW(V>B~G>Y2t9=SnRy2h22r=P8V(KHiuq*zO?f^8{nA zU;{zc=LyDQ&EuHWXspsaUPm?>>okwYugU0CnDn8^xKQPkKFl?y?Q;4s&$wD++=qF_ zYl5jh%uCVyf|NciFrGT!>B9meZ@1HjW}`_k_Kw9lCmIVi#w-65jq5e`QV@Gs;}*dN zg0BS&=_KP0&FiUHoU_olNAu3ESPtw#%{!xTan2&+7n--Va5=DNHLs=OSz2totaJdCmZhxrbc>=@v&fPq}Le!OSu-M!L>$#U~2EQ z)+p0F*5E0|Xw72{o?=84PkMB!u~6}3+*^&4zr=Ma+l?9zXpDOlHN1P6r+O4k8TU4$ z>-2&Q_}W>j9zyay$|v>VF=Q$30qYXnn0iW%!Qk8NUuafarxO>8idn#Vob zXzb8D?$JhLm*Po}HW_;rPkPj8+;WAqE@RYXlwYYZ?opRjLYHnxT{=$ zO1S}>$K}qmF)nw$jd6PyrIfqa=5e`8Y>dl&$;P-G-#Iqu+xh8mMlqgVqH;hF9aYA6 zieD)yEcDSw!#HPWDRY_P(UkQ32K}mt^E@LpmwC9<`zBL91@usnr?AjVZy{~a|AZNy zf;tVlwt(T>3Wk|=o+xw+78aTm7Rot6&d<=KC#1HMr1e?C<=&a}{Tyz$vz&8g_V=?> zSXz^~M;_dhV$IAJnLjW6bjV{$->rJMPM@w#$+HxeVbb-021O-(huF%`grfAO+Pza` z7_1jV$(A}&Dkt|#jmzLY9jwK{+H%{&XKCfn>x-)S^UB7hto~+}9jr&HRA#?2YjF2v z=-L!FvxcEdeHI!1Icjig^0TLh?)zXm&#eE?t7qs^pJnXak_=tjXX(pdQp2BDcIZ-n ze+~TO=u=5Dw0;yfGbXruFW=B^@lj8P6If%YTaJ zthVO=k}fwYvCq1Q_>TSMw4vw)dc^p+>{WWwcq#NI^1oW~J|MR~P14gOJwwtnBt1vc zb0qyFEv%?Fo}~8SM;Xu4t7XRlo;Q4!@rW@{HqUs3wv{b37D9$ojTVvN9Z0y@c*nS{ zAZZxpblf36NUxS|H*(A=h36Pyb8G%?l$ug_v2m(sqaE-zq@OnL#1}}jW;%sFP5RX< zb)GH#njw^3Lb-&VuJ|ckBJ@rvdpSJ~ZB&>K9*2Vv&rl!*kC>)?KYcVD@&Nm%%h7hG}oA&MSB2!IH_G@epvby zGip92U)fKL3x zuu$OrLixElLFiY}YWgW%g{Rwo3AmpQnpfe>__reA8)lx2MV^eswUYB%$$72hyq?Y} zeIItkcU`|`z7)#!EHffGg`O?Ot7e7g5##OBF`j!3=00NhiWy!}a5(6*kzQs@2~9=* z_ll46++;o*oa=c~a?TMw-y(XxT{Qd%%`JZx_Y=N_XAho-6@At7JjI7!3wU$Rb$~nY zB*l|-O5rV@yG4h$%jn!K%B z)HI|QqD9U#P2eNOnh|mDQRQ12ajMStGeb(vko>nn8!vkwG43mP&3hL{ z=MQM{Y4bMY6)E+k@j@up7oJX zo-_{@5BM%Ol6Y?9BdOVo(Y(U4d&NGoXs(gTwIwz1S7q+5)YfVUcJ0dF_f0sg>f2fW+p0NihM13q9R z0UtKD0X}N%1bo6c7w{?L0>I~tO8{RqE(bhdd&^E7r~!Y^KWrll09{qtx6guwUT40uKrtFu2`)0`C=Q zm`p)L0&Ef(6*wSppTK(s9u#PJB)`BWfl+}20`C=gK;S`v=!s7aIe690{08NSKtAG2L+O! z>#q_xMqs1BCV{O2qXPQ{4hY;UaG${a0uKnJfJiHFjKC&=QGo*j_X)gL;6Z_WxQlTS z*d#D2a6sU_0uKrtlfyZq0tW=%EAXH|3Q6k%s|1b_*eI|`V5`8WzRq0n@7lHYzxbDXjwg1@2YpLa9N)FsJtmtSaVoqk_Ywtb!$+?pLss z(|Z*xuzO;9i0I1s)Jc70hiE*ebAJ;9h|T1kwo3QzfubrAJCBfvp1j1@0BN zU*G|ORLMDMl+>W$VNzD$-qD=iFYtgss*;>zB#*$>v7GK#a2%)i3Z(IpQ^9Jt0r=~ zQDCdUet~-h?iYAKAk|8p0vi>a#FSQn{Q~z2+%NEeK&q2c3LYtK32YVEFL1BG{Q?gN zqImxrcv(0mv=XTGto}jnHd${*l?;>xX_X6); z?+xC^ysvoQ_fGO1?OWx$&3C`=E#EA^iM>n!JD(tVut)IXOQC(3L3rIBpnOmZKph5Z zA*f+ci$E;~bvURcpq7GK25LE|6`+m)btI^jppF9dFi=O!TS2Y4{WwQ#&E=aqt+{+~ z-Z@!?%KJ>Td>=#a3`ZzQ<38s zHz}l>72Izen0t^xLF{qe83!Rhtp!Jc{C$S@q)0Am{9_;2xb- z$Z$gi_e8>icA8#rMvGl6g^d)_GO?5@*h-LE z@mGkG@*whzfz=rJR`(oWUE(j@fF|CX%LU~ucupbh05tKuHv82s_)sC84`|X6@TDN$ z3@XIGFX7Lm2)rtYojcwMqiX<7SYI(H*TKUI>0bd&s)0QkSk;w){vFt5A>9IK!bZzL zxgEY&NOu78%9!7Bssjw-&7l#X{}|B3+ejlpuLlg`9imFme+6j5vPXeF1rTdoSal)2 z4rs#KM}s~MFo?)g1^OQWO}vjZ2K1u=gLn>PEa;yAn(z#MgX&noAl@|^4|)iYe<`UN zlw#v>P=*7VSbZJ=N~IA2WfY)EE$Fd<)%*m|Cm1!L*8rNd3O&Z#Du6+}hg1vtaeyYR zM=yhT7pV@E1%M{Cp?}y981_VVq^|%p=_fQ3>HUBv-HZ3K@IDZrN%!ON zRs(nVnvnh}%|`k`K$9Lqtl+2G<|6$F-k3D;q*^m5KL<4N^w~*BKL%*x8L~xykJA!R zo&YrINm!zRJ@hi9Ux5Dj>8ce-{~9_o=p{gtUWT3w%o3}S{x5ucr9tlkn)Du>g7o`< zxIadxAx*|d5r>N zr4ci(Gj29KX0BOgjy5OZuLA&c%JaQ>sjaB=)KFE<2&AWqVFu<7k&TgyV>_^ z-)p`<`8@u7|0sWh-`mfpieAhe*5?V_O?2b){Y@As{^Y5P!1r-4DLtQhGg4>PdA~fI z6YQ;H5WB|WZyf%{!{VzEv#MdI)ilLhO#}FQo||o++uhd{OGMXq##$#+OJ9#%n`g&6 zJ7aCV9r12Zm&c;*OS(I^rx2}zz3~LHG%xH(_TsuV+SwPIOdDgp>zaFGT_Awh-8*%P zu6hcc6x+UvGcApFBwD9X^PCQ8CYsm|%xWoxD0NP;>zqPct=gvA#HqA(DmQfWG~LiN zn>CGQFP}a6XyyW{9v)3I7RB59I%CJv{MnMTX~pd3W?Hd5390Lvm#B`cTSq4*BuqEuP>6cX>tMdP?f+QfQEIzAlX=I4N35 zTA7+9#k2)co2Zj5@fES|u1;1eXK#r+3SoRjTdX_Q7Vqv&@GvEi+K^;&tUDP`boF)i zc67$J#yXic8@!H8LR`H(t+OtYd% zK+#6KT;{~KcC^Ks71G=dA-Zi;NuYVN`x1#*cW=w41Wc0pdfKDCv0jDrKovUK)ZWgc z9ZPh^+cw9LPR@yK=;%fYU1;lQr*>%%i4NTslJjG|tKzt}bw-m(TxYE4TYvoKb?atD z+cx7(`*|I)P7r0#GRbP#GU?6jnKY}jnH;C*nLJAknH)B-CD2zU$Eq)rvm)M?$W~%S zTNFN#(d)(0t}N7+j%?JGGAP-3Vz-&qw`}jpQoYz`cGkjZvRAc}S=kC$aF*IILNJ0T zd}Htoi#oa&MYj#YXZzr|m8Hdwv$9ZmSYS7q*%z{FW|CWCT|E#Wld(FwIo6k*HAnk( zW+B$liq2T9Cp$~knaNYOnapHZrj&&Rt#q^_n#Km>$*3m>$uT?L)fMe-pUqyEtp?2( zugnw+qq;nXc$LXfJ=8;<$zB@eIFd<6g~|#tSu#M;ZJ7)`K-pNB>@xB%;`ltft6e6$ zmiXLmq~d*mT?l3Ic2b7ju7-kUBhvN8G{Pa%a(9_%Y(#>o4rW#j)|lx!Y?Sk=0H7u- zi3Mu@g75StXJagBL2qvldxA!t*@4GVGB<6EcA&+@jPs=D#@9t%Os8y@Rd!JbFk?e^ldGVtru{rTRPA~84?nQ9p;Ijb63CjFfFJto( z@h(ll#F~stx!#sU2bN8!p;uNHq8$#I6kmS^7EzL9Q8*}yB$8kXRu(ZEaUv(p-V|%w zjQU)pmiWRrIv}}wxgym$OsTqaoSF@zPDDG!<18e}iv?Pp=;)0t#3ab7!+ai-g~{SL z5+WKpr$plfQ|$07WCxqCG$B+y9j|Pj4V%W2K#1Ds)Eu2PhbA7Xkj0-J?UBl5<+8M| zGpVd|b!(9-59;il7gc zin0Tyk=7-pdW@IVADC=g0?R+~9xM?PvLJ&D?M=P-I-&J_V9oFAaA9*|>-#otWdCq- zzpQo%bo9Ej+T=vEJ=PUXY<6mCi6+pEc?r15nQ=G6Dl-oPuEI(c z%T}k9#Y|b%X0qqRl5OxwUh+Cj4jCPtvJPGz>x^zwD`JOl)x9)otncXT=yh><0A(>j?Gk`u?Fv&?r4i1A!Bd>Ay!60~!RD)M z2a676I-FS1*VB_gES-midZ!TB>7gaPLtuSn+cj7l9_6f9uF#^6c3J$(l*EL&-EHx9 zPOvNu-j`)eiC>0x9}OB{>;*wNF}*H;1633ODauAIcel-sc6P4E!krK?Rboy&oZ5Zi3|KvUh$wo26_8bsbHeog`b= zb|hlm?AWXaYL+b=4+n4M)Lb|#9`EFN&kC#lW$iR-2)9L^hW>rix8dVV6_ z*VEj+0lQ+wu5n@rVPV(|&VLaN7B~MHu8*4@9b7&nPB^olf8$seH&9tS?(ciVqoP}<85cwXm@N|@0qgoQHsNwD4LLE>GIf?zF4wX=??zS zX1QDxNi8U(lgU^&R4dkwj%f2i_}DBK&nqa@7VGT6r6sXlL_BW}flY7|g*jOcxe?F|3G%Wi4?z8-`w=@G(}$gUK}4*sAWe za4c99@9y9X&T_ojI_uIq!#d1puKijH%8}a&l5;wu8@q9u)X|pYMf(aqt!hsaub)?T zcWmQTtVM(N(-5KQ`PFLItkYfnyi6&L~6@6{6fh56zd$S9{Jw^RJ_N>Lr^*&V^hXbMk z__MU(j;M%9YHgwSkXEp_G_g3Q%3u*8p+ttnMyze+k_{W6be@TuyI6t_Nkg$Jy#m)> zgcN|e+W^@9RP@z*IH@(2(%i)BE3}EV2DVdj;d0HG6?!p=V6&kr!rlvgml|{u;fX1n zTkil#nVgEVVim4qXwM8HcV-i`RUqZ`;mJeBDF@#;gmjW9w;hy8 zG>7k+dg}1CvTJc?Gb$yT@a>$?rC z=W^U^UXCxvt-=7!68TxFz&z85hHZi#dU4}?I#dWH=1<4X{(AgPWo+tNYQk_JvWO0P zp}DvWP820NkYg)N22{H2MNSOV%vsP*x0E^ysRUYz%eZiAskEQO@WsLD1!V&$*p)$| zO}MQ|{TG}hO>~191A8+d4;QCbNpRA{THHHSULqhpFDaV5uM=c3423FKqqLQ(=&O@$Ek~g6g=$S-DPB&WW0*7*}VWQ$B z%J<-(>Q)RLrrfR4wLZ?dau#aogKX2CzDjMk!W==_*G#i>*fw_=#~C( zd{i~T=0**rODbtbt?s}lL1EY`I5FED%fiyKLq^e`E@)5L1Ld;6aE?yszscsqP6DTC z&p^7^;W#B1IweOsfvpbSoZ9M1(!TO^))(sYoyKq&Te4+|u)Z7>gdu5|!x@J!_H6ce z%5_?x5-06wj7GVsn@}(7gS~b;?1RR*xmG)~;R8GYY(zU$#vZ}iVa%nKoFwYvfJXu4 z_muChi@@i33R24`;Py1^o^fuQC10WWs3ApiyBua$RfB}t+$74iA%=?kPFY3QNp=PN72*wm}{_3UgdeNWaunL1C_6jgX}m zwr}ra9G(>V&=PCQ8UyW}DzPZ~{R8?^wXlcaJiLVBB9+gZ47+jqCYao*L((W>55D(jf- z16s|>chzl2Fn1e-_jXiVbLl9neW#Qf?Y7!1T0X%U?G-W>?m3TrcsrI1?2~L+>yd+d zz&c}D@WodZZJ;IaPeq#*j_p+N=w>U;^PI}fmW2~cyNvQ1+xh~keX4f%VbJzcat+#c zKyhf~3dH0N^oIR^me>eK0f{#d@9xF(L&A&&?Oq;yZqUTxNj?D6jhW$p8OT4flKoEQH~v-kkYfx1ZSjGYiw0< z)Ws0*K)h8YS!VWV?la{tlJ=N}mOQJ`8hg^2pn?mlTMe7w*@m^ut4nU1N0M>; zLR3zhC{&C9|miG4(&M(D2~-;=}NG@nPf(8OY%;DOzL}6y%{;Nm2jPW-%TV z25lv1{wkx`D5g?Wwx*=$G@~ROHG@S}`hvwyQUCKkGK``%Ui^$iGYe6)##dz;mE|ak z%6}c;%2A}CimVE_{#*+I%UgvftpmDFMhtYw^rG6JH(-onAx0I9@_-O50HLT7%|J+9 z^Y|QYA>4mSQKhC-Rs`~j)`W^;;f`<@w^LA1v?UlsmLQ}Icc6H<17ALFguB8WXe#6* zv!Jpv$P)IyV-%q8{qGqCf}e)o`=pKldQ}ka{}`o9JJ2nW2Z zI98Erw+b=|&XwL{1d$Cja$T&2*#Th}6ji#^Vd>ab_jpAaZ{?A`GR^8VMyjaNrP1+P znd9?Qisaa3ywGhWzcCyhDDh$71}azu1qJ*qK7x<(lLt8WYLu@4BU~`b=L?{j7}DtH zut1=o5=M1?QU66n{R8-JYz%p!i7G);%9+fa3=bToum&hBJTOz#)+DAe&?MCsh+a`g z4zd^ZUmEVe96jmZ=hXuSb1>N^Jd(RI1l|oE;ROO7jK?J&)+|O1eKHI1c0p19P2quM zc)PUo#CbeGY11UuyPdA=w#)nN>9KD4iA`?#)23VF?P3N zVPT3^7Vw!_vIhMDlZ_6tgjj3gt`KAg4$#3Of!Q%q*+_wF%&n$^%IzvE10HnhHuU9= zOnHJ9D+F6Y`aL!%X}A9pG+a=b$GuRc!(FiNpu~d9iu(D#xcp@)9kuMsHeRtbI1TJb zjF+$d_nN^VtORBv)m>H8&;O;mtMD?gC1hm1Q5d3$@A=QI^6E;9JytO@ zh$t3gpNHj`e1)OGH_^AB8bPEHr&M}eAV=4)aPAx00CJlVEb4!xC{{F=tqvF)bpInz zawQW`j~bMLE;J7VFpFZKqhby!XbSSjAusgS8A!XVA)EJp)XMq2CW`G?w$v2vMw{WVT!7c_D zFt`@LFub4Qn6V{$Q6*%8uNa86Tw4HzE5jWe{1E0jD;x?T zsQ(f!7w)hHs&oXZEQZUl)!U)BsL;gRtY|vqf>cZpLh?DZ;pBsO@QOmQDiP7-RX~0| z_XGBacHs&#qoTiPmZw^YZyf$na*Go4GF!Cqj%ecxEHN;FLIho;a2Q0X5>XUgRdH3W zQnw6~TGQy|!7!^D4rQpP5aq{9c};*D=d;f8^Yw_SVJ!g36&<7(?9!M)6kS$aAs(LX z7_6e5yg)IEw&z5warZ>1(u+6DI*&)TCo$ z$F@(J8f|Epy8h^C?e$aOrg?a`b#fj5Y973IkwKMpi|4k?vmPz0)lZSk#P8}IQ#Tm` z7Yw(V{IFnWbUQzyIh;#X*_kw zM_hV;D(<52)1t{!SyKw&`O#DHtXeFZj0vHxr=3IH|Dw+{e9y1-Se%{}d!`||idNv48du@&*m9(rapPt&@MgeyNb~0&?^~bnp*4cD;MP@siUSlc z{*+$|TfiJZ1GVxlobNvH?wQZVHei3qAAUoYaMsJaQ{GeZe%;<_N{(B-+fbLiEfa{i2U@%S!bH}?Ma35m*rw^*_8u_fnI zvLyE9e7@w`5hJg4ABBt6BZ@g?R-p{v`_a2+@F(N6cN+fc<&V%t4)QxEhTV{*(>5@>t|G+tT+98rUXBm;099^?mqsQsW(36QH`@dV<5 zXF}lNgzOhBa2N*w^@7G`OM&4F8Xtw}Kn+_HaM+@%MGs;0@U;NzaRj=y80_{WpvypG cXN2^D17T1Rz#X+f_avAPDo2evhE5>>0PyR;Y5)KL literal 59904 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 diff --git a/Zway/packages.config b/Zway/packages.config deleted file mode 100644 index 6cbb4e9..0000000 --- a/Zway/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file