Example #1
0
        private static bool loadedAll = false;                                                                                              //~

        /// <summary>
        /// if not already loaded, this will download a process from DB and generate a PredictiveProcessData
        /// </summary>
        /// <param name="processId">id</param>
        /// <returns></returns>
        public static PredictiveProcessData GetProcessData(int processId)
        {
            if (processId == 0)
            {
                return(null);
            }
            PredictiveProcessData zw = DataContainers.Where(x => x.ProcessDataId == processId.ToString()).FirstOrDefault();

            if (zw == null)
            {
                zw = WSConnection.GetProcessFromWS(new int[] { processId }).FirstOrDefault();
                DataContainers.Add(zw);
            }
            return(zw);
        }
Example #2
0
        public static void SaveEnergyProcessDataToXml(string filename, DateTime utcFrom, DateTime utcTo)
        {
            using (EPVIDbContext db = new EPVIDbContext())
            {
                //Prozessdaten
                List <ProcessData> processDatas = db.ProcessDatas
                                                  .Where(cur => cur.ProcessDataSpecId == 1 && cur.UtcTo >= utcFrom && cur.UtcTo < utcTo)
                                                  .Include(cur => cur.Params)
                                                  .ToList();

                //Energiedaten: Minutenwerte
                List <Tuple <DateTime, decimal> > energyData = new List <Tuple <DateTime, decimal> >();
                int countMinutes = (int)utcTo.Subtract(utcFrom).TotalMinutes;
                using (IDbCommand cmd = db.Database.Connection.CreateCommand())
                {
                    cmd.CommandText = String.Format(
                        "SELECT '{0}' + INTERVAL idx MINUTE AS UtcDt, EnergyMgr_GetEnergyConsumptionGaugeValue({1}, '{0}' + INTERVAL idx MINUTE) AS Val " +
                        "FROM QueryLoop " +
                        "WHERE Idx <= {2}",
                        utcFrom.ToString("dddd-MM-yy HH:mm"),
                        31);

                    using (IDataReader reader = cmd.ExecuteReader())
                        energyData.Add(new Tuple <DateTime, decimal>(reader.GetDateTime(0), reader.GetDecimal(1)));
                }

                //Als XML
                XElement eltData = new XElement("Data");
                foreach (ProcessData processData in processDatas)
                {
                    //Processdatensatz
                    XElement eltProcessData = new XElement("ProcessData",
                                                           new XAttribute("Id", processData.ProcessDataSpecId),
                                                           new XAttribute("Name", processData.Name),
                                                           new XAttribute("UtcFrom", processData.UtcFrom),
                                                           new XAttribute("UtcTo", processData.UtcTo));
                    eltData.Add(eltProcessData);

                    //Parameter
                    XElement eltParams = new XElement("Params");
                    eltProcessData.Add(eltParams);
                    foreach (ProcessDataParam processDataParam in processData.Params)
                    {
                        Tuple <object, string> er = PredictiveProcessData.getValueAndType(processDataParam);

                        eltParams.Add(new XElement("Param",
                                                   new XAttribute("Name", processDataParam.Name),
                                                   new XAttribute("Value", er.Item1),
                                                   new XAttribute("DataType", er.Item2)));
                    }

                    //Energiedaten
                    XElement eltEnergy = new XElement("EnergyData");
                    eltProcessData.Add(eltEnergy);
                    Tuple <DateTime, decimal> energyLast = null;
                    foreach (Tuple <DateTime, decimal> energy in energyData.Where(cur => cur.Item1 >= processData.UtcFrom && cur.Item1 < processData.UtcTo))
                    {
                        if (energyLast != null)
                        {
                            decimal val = energy.Item2 - energyLast.Item2;

                            eltParams.Add(new XElement("Val",
                                                       new XAttribute("UtcFrom", energy.Item1),
                                                       new XAttribute("UtcTo", energy.Item1.AddMinutes(1)),
                                                       new XAttribute("Value", val)));
                        }

                        energyLast = energy;
                    }
                }

                eltData.Save(filename);
            }
        }
Example #3
0
        public ActionResult LoadProcessDataParams(int processid)
        {
            PredictiveProcessData data = GetProcessData(processid);

            return(Json(data.Params, JsonRequestBehavior.AllowGet));
        }
Example #4
0
        public ActionResult LoadMultiChartData(ICollection <LoadChartDataParams> chartDataParams)
        {
            ConcurrentBag <LoadChartDataResult> results = new ConcurrentBag <LoadChartDataResult>();

#if DEBUG
            var options = new ParallelOptions {
                MaxDegreeOfParallelism = 1
            };
#else
            var options = new ParallelOptions {
                MaxDegreeOfParallelism = -1
            };
#endif
            Parallel.ForEach(chartDataParams, options, p =>
            {
                try
                {
                    PredictiveProcessData cont = GetProcessData(p.ChartFunctionId);
                    if (p.ChartFunctionId > 0 && cont == null)
                    {
                        throw new Exception("no such graph identified");
                    }
                    List <ChartDataDto> chartData = null;

                    //draw differnt graphs, since LoadChartDataParams is missing in propertie like 'Tag' its hard to bind additional information....
                    //detect Avg Function
                    if (p.ChartFunctionId == -2)
                    {
                        chartData = DataContainers.ProminentEdges;
                    }
                    else if (p.ChartFunctionId == -1)
                    {
                        chartData = DataContainers.NormalizedData;
                    }
                    else if (p.ChartFunctionId == -3)
                    {
                        chartData = DataContainers.LowerBound;
                    }
                    else if (p.ChartFunctionId == -4)
                    {
                        chartData = DataContainers.UpperBound;
                    }

                    if (cont != null)
                    {
                        if (cont.ViewOptions.Remove(SwhkViewOptions.Original))
                        {
                            chartData = cont.ChartData;
                        }
                        else if (cont.ViewOptions.Remove(SwhkViewOptions.Envelope))
                        {
                            chartData = cont.Envelope;
                        }
                        else if (cont.ViewOptions.Remove(SwhkViewOptions.Normalized))
                        {
                            chartData = cont.NormalizedData;
                        }
                        else if (cont.ViewOptions.Remove(SwhkViewOptions.LowerBound))
                        {
                            chartData = cont.LowerBound;
                        }
                        else if (cont.ViewOptions.Remove(SwhkViewOptions.UpperBound))
                        {
                            chartData = cont.UpperBound;
                        }
                    }

                    if (chartData != null)
                    {
                        results.Add(new LoadChartDataResult
                        {
                            CorrelationId   = p.CorrelationId,
                            Data            = chartData,
                            InteractionData = new List <ChartInteractionDataDto>()
                        });
                    }
                }
                catch (Exception e)
                {
                    e.Message.ToString();
                }
            });
            return(Json(results.ToArray(), JsonRequestBehavior.AllowGet));
        }
Example #5
0
        /// <summary>
        /// Index function differentiates between showing results for just on process |processids| == 1,
        /// and showing multiple processes at a time (always without regard to the actual occurrence time of the process)
        /// </summary>
        /// <param name="processids">list of processes to show</param>
        /// <param name="precision">level of precision (compared to normalized View - [0,1]!)</param>
        /// <param name="links">number of links('Glieder') we want our Envelope to have</param>
        /// <param name="options">view options (which graphs should we draw?)</param>
        /// <param name="par">dont know, never used this</param>
        /// <returns></returns>
        public ActionResult Index(int[] processids, decimal precision = 1m, int links = 5, string options = null, ChartParams par = null)
        {
            DataContainers.Clear();
            DataContainers.EnvelopeLinks     = links;
            DataContainers.EnvelopePrecision = precision;

            // Parameter
            if (par == null)
            {
                par = new ChartParams(new List <ChartBlockParams>()
                {
                });
            }

            //view options
            var viewOptions = new List <SwhkViewOptions>();

            if (options != null)
            {
                string[] zw = options.Split('@');
                for (int i = 0; i < zw.Length; i++)
                {
                    viewOptions.Add((SwhkViewOptions)Enum.Parse(typeof(SwhkViewOptions), zw[i]));
                }
            }
            if (viewOptions.Count == 0)
            {
                viewOptions.Add(SwhkViewOptions.Original);
            }

            if (processids == null && TempData["processids"] != null)
            {
                processids = (int[])TempData["processids"];
            }

#if DEBUG
            if (processids.Length > 5)
            {
                processids = processids.Take(5).ToArray();
            }
#endif

            //Chart-Config
            ChartConfig chartConfig = new ChartConfig()
            {
                Name = "Test"
            };

            ChartArea area = new ChartArea()
            {
                Name      = "Sollwerthüllkurve",
                ChartType = (int)ChartType.Polyline,
                Seq       = 1
            };
            chartConfig.Areas.Add(area);

            ChartBlockParams cbpar = new ChartBlockParams();
            cbpar.Start = DateTime.Now - new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);
            TimeSpan maxTime = new TimeSpan(0L);

            Random rand = new Random();

            foreach (int processid in processids)
            {
                PredictiveProcessData process = GetProcessData(processid);
                process.ViewOptions.AddRange(viewOptions);

                if (process == null)
                {
                    throw new ArgumentException("process-id not found!");
                }

                if ((viewOptions.Contains(SwhkViewOptions.Original)))
                {
                    area.Functions.Add(new PredictiveChartFunction()
                    {
                        ChartFunctionId       = processid,
                        PrecictiveProcessData = process,
                        Name = process.Name,
                        Seq  = 1,
                        ChartDataSourceId = 1,
                        FillColor         = "#" + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2")
                    });
                }

                //if just one process id -> show some specifig graphs
                if (processids.Length == 1)
                {
                    //'Sollhüllwertkurve'
                    if (viewOptions.Contains(SwhkViewOptions.Envelope))
                    {
                        area.Functions.Add(new PredictiveChartFunction()
                        {
                            ChartFunctionId       = processid,
                            PrecictiveProcessData = process,
                            Name      = process.Name + "-envelope",
                            Seq       = 2,
                            FillColor = "#" + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2")
                        });
                    }
                    //nomalized graph
                    if (viewOptions.Contains(SwhkViewOptions.Normalized))
                    {
                        area.Functions.Add(new PredictiveChartFunction()
                        {
                            ChartFunctionId       = processid,
                            PrecictiveProcessData = process,
                            Name      = process.Name + "-normalized",
                            Seq       = 3,
                            FillColor = "#" + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2")
                        });
                    }
                    //lower bound
                    if (viewOptions.Contains(SwhkViewOptions.LowerBound))
                    {
                        area.Functions.Add(new PredictiveChartFunction()
                        {
                            ChartFunctionId       = processid,
                            PrecictiveProcessData = process,
                            Name      = process.Name + "-lower",
                            Seq       = 4,
                            FillColor = "#" + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2")
                        });
                    }
                    //upper bound
                    if (viewOptions.Contains(SwhkViewOptions.UpperBound))
                    {
                        area.Functions.Add(new PredictiveChartFunction()
                        {
                            ChartFunctionId       = processid,
                            PrecictiveProcessData = process,
                            Name      = process.Name + "-upper",
                            Seq       = 5,
                            FillColor = "#" + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2")
                        });
                    }
                }

                if (maxTime < process.UtcTo - process.UtcFrom)
                {
                    maxTime = (TimeSpan)(process.UtcTo - process.UtcFrom);
                }
            }

            //if mor than one id -> add avg graph and stuff
            if (processids.Length > 1)
            {
                if (viewOptions.Contains(SwhkViewOptions.AverageGraph))
                {
                    area.Functions.Add(new PredictiveChartFunction()
                    {
                        ChartFunctionId       = -1,
                        PrecictiveProcessData = DataContainers,
                        Name = "Average Graph Normalized",
                        Seq  = 6,
                        ChartDataSourceId = 1,
                        FillColor         = "#" + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2")
                    });
                }
                //Sollhüllwert based on AVG Graph
                if (viewOptions.Contains(SwhkViewOptions.AvgEnvelope))
                {
                    area.Functions.Add(new PredictiveChartFunction()
                    {
                        ChartFunctionId       = -2,
                        PrecictiveProcessData = DataContainers,
                        Name = "Average Swhk",
                        Seq  = 7,
                        ChartDataSourceId = 1,
                        FillColor         = "#" + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2")
                    });
                }
                //lower bound of avg
                if (viewOptions.Contains(SwhkViewOptions.LowerAverage))
                {
                    area.Functions.Add(new PredictiveChartFunction()
                    {
                        ChartFunctionId       = -3,
                        PrecictiveProcessData = DataContainers,
                        Name = "Average Graph Lower",
                        Seq  = 8,
                        ChartDataSourceId = 1,
                        FillColor         = "#" + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2")
                    });
                }
                //upper bound of avg
                if (viewOptions.Contains(SwhkViewOptions.UpperAverage))
                {
                    area.Functions.Add(new PredictiveChartFunction()
                    {
                        ChartFunctionId       = -4,
                        PrecictiveProcessData = DataContainers,
                        Name = "Average Graph Upper",
                        Seq  = 9,
                        ChartDataSourceId = 1,
                        FillColor         = "#" + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2") + ((byte)rand.Next(256)).ToString("X2")
                    });
                }
            }

            cbpar.Stop = cbpar.Start + maxTime;
            par.Blocks.Add(cbpar);

            //ViewModel
            var viewModel = new ChartViewModel();
            viewModel.Load(chartConfig);
            viewModel.Timelines.AddRange(par.Blocks.Select(b => b.ToTimelineViewModel()));
            viewModel.PredictiveFunctions.AddRange(DataContainers);

            if (viewModel.Timelines.Count != 0)
            {
                SaveDisplayInterval(viewModel.Timelines[0].Start, viewModel.Timelines[0].Stop);
            }

            return(View(viewModel));
        }