public LifxGateway(IMessageQueue messageQueue) : base("Lifx")
        {
            _messageQueue = messageQueue;
            _canCreateDevices = false;
            _token = ConfigurationManager.AppSettings["lifx.token"];

            _localClient.DeviceDiscovered += async (s, e) =>
            {
                lock (_deviceLock)
                {
                    var device = _devices.Cast<LifxDevice>().SingleOrDefault(d => d.Id.Equals(e.Id));

                    if (device == null)
                    {
                        device = new LifxDevice(e);
                        _devices.Add(device);
                    }
                }

                await _localClient.GetLightStateAsync(e);
            };

            _localClient.VariableChanged += (s, e) =>
            {
                var device = _devices.Cast<LifxDevice>().SingleOrDefault(d => d.Id.Equals(e.Item1.Id));

                if (device != null)
                {
                    device.Name = e.Item1.Name;
                }

                var variable = $"{Name}.{e.Item1.Id}.{e.Item2}";
                _messageQueue.Publish(new UpdateVariableMessage(variable, e.Item3));
            };
        }
        public void SwitchOn(LifxDevice device, int transitionTimeInSeconds)
        {
            var parameters = new Dictionary<string, string>
            {
                {"Transition time in seconds", transitionTimeInSeconds.ToString()}
            };

            var action = GetActions(device).Single(a => a.Name.Equals("Switch On", StringComparison.Ordinal));
            StartActionInNewTask(device, action, parameters);
        }
コード例 #3
0
        public void SwitchOn(LifxDevice device, int transitionTimeInSeconds)
        {
            var parameters = new Dictionary <string, string>
            {
                { "Transition time in seconds", transitionTimeInSeconds.ToString() }
            };

            var action = GetActions(device).Single(a => a.Name.Equals("Switch On", StringComparison.Ordinal));

            StartActionInNewTask(device, action, parameters);
        }
コード例 #4
0
        public void ChangeBrightness(LifxDevice device, double brightness, int transitionTimeInSeconds)
        {
            var parameters = new Dictionary <string, string>
            {
                { "Brightness", brightness.ToString("F2") },
                { "Transition time in seconds", transitionTimeInSeconds.ToString() }
            };

            var action = GetActions(device).Single(a => a.Name.Equals("Change Brightness", StringComparison.Ordinal));

            StartActionInNewTask(device, action, parameters);
        }
コード例 #5
0
        private void UpdateDeviceVariables(LifxDevice device, LifxHttpLight light)
        {
            var brightness  = Math.Round(light.Brightness, 2);
            var groupName   = light.Group.Name;
            var name        = light.Label;
            var isOn        = light.Power == LifxHttpLight.PowerState.On;
            var isConnected = light.IsConnected;
            var color       = light.GetHexColor();

            _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "Brightness", brightness));
            _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsOn", isOn));
            _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsConnected", isConnected));
            _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "Name", name));
            _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "GroupName", groupName));
            _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "Color", color));
        }
コード例 #6
0
        private async Task ExecuteCloudAction(LifxDevice device, string action, int seconds, double brightness, string color)
        {
            var client = new LifxHttpClient(_token);
            var lights = await client.GetLights();

            var light = lights.SingleOrDefault(l => l.Id.Equals(device.Id));

            if (light == null)
            {
                return;
            }

            switch (action.ToLowerInvariant())
            {
            case "switch on":
                await client.SwitchOn(light, seconds);

                _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsOn", true));
                break;

            case "switch off":
                await client.SwitchOff(light, seconds);

                _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsOn", false));
                break;

            case "change color":
                var rgb = color.ParseRgb();
                await client.ChangeColor(light, rgb.ToString(), seconds);

                _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsOn", true));
                _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "Color", rgb.ToString()));
                break;

            case "change brightness":
                await client.ChangeBrightness(light, brightness, seconds);

                var db = Math.Round(brightness, 2);
                _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "Brightness", db));
                _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsOn", true));
                break;

            default:
                return;
            }
        }
        private void UpdateDeviceVariables(LifxDevice device, LifxHttpLight light)
        {
            var brightness = Math.Round(light.Brightness, 2);
            var groupName = light.Group.Name;
            var name = light.Label;
            var isOn = light.Power == LifxHttpLight.PowerState.On;
            var isConnected = light.IsConnected;
            var color = light.GetHexColor();

            _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "Brightness", brightness));
            _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsOn", isOn));
            _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsConnected", isConnected));
            _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "Name", name));
            _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "GroupName", groupName));
            _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "Color", color));
        }
        private async Task GetHttpLights()
        {
            var client = new LifxHttpClient(_token);
            var lights = await client.GetLights();

            foreach (var light in lights)
            {
                LifxDevice device;

                lock (_deviceLock)
                {
                    device = _devices.Cast<LifxDevice>().SingleOrDefault(d => d.Id.Equals(light.Id));

                    if (device == null)
                    {
                        device = new LifxDevice(light);
                        _devices.Add(device);
                    }
                }

                UpdateDeviceVariables(device, light);
            }
        }
        private async Task ExecuteCloudAction(LifxDevice device, string action, int seconds, double brightness, string color)
        {
            var client = new LifxHttpClient(_token);
            var lights = await client.GetLights();
            var light = lights.SingleOrDefault(l => l.Id.Equals(device.Id));

            if (light == null)
            {
                return;
            }

            switch (action.ToLowerInvariant())
            {
                case "switch on":
                    await client.SwitchOn(light, seconds);
                    _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsOn", true));
                    break;
                case "switch off":
                    await client.SwitchOff(light, seconds);
                    _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsOn", false));
                    break;
                case "change color":
                    var rgb = color.ParseRgb();
                    await client.ChangeColor(light, rgb.ToString(), seconds);
                    _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsOn", true));
                    _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "Color", rgb.ToString()));
                    break;
                case "change brightness":
                    await client.ChangeBrightness(light, brightness, seconds);
                    var db = Math.Round(brightness, 2);
                    _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "Brightness", db));
                    _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsOn", true));
                    break;
                default:
                    return;
            }
        }
        private async Task ExecuteLocalAction(LifxDevice device, string action, int seconds, double brightness, string color)
        {
            var light = _localClient.Lights.SingleOrDefault(l => l.Id.Equals(device.Id));
            var b = (ushort)(brightness * 65535);

            if (light == null)
            {
                return;
            }

            switch (action.ToLowerInvariant())
            {
                case "switch on":
                    if (seconds == 0)
                    {
                        await _localClient.SetDevicePowerStateAsync(light, true);
                    }
                    else if (seconds > 0)
                    {
                        await _localClient.SetLightPowerAsync(light, TimeSpan.FromSeconds(seconds), true);
                    }
                    _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsOn", true));
                    break;
                case "switch off":
                    if (seconds == 0)
                    {
                        await _localClient.SetDevicePowerStateAsync(light, false);
                    }
                    else if (seconds > 0)
                    {
                        await _localClient.SetLightPowerAsync(light, TimeSpan.FromSeconds(seconds), false);
                    }
                    _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsOn", false));
                    break;
                case "change color":
                    var rgb = color.ParseRgb();
                    var hsb = rgb.ToHsbk();
                    var hue = (ushort)(hsb.Hue * 65535 / 360);
                    var saturation = (ushort) (hsb.Saturation*65535);
                    b = (ushort) (hsb.Brightness*65535);
                    ushort kelvin = 4500;
                    await _localClient.SetColorAsync(light, hue, saturation, b, kelvin, TimeSpan.FromSeconds(seconds));
                    _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsOn", true));
                    _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "Color", rgb.ToString()));
                    break;
                case "change brightness":
                    var hsbk = light.Color;
                    if (hsbk == null)
                    {
                        hsbk = new HsbkColor();
                        hsbk.Hue = 0;
                        hsbk.Saturation = 0;
                        hsbk.Kelvin = 4500;
                    }
                    hue = (ushort) (hsbk.Hue*65535/360);
                    saturation = (ushort) (hsbk.Saturation*65535);
                    await _localClient.SetColorAsync(light, hue, saturation, b, (ushort)hsbk.Kelvin, TimeSpan.FromSeconds(seconds));
                    var db = Math.Round(brightness, 2);
                    _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "Brightness", db));
                    _messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsOn", true));
                    break;
                default:
                    return;
            }
        }
        public void ChangeBrightness(LifxDevice device, double brightness, int transitionTimeInSeconds)
        {
            var parameters = new Dictionary<string, string>
            {
                {"Brightness", brightness.ToString("F2")},
                {"Transition time in seconds", transitionTimeInSeconds.ToString()}
            };

            var action = GetActions(device).Single(a => a.Name.Equals("Change Brightness", StringComparison.Ordinal));
            StartActionInNewTask(device, action, parameters);
        }
コード例 #12
0
 public LifxScriptObject(ILifxGateway gateway, LifxDevice device)
 {
     _gateway = gateway;
     _device  = device;
 }
 public LifxScriptObject(ILifxGateway gateway, LifxDevice device)
 {
     _gateway = gateway;
     _device = device;
 }
コード例 #14
0
        private async Task ExecuteLocalAction(LifxDevice device, string action, int seconds, double brightness, string color)
        {
            var light = _localClient.Lights.SingleOrDefault(l => l.Id.Equals(device.Id));
            var b     = (ushort)(brightness * 65535);

            if (light == null)
            {
                return;
            }

            var hsbk = light.Color;

            if (hsbk == null)
            {
                hsbk = new HsbkColor
                {
                    Kelvin = 4500
                };
            }

            switch (action.ToLowerInvariant())
            {
            case "switch on":
                if (seconds == 0)
                {
                    await _localClient.SetPowerAsync(light, true);
                }
                else if (seconds > 0)
                {
                    await _localClient.SetPowerAsync(light, TimeSpan.FromSeconds(seconds), true);
                }
                //_messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsOn", true));
                break;

            case "switch off":
                if (seconds == 0)
                {
                    await _localClient.SetPowerAsync(light, false);
                }
                else if (seconds > 0)
                {
                    await _localClient.SetPowerAsync(light, TimeSpan.FromSeconds(seconds), false);
                }
                //_messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsOn", false));
                break;

            case "change color":
                var rgb = color.ParseRgb();
                var hsb = rgb.ToHsbk();

                hsbk.Hue        = hsb.Hue;
                hsbk.Saturation = hsb.Saturation;
                hsbk.Brightness = hsb.Brightness;

                await _localClient.SetColorAsync(light, hsbk, TimeSpan.FromSeconds(seconds));

                //_messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsOn", true));
                //_messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "Color", rgb.ToString()));
                break;

            case "change brightness":
                hsbk.Brightness = brightness;

                await _localClient.SetColorAsync(light, hsbk, TimeSpan.FromSeconds(seconds));

                //var db = Math.Round(brightness, 2);
                //_messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "Brightness", db));
                //_messageQueue.Publish(new UpdateVariableMessage(Name, device.Id, "IsOn", true));
                break;

            default:
                return;
            }
        }