Exemplo n.º 1
0
        public async Task <AirQualityData> GetIndexAsync(string locationId, CancellationToken ct)
        {
            var result = await cache.GetOrCreateAsync(CacheKeys.GiosData, async ce =>
            {
                logger.LogInformation("Starting retrieving Wroclaw GIOS data");
                try
                {
                    var sensors         = await GetSensorIdsAsync(ct);
                    AirQualityData data = new AirQualityData();
                    var tasks           = ImmutableDictionary <ParamId, Task <Measurements> > .Empty;
                    foreach (var pair in sensors)
                    {
                        Task <Measurements> dataTask = pair.Value.HasValue ? GetDataAsync(pair.Value.Value, ct) : Task.FromResult <Measurements>(null);
                        tasks = tasks.Add(pair.Key, dataTask);
                    }
                    await Task.WhenAll(tasks.Values);
                    data.SO2  = tasks[ParamId.SO2].Result?.Values?.FirstOrDefault()?.Value;
                    data.PM10 = tasks[ParamId.PM10].Result?.Values?.FirstOrDefault()?.Value;
                    data.O3   = tasks[ParamId.O3].Result?.Values?.FirstOrDefault()?.Value;
                    data.NO2  = tasks[ParamId.NO2].Result?.Values?.FirstOrDefault()?.Value;
                    data.CO   = tasks[ParamId.CO].Result?.Values?.FirstOrDefault()?.Value;
                    // for date reference take the one from PM10 sensor reading
                    data.Date = tasks[ParamId.PM10].Result.Values.First().Date;
                    ce.SetAbsoluteExpiration(TimeSpan.FromMinutes(5));
                    return(data);
                }
                catch (Exception ex)
                {
                    logger.LogError(ex, "Failed retrieving Wroclaw GIOS data for some reason");
                    throw;
                }
            });

            return(result);
        }
        public async Task <AirQualityData> GetIndexAsync(CancellationToken ct)
        {
            logger.LogInfo().WithCategory(LogCategory.AirQuality).WithMessage("Starting retrieving Wroclaw GIOS data").Commit();
            try
            {
                var sensors = await GetSensorIdsAsync(ct);

                AirQualityData data  = new AirQualityData();
                var            tasks = ImmutableDictionary <ParamId, Task <Measurements> > .Empty;
                foreach (var pair in sensors)
                {
                    Task <Measurements> dataTask = pair.Value.HasValue ? GetDataAsync(pair.Value.Value, ct) : Task.FromResult <Measurements>(null);
                    tasks = tasks.Add(pair.Key, dataTask);
                }
                await Task.WhenAll(tasks.Values);

                data.SO2  = tasks[ParamId.SO2].Result?.Values?.FirstOrDefault()?.Value;
                data.PM10 = tasks[ParamId.PM10].Result?.Values?.FirstOrDefault()?.Value;
                data.O3   = tasks[ParamId.O3].Result?.Values?.FirstOrDefault()?.Value;
                data.NO2  = tasks[ParamId.NO2].Result?.Values?.FirstOrDefault()?.Value;
                data.CO   = tasks[ParamId.CO].Result?.Values?.FirstOrDefault()?.Value;
                // for date reference take the one from PM10 sensor reading
                data.Date = tasks[ParamId.PM10].Result.Values.First().Date;
                return(data);
            }
            catch (Exception ex)
            {
                logger.LogError().WithCategory(LogCategory.AirQuality).WithMessage("Failed retrieving Wroclaw GIOS data for some reason").WithException(ex).Commit();
                throw;
            }
        }
Exemplo n.º 3
0
 public void UpdatePersisted(AirQualityData data, AirQualityPersisted persisted)
 {
     if (data.NO2.HasValue)
     {
         persisted.NO2 = new AirQualityValue {
             LastDate = data.Date, Value = data.NO2.Value
         };
     }
     if (data.PM10.HasValue)
     {
         persisted.PM10 = new AirQualityValue {
             LastDate = data.Date, Value = data.PM10.Value
         };
     }
     if (data.SO2.HasValue)
     {
         persisted.SO2 = new AirQualityValue {
             LastDate = data.Date, Value = data.SO2.Value
         };
     }
     if (data.O3.HasValue)
     {
         persisted.O3 = new AirQualityValue {
             LastDate = data.Date, Value = data.O3.Value
         };
     }
     if (data.CO.HasValue)
     {
         persisted.CO = new AirQualityValue {
             LastDate = data.Date, Value = data.CO.Value
         };
     }
 }
Exemplo n.º 4
0
        public AirQualityData ParseData(XDocument doc, string stationCode)
        {
            XElement root = doc.Root;

            if (!string.Equals(root.Name.LocalName, "arsopodatki", StringComparison.Ordinal))
            {
                logger.LogError($"Root node name is {root.Name.LocalName} while expected arsopodatki");
                return(null);
            }
            AirQualityData result = new AirQualityData
            {
                Date = DateTime.Parse(root.Element("datum_priprave").Value, CultureInfo.InvariantCulture)
            };

            var query = from e in root.Elements("postaja")
                        let code = e.Attribute("sifra")
                                   where code != null && code.Value == stationCode
                                   select e;
            var station = query.SingleOrDefault();

            if (station == null)
            {
                logger.LogError($"Couldn't find station with sifra={stationCode}");
                return(null);
            }
            result.SO2  = GetDoubleValue(station.Element("so2"));
            result.PM10 = GetDoubleValue(station.Element("pm10"));
            result.O3   = GetDoubleValue(station.Element("o3"));
            result.NO2  = GetDoubleValue(station.Element("no2"));
            result.CO   = GetDoubleValue(station.Element("co"));
            return(result);
        }
Exemplo n.º 5
0
 public CalculatedPollution[] CalculatePollution(AirQualityData data)
 {
     logger.LogInformation("Calculating pollution");
     CalculatedPollution[] pollution = new CalculatedPollution[]
     {
         CalculatePollution(data.Date, Measurement.PM10, data.PM10, CalculatePM10PollutionIndex(data.PM10 ?? 0)),
         CalculatePollution(data.Date, Measurement.O3, data.O3, CalculateO3PollutionIndex(data.O3 ?? 0)),
         CalculatePollution(data.Date, Measurement.NO2, data.NO2, CalculateNO2PollutionIndex(data.NO2 ?? 0)),
         CalculatePollution(data.Date, Measurement.SO2, data.SO2, CalculateSO2PollutionIndex(data.SO2 ?? 0))
     };
     return(pollution);
 }
Exemplo n.º 6
0
        public AirQualityPollutionCalculated Calculate(AirQualityData data)
        {
            var          pollutions          = CalculatePollution(data);
            var          calculatedPollution = CalculateMaxPollution(pollutions);
            AirPollution pollution           = calculatedPollution.Pollution;
            Measurement  chief         = GetChiefPolluter(pollutions);
            string       pollutionInfo = $"Max pollution is {pollution} with index {calculatedPollution.Index:0} coming from {chief}";

            logger.LogInformation(pollutionInfo);
            logger.LogInformation("Air quality processor done");
            return(new AirQualityPollutionCalculated(data, pollution, chief));
        }
Exemplo n.º 7
0
        public async Task <AirQualityData> GetIndexAsync(CancellationToken ct)
        {
            logger.LogInfo().WithCategory(LogCategory.AirQuality).WithMessage("Starting retrieving Wroclaw Pios data").Commit();
            try
            {
                var uri      = DateTime.Now.Date.ToString("yyyy-MM-dd");
                var response = await GetDataAsync(uri, client, ct);

                AirQualityData data = ParseData(response);
                return(data);
            }
            catch (Exception ex)
            {
                logger.LogError().WithCategory(LogCategory.AirQuality).WithMessage("Failed retrieving Wroclaw Pios data for some reason").WithException(ex).Commit();
                throw;
            }
        }
Exemplo n.º 8
0
        public void GivenSample_ReturnsCorrectData()
        {
            var doc = XDocument.Parse(GetSampleContent("sample.xml"));

            var actual = SabraAirQualityService.ParseData(logger, doc, null);

            var expected = new AirQualityData
            {
                Date = new DateTime(2022, 6, 24, 11, 0, 0),
                NO2  = 42.9415156252649,
                O3   = 22.0501892621643,
                PM10 = 12.75,
                SO2  = null,
            };

            Assert.That(actual, Is.EqualTo(expected).Using(AirQualityDataEqualityComparer.Default));
        }
Exemplo n.º 9
0
        public void GivenSample_DeserializesCorrectly()
        {
            string content = GetSampleContent("sample.json");

            var actual = AqicnAirQualityService.DeserializeData(content);

            var expected = new AirQualityData
            {
                Date = new DateTime(2022, 6, 26, 10, 0, 0),
                NO2  = 2.3,
                O3   = 44.3,
                PM10 = 11,
                SO2  = 1.4,
            };

            Assert.That(actual.Data.Time.Iso,
                        Is.EqualTo(new DateTimeOffset(2022, 6, 26, 10, 0, 0, TimeSpan.FromHours(2))));
            Assert.That(actual.Data.Iaqi.No2.V, Is.EqualTo(2.3));
            Assert.That(actual.Data.Iaqi.O3.V, Is.EqualTo(44.3));
            Assert.That(actual.Data.Iaqi.Pm10.V, Is.EqualTo(11));
            Assert.That(actual.Data.Iaqi.So2.V, Is.EqualTo(1.4));
        }
 public AirQualityPollutionCalculated(AirQualityData data, AirPollution pollutionWeight, Measurement chiefPollutant)
 {
     Data            = data;
     PollutionWeight = pollutionWeight;
     ChiefPollutant  = chiefPollutant;
 }