Compare commits
3
Commits
73674548e3
..
v1.3.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2e6f2f464b | ||
|
|
a2e5ca6c7e | ||
|
|
870d8d065b |
@@ -0,0 +1,33 @@
|
||||
# Changelog
|
||||
|
||||
## 1.3.0 - 2022-01-15 - Netcore default
|
||||
### New Features
|
||||
* Netcore is now default
|
||||
* ABackend thows exeption if loading failed
|
||||
### Bugfixes
|
||||
### Changes
|
||||
* Make ref for github in readme
|
||||
* Refactoring
|
||||
* Codingstyles
|
||||
|
||||
## 1.2.0 - 2019-12.01 - Refactoring
|
||||
### New Features
|
||||
* Add netcore
|
||||
* ABackend now return null if type is not loadable
|
||||
### Bugfixes
|
||||
### Changes
|
||||
* Refactoring
|
||||
|
||||
## 1.1.0 - 2019-05-29 - Readme
|
||||
### New Features
|
||||
* Add Readme, Contribution and Licence
|
||||
### Bugfixes
|
||||
### Changes
|
||||
* Coding Styles
|
||||
|
||||
## 1.0.0.0 - 2019-02-14 - Init
|
||||
### New Features
|
||||
* First Version
|
||||
### Bugfixes
|
||||
### Changes
|
||||
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
# BlubbFish.Utils.IoT (Utils-IoT)
|
||||
Library contains utils for Iot
|
||||
|
||||
## Linking to
|
||||
### External
|
||||
* [litjson](http://git.blubbfish.net/vs_librarys/litjson)
|
||||
# BlubbFish.Utils.IoT (Utils-IoT)
|
||||
Library contains utils for Iot
|
||||
|
||||
Maybe you find this Repo on Github. This is a mirror from [here](https://git.blubbfish.net/vs_utils/Utils-IoT).
|
||||
|
||||
## Linking to
|
||||
### Internal
|
||||
* [Utils](http://git.blubbfish.net/vs_utils/Utils)
|
||||
* BlubbFish.Utils ([Utils](http://git.blubbfish.net/vs_utils/Utils))
|
||||
|
||||
### External
|
||||
* litjson ([Used Fork](https://github.com/blubbfish/litjson), [Original](https://github.com/LitJSON/litjson))
|
||||
@@ -1,47 +1,44 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using BlubbFish.Utils.IoT.Events;
|
||||
|
||||
namespace BlubbFish.Utils.IoT.Connector {
|
||||
public abstract class ABackend {
|
||||
public enum BackendType {
|
||||
Data,
|
||||
User
|
||||
}
|
||||
public event BackendMessage MessageIncomming;
|
||||
public event BackendMessage MessageSending;
|
||||
public delegate void BackendMessage(Object sender, BackendEvent e);
|
||||
|
||||
protected Dictionary<String, String> settings;
|
||||
|
||||
public abstract Boolean IsConnected { get; }
|
||||
|
||||
public ABackend(Dictionary<String, String> settings) => this.settings = settings;
|
||||
|
||||
public static ABackend GetInstance(Dictionary<String, String> settings, BackendType ty) {
|
||||
if (settings.Count == 0) {
|
||||
return null;
|
||||
}
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using BlubbFish.Utils.IoT.Events;
|
||||
|
||||
namespace BlubbFish.Utils.IoT.Connector {
|
||||
public abstract class ABackend {
|
||||
public enum BackendType {
|
||||
Data,
|
||||
User
|
||||
}
|
||||
public event BackendMessage MessageIncomming;
|
||||
public event BackendMessage MessageSending;
|
||||
public delegate void BackendMessage(Object sender, BackendEvent e);
|
||||
|
||||
protected Dictionary<String, String> settings;
|
||||
|
||||
public abstract Boolean IsConnected { get; }
|
||||
|
||||
public ABackend(Dictionary<String, String> settings) => this.settings = settings;
|
||||
|
||||
public static ABackend GetInstance(Dictionary<String, String> settings, BackendType ty) {
|
||||
if (settings.Count == 0) {
|
||||
return null;
|
||||
}
|
||||
String object_sensor = "BlubbFish.Utils.IoT.Connector." + ty.ToString() + "." + settings["type"].ToUpperLower() + ", " + "Connector" + ty.ToString() + settings["type"].ToUpperLower();
|
||||
try {
|
||||
Type t = Type.GetType(object_sensor, true);
|
||||
return (ABackend)t.GetConstructor(new Type[] { typeof(Dictionary<String, String>) }).Invoke(new Object[] { settings });
|
||||
} catch (TypeLoadException) {
|
||||
Console.Error.WriteLine("Configuration: " + settings["type"] + " is not a " + ty.ToString() + "Backend");
|
||||
return null;
|
||||
} catch (System.IO.FileNotFoundException) {
|
||||
Console.Error.WriteLine("Driver " + object_sensor + " could not load!");
|
||||
return null;
|
||||
} catch (Exception e) {
|
||||
Console.Error.WriteLine("Something bad Happend while Loading Connectior: "+e.Message);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
protected void NotifyClientIncomming(BackendEvent value) => this.MessageIncomming?.Invoke(this, value);
|
||||
|
||||
protected void NotifyClientSending(BackendEvent value) => this.MessageSending?.Invoke(this, value);
|
||||
|
||||
public abstract void Dispose();
|
||||
}
|
||||
}
|
||||
try {
|
||||
Type t = Type.GetType(object_sensor, true);
|
||||
return (ABackend)t.GetConstructor(new Type[] { typeof(Dictionary<String, String>) }).Invoke(new Object[] { settings });
|
||||
} catch (TypeLoadException) {
|
||||
throw new TypeLoadException("Configuration: " + settings["type"] + " is not a " + ty.ToString() + "Backend");
|
||||
} catch (System.IO.FileNotFoundException) {
|
||||
throw new DllNotFoundException("Driver " + object_sensor + " could not load!");
|
||||
} catch (Exception e) {
|
||||
throw new Exception("Something bad Happend while Loading Connectior: "+e.Message);
|
||||
}
|
||||
}
|
||||
|
||||
protected void NotifyClientIncomming(BackendEvent value) => this.MessageIncomming?.Invoke(this, value);
|
||||
|
||||
protected void NotifyClientSending(BackendEvent value) => this.MessageSending?.Invoke(this, value);
|
||||
|
||||
public abstract void Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
+133
-130
@@ -1,131 +1,134 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
using BlubbFish.Utils.IoT.Connector;
|
||||
using BlubbFish.Utils.IoT.Events;
|
||||
|
||||
namespace BlubbFish.Utils.IoT.JsonSensor {
|
||||
public abstract class AJsonSensor : IDisposable {
|
||||
protected String topic;
|
||||
protected Int32 pollcount;
|
||||
protected Dictionary<String, String> settings;
|
||||
protected ABackend backend;
|
||||
private Thread pollingThread;
|
||||
private Boolean pollEnabled = false;
|
||||
|
||||
public AJsonSensor(Dictionary<String, String> settings, String name, ABackend backend) {
|
||||
this.GetBool = true;
|
||||
this.GetFloat = 0.0f;
|
||||
this.GetInt = 0;
|
||||
this.topic = settings.Keys.Contains("topic") ? settings["topic"] : "";
|
||||
this.settings = settings;
|
||||
this.Title = settings.Keys.Contains("title") ? settings["title"] : "";
|
||||
this.Name = name;
|
||||
this.backend = backend;
|
||||
this.backend.MessageIncomming += this.IncommingMqttMessage;
|
||||
if (settings.Keys.Contains("polling")) {
|
||||
this.pollEnabled = true;
|
||||
this.Polling = Int32.Parse(settings["polling"]);
|
||||
this.pollcount = this.Polling;
|
||||
this.pollingThread = new Thread(this.SensorPolling);
|
||||
this.pollingThread.Start();
|
||||
}
|
||||
}
|
||||
|
||||
private void SensorPolling() {
|
||||
while(this.pollEnabled) {
|
||||
Thread.Sleep(1000);
|
||||
this.Poll();
|
||||
}
|
||||
}
|
||||
|
||||
private void IncommingMqttMessage(Object sender, BackendEvent e) {
|
||||
if(Regex.Match(e.From.ToString(), this.topic).Success) {
|
||||
if (this.UpdateValue(e)) {
|
||||
this.Timestamp = DateTime.Now;
|
||||
this.Update?.Invoke(this, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static AJsonSensor GetInstance(Dictionary<String, ABackend> backends, Dictionary<String, String> settings, String name) {
|
||||
String object_sensor = "BlubbFish.Utils.IoT.JsonSensor." + Char.ToUpper(settings["type"][0]) + settings["type"].Substring(1).ToLower();
|
||||
Type t;
|
||||
try {
|
||||
t = Type.GetType(object_sensor, true);
|
||||
} catch(TypeLoadException) {
|
||||
throw new ArgumentException("Sensor: " + object_sensor + " is not a Sensor");
|
||||
}
|
||||
if(!settings.ContainsKey("backend") || !backends.ContainsKey(settings["backend"])) {
|
||||
throw new ArgumentException("Backend not specified!");
|
||||
}
|
||||
return (AJsonSensor)t.GetConstructor(new Type[] { typeof(Dictionary<String, String>), typeof(String), typeof(ABackend) }).Invoke(new Object[] { settings, name, backends[settings["backend"]] });
|
||||
}
|
||||
|
||||
protected virtual void Poll() {
|
||||
if(this.pollcount++ >= this.Polling) {
|
||||
this.pollcount = 1;
|
||||
if (this.backend is ADataBackend) {
|
||||
((ADataBackend)this.backend).Send(this.topic + "/get", "");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void SetBool(Boolean v) {
|
||||
if (this.backend is ADataBackend) {
|
||||
((ADataBackend)this.backend).Send(this.topic + "/set", v ? "on" : "off");
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract Boolean UpdateValue(BackendEvent e);
|
||||
|
||||
public Single GetFloat { get; protected set; }
|
||||
public Boolean GetBool { get; protected set; }
|
||||
public Int32 GetInt { get; protected set; }
|
||||
public Types Datatypes { get; protected set; }
|
||||
public DateTime Timestamp { get; protected set; }
|
||||
public Int32 Polling { get; private set; }
|
||||
public String Title { get; protected set; }
|
||||
public String Name { get; internal set; }
|
||||
|
||||
public enum Types {
|
||||
Bool,
|
||||
Int,
|
||||
Float
|
||||
}
|
||||
public delegate void UpdatedValue(Object sender, EventArgs e);
|
||||
public event UpdatedValue Update;
|
||||
|
||||
#region IDisposable Support
|
||||
private Boolean disposedValue = false;
|
||||
|
||||
|
||||
protected virtual void Dispose(Boolean disposing) {
|
||||
if(!this.disposedValue) {
|
||||
if(disposing) {
|
||||
this.pollEnabled = false;
|
||||
if (this.pollingThread != null && this.pollingThread.ThreadState == ThreadState.Running) {
|
||||
this.pollingThread.Abort();
|
||||
while (this.pollingThread.ThreadState != ThreadState.Aborted) { }
|
||||
}
|
||||
this.backend.MessageIncomming -= this.IncommingMqttMessage;
|
||||
}
|
||||
this.settings = null;
|
||||
this.pollingThread = null;
|
||||
this.disposedValue = true;
|
||||
}
|
||||
}
|
||||
|
||||
~AJsonSensor() {
|
||||
this.Dispose(false);
|
||||
}
|
||||
|
||||
public void Dispose() {
|
||||
this.Dispose(true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
|
||||
using BlubbFish.Utils.IoT.Connector;
|
||||
using BlubbFish.Utils.IoT.Events;
|
||||
|
||||
namespace BlubbFish.Utils.IoT.JsonSensor {
|
||||
public abstract class AJsonSensor : IDisposable {
|
||||
protected String topic;
|
||||
protected Int32 pollcount;
|
||||
protected Dictionary<String, String> settings;
|
||||
protected ABackend backend;
|
||||
private Thread pollingThread;
|
||||
private Boolean pollEnabled = false;
|
||||
|
||||
public AJsonSensor(Dictionary<String, String> settings, String name, ABackend backend) {
|
||||
this.GetBool = true;
|
||||
this.GetFloat = 0.0f;
|
||||
this.GetInt = 0;
|
||||
this.topic = settings.Keys.Contains("topic") ? settings["topic"] : "";
|
||||
this.settings = settings;
|
||||
this.Title = settings.Keys.Contains("title") ? settings["title"] : "";
|
||||
this.Name = name;
|
||||
this.backend = backend;
|
||||
this.backend.MessageIncomming += this.IncommingMqttMessage;
|
||||
if (settings.Keys.Contains("polling")) {
|
||||
this.pollEnabled = true;
|
||||
this.Polling = Int32.Parse(settings["polling"]);
|
||||
this.pollcount = this.Polling;
|
||||
this.pollingThread = new Thread(this.SensorPolling);
|
||||
this.pollingThread.Start();
|
||||
}
|
||||
}
|
||||
|
||||
private void SensorPolling() {
|
||||
while(this.pollEnabled) {
|
||||
Thread.Sleep(1000);
|
||||
this.Poll();
|
||||
}
|
||||
}
|
||||
|
||||
private void IncommingMqttMessage(Object sender, BackendEvent e) {
|
||||
if(Regex.Match(e.From.ToString(), this.topic).Success) {
|
||||
if (this.UpdateValue(e)) {
|
||||
this.Timestamp = DateTime.Now;
|
||||
this.Update?.Invoke(this, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static AJsonSensor GetInstance(Dictionary<String, ABackend> backends, Dictionary<String, String> settings, String name) {
|
||||
if(!settings.ContainsKey("backend") || !backends.ContainsKey(settings["backend"])) {
|
||||
throw new ArgumentException("Backend not specified!");
|
||||
}
|
||||
String object_sensor = "BlubbFish.Utils.IoT.JsonSensor." + settings["type"].ToUpperLower();
|
||||
try {
|
||||
Type t = Type.GetType(object_sensor, true);
|
||||
return (AJsonSensor)t.GetConstructor(new Type[] { typeof(Dictionary<String, String>), typeof(String), typeof(ABackend) }).Invoke(new Object[] { settings, name, backends[settings["backend"]] });
|
||||
} catch(TypeLoadException) {
|
||||
throw new ArgumentException("Sensor: " + object_sensor + " is not a Sensor");
|
||||
} catch(Exception e) {
|
||||
Helper.WriteError("Something went wrong! " + e.Message);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void Poll() {
|
||||
if(this.pollcount++ >= this.Polling) {
|
||||
this.pollcount = 1;
|
||||
if (this.backend is ADataBackend databackend) {
|
||||
databackend.Send(this.topic + "/get", "");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void SetBool(Boolean v) {
|
||||
if (this.backend is ADataBackend databackend) {
|
||||
databackend.Send(this.topic + "/set", v ? "on" : "off");
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract Boolean UpdateValue(BackendEvent e);
|
||||
|
||||
public Single GetFloat { get; protected set; }
|
||||
public Boolean GetBool { get; protected set; }
|
||||
public Int32 GetInt { get; protected set; }
|
||||
public Types Datatypes { get; protected set; }
|
||||
public DateTime Timestamp { get; protected set; }
|
||||
public Int32 Polling { get; private set; }
|
||||
public String Title { get; protected set; }
|
||||
public String Name { get; internal set; }
|
||||
|
||||
public enum Types {
|
||||
Bool,
|
||||
Int,
|
||||
Float
|
||||
}
|
||||
public delegate void UpdatedValue(Object sender, EventArgs e);
|
||||
public event UpdatedValue Update;
|
||||
|
||||
#region IDisposable Support
|
||||
private Boolean disposedValue = false;
|
||||
|
||||
|
||||
protected virtual void Dispose(Boolean disposing) {
|
||||
if(!this.disposedValue) {
|
||||
if(disposing) {
|
||||
this.pollEnabled = false;
|
||||
if (this.pollingThread != null && this.pollingThread.ThreadState == ThreadState.Running) {
|
||||
this.pollingThread.Abort();
|
||||
while (this.pollingThread.ThreadState != ThreadState.Aborted) { }
|
||||
}
|
||||
this.backend.MessageIncomming -= this.IncommingMqttMessage;
|
||||
}
|
||||
this.settings = null;
|
||||
this.pollingThread = null;
|
||||
this.disposedValue = true;
|
||||
}
|
||||
}
|
||||
|
||||
~AJsonSensor() {
|
||||
this.Dispose(false);
|
||||
}
|
||||
|
||||
public void Dispose() {
|
||||
this.Dispose(true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,7 @@ namespace BlubbFish.Utils.IoT.JsonSensor {
|
||||
public Pir(Dictionary<String, String> settings, String name, ADataBackend backend) : base(settings, name, backend) => this.Datatypes = Types.Bool;
|
||||
|
||||
protected override Boolean UpdateValue(BackendEvent e) {
|
||||
this.GetBool = (e.Message.ToLower() == "on") ? true : false;
|
||||
this.GetBool = e.Message.ToLower() == "on";
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace BlubbFish.Utils.IoT.JsonSensor {
|
||||
public Switch(Dictionary<String, String> settings, String name, ADataBackend backend) : base(settings, name, backend) => this.Datatypes = Types.Bool;
|
||||
|
||||
protected override Boolean UpdateValue(BackendEvent e) {
|
||||
this.GetBool = (e.Message.ToLower() == "on") ? true : false;
|
||||
this.GetBool = e.Message.ToLower() == "on";
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,19 +4,22 @@
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
<RootNamespace>BlubbFish.Utils.IoT</RootNamespace>
|
||||
<AssemblyName>Utils-IoT</AssemblyName>
|
||||
<AssemblyVersion>1.0.0</AssemblyVersion>
|
||||
<NeutralLanguage>de-DE</NeutralLanguage>
|
||||
<PackageReleaseNotes>1.0.0 Init</PackageReleaseNotes>
|
||||
<Copyright>Copyright © BlubbFish 2017 - 24.11.2019</Copyright>
|
||||
<PackageReleaseNotes>
|
||||
1.3.0 Netcore default
|
||||
1.2.0 Refactoring
|
||||
1.1.0 Readme
|
||||
1.0.0.0 Init
|
||||
</PackageReleaseNotes>
|
||||
<Copyright>Copyright © BlubbFish 2017 - 15.01.2022</Copyright>
|
||||
<Description>Provides classes for iot development</Description>
|
||||
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
||||
<Company>BlubbFish</Company>
|
||||
<Authors>BlubbFish</Authors>
|
||||
<FileVersion>1.0.0</FileVersion>
|
||||
<PackageProjectUrl>http://git.blubbfish.net/vs_utils/Utils-IoT</PackageProjectUrl>
|
||||
<RepositoryUrl>http://git.blubbfish.net/vs_utils/Utils-IoT.git</RepositoryUrl>
|
||||
<RepositoryType>git</RepositoryType>
|
||||
<Version>1.0.0</Version>
|
||||
<Version>1.3.0</Version>
|
||||
<PackageId>IoT.Utils.BlubbFish</PackageId>
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user