protected override void RunActualProcess([NotNull] ScenarioSliceParameters parameters) { //profile export var dbProfileExport = Services.SqlConnection.GetDatabaseConnection(Stage.ProfileExport, parameters); var prosumers = Prosumer.LoadProsumers(dbProfileExport, TableType.HouseGeneration); var resultPathGeneration = Path.Combine(dbProfileExport.GetResultFullPath(SequenceNumber, Name), "Export"); if (Directory.Exists(resultPathGeneration)) { Directory.Delete(resultPathGeneration, true); Thread.Sleep(500); } if (!Directory.Exists(resultPathGeneration)) { Directory.CreateDirectory(resultPathGeneration); Thread.Sleep(500); } HashSet <string> usedKeys = new HashSet <string>(); var trafokreise = prosumers.Select(x => x.TrafoKreis).Distinct().ToList(); RowCollection rc = new RowCollection(); foreach (var trafokreis in trafokreise) { if (string.IsNullOrWhiteSpace(trafokreis)) { continue; } var filteredProsumers = prosumers.Where(x => x.TrafoKreis == trafokreis).ToList(); string tkFileName = trafokreis.Replace("ä", "ae").Replace("ö", "oe").Replace("ü", "ue"); var csvFileNameGeneration = Path.Combine(resultPathGeneration, tkFileName + ".csv"); var sw2 = new StreamWriter(csvFileNameGeneration); int lines = 0; foreach (var prosumer in filteredProsumers) { var row = RowBuilder.Start("Trafokreis", trafokreis).Add("Name", prosumer.Name).Add("Energy", prosumer.SumElectricityFromProfile); if (usedKeys.Contains(prosumer.HausanschlussKey)) { throw new FlaException("This key was already exported"); } usedKeys.Add(prosumer.HausanschlussKey); sw2.WriteLine(prosumer.GetCSVLine()); lines++; rc.Add(row); } Log(MessageType.Info, "Wrote " + lines + " lines to " + csvFileNameGeneration); sw2.Close(); } var fn = MakeAndRegisterFullFilename("Generation.xlsx", parameters); XlsxDumper.WriteToXlsx(rc, fn, "Generators"); }
protected override void RunActualProcess([NotNull] ScenarioSliceParameters parameters) { //profile export var dbProfileExport = Services.SqlConnection.GetDatabaseConnection(Stage.ProfileExport, parameters); //var dbProfileGeneration = Services.SqlConnection.GetDatabaseConnection(Stage.ProfileGeneration, parameters); var dbHouses = Services.SqlConnection.GetDatabaseConnection(Stage.Houses, parameters); var dbHousesPresent = Services.SqlConnection.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice); var prosumers = Prosumer.LoadProsumers(dbProfileExport, TableType.HouseLoad); var visualPath = Path.Combine(dbProfileExport.GetResultFullPath(SequenceNumber, Name), "Visual"); if (!Directory.Exists(visualPath)) { Directory.CreateDirectory(visualPath); } //var tkResults = dbProfileGeneration.Database.Fetch<TrafoKreisResult>(); var houses = dbHouses.Database.Fetch <House>(); var houseEnergyUse = dbHousesPresent.Database.Fetch <HouseSummedLocalnetEnergyUse>(); var trafokreise = houses.Select(x => x.TrafoKreis).Distinct().ToList(); var p = new ExcelPackage(); var ws = p.Workbook.Worksheets.Add("MySheet"); TrafokreisStatisticsEntry.WriteHeaderToWs(ws); int exportRow = 2; //Dictionary<long, string> isnTrafokreis = new Dictionary<long, string>();//for checking for duplicate isns foreach (var trafokreis in trafokreise) { if (string.IsNullOrWhiteSpace(trafokreis)) { continue; } TrafokreisStatisticsEntry tkse = new TrafokreisStatisticsEntry(trafokreis) { OriginalHouses = houses.Where(x => x.TrafoKreis == trafokreis).Count() }; var originalHouseGuids = houses.Where(x => x.TrafoKreis == trafokreis).Select(x => x.HouseGuid).ToList(); var houseEnergyUses = houseEnergyUse.Where(x => originalHouseGuids.Contains(x.HouseGuid)).ToList(); foreach (var energyUse in houseEnergyUses) { tkse.OriginalElectricityUse += energyUse.ElectricityUse; tkse.OriginalElectricityUseDay += energyUse.ElectricityUseDayLow; tkse.OriginalElectricityUseNight += energyUse.ElectricityUseNightLow; } List <double> zeroes = new List <double>(new double[8760 * 4]); var trafokreisSumProfile = new Profile(trafokreis, zeroes.AsReadOnly(), ProfileType.Energy); var filteredProsumers = prosumers.Where(x => x.TrafoKreis == trafokreis); foreach (Prosumer prosumer in filteredProsumers) { if (prosumer.Profile == null) { throw new Exception("Profile was null"); } // if (isnTrafokreis.ContainsKey(prosumer.Isn)) { // throw new Exception("Duplicate ISN"); // } // isnTrafokreis.Add(prosumer.Isn,trafokreis); tkse.ProfileElectricityUse += prosumer.Profile.EnergySum(); tkse.ProfileDuringNight += prosumer.Profile.EnergyDuringNight(); tkse.ProfileDuringDay += prosumer.Profile.EnergyDuringDay(); if (Math.Abs(tkse.ProfileDuringNight + tkse.ProfileDuringDay - tkse.ProfileElectricityUse) > 1) { throw new FlaException("Invalid day/night/sum"); } tkse.ProfileHouses++; trafokreisSumProfile = trafokreisSumProfile.Add(prosumer.Profile, trafokreis); } if (Math.Abs(tkse.OriginalElectricityUse) < 1 && tkse.ProfileElectricityUse > 0) { throw new FlaException("No energy planned, but energy allocated"); } /* if (Math.Abs(trafokreisSumProfile.EnergySum()) < 0.0001 && Math.Abs(tkse.OriginalElectricityUse) > 0.1) { * throw new Exception("trafokreis has 0 electricy exported."); * }*/ //tkse.CollectedEnergyFromHouses = tkResults.Single(x => x.TrafoKreisName == trafokreis).TotalEnergyAmount; tkse.WriteToWorksheet(ws, exportRow++); //make trafokreis chart var ls = trafokreisSumProfile.GetLineSeriesEntriesList(); var chartfilename = MakeAndRegisterFullFilename("Visual\\" + trafokreis + ".png", Name, "", parameters); FileInfo fi = new FileInfo(chartfilename); Debug.Assert(fi.Directory != null, "fi.Directory != null"); if (!fi.Directory.Exists) { fi.Directory.Create(); Thread.Sleep(500); } Services.PlotMaker.MakeLineChart(chartfilename, trafokreis, ls, new List <PlotMaker.AnnotationEntry>()); } int offset = 12; ws.Cells[1, offset].Value = "Summe Stromverbrauch von Localnet"; ws.Cells[1, offset + 1].Formula = "=sum(d:d)/1000000"; ws.Cells[1, offset + 2].Formula = "=SUMIFS(D:D,E:E,\">0\")/1000000"; ws.Cells[2, offset].Value = "Summe Stromverbrauch in den Exports"; ws.Cells[2, offset + 1].Formula = "=sum(e:e)/1000000"; ws.Cells[2, offset + 2].Formula = "=SUMIFS(E:E,E:E,\">0\")/1000000"; ws.Cells[3, offset].Value = "Original Nacht Nutzung"; ws.Cells[3, offset + 1].Formula = "=sum(g:g)/1000000"; ws.Cells[4, offset].Value = "Original Tag Nutzung"; ws.Cells[4, offset + 1].Formula = "=sum(h:h)/1000000"; ws.Cells[5, offset].Value = "Profil Nacht Nutzung"; ws.Cells[5, offset + 1].Formula = "=sum(I:I)/1000000"; ws.Cells[6, offset].Value = "Profil Tag Nutzung"; ws.Cells[6, offset + 1].Formula = "=sum(J:J)/1000000"; ExcelChart chart = ws.Drawings.AddChart("Comparison", eChartType.ColumnClustered); //chart.Title.Text = "Category Chart"; chart.SetPosition(5, 0, offset, 0); chart.SetSize(800, 450); chart.Series.Add(ws.Cells["N1:N2"], ws.Cells["L1:L2"]); p.SaveAs(new FileInfo(Path.Combine(dbProfileExport.GetResultFullPath(SequenceNumber, Name), "ComparisonExportvsDB.xlsx"))); p.Dispose(); }
private List <HausAnschlussExportEntry> MergeAllEntriesForTrafokreis([NotNull][ItemNotNull] List <House> houses, [NotNull] MyDb dbProfileGeneration, [NotNull] string trafokreis, [NotNull][ItemNotNull] List <Household> households, [ItemNotNull][NotNull] List <BusinessEntry> businesses) { var hausAnschlusses = houses.SelectMany(x => x.Hausanschluss).ToList(); var hakeys = hausAnschlusses.Where(x => x.Trafokreis == trafokreis).Select(x => x.ObjectID).Distinct().ToList(); var hees = new List <HausAnschlussExportEntry>(); //List<double> zeroes = new List<double>(new double[8760 * 4]); //für jeden anschluss die prosumer sammeln foreach (var haKey in hakeys) { var hausanschlüsse = hausAnschlusses.Where(x => x.ObjectID == haKey).ToList(); var hee = new HausAnschlussExportEntry(hausanschlüsse[0].HausanschlussGuid, "", trafokreis, hausanschlüsse[0].Isn, "", haKey); string hausname = ""; foreach (var anschluss in hausanschlüsse) { var house = houses.Single(x => x.HouseGuid == anschluss.HouseGuid); hausname += house.ComplexName; var assignedProfiles = Prosumer.LoadProsumers(dbProfileGeneration, TableType.HousePart, anschluss.HouseGuid); //households var selectedHH = households.Where(x => x.HausAnschlussGuid == anschluss.HausanschlussGuid).ToList(); foreach (Household household in selectedHH) { Prosumer hhp = assignedProfiles.Single(x => x.SourceGuid == household.HouseholdGuid); //remove all profiles that are processed assignedProfiles.Remove(hhp); double usedEnergy = hhp.Profile?.EnergySum() ?? throw new Exception("Profile was null"); hee.LoadProsumers.Add(hhp); hee.TotalEnergyLoad += usedEnergy; } //businesses var selectedBusinesses = businesses.Where(x => x.HausAnschlussGuid == anschluss.HausanschlussGuid); foreach (var business in selectedBusinesses) { Prosumer hhp = assignedProfiles.Single(x => x.SourceGuid == business.BusinessGuid); //remove all profiles that are processed assignedProfiles.Remove(hhp); double usedEnergy = hhp.Profile?.EnergySum() ?? throw new Exception("Profile was null"); hee.LoadProsumers.Add(hhp); hee.TotalEnergyLoad += usedEnergy; } var pvprofiles = assignedProfiles.Where(x => x.ProsumerType == ProsumerType.PV).ToList(); foreach (Prosumer pvprofile in pvprofiles) { //remove all profiles that are processed assignedProfiles.Remove(pvprofile); double generaetedEnergy = pvprofile.Profile?.EnergySum() ?? throw new Exception("Profile was null"); hee.GenerationProsumers.Add(pvprofile); hee.TotalEnergyGeneration += generaetedEnergy; } if (_validateAllAssigned && assignedProfiles.Count > 0) { var profiletypes = assignedProfiles.Select(x => x.ProsumerType).Distinct().ToList(); var profiletypesstr = JsonConvert.SerializeObject(profiletypes); throw new FlaException("Leftover profiles that were not processed: " + assignedProfiles.Count + ": " + profiletypesstr); } if (hee.TotalEnergyGeneration > 0 && hee.GenerationProsumers.Count == 0) { throw new FlaException("No generation set, but generating energy"); } } hee.HouseName = hausname; hees.Add(hee); } return(hees); }