Added OpenHAB config files generation and command line command to use that. Also added transforms for OpenHAB integration.

This commit is contained in:
ftc
2021-01-08 16:55:19 +03:00
parent b9a1084d7a
commit 2e0b96ff7a
10 changed files with 183 additions and 32 deletions
+69 -21
View File
@@ -1,10 +1,12 @@
using NLog;
using System;
using System.Collections.Generic;
using System.CommandLine;
using System.CommandLine.Invocation;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Text;
using System.Text.Json;
using System.Threading;
@@ -14,6 +16,7 @@ namespace Barsik
{
private static RegistersContainer registers;
private static List<BaseMonitoringUnit> units;
private static JsonDocument configJson;
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
@@ -27,42 +30,87 @@ namespace Barsik
};
runCommand.Handler = CommandHandler.Create<string>(RunService);
rootCommand.AddCommand(runCommand);
var openhabConfigCommand = new Command("openhab-config")
{
new Option<string>("--config", () => "", "Path to configuration file")
};
openhabConfigCommand.Handler = CommandHandler.Create<string>(GenerateOpenhabConfig);
rootCommand.AddCommand(openhabConfigCommand);
// Init common things
registers = new RegistersContainer();
//
rootCommand.InvokeAsync(args).Wait();
}
static void RunService(string config)
{
Logging.Setup();
logger.Info("Barsik monitoring service starting");
registers = new RegistersContainer();
var server = new ModbusServer(registers);
units = new List<BaseMonitoringUnit>();
private static JsonDocument LoadConfig(string config)
{
if (string.IsNullOrEmpty(config))
{
string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
config = Path.Combine(assemblyFolder, "barsik.json");
}
string configStr = File.ReadAllText(config);
int port = 0;
using (JsonDocument doc = JsonDocument.Parse(configStr))
return JsonDocument.Parse(configStr);
}
private static List<BaseMonitoringUnit> LoadUnits(JsonDocument config)
{
var units = new List<BaseMonitoringUnit>();
var root = config.RootElement;
foreach (var unitElement in root.GetProperty("Units").EnumerateArray())
{
var root = doc.RootElement;
port = root.GetProperty("Port").GetInt32();
foreach (var unitElement in root.GetProperty("Units").EnumerateArray())
var unit = BaseMonitoringUnit.Create(unitElement, registers);
if (unit != null)
{
var unit = BaseMonitoringUnit.Create(unitElement, registers);
if (unit != null)
{
units.Add(unit);
Thread unitThread = new Thread(new ThreadStart(unit.Run));
unitThread.Start();
}
units.Add(unit);
}
}
return units;
}
static void GenerateOpenhabConfig(string config)
{
configJson = LoadConfig(config);
units = LoadUnits(configJson);
var root = configJson.RootElement;
string name = root.GetProperty("Name").GetString();
StringBuilder thingsConfig = new StringBuilder();
StringBuilder itemsConfig = new StringBuilder();
thingsConfig.AppendFormat("Bridge modbus:tcp:{0} [ host=\"{1}\", port={2}, id=1 ] {{\n",
name,
root.GetProperty("IP").GetString(),
root.GetProperty("Port").GetInt32());
// generate units configs
foreach (var unit in units)
{
unit.GenerateThingsConfig(thingsConfig);
unit.GenerateItemsConfig(name, itemsConfig);
}
//
thingsConfig.Append("}\n");
File.WriteAllText(name + ".things", thingsConfig.ToString());
File.WriteAllText(name + ".items", itemsConfig.ToString());
}
static void RunService(string config)
{
Logging.Setup();
logger.Info("Barsik monitoring service starting");
configJson = LoadConfig(config);
units = LoadUnits(configJson);
foreach (var unit in units)
{
Thread unitThread = new Thread(new ThreadStart(unit.Run));
unitThread.Start();
}
logger.Info("Configuration loaded, we have " + units.Count + " units");
server.Port = port;
var server = new ModbusServer(registers);
server.Port = configJson.RootElement.GetProperty("Port").GetInt32();
server.Run();
logger.Info("Exiting");
}