/// <summary>
        /// Constructor
        /// </summary>
        public CalculationEngineForecast()
        {
            wfProxy  = new WeatherForecastProxy();
            chfProxy = new CalculateHourlyForecast();
            model    = CalculationEngineModel.Instance;
            powCalc  = new PowerCalculator();
            Thread newThread = new Thread(CalculatePerHour);

            newThread.Start();
        }
        /// <summary>
        /// Calculate forecast for all ders in model
        /// </summary>
        public void CalculateForecastForDers()
        {
            model.ForecastListOfDers.Clear();
            LogHelper.Log(LogTarget.File, LogService.CalculationEngineForecast, " INFO - CalculationEngineForecast.cs - Calculate forecast for all ders in model.");

            List <Task <ForecastObject> > tasks = new List <Task <ForecastObject> >();

            foreach (SynchronousMachine der in model.DersOriginal)
            {
                Task <ForecastObject> task = new Task <ForecastObject>(() =>
                {
                    WeatherInfo wi             = wfProxy.Proxy.Get7DayPerHourForecastByGid(der.GlobalId);
                    List <Data> hourlyData     = wi.Hourly.Data;
                    long sunriseTime           = wi.Daily.Data.FirstOrDefault().SunriseTime;
                    long sunsetTime            = wi.Daily.Data.FirstOrDefault().SunsetTime;
                    ForecastObject forecastObj = null;

                    AnalogValue modelDataActive = CalculationEngineModel.Instance.AnalogPointsOriginal.Where(o => o.SynchronousMachine.Equals(der.GlobalId) &&
                                                                                                             o.PowerType.Equals(PowerType.Active)).FirstOrDefault();
                    AnalogValue modelDataReactive = CalculationEngineModel.Instance.AnalogPointsOriginal.Where(o => o.SynchronousMachine.Equals(der.GlobalId) &&
                                                                                                               o.PowerType.Equals(PowerType.Reactive)).FirstOrDefault();

                    chfProxy    = new CalculateHourlyForecast();
                    forecastObj = chfProxy.CalculateHourlyForecastForDer(hourlyData, der, sunriseTime, sunsetTime, modelDataActive, modelDataReactive);


                    return(forecastObj);
                });

                tasks.Add(task);
            }

            foreach (Task <ForecastObject> task in tasks)
            {
                task.Start();
            }

            foreach (Task <ForecastObject> task in tasks)
            {
                task.Wait();

                ForecastObject forecastObj = task.Result;

                if (forecastObj != null)
                {
                    model.ForecastListOfDers.Add(forecastObj);
                }
            }
        }