/// <summary>
        /// Get all access points of a specific gateway bulb.
        /// </summary>
        public static void ScanAccessPoints(this ILifxNetwork network, string ipAddress)
        {
            var command = PacketFactory.GetCommand(CommandType.GetAccessPoints);
            var gateway = new Gateway(new byte[6], ipAddress);

            ((LifxNetwork)network).SendCommand(gateway, command);
        }
        public static IBulbGroup AddGroup(this ILifxNetwork network, string name)
        {
            var n     = (LifxNetwork)network;
            var group = n.CreateGroup();

            group.Name = name;
            return(group);
        }
        private static void SetPowerState(ILifxNetwork network, IBulb bulb, bool isPowerOn)
        {
            var command = (SetPowerState)PacketFactory.GetCommand(CommandType.SetPowerState);

            command.Init(isPowerOn);

            ((LifxNetwork)network).SendCommand(bulb, command);

            ((Bulb)bulb).IsPowerOn = isPowerOn;
        }
        private static void Waveform(this ILifxNetwork network, IBulb bulb, IColor color, double cycleDurationInSeconds, float cycles, WaveformType waveform)
        {
            var command = (SetWaveForm)PacketFactory.GetCommand(CommandType.SetWaveform);
            var c       = color.ToHsv();
            var period  = (uint)cycleDurationInSeconds * 1000;

            command.Init((ushort)c.Hue, (ushort)(c.Saturation * 100), (ushort)(c.Brightness * 255), (ushort)c.Kelvin, period, cycles, 0, waveform);

            ((LifxNetwork)network).SendCommand(bulb, command);
        }
 public static void ReadBulbInfo(this ILifxNetwork network, IBulb bulb)
 {
     ((LifxNetwork)network).SendCommand(bulb, PacketFactory.GetCommand(CommandType.GetInfo));
     ((LifxNetwork)network).SendCommand(bulb, PacketFactory.GetCommand(CommandType.GetMeshFirmware));
     ((LifxNetwork)network).SendCommand(bulb, PacketFactory.GetCommand(CommandType.GetMeshInfo));
     ((LifxNetwork)network).SendCommand(bulb, PacketFactory.GetCommand(CommandType.GetTime));
     ((LifxNetwork)network).SendCommand(bulb, PacketFactory.GetCommand(CommandType.GetVersion));
     ((LifxNetwork)network).SendCommand(bulb, PacketFactory.GetCommand(CommandType.GetWifiFirmwareState));
     ((LifxNetwork)network).SendCommand(bulb, PacketFactory.GetCommand(CommandType.GetWifiInfo));
 }
        public static void RenameBulb(this ILifxNetwork network, IBulb bulb, string name)
        {
            var command = (SetBulbLabel)PacketFactory.GetCommand(CommandType.SetBulbLabel);

            command.Init(name);

            ((LifxNetwork)network).SendCommand(bulb, command);

            ((Bulb)bulb).Name = name;
        }
        public static void RemoveBulbFromGroup(this ILifxNetwork network, IBulbGroup bulbGroup, IBulb bulb)
        {
            var n     = (LifxNetwork)network;
            var group = (BulbGroup)bulbGroup;

            group.Remove(bulb);

            var groups = n.Groups.Where(g => g.Contains(bulb)).ToList();

            SetGroups(n, bulb, groups);
        }
        public static void ChangeColor(this ILifxNetwork network, IBulb bulb, IColor color, double fadeTimeInSeconds)
        {
            var command = (SetLightColor)PacketFactory.GetCommand(CommandType.SetLightColor);
            var c       = color.ToHsv();

            command.Init((ushort)c.Hue, (ushort)(c.Saturation * 100), (ushort)(c.Brightness * 255), (ushort)color.Kelvin, (uint)(fadeTimeInSeconds * 1000));

            ((LifxNetwork)network).SendCommand(bulb, command);

            ((Bulb)bulb).Color = c;
        }
        public static void SetAccessPoint(this ILifxNetwork network, IGateway gateway, IAccessPoint accessPoint, string password)
        {
            var n       = (LifxNetwork)network;
            var command = (SetAccessPoint)PacketFactory.GetCommand(CommandType.SetAccessPoint);
            var ap      = (AccessPoint)accessPoint;

            command.Init(ap.Packet, password);

            n.SendCommand(gateway, command);
            n.SendCommand(gateway, PacketFactory.GetCommand(CommandType.GetWifiState));
        }
        public static void RenameGroup(this ILifxNetwork network, IBulbGroup bulbGroup, string name)
        {
            var n     = (LifxNetwork)network;
            var group = (BulbGroup)bulbGroup;

            group.Name = name;

            foreach (var bulb in group.GetBulbs())
            {
                UpdateGroupName(n, group, bulb);
            }
        }
        /// <summary>
        /// Search for gateways. If a new gateway is found, it will be scanned for new bulbs.
        /// </summary>
        public static void ScanNetwork(this ILifxNetwork network, string ipAddress)
        {
            var gateways = GatewayService.Get();

            foreach (var g in gateways)
            {
                ScanGateway(network, g);
            }

            var command = PacketFactory.GetCommand(CommandType.GetPanGateway);
            var gateway = new Gateway(new byte[6], ipAddress);

            ((LifxNetwork)network).SendCommand(gateway, command);
        }
        public static void RemoveGroup(this ILifxNetwork network, IBulbGroup bulbGroup)
        {
            var n     = (LifxNetwork)network;
            var group = (BulbGroup)bulbGroup;

            n.Remove(group);

            var allGroups = n.Groups.ToList();

            foreach (var bulb in group.GetBulbs())
            {
                var groups = allGroups.Where(g => g.Contains(bulb) && !Equals(g, group)).ToList();
                SetGroups(n, bulb, groups);
            }
        }
        public static void AddBulbToGroup(this ILifxNetwork network, IBulbGroup bulbGroup, IBulb bulb)
        {
            var n     = (LifxNetwork)network;
            var group = (BulbGroup)bulbGroup;

            if (group.Contains(bulb))
            {
                return;
            }

            group.Add(bulb);

            var groups = n.Groups.Where(g => g.Contains(bulb)).ToList();

            SetGroups(n, bulb, groups);

            UpdateGroupName(n, group, bulb);
        }
 public static void SwitchOn(this ILifxNetwork network, IBulb bulb)
 {
     SetPowerState(network, bulb, true);
 }
        /// <summary>
        /// Search for bulbs within the mesh network of the given gateway.
        /// </summary>
        public static void ScanGateway(this ILifxNetwork network, IGateway gateway)
        {
            var command = PacketFactory.GetCommand(CommandType.GetLightState);

            ((LifxNetwork)network).SendCommand(gateway, command);
        }
 public static void Pulse(this ILifxNetwork network, IBulb bulb, IColor color, double cycleDurationInSeconds, float cycles)
 {
     network.Waveform(bulb, color, cycleDurationInSeconds, cycles, WaveformType.Pulse);
 }
 public static void SwitchOff(this ILifxNetwork network, IBulb bulb)
 {
     SetPowerState(network, bulb, false);
 }