public L_Message(String RAW_Message, House _theHouse, Dictionary <String, IMAXDevice> OutputDeviceList) { DevicesInThisMessage = new List <IMAXDevice>(); if (RAW_Message.Length < 2) { throw new MAXException("Unable to process the RAW Message."); } if (!RAW_Message.StartsWith("L:")) { throw new MAXException("Unable to process the RAW Message. Not a L Message."); } RawMessageDecoded = Base64.Decode(RAW_Message.Remove(0, 2)); // Tokenize RAW Message List <byte[]> Tokenized = TokenizeMessage.Tokenize(RawMessageDecoded); foreach (byte[] array in Tokenized) { StringBuilder sb = new StringBuilder(); for (int i = 0; i <= 2; i++) { sb.Append(array[i]); } // get data 1 and data 2 out // on position 5,6 byte Data1 = array[4]; byte Data2 = array[5]; String binValueData1 = Convert.ToString(Data1, 2); binValueData1 = binValueData1.PadLeft(8, '0'); String binValueData2 = Convert.ToString(Data2, 2); binValueData2 = binValueData2.PadLeft(8, '0'); Int32 Cursor = 7; // the current position, skipping ?1, String RFAddress = sb.ToString(); #region look for this RF Adress in the House's device list List <IMAXDevice> AllDevices = _theHouse.GetAllDevices(); IMAXDevice foundDevice = null; foreach (IMAXDevice _device in AllDevices) { if (_device.RFAddress == RFAddress) { if (_device.Type == DeviceTypes.HeatingThermostat) { foundDevice = new HeatingThermostat(); foundDevice.AssociatedRoom = _device.AssociatedRoom; foundDevice.Name = _device.Name; foundDevice.RFAddress = _device.RFAddress; foundDevice.SerialNumber = _device.SerialNumber; } if (_device.Type == DeviceTypes.ShutterContact) { foundDevice = new ShutterContact(); foundDevice.AssociatedRoom = _device.AssociatedRoom; foundDevice.Name = _device.Name; foundDevice.RFAddress = _device.RFAddress; foundDevice.SerialNumber = _device.SerialNumber; } break; } } #endregion if (foundDevice != null) { // remove the device from the house to add it later again... DevicesInThisMessage.Add(foundDevice); #region HeatingThermostat if (foundDevice.Type == DeviceTypes.HeatingThermostat) { HeatingThermostat KnownDevice = (HeatingThermostat)foundDevice; #region get all those flags out of Data1 and Data2 #region Valid if (binValueData1[3] == '1') { KnownDevice.Valid = true; } else { KnownDevice.Valid = false; } #endregion #region Error if (binValueData1[4] == '1') { KnownDevice.Error = true; } else { KnownDevice.Error = false; } #endregion #region IsAnswer if (binValueData1[5] == '1') { KnownDevice.IsAnswer = true; } else { KnownDevice.IsAnswer = false; } #endregion #region LowBattery if (binValueData2[0] == '1') { KnownDevice.LowBattery = true; } else { KnownDevice.LowBattery = false; } #endregion #region LinkError if (binValueData2[1] == '1') { KnownDevice.LinkError = true; } else { KnownDevice.LinkError = false; } #endregion #region PanelLock if (binValueData2[2] == '1') { KnownDevice.PanelLock = true; } else { KnownDevice.PanelLock = false; } #endregion #region GatewayOK if (binValueData2[3] == '1') { KnownDevice.GatewayOK = true; } else { KnownDevice.GatewayOK = false; } #endregion #region Mode String ModeValue = binValueData2[6] + "" + binValueData2[7]; switch (ModeValue) { case "00": KnownDevice.Mode = ThermostatModes.automatic; break; case "01": KnownDevice.Mode = ThermostatModes.manual; break; case "10": KnownDevice.Mode = ThermostatModes.vacation; break; case "11": KnownDevice.Mode = ThermostatModes.boost; break; default: break; } #endregion #endregion // hurray, we've got a device we know how to handle B-) ((HeatingThermostat)foundDevice).Temperature = array[Cursor] / 2; Cursor++; OutputDeviceList.Add(KnownDevice.SerialNumber, KnownDevice); } #endregion #region ShutterContact if (foundDevice.Type == DeviceTypes.ShutterContact) { ShutterContact KnownDevice = (ShutterContact)foundDevice; #region get all those flags out of Data1 and Data2 #region Valid if (binValueData1[3] == '1') { KnownDevice.Valid = true; } else { KnownDevice.Valid = false; } #endregion #region Error if (binValueData1[4] == '1') { KnownDevice.Error = true; } else { KnownDevice.Error = false; } #endregion #region IsAnswer if (binValueData1[5] == '1') { KnownDevice.IsAnswer = true; } else { KnownDevice.IsAnswer = false; } #endregion #region LowBattery if (binValueData2[0] == '1') { KnownDevice.LowBattery = true; } else { KnownDevice.LowBattery = false; } #endregion #region LinkError if (binValueData2[1] == '1') { KnownDevice.LinkError = true; } else { KnownDevice.LinkError = false; } #endregion #region PanelLock if (binValueData2[2] == '1') { KnownDevice.PanelLock = true; } else { KnownDevice.PanelLock = false; } #endregion #region GatewayOK if (binValueData2[3] == '1') { KnownDevice.GatewayOK = true; } else { KnownDevice.GatewayOK = false; } #endregion #region Mode String ModeValue = binValueData2[6] + "" + binValueData2[7]; switch (ModeValue) { case "00": KnownDevice.ShutterState = ShutterContactModes.closed; break; case "10": KnownDevice.ShutterState = ShutterContactModes.open; break; default: break; } #endregion #endregion OutputDeviceList.Add(KnownDevice.SerialNumber, KnownDevice); } #endregion } } }
/// <summary> /// This method calculates the difference between house1 and house2 - whereas house1 is the old house2 the new one /// </summary> public static List <IDeviceDiffSet> CalculateDifferences(Dictionary <String, IMAXDevice> DevicesHouse1, Dictionary <String, IMAXDevice> DevicesHouse2) { List <IDeviceDiffSet> Differences = new List <IDeviceDiffSet>(); foreach (KeyValuePair <String, IMAXDevice> House1KVPair in DevicesHouse1) { // now we have a device from house 1 - we need to get that same device in house 2 if (DevicesHouse2.ContainsKey(House1KVPair.Key)) { // we got it IMAXDevice House2Device = DevicesHouse2[House1KVPair.Key]; if (House1KVPair.Value.Type == DeviceTypes.HeatingThermostat) { // HeatingThermostat HeatingThermostatDiff Diff = null; HeatingThermostat Device1 = (HeatingThermostat)House1KVPair.Value; HeatingThermostat Device2 = (HeatingThermostat)House2Device; if (Device1.LowBattery != Device2.LowBattery) { if (Diff == null) { Diff = new HeatingThermostatDiff(Device2.Name, Device2.AssociatedRoom.RoomID, Device2.AssociatedRoom.RoomName); } if (Device2.LowBattery) { Diff.LowBattery = BatteryStatus.lowbattery; } else { Diff.LowBattery = BatteryStatus.ok; } } if (Device1.Mode != Device2.Mode) { if (Diff == null) { Diff = new HeatingThermostatDiff(Device2.Name, Device2.AssociatedRoom.RoomID, Device2.AssociatedRoom.RoomName); } Diff.Mode = Device2.Mode; } if (Device1.Temperature != Device2.Temperature) { if (Diff == null) { Diff = new HeatingThermostatDiff(Device2.Name, Device2.AssociatedRoom.RoomID, Device2.AssociatedRoom.RoomName); } Diff.Temperature = Device2.Temperature; } if (Diff != null) { if (Diff.Temperature != 0) { Differences.Add(Diff); } } } else if (House1KVPair.Value.Type == DeviceTypes.ShutterContact) { // ShutterContact ShutterContactDiff Diff = null; ShutterContact Device1 = (ShutterContact)House1KVPair.Value; ShutterContact Device2 = (ShutterContact)House2Device; if (Device1.LowBattery != Device2.LowBattery) { if (Diff == null) { Diff = new ShutterContactDiff(Device2.Name, Device2.AssociatedRoom.RoomID, Device2.AssociatedRoom.RoomName); } if (Device2.LowBattery) { Diff.LowBattery = BatteryStatus.lowbattery; } else { Diff.LowBattery = BatteryStatus.ok; } } if (Device1.ShutterState != Device2.ShutterState) { if (Diff == null) { Diff = new ShutterContactDiff(Device2.Name, Device2.AssociatedRoom.RoomID, Device2.AssociatedRoom.RoomName); } Diff.ShutterState = Device2.ShutterState; } if (Diff != null) { Differences.Add(Diff); } } } } return(Differences); }