public async Task <IList <OpisenseOpcConfiguration> > Read(Func <string, Task> onError = null) { try { var result = new List <OpisenseOpcConfiguration>(); var records = await ReadCsv(); foreach (var recordsByOpcServer in records.GroupBy(r => r.OpcServer)) { var config = new OpisenseOpcConfiguration(recordsByOpcServer.Key.Trim()); foreach (var recordsByGroupName in recordsByOpcServer.GroupBy(r => r.GroupName)) { var readCycle = TimeSpan.FromMinutes(Math.Max(recordsByGroupName.Min(r => r.ReadCycleMinutes), FastestReadCycle)); var group = new OpisenseOpcItemGroup(recordsByGroupName.Key.Trim(), readCycle); var items = recordsByGroupName.Where(r => !string.IsNullOrWhiteSpace(r.TagName)).ToList(); if (items.Any()) { config.OpisenseOpcItemGroups.Add(group); group.OpisenseOpcItems.AddRange(items.Select(i => new OpisenseOpcItem { OpcItemName = i.TagName.Trim(), VariableId = i.VariableId })); } } result.Add(config); } return(result); } catch (Exception ex) { onError?.Invoke(ex.Message); return(new List <OpisenseOpcConfiguration>()); } }
public async Task <bool> ValidateConfig(OpisenseOpcConfiguration config, Func <string, Task> onError) { if (config is null) { await ThrowOrReport(new Exception("The configuration is null"), onError); return(false); } if (string.IsNullOrEmpty(config.OpcServerUrl)) { await ThrowOrReport(new Exception("The server is null"), onError); return(false); } if (config.OpisenseOpcItemGroups == null || !config.OpisenseOpcItemGroups.Any()) { await ThrowOrReport(new Exception("There is no group to read"), onError); return(false); } if (config.OpisenseOpcItemGroups.Any(g => string.IsNullOrWhiteSpace(g.GroupName))) { await ThrowOrReport(new Exception("At least one group name is empty"), onError); return(false); } foreach (var invalidPollingCycle in config.OpisenseOpcItemGroups.Where(g => g.PollingCycle <= TimeSpan.Zero)) { await ThrowOrReport(new Exception($"The polling cycle {invalidPollingCycle.PollingCycle:g} of group '{invalidPollingCycle.GroupName}' is invalid (<= 0)"), onError); return(false); } foreach (var configOpisenseOpcItemGroup in config.OpisenseOpcItemGroups) { if (configOpisenseOpcItemGroup.OpisenseOpcItems.Any(i => string.IsNullOrWhiteSpace(i.OpcItemName))) { await ThrowOrReport(new Exception($"At least one item name is empty in group '{configOpisenseOpcItemGroup.GroupName}'"), onError); return(false); } } return(true); }