public async Task ReadValue() { try { Entities = new IndustrialMonitoringEntities(); if (this.DefinationType == ItemDefinationType.SqlDefined) { if (this.Type == ItemType.Digital) { SubscriberBool = new NetworkVariableBufferedSubscriber <bool>(this.Location); SubscriberBool.Connect(); } else if (this.Type == ItemType.Analog) { SubscriberInt = new NetworkVariableBufferedSubscriber <dynamic>(this.Location); SubscriberInt.Connect(); } } else if (this.DefinationType == ItemDefinationType.BACnet) { if (BACnetDevice == null) { this.BACnetDevice = BACnetDevice.Instance; } string ip = ItemObj.BACnetIP; int port = ItemObj.BACnetPort.Value; IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(ip), port); uint instance = (uint)ItemObj.BACnetControllerInstance.Value; DeviceBaCnet = new Device("Device", 0, 0, endPoint, 0, instance); } string value = "-1000"; if (this.DefinationType == ItemDefinationType.SqlDefined) { if (this.Type == ItemType.Digital) { var data = SubscriberBool.ReadData(); value = Convert.ToInt32(data.GetValue()).ToString(); } else if (this.Type == ItemType.Analog) { var data = SubscriberInt.ReadData(); value = Math.Round(data.GetValue(), 2).ToString(); } } else if (this.DefinationType == ItemDefinationType.CustomDefiend) { switch (this.ItemId) { case 10: value = (BSProcessDataServiceClient.GetPreHeatingZoneTemperature() / 10).ToString(); break; case 13: value = BSProcessDataServiceClient.GetSterilizerZoneTemperature().ToString(); break; case 14: value = (BSProcessDataServiceClient.GetCoolingZoneTemperature() / 10).ToString(); break; } } else if (this.DefinationType == ItemDefinationType.BACnet) { if (this.Type == ItemType.Digital) { BACnetEnums.BACNET_OBJECT_TYPE bacnetType = (BACnetEnums.BACNET_OBJECT_TYPE)ItemObj.BACnetItemType.Value; uint itemInstance = (uint)ItemObj.BACnetItemInstance.Value; value = BACnetDevice.ReadValue(DeviceBaCnet, bacnetType, itemInstance).ToString(); } else if (Type == ItemType.Analog) { BACnetEnums.BACNET_OBJECT_TYPE bacnetType = (BACnetEnums.BACNET_OBJECT_TYPE)ItemObj.BACnetItemType.Value; uint itemInstance = (uint)ItemObj.BACnetItemInstance.Value; string preValue = BACnetDevice.ReadValue(DeviceBaCnet, bacnetType, itemInstance).ToString(); double preValueDouble = double.Parse(preValue); value = Math.Round(preValueDouble, 2).ToString(); } } lock (padlock) { if (value == null) { return; } if (value == "-1000") { return; } double valueDouble = double.Parse(value); bool condition = !string.IsNullOrEmpty(ItemObj.MinRange) && !string.IsNullOrEmpty(ItemObj.MaxRange); if (condition) { double minRange = double.Parse(ItemObj.MinRange); double maxRange = double.Parse(ItemObj.MaxRange); bool shouldNormalize = false; if (ItemObj.NormalizeWhenOutOfRange != null) { shouldNormalize = ItemObj.NormalizeWhenOutOfRange.Value; } if (valueDouble < minRange) { if (shouldNormalize) { value = ItemObj.MinRange; } else { return; } } if (valueDouble > maxRange) { if (shouldNormalize) { value = ItemObj.MaxRange; } else { return; } } } // detect outliers bool isOutlier = false; int outlierId = 0; int numberOfDataForBoxplot = 0; if (ItemObj.NumberOfDataForBoxplot != null) { numberOfDataForBoxplot = ItemObj.NumberOfDataForBoxplot.Value; } if (numberOfDataForBoxplot > 2) { if (this.Type == ItemType.Analog) { var lastData = Entities.ItemsLogRawDatas.Where(x => x.ItemId == ItemId).OrderByDescending(x => x.ItemLogRawDataId).Take(numberOfDataForBoxplot).ToList(); if (lastData.Count > 3) { List <double> lastDataInDouble = new List <double>(); foreach (var itemsLog in lastData) { double currentValue = double.Parse(itemsLog.Value); lastDataInDouble.Add(currentValue); } var iqr = Statistics.InterquartileRange(lastDataInDouble); var lqr = Statistics.LowerQuartile(lastDataInDouble); var uqr = Statistics.UpperQuartile(lastDataInDouble); if (valueDouble > 3 * iqr + uqr) { isOutlier = true; } if (valueDouble < lqr - 3 * iqr) { isOutlier = true; } if (isOutlier) { LogOutlier logOutlier = new LogOutlier(); logOutlier.ItemId = this.ItemId; logOutlier.IQR = iqr.ToString(); logOutlier.LQR = lqr.ToString(); logOutlier.UQR = uqr.ToString(); logOutlier.Value = valueDouble.ToString(); logOutlier.Time = DateTime.Now; Entities.LogOutliers.Add(logOutlier); Entities.SaveChanges(); outlierId = logOutlier.OutlierId; } } } } // // Save in ItemsLogRawData var lastItemLogRaw = Entities.ItemsLogRawDatas.OrderByDescending(x => x.ItemLogRawDataId).FirstOrDefault(x => x.ItemId == ItemId); if (lastItemLogRaw == null) { ItemsLogRawData rawData = new ItemsLogRawData(); rawData.ItemId = ItemId; rawData.Value = value; rawData.Time = DateTime.Now; if (outlierId > 0) { rawData.OutlierId = outlierId; } Entities.ItemsLogRawDatas.Add(rawData); Entities.SaveChanges(); lastItemLogRaw = rawData; } if (SaveInItemsLogWhen == WhenToLog.OnTimerElapsed) { TimeSpan timeSpan = DateTime.Now - lastItemLogRaw.Time; if (timeSpan.TotalSeconds >= SaveInItemsLogTimeInterval) { ItemsLogRawData rawData = new ItemsLogRawData(); rawData.ItemId = ItemId; rawData.Value = value; rawData.Time = DateTime.Now; if (outlierId > 0) { rawData.OutlierId = outlierId; } Entities.ItemsLogRawDatas.Add(rawData); Entities.SaveChanges(); } } else if (SaveInItemsLogWhen == WhenToLog.OnChange) { if (lastItemLogRaw.Value != value) { ItemsLogRawData rawData = new ItemsLogRawData(); rawData.ItemId = ItemId; rawData.Value = value; rawData.Time = DateTime.Now; if (outlierId > 0) { rawData.OutlierId = outlierId; } Entities.ItemsLogRawDatas.Add(rawData); Entities.SaveChanges(); } else { if (DateTime.Now - lastItemLogRaw.Time > new TimeSpan(0, 0, 1, 0)) { ItemsLogRawData rawData = new ItemsLogRawData(); rawData.ItemId = ItemId; rawData.Value = value; rawData.Time = DateTime.Now; if (outlierId > 0) { rawData.OutlierId = outlierId; } Entities.ItemsLogRawDatas.Add(rawData); Entities.SaveChanges(); } } } // if (!isOutlier) { var lastItemLog = Entities.ItemsLogs.OrderByDescending(x => x.ItemLogId).FirstOrDefault(x => x.ItemId == ItemId); if (lastItemLog == null) { ItemsLog itemsLog = new ItemsLog(); itemsLog.ItemId = this.ItemId; itemsLog.Time = DateTime.Now; itemsLog.Value = value; Entities.ItemsLogs.Add(itemsLog); Entities.SaveChanges(); lastItemLog = itemsLog; } if (SaveInItemsLogWhen == WhenToLog.OnTimerElapsed) { TimeSpan timeSpan = DateTime.Now - lastItemLog.Time; if (timeSpan.TotalSeconds >= SaveInItemsLogTimeInterval) { ItemsLog itemsLog = new ItemsLog(); itemsLog.ItemId = this.ItemId; itemsLog.Time = DateTime.Now; itemsLog.Value = value; Entities.ItemsLogs.Add(itemsLog); Entities.SaveChanges(); } } else if (SaveInItemsLogWhen == WhenToLog.OnChange) { if (lastItemLog.Value != value) { ItemsLog itemsLog = new ItemsLog(); itemsLog.ItemId = this.ItemId; itemsLog.Time = DateTime.Now; itemsLog.Value = value; Entities.ItemsLogs.Add(itemsLog); Entities.SaveChanges(); } else { if (DateTime.Now - lastItemLog.Time > new TimeSpan(0, 0, 1, 0)) { ItemsLog itemsLog = new ItemsLog(); itemsLog.ItemId = this.ItemId; itemsLog.Time = DateTime.Now; itemsLog.Value = value; Entities.ItemsLogs.Add(itemsLog); Entities.SaveChanges(); } } } var lastItemLogLatest = Entities.ItemsLogLatests.FirstOrDefault(x => x.ItemId == ItemId); if (lastItemLogLatest == null) { ItemsLogLatest itemsLogLatest = null; if (Entities.ItemsLogLatests.Any(x => x.ItemId == this.ItemId)) { itemsLogLatest = Entities.ItemsLogLatests.FirstOrDefault(x => x.ItemId == this.ItemId); itemsLogLatest.Time = DateTime.Now; itemsLogLatest.Value = value; } else { itemsLogLatest = new ItemsLogLatest(); itemsLogLatest.ItemId = this.ItemId; itemsLogLatest.Time = DateTime.Now; itemsLogLatest.Value = value; Entities.ItemsLogLatests.Add(itemsLogLatest); } Entities.SaveChanges(); lastItemLogLatest = itemsLogLatest; } if (SaveInItemsLogLastWhen == WhenToLog.OnTimerElapsed) { TimeSpan timeSpan = DateTime.Now - lastItemLogLatest.Time; if (timeSpan.TotalSeconds >= SaveInItemsLogLastesTimeInterval) { ItemsLogLatest itemsLogLatest = null; if (Entities.ItemsLogLatests.Any(x => x.ItemId == this.ItemId)) { itemsLogLatest = Entities.ItemsLogLatests.FirstOrDefault(x => x.ItemId == this.ItemId); itemsLogLatest.Time = DateTime.Now; itemsLogLatest.Value = value; } else { itemsLogLatest = new ItemsLogLatest(); itemsLogLatest.ItemId = this.ItemId; itemsLogLatest.Time = DateTime.Now; itemsLogLatest.Value = value; Entities.ItemsLogLatests.Add(itemsLogLatest); } Entities.SaveChanges(); } } else if (SaveInItemsLogLastWhen == WhenToLog.OnChange) { if (lastItemLogLatest.Value != value) { ItemsLogLatest itemsLogLatest = null; if (Entities.ItemsLogLatests.Any(x => x.ItemId == this.ItemId)) { itemsLogLatest = Entities.ItemsLogLatests.FirstOrDefault(x => x.ItemId == this.ItemId); itemsLogLatest.Time = DateTime.Now; itemsLogLatest.Value = value; } else { itemsLogLatest = new ItemsLogLatest(); itemsLogLatest.ItemId = this.ItemId; itemsLogLatest.Time = DateTime.Now; itemsLogLatest.Value = value; Entities.ItemsLogLatests.Add(itemsLogLatest); } Entities.SaveChanges(); } else { if (DateTime.Now - lastItemLogLatest.Time > new TimeSpan(0, 0, 1, 0)) { ItemsLogLatest itemsLogLatest = null; if (Entities.ItemsLogLatests.Any(x => x.ItemId == this.ItemId)) { itemsLogLatest = Entities.ItemsLogLatests.FirstOrDefault(x => x.ItemId == this.ItemId); itemsLogLatest.Time = DateTime.Now; itemsLogLatest.Value = value; } else { itemsLogLatest = new ItemsLogLatest(); itemsLogLatest.ItemId = this.ItemId; itemsLogLatest.Time = DateTime.Now; itemsLogLatest.Value = value; Entities.ItemsLogLatests.Add(itemsLogLatest); } Entities.SaveChanges(); } } } } } } catch (Exception ex) { Logger.LogMonitoringServiceLibrary(ex); } }
/// <summary> /// Adds bacnet device details. /// </summary> private static void AddBackNetDeviceDetail() { if (bacNetDeviceModel != null && bacNetDeviceModel.BACnetDeviceList != null) { List <BACnetDevice> bACnetDeviceLst = new List <BACnetDevice>(); List <BACnetDeviceMapping> bACnetDeviceMappingLst = new List <BACnetDeviceMapping>(); foreach (var deviceDetail in bacNetDeviceModel.BACnetDeviceList) { IList <BacnetValue> objValueLst; if (bacNetClient == null) { bacNetClient = BackNetClientInit.NewBackNetClient(); } bacNetClient.ReadPropertyRequest(deviceDetail.BacNetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_DEVICE, deviceDetail.DeviceId), BacnetPropertyIds.PROP_OBJECT_LIST, out objValueLst); if (objValueLst == null) { continue; } foreach (var objValue in objValueLst) { var isExistNetworkId = CheckIfExistNetworkAddress(deviceDetail.BacNetAddress.ToString(), (int)((BacnetObjectId)objValue.Value).Instance, (int)deviceDetail.DeviceId , ((BacnetObjectId)objValue.Value).Type.ToString()); if (isExistNetworkId == true) { continue; } IList <BacnetValue> objNameList; bacNetClient.ReadPropertyRequest(deviceDetail.BacNetAddress, new BacnetObjectId((BacnetObjectTypes)((BacnetObjectId)objValue.Value).Type, ((BacnetObjectId)objValue.Value).Instance), BacnetPropertyIds.PROP_OBJECT_NAME, out objNameList); if (deviceDetail.BacNetAddress.RoutedSource != null && deviceDetail.BacNetAddress.RoutedSource.net != null) { var bacNetdevice = new BACnetDevice { device_id = Convert.ToInt32(deviceDetail.DeviceId), network_id = deviceDetail.BacNetAddress.ToString(), object_type = ((BacnetObjectId)objValue.Value).type.ToString(), object_instance = Convert.ToInt32(((BacnetObjectId)objValue.Value).Instance.ToString()), object_name = objNameList != null && objNameList.Count > 0 ? objNameList[0].Value.ToString() : null, routed_source = deviceDetail.BacNetAddress.RoutedSource.ToString(), routed_net = deviceDetail.BacNetAddress.RoutedSource.net }; bACnetDeviceLst.Add(bacNetdevice); } int?suiteID = null, roomID = null; var objName = Enum.GetName(typeof(LutronFloorObjectType), LutronFloorObjectType.OBJECT_ANALOG_VALUE).ToString(); if (((BacnetObjectId)objValue.Value).type.ToString().ToUpper() == objName) { if (Convert.ToInt32(((BacnetObjectId)objValue.Value).Instance.ToString()) < 4) { suiteID = 1; } else { suiteID = 2; } roomID = Convert.ToInt32(((BacnetObjectId)objValue.Value).Instance.ToString()); } var bACnetDeviceMapping = new BACnetDeviceMapping { device_id = Convert.ToInt32(deviceDetail.DeviceId), floor_id = Convert.ToInt32(deviceDetail.DeviceId), suite_id = suiteID, room_id = roomID, object_instance = Convert.ToInt32(((BacnetObjectId)objValue.Value).Instance.ToString()) }; bACnetDeviceMappingLst.Add(bACnetDeviceMapping); } } if (bACnetDeviceLst.Count() > 0) { AddBacNetDeviceDetail(bACnetDeviceLst); } if (bACnetDeviceMappingLst.Count() > 0) { AddBacNetMappingDetail(bACnetDeviceMappingLst); } } }