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}");
                    }
                }
            }
        }
Beispiel #2
0
        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);
                        }
                    }
                }
            }
        }