Beispiel #1
0
        public static async Task Run(ILogger logger = null)
        {
            if (logger == null)
            {
                var loggerFactory = LoggerFactory.Create(builder =>
                {
                    builder.AddConsole();
                });

                logger = loggerFactory.CreateLogger <LightsCore>();
            }

            httpClient = new HttpClient();
            SunsetClient sunsetClient = new SunsetClient(httpClient);
            LifxClient   lifxClient   = new LifxClient(httpClient);

            var getAllLightsTask = lifxClient.GetAllLights();

            int desiredKelvin = await GetDesiredKelvin(sunsetClient, logger);

            logger.LogInformation($"Desired kelvin: {desiredKelvin}");

            var changes         = new List <State>();
            var allLightsResult = await getAllLightsTask;

            foreach (Light light in allLightsResult)
            {
                if (light.Color.Kelvin == desiredKelvin)
                {
                    logger.LogInformation($"Skipping {light.Label} because Kelvin is already {desiredKelvin}.");
                }
                else if (light.Color.Saturation > 0)
                {
                    logger.LogInformation($"Skipping {light.Label} because saturation is greater than zero ({light.Color.Saturation}) indicating a custom colour is set.");
                }
                else
                {
                    logger.LogInformation($"Changing {light.Label} from {light.Color.Kelvin} to {desiredKelvin}");
                    changes.Add(new State()
                    {
                        Selector = $"label:{light.Label}",
                        Color    = $"kelvin:{desiredKelvin}"
                    });
                }
            }

            if (changes.Any())
            {
                var states = new States()
                {
                    Fast      = true, // See https://api.developer.lifx.com/v1/docs/set-state#fast-mode
                    StateList = changes
                };

                await lifxClient.PutStates(states);
            }
        }
Beispiel #2
0
        private static async Task <int> GetDesiredKelvin(SunsetClient sunsetClient, ILogger logger)
        {
            var sunsetSunrise = await sunsetClient.GetSeattleSunsetTime();

            TimeSpan endSunriseTime   = sunsetSunrise.Sunrise;
            TimeSpan beginSunriseTime = endSunriseTime.Add(TimeSpan.FromHours(-2));

            TimeSpan endSunsetTime   = sunsetSunrise.Sunset;
            TimeSpan beginSunsetTime = endSunsetTime.Add(TimeSpan.FromHours(-2));
            TimeSpan now             = TimeZoneInfo.ConvertTimeFromUtc(
                DateTime.UtcNow,
                TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"))
                                       .TimeOfDay;

            logger.LogInformation($"Time now: {now}, sunrise: {endSunriseTime}, sunset: {endSunsetTime}.");

            if (now < beginSunriseTime)
            {
                return(LIGHT_KELVIN_LOW);
            }
            else if (now < endSunriseTime)
            {
                return((int)Map(now.Ticks, beginSunriseTime.Ticks, endSunriseTime.Ticks, LIGHT_KELVIN_LOW, LIGHT_KELVIN_HIGH));
            }
            else if (now < beginSunsetTime)
            {
                return(LIGHT_KELVIN_HIGH);
            }
            else if (now < endSunsetTime)
            {
                return((int)Map(now.Ticks, beginSunsetTime.Ticks, endSunsetTime.Ticks, LIGHT_KELVIN_HIGH, LIGHT_KELVIN_LOW));
            }
            else
            {
                return(LIGHT_KELVIN_LOW);
            }
        }