From a0312c775716be333498dc4faef9cb849ef9d2cc Mon Sep 17 00:00:00 2001 From: BlubbFish Date: Tue, 19 Sep 2017 20:57:08 +0000 Subject: [PATCH] [NF] Nun in der Lage Flex4Grid anzuzapfen --- Mqtt-Dashboard/Connector/AMqtt.cs | 40 ++++++++++ Mqtt-Dashboard/Connector/Mosquitto.cs | 96 +++++++++++++++++++++++ Mqtt-Dashboard/Connector/Mqtt.cs | 46 ++++++----- Mqtt-Dashboard/Dashboard.csproj | 13 +-- Mqtt-Dashboard/Form1.cs | 39 ++++----- Mqtt-Dashboard/Sensor/ASensor.cs | 32 ++++---- Mqtt-Dashboard/Sensor/Flex4gridPower.cs | 37 +++++++++ Mqtt-Dashboard/Sensor/Power.cs | 8 +- Mqtt-Dashboard/Sensor/Switch.cs | 11 +-- Mqtt-Dashboard/Tracings/ATracings.cs | 4 +- Mqtt-Dashboard/Tracings/Graph.cs | 2 +- Mqtt-Dashboard/bin/Release/Dashboard.exe | Bin 21504 -> 28160 bytes Mqtt-Dashboard/bin/Release/LitJson.dll | Bin 0 -> 54272 bytes Mqtt-Dashboard/bin/Release/Utils.dll | Bin 24576 -> 24576 bytes Mqtt-Dashboard/bin/Release/sensor.ini | 24 ------ Mqtt-Dashboard/bin/Release/settings.ini | 2 - Mqtt-Dashboard/bin/Release/tracings.ini | 45 ----------- Mqtt-Dashboard/packages.config | 1 + Mqtt-Dashboard/settings.ini.example | 5 +- 19 files changed, 250 insertions(+), 155 deletions(-) create mode 100644 Mqtt-Dashboard/Connector/AMqtt.cs create mode 100644 Mqtt-Dashboard/Connector/Mosquitto.cs create mode 100644 Mqtt-Dashboard/Sensor/Flex4gridPower.cs create mode 100644 Mqtt-Dashboard/bin/Release/LitJson.dll delete mode 100644 Mqtt-Dashboard/bin/Release/sensor.ini delete mode 100644 Mqtt-Dashboard/bin/Release/settings.ini delete mode 100644 Mqtt-Dashboard/bin/Release/tracings.ini diff --git a/Mqtt-Dashboard/Connector/AMqtt.cs b/Mqtt-Dashboard/Connector/AMqtt.cs new file mode 100644 index 0000000..75b9b79 --- /dev/null +++ b/Mqtt-Dashboard/Connector/AMqtt.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; + +namespace Dashboard.Connector { + abstract class AMqtt { + + 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); + Type t = null; + try { + t = Type.GetType(object_sensor, true); + } catch (TypeLoadException) { + throw new ArgumentException("settings.ini: " + dictionary["type"] + " is not a Connector"); + } + Instance = (AMqtt)t.GetConstructor(new Type[] { typeof(Dictionary) }).Invoke(new Object[] { dictionary }); + } + + public abstract void Send(String topic, String data); + + public abstract void Dispose(); + + public static AMqtt Instance { get; private set; } + } + public class MqttEventArgs : EventArgs { + public MqttEventArgs() : base() { } + public MqttEventArgs(String message, String topic) { + this.Topic = topic; + this.Message = message; + this.Date = DateTime.Now; + } + + public String Topic { get; private set; } + public String Message { get; private set; } + public DateTime Date { get; private set; } + } +} diff --git a/Mqtt-Dashboard/Connector/Mosquitto.cs b/Mqtt-Dashboard/Connector/Mosquitto.cs new file mode 100644 index 0000000..75edd61 --- /dev/null +++ b/Mqtt-Dashboard/Connector/Mosquitto.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text.RegularExpressions; + +namespace Dashboard.Connector { + class Mosquitto : AMqtt, IDisposable { + private Process p; + private String message; + + public override event MqttMessage MessageIncomming; + public override event MqttMessage MessageSending; + + public Mosquitto(Dictionary settings) { + //mosquitto_sub --cafile ca.pem --cert cert.pem --key cert.key -h swb.broker.flex4grid.eu -p 8883 -t /# -v + this.message = ""; + this.p = new Process(); + this.p.StartInfo.FileName = "mosquitto_sub.exe"; + String args = "-h " + settings["server"]+" "; + if(settings.ContainsKey("port")) { + args += "-p "+ settings["port"]+" "; + } + if (settings.ContainsKey("cafile")) { + args += "--cafile " + settings["cafile"] + " "; + } + if (settings.ContainsKey("cert")) { + args += "--cert " + settings["cert"] + " "; + } + if (settings.ContainsKey("key")) { + args += "--key " + settings["key"] + " "; + } + this.p.StartInfo.Arguments = args+"-t /# -v -d"; + this.p.StartInfo.CreateNoWindow = true; + this.p.StartInfo.UseShellExecute = false; + this.p.StartInfo.RedirectStandardOutput = true; + this.p.StartInfo.RedirectStandardError = true; + this.p.OutputDataReceived += this.P_OutputDataReceived; + this.p.ErrorDataReceived += this.P_ErrorDataReceived; + this.p.Start(); + this.p.BeginOutputReadLine(); + } + + public override void Send(String topic, String data) { + MessageSending?.Invoke(this, new MqttEventArgs(data, topic)); + } + + private void P_ErrorDataReceived(Object sender, DataReceivedEventArgs e) { + if (e.Data != null) { + throw new NotImplementedException(e.Data); + } + } + + private void P_OutputDataReceived(Object sender, DataReceivedEventArgs e) { + if (e.Data != null) { + if (e.Data.StartsWith("Client mosqsub")) { + if (this.message != "" && this.message.IndexOf(" received PUBLISH ") > 0) { + MatchCollection matches = (new Regex("^Client mosqsub\\|.*received PUBLISH \\(.*,.*,.*,.*, '(.*)'.*\\)\\)\n[^ ]* (.*)$", RegexOptions.IgnoreCase | RegexOptions.Singleline)).Matches(this.message); + String topic = matches[0].Groups[1].Value; + String message = matches[0].Groups[2].Value.Trim(); + this.MessageIncomming?.Invoke(this, new MqttEventArgs(message, topic)); + } + this.message = e.Data + "\n"; + } else { + this.message += e.Data + "\n"; + } + } + } + + #region IDisposable Support + private Boolean disposedValue = false; // Dient zur Erkennung redundanter Aufrufe. + + protected virtual void Dispose(Boolean disposing) { + if (!this.disposedValue) { + if (disposing) { + this.p.CancelOutputRead(); + if (!this.p.HasExited) { + this.p.Kill(); + } + this.p.Close(); + } + this.p = null; + this.disposedValue = true; + } + } + + ~Mosquitto() { + Dispose(false); + } + + public override void Dispose() { + Dispose(true); + GC.SuppressFinalize(this); + } + #endregion + } +} diff --git a/Mqtt-Dashboard/Connector/Mqtt.cs b/Mqtt-Dashboard/Connector/Mqtt.cs index f0e0dcf..aee2979 100644 --- a/Mqtt-Dashboard/Connector/Mqtt.cs +++ b/Mqtt-Dashboard/Connector/Mqtt.cs @@ -1,31 +1,26 @@ using System; +using System.Collections.Generic; using System.Text; using BlubbFish.Utils; using uPLibrary.Networking.M2Mqtt; using uPLibrary.Networking.M2Mqtt.Messages; namespace Dashboard.Connector { - class Mqtt : IDisposable { - private static Mqtt instance; + class Mqtt : AMqtt, IDisposable { private MqttClient client; - public delegate void MqttMessage(Object sender, MqttMsgPublishEventArgs e); + public override event MqttMessage MessageIncomming; + public override event MqttMessage MessageSending; - public event MqttMessage MessageIncomming; - public event MqttMessage MessageSending; - - private Mqtt() { - this.client = new MqttClient(InIReader.GetInstance("settings.ini").GetValue("general", "mqtt-server")); + public Mqtt(Dictionary settings) { + if(settings.ContainsKey("port")) { + this.client = new MqttClient(settings["server"], Int32.Parse(settings["port"]), false, null, null, MqttSslProtocols.None); + } else { + this.client = new MqttClient(settings["server"]); + } Connect(); } - public static Mqtt Instance { - get { - if(instance == null) { - instance = new Mqtt(); - } - return instance; - } - } + private void Connect() { this.client.MqttMsgPublishReceived += this.Client_MqttMsgPublishReceived; this.client.Connect(Guid.NewGuid().ToString()); @@ -33,18 +28,21 @@ namespace Dashboard.Connector { } private void Client_MqttMsgPublishReceived(Object sender, MqttMsgPublishEventArgs e) { - this.MessageIncomming?.Invoke(this, e); + this.MessageIncomming?.Invoke(this, new MqttEventArgs(Encoding.UTF8.GetString(e.Message), e.Topic)); } - public void Send(String topic, String data) { + public override void Send(String topic, String data) { this.client.Publish(topic, Encoding.UTF8.GetBytes(data)); - this.MessageSending?.Invoke(this, new MqttMsgPublishEventArgs(topic, Encoding.UTF8.GetBytes(data), false, 0, false)); + this.MessageSending?.Invoke(this, new MqttEventArgs(data, topic)); } #region IDisposable Support - private bool disposedValue = false; - protected virtual void Dispose(bool disposing) { - if(!disposedValue) { + private Boolean disposedValue = false; + + + + protected virtual void Dispose(Boolean disposing) { + if(!this.disposedValue) { if(disposing) { this.client.MqttMsgPublishReceived -= this.Client_MqttMsgPublishReceived; this.client.Unsubscribe(new String[] { "#" }); @@ -53,13 +51,13 @@ namespace Dashboard.Connector { this.client = null; - disposedValue = true; + this.disposedValue = true; } } ~Mqtt() { Dispose(false); } - public void Dispose() { + public override void Dispose() { Dispose(true); GC.SuppressFinalize(this); } diff --git a/Mqtt-Dashboard/Dashboard.csproj b/Mqtt-Dashboard/Dashboard.csproj index 7a8bf7a..c6628d1 100644 --- a/Mqtt-Dashboard/Dashboard.csproj +++ b/Mqtt-Dashboard/Dashboard.csproj @@ -25,13 +25,16 @@ AnyCPU pdbonly - true + false bin\Release\ - TRACE + DEBUG;TRACE prompt 4 + + ..\packages\LitJson.0.9.0\lib\LitJson.dll + ..\packages\M2Mqtt.4.3.0.0\lib\net45\M2Mqtt.Net.dll @@ -49,6 +52,8 @@ + + Form @@ -59,11 +64,9 @@ - + - - diff --git a/Mqtt-Dashboard/Form1.cs b/Mqtt-Dashboard/Form1.cs index d6e23b7..aff0be1 100644 --- a/Mqtt-Dashboard/Form1.cs +++ b/Mqtt-Dashboard/Form1.cs @@ -1,32 +1,26 @@ using System; -using System.Text; +using System.Collections.Generic; using System.Windows.Forms; +using BlubbFish.Utils; using Dashboard.Connector; using Dashboard.Sensor; using Dashboard.Tracings; -using BlubbFish.Utils; -using System.Collections.Generic; -using System.Threading; namespace Dashboard { public partial class Dashboard : Form { private Dictionary sensors = new Dictionary(); - private Thread updateThread; public Dashboard() { InitializeComponent(); - Mqtt.Instance.Connect(); + AMqtt.SetInstance(InIReader.GetInstance("settings.ini").GetSection("mqtt")); this.GenerateSensors(); this.GenerateForms(); - this.updateThread = new Thread(this.SensorPolling); - this.updateThread.Start(); - this.FormClosed += this.Dashboard_FormClosed; this.SizeChanged += this.Dashboard_SizeChanged; - - Mqtt.Instance.MessageIncomming += this.Instance_MessageIncomming; + + AMqtt.Instance.MessageIncomming += this.Instance_MessageIncomming; } private void Dashboard_SizeChanged(Object sender, EventArgs e) { @@ -40,6 +34,7 @@ namespace Dashboard { this.sensors.Add(sensor.ToLower().Substring(1, sensor.Length - 2), ASensor.GetInstance(ini.GetValue(sensor, "type").ToLower(), ini.GetSection(sensor))); } } + private void GenerateForms() { InIReader ini = InIReader.GetInstance("tracings.ini"); List tracingini = ini.GetSections(); @@ -47,27 +42,21 @@ namespace Dashboard { this.flowLayoutPanel2.Controls.Add(ATracings.GetInstance(ini.GetValue(tracing, "type").ToLower(), this.sensors[ini.GetValue(tracing, "sensor").ToLower()], ini.GetSection(tracing)).GetPanel()); } } - private void SensorPolling() { - while(true) { - Thread.Sleep(1000); - foreach(KeyValuePair sensor in this.sensors) { - sensor.Value.Poll(); - } - } - } + private void Dashboard_FormClosed(Object sender, FormClosedEventArgs e) { this.Dispose(); } private new void Dispose() { - this.updateThread.Abort(); - while (this.updateThread.ThreadState != ThreadState.Aborted) { } + foreach (KeyValuePair item in this.sensors) { + item.Value.Dispose(); + } this.sensors.Clear(); - Mqtt.Instance.MessageIncomming -= this.Instance_MessageIncomming; - Mqtt.Instance.Dispose(); + AMqtt.Instance.MessageIncomming -= this.Instance_MessageIncomming; + AMqtt.Instance.Dispose(); this.Dispose(true); } - private void Instance_MessageIncomming(Object sender, uPLibrary.Networking.M2Mqtt.Messages.MqttMsgPublishEventArgs e) { - System.Diagnostics.Debug.WriteLine("Received = " + Encoding.UTF8.GetString(e.Message) + " on topic " + e.Topic+" at "+DateTime.Now.ToUniversalTime()); + private void Instance_MessageIncomming(Object sender, MqttEventArgs e) { + System.Diagnostics.Debug.WriteLine("Received = " + e.Message + " on topic " + e.Topic+" at "+DateTime.Now.ToUniversalTime()); } } } diff --git a/Mqtt-Dashboard/Sensor/ASensor.cs b/Mqtt-Dashboard/Sensor/ASensor.cs index e5b9aa4..1f7b252 100644 --- a/Mqtt-Dashboard/Sensor/ASensor.cs +++ b/Mqtt-Dashboard/Sensor/ASensor.cs @@ -1,6 +1,5 @@ using Dashboard.Connector; using System; -using uPLibrary.Networking.M2Mqtt.Messages; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -20,7 +19,7 @@ namespace Dashboard.Sensor { this.Polling = (settings.Keys.Contains("polling")) ? Int32.Parse(settings["polling"]) : 60; this.pollcount = this.Polling; this.settings = settings; - Mqtt.Instance.MessageIncomming += this.IncommingMqttMessage; + AMqtt.Instance.MessageIncomming += this.IncommingMqttMessage; this.updateThread = new Thread(this.SensorPolling); this.updateThread.Start(); } @@ -32,37 +31,38 @@ namespace Dashboard.Sensor { } } - private void IncommingMqttMessage(Object sender, MqttMsgPublishEventArgs e) { + private void IncommingMqttMessage(Object sender, MqttEventArgs e) { if(e.Topic == this.topic) { - this.UpdateValue(e); - this.Timestamp = DateTime.Now; - this.Update?.Invoke(this, e); + if (this.UpdateValue(e)) { + this.Timestamp = DateTime.Now; + this.Update?.Invoke(this, e); + } } } internal static ASensor GetInstance(String v, Dictionary dictionary) { - string object_sensor = "Dashboard.Sensor." + char.ToUpper(v[0]) + v.Substring(1); + String object_sensor = "Dashboard.Sensor." + Char.ToUpper(v[0]) + v.Substring(1); Type t = null; try { t = Type.GetType(object_sensor, true); } catch(TypeLoadException) { throw new ArgumentException("sensor.ini: " + v + " is not a Sensor"); } - return (ASensor)t.GetConstructor(new Type[] { typeof(Dictionary) }).Invoke(new object[] { dictionary }); + return (ASensor)t.GetConstructor(new Type[] { typeof(Dictionary) }).Invoke(new Object[] { dictionary }); } private void Poll() { if(this.pollcount++ >= this.Polling) { this.pollcount = 1; - Mqtt.Instance.Send(this.topic + "/status",""); + AMqtt.Instance.Send(this.topic + "/status",""); } } internal virtual void SetBool(Boolean v) { - Mqtt.Instance.Send(this.topic + "/set", v ? "on" : "off"); + AMqtt.Instance.Send(this.topic + "/set", v ? "on" : "off"); } - protected abstract void UpdateValue(MqttMsgPublishEventArgs e); + protected abstract Boolean UpdateValue(MqttEventArgs e); public Single GetFloat { get; protected set; } public Boolean GetBool { get; protected set; } @@ -79,17 +79,17 @@ namespace Dashboard.Sensor { public event UpdatedValue Update; #region IDisposable Support - private bool disposedValue = false; - protected virtual void Dispose(bool disposing) { - if(!disposedValue) { + private Boolean disposedValue = false; + protected virtual void Dispose(Boolean disposing) { + if(!this.disposedValue) { if(disposing) { this.updateThread.Abort(); while(this.updateThread.ThreadState != ThreadState.Aborted) { } - Mqtt.Instance.MessageIncomming -= this.IncommingMqttMessage; + AMqtt.Instance.MessageIncomming -= this.IncommingMqttMessage; } this.settings = null; this.updateThread = null; - disposedValue = true; + this.disposedValue = true; } } ~ASensor() { diff --git a/Mqtt-Dashboard/Sensor/Flex4gridPower.cs b/Mqtt-Dashboard/Sensor/Flex4gridPower.cs new file mode 100644 index 0000000..ac52449 --- /dev/null +++ b/Mqtt-Dashboard/Sensor/Flex4gridPower.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using Dashboard.Connector; +using LitJson; + +namespace Dashboard.Sensor { + class Flex4gridpower : ASensor { + private String id; + + public Flex4gridpower(Dictionary settings) : base(settings) { + this.GetBool = true; + this.GetFloat = 0.0f; + this.GetInt = 0; + this.Datatypes = Types.Float; + this.id = settings["id"]; + } + + protected override Boolean UpdateValue(MqttEventArgs e) { + CultureInfo info = new CultureInfo("de-DE"); + info.NumberFormat.NumberDecimalSeparator = "."; + CultureInfo.DefaultThreadCurrentCulture = info; + CultureInfo.DefaultThreadCurrentUICulture = info; + System.Threading.Thread.CurrentThread.CurrentCulture = info; + System.Threading.Thread.CurrentThread.CurrentUICulture = info; + try { + JsonData data = JsonMapper.ToObject(e.Message); + if(data["id"].ToString() == this.id) { + this.GetFloat = Single.Parse(data["power"].ToString()); + return true; + } + } catch (Exception) { + } + return false; + } + } +} diff --git a/Mqtt-Dashboard/Sensor/Power.cs b/Mqtt-Dashboard/Sensor/Power.cs index a07d8c8..54bcc6e 100644 --- a/Mqtt-Dashboard/Sensor/Power.cs +++ b/Mqtt-Dashboard/Sensor/Power.cs @@ -1,8 +1,7 @@ using System; using System.Collections.Generic; using System.Globalization; -using System.Text; -using uPLibrary.Networking.M2Mqtt.Messages; +using Dashboard.Connector; namespace Dashboard.Sensor { class Power : ASensor { @@ -13,8 +12,9 @@ namespace Dashboard.Sensor { this.Datatypes = Types.Float; } - protected override void UpdateValue(MqttMsgPublishEventArgs e) { - this.GetFloat = Single.Parse(Encoding.UTF8.GetString(e.Message), new CultureInfo("en-US")); + protected override Boolean UpdateValue(MqttEventArgs e) { + this.GetFloat = Single.Parse(e.Message, new CultureInfo("en-US")); + return true; } } } diff --git a/Mqtt-Dashboard/Sensor/Switch.cs b/Mqtt-Dashboard/Sensor/Switch.cs index 3452d5d..1261579 100644 --- a/Mqtt-Dashboard/Sensor/Switch.cs +++ b/Mqtt-Dashboard/Sensor/Switch.cs @@ -1,6 +1,6 @@ -using System.Collections.Generic; -using System.Text; -using uPLibrary.Networking.M2Mqtt.Messages; +using System; +using System.Collections.Generic; +using Dashboard.Connector; namespace Dashboard.Sensor { class Switch : ASensor { @@ -8,8 +8,9 @@ namespace Dashboard.Sensor { this.Datatypes = Types.Bool; } - protected override void UpdateValue(MqttMsgPublishEventArgs e) { - this.GetBool = (Encoding.UTF8.GetString(e.Message).ToLower() == "on") ? true : false; + protected override Boolean UpdateValue(MqttEventArgs e) { + this.GetBool = (e.Message.ToLower() == "on") ? true : false; + return true; } } } \ No newline at end of file diff --git a/Mqtt-Dashboard/Tracings/ATracings.cs b/Mqtt-Dashboard/Tracings/ATracings.cs index 00cff63..95a68e7 100644 --- a/Mqtt-Dashboard/Tracings/ATracings.cs +++ b/Mqtt-Dashboard/Tracings/ATracings.cs @@ -16,14 +16,14 @@ namespace Dashboard.Tracings { protected abstract void SensorUpdate(Object sender, EventArgs e); public abstract Panel GetPanel(); internal static ATracings GetInstance(String v, ASensor aSensor, Dictionary dictionary) { - string object_sensor = "Dashboard.Tracings." + char.ToUpper(v[0]) + v.Substring(1); + String object_sensor = "Dashboard.Tracings." + Char.ToUpper(v[0]) + v.Substring(1); Type t = null; try { t = Type.GetType(object_sensor, true); } catch(TypeLoadException) { throw new ArgumentException("tracings.ini: " + v + " is not a Tracing"); } - return (ATracings)t.GetConstructor(new Type[] { typeof(ASensor), typeof(Dictionary) }).Invoke(new object[] { aSensor, dictionary }); + return (ATracings)t.GetConstructor(new Type[] { typeof(ASensor), typeof(Dictionary) }).Invoke(new Object[] { aSensor, dictionary }); } } } \ No newline at end of file diff --git a/Mqtt-Dashboard/Tracings/Graph.cs b/Mqtt-Dashboard/Tracings/Graph.cs index a52bcaa..0a0c855 100644 --- a/Mqtt-Dashboard/Tracings/Graph.cs +++ b/Mqtt-Dashboard/Tracings/Graph.cs @@ -14,12 +14,12 @@ namespace Dashboard.Tracings { public Graph(ASensor sensor, Dictionary settings) : base(sensor, settings) { this.Chart_Items = (settings.Keys.Contains("items")) ? Int32.Parse(settings["items"]) : 1000; + this.chart = new Chart(); } public override Panel GetPanel() { Panel panel = new Panel(); - this.chart = new Chart(); ChartArea chartArea = new ChartArea(); chartArea.AxisX.LabelStyle.Enabled = false; chartArea.AxisX.LineColor = System.Drawing.Color.Gainsboro; diff --git a/Mqtt-Dashboard/bin/Release/Dashboard.exe b/Mqtt-Dashboard/bin/Release/Dashboard.exe index a57b537e8a601789a69ebf7c7c9bd192fbb6140a..407abd6e1775eaee9412f08c7b1da4115b039b94 100644 GIT binary patch literal 28160 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 literal 0 HcmV?d00001 diff --git a/Mqtt-Dashboard/bin/Release/Utils.dll b/Mqtt-Dashboard/bin/Release/Utils.dll index d2e7e9cbfca3b446152980f6657cf759e2e60154..9647ff5de5e38dc5b5cc091289b2ae828289af75 100644 GIT binary patch delta 1561 zcmZA1drVtZ90&04xwog>mQsqO1|1rSgh%OUc?bn%!3hXyl{uaz1kj)vQ7A8$5to!J zSd7kSDRCNOCD~>+U5KVjB#Tp~_)3V*#B64|Wr@o|OcqJ>4<8u(-E$9Q@g{Bhx!>RU zopT>O(<^Lxg}wHoIyiMc{_KSz| zF|$i)M|lB`3F(+%Rutn0sS6o~E_lt#llFj84DW7JDUt`e&?- zoAa;3ic;(mGW(aJS16_}X-Qs+1*vl+AJ(LX)Fk)A;uDvkO_9p*fYd~Kl9yvrN+(s| zv{VJD64#@W4-)S~uHS64>`3w|v`c+Os>TtiI87hGs#KCxgH2O-NjuJKaiC0G5@xgy zcpVPysDam`s$68^avShrLE??VqG(8*jA_qiF7pP=O2tTx_*m*a_6cvoA5v#Y52Luk zXr_y1%_tKxp2I3{MvG7ky_s%$kte0X>EG}cJX2|mi($}aMG)7bf;wvH5d<+?Wrmme z_dJLng>sXisx2@#@%f!LpRxUz-;oRLcvlYG%R{UKOG3I9IH4 zo%mX41`2bb3s;5AcdVNp0TOk^>CsA4GB@BlY z!(sFwTga%q$$L<4N;|<%vOd&GE%7k#!$VRp*h8!z!FI`cy9@o;)^}=%4WL(MKdCO- z4xZc|XnT}Dj$x@+ZEd7OLSN!3EySL{Mq-zzF?zUmd+|BeVQiYxj#@%&1eW`aOxG4I zE{q^UD5ee5k|J=+Y>HMC!QC>uMB_$LAhYW^*k*)bE9@BX6e8bZYE2uiUAPQBB70d*XSwD}jTl8(r5}%GvX`s&rSSvig2w Haevx><_0cY delta 1456 zcmX}s4`>@z90&04yX#9X*)6@gR>JI{b+sjJ)+TM&e@vLt&emjhuC7h0wAIy#u&teK z(a9hU?b0!;F1xXbxGac59b-&xU>TiM?Gzc-Dbm4YqO8t8Fjqu$&Oh^a@1A{dkk9+R z-+M3bjyF2XMrYZf18U~RE9sZkFkkweF5k=u&<<*&z_6MwUZrONojg7a6q?0K(2TP( zmTx9mB5#QX+pU!z1suASr{sCr>t;wV@(uL@-f~J-g;eyJ;oN%bl78EtxYzDO3Lki1 z=4%m^ns;wxC771F>^{az@py$jGKnGPLI9IemsZ+35Oijl@-`>|EJ|6Vax|{9vpII0 z7oY-dLf1(y1QGKIrv2*5Djr0?*;QJf*eUvsYLjYhP7p6RBd`ElM}$&1tlv?Bn35VJ zt;2glA$q!76*fl$IpbpkJznREsyH9w4p9S5nh@hSxz4Idz|q>d_q9>9v32b zEg_gh6P)*$LgS9v@9jx^PC zjc-AbP*U@Gu95;Wn_v@o6yb)1m{dE$3W!b1(|pLb;^Ac(cnm$V@IfAB+pt3@sYSSf zZ5WW*5~8dV&&%vj80f^P&=?eEpbJNZoX;wTcT2IF*0=wK3o*PYhpxttJccvoiNHOH z8QE8ZJ4zgLQVjdhjf+Bd^$p&QpB-s$^C{MYU!_j-IPbw!oR)UjYoHgp z)aPoH^&wyCYt=v>)|5-`_dLR%#C=k)dOAoUp^vdci?XLMWo|ETNz^v||04XZT{!DV zJC+k=yD=k_)Ur7ScH@G~cF~pw@R`i^(v}9WAhXLo937?a*VBGvO3TTV^SdJ4Bc^R%_Iz26~( zvz@@!j^>W}7r!qHTt67en(mVW)|RmKcc;egT9lWkUG=a1yC_|Jx3V;1RmQ$$=3rN= T + \ No newline at end of file diff --git a/Mqtt-Dashboard/settings.ini.example b/Mqtt-Dashboard/settings.ini.example index d392063..189a9ee 100644 --- a/Mqtt-Dashboard/settings.ini.example +++ b/Mqtt-Dashboard/settings.ini.example @@ -1,2 +1,3 @@ -[general] -mqtt-server=localhost \ No newline at end of file +[mqtt] +type=mqtt +server=localhost \ No newline at end of file