Exemple #1
0
        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");
        }
Exemple #2
0
        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");
        }
Exemple #3
0
        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");
        }
Exemple #4
0
        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");
        }
Exemple #5
0
        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");
        }
Exemple #6
0
        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);
        }