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 }));
        }
Esempio n. 2
0
        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
                }
            }
        }