/// <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(); } }
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; }
/// <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); }
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; } }
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; } }