Exemple #1
0
        public void Create()
        {
            _currentContext = new SQLAzureDataContext();

            foreach (var thisRecord in _currentRequestManager.Records)
            {
                var   elementId = thisRecord.FirstOrDefault(kvp => kvp.Key == "elementId").Value;
                var   from      = DateTimeOffset.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "from").Value);
                var   to        = DateTimeOffset.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "to").Value);
                float?volume    = null;
                if (thisRecord.Count(kvp => kvp.Key == "volume_value") != 0)
                {
                    volume = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "volume_value").Value);
                }

                float?level = null;
                if (thisRecord.Count(kvp => kvp.Key == "level_value") != 0)
                {
                    level = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "level_value").Value);
                }

                var reservoirData = new ReservoirData
                {
                    Reservoir = _currentContext.Reservoirs.FirstOrDefault(x => x.Identifier == elementId),
                    From      = from,
                    To        = to,
                    Volume    = volume,
                    Level     = level
                };

                _currentContext.ReservoirDatas.InsertOnSubmit(reservoirData);
            }

            _currentContext.SubmitChanges();
        }
Exemple #2
0
        public string Read()
        {
            _currentContext = new SQLAzureDataContext();

            var elementId = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;
            var dmas      = _currentContext.DMAs.Where(x => x.Identifier == elementId);
            var resultTxt = string.Empty;

            foreach (var thisReading in dmas)
            {
                resultTxt += "<dma>" + $"<weatherStationId>{thisReading.WeatherStation.Name}</weatherStationId>" +
                             $"<burstThreshold>{thisReading.BurstThreshold}</burstThreshold>" +
                             $"</dma>{Environment.NewLine}";
            }

            var dmaName = string.Empty;

            if (resultTxt != string.Empty)
            {
                var firstOrDefault = _currentContext.DMAs.FirstOrDefault(x => x.Identifier == elementId);
                if (firstOrDefault != null)
                {
                    dmaName = firstOrDefault.Name;
                }
            }
            var response = "<response>" + "<dmaSet>" + $"<elementId>{elementId}</elementId>" +
                           $"<name>{dmaName}</name>{resultTxt}</dmaSet>" + "</response>";

            return(response);
        }
        public string Readdicmsite()
        {
            _currentContext = new SQLAzureDataContext();

            var elementId = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;
            var start     = Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "start").Value);
            var end       = Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "end").Value);

            var allResults = _currentContext.GetDICMSite(start, end, elementId).ToList();

            var resultTxt = Empty;

            foreach (var thisReading in allResults)
            {
                var volumeValue = thisReading.Volume != null ?
                                  "<variable name=\"volume\">" + $"<value>{thisReading.Volume}</value>" + "</variable>"
                    : null;

                var durationValue = thisReading.Duration != null ?
                                    "<variable name=\"duration\">" + $"<value>{thisReading.Duration}</value>" + "</variable>"
                    : null;

                if (!(IsNullOrEmpty(volumeValue) &&
                      IsNullOrEmpty(durationValue)))
                {
                    resultTxt += $"<record>{volumeValue}{durationValue}</record>{Environment.NewLine}";
                }
            }

            var response = "<response><recordSet>" + $"<elementId>{elementId}</elementId>" +
                           $"<from>{start}</from>" + $"<to>{end}</to>{resultTxt}</recordSet>" + "</response>";

            return(response);
        }
        public void Create()
        {
            _currentContext = new SQLAzureDataContext();

            foreach (var thisRecord in _currentRequestManager.Records)
            {
                var   elementId = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;
                var   from      = DateTimeOffset.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "from").Value);
                var   to        = DateTimeOffset.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "to").Value);
                float?volume    = null;
                if (thisRecord.Count(kvp => kvp.Key == "volume_value") != 0)
                {
                    volume = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "volume_value").Value);
                }

                float?level = null;
                if (thisRecord.Count(kvp => kvp.Key == "outflow_value") != 0)
                {
                    level = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "outflow_value").Value);
                }

                float?inflow = null;
                if (thisRecord.Count(kvp => kvp.Key == "inflow_value") != 0)
                {
                    inflow = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "inflow_value").Value);
                }

                _currentContext.InsertTankData(elementId, from, to, volume, level, inflow);
            }

            _currentContext.SubmitChanges();
        }
        public void Create()
        {
            _currentContext = new SQLAzureDataContext();

            var elementId    = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;
            var baseTime     = DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "baseTime").Value);
            var creationTime = DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "creationTime").Value);
            var generatedBy  = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "generatedBy").Value;
            var comment      = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "comment").Value;

            foreach (var thisRecord in _currentRequestManager.Records)
            {
                var from = DateTimeOffset.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "from").Value);
                var to   = DateTimeOffset.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "to").Value);

                float?precipitation = null;
                if (thisRecord.Count(kvp => kvp.Key == "precipitation_value") != 0)
                {
                    precipitation = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "precipitation_value").Value);
                }

                float?temperature = null;
                if (thisRecord.Count(kvp => kvp.Key == "temperature_value") != 0)
                {
                    temperature = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "temperature_value").Value);
                }

                int?humidity = null;
                if (thisRecord.Count(kvp => kvp.Key == "humidity_value") != 0)
                {
                    humidity = int.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "humidity_value").Value);
                }

                int?pressure = null;
                if (thisRecord.Count(kvp => kvp.Key == "pressure_value") != 0)
                {
                    pressure = int.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "pressure_value").Value);
                }

                float?windVelocity = null;
                if (thisRecord.Count(kvp => kvp.Key == "wind_velocity_value") != 0)
                {
                    windVelocity = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "wind_velocity_value").Value);
                }

                var windDirection = thisRecord.Count(kvp => kvp.Key == "wind_direction_value") != 0 ?
                                    thisRecord.FirstOrDefault(kvp => kvp.Key == "wind_direction_value").Value : null;

                float?solarRadiation = null;
                if (thisRecord.Count(kvp => kvp.Key == "solar_radiation_value") != 0)
                {
                    solarRadiation = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "solar_radiation_value").Value);
                }

                _currentContext.InsertWeatherForecastData(elementId, from, to, precipitation, temperature, humidity, pressure,
                                                          windVelocity, windDirection, solarRadiation, baseTime, creationTime, comment, generatedBy);
            }

            _currentContext.SubmitChanges();
        }
        public void ProcessQueue(CloudBlockBlob blob,
                                 CloudQueueMessage receivedMessage,
                                 CloudQueue urbanWaterQueue)
        {
            EventSourceWriter.Log.MessageMethod("Worker Role Prcessing weather file " + receivedMessage.Id + " " + blob.Name);

            var currentContext = new SQLAzureDataContext();

            using (var sr = new StringReader(blob.DownloadText()))
            {
                using (var csv = new CsvReader(sr))
                {
                    while (csv.Read())
                    {
                        try
                        {
                            var newWeatherReading = new WeatherData
                            {
                                From            = DateTime.Parse(csv.CurrentRecord[0]),
                                To              = DateTime.Parse(csv.CurrentRecord[1]),
                                Humidity        = Parse(csv.CurrentRecord[2]),
                                Precipitation   = Parse(csv.CurrentRecord[3]),
                                Temperature     = double.Parse(csv.CurrentRecord[4]),
                                Pressure        = Parse(csv.CurrentRecord[5]),
                                Solar_radiation = Parse(csv.CurrentRecord[6]),
                                Wind_direction  = csv.CurrentRecord[7],
                                Wind_velocity   = double.Parse(csv.CurrentRecord[8]),
                                WeatherStation  =
                                    currentContext.WeatherStations.FirstOrDefault(x => x.Name == csv.CurrentRecord[5])
                            };

                            currentContext.WeatherDatas.InsertOnSubmit(newWeatherReading);
                        }
                        catch (Exception e)
                        {
                            EventSourceWriter.Log.MessageMethod("Exception processing weather reading: " + e.Message);
                        }
                    }

                    currentContext.SubmitChanges();
                }
            }

            EventSourceWriter.Log.MessageMethod("Processing Complete Entry added to storage " + receivedMessage.Id);

            urbanWaterQueue.DeleteMessage(receivedMessage);

            var newEvent = new Event
            {
                BusDispatched = false,
                EventDateTime = DateTime.Now,
                EventType     = (int)EventTypes.NewMeteringData
            };

            currentContext.Events.InsertOnSubmit(newEvent);
            currentContext.SubmitChanges();
        }
Exemple #7
0
        public void Create()
        {
            _currentContext = new SQLAzureDataContext();

            foreach (var thisRecord in _currentRequestManager.Records)
            {
                var elementId = thisRecord.FirstOrDefault(kvp => kvp.Key == "elementId").Value;
                var from      = DateTimeOffset.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "from").Value);
                var to        = DateTimeOffset.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "to").Value);

                double?precipitation = null;
                if (thisRecord.Count(kvp => kvp.Key == "precipitation_value") != 0)
                {
                    precipitation = double.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "precipitation_value").Value);
                }

                double?temperature = null;
                if (thisRecord.Count(kvp => kvp.Key == "temperature_value") != 0)
                {
                    temperature = double.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "temperature_value").Value);
                }

                int?humidity = null;
                if (thisRecord.Count(kvp => kvp.Key == "humidity_value") != 0)
                {
                    humidity = int.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "humidity_value").Value);
                }

                int?pressure = null;
                if (thisRecord.Count(kvp => kvp.Key == "pressure_value") != 0)
                {
                    pressure = int.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "pressure_value").Value);
                }

                double?windVelocity = null;
                if (thisRecord.Count(kvp => kvp.Key == "wind_velocity_value") != 0)
                {
                    windVelocity = double.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "wind_velocity_value").Value);
                }

                var windDirection = thisRecord.Count(kvp => kvp.Key == "wind_direction_value") != 0 ?
                                    thisRecord.FirstOrDefault(kvp => kvp.Key == "wind_direction_value").Value : null;

                double?solarRadiation = null;
                if (thisRecord.Count(kvp => kvp.Key == "solar_radiation_value") != 0)
                {
                    solarRadiation = double.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "solar_radiation_value").Value);
                }

                _currentContext.InsertWeatherData(elementId, from, to, precipitation, temperature, humidity, pressure,
                                                  windVelocity, windDirection, solarRadiation);
            }

            _currentContext.SubmitChanges();
        }
Exemple #8
0
        public string ReadList()
        {
            _currentContext = new SQLAzureDataContext();

            var elementId = _currentRequestManager.RootElements.First(kvp => kvp.Key == "elementId").Value;
            var meters    = _currentContext.GetmeterList(elementId);
            var resultTxt = meters.Aggregate(string.Empty, (current, thisReading) => current + ("<record>" + "<variable name=\"meterId\">" + $"<value>{thisReading.MeterIdentity}</value>" + "</variable>" + $"</record>{Environment.NewLine}"));

            var response = "<response>" + "<recordSet>" +
                           $"<elementId>{elementId}</elementId>{resultTxt}</recordSet>" + "</response>";

            return(response);
        }
Exemple #9
0
        public string Read()
        {
            _currentContext = new SQLAzureDataContext();

            var elementId  = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;
            var start      = Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "start").Value);
            var end        = Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "end").Value);
            var allResults = _currentContext.GetAvailabilityPredictionData(start, end, elementId).ToList();

            var resultTxt    = new StringBuilder();
            var baseTime     = string.Empty;
            var creationTime = string.Empty;
            var generatedBy  = string.Empty;
            var comment      = string.Empty;

            foreach (var thisReading in allResults)
            {
                if (baseTime == string.Empty)
                {
                    baseTime     = thisReading.BaseTime.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK");
                    creationTime = thisReading.CreationTime.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK");
                }

                generatedBy = thisReading.Identifier;

                var contributingVolumeValue = thisReading.Contributing_volume != null ?
                                              $"<variable name=\"contributing_volume\">{$"<value>{thisReading.Contributing_volume}</value>"}</variable>"
                    : null;

                resultTxt.Append("<record>" + $"<from>{thisReading.From.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK")}</from>" +
                                 $"<to>{thisReading.To.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK")}</to>{contributingVolumeValue}</record>{Environment.NewLine}");
            }

            string reservoirName = string.Empty;

            if (resultTxt.Length > 0)
            {
                reservoirName = _currentContext.Reservoirs.FirstOrDefault(x => x.Identifier == elementId)?.Name;
            }

            return("<response>" + "<recordSet>" + $"<elementId>{elementId}</elementId>" +
                   $"<name>{reservoirName}</name>" +
                   $"<metadata baseTime=\"{baseTime}\" creationTime=\"{creationTime}\" generatedBy=\"{generatedBy}\" comment=\"{comment}\" />{resultTxt}</recordSet>" +
                   "</response>");
        }
        public void Create()
        {
            _currentContext = new SQLAzureDataContext();

            var elementId    = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;
            var baseTime     = DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "baseTime").Value);
            var creationTime = DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "creationTime").Value);
            var generatedBy  = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "generatedBy").Value;
            var comment      = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "comment").Value;

            foreach (var thisRecord in _currentRequestManager.Records)
            {
                var from = DateTimeOffset.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "from").Value);
                var to   = DateTimeOffset.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "to").Value);

                float?realLossesValue = null;
                if (thisRecord.Count(kvp => kvp.Key == "real_losses_value") != 0)
                {
                    realLossesValue = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "real_losses_value").Value);
                }

                var realLossesType = thisRecord.Count(kvp => kvp.Key == "real_losses_type") != 0 ?
                                     thisRecord.FirstOrDefault(kvp => kvp.Key == "real_losses_type").Value : Empty;

                var application = _currentContext.Applications.FirstOrDefault(x => x.Identifier == generatedBy);

                var dmaLeakageData = new DMALeakageData
                {
                    DMA               = _currentContext.DMAs.FirstOrDefault(x => x.Identifier == elementId),
                    From              = @from,
                    To                = to,
                    CreationTime      = creationTime,
                    Application       = application,
                    Comment           = comment,
                    BaseTime          = baseTime,
                    Real_losses_value = realLossesValue,
                    Real_losses_Type  = realLossesType
                };

                _currentContext.DMALeakageDatas.InsertOnSubmit(dmaLeakageData);
            }

            _currentContext.SubmitChanges();
        }
        public void Create()
        {
            _currentContext = new SQLAzureDataContext();

            var elementId    = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;
            var baseTime     = DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "baseTime").Value);
            var creationTime = DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "creationTime").Value);
            var generatedBy  = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "generatedBy").Value;
            var comment      = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "comment").Value;

            foreach (var thisRecord in _currentRequestManager.Records)
            {
                var   from        = DateTimeOffset.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "start").Value);
                var   to          = DateTimeOffset.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "end").Value);
                var   demand      = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "demand_value").Value);
                float?uncertainty = null;
                if (thisRecord != null && thisRecord.Any(kvp => kvp.Key == "uncertainty_value"))
                {
                    uncertainty = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "uncertainty_value").Value);
                }

                var application = _currentContext.Applications.FirstOrDefault(x => x.Identifier == generatedBy);

                DemandPredictionData demandPredictionData = new DemandPredictionData
                {
                    DMA          = _currentContext.DMAs.FirstOrDefault(x => x.Identifier == elementId),
                    From         = from,
                    To           = to,
                    Demand       = demand,
                    Uncertainty  = uncertainty,
                    BaseTime     = baseTime,
                    CreationTime = creationTime,
                    Application  = application,
                    Comment      = comment
                };

                _currentContext.DemandPredictionDatas.InsertOnSubmit(demandPredictionData);
            }

            _currentContext.SubmitChanges();
        }
Exemple #12
0
        public void Create()
        {
            _currentContext = new SQLAzureDataContext();

            var elementId    = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;
            var baseTime     = Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "baseTime").Value);
            var creationTime = Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "creationTime").Value);
            var generatedBy  = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "generatedBy").Value;
            var comment      = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "comment").Value;

            foreach (var thisRecord in _currentRequestManager.Records)
            {
                var from = Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "from").Value);
                var to   = Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "to").Value);

                float?contributingVolume = null;
                if (thisRecord.Count(kvp => kvp.Key == "contributing_volume_value") > 0)
                {
                    contributingVolume = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "contributing_volume_value").Value);
                }

                var application = _currentContext.Applications.FirstOrDefault(x => x.Identifier == generatedBy);

                var availabilityPredictionData = new AvailabilityPredictionData
                {
                    Reservoir           = _currentContext.Reservoirs.FirstOrDefault(x => x.Identifier == elementId),
                    From                = @from,
                    To                  = to,
                    CreationTime        = creationTime,
                    Application         = application,
                    Comment             = comment,
                    BaseTime            = baseTime,
                    Contributing_volume = contributingVolume
                };

                _currentContext.AvailabilityPredictionDatas.InsertOnSubmit(availabilityPredictionData);
            }

            _currentContext.SubmitChanges();
        }
Exemple #13
0
        public void Create()
        {
            _currentContext = new SQLAzureDataContext();

            var dma = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;

            foreach (var thisRecord in _currentRequestManager.Records)
            {
                var time = DateTimeOffset.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "time").Value);

                float?pressure = null;
                if (thisRecord.Count(kvp => kvp.Key == "pressure_value") != 0)
                {
                    pressure = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "pressure_value").Value);
                }

                float?volume = null;
                if (thisRecord.Count(kvp => kvp.Key == "volume_value") != 0)
                {
                    volume = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "volume_value").Value);
                }

                float?flow = null;
                if (thisRecord.Count(kvp => kvp.Key == "flow_value") != 0)
                {
                    flow = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "flow_value").Value);
                }
                else
                {
                    if (volume != null)
                    {
                        flow = (volume * 1000) / (15 * 60);
                    }
                }

                _currentContext.InsertDMAData(dma, time, flow, volume, pressure);
            }
        }
Exemple #14
0
        public string ReadList()
        {
            _currentContext = new SQLAzureDataContext();

            var elementId = _currentRequestManager.RootElements.First(kvp => kvp.Key == "elementId");
            var dmAs      = _currentContext.DMAs.Where(x => x.Site.Name == elementId.Value);

            var resultTxt = string.Empty;

            foreach (var thisReading in dmAs)
            {
                resultTxt += "<dma>" + $"<elementId>{thisReading.Identifier}</elementId>" +
                             $"<name>{thisReading.Name}</name>" +
                             $"<weatherStationId>{thisReading.WeatherStation.Name}</weatherStationId>" +
                             $"<burstThreshold>{thisReading.BurstThreshold}</burstThreshold>" +
                             $"</dma>{Environment.NewLine}";
            }

            var response = "<response>" + "<recordSet>" +
                           $"<elementId>{elementId.Value}</elementId>{resultTxt}</recordSet>" + "</response>";

            return(response);
        }
Exemple #15
0
        public string Create()
        {
            _currentContext = new SQLAzureDataContext();

            var elementId    = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;
            var baseTime     = DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "baseTime").Value);
            var creationTime = DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "creationTime").Value);
            var generatedBy  = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "generatedBy").Value;
            var comment      = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "comment").Value;

            foreach (var thisRecord in _currentRequestManager.Records)
            {
                var fromDateTime = DateTimeOffset.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "start").Value);
                var toDateTime   = DateTimeOffset.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "end").Value);
                var price        = decimal.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "price_value").Value);

                var application = _currentContext.Applications.FirstOrDefault(x => x.Identifier == generatedBy);

                var pricingData = new PricingData
                {
                    DMA          = _currentContext.DMAs.FirstOrDefault(x => x.Identifier == elementId),
                    From         = fromDateTime,
                    To           = toDateTime,
                    CreationTime = creationTime,
                    Application  = application,
                    Comment      = comment,
                    BaseTime     = baseTime,
                    Price        = price
                };

                _currentContext.PricingDatas.InsertOnSubmit(pricingData);
            }

            _currentContext.SubmitChanges();

            return(elementId);
        }
Exemple #16
0
        public string Read(bool bWrap)
        {
            _currentContext = new SQLAzureDataContext();

            var meterId = _currentRequestManager.RootElements.Count(kvp => kvp.Key == "elementId") != 0 ?
                          _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value : string.Empty;
            var start = _currentRequestManager.RootElements.Any(kvp => kvp.Key == "start") ?
                        DateTime.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "start").Value) : DateTime.MinValue;
            var end = _currentRequestManager.RootElements.Any(kvp => kvp.Key == "end") ?
                      DateTime.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "end").Value) : DateTime.MaxValue;
            long timestep = _currentRequestManager.RootElements.Any(kvp => kvp.Key == "timeStep") ?
                            Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "timeStep").Value) : -1;

            var resultTxt   = new StringBuilder();
            var elementText = "<elementId>" + meterId + "</elementId>";

            var site = _currentContext.Meters.FirstOrDefault(x => x.MeterIdentity == meterId)?.DMA.Site;

            if (!string.IsNullOrEmpty(meterId) && site != null)
            {
                var thisContext = new MeterReadingTableStorageContext(site.TableName);

                if (timestep == -1)
                {
                    var finalFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, meterId);

                    if (start != DateTime.MinValue)
                    {
                        var date1 = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThanOrEqual, start.Ticks.ToString());
                        finalFilter = TableQuery.CombineFilters(finalFilter, TableOperators.And, date1);
                    }

                    if (end != DateTime.MaxValue)
                    {
                        var date2 = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThanOrEqual, end.Ticks.ToString());
                        finalFilter = TableQuery.CombineFilters(finalFilter, TableOperators.And, date2);
                    }

                    var allRecords = thisContext.MeterReadingsFiltered(finalFilter);

                    foreach (var record in allRecords)
                    {
                        resultTxt.Append("<record>" + $"<time>{record.CreatedOn.ToString("yyyy-MM-ddTHH:mm:sszzz")}</time><variable name=\"flow\">" + $"<value>{record.Reading}</value></variable>" + $"</record>{Environment.NewLine}");
                    }
                }
                else
                {
                    const long multiplier    = 10000000;
                    long       timestepTicks = timestep * multiplier;
                    long       numberOfTicksBetweenStartAndEnd = (long)(end.Ticks - start.Ticks);
                    int        numberOfBlock = (int)(numberOfTicksBetweenStartAndEnd / timestepTicks);

                    // Create a collection of fixed blocks in time from supplied Start to End
                    var dateTimeBlockSet = new List <DateTimeBlock>();
                    for (var blockIndex = 0; blockIndex < numberOfBlock; blockIndex++)
                    {
                        var newDateTimeBlock = new DateTimeBlock
                        {
                            From = start.AddTicks(blockIndex * timestepTicks),
                            To   = start.AddTicks((blockIndex + 1) * timestepTicks)
                        };

                        dateTimeBlockSet.Add(newDateTimeBlock);
                    }

                    // loop through each block and and find any records that span that block, trimming those on the edges
                    foreach (var thisBlock in dateTimeBlockSet)
                    {
                        var recordsSpanningBlock = new List <MeterReadingEntity>();

                        var finalFilter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, meterId);

                        if (start != DateTime.MinValue)
                        {
                            var date1 = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThanOrEqual, thisBlock.From.Ticks.ToString());
                            finalFilter = TableQuery.CombineFilters(finalFilter, TableOperators.And, date1);
                        }

                        if (end != DateTime.MaxValue)
                        {
                            var date2 = TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThanOrEqual, thisBlock.To.Ticks.ToString());
                            finalFilter = TableQuery.CombineFilters(finalFilter, TableOperators.And, date2);
                        }

                        recordsSpanningBlock.AddRange(thisContext.MeterReadingsFiltered(finalFilter));

                        if (recordsSpanningBlock.Any())
                        {
                            //    var minResult = recordsSpanningBlock.Min(x => x.Reading);
                            //    var maxResult = recordsSpanningBlock.Max(x => x.Reading);
                            var minResult = float.Parse(recordsSpanningBlock.Min(x => x.Reading));
                            var maxResult = float.Parse(recordsSpanningBlock.Max(x => x.Reading));

                            var averageValue = (minResult + maxResult) / 2;

                            //                        if (!string.IsNullOrEmpty(minResult) && !string.IsNullOrEmpty(maxResult))
                            {
                                //                          var flow = Int32.Parse(maxResult) - Int32.Parse(minResult);
                                resultTxt.Append("<record>" +
                                                 $"<time>{thisBlock.From.ToString("yyyy-MM-ddTHH:mm:sszzz")}</time><variable name=\"flow\">" + $"<value>{averageValue}</value></variable>" + $"</record>{Environment.NewLine}");
                            }
                        }
                    }
                }
            }

            if (bWrap)
            {
                return("<response>" + $"<recordSet>{elementText}{resultTxt}</recordSet>" + "</response>");
            }
            else
            {
                return(resultTxt.ToString());
            }
        }
Exemple #17
0
        public string Read()
        {
            _currentContext = new SQLAzureDataContext();

            var elementId  = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;
            var start      = DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "start").Value);
            var end        = DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "end").Value);
            var simulation = _currentRequestManager.RootElements.Any(kvp => kvp.Key == "simulation") ?
                             DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "simulation").Value) : DateTimeOffset.Now;
            long timestep = _currentRequestManager.RootElements.Count(kvp => kvp.Key == "timeStep") > 0 ?
                            int.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "timeStep").Value) : -1;

            var allResults = _currentContext.GetPricingData(start, end, elementId, simulation).ToList();

            if (timestep != -1 && allResults.Any())
            {
                const long multiplier    = 10000000;
                long       timestepTicks = timestep * multiplier;
                long       numberOfTicksBetweenStartAndEnd = (long)(end.Ticks - start.Ticks);
                int        numberOfBlock = (int)(numberOfTicksBetweenStartAndEnd / timestepTicks);

                // Create a collection of fixed blocks in time from supplied Start to End
                var dateTimeBlockSet = new List <DateTimeBlock>();
                for (var blockIndex = 0; blockIndex < numberOfBlock; blockIndex++)
                {
                    var newDateTimeBlock = new DateTimeBlock
                    {
                        From = start.AddTicks(blockIndex * timestepTicks),
                        To   = start.AddTicks((blockIndex + 1) * timestepTicks)
                    };

                    dateTimeBlockSet.Add(newDateTimeBlock);
                }

                var subResults = new List <GetPricingDataResult>();

                // loop through each block and and find any records that span that block, trimming those on the edges
                foreach (DateTimeBlock thisBlock in dateTimeBlockSet)
                {
                    var firstRecordkInSet = allResults.Where(x => x.From <thisBlock.To && x.To> thisBlock.From).OrderBy(x => x.From).FirstOrDefault();
                    var lastRecordInSet   = allResults.Where(x => x.From <thisBlock.To && x.To> thisBlock.From).OrderBy(x => x.From).LastOrDefault();

                    if (firstRecordkInSet != null && lastRecordInSet != null)
                    {
                        var recordsSpanningBlock = allResults.Where(x => x.From >= firstRecordkInSet.From && x.To <= lastRecordInSet.To);

                        var getPricingDataResults = recordsSpanningBlock as GetPricingDataResult[] ?? recordsSpanningBlock.ToArray();
                        if (getPricingDataResults.Any())
                        {
                            decimal Price = getPricingDataResults.Sum(reading => reading.Price);

                            var modifiedReading = getPricingDataResults.FirstOrDefault();

                            if (modifiedReading != null)
                            {
                                modifiedReading.Price = Price / getPricingDataResults.Count();

                                modifiedReading.From = thisBlock.From;
                                modifiedReading.To   = thisBlock.To;

                                subResults.Add(modifiedReading);
                            }
                        }
                    }
                }

                allResults = subResults;
            }

            var resultTxt    = new StringBuilder();
            var baseTime     = string.Empty;
            var creationTime = string.Empty;
            var generatedBy  = string.Empty;

            foreach (var thisReading in allResults)
            {
                if (baseTime == string.Empty)
                {
                    baseTime     = thisReading.BaseTime.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK");
                    creationTime = thisReading.CreationTime.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK");
                }

                generatedBy = thisReading.Identifier;

                resultTxt.Append("<record>" + $"<from>{thisReading.From.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK")}</from>" +
                                 $"<to>{thisReading.To.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK")}</to>" +
                                 "<variable name=\"price\">" + $"<value>{thisReading.Price}</value>" + "</variable>" +
                                 $"</record>{Environment.NewLine}");
            }

            var dmaName = string.Empty;

            if (resultTxt.Length > 0)
            {
                resultTxt.Insert(0, $"<elementId>{elementId}</elementId>{Environment.NewLine}<name>{dmaName}</name>{Environment.NewLine}" +
                                 $"<metadata baseTime=\"{baseTime}\" creationTime=\"{creationTime}\" generatedBy=\"{generatedBy}\" />{Environment.NewLine}");
            }

            return("<response>" + $"<recordSet>{resultTxt}</recordSet>" + "</response>");
        }
Exemple #18
0
        public void ProcessQueue(CloudBlockBlob blob,
                                 CloudQueueMessage receivedMessage,
                                 CloudQueue urbanWaterQueue)
        {
            EventSourceWriter.Log.MessageMethod(
                $"WaterMeterCSVProcessor_Ovod Message Processing Started. MessageId: {receivedMessage.Id}, BLOB name: {blob.Name}");

            var currentContext = new SQLAzureDataContext();

            var missingMeterIds   = new List <string>();
            var processedMeterIds = new List <string>();

            using (var sr = new StringReader(blob.DownloadText()))
            {
                using (var csv = new CsvReader(sr))
                {
                    csv.Configuration.Delimiter = ",";
                    while (csv.Read())
                    {
                        try
                        {
                            if (csv.CurrentRecord[1] != null &&
                                csv.CurrentRecord[2] != null &&
                                csv.CurrentRecord[3] != null &&
                                csv.CurrentRecord[0] != null)
                            {
                                var creationDateTime = DateTime.ParseExact(csv.CurrentRecord[2], "MM/dd/yyyy hh:mm tt", null).ToUniversalTime();

                                var meterIdentity = csv.CurrentRecord[1];

                                try
                                {
                                    var meterSet = currentContext.Meters.Where(x => x.MeterIdentity == meterIdentity);

                                    if (!meterSet.Any())
                                    {
                                        if (!missingMeterIds.Contains(meterIdentity))
                                        {
                                            missingMeterIds.Add(meterIdentity);
                                        }
                                    }
                                    else
                                    {
                                        if (!processedMeterIds.Contains(meterIdentity))
                                        {
                                            processedMeterIds.Add(meterIdentity);
                                        }
                                    }
                                }
                                catch (Exception e)
                                {
                                    EventSourceWriter.Log.MessageMethod(
                                        $"EXCEPTION: WaterMeterCSVProcessor_Ovod. {e.Message}");
                                }

                                try
                                {
                                    var firstOrDefault = currentContext.Meters.FirstOrDefault(x => x.MeterIdentity == meterIdentity);
                                    if (firstOrDefault != null)
                                    {
                                        var thisDma =
                                            firstOrDefault.DMA;

                                        var sm = new MeterReadingEntity
                                        {
                                            PartitionKey = meterIdentity,
                                            CreatedOn    = creationDateTime,
                                            RowKey       = creationDateTime.Ticks.ToString(),
                                            Reading      = csv.CurrentRecord[3],
                                            Encrypted    = false,
                                            DMA          = thisDma.Identifier
                                        };

                                        const string strWriteConnectionString = "MKWDNConnectionString";
                                        var          blAttempt = WriteMessageMeterDataToDataTable(sm,
                                                                                                  strWriteConnectionString, thisDma.Site.TableName);

                                        if (!blAttempt)
                                        {
                                            EventSourceWriter.Log.MessageMethod(
                                                $"ERROR writing to BLOB storage by WaterMeterCSVProcessor_Ovod. Received message Id: {receivedMessage.Id}BLOB name: {blob.Name}, PartitionKey: {sm.PartitionKey}");
                                        }
                                    }
                                }
                                catch (Exception e)
                                {
                                    EventSourceWriter.Log.MessageMethod(
                                        $"ERROR writing to BLOB storage in WaterMeterCSVProcessor_Ovod. Received message Id: {receivedMessage.Id}BLOB name: {blob.Name}, Exception: {e.Message}");
                                }
                            }
                            else
                            {
                                EventSourceWriter.Log.MessageMethod(
                                    $"ERROR: Null values parsed in CSV file by WaterMeterCSVProcessor_Ovod. Blob name: {blob.Name}");
                            }
                        }
                        catch (Exception e)
                        {
                            EventSourceWriter.Log.MessageMethod(
                                $"Exception processing CSV meter reading in WaterMeterCSVProcessor_Ovod. Exception: {e.Message}");
                        }
                    }
                }
            }

            EventSourceWriter.Log.MessageMethod(
                $"WaterMeterCSVProcessor_Ovod Message Processing Complete. MessageId:  {receivedMessage.Id}");

            urbanWaterQueue.DeleteMessage(receivedMessage);

            var newEvent = new Event
            {
                BusDispatched = false,
                EventDateTime = DateTime.Now,
                EventType     = (int)EventTypes.NewMeteringData
            };

            var processedMetercsv = processedMeterIds.Aggregate(string.Empty, (current, meterId) => current + (meterId + ", "));

            newEvent.Description = processedMetercsv;

            currentContext.Events.InsertOnSubmit(newEvent);

            if (missingMeterIds.Count > 0)
            {
                var newMeterMissingEvent = new Event
                {
                    BusDispatched = false,
                    EventDateTime = DateTime.Now,
                    EventType     = (int)EventTypes.MissingMeter
                };

                var metercsv = missingMeterIds.Aggregate(string.Empty, (current, meterId) => current + (meterId + ", "));

                newMeterMissingEvent.Description = metercsv;

                currentContext.Events.InsertOnSubmit(newMeterMissingEvent);
            }

            currentContext.SubmitChanges();
        }
        public void ProcessQueue(CloudBlockBlob blob,
                                 CloudQueueMessage receivedMessage,
                                 CloudQueue urbanWaterQueue)
        {
            EventSourceWriter.Log.MessageMethod(
                $"WaterMeterExcelProcessor_Ovod Message Processing Started. MessageId: {receivedMessage.Id}, BLOB name: {blob.Name}");

            var currentContext = new SQLAzureDataContext();

            var missingMeterIds   = new List <string>();
            var processedMeterIds = new List <string>();

            var stream = new MemoryStream();

            blob.DownloadToStream(stream);

            using (var spreadsheetDocument = SpreadsheetDocument.Open(stream, false))
            {
                var workbookPart  = spreadsheetDocument.WorkbookPart;
                var worksheetPart = workbookPart.WorksheetParts.First();
                var sheetData     = worksheetPart.Worksheet.Elements <SheetData>().First();

                foreach (var r in sheetData.Elements <Row>())
                {
                    if (r.RowIndex != 1)
                    {
                        var    creationDateTime = DateTime.Now;
                        string meterIdentity    = null;
                        string reading          = null;
                        string customer         = null;

                        var column = 1;
                        foreach (var c in r.Elements <Cell>())
                        {
                            switch (column)
                            {
                            case 1:
                                customer = c.InnerText;
                                break;

                            case 2:
                                meterIdentity = c.InnerText;
                                break;

                            case 3:
                                creationDateTime = DateTime.ParseExact(c.InnerText, "MM/dd/yyyy hh:mm tt", null).ToUniversalTime();
                                break;

                            case 4:
                                reading = c.InnerText;
                                break;

                            default:
                                break;
                            }
                            column = column + 1;
                        }

                        try
                        {
                            if (string.IsNullOrEmpty(meterIdentity))
                            {
                                meterIdentity = currentContext.Customers.FirstOrDefault(x => x.CustomerNumber == customer).Meter.MeterIdentity;
                            }

                            var meterSet = currentContext.Meters.Where(x => x.MeterIdentity == meterIdentity);

                            if (!meterSet.Any())
                            {
                                if (!missingMeterIds.Contains(meterIdentity))
                                {
                                    missingMeterIds.Add(meterIdentity);
                                }
                            }
                            else
                            {
                                if (!processedMeterIds.Contains(meterIdentity))
                                {
                                    processedMeterIds.Add(meterIdentity);
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            EventSourceWriter.Log.MessageMethod($"EXCEPTION: WaterMeterExcelProcessor_Ovod. {e.Message}");
                        }

                        try
                        {
                            var firstOrDefault = currentContext.Meters.FirstOrDefault(x => x.MeterIdentity == meterIdentity);
                            if (firstOrDefault != null)
                            {
                                var thisDma =
                                    firstOrDefault.DMA;

                                var sm = new MeterReadingEntity
                                {
                                    PartitionKey = meterIdentity,
                                    CreatedOn    = creationDateTime,
                                    RowKey       = creationDateTime.Ticks.ToString(),
                                    Reading      = reading,
                                    Encrypted    = false,
                                    DMA          = thisDma.Identifier
                                };

                                const string strWriteConnectionString = "MKWDNConnectionString";
                                var          blAttempt = WriteMessageMeterDataToDataTable(sm, strWriteConnectionString,
                                                                                          thisDma.Site.TableName);

                                if (!blAttempt)
                                {
                                    EventSourceWriter.Log.MessageMethod(
                                        $"ERROR writing to BLOB storage by WaterMeterExcelProcessor_Ovod. Received message Id: {receivedMessage.Id}BLOB name: {blob.Name}, PartitionKey: {sm.PartitionKey}");
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            EventSourceWriter.Log.MessageMethod(
                                $"ERROR writing to BLOB storage in WaterMeterExcelProcessor_Ovod. Received message Id: {receivedMessage.Id}BLOB name: {blob.Name}, Exception: {e.Message}");
                        }
                    }
                }
            }

            EventSourceWriter.Log.MessageMethod("WaterMeterExcelProcessor_Ovod Message Processing Complete. MessageId:  " + receivedMessage.Id);

            urbanWaterQueue.DeleteMessage(receivedMessage);

            var newEvent = new Event
            {
                BusDispatched = false,
                EventDateTime = DateTime.Now,
                EventType     = (int)EventTypes.NewMeteringData
            };

            var processedMetercsv = processedMeterIds.Aggregate(string.Empty, (current, meterId) => current + (meterId + ", "));

            newEvent.Description = processedMetercsv;

            currentContext.Events.InsertOnSubmit(newEvent);

            if (missingMeterIds.Count > 0)
            {
                var newMeterMissingEvent = new Event
                {
                    BusDispatched = false,
                    EventDateTime = DateTime.Now,
                    EventType     = (int)EventTypes.MissingMeter
                };

                var metercsv = missingMeterIds.Aggregate(string.Empty, (current, meterId) => current + (meterId + ", "));

                newMeterMissingEvent.Description = metercsv;

                currentContext.Events.InsertOnSubmit(newMeterMissingEvent);
            }

            currentContext.SubmitChanges();
        }
        public void Create()
        {
            _currentContext = new SQLAzureDataContext();

            var elementId = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;

            foreach (var thisRecord in _currentRequestManager.Records)
            {
                var from = Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "start").Value);
                var to   = Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "end").Value);

                float?Volume = null;
                if (thisRecord.Count(kvp => kvp.Key == "volume_value") != 0)
                {
                    Volume = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "volume_value").Value);
                }

                float?duration = null;
                if (thisRecord.Count(kvp => kvp.Key == "duration_value") != 0)
                {
                    duration = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "duration_value").Value);
                }

                float?maxFlow = null;
                if (thisRecord.Count(kvp => kvp.Key == "max_flow_value") != 0)
                {
                    maxFlow = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "max_flow_value").Value);
                }

                double?mostFreqFlowValue = null;
                if (thisRecord.Count(kvp => kvp.Key == "most_freq_flow_value") != 0)
                {
                    mostFreqFlowValue = double.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "most_freq_flow_value").Value);
                }

                int?mostFreqFlowNumber = null;
                if (thisRecord.Count(kvp => kvp.Key == "most_freq_flow_number") != 0)
                {
                    mostFreqFlowNumber = int.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "most_freq_flow_number").Value);
                }

                string characterizedDeviceValue = thisRecord.Count(kvp => kvp.Key == "characterized_device_value") != 0 ?
                                                  thisRecord.FirstOrDefault(kvp => kvp.Key == "characterized_device_value").Value : null;

                int?characterizedDeviceId = null;
                if (thisRecord.Count(kvp => kvp.Key == "characterized_device_id") != 0)
                {
                    characterizedDeviceId = int.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "characterized_device_id").Value);
                }

                var confirmedDeviceValue = thisRecord.Count(kvp => kvp.Key == "confirmed_device_value") != 0 ?
                                           thisRecord.FirstOrDefault(kvp => kvp.Key == "confirmed_device_value").Value : null;

                int?confirmedDeviceId = null;
                if (thisRecord.Count(kvp => kvp.Key == "confirmed_device_id") != 0)
                {
                    confirmedDeviceId = int.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "confirmed_device_id").Value);
                }

                var confirmationValue = thisRecord.Count(kvp => kvp.Key == "confirmation_value") != 0 ?
                                        thisRecord.FirstOrDefault(kvp => kvp.Key == "confirmation_value").Value : null;

                double?timeSinValue = null;
                if (thisRecord.Count(kvp => kvp.Key == "time_sin_value") != 0)
                {
                    timeSinValue = double.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "time_sin_value").Value);
                }

                double?timeCosValue = null;
                if (thisRecord.Count(kvp => kvp.Key == "time_cos_value") != 0)
                {
                    timeCosValue = double.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "time_cos_value").Value);
                }

                var consumptionCharacterizationData = new ConsumptionCharacterizationData
                {
                    MeterId                    = elementId,
                    From                       = @from,
                    To                         = to,
                    Volume                     = Volume,
                    Duration                   = duration,
                    Max_flow                   = maxFlow,
                    Most_freq_flow_value       = mostFreqFlowValue,
                    Most_freq_flow_Number      = mostFreqFlowNumber,
                    characterized_device_id    = characterizedDeviceId,
                    characterized_device_value = characterizedDeviceValue,
                    confirmation               = confirmationValue,
                    time_cos                   = timeCosValue,
                    time_sin                   = timeSinValue,
                    confirmed_device_id        = confirmedDeviceId,
                    confirmed_device_value     = confirmedDeviceValue
                };
                _currentContext.ConsumptionCharacterizationDatas.InsertOnSubmit(consumptionCharacterizationData);
            }

            _currentContext.SubmitChanges();
        }
        public string Read()
        {
            _currentContext = new SQLAzureDataContext();

            var elementId = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;
            var start     = DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "start").Value);
            var end       = DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "end").Value);

            long timestep = _currentRequestManager.RootElements.Count(kvp => kvp.Key == "timeStep") > 0 ?
                            int.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "timeStep").Value) : -1;

            var allResults = _currentContext.GetWeatherPredictionData(start, end, elementId).ToList();

            if (timestep != -1 && allResults.Any())
            {
                const long multiplier    = 10000000;
                long       timestepTicks = timestep * multiplier;
                long       numberOfTicksBetweenStartAndEnd = (long)(end.Ticks - start.Ticks);
                int        numberOfBlock = (int)(numberOfTicksBetweenStartAndEnd / timestepTicks);

                // Create a collection of fixed blocks in time from supplied Start to End
                var dateTimeBlockSet = new List <DateTimeBlock>();
                for (var blockIndex = 0; blockIndex < numberOfBlock; blockIndex++)
                {
                    var newDateTimeBlock = new DateTimeBlock
                    {
                        From = start.AddTicks(blockIndex * timestepTicks),
                        To   = start.AddTicks((blockIndex + 1) * timestepTicks)
                    };

                    dateTimeBlockSet.Add(newDateTimeBlock);
                }

                var subResults = new List <GetWeatherPredictionDataResult>();

                // loop through each block and and find any records that span that block, trimming those on the edges
                foreach (var thisBlock in dateTimeBlockSet)
                {
                    var firstRecordkInSet = allResults.Where(x => x.From <thisBlock.To && x.To> thisBlock.From).OrderBy(x => x.From).FirstOrDefault();
                    var lastRecordInSet   = allResults.Where(x => x.From <thisBlock.To && x.To> thisBlock.From).OrderBy(x => x.From).LastOrDefault();

                    if (firstRecordkInSet != null && lastRecordInSet != null)
                    {
                        var recordsSpanningBlock = allResults.Where(x => x.From >= firstRecordkInSet.From && x.To <= lastRecordInSet.To);

                        if (recordsSpanningBlock.Any())
                        {
                            var trimmedrecordsSpanningBlock = new List <GetWeatherPredictionDataResult>();
                            foreach (var record in recordsSpanningBlock)
                            {
                                double percentageToTrim = 0;

                                if (record.From < thisBlock.From)
                                {
                                    long currentBlockTicks = record.To.Ticks - record.From.Ticks;
                                    long ticksToTrim       = thisBlock.From.Ticks - record.From.Ticks;

                                    percentageToTrim += (double)(((long)100.0 / currentBlockTicks) * ticksToTrim);
                                }
                                if (record.To > thisBlock.To)
                                {
                                    long currentBlockTicks = record.To.Ticks - record.From.Ticks;
                                    long ticksToTrim       = record.To.Ticks - thisBlock.To.Ticks;

                                    percentageToTrim = (double)(((double)100.0 / (double)currentBlockTicks) * (double)ticksToTrim);
                                }

                                if (record.Precipitation != null)
                                {
                                    record.Precipitation = record.Precipitation - ((record.Precipitation / 100) * percentageToTrim);
                                }
                                trimmedrecordsSpanningBlock.Add(record);
                            }

                            int?   humidity       = null;
                            double?precipitation  = null;
                            int?   pressure       = null;
                            double?solarRadiation = null;
                            double?temperature    = null;
                            string windDirection  = null;
                            double?windVelocity   = null;

                            foreach (var reading in trimmedrecordsSpanningBlock)
                            {
                                if (reading.Humidity != null)
                                {
                                    if (humidity == null)
                                    {
                                        humidity = reading.Humidity;
                                    }
                                    else if (reading.Humidity != -1)
                                    {
                                        humidity += reading.Humidity;
                                    }
                                }
                                if (reading.Precipitation != null)
                                {
                                    if (precipitation == null)
                                    {
                                        precipitation = reading.Precipitation;
                                    }
                                    else if (reading.Precipitation != -1)
                                    {
                                        precipitation += reading.Precipitation;
                                    }
                                }
                                if (reading.Pressure != null)
                                {
                                    if (pressure == null)
                                    {
                                        pressure = reading.Pressure;
                                    }
                                    else if (reading.Pressure != -1)
                                    {
                                        pressure += reading.Pressure;
                                    }
                                }
                                if (reading.Solar_radiation != null)
                                {
                                    if (solarRadiation == null)
                                    {
                                        solarRadiation = reading.Solar_radiation;
                                    }
                                    else if (reading.Solar_radiation != -1)
                                    {
                                        solarRadiation += reading.Solar_radiation;
                                    }
                                }
                                if (reading.Temperature != null)
                                {
                                    if (temperature == null)
                                    {
                                        temperature = reading.Temperature;
                                    }
                                    else if (reading.Temperature != -1)
                                    {
                                        temperature += reading.Temperature;
                                    }
                                }
                                windDirection = reading.Wind_direction;
                                if (reading.Wind_velocity != null)
                                {
                                    if (windVelocity == null)
                                    {
                                        windVelocity = reading.Wind_velocity;
                                    }
                                    else if (reading.Wind_velocity != -1)
                                    {
                                        windVelocity += reading.Wind_velocity;
                                    }
                                }
                            }

                            var modifiedReading = trimmedrecordsSpanningBlock.FirstOrDefault();

                            if (humidity != null)
                            {
                                modifiedReading.Humidity = humidity / trimmedrecordsSpanningBlock.Count();
                            }
                            if (precipitation != null)
                            {
                                modifiedReading.Precipitation = precipitation;
                            }
                            if (pressure != null)
                            {
                                modifiedReading.Pressure = pressure / trimmedrecordsSpanningBlock.Count();
                            }
                            if (solarRadiation != null)
                            {
                                modifiedReading.Solar_radiation = solarRadiation / trimmedrecordsSpanningBlock.Count();
                            }
                            if (temperature != null)
                            {
                                modifiedReading.Temperature = temperature / trimmedrecordsSpanningBlock.Count();
                            }
                            modifiedReading.Wind_direction = windDirection;
                            if (windVelocity != null)
                            {
                                modifiedReading.Wind_velocity = windVelocity / trimmedrecordsSpanningBlock.Count();
                            }

                            modifiedReading.From = thisBlock.From;
                            modifiedReading.To   = thisBlock.To;

                            subResults.Add(modifiedReading);
                        }
                    }
                }

                allResults = subResults;
            }

            var resultTxt = new StringBuilder();

            foreach (var thisReading in allResults)
            {
                var precipitationValue = thisReading.Precipitation != null ?
                                         "<variable name=\"precipitation\">" + $"<value>{thisReading.Precipitation}</value>" + "</variable>"
                    : null;

                var temperatureValue = thisReading.Temperature != null ?
                                       "<variable name=\"temperature\">" + $"<value>{thisReading.Temperature}</value>" + "</variable>"
                    : null;

                var humidityValue = thisReading.Humidity != null ?
                                    "<variable name=\"humidity\">" + $"<value>{thisReading.Humidity}</value>" + "</variable>"
                    : null;

                var pressureValue = thisReading.Pressure != null ?
                                    "<variable name=\"pressure\">" + $"<value>{thisReading.Pressure}</value>" + "</variable>"
                    : null;

                var windDirectionValue = thisReading.Wind_direction != null ?
                                         "<variable name=\"wind_direction\">" + $"<value>{thisReading.Wind_direction}</value>" +
                                         "</variable>"
                    : null;

                var windVelocityValue = thisReading.Wind_velocity != null ?
                                        "<variable name=\"wind_velocity\">" + $"<value>{thisReading.Wind_velocity}</value>" + "</variable>"
                    : null;

                var solarRadiationValue = thisReading.Solar_radiation != null ?
                                          "<variable name=\"solar_radiation\">" + $"<value>{thisReading.Solar_radiation}</value>" +
                                          "</variable>"
                    : null;

                var metadata = "<metadata baseTime=\"" + thisReading.BaseTime.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK") + "\" creationTime=\"" + thisReading.CreationTime.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK") + "\" generatedBy=\"" + thisReading.Identifier + "\" comment=\"" + thisReading.Comment + "\" />";

                resultTxt.Append(
                    $"<record>{metadata}<from>{thisReading?.From.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK")}</from>" +
                    $"<to>{thisReading?.To.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK")}</to>{precipitationValue}{temperatureValue}{humidityValue}{pressureValue}{windDirectionValue}{windVelocityValue}{solarRadiationValue}</record>{Environment.NewLine}");
            }

            return("<response><recordSet>" + $"<elementId>{elementId}</elementId>{resultTxt}</recordSet></response>");
        }
Exemple #22
0
        public void ProcessQueue(CloudBlockBlob blob,
                                 string strContainer,
                                 CloudQueueMessage receivedMessage,
                                 CloudQueue urbanWaterQueue)
        {
            EventSourceWriter.Log.MessageMethod("Worker Role Prcessing HeadEndSystem file " + receivedMessage.Id.ToString() + " " + blob.Name);

            SQLAzureDataContext currentContext = new SQLAzureDataContext();

            using (TextReader sr = new StringReader(blob.DownloadText()))
            {
                using (var csv = new CsvReader(sr))
                {
                    csv.Configuration.Delimiter = ";";
                    while (csv.Read())
                    {
                        try
                        {
                            MeterReadingEntity    sm    = new MeterReadingEntity();
                            DMAMeterReadingEntity dmasm = new DMAMeterReadingEntity();
                            if (csv.CurrentRecord[0] != null &&
                                csv.CurrentRecord[3] != null &&
                                csv.CurrentRecord[4] != null &&
                                csv.CurrentRecord[5] != null &&
                                string.Compare(csv.CurrentRecord[5], "LITER") == 0)
                            {
                                DateTime creationDateTime = DateTime.ParseExact(csv.CurrentRecord[3], "dd/MM/yyyy HH:mm:ss", null).ToUniversalTime();

//                                DMAMeterTableStorageContext dmamcontext = new DMAMeterTableStorageContext(strContainer + "_dmameter");
                                // DMAMeterEntity dmaMeterEntity = dmamcontext.MeterReadings.FirstOrDefault(x => x.PartitionKey == csv.CurrentRecord[0]);
                                string dmaId = currentContext.DMAs.Where(x => x.Name == "El Toyo – Retamar").FirstOrDefault().Identifier;

                                sm.PartitionKey = csv.CurrentRecord[0];
                                sm.CreatedOn    = creationDateTime;
                                sm.RowKey       = creationDateTime.Ticks.ToString();
                                sm.Reading      = csv.CurrentRecord[4];
                                sm.Encrypted    = false;
                                sm.DMA          = dmaId;

                                dmasm.PartitionKey = dmaId;
                                dmasm.CreatedOn    = creationDateTime;
                                dmasm.RowKey       = creationDateTime.Ticks.ToString();
                                dmasm.Reading      = csv.CurrentRecord[4];
                                dmasm.Encrypted    = false;
                                dmasm.MeterID      = csv.CurrentRecord[0];
                            }
                            else
                            {
                                EventSourceWriter.Log.MessageMethod("ERROR: Null values parsed in HeadEndSystem file  " + blob.Name);
                            }

                            string strWriteConnectionString = "MKWDNConnectionString";
                            bool   blAttempt = WriteMessageMeterDataToDataTable(sm, dmasm, strWriteConnectionString, strContainer);

                            if (!blAttempt)
                            {
                                EventSourceWriter.Log.MessageMethod("ERROR:Processing Entry NOT added to storage " + receivedMessage.Id.ToString());
                                EventSourceWriter.Log.MessageMethod("ERROR:Processing Entry NOT added to storage " + blob.Name + " " + sm.PartitionKey);
                            }
                        }
                        catch (Exception e)
                        {
                            EventSourceWriter.Log.MessageMethod("Exception processing meter reading: " + e.Message);
                        }
                    }
                }
            }

            EventSourceWriter.Log.MessageMethod("Processing Complete Entry added to storage " + receivedMessage.Id.ToString());

            urbanWaterQueue.DeleteMessage(receivedMessage);

            Event newEvent = new Event();

            newEvent.BusDispatched = false;
            newEvent.EventDateTime = DateTime.Now;
            newEvent.EventType     = (int)EventTypes.NewMeteringData;
            currentContext.Events.InsertOnSubmit(newEvent);
            currentContext.SubmitChanges();
        }
        public string Read()
        {
            _currentContext = new SQLAzureDataContext();

            var elementId = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;
            var start     = Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "start").Value);
            var end       = Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "end").Value);

            var allResults = _currentContext.ConsumptionCharacterizationDatas.Where(x => x.MeterId == elementId && x.From >= start && x.To <= end);

            var resultTxt = new StringBuilder();

            foreach (var thisReading in allResults)
            {
                var volumeValue = thisReading.Volume != null ?
                                  "<variable name=\"volume\">" + $"<value>{thisReading.Volume}</value>" + "</variable>"
                    : null;

                var durationValue = thisReading.Duration != null ?
                                    "<variable name=\"duration\">" + $"<value>{thisReading.Duration}</value>" + "</variable>"
                    : null;

                var maxFlowValue = thisReading.Max_flow != null ?
                                   "<variable name=\"Max_flow\">" + $"<value>{thisReading.Max_flow}</value>" + "</variable>"
                    : null;

                var mostFreqFlowValue = thisReading.Most_freq_flow_value != null && thisReading.Most_freq_flow_Number != null ?
                                        "<variable name=\"most_freq_flow\">" + $"<value>{thisReading.Most_freq_flow_value}</value>" +
                                        $"<number>{thisReading.Most_freq_flow_Number}</number>" + "</variable>"
                    : null;

                var characterizedDeviceValue = !IsNullOrEmpty(thisReading.characterized_device_value) && thisReading.characterized_device_id != null ?
                                               "<variable name=\"characterized_device\">" +
                                               $"<value>{thisReading.characterized_device_value}</value>" +
                                               $"<id>{thisReading.characterized_device_id}</id>" + "</variable>"
                    : null;

                var timeSinValue = thisReading.time_sin != null ?
                                   "<variable name=\"time_sin\">" + $"<value>{thisReading.time_sin}</value>" + "</variable>"
                    : null;

                var timeCosValue = thisReading.time_cos != null ?
                                   "<variable name=\"time_cos\">" + $"<value>{thisReading.time_cos}</value>" + "</variable>"
                    : null;

                string confirmedDevice = null;

                if (CompareOrdinal(thisReading.confirmation.ToLower(), "yes") == 0)
                {
                    confirmedDevice = !IsNullOrEmpty(thisReading.confirmed_device_value) && thisReading.confirmed_device_value != null ?
                                      "<variable name=\"confirmed_device\">" +
                                      $"<value>{thisReading.confirmed_device_value}</value>" +
                                      $"<id>{thisReading.confirmed_device_id}</id></variable>"
                        : null;
                }
                else if (CompareOrdinal(thisReading.confirmation.ToLower(), "no") == 0)
                {
                    confirmedDevice = !IsNullOrEmpty(thisReading.characterized_device_value) && thisReading.characterized_device_id != null ?
                                      "<variable name=\"confirmed_device\">" + $"<value>{thisReading.characterized_device_value}</value>" +
                                      $"<id>{thisReading.characterized_device_id}</id></variable>"
                        : null;
                }
                else if (CompareOrdinal(thisReading.confirmation.ToLower(), "?") == 0)
                {
                    confirmedDevice = "<variable name=\"confirmed_device\"><value>unknown</value><id>unknown</id></variable>";
                }

                var confirmation = !IsNullOrEmpty(thisReading.confirmation) ?
                                   "<variable name=\"confirmation\">" + $"<value>{thisReading.confirmation}</value>" + "</variable>"
                    : null;

                resultTxt.Append("<record>" + $"<from>{thisReading.From.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK")}</from>" +
                                 $"<to>{thisReading.To.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK")}</to>{volumeValue}{durationValue}{maxFlowValue}{mostFreqFlowValue}{timeSinValue}{timeCosValue}{characterizedDeviceValue}{confirmedDevice}{confirmation}</record>{Environment.NewLine}");
            }

            return("<response>" +
                   $"<recordSet>{$"<elementId>{elementId}</elementId>{resultTxt}</recordSet>"}</response>");
        }
        public void Update()
        {
            _currentContext = new SQLAzureDataContext();

            var elementId = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;

            foreach (var thisRecord in _currentRequestManager.Records)
            {
                var fromVar = Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "start").Value);

                float?Volume = null;
                if (thisRecord.Count(kvp => kvp.Key == "volume_value") != 0)
                {
                    Volume = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "volume_value").Value);
                }

                float?duration = null;
                if (thisRecord.Count(kvp => kvp.Key == "duration_value") != 0)
                {
                    duration = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "duration_value").Value);
                }

                float?maxFlow = null;
                if (thisRecord.Count(kvp => kvp.Key == "max_flow_value") != 0)
                {
                    maxFlow = float.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "max_flow_value").Value);
                }

                double?mostFreqFlowValue = null;
                if (thisRecord.Count(kvp => kvp.Key == "most_freq_flow_value") != 0)
                {
                    mostFreqFlowValue = double.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "most_freq_flow_value").Value);
                }

                int?mostFreqFlowNumber = null;
                if (thisRecord.Count(kvp => kvp.Key == "most_freq_flow_number") != 0)
                {
                    mostFreqFlowNumber = int.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "most_freq_flow_number").Value);
                }

                string characterizedDeviceValue = thisRecord.Count(kvp => kvp.Key == "characterized_device_value") != 0 ?
                                                  thisRecord.FirstOrDefault(kvp => kvp.Key == "characterized_device_value").Value : null;

                int?characterizedDeviceId = null;
                if (thisRecord.Count(kvp => kvp.Key == "characterized_device_id") != 0)
                {
                    characterizedDeviceId = int.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "characterized_device_id").Value);
                }

                var confirmedDeviceValue = thisRecord.Count(kvp => kvp.Key == "confirmed_device_value") != 0 ?
                                           thisRecord.FirstOrDefault(kvp => kvp.Key == "confirmed_device_value").Value : null;

                int?confirmedDeviceId = null;
                if (thisRecord.Count(kvp => kvp.Key == "confirmed_device_id") != 0)
                {
                    confirmedDeviceId = int.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "confirmed_device_id").Value);
                }

                var confirmationValue = thisRecord.Count(kvp => kvp.Key == "confirmation_value") != 0 ?
                                        thisRecord.FirstOrDefault(kvp => kvp.Key == "confirmation_value").Value : null;

                double?timeSinValue = null;
                if (thisRecord.Count(kvp => kvp.Key == "time_sin_value") != 0)
                {
                    timeSinValue = double.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "time_sin_value").Value);
                }

                double?timeCosValue = null;
                if (thisRecord.Count(kvp => kvp.Key == "time_cos_value") != 0)
                {
                    timeCosValue = double.Parse(thisRecord.FirstOrDefault(kvp => kvp.Key == "time_cos_value").Value);
                }

                var record = _currentContext.ConsumptionCharacterizationDatas.FirstOrDefault(x => x.From == fromVar && x.characterized_device_value == characterizedDeviceValue);

                if (record != null)
                {
                    record.MeterId = elementId;

                    if (Volume != null)
                    {
                        record.Volume = Volume;
                    }
                    if (duration != null)
                    {
                        record.Duration = duration;
                    }
                    if (maxFlow != null)
                    {
                        record.Max_flow = maxFlow;
                    }
                    if (mostFreqFlowValue != null)
                    {
                        record.Most_freq_flow_value = mostFreqFlowValue;
                    }
                    if (mostFreqFlowNumber != null)
                    {
                        record.Most_freq_flow_Number = mostFreqFlowNumber;
                    }
                    if (characterizedDeviceId != null)
                    {
                        record.characterized_device_id = characterizedDeviceId;
                    }
                    if (!IsNullOrEmpty(confirmationValue))
                    {
                        record.confirmation = confirmationValue;
                    }
                    if (timeCosValue != null)
                    {
                        record.time_cos = timeCosValue;
                    }
                    if (timeSinValue != null)
                    {
                        record.time_sin = timeSinValue;
                    }
                    if (confirmedDeviceId != null)
                    {
                        record.confirmed_device_id = confirmedDeviceId;
                    }
                    if (!IsNullOrEmpty(confirmedDeviceValue))
                    {
                        record.confirmed_device_value = confirmedDeviceValue;
                    }
                    if (!IsNullOrEmpty(characterizedDeviceValue))
                    {
                        record.characterized_device_value = characterizedDeviceValue;
                    }
                }

                _currentContext.SubmitChanges();
            }
        }
Exemple #25
0
        public string Read()
        {
            _currentContext = new SQLAzureDataContext();

            var  elementId = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;
            var  start     = DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "start").Value);
            var  end       = DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "end").Value);
            long timestep  = _currentRequestManager.RootElements.Count(kvp => kvp.Key == "timeStep") > 0 ?
                             int.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "timeStep").Value) : -1;

            var allResults = _currentContext.ReservoirDatas.Where(x => x.Reservoir.Identifier == elementId && x.From >= start && x.To <= end).OrderBy(x => x.From).ToList();

            if (timestep != -1 && allResults.Any())
            {
                var subResults = new List <ReservoirData>();

                const long multiplier    = 10000000;
                long       timestepTicks = timestep * multiplier;

                long startTick = allResults.FirstOrDefault().From.Ticks;
                long endTick   = allResults.LastOrDefault().From.Ticks;
                long counter   = startTick;

                while (counter <= endTick)
                {
                    // var TimeStepResults = allResults.OrderBy(item => Math.Abs(counter - item.CreationTime.Ticks)).First();
                    var timeStepResults = allResults.Aggregate((x, y) => Math.Abs(x.From.Ticks - counter) < Math.Abs(y.From.Ticks - counter) ? x : y);

                    if (timeStepResults != null)
                    {
                        counter += timestepTicks;
                        subResults.Add(timeStepResults);
                    }
                }

                allResults = subResults.GroupBy(x => x.ReservoirId).Select(y => y.First()).ToList();
            }

            var resultTxt = new StringBuilder();

            foreach (var thisReading in allResults)
            {
                var volumeValue = thisReading.Volume != null ?
                                  "<variable name=\"volume\">" + $"<value>{thisReading.Volume}</value>" + "</variable>"
                    : null;

                var levelValue = thisReading.Level != null ?
                                 "<variable name=\"level\">" + $"<value>{thisReading.Level}</value>" + "</variable>"
                    : null;

                resultTxt.Append("<record>" + $"<from>{thisReading?.From.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK")}</from>" +
                                 $"<to>{thisReading?.To.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK")}</to>{volumeValue}{levelValue}</record>{Environment.NewLine}");
            }

            var reservoirName = string.Empty;

            if (resultTxt.Length > 0)
            {
                reservoirName = _currentContext.Reservoirs.FirstOrDefault(x => x.Identifier == elementId)?.Name;
            }
            return("<response><recordSet>" + $"<elementId>{elementId}</elementId>" +
                   $"<name>{reservoirName}</name>{resultTxt}</recordSet>" + "</response>");
        }
        public string Read()
        {
            _currentContext = new SQLAzureDataContext();

            var  elementId = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;
            var  start     = DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "start").Value);
            var  end       = DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "end").Value);
            long timestep  = _currentRequestManager.RootElements.Count(kvp => kvp.Key == "timeStep") > 0 ?
                             int.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "timeStep").Value) : -1;

            var allResults = _currentContext.GetTankData(start, end, elementId).ToList();

            if (timestep != -1 && allResults.Any())
            {
                const long multiplier    = 10000000;
                long       timestepTicks = timestep * multiplier;
                long       numberOfTicksBetweenStartAndEnd = (long)(end.Ticks - start.Ticks);
                int        numberOfBlock = (int)(numberOfTicksBetweenStartAndEnd / timestepTicks);

                // Create a collection of fixed blocks in time from supplied Start to End
                List <DateTimeBlock> dateTimeBlockSet = new List <DateTimeBlock>();
                for (var BlockIndex = 0; BlockIndex < numberOfBlock; BlockIndex++)
                {
                    var newDateTimeBlock = new DateTimeBlock
                    {
                        From = start.AddTicks(BlockIndex * timestepTicks),
                        To   = start.AddTicks((BlockIndex + 1) * timestepTicks)
                    };

                    dateTimeBlockSet.Add(newDateTimeBlock);
                }

                var subResults = new List <GetTankDataResult>();

                // loop through each block and and find any records that span that block, trimming those on the edges
                foreach (var thisBlock in dateTimeBlockSet)
                {
                    var firstRecordkInSet = allResults.Where(x => x.From <thisBlock.To && x.To> thisBlock.From).OrderBy(x => x.From).FirstOrDefault();
                    var lastRecordInSet   = allResults.Where(x => x.From <thisBlock.To && x.To> thisBlock.From).OrderBy(x => x.From).Reverse().LastOrDefault();

                    if (firstRecordkInSet != null && lastRecordInSet != null)
                    {
                        var recordsSpanningBlock = allResults.Where(x => x.From >= firstRecordkInSet.From && x.To <= lastRecordInSet.To);

                        var getTankDataResults = recordsSpanningBlock as GetTankDataResult[] ?? recordsSpanningBlock.ToArray();
                        if (getTankDataResults.Any())
                        {
                            var trimmedrecordsSpanningBlock = new List <GetTankDataResult>();
                            foreach (var record in getTankDataResults)
                            {
                                double percentageToTrim = 0;

                                if (record.From < thisBlock.From)
                                {
                                    long currentBlockTicks = record.To.Ticks - record.From.Ticks;
                                    long ticksToTrim       = thisBlock.From.Ticks - record.From.Ticks;

                                    percentageToTrim += (double)(((double)100.0 / (double)currentBlockTicks) * (double)ticksToTrim);
                                }
                                if (record.To > thisBlock.To)
                                {
                                    long currentBlockTicks = record.To.Ticks - record.From.Ticks;
                                    long ticksToTrim       = record.To.Ticks - thisBlock.To.Ticks;

                                    percentageToTrim = (double)(((double)100.0 / (double)currentBlockTicks) * (double)ticksToTrim);
                                }

                                if (record.Inflow != null)
                                {
                                    record.Inflow = record.Inflow - ((record.Inflow / 100) * percentageToTrim);
                                }
                                trimmedrecordsSpanningBlock.Add(record);
                            }

                            double?inflow = null;

                            foreach (var reading in trimmedrecordsSpanningBlock)
                            {
                                if (reading.Inflow != null)
                                {
                                    if (inflow == null)
                                    {
                                        inflow = reading.Inflow;
                                    }
                                    else
                                    {
                                        inflow += reading.Inflow;
                                    }
                                }
                            }

                            var modifiedReading = trimmedrecordsSpanningBlock.FirstOrDefault();

                            if (inflow != null)
                            {
                                if (modifiedReading != null)
                                {
                                    modifiedReading.Inflow = inflow / trimmedrecordsSpanningBlock.Count();
                                }
                            }

                            if (modifiedReading != null)
                            {
                                modifiedReading.From = thisBlock.From;
                                modifiedReading.To   = thisBlock.To;

                                subResults.Add(modifiedReading);
                            }
                        }
                    }
                }

                allResults = subResults;
            }

            var resultTxt = new StringBuilder();

            foreach (var thisReading in allResults)
            {
                var volumeValue = thisReading.Volume != null ?
                                  "<variable name=\"volume\">" + $"<value>{thisReading.Volume}</value>" + "</variable>"
                    : null;

                var levelValue = thisReading.Outflow != null ?
                                 "<variable name=\"outflow\">" + $"<value>{thisReading.Outflow}</value>" + "</variable>"
                    : null;

                var inflowValue = thisReading.Inflow != null ?
                                  "<variable name=\"inflow\">" + $"<value>{thisReading.Inflow}</value>" + "</variable>"
                    : null;

                resultTxt.Append("<record>" + $"<from>{thisReading?.From.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK")}</from>" +
                                 $"<to>{thisReading?.To.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK")}</to>{volumeValue}{levelValue}{inflowValue}</record>{Environment.NewLine}");
            }

            var tankName = string.Empty;

            if (resultTxt.Length > 0)
            {
                tankName = _currentContext.Tanks.FirstOrDefault(x => x.Identifier == elementId)?.Name;
            }

            return("<response>" + "<recordSet>" + $"<elementId>{elementId}</elementId>" +
                   $"<name>{tankName}</name>{resultTxt}</recordSet>" + "</response>");
        }
Exemple #27
0
 protected QueueProcessorBase()
 {
     CurrentContext = new SQLAzureDataContext();
 }
        public void ProcessQueue(CloudBlockBlob blob,
                                 CloudQueueMessage receivedMessage,
                                 CloudQueue urbanWaterQueue)
        {
            var currentContext = new SQLAzureDataContext();

            var xml  = blob.DownloadText();
            var xDoc = XDocument.Parse(xml);

            var root     = xDoc.Elements();
            var gateways = root.Elements().FirstOrDefault(x => x.Name.LocalName == "gateways");

            var missingMeterIds   = new List <string>();
            var processedMeterIds = new List <string>();

            try
            {
                foreach (var gateway in gateways?.Elements().Where(x => x.Name.LocalName == "gateway"))
                {
                    var collections = gateway.Elements().FirstOrDefault(x => x.Name.LocalName == "collections");
                    foreach (var collection in collections.Elements().Where(x => x.Name.LocalName == "collection"))
                    {
                        var producerId = collection.Elements().FirstOrDefault(x => x.Name.LocalName == "producer-id").Value;
                        var data       = collection.Elements().FirstOrDefault(x => x.Name.LocalName == "data");

                        foreach (var record in data.Elements())
                        {
                            var recordDateTime = record.Attributes().FirstOrDefault(x => x.Name.LocalName == "ts").Value;
                            var recordValue    = record.Elements().FirstOrDefault(x => x.Name.LocalName == "CURRENT_INDEX").Value;

                            if (!string.IsNullOrEmpty(producerId) &&
                                !string.IsNullOrEmpty(recordDateTime) &&
                                !string.IsNullOrEmpty(recordValue)
                                )
                            {
                                try
                                {
                                    var meterSet = currentContext.Meters.Where(x => x.MeterIdentity == producerId);

                                    if (!meterSet.Any())
                                    {
                                        if (!missingMeterIds.Contains(producerId))
                                        {
                                            missingMeterIds.Add(producerId);
                                        }
                                    }
                                    else
                                    {
                                        if (!processedMeterIds.Contains(producerId))
                                        {
                                            processedMeterIds.Add(producerId);
                                        }
                                    }
                                }
                                catch (Exception e)
                                {
                                    EventSourceWriter.Log.MessageMethod("EXCEPTION: WaterMeterQueueXMLProcessor. " + e.Message);
                                }

                                try
                                {
                                    var firstOrDefault = currentContext.Meters.FirstOrDefault(x => x.MeterIdentity == producerId);
                                    if (firstOrDefault != null)
                                    {
                                        var thisDma =
                                            firstOrDefault.DMA;

                                        var sm = new MeterReadingEntity
                                        {
                                            PartitionKey = producerId,
                                            CreatedOn    = DateTime.Parse(recordDateTime),
                                            RowKey       = DateTime.Parse(recordDateTime).Ticks.ToString(),
                                            Reading      = recordValue,
                                            Encrypted    = false,
                                            DMA          = thisDma.Identifier
                                        };

                                        const string strWriteConnectionString = "MKWDNConnectionString";
                                        var          blAttempt = WriteMessageMeterDataToDataTable(sm,
                                                                                                  strWriteConnectionString, thisDma.Site.TableName);

                                        if (!blAttempt)
                                        {
                                            EventSourceWriter.Log.MessageMethod(
                                                $"ERROR writing to BLOB storage by WaterMeterQueueXMLProcessor. Received message Id: {receivedMessage.Id}BLOB name: {blob.Name}, PartitionKey: {sm.PartitionKey}");
                                        }
                                    }
                                }
                                catch (Exception e)
                                {
                                    EventSourceWriter.Log.MessageMethod(
                                        $"ERROR writing to BLOB storage in WaterMeterQueueXMLProcessor. Received message Id: {receivedMessage.Id}BLOB name: {blob.Name}, Exception: {e.Message}");
                                }
                            }
                            else
                            {
                                EventSourceWriter.Log.MessageMethod(
                                    $"ERROR: Null values parsed in CSV file by WaterMeterQueueXMLProcessor. Blob name: {blob.Name}");
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                EventSourceWriter.Log.MessageMethod(
                    $"Exception processing CSV meter reading in WaterMeterQueueXMLProcessor. Exception: {e.Message}");
            }

            urbanWaterQueue.DeleteMessage(receivedMessage);

            var newEvent = new Event
            {
                BusDispatched = false,
                EventDateTime = DateTime.Now,
                EventType     = (int)EventTypes.NewMeteringData
            };

            var processedMetercsv = processedMeterIds.Aggregate(string.Empty, (current, meterId) => current + (meterId + ", "));

            newEvent.Description = processedMetercsv;

            currentContext.Events.InsertOnSubmit(newEvent);

            if (missingMeterIds.Count > 0)
            {
                var newMeterMissingEvent = new Event
                {
                    BusDispatched = false,
                    EventDateTime = DateTime.Now,
                    EventType     = (int)EventTypes.MissingMeter
                };

                var metercsv = missingMeterIds.Aggregate(string.Empty, (current, meterId) => current + (meterId + ", "));

                newMeterMissingEvent.Description = metercsv;

                currentContext.Events.InsertOnSubmit(newMeterMissingEvent);
            }

            currentContext.SubmitChanges();
        }
Exemple #29
0
        public string ReadSpecificProperty(List <int> indices)
        {
            _currentContext = new SQLAzureDataContext();
            var elementId = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;
            var start     = _currentRequestManager.RootElements.Any(kvp => kvp.Key == "start") ?
                            DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "start").Value) : DateTimeOffset.MinValue;
            var end = _currentRequestManager.RootElements.Any(kvp => kvp.Key == "end") ?
                      DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "end").Value) : DateTimeOffset.MaxValue;
            long timestep = _currentRequestManager.RootElements.Count(kvp => kvp.Key == "timeStep") > 0 ?
                            int.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "timeStep").Value) : -1;

            var resultTxt  = new StringBuilder();
            var allResults = _currentContext.GetDMAData(start, end, elementId).ToList();

            if (allResults.Any())
            {
                if (timestep != -1 && allResults.Any())
                {
                    const long multiplier    = 10000000;
                    long       timestepTicks = timestep * multiplier;
                    long       numberOfTicksBetweenStartAndEnd = (long)(end.Ticks - start.Ticks);
                    int        numberOfBlock = (int)(numberOfTicksBetweenStartAndEnd / timestepTicks);

                    // Create a collection of fixed blocks in time from supplied Start to End
                    var dateTimeBlockSet = new List <DateTimeBlock>();
                    for (var blockIndex = 0; blockIndex < numberOfBlock; blockIndex++)
                    {
                        var newDateTimeBlock = new DateTimeBlock
                        {
                            From = start.AddTicks(blockIndex * timestepTicks),
                            To   = start.AddTicks((blockIndex + 1) * timestepTicks)
                        };

                        dateTimeBlockSet.Add(newDateTimeBlock);
                    }

                    var subResults = new List <GetDMADataResult>();

                    // loop through each block and and find any records that span that block, trimming those on the edges
                    foreach (var thisBlock in dateTimeBlockSet)
                    {
                        var recordsSpanningBlock =
                            allResults.Where(x => x.Time > thisBlock.From && x.Time <= thisBlock.To);

                        var getDmaDataResults = recordsSpanningBlock as GetDMADataResult[] ??
                                                recordsSpanningBlock.ToArray();
                        if (getDmaDataResults.Any())
                        {
                            double?flow     = null;
                            double?pressure = null;
                            double?Volume   = null;

                            foreach (var reading in getDmaDataResults)
                            {
                                if (reading.Flow != null)
                                {
                                    if (flow == null)
                                    {
                                        flow = reading.Flow;
                                    }
                                    else
                                    {
                                        flow += reading.Flow;
                                    }
                                }

                                if (reading.Pressure != null)
                                {
                                    if (pressure == null)
                                    {
                                        pressure = reading.Pressure;
                                    }
                                    else
                                    {
                                        pressure += reading.Pressure;
                                    }
                                }

                                if (reading.Volume != null)
                                {
                                    if (Volume == null)
                                    {
                                        Volume = reading.Volume;
                                    }
                                    else
                                    {
                                        Volume += reading.Volume;
                                    }
                                }
                            }

                            var modifiedReading = getDmaDataResults.FirstOrDefault();

                            if (flow != null)
                            {
                                if (modifiedReading != null)
                                {
                                    modifiedReading.Flow = flow;
                                }
                            }
                            if (pressure != null)
                            {
                                if (modifiedReading != null)
                                {
                                    modifiedReading.Pressure = pressure / getDmaDataResults.Count(x => x.Pressure != null);
                                }
                            }
                            if (Volume != null)
                            {
                                if (modifiedReading != null)
                                {
                                    modifiedReading.Volume = Volume;
                                }
                            }

                            if (modifiedReading != null)
                            {
                                modifiedReading.Time = thisBlock.From;

                                subResults.Add(modifiedReading);
                            }
                        }
                    }

                    allResults = subResults;
                }

                foreach (var thisReading in allResults)
                {
                    var flowValue     = string.Empty;
                    var pressureValue = string.Empty;
                    var volumeValue   = string.Empty;

                    if (indices.Contains(16) && thisReading.Flow != null)
                    {
                        flowValue = "<variable name=\"flow\">" + $"<value>{thisReading.Flow}</value>" + "</variable>";
                    }
                    if (indices.Contains(17) && thisReading.Pressure != null)
                    {
                        pressureValue = "<variable name=\"pressure\">" + $"<value>{thisReading.Pressure}</value>" +
                                        "</variable>";
                    }
                    if (indices.Contains(18) && thisReading.Volume != null)
                    {
                        volumeValue = "<variable name=\"volume\">" + $"<value>{thisReading.Volume}</value>" +
                                      "</variable>";
                    }

                    if (!string.IsNullOrEmpty(flowValue) || !string.IsNullOrEmpty(pressureValue) ||
                        !string.IsNullOrEmpty(volumeValue))
                    {
                        resultTxt.Append($"<record><time>{thisReading.Time.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK")}</time>{flowValue}{pressureValue}{volumeValue}</record>{Environment.NewLine}");
                    }
                }
            }

            return(resultTxt.ToString());
        }
Exemple #30
0
        public string ReadSpecificProperty(List <int> indices)
        {
            _currentContext = new SQLAzureDataContext();
            var elementId = _currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "elementId").Value;
            var start     = _currentRequestManager.RootElements.Any(kvp => kvp.Key == "start") ?
                            DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "start").Value) : DateTimeOffset.MinValue;
            var end = _currentRequestManager.RootElements.Any(kvp => kvp.Key == "end") ?
                      DateTimeOffset.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "end").Value) : DateTimeOffset.MaxValue;
            long timestep = _currentRequestManager.RootElements.Count(kvp => kvp.Key == "timeStep") > 0 ?
                            int.Parse(_currentRequestManager.RootElements.FirstOrDefault(kvp => kvp.Key == "timeStep").Value) : -1;

            var resultTxt  = new StringBuilder();
            var allResults = _currentContext.GetWeatherData(start, end, elementId).ToList();

            if (allResults.Any())
            {
                //          start = allResults.Aggregate((acc, c) => acc.From < c.From ? acc : c).From;
                //          end = allResults.Aggregate((acc, c) => acc.To > c.To ? acc : c).To;
                if (timestep != -1 && allResults.Any())
                {
                    const long multiplier    = 10000000;
                    long       timestepTicks = timestep * multiplier;
                    long       numberOfTicksBetweenStartAndEnd = (long)(end.Ticks - start.Ticks);
                    int        numberOfBlock = (int)(numberOfTicksBetweenStartAndEnd / timestepTicks);

                    // Create a collection of fixed blocks in time from supplied Start to End
                    var dateTimeBlockSet = new List <DateTimeBlock>();
                    for (var blockIndex = 0; blockIndex < numberOfBlock; blockIndex++)
                    {
                        var newDateTimeBlock = new DateTimeBlock
                        {
                            From = start.AddTicks(blockIndex * timestepTicks),
                            To   = start.AddTicks((blockIndex + 1) * timestepTicks)
                        };

                        dateTimeBlockSet.Add(newDateTimeBlock);
                    }

                    var subResults = new List <GetWeatherDataResult>();

                    // loop through each block and and find any records that span that block, trimming those on the edges
                    foreach (var thisBlock in dateTimeBlockSet)
                    {
                        var firstRecordkInSet =
                            allResults.Where(x => x.From <thisBlock.To && x.To> thisBlock.From)
                            .OrderBy(x => x.From)
                            .FirstOrDefault();
                        var lastRecordInSet =
                            allResults.Where(x => x.From <thisBlock.To && x.To> thisBlock.From)
                            .OrderBy(x => x.From)
                            .Reverse()
                            .LastOrDefault();

                        if (firstRecordkInSet != null && lastRecordInSet != null)
                        {
                            var recordsSpanningBlock =
                                allResults.Where(x => x.From >= firstRecordkInSet.From && x.To <= lastRecordInSet.To);

                            var getWeatherDataResults = recordsSpanningBlock as GetWeatherDataResult[] ??
                                                        recordsSpanningBlock.ToArray();
                            if (getWeatherDataResults.Any())
                            {
                                var trimmedrecordsSpanningBlock = new List <GetWeatherDataResult>();
                                foreach (var record in getWeatherDataResults)
                                {
                                    double percentageToTrim = 0;

                                    if (record.From < thisBlock.From)
                                    {
                                        long currentBlockTicks = record.To.Ticks - record.From.Ticks;
                                        long ticksToTrim       = thisBlock.From.Ticks - record.From.Ticks;

                                        percentageToTrim +=
                                            (double)(((double)100.0 / (double)currentBlockTicks) * (double)ticksToTrim);
                                    }
                                    if (record.To > thisBlock.To)
                                    {
                                        long currentBlockTicks = record.To.Ticks - record.From.Ticks;
                                        long ticksToTrim       = record.To.Ticks - thisBlock.To.Ticks;

                                        percentageToTrim =
                                            (double)(((double)100.0 / (double)currentBlockTicks) * (double)ticksToTrim);
                                    }

                                    if (record.Precipitation != null)
                                    {
                                        record.Precipitation = record.Precipitation -
                                                               ((record.Precipitation / 100) * percentageToTrim);
                                    }
                                    trimmedrecordsSpanningBlock.Add(record);
                                }

                                int?   humidity       = null;
                                double?precipitation  = null;
                                int?   pressure       = null;
                                double?solarRadiation = null;
                                double?temperature    = null;
                                string windDirection  = null;
                                double?windVelocity   = null;

                                foreach (var reading in trimmedrecordsSpanningBlock)
                                {
                                    if (reading.Humidity != null)
                                    {
                                        if (humidity == null)
                                        {
                                            humidity = reading.Humidity;
                                        }
                                        else
                                        {
                                            humidity += reading.Humidity;
                                        }
                                    }
                                    if (reading.Precipitation != null)
                                    {
                                        if (precipitation == null)
                                        {
                                            precipitation = reading.Precipitation;
                                        }
                                        else
                                        {
                                            precipitation += reading.Precipitation;
                                        }
                                    }
                                    if (reading.Pressure != null)
                                    {
                                        if (pressure == null)
                                        {
                                            pressure = reading.Pressure;
                                        }
                                        else
                                        {
                                            pressure += reading.Pressure;
                                        }
                                    }
                                    if (reading.Solar_radiation != null)
                                    {
                                        if (solarRadiation == null)
                                        {
                                            solarRadiation = reading.Solar_radiation;
                                        }
                                        else
                                        {
                                            solarRadiation += reading.Solar_radiation;
                                        }
                                    }
                                    if (reading.Temperature != null)
                                    {
                                        if (temperature == null)
                                        {
                                            temperature = reading.Temperature;
                                        }
                                        else
                                        {
                                            temperature += reading.Temperature;
                                        }
                                    }
                                    windDirection = reading.Wind_direction;
                                    if (reading.Wind_velocity != null)
                                    {
                                        if (windVelocity == null)
                                        {
                                            windVelocity = reading.Wind_velocity;
                                        }
                                        else
                                        {
                                            windVelocity += reading.Wind_velocity;
                                        }
                                    }
                                }

                                var modifiedReading = trimmedrecordsSpanningBlock.FirstOrDefault();

                                if (humidity != null)
                                {
                                    modifiedReading.Humidity = humidity / trimmedrecordsSpanningBlock.Count();
                                }
                                if (precipitation != null)
                                {
                                    modifiedReading.Precipitation = precipitation;
                                }
                                if (pressure != null)
                                {
                                    modifiedReading.Pressure = pressure / trimmedrecordsSpanningBlock.Count();
                                }
                                if (solarRadiation != null)
                                {
                                    modifiedReading.Solar_radiation = solarRadiation / trimmedrecordsSpanningBlock.Count();
                                }
                                if (temperature != null)
                                {
                                    modifiedReading.Temperature = temperature / trimmedrecordsSpanningBlock.Count();
                                }
                                modifiedReading.Wind_direction = windDirection;
                                if (windVelocity != null)
                                {
                                    modifiedReading.Wind_velocity = windVelocity / trimmedrecordsSpanningBlock.Count();
                                }

                                modifiedReading.From = thisBlock.From;
                                modifiedReading.To   = thisBlock.To;

                                subResults.Add(modifiedReading);
                            }
                        }
                    }

                    allResults = subResults;
                }

                foreach (var thisReading in allResults)
                {
                    var precipitationValue  = string.Empty;
                    var temperatureValue    = string.Empty;
                    var humidityValue       = string.Empty;
                    var pressureValue       = string.Empty;
                    var windVelocityValue   = string.Empty;
                    var windDirectionValue  = string.Empty;
                    var solarRadiationValue = string.Empty;

                    if (indices.Contains(2) && thisReading.Precipitation != null)
                    {
                        precipitationValue = "<variable name=\"precipitation\">" +
                                             $"<value>{thisReading.Precipitation}</value></variable>";
                    }
                    if (indices.Contains(3) && thisReading.Temperature != null)
                    {
                        temperatureValue = "<variable name=\"temperature\">" +
                                           $"<value>{thisReading.Temperature}</value></variable>";
                    }
                    if (indices.Contains(4) && thisReading.Humidity != null)
                    {
                        humidityValue = "<variable name=\"humidity\">" +
                                        $"<value>{thisReading.Humidity}</value></variable>";
                    }
                    if (indices.Contains(5) && thisReading.Pressure != null)
                    {
                        pressureValue = "<variable name=\"pressure\">" +
                                        $"<value>{thisReading.Pressure}</value></variable>";
                    }
                    if (indices.Contains(6) && thisReading.Wind_velocity != null)
                    {
                        windVelocityValue = "<variable name=\"wind_velocity\">" +
                                            $"<value>{thisReading.Wind_velocity}</value></variable>";
                    }
                    if (indices.Contains(7) && thisReading.Wind_direction != null)
                    {
                        windDirectionValue = "<variable name=\"wind_direction\">" +
                                             $"<value>{thisReading.Wind_direction}</value></variable>";
                    }
                    if (indices.Contains(8) && thisReading.Solar_radiation != null)
                    {
                        solarRadiationValue = "<variable name=\"solar_radiation\">" +
                                              $"<value>{thisReading.Solar_radiation}</value></variable>";
                    }

                    if (!string.IsNullOrEmpty(precipitationValue) || !string.IsNullOrEmpty(temperatureValue) ||
                        !string.IsNullOrEmpty(humidityValue) || !string.IsNullOrEmpty(pressureValue) ||
                        !string.IsNullOrEmpty(windVelocityValue) || !string.IsNullOrEmpty(windDirectionValue) ||
                        !string.IsNullOrEmpty(solarRadiationValue))
                    {
                        resultTxt.Append("<record>" + $"<from>{thisReading?.From}</from>" +
                                         $"<to>{thisReading?.To}</to>{precipitationValue}{temperatureValue}{humidityValue}{pressureValue}{windDirectionValue}{windVelocityValue}{solarRadiationValue}</record>{Environment.NewLine}");
                    }
                }
            }
            return(resultTxt.ToString());
        }