using System; using System.Collections.Generic; using System.Text; using System.Text.Json; namespace ESPServer { class UnitsDatabase { List units; public UnitsDatabase(JsonElement config) { units = new List(); foreach (var unitConfig in config.EnumerateArray()) { units.Add(UnitFactory.CreateUnit(unitConfig)); } } internal Unit AddUnit(string id) { lock (units) { var u = new Unit(); u.id = id; u.name = id; u.baseAddress = -1; u.values = new Dictionary(); units.Add(u); return u; } } internal Dictionary GetUnitIPs() { var result = new Dictionary(); lock (units) { foreach (var u in units) { if (!string.IsNullOrEmpty(u.ip)) { result[u.id] = u.ip; } } } return result; } public Unit GetUnit(string id) { lock (units) { foreach (var u in units) { if (u.id == id) return u; } } return null; } /// /// Retrieves unit by modbus address of any value in it /// /// /// public Unit GetUnit(int valueAddress) { lock (units) { foreach (var u in units) { if (u.HasAddress(valueAddress)) return u; } } return null; } #region OpenHAB config generation internal void GenerateItemsConfig(StringBuilder config) { foreach (var u in units) { foreach (var uv in u.values) { var v = uv.Value; config.Append(string.Format("Number {0}_{1} \"{0} {1}\"", u.name, v.name)); config.Append(" {channel=\""); config.AppendFormat("modbus:data:esp_server:esp_server:"); config.AppendFormat("{0}_{1}:number", u.name, v.name); config.Append("\"}\n"); } } } internal void GenerateThingsConfig(StringBuilder config) { int minAddress = int.MaxValue; int maxAddress = int.MinValue; foreach (var u in units) { if (u.baseAddress + u.MinOffset < minAddress) { minAddress = u.baseAddress + u.MinOffset; } if (u.baseAddress + u.MaxOffset > maxAddress) { maxAddress = u.baseAddress + u.MaxOffset; } } // поскольку читаем флоаты, нужен ещё регистр запаса maxAddress++; config.Append("\tBridge poller "); config.Append("esp_server"); config.AppendFormat("[start = {0}, length = {1}, type = \"holding\", refresh = 500] {{\n", minAddress, maxAddress - minAddress + 1); foreach (var u in units) { foreach (var uv in u.values) { var v = uv.Value; config.Append("\t\tThing data "); config.Append(u.name + "_" + v.name); config.AppendFormat("[readStart = \"{0}\", readValueType = \"float32\"", u.baseAddress + v.addressOffset); if (u.IsValueWritable(v)) { config.AppendFormat(", writeStart = \"{0}\", writeValueType = \"float32\", writeType=\"holding\"", u.baseAddress + v.addressOffset); } config.Append("]\n"); } } config.Append("\t}\n"); } #endregion } }