Exemple #1
0
        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");
        }
Exemple #2
0
        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();
        }
Exemple #3
0
        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);
        }