From ed92555d1e1af9cf1d0190fe9e78582ad9f6452b Mon Sep 17 00:00:00 2001 From: BlubbFish Date: Tue, 26 Sep 2017 17:55:25 +0000 Subject: [PATCH] [NF] Ein paar verbesserungen --- Mqtt-Dashboard/Connector/ADataBackend.cs | 10 ++++---- Mqtt-Dashboard/Dashboard.csproj | 28 ++++++++++++++++++++++- Mqtt-Dashboard/Dashboard.csproj.user | 10 ++++++++ Mqtt-Dashboard/Form1.cs | 16 +++++++------ Mqtt-Dashboard/Program.cs | 5 ++-- Mqtt-Dashboard/Sensor/ASensor.cs | 20 ++++++++-------- Mqtt-Dashboard/Sensor/Flex4GridSwitch.cs | 6 ++--- Mqtt-Dashboard/Sensor/Flex4gridPower.cs | 2 +- Mqtt-Dashboard/Sensor/Power.cs | 2 +- Mqtt-Dashboard/Sensor/Switch.cs | 2 +- Mqtt-Dashboard/bin/Release/Dashboard.exe | Bin 33280 -> 33280 bytes Mqtt-Dashboard/bin/Release/Utils.dll | Bin 24576 -> 24576 bytes 12 files changed, 69 insertions(+), 32 deletions(-) diff --git a/Mqtt-Dashboard/Connector/ADataBackend.cs b/Mqtt-Dashboard/Connector/ADataBackend.cs index 39d2dbd..6f74838 100644 --- a/Mqtt-Dashboard/Connector/ADataBackend.cs +++ b/Mqtt-Dashboard/Connector/ADataBackend.cs @@ -2,28 +2,26 @@ using System.Collections.Generic; namespace Dashboard.Connector { - abstract class ADataBackend { + public abstract class ADataBackend { public abstract event MqttMessage MessageIncomming; public abstract event MqttMessage MessageSending; public delegate void MqttMessage(Object sender, MqttEventArgs e); - internal static void SetInstance(Dictionary dictionary) { - String object_sensor = "Dashboard.Connector." + Char.ToUpper(dictionary["type"][0]) + dictionary["type"].Substring(1); + public static ADataBackend GetInstance(Dictionary dictionary) { + String object_sensor = "Dashboard.Connector." + Char.ToUpper(dictionary["type"][0]) + dictionary["type"].Substring(1).ToLower(); Type t = null; try { t = Type.GetType(object_sensor, true); } catch (TypeLoadException) { throw new ArgumentException("settings.ini: " + dictionary["type"] + " is not a Connector"); } - Instance = (ADataBackend)t.GetConstructor(new Type[] { typeof(Dictionary) }).Invoke(new Object[] { dictionary }); + return (ADataBackend)t.GetConstructor(new Type[] { typeof(Dictionary) }).Invoke(new Object[] { dictionary }); } public abstract void Send(String topic, String data); public abstract void Dispose(); - - public static ADataBackend Instance { get; private set; } } public class MqttEventArgs : EventArgs { public MqttEventArgs() : base() { } diff --git a/Mqtt-Dashboard/Dashboard.csproj b/Mqtt-Dashboard/Dashboard.csproj index faece59..72b5428 100644 --- a/Mqtt-Dashboard/Dashboard.csproj +++ b/Mqtt-Dashboard/Dashboard.csproj @@ -11,6 +11,21 @@ v4.5.2 512 true + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true AnyCPU @@ -118,6 +133,17 @@ Utils - + + + False + Microsoft .NET Framework 4.5.2 %28x86 und x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + \ No newline at end of file diff --git a/Mqtt-Dashboard/Dashboard.csproj.user b/Mqtt-Dashboard/Dashboard.csproj.user index d79bedf..0d2e8c8 100644 --- a/Mqtt-Dashboard/Dashboard.csproj.user +++ b/Mqtt-Dashboard/Dashboard.csproj.user @@ -6,4 +6,14 @@ -debug + + + + + + + + de-DE + false + \ No newline at end of file diff --git a/Mqtt-Dashboard/Form1.cs b/Mqtt-Dashboard/Form1.cs index c9b4e73..7b95b97 100644 --- a/Mqtt-Dashboard/Form1.cs +++ b/Mqtt-Dashboard/Form1.cs @@ -9,10 +9,11 @@ using Dashboard.Tracings; namespace Dashboard { public partial class Dashboard : Form { private Dictionary sensors = new Dictionary(); + private ADataBackend mqtt; public Dashboard(Boolean debug) { InitializeComponent(); - ADataBackend.SetInstance(InIReader.GetInstance("settings.ini").GetSection("mqtt")); + this.mqtt = ADataBackend.GetInstance(InIReader.GetInstance("settings.ini").GetSection("mqtt")); this.GenerateSensors(); this.GenerateForms(); @@ -21,8 +22,8 @@ namespace Dashboard { this.SizeChanged += this.Dashboard_SizeChanged; if (debug) { - ADataBackend.Instance.MessageIncomming += this.Instance_MessageIncomming; - ADataBackend.Instance.MessageSending += this.Instance_MessageSending; + this.mqtt.MessageIncomming += this.Instance_MessageIncomming; + this.mqtt.MessageSending += this.Instance_MessageSending; } } @@ -32,9 +33,9 @@ namespace Dashboard { private void GenerateSensors() { InIReader ini = InIReader.GetInstance("sensor.ini"); - List sensorini = ini.GetSections(); + List sensorini = ini.GetSections(false); foreach(String sensor in sensorini) { - this.sensors.Add(sensor.ToLower().Substring(1, sensor.Length - 2), ASensor.GetInstance(ini.GetValue(sensor, "type").ToLower(), ini.GetSection(sensor), sensor.Substring(1, sensor.Length - 2))); + this.sensors.Add(sensor.ToLower(), ASensor.GetInstance(this.mqtt, ini.GetSection(sensor), sensor)); } } @@ -54,8 +55,9 @@ namespace Dashboard { item.Value.Dispose(); } this.sensors.Clear(); - ADataBackend.Instance.MessageIncomming -= this.Instance_MessageIncomming; - ADataBackend.Instance.Dispose(); + this.mqtt.MessageIncomming -= this.Instance_MessageIncomming; + this.mqtt.MessageSending -= this.Instance_MessageSending; + this.mqtt.Dispose(); this.Dispose(true); } diff --git a/Mqtt-Dashboard/Program.cs b/Mqtt-Dashboard/Program.cs index 845faf4..31f4000 100644 --- a/Mqtt-Dashboard/Program.cs +++ b/Mqtt-Dashboard/Program.cs @@ -10,10 +10,9 @@ namespace Dashboard { /// [STAThread] static void Main(String[] args) { - Dictionary pargs = new Dictionary { + CmdArgs.Instance.SetArguments(new Dictionary { { "-debug", new CmdArgs.VaildArguments(CmdArgs.ArgLength.Single) } - }; - CmdArgs.Instance.SetArguments(pargs, args); + }, args); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Boolean debug = false; diff --git a/Mqtt-Dashboard/Sensor/ASensor.cs b/Mqtt-Dashboard/Sensor/ASensor.cs index 486a94b..ee7f7bc 100644 --- a/Mqtt-Dashboard/Sensor/ASensor.cs +++ b/Mqtt-Dashboard/Sensor/ASensor.cs @@ -10,10 +10,11 @@ namespace Dashboard.Sensor { protected String topic; protected Int32 pollcount; private Dictionary settings; + protected ADataBackend backend; private Thread updateThread; private Boolean pollEnabled = false; - public ASensor(Dictionary settings, String name) { + public ASensor(Dictionary settings, String name, ADataBackend backend) { this.GetBool = true; this.GetFloat = 0.0f; this.GetInt = 0; @@ -21,7 +22,8 @@ namespace Dashboard.Sensor { this.settings = settings; this.Title = (settings.Keys.Contains("title")) ? settings["title"] : ""; this.Name = name; - ADataBackend.Instance.MessageIncomming += this.IncommingMqttMessage; + this.backend = backend; + this.backend.MessageIncomming += this.IncommingMqttMessage; if (settings.Keys.Contains("polling")) { this.pollEnabled = true; this.Polling = Int32.Parse(settings["polling"]); @@ -47,26 +49,26 @@ namespace Dashboard.Sensor { } } - internal static ASensor GetInstance(String v, Dictionary dictionary, String name) { - String object_sensor = "Dashboard.Sensor." + Char.ToUpper(v[0]) + v.Substring(1); + internal static ASensor GetInstance(ADataBackend backend, Dictionary dictionary, String name) { + String object_sensor = "Dashboard.Sensor." + Char.ToUpper(dictionary["type"][0]) + dictionary["type"].Substring(1).ToLower(); Type t = null; try { t = Type.GetType(object_sensor, true); } catch(TypeLoadException) { - throw new ArgumentException("sensor.ini: " + v + " is not a Sensor"); + throw new ArgumentException("sensor.ini: " + dictionary["type"] + " is not a Sensor"); } - return (ASensor)t.GetConstructor(new Type[] { typeof(Dictionary), typeof(String) }).Invoke(new Object[] { dictionary, name }); + return (ASensor)t.GetConstructor(new Type[] { typeof(Dictionary), typeof(String), typeof(ADataBackend) }).Invoke(new Object[] { dictionary, name, backend }); } protected virtual void Poll() { if(this.pollcount++ >= this.Polling) { this.pollcount = 1; - ADataBackend.Instance.Send(this.topic + "/status",""); + this.backend.Send(this.topic + "/status",""); } } internal virtual void SetBool(Boolean v) { - ADataBackend.Instance.Send(this.topic + "/set", v ? "on" : "off"); + this.backend.Send(this.topic + "/set", v ? "on" : "off"); } protected abstract Boolean UpdateValue(MqttEventArgs e); @@ -100,7 +102,7 @@ namespace Dashboard.Sensor { this.updateThread.Abort(); while (this.updateThread.ThreadState != ThreadState.Aborted) { } } - ADataBackend.Instance.MessageIncomming -= this.IncommingMqttMessage; + this.backend.MessageIncomming -= this.IncommingMqttMessage; } this.settings = null; this.updateThread = null; diff --git a/Mqtt-Dashboard/Sensor/Flex4GridSwitch.cs b/Mqtt-Dashboard/Sensor/Flex4GridSwitch.cs index 3ea9133..a476a4f 100644 --- a/Mqtt-Dashboard/Sensor/Flex4GridSwitch.cs +++ b/Mqtt-Dashboard/Sensor/Flex4GridSwitch.cs @@ -9,7 +9,7 @@ namespace Dashboard.Sensor { class Flex4gridswitch : ASensor { private String id; - public Flex4gridswitch(Dictionary settings, String name) : base(settings, name) { + public Flex4gridswitch(Dictionary settings, String name, ADataBackend backend) : base(settings, name, backend) { this.Datatypes = Types.Bool; this.id = settings["id"]; } @@ -40,13 +40,13 @@ namespace Dashboard.Sensor { if (this.pollcount++ >= this.Polling) { this.pollcount = 1; String hid = Regex.Match(this.topic, "/flex4grid/v1/households/([^/]*)/device/state").Groups[1].Value; - ADataBackend.Instance.Send("/flex4grid/v1/households/" + hid + "/devices/state/request", "{\"timestamp\": \"" + DateTime.Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffff'Z'") + "\"}"); + this.backend.Send("/flex4grid/v1/households/" + hid + "/devices/state/request", "{\"timestamp\": \"" + DateTime.Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffff'Z'") + "\"}"); } } internal override void SetBool(Boolean v) { String hid = Regex.Match(this.topic, "/flex4grid/v1/households/([^/]*)/device/state").Groups[1].Value; - ADataBackend.Instance.Send("/flex4grid/v1/households/" + hid + "/device/actuate", "{\"command\":\""+(v ? "ON" : "OFF") + "\",\"deviceId\":\""+ this.id + "\",\"timestamp\":\"" + DateTime.Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffff'Z'") + "\"}"); + this.backend.Send("/flex4grid/v1/households/" + hid + "/device/actuate", "{\"command\":\""+(v ? "ON" : "OFF") + "\",\"deviceId\":\""+ this.id + "\",\"timestamp\":\"" + DateTime.Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffff'Z'") + "\"}"); } } } \ No newline at end of file diff --git a/Mqtt-Dashboard/Sensor/Flex4gridPower.cs b/Mqtt-Dashboard/Sensor/Flex4gridPower.cs index 6fffc25..6cdae43 100644 --- a/Mqtt-Dashboard/Sensor/Flex4gridPower.cs +++ b/Mqtt-Dashboard/Sensor/Flex4gridPower.cs @@ -8,7 +8,7 @@ namespace Dashboard.Sensor { class Flex4gridpower : ASensor { private String id; - public Flex4gridpower(Dictionary settings, String name) : base(settings, name) { + public Flex4gridpower(Dictionary settings, String name, ADataBackend backend) : base(settings, name, backend) { this.Datatypes = Types.Float; this.id = settings["id"]; } diff --git a/Mqtt-Dashboard/Sensor/Power.cs b/Mqtt-Dashboard/Sensor/Power.cs index 6776032..e176b4f 100644 --- a/Mqtt-Dashboard/Sensor/Power.cs +++ b/Mqtt-Dashboard/Sensor/Power.cs @@ -5,7 +5,7 @@ using Dashboard.Connector; namespace Dashboard.Sensor { class Power : ASensor { - public Power(Dictionary settings, String name) : base(settings, name) { + public Power(Dictionary settings, String name, ADataBackend backend) : base(settings, name, backend) { this.GetBool = true; this.GetFloat = 0.0f; this.GetInt = 0; diff --git a/Mqtt-Dashboard/Sensor/Switch.cs b/Mqtt-Dashboard/Sensor/Switch.cs index 0c0e002..86b8969 100644 --- a/Mqtt-Dashboard/Sensor/Switch.cs +++ b/Mqtt-Dashboard/Sensor/Switch.cs @@ -4,7 +4,7 @@ using Dashboard.Connector; namespace Dashboard.Sensor { class Switch : ASensor { - public Switch(Dictionary settings, String name) : base(settings, name) { + public Switch(Dictionary settings, String name, ADataBackend backend) : base(settings, name, backend) { this.Datatypes = Types.Bool; } diff --git a/Mqtt-Dashboard/bin/Release/Dashboard.exe b/Mqtt-Dashboard/bin/Release/Dashboard.exe index 62e1981850e7895386b757db66c1236d2e16eb74..7db5a4e0d083cb13f9cb74fb8f7dfa958e0f392b 100644 GIT binary patch literal 33280 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 beCr4orj4(r^V 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 diff --git a/Mqtt-Dashboard/bin/Release/Utils.dll b/Mqtt-Dashboard/bin/Release/Utils.dll index 9647ff5de5e38dc5b5cc091289b2ae828289af75..28f5d3debb41c7436ba7309617ee5861c8898473 100644 GIT binary patch delta 9371 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 u`g-dJt39Q7BiENo?ddgdLUYB`0l