// this is the ELV MAX! Cube monitoring script public void Run() { while (running) { #region Update House try { if (theHouse != null) { previousHouse = theHouse.GetAllDevicesInADictionary(); } theHouse = new House(); // we obviously have enough paramteres, go on and try to connect TcpClient client = new TcpClient(); client.Connect(Hostname, Port); NetworkStream stream = client.GetStream(); // the read buffer (chosen quite big) byte[] myReadBuffer = new byte[4096 * 8]; List <String> Messages = new List <string>(); // to build the complete message StringBuilder myCompleteMessage = new StringBuilder(); int numberOfBytesRead = 0; MAXEncodeDecode DecoderEncoder = new MAXEncodeDecode(); keepRunning = true; // Incoming message may be larger than the buffer size. do { myCompleteMessage = new StringBuilder(); stream.ReadTimeout = 1000; try { numberOfBytesRead = stream.Read(myReadBuffer, 0, myReadBuffer.Length); myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead)); Messages.Add(myCompleteMessage.ToString()); } catch (Exception) { keepRunning = false; } }while(keepRunning); List <String> PreProcessedMessages = new List <string>(); // preprocess foreach (String _Message in Messages) { if (_Message.Remove(_Message.Length - 2).Contains("\r\n")) { String[] PMessages = _Message.Remove(_Message.Length - 2).Split(new char[1] { '\n' }, StringSplitOptions.RemoveEmptyEntries); foreach (String pmessage in PMessages) { PreProcessedMessages.Add(pmessage.Replace("\r", "") + "\r\n"); } } else { PreProcessedMessages.Add(_Message); } } // Analyze and Output Messages foreach (String _Message in PreProcessedMessages) { IMAXMessage Message = DecoderEncoder.ProcessMessage(_Message.ToString(), theHouse); /* if (Message != null) * { * ConsoleOutputLogger.WriteLine(_Message.ToString()); * ConsoleOutputLogger.WriteLine(Message.ToString()); * ConsoleOutputLogger.WriteLine(""); * }*/ } stream.Close(); client.Close(); } catch (Exception) { } #endregion #region Diff the house if (previousHouse != null) { // only if we already got two houses in here... List <IDeviceDiffSet> differences = DiffHouse.CalculateDifferences(previousHouse, theHouse.GetAllDevicesInADictionary()); if (differences.Count != 0) { foreach (IDeviceDiffSet _difference in differences) { StringBuilder sb = new StringBuilder(); sb.Append("S\t" + _difference.DeviceName + "\t" + _difference.DeviceType); if (_difference.DeviceType == DeviceTypes.HeatingThermostat) { HeatingThermostatDiff _heating = (HeatingThermostatDiff)_difference; ConsoleOutputLogger.WriteLine(_heating.ToString()); } if (_difference.DeviceType == DeviceTypes.ShutterContact) { ShutterContactDiff _shutter = (ShutterContactDiff)_difference; ConsoleOutputLogger.WriteLine(_shutter.ToString()); } } } } #endregion Thread.Sleep(MAXUpdateTime); } }
/// <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) { 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); }