protected PhilipsHueDevice(string index, string id, string name, PhilipsHueBridge bridge)
 {
     Id      = id;
     Name    = name;
     _index  = index;
     _bridge = bridge;
 }
        private async Task FindSensorsAsync(LocalHueClient client, PhilipsHueBridge bridge)
        {
            var sensors = await client.GetSensorsAsync();

            if (sensors != null)
            {
                foreach (var sensor in sensors)
                {
                    switch (sensor.Type.ToLowerInvariant())
                    {
                    case "zllpresence":
                        HandleZllPresenceSensor(sensor, bridge);
                        break;

                    case "zgpswitch":
                        HandleZgpSwitch(sensor, bridge);
                        break;

                    case "zllswitch":
                        HandleZllSwitch(sensor, bridge);
                        break;

                    default:
                        Debug.WriteLine(sensor.Type);
                        break;
                    }
                }
            }
        }
        private async Task <string> GetApiKeyWithBridgeButtonClick(PhilipsHueBridge bridge)
        {
            var endTime = DateTime.UtcNow.AddSeconds(30);
            var client  = new LocalHueClient(bridge.IpAddress);

            while (DateTime.UtcNow < endTime)
            {
                try
                {
                    var machineName = Environment.MachineName.Replace(' ', '_');

                    if (machineName.Length > 19)
                    {
                        machineName = machineName.Substring(0, 19);
                    }

                    var appKey = await client.RegisterAsync("Xpressive.Home", machineName);

                    return(appKey);
                }
                catch { }

                await Task.Delay(TimeSpan.FromSeconds(1));
            }

            return(null);
        }
        private async Task HandleHueBridge(PhilipsHueBridge bridge)
        {
            var variableName = $"PhilipsHue.{bridge.Id}.ApiKey";
            var apiKey       = _variableRepository.Get <StringVariable>(variableName)?.Value;

            if (string.IsNullOrEmpty(apiKey))
            {
                _messageQueue.Publish(new NotifyUserMessage("Found new Philips Hue Bridge. Please press the Button to connect."));
                apiKey = await GetApiKeyWithBridgeButtonClick(bridge);

                if (string.IsNullOrEmpty(apiKey))
                {
                    lock (_lock)
                    {
                        _bridges.Remove(bridge.Id);
                    }

                    return;
                }

                _messageQueue.Publish(new UpdateVariableMessage(variableName, apiKey));
            }

            OnBridgeFound(bridge);
        }
        public void Notify(NetworkDeviceFoundMessage message)
        {
            string bridgeId;

            if (!message.Values.TryGetValue("hue-bridgeid", out bridgeId))
            {
                return;
            }

            PhilipsHueBridge bridge;

            bridgeId = bridgeId.ToLowerInvariant();

            lock (_lock)
            {
                if (_bridges.ContainsKey(bridgeId))
                {
                    return;
                }
                bridge             = new PhilipsHueBridge(bridgeId, message.IpAddress);
                _bridges[bridgeId] = bridge;
            }

            Task.Run(() => HandleHueBridge(bridge));
        }
        private LocalHueClient GetClient(PhilipsHueBridge bridge)
        {
            var variableName = $"{Name}.{bridge.Id}.ApiKey";
            var apiKey       = _variableRepository.Get <StringVariable>(variableName).Value;

            return(new LocalHueClient(bridge.IpAddress, apiKey));
        }
        private void HandleZllSwitch(Sensor sensor, PhilipsHueBridge bridge)
        {
            var id     = GetUniqueId(sensor);
            var button = new PhilipsHueButtonSensor(sensor.Id, id, sensor.Name, bridge)
            {
                Model   = sensor.ModelId,
                Type    = sensor.Type,
                Icon    = "PhilipsHueIcon PhilipsHueIcon_ZllSwitch",
                Battery = sensor.Config.Battery ?? 100
            };

            OnButtonSensorFound(button);
        }
        private void HandleZllPresenceSensor(Sensor sensor, PhilipsHueBridge bridge)
        {
            var id           = GetUniqueId(sensor);
            var sensorDevice = new PhilipsHuePresenceSensor(sensor.Id, id, sensor.Name, bridge)
            {
                Model   = sensor.ModelId,
                Type    = sensor.Type,
                Icon    = "PhilipsHueIcon PhilipsHueIcon_PresenceSensor",
                Battery = sensor.Config.Battery ?? 100
            };

            OnPresenceSensorFound(sensorDevice);
        }
        private async Task FindDevices(PhilipsHueBridge bridge)
        {
            try
            {
                var variableName = $"PhilipsHue.{bridge.Id}.ApiKey";
                var apiKey       = _variableRepository.Get <StringVariable>(variableName).Value;

                var client = new LocalHueClient(bridge.IpAddress, apiKey);

                await FindBulbsAsync(client, bridge);
                await FindSensorsAsync(client, bridge);
            }
            catch (Exception e)
            {
                _log.Error($"Unable to get devices ({e.GetType().Name}) {e.Message}");
            }
        }
        private async Task FindBulbsAsync(LocalHueClient client, PhilipsHueBridge bridge)
        {
            var bulbs = await client.GetLightsAsync();

            if (bulbs != null)
            {
                foreach (var light in bulbs)
                {
                    var id   = light.UniqueId.RemoveMacAddressDelimiters();
                    var bulb = new PhilipsHueBulb(light.Id, id, light.Name, bridge)
                    {
                        Icon  = "PhilipsHueIcon PhilipsHueIcon_" + light.ModelId,
                        Model = light.ModelId
                    };

                    OnBulbFound(bulb);
                }
            }
        }
示例#11
0
 public PhilipsHuePresenceSensor(string index, string id, string name, PhilipsHueBridge bridge) : base(index, id, name, bridge)
 {
 }
 private async void OnBridgeFound(object sender, PhilipsHueBridge bridge)
 {
     _bridges.Add(bridge);
     await FindDevices(bridge);
 }
 private void OnBridgeFound(PhilipsHueBridge e)
 {
     BridgeFound?.Invoke(this, e);
 }