Added OpenHAB config files generation and command line command to use that. Also added transforms for OpenHAB integration.
This commit is contained in:
+69
-21
@@ -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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user