public async Task PublishReadingAsync(string reading)
        {
            if (reading is null)
            {
                throw new ArgumentNullException(nameof(reading));
            }

            GeigerValues geigerValue;

            try
            {
                geigerValue = GeigerValuesConverter.ConvertFromReading(reading);
                _geigerValues.Add(geigerValue);
            }
            catch (FormatException e)
            {
                Console.WriteLine($"Cannot convert reading: { e }");
                return;
            }

            if (_lastPublish.AddSeconds(PublishIntervall) <= DateTime.Now)
            {
                _lastPublish = DateTime.Now;
                var json = GeigerValuesConverter.ConvertToJson(_lastPublish, _geigerValues.Select(x => x.Radiation));

                var message = new MqttApplicationMessageBuilder()
                              .WithTopic(MqttTopic)
                              .WithPayload(json)
                              .WithRetainFlag(true)
                              .Build();
                await _client.PublishAsync(message);

                _geigerValues.Clear();
            }
        }
        public void ConvertWithInvalidMode()
        {
            var reading = "CPS, invalid, CPM, 42, uSv/hr, 0.03, FOO";

            // Test & Verification
            Assert.That(() => { GeigerValuesConverter.ConvertFromReading(reading); }, Throws.TypeOf <FormatException>());
        }
        public void ConvertWithValidString2()
        {
            var reading = "CPS, 42, CPM, 4242, uSv/hr, 100.03, FAST";

            // Test
            var result = GeigerValuesConverter.ConvertFromReading(reading);

            // Verification
            Assert.That(result, Is.Not.Null);
            Assert.That(result.CPS, Is.EqualTo(42));
            Assert.That(result.CPM, Is.EqualTo(4242));
            Assert.That(result.Radiation, Is.EqualTo(100.03));
            Assert.That(result.Mode, Is.EqualTo(ModeEnum.FAST));
        }
        public void ConvertJSONValid()
        {
            var value = new GeigerValues
            {
                CPS       = 2,
                CPM       = 42,
                Radiation = 0.03,
                Mode      = ModeEnum.SLOW
            };
            var expected = "{\"CPS\":2,\"CPM\":42,\"Radiation\":0.03,\"Mode\":\"SLOW\"}";

            // Test
            var result = GeigerValuesConverter.ConvertToJson(value);

            // Verification
            Assert.That(result, Is.Not.Null);
            Assert.That(result, Is.EqualTo(expected));
        }
        public void ConvertJSONMessage()
        {
            CultureInfo culture   = new CultureInfo("en-US");
            var         now       = DateTime.Now;
            var         timeSpan  = now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
            var         timestamp = (long)timeSpan.TotalMilliseconds;
            var         values    = new List <double>();

            for (int i = 0; i < 10; i++)
            {
                values.Add(i);
            }
            var average = values.Average();

            var expected = $"{{\"ts\":{timestamp},\"val\":{average.ToString(culture)}}}";

            // Test
            var result = GeigerValuesConverter.ConvertToJson(now, values);

            // Verification
            Assert.That(result, Is.Not.Null);
            Assert.That(result, Is.EqualTo(expected));
        }