public async Task GetDeviceDataAsync_NoDataAvailable_CustomMeasurementsNotHandled() { var customRule = new CustomMeasurementRule(); // Arrange var sensorDevice = new SensorDevice { SensorDeviceTypeId = "someSensorDeviceTypeId", Id = "someSensorId", CalculatedMeasurements = new List <CustomMeasurementRule>() { customRule } }; _dataReaderMock.Setup(d => d.ReadDeviceDataAsync(It.IsAny <SensorDevice>())) .ReturnsAsync(new List <MeasurementData>()); var config = new CollectorConfiguration { CollectorEnabled = true, BluetoothAdapterName = "test", ScanIntervalSeconds = 1, SensorDevices = new List <SensorDevice>() { sensorDevice }, SensorDeviceTypes = new List <SensorDeviceType>() }; _configMock.Setup(c => c.Value).Returns(config); var deviceScanner = _serviceProvider.GetService <Collector.DeviceScanner.DeviceScanner>(); // Act var fullList = await deviceScanner.GetDeviceDataAsync(config.SensorDevices); // Assert _loggerMock.Verify(l => l.Log(LogLevel.Error, It.IsAny <EventId>(), It.IsAny <It.IsAnyType>(), It.IsAny <Exception>(), (Func <It.IsAnyType, Exception, string>)It.IsAny <object>()), Times.Never, "No error should be raised in DeviceScanner if no measurement data available"); }
public async Task GetDeviceDataAsync_CustomMeasurementCreatedForCorrectSensor() { var sensorDeviceTypeId = "SomeSensorType"; var sensorDeviceId = "SomeSensorDevice"; var sensorId = "SomeSensor"; var anotherSensorDeviceId = "AnotherSensor"; var customRule = new CustomMeasurementRule() { Class = "MyClass", Id = "MyId", Name = "My custom measurement", Unit = "qwerty", Operator = Shared.Enum.OperatorType.IsGreaterThan, SensorId = sensorId, Type = Shared.Enum.ValueType.Default, Value = "10" }; // Arrange var sensorDevice = new SensorDevice { SensorDeviceTypeId = sensorDeviceTypeId, Id = sensorDeviceId, CalculatedMeasurements = new List <CustomMeasurementRule>() { customRule } }; var anotherSensorDevice = new SensorDevice { SensorDeviceTypeId = sensorDeviceTypeId, Id = anotherSensorDeviceId, CalculatedMeasurements = new List <CustomMeasurementRule>() { customRule } }; var sensorDeviceType = new SensorDeviceType() { Id = sensorDeviceTypeId, Sensors = new List <Sensor>() { new Sensor() { Id = sensorId, } } }; _dataReaderMock.Setup(d => d.ReadDeviceDataAsync(It.IsAny <SensorDevice>())) .ReturnsAsync(new List <MeasurementData>() { new MeasurementData() { SensorDeviceId = anotherSensorDeviceId, SensorId = sensorId, Value = "12" }, new MeasurementData() { SensorDeviceId = sensorDeviceId, SensorId = sensorId, Value = "8" } }); var config = new CollectorConfiguration { CollectorEnabled = true, BluetoothAdapterName = "test", ScanIntervalSeconds = 1, SensorDevices = new List <SensorDevice>() { sensorDevice, anotherSensorDevice }, SensorDeviceTypes = new List <SensorDeviceType>() { sensorDeviceType } }; _configMock.Setup(c => c.Value).Returns(config); var deviceScanner = _serviceProvider.GetService <Collector.DeviceScanner.DeviceScanner>(); // Act var fullList = await deviceScanner.GetDeviceDataAsync(config.SensorDevices); // Assert Assert.AreEqual(6, fullList.Count, "Amount of measurements is not correct"); var customMeasurement = fullList.First(f => f.SensorId.Equals(customRule.Id, StringComparison.OrdinalIgnoreCase)); Assert.IsFalse(bool.Parse(customMeasurement.Value), "Custom measurement value should be false for the correct sensor device"); }
public async Task GetDeviceDataAsync_WasLastTypeCustomMeasurement_SequenceWorksCorrectly() { var sensorDeviceTypeId = "SomeSensorType"; var sensorDeviceId = "SomeSensorDevice"; var sensorId = "SomeSensor"; var customRule = new CustomMeasurementRule() { Class = "MyClass", Id = "MyId", Name = "My custom measurement", Unit = "qwerty", Operator = Shared.Enum.OperatorType.IsGreaterThan, SensorId = sensorId, Type = Shared.Enum.ValueType.WasLast, Value = "1.66" }; // Arrange var sensorDevice = new SensorDevice { SensorDeviceTypeId = sensorDeviceTypeId, Id = sensorDeviceId, CalculatedMeasurements = new List <CustomMeasurementRule>() { customRule } }; var sensorDeviceType = new SensorDeviceType() { Id = sensorDeviceTypeId, Sensors = new List <Sensor>() { new Sensor() { Id = sensorId, } } }; _dataReaderMock.SetupSequence(d => d.ReadDeviceDataAsync(It.IsAny <SensorDevice>())) .ReturnsAsync(new List <MeasurementData>() { new MeasurementData() { SensorDeviceId = sensorDeviceId, SensorId = sensorId, Value = "0.1" } }) .ReturnsAsync(new List <MeasurementData>() { new MeasurementData() { SensorDeviceId = sensorDeviceId, SensorId = sensorId, Value = "2.1" } }) .ReturnsAsync(new List <MeasurementData>() { new MeasurementData() { SensorDeviceId = sensorDeviceId, SensorId = sensorId, Value = "0.1" } }) .ReturnsAsync(new List <MeasurementData>() { new MeasurementData() { SensorDeviceId = sensorDeviceId, SensorId = sensorId, Value = "2.1" } }) ; var config = new CollectorConfiguration { CollectorEnabled = true, BluetoothAdapterName = "test", ScanIntervalSeconds = 1, SensorDevices = new List <SensorDevice>() { sensorDevice }, SensorDeviceTypes = new List <SensorDeviceType>() { sensorDeviceType } }; _configMock.Setup(c => c.Value).Returns(config); var deviceScanner = _serviceProvider.GetService <Collector.DeviceScanner.DeviceScanner>(); // Act var fullList = await deviceScanner.GetDeviceDataAsync(config.SensorDevices); var customMeasurement = fullList.First(f => f.SensorId.Equals(customRule.Id, StringComparison.OrdinalIgnoreCase)); Assert.AreEqual("-1", customMeasurement.Value, "Value is not what expected when condition has not been true yet"); fullList = await deviceScanner.GetDeviceDataAsync(config.SensorDevices); customMeasurement = fullList.First(f => f.SensorId.Equals(customRule.Id, StringComparison.OrdinalIgnoreCase)); Assert.AreEqual("0", customMeasurement.Value, "Value is not what expected when condition became true"); // Wait more than one second to get "WasLast" value to get updated to 1 await Task.Delay(1200); fullList = await deviceScanner.GetDeviceDataAsync(config.SensorDevices); customMeasurement = fullList.First(f => f.SensorId.Equals(customRule.Id, StringComparison.OrdinalIgnoreCase)); Assert.AreEqual("1", customMeasurement.Value, "Value is not what expected when condition became false again"); fullList = await deviceScanner.GetDeviceDataAsync(config.SensorDevices); customMeasurement = fullList.First(f => f.SensorId.Equals(customRule.Id, StringComparison.OrdinalIgnoreCase)); Assert.AreEqual("0", customMeasurement.Value, "Value is not what expected when condition is true again"); }
public async Task GetDeviceDataAsync_WasLastTypeCustomMeasurementExists_HandleValueZeroAndMinusOne( Shared.Enum.OperatorType operatorType, string measurementValue, string customRuleValue, string expectedComparisonValue) { var sensorDeviceTypeId = "SomeSensorType"; var sensorDeviceId = "SomeSensorDevice"; var sensorId = "SomeSensor"; var customRule = new CustomMeasurementRule() { Class = "MyClass", Id = "MyId", Name = "My custom measurement", Unit = "qwerty", Operator = operatorType, SensorId = sensorId, Type = Shared.Enum.ValueType.WasLast, Value = customRuleValue }; // Arrange var sensorDevice = new SensorDevice { SensorDeviceTypeId = sensorDeviceTypeId, Id = sensorDeviceId, CalculatedMeasurements = new List <CustomMeasurementRule>() { customRule } }; var sensorDeviceType = new SensorDeviceType() { Id = sensorDeviceTypeId, Sensors = new List <Sensor>() { new Sensor() { Id = sensorId, } } }; _dataReaderMock.Setup(d => d.ReadDeviceDataAsync(It.IsAny <SensorDevice>())) .ReturnsAsync(new List <MeasurementData>() { new MeasurementData() { SensorDeviceId = sensorDeviceId, SensorId = sensorId, Value = measurementValue } }) ; var config = new CollectorConfiguration { CollectorEnabled = true, BluetoothAdapterName = "test", ScanIntervalSeconds = 1, SensorDevices = new List <SensorDevice>() { sensorDevice }, SensorDeviceTypes = new List <SensorDeviceType>() { sensorDeviceType } }; _configMock.Setup(c => c.Value).Returns(config); var deviceScanner = _serviceProvider.GetService <Collector.DeviceScanner.DeviceScanner>(); // Act var fullList = await deviceScanner.GetDeviceDataAsync(config.SensorDevices); // Assert Assert.AreEqual(2, fullList.Count, "Amount of measurements is not correct"); var customMeasurement = fullList.First(f => f.SensorId.Equals(customRule.Id, StringComparison.OrdinalIgnoreCase)); Assert.AreEqual(sensorDeviceId, customMeasurement.SensorDeviceId, "Sensor device ID does not match"); Assert.AreNotEqual(default(DateTime), customMeasurement.Timestamp, "Timestamp has not been set"); Assert.AreEqual(expectedComparisonValue, customMeasurement.Value, "Value is not what expected"); }
public async Task GetDeviceDataAsync_CustomMeasurementSensorNotExists_ReturnNull() { var sensorDeviceTypeId = "SomeSensorType"; var sensorDeviceId = "SomeSensorDevice"; var sensorId = "SomeSensor"; var customRule = new CustomMeasurementRule() { Class = "MyClass", Id = "MyId", Name = "My custom measurement", Unit = "qwerty", Operator = Shared.Enum.OperatorType.IsGreaterThan, SensorId = "UnknownSensor", Type = Shared.Enum.ValueType.Default, Value = "somevalue" }; // Arrange var sensorDevice = new SensorDevice { SensorDeviceTypeId = sensorDeviceTypeId, Id = sensorDeviceId, CalculatedMeasurements = new List <CustomMeasurementRule>() { customRule } }; var sensorDeviceType = new SensorDeviceType() { Id = sensorDeviceTypeId, Sensors = new List <Sensor>() { new Sensor() { Id = sensorId, } } }; _dataReaderMock.Setup(d => d.ReadDeviceDataAsync(It.IsAny <SensorDevice>())) .ReturnsAsync(new List <MeasurementData>() { new MeasurementData() { SensorDeviceId = sensorDeviceId, SensorId = sensorId, Value = "some value" } }); var config = new CollectorConfiguration { CollectorEnabled = true, BluetoothAdapterName = "test", ScanIntervalSeconds = 1, SensorDevices = new List <SensorDevice>() { sensorDevice }, SensorDeviceTypes = new List <SensorDeviceType>() { sensorDeviceType } }; _configMock.Setup(c => c.Value).Returns(config); var deviceScanner = _serviceProvider.GetService <Collector.DeviceScanner.DeviceScanner>(); // Act var fullList = await deviceScanner.GetDeviceDataAsync(config.SensorDevices); // Assert Assert.AreEqual(1, fullList.Count, "Amount of measurements is not correct"); Assert.AreEqual(sensorDeviceId, fullList[0].SensorDeviceId, "Sensor device ID is not correct"); }
private MeasurementData GetCustomMeasurementValue(SensorDevice sensorDevice, List <MeasurementData> measurements, CustomMeasurementRule rule) { var sensorMeasurement = measurements.FirstOrDefault(m => m.SensorId.Equals(rule.SensorId, StringComparison.OrdinalIgnoreCase)); if (sensorMeasurement == null) { _logger.LogError($"No sensor '{rule.SensorId}' found from measurements of device type '{sensorDevice.SensorDeviceTypeId}'"); return(null); } var data = new MeasurementData() { SensorDeviceId = sensorDevice.Id, SensorId = rule.Id }; var comparisonResult = LogicHelper.Compare(sensorMeasurement.Value, rule.Value, rule.Operator); switch (rule.Type) { case Shared.Enum.ValueType.Default: data.Value = comparisonResult ? "true" : "false"; break; case Shared.Enum.ValueType.WasLast: var keyName = $"{sensorDevice.Id}-{sensorMeasurement.SensorId}-{rule.Id}"; if (comparisonResult) { if (!_wasLastList.ContainsKey(keyName)) { _wasLastList.Add(keyName, DateTime.Now); } else { _wasLastList[keyName] = DateTime.Now; } data.Value = "0"; } else { if (_wasLastList.ContainsKey(keyName)) { var ts = DateTime.Now - _wasLastList[keyName]; data.Value = ((int)ts.TotalSeconds).ToString(); } else { data.Value = "-1"; } } break; default: break; } return(data); }