Different types of units. Writing values, relay unit

This commit is contained in:
ftc
2021-09-12 16:01:26 +03:00
parent 80cad276e8
commit cfd8d4c018
10 changed files with 296 additions and 74 deletions
+24 -73
View File
@@ -5,65 +5,6 @@ using System.Text.Json;
namespace ESPServer
{
/*
* Описание параметра, который может придти от юнита
*/
class UnitValue
{
// Название параметра
public string name;
// Текущее значение
public float value;
// Сдвиг адреса, по которому это значение будет храниться в modbus
public int addressOffset;
}
/*
* Описание конкретного модуля (релейный, датчик, whatever)
*/
class Unit
{
// Айдишник юнита (мак-адрес)
public string id;
// Название (для генерации конфигов например)
public string name;
// Базовый адрес в модбасе
public int baseAddress;
// Значения которые есть в юните
public Dictionary<string, UnitValue> values;
// текущий IP юнита
public string ip;
public UnitValue GetValue(string name)
{
if (!values.ContainsKey(name))
{
return null;
}
return values[name];
}
public int MinOffset
{
get
{
int min = int.MaxValue;
foreach (var u in values) if (u.Value.addressOffset < min) min = u.Value.addressOffset;
return min;
}
}
public int MaxOffset
{
get
{
int max = int.MinValue;
foreach (var u in values) if (u.Value.addressOffset > max) max = u.Value.addressOffset;
return max;
}
}
}
class UnitsDatabase
{
List<Unit> units;
@@ -73,19 +14,7 @@ namespace ESPServer
units = new List<Unit>();
foreach (var unitConfig in config.EnumerateArray())
{
var u = new Unit();
u.id = unitConfig.GetProperty("id").GetString();
u.name = unitConfig.GetProperty("name").GetString();
u.baseAddress = unitConfig.GetProperty("address").GetInt32();
u.values = new Dictionary<string, UnitValue>();
foreach (var knownValue in unitConfig.GetProperty("values").EnumerateArray())
{
var uv = new UnitValue();
uv.name = knownValue.GetProperty("name").GetString();
uv.addressOffset = knownValue.GetProperty("offset").GetInt32();
u.values[uv.name] = uv;
}
units.Add(u);
units.Add(UnitFactory.CreateUnit(unitConfig));
}
}
@@ -131,6 +60,23 @@ namespace ESPServer
return null;
}
/// <summary>
/// Retrieves unit by modbus address of any value in it
/// </summary>
/// <param name="valueAddress"></param>
/// <returns></returns>
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)
{
@@ -175,7 +121,12 @@ namespace ESPServer
var v = uv.Value;
config.Append("\t\tThing data ");
config.Append(u.name + "_" + v.name);
config.AppendFormat("[readStart = \"{0}\", readValueType = \"float32\"]\n", u.baseAddress + v.addressOffset);
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");