diff --git a/.gitignore b/.gitignore
index 1bbf276..a45e573 100644
--- a/.gitignore
+++ b/.gitignore
@@ -163,3 +163,27 @@
/Utils/IoT/Connector/Data/Mosquitto/bin/Debug
/Utils/IoT/Connector/Data/Mosquitto/bin/Release/ConnectorDataMosquitto.pdb
/Utils/IoT/Connector/Data/Mosquitto/bin/Release/Utils-IoT.pdb
+/BosmonMqtt
+/House-Dashboard/.vs/House-Dashboard/v15
+/House-Dashboard/House-Dashboard/bin/Debug
+/House-Dashboard/House-Dashboard/bin/Sample
+/House-Dashboard/House-Dashboard/obj/Debug
+/Zway/packages/LitJson.0.9.0
+*.pdb
+/Utils/IoT/Connector/Data/Mqtt/.vs/ConnectorDataMqtt/v15
+/Librarys/litjson/.vs/litjson/v15
+/Librarys/litjson/litjson/bin/Debug
+/Librarys/litjson/litjson/obj
+/Librarys/mqtt/.vs/M2Mqtt/v15
+/Librarys/mqtt/M2Mqtt/.vs/M2Mqtt/v15
+/Librarys/mqtt/M2Mqtt/bin/Debug
+/Librarys/mqtt/M2Mqtt/obj
+/Hue-Bot/.vs
+/Hue-Bot/Hue-Bot/bin/Debug
+/Hue-Bot/Hue-Bot/obj
+/Hue/.vs/Hue/v15
+/Hue/Hue/bin/Debug
+/Hue/Hue/obj
+/Hue-Bot/Hue-Bot/bin/mqtt.ini
+/Hue-Bot/Hue-Bot/bin/settings.ini
+/House-Dashboard/packages
diff --git a/House-Dashboard/House-Dashboard.sln b/House-Dashboard/House-Dashboard.sln
new file mode 100644
index 0000000..b36a61b
--- /dev/null
+++ b/House-Dashboard/House-Dashboard.sln
@@ -0,0 +1,43 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27004.2010
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "House-Dashboard", "House-Dashboard\House-Dashboard.csproj", "{D1D4B67E-7BEB-4EDB-9D40-E29F0BE078C4}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils-IoT", "..\Utils\IoT\Utils-IoT.csproj", "{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConnectorDataMqtt", "..\Utils\IoT\Connector\Data\Mqtt\ConnectorDataMqtt.csproj", "{EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils", "..\Utils\Utils\Utils.csproj", "{FAC8CE64-BF13-4ECE-8097-AEB5DD060098}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {D1D4B67E-7BEB-4EDB-9D40-E29F0BE078C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D1D4B67E-7BEB-4EDB-9D40-E29F0BE078C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D1D4B67E-7BEB-4EDB-9D40-E29F0BE078C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D1D4B67E-7BEB-4EDB-9D40-E29F0BE078C4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {85D9EA74-4174-4FF9-A623-EB89DE84C01D}
+ EndGlobalSection
+EndGlobal
diff --git a/House-Dashboard/House-Dashboard/App.config b/House-Dashboard/House-Dashboard/App.config
new file mode 100644
index 0000000..8fc0551
--- /dev/null
+++ b/House-Dashboard/House-Dashboard/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/House-Dashboard/House-Dashboard/App.xaml b/House-Dashboard/House-Dashboard/App.xaml
new file mode 100644
index 0000000..5d1ddfd
--- /dev/null
+++ b/House-Dashboard/House-Dashboard/App.xaml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/House-Dashboard/House-Dashboard/App.xaml.cs b/House-Dashboard/House-Dashboard/App.xaml.cs
new file mode 100644
index 0000000..3d94e33
--- /dev/null
+++ b/House-Dashboard/House-Dashboard/App.xaml.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace House_Dashboard {
+ ///
+ /// Interaktionslogik für "App.xaml"
+ ///
+ public partial class App : Application {
+ }
+}
diff --git a/House-Dashboard/House-Dashboard/Functions/Tabs.cs b/House-Dashboard/House-Dashboard/Functions/Tabs.cs
new file mode 100644
index 0000000..ee7dded
--- /dev/null
+++ b/House-Dashboard/House-Dashboard/Functions/Tabs.cs
@@ -0,0 +1,85 @@
+using System;
+using System.Net.Cache;
+using System.Windows.Controls;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using BlubbFish.House.Dashboard.Graphics;
+using BlubbFish.Utils;
+using BlubbFish.Utils.IoT.Connector;
+
+namespace BlubbFish.House.Dashboard.Functions {
+ class Tabs {
+ private InIReader ini;
+ private ADataBackend data;
+ private TabItem tab;
+
+ public Tabs(InIReader settings, ADataBackend data) {
+ this.ini = settings;
+ this.data = data;
+ }
+
+ internal TabItem GetTab() {
+ this.tab = new TabItem();
+ this.GenerateHeader();
+ this.GenerateContent();
+ return this.tab;
+ }
+
+ private void GenerateContent() {
+ Grid g = new Grid {
+ Background = new BrushConverter().ConvertFromString("#FFE5E5E5") as SolidColorBrush
+ };
+ if (this.ini.GetValue("general", "background-image") != null) {
+ BitmapImage bitmap = new BitmapImage();
+ bitmap.BeginInit();
+ bitmap.CacheOption = BitmapCacheOption.None;
+ bitmap.UriCachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache);
+ bitmap.CacheOption = BitmapCacheOption.OnLoad;
+ bitmap.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
+ bitmap.UriSource = new Uri(this.ini.GetValue("general", "background-image"), UriKind.RelativeOrAbsolute);
+ bitmap.EndInit();
+ Image bgimage = new Image {
+ Source = bitmap
+ };
+ g.Children.Add(bgimage);
+ }
+ foreach (String item in this.ini.GetSections(false)) {
+ if(item != "general") {
+ AGraphics a = AGraphics.GetInstance(this.ini.GetSection(item), this.data);
+ if (a != null) {
+ g.Children.Add(a.Draw());
+ }
+ }
+ }
+ this.tab.Content = g;
+ }
+
+ private void GenerateHeader() {
+ StackPanel header = new StackPanel {
+ Orientation = Orientation.Horizontal
+ };
+ if (this.ini.GetValue("general", "icon") != null) {
+ BitmapImage bitmap = new BitmapImage();
+ bitmap.BeginInit();
+ bitmap.CacheOption = BitmapCacheOption.None;
+ bitmap.UriCachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache);
+ bitmap.CacheOption = BitmapCacheOption.OnLoad;
+ bitmap.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
+ bitmap.UriSource = new Uri(this.ini.GetValue("general", "icon"), UriKind.RelativeOrAbsolute);
+ bitmap.EndInit();
+ Image image = new Image {
+ Source = bitmap
+ };
+ header.Children.Add(image);
+ }
+ if (this.ini.GetValue("general", "name") != null) {
+ TextBlock t = new TextBlock {
+ Text = this.ini.GetValue("general", "name"),
+ FontSize = 20
+ };
+ header.Children.Add(t);
+ }
+ this.tab.Header = header;
+ }
+ }
+}
diff --git a/House-Dashboard/House-Dashboard/Functions/Workload.cs b/House-Dashboard/House-Dashboard/Functions/Workload.cs
new file mode 100644
index 0000000..2dd24bc
--- /dev/null
+++ b/House-Dashboard/House-Dashboard/Functions/Workload.cs
@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using BlubbFish.Utils.IoT.Connector;
+
+namespace BlubbFish.House.Dashboard.Functions {
+ class Workload {
+ private SortedDictionary list = new SortedDictionary();
+
+ public delegate void WorkloadEvent(Object sender, EventArgs e);
+ public event WorkloadEvent Update;
+
+ public Int32 Maximum { get; private set; }
+ public Int32 Now { get; private set; }
+
+ internal void SetMessage(MqttEventArgs e) {
+ DateTime d = DateTime.Now;
+ if (this.list.ContainsKey(d)) {
+ return;
+ }
+ this.list.Add(d, e);
+ DateTime old = DateTime.Now.AddSeconds(-30);
+ List remove = new List();
+ foreach (KeyValuePair item in this.list) {
+ if(item.Key < old) {
+ remove.Add(item.Key);
+ }
+ }
+ foreach (DateTime item in remove) {
+ this.list.Remove(item);
+ }
+ if(this.list.Count > this.Maximum) {
+ this.Maximum = this.list.Count;
+ }
+ this.Now = this.list.Count;
+ this.Update?.Invoke(this, null);
+ }
+ }
+}
diff --git a/House-Dashboard/House-Dashboard/Graphics/AGraphics.cs b/House-Dashboard/House-Dashboard/Graphics/AGraphics.cs
new file mode 100644
index 0000000..0fc429c
--- /dev/null
+++ b/House-Dashboard/House-Dashboard/Graphics/AGraphics.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Controls;
+using BlubbFish.Utils.IoT.Connector;
+
+namespace BlubbFish.House.Dashboard.Graphics {
+ abstract class AGraphics {
+ protected ADataBackend data;
+ protected Dictionary settings;
+
+ protected AGraphics(Dictionary settings, ADataBackend data) {
+ this.data = data;
+ this.settings = settings;
+ }
+
+ internal static AGraphics GetInstance(Dictionary settings, ADataBackend data) {
+ if(!settings.ContainsKey("graphic")) {
+ return null;
+ }
+ String object_sensor = "BlubbFish.House.Dashboard.Graphics." + settings["graphic"].ToUpperLower();
+ Type t = null;
+ try {
+ t = Type.GetType(object_sensor, true);
+ } catch (TypeLoadException) {
+ throw new ArgumentException("tracings.ini: " + settings["graphic"].ToUpperLower() + " is not a Tracing");
+ }
+ return (AGraphics)t.GetConstructor(new Type[] { typeof(Dictionary), typeof(ADataBackend) }).Invoke(new Object[] { settings, data });
+ }
+
+ public abstract Grid Draw();
+ }
+}
diff --git a/House-Dashboard/House-Dashboard/Graphics/Heater.cs b/House-Dashboard/House-Dashboard/Graphics/Heater.cs
new file mode 100644
index 0000000..40ae2fb
--- /dev/null
+++ b/House-Dashboard/House-Dashboard/Graphics/Heater.cs
@@ -0,0 +1,206 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+using BlubbFish.Utils.IoT.Connector;
+using LitJson;
+
+namespace BlubbFish.House.Dashboard.Graphics {
+ class Heater : AGraphics {
+ private TextBlock targetTemp;
+ private Dictionary targetTemps = new Dictionary();
+ private TextBlock mode;
+ private TextBlock now;
+ private String topic;
+ private Dictionary modes = new Dictionary();
+ private Int32 activemode = -1;
+ private Dictionary replace = new Dictionary {
+ { "Heat", "Heizen" },
+ { "Energy Save Heat", "Nacht" }
+ };
+
+ public Heater(Dictionary settings, ADataBackend data) : base(settings, data) {
+ this.targetTemp = new TextBlock {
+ Text = "0 °C"
+ };
+ this.mode = new TextBlock {
+ Text = "Mode"
+ };
+ this.now = new TextBlock {
+ Text = "0 °C"
+ };
+ if(this.settings.ContainsKey("topic")) {
+ this.topic = this.settings["topic"];
+ this.data.MessageIncomming += this.Data_MessageIncomming;
+ this.data.Send(this.topic + "/0/49/1/get", "");
+ this.data.Send(this.topic + "/0/64/get", "");
+ this.data.Send(this.topic + "/0/67/1/get", "");
+ this.data.Send(this.topic + "/0/67/11/get", "");
+ }
+ }
+
+ private void Data_MessageIncomming(Object sender, MqttEventArgs e) {
+ if (e.Topic.StartsWith(this.topic)) {
+ try {
+ JsonData j = JsonMapper.ToObject(e.Message);
+ if (e.Topic == this.topic + "/0/49/1") {
+ if (j.Keys.Contains("Level")) {
+ if (Double.TryParse(j["Level"].ToString(), out Double level)) {
+ this.now.Dispatcher.BeginInvoke((Action)(() => {
+ this.now.Text = level.ToString() + " °C";
+ }));
+ }
+ }
+ }
+ if (e.Topic == this.topic + "/0/64") {
+ if (j.Keys.Contains("ValidModes") && j["ValidModes"].IsObject && this.modes.Count == 0) {
+ foreach (String item in j["ValidModes"].Keys) {
+ if (Int32.TryParse(item, out Int32 jvmode)) {
+ this.modes.Add(jvmode, j["ValidModes"][item].ToString());
+ }
+ }
+ }
+ if (j.Keys.Contains("Level")) {
+ if (Int32.TryParse(j["Level"].ToString(), out Int32 jmode) && this.modes.ContainsKey(jmode)) {
+ this.activemode = jmode;
+ String text = this.modes[jmode];
+ if (this.replace.ContainsKey(text)) {
+ text = this.replace[text];
+ }
+ this.now.Dispatcher.BeginInvoke((Action)(() => {
+ this.mode.Text = text;
+ }));
+ this.WriteTargetTemp();
+ }
+ }
+ }
+ if (e.Topic == this.topic + "/0/67/1" || e.Topic == this.topic + "/0/67/11") {
+ if (j.Keys.Contains("Level")) {
+ if (Double.TryParse(j["Level"].ToString(), out Double temp)) {
+ Int32 id = 0;
+ if (e.Topic.EndsWith("/1")) {
+ id = 1;
+ } else if (e.Topic.EndsWith("/11")) {
+ id = 11;
+ }
+ if (this.targetTemps.ContainsKey(id)) {
+ this.targetTemps[id] = temp;
+ } else {
+ this.targetTemps.Add(id, temp);
+ }
+ this.WriteTargetTemp();
+ }
+ }
+ }
+ } catch (Exception) { }
+ }
+ }
+
+ private void WriteTargetTemp() {
+ if (this.targetTemps.ContainsKey(this.activemode)) {
+ this.now.Dispatcher.BeginInvoke((Action)(() => {
+ this.targetTemp.Text = this.targetTemps[this.activemode] + " °C";
+ }));
+ }
+ }
+
+ public override Grid Draw() {
+ Grid outergrid = this.CreateOuterGrid();
+ outergrid.Children.Add(this.CreateInnerGrid());
+ outergrid.Children.Add(this.CreateTextBlock());
+ return outergrid;
+ }
+
+ private TextBlock CreateTextBlock() {
+ //
+ this.now.HorizontalAlignment = HorizontalAlignment.Left;
+ this.now.VerticalAlignment = VerticalAlignment.Top;
+
+ this.now.SetValue(Grid.ColumnProperty, 1);
+ this.now.FontWeight = FontWeights.Bold;
+ this.now.FontSize = 28;
+ this.now.Margin = new Thickness(5,0,10,0);
+ return this.now;
+ }
+
+ private Grid CreateInnerGrid() {
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ Grid grid = new Grid {
+ Height = 45,
+ HorizontalAlignment = HorizontalAlignment.Left,
+ VerticalAlignment = VerticalAlignment.Top,
+ Margin = new Thickness(10, 0, 0, 0)
+ };
+
+ grid.RowDefinitions.Add(new RowDefinition {
+ Height = new GridLength(22)
+ });
+ grid.RowDefinitions.Add(new RowDefinition());
+ this.targetTemp.HorizontalAlignment = HorizontalAlignment.Center;
+ this.targetTemp.VerticalAlignment = VerticalAlignment.Top;
+ this.targetTemp.FontSize = 18;
+ grid.Children.Add(this.targetTemp);
+ this.mode.HorizontalAlignment = HorizontalAlignment.Center;
+ this.mode.VerticalAlignment = VerticalAlignment.Top;
+ this.mode.SetValue(Grid.RowProperty, 1);
+ this.mode.FontSize = 12;
+ grid.Children.Add(this.mode);
+ return grid;
+ }
+
+ private Grid CreateOuterGrid() {
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ Double rotate = 0;
+ if (this.settings.ContainsKey("rotate") && Double.TryParse(this.settings["rotate"], out rotate)) { }
+ Grid grid = new Grid {
+ HorizontalAlignment = HorizontalAlignment.Left,
+ VerticalAlignment = VerticalAlignment.Top,
+ Background = new ImageBrush(Helper.BitmapToImageSource(Properties.Resources.graphics_heater)),
+ RenderTransform = new RotateTransform(rotate)
+ };
+ Thickness thickness = new Thickness();
+ Boolean thicknessSet = false;
+ if (this.settings.ContainsKey("x") && Int32.TryParse(this.settings["x"], out Int32 x)) {
+ thickness.Left = x;
+ thicknessSet = true;
+ }
+ if (this.settings.ContainsKey("y") && Int32.TryParse(this.settings["y"], out Int32 y)) {
+ thickness.Top = y;
+ thicknessSet = true;
+ }
+ if (thicknessSet) {
+ grid.Margin = thickness;
+ }
+ grid.ColumnDefinitions.Add(new ColumnDefinition());
+ grid.ColumnDefinitions.Add(new ColumnDefinition());
+ return grid;
+ }
+ }
+}
diff --git a/House-Dashboard/House-Dashboard/Helper.cs b/House-Dashboard/House-Dashboard/Helper.cs
new file mode 100644
index 0000000..ff22335
--- /dev/null
+++ b/House-Dashboard/House-Dashboard/Helper.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media.Imaging;
+
+namespace BlubbFish.House.Dashboard {
+ static class Helper {
+ internal static String ToUpperLower(this String s) {
+ if (s.Length == 0) {
+ return "";
+ }
+ if (s.Length == 1) {
+ return s.ToUpper();
+ }
+ return s[0].ToString().ToUpper() + s.Substring(1).ToLower();
+ }
+ internal static BitmapImage BitmapToImageSource(Bitmap bitmap) {
+ using (MemoryStream memory = new MemoryStream()) {
+ bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Png);
+ memory.Position = 0;
+ BitmapImage bitmapimage = new BitmapImage();
+ bitmapimage.BeginInit();
+ bitmapimage.StreamSource = memory;
+ bitmapimage.CacheOption = BitmapCacheOption.OnLoad;
+ bitmapimage.EndInit();
+
+ return bitmapimage;
+ }
+ }
+ }
+}
diff --git a/House-Dashboard/House-Dashboard/House-Dashboard.csproj b/House-Dashboard/House-Dashboard/House-Dashboard.csproj
new file mode 100644
index 0000000..ed77177
--- /dev/null
+++ b/House-Dashboard/House-Dashboard/House-Dashboard.csproj
@@ -0,0 +1,126 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {D1D4B67E-7BEB-4EDB-9D40-E29F0BE078C4}
+ WinExe
+ BlubbFish.House.Dashboard
+ Dashboard
+ v4.7.1
+ 512
+ {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ 4
+ true
+
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\packages\LitJson.0.9.0\lib\LitJson.dll
+
+
+
+
+
+
+
+
+
+
+
+ 4.0
+
+
+
+
+
+
+
+ MSBuild:Compile
+ Designer
+
+
+ MSBuild:Compile
+ Designer
+
+
+ App.xaml
+ Code
+
+
+
+
+
+
+
+ MainWindow.xaml
+ Code
+
+
+
+
+ Code
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ Settings.settings
+ True
+
+
+ ResXFileCodeGenerator
+ Designer
+ Resources.Designer.cs
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+
+
+
+
+
+ {ee6c8f68-ed46-4c1c-abdd-cfcdf75104f2}
+ ConnectorDataMqtt
+
+
+ {b870e4d5-6806-4a0b-b233-8907eedc5afc}
+ Utils-IoT
+
+
+ {fac8ce64-bf13-4ece-8097-aeb5dd060098}
+ Utils
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/House-Dashboard/House-Dashboard/MainWindow.xaml b/House-Dashboard/House-Dashboard/MainWindow.xaml
new file mode 100644
index 0000000..ee37d8e
--- /dev/null
+++ b/House-Dashboard/House-Dashboard/MainWindow.xaml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/House-Dashboard/House-Dashboard/MainWindow.xaml.cs b/House-Dashboard/House-Dashboard/MainWindow.xaml.cs
new file mode 100644
index 0000000..898bdb7
--- /dev/null
+++ b/House-Dashboard/House-Dashboard/MainWindow.xaml.cs
@@ -0,0 +1,96 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using BlubbFish.House.Dashboard.Functions;
+using BlubbFish.Utils;
+using BlubbFish.Utils.IoT.Connector;
+
+namespace House_Dashboard {
+ ///
+ /// Interaktionslogik für MainWindow.xaml
+ ///
+ public partial class MainWindow : Window {
+ private ADataBackend mqtt;
+ private Workload workload;
+
+ public MainWindow() {
+ 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;
+ LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(System.Windows.Markup.XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
+
+ InitializeComponent();
+ InitMqtt();
+ InitTabs();
+ }
+
+ private void InitTabs() {
+ if(File.Exists("tabs.ini")) {
+ foreach (String item in InIReader.GetInstance("tabs.ini").GetSections()) {
+ if(InIReader.GetInstance("tabs.ini").GetValue(item, "settings") != null && File.Exists(InIReader.GetInstance("tabs.ini").GetValue(item, "settings"))) {
+ this.tabs.Items.Add(new Tabs(InIReader.GetInstance(InIReader.GetInstance("tabs.ini").GetValue(item, "settings")), this.mqtt).GetTab());
+ }
+ }
+ } else {
+ MessageBox.Show("tabs.ini nicht gefunden.", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+ this.ApplicationShutdown(null, null);
+ }
+ }
+
+ private void InitMqtt() {
+ if(File.Exists("mqtt.ini")) {
+ this.mqtt = ADataBackend.GetInstance(InIReader.GetInstance("mqtt.ini").GetSection("settings"));
+ if(this.mqtt == null) {
+ MessageBox.Show("Der Mqtt Treiber konnte nicht geladen werden.", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+ this.ApplicationShutdown(null, null);
+ }
+ this.Dispatcher.BeginInvoke((Action)(() => {
+ this.statusConnection.Text = "Ja";
+ this.statusConnection.Foreground = Brushes.Green;
+ }));
+ this.mqtt.MessageIncomming += this.IncommingData;
+ this.workload = new Workload();
+ this.workload.Update += this.UpdateWorkload;
+ } else {
+ MessageBox.Show("mqtt.ini nicht gefunden.", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+ this.ApplicationShutdown(null, null);
+ }
+ }
+
+ private void IncommingData(Object sender, MqttEventArgs e) {
+ this.workload.SetMessage(e);
+ }
+
+ private void UpdateWorkload(Object sender, EventArgs e) {
+ Workload w = (Workload)sender;
+ this.Dispatcher.BeginInvoke((Action)(() => {
+ this.statusLoadBar.Maximum = w.Maximum;
+ this.statusLoadBar.Value = w.Now;
+ this.statusLoadValue.Text = w.Now + " M/30s (" + DateTime.Now.ToLocalTime() + ")";
+ }));
+ }
+
+ private void ApplicationShutdown(Object sender, RoutedEventArgs e) {
+ if(this.mqtt != null) {
+ this.mqtt.Dispose();
+ }
+ Application.Current.Shutdown();
+ }
+ }
+}
diff --git a/House-Dashboard/House-Dashboard/Properties/AssemblyInfo.cs b/House-Dashboard/House-Dashboard/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..d2f7150
--- /dev/null
+++ b/House-Dashboard/House-Dashboard/Properties/AssemblyInfo.cs
@@ -0,0 +1,57 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Windows;
+
+// Allgemeine Informationen über eine Assembly werden über die folgenden
+// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
+// die einer Assembly zugeordnet sind.
+[assembly: AssemblyTitle("Dashboard")]
+[assembly: AssemblyDescription("House Dashboard")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("BlubbFish")]
+[assembly: AssemblyProduct("Dashboard")]
+[assembly: AssemblyCopyright("Copyright © 2018 - 01.01.2018")]
+[assembly: AssemblyTrademark("BlubbFish")]
+[assembly: AssemblyCulture("")]
+
+// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly
+// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von
+// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
+[assembly: ComVisible(false)]
+
+//Um mit dem Erstellen lokalisierbarer Anwendungen zu beginnen, legen Sie
+//ImCodeVerwendeteKultur in der .csproj-Datei
+//in einer fest. Wenn Sie in den Quelldateien beispielsweise Deutsch
+//(Deutschland) verwenden, legen Sie auf \"de-DE\" fest. Heben Sie dann die Auskommentierung
+//des nachstehenden NeutralResourceLanguage-Attributs auf. Aktualisieren Sie "en-US" in der nachstehenden Zeile,
+//sodass es mit der UICulture-Einstellung in der Projektdatei übereinstimmt.
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher
+ //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird,
+ // oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.)
+ ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs
+ //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird,
+ // designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.)
+)]
+
+
+// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
+//
+// Hauptversion
+// Nebenversion
+// Buildnummer
+// Revision
+//
+// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
+// übernehmen, indem Sie "*" eingeben:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: NeutralResourcesLanguage("de-DE")]
+
diff --git a/House-Dashboard/House-Dashboard/Properties/Resources.Designer.cs b/House-Dashboard/House-Dashboard/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..8524132
--- /dev/null
+++ b/House-Dashboard/House-Dashboard/Properties/Resources.Designer.cs
@@ -0,0 +1,73 @@
+//------------------------------------------------------------------------------
+//
+// Dieser Code wurde von einem Tool generiert.
+// Laufzeitversion:4.0.30319.42000
+//
+// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
+// der Code erneut generiert wird.
+//
+//------------------------------------------------------------------------------
+
+namespace BlubbFish.House.Dashboard.Properties {
+ using System;
+
+
+ ///
+ /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
+ ///
+ // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
+ // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
+ // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
+ // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BlubbFish.House.Dashboard.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
+ /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap graphics_heater {
+ get {
+ object obj = ResourceManager.GetObject("graphics_heater", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+ }
+}
diff --git a/House-Dashboard/House-Dashboard/Properties/Resources.resx b/House-Dashboard/House-Dashboard/Properties/Resources.resx
new file mode 100644
index 0000000..0deabe2
--- /dev/null
+++ b/House-Dashboard/House-Dashboard/Properties/Resources.resx
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\graphics_heater.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/House-Dashboard/House-Dashboard/Properties/Settings.Designer.cs b/House-Dashboard/House-Dashboard/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..e3957c1
--- /dev/null
+++ b/House-Dashboard/House-Dashboard/Properties/Settings.Designer.cs
@@ -0,0 +1,26 @@
+//------------------------------------------------------------------------------
+//
+// Dieser Code wurde von einem Tool generiert.
+// Laufzeitversion:4.0.30319.42000
+//
+// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
+// der Code erneut generiert wird.
+//
+//------------------------------------------------------------------------------
+
+namespace BlubbFish.House.Dashboard.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.3.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/House-Dashboard/House-Dashboard/Properties/Settings.settings b/House-Dashboard/House-Dashboard/Properties/Settings.settings
new file mode 100644
index 0000000..033d7a5
--- /dev/null
+++ b/House-Dashboard/House-Dashboard/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/House-Dashboard/House-Dashboard/Resources/graphics_heater.png b/House-Dashboard/House-Dashboard/Resources/graphics_heater.png
new file mode 100644
index 0000000..84b4dc4
Binary files /dev/null and b/House-Dashboard/House-Dashboard/Resources/graphics_heater.png differ
diff --git a/House-Dashboard/House-Dashboard/packages.config b/House-Dashboard/House-Dashboard/packages.config
new file mode 100644
index 0000000..302ea4e
--- /dev/null
+++ b/House-Dashboard/House-Dashboard/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Hue-Bot/Hue-Bot.sln b/Hue-Bot/Hue-Bot.sln
new file mode 100644
index 0000000..bfeaba2
--- /dev/null
+++ b/Hue-Bot/Hue-Bot.sln
@@ -0,0 +1,61 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27004.2010
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hue-Bot", "Hue-Bot\Hue-Bot.csproj", "{4C2F9593-4CF6-47DC-85D3-2D098C404C70}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hue", "..\Hue\Hue\Hue.csproj", "{738A6137-8FCA-4CE1-BD1C-042B21B6B5F2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "litjson_4.7.1", "..\Librarys\litjson\litjson\litjson_4.7.1.csproj", "{91A14CD2-2940-4500-8193-56D37EDDDBAA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils", "..\Utils\Utils\Utils.csproj", "{FAC8CE64-BF13-4ECE-8097-AEB5DD060098}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConnectorDataMqtt", "..\Utils\IoT\Connector\Data\Mqtt\ConnectorDataMqtt.csproj", "{EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils-IoT", "..\Utils\IoT\Utils-IoT.csproj", "{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "M2Mqtt", "..\Librarys\mqtt\M2Mqtt\M2Mqtt.csproj", "{A11AEF5A-B246-4FE8-8330-06DB73CC8074}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {4C2F9593-4CF6-47DC-85D3-2D098C404C70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4C2F9593-4CF6-47DC-85D3-2D098C404C70}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4C2F9593-4CF6-47DC-85D3-2D098C404C70}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4C2F9593-4CF6-47DC-85D3-2D098C404C70}.Release|Any CPU.Build.0 = Release|Any CPU
+ {738A6137-8FCA-4CE1-BD1C-042B21B6B5F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {738A6137-8FCA-4CE1-BD1C-042B21B6B5F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {738A6137-8FCA-4CE1-BD1C-042B21B6B5F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {738A6137-8FCA-4CE1-BD1C-042B21B6B5F2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {91A14CD2-2940-4500-8193-56D37EDDDBAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {91A14CD2-2940-4500-8193-56D37EDDDBAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {91A14CD2-2940-4500-8193-56D37EDDDBAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {91A14CD2-2940-4500-8193-56D37EDDDBAA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A11AEF5A-B246-4FE8-8330-06DB73CC8074}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A11AEF5A-B246-4FE8-8330-06DB73CC8074}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A11AEF5A-B246-4FE8-8330-06DB73CC8074}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A11AEF5A-B246-4FE8-8330-06DB73CC8074}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {15702E91-23B8-44F6-9544-A0C8E506A91E}
+ EndGlobalSection
+EndGlobal
diff --git a/Hue-Bot/Hue-Bot/Hue-Bot.csproj b/Hue-Bot/Hue-Bot/Hue-Bot.csproj
new file mode 100644
index 0000000..edc6956
--- /dev/null
+++ b/Hue-Bot/Hue-Bot/Hue-Bot.csproj
@@ -0,0 +1,121 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {4C2F9593-4CF6-47DC-85D3-2D098C404C70}
+ Exe
+ BlubbFish.IoT.Bot.HueBot
+ Hue-Bot
+ v4.7.1
+ 512
+ true
+
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 1.0.0.%2a
+ false
+ false
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ Resources\Icon.ico
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+ True
+ Resources.resx
+
+
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+
+
+
+
+
+ {738a6137-8fca-4ce1-bd1c-042b21b6b5f2}
+ Hue
+
+
+ {91a14cd2-2940-4500-8193-56d37edddbaa}
+ litjson_4.7.1
+
+
+ {ee6c8f68-ed46-4c1c-abdd-cfcdf75104f2}
+ ConnectorDataMqtt
+
+
+ {b870e4d5-6806-4a0b-b233-8907eedc5afc}
+ Utils-IoT
+
+
+ {fac8ce64-bf13-4ece-8097-aeb5dd060098}
+ Utils
+
+
+
+
+ False
+ Microsoft .NET Framework 4.6.1 %28x86 und x64%29
+ true
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+
+
+
\ No newline at end of file
diff --git a/Hue-Bot/Hue-Bot/Hue-Bot.csproj.user b/Hue-Bot/Hue-Bot/Hue-Bot.csproj.user
new file mode 100644
index 0000000..c231409
--- /dev/null
+++ b/Hue-Bot/Hue-Bot/Hue-Bot.csproj.user
@@ -0,0 +1,13 @@
+
+
+
+ publish\
+
+
+
+
+
+ de-DE
+ false
+
+
\ No newline at end of file
diff --git a/Hue-Bot/Hue-Bot/Interfaces/AModul.cs b/Hue-Bot/Hue-Bot/Interfaces/AModul.cs
new file mode 100644
index 0000000..45dd52e
--- /dev/null
+++ b/Hue-Bot/Hue-Bot/Interfaces/AModul.cs
@@ -0,0 +1,72 @@
+using System;
+using System.Collections.Generic;
+using BlubbFish.IoT.Bot.HueBot.lib;
+using BlubbFish.IoT.Hue;
+using BlubbFish.Utils;
+
+namespace BlubbFish.IoT.Bot.HueBot.Interfaces {
+ abstract class AModul {
+ protected HueController hue;
+ private InIReader settings;
+ protected Dictionary> config = new Dictionary>();
+
+ public Boolean HasConfig { get; private set; }
+ public Boolean ConfigPublic { get; private set; }
+
+ public delegate void ModulEvent(Object sender, ModulEventArgs e);
+ public abstract event ModulEvent Update;
+
+ public AModul(HueController huec, InIReader settings) {
+ this.HasConfig = false;
+ this.ConfigPublic = false;
+ this.hue = huec;
+ this.settings = settings;
+ this.ParseConfig();
+ }
+
+ private void ParseConfig() {
+ if (this.settings != null) {
+ this.HasConfig = true;
+ foreach (String item in this.settings.GetSections(false)) {
+ this.config.Add(item, this.settings.GetSection(item));
+ }
+ if (this.config.ContainsKey("modul")) {
+ this.ConfigPublic = this.config["modul"].ContainsKey("config") && this.config["modul"]["config"].ToLower() == "public";
+ }
+ }
+ }
+
+ public Dictionary> GetConfig() {
+ if (this.HasConfig && this.ConfigPublic) {
+ Dictionary> ret = new Dictionary>(this.config);
+ if (ret.ContainsKey("modul")) {
+ ret.Remove("modul");
+ }
+ return ret;
+ }
+ return new Dictionary>();
+ }
+
+ public virtual void Interconnect(Dictionary moduls) { }
+
+ public virtual void SetInterconnection(String param, Action