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; } }
//int pid, EventParameter peventtype, object value) internal void RaiseUpdateParameterEvent(ZWaveEvent zevent) { if (ParameterChanged != null) { ParameterChanged(this, zevent); } }
private void znode_ParameterChanged(object sender, ZWaveEvent eventData) { // Route node event RaiseUpdateParameterEvent(eventData); }
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); }
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); }