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; } }
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 }; } }
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); }
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); }
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)); }
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; } }
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)); }
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; }