[NF] v1.3.0.0 Adding Status Polling and Mqtt (not compelete)
[NF] Able to force loading modules, so dependencys are ok [NF] Cleanup because its now easyer to implement Zway
This commit is contained in:
parent
c96b2393d3
commit
9e60264d7d
@ -13,6 +13,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils-IoT", "..\Utils\IoT\U
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConnectorDataMosquitto", "..\Utils\IoT\Connector\Data\Mosquitto\ConnectorDataMosquitto.csproj", "{39235FAD-BA9D-4B51-82FC-6969967BEAE9}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConnectorDataMosquitto", "..\Utils\IoT\Connector\Data\Mosquitto\ConnectorDataMosquitto.csproj", "{39235FAD-BA9D-4B51-82FC-6969967BEAE9}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConnectorDataMqtt", "..\Utils\IoT\Connector\Data\Mqtt\ConnectorDataMqtt.csproj", "{EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@ -39,6 +41,10 @@ Global
|
|||||||
{39235FAD-BA9D-4B51-82FC-6969967BEAE9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{39235FAD-BA9D-4B51-82FC-6969967BEAE9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{39235FAD-BA9D-4B51-82FC-6969967BEAE9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{39235FAD-BA9D-4B51-82FC-6969967BEAE9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{39235FAD-BA9D-4B51-82FC-6969967BEAE9}.Release|Any CPU.Build.0 = Release|Any CPU
|
{39235FAD-BA9D-4B51-82FC-6969967BEAE9}.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
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
@ -39,6 +39,34 @@ namespace ZwayBot {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class MqttEvent : ModulEventArgs {
|
||||||
|
public MqttEvent() {
|
||||||
|
}
|
||||||
|
public MqttEvent(String topic, String text) {
|
||||||
|
this.Address = topic;
|
||||||
|
this.Value = text;
|
||||||
|
this.Source = "MQTT";
|
||||||
|
}
|
||||||
|
public override String ToString() {
|
||||||
|
return this.Source + ": on " + this.Address + " set " + this.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class StatusPollingEvent : ModulEventArgs {
|
||||||
|
public StatusPollingEvent() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public StatusPollingEvent(String text, String node) {
|
||||||
|
this.Value = text;
|
||||||
|
this.Address = node;
|
||||||
|
this.Source = "POLLING";
|
||||||
|
}
|
||||||
|
|
||||||
|
public override String ToString() {
|
||||||
|
return this.Source + ": " + this.Value + " on " + this.Address;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class ModulEventArgs : EventArgs {
|
public class ModulEventArgs : EventArgs {
|
||||||
public ModulEventArgs() {
|
public ModulEventArgs() {
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
||||||
namespace ZwayBot {
|
namespace ZwayBot {
|
||||||
class Helper {
|
static class Helper {
|
||||||
public static void SetProperty(Object o, String name, String value) {
|
public static void SetProperty(this Object o, String name, String value) {
|
||||||
PropertyInfo prop = o.GetType().GetProperty(name);
|
PropertyInfo prop = o.GetType().GetProperty(name);
|
||||||
if (prop.CanWrite) {
|
if (prop.CanWrite) {
|
||||||
if (prop.PropertyType == typeof(Boolean) && Boolean.TryParse(value, out Boolean vb)) {
|
if (prop.PropertyType == typeof(Boolean) && Boolean.TryParse(value, out Boolean vb)) {
|
||||||
@ -17,7 +17,8 @@ namespace ZwayBot {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static Boolean HasProperty(Object o, String type) {
|
|
||||||
|
internal static Boolean HasProperty(this Object o, String type) {
|
||||||
Type t = o.GetType();
|
Type t = o.GetType();
|
||||||
foreach (PropertyInfo item in t.GetProperties()) {
|
foreach (PropertyInfo item in t.GetProperties()) {
|
||||||
if (item.Name == type) {
|
if (item.Name == type) {
|
||||||
@ -27,7 +28,7 @@ namespace ZwayBot {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static Object GetProperty(Object o, String name) {
|
internal static Object GetProperty(this Object o, String name) {
|
||||||
PropertyInfo prop = o.GetType().GetProperty(name);
|
PropertyInfo prop = o.GetType().GetProperty(name);
|
||||||
if(prop.CanRead) {
|
if(prop.CanRead) {
|
||||||
return prop.GetValue(o);
|
return prop.GetValue(o);
|
||||||
@ -35,9 +36,15 @@ namespace ZwayBot {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static Boolean HasInterface(Object o, String type) {
|
internal static Boolean HasAbstract(this Object o, Type type) {
|
||||||
Type t = o.GetType();
|
if(o.GetType().BaseType == type) {
|
||||||
foreach (Type item in t.GetInterfaces()) {
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static Boolean HasInterface(this Type o, String type) {
|
||||||
|
foreach (Type item in o.GetInterfaces()) {
|
||||||
if(item.Name == type) {
|
if(item.Name == type) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
4
Zway-Bot/Interfaces/IForceLoad.cs
Normal file
4
Zway-Bot/Interfaces/IForceLoad.cs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
namespace ZwayBot.Interfaces {
|
||||||
|
interface IForceLoad {
|
||||||
|
}
|
||||||
|
}
|
@ -8,21 +8,18 @@ namespace ZwayBot {
|
|||||||
protected ZwayController zw;
|
protected ZwayController zw;
|
||||||
protected InIReader ini;
|
protected InIReader ini;
|
||||||
|
|
||||||
|
public delegate void ModulEvent(Object sender, ModulEventArgs e);
|
||||||
|
public abstract event ModulEvent Update;
|
||||||
|
|
||||||
public AModul(ZwayController zway, InIReader settings) {
|
public AModul(ZwayController zway, InIReader settings) {
|
||||||
this.zw = zway;
|
this.zw = zway;
|
||||||
this.ini = settings;
|
this.ini = settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
public delegate void ModulEvent(Object sender, ModulEventArgs e);
|
public virtual void Interconnect(Dictionary<String, AModul> moduls) { }
|
||||||
public abstract event ModulEvent Update;
|
|
||||||
|
public virtual void SetInterconnection(String param, Action<Object> hook, Object data) { }
|
||||||
|
|
||||||
public abstract void Dispose();
|
public abstract void Dispose();
|
||||||
public virtual void Interconnect(Dictionary<String, AModul> moduls) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void SetInterconnection(String param, Action hook) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,12 +6,13 @@ using System.Threading;
|
|||||||
using BlubbFish.IoT.Zway;
|
using BlubbFish.IoT.Zway;
|
||||||
using BlubbFish.IoT.Zway.Interfaces;
|
using BlubbFish.IoT.Zway.Interfaces;
|
||||||
using BlubbFish.Utils;
|
using BlubbFish.Utils;
|
||||||
|
using ZwayBot.Interfaces;
|
||||||
|
|
||||||
namespace ZwayBot.Moduls {
|
namespace ZwayBot.Moduls {
|
||||||
internal class CronJob : AModul, IDisposable {
|
internal class CronJob : AModul, IDisposable, IForceLoad {
|
||||||
private DateTime crontime;
|
private DateTime crontime;
|
||||||
private Thread thread;
|
private Thread thread;
|
||||||
private List<Tuple<String, Action>> internalCron = new List<Tuple<String, Action>>();
|
private List<Tuple<String, Action<Object>, Object>> internalCron = new List<Tuple<String, Action<Object>, Object>>();
|
||||||
|
|
||||||
public override event ModulEvent Update;
|
public override event ModulEvent Update;
|
||||||
|
|
||||||
@ -35,14 +36,16 @@ namespace ZwayBot.Moduls {
|
|||||||
while (true) {
|
while (true) {
|
||||||
if(this.crontime.Minute != DateTime.Now.Minute) {
|
if(this.crontime.Minute != DateTime.Now.Minute) {
|
||||||
this.crontime = DateTime.Now;
|
this.crontime = DateTime.Now;
|
||||||
foreach (String item in this.ini.GetSections()) {
|
if (this.ini != null) {
|
||||||
if(this.ParseCronString(this.ini.GetValue(item, "cron"))) {
|
foreach (String item in this.ini.GetSections()) {
|
||||||
this.SetValues(this.ini.GetValue(item, "set"));
|
if (this.ParseCronString(this.ini.GetValue(item, "cron"))) {
|
||||||
|
this.SetValues(this.ini.GetValue(item, "set"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach (Tuple<String, Action> item in this.internalCron) {
|
foreach (Tuple<String, Action<Object>, Object> item in this.internalCron) {
|
||||||
if(this.ParseCronString(item.Item1)) {
|
if(this.ParseCronString(item.Item1)) {
|
||||||
item.Item2?.Invoke();
|
item.Item2?.Invoke(item.Item3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -54,24 +57,12 @@ namespace ZwayBot.Moduls {
|
|||||||
foreach (String item in value.Split(';')) {
|
foreach (String item in value.Split(';')) {
|
||||||
String[] items = item.Split(':');
|
String[] items = item.Split(':');
|
||||||
if(items.Length == 2) {
|
if(items.Length == 2) {
|
||||||
String[] addr = items[0].Split('-');
|
|
||||||
String[] values = items[1].Split('-');
|
String[] values = items[1].Split('-');
|
||||||
if(addr.Length == 3 || addr.Length == 4) {
|
ACommandClass c = this.zw.GetCommandClass(items[0]);
|
||||||
Int32 deviceid = Int32.Parse(addr[0]);
|
if (c != null && values.Length == 2) {
|
||||||
Int32 instanceid = Int32.Parse(addr[1]);
|
if (c.HasProperty(values[0])) {
|
||||||
Int32 classid = Int32.Parse(addr[2]);
|
c.SetProperty(values[0], values[1]);
|
||||||
ICommandClass c;
|
this.Update?.Invoke(this, new CronEvent(items[0], values[0], values[1]));
|
||||||
if(addr.Length == 4) {
|
|
||||||
Int32 subcid = Int32.Parse(addr[3]);
|
|
||||||
c = this.zw.GetCommandClassSub(deviceid, instanceid, classid, subcid);
|
|
||||||
} else {
|
|
||||||
c = this.zw.GetCommandClass(deviceid, instanceid, classid);
|
|
||||||
}
|
|
||||||
if (c != null && values.Length == 2) {
|
|
||||||
if (Helper.HasProperty(c, values[0])) {
|
|
||||||
Helper.SetProperty(c, values[0], values[1]);
|
|
||||||
this.Update?.Invoke(this, new CronEvent(items[0], values[0], values[1]));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -118,7 +109,7 @@ namespace ZwayBot.Moduls {
|
|||||||
cron = cron.Replace(DateTime.Parse("2015-01-" + (4 + i) + "T00:00:00").ToString("dddd", CultureInfo.CreateSpecificCulture("en-US")), i.ToString());
|
cron = cron.Replace(DateTime.Parse("2015-01-" + (4 + i) + "T00:00:00").ToString("dddd", CultureInfo.CreateSpecificCulture("en-US")), i.ToString());
|
||||||
}
|
}
|
||||||
for (Int32 i = 1; i <= 12; i++) {
|
for (Int32 i = 1; i <= 12; i++) {
|
||||||
cron = cron.Replace(DateTime.Parse("2015-"+i+"-01T00:00:00").ToString("MMM", CultureInfo.CreateSpecificCulture("en-US")), i.ToString());
|
cron = cron.Replace(DateTime.Parse("2015-" + i + "-01T00:00:00").ToString("MMM", CultureInfo.CreateSpecificCulture("en-US")), i.ToString());
|
||||||
cron = cron.Replace(DateTime.Parse("2015-" + i + "-01T00:00:00").ToString("MMMM", CultureInfo.CreateSpecificCulture("en-US")), i.ToString());
|
cron = cron.Replace(DateTime.Parse("2015-" + i + "-01T00:00:00").ToString("MMMM", CultureInfo.CreateSpecificCulture("en-US")), i.ToString());
|
||||||
}
|
}
|
||||||
if (cron.Contains("*")) {
|
if (cron.Contains("*")) {
|
||||||
@ -162,8 +153,8 @@ namespace ZwayBot.Moduls {
|
|||||||
return ret.ContainsKey(Int32.Parse(date));
|
return ret.ContainsKey(Int32.Parse(date));
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void SetInterconnection(String cron, Action hook) {
|
public override void SetInterconnection(String cron, Action<Object> hook, Object data) {
|
||||||
this.internalCron.Add(new Tuple<String, Action>(cron, hook));
|
this.internalCron.Add(new Tuple<String, Action<Object>, Object>(cron, hook, data));
|
||||||
}
|
}
|
||||||
|
|
||||||
#region IDisposable Support
|
#region IDisposable Support
|
||||||
|
@ -6,6 +6,7 @@ using BlubbFish.IoT.Zway.Devices;
|
|||||||
using BlubbFish.IoT.Zway.Devices.CommandClasses;
|
using BlubbFish.IoT.Zway.Devices.CommandClasses;
|
||||||
using BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs;
|
using BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs;
|
||||||
using BlubbFish.IoT.Zway.Events;
|
using BlubbFish.IoT.Zway.Events;
|
||||||
|
using BlubbFish.IoT.Zway.Interfaces;
|
||||||
using BlubbFish.Utils;
|
using BlubbFish.Utils;
|
||||||
using BlubbFish.Utils.IoT.Connector;
|
using BlubbFish.Utils.IoT.Connector;
|
||||||
using LitJson;
|
using LitJson;
|
||||||
@ -41,26 +42,27 @@ namespace ZwayBot.Moduls {
|
|||||||
private void DeviceUpdate(Object sender, DeviceUpdateEvent e) {
|
private void DeviceUpdate(Object sender, DeviceUpdateEvent e) {
|
||||||
Instance instance = (Instance)sender;
|
Instance instance = (Instance)sender;
|
||||||
if(e.Parent.GetType() == typeof(Switchbinary)) {
|
if(e.Parent.GetType() == typeof(Switchbinary)) {
|
||||||
if (instance.CommandClasses.ContainsKey(37)) { //SwitchBinary
|
if (instance.CommandClasses.ContainsKey(ACommandClass.Classes.SwitchBinary)) {
|
||||||
String topic = "/flex4grid/v1/households/" + this.household + "/device/state";
|
String topic = "/flex4grid/v1/households/" + this.household + "/device/state";
|
||||||
String text = JsonMapper.ToJson(new Dictionary<String, String>() {
|
String text = JsonMapper.ToJson(new Dictionary<String, String>() {
|
||||||
{ "status", ((Switchbinary)instance.CommandClasses[37]).Level?"active":"idle" },
|
{ "status", ((Switchbinary)instance.CommandClasses[ACommandClass.Classes.SwitchBinary]).Level?"active":"idle" },
|
||||||
{ "timestamp", DateTime.Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffff'Z'") },
|
{ "timestamp", DateTime.Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffff'Z'") },
|
||||||
{ "type", ((Switchbinary)instance.CommandClasses[37]).Name },
|
{ "type", ((Switchbinary)instance.CommandClasses[ACommandClass.Classes.SwitchBinary]).Name },
|
||||||
{ "id", instance.DeviceId.ToString() }
|
{ "id", instance.DeviceId.ToString() }
|
||||||
}).ToString();
|
}).ToString();
|
||||||
this.mqtt.Send(topic, text);
|
this.mqtt.Send(topic, text);
|
||||||
this.Update?.Invoke(this, new Flex4gridEvent(topic, text));
|
this.Update?.Invoke(this, new Flex4gridEvent(topic, text));
|
||||||
}
|
}
|
||||||
} else if(e.Parent.GetType() == typeof(Sensormultilevelsub) || e.Parent.GetType() == typeof(Metersub)) {
|
} else if(e.Parent.GetType() == typeof(Sensormultilevelsub) || e.Parent.GetType() == typeof(Metersub)) {
|
||||||
if (instance.CommandClasses.ContainsKey(49) && ((Sensormultilevel)instance.CommandClasses[49]).Sub.ContainsKey(4) && //SensorMultilevel
|
if (instance.CommandClasses.ContainsKey(ACommandClass.Classes.SensorMultilevel) &&
|
||||||
instance.CommandClasses.ContainsKey(50) && ((Meter)instance.CommandClasses[50]).Sub.ContainsKey(0)) { //Meter
|
((Sensormultilevel)instance.CommandClasses[ACommandClass.Classes.SensorMultilevel]).Sub.ContainsKey(4) &&
|
||||||
|
instance.CommandClasses.ContainsKey(ACommandClass.Classes.Meter) && ((Meter)instance.CommandClasses[ACommandClass.Classes.Meter]).Sub.ContainsKey(0)) {
|
||||||
String topic = "/flex4grid/v1/households/" + this.household + "/device/consumption";
|
String topic = "/flex4grid/v1/households/" + this.household + "/device/consumption";
|
||||||
String text = JsonMapper.ToJson(new Dictionary<String, String>() {
|
String text = JsonMapper.ToJson(new Dictionary<String, String>() {
|
||||||
{ "timestamp", DateTime.Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffff'Z'") },
|
{ "timestamp", DateTime.Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffff'Z'") },
|
||||||
{ "id", instance.DeviceId.ToString() },
|
{ "id", instance.DeviceId.ToString() },
|
||||||
{ "power", Math.Round(((Sensormultilevelsub)((Sensormultilevel)instance.CommandClasses[49]).Sub[4]).Level).ToString("F0") },
|
{ "power", Math.Round(((Sensormultilevelsub)((Sensormultilevel)instance.CommandClasses[ACommandClass.Classes.SensorMultilevel]).Sub[4]).Level).ToString("F0") },
|
||||||
{ "energyCumul", ((Metersub)((Meter)instance.CommandClasses[50]).Sub[0]).Level.ToString() }
|
{ "energyCumul", ((Metersub)((Meter)instance.CommandClasses[ACommandClass.Classes.Meter]).Sub[0]).Level.ToString() }
|
||||||
}).ToString();
|
}).ToString();
|
||||||
this.mqtt.Send(topic, text);
|
this.mqtt.Send(topic, text);
|
||||||
this.Update?.Invoke(this, new Flex4gridEvent(topic, text));
|
this.Update?.Invoke(this, new Flex4gridEvent(topic, text));
|
||||||
@ -87,8 +89,9 @@ namespace ZwayBot.Moduls {
|
|||||||
foreach (String item in this.ini.GetValue("zway", "devices").Split(',')) {
|
foreach (String item in this.ini.GetValue("zway", "devices").Split(',')) {
|
||||||
if (item == device) {
|
if (item == device) {
|
||||||
Int32 deviceid = Int32.Parse(device);
|
Int32 deviceid = Int32.Parse(device);
|
||||||
if (this.zw.Devices.ContainsKey(deviceid) && this.zw.Devices[deviceid].Instances.ContainsKey(0) && this.zw.Devices[deviceid].Instances[0].CommandClasses.ContainsKey(37)) {
|
if (this.zw.Devices.ContainsKey(deviceid) && this.zw.Devices[deviceid].Instances.ContainsKey(0) &&
|
||||||
((Switchbinary)this.zw.Devices[deviceid].Instances[0].CommandClasses[37]).Level = message["command"].ToString() == "ON";
|
this.zw.Devices[deviceid].Instances[0].CommandClasses.ContainsKey(ACommandClass.Classes.SwitchBinary)) {
|
||||||
|
((Switchbinary)this.zw.Devices[deviceid].Instances[0].CommandClasses[ACommandClass.Classes.SwitchBinary]).Level = message["command"].ToString() == "ON";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -101,8 +104,8 @@ namespace ZwayBot.Moduls {
|
|||||||
foreach (String device in this.ini.GetValue("zway", "devices").Split(',')) {
|
foreach (String device in this.ini.GetValue("zway", "devices").Split(',')) {
|
||||||
Int32 deviceid = Int32.Parse(device);
|
Int32 deviceid = Int32.Parse(device);
|
||||||
if (this.zw.Devices.ContainsKey(deviceid) && this.zw.Devices[deviceid].Instances.ContainsKey(0)) {
|
if (this.zw.Devices.ContainsKey(deviceid) && this.zw.Devices[deviceid].Instances.ContainsKey(0)) {
|
||||||
if (this.zw.Devices[deviceid].Instances[0].CommandClasses.ContainsKey(37)) {
|
if (this.zw.Devices[deviceid].Instances[0].CommandClasses.ContainsKey(ACommandClass.Classes.SwitchBinary)) {
|
||||||
Switchbinary sw = ((Switchbinary)this.zw.Devices[deviceid].Instances[0].CommandClasses[37]);
|
Switchbinary sw = ((Switchbinary)this.zw.Devices[deviceid].Instances[0].CommandClasses[ACommandClass.Classes.SwitchBinary]);
|
||||||
response.Add(sw.DeviceId.ToString(), sw.Level ? "active" : "idle");
|
response.Add(sw.DeviceId.ToString(), sw.Level ? "active" : "idle");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -116,7 +119,7 @@ namespace ZwayBot.Moduls {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RequestAlive() {
|
private void RequestAlive(Object o) {
|
||||||
String raspi = this.ini.GetValue("f4g", "raspi");
|
String raspi = this.ini.GetValue("f4g", "raspi");
|
||||||
lock (this.requestalivelock) {
|
lock (this.requestalivelock) {
|
||||||
String req = "https://wiki.flex4grid.eu/rupdate/rupdate_general.yml.gpg.asc?gw=" + raspi;
|
String req = "https://wiki.flex4grid.eu/rupdate/rupdate_general.yml.gpg.asc?gw=" + raspi;
|
||||||
@ -151,7 +154,7 @@ namespace ZwayBot.Moduls {
|
|||||||
if (this.ini.GetValue("f4g", "raspi") != null) {
|
if (this.ini.GetValue("f4g", "raspi") != null) {
|
||||||
foreach (KeyValuePair<String, AModul> item in moduls) {
|
foreach (KeyValuePair<String, AModul> item in moduls) {
|
||||||
if (item.Value is CronJob) {
|
if (item.Value is CronJob) {
|
||||||
item.Value.SetInterconnection("10,40 * * * *", this.RequestAlive);
|
item.Value.SetInterconnection("10,40 * * * *", new Action<Object>(this.RequestAlive), null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
62
Zway-Bot/Moduls/Mqtt.cs
Normal file
62
Zway-Bot/Moduls/Mqtt.cs
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
using System;
|
||||||
|
using BlubbFish.IoT.Zway;
|
||||||
|
using BlubbFish.IoT.Zway.Events;
|
||||||
|
using BlubbFish.IoT.Zway.Interfaces;
|
||||||
|
using BlubbFish.Utils;
|
||||||
|
using BlubbFish.Utils.IoT.Connector;
|
||||||
|
|
||||||
|
namespace ZwayBot.Moduls {
|
||||||
|
class Mqtt : AModul, IDisposable {
|
||||||
|
private ADataBackend mqtt;
|
||||||
|
|
||||||
|
public override event ModulEvent Update;
|
||||||
|
|
||||||
|
public Mqtt(ZwayController zway, InIReader settings) : base(zway, settings) {
|
||||||
|
this.mqtt = ADataBackend.GetInstance(this.ini.GetSection("settings"));
|
||||||
|
this.mqtt.MessageIncomming += this.Mqtt_MessageIncomming;
|
||||||
|
this.zw.Update += this.ZwayEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ZwayEvent(Object sender, DeviceUpdateEvent e) {
|
||||||
|
String topic = "";
|
||||||
|
String data = "";
|
||||||
|
if(e.Parent.HasAbstract(typeof(ACommandClass))) {
|
||||||
|
ACommandClass sensor = (ACommandClass)e.Parent;
|
||||||
|
topic = "/zwavebot/devices/" + sensor.MqttTopic();
|
||||||
|
data = sensor.ToJson();
|
||||||
|
}
|
||||||
|
if(topic != "" && data != "") {
|
||||||
|
this.mqtt.Send(topic, data);
|
||||||
|
this.Update?.Invoke(this, new MqttEvent(topic, data));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Mqtt_MessageIncomming(Object sender, MqttEventArgs e) {
|
||||||
|
if(e.Message.StartsWith("/zwavebot/devices/") && e.Message.EndsWith("set")) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#region IDisposable Support
|
||||||
|
private Boolean disposedValue = false;
|
||||||
|
|
||||||
|
protected virtual void Dispose(Boolean disposing) {
|
||||||
|
if (!this.disposedValue) {
|
||||||
|
if (disposing) {
|
||||||
|
this.mqtt.Dispose();
|
||||||
|
}
|
||||||
|
this.disposedValue = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
~Mqtt() {
|
||||||
|
Dispose(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Dispose() {
|
||||||
|
Dispose(true);
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
@ -20,30 +20,18 @@ namespace ZwayBot.Moduls {
|
|||||||
String from = this.ini.GetValue(item, "from");
|
String from = this.ini.GetValue(item, "from");
|
||||||
String[] source = from.Split(':');
|
String[] source = from.Split(':');
|
||||||
this.events.Add(source[0], this.ini.GetSection(item));
|
this.events.Add(source[0], this.ini.GetSection(item));
|
||||||
String[] addr = source[0].Split('-');
|
ACommandClass c = this.zw.GetCommandClass(source[0]);
|
||||||
ICommandClass c;
|
if (c != null) {
|
||||||
if (addr.Length == 3 || addr.Length == 4) {
|
c.Polling = true;
|
||||||
Int32 deviceid = Int32.Parse(addr[0]);
|
c.Update += this.ChangedEvent;
|
||||||
Int32 instanceid = Int32.Parse(addr[1]);
|
|
||||||
Int32 classid = Int32.Parse(addr[2]);
|
|
||||||
if (addr.Length == 4) {
|
|
||||||
Int32 subcid = Int32.Parse(addr[3]);
|
|
||||||
c = this.zw.GetCommandClassSub(deviceid, instanceid, classid, subcid);
|
|
||||||
} else {
|
|
||||||
c = this.zw.GetCommandClass(deviceid, instanceid, classid);
|
|
||||||
}
|
|
||||||
if (c != null) {
|
|
||||||
c.Polling = true;
|
|
||||||
c.Update += this.ChangedEvent;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ChangedEvent(Object sender, DeviceUpdateEvent e) {
|
private void ChangedEvent(Object sender, DeviceUpdateEvent e) {
|
||||||
if(Helper.HasInterface(sender, "ICommandClass")) {
|
if(sender.HasAbstract(typeof(ACommandClass))) {
|
||||||
if (this.events.ContainsKey(((ICommandClass)sender).Id)) {
|
if (this.events.ContainsKey(((ACommandClass)sender).Id)) {
|
||||||
this.SetValues(sender, ((ICommandClass)sender).Id, this.events[((ICommandClass)sender).Id]);
|
this.SetValues(sender, ((ACommandClass)sender).Id, this.events[((ACommandClass)sender).Id]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -55,8 +43,8 @@ namespace ZwayBot.Moduls {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String source_value;
|
String source_value;
|
||||||
if (Helper.HasProperty(sender, source[1])) {
|
if (sender.HasProperty(source[1])) {
|
||||||
source_value = Helper.GetProperty(sender, source[1]).ToString();
|
source_value = sender.GetProperty(source[1]).ToString();
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -71,26 +59,12 @@ namespace ZwayBot.Moduls {
|
|||||||
foreach (String to in dictionary["to"].Split(';')) {
|
foreach (String to in dictionary["to"].Split(';')) {
|
||||||
String[] target = to.Split(':');
|
String[] target = to.Split(':');
|
||||||
if(target.Length == 2) {
|
if(target.Length == 2) {
|
||||||
String[] addr = target[0].Split('-');
|
ACommandClass c = this.zw.GetCommandClass(target[0]);
|
||||||
if (addr.Length == 3 || addr.Length == 4) {
|
if (c != null) {
|
||||||
Int32 deviceid = Int32.Parse(addr[0]);
|
if (c.HasProperty(target[1])) {
|
||||||
Int32 instanceid = Int32.Parse(addr[1]);
|
if (c.GetProperty(target[1]).ToString() != source_value) {
|
||||||
Int32 classid = Int32.Parse(addr[2]);
|
c.SetProperty(target[1], source_value);
|
||||||
ICommandClass c;
|
this.Update?.Invoke(this, new OvertakerEvent(target[0], target[1], source_value));
|
||||||
if (addr.Length == 4) {
|
|
||||||
Int32 subcid = Int32.Parse(addr[3]);
|
|
||||||
c = this.zw.GetCommandClassSub(deviceid, instanceid, classid, subcid);
|
|
||||||
} else {
|
|
||||||
c = this.zw.GetCommandClass(deviceid, instanceid, classid);
|
|
||||||
}
|
|
||||||
if (c != null) {
|
|
||||||
String target_value;
|
|
||||||
if (Helper.HasProperty(c, target[1])) {
|
|
||||||
target_value = Helper.GetProperty(c, target[1]).ToString();
|
|
||||||
if (target_value != source_value) {
|
|
||||||
Helper.SetProperty(c, target[1], source_value);
|
|
||||||
this.Update?.Invoke(this, new OvertakerEvent(target[0], target[1], source_value));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
58
Zway-Bot/Moduls/StatusPolling.cs
Normal file
58
Zway-Bot/Moduls/StatusPolling.cs
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using BlubbFish.IoT.Zway;
|
||||||
|
using BlubbFish.IoT.Zway.Devices;
|
||||||
|
using BlubbFish.IoT.Zway.Interfaces;
|
||||||
|
using BlubbFish.Utils;
|
||||||
|
using ZwayBot.Interfaces;
|
||||||
|
|
||||||
|
namespace ZwayBot.Moduls {
|
||||||
|
class Statuspolling : AModul, IDisposable, IForceLoad {
|
||||||
|
public override event ModulEvent Update;
|
||||||
|
|
||||||
|
public Statuspolling(ZwayController zway, InIReader settings) : base(zway, settings) { }
|
||||||
|
|
||||||
|
|
||||||
|
public override void Interconnect(Dictionary<String, AModul> moduls) {
|
||||||
|
foreach (KeyValuePair<String, AModul> item in moduls) {
|
||||||
|
if (item.Value is CronJob) {
|
||||||
|
item.Value.SetInterconnection("0 0 * * *", new Action<Object>(this.PollAll), null);
|
||||||
|
if (this.ini != null) {
|
||||||
|
foreach (String section in this.ini.GetSections()) {
|
||||||
|
if (this.ini.GetValue(section, "cron") != null && this.ini.GetValue(section, "devices") != null) {
|
||||||
|
item.Value.SetInterconnection(this.ini.GetValue(section, "cron"), new Action<Object>(this.PollSpecific), this.ini.GetValue(section, "devices"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PollSpecific(Object obj) {
|
||||||
|
String devices = (String)obj;
|
||||||
|
foreach (String item in devices.Split(',')) {
|
||||||
|
ACommandClass c = this.zw.GetCommandClass(item);
|
||||||
|
c.PollOnce = true;
|
||||||
|
this.Update?.Invoke(this, new StatusPollingEvent("Polling", item));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PollAll(Object o) {
|
||||||
|
foreach (KeyValuePair<Int32, Device> device in this.zw.Devices) {
|
||||||
|
foreach (KeyValuePair<Int32, Instance> instance in device.Value.Instances) {
|
||||||
|
foreach (KeyValuePair<ACommandClass.Classes, ACommandClass> commandclass in instance.Value.CommandClasses) {
|
||||||
|
commandclass.Value.PollOnce = true;
|
||||||
|
if(commandclass.Value.HasSub) {
|
||||||
|
foreach (KeyValuePair<Int32, ACommandClass> subclass in commandclass.Value.Sub) {
|
||||||
|
subclass.Value.PollOnce = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.Update?.Invoke(this, new StatusPollingEvent("Polling", "all nodes"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Dispose() {}
|
||||||
|
}
|
||||||
|
}
|
@ -4,7 +4,6 @@ using System.IO;
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using BlubbFish.IoT.Zway;
|
using BlubbFish.IoT.Zway;
|
||||||
using BlubbFish.Utils;
|
using BlubbFish.Utils;
|
||||||
using ZwayBot.Moduls;
|
|
||||||
|
|
||||||
namespace ZwayBot {
|
namespace ZwayBot {
|
||||||
class Program {
|
class Program {
|
||||||
@ -78,6 +77,9 @@ namespace ZwayBot {
|
|||||||
if (File.Exists(name.ToLower() + ".ini")) {
|
if (File.Exists(name.ToLower() + ".ini")) {
|
||||||
this.moduls.Add(name, (AModul)t.GetConstructor(new Type[] { typeof(ZwayController), typeof(InIReader) }).Invoke(new Object[] { this.zw, InIReader.GetInstance(name.ToLower() + ".ini") }));
|
this.moduls.Add(name, (AModul)t.GetConstructor(new Type[] { typeof(ZwayController), typeof(InIReader) }).Invoke(new Object[] { this.zw, InIReader.GetInstance(name.ToLower() + ".ini") }));
|
||||||
Console.WriteLine("Load Modul " + name);
|
Console.WriteLine("Load Modul " + name);
|
||||||
|
} else if(t.HasInterface("IForceLoad")) {
|
||||||
|
this.moduls.Add(name, (AModul)t.GetConstructor(new Type[] { typeof(ZwayController), typeof(InIReader) }).Invoke(new Object[] { this.zw, null }));
|
||||||
|
Console.WriteLine("Load Modul Forced " + name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,8 +33,8 @@ using System.Runtime.InteropServices;
|
|||||||
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
|
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
|
||||||
// übernehmen, indem Sie "*" eingeben:
|
// übernehmen, indem Sie "*" eingeben:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.1.2.1")]
|
[assembly: AssemblyVersion("1.2.0.0")]
|
||||||
[assembly: AssemblyFileVersion("1.1.2.1")]
|
[assembly: AssemblyFileVersion("1.2.0.0")]
|
||||||
[assembly: NeutralResourcesLanguage("de-DE")]
|
[assembly: NeutralResourcesLanguage("de-DE")]
|
||||||
|
|
||||||
// “Internet Of Things” icon by By Michael Wohlwend, US, from thenounproject.com.
|
// “Internet Of Things” icon by By Michael Wohlwend, US, from thenounproject.com.
|
||||||
|
@ -54,12 +54,14 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Events.cs" />
|
<Compile Include="Events.cs" />
|
||||||
|
<Compile Include="Interfaces\IForceLoad.cs" />
|
||||||
<Compile Include="Moduls\AModul.cs" />
|
<Compile Include="Moduls\AModul.cs" />
|
||||||
<Compile Include="Moduls\CronJob.cs" />
|
<Compile Include="Moduls\CronJob.cs" />
|
||||||
<Compile Include="Helper.cs" />
|
<Compile Include="Helper.cs" />
|
||||||
<Compile Include="Moduls\Flex4Grid.cs" />
|
<Compile Include="Moduls\Flex4Grid.cs" />
|
||||||
<Compile Include="Moduls\Mqtt.cs" />
|
<Compile Include="Moduls\Mqtt.cs" />
|
||||||
<Compile Include="Moduls\Overtaker.cs" />
|
<Compile Include="Moduls\Overtaker.cs" />
|
||||||
|
<Compile Include="Moduls\StatusPolling.cs" />
|
||||||
<Compile Include="Program.cs" />
|
<Compile Include="Program.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="Properties\Resources.Designer.cs">
|
<Compile Include="Properties\Resources.Designer.cs">
|
||||||
@ -73,6 +75,10 @@
|
|||||||
<Project>{39235fad-ba9d-4b51-82fc-6969967beae9}</Project>
|
<Project>{39235fad-ba9d-4b51-82fc-6969967beae9}</Project>
|
||||||
<Name>ConnectorDataMosquitto</Name>
|
<Name>ConnectorDataMosquitto</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\Utils\IoT\Connector\Data\Mqtt\ConnectorDataMqtt.csproj">
|
||||||
|
<Project>{ee6c8f68-ed46-4c1c-abdd-cfcdf75104f2}</Project>
|
||||||
|
<Name>ConnectorDataMqtt</Name>
|
||||||
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\..\Utils\IoT\Utils-IoT.csproj">
|
<ProjectReference Include="..\..\Utils\IoT\Utils-IoT.csproj">
|
||||||
<Project>{b870e4d5-6806-4a0b-b233-8907eedc5afc}</Project>
|
<Project>{b870e4d5-6806-4a0b-b233-8907eedc5afc}</Project>
|
||||||
<Name>Utils-IoT</Name>
|
<Name>Utils-IoT</Name>
|
||||||
|
Binary file not shown.
BIN
Zway-Bot/bin/Release/ConnectorDataMqtt.dll
Normal file
BIN
Zway-Bot/bin/Release/ConnectorDataMqtt.dll
Normal file
Binary file not shown.
BIN
Zway-Bot/bin/Release/M2Mqtt.Net.dll
Normal file
BIN
Zway-Bot/bin/Release/M2Mqtt.Net.dll
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user