public async Task <HttpResponseMessage> Get(string latitude, string longitude, int sunriseTimeOffsetMinutes = 0, int sunsetTimeOffsetMinutes = 0) { var sunriseSunsetInfo = await SunriseSunsetRestClient.GetSunriseSunsetInfo(latitude, longitude); bool daylight = false; if (sunriseSunsetInfo != null) { var adjustedSunrise = sunriseSunsetInfo.Sunrise.AddMinutes(sunriseTimeOffsetMinutes); var adjustedSunset = sunriseSunsetInfo.Sunset.AddMinutes(sunsetTimeOffsetMinutes); daylight = (DateTimeOffset.UtcNow >= adjustedSunrise && DateTimeOffset.UtcNow < adjustedSunset); } return(Request.CreateResponse(HttpStatusCode.OK, new { daylight })); }
public override void Run() { var latitude = CloudConfigurationManager.GetSetting("Latitude"); var longitude = CloudConfigurationManager.GetSetting("Longitude"); var timeZoneId = CloudConfigurationManager.GetSetting("TimeZoneName"); var sunriseTimeOffsetMinutes = int.Parse(CloudConfigurationManager.GetSetting("SunriseTimeOffsetMinutes")); var sunsetTimeOffsetMinutes = int.Parse(CloudConfigurationManager.GetSetting("SunsetTimeOffsetMinutes")); var light = Light.Unknown; SunriseSunset sunriseSunsetInfo = null; // figure out the UTC value of 4am in the configured time zone var dailyCheckTimeLocal = new DateTime(DateTimeOffset.UtcNow.Year, DateTimeOffset.UtcNow.Month, DateTimeOffset.UtcNow.Day, 4, 0, 0); var timeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); var dailyCheckTimeUtc = TimeZoneInfo.ConvertTimeToUtc(dailyCheckTimeLocal, timeZone); while (!_completedEvent.WaitOne(1000)) { try { // check on startup or everyday at 4am local time if (sunriseSunsetInfo == null || ((sunriseSunsetInfo.Sunrise.Day < DateTimeOffset.UtcNow.Day || sunriseSunsetInfo.Sunrise.Month < DateTimeOffset.UtcNow.Month || sunriseSunsetInfo.Sunrise.Year < DateTimeOffset.UtcNow.Year) && DateTimeOffset.UtcNow.Hour == dailyCheckTimeUtc.Hour)) { // use a temp variable that way if the call fails after 3 tries but we still have // data from a previous successful call we can still use that for (var i = 0; i < 3; i++) { var tmpSunriseSunsetInfo = SunriseSunsetRestClient.GetSunriseSunsetInfo(latitude, longitude).Result; if (tmpSunriseSunsetInfo != null) { sunriseSunsetInfo = tmpSunriseSunsetInfo; Trace.TraceInformation(string.Format("Today's sunrise is at {0} UTC and sunset is at {1} UTC", sunriseSunsetInfo.Sunrise.ToString("h:mm tt"), sunriseSunsetInfo.Sunset.ToString("h:mm tt"))); break; } Trace.TraceError("Error trying to get sunrise/sunset data, retrying..."); Thread.Sleep(30000); // wait 30 seconds and try again } } if (sunriseSunsetInfo == null) { throw new Exception("Failed to get sunrise/sunset data after 3 retries"); } var adjustedSunrise = sunriseSunsetInfo.Sunrise.AddMinutes(sunriseTimeOffsetMinutes); var adjustedSunset = sunriseSunsetInfo.Sunset.AddMinutes(sunsetTimeOffsetMinutes); var daytime = (DateTimeOffset.UtcNow >= adjustedSunrise && DateTimeOffset.UtcNow < adjustedSunset); if (daytime) { if (light != Light.Off) { // turn light off Trace.TraceInformation("Turning light off"); PublishLightState(Light.Off); light = Light.Off; } } else { if (light != Light.On) { // turn light on Trace.TraceInformation("Turning light on"); PublishLightState(Light.On); light = Light.On; } } } catch (Exception ex) { Trace.TraceError("Error: " + ex.Message); Thread.Sleep(TimeSpan.FromMinutes(1)); // throttle down in case this is a recurring error } } }