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(); }
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(); }
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(); } } }