Esempio n. 1
0
        protected override void RunActualProcess([NotNull] ScenarioSliceParameters parameters)
        {
            var dbDstProfiles = Services.SqlConnection.GetDatabaseConnection(Stage.ProfileGeneration, parameters);
            var dbSrcProfiles = Services.SqlConnection.GetDatabaseConnection(Stage.ProfileImport, Constants.PresentSlice).Database;
            var vdewvals      = dbSrcProfiles.Fetch <VDEWProfileValues>();
            var dbHouses      = Services.SqlConnection.GetDatabaseConnection(Stage.Houses, parameters).Database;
            var houses        = dbHouses.Fetch <House>();

            Prosumer.ClearProsumerTypeFromDB(Services.SqlConnection.GetDatabaseConnection(Stage.ProfileGeneration,
                                                                                          parameters), ProsumerType.Household, TableType.HousePart);
            var slp = new SLPProvider(parameters.DstYear);
            //var houses = dbHouses.Fetch<House>();
            var households = dbHouses.Fetch <Household>();

            //var trafoKreise = dbDstProfiles.Database.Fetch<TrafoKreisResult>();
            Log(MessageType.Info, "making " + households.Count + " households");
            var sa = Prosumer.GetSaveableEntry(dbDstProfiles, TableType.HousePart);
            // && idx < 20
            double totalHouseholdEnergy = 0;
            double totalProfileEnergy   = 0;

            for (var idx = 0; idx < households.Count; idx++)
            {
                var           household = households[idx];
                House         house     = houses.Single(x => x.HouseGuid == household.HouseGuid);
                Hausanschluss ha        = house.Hausanschluss.Single(x => x.HausanschlussGuid == household.HausAnschlussGuid);
                // ReSharper disable once UseObjectOrCollectionInitializer
                var pa = new Prosumer(household.HouseGuid, household.StandortIDsAsJson,
                                      ProsumerType.Household, household.HouseholdGuid,
                                      household.FinalIsn, household.HausAnschlussGuid, ha.ObjectID);
                pa.Profile = slp.Run(vdewvals, "H0", household.LowVoltageYearlyTotalElectricityUse);
                pa.SumElectricityPlanned = household.LowVoltageYearlyTotalElectricityUse;
                sa.RowEntries.Add(pa.GetRow());
                totalHouseholdEnergy += pa.SumElectricityPlanned;
                totalProfileEnergy   += pa.Profile?.EnergySum() ?? 0;
                if (sa.RowEntries.Count > 1000)
                {
                    sa.SaveDictionaryToDatabase();
                }
            }
            sa.SaveDictionaryToDatabase();
            if (Math.Abs(totalHouseholdEnergy - totalProfileEnergy) > 1)
            {
                throw new FlaException("energy sums not equal between planned energy and energy in profiles");
            }
            Info("Total Household energy: " + totalHouseholdEnergy);

            /*
             * var loadedProsumers = Prosumer.LoadProsumers(dbDstProfiles, TableType.HousePart);
             * foreach (Prosumer loadedProsumer in loadedProsumers) {
             * Log(MessageType.Info,loadedProsumer.Name + " - " + loadedProsumer.SumElectricityFromProfile + " - " + loadedProsumer.Profile?.Values.Sum() );
             * }*/
            //dbDstProfiles.Database.CompleteTransaction();
        }
Esempio n. 2
0
        protected override void RunActualProcess([NotNull] ScenarioSliceParameters parameters)
        {
            var dbSrcProfiles = Services.SqlConnection.GetDatabaseConnection(Stage.ProfileImport, Constants.PresentSlice).Database;
            var vdewvals      = dbSrcProfiles.Fetch <VDEWProfileValues>();
            var dbHouses      = Services.SqlConnection.GetDatabaseConnection(Stage.Houses, parameters).Database;
            var dbDstProfiles = Services.SqlConnection.GetDatabaseConnection(Stage.ProfileGeneration, parameters);

            Prosumer.ClearProsumerTypeFromDB(Services.SqlConnection.GetDatabaseConnection(Stage.ProfileGeneration,
                                                                                          parameters), ProsumerType.Household, TableType.HousePart);
            var slp = new SLPProvider(parameters.DstYear);
            //var hausAnschlüsse = dbHouses.Fetch<Hausanschluss>();
            //var houses = dbHouses.Fetch<House>();
            var buisineses = dbHouses.Fetch <BusinessEntry>();
            //double totalHouseholdEnergy = 0;
            //double totalProfileEnergy = 0;
            var sa = Prosumer.GetSaveableEntry(dbDstProfiles, TableType.HousePart);

            Log(MessageType.Info, "making " + buisineses.Count + " businesses");
            foreach (var be in buisineses)
            {
                // Hausanschluss ha = hausAnschlüsse.Single(x => x.HausanschlussGuid == be.HausAnschlussGuid);
                var pa = new Prosumer(be.HouseGuid, be.StandortIDsAsJson, ProsumerType.BusinessNoLastgang,
                                      be.BusinessGuid, be.FinalIsn, be.HausAnschlussGuid, "")
                {
                    Profile = slp.Run(vdewvals, "G0", be.LowVoltageYearlyTotalElectricityUse),
                    SumElectricityPlanned = be.LowVoltageYearlyTotalElectricityUse
                };
                //totalHouseholdEnergy += pa.SumElectricityPlanned;
                //totalProfileEnergy += (double)pa.Profile?.EnergySum();
                sa.AddRow(pa);
            }

            /*var trafoKreise = dbDstProfiles.Database.Fetch<TrafoKreisResult>();
             * double plannedHouseholdEnergy = trafoKreise.Sum(x => x.BusinessEnergy);
             * if (Math.Abs(plannedHouseholdEnergy - totalHouseholdEnergy) > 1)
             * {
             *  throw new Exception("energy sums are not equal between planned energy and allocated household energy");
             * }
             *
             * if (Math.Abs(plannedHouseholdEnergy - totalProfileEnergy) > 1)
             * {
             *  throw new Exception("energy sums not equal between planned energy and energy in profiles");
             * }*/

            sa.SaveDictionaryToDatabase();
        }
Esempio n. 3
0
        protected override void RunChartMaking()
        {
            var dbImport  = Services.SqlConnection.GetDatabaseConnection(Stage.ProfileImport, Constants.PresentSlice);
            var slpValues = dbImport.Database.Fetch <VDEWProfileValues>();
            var sp        = new SLPProvider(2017);
            var pH0       = sp.Run(slpValues, "H0", 1000);
            var filename  = MakeAndRegisterFullFilename("H0.png", "SLPTests", "SlpTests", Constants.PresentSlice);

            Services.PlotMaker.MakeLineChart(filename, "Leistung", pH0);

            var pG0 = sp.Run(slpValues, "G0", 1000);

            filename = MakeAndRegisterFullFilename("G0.png", "SLPTests", "SlpTests", Constants.PresentSlice);
            Services.PlotMaker.MakeLineChart(filename, "Leistung", pG0);


            var pG1 = sp.Run(slpValues, "G1", 1000);

            filename = MakeAndRegisterFullFilename("G1.png", "SLPTests", "SlpTests", Constants.PresentSlice);
            Services.PlotMaker.MakeLineChart(filename, "Leistung", pG1);
        }
        protected override void RunChartMaking()
        {
            var dbRaw     = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice);
            var slpValues = dbRaw.Fetch <VDEWProfileValue>();
            var feiertage = dbRaw.Fetch <FeiertagImport>();
            var sp        = new SLPProvider(2017, slpValues, feiertage);
            var pH0       = sp.Run("H0", 1000);
            var filename  = MakeAndRegisterFullFilename("H0.png", Constants.PresentSlice);

            Services.PlotMaker.MakeLineChart(filename, "Leistung", pH0);

            var pG0 = sp.Run("G0", 1000);

            filename = MakeAndRegisterFullFilename("G0.png", Constants.PresentSlice);
            Services.PlotMaker.MakeLineChart(filename, "Leistung", pG0);


            var pG1 = sp.Run("G1", 1000);

            filename = MakeAndRegisterFullFilename("G1.png", Constants.PresentSlice);
            Services.PlotMaker.MakeLineChart(filename, "Leistung", pG1);
        }
        private ProviderCollection MakeDiContrainer([NotNull] ScenarioSliceParameters parameters,
                                                    [NotNull][ItemNotNull] List <string> developmentStatus,
                                                    [NotNull][ItemNotNull] List <Hausanschluss> hausanschlusses,
                                                    [NotNull][ItemNotNull] List <House> houses,
                                                    [NotNull][ItemNotNull] List <HouseCreationAndCalculationJob> districts,
                                                    [NotNull] SLPProvider slpProvider,
                                                    [NotNull] DBDto dbdto)
        {
            ContainerBuilder builder = new ContainerBuilder();
            var mainAssembly         = Assembly.GetAssembly(typeof(MainBurgdorfStatisticsCreator));

            builder.RegisterAssemblyTypes(mainAssembly).Where(t => t.GetInterfaces().Contains(typeof(ILoadProfileProvider))).AsSelf()
            .As <ILoadProfileProvider>();
            builder.RegisterType <ProviderCollection>().SingleInstance();
            builder.RegisterType <CachingLPGProfileLoader>().SingleInstance();
            builder.Register(x => _services.Logger).As <ILogger>();
            builder.Register(x => _services).As <ServiceRepository>();
            builder.Register(x => hausanschlusses).SingleInstance();
            builder.Register(x => houses).SingleInstance();
            builder.Register(x => districts).SingleInstance();
            builder.Register(x => parameters).SingleInstance();
            builder.Register(x => slpProvider).SingleInstance();
            builder.Register(x => dbdto).SingleInstance();
            var container = builder.Build();
            ProviderCollection loadProfileProviders = container.Resolve <ProviderCollection>();

            foreach (var provider in loadProfileProviders.Providers)
            {
                foreach (var dev in provider.DevelopmentStatus)
                {
                    developmentStatus.Add(provider.Name + ": " + dev);
                }
            }

            return(loadProfileProviders);
        }
        public void ProcessAllHouses([NotNull] ScenarioSliceParameters parameters,
                                     [NotNull] Func <string, ScenarioSliceParameters, bool, string> makeAndRegisterFullFilename,
                                     ProcessingMode processingMode,
                                     [NotNull][ItemNotNull] List <string> developmentStatus)
        {
            if (!Directory.Exists(_processingResultPathForProfiles))
            {
                Directory.CreateDirectory(_processingResultPathForProfiles);
                Thread.Sleep(500);
            }
            else
            {
                var dstDi = new DirectoryInfo(_processingResultPathForProfiles);
                var files = dstDi.GetFiles();
                Info("Cleaning " + files.Length + " files from result directory " + _processingResultPathForProfiles);
                foreach (var file in files)
                {
                    file.Delete();
                }
            }

            var dbHouses = _services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, parameters);

            Info("using house db in  " + dbHouses.ConnectionString);
            var houses = dbHouses.Fetch <House>();
            HouseComponentRepository hcr = new HouseComponentRepository(dbHouses);
            var   households             = dbHouses.Fetch <Household>();
            var   hausanschlusses        = dbHouses.Fetch <Hausanschluss>();
            var   cars  = dbHouses.Fetch <Car>();
            var   dbRaw = _services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice);
            var   measuredRlmProfiles = dbRaw.Fetch <RlmProfile>();
            DBDto dbdto = new DBDto(houses, hausanschlusses, cars, households, measuredRlmProfiles);
            ProsumerComponentResultArchiver pra = new ProsumerComponentResultArchiver(Stage.ProfileGeneration, parameters, processingMode, _services);
            var trafokreiseToProcess            = PrepareListOfTrafokreiseToProcess(hausanschlusses);

            List <HouseCreationAndCalculationJob> districts = new List <HouseCreationAndCalculationJob>();
            var vdewValues           = dbRaw.Fetch <VDEWProfileValue>();
            var feiertage            = dbRaw.Fetch <FeiertagImport>();
            var slpProvider          = new SLPProvider(parameters.DstYear, vdewValues, feiertage);
            var loadProfileProviders = MakeDiContrainer(parameters, developmentStatus, hausanschlusses, houses, districts, slpProvider, dbdto);

            if (processingMode == ProcessingMode.Collecting)
            {
                ClearAllExistingExportProfiles();
            }

            var lpgDirectoryInfo          = GetLPGCalcDirectoryInfo(parameters);
            ProfileGenerationRo pgRo      = new ProfileGenerationRo();
            DateTime            startTime = DateTime.Now;
            DateTime            lastLog   = DateTime.Now;

            Info("Processing " + houses.Count + " houses.");
            Info("Processing mode is " + processingMode);
            List <string> brokenLpgDirectories = new List <string>();
            List <string> brokenLpgJsons       = new List <string>();
            Dictionary <string, List <HouseComponentEntry> > houseComponentsByObjectID = BuildDictionaryByObjektID(houses,
                                                                                                                   hcr,
                                                                                                                   hausanschlusses,
                                                                                                                   pgRo,
                                                                                                                   out var numberOfcomponents);
            int       processedComponents = 0;
            Stopwatch swCollecting        = new Stopwatch();
            Stopwatch swWriting           = new Stopwatch();
            Dictionary <string, int> numberOfEmptyProsumers = new Dictionary <string, int>();
            HashSet <string>         validHouseGuids        = houses.Select(x => x.Guid).ToHashSet();

            foreach (KeyValuePair <string, List <HouseComponentEntry> > pair in houseComponentsByObjectID)
            {
                var houseProsumers = new List <Prosumer>();
                //erst alle profile einsammeln / vorbereiten
                swCollecting.Start();
                foreach (var component in pair.Value)
                {
                    processedComponents++;
                    if (processedComponents % 1000 == 0)
                    {
                        Info(processingMode + " processed Components " + processedComponents + " / " + numberOfcomponents);
                    }

                    ProviderParameterDto ppdto = new ProviderParameterDto(component.Component, lpgDirectoryInfo.FullName, pgRo[component.Component]);
                    var provider = loadProfileProviders.GetCorrectProvider(component.Component);
                    pgRo[component.Component].UsedProvider = provider.Name;
                    if (processingMode == ProcessingMode.Preparing)
                    {
                        provider.PrepareLoadProfileIfNeeded(ppdto);
                    }

                    if (processingMode == ProcessingMode.Collecting)
                    {
                        if (trafokreiseToProcess.Contains(component.Hausanschluss.Trafokreis))
                        {
                            Prosumer p = provider.ProvideProfile(ppdto);
                            //Todo: add up profile per trafokreis, profile per provider etc right here
                            if (p != null)
                            {
                                // some providers that are not ready will return null
                                if (p.Profile?.EnergyOrPower != EnergyOrPower.Energy)
                                {
                                    throw new FlaException("Got a power profile from " + provider.Name);
                                }

                                CheckProfileIntegrity(p, provider, component.Component, validHouseGuids);
                                // ReSharper disable once AssignNullToNotNullAttribute
                                pgRo[component.Component].AddProsumerInformation(p);
                                houseProsumers.Add(p);
                                pra.Archive(p);
                            }
                            else
                            {
                                if (!numberOfEmptyProsumers.ContainsKey(provider.Name))
                                {
                                    numberOfEmptyProsumers.Add(provider.Name, 0);
                                }

                                numberOfEmptyProsumers[provider.Name]++;
                            }
                        }
                    }
                }

                swCollecting.Stop();
                //dann alles rausschreiben
                swWriting.Start();
                if (processingMode == ProcessingMode.Collecting)
                {
                    var generationProsumers = houseProsumers.Where(x => x.GenerationOrLoad == GenerationOrLoad.Generation).ToList();
                    var loadProsumers       = houseProsumers.Where(x => x.GenerationOrLoad == GenerationOrLoad.Load).ToList();
                    var component           = pair.Value[0];
                    if (loadProsumers.Count > 0)
                    {
                        Prosumer summedProsumer = GetSummedProsumer(loadProsumers, component.Hausanschluss.Trafokreis);
                        var      haros          = pgRo.HausanschlussByObjectId(pair.Key);
                        double   maxPower       = summedProsumer.Profile?.MaxPower() ?? 0;
                        foreach (var haro in haros)
                        {
                            haro.MaximumPower = maxPower;
                        }

                        WriteSumLineToCsv(summedProsumer, component.Hausanschluss.Trafokreis, GenerationOrLoad.Load);
                    }

                    if (generationProsumers.Count > 0)
                    {
                        var sumProfile = GetSummedProsumer(generationProsumers, component.Hausanschluss.Trafokreis);
                        WriteSumLineToCsv(sumProfile, component.Hausanschluss.Trafokreis, GenerationOrLoad.Generation);
                        // ReSharper disable once PossibleNullReferenceException
                    }
                }

                swWriting.Stop();
                ReportProgress(startTime, processedComponents, numberOfcomponents, parameters, ref lastLog, swCollecting, swWriting);
            }

            Info("Finished processing all components, finishing up now. Duration: " + (DateTime.Now - startTime).TotalMinutes.ToString("F2") +
                 " minutes");
            Info("collecting took " + swCollecting.Elapsed + " and writing took " + swWriting.Elapsed);
            foreach (var pair in numberOfEmptyProsumers)
            {
                Info("NumberOfEmptyProsumers for " + pair.Key + " was " + pair.Value);
            }

            if (processingMode == ProcessingMode.Preparing)
            {
                DateTime endtime           = new DateTime(parameters.DstYear, 12, 31);
                string   houseJobDirectory = Path.Combine(_services.RunningConfig.Directories.HouseJobsDirectory,
                                                          parameters.DstScenario.ToString(),
                                                          parameters.DstYear.ToString());
                DirectoryInfo houseJobDi = new DirectoryInfo(houseJobDirectory);
                WriteDistrictsForLPG(districts, houseJobDi, _services.Logger, parameters, endtime, pgRo);
            }
            else
            {
                DateTime startSavingToDB = DateTime.Now;
                pra.FinishSavingEverything();
                Info("Finished writing prosumers to db. Duration: " + (DateTime.Now - startSavingToDB).TotalMinutes.ToString("F2") + " minutes");
            }

            pra.Dispose();
            var excelFiles = WriteExcelResultFiles(parameters, makeAndRegisterFullFilename, processingMode, pgRo);

            if (_services.RunningConfig.CollectFilesForArchive)
            {
                SaveToArchiveDirectory(parameters, excelFiles, _services.StartingTime, _services.RunningConfig);
            }

            WriteBrokenLpgCalcCleanupBatch(parameters, makeAndRegisterFullFilename, processingMode, brokenLpgDirectories, brokenLpgJsons);
            if (processingMode == ProcessingMode.Collecting)
            {
                foreach (var provider in loadProfileProviders.Providers)
                {
                    provider.DoFinishCheck();
                }
            }
        }