public Response<Node> GetNode(string nodeId)
        {
            var stopWatch = new Stopwatch();

            stopWatch.Start();

            var response = new Response<Node> {Results = new Dictionary<string, Node>()};

            foreach (var serviceType in _things)
            {
                var name = serviceType.GetType().FullName;
                var data = serviceType.GetNode(byte.Parse(nodeId));

                if (data == null) continue;

                var node = new Node
                {
                    HomeId = data.HomeId,
                    Id = data.Id,
                    Label = data.Label,
                    Location = data.Location,
                    Manufacturer = data.Manufacturer,
                    Name = data.Name,
                    Product = data.Product,
                    Values =
                        data.Values.Select(
                            v =>
                                new Value
                                {
                                    Properties = new ValueProperties
                                    {
                                        Help = v.Properties.Help,
                                        Value = v.Properties.Value,
                                        PollingEnabled = v.Properties.PollingEnabled,
                                        Units = v.Properties.Units,
                                        Label = v.Properties.Label,
                                        CommandClassId = v.Properties.CommandClassId,
                                        GenreId = v.Properties.GenreId,
                                        HomeId = v.Properties.HomeId,
                                        Id = v.Properties.Id,
                                        TypeId = v.Properties.TypeId,
                                        NodeId = v.Properties.NodeId,
                                        Index = v.Properties.Index,
                                        Instance = v.Properties.Instance
                                    }
                                }).ToList()
                };

                response.Results.Add(name, node);
            }

            response.Count = response.Results.Count();

            stopWatch.Stop();

            response.ResponseTime = stopWatch.ElapsedMilliseconds;

            return response;
        }
        public IEnumerable<Node> GetNodes()
        {
            var nodes = new List<Node>();

            if (!_zwave.IsNetworkReady) return null;
            if (_zwave.Nodes == null) return null;

            foreach (var node in _zwave.Nodes)
            {
                var Node = new Node
                {
                    HomeId = node.HomeId,
                    Id = node.Id.ToString(),
                    Label = node.Label,
                    Location = node.Location,
                    Manufacturer = node.Manufacturer,
                    Name = node.Name,
                    Product = node.Product
                };

                foreach (var value in node.Values)
                {
                    if (Node.Values == null)
                    {
                        Node.Values = new List<Value>();
                    }

                    Node.Values.Add(new Value
                    {
                        Properties = new ValueProperties
                        {
                            Help = value.Properties.Help,
                            Value = value.Properties.Value,
                            PollingEnabled = value.Properties.PollingEnabled,
                            Units = value.Properties.Units,
                            Label = value.Properties.Label,
                            CommandClassId = value.Properties.CommandClassId,
                            GenreId =
                                (ValueProperties.ValueGenre)
                                    Enum.Parse(typeof (ValueProperties.ValueGenre),
                                        Enum.GetName(typeof (ZWValueID.ValueGenre),
                                            value.Properties.Genre)),
                            HomeId = value.Properties.HomeId.ToString(),
                            Id = value.Properties.Id.ToString(),
                            Index = value.Properties.Index,
                            Instance = value.Properties.Instance,
                            NodeId = value.Properties.NodeId,
                            TypeId =
                                (ValueProperties.ValueType)
                                    Enum.Parse(typeof (ValueProperties.ValueType),
                                        Enum.GetName(typeof (ZWValueID.ValueType), value.Properties.Type))
                        }
                    });
                }

                nodes.Add(Node);
            }

            return nodes;
        }
        private static IEnumerable<Node> LoadThermostats(IEnumerable<Thermostat> thermostats, Dictionary<string, List<string>> groups)
        {
            var nodes = new List<Node>();

            foreach (var t in thermostats)
            {
                var Node = new Node
                {
                    HomeId = 0,
                    Id = t.Id.ToString(),
                    Label = t.Name,
                    Name = t.Label,
                    Values = new List<Value>()
                };

                foreach (var @group in from @group in groups from id in @group.Value.Where(id => id == Node.Id) select @group)
                {
                    Node.Location = @group.Key;
                }

                Node.Values.Add(new Value
                {
                    Properties =
                        new ValueProperties
                        {
                            CommandClassId =
                                global::Things.Types.Enums.CommandClass.COMMAND_CLASS_SENSOR_MULTILEVEL,
                            Label = "Temperature",
                            Value = t.Value,
                            GenreId = ValueProperties.ValueGenre.User,
                            TypeId = ValueProperties.ValueType.Decimal
                        }
                });

                Node.Values.Add(new Value
                {
                    Properties =
                        new ValueProperties
                        {
                            CommandClassId =
                                global::Things.Types.Enums.CommandClass.COMMAND_CLASS_SENSOR_MULTILEVEL,
                            Label = "Humidity",
                            Value = t.Humidity.ToString(),
                            GenreId = ValueProperties.ValueGenre.User,
                            TypeId = ValueProperties.ValueType.Decimal
                        }
                });

                Node.Values.Add(new Value
                {
                    Properties =
                        new ValueProperties
                        {
                            CommandClassId =
                                global::Things.Types.Enums.CommandClass.COMMAND_CLASS_THERMOSTAT_SETPOINT,
                            Label = "CoolingSetpoint",
                            Value = t.CoolingSetpoint.ToString(),
                            GenreId = ValueProperties.ValueGenre.User,
                            TypeId = ValueProperties.ValueType.Decimal
                        }
                });

                Node.Values.Add(new Value
                {
                    Properties =
                        new ValueProperties
                        {
                            CommandClassId =
                                global::Things.Types.Enums.CommandClass.COMMAND_CLASS_THERMOSTAT_SETPOINT,
                            Label = "HeatingSetpoint",
                            Value = t.HeatingSetpoint.ToString(),
                            GenreId = ValueProperties.ValueGenre.User,
                            TypeId = ValueProperties.ValueType.Decimal
                        }
                });

                Node.Values.Add(new Value
                {
                    Properties =
                        new ValueProperties
                        {
                            CommandClassId =
                                global::Things.Types.Enums.CommandClass.COMMAND_CLASS_THERMOSTAT_SETPOINT,
                            Label = "ThermostatSetpoint",
                            Value = t.ThermostatSetpoint.ToString(),
                            GenreId = ValueProperties.ValueGenre.User,
                            TypeId = ValueProperties.ValueType.Decimal
                        }
                });

                Node.Values.Add(new Value
                {
                    Properties =
                        new ValueProperties
                        {
                            CommandClassId =
                                global::Things.Types.Enums.CommandClass.COMMAND_CLASS_THERMOSTAT_FAN_MODE,
                            Label = "FanMode",
                            Value = t.FanMode.ToString(),
                            GenreId = ValueProperties.ValueGenre.User,
                            TypeId = ValueProperties.ValueType.String
                        }
                });

                Node.Values.Add(new Value
                {
                    Properties =
                        new ValueProperties
                        {
                            CommandClassId =
                                global::Things.Types.Enums.CommandClass.COMMAND_CLASS_THERMOSTAT_OPERATING_STATE,
                            Label = "OperatingState",
                            Value = t.OperatingState.ToString(),
                            GenreId = ValueProperties.ValueGenre.User,
                            TypeId = ValueProperties.ValueType.String
                        }
                });

                Node.Values.Add(new Value
                {
                    Properties =
                        new ValueProperties
                        {
                            CommandClassId =
                                global::Things.Types.Enums.CommandClass.COMMAND_CLASS_THERMOSTAT_MODE,
                            Label = "Mode",
                            Value = t.Mode.ToString(),
                            GenreId = ValueProperties.ValueGenre.User,
                            TypeId = ValueProperties.ValueType.String
                        }
                });

                Node.Values.Add(new Value
                {
                    Properties =
                        new ValueProperties
                        {
                            CommandClassId =
                                global::Things.Types.Enums.CommandClass.COMMAND_CLASS_BATTERY,
                            Value = t.Battery.ToString(),
                            GenreId = ValueProperties.ValueGenre.User,
                            TypeId = ValueProperties.ValueType.Decimal
                        }
                });

                nodes.Add(Node);
            }

            return nodes;
        }
        private static IEnumerable<Node> LoadSwitches(IEnumerable<Switch> switches, Dictionary<string, List<string>> groups)
        {
            var nodes = new List<Node>();

            foreach (var s in switches)
            {
                var Node = new Node
                {
                    HomeId = 0,
                    Id = s.Id.ToString(),
                    Label = s.Name,
                    Name = s.Label,
                    Values = new List<Value>()
                };

                foreach (var @group in from @group in groups from id in @group.Value.Where(id => id == Node.Id) select @group)
                {
                    Node.Location = @group.Key;
                }

                Node.Values.Add(new Value
                {
                    Properties =
                        new ValueProperties
                        {
                            Id = "",
                            CommandClassId =
                                global::Things.Types.Enums.CommandClass.COMMAND_CLASS_SWITCH_BINARY,
                            Value = s.Value == "on" ? "true" : "false",
                            GenreId = ValueProperties.ValueGenre.User,
                            TypeId = ValueProperties.ValueType.Bool
                        }
                });

                nodes.Add(Node);
            }

            return nodes;
        }
        private static IEnumerable<Node> LoadSirens(IEnumerable<Siren> sirens, Dictionary<string, List<string>> groups)
        {
            var nodes = new List<Node>();

            foreach (var s in sirens)
            {
                var Node = new Node
                {
                    HomeId = 0,
                    Id = s.Id.ToString(),
                    Label = s.Name,
                    Name = s.Label,
                    Values = new List<Value>()
                };

                foreach (var @group in from @group in groups from id in @group.Value.Where(id => id == Node.Id) select @group)
                {
                    Node.Location = @group.Key;
                }

                Node.Values.Add(new Value
                {
                    Properties =
                        new ValueProperties
                        {
                            CommandClassId =
                                global::Things.Types.Enums.CommandClass.COMMAND_CLASS_ALARM,
                            Value = s.Value,
                            GenreId = ValueProperties.ValueGenre.User,
                            TypeId = ValueProperties.ValueType.String
                        }
                });

                Node.Values.Add(new Value
                {
                    Properties =
                        new ValueProperties
                        {
                            CommandClassId =
                                global::Things.Types.Enums.CommandClass.COMMAND_CLASS_BATTERY,
                            Value = s.Battery.ToString(),
                            GenreId = ValueProperties.ValueGenre.User,
                            TypeId = ValueProperties.ValueType.Decimal
                        }
                });

                nodes.Add(Node);
            }

            return nodes;
        }
        private static IEnumerable<Node> LoadMotions(IEnumerable<Motion> motions, Dictionary<string, List<string>> groups)
        {
            var nodes = new List<Node>();

            foreach (var m in motions)
            {
                var Node = new Node
                {
                    HomeId = 0,
                    Id = m.Id.ToString(),
                    Label = m.Name,
                    Name = m.Label,
                    Values = new List<Value>()
                };

                foreach (var @group in from @group in groups from id in @group.Value.Where(id => id == Node.Id) select @group)
                {
                    Node.Location = @group.Key;
                }

                Node.Values.Add(new Value
                {
                    Properties =
                        new ValueProperties
                        {
                            CommandClassId =
                                global::Things.Types.Enums.CommandClass.COMMAND_CLASS_SENSOR_BINARY,
                            Value = m.Value == "active" ? "true" : "false",
                            GenreId = ValueProperties.ValueGenre.User,
                            TypeId = ValueProperties.ValueType.Bool
                        }
                });

                Node.Values.Add(new Value
                {
                    Properties =
                        new ValueProperties
                        {
                            CommandClassId =
                                global::Things.Types.Enums.CommandClass.COMMAND_CLASS_BATTERY,
                            Value = m.Battery.ToString(),
                            GenreId = ValueProperties.ValueGenre.User,
                            TypeId = ValueProperties.ValueType.Decimal
                        }
                });

                nodes.Add(Node);
            }

            return nodes;
        }