From db935e019cbe095801d4284863f6e50359a4e885 Mon Sep 17 00:00:00 2001 From: BlubbFish Date: Sun, 17 Dec 2017 21:53:16 +0000 Subject: [PATCH] [NF] Tiny fix for mqtt --- Zway/Devices/CommandClasses/Battery.cs | 10 +++--- Zway/Devices/CommandClasses/CentralScene.cs | 4 +-- .../CommandClassSubs/Configurationsub.cs | 4 +-- .../CommandClassSubs/MeterSub.cs | 10 +++--- .../CommandClassSubs/SensorMultilevelSub.cs | 10 +++--- .../CommandClassSubs/ThermostatSetPointSub.cs | 32 +++++++++--------- Zway/Devices/CommandClasses/Indicator.cs | 2 +- Zway/Devices/CommandClasses/SwitchBinary.cs | 2 +- .../CommandClasses/SwitchMultilevel.cs | 2 +- Zway/Devices/CommandClasses/ThermostatMode.cs | 2 +- Zway/Devices/CommandClasses/Wakeup.cs | 8 +++-- Zway/Events/DeviceUpdateEvent.cs | 18 +++++----- Zway/Interfaces/ACommandClass.cs | 4 +-- Zway/Properties/AssemblyInfo.cs | 4 +-- Zway/bin/Release/Zway.dll | Bin 50176 -> 50176 bytes 15 files changed, 57 insertions(+), 55 deletions(-) diff --git a/Zway/Devices/CommandClasses/Battery.cs b/Zway/Devices/CommandClasses/Battery.cs index 4b830dc..459fe8e 100644 --- a/Zway/Devices/CommandClasses/Battery.cs +++ b/Zway/Devices/CommandClasses/Battery.cs @@ -12,7 +12,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { /// public class Battery : ACommandClass { - public Single Level { get; private set; } + public Double Level { get; private set; } public override event UpdatedValue Update; @@ -24,12 +24,12 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { Boolean success = false; if (match.Groups[4].Value == ".data") { if (json.Keys.Contains("last") && json["last"].Keys.Contains("value")) { - this.Level = Single.Parse(json["last"]["value"].ToString()); + this.Level = Double.Parse(json["last"]["value"].ToString()); success = true; } } else if (match.Groups[4].Value == ".data.last") { if (json.Keys.Contains("value")) { - this.Level = Single.Parse(json["value"].ToString()); + this.Level = Double.Parse(json["value"].ToString()); success = true; } } else if (match.Groups[4].Value.StartsWith(".data.history.")) { @@ -44,7 +44,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { private void InitComplex(JsonData json) { if (json.Keys.Contains("data") && json["data"].Keys.Contains("last") && json["data"]["last"].Keys.Contains("value")) { - this.Level = Single.Parse(json["data"]["last"]["value"].ToString()); + this.Level = Double.Parse(json["data"]["last"]["value"].ToString()); } } @@ -54,7 +54,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { public override Dictionary ToDictionary() { return new Dictionary { - { "level", this.Level.ToString() }, + { "level", this.Level }, }; } } diff --git a/Zway/Devices/CommandClasses/CentralScene.cs b/Zway/Devices/CommandClasses/CentralScene.cs index c189899..8ab5db7 100644 --- a/Zway/Devices/CommandClasses/CentralScene.cs +++ b/Zway/Devices/CommandClasses/CentralScene.cs @@ -78,8 +78,8 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { public override Dictionary ToDictionary() { return new Dictionary { - { "scene", this.Scene.ToString() }, - { "key", this.Key.ToString() }, + { "scene", this.Scene }, + { "key", this.Key }, }; } } diff --git a/Zway/Devices/CommandClasses/CommandClassSubs/Configurationsub.cs b/Zway/Devices/CommandClasses/CommandClassSubs/Configurationsub.cs index 89cc335..8c79ea4 100644 --- a/Zway/Devices/CommandClasses/CommandClassSubs/Configurationsub.cs +++ b/Zway/Devices/CommandClasses/CommandClassSubs/Configurationsub.cs @@ -61,8 +61,8 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { public override Dictionary ToDictionary() { return new Dictionary { - { "level", this.Level.ToString() }, - { "size", this.Size.ToString() }, + { "level", this.Level }, + { "size", this.Size }, }; } } diff --git a/Zway/Devices/CommandClasses/CommandClassSubs/MeterSub.cs b/Zway/Devices/CommandClasses/CommandClassSubs/MeterSub.cs index 519fd90..5e96d75 100644 --- a/Zway/Devices/CommandClasses/CommandClassSubs/MeterSub.cs +++ b/Zway/Devices/CommandClasses/CommandClassSubs/MeterSub.cs @@ -11,7 +11,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { public override event UpdatedValue Update; public String Type { get; private set; } - public Single Level { get; private set; } + public Double Level { get; private set; } public String Scale { get; private set; } public Metersub(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.HasReset = true; @@ -27,7 +27,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { json.Keys.Contains("scaleString") && json["scaleString"].Keys.Contains("value")) { this.Type = json["sensorTypeString"]["value"].ToString(); - this.Level = Single.Parse(json["val"]["value"].ToString()); + this.Level = Double.Parse(json["val"]["value"].ToString()); this.Scale = json["scaleString"]["value"].ToString(); } } @@ -37,10 +37,10 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { json.Keys.Contains("sensorTypeString") && json["sensorTypeString"].Keys.Contains("value") && json.Keys.Contains("scaleString") && json["scaleString"].Keys.Contains("value") && this.CheckSetUpdateTime(json)) { - this.Level = Single.Parse(json["val"]["value"].ToString()); + this.Level = Double.Parse(json["val"]["value"].ToString()); this.Type = json["sensorTypeString"]["value"].ToString(); this.Scale = json["scaleString"]["value"].ToString(); - this.Update?.Invoke(this, new DeviceUpdateEvent(new Tuple(this.Type, this.Scale, this.Level), this.LastUpdate, this)); + this.Update?.Invoke(this, new DeviceUpdateEvent(new Tuple(this.Type, this.Scale, this.Level), this.LastUpdate, this)); } } @@ -52,7 +52,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { public override Dictionary ToDictionary() { return new Dictionary { - { "level", this.Level.ToString() }, + { "level", this.Level }, { "type", this.Type }, { "scale", this.Scale }, }; diff --git a/Zway/Devices/CommandClasses/CommandClassSubs/SensorMultilevelSub.cs b/Zway/Devices/CommandClasses/CommandClassSubs/SensorMultilevelSub.cs index a065352..de1104e 100644 --- a/Zway/Devices/CommandClasses/CommandClassSubs/SensorMultilevelSub.cs +++ b/Zway/Devices/CommandClasses/CommandClassSubs/SensorMultilevelSub.cs @@ -11,7 +11,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { public override event UpdatedValue Update; public String Type { get; private set; } - public Single Level { get; private set; } + public Double Level { get; private set; } public String Scale { get; private set; } public Sensormultilevelsub(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { @@ -27,7 +27,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { json.Keys.Contains("scaleString") && json["scaleString"].Keys.Contains("value")) { this.Type = json["sensorTypeString"]["value"].ToString(); - this.Level = Single.Parse(json["val"]["value"].ToString()); + this.Level = Double.Parse(json["val"]["value"].ToString()); this.Scale = json["scaleString"]["value"].ToString(); } } @@ -37,10 +37,10 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { json.Keys.Contains("sensorTypeString") && json["sensorTypeString"].Keys.Contains("value") && json.Keys.Contains("scaleString") && json["scaleString"].Keys.Contains("value") && this.CheckSetUpdateTime(json)) { - this.Level = Single.Parse(json["val"]["value"].ToString()); + this.Level = Double.Parse(json["val"]["value"].ToString()); this.Type = json["sensorTypeString"]["value"].ToString(); this.Scale = json["scaleString"]["value"].ToString(); - this.Update?.Invoke(this, new DeviceUpdateEvent(new Tuple(this.Type, this.Scale, this.Level), this.LastUpdate, this)); + this.Update?.Invoke(this, new DeviceUpdateEvent(new Tuple(this.Type, this.Scale, this.Level), this.LastUpdate, this)); } } @@ -52,7 +52,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { public override Dictionary ToDictionary() { return new Dictionary { - { "level", this.Level.ToString() }, + { "level", this.Level }, { "type", this.Type }, { "scale", this.Scale }, }; diff --git a/Zway/Devices/CommandClasses/CommandClassSubs/ThermostatSetPointSub.cs b/Zway/Devices/CommandClasses/CommandClassSubs/ThermostatSetPointSub.cs index dc87b7c..50d970d 100644 --- a/Zway/Devices/CommandClasses/CommandClassSubs/ThermostatSetPointSub.cs +++ b/Zway/Devices/CommandClasses/CommandClassSubs/ThermostatSetPointSub.cs @@ -10,20 +10,20 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { class Thermostatsetpointsub : ACommandClass { public override event UpdatedValue Update; - private Single _level; - public Single Level { + private Double _level; + public Double Level { get { return this._level; } set { if (!this.HasMinMax || (this.HasMinMax && value >= this.TempMin && value <= this.TempMax)) { - this.SetTuple(this.SensorId, (Single)Math.Round(value * 2, MidpointRounding.AwayFromZero) / 2); + this.SetTuple(this.SensorId, (Double)Math.Round(value * 2, MidpointRounding.AwayFromZero) / 2); } } } public String Scale { get; private set; } - public Single TempMax { get; private set; } - public Single TempMin { get; private set; } + public Double TempMax { get; private set; } + public Double TempMin { get; private set; } public Boolean HasMinMax { get; private set; } public String Type { get; private set; } @@ -37,13 +37,13 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { json.Keys.Contains("val") && json["val"].Keys.Contains("value") && json.Keys.Contains("deviceScaleString") && json["deviceScaleString"].Keys.Contains("value")) { this.Type = json["modeName"]["value"].ToString(); - this._level = Single.Parse(json["val"]["value"].ToString()); + this._level = Double.Parse(json["val"]["value"].ToString()); this.Scale = json["deviceScaleString"]["value"].ToString(); } if (json.Keys.Contains("min") && json["min"].Keys.Contains("value") && json.Keys.Contains("max") && json["max"].Keys.Contains("value")) { - this.TempMin = Single.Parse(json["min"]["value"].ToString()); - this.TempMax = Single.Parse(json["max"]["value"].ToString()); + this.TempMin = Double.Parse(json["min"]["value"].ToString()); + this.TempMax = Double.Parse(json["max"]["value"].ToString()); this.HasMinMax = true; } else { this.HasMinMax = false; @@ -55,22 +55,22 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { if (json.Keys.Contains("val") && json["val"].Keys.Contains("value") && json.Keys.Contains("deviceScaleString") && json["deviceScaleString"].Keys.Contains("value") && json.Keys.Contains("modeName") && json["modeName"].Keys.Contains("value")) { - this._level = Single.Parse(json["val"]["value"].ToString()); + this._level = Double.Parse(json["val"]["value"].ToString()); this.Scale = json["deviceScaleString"]["value"].ToString(); this.Type = json["modeName"]["value"].ToString(); ret = true; } if (json.Keys.Contains("min") && json["val"].Keys.Contains("value") && json.Keys.Contains("max") && json["max"].Keys.Contains("value")) { - this.TempMin = Single.Parse(json["min"]["value"].ToString()); - this.TempMax = Single.Parse(json["max"]["value"].ToString()); + this.TempMin = Double.Parse(json["min"]["value"].ToString()); + this.TempMax = Double.Parse(json["max"]["value"].ToString()); this.HasMinMax = true; ret = true; } else { this.HasMinMax = false; } if (ret && this.CheckSetUpdateTime(json)) { - this.Update?.Invoke(this, new DeviceUpdateEvent(new Tuple(this.Type, this.Scale, this.Level, this.TempMin, this.TempMax, this.HasMinMax), this.LastUpdate, this)); + this.Update?.Invoke(this, new DeviceUpdateEvent(new Tuple(this.Type, this.Scale, this.Level, this.TempMin, this.TempMax, this.HasMinMax), this.LastUpdate, this)); } } @@ -82,12 +82,12 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { public override Dictionary ToDictionary() { return new Dictionary { - { "level", this.Level.ToString() }, + { "level", this.Level }, { "type", this.Type }, { "scale", this.Scale }, - { "tempmax", this.TempMax.ToString() }, - { "tempmin", this.TempMin.ToString() }, - { "hasminmax", this.HasMinMax.ToString() }, + { "tempmax", this.TempMax }, + { "tempmin", this.TempMin }, + { "hasminmax", this.HasMinMax }, }; } } diff --git a/Zway/Devices/CommandClasses/Indicator.cs b/Zway/Devices/CommandClasses/Indicator.cs index 2746daa..f0444b2 100644 --- a/Zway/Devices/CommandClasses/Indicator.cs +++ b/Zway/Devices/CommandClasses/Indicator.cs @@ -50,7 +50,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { public override Dictionary ToDictionary() { return new Dictionary { - { "level", this.Level.ToString() }, + { "level", this.Level }, }; } } diff --git a/Zway/Devices/CommandClasses/SwitchBinary.cs b/Zway/Devices/CommandClasses/SwitchBinary.cs index b3a2f04..f965b02 100644 --- a/Zway/Devices/CommandClasses/SwitchBinary.cs +++ b/Zway/Devices/CommandClasses/SwitchBinary.cs @@ -51,7 +51,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { public override Dictionary ToDictionary() { return new Dictionary { - { "level", this.Level.ToString() } + { "level", this.Level } }; } } diff --git a/Zway/Devices/CommandClasses/SwitchMultilevel.cs b/Zway/Devices/CommandClasses/SwitchMultilevel.cs index e1d960b..c42caf4 100644 --- a/Zway/Devices/CommandClasses/SwitchMultilevel.cs +++ b/Zway/Devices/CommandClasses/SwitchMultilevel.cs @@ -54,7 +54,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { public override Dictionary ToDictionary() { return new Dictionary { - { "level", this.Level.ToString() } + { "level", this.Level } }; } } diff --git a/Zway/Devices/CommandClasses/ThermostatMode.cs b/Zway/Devices/CommandClasses/ThermostatMode.cs index 4900a64..75cc9f4 100644 --- a/Zway/Devices/CommandClasses/ThermostatMode.cs +++ b/Zway/Devices/CommandClasses/ThermostatMode.cs @@ -71,7 +71,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { modes.Add(item.Key.ToString(), item.Value); } Dictionary json = new Dictionary { - { "level", this.Level.ToString() }, + { "level", this.Level }, { "modes", modes } }; return json; diff --git a/Zway/Devices/CommandClasses/Wakeup.cs b/Zway/Devices/CommandClasses/Wakeup.cs index e7adb35..8f1b197 100644 --- a/Zway/Devices/CommandClasses/Wakeup.cs +++ b/Zway/Devices/CommandClasses/Wakeup.cs @@ -124,9 +124,11 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { public override Dictionary ToDictionary() { return new Dictionary { - { "wakeupmin", this.WakeupMin.ToString() }, - { "wakeupmax", this.WakeupMax.ToString() }, - { "wakeupdefault", this.WakeupDefault.ToString() }, + {"interval", this.Interval }, + {"againstnode", this.AgainstNode }, + { "wakeupmin", this.WakeupMin }, + { "wakeupmax", this.WakeupMax }, + { "wakeupdefault", this.WakeupDefault }, { "lastwakeup", this.LastWakeup.ToString() }, { "lastsleep", this.LastSleep.ToString() } }; diff --git a/Zway/Events/DeviceUpdateEvent.cs b/Zway/Events/DeviceUpdateEvent.cs index a586143..a743e0e 100644 --- a/Zway/Events/DeviceUpdateEvent.cs +++ b/Zway/Events/DeviceUpdateEvent.cs @@ -10,8 +10,8 @@ namespace BlubbFish.IoT.Zway.Events { public DeviceUpdateEvent() { } - public DeviceUpdateEvent(Single value, DateTime time, Object parent) { - this.GetSingle = value; + public DeviceUpdateEvent(Double value, DateTime time, Object parent) { + this.GetDouble = value; this.UpdateTime = time; this.Parent = parent; } @@ -28,13 +28,13 @@ namespace BlubbFish.IoT.Zway.Events { this.Parent = parent; } - public DeviceUpdateEvent(Tuple value, DateTime time, Object parent) { - this.GetStringStringSingleTuple = value; + public DeviceUpdateEvent(Tuple value, DateTime time, Object parent) { + this.GetStringStringDoubleTuple = value; this.UpdateTime = time; this.Parent = parent; } - public DeviceUpdateEvent(Tuple value, DateTime time, Object parent) { - this.GetStringStringSingleSingleSingleSingleBooleanTuple = value; + public DeviceUpdateEvent(Tuple value, DateTime time, Object parent) { + this.GetStringStringDoubleDoubleDoubleDoubleBooleanTuple = value; this.UpdateTime = time; this.Parent = parent; } @@ -51,10 +51,10 @@ namespace BlubbFish.IoT.Zway.Events { this.Parent = parent; } - public Single GetSingle { get; } + public Double GetDouble { get; } public DateTime GetDate { get; } - public Tuple GetStringStringSingleTuple { get; } - public Tuple GetStringStringSingleSingleSingleSingleBooleanTuple { get; } + public Tuple GetStringStringDoubleTuple { get; } + public Tuple GetStringStringDoubleDoubleDoubleDoubleBooleanTuple { get; } public Tuple GetLongIntegerTuple { get; } public DateTime UpdateTime { get; } public Object Parent { get; private set; } diff --git a/Zway/Interfaces/ACommandClass.cs b/Zway/Interfaces/ACommandClass.cs index f1a765d..771cd30 100644 --- a/Zway/Interfaces/ACommandClass.cs +++ b/Zway/Interfaces/ACommandClass.cs @@ -172,11 +172,11 @@ namespace BlubbFish.IoT.Zway.Interfaces { this.http.GetVoid("ZWave.zway/Run/devices[" + this.DeviceId + "].instances[" + this.Instance + "].commandClasses[" + ((Int32)this.Commandclass).ToString() + "].Set(" + value + ")"); } - protected void SetTuple(Single value1, Single value2) { + protected void SetTuple(Double value1, Double value2) { this.http.GetVoid("ZWave.zway/Run/devices[" + this.DeviceId + "].instances[" + this.Instance + "].commandClasses[" + ((Int32)this.Commandclass).ToString() + "].Set(" + value1 + "," + value2 + ")"); } - protected void SetTuple(Int32 v1, Int32 v2) => this.SetTuple(v1, (Single)v2); + protected void SetTuple(Int32 v1, Int32 v2) => this.SetTuple(v1, (Double)v2); protected Boolean CheckSetUpdateTime(JsonData json) { if (json.Keys.Contains("updateTime") && (json["updateTime"].IsInt || json["updateTime"].IsLong)) { diff --git a/Zway/Properties/AssemblyInfo.cs b/Zway/Properties/AssemblyInfo.cs index e00e39e..39af2ff 100644 --- a/Zway/Properties/AssemblyInfo.cs +++ b/Zway/Properties/AssemblyInfo.cs @@ -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.0.0")] -[assembly: AssemblyFileVersion("1.3.0.0")] +[assembly: AssemblyVersion("1.3.1.0")] +[assembly: AssemblyFileVersion("1.3.1.0")] diff --git a/Zway/bin/Release/Zway.dll b/Zway/bin/Release/Zway.dll index 2489e42f41f49eb1f0c738109c3c3cb8543612a1..607e2b388d4ed3adb5ad22226b7f138d810c1acd 100644 GIT binary patch delta 9206 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 delta 9176 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 Peb+?2ub&gEh8q6|T@Qbp