public async Task ExecuteAsync_PublishSensorDeviceTypeTypeData_CorrectlyPublished()
        {
            var publishedMessages = new List <MqttApplicationMessage>();
            var sensorDeviceType  = new SensorDeviceType()
            {
                Id      = "DeviceType1",
                Sensors = new List <Sensor>()
                {
                    new Sensor()
                    {
                        Id = "Sensor1",
                    }
                }
            };

            //Arrange
            var config = new CollectorConfiguration
            {
                CollectorEnabled     = true,
                BluetoothAdapterName = "test",
                ScanIntervalSeconds  = 1,
                SensorDevices        = new List <SensorDevice>(),
                SensorDeviceTypes    = new List <SensorDeviceType>()
                {
                    sensorDeviceType
                }
            };

            _mqttClientMock.Setup(m => m.IsConnected).Returns(true);
            _mqttClientMock.Setup(m => m.PublishAsync(It.IsAny <MqttApplicationMessage>(), CancellationToken.None)).Callback((MqttApplicationMessage message, CancellationToken ct) => { publishedMessages.Add(message); });
            _configMock.Setup(c => c.Value).Returns(config);

            //Act
            var btGwService = _serviceProvider.GetService <CollectorService>();
            var cts         = new CancellationTokenSource();

#pragma warning disable CS4014
            // Run as fire & forget
            Task.Run(() => btGwService.StartAsync(cts.Token).ConfigureAwait(false));
#pragma warning restore CS4014

            await Task.Delay(100);

            await btGwService.HandleConnectedAsync(new MqttClientConnectedEventArgs(new MqttClientAuthenticateResult()));

            cts.Cancel();

            // Assert
            var topic   = MqttMessageHelper.GetSensorDeviceTypeTopic(sensorDeviceType.Id);
            var payload = MqttMessageHelper.SerializePayload(sensorDeviceType);
            var message = publishedMessages.FirstOrDefault(m => m.Topic.Equals(topic, StringComparison.OrdinalIgnoreCase));

            Assert.IsNotNull(message, "MQTT message for type data of sensor device type was not received");
            Assert.AreEqual(topic, message?.Topic, "Sensor device type message topic was not correct");
            Assert.AreEqual(payload, message?.ConvertPayloadToString(), "Sensor device type message payload was not correct");
        }
Esempio n. 2
0
        public async Task GetDeviceDataAsync_BluetoothDevices_ScanMade()
        {
            var sensorDeviceTypeId = "RuuviTag";

            // Arrange
            var sensorDevice = new SensorDevice
            {
                SensorDeviceTypeId = sensorDeviceTypeId,
                Id = "SensorDevice1"
            };

            var sensorDeviceType = new SensorDeviceType()
            {
                Id      = sensorDeviceTypeId,
                Sensors = new List <Sensor>()
                {
                    new Sensor()
                    {
                        Id = "Sensor1",
                    }
                }
            };

            _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>()
                {
                    sensorDeviceType
                }
            };

            _configMock.Setup(c => c.Value).Returns(config);

            var deviceScanner = _serviceProvider.GetService <Collector.DeviceScanner.DeviceScanner>();

            // Act
            var fullList = await deviceScanner.GetDeviceDataAsync(config.SensorDevices);

            // Assert
            _bleReaderMock.Verify(b => b.ScanAsync(It.IsAny <string>(), It.IsAny <int>()), Times.Once,
                                  "Bluetooth scan should've been made");
        }
        public async Task ExecuteAsync_PublishMeasurementData_CorrectlyPublished()
        {
            MqttApplicationMessage publishedMessage = null;
            var sensorDevice = new SensorDevice()
            {
                Id = "Device1",
                SensorDeviceTypeId = "DeviceType1"
            };

            var sensorDeviceType = new SensorDeviceType()
            {
                Id      = "DeviceType1",
                Sensors = new List <Sensor>()
                {
                    new Sensor()
                    {
                        Id = "Sensor1",
                    }
                }
            };

            //Arrange
            var config = new CollectorConfiguration
            {
                CollectorEnabled     = true,
                BluetoothAdapterName = "test",
                ScanIntervalSeconds  = 0,
                SensorDevices        = new List <SensorDevice>()
                {
                    sensorDevice
                },
                SensorDeviceTypes = new List <SensorDeviceType>()
                {
                    sensorDeviceType
                }
            };

            var measurementData = new MeasurementData()
            {
                SensorDeviceId = sensorDevice.Id, SensorId = sensorDeviceType.Sensors[0].Id, Timestamp = DateTime.Now, Value = "123"
            };
            var measurementList = new List <MeasurementData>()
            {
                measurementData
            };

            _mqttClientMock.Setup(m => m.IsConnected).Returns(true);
            _mqttClientMock.Setup(m => m.PublishAsync(It.IsAny <MqttApplicationMessage>(), CancellationToken.None)).Callback((MqttApplicationMessage message, CancellationToken ct) => { publishedMessage = message; });
            _configMock.Setup(c => c.Value).Returns(config);
            _deviceScannerMock.Setup(d => d.GetDeviceDataAsync(config.SensorDevices)).ReturnsAsync(measurementList);

            //Act
            var btGwService = _serviceProvider.GetService <CollectorService>();
            var cts         = new CancellationTokenSource();

#pragma warning disable CS4014
            // Run as fire & forget
            Task.Run(() => btGwService.StartAsync(cts.Token).ConfigureAwait(false));
#pragma warning restore CS4014

            await Task.Delay(100);

            cts.Cancel();

            var expectedMessage = $"{Constant.TopicMeasurement}/{sensorDevice.Location}/{sensorDevice.Id}/{measurementData.SensorId}";
            Assert.AreEqual(expectedMessage, publishedMessage.Topic, "Published topic was incorrect");
            Assert.AreEqual(measurementData.Value, publishedMessage.ConvertPayloadToString(), "Published payload was incorrect");
        }
Esempio n. 4
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");
        }
Esempio n. 5
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");
        }
Esempio n. 6
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");
        }
Esempio n. 7
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");
        }
Esempio n. 8
0
 public Sensor(string deviceToken, string name, SensorDeviceType sensorDeviceType)
 {
     DeviceToken      = deviceToken;
     SensorDeviceType = sensorDeviceType;
     Name             = name;
 }