Different types of units. Writing values, relay unit
This commit is contained in:
+24
-73
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user