private static int Main(string[] args) { var app = new CommandLineApplication { Name = "TRuDI.TafAdapter.Test", FullName = "TRuDI TAF Adapter Test Application" }; var outputFile = app.Option("-o|--output <output-file>", "Ausgabedatei.", CommandOptionType.SingleValue); var dataFile = app.Option("-d|--data <data-file>", "Daten aus dem SMGW.", CommandOptionType.SingleValue); var tariffFile = app.Option("-t|--taf <taf-file>", "TAF-Datei.", CommandOptionType.SingleValue); app.HelpOption("-? | -h | --help"); app.Execute(args); if (!dataFile.HasValue()) { Console.WriteLine("Keine Datendatei angegeben."); return(1); } var data = LoadDataFile(dataFile.Value()); if (data == null) { return(1); } if (!tariffFile.HasValue()) { Console.WriteLine("Keine TAF-Datei angegeben."); return(1); } var tafData = LoadTafFile(tariffFile.Value()); if (tafData == null) { return(1); } var tafAdapter = TafAdapterRepository.LoadAdapter(tafData.AnalysisProfile.TariffUseCase); try { var result = tafAdapter.Calculate(data, tafData); string formattedResult; switch (tafData.AnalysisProfile.TariffUseCase) { case TafId.Taf1: formattedResult = FormatTaf1(result); break; case TafId.Taf2: formattedResult = FormatTaf2(result); break; default: Console.WriteLine($"{tafData.AnalysisProfile.TariffUseCase} kann mit diesem Programm nicht verarbeitet werden."); return(1); } Console.WriteLine(formattedResult); if (outputFile.HasValue()) { File.WriteAllText(outputFile.Value(), formattedResult); } } catch (Exception ex) { Console.WriteLine(ex.Message); return(1); } return(0); }
private void LoadDataFromXml(XDocument raw, AdapterContext ctx) { Log.Information("Loading XML file"); this.LastErrorMessages.Clear(); try { this.CurrentDataResult = new XmlDataResult { Raw = raw }; Log.Information("Validating XSD schema"); Ar2418Validation.ValidateSchema(raw); Log.Information("Parsing model"); this.CurrentDataResult.Model = XmlModelParser.ParseHanAdapterModel(this.CurrentDataResult?.Raw?.Root?.Descendants()); Log.Information("Validating model"); ModelValidation.ValidateHanAdapterModel(this.CurrentDataResult.Model); Log.Information("Validating model using the adapter context"); ContextValidation.ValidateContext(this.CurrentDataResult.Model, ctx); if (this.CurrentSupplierFile?.Model != null) { Log.Information("Validating model using supplier file model"); ContextValidation.ValidateContext(this.CurrentDataResult.Model, this.CurrentSupplierFile.Model, ctx); Log.Information("Loading TAF adapter: {0}", this.CurrentSupplierFile.Model.AnalysisProfile.TariffUseCase); var tafAdapter = TafAdapterRepository.LoadAdapter(this.CurrentSupplierFile.Model.AnalysisProfile.TariffUseCase); this.CurrentSupplierFile.TafData = tafAdapter.Calculate(this.CurrentDataResult.Model, this.CurrentSupplierFile.Model); } } catch (UnknownTafAdapterException ex) { Log.Error(ex, "Unknown TAF adapter: {0}", ex.TafId); this.LastErrorMessages.Add($"Die Berechnung des Tarifanwendungsfall {ex.TafId} wird nicht unterstützt."); throw; } catch (AggregateException ex) { foreach (var err in ex.InnerExceptions) { Log.Error(err, err.Message); this.LastErrorMessages.Add(err.Message); } throw; } catch (Exception ex) { Log.Error(ex, "Loading XML data failed: {0}", ex.Message); this.LastErrorMessages.Add(ex.Message); throw; } var originalValueLists = this.CurrentDataResult.Model.MeterReadings.Where(mr => mr.IsOriginalValueList()).Select(mr => new OriginalValueList(mr, this.CurrentDataResult.Model.ServiceCategory.Kind ?? Kind.Electricity)).ToList(); var meterReadings = this.CurrentDataResult.Model.MeterReadings.Where(mr => !mr.IsOriginalValueList()).ToList(); meterReadings.Sort((a, b) => string.Compare(a.ReadingType.ObisCode, b.ReadingType.ObisCode, StringComparison.InvariantCultureIgnoreCase)); var ovlRegisters = originalValueLists.Where(ovl => ovl.MeterReading?.IntervalBlocks?.FirstOrDefault()?.Interval.Duration == 0).ToList(); meterReadings.AddRange(ovlRegisters.Select(ovl => ovl.MeterReading)); if (ovlRegisters.Count < originalValueLists.Count) { ovlRegisters.ForEach(ovl => originalValueLists.Remove(ovl)); } foreach (var ovl in originalValueLists) { Log.Information("Original value list: meter: {0}, OBIS: {1}, {2} values", ovl.Meter, ovl.Obis, ovl.ValueCount); } foreach (var mr in meterReadings) { Log.Information("Meter reading: {@Meters}, OBIS: {1}", mr.Meters, mr.ReadingType.ObisCode); } this.CurrentDataResult.OriginalValueLists = originalValueLists; this.CurrentDataResult.MeterReadings = meterReadings; this.CurrentDataResult.Begin = meterReadings.FirstOrDefault()?.IntervalBlocks?.FirstOrDefault()?.Interval?.Start; if (this.CurrentDataResult.Begin != null) { var duration = meterReadings.FirstOrDefault()?.IntervalBlocks?.FirstOrDefault()?.Interval?.Duration; if (duration != null) { this.CurrentDataResult.End = this.CurrentDataResult.Begin + TimeSpan.FromSeconds(duration.Value); } } // If the analysis profile is missing, add it based on the contract info if (this.CurrentDataResult.Model.AnalysisProfile == null && ctx?.Contract != null) { this.AddAnalysisProfile(ctx); } }