Пример #1
0
 /// <summary>
 /// Raises the node updated event.
 /// </summary>
 /// <param name="args">Arguments.</param>
 protected virtual void OnNodeUpdated(NodeUpdatedEventArgs args)
 {
     Utility.logger.Debug("{0} {1} {2}", args.NodeId, args.Event.Parameter, args.Event.Value);
     if (NodeUpdated != null)
     {
         new Thread(() =>
         {
             NodeUpdated(this, args);
         }).Start();
     }
 }
Пример #2
0
 static void Controller_NodeUpdated(object sender, NodeUpdatedEventArgs args)
 {
     Console.ForegroundColor = ConsoleColor.Yellow;
     Console.WriteLine("NodeUpdated {0} Event Parameter {1} Value {2}", args.NodeId, args.Event.Parameter, args.Event.Value);
     Console.ForegroundColor = ConsoleColor.White;
 }
Пример #3
0
 /// <summary>
 /// Raises the node updated event.
 /// </summary>
 /// <param name="args">Arguments.</param>
 protected virtual void OnNodeUpdated(NodeUpdatedEventArgs args)
 {
     Utility.logger.Debug("{0} {1} {2}", args.NodeId, args.Event.Parameter, args.Event.Value);
     if (NodeUpdated != null)
         NodeUpdated(this, args);
 }
Пример #4
0
        private void Controller_NodeUpdated(object sender, NodeUpdatedEventArgs args)
        {
            var eventData = args.Event;
            while (eventData != null)
            {
                string eventPath = "UnknwonParameter";
                object eventValue = eventData.Value;
                switch (eventData.Parameter)
                {
                case EventParameter.MeterKwHour:
                    eventPath = GetIndexedParameterPath(ModuleEvents.Meter_KwHour, eventData.Instance);
                    break;
                case EventParameter.MeterKvaHour:
                    eventPath = GetIndexedParameterPath(ModuleEvents.Meter_KvaHour, eventData.Instance);
                    break;
                case EventParameter.MeterWatt:
                    eventPath = GetIndexedParameterPath(ModuleEvents.Meter_Watts, eventData.Instance);
                    break;
                case EventParameter.MeterPulses:
                    eventPath = GetIndexedParameterPath(ModuleEvents.Meter_Pulses, eventData.Instance);
                    break;
                case EventParameter.MeterAcVolt:
                    eventPath = GetIndexedParameterPath(ModuleEvents.Meter_AcVoltage, eventData.Instance);
                    break;
                case EventParameter.MeterAcCurrent:
                    eventPath = GetIndexedParameterPath(ModuleEvents.Meter_AcCurrent, eventData.Instance);
                    break;
                case EventParameter.MeterPower:
                    eventPath = GetIndexedParameterPath(ModuleEvents.Sensor_Power, eventData.Instance);
                    break;
                case EventParameter.Battery:
                    OnInterfacePropertyChanged(this.GetDomain(), eventData.Node.Id.ToString(), "ZWave Node", EventPath_Battery, eventValue);
                    eventPath = ModuleEvents.Status_Battery;
                    break;
                case EventParameter.NodeInfo:
                    eventPath = EventPath_NodeInfo;
                    break;
                case EventParameter.RoutingInfo:
                    eventPath = EventPath_RoutingInfo;
                    break;
                case EventParameter.SensorGeneric:
                    eventPath = ModuleEvents.Sensor_Generic;
                    break;
                case EventParameter.SensorTemperature:
                    eventPath = ModuleEvents.Sensor_Temperature;
                    break;
                case EventParameter.SensorHumidity:
                    eventPath = ModuleEvents.Sensor_Humidity;
                    break;
                case EventParameter.SensorLuminance:
                    eventPath = ModuleEvents.Sensor_Luminance;
                    break;
                case EventParameter.SensorMotion:
                    eventPath = ModuleEvents.Sensor_MotionDetect;
                    break;
                case EventParameter.AlarmGeneric:
                    eventPath = ModuleEvents.Sensor_Alarm;
                    // 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.ProtocolInfo.GenericType == (byte)GenericType.EntryControl)
                    {
                        eventPath = ModuleEvents.Status_DoorLock;
                        //! do not convert to string since Alarms accept ONLY numbers a string would be outputed as NaN
                        //! for now let it as is.
                        //eventValue = ((DoorLock.Alarm)(byte)value).ToString();
                    }
                    break;
                case EventParameter.AlarmDoorWindow:
                    eventPath = ModuleEvents.Sensor_DoorWindow;
                    break;
                case EventParameter.AlarmTampered:
                    eventPath = ModuleEvents.Sensor_Tamper;
                    break;
                case EventParameter.AlarmSmoke:
                    eventPath = ModuleEvents.Sensor_Smoke;
                    break;
                case EventParameter.AlarmCarbonMonoxide:
                    eventPath = ModuleEvents.Sensor_CarbonMonoxide;
                    break;
                case EventParameter.AlarmCarbonDioxide:
                    eventPath = ModuleEvents.Sensor_CarbonDioxide;
                    break;
                case EventParameter.AlarmHeat:
                    eventPath = ModuleEvents.Sensor_Heat;
                    break;
                case EventParameter.AlarmFlood:
                    eventPath = ModuleEvents.Sensor_Flood;
                    break;
                case EventParameter.DoorLockStatus:
                    eventPath = ModuleEvents.Status_DoorLock;
                    eventValue = ((DoorLock.Value)(byte)eventValue).ToString();
                    break;
                case EventParameter.ManufacturerSpecific:
                    ManufacturerSpecificInfo mf = (ManufacturerSpecificInfo)eventValue;
                    eventPath = EventPath_ManufacturerSpecific;
                    eventValue = mf.ManufacturerId + ":" + mf.TypeId + ":" + mf.ProductId;
                    break;
                case EventParameter.Configuration:
                    eventPath = EventPath_ConfigVariables + "." + eventData.Instance;
                    break;
                case EventParameter.Association:
                    var associationResponse = (Association.AssociationResponse)eventValue;
                    OnInterfacePropertyChanged(this.GetDomain(), eventData.Node.Id.ToString(), "ZWave Node", EventPath_Associations + ".Max", associationResponse.Max);
                    OnInterfacePropertyChanged(this.GetDomain(), eventData.Node.Id.ToString(), "ZWave Node", EventPath_Associations + ".Count", associationResponse.Count);
                    eventPath = EventPath_Associations + "." + associationResponse.GroupId; // TODO: implement generic group/node association instead of fixed one
                    eventValue = associationResponse.NodeList;
                    break;
                case EventParameter.MultiinstanceSwitchBinaryCount:
                    eventPath = EventPath_MultiInstance + ".SwitchBinary.Count";
                    break;
                case EventParameter.MultiinstanceSwitchMultilevelCount:
                    eventPath = EventPath_MultiInstance + ".SwitchMultiLevel.Count";
                    break;
                case EventParameter.MultiinstanceSensorBinaryCount:
                    eventPath = EventPath_MultiInstance + ".SensorBinary.Count";
                    break;
                case EventParameter.MultiinstanceSensorMultilevelCount:
                    eventPath = EventPath_MultiInstance + ".SensorMultiLevel.Count";
                    break;
                case EventParameter.MultiinstanceSwitchBinary:
                    eventPath = EventPath_MultiInstance + ".SwitchBinary." + eventData.Instance;
                    break;
                case EventParameter.MultiinstanceSwitchMultilevel:
                    eventPath = EventPath_MultiInstance + ".SwitchMultiLevel." + eventData.Instance;
                    break;
                case EventParameter.MultiinstanceSensorBinary:
                    eventPath = EventPath_MultiInstance + ".SensorBinary." + eventData.Instance;
                    break;
                case EventParameter.MultiinstanceSensorMultilevel:
                    eventPath = EventPath_MultiInstance + ".SensorMultiLevel." + eventData.Instance;
                    break;
                case EventParameter.WakeUpInterval:
                    eventPath = EventPath_WakeUpInterval;
                    break;
                case EventParameter.WakeUpSleepingStatus:
                    eventPath = "ZWaveNode.WakeUpSleepingStatus";
                    break;
                case EventParameter.WakeUpNotify:
                    eventPath = "ZWaveNode.WakeUpNotify";
                    break;
                case EventParameter.Basic:
                    eventPath = EventPath_Basic;
                    {
                        double normalizedLevel = GetNormalizedValue((double)eventValue);
                        OnInterfacePropertyChanged(this.GetDomain(), eventData.Node.Id.ToString(), "ZWave Node", ModuleEvents.Status_Level + (eventData.Instance == 0 ? "" : "." + eventData.Instance), normalizedLevel.ToString(CultureInfo.InvariantCulture));
                    }
                    SetNodeLevel(eventData.Node, Convert.ToByte((double)eventValue));
                    break;
                case EventParameter.SwitchBinary:
                    eventPath = EventPath_SwitchBinary;
                    {
                        double normalizedLevel = GetNormalizedValue((double)eventValue);
                        OnInterfacePropertyChanged(this.GetDomain(), eventData.Node.Id.ToString(), "ZWave Node", ModuleEvents.Status_Level + (eventData.Instance == 0 ? "" : "." + eventData.Instance), normalizedLevel.ToString(CultureInfo.InvariantCulture));
                    }
                    SetNodeLevel(eventData.Node, Convert.ToByte((double)eventValue));
                    break;
                case EventParameter.SwitchMultilevel:
                    eventPath = EventPath_SwitchMultilevel;
                    {
                        double normalizedLevel = GetNormalizedValue((double)eventValue);
                        OnInterfacePropertyChanged(this.GetDomain(), eventData.Node.Id.ToString(), "ZWave Node", ModuleEvents.Status_Level + (eventData.Instance == 0 ? "" : "." + eventData.Instance), normalizedLevel.ToString(CultureInfo.InvariantCulture));
                    }
                    SetNodeLevel(eventData.Node, Convert.ToByte((double)eventValue));
                    break;
                case EventParameter.ThermostatMode:
                    eventPath = "Thermostat.Mode";
                    eventValue = ((ThermostatMode.Value)eventValue).ToString();
                    break;
                case EventParameter.ThermostatOperatingState:
                    eventPath = "Thermostat.OperatingState";
                    eventValue = ((ThermostatOperatingState.Value)eventValue).ToString();
                    break;
                case EventParameter.ThermostatFanMode:
                    eventPath = "Thermostat.FanMode";
                    eventValue = ((ThermostatFanMode.Value)eventValue).ToString();
                    break;
                case EventParameter.ThermostatFanState:
                    eventPath = "Thermostat.FanState";
                    eventValue = ((ThermostatFanState.Value)eventValue).ToString();
                    break;
                case EventParameter.ThermostatHeating:
                    eventPath = "Thermostat.Heating";
                    break;
                case EventParameter.ThermostatSetBack:
                    eventPath = "Thermostat.SetBack";
                    break;
                case EventParameter.ThermostatSetPoint:
                    // value stores a dynamic object with Type and Value fields: value = { Type = ..., Value = ... }
                    eventPath = "Thermostat.SetPoint." + ((ThermostatSetPoint.Value)((dynamic)eventValue).Type).ToString();
                    eventValue = ((dynamic)eventValue).Value;
                    break;
                case EventParameter.UserCode:
                    eventPath = "EntryControl.UserCode";
                    eventValue = ((ZWaveLib.Values.UserCodeValue)eventValue).TagCodeToHexString();
                    break;
                case EventParameter.SecurityNodeInformationFrame:
                    eventPath = "ZWaveNode.SecuredNodeInfo";
                    break;
                case EventParameter.VersionCommandClass:
                    if (eventValue is NodeVersion)
                    {
                        eventPath = "ZWaveNode.VersionReport";
                        eventValue = (eventValue as NodeVersion).ToString();
                    }
                    else
                    {
                        eventPath = "ZWaveNode.Version." + (eventValue as ZWaveLib.Values.VersionValue).CmdClass;
                        eventValue = (eventValue as ZWaveLib.Values.VersionValue).Version;
                    }
                    break;
                default:
                    MigService.Log.Warn("Unhandled event from node {0} (Event={1}, Id={2}, Value={3})", eventData.Node.Id, eventData.Parameter, eventData.Instance, eventValue);
                    break;
                }

                OnInterfacePropertyChanged(this.GetDomain(), eventData.Node.Id.ToString(), "ZWave Node", eventPath, eventValue);

                eventData = eventData.NestedEvent;
            }
        }
Пример #5
0
        private void Controller_NodeUpdated(object sender, NodeUpdatedEventArgs args)
        {
            var eventData = args.Event;
            while (eventData != null)
            {
                string eventPath = "UnknwonParameter";
                object eventValue = eventData.Value;
                switch (eventData.Parameter)
                {
                case EventParameter.MeterKwHour:
                    eventPath = GetIndexedParameterPath(ModuleParameters.MODPAR_METER_KW_HOUR, eventData.Instance);
                    break;
                case EventParameter.MeterKvaHour:
                    eventPath = GetIndexedParameterPath(ModuleParameters.MODPAR_METER_KVA_HOUR, eventData.Instance);
                    break;
                case EventParameter.MeterWatt:
                    eventPath = GetIndexedParameterPath(ModuleParameters.MODPAR_METER_WATTS, eventData.Instance);
                    break;
                case EventParameter.MeterPulses:
                    eventPath = GetIndexedParameterPath(ModuleParameters.MODPAR_METER_PULSES, eventData.Instance);
                    break;
                case EventParameter.MeterAcVolt:
                    eventPath = GetIndexedParameterPath(ModuleParameters.MODPAR_METER_AC_VOLT, eventData.Instance);
                    break;
                case EventParameter.MeterAcCurrent:
                    eventPath = GetIndexedParameterPath(ModuleParameters.MODPAR_METER_AC_CURRENT, eventData.Instance);
                    break;
                case EventParameter.MeterPower:
                    eventPath = 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 = EventPath_Battery,
                        Value = eventValue
                    });
                    eventPath = ModuleParameters.MODPAR_STATUS_BATTERY;
                    break;
                case EventParameter.NodeInfo:
                    eventPath = EventPath_NodeInfo;
                    break;
                case EventParameter.RoutingInfo:
                    eventPath = EventPath_RoutingInfo;
                    break;
                case EventParameter.SensorGeneric:
                    eventPath = ModuleParameters.MODPAR_SENSOR_GENERIC;
                    break;
                case EventParameter.SensorTemperature:
                    eventPath = ModuleParameters.MODPAR_SENSOR_TEMPERATURE;
                    break;
                case EventParameter.SensorHumidity:
                    eventPath = ModuleParameters.MODPAR_SENSOR_HUMIDITY;
                    break;
                case EventParameter.SensorLuminance:
                    eventPath = ModuleParameters.MODPAR_SENSOR_LUMINANCE;
                    break;
                case EventParameter.SensorMotion:
                    eventPath = ModuleParameters.MODPAR_SENSOR_MOTIONDETECT;
                    break;
                case EventParameter.AlarmGeneric:
                    eventPath = 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.ProtocolInfo.GenericType == (byte)GenericType.EntryControl)
                    {
                        eventPath = EventPath_DoorLock;
                        //! do not convert to string since Alarms accept ONLY numbers a string would be outputed as NaN
                        //! for now let it as is.
                        //eventValue = ((DoorLock.Alarm)(byte)value).ToString();
                    }
                    break;
                case EventParameter.AlarmDoorWindow:
                    eventPath = ModuleParameters.MODPAR_SENSOR_DOORWINDOW;
                    break;
                case EventParameter.AlarmTampered:
                    eventPath = ModuleParameters.MODPAR_SENSOR_TAMPER;
                    break;
                case EventParameter.AlarmSmoke:
                    eventPath = ModuleParameters.MODPAR_SENSOR_ALARM_SMOKE;
                    break;
                case EventParameter.AlarmCarbonMonoxide:
                    eventPath = ModuleParameters.MODPAR_SENSOR_ALARM_CARBONMONOXIDE;
                    break;
                case EventParameter.AlarmCarbonDioxide:
                    eventPath = ModuleParameters.MODPAR_SENSOR_ALARM_CARBONDIOXIDE;
                    break;
                case EventParameter.AlarmHeat:
                    eventPath = ModuleParameters.MODPAR_SENSOR_ALARM_HEAT;
                    break;
                case EventParameter.AlarmFlood:
                    eventPath = ModuleParameters.MODPAR_SENSOR_ALARM_FLOOD;
                    break;
                case EventParameter.DoorLockStatus:
                    eventPath = ModuleParameters.MODPAR_STATUS_DOORLOCK;
                    eventValue = ((DoorLock.Value)(byte)eventValue).ToString();
                    break;
                case EventParameter.ManufacturerSpecific:
                    ManufacturerSpecificInfo mf = (ManufacturerSpecificInfo)eventValue;
                    eventPath = EventPath_ManufacturerSpecific;
                    eventValue = mf.ManufacturerId + ":" + mf.TypeId + ":" + mf.ProductId;
                    break;
                case EventParameter.Configuration:
                    eventPath = EventPath_ConfigVariables + "." + eventData.Instance;
                    break;
                case EventParameter.Association:
                    var associationResponse = (Association.AssociationResponse)eventValue;
                    RaisePropertyChanged(new InterfacePropertyChangedAction() {
                        Domain = this.Domain,
                        SourceId = eventData.Node.Id.ToString(),
                        SourceType = "ZWave Node",
                        Path = EventPath_Associations + ".Max",
                        Value = associationResponse.Max
                    });
                    RaisePropertyChanged(new InterfacePropertyChangedAction() {
                        Domain = this.Domain,
                        SourceId = eventData.Node.Id.ToString(),
                        SourceType = "ZWave Node",
                        Path = EventPath_Associations + ".Count",
                        Value = associationResponse.Count
                    });
                    eventPath = EventPath_Associations + "." + associationResponse.GroupId; // TODO: implement generic group/node association instead of fixed one
                    eventValue = associationResponse.NodeList;
                    break;
                case EventParameter.MultiinstanceSwitchBinaryCount:
                    eventPath = EventPath_MultiInstance + ".SwitchBinary.Count";
                    break;
                case EventParameter.MultiinstanceSwitchMultilevelCount:
                    eventPath = EventPath_MultiInstance + ".SwitchMultiLevel.Count";
                    break;
                case EventParameter.MultiinstanceSensorBinaryCount:
                    eventPath = EventPath_MultiInstance + ".SensorBinary.Count";
                    break;
                case EventParameter.MultiinstanceSensorMultilevelCount:
                    eventPath = EventPath_MultiInstance + ".SensorMultiLevel.Count";
                    break;
                case EventParameter.MultiinstanceSwitchBinary:
                    eventPath = EventPath_MultiInstance + ".SwitchBinary." + eventData.Instance;
                    break;
                case EventParameter.MultiinstanceSwitchMultilevel:
                    eventPath = EventPath_MultiInstance + ".SwitchMultiLevel." + eventData.Instance;
                    break;
                case EventParameter.MultiinstanceSensorBinary:
                    eventPath = EventPath_MultiInstance + ".SensorBinary." + eventData.Instance;
                    break;
                case EventParameter.MultiinstanceSensorMultilevel:
                    eventPath = EventPath_MultiInstance + ".SensorMultiLevel." + eventData.Instance;
                    break;
                case EventParameter.WakeUpInterval:
                    eventPath = EventPath_WakeUpInterval;
                    break;
                case EventParameter.WakeUpNotify:
                    eventPath = "ZWaveNode.WakeUpNotify";
                    break;
                case EventParameter.Level:
                    eventPath = EventPath_Basic;
                    // binary switches have [0/255], while multilevel switches [0-99],
                    // normalize Status.Level to [0.0 <-> 1.0]
                    double normalizedval = (Math.Round((double)eventValue / 100D, 2));
                    if (normalizedval >= 0.99)
                        normalizedval = 1.0;
                    RaisePropertyChanged(new InterfacePropertyChangedAction() {
                        Domain = this.Domain,
                        SourceId = eventData.Node.Id.ToString(),
                        SourceType = "ZWave Node",
                        Path = ModuleParameters.MODPAR_STATUS_LEVEL + (eventData.Instance == 0 ? "" : "." + eventData.Instance),
                        Value = normalizedval.ToString(CultureInfo.InvariantCulture)
                    });
                    break;
                case EventParameter.ThermostatMode:
                    eventPath = "Thermostat.Mode";
                    eventValue = ((ThermostatMode.Value)eventValue).ToString();
                    break;
                case EventParameter.ThermostatOperatingState:
                    eventPath = "Thermostat.OperatingState";
                    eventValue = ((ThermostatOperatingState.Value)eventValue).ToString();
                    break;
                case EventParameter.ThermostatFanMode:
                    eventPath = "Thermostat.FanMode";
                    eventValue = ((ThermostatFanMode.Value)eventValue).ToString();
                    break;
                case EventParameter.ThermostatFanState:
                    eventPath = "Thermostat.FanState";
                    eventValue = ((ThermostatFanState.Value)eventValue).ToString();
                    break;
                case EventParameter.ThermostatHeating:
                    eventPath = "Thermostat.Heating";
                    break;
                case EventParameter.ThermostatSetBack:
                    eventPath = "Thermostat.SetBack";
                    break;
                case EventParameter.ThermostatSetPoint:
                    // value stores a dynamic object with Type and Value fields: value = { Type = ..., Value = ... }
                    eventPath = "Thermostat.SetPoint." + ((ThermostatSetPoint.Value)((dynamic)eventValue).Type).ToString();
                    eventValue = ((dynamic)eventValue).Value;
                    break;
                case EventParameter.UserCode:
                    eventPath = "EntryControl.UserCode";
                    eventValue = ((ZWaveLib.Values.UserCodeValue)eventValue).TagCodeToHexString();
                    break;
                case EventParameter.SecurityNodeInformationFrame:
                    eventPath = "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, eventValue);
                    break;
                }

                if (waitEventPath == eventPath)
                {
                    waitEventValue = eventValue;
                    responseAck.Set();
                }

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

                eventData = eventData.NestedEvent;
            }
        }