public void TestReadStationValues() { var api = new EnvAgencyRainfall(); var stations = api.GetStations(51.0899, -0.4547, 20); Assert.NotNull(stations); foreach (var s in stations.items) { if (s.measures == null || s.measures.Count == 0) { continue; } var rainfallMeasure = s.measures.Find(x => x.parameter.Equals("rainfall")); if (rainfallMeasure == null) { continue; } var measurement = api.GetLatestMeasurement(s.stationReference); if (measurement.items != null && measurement.items.Count > 0) { foreach (var i in measurement.items) { if (!i.parameter.Equals("rainfall")) { continue; } Console.WriteLine($"{s.stationReference} : {s.lat},{s.lon} : {i.latestReading.value}{i.unitName}"); } } } }
static void update(EnvAgencyRainfall api, EnvAgencyRainfall.GetStationsData stations, InfluxDBClient influxDBClient) { // Write Data to influx using (var writeApi = influxDBClient.GetWriteApi()) { foreach (var s in stations.items) { if (s.measures == null || s.measures.Count == 0) { continue; } var rainfallMeasure = s.measures.Find(x => x.parameter.Equals("rainfall")); if (rainfallMeasure == null) { continue; } var measurement = api.GetLatestMeasurement(s.stationReference); if (measurement == null) { // TODO: One instance of this is a rainfall sensor returning value: [0, 0.4], as array instead of single value // There doesn't appear to be anything in the api to signify this, will need to read the docs to tell if it's // an actual error. No big deal really just that sensor won't be read continue; } if (measurement.items != null && measurement.items.Count > 0) { foreach (var i in measurement.items) { if (!i.parameter.Equals("rainfall")) { continue; } var absReading = i.latestReading.value; var mmPerPeriod = absReading; if (!i.unit.Equals("http://qudt.org/1.1/vocab/unit#Millimeter")) { // Again TODO - Ignore for now as most sensors seem to be mm based. // Should just scale up and we'd be good continue; } var mmPerHour = mmPerPeriod * (3600.0 / i.period); Console.WriteLine($"{s.stationReference} : {s.lat},{s.lon} : {mmPerHour}mm/h"); /// /////////////////////////////////////////// // TODO: Take actual timestamp from rainfall reading. This is currently just polling, so less accurate/etc var point = PointData.Measurement("rainfall") .Tag("location", s.stationReference) .Field("value", mmPerHour) .Timestamp(DateTime.UtcNow, WritePrecision.S); writeApi.WritePoint(BucketName, OrgName, point); } } } } }