public static async Task Run(
            [QueueTrigger("%QUEUE_MEASUREMENTS_OWM%", Connection = "StorageConnectionString")] NetatmoStationData measurements,
            TraceWriter log)
        {
            log.Info($"Posting measurements to OpenWeatherMap at: {DateTime.Now.ToString(DateTimeFormat)}");

            await PostMeasurement(measurements, log);
        }
        private static async Task <bool> PostMeasurement(NetatmoStationData measurements, TraceWriter log)
        {
            bool success = true;

            using (var http = new HttpClient())
            {
                var key       = Environment.GetEnvironmentVariable(EnvOpenWeatherMapAppKey);
                var stationId = Environment.GetEnvironmentVariable(EnvOpenWeatherMapStationId);
                if (string.IsNullOrEmpty(key))
                {
                    log.Error($"ERROR no {EnvOpenWeatherMapAppKey} set");
                    return(false);
                }
                if (string.IsNullOrEmpty(stationId))
                {
                    log.Error($"ERROR no {EnvOpenWeatherMapStationId} set");
                    return(false);
                }

                var uri = $"{OpenWeatherMapPostMeasurementUri}?APPID={key}";

                var postJSON = CreatePostJSON(measurements, stationId, log);
                if (!string.IsNullOrEmpty(postJSON))
                {
                    log.Info($"Post JSON: {postJSON}");
                    var request = new HttpRequestMessage(HttpMethod.Post, uri)
                    {
                        Content = new StringContent(postJSON, Encoding.UTF8, "application/json")
                    };
                    var response = await http.SendAsync(request);

                    if (response.IsSuccessStatusCode)
                    {
                        log.Info($"Measurement posted succesfully. {response.StatusCode} - {response.ReasonPhrase}");
                        success = true;
                    }
                    else
                    {
                        log.Error($"ERROR posting measurement: {response.StatusCode} - {response.ReasonPhrase}");
                        success = false;
                    }
                }
                else
                {
                    success = false;
                }
            }

            return(success);
        }
Esempio n. 3
0
        private static async Task <bool> PostMeasurement(NetatmoStationData measurements, TraceWriter log)
        {
            bool success = true;

            using (var http = new HttpClient())
            {
                var stationId = Environment.GetEnvironmentVariable(EnvWundergroundStationId);
                var key       = Environment.GetEnvironmentVariable(EnvWundergroundStationKey);
                if (string.IsNullOrEmpty(key))
                {
                    log.Error($"ERROR no {EnvWundergroundStationKey} set");
                    return(false);
                }
                if (string.IsNullOrEmpty(stationId))
                {
                    log.Error($"ERROR no {EnvWundergroundStationId} set");
                    return(false);
                }

                var timestamp   = measurements.Body?.Devices?[0]?.Modules?[0]?.DashboardData?.TimeUtc;
                var temperature = measurements.Body?.Devices?[0]?.Modules?[0]?.DashboardData?.Temperature;
                var humidity    = measurements.Body?.Devices?[0]?.Modules?[0]?.DashboardData?.Humidity;
                var pressure    = measurements.Body?.Devices?[0]?.DashboardData?.AbsolutePressure;

                var tempF = UnitConversions.FromCelsiusToFahrenheit(temperature.Value);
                var inHg  = UnitConversions.InHgFromMillibars(pressure.Value);
                var uri   = $"{WeatherUndergroundPostMeasurementUri}?action=updateraw&dateutc=={timestamp.Value}&tempf={tempF}&humidity={humidity.Value}&baromin={inHg}&ID={stationId}&PASSWORD={key}";

                log.Info($"URI: {uri}");
                var response = await http.GetAsync(uri);

                if (response.IsSuccessStatusCode)
                {
                    log.Info($"Measurement posted succesfully. {response.StatusCode} - {response.ReasonPhrase}");
                    success = true;
                }
                else
                {
                    log.Error($"ERROR posting measurement: {response.StatusCode} - {response.ReasonPhrase}");
                    success = false;
                }
            }

            return(success);
        }
Esempio n. 4
0
        public static void Run(
            [QueueTrigger("%QUEUE_TABLESTORAGE%", Connection = "StorageConnectionString")] NetatmoStationData stationData,
            [Table("%TABLE_MEASUREMENTS%", Connection = "StorageConnectionString")] ICollector <TableStorageMeasurement> tableStorage,
            TraceWriter log)
        {
            foreach (var device in stationData.Body?.Devices)
            {
                log.Info($"Device {device.Id}");

                foreach (var module in device.Modules)
                {
                    log.Info($"Module {module.Id}");
                    var data = module.DashboardData;

                    var moduleDataToStore = CreateModuleDto(device, module, data);
                    tableStorage.Add(moduleDataToStore);
                }

                var deviceDataToStore = CreateDeviceDto(device);
                tableStorage.Add(deviceDataToStore);
            }
        }
        /// <summary>
        /// Create the JSON-object to post to the API.
        /// </summary>
        /// <param name="netatmoData">Measurements from Netatmo</param>
        /// <param name="owmStationId">OpenWeatherMap station id to post to</param>
        /// <returns>string</returns>
        private static string CreatePostJSON(NetatmoStationData netatmoData, string owmStationId, TraceWriter log)
        {
            DateTime now      = DateTime.UtcNow;
            long     unixTime = ((DateTimeOffset)now).ToUnixTimeSeconds();

            var measurements = new List <OpenWeatherMapMeasurement>()
            {
                new OpenWeatherMapMeasurement()
                {
                    StationId = owmStationId,
                }
            };

            var timestamp   = netatmoData.Body?.Devices?[0]?.Modules?[0]?.DashboardData?.TimeUtc;
            var temperature = netatmoData.Body?.Devices?[0]?.Modules?[0]?.DashboardData?.Temperature;
            var humidity    = netatmoData.Body?.Devices?[0]?.Modules?[0]?.DashboardData?.Humidity;

            if (timestamp.HasValue)
            {
                measurements[0].Dt = timestamp.Value;
            }
            else
            {
                log.Error($"No timestamp on measurements, cannot send");
                return(string.Empty);
            }
            if (temperature.HasValue)
            {
                measurements[0].Temperature = temperature.Value;
            }
            if (humidity.HasValue)
            {
                measurements[0].Humidity = humidity.Value;
            }

            return(JsonExtensions.ToJson(measurements));
        }
Esempio n. 6
0
        /// <summary>
        /// Get weather station data from the Netatmo API
        /// </summary>
        /// <param name="accessToken">Access token for the API.</param>
        /// <param name="netatmoStationId">Netatmo station ID</param>
        /// <param name="log">TraceWriter to log to.</param>
        /// <returns>NetatmoStationData</returns>
        private static async Task <NetatmoStationData> GetStationData(string accessToken, string netatmoStationId, TraceWriter log)
        {
            NetatmoStationData data = null;

            log.Info($"Getting weather data from Netatmo station {netatmoStationId}");
            using (var http = new HttpClient())
            {
                var uri = $"{NetatmoUriGetStationData}?access_token={accessToken}&device_id={netatmoStationId}";

                var response = await http.GetAsync(uri);

                if (response.IsSuccessStatusCode)
                {
                    var json = await response.Content.ReadAsStringAsync();

                    data = NetatmoStationData.FromJson(json);
                }
                else
                {
                    log.Error($"ERROR getting the access token: HTTP Status {response.StatusCode} - {response.ReasonPhrase}");
                }
            }
            return(data);
        }