// Validation of an TariffStage instance
 private static void ValidateTariffStage(TariffStage tariffStage, List <Exception> exceptions)
 {
     if (!tariffStage.ObisCode.ValidateHexString())
     {
         exceptions.Add(new FormatException("Das Element \"ObisCode\" innerhalb des Elements \"TariffStage\" enthält einen ungülten Wert."));
     }
 }
Exemple #2
0
        public void TestGetRegister()
        {
            var supplier        = new UsagePointLieferant();
            var analysisProfile = new AnalysisProfile();

            var obisId181  = "0100010801FF";
            var obisId182  = "0100010802FF";
            var obisId183  = "0100010803FF";
            var obisId1863 = "010001083FFF";

            var obisId281  = "0100020801FF";
            var obisId282  = "0100020802FF";
            var obisId2863 = "010002083FFF";

            var tariffStage1 = new TariffStage()
            {
                Description = "T1", ObisCode = obisId181, TariffNumber = 1
            };
            var tariffStage2 = new TariffStage()
            {
                Description = "T2", ObisCode = obisId182, TariffNumber = 2
            };
            var tariffStage3 = new TariffStage()
            {
                Description = "T3", ObisCode = obisId183, TariffNumber = 3
            };
            var tariffStage4 = new TariffStage()
            {
                Description = "T4", ObisCode = obisId1863, TariffNumber = 4
            };
            var tariffStage5 = new TariffStage()
            {
                Description = "T5", ObisCode = obisId281, TariffNumber = 5
            };
            var tariffStage6 = new TariffStage()
            {
                Description = "T6", ObisCode = obisId282, TariffNumber = 6
            };
            var tariffStage7 = new TariffStage()
            {
                Description = "T7", ObisCode = obisId2863, TariffNumber = 7
            };

            analysisProfile.TariffStages.Add(tariffStage1);
            analysisProfile.TariffStages.Add(tariffStage2);
            analysisProfile.TariffStages.Add(tariffStage3);
            analysisProfile.TariffStages.Add(tariffStage4);
            analysisProfile.TariffStages.Add(tariffStage5);
            analysisProfile.TariffStages.Add(tariffStage6);
            analysisProfile.TariffStages.Add(tariffStage7);

            supplier.AnalysisProfile = analysisProfile;
            var target = supplier.GetRegister();

            Assert.AreEqual(7, target.Count);

            foreach (Register reg in target)
            {
                Assert.AreEqual(0, reg.Amount);
            }

            Assert.AreEqual("0100010801FF", target[0].ObisCode.ToHexString());
            Assert.AreEqual("0100010802FF", target[1].ObisCode.ToHexString());
            Assert.AreEqual("0100010803FF", target[2].ObisCode.ToHexString());
            Assert.AreEqual("010001083FFF", target[3].ObisCode.ToHexString());
            Assert.AreEqual("0100020801FF", target[4].ObisCode.ToHexString());
            Assert.AreEqual("0100020802FF", target[5].ObisCode.ToHexString());
            Assert.AreEqual("010002083FFF", target[6].ObisCode.ToHexString());

            Assert.AreEqual(1, target[0].TariffId);
            Assert.AreEqual(2, target[1].TariffId);
            Assert.AreEqual(3, target[2].TariffId);
            Assert.AreEqual(4, target[3].TariffId);
            Assert.AreEqual(5, target[4].TariffId);
            Assert.AreEqual(6, target[5].TariffId);
            Assert.AreEqual(7, target[6].TariffId);

            supplier.AnalysisProfile.TariffUseCase = HanAdapter.Interface.TafId.Taf2;

            target = supplier.GetRegister();

            Assert.AreEqual(1, target[0].TariffId);
            Assert.AreEqual(2, target[1].TariffId);
            Assert.AreEqual(3, target[2].TariffId);
            Assert.AreEqual(63, target[3].TariffId);
            Assert.AreEqual(5, target[4].TariffId);
            Assert.AreEqual(6, target[5].TariffId);
            Assert.AreEqual(63, target[6].TariffId);

            var analysisProfile2 = new AnalysisProfile
            {
                TariffUseCase = HanAdapter.Interface.TafId.Taf2
            };

            analysisProfile2.TariffStages.Add(tariffStage1);
            analysisProfile2.TariffStages.Add(tariffStage2);
            analysisProfile2.TariffStages.Add(tariffStage3);
            analysisProfile2.TariffStages.Add(tariffStage5);
            analysisProfile2.TariffStages.Add(tariffStage6);

            supplier.AnalysisProfile = analysisProfile2;

            target = supplier.GetRegister();

            foreach (Register reg in target)
            {
                Assert.AreEqual(0, reg.Amount);
            }

            Assert.AreEqual(7, target.Count);

            Assert.AreEqual("0100010801FF", target[0].ObisCode.ToHexString());
            Assert.AreEqual("0100010802FF", target[1].ObisCode.ToHexString());
            Assert.AreEqual("0100010803FF", target[2].ObisCode.ToHexString());
            Assert.AreEqual("0100020801FF", target[3].ObisCode.ToHexString());
            Assert.AreEqual("0100020802FF", target[4].ObisCode.ToHexString());
            Assert.AreEqual("010001083FFF", target[5].ObisCode.ToHexString());
            Assert.AreEqual("010002083FFF", target[6].ObisCode.ToHexString());

            Assert.AreEqual(1, target[0].TariffId);
            Assert.AreEqual(2, target[1].TariffId);
            Assert.AreEqual(3, target[2].TariffId);
            Assert.AreEqual(5, target[3].TariffId);
            Assert.AreEqual(6, target[4].TariffId);
            Assert.AreEqual(63, target[5].TariffId);
            Assert.AreEqual(63, target[6].TariffId);

            var analysisProfile3 = new AnalysisProfile
            {
                TariffUseCase = HanAdapter.Interface.TafId.Taf2
            };

            var obisId381 = "0100030801FF";
            var obisId481 = "0100040801FF";
            var obisId482 = "0100040802FF";

            var tariffStage8 = new TariffStage()
            {
                Description = "T8", ObisCode = obisId381, TariffNumber = 8
            };
            var tariffStage9 = new TariffStage()
            {
                Description = "T9", ObisCode = obisId481, TariffNumber = 9
            };
            var tariffStage10 = new TariffStage()
            {
                Description = "T10", ObisCode = obisId482, TariffNumber = 10
            };

            analysisProfile3.TariffStages.Add(tariffStage1);
            analysisProfile3.TariffStages.Add(tariffStage2);
            analysisProfile3.TariffStages.Add(tariffStage3);
            analysisProfile3.TariffStages.Add(tariffStage5);
            analysisProfile3.TariffStages.Add(tariffStage6);
            analysisProfile3.TariffStages.Add(tariffStage8);
            analysisProfile3.TariffStages.Add(tariffStage9);
            analysisProfile3.TariffStages.Add(tariffStage10);

            supplier.AnalysisProfile = analysisProfile3;

            target = supplier.GetRegister();

            foreach (Register reg in target)
            {
                Assert.AreEqual(0, reg.Amount);
            }

            Assert.AreEqual(12, target.Count);

            Assert.AreEqual("0100010801FF", target[0].ObisCode.ToHexString());
            Assert.AreEqual("0100010802FF", target[1].ObisCode.ToHexString());
            Assert.AreEqual("0100010803FF", target[2].ObisCode.ToHexString());
            Assert.AreEqual("0100020801FF", target[3].ObisCode.ToHexString());
            Assert.AreEqual("0100020802FF", target[4].ObisCode.ToHexString());
            Assert.AreEqual("0100030801FF", target[5].ObisCode.ToHexString());
            Assert.AreEqual("0100040801FF", target[6].ObisCode.ToHexString());
            Assert.AreEqual("0100040802FF", target[7].ObisCode.ToHexString());
            Assert.AreEqual("010001083FFF", target[8].ObisCode.ToHexString());
            Assert.AreEqual("010002083FFF", target[9].ObisCode.ToHexString());
            Assert.AreEqual("010003083FFF", target[10].ObisCode.ToHexString());
            Assert.AreEqual("010004083FFF", target[11].ObisCode.ToHexString());

            Assert.AreEqual(1, target[0].TariffId);
            Assert.AreEqual(2, target[1].TariffId);
            Assert.AreEqual(3, target[2].TariffId);
            Assert.AreEqual(5, target[3].TariffId);
            Assert.AreEqual(6, target[4].TariffId);
            Assert.AreEqual(8, target[5].TariffId);
            Assert.AreEqual(9, target[6].TariffId);
            Assert.AreEqual(10, target[7].TariffId);
            Assert.AreEqual(63, target[8].TariffId);
            Assert.AreEqual(63, target[9].TariffId);
            Assert.AreEqual(63, target[10].TariffId);
            Assert.AreEqual(63, target[11].TariffId);
        }
Exemple #3
0
        public void TestGetValidDayProfilesForMeterReading()
        {
            var dayTimeProfiles1 = new List <DayTimeProfile>();
            var dayTimeProfiles2 = new List <DayTimeProfile>();
            var dayTimeProfiles3 = new List <DayTimeProfile>();
            var dayTimeProfiles4 = new List <DayTimeProfile>();

            var hours   = 0;
            var minutes = new int[] { 0, 15, 30, 45 };

            // Initialize dayTimeProfiles1 (just one tariff for the whole day)
            for (int i = 0; i < 96; i++)
            {
                var index = i % (minutes.Length);
                var dtp   = new DayTimeProfile()
                {
                    TariffNumber = 1,

                    StartTime = new TimeVarType()
                    {
                        Hour = (byte)hours, Minute = (byte)minutes[index]
                    }
                };

                hours = index == 3 ? hours + 1 : hours;
                dayTimeProfiles1.Add(dtp);
            }

            // Initialize dayTimeProfiles2 (tariff 2 from 0 to 6; tariff 1 from 6 to 21; tariff 2 from 21 to 0)
            hours = 0;
            for (int i = 0; i < 96; i++)
            {
                var index = i % (minutes.Length);
                var dtp   = new DayTimeProfile()
                {
                    StartTime = new TimeVarType()
                    {
                        Hour = (byte)hours, Minute = (byte)minutes[index]
                    }
                };

                if (hours > 5 && hours < 21)
                {
                    dtp.TariffNumber = 1;
                }
                else
                {
                    dtp.TariffNumber = 2;
                }

                hours = index == 3 ? hours + 1 : hours;
                dayTimeProfiles2.Add(dtp);
            }

            // Initialize dayTimeProfiles3 (tariff 3 from 0 to 12; tariff 4 from 12 to 0)
            hours = 0;
            for (int i = 0; i < 96; i++)
            {
                var index = i % (minutes.Length);
                var dtp   = new DayTimeProfile()
                {
                    StartTime = new TimeVarType()
                    {
                        Hour = (byte)hours, Minute = (byte)minutes[index]
                    }
                };

                if (hours < 12)
                {
                    dtp.TariffNumber = 3;
                }
                else
                {
                    dtp.TariffNumber = 4;
                }

                hours = index == 3 ? hours + 1 : hours;
                dayTimeProfiles3.Add(dtp);
            }

            // Initialize dayTimeProfiles4 (tariff 1 from 0 to 12; tariff 4 from 12 to 0)
            hours = 0;
            for (int i = 0; i < 96; i++)
            {
                var index = i % (minutes.Length);
                var dtp   = new DayTimeProfile()
                {
                    StartTime = new TimeVarType()
                    {
                        Hour = (byte)hours, Minute = (byte)minutes[index]
                    }
                };

                if (hours < 12)
                {
                    dtp.TariffNumber = 1;
                }
                else
                {
                    dtp.TariffNumber = 4;
                }

                hours = index == 3 ? hours + 1 : hours;
                dayTimeProfiles4.Add(dtp);
            }


            // The MeterReading ObisIds
            var oc1 = new ObisId("0100010800FF");
            var oc2 = new ObisId("0100020800FF");

            // Create the list of DayProfiles
            var dayProfiles = new List <DayProfile>();

            var dp1 = new DayProfile()
            {
                DayId = 1, DayTimeProfiles = dayTimeProfiles1
            };
            var dp2 = new DayProfile()
            {
                DayId = 2, DayTimeProfiles = dayTimeProfiles2
            };
            var dp3 = new DayProfile()
            {
                DayId = 3, DayTimeProfiles = dayTimeProfiles3
            };

            dayProfiles.Add(dp1);
            dayProfiles.Add(dp2);
            dayProfiles.Add(dp3);

            var tariffStages = new List <TariffStage>();

            var obisId181 = "0100010801FF";
            var obisId182 = "0100010802FF";
            var obisId281 = "0100020801FF";
            var obisId282 = "0100020802FF";

            var tariffStage1 = new TariffStage()
            {
                Description = "T1", ObisCode = obisId181, TariffNumber = 1
            };
            var tariffStage2 = new TariffStage()
            {
                Description = "T2", ObisCode = obisId182, TariffNumber = 2
            };
            var tariffStage3 = new TariffStage()
            {
                Description = "T3", ObisCode = obisId281, TariffNumber = 3
            };
            var tariffStage4 = new TariffStage()
            {
                Description = "T4", ObisCode = obisId282, TariffNumber = 4
            };

            tariffStages.Add(tariffStage1);
            tariffStages.Add(tariffStage2);
            tariffStages.Add(tariffStage3);
            tariffStages.Add(tariffStage4);

            var target = dayProfiles.GetValidDayProfilesForMeterReading(oc1, tariffStages);

            Assert.AreEqual(2, target.Count);
            Assert.AreEqual((ushort)1, target[0]);
            Assert.AreEqual((ushort)2, target[1]);

            target = dayProfiles.GetValidDayProfilesForMeterReading(oc2, tariffStages);

            Assert.AreEqual(1, target.Count);
            Assert.AreEqual((ushort)3, target[0]);

            var obisId381 = "0100030801FF";
            var obisId482 = "0100040802FF";

            var tariffStage5 = new TariffStage()
            {
                Description = "T5", ObisCode = obisId381, TariffNumber = 5
            };
            var tariffStage6 = new TariffStage()
            {
                Description = "T6", ObisCode = obisId482, TariffNumber = 6
            };

            var tariffStages2 = new List <TariffStage>();

            tariffStages2.Add(tariffStage5);
            tariffStages2.Add(tariffStage6);

            target = dayProfiles.GetValidDayProfilesForMeterReading(oc1, tariffStages2);

            Assert.AreEqual(0, target.Count);

            target = dayProfiles.GetValidDayProfilesForMeterReading(oc2, tariffStages2);

            Assert.AreEqual(0, target.Count);

            var dayProfiles2 = new List <DayProfile>();

            var dp4 = new DayProfile()
            {
                DayId = 4, DayTimeProfiles = dayTimeProfiles4
            };

            dayProfiles2.Add(dp4);

            target = dayProfiles2.GetValidDayProfilesForMeterReading(oc1, tariffStages);

            Assert.AreEqual(0, target.Count);

            target = dayProfiles2.GetValidDayProfilesForMeterReading(oc2, tariffStages);

            Assert.AreEqual(0, target.Count);

            target = dayProfiles2.GetValidDayProfilesForMeterReading(oc1, tariffStages2);

            Assert.AreEqual(0, target.Count);

            target = dayProfiles2.GetValidDayProfilesForMeterReading(oc2, tariffStages2);

            Assert.AreEqual(0, target.Count);

            Assert.ThrowsException <ArgumentNullException>(() => dayProfiles.GetValidDayProfilesForMeterReading(null, null));

            Assert.ThrowsException <ArgumentNullException>(() => dayProfiles.GetValidDayProfilesForMeterReading(null, tariffStages));

            Assert.ThrowsException <ArgumentNullException>(() => dayProfiles.GetValidDayProfilesForMeterReading(oc1, null));

            Assert.ThrowsException <ArgumentException>(() => dayProfiles.GetValidDayProfilesForMeterReading(oc1, new List <TariffStage>()));

            var dayProfilesEmpty = new List <DayProfile>();

            Assert.ThrowsException <ArgumentException>(() => dayProfilesEmpty.GetValidDayProfilesForMeterReading(oc1, tariffStages));
        }
        private void AddAnalysisProfile(AdapterContext ctx)
        {
            Log.Information("Addding analysis profile");

            this.CurrentDataResult.Model.AnalysisProfile =
                new AnalysisProfile {
                TariffUseCase = ctx.Contract.TafId, TariffId = ctx.Contract.TafName,
            };

            var lowestTariffId = ushort.MaxValue;

            if (this.CurrentDataResult.MeterReadings.Count == 0)
            {
                var ts = new TariffStage
                {
                    ObisCode     = "010000000FF",
                    TariffNumber = 0,
                    Description  = string.Empty
                };
                lowestTariffId = 0;
                this.CurrentDataResult.Model.AnalysisProfile.TariffStages.Add(ts);
            }
            else
            {
                foreach (var mr in this.CurrentDataResult.MeterReadings)
                {
                    var ts = new TariffStage
                    {
                        ObisCode     = mr.ReadingType.ObisCode,
                        TariffNumber = new ObisId(mr.ReadingType.ObisCode).E,
                        Description  = string.Empty
                    };

                    lowestTariffId = Math.Min(lowestTariffId, ts.TariffNumber);
                    this.CurrentDataResult.Model.AnalysisProfile.TariffStages.Add(ts);
                }
            }

            this.CurrentDataResult.Model.AnalysisProfile.DefaultTariffNumber = lowestTariffId;

            DateTime begin;
            DateTime end;

            if (ctx.BillingPeriod != null)
            {
                begin = ctx.BillingPeriod.Begin;
                end   = ctx.BillingPeriod.End ?? DateTime.Now;
            }
            else
            {
                begin = ctx.Contract.Begin;
                end   = ctx.Contract.End ?? DateTime.Now;
            }

            this.CurrentDataResult.Model.AnalysisProfile.BillingPeriod =
                new Interval {
                Start = begin, Duration = (uint)(end - begin).TotalSeconds
            };

            XNamespace ns = @"http://vde.de/AR_2418-6.xsd";
            var        tariffNameElement = this.CurrentDataResult?.Raw?.Root?.Descendants().FirstOrDefault(n => n.Name.LocalName == "tariffName");

            if (tariffNameElement == null)
            {
                return;
            }

            var analysisProfile = new XElement(ns + "AnalysisProfile",
                                               new XElement(ns + "tariffUseCase", (int)this.CurrentDataResult.Model.AnalysisProfile.TariffUseCase),
                                               new XElement(ns + "tariffId", this.CurrentDataResult.Model.AnalysisProfile.TariffId),
                                               new XElement(ns + "billingPeriod",
                                                            new XElement(ns + "duration", this.CurrentDataResult.Model.AnalysisProfile.BillingPeriod.Duration),
                                                            new XElement(ns + "start", this.CurrentDataResult.Model.AnalysisProfile.BillingPeriod.Start)));

            foreach (var ts in this.CurrentDataResult.Model.AnalysisProfile.TariffStages)
            {
                analysisProfile.Add(new XElement(ns + "TariffStage",
                                                 new XElement(ns + "tariffNumber", ts.TariffNumber),
                                                 new XElement(ns + "description", ts.Description),
                                                 new XElement(ns + "obisCode", ts.ObisCode))
                                    );
            }

            analysisProfile.Add(new XElement(ns + "defaultTariffNumber", this.CurrentDataResult.Model.AnalysisProfile.DefaultTariffNumber));
            tariffNameElement.AddAfterSelf(analysisProfile);
        }