From beea6c1ee02cd7359d0a4b43c008a9c1248d2435 Mon Sep 17 00:00:00 2001 From: BlubbFish Date: Mon, 25 Dec 2017 18:11:01 +0000 Subject: [PATCH] [BF] v1.3.5.3 Change Level to numeric and create State for Bollean values, because telegraf only parse numeric --- .../CommandClassSubs/SensorBinarySub.cs | 21 ++++++++---- Zway/Devices/CommandClasses/Indicator.cs | 26 +++++++++----- Zway/Devices/CommandClasses/SwitchBinary.cs | 24 +++++++++---- Zway/Devices/CommandClasses/Wakeup.cs | 32 ++++++++++-------- Zway/Properties/AssemblyInfo.cs | 6 ++-- Zway/bin/Release/Zway.dll | Bin 55808 -> 56320 bytes 6 files changed, 70 insertions(+), 39 deletions(-) diff --git a/Zway/Devices/CommandClasses/CommandClassSubs/SensorBinarySub.cs b/Zway/Devices/CommandClasses/CommandClassSubs/SensorBinarySub.cs index 120e989..35586e6 100644 --- a/Zway/Devices/CommandClasses/CommandClassSubs/SensorBinarySub.cs +++ b/Zway/Devices/CommandClasses/CommandClassSubs/SensorBinarySub.cs @@ -11,7 +11,13 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { public override event UpdatedValue Update; public String Type { get; private set; } - public Boolean Level { get; private set; } + public Boolean State { get; private set; } + public Int32 Level { + get { + return (this.State) ? 1 : 0; + } + } + public Sensorbinarysub(JsonData json, Tuple id, HttpConnection http, Boolean polling) : base(json, id, http, polling) { this.IsSub = true; InitComplex(json); @@ -23,7 +29,7 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { json.Keys.Contains("level") && json["level"].Keys.Contains("value")) { this.Type = json["sensorTypeString"]["value"].ToString(); - this.Level = (Boolean)json["level"]["value"]; + this.State = (Boolean)json["level"]["value"]; } } @@ -31,22 +37,23 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs { if (json.Keys.Contains("level") && json["level"].Keys.Contains("value") && json.Keys.Contains("sensorTypeString") && json["sensorTypeString"].Keys.Contains("value") && this.CheckSetUpdateTime(json)) { - this.Level = (Boolean)json["level"]["value"]; + this.State = (Boolean)json["level"]["value"]; this.Type = json["sensorTypeString"]["value"].ToString(); - this.Update?.Invoke(this, new DeviceUpdateEvent(new Tuple(this.Type, this.Level), this.LastUpdate, this)); + this.Update?.Invoke(this, new DeviceUpdateEvent(new Tuple(this.Type, this.State), this.LastUpdate, this)); } } public override String ToString() { - return "SensorBinary " + this.Name + " [" + this.Id + "]: " + this.Type + " " + this.Level.ToString(); + return "SensorBinary " + this.Name + " [" + this.Id + "]: " + this.Type + " " + this.State.ToString(); } internal override void Poll() => this.PollNone(); public override Dictionary ToDictionary() { return new Dictionary { - { "Level", this.Level }, - { "Type", this.Type } + { "State", this.State }, + { "Type", this.Type }, + { "Level", this.Level } }; } } diff --git a/Zway/Devices/CommandClasses/Indicator.cs b/Zway/Devices/CommandClasses/Indicator.cs index 6ffc536..2de3502 100644 --- a/Zway/Devices/CommandClasses/Indicator.cs +++ b/Zway/Devices/CommandClasses/Indicator.cs @@ -11,33 +11,42 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { /// 135 = Indicator /// class Indicator : ACommandClass { - private Boolean _level; + private Boolean _state; public override event UpdatedValue Update; - public Boolean Level { + public Boolean State { get { - return this._level; + return this._state; } set { this.SetInt(value ? 255 : 0); } } + public Int32 Level { + get { + return (this.State) ? 1 : 0; + } + set { + this.State = (value == 1); + } + } + public Indicator(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("stat") && json["data"]["stat"].Keys.Contains("value")) { - this._level = Int32.Parse(json["data"]["stat"]["value"].ToString()) == 255; + this._state = Int32.Parse(json["data"]["stat"]["value"].ToString()) == 255; } } internal override void SetUpdate(JsonData json, Match match) { if(match.Groups[4].Value == ".data.stat") { if (json.Keys.Contains("value") && this.CheckSetUpdateTime(json)) { - this._level = Int32.Parse(json["value"].ToString()) == 255; - this.Update?.Invoke(this, new DeviceUpdateEvent(this.Level, this.LastUpdate, this)); + this._state = Int32.Parse(json["value"].ToString()) == 255; + this.Update?.Invoke(this, new DeviceUpdateEvent(this.State, this.LastUpdate, this)); } } else { Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); @@ -45,12 +54,13 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } public override String ToString() { - return "Indicator " + this.Name + " [" + this.Id + "]: " + this.Level; + return "Indicator " + this.Name + " [" + this.Id + "]: " + this.State; } public override Dictionary ToDictionary() { return new Dictionary { - { "Level", this.Level }, + { "State", this.State }, + { "Level", this.Level } }; } } diff --git a/Zway/Devices/CommandClasses/SwitchBinary.cs b/Zway/Devices/CommandClasses/SwitchBinary.cs index 2dedcfa..cf469de 100644 --- a/Zway/Devices/CommandClasses/SwitchBinary.cs +++ b/Zway/Devices/CommandClasses/SwitchBinary.cs @@ -11,13 +11,22 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { /// 37 = SwitchBinary /// public class Switchbinary : ACommandClass { - private Boolean _level; + private Boolean _state; public override event UpdatedValue Update; - public Boolean Level { + public Int32 Level { get { - return this._level; + return (this.State) ? 1 : 0; + } + set { + this.State = (value == 1); + } + } + + public Boolean State { + get { + return this._state; } set { this.SetInt(value ? 255 : 0); @@ -31,8 +40,8 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { 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)) { - this._level = (Boolean)json["value"]; - this.Update?.Invoke(this, new DeviceUpdateEvent(this.Level, this.LastUpdate, this)); + this._state = (Boolean)json["value"]; + this.Update?.Invoke(this, new DeviceUpdateEvent(this.State, this.LastUpdate, this)); } } else { Helper.WriteError("Kenne in " + this.Name + " [" + this.Id + "] " + match.Groups[4].Value + " nicht!"); @@ -41,16 +50,17 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { 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._level = (Boolean)json["data"]["level"]["value"]; + this._state = (Boolean)json["data"]["level"]["value"]; } } public override String ToString() { - return "SwitchBinary " + this.Name + " [" + this.Id + "]: " + this.Level; + return "SwitchBinary " + this.Name + " [" + this.Id + "]: " + this.State; } public override Dictionary ToDictionary() { return new Dictionary { + { "State", this.State }, { "Level", this.Level } }; } diff --git a/Zway/Devices/CommandClasses/Wakeup.cs b/Zway/Devices/CommandClasses/Wakeup.cs index 2ec79bb..19f2234 100644 --- a/Zway/Devices/CommandClasses/Wakeup.cs +++ b/Zway/Devices/CommandClasses/Wakeup.cs @@ -34,9 +34,11 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { } public Int32 WakeupMin { get; private set; } public Int32 WakeupMax { get; private set; } - public Boolean HasMinMax { get; private set; } + public Boolean HasMinMaxState { get; private set; } + public Int32 HasMinMaxLevel { get { return (this.HasMinMaxState) ? 1 : 0; } } public Int32 WakeupDefault { get; private set; } - public Boolean HasDefault { get; private set; } + public Boolean HasDefaultState { get; private set; } + public Int32 HasDefaultLevel { get { return (this.HasDefaultState) ? 1 : 0; } } public DateTime LastWakeup { get; private set; } public DateTime LastSleep { get; private set; } @@ -53,19 +55,19 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { if (data.Keys.Contains("nodeId") && data["nodeId"].Keys.Contains("value")) { this._againstNode = Int32.Parse(data["nodeId"]["value"].ToString()); } - this.HasMinMax = false; + this.HasMinMaxState = false; if (data.Keys.Contains("min") && data["min"].Keys.Contains("value") && data["min"]["value"] != null) { this.WakeupMin = Int32.Parse(data["min"]["value"].ToString()); - this.HasMinMax = true; + this.HasMinMaxState = true; } if (data.Keys.Contains("max") && data["max"].Keys.Contains("value") && data["max"]["value"] != null) { this.WakeupMax = Int32.Parse(data["max"]["value"].ToString()); - this.HasMinMax = true; + this.HasMinMaxState = true; } - this.HasDefault = false; + this.HasDefaultState = false; if (data.Keys.Contains("default") && data["default"].Keys.Contains("value") && data["default"]["value"] != null) { this.WakeupDefault = Int32.Parse(data["default"]["value"].ToString()); - this.HasDefault = true; + this.HasDefaultState = true; } if (data.Keys.Contains("lastWakeup") && data["lastWakeup"].Keys.Contains("value") && data["lastWakeup"]["value"] != null) { this.LastWakeup = DateTimeOffset.FromUnixTimeSeconds(Int64.Parse(data["lastWakeup"]["value"].ToString())).DateTime.ToLocalTime(); @@ -97,22 +99,22 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { this._againstNode = Int32.Parse(json["nodeId"]["value"].ToString()); success = true; } - this.HasMinMax = false; + this.HasMinMaxState = false; if (json.Keys.Contains("min") && json["min"].Keys.Contains("value") && json["min"]["value"] != null) { this.WakeupMin = Int32.Parse(json["min"]["value"].ToString()); success = true; - this.HasMinMax = true; + this.HasMinMaxState = true; } if (json.Keys.Contains("max") && json["max"].Keys.Contains("value") && json["max"]["value"] != null) { this.WakeupMax = Int32.Parse(json["max"]["value"].ToString()); success = true; - this.HasMinMax = true; + this.HasMinMaxState = true; } - this.HasDefault = false; + this.HasDefaultState = false; if (json.Keys.Contains("default") && json["default"].Keys.Contains("value") && json["default"]["value"] != null) { this.WakeupDefault = Int32.Parse(json["default"]["value"].ToString()); success = true; - this.HasDefault = true; + this.HasDefaultState = true; } if (json.Keys.Contains("lastWakeup") && json["lastWakeup"].Keys.Contains("value") && json["lastWakeup"]["value"] != null) { this.LastWakeup = DateTimeOffset.FromUnixTimeSeconds(Int64.Parse(json["lastWakeup"]["value"].ToString())).DateTime.ToLocalTime(); @@ -140,9 +142,11 @@ namespace BlubbFish.IoT.Zway.Devices.CommandClasses { { "AgainstNode", this.AgainstNode }, { "WakeupMin", this.WakeupMin }, { "WakeupMax", this.WakeupMax }, - { "HasMinMax", this.HasMinMax }, + { "HasMinMaxState", this.HasMinMaxState }, + { "HasMinMaxLevel", this.HasMinMaxLevel }, { "WakeupDefault", this.WakeupDefault }, - { "HasDefault", this.HasDefault }, + { "HasDefaultState", this.HasDefaultState }, + { "HasDefaultLevel", this.HasDefaultLevel }, { "LastWakeup", this.LastWakeup.ToString() }, { "LastSleep", this.LastSleep.ToString() } }; diff --git a/Zway/Properties/AssemblyInfo.cs b/Zway/Properties/AssemblyInfo.cs index a498147..2d95f34 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 - 24.12.2017")] +[assembly: AssemblyCopyright("Copyright © 2017 - 25.12.2017")] [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.5.2")] -[assembly: AssemblyFileVersion("1.3.5.2")] +[assembly: AssemblyVersion("1.3.5.3")] +[assembly: AssemblyFileVersion("1.3.5.3")] diff --git a/Zway/bin/Release/Zway.dll b/Zway/bin/Release/Zway.dll index 87cf95e32e38bc9d704c1e19ada807a4c2a24510..6d157492c1ac698cef903d13063b8deef9c5650b 100644 GIT binary patch delta 17726 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

dLVui+EF)?GlhI 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