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