Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c792ea20ad | ||
|
|
611205e78f | ||
|
|
4be8bb72f4 | ||
|
|
76cb025606 | ||
|
|
aa84aa0539 | ||
|
|
04f43b95ff | ||
|
|
a1009b5293 | ||
|
|
91a05f882e | ||
|
|
74d270b6d2 | ||
|
|
200420c9b0 | ||
|
|
acf5cea593 | ||
|
|
307f03c7c0 | ||
|
|
32b4daf3fb | ||
|
|
55e88f7b45 | ||
|
|
8baef3b2b5 | ||
|
|
80baca45e5 | ||
|
|
75eac65510 | ||
|
|
44b8daa325 | ||
|
|
2cd2c7c02e |
+18
-6
@@ -11,10 +11,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils", "..\Utils\Utils\Uti
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils-IoT", "..\Utils\IoT\Utils-IoT.csproj", "{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils-IoT", "..\Utils\IoT\Utils-IoT.csproj", "{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConnectorDataMosquitto", "..\Utils\IoT\Connector\Data\Mosquitto\ConnectorDataMosquitto.csproj", "{39235FAD-BA9D-4B51-82FC-6969967BEAE9}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConnectorDataMqtt", "..\Utils\IoT\Connector\Data\Mqtt\ConnectorDataMqtt.csproj", "{EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConnectorDataMqtt", "..\Utils\IoT\Connector\Data\Mqtt\ConnectorDataMqtt.csproj", "{EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Iot-Interfaces", "..\Utils\IoT\Interfaces\Iot-Interfaces.csproj", "{4DAADA29-C600-4CF3-8AD3-9C97C8D7F632}"
|
||||||
|
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}") = "M2Mqtt", "..\Librarys\mqtt\M2Mqtt\M2Mqtt_4.7.1.csproj", "{A11AEF5A-B246-4FE8-8330-06DB73CC8074}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -37,14 +41,22 @@ Global
|
|||||||
{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Debug|Any CPU.Build.0 = 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.ActiveCfg = Release|Any CPU
|
||||||
{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Release|Any CPU.Build.0 = Release|Any CPU
|
{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{39235FAD-BA9D-4B51-82FC-6969967BEAE9}.Debug|Any CPU.ActiveCfg = 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.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.ActiveCfg = Debug|Any CPU
|
||||||
{EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}.Debug|Any CPU.Build.0 = 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.ActiveCfg = Release|Any CPU
|
||||||
{EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}.Release|Any CPU.Build.0 = Release|Any CPU
|
{EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{4DAADA29-C600-4CF3-8AD3-9C97C8D7F632}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{4DAADA29-C600-4CF3-8AD3-9C97C8D7F632}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{4DAADA29-C600-4CF3-8AD3-9C97C8D7F632}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{4DAADA29-C600-4CF3-8AD3-9C97C8D7F632}.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
|
||||||
|
{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
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
@@ -54,10 +54,29 @@ namespace ZwayBot {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static Boolean HasInterface(this Object o, Type interf) {
|
||||||
|
foreach(Type item in o.GetType().GetInterfaces()) {
|
||||||
|
if(item == interf) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
internal static void WriteError(String text) {
|
internal static void WriteError(String text) {
|
||||||
Console.ForegroundColor = ConsoleColor.Red;
|
Console.ForegroundColor = ConsoleColor.Red;
|
||||||
Console.Error.WriteLine("ERROR: " + text);
|
Console.Error.WriteLine("ERROR: " + text);
|
||||||
Console.ResetColor();
|
Console.ResetColor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,14 +6,44 @@ using BlubbFish.Utils;
|
|||||||
namespace ZwayBot {
|
namespace ZwayBot {
|
||||||
abstract class AModul {
|
abstract class AModul {
|
||||||
protected ZwayController zw;
|
protected ZwayController zw;
|
||||||
protected InIReader ini;
|
private InIReader settings;
|
||||||
|
protected Dictionary<String, Dictionary<String, String>> config = new Dictionary<String, Dictionary<String, String>>();
|
||||||
|
|
||||||
|
public Boolean HasConfig { get; private set; }
|
||||||
|
public Boolean ConfigPublic { get; private set; }
|
||||||
|
|
||||||
public delegate void ModulEvent(Object sender, ModulEventArgs e);
|
public delegate void ModulEvent(Object sender, ModulEventArgs e);
|
||||||
public abstract event ModulEvent Update;
|
public abstract event ModulEvent Update;
|
||||||
|
|
||||||
public AModul(ZwayController zway, InIReader settings) {
|
public AModul(ZwayController zway, InIReader settings) {
|
||||||
|
this.HasConfig = false;
|
||||||
|
this.ConfigPublic = false;
|
||||||
this.zw = zway;
|
this.zw = zway;
|
||||||
this.ini = settings;
|
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<String, Dictionary<String, String>> GetConfig() {
|
||||||
|
if (this.HasConfig && this.ConfigPublic) {
|
||||||
|
Dictionary<String, Dictionary<String, String>> ret = new Dictionary<String, Dictionary<String, String>>(this.config);
|
||||||
|
if(ret.ContainsKey("modul")) {
|
||||||
|
ret.Remove("modul");
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
return new Dictionary<String, Dictionary<String, String>>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void Interconnect(Dictionary<String, AModul> moduls) { }
|
public virtual void Interconnect(Dictionary<String, AModul> moduls) { }
|
||||||
@@ -21,5 +51,21 @@ namespace ZwayBot {
|
|||||||
public virtual void SetInterconnection(String param, Action<Object> hook, Object data) { }
|
public virtual void SetInterconnection(String param, Action<Object> hook, Object data) { }
|
||||||
|
|
||||||
public abstract void Dispose();
|
public abstract void Dispose();
|
||||||
|
|
||||||
|
internal void SetConfig(Dictionary<String, Dictionary<String, String>> newconf) {
|
||||||
|
if (this.HasConfig && this.ConfigPublic) {
|
||||||
|
if (newconf.ContainsKey("modul")) {
|
||||||
|
newconf.Remove("modul");
|
||||||
|
}
|
||||||
|
if (this.config.ContainsKey("modul")) {
|
||||||
|
newconf.Add("modul", this.config["modul"]);
|
||||||
|
}
|
||||||
|
this.config = newconf;
|
||||||
|
this.settings.SetSections(this.config);
|
||||||
|
this.UpdateConfig();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract void UpdateConfig();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,10 +36,10 @@ 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;
|
||||||
if (this.ini != null) {
|
if (this.config.Count != 0) {
|
||||||
foreach (String item in this.ini.GetSections()) {
|
foreach (KeyValuePair<String, Dictionary<String, String>> item in this.config) {
|
||||||
if (this.ParseCronString(this.ini.GetValue(item, "cron"))) {
|
if (item.Value.ContainsKey("cron") && item.Value.ContainsKey("set") && this.ParseCronString(item.Value["cron"])) {
|
||||||
this.SetValues(this.ini.GetValue(item, "set"));
|
this.SetValues(item.Value["set"]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -157,6 +157,8 @@ namespace ZwayBot.Moduls {
|
|||||||
this.internalCron.Add(new Tuple<String, Action<Object>, Object>(cron, hook, data));
|
this.internalCron.Add(new Tuple<String, Action<Object>, Object>(cron, hook, data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void UpdateConfig() { }
|
||||||
|
|
||||||
#region IDisposable Support
|
#region IDisposable Support
|
||||||
private Boolean disposedValue = false;
|
private Boolean disposedValue = false;
|
||||||
|
|
||||||
|
|||||||
@@ -1,187 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Net;
|
|
||||||
using BlubbFish.IoT.Zway;
|
|
||||||
using BlubbFish.IoT.Zway.Devices;
|
|
||||||
using BlubbFish.IoT.Zway.Devices.CommandClasses;
|
|
||||||
using BlubbFish.IoT.Zway.Devices.CommandClasses.CommandClassSubs;
|
|
||||||
using BlubbFish.IoT.Zway.Events;
|
|
||||||
using BlubbFish.IoT.Zway.Interfaces;
|
|
||||||
using BlubbFish.Utils;
|
|
||||||
using BlubbFish.Utils.IoT.Connector;
|
|
||||||
using LitJson;
|
|
||||||
|
|
||||||
namespace ZwayBot.Moduls {
|
|
||||||
class Flex4Grid : AModul, IDisposable {
|
|
||||||
private ADataBackend mqtt;
|
|
||||||
private String household = "";
|
|
||||||
private Object requestalivelock = new Object();
|
|
||||||
|
|
||||||
public override event ModulEvent Update;
|
|
||||||
|
|
||||||
public Flex4Grid(ZwayController zway, InIReader settings) : base(zway, settings) {
|
|
||||||
this.mqtt = ADataBackend.GetInstance(this.ini.GetSection("settings"));
|
|
||||||
this.ParseIni();
|
|
||||||
this.mqtt.MessageIncomming += this.Mqtt_MessageIncomming;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ParseIni() {
|
|
||||||
if (this.ini.GetValue("zway", "devices") != null) {
|
|
||||||
foreach (String device in this.ini.GetValue("zway", "devices").Split(',')) {
|
|
||||||
Int32 deviceid = Int32.Parse(device);
|
|
||||||
if (this.zw.Devices.ContainsKey(deviceid) && this.zw.Devices[deviceid].Instances.ContainsKey(0)) {
|
|
||||||
this.zw.Devices[deviceid].Instances[0].Update += this.DeviceUpdate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(this.ini.GetValue("f4g", "household") != null) {
|
|
||||||
this.household = this.ini.GetValue("f4g", "household");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void DeviceUpdate(Object sender, DeviceUpdateEvent e) {
|
|
||||||
Instance instance = (Instance)sender;
|
|
||||||
if(e.Parent.GetType() == typeof(Switchbinary)) {
|
|
||||||
if (instance.CommandClasses.ContainsKey(ACommandClass.Classes.SwitchBinary)) {
|
|
||||||
String topic = "/flex4grid/v1/households/" + this.household + "/device/state";
|
|
||||||
String text = JsonMapper.ToJson(new Dictionary<String, String>() {
|
|
||||||
{ "status", ((Switchbinary)instance.CommandClasses[ACommandClass.Classes.SwitchBinary]).Level?"active":"idle" },
|
|
||||||
{ "timestamp", DateTime.Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffff'Z'") },
|
|
||||||
{ "type", ((Switchbinary)instance.CommandClasses[ACommandClass.Classes.SwitchBinary]).Name },
|
|
||||||
{ "id", instance.DeviceId.ToString() }
|
|
||||||
}).ToString();
|
|
||||||
this.mqtt.Send(topic, text);
|
|
||||||
this.Update?.Invoke(this, new Flex4gridEvent(topic, text));
|
|
||||||
}
|
|
||||||
} else if(e.Parent.GetType() == typeof(Sensormultilevelsub) || e.Parent.GetType() == typeof(Metersub)) {
|
|
||||||
if (instance.CommandClasses.ContainsKey(ACommandClass.Classes.SensorMultilevel) &&
|
|
||||||
((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 text = JsonMapper.ToJson(new Dictionary<String, String>() {
|
|
||||||
{ "timestamp", DateTime.Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffff'Z'") },
|
|
||||||
{ "id", instance.DeviceId.ToString() },
|
|
||||||
{ "power", Math.Round(((Sensormultilevelsub)((Sensormultilevel)instance.CommandClasses[ACommandClass.Classes.SensorMultilevel]).Sub[4]).Level).ToString("F0") },
|
|
||||||
{ "energyCumul", ((Metersub)((Meter)instance.CommandClasses[ACommandClass.Classes.Meter]).Sub[0]).Level.ToString() }
|
|
||||||
}).ToString();
|
|
||||||
this.mqtt.Send(topic, text);
|
|
||||||
this.Update?.Invoke(this, new Flex4gridEvent(topic, text));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Mqtt_MessageIncomming(Object sender, MqttEventArgs e) {
|
|
||||||
JsonData message;
|
|
||||||
String topic = e.Topic;
|
|
||||||
try {
|
|
||||||
if (e.Message.StartsWith("{")) {
|
|
||||||
message = JsonMapper.ToObject(e.Message);
|
|
||||||
} else {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} catch (Exception) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(topic == "/flex4grid/v1/households/" + this.household + "/device/actuate") {
|
|
||||||
if(message.Keys.Contains("deviceId") && message.Keys.Contains("command")) {
|
|
||||||
String device = message["deviceId"].ToString();
|
|
||||||
if(this.ini.GetValue("zway", "devices") != null) {
|
|
||||||
foreach (String item in this.ini.GetValue("zway", "devices").Split(',')) {
|
|
||||||
if (item == 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(ACommandClass.Classes.SwitchBinary)) {
|
|
||||||
((Switchbinary)this.zw.Devices[deviceid].Instances[0].CommandClasses[ACommandClass.Classes.SwitchBinary]).Level = message["command"].ToString() == "ON";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (topic == "/flex4grid/v1/households/" + this.household + "/devices/state/request") {
|
|
||||||
if (this.ini.GetValue("zway", "devices") != null) {
|
|
||||||
Dictionary<String, String> response = new Dictionary<String, String>();
|
|
||||||
foreach (String device in this.ini.GetValue("zway", "devices").Split(',')) {
|
|
||||||
Int32 deviceid = Int32.Parse(device);
|
|
||||||
if (this.zw.Devices.ContainsKey(deviceid) && this.zw.Devices[deviceid].Instances.ContainsKey(0)) {
|
|
||||||
if (this.zw.Devices[deviceid].Instances[0].CommandClasses.ContainsKey(ACommandClass.Classes.SwitchBinary)) {
|
|
||||||
Switchbinary sw = ((Switchbinary)this.zw.Devices[deviceid].Instances[0].CommandClasses[ACommandClass.Classes.SwitchBinary]);
|
|
||||||
response.Add(sw.DeviceId.ToString(), sw.Level ? "active" : "idle");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(response.Count != 0) {
|
|
||||||
response.Add("timestamp", DateTime.Now.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'ffffff'Z'"));
|
|
||||||
String rtopic = "/flex4grid/v1/households/" + this.household + "/devices/state/response";
|
|
||||||
String rtext = JsonMapper.ToJson(response).ToString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RequestAlive(Object o) {
|
|
||||||
String raspi = this.ini.GetValue("f4g", "raspi");
|
|
||||||
lock (this.requestalivelock) {
|
|
||||||
String req = "https://wiki.flex4grid.eu/rupdate/rupdate_general.yml.gpg.asc?gw=" + raspi;
|
|
||||||
HttpWebRequest request = WebRequest.CreateHttp(req);
|
|
||||||
try {
|
|
||||||
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
|
|
||||||
this.Update?.Invoke(this, new Flex4gridEvent(req, response.StatusCode.ToString()));
|
|
||||||
}
|
|
||||||
} catch (Exception) { }
|
|
||||||
}
|
|
||||||
lock (this.requestalivelock) {
|
|
||||||
String req = "https://wiki.flex4grid.eu/rupdate/rupdate_general.yml?gw=" + raspi;
|
|
||||||
HttpWebRequest request = WebRequest.CreateHttp(req);
|
|
||||||
try {
|
|
||||||
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
|
|
||||||
this.Update?.Invoke(this, new Flex4gridEvent(req, response.StatusCode.ToString()));
|
|
||||||
}
|
|
||||||
} catch (Exception) { }
|
|
||||||
}
|
|
||||||
lock (this.requestalivelock) {
|
|
||||||
String req = "http://swb.pcs.flex4grid.eu/gateway/" + raspi;
|
|
||||||
HttpWebRequest request = WebRequest.CreateHttp(req);
|
|
||||||
try {
|
|
||||||
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
|
|
||||||
this.Update?.Invoke(this, new Flex4gridEvent(req, response.StatusCode.ToString()));
|
|
||||||
}
|
|
||||||
} catch (Exception) { }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Interconnect(Dictionary<String, AModul> moduls) {
|
|
||||||
if (this.ini.GetValue("f4g", "raspi") != null) {
|
|
||||||
foreach (KeyValuePair<String, AModul> item in moduls) {
|
|
||||||
if (item.Value is CronJob) {
|
|
||||||
item.Value.SetInterconnection("10,40 * * * *", new Action<Object>(this.RequestAlive), null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IDisposable Support
|
|
||||||
private Boolean disposedValue = false;
|
|
||||||
|
|
||||||
protected virtual void Dispose(Boolean disposing) {
|
|
||||||
if (!this.disposedValue) {
|
|
||||||
if (disposing) {
|
|
||||||
this.mqtt.Dispose();
|
|
||||||
}
|
|
||||||
this.disposedValue = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
~Flex4Grid() {
|
|
||||||
Dispose(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Dispose() {
|
|
||||||
Dispose(true);
|
|
||||||
GC.SuppressFinalize(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+83
-11
@@ -1,41 +1,117 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
using BlubbFish.IoT.Zway;
|
using BlubbFish.IoT.Zway;
|
||||||
using BlubbFish.IoT.Zway.Events;
|
using BlubbFish.IoT.Zway.Events;
|
||||||
using BlubbFish.IoT.Zway.Interfaces;
|
using BlubbFish.IoT.Zway.Interfaces;
|
||||||
using BlubbFish.Utils;
|
using BlubbFish.Utils;
|
||||||
using BlubbFish.Utils.IoT.Connector;
|
using BlubbFish.Utils.IoT.Connector;
|
||||||
|
using BlubbFish.Utils.IoT.Events;
|
||||||
|
using LitJson;
|
||||||
|
|
||||||
namespace ZwayBot.Moduls {
|
namespace ZwayBot.Moduls {
|
||||||
class Mqtt : AModul, IDisposable {
|
class Mqtt : AModul, IDisposable {
|
||||||
private ADataBackend mqtt;
|
private ABackend mqtt;
|
||||||
|
private Dictionary<String, AModul> modules;
|
||||||
|
|
||||||
public override event ModulEvent Update;
|
public override event ModulEvent Update;
|
||||||
|
|
||||||
public Mqtt(ZwayController zway, InIReader settings) : base(zway, settings) {
|
public Mqtt(ZwayController zway, InIReader settings) : base(zway, settings) {
|
||||||
this.mqtt = ADataBackend.GetInstance(this.ini.GetSection("settings"));
|
if (this.config.ContainsKey("settings")) {
|
||||||
|
this.mqtt = ABackend.GetInstance(this.config["settings"], ABackend.BackendType.Data);
|
||||||
this.mqtt.MessageIncomming += this.Mqtt_MessageIncomming;
|
this.mqtt.MessageIncomming += this.Mqtt_MessageIncomming;
|
||||||
this.zw.Update += this.ZwayEvent;
|
this.zw.Update += this.ZwayEvent;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void ZwayEvent(Object sender, DeviceUpdateEvent e) {
|
private void ZwayEvent(Object sender, DeviceUpdateEvent e) {
|
||||||
String topic = "";
|
String topic = "";
|
||||||
String data = "";
|
String data = "";
|
||||||
if(e.Parent.HasAbstract(typeof(ACommandClass))) {
|
if(e.Parent.HasAbstract(typeof(ACommandClass))) {
|
||||||
ACommandClass sensor = (ACommandClass)e.Parent;
|
ACommandClass sensor = (ACommandClass)e.Parent;
|
||||||
topic = "/zwavebot/devices/" + sensor.MqttTopic();
|
topic = "zwavebot/devices/" + sensor.MqttTopic();
|
||||||
data = sensor.ToJson();
|
data = sensor.ToJson();
|
||||||
}
|
}
|
||||||
if(topic != "" && data != "") {
|
if(topic != "" && data != "") {
|
||||||
this.mqtt.Send(topic, data);
|
((ADataBackend)this.mqtt).Send(topic, data);
|
||||||
this.Update?.Invoke(this, new MqttEvent(topic, data));
|
this.Update?.Invoke(this, new MqttEvent(topic, data));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Mqtt_MessageIncomming(Object sender, MqttEventArgs e) {
|
private void Mqtt_MessageIncomming(Object sender, BackendEvent e) {
|
||||||
if(e.Message.StartsWith("/zwavebot/devices/") && e.Message.EndsWith("set")) {
|
if (e.From.ToString().StartsWith("zwavebot/devices/") && (e.From.ToString().EndsWith("/set") || e.From.ToString().EndsWith("/get"))) {
|
||||||
|
Match m = new Regex("^zwavebot/devices/(\\d+)/(\\d+)/(\\d+)/[gs]et$|^zwavebot/devices/(\\d+)/(\\d+)/(\\d+)/(\\d+)/[gs]et$").Match(e.From.ToString());
|
||||||
|
String id = "";
|
||||||
|
if(m.Groups[1].Success) {
|
||||||
|
id = m.Groups[1].Value + "-" + m.Groups[2].Value + "-" + m.Groups[3].Value;
|
||||||
|
}
|
||||||
|
if(m.Groups[4].Success) {
|
||||||
|
id = m.Groups[4].Value + "-" + m.Groups[5].Value + "-" + m.Groups[6].Value + "-" + m.Groups[7].Value;
|
||||||
|
}
|
||||||
|
ACommandClass c = this.zw.GetCommandClass(id);
|
||||||
|
if(c == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (e.From.ToString().EndsWith("/set")) {
|
||||||
|
try {
|
||||||
|
JsonData a = JsonMapper.ToObject(e.Message);
|
||||||
|
foreach (String item in a.Keys) {
|
||||||
|
String key = item.ToUpperLower();
|
||||||
|
if (c.HasProperty(key)) {
|
||||||
|
c.SetProperty(key, a[item].ToString());
|
||||||
|
this.Update?.Invoke(this, new MqttEvent(c.Id, a[item].ToString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception) { }
|
||||||
|
} else if(e.From.ToString().EndsWith("/get")) {
|
||||||
|
c.PollOnce = true;
|
||||||
|
((ADataBackend)this.mqtt).Send("zwavebot/devices/" + c.MqttTopic(), c.ToJson());
|
||||||
|
this.Update?.Invoke(this, new MqttEvent(e.From.ToString(), "Dataget"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (e.From.ToString().StartsWith("zwavebot/config/") && (e.From.ToString().EndsWith("/set") || e.From.ToString().EndsWith("/get"))) {
|
||||||
|
Match m = new Regex("^zwavebot/config/(\\w+)/[gs]et$|").Match(e.From.ToString());
|
||||||
|
if (!m.Groups[1].Success) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
AModul modul = null;
|
||||||
|
foreach (KeyValuePair<String, AModul> item in this.modules) {
|
||||||
|
if (item.Key.ToLower() == m.Groups[1].Value) {
|
||||||
|
modul = item.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (modul == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(e.From.ToString().EndsWith("/get") && modul.HasConfig && modul.ConfigPublic) {
|
||||||
|
String topic = "zwavebot/config/" + m.Groups[1].Value;
|
||||||
|
String data = JsonMapper.ToJson(modul.GetConfig()).ToString();
|
||||||
|
((ADataBackend)this.mqtt).Send(topic, data);
|
||||||
|
this.Update?.Invoke(this, new MqttEvent(topic, data));
|
||||||
|
}
|
||||||
|
if (e.From.ToString().EndsWith("/set") && modul.HasConfig && modul.ConfigPublic) {
|
||||||
|
try {
|
||||||
|
JsonData a = JsonMapper.ToObject(e.Message);
|
||||||
|
Dictionary<String, Dictionary<String, String>> newconf = new Dictionary<String, Dictionary<String, String>>();
|
||||||
|
foreach (String section in a.Keys) {
|
||||||
|
Dictionary<String, String> sectiondata = new Dictionary<String, String>();
|
||||||
|
foreach (String item in a[section].Keys) {
|
||||||
|
sectiondata.Add(item, a[section][item].ToString());
|
||||||
|
}
|
||||||
|
newconf.Add(section, sectiondata);
|
||||||
|
}
|
||||||
|
modul.SetConfig(newconf);
|
||||||
|
this.Update?.Invoke(this, new MqttEvent("New Config", "Write"));
|
||||||
|
} catch (Exception) { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Interconnect(Dictionary<String, AModul> moduls) {
|
||||||
|
this.modules = moduls;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
protected override void UpdateConfig() { }
|
||||||
|
|
||||||
#region IDisposable Support
|
#region IDisposable Support
|
||||||
private Boolean disposedValue = false;
|
private Boolean disposedValue = false;
|
||||||
@@ -49,10 +125,6 @@ namespace ZwayBot.Moduls {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
~Mqtt() {
|
|
||||||
Dispose(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Dispose() {
|
public override void Dispose() {
|
||||||
Dispose(true);
|
Dispose(true);
|
||||||
GC.SuppressFinalize(this);
|
GC.SuppressFinalize(this);
|
||||||
|
|||||||
@@ -16,10 +16,11 @@ namespace ZwayBot.Moduls {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void ParseIni() {
|
private void ParseIni() {
|
||||||
foreach (String item in this.ini.GetSections()) {
|
foreach (KeyValuePair<String, Dictionary<String, String>> item in this.config) {
|
||||||
String from = this.ini.GetValue(item, "from");
|
if (item.Value.ContainsKey("from")) {
|
||||||
|
String from = item.Value["from"];
|
||||||
String[] source = from.Split(':');
|
String[] source = from.Split(':');
|
||||||
this.events.Add(source[0], this.ini.GetSection(item));
|
this.events.Add(source[0], item.Value);
|
||||||
ACommandClass c = this.zw.GetCommandClass(source[0]);
|
ACommandClass c = this.zw.GetCommandClass(source[0]);
|
||||||
if (c != null) {
|
if (c != null) {
|
||||||
c.Polling = true;
|
c.Polling = true;
|
||||||
@@ -27,6 +28,7 @@ namespace ZwayBot.Moduls {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void ChangedEvent(Object sender, DeviceUpdateEvent e) {
|
private void ChangedEvent(Object sender, DeviceUpdateEvent e) {
|
||||||
if(sender.HasAbstract(typeof(ACommandClass))) {
|
if(sender.HasAbstract(typeof(ACommandClass))) {
|
||||||
@@ -56,9 +58,10 @@ namespace ZwayBot.Moduls {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (dictionary.ContainsKey("to")) {
|
||||||
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) {
|
||||||
ACommandClass c = this.zw.GetCommandClass(target[0]);
|
ACommandClass c = this.zw.GetCommandClass(target[0]);
|
||||||
if (c != null) {
|
if (c != null) {
|
||||||
if (c.HasProperty(target[1])) {
|
if (c.HasProperty(target[1])) {
|
||||||
@@ -71,6 +74,9 @@ namespace ZwayBot.Moduls {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void UpdateConfig() { }
|
||||||
|
|
||||||
#region IDisposable Support
|
#region IDisposable Support
|
||||||
private Boolean disposedValue = false;
|
private Boolean disposedValue = false;
|
||||||
|
|||||||
@@ -0,0 +1,64 @@
|
|||||||
|
using System;
|
||||||
|
using BlubbFish.IoT.Zway;
|
||||||
|
using BlubbFish.IoT.Zway.Events;
|
||||||
|
using BlubbFish.Utils;
|
||||||
|
using BlubbFish.Utils.IoT.Connector;
|
||||||
|
using BlubbFish.Utils.IoT.Events;
|
||||||
|
using BlubbFish.Utils.IoT.Interfaces;
|
||||||
|
|
||||||
|
namespace ZwayBot.Moduls {
|
||||||
|
class Senml : AModul {
|
||||||
|
public override event ModulEvent Update;
|
||||||
|
private ABackend mqtt;
|
||||||
|
private String SenmlGuid;
|
||||||
|
|
||||||
|
public Senml(ZwayController zway, InIReader settings) : base(zway, settings) {
|
||||||
|
if (this.config.ContainsKey("settings")) {
|
||||||
|
this.mqtt = ABackend.GetInstance(this.config["settings"], ABackend.BackendType.Data);
|
||||||
|
this.mqtt.MessageIncomming += this.EventInput;
|
||||||
|
this.zw.Update += this.EventOutput;
|
||||||
|
this.SenmlGuid = this.config["settings"]["guid"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Events
|
||||||
|
private void EventOutput(Object sender, DeviceUpdateEvent e) {
|
||||||
|
String topic = "";
|
||||||
|
String data = "";
|
||||||
|
if (e.Parent.HasInterface(typeof(ISenml))) {
|
||||||
|
ISenml sensor = (ISenml)e.Parent;
|
||||||
|
topic = sensor.SenmlTopic() + this.SenmlGuid+ "/senml";
|
||||||
|
data = sensor.ToSenml();
|
||||||
|
}
|
||||||
|
if (topic != "" && data != null && data != "") {
|
||||||
|
((ADataBackend)this.mqtt).Send(topic, data);
|
||||||
|
this.Update?.Invoke(this, new MqttEvent(topic, data));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void EventInput(Object sender, BackendEvent e) { }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Config
|
||||||
|
protected override void UpdateConfig() { }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region IDisposable Support
|
||||||
|
private Boolean disposedValue = false;
|
||||||
|
|
||||||
|
protected virtual void Dispose(Boolean disposing) {
|
||||||
|
if (!this.disposedValue) {
|
||||||
|
if (disposing) {
|
||||||
|
this.mqtt.Dispose();
|
||||||
|
}
|
||||||
|
this.disposedValue = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Dispose() {
|
||||||
|
Dispose(true);
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,10 +17,10 @@ namespace ZwayBot.Moduls {
|
|||||||
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("0 0 * * *", new Action<Object>(this.PollAll), null);
|
item.Value.SetInterconnection("0 0 * * *", new Action<Object>(this.PollAll), null);
|
||||||
if (this.ini != null) {
|
if (this.config.Count != 0) {
|
||||||
foreach (String section in this.ini.GetSections()) {
|
foreach (KeyValuePair<String, Dictionary<String, String>> section in this.config) {
|
||||||
if (this.ini.GetValue(section, "cron") != null && this.ini.GetValue(section, "devices") != null) {
|
if (section.Value.ContainsKey("cron") && section.Value.ContainsKey("devices")) {
|
||||||
item.Value.SetInterconnection(this.ini.GetValue(section, "cron"), new Action<Object>(this.PollSpecific), this.ini.GetValue(section, "devices"));
|
item.Value.SetInterconnection(section.Value["cron"], new Action<Object>(this.PollSpecific), section.Value["devices"]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -53,6 +53,8 @@ namespace ZwayBot.Moduls {
|
|||||||
this.Update?.Invoke(this, new StatusPollingEvent("Polling", "all nodes"));
|
this.Update?.Invoke(this, new StatusPollingEvent("Polling", "all nodes"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void UpdateConfig() { }
|
||||||
|
|
||||||
public override void Dispose() {}
|
public override void Dispose() {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-15
@@ -1,6 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using BlubbFish.IoT.Zway;
|
using BlubbFish.IoT.Zway;
|
||||||
using BlubbFish.Utils;
|
using BlubbFish.Utils;
|
||||||
@@ -9,21 +8,25 @@ namespace ZwayBot {
|
|||||||
class Program {
|
class Program {
|
||||||
static void Main(String[] args) => new Program(args);
|
static void Main(String[] args) => new Program(args);
|
||||||
|
|
||||||
private ZwayController zw;
|
private readonly ZwayController zw;
|
||||||
private Dictionary<String, AModul> moduls = new Dictionary<String, AModul>();
|
private readonly Dictionary<String, AModul> moduls = new Dictionary<String, AModul>();
|
||||||
|
private Boolean RunningProcess = true;
|
||||||
|
private readonly ProgramLogger logger = new ProgramLogger();
|
||||||
|
|
||||||
public Program(String[] args) {
|
public Program(String[] args) {
|
||||||
|
InIReader.SetSearchPath(new List<String>() { "/etc/zwaybot", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\zwaybot" });
|
||||||
Dictionary<String, String> names;
|
Dictionary<String, String> names;
|
||||||
if(File.Exists("names.ini")) {
|
if(InIReader.ConfigExist("names")) {
|
||||||
names = InIReader.GetInstance("names.ini").GetSection("names");
|
names = InIReader.GetInstance("names").GetSection("names");
|
||||||
} else {
|
} else {
|
||||||
names = new Dictionary<String, String>();
|
names = new Dictionary<String, String>();
|
||||||
}
|
}
|
||||||
if(!File.Exists("settings.ini")) {
|
if(!InIReader.ConfigExist("settings")) {
|
||||||
Helper.WriteError("No settings.ini found. Abord!");
|
Helper.WriteError("No settings.ini found. Abord!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.zw = new ZwayController(InIReader.GetInstance("settings.ini").GetSection("zway"), names, false);
|
this.logger.SetPath(InIReader.GetInstance("settings").GetValue("logging", "path"));
|
||||||
|
this.zw = new ZwayController(InIReader.GetInstance("settings").GetSection("zway"), names, false);
|
||||||
this.zw.Update += this.ZwayDataUpate;
|
this.zw.Update += this.ZwayDataUpate;
|
||||||
this.ModulLoader();
|
this.ModulLoader();
|
||||||
this.ModulInterconnect();
|
this.ModulInterconnect();
|
||||||
@@ -39,15 +42,15 @@ namespace ZwayBot {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void WaitForShutdown() {
|
private void WaitForShutdown() {
|
||||||
while (true) {
|
Console.CancelKeyPress += new ConsoleCancelEventHandler(this.SetupShutdown);
|
||||||
|
while (this.RunningProcess) {
|
||||||
System.Threading.Thread.Sleep(100);
|
System.Threading.Thread.Sleep(100);
|
||||||
if (Console.KeyAvailable) {
|
|
||||||
ConsoleKeyInfo key = Console.ReadKey(false);
|
|
||||||
if (key.Key == ConsoleKey.Escape) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetupShutdown(Object sender, ConsoleCancelEventArgs e) {
|
||||||
|
e.Cancel = true;
|
||||||
|
this.RunningProcess = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ModulDispose() {
|
private void ModulDispose() {
|
||||||
@@ -74,8 +77,8 @@ namespace ZwayBot {
|
|||||||
if(item.Namespace == "ZwayBot.Moduls") {
|
if(item.Namespace == "ZwayBot.Moduls") {
|
||||||
Type t = item;
|
Type t = item;
|
||||||
String name = t.Name;
|
String name = t.Name;
|
||||||
if (File.Exists(name.ToLower() + ".ini")) {
|
if (InIReader.ConfigExist(name.ToLower())) {
|
||||||
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()) }));
|
||||||
Console.WriteLine("Load Modul " + name);
|
Console.WriteLine("Load Modul " + name);
|
||||||
} else if(t.HasInterface("IForceLoad")) {
|
} else if(t.HasInterface("IForceLoad")) {
|
||||||
this.moduls.Add(name, (AModul)t.GetConstructor(new Type[] { typeof(ZwayController), typeof(InIReader) }).Invoke(new Object[] { this.zw, null }));
|
this.moduls.Add(name, (AModul)t.GetConstructor(new Type[] { typeof(ZwayController), typeof(InIReader) }).Invoke(new Object[] { this.zw, null }));
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
using System.Resources;
|
using System.Reflection;
|
||||||
using System.Reflection;
|
using System.Resources;
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
// Allgemeine Informationen über eine Assembly werden über die folgenden
|
// Allgemeine Informationen über eine Assembly werden über die folgenden
|
||||||
@@ -11,7 +10,7 @@ using System.Runtime.InteropServices;
|
|||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("BlubbFish")]
|
[assembly: AssemblyCompany("BlubbFish")]
|
||||||
[assembly: AssemblyProduct("Zway-Bot")]
|
[assembly: AssemblyProduct("Zway-Bot")]
|
||||||
[assembly: AssemblyCopyright("Copyright © 2017")]
|
[assembly: AssemblyCopyright("Copyright © 2017 - 15.05.2018")]
|
||||||
[assembly: AssemblyTrademark("BlubbFish")]
|
[assembly: AssemblyTrademark("BlubbFish")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
@@ -28,13 +27,12 @@ using System.Runtime.InteropServices;
|
|||||||
// Hauptversion
|
// Hauptversion
|
||||||
// Nebenversion
|
// Nebenversion
|
||||||
// Buildnummer
|
// Buildnummer
|
||||||
// Revision
|
|
||||||
//
|
//
|
||||||
// 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.2.1.0")]
|
[assembly: AssemblyVersion("1.4.0")]
|
||||||
[assembly: AssemblyFileVersion("1.2.1.0")]
|
[assembly: AssemblyFileVersion("1.4.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.
|
||||||
|
|||||||
@@ -39,9 +39,6 @@
|
|||||||
<ApplicationIcon>Resources\Icon.ico</ApplicationIcon>
|
<ApplicationIcon>Resources\Icon.ico</ApplicationIcon>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="LitJson, Version=0.9.0.0, Culture=neutral, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\packages\LitJson.0.9.0\lib\LitJson.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.Drawing" />
|
<Reference Include="System.Drawing" />
|
||||||
@@ -53,14 +50,15 @@
|
|||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<None Include="dpkg\preinst" />
|
||||||
<Compile Include="Events.cs" />
|
<Compile Include="Events.cs" />
|
||||||
<Compile Include="Interfaces\IForceLoad.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\Mqtt.cs" />
|
<Compile Include="Moduls\Mqtt.cs" />
|
||||||
<Compile Include="Moduls\Overtaker.cs" />
|
<Compile Include="Moduls\Overtaker.cs" />
|
||||||
|
<Compile Include="Moduls\Senml.cs" />
|
||||||
<Compile Include="Moduls\StatusPolling.cs" />
|
<Compile Include="Moduls\StatusPolling.cs" />
|
||||||
<Compile Include="Program.cs" />
|
<Compile Include="Program.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
@@ -71,14 +69,18 @@
|
|||||||
</Compile>
|
</Compile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\Utils\IoT\Connector\Data\Mosquitto\ConnectorDataMosquitto.csproj">
|
<ProjectReference Include="..\..\Librarys\litjson\litjson\litjson_4.7.1.csproj">
|
||||||
<Project>{39235fad-ba9d-4b51-82fc-6969967beae9}</Project>
|
<Project>{91a14cd2-2940-4500-8193-56d37edddbaa}</Project>
|
||||||
<Name>ConnectorDataMosquitto</Name>
|
<Name>litjson_4.7.1</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\..\Utils\IoT\Connector\Data\Mqtt\ConnectorDataMqtt.csproj">
|
<ProjectReference Include="..\..\Utils\IoT\Connector\Data\Mqtt\ConnectorDataMqtt.csproj">
|
||||||
<Project>{ee6c8f68-ed46-4c1c-abdd-cfcdf75104f2}</Project>
|
<Project>{ee6c8f68-ed46-4c1c-abdd-cfcdf75104f2}</Project>
|
||||||
<Name>ConnectorDataMqtt</Name>
|
<Name>ConnectorDataMqtt</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\Utils\IoT\Interfaces\Iot-Interfaces.csproj">
|
||||||
|
<Project>{4daada29-c600-4cf3-8ad3-9c97c8d7f632}</Project>
|
||||||
|
<Name>Iot-Interfaces</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>
|
||||||
@@ -93,9 +95,61 @@
|
|||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="packages.config" />
|
<None Include="control\control.sh">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="control\join.sh">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="control\loop.sh">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="control\restart.sh">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="control\settings.cfg">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="control\start.sh">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="control\stop.sh">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="control\stuff.sh">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="control\view.sh">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="config-example\cronjob.conf.example">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="config-example\names.conf.example">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="config-example\senml.conf.example">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="config-example\settings.conf.example">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="config-example\statuspolling.conf.example">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<None Include="config-example\mqtt.conf.example">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="config-example\overtaker.conf.example">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="dpkg\control" />
|
||||||
|
<None Include="dpkg\create-Builds.bat" />
|
||||||
|
<None Include="dpkg\make-deb.sh" />
|
||||||
|
<None Include="dpkg\prerm" />
|
||||||
|
<None Include="dpkg\zwaybot.service" />
|
||||||
<None Include="Resources\Icon.ico" />
|
<None Include="Resources\Icon.ico" />
|
||||||
<Content Include="Resources\icon.svg" />
|
<Content Include="Resources\icon.svg" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,10 @@
|
|||||||
|
[modul]
|
||||||
|
config=public
|
||||||
|
|
||||||
|
[cold]
|
||||||
|
cron=0 23 * * 0-4
|
||||||
|
set=7-0-67-2:Level-19;7-0-112-8:Level-2
|
||||||
|
|
||||||
|
[hot]
|
||||||
|
cron=0 16 * * 1-5
|
||||||
|
set=7-0-67-1:Level-22;7-0-112-8:Level-1
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
[modul]
|
||||||
|
config=private
|
||||||
|
|
||||||
|
[settings]
|
||||||
|
type=mqtt
|
||||||
|
server=localhost
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
[names]
|
||||||
|
2-0-37=Kühlschrank Schalter
|
||||||
|
2-0-49-4=Kühlschrank Leistung
|
||||||
|
2-0-50-0=Kühlschrank Verbrauch [kWh]
|
||||||
|
2-0-50-2=Kühlschrank Verbrauch [Wh]
|
||||||
|
2-0-112-1=Kühlschrank Config (Immer AN)
|
||||||
|
2-0-112-16=Kühlschrank Config (Zurück zu altem Status nach Stromausfall)
|
||||||
|
2-0-112-34=Kühlschrank Config (Reaktion auf Alarm)
|
||||||
|
2-0-112-35=Kühlschrank Config (Antwort auf Alarmmeldung)
|
||||||
|
2-0-112-39=Kühlschrank Config (Alarm Dauer)
|
||||||
|
2-0-112-40=Kühlschrank Config (Sofortiger Bericht über Stromverbrauch)
|
||||||
|
2-0-112-42=Kühlschrank Config (Änderung der Leistung zum Generieren eines Reports)
|
||||||
|
2-0-112-43=Kühlschrank Config (Regelmäßiges Senden eines Reports über die Stromaufnahme)
|
||||||
|
2-0-112-45=Kühlschrank Config (Automatisches Senden eines Reportes über Stromverbrauch bei Verbrauchsänderung)
|
||||||
|
2-0-112-47=Kühlschrank Config (Zeitinterval zum Senden eines Reportes ohne Änderung im Verbrauch)
|
||||||
|
2-0-112-49=Kühlschrank Config (Messen des Eigenstromverbrauches)
|
||||||
|
2-0-112-50=Kühlschrank Config (unterer Leistungsschwellwert)
|
||||||
|
2-0-112-51=Kühlschrank Config (oberer Leistungsschwellwert)
|
||||||
|
2-0-112-52=Kühlschrank Config (Aktion bei Erreichen des definierten Schwellwertes (Parameter 50/51))
|
||||||
|
2-0-112-60=Kühlschrank Config (Leistungsschwellwert für violettes Blinken)
|
||||||
|
2-0-112-61=Kühlschrank Config (LED Ring Farbe im Einschaltzustand)
|
||||||
|
2-0-112-62=Kühlschrank Config (LED Ring Farbe im Ausschaltzustand)
|
||||||
|
2-0-112-63=Kühlschrank Config (LED Ring Farbe bei Z-Wave Alarmmeldungen)
|
||||||
|
2-0-112-70=Kühlschrank Config (Überlastabschaltung)
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
[hot]
|
||||||
|
from=7-0-67-1:Level
|
||||||
|
to=8-0-67-1:Level;9-0-67-1:Level
|
||||||
|
|
||||||
|
[cold]
|
||||||
|
from=7-0-67-2:Level
|
||||||
|
to=8-0-67-11:Level;9-0-67-11:Level
|
||||||
|
|
||||||
|
[mode]
|
||||||
|
from=7-0-112-8:Level
|
||||||
|
to=8-0-64:Level;9-0-64:Level
|
||||||
|
convert=1-1;2-11
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[modul]
|
||||||
|
config=private
|
||||||
|
|
||||||
|
[settings]
|
||||||
|
type=mqtt
|
||||||
|
server=localhost
|
||||||
|
guid=linksmart-zwaybot
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[zway]
|
||||||
|
server=localhost
|
||||||
|
user=admin
|
||||||
|
pass=pass
|
||||||
|
|
||||||
|
[logging]
|
||||||
|
path=/var/log/zwaybot.log
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[temp]
|
||||||
|
cron=30 * * * *
|
||||||
|
devices=7-0-49-1,8-0-49-1,9-0-49-1,10-0-49-1,11-0-49-1
|
||||||
Executable
+92
@@ -0,0 +1,92 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Read Settings
|
||||||
|
DIR=`dirname $0`
|
||||||
|
source $DIR/settings.cfg
|
||||||
|
cd $control_root
|
||||||
|
|
||||||
|
|
||||||
|
for(( ; ; ))
|
||||||
|
do
|
||||||
|
# Test for Running Servers
|
||||||
|
servers=$(./view.sh | grep $screen_name)
|
||||||
|
|
||||||
|
clear
|
||||||
|
|
||||||
|
if [[ -z $servers ]];
|
||||||
|
then
|
||||||
|
echo "Zway-Bot not Running!"
|
||||||
|
echo ""
|
||||||
|
echo "1) Start Zway-Bot"
|
||||||
|
|
||||||
|
else
|
||||||
|
echo "Zway-Bot is Running :)"
|
||||||
|
echo ""
|
||||||
|
echo "2) Stop Zway-Bot"
|
||||||
|
echo "3) Restart Zway-Bot"
|
||||||
|
echo "4) Attach to Servers Screen-Session"
|
||||||
|
echo "5) Put Command to Zway-Bot"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "q) Quit"
|
||||||
|
echo ""
|
||||||
|
read -p "Choice: " choice
|
||||||
|
|
||||||
|
case "$choice" in
|
||||||
|
q) #Quit
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
1) #Start Server
|
||||||
|
if [[ -z $servers ]];
|
||||||
|
then
|
||||||
|
echo "Starting Zway-Bot..."
|
||||||
|
./start.sh
|
||||||
|
else
|
||||||
|
echo "Zway-Bot Allready started!"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
2) #Stop Server
|
||||||
|
if [[ -z $servers ]];
|
||||||
|
then
|
||||||
|
echo "Zway-Bot is not Running!"
|
||||||
|
else
|
||||||
|
echo "Stopping Zway-Bot..."
|
||||||
|
./stop.sh
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
3) #Restart Server
|
||||||
|
if [[ -z $servers ]];
|
||||||
|
then
|
||||||
|
echo "Zway-Bot is not Running!"
|
||||||
|
else
|
||||||
|
echo "Restarting Zway-Bot..."
|
||||||
|
./restart.sh
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
4) #Attach to Screen
|
||||||
|
if [[ -z $servers ]];
|
||||||
|
then
|
||||||
|
echo "Zway-Bot is not Running!"
|
||||||
|
else
|
||||||
|
./join.sh
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
5) #Put Command to Server
|
||||||
|
if [[ -z $servers ]];
|
||||||
|
then
|
||||||
|
echo "Zway-Bot is not Running!"
|
||||||
|
else
|
||||||
|
read -p "Please enter Zway-Bot-Command: " mc_cmd
|
||||||
|
./stuff.sh "$mc_cmd"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
*) #Invalid Selection
|
||||||
|
echo "Wrong Selection!"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
Executable
+10
@@ -0,0 +1,10 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Read Settings
|
||||||
|
DIR=`dirname $0`
|
||||||
|
source $DIR/settings.cfg
|
||||||
|
|
||||||
|
echo Press STRG+A then D to detach from Console
|
||||||
|
read -p "Press [Enter] to continue..."
|
||||||
|
|
||||||
|
screen -R $screen_name
|
||||||
Executable
+21
@@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Read Settings
|
||||||
|
DIR=`dirname $0`
|
||||||
|
source $DIR/settings.cfg
|
||||||
|
|
||||||
|
rm $control_root/stop_server.info
|
||||||
|
|
||||||
|
for(( ; ; ))
|
||||||
|
do
|
||||||
|
if [ ! -e $control_root/stop_server.info ];
|
||||||
|
then
|
||||||
|
cd $mc_root
|
||||||
|
$mc_cmd
|
||||||
|
else
|
||||||
|
echo "Stopped Server!"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
rm $control_root/stop_server.info
|
||||||
Executable
+28
@@ -0,0 +1,28 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Read Settings
|
||||||
|
DIR=`dirname $0`
|
||||||
|
source $DIR/settings.cfg
|
||||||
|
cd $control_root
|
||||||
|
|
||||||
|
# Be Shure theere is no Stop-Info
|
||||||
|
rm $control_root/stop_server.info
|
||||||
|
|
||||||
|
echo "Server will be restarted in 5 Seconds..."
|
||||||
|
./stuff.sh "/say ReStarting Server in 5 seconds!"
|
||||||
|
sleep 1
|
||||||
|
echo "4..."
|
||||||
|
./stuff.sh "/say 4..."
|
||||||
|
sleep 1
|
||||||
|
echo "3..."
|
||||||
|
./stuff.sh "/say 3..."
|
||||||
|
sleep 1
|
||||||
|
echo "2..."
|
||||||
|
./stuff.sh "/say 2..."
|
||||||
|
sleep 1
|
||||||
|
echo "1..."
|
||||||
|
./stuff.sh "/say 1..."
|
||||||
|
sleep 1
|
||||||
|
echo "Restarting Server..."
|
||||||
|
./stuff.sh "/say Restart Now!"
|
||||||
|
./stuff.sh "stop"
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Minecraft Control-Scripts Config-File
|
||||||
|
|
||||||
|
# (please remember that there are no spaces allowed around the =-Sign
|
||||||
|
# in the config-lines)
|
||||||
|
|
||||||
|
# Minecraft-Dir & JAR
|
||||||
|
|
||||||
|
# Directory where minecraft is in
|
||||||
|
mc_root="/home/pi/Zway-Bot"
|
||||||
|
|
||||||
|
# Root of Control-Scripts
|
||||||
|
control_root="$mc_root/control"
|
||||||
|
|
||||||
|
|
||||||
|
# MC-Server-Jar (will be executed in mc_root)
|
||||||
|
mc_jar="$mc_root/Zway-Bot.exe"
|
||||||
|
|
||||||
|
# MC-Server Start-Command
|
||||||
|
mc_cmd="mono $mc_jar"
|
||||||
|
|
||||||
|
# Screen
|
||||||
|
screen_name="Zway-Bot"
|
||||||
Executable
+14
@@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Read Settings
|
||||||
|
DIR=`dirname $0`
|
||||||
|
source $DIR/settings.cfg
|
||||||
|
|
||||||
|
# Start Loop in Screen
|
||||||
|
screen -A -m -d -S $screen_name $control_root/loop.sh
|
||||||
|
|
||||||
|
# Allow other users to control this screen-Session!
|
||||||
|
screen -r $screen_name -X multiuser on
|
||||||
|
screen -r $screen_name -X addacl www-data
|
||||||
|
screen -r $screen_name -X addacl mc
|
||||||
|
screen -r $screen_name -X addacl mw
|
||||||
Executable
+13
@@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Read Settings
|
||||||
|
DIR=`dirname $0`
|
||||||
|
source $DIR/settings.cfg
|
||||||
|
cd $control_root
|
||||||
|
|
||||||
|
# Create Stop-Info!
|
||||||
|
touch $control_root/stop_server.info
|
||||||
|
|
||||||
|
echo "Shuting Down Server..."
|
||||||
|
./stuff.sh "/exit"
|
||||||
|
screen -R $screen_name
|
||||||
Executable
+10
@@ -0,0 +1,10 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Read Settings
|
||||||
|
DIR=`dirname $0`
|
||||||
|
source $DIR/settings.cfg
|
||||||
|
|
||||||
|
# screen -r $screen_name -X stuff "$1\n"
|
||||||
|
|
||||||
|
screen -p 0 -S $screen_name -X eval "stuff '$1'\015"
|
||||||
|
# as_user "screen -p 0 -S minecraft -X eval 'stuff \"$command\"\015'"
|
||||||
Executable
+3
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
screen -ls
|
||||||
Binary file not shown.
@@ -0,0 +1,10 @@
|
|||||||
|
[modul]
|
||||||
|
config=public
|
||||||
|
|
||||||
|
[cold]
|
||||||
|
cron=0 23 * * 0-4
|
||||||
|
set=7-0-67-2:Level-19;7-0-112-8:Level-2
|
||||||
|
|
||||||
|
[hot]
|
||||||
|
cron=0 16 * * 1-5
|
||||||
|
set=7-0-67-1:Level-22;7-0-112-8:Level-1
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
[modul]
|
||||||
|
config=private
|
||||||
|
|
||||||
|
[settings]
|
||||||
|
type=mqtt
|
||||||
|
server=localhost
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
[names]
|
||||||
|
2-0-37=Kühlschrank Schalter
|
||||||
|
2-0-49-4=Kühlschrank Leistung
|
||||||
|
2-0-50-0=Kühlschrank Verbrauch [kWh]
|
||||||
|
2-0-50-2=Kühlschrank Verbrauch [Wh]
|
||||||
|
2-0-112-1=Kühlschrank Config (Immer AN)
|
||||||
|
2-0-112-16=Kühlschrank Config (Zurück zu altem Status nach Stromausfall)
|
||||||
|
2-0-112-34=Kühlschrank Config (Reaktion auf Alarm)
|
||||||
|
2-0-112-35=Kühlschrank Config (Antwort auf Alarmmeldung)
|
||||||
|
2-0-112-39=Kühlschrank Config (Alarm Dauer)
|
||||||
|
2-0-112-40=Kühlschrank Config (Sofortiger Bericht über Stromverbrauch)
|
||||||
|
2-0-112-42=Kühlschrank Config (Änderung der Leistung zum Generieren eines Reports)
|
||||||
|
2-0-112-43=Kühlschrank Config (Regelmäßiges Senden eines Reports über die Stromaufnahme)
|
||||||
|
2-0-112-45=Kühlschrank Config (Automatisches Senden eines Reportes über Stromverbrauch bei Verbrauchsänderung)
|
||||||
|
2-0-112-47=Kühlschrank Config (Zeitinterval zum Senden eines Reportes ohne Änderung im Verbrauch)
|
||||||
|
2-0-112-49=Kühlschrank Config (Messen des Eigenstromverbrauches)
|
||||||
|
2-0-112-50=Kühlschrank Config (unterer Leistungsschwellwert)
|
||||||
|
2-0-112-51=Kühlschrank Config (oberer Leistungsschwellwert)
|
||||||
|
2-0-112-52=Kühlschrank Config (Aktion bei Erreichen des definierten Schwellwertes (Parameter 50/51))
|
||||||
|
2-0-112-60=Kühlschrank Config (Leistungsschwellwert für violettes Blinken)
|
||||||
|
2-0-112-61=Kühlschrank Config (LED Ring Farbe im Einschaltzustand)
|
||||||
|
2-0-112-62=Kühlschrank Config (LED Ring Farbe im Ausschaltzustand)
|
||||||
|
2-0-112-63=Kühlschrank Config (LED Ring Farbe bei Z-Wave Alarmmeldungen)
|
||||||
|
2-0-112-70=Kühlschrank Config (Überlastabschaltung)
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
[hot]
|
||||||
|
from=7-0-67-1:Level
|
||||||
|
to=8-0-67-1:Level;9-0-67-1:Level
|
||||||
|
|
||||||
|
[cold]
|
||||||
|
from=7-0-67-2:Level
|
||||||
|
to=8-0-67-11:Level;9-0-67-11:Level
|
||||||
|
|
||||||
|
[mode]
|
||||||
|
from=7-0-112-8:Level
|
||||||
|
to=8-0-64:Level;9-0-64:Level
|
||||||
|
convert=1-1;2-11
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[modul]
|
||||||
|
config=private
|
||||||
|
|
||||||
|
[settings]
|
||||||
|
type=mqtt
|
||||||
|
server=localhost
|
||||||
|
guid=linksmart-zwaybot
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[zway]
|
||||||
|
server=localhost
|
||||||
|
user=admin
|
||||||
|
pass=pass
|
||||||
|
|
||||||
|
[logging]
|
||||||
|
path=/var/log/zwaybot.log
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[temp]
|
||||||
|
cron=30 * * * *
|
||||||
|
devices=7-0-49-1,8-0-49-1,9-0-49-1,10-0-49-1,11-0-49-1
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Read Settings
|
||||||
|
DIR=`dirname $0`
|
||||||
|
source $DIR/settings.cfg
|
||||||
|
cd $control_root
|
||||||
|
|
||||||
|
|
||||||
|
for(( ; ; ))
|
||||||
|
do
|
||||||
|
# Test for Running Servers
|
||||||
|
servers=$(./view.sh | grep $screen_name)
|
||||||
|
|
||||||
|
clear
|
||||||
|
|
||||||
|
if [[ -z $servers ]];
|
||||||
|
then
|
||||||
|
echo "Zway-Bot not Running!"
|
||||||
|
echo ""
|
||||||
|
echo "1) Start Zway-Bot"
|
||||||
|
|
||||||
|
else
|
||||||
|
echo "Zway-Bot is Running :)"
|
||||||
|
echo ""
|
||||||
|
echo "2) Stop Zway-Bot"
|
||||||
|
echo "3) Restart Zway-Bot"
|
||||||
|
echo "4) Attach to Servers Screen-Session"
|
||||||
|
echo "5) Put Command to Zway-Bot"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "q) Quit"
|
||||||
|
echo ""
|
||||||
|
read -p "Choice: " choice
|
||||||
|
|
||||||
|
case "$choice" in
|
||||||
|
q) #Quit
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
1) #Start Server
|
||||||
|
if [[ -z $servers ]];
|
||||||
|
then
|
||||||
|
echo "Starting Zway-Bot..."
|
||||||
|
./start.sh
|
||||||
|
else
|
||||||
|
echo "Zway-Bot Allready started!"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
2) #Stop Server
|
||||||
|
if [[ -z $servers ]];
|
||||||
|
then
|
||||||
|
echo "Zway-Bot is not Running!"
|
||||||
|
else
|
||||||
|
echo "Stopping Zway-Bot..."
|
||||||
|
./stop.sh
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
3) #Restart Server
|
||||||
|
if [[ -z $servers ]];
|
||||||
|
then
|
||||||
|
echo "Zway-Bot is not Running!"
|
||||||
|
else
|
||||||
|
echo "Restarting Zway-Bot..."
|
||||||
|
./restart.sh
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
4) #Attach to Screen
|
||||||
|
if [[ -z $servers ]];
|
||||||
|
then
|
||||||
|
echo "Zway-Bot is not Running!"
|
||||||
|
else
|
||||||
|
./join.sh
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
5) #Put Command to Server
|
||||||
|
if [[ -z $servers ]];
|
||||||
|
then
|
||||||
|
echo "Zway-Bot is not Running!"
|
||||||
|
else
|
||||||
|
read -p "Please enter Zway-Bot-Command: " mc_cmd
|
||||||
|
./stuff.sh "$mc_cmd"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
*) #Invalid Selection
|
||||||
|
echo "Wrong Selection!"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Read Settings
|
||||||
|
DIR=`dirname $0`
|
||||||
|
source $DIR/settings.cfg
|
||||||
|
|
||||||
|
echo Press STRG+A then D to detach from Console
|
||||||
|
read -p "Press [Enter] to continue..."
|
||||||
|
|
||||||
|
screen -R $screen_name
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Read Settings
|
||||||
|
DIR=`dirname $0`
|
||||||
|
source $DIR/settings.cfg
|
||||||
|
|
||||||
|
rm $control_root/stop_server.info
|
||||||
|
|
||||||
|
for(( ; ; ))
|
||||||
|
do
|
||||||
|
if [ ! -e $control_root/stop_server.info ];
|
||||||
|
then
|
||||||
|
cd $mc_root
|
||||||
|
$mc_cmd
|
||||||
|
else
|
||||||
|
echo "Stopped Server!"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
rm $control_root/stop_server.info
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Read Settings
|
||||||
|
DIR=`dirname $0`
|
||||||
|
source $DIR/settings.cfg
|
||||||
|
cd $control_root
|
||||||
|
|
||||||
|
# Be Shure theere is no Stop-Info
|
||||||
|
rm $control_root/stop_server.info
|
||||||
|
|
||||||
|
echo "Server will be restarted in 5 Seconds..."
|
||||||
|
./stuff.sh "/say ReStarting Server in 5 seconds!"
|
||||||
|
sleep 1
|
||||||
|
echo "4..."
|
||||||
|
./stuff.sh "/say 4..."
|
||||||
|
sleep 1
|
||||||
|
echo "3..."
|
||||||
|
./stuff.sh "/say 3..."
|
||||||
|
sleep 1
|
||||||
|
echo "2..."
|
||||||
|
./stuff.sh "/say 2..."
|
||||||
|
sleep 1
|
||||||
|
echo "1..."
|
||||||
|
./stuff.sh "/say 1..."
|
||||||
|
sleep 1
|
||||||
|
echo "Restarting Server..."
|
||||||
|
./stuff.sh "/say Restart Now!"
|
||||||
|
./stuff.sh "stop"
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Minecraft Control-Scripts Config-File
|
||||||
|
|
||||||
|
# (please remember that there are no spaces allowed around the =-Sign
|
||||||
|
# in the config-lines)
|
||||||
|
|
||||||
|
# Minecraft-Dir & JAR
|
||||||
|
|
||||||
|
# Directory where minecraft is in
|
||||||
|
mc_root="/home/pi/Zway-Bot"
|
||||||
|
|
||||||
|
# Root of Control-Scripts
|
||||||
|
control_root="$mc_root/control"
|
||||||
|
|
||||||
|
|
||||||
|
# MC-Server-Jar (will be executed in mc_root)
|
||||||
|
mc_jar="$mc_root/Zway-Bot.exe"
|
||||||
|
|
||||||
|
# MC-Server Start-Command
|
||||||
|
mc_cmd="mono $mc_jar"
|
||||||
|
|
||||||
|
# Screen
|
||||||
|
screen_name="Zway-Bot"
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Read Settings
|
||||||
|
DIR=`dirname $0`
|
||||||
|
source $DIR/settings.cfg
|
||||||
|
|
||||||
|
# Start Loop in Screen
|
||||||
|
screen -A -m -d -S $screen_name $control_root/loop.sh
|
||||||
|
|
||||||
|
# Allow other users to control this screen-Session!
|
||||||
|
screen -r $screen_name -X multiuser on
|
||||||
|
screen -r $screen_name -X addacl www-data
|
||||||
|
screen -r $screen_name -X addacl mc
|
||||||
|
screen -r $screen_name -X addacl mw
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Read Settings
|
||||||
|
DIR=`dirname $0`
|
||||||
|
source $DIR/settings.cfg
|
||||||
|
cd $control_root
|
||||||
|
|
||||||
|
# Create Stop-Info!
|
||||||
|
touch $control_root/stop_server.info
|
||||||
|
|
||||||
|
echo "Shuting Down Server..."
|
||||||
|
./stuff.sh "/exit"
|
||||||
|
screen -R $screen_name
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Read Settings
|
||||||
|
DIR=`dirname $0`
|
||||||
|
source $DIR/settings.cfg
|
||||||
|
|
||||||
|
# screen -r $screen_name -X stuff "$1\n"
|
||||||
|
|
||||||
|
screen -p 0 -S $screen_name -X eval "stuff '$1'\015"
|
||||||
|
# as_user "screen -p 0 -S minecraft -X eval 'stuff \"$command\"\015'"
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
screen -ls
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
Package: zwaybot
|
||||||
|
Version: x.x-x
|
||||||
|
Section: base
|
||||||
|
Priority: optional
|
||||||
|
Architecture: i386
|
||||||
|
Depends: mono-complete (>= 5.4.1.6)
|
||||||
|
Maintainer: BlubbFish <dev@blubbfish.net>
|
||||||
|
Description: Zway-Bot
|
||||||
|
Zway-Bot manage a Zwave.me installation
|
||||||
|
so that it has more features
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
set /P maj=Enter Major Version:
|
||||||
|
set /P min=Enter Minor Version:
|
||||||
|
set /P bui=Enter Build Version:
|
||||||
|
|
||||||
|
bash.exe -c "./make-deb.sh %maj% %min% %bui%"
|
||||||
|
pause
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
WORKDIR="/home/blubb"
|
||||||
|
ROOT="$WORKDIR/deb"
|
||||||
|
OUTPUT="../bin/Release"
|
||||||
|
EXEC="$ROOT/usr/local/bin/zwaybot"
|
||||||
|
CONFIG="$ROOT/etc/zwaybot"
|
||||||
|
SYSTEMD="$ROOT/etc/systemd/system"
|
||||||
|
DEBIAN="$ROOT/DEBIAN"
|
||||||
|
VMAJOR=$1
|
||||||
|
VMINOR=$2
|
||||||
|
VBUILD=$3
|
||||||
|
|
||||||
|
mkdir -p $EXEC
|
||||||
|
mkdir -p $CONFIG
|
||||||
|
mkdir -p $DEBIAN
|
||||||
|
mkdir -p $SYSTEMD
|
||||||
|
|
||||||
|
cp control $DEBIAN
|
||||||
|
cp preinst $DEBIAN
|
||||||
|
cp prerm $DEBIAN
|
||||||
|
sed -i s/Version:\ x\.x-x/"Version: $VMAJOR.$VMINOR-$VBUILD"/ $DEBIAN/control
|
||||||
|
chmod 755 $DEBIAN -R
|
||||||
|
|
||||||
|
cp zwaybot.service $SYSTEMD
|
||||||
|
chmod 755 $SYSTEMD -R
|
||||||
|
|
||||||
|
cp $OUTPUT/*.exe $EXEC/
|
||||||
|
cp $OUTPUT/*.dll $EXEC/
|
||||||
|
cp $OUTPUT/config-example/* $CONFIG
|
||||||
|
cp $OUTPUT/control $EXEC/ -r
|
||||||
|
|
||||||
|
dpkg-deb --build $ROOT
|
||||||
|
mv $WORKDIR/deb.deb ../bin/Builds/"zwaybot_$VMAJOR.$VMINOR-$VBUILD.deb"
|
||||||
|
rm $WORKDIR/deb -r
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Name "Example1"
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
service zwaybot stop
|
||||||
|
adduser --system zwaybot
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
service zwaybot stop
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# If you modify this, please also make sure to edit init.sh
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
Description=Zway-Bot manage a Zwave.me installation so that it has more features
|
||||||
|
After=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=zwaybot
|
||||||
|
Group=zwaybot
|
||||||
|
WorkingDirectory=/usr/local/bin/zwaybot
|
||||||
|
ExecStart=/usr/bin/mono /usr/local/bin/zwaybot/Zway-Bot.exe
|
||||||
|
KillMode=control-group
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
Alias=zwaybot.service
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<packages>
|
|
||||||
<package id="LitJson" version="0.9.0" targetFramework="net461" />
|
|
||||||
</packages>
|
|
||||||
Reference in New Issue
Block a user