Пример #1
0
        private void controller_ParameterChanged(object sender, ZWaveEvent eventData)
        {
            lock (syncLock)
            while (eventData != null)
            {
                string path = "UnknwonParameter";
                object value = eventData.Value;
                switch (eventData.Parameter)
                {
                case EventParameter.MeterKwHour:
                    path = GetIndexedParameterPath(ModuleParameters.MODPAR_METER_KW_HOUR, eventData.Instance);
                    break;
                case EventParameter.MeterKvaHour:
                    path = GetIndexedParameterPath(ModuleParameters.MODPAR_METER_KVA_HOUR, eventData.Instance);
                    break;
                case EventParameter.MeterWatt:
                    path = GetIndexedParameterPath(ModuleParameters.MODPAR_METER_WATTS, eventData.Instance);
                    break;
                case EventParameter.MeterPulses:
                    path = GetIndexedParameterPath(ModuleParameters.MODPAR_METER_PULSES, eventData.Instance);
                    break;
                case EventParameter.MeterAcVolt:
                    path = GetIndexedParameterPath(ModuleParameters.MODPAR_METER_AC_VOLT, eventData.Instance);
                    break;
                case EventParameter.MeterAcCurrent:
                    path = GetIndexedParameterPath(ModuleParameters.MODPAR_METER_AC_CURRENT, eventData.Instance);
                    break;
                case EventParameter.MeterPower:
                    path = GetIndexedParameterPath(ModuleParameters.MODPAR_SENSOR_POWER, eventData.Instance);
                    break;
                case EventParameter.Battery:
                    RaisePropertyChanged(new InterfacePropertyChangedAction() {
                        Domain = this.Domain,
                        SourceId = eventData.Node.Id.ToString(),
                        SourceType = "ZWave Node",
                        Path = "ZWaveNode.Battery",
                        Value = value
                    });
                    path = ModuleParameters.MODPAR_STATUS_BATTERY;
                    break;
                case EventParameter.NodeInfo:
                    path = "ZWaveNode.NodeInfo";
                    break;
                case EventParameter.SensorGeneric:
                    path = ModuleParameters.MODPAR_SENSOR_GENERIC;
                    break;
                case EventParameter.SensorTemperature:
                    path = ModuleParameters.MODPAR_SENSOR_TEMPERATURE;
                    break;
                case EventParameter.SensorHumidity:
                    path = ModuleParameters.MODPAR_SENSOR_HUMIDITY;
                    break;
                case EventParameter.SensorLuminance:
                    path = ModuleParameters.MODPAR_SENSOR_LUMINANCE;
                    break;
                case EventParameter.SensorMotion:
                    path = ModuleParameters.MODPAR_SENSOR_MOTIONDETECT;
                    break;
                case EventParameter.AlarmGeneric:
                    path = ModuleParameters.MODPAR_SENSOR_ALARM_GENERIC;
                    // Translate generic alarm into specific Door Lock event values if node is an entry control type device
                    //at this level the sender is the controller so get the node from eventData
                    if (eventData.Node.GenericClass == (byte)GenericType.EntryControl)
                    {
                        // do not convert to string since Alarms accept ONLY numbers a string would be outputed as NaN
                        // for now let it as is.

            //                        value = ((DoorLock.Alarm)(byte)value).ToString();
                    }
                    break;
                case EventParameter.AlarmDoorWindow:
                    path = ModuleParameters.MODPAR_SENSOR_DOORWINDOW;
                    break;
                case EventParameter.AlarmTampered:
                    path = ModuleParameters.MODPAR_SENSOR_TAMPER;
                    break;
                case EventParameter.AlarmSmoke:
                    path = ModuleParameters.MODPAR_SENSOR_ALARM_SMOKE;
                    break;
                case EventParameter.AlarmCarbonMonoxide:
                    path = ModuleParameters.MODPAR_SENSOR_ALARM_CARBONMONOXIDE;
                    break;
                case EventParameter.AlarmCarbonDioxide:
                    path = ModuleParameters.MODPAR_SENSOR_ALARM_CARBONDIOXIDE;
                    break;
                case EventParameter.AlarmHeat:
                    path = ModuleParameters.MODPAR_SENSOR_ALARM_HEAT;
                    break;
                case EventParameter.AlarmFlood:
                    path = ModuleParameters.MODPAR_SENSOR_ALARM_FLOOD;
                    break;
                case EventParameter.DoorLockStatus:
                    path = ModuleParameters.MODPAR_STATUS_DOORLOCK;
                    value = ((DoorLock.Value)(byte)value).ToString();
                    break;
                case EventParameter.ManufacturerSpecific:
                    ManufacturerSpecificInfo mf = (ManufacturerSpecificInfo)value;
                    path = "ZWaveNode.ManufacturerSpecific";
                    value = mf.ManufacturerId + ":" + mf.TypeId + ":" + mf.ProductId;
                    break;
                case EventParameter.Configuration:
                    path = "ZWaveNode.Variables." + eventData.Instance;
                    break;
                case EventParameter.Association:
                    var associationResponse = (Association.AssociationResponse)value;
                    RaisePropertyChanged(new InterfacePropertyChangedAction() {
                        Domain = this.Domain,
                        SourceId = eventData.Node.Id.ToString(),
                        SourceType = "ZWave Node",
                        Path = "ZWaveNode.Associations.Max",
                        Value = associationResponse.Max
                    });
                    RaisePropertyChanged(new InterfacePropertyChangedAction() {
                        Domain = this.Domain,
                        SourceId = eventData.Node.Id.ToString(),
                        SourceType = "ZWave Node",
                        Path = "ZWaveNode.Associations.Count",
                        Value = associationResponse.Count
                    });
                    path = "ZWaveNode.Associations." + associationResponse.GroupId; // TODO: implement generic group/node association instead of fixed one
                    value = associationResponse.NodeList;
                    break;
                case EventParameter.MultiinstanceSwitchBinaryCount:
                    path = "ZWaveNode.MultiInstance.SwitchBinary.Count";
                    break;
                case EventParameter.MultiinstanceSwitchMultilevelCount:
                    path = "ZWaveNode.MultiInstance.SwitchMultiLevel.Count";
                    break;
                case EventParameter.MultiinstanceSensorBinaryCount:
                    path = "ZWaveNode.MultiInstance.SensorBinary.Count";
                    break;
                case EventParameter.MultiinstanceSensorMultilevelCount:
                    path = "ZWaveNode.MultiInstance.SensorMultiLevel.Count";
                    break;
                case EventParameter.MultiinstanceSwitchBinary:
                    path = "ZWaveNode.MultiInstance.SwitchBinary." + eventData.Instance;
                    break;
                case EventParameter.MultiinstanceSwitchMultilevel:
                    path = "ZWaveNode.MultiInstance.SwitchMultiLevel." + eventData.Instance;
                    break;
                case EventParameter.MultiinstanceSensorBinary:
                    path = "ZWaveNode.MultiInstance.SensorBinary." + eventData.Instance;
                    break;
                case EventParameter.MultiinstanceSensorMultilevel:
                    path = "ZWaveNode.MultiInstance.SensorMultiLevel." + eventData.Instance;
                    break;
                case EventParameter.WakeUpInterval:
                    path = "ZWaveNode.WakeUpInterval";
                    break;
                case EventParameter.WakeUpNotify:
                    path = "ZWaveNode.WakeUpNotify";
                    break;
                case EventParameter.Level:
                    RaisePropertyChanged(new InterfacePropertyChangedAction() {
                        Domain = this.Domain,
                        SourceId = eventData.Node.Id.ToString(),
                        SourceType = "ZWave Node",
                        Path = "ZWaveNode.Basic",
                        Value = value
                    });
                    double normalizedval = (Math.Round((double)value / 100D, 2));
                    // binary switches have [0/255], while multilevel switches [0-99],
                    // normalize Status.Level to [0.0 <-> 1.0]
                    if (normalizedval >= 0.99)
                        normalizedval = 1.0;
                    if (eventData.Instance == 0)
                    {
                        path = ModuleParameters.MODPAR_STATUS_LEVEL;
                    }
                    else
                    {
                        path = ModuleParameters.MODPAR_STATUS_LEVEL + "." + eventData.Instance;
                    }
                    value = normalizedval.ToString(CultureInfo.InvariantCulture);
                    break;
                case EventParameter.ThermostatMode:
                    path = "Thermostat.Mode";
                    value = ((ThermostatMode.Value)value).ToString();
                    break;
                case EventParameter.ThermostatOperatingState:
                    path = "Thermostat.OperatingState";
                    value = ((ThermostatOperatingState.Value)value).ToString();
                    break;
                case EventParameter.ThermostatFanMode:
                    path = "Thermostat.FanMode";
                    value = ((ThermostatFanMode.Value)value).ToString();
                    break;
                case EventParameter.ThermostatFanState:
                    path = "Thermostat.FanState";
                    value = ((ThermostatFanState.Value)value).ToString();
                    break;
                case EventParameter.ThermostatHeating:
                    path = "Thermostat.Heating";
                    break;
                case EventParameter.ThermostatSetBack:
                    path = "Thermostat.SetBack";
                    break;
                case EventParameter.ThermostatSetPoint:
                    // value stores a dynamic object with Type and Value fields: value = { Type = ..., Value = ... }
                    path = "Thermostat.SetPoint." + ((ThermostatSetPoint.Value)((dynamic)value).Type).ToString();
                    value = ((dynamic)value).Value;
                    break;
                case EventParameter.UserCode:
                    path = "EntryControl.UserCode";
                    value = ((ZWaveLib.Values.UserCodeValue)value).TagCodeToHexString();
                    break;
                case EventParameter.SecurityNodeInformationFrame:
                    path = "ZWaveNode.SecuredNodeInfo";
                    break;
                default:
                    Console.WriteLine("UNHANDLED PARAMETER CHANGE FROM NODE {0} ====> Param Type: {1} Param Id:{2} Value:{3}", eventData.Node.Id, eventData.Parameter, eventData.Instance, value);
                    break;
                }

                RaisePropertyChanged(new InterfacePropertyChangedAction() {
                    Domain = this.Domain,
                    SourceId = eventData.Node.Id.ToString(),
                    SourceType = "ZWave Node",
                    Path = path,
                    Value = value
                });

                eventData = eventData.NestedEvent;
            }
        }
Пример #2
0
 //int pid, EventParameter peventtype, object value)
 internal void RaiseUpdateParameterEvent(ZWaveEvent zevent)
 {
     if (ParameterChanged != null)
     {
         ParameterChanged(this, zevent);
     }
 }
Пример #3
0
 private void znode_ParameterChanged(object sender, ZWaveEvent eventData)
 {
     // Route node event
     RaiseUpdateParameterEvent(eventData);
 }
Пример #4
0
        private void znode_ParameterChanged(object sender, ZWaveEvent eventData)
        {
            if (sender is ZWaveNode)
            {
                ZWaveNode node = (ZWaveNode) sender;
                if (eventData.Parameter == EventParameter.SecurityDecriptedMessage && eventData.Value is byte[])
                {
                    node.MessageRequestHandler((byte[])eventData.Value);
                    return;
                }
                else if (eventData.Parameter == EventParameter.SecurityGeneratedKey && eventData.Value is int)
                {
                    SaveNodesConfig();
                    return;
                }
                else if (eventData.Parameter == EventParameter.SecurityNodeInformationFrame)
                {
                    node.SecuredNodeInformationFrame = (byte[])eventData.Value;

                    // we take them one a a time to make sure we keep the list with unique elements
                    foreach (byte nodeInfo in node.SecuredNodeInformationFrame)
                    {
                        // if we found the COMMAND_CLASS_MARK we get out of the for loop
                        if (nodeInfo == (byte)0xEF)
                            break;
                        node.NodeInformationFrame = Utility.AppendByteToArray(node.NodeInformationFrame, nodeInfo);
                    }

                    // we just send other events and save the node data
                    gotNodeUpdateInformation(node);
                }
            }
            // Route node event
            RaiseUpdateParameterEvent(eventData);
        }
Пример #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");

            ZWaveEvent messageEvent  = null;
            int        messageLength = receivedMessage.Length;

            if (messageLength > 8)
            {
                //byte commandLength = receivedMessage[6];
                byte commandClass = receivedMessage[7];
                switch (commandClass)
                {
                case (byte)CommandClass.Basic:
                    messageEvent = Basic.GetEvent(this, receivedMessage);
                    break;

                case (byte)CommandClass.Alarm:
                    messageEvent = Alarm.GetEvent(this, receivedMessage);
                    break;

                case (byte)CommandClass.SensorAlarm:
                    messageEvent = SensorAlarm.GetEvent(this, receivedMessage);
                    break;

                case (byte)CommandClass.SceneActivation:
                    messageEvent = SceneActivation.GetEvent(this, receivedMessage);
                    break;

                case (byte)CommandClass.SwitchBinary:
                    messageEvent = SwitchBinary.GetEvent(this, receivedMessage);
                    break;

                case (byte)CommandClass.SwitchMultilevel:
                    messageEvent = SwitchMultilevel.GetEvent(this, receivedMessage);
                    break;

                case (byte)CommandClass.SensorBinary:
                    messageEvent = SensorBinary.GetEvent(this, receivedMessage);
                    break;

                case (byte)CommandClass.SensorMultilevel:
                    messageEvent = SensorMultilevel.GetEvent(this, receivedMessage);
                    break;

                case (byte)CommandClass.Meter:
                    messageEvent = Meter.GetEvent(this, receivedMessage);
                    break;

                case (byte)CommandClass.ThermostatMode:
                case (byte)CommandClass.ThermostatFanMode:
                case (byte)CommandClass.ThermostatFanState:
                case (byte)CommandClass.ThermostatHeating:
                case (byte)CommandClass.ThermostatOperatingState:
                case (byte)CommandClass.ThermostatSetBack:
                case (byte)CommandClass.ThermostatSetPoint:
                    messageEvent = Thermostat.GetEvent(this, receivedMessage);
                    break;

                case (byte)CommandClass.UserCode:
                    messageEvent = UserCode.GetEvent(this, receivedMessage);
                    break;

                case (byte)CommandClass.Association:
                    messageEvent = Association.GetEvent(this, receivedMessage);
                    break;

                case (byte)CommandClass.Configuration:
                    messageEvent = Configuration.GetEvent(this, receivedMessage);
                    break;

                case (byte)CommandClass.WakeUp:
                    messageEvent = WakeUp.GetEvent(this, receivedMessage);
                    break;

                case (byte)CommandClass.Battery:
                    messageEvent = Battery.GetEvent(this, receivedMessage);
                    break;

                case (byte)CommandClass.Hail:
                    Basic.Get(this);
                    break;

                case (byte)CommandClass.MultiInstance:
                    messageEvent = MultiInstance.GetEvent(this, receivedMessage);
                    break;

                case (byte)CommandClass.ManufacturerSpecific:
                    messageEvent = ManufacturerSpecific.GetEvent(this, receivedMessage);
                    if (messageEvent != null)
                    {
                        var specs = (ManufacturerSpecificInfo)messageEvent.Value;
                        this.ManufacturerId = specs.ManufacturerId;
                        this.TypeId         = specs.TypeId;
                        this.ProductId      = specs.ProductId;
                        if (ManufacturerSpecificResponse != null)
                        {
                            try
                            {
                                ManufacturerSpecificResponse(this, new ManufacturerSpecificResponseEventArg()
                                {
                                    NodeId = this.NodeId,
                                    ManufacturerSpecific = specs
                                });
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine("ZWaveLib: Error during ManufacturerSpecificResponse callback, " + ex.Message + "\n" + ex.StackTrace);
                            }
                        }
                    }

                    break;
                }
            }

            if (messageEvent != null)
            {
                this.RaiseUpdateParameterEvent(messageEvent.Instance, messageEvent.Event, messageEvent.Value);
            }
            else if (messageLength > 3)
            {
                if (receivedMessage[3] != 0x13)
                {
                    bool log = true;
                    if (messageLength > 7 && /* cmd_class */ receivedMessage[7] == (byte)CommandClass.ManufacturerSpecific)
                    {
                        log = false;
                    }
                    if (log)
                    {
                        Console.WriteLine("ZWaveLib UNHANDLED message: " + Utility.ByteArrayToString(receivedMessage));
                    }
                }
            }

            return(false);
        }