Exemple #1
0
        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);
            }
        }