예제 #1
0
        public virtual bool HandleMultiInstanceReport(byte[] message)
        {
            //UNHANDLED: 01 14 00 04 08 04 0E 32 02 21 74 00 00 1E BB 00 00 00 00 00 00 2D
            //                       ^^
            bool processed = false;
            //
            byte commandClass = message[7];

            //
            if (commandClass == (byte)CommandClass.COMMAND_CLASS_METER)
            {
                if (message.Length > 14 && message[4] == 0x00)
                {
                    // CLASS METER
                    //
                    double wattsRead = ((double)int.Parse(message[12].ToString("X2") + message[13].ToString("X2") + message[14].ToString("X2"), System.Globalization.NumberStyles.HexNumber)) / 1000D;
                    nodeHost.RaiseUpdateParameterEvent(nodeHost, 0, ParameterType.PARAMETER_WATTS, wattsRead);
                    //
                    processed = true;
                }
                else if (message.Length > 14 && message[4] == 0x08)
                {
                    //TODO: complete here...
                    processed = true;
                }
            }

            return(processed);
        }
예제 #2
0
        public byte[] GeneratePrivateNetworkKey()
        {
            privateNetworkKey = new byte[16];
            Random rnd = new Random();

            rnd.NextBytes(privateNetworkKey);

            // notify the controller that the privateNetworkKey was generated so that it can save it
            ZWaveEvent keyGenEvent = new ZWaveEvent(parentNode, EventParameter.SecurityGeneratedKey, 0, 0);

            parentNode.RaiseUpdateParameterEvent(keyGenEvent);

            return(privateNetworkKey);
        }
예제 #3
0
        public ZWaveEvent GetEvent(ZWaveNode node, byte[] message)
        {
            ZWaveEvent nodeEvent = null;
            byte       cmdType   = message[1];

            if (cmdType == (byte)Command.DoorLock_Report)
            {
                int lockState;

                if (message[2] == 0xFF)
                {
                    lockState = 6;
                }
                else
                {
                    lockState = System.Convert.ToInt32(message[2].ToString("X2"));
                }

                if (lockState > 6)
                {
                    lockState = 7;
                }

                string resp;

                if (lockState == 0)
                {
                    resp = "Unlocked";
                }
                else if (lockState == 6)
                {
                    resp = "Locked";
                }
                else
                {
                    resp = "Unknown";
                }

                var messageEvent = new ZWaveEvent(node, EventParameter.DoorLockStatus, resp, 0);
                node.RaiseUpdateParameterEvent(messageEvent);
            }

            return(nodeEvent);
        }
예제 #4
0
        public virtual bool HandleMultiInstanceReport(byte[] message)
        {
            //UNHANDLED: 01 14 00 04 08 04 0E 32 02 21 74 00 00 1E BB 00 00 00 00 00 00 2D
            //                       ^^        |  |
            //                                 +--|------> 0x31 Command Class Meter
            //                                    +------> 0x02 Meter Report
            bool processed = false;
            //
            byte commandClass = message[7];
            byte commandType  = message[8];

            //
            if (commandClass == (byte)CommandClass.Meter && commandType == (byte)Command.MeterReport)
            {
                // TODO: should check meter report type (Electric, Gas, Water) and value precision scale
                // TODO: the code below parse always as Electric type
                EnergyValue energy = EnergyValue.Parse(message);
                nodeHost.RaiseUpdateParameterEvent(nodeHost, 0, energy.EventType, energy.Value);
                processed = true;
            }
            return(processed);
        }
예제 #5
0
파일: Meter.cs 프로젝트: miragejb/HomeGenie
        public virtual bool HandleMultiInstanceReport(byte[] message)
        {
            //UNHANDLED: 01 14 00 04 08 04 0E 32 02 21 74 00 00 1E BB 00 00 00 00 00 00 2D
            //                       ^^        |  |
            //                                 +--|------> 0x31 Command Class Meter
            //                                    +------> 0x02 Meter Report
            bool processed = false;
            //
            byte commandClass = message[7];
            byte commandType  = message[8];

            //
            if (commandClass == (byte)CommandClass.COMMAND_CLASS_METER && commandType == (byte)Command.COMMAND_METER_REPORT)
            {
                // TODO: should check meter report type (Electric, Gas, Water) and value precision scale
                // TODO: the code below parse always as Electric type
                double wattsRead = ((double)int.Parse(message[12].ToString("X2") + message[13].ToString("X2") + message[14].ToString("X2"), System.Globalization.NumberStyles.HexNumber)) / 1000D;
                nodeHost.RaiseUpdateParameterEvent(nodeHost, 0, ParameterType.PARAMETER_WATTS, wattsRead);
                processed = true;
            }
            return(processed);
        }
예제 #6
0
        //
        // 01 0D 00 04 00 1C 07 9C 02 00 05 FF 00 00 89
        //  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
        //  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14
        //
        // 01 0F 00 04 00 18 09 71 05 07 00 00 FF 07 02 00
        // 01 0F 00 04 00 18 09 71 05 07 FF 00 FF 07 02 00
        //
        public virtual bool HandleBasicReport(byte[] message)
        {
            bool handled = false;
            //
            //byte cmdLength = message[6];
            byte cmdClass = message[7];
            byte cmdType  = message[8];

            //
            if (cmdClass == (byte)CommandClass.COMMAND_CLASS_BASIC && (cmdType == 0x03 || cmdType == 0x01))
            {
                nodeHost.RaiseUpdateParameterEvent(nodeHost, 0, ParameterType.PARAMETER_BASIC, (double)message[9]);
                handled = true;
            }
            else if (cmdClass == (byte)CommandClass.COMMAND_CLASS_SCENE_ACTIVATION && cmdType == 0x01)
            {
                nodeHost.RaiseUpdateParameterEvent(nodeHost, 0, ParameterType.PARAMETER_GENERIC, (double)message[9]);
                handled = true;
            }
            else if (cmdClass == (byte)CommandClass.COMMAND_CLASS_SENSOR_BINARY && cmdType == 0x03)
            {
                nodeHost.RaiseUpdateParameterEvent(nodeHost, 0, ParameterType.PARAMETER_GENERIC, message[9]);
                handled = true;
            }
            else if (cmdClass == (byte)CommandClass.COMMAND_CLASS_SENSOR_MULTILEVEL && cmdType == 0x05)
            {
                var sensorValue = Sensor.ParseSensorValue(message);
                if (sensorValue.Parameter == ZWaveSensorParameter.UNKNOWN)
                {
                    byte key = message[9];
                    nodeHost.RaiseUpdateParameterEvent(nodeHost, 0, ParameterType.PARAMETER_GENERIC, sensorValue.Value);
                    Console.WriteLine("\nUNHANDLED SENSOR PARAMETER TYPE => " + key + "\n");
                }
                else
                {
                    nodeHost.RaiseUpdateParameterEvent(nodeHost, 0, sensorValue.EventType, sensorValue.Value);
                    handled = true;
                }
            }
            else if ((cmdClass == (byte)CommandClass.COMMAND_CLASS_SENSOR_ALARM && cmdType == 0x02) || (cmdClass == (byte)CommandClass.COMMAND_CLASS_ALARM && cmdType == 0x05))
            {
                var sensorAlarmValue = Sensor.ParseSensorAlarmValue(message);
                nodeHost.RaiseUpdateParameterEvent(nodeHost, 0, sensorAlarmValue.EventType, sensorAlarmValue.Value);
                handled = true;
            }
            return(handled);
        }
예제 #7
0
 public void SetNodeHost(ZWaveNode node)
 {
     nodeHost = node;
     nodeHost.RaiseUpdateParameterEvent(nodeHost, 0, ParameterType.METER_WATT, 0);
 }
예제 #8
0
파일: Meter.cs 프로젝트: jarrettv/HomeGenie
 public void SetNodeHost(ZWaveNode node)
 {
     nodeHost = node;
     nodeHost.RaiseUpdateParameterEvent(nodeHost, 0, ParameterType.PARAMETER_WATTS, 0);
 }
예제 #9
0
        public static ZWaveEvent GetEvent(ZWaveNode node, byte[] message)
        {
            ZWaveEvent nodeEvent = null;

            byte cmdClass = message[7];
            byte cmdType = message[8];
            byte instanceCmdClass = message[9];

            switch (cmdType)
            {
            case (byte)Command.MultiInstanceReport:
            case (byte)Command.MultiInstaceV2Encapsulated:

                byte[] instanceMessage;
                byte instanceNumber = message[9];

                // if it's a COMMAND_MULTIINSTANCEV2_ENCAP we shift key and val +1 byte
                if (cmdType == (byte)Command.MultiInstaceV2Encapsulated)
                {
                    instanceCmdClass = message[11];
                    instanceMessage = new byte[message.Length - 4];
                    System.Array.Copy(message, 4, instanceMessage, 0, message.Length - 4);
                }
                else
                {
                    instanceCmdClass = message[10];
                    instanceMessage = new byte[message.Length - 3];
                    System.Array.Copy(message, 3, instanceMessage, 0, message.Length - 3);
                }

                switch (instanceCmdClass)
                {
                case (byte)CommandClass.Basic:
                    nodeEvent = Basic.GetEvent(node, instanceMessage);
                    break;
                case (byte)CommandClass.Alarm:
                    nodeEvent = Alarm.GetEvent(node, instanceMessage);
                    break;
                case (byte)CommandClass.SensorAlarm:
                    nodeEvent = SensorAlarm.GetEvent(node, instanceMessage);
                    break;
                case (byte)CommandClass.SceneActivation:
                    nodeEvent = SceneActivation.GetEvent(node, instanceMessage);
                    break;
                case (byte)CommandClass.SwitchBinary:
                    nodeEvent = SwitchBinary.GetEvent(node, instanceMessage);
                    if (nodeEvent != null)
                    {
                        node.RaiseUpdateParameterEvent(instanceNumber, EventParameter.MultiinstanceSwitchBinary, nodeEvent.Value);
                    }
                    break;
                case (byte)CommandClass.SwitchMultilevel:
                    nodeEvent = SwitchMultilevel.GetEvent(node, instanceMessage);
                    if (nodeEvent != null)
                    {
                        node.RaiseUpdateParameterEvent(instanceNumber, EventParameter.MultiinstanceSwitchMultilevel, nodeEvent.Value);
                    }
                    break;
                case (byte)CommandClass.SensorBinary:
                    nodeEvent = SensorBinary.GetEvent(node, instanceMessage);
                    if (nodeEvent != null)
                    {
                        node.RaiseUpdateParameterEvent(instanceNumber, EventParameter.MultiinstanceSensorBinary, nodeEvent.Value);
                    }
                    break;
                case (byte)CommandClass.SensorMultilevel:
                    nodeEvent = SensorMultilevel.GetEvent(node, instanceMessage);
                    if (nodeEvent != null)
                    {
                        node.RaiseUpdateParameterEvent(instanceNumber, EventParameter.MultiinstanceSensorMultilevel, nodeEvent.Value);
                    }
                    break;
                case (byte)CommandClass.Meter:
                    nodeEvent = Meter.GetEvent(node, instanceMessage);
                    break;
                }

                if (nodeEvent != null)
                {
                    nodeEvent.Instance = (int)message[9];
                }

                break;

            case (byte)Command.MultiInstanceCountReport:
                byte instanceCount = message[10];
                switch (instanceCmdClass)
                {
                case (byte)CommandClass.SwitchBinary:
                    nodeEvent = new ZWaveEvent(node, EventParameter.MultiinstanceSwitchBinaryCount, instanceCount, 0);
                    break;
                case (byte)CommandClass.SwitchMultilevel:
                    nodeEvent = new ZWaveEvent(node, EventParameter.MultiinstanceSwitchMultilevelCount, instanceCount, 0);
                    break;
                case (byte)CommandClass.SensorBinary:
                    nodeEvent = new ZWaveEvent(node, EventParameter.MultiinstanceSensorBinaryCount, instanceCount, 0);
                    break;
                case (byte)CommandClass.SensorMultilevel:
                    nodeEvent = new ZWaveEvent(node, EventParameter.MultiinstanceSensorMultilevelCount, instanceCount, 0);
                    break;
                }
                break;

            }

            return nodeEvent;
        }
예제 #10
0
        public static ZWaveEvent GetEvent(ZWaveNode node, byte[] message)
        {
            ZWaveEvent nodeEvent = null;

            byte cmdClass         = message[7];
            byte cmdType          = message[8];
            byte instanceCmdClass = message[9];

            switch (cmdType)
            {
            case (byte)Command.MultiInstanceReport:
            case (byte)Command.MultiInstaceV2Encapsulated:

                byte[] instanceMessage;
                byte   instanceNumber = message[9];

                // if it's a COMMAND_MULTIINSTANCEV2_ENCAP we shift key and val +1 byte
                if (cmdType == (byte)Command.MultiInstaceV2Encapsulated)
                {
                    instanceCmdClass = message[11];
                    instanceMessage  = new byte[message.Length - 4];
                    System.Array.Copy(message, 4, instanceMessage, 0, message.Length - 4);
                }
                else
                {
                    instanceCmdClass = message[10];
                    instanceMessage  = new byte[message.Length - 3];
                    System.Array.Copy(message, 3, instanceMessage, 0, message.Length - 3);
                }

                switch (instanceCmdClass)
                {
                case (byte)CommandClass.Basic:
                    nodeEvent = Basic.GetEvent(node, instanceMessage);
                    break;

                case (byte)CommandClass.Alarm:
                    nodeEvent = Alarm.GetEvent(node, instanceMessage);
                    break;

                case (byte)CommandClass.SensorAlarm:
                    nodeEvent = SensorAlarm.GetEvent(node, instanceMessage);
                    break;

                case (byte)CommandClass.SceneActivation:
                    nodeEvent = SceneActivation.GetEvent(node, instanceMessage);
                    break;

                case (byte)CommandClass.SwitchBinary:
                    nodeEvent = SwitchBinary.GetEvent(node, instanceMessage);
                    if (nodeEvent != null)
                    {
                        node.RaiseUpdateParameterEvent(instanceNumber, EventParameter.MultiinstanceSwitchBinary, nodeEvent.Value);
                    }
                    break;

                case (byte)CommandClass.SwitchMultilevel:
                    nodeEvent = SwitchMultilevel.GetEvent(node, instanceMessage);
                    if (nodeEvent != null)
                    {
                        node.RaiseUpdateParameterEvent(instanceNumber, EventParameter.MultiinstanceSwitchMultilevel, nodeEvent.Value);
                    }
                    break;

                case (byte)CommandClass.SensorBinary:
                    nodeEvent = SensorBinary.GetEvent(node, instanceMessage);
                    if (nodeEvent != null)
                    {
                        node.RaiseUpdateParameterEvent(instanceNumber, EventParameter.MultiinstanceSensorBinary, nodeEvent.Value);
                    }
                    break;

                case (byte)CommandClass.SensorMultilevel:
                    nodeEvent = SensorMultilevel.GetEvent(node, instanceMessage);
                    if (nodeEvent != null)
                    {
                        node.RaiseUpdateParameterEvent(instanceNumber, EventParameter.MultiinstanceSensorMultilevel, nodeEvent.Value);
                    }
                    break;

                case (byte)CommandClass.Meter:
                    nodeEvent = Meter.GetEvent(node, instanceMessage);
                    break;
                }

                if (nodeEvent != null)
                {
                    nodeEvent.Instance = (int)message[9];
                }

                break;

            case (byte)Command.MultiInstanceCountReport:
                byte instanceCount = message[10];
                switch (instanceCmdClass)
                {
                case (byte)CommandClass.SwitchBinary:
                    nodeEvent = new ZWaveEvent(node, EventParameter.MultiinstanceSwitchBinaryCount, instanceCount, 0);
                    break;

                case (byte)CommandClass.SwitchMultilevel:
                    nodeEvent = new ZWaveEvent(node, EventParameter.MultiinstanceSwitchMultilevelCount, instanceCount, 0);
                    break;

                case (byte)CommandClass.SensorBinary:
                    nodeEvent = new ZWaveEvent(node, EventParameter.MultiinstanceSensorBinaryCount, instanceCount, 0);
                    break;

                case (byte)CommandClass.SensorMultilevel:
                    nodeEvent = new ZWaveEvent(node, EventParameter.MultiinstanceSensorMultilevelCount, instanceCount, 0);
                    break;
                }
                break;
            }

            return(nodeEvent);
        }
예제 #11
0
        public virtual bool HandleBasicReport(byte[] message)
        {
            bool handled = false;
            //
            //byte cmdLength = message[6];
            byte cmdClass = message[7];
            byte cmdType  = message[8];

            //
            if (cmdClass == (byte)CommandClass.Basic && (cmdType == (byte)Command.BasicReport || cmdType == (byte)Command.BasicSet))
            {
                nodeHost.RaiseUpdateParameterEvent(nodeHost, 0, ParameterType.LEVEL, (double)message[9]);
                handled = true;
            }
            else if (cmdClass == (byte)CommandClass.SceneActivation && cmdType == (byte)Command.SceneActivationSet)
            {
                nodeHost.RaiseUpdateParameterEvent(nodeHost, 0, ParameterType.GENERIC, (double)message[9]);
                handled = true;
            }
            else if (cmdClass == (byte)CommandClass.SensorBinary && cmdType == (byte)Command.SensorBinaryReport)
            {
                nodeHost.RaiseUpdateParameterEvent(nodeHost, 0, ParameterType.GENERIC, message[9]);
                handled = true;
            }
            else if (cmdClass == (byte)CommandClass.SensorMultilevel && cmdType == (byte)Command.SensorMultilevelReport)
            {
                var sensor = SensorValue.Parse(message);
                if (sensor.Parameter == ZWaveSensorParameter.UNKNOWN)
                {
                    byte key = message[9];
                    nodeHost.RaiseUpdateParameterEvent(nodeHost, 0, ParameterType.GENERIC, sensor.Value);
                    Console.WriteLine("\nUNHANDLED SENSOR PARAMETER TYPE => " + key + "\n");
                }
                else
                {
                    nodeHost.RaiseUpdateParameterEvent(nodeHost, 0, sensor.EventType, sensor.Value);
                    handled = true;
                }
            }
            else if ((cmdClass == (byte)CommandClass.SensorAlarm && cmdType == (byte)Command.SensorAlarmReport) || (cmdClass == (byte)CommandClass.Alarm && cmdType == (byte)Command.AlarmReport))
            {
                var alarm = AlarmValue.Parse(message);
                nodeHost.RaiseUpdateParameterEvent(nodeHost, 0, alarm.EventType, alarm.Value);
                handled = true;
            }
            return(handled);
        }