예제 #1
0
        private void _deviceHandlerCheck(ManufacturerSpecific manufacturerspecs)
        {
            //if (this.DeviceHandler == null)
            {
                List <Type> typelist = _getTypesInNamespace(Assembly.GetExecutingAssembly(), "ZWaveLib.Devices.ProductHandlers.");
                for (int i = 0; i < typelist.Count; i++)
                {
                    //Console.WriteLine(typelist[i].FullName);
                    Type type = Assembly.GetExecutingAssembly().GetType(typelist[i].FullName); // full name - i.e. with namespace (perhaps concatenate)
                    try
                    {
                        IZWaveDeviceHandler devhandler = (IZWaveDeviceHandler)Activator.CreateInstance(type);
                        //
                        if (devhandler.CanHandleProduct(manufacturerspecs))
                        {
                            this.DeviceHandler = devhandler;
                            this.DeviceHandler.SetNodeHost(this);
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        // TODO: add error logging
//                                        Console.WriteLine("ERROR!!!!!!! " + ex.Message + " : " + ex.StackTrace);
                    }
                }
            }
        }
예제 #2
0
 private void CheckDeviceHandler(ZWaveNode node, ManufacturerSpecific manufacturerspecs)
 {
     //if (node.DeviceHandler == null)
     {
         var typeList = GetTypesInNamespace(
             Assembly.GetExecutingAssembly(),
             "ZWaveLib.Devices.ProductHandlers."
             );
         for (int i = 0; i < typeList.Count; i++)
         {
             //Console.WriteLine(typelist[i].FullName);
             Type type = Assembly.GetExecutingAssembly().GetType(typeList[i].FullName); // full name - i.e. with namespace (perhaps concatenate)
             try
             {
                 IZWaveDeviceHandler deviceHandler = (IZWaveDeviceHandler)Activator.CreateInstance(type);
                 //
                 if (deviceHandler.CanHandleProduct(manufacturerspecs))
                 {
                     node.DeviceHandler = deviceHandler;
                     node.DeviceHandler.SetNodeHost(node);
                     SaveNodesConfig();
                     break;
                 }
             }
             catch
             {
                 // TODO: add error logging
                 //Console.WriteLine("ERROR!!!!!!! " + ex.Message + " : " + ex.StackTrace);
             }
         }
     }
 }
예제 #3
0
        private void CheckDeviceHandler(ManufacturerSpecific manufacturerspecs)
        {
            //if (this.DeviceHandler == null)
            {
                var typeList = GetTypesInNamespace(Assembly.GetExecutingAssembly(), "ZWaveLib.Devices.ProductHandlers.");
                for (int i = 0; i < typeList.Count; i++)
                {

                    //Console.WriteLine(typelist[i].FullName);
                    Type type = Assembly.GetExecutingAssembly().GetType(typeList[i].FullName); // full name - i.e. with namespace (perhaps concatenate)
                    try
                    {
                        IZWaveDeviceHandler deviceHandler = (IZWaveDeviceHandler)Activator.CreateInstance(type);
                        //
                        if (deviceHandler.CanHandleProduct(manufacturerspecs))
                        {
                            this.DeviceHandler = deviceHandler;
                            this.DeviceHandler.SetNodeHost(this);
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        // TODO: add error logging
                        //                                        Console.WriteLine("ERROR!!!!!!! " + ex.Message + " : " + ex.StackTrace);
                    }
                }
            }
        }
예제 #4
0
        public virtual bool MessageRequestHandler(byte[] receivedMessage)
        {
            //Console.WriteLine("\n   _z_ [" + this.NodeId + "]  " + (this.DeviceHandler != null ? this.DeviceHandler.ToString() : "!" + this.GenericClass.ToString()));
            //Console.WriteLine("   >>> " + zp.ByteArrayToString(receivedMessage) + "\n");
            // Do nothing
            //if (this.NodeId != 1 && (this.TypeId == null || this.DeviceHandler == null))
            //{
            //    TimeSpan ts = new TimeSpan(DateTime.Now.Ticks - _lastmanufacturerget.Ticks);
            //    if (ts.TotalSeconds > 10)
            //    {
            //        _lastmanufacturerget = DateTime.Now;
            //        ManufacturerSpecific_Get();
            //    }
            //}
            //
            bool handled = false;
            int messageLength = receivedMessage.Length;
            //
            if (this.DeviceHandler != null && this.DeviceHandler.HandleRawMessageRequest(receivedMessage))
            {
                handled = true;
            }
            //
            if (!handled && messageLength > 8)
            {

                byte commandLength = receivedMessage[6];
                byte commandClass = receivedMessage[7];
                byte commandType = receivedMessage[8]; // is this the Payload length in bytes? or is it the command type?
                //
                switch (commandClass)
                {

                    case (byte)CommandClass.COMMAND_CLASS_BASIC:
                    case (byte)CommandClass.COMMAND_CLASS_ALARM:
                    case (byte)CommandClass.COMMAND_CLASS_SENSOR_BINARY:
                    case (byte)CommandClass.COMMAND_CLASS_SENSOR_ALARM:
                    case (byte)CommandClass.COMMAND_CLASS_SENSOR_MULTILEVEL:
                    case (byte)CommandClass.COMMAND_CLASS_SWITCH_BINARY:
                    case (byte)CommandClass.COMMAND_CLASS_SWITCH_MULTILEVEL:
                    case (byte)CommandClass.COMMAND_CLASS_SCENE_ACTIVATION:

                        if (this.DeviceHandler != null)
                        {
                            handled = this.DeviceHandler.HandleBasicReport(receivedMessage);
                        }

                        break;

                    case (byte)CommandClass.COMMAND_CLASS_COONFIGURATION:

                        if (messageLength > 11 && commandType == (byte)Command.COMMAND_CONFIG_REPORT) // CONFIGURATION PARAMETER REPORT  0x06
                        {
                            byte paramId = receivedMessage[9];
                            byte paramLength = receivedMessage[10];
                            //
                            if (!nodeConfigParamsLength.ContainsKey(paramId))
                            {
                                nodeConfigParamsLength.Add(paramId, paramLength);
                            }
                            else
                            {
                                // this shouldn't change on read... but you never know! =)
                                nodeConfigParamsLength[paramId] = paramLength;
                            }
                            //
                            byte[] bval = new byte[4];
                            // extract bytes value
                            Array.Copy(receivedMessage, 11, bval, 4 - (int)paramLength, (int)paramLength);
                            uint paramval = bval[0];
                            Array.Reverse(bval);
                            paramval = BitConverter.ToUInt32(bval, 0);
                            // convert it to uint
                            //
                            RaiseUpdateParameterEvent(this, paramId, ParameterType.PARAMETER_CONFIG, paramval);
                            //
                            handled = true;
                        }

                        break;

                    case (byte)CommandClass.COMMAND_CLASS_ASSOCIATION:

                        if (messageLength > 12 && commandType == (byte)Command.COMMAND_ASSOCIATION_REPORT) // ASSOCIATION REPORT 0x03
                        {
                            byte groupId = receivedMessage[9];
                            byte maxAssociations = receivedMessage[10];
                            byte numAssociations = receivedMessage[11]; // it is always zero ?!?
                            string assocNodes = "";
                            if (receivedMessage.Length > 13)
                            {
                                for (int a = 12; a < receivedMessage.Length - 1; a++)
                                {
                                    assocNodes += receivedMessage[a] + ",";
                                }
                            }
                            assocNodes = assocNodes.TrimEnd(',');
                            //
                            //_raiseUpdateParameterEvent(this, 0, ParameterType.PARAMETER_ASSOC, groupid);
                            RaiseUpdateParameterEvent(this, 1, ParameterType.PARAMETER_ASSOC, maxAssociations);
                            RaiseUpdateParameterEvent(this, 2, ParameterType.PARAMETER_ASSOC, numAssociations);
                            RaiseUpdateParameterEvent(this, 3, ParameterType.PARAMETER_ASSOC, groupId + ":" + assocNodes);
                            //
                            handled = true;
                        }

                        break;

                    case (byte)CommandClass.COMMAND_CLASS_WAKE_UP:

                        if (messageLength > 11 && commandType == (byte)Command.COMMAND_WAKEUP_REPORT) // WAKE UP REPORT 0x06
                        {
                            uint interval = ((uint)receivedMessage[9]) << 16;
                            interval |= (((uint)receivedMessage[10]) << 8);
                            interval |= (uint)receivedMessage[11];
                            //
                            RaiseUpdateParameterEvent(this, 0, ParameterType.PARAMETER_WAKEUP_INTERVAL, interval);
                            //
                            handled = true;
                        }
                        // 0x01, 0x08, 0x00, 0x04, 0x00, 0x06, 0x02, 0x84, 0x07, 0x74
                        else if (messageLength > 7 && commandType == (byte)Command.COMMAND_WAKEUP_NOTIFICATION) // AWAKE NOTIFICATION 0x07
                        {
                            RaiseUpdateParameterEvent(this, 0, ParameterType.PARAMETER_WAKEUP_NOTIFY, 1);
                            //
                            handled = true;
                        }

                        break;

                    case (byte)CommandClass.COMMAND_CLASS_BATTERY:

                        if (messageLength > 7 && /*command_length == (byte)Command.COMMAND_BASIC_REPORT && */ commandType == 0x03) // Battery Report
                        {
                            RaiseUpdateParameterEvent(this, 0, ParameterType.PARAMETER_BATTERY, receivedMessage[9]);
                            //
                            handled = true;
                        }

                        break;

                    case (byte)CommandClass.COMMAND_CLASS_MULTIINSTANCE:
                    case (byte)CommandClass.COMMAND_CLASS_METER:

                        if (messageLength > 10)
                        {
                            if (this.DeviceHandler != null)
                            {
                                handled = this.DeviceHandler.HandleMultiInstanceReport(receivedMessage);
                            }
                        }

                        break;

                    case (byte)CommandClass.COMMAND_CLASS_HAIL:

                        this.Basic_Get();
                        handled = true;

                        break;

                    case (byte)CommandClass.COMMAND_CLASS_THERMOSTAT_FAN_MODE:
                        RaiseUpdateParameterEvent (this, 0, ParameterType.PARAMETER_FAN_MODE, receivedMessage [9]);
                        handled = true;
                        break;
                    case (byte)CommandClass.COMMAND_CLASS_THERMOSTAT_FAN_STATE:
                        RaiseUpdateParameterEvent (this, 0, ParameterType.PARAMETER_FAN_STATE, receivedMessage [9]);
                        handled = true;
                        break;
                    case (byte)CommandClass.COMMAND_CLASS_THERMOSTAT_HEATING:
                        RaiseUpdateParameterEvent (this, 0, ParameterType.PARAMETER_THERMOSTAT_HEATING, receivedMessage [9]);
                        handled = true;
                        break;
                    case (byte)CommandClass.COMMAND_CLASS_THERMOSTAT_MODE:
                        RaiseUpdateParameterEvent (this, 0, ParameterType.PARAMETER_THERMOSTAT_MODE, receivedMessage [9]);
                        handled = true;
                        break;
                    case (byte)CommandClass.COMMAND_CLASS_THERMOSTAT_OPERATING_STATE:
                        RaiseUpdateParameterEvent (this, 0, ParameterType.PARAMETER_THERMOSTAT_OPERATING_STATE, receivedMessage [9]);
                        handled = true;
                        break;
                    case (byte)CommandClass.COMMAND_CLASS_THERMOSTAT_SETBACK:
                        RaiseUpdateParameterEvent (this, 0, ParameterType.PARAMETER_THERMOSTAT_SETBACK, receivedMessage [9]);
                        handled = true;
                        break;

                        /*
                         *
                         * SPI > 01 0C 00 04 00 11 06 43 03 01 2A 02 6C E5
                            2014-06-24T22:01:19.8016380-06:00   HomeAutomation.ZWave    17  ZWave Node  Thermostat.SetPoint 1
                         *
                         **/

                    case (byte)CommandClass.COMMAND_CLASS_THERMOSTAT_SETPOINT:
                        double temp = Sensor.ExtractTemperatureFromBytes(receivedMessage);
                        RaiseUpdateParameterEvent (this, 0, ParameterType.PARAMETER_THERMOSTAT_SETPOINT, temp);
                        handled = true;
                        break;

                    case (byte)CommandClass.COMMAND_CLASS_MANUFACTURER_SPECIFIC:

                        if (messageLength > 14)
                        {
                            byte[] manufacturerId = new byte[2] { receivedMessage[9], receivedMessage[10] };
                            byte[] typeId = new byte[2] { receivedMessage[11], receivedMessage[12] };
                            byte[] productId = new byte[2] { receivedMessage[13], receivedMessage[14] };

                            this.ManufacturerId = zwavePort.ByteArrayToString(manufacturerId).Replace(" ", "");
                            this.TypeId = zwavePort.ByteArrayToString(typeId).Replace(" ", "");
                            this.ProductId = zwavePort.ByteArrayToString(productId).Replace(" ", "");

                            var manufacturerSpecs = new ManufacturerSpecific()
                            {
                                TypeId = zwavePort.ByteArrayToString(typeId).Replace(" ", ""),
                                ProductId = zwavePort.ByteArrayToString(productId).Replace(" ", ""),
                                ManufacturerId = zwavePort.ByteArrayToString(manufacturerId).Replace(" ", "")
                            };
                            //
                            CheckDeviceHandler(manufacturerSpecs);
                            //
                            if (ManufacturerSpecificResponse != null)
                            {
                                try
                                {
                                    ManufacturerSpecificResponse(this, new ManufacturerSpecificResponseEventArg()
                                    {
                                        NodeId = this.NodeId,
                                        ManufacturerSpecific = manufacturerSpecs
                                    });
                                }
                                catch (Exception ex)
                                {

                                    Console.WriteLine("ZWaveLib: Error during ManufacturerSpecificResponse callback, " + ex.Message + "\n" + ex.StackTrace);

                                }
                            }
                            //
                            handled = true;
                            //
                            //Console.WriteLine (" ########################################################################################################### ");
                            //this.SendMessage (new byte[] { 0x01, 0x09, 0x00, 0x13, 0x13, this.NodeId, 0x31, 0x01, 0x25, 0x40, 0xa1 });
                        }

                        break;

                }

            }
            //
            if (!handled && messageLength > 3)
            {
                //if (receivedMessage[3] == 0x13)
                //{
                //    // Check the callback id
                //    if (callbackIds.ContainsKey(receivedMessage[4]))
                //    {
                //        MessagingCompleted(receivedMessage[4]);
                //    }
                //    return true;
                //}
                //else
                if (receivedMessage[3] != 0x13)
                {
                    bool log = true;
                    if (messageLength > 7 && /* cmd_class */ receivedMessage[7] == (byte)CommandClass.COMMAND_CLASS_MANUFACTURER_SPECIFIC) log = false;
                    if (log)
                        Console.WriteLine("ZWaveLib UNHANDLED message: " + zwavePort.ByteArrayToString(receivedMessage));
                }
            }

            return false;
        }
예제 #5
0
        public virtual bool MessageRequestHandler(byte[] receivedMessage)
        {
//Console.WriteLine("\n   _z_ [" + this.NodeId + "]  " + (this.DeviceHandler != null ? this.DeviceHandler.ToString() : "!" + this.GenericClass.ToString()));
//Console.WriteLine("   >>> " + zp.ByteArrayToString(receivedMessage) + "\n");
            // Do nothing
            //if (this.NodeId != 1 && (this.TypeId == null || this.DeviceHandler == null))
            //{
            //    TimeSpan ts = new TimeSpan(DateTime.Now.Ticks - _lastmanufacturerget.Ticks);
            //    if (ts.TotalSeconds > 10)
            //    {
            //        _lastmanufacturerget = DateTime.Now;
            //        ManufacturerSpecific_Get();
            //    }
            //}
            //
            bool handled        = false;
            int  message_length = receivedMessage.Length;

            //
            if (this.DeviceHandler != null && this.DeviceHandler.HandleRawMessageRequest(receivedMessage))
            {
                handled = true;
            }
            //
            if (!handled && message_length > 8)
            {
                byte command_length = receivedMessage[6];
                byte command_class  = receivedMessage[7];
                byte command_type   = receivedMessage[8]; // is this the Payload length in bytes? or is it the command type?
                //
                switch (command_class)
                {
////////////////////////////////////////////////////////////////////////////////////////////////////////////
                case (byte)CommandClass.COMMAND_CLASS_BASIC:
                case (byte)CommandClass.COMMAND_CLASS_ALARM:
                case (byte)CommandClass.COMMAND_CLASS_SENSOR_BINARY:
                case (byte)CommandClass.COMMAND_CLASS_SENSOR_ALARM:
                case (byte)CommandClass.COMMAND_CLASS_SENSOR_MULTILEVEL:
                case (byte)CommandClass.COMMAND_CLASS_SWITCH_BINARY:
                case (byte)CommandClass.COMMAND_CLASS_SWITCH_MULTILEVEL:
                case (byte)CommandClass.COMMAND_CLASS_SCENE_ACTIVATION:
////////////////////////////////////////////////////////////////////////////////////////////////////////////

                    //if (command_type == (byte)Command.COMMAND_BASIC_REPORT || command_type == (byte)Command.COMMAND_BASIC_GET) // command_type should be PayLoad length !?!?
                    //{
                    if (this.DeviceHandler != null)
                    {
                        handled = this.DeviceHandler.HandleBasicReport(receivedMessage);
                    }
                    //}
                    break;

////////////////////////////////////////////////////////////////////////////////////////////////////////////
                case (byte)CommandClass.COMMAND_CLASS_COONFIGURATION:
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                        01 0B 00 04 00 2B 05 70 06 02 01 01 AA

                    if (message_length > 11 && command_type == (byte)Command.COMMAND_CONFIG_REPORT)     // CONFIGURATION PARAMETER REPORT  0x06
                    {
                        byte paramid  = receivedMessage[9];
                        byte paramlen = receivedMessage[10];
                        //
                        if (!_nodeconfigparamslen.ContainsKey(paramid))
                        {
                            _nodeconfigparamslen.Add(paramid, paramlen);
                        }
                        else
                        {
                            // this shouldn't change on read... but you never know! =)
                            _nodeconfigparamslen[paramid] = paramlen;
                        }
                        //
                        byte[] bval = new byte[4];
                        // extract bytes value
                        Array.Copy(receivedMessage, 11, bval, 4 - (int)paramlen, (int)paramlen);
                        uint paramval = bval[0];
                        Array.Reverse(bval);
                        paramval = BitConverter.ToUInt32(bval, 0);
                        // convert it to uint
                        //
                        _raiseUpdateParameterEvent(this, paramid, ParameterType.PARAMETER_CONFIG, paramval);
                        //
                        handled = true;
                    }

                    break;

////////////////////////////////////////////////////////////////////////////////////////////////////////////
                case (byte)CommandClass.COMMAND_CLASS_ASSOCIATION:
////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    //01 0C 00 04 00 2B 06 85 03 01 04 00 01 58

                    if (message_length > 12 && command_type == (byte)Command.COMMAND_ASSOCIATION_REPORT)     // ASSOCIATION REPORT 0x03
                    {
                        byte   groupid    = receivedMessage[9];
                        byte   maxassoc   = receivedMessage[10];
                        byte   numassoc   = receivedMessage[11]; // it is always zero ?!?
                        byte   nodeassoc  = 0;
                        string assocnodes = "";
                        if (receivedMessage.Length > 13)
                        {
                            for (int a = 12; a < receivedMessage.Length - 1; a++)
                            {
                                assocnodes += receivedMessage[a] + ",";
                            }
                        }
                        assocnodes = assocnodes.TrimEnd(',');
                        //
                        //_raiseUpdateParameterEvent(this, 0, ParameterType.PARAMETER_ASSOC, groupid);
                        _raiseUpdateParameterEvent(this, 1, ParameterType.PARAMETER_ASSOC, maxassoc);
                        _raiseUpdateParameterEvent(this, 2, ParameterType.PARAMETER_ASSOC, numassoc);
                        _raiseUpdateParameterEvent(this, 3, ParameterType.PARAMETER_ASSOC, groupid + ":" + assocnodes);
                        //
                        handled = true;
                    }

                    break;

////////////////////////////////////////////////////////////////////////////////////////////////////////////
                case (byte)CommandClass.COMMAND_CLASS_WAKE_UP:
////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    //01 0C 00 04 00 2B 06 84 06 00 01 68 65 54

                    if (message_length > 11 && command_type == (byte)Command.COMMAND_WAKEUP_REPORT)     // WAKE UP REPORT 0x06
                    {
                        uint interval = ((uint)receivedMessage[9]) << 16;
                        interval |= (((uint)receivedMessage[10]) << 8);
                        interval |= (uint)receivedMessage[11];
                        //
                        _raiseUpdateParameterEvent(this, 0, ParameterType.PARAMETER_WAKEUP_INTERVAL, interval);
                        //
                        handled = true;
                    }
                    // 0x01, 0x08, 0x00, 0x04, 0x00, 0x06, 0x02, 0x84, 0x07, 0x74
                    else if (message_length > 7 && command_type == (byte)Command.COMMAND_WAKEUP_NOTIFICATION)     // AWAKE NOTIFICATION 0x07
                    {
                        _raiseUpdateParameterEvent(this, 0, ParameterType.PARAMETER_WAKEUP_NOTIFY, 1);
                        //
                        handled = true;
                    }

                    break;

////////////////////////////////////////////////////////////////////////////////////////////////////////////
                case (byte)CommandClass.COMMAND_CLASS_BATTERY:
////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    // 01 0F 00 04 00 2B 09 80 03 64 31 05 01 2A 03 0B 26
                    if (message_length > 7 && /*command_length == (byte)Command.COMMAND_BASIC_REPORT && */ command_type == 0x03)     // Battery Report
                    {
                        _raiseUpdateParameterEvent(this, 0, ParameterType.PARAMETER_BATTERY, receivedMessage[9]);
                        //
                        handled = true;
                    }

                    break;

////////////////////////////////////////////////////////////////////////////////////////////////////////////
                case (byte)CommandClass.COMMAND_CLASS_MULTIINSTANCE:
                case (byte)CommandClass.COMMAND_CLASS_METER:
////////////////////////////////////////////////////////////////////////////////////////////////////////////

                    if (message_length > 10)
                    {
                        if (this.DeviceHandler != null)
                        {
                            handled = this.DeviceHandler.HandleMultiInstanceReport(receivedMessage);
                        }
                    }

                    break;

////////////////////////////////////////////////////////////////////////////////////////////////////////////
                case (byte)CommandClass.COMMAND_CLASS_MANUFACTURER_SPECIFIC:
////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    if (message_length > 14)
                    {
                        byte[] manufacturerid = new byte[2] {
                            receivedMessage[9], receivedMessage[10]
                        };
                        byte[] typeid = new byte[2] {
                            receivedMessage[11], receivedMessage[12]
                        };
                        byte[] productid = new byte[2] {
                            receivedMessage[13], receivedMessage[14]
                        };

                        this.ManufacturerId = zp.ByteArrayToString(manufacturerid).Replace(" ", "");
                        this.TypeId         = zp.ByteArrayToString(typeid).Replace(" ", "");
                        this.ProductId      = zp.ByteArrayToString(productid).Replace(" ", "");

                        ManufacturerSpecific manufacturerspecs = new ManufacturerSpecific()
                        {
                            TypeId         = zp.ByteArrayToString(typeid).Replace(" ", ""),
                            ProductId      = zp.ByteArrayToString(productid).Replace(" ", ""),
                            ManufacturerId = zp.ByteArrayToString(manufacturerid).Replace(" ", "")
                        };
                        //
                        _deviceHandlerCheck(manufacturerspecs);
                        //
                        if (ManufacturerSpecificResponse != null)
                        {
                            try
                            {
                                ManufacturerSpecificResponse(this, new ManufacturerSpecificResponseEventArg()
                                {
                                    NodeId = this.NodeId,
                                    ManufacturerSpecific = manufacturerspecs
                                });
                            }
                            catch (Exception ex) {
                                Console.WriteLine("ZWaveLib: Error during ManufacturerSpecificResponse callback, " + ex.Message + "\n" + ex.StackTrace);
                            }
                        }
                        //
                        handled = true;
                        //
//Console.WriteLine (" ########################################################################################################### ");
//this.SendMessage (new byte[] { 0x01, 0x09, 0x00, 0x13, 0x13, this.NodeId, 0x31, 0x01, 0x25, 0x40, 0xa1 });
                    }

                    break;
                }
            }
            //
            if (!handled && message_length > 3)
            {
                //if (receivedMessage[3] == 0x13)
                //{
                //    // Check the callback id
                //    if (callbackIds.ContainsKey(receivedMessage[4]))
                //    {
                //        MessagingCompleted(receivedMessage[4]);
                //    }
                //    return true;
                //}
                //else
                if (receivedMessage[3] != 0x13)
                {
                    bool log = true;
                    if (message_length > 7 && /* cmd_class */ receivedMessage[7] == (byte)CommandClass.COMMAND_CLASS_MANUFACTURER_SPECIFIC)
                    {
                        log = false;
                    }
                    if (log)
                    {
                        Console.WriteLine("ZWaveLib UNHANDLED message: " + zp.ByteArrayToString(receivedMessage));
                    }
                }
            }

            return(false);
        }
예제 #6
0
        public virtual bool MessageRequestHandler(byte[] receivedMessage)
        {
            //Console.WriteLine("\n   _z_ [" + this.NodeId + "]  " + (this.DeviceHandler != null ? this.DeviceHandler.ToString() : "!" + this.GenericClass.ToString()));
            //Console.WriteLine("   >>> " + zp.ByteArrayToString(receivedMessage) + "\n");
            //
            bool handled       = false;
            int  messageLength = receivedMessage.Length;

            //
            if (this.DeviceHandler != null && this.DeviceHandler.HandleRawMessageRequest(receivedMessage))
            {
                handled = true;
            }
            //
            // Only generic command classes are handled directly in this function
            // other device specific commands are handled by corresponding DeviceHandler
            //
            if (!handled && messageLength > 8)
            {
                //byte commandLength = receivedMessage[6];
                byte commandClass = receivedMessage[7];
                byte commandType  = receivedMessage[8]; // is this the Payload length in bytes? or is it the command type?
                //
                switch (commandClass)
                {
                case (byte)CommandClass.COMMAND_CLASS_BASIC:
                case (byte)CommandClass.COMMAND_CLASS_ALARM:
                case (byte)CommandClass.COMMAND_CLASS_SENSOR_BINARY:
                case (byte)CommandClass.COMMAND_CLASS_SENSOR_ALARM:
                case (byte)CommandClass.COMMAND_CLASS_SENSOR_MULTILEVEL:
                case (byte)CommandClass.COMMAND_CLASS_SWITCH_BINARY:
                case (byte)CommandClass.COMMAND_CLASS_SWITCH_MULTILEVEL:
                case (byte)CommandClass.COMMAND_CLASS_SCENE_ACTIVATION:
                case (byte)CommandClass.COMMAND_CLASS_THERMOSTAT_MODE:
                case (byte)CommandClass.COMMAND_CLASS_THERMOSTAT_FAN_MODE:
                case (byte)CommandClass.COMMAND_CLASS_THERMOSTAT_FAN_STATE:
                case (byte)CommandClass.COMMAND_CLASS_THERMOSTAT_HEATING:
                case (byte)CommandClass.COMMAND_CLASS_THERMOSTAT_OPERATING_STATE:
                case (byte)CommandClass.COMMAND_CLASS_THERMOSTAT_SETBACK:
                case (byte)CommandClass.COMMAND_CLASS_THERMOSTAT_SETPOINT:

                    if (this.DeviceHandler != null)
                    {
                        handled = this.DeviceHandler.HandleBasicReport(receivedMessage);
                    }

                    break;

                case (byte)CommandClass.COMMAND_CLASS_MULTIINSTANCE:
                case (byte)CommandClass.COMMAND_CLASS_METER:

                    if (messageLength > 10)
                    {
                        if (this.DeviceHandler != null)
                        {
                            handled = this.DeviceHandler.HandleMultiInstanceReport(receivedMessage);
                        }
                    }

                    break;

                case (byte)CommandClass.COMMAND_CLASS_CONFIGURATION:

                    if (messageLength > 11 && commandType == (byte)Command.COMMAND_CONFIG_REPORT) // CONFIGURATION PARAMETER REPORT  0x06
                    {
                        byte paramId     = receivedMessage[9];
                        byte paramLength = receivedMessage[10];
                        //
                        if (!nodeConfigParamsLength.ContainsKey(paramId))
                        {
                            nodeConfigParamsLength.Add(paramId, paramLength);
                        }
                        else
                        {
                            // this shouldn't change on read... but you never know! =)
                            nodeConfigParamsLength[paramId] = paramLength;
                        }
                        //
                        byte[] bval = new byte[4];
                        // extract bytes value
                        Array.Copy(receivedMessage, 11, bval, 4 - (int)paramLength, (int)paramLength);
                        uint paramval = bval[0];
                        Array.Reverse(bval);
                        paramval = BitConverter.ToUInt32(bval, 0);
                        // convert it to uint
                        //
                        RaiseUpdateParameterEvent(this, paramId, ParameterType.PARAMETER_CONFIG, paramval);
                        //
                        handled = true;
                    }

                    break;

                case (byte)CommandClass.COMMAND_CLASS_ASSOCIATION:

                    if (messageLength > 12 && commandType == (byte)Command.COMMAND_ASSOCIATION_REPORT) // ASSOCIATION REPORT 0x03
                    {
                        byte   groupId         = receivedMessage[9];
                        byte   maxAssociations = receivedMessage[10];
                        byte   numAssociations = receivedMessage[11]; // it is always zero ?!?
                        string assocNodes      = "";
                        if (receivedMessage.Length > 13)
                        {
                            for (int a = 12; a < receivedMessage.Length - 1; a++)
                            {
                                assocNodes += receivedMessage[a] + ",";
                            }
                        }
                        assocNodes = assocNodes.TrimEnd(',');
                        //
                        //_raiseUpdateParameterEvent(this, 0, ParameterType.PARAMETER_ASSOC, groupid);
                        RaiseUpdateParameterEvent(this, 1, ParameterType.PARAMETER_ASSOC, maxAssociations);
                        RaiseUpdateParameterEvent(this, 2, ParameterType.PARAMETER_ASSOC, numAssociations);
                        RaiseUpdateParameterEvent(
                            this,
                            3,
                            ParameterType.PARAMETER_ASSOC,
                            groupId + ":" + assocNodes
                            );
                        //
                        handled = true;
                    }

                    break;

                case (byte)CommandClass.COMMAND_CLASS_WAKE_UP:

                    if (messageLength > 11 && commandType == (byte)Command.COMMAND_WAKEUP_REPORT) // WAKE UP REPORT 0x06
                    {
                        uint interval = ((uint)receivedMessage[9]) << 16;
                        interval |= (((uint)receivedMessage[10]) << 8);
                        interval |= (uint)receivedMessage[11];
                        //
                        RaiseUpdateParameterEvent(this, 0, ParameterType.PARAMETER_WAKEUP_INTERVAL, interval);
                        //
                        handled = true;
                    }
                    // 0x01, 0x08, 0x00, 0x04, 0x00, 0x06, 0x02, 0x84, 0x07, 0x74
                    else if (messageLength > 7 && commandType == (byte)Command.COMMAND_WAKEUP_NOTIFICATION)     // AWAKE NOTIFICATION 0x07
                    {
                        RaiseUpdateParameterEvent(this, 0, ParameterType.PARAMETER_WAKEUP_NOTIFY, 1);
                        //
                        handled = true;
                    }

                    break;

                case (byte)CommandClass.COMMAND_CLASS_BATTERY:

                    if (messageLength > 7 && /*command_length == (byte)Command.COMMAND_BASIC_REPORT && */ commandType == 0x03) // Battery Report
                    {
                        RaiseUpdateParameterEvent(this, 0, ParameterType.PARAMETER_BATTERY, receivedMessage[9]);
                        //
                        handled = true;
                    }

                    break;

                case (byte)CommandClass.COMMAND_CLASS_HAIL:

                    this.Basic_Get();
                    handled = true;

                    break;

                case (byte)CommandClass.COMMAND_CLASS_MANUFACTURER_SPECIFIC:

                    if (messageLength > 14)
                    {
                        byte[] manufacturerId = new byte[2] {
                            receivedMessage[9], receivedMessage[10]
                        };
                        byte[] typeId = new byte[2] {
                            receivedMessage[11], receivedMessage[12]
                        };
                        byte[] productId = new byte[2] {
                            receivedMessage[13], receivedMessage[14]
                        };

                        this.ManufacturerId = zwavePort.ByteArrayToString(manufacturerId).Replace(" ", "");
                        this.TypeId         = zwavePort.ByteArrayToString(typeId).Replace(" ", "");
                        this.ProductId      = zwavePort.ByteArrayToString(productId).Replace(" ", "");

                        var manufacturerSpecs = new ManufacturerSpecific()
                        {
                            TypeId         = zwavePort.ByteArrayToString(typeId).Replace(" ", ""),
                            ProductId      = zwavePort.ByteArrayToString(productId).Replace(" ", ""),
                            ManufacturerId = zwavePort.ByteArrayToString(manufacturerId).Replace(" ", "")
                        };
                        //
                        CheckDeviceHandler(manufacturerSpecs);
                        //
                        if (ManufacturerSpecificResponse != null)
                        {
                            try
                            {
                                ManufacturerSpecificResponse(this, new ManufacturerSpecificResponseEventArg()
                                {
                                    NodeId = this.NodeId,
                                    ManufacturerSpecific = manufacturerSpecs
                                });
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine("ZWaveLib: Error during ManufacturerSpecificResponse callback, " + ex.Message + "\n" + ex.StackTrace);
                            }
                        }
                        //
                        handled = true;
                        //
                        //Console.WriteLine (" ########################################################################################################### ");
                        //this.SendMessage (new byte[] { 0x01, 0x09, 0x00, 0x13, 0x13, this.NodeId, 0x31, 0x01, 0x25, 0x40, 0xa1 });
                    }

                    break;
                }
            }
            //
            if (!handled && messageLength > 3)
            {
                if (receivedMessage[3] != 0x13)
                {
                    bool log = true;
                    if (messageLength > 7 && /* cmd_class */ receivedMessage[7] == (byte)CommandClass.COMMAND_CLASS_MANUFACTURER_SPECIFIC)
                    {
                        log = false;
                    }
                    if (log)
                    {
                        Console.WriteLine("ZWaveLib UNHANDLED message: " + zwavePort.ByteArrayToString(receivedMessage));
                    }
                }
            }

            return(false);
        }
예제 #7
0
 // Z-Wave.Me thermostat
 // 0115:0024:0001
 public override bool CanHandleProduct(ManufacturerSpecific productspecs)
 {
     return (productspecs.ManufacturerId == "0115" && productspecs.TypeId == "0024" && productspecs.ProductId == "0001");
 }