From dc8618859e531b5ffd4ac1b75081aaec1d1ca9b4 Mon Sep 17 00:00:00 2001 From: Chris Kaczor Date: Fri, 28 May 2021 19:21:01 -0400 Subject: [PATCH 1/5] Update for new hardware --- .gitignore | 2 + Weather/Models/WeatherMessage.cs | 93 ++++++++++++++++++---- Weather/Models/WeatherReading.cs | 2 - Weather/Models/WindDirection.cs | 34 ++++---- Weather/ModelsTests/ModelsTests.csproj | 20 +++++ Weather/ModelsTests/WeatherMessageTests.cs | 33 ++++++++ Weather/Weather.sln | 8 +- Weather/Weather.sln.DotSettings.user | 5 -- 8 files changed, 156 insertions(+), 41 deletions(-) create mode 100644 Weather/ModelsTests/ModelsTests.csproj create mode 100644 Weather/ModelsTests/WeatherMessageTests.cs delete mode 100644 Weather/Weather.sln.DotSettings.user diff --git a/.gitignore b/.gitignore index fff014b..f67bcbf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +*.user + bin/ log/ obj/ diff --git a/Weather/Models/WeatherMessage.cs b/Weather/Models/WeatherMessage.cs index b1e8496..70a041e 100644 --- a/Weather/Models/WeatherMessage.cs +++ b/Weather/Models/WeatherMessage.cs @@ -2,7 +2,6 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; using System; -using System.Globalization; using System.Linq; namespace ChrisKaczor.HomeMonitor.Weather.Models @@ -33,22 +32,28 @@ namespace ChrisKaczor.HomeMonitor.Weather.Models var messageValues = messageParts.Select(m => m.Split('=')).ToDictionary(a => a[0], a => a[1]); - WindDirection = (WindDirection)Enum.Parse(typeof(WindDirection), messageValues[@"winddir"]); - WindSpeed = decimal.Parse(messageValues[@"windspeedmph"]); - Humidity = decimal.Parse(messageValues[@"humidity"]); - HumidityTemperature = decimal.Parse(messageValues[@"tempH"]); - Rain = decimal.Parse(messageValues[@"rain"]); - Pressure = decimal.Parse(messageValues[@"pressure"]); - PressureTemperature = decimal.Parse(messageValues[@"tempP"]); - BatteryLevel = decimal.Parse(messageValues[@"batt_lvl"]); - LightLevel = decimal.Parse(messageValues[@"light_lvl"]); - Latitude = decimal.Parse(messageValues[@"lat"]); - Longitude = decimal.Parse(messageValues[@"lng"]); - Altitude = decimal.Parse(messageValues[@"altitude"]); - SatelliteCount = int.Parse(messageValues[@"sats"]); + WindDirection = GetWindDirection(double.Parse(messageValues[@"wd"])); + WindSpeed = decimal.Parse(messageValues[@"ws"]); + Humidity = decimal.Parse(messageValues[@"sh"]); + HumidityTemperature = decimal.Parse(messageValues[@"st"]); + Rain = decimal.Parse(messageValues[@"r"]); + Pressure = decimal.Parse(messageValues[@"bp"]); + PressureTemperature = decimal.Parse(messageValues[@"bt"]); + LightLevel = decimal.Parse(messageValues[@"tl"]); + Latitude = decimal.Parse(messageValues[@"glt"]); + Longitude = decimal.Parse(messageValues[@"gln"]); + Altitude = decimal.Parse(messageValues[@"ga"]); + SatelliteCount = int.Parse(messageValues[@"gs"]); - DateTimeOffset.TryParseExact($"{messageValues[@"date"]} {messageValues[@"time"]}", "MM/dd/yyyy HH:mm:ss", null, DateTimeStyles.None, out var gpsTimestamp); - GpsTimestamp = gpsTimestamp; + var year = int.Parse(messageValues[@"gdy"]) + 2000; + var month = int.Parse(messageValues[@"gdm"]); + var day = int.Parse(messageValues[@"gdd"]); + + var hour = int.Parse(messageValues[@"gth"]); + var minute = int.Parse(messageValues[@"gtm"]); + var second = int.Parse(messageValues[@"gts"]); + + GpsTimestamp = new DateTimeOffset(year, month, day, hour, minute, second, 0, TimeSpan.Zero); } [PublicAPI] @@ -59,5 +64,61 @@ namespace ChrisKaczor.HomeMonitor.Weather.Models return new WeatherMessage { Message = message }; } + + private static WindDirection GetWindDirection(double degrees) + { + switch (degrees) + { + case 0: + return WindDirection.North; + + case 22.5: + return WindDirection.NorthNorthEast; + + case 45: + return WindDirection.NorthEast; + + case 67.5: + return WindDirection.EastNorthEast; + + case 90: + return WindDirection.East; + + case 112.5: + return WindDirection.EastSouthEast; + + case 135: + return WindDirection.SouthEast; + + case 157.5: + return WindDirection.SouthSouthEast; + + case 180: + return WindDirection.South; + + case 202.5: + return WindDirection.SouthSouthWest; + + case 225: + return WindDirection.SouthWest; + + case 247.5: + return WindDirection.WestSouthWest; + + case 270: + return WindDirection.West; + + case 292.5: + return WindDirection.WestNorthWest; + + case 315: + return WindDirection.NorthWest; + + case 337.5: + return WindDirection.NorthNorthWest; + } + + return WindDirection.None; + } } } \ No newline at end of file diff --git a/Weather/Models/WeatherReading.cs b/Weather/Models/WeatherReading.cs index 01d0f99..3bca508 100644 --- a/Weather/Models/WeatherReading.cs +++ b/Weather/Models/WeatherReading.cs @@ -25,8 +25,6 @@ namespace ChrisKaczor.HomeMonitor.Weather.Models public decimal PressureTemperature { get; set; } - public decimal BatteryLevel { get; set; } - public decimal LightLevel { get; set; } public decimal Latitude { get; set; } diff --git a/Weather/Models/WindDirection.cs b/Weather/Models/WindDirection.cs index ff17494..b119bbb 100644 --- a/Weather/Models/WindDirection.cs +++ b/Weather/Models/WindDirection.cs @@ -5,22 +5,22 @@ namespace ChrisKaczor.HomeMonitor.Weather.Models [PublicAPI] public enum WindDirection { - None = -1, - North = 0, - East = 90, - South = 180, - West = 270, - NorthEast = 45, - SouthEast = 135, - SouthWest = 225, - NorthWest = 315, - NorthNorthEast = 23, - EastNorthEast = 68, - EastSouthEast = 113, - SouthSouthEast = 158, - SouthSouthWest = 203, - WestSouthWest = 248, - WestNorthWest = 293, - NorthNorthWest = 338 + None, + North, + East, + South, + West, + NorthEast, + SouthEast, + SouthWest, + NorthWest, + NorthNorthEast, + EastNorthEast, + EastSouthEast, + SouthSouthEast, + SouthSouthWest, + WestSouthWest, + WestNorthWest, + NorthNorthWest } } diff --git a/Weather/ModelsTests/ModelsTests.csproj b/Weather/ModelsTests/ModelsTests.csproj new file mode 100644 index 0000000..cd746fd --- /dev/null +++ b/Weather/ModelsTests/ModelsTests.csproj @@ -0,0 +1,20 @@ + + + + netcoreapp3.1 + + false + + + + + + + + + + + + + + diff --git a/Weather/ModelsTests/WeatherMessageTests.cs b/Weather/ModelsTests/WeatherMessageTests.cs new file mode 100644 index 0000000..b1ba1c5 --- /dev/null +++ b/Weather/ModelsTests/WeatherMessageTests.cs @@ -0,0 +1,33 @@ +using System; +using ChrisKaczor.HomeMonitor.Weather.Models; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace ModelsTests +{ + [TestClass] + public class WeatherMessageTests + { + [TestMethod] + public void ParseTest() + { + var weatherMessage = WeatherMessage.Parse("$,ws=1.80,wg=1.15,wd=180.00,r=0.01,bt=14.44,bp=1016.76,tl=597.83,st=9.68,sh=78.95,gf=1,gs=13,glt=42.764725,gln=-71.042038,ga=20.70,gth=22,gtm=20,gts=11,gdy=21,gdm=5,gdd=28,#"); + + Assert.AreEqual(MessageType.Data, weatherMessage.Type); + + Assert.AreEqual(WindDirection.South, weatherMessage.WindDirection); + Assert.AreEqual(1.80M, weatherMessage.WindSpeed); + Assert.AreEqual(42.764725M, weatherMessage.Latitude); + Assert.AreEqual(-71.042038M, weatherMessage.Longitude); + Assert.AreEqual(1016.76M, weatherMessage.Pressure); + Assert.AreEqual(14.44M, weatherMessage.PressureTemperature); + Assert.AreEqual(0.01M, weatherMessage.Rain); + Assert.AreEqual(9.68M, weatherMessage.HumidityTemperature); + Assert.AreEqual(78.95M, weatherMessage.Humidity); + Assert.AreEqual(13, weatherMessage.SatelliteCount); + Assert.AreEqual(20.70M, weatherMessage.Altitude); + Assert.AreEqual(1.80M, weatherMessage.WindSpeed); + Assert.AreEqual(597.83M, weatherMessage.LightLevel); + Assert.AreEqual(DateTimeOffset.Parse("2021-05-28 22:20:11 +00:00"), weatherMessage.GpsTimestamp); + } + } +} \ No newline at end of file diff --git a/Weather/Weather.sln b/Weather/Weather.sln index 10f6825..3885ce5 100644 --- a/Weather/Weather.sln +++ b/Weather/Weather.sln @@ -7,7 +7,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SerialReader", "SerialReade EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Models", "Models\Models.csproj", "{39E5DE26-CD8D-47AF-AB94-6ACB0AF24EA1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Service", "Service\Service.csproj", "{914B9DB9-3BCD-4B55-8289-2E59D6CA96BA}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Service", "Service\Service.csproj", "{914B9DB9-3BCD-4B55-8289-2E59D6CA96BA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModelsTests", "ModelsTests\ModelsTests.csproj", "{F83A3E8C-3A03-4264-B136-1FBE569A9411}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -27,6 +29,10 @@ Global {914B9DB9-3BCD-4B55-8289-2E59D6CA96BA}.Debug|Any CPU.Build.0 = Debug|Any CPU {914B9DB9-3BCD-4B55-8289-2E59D6CA96BA}.Release|Any CPU.ActiveCfg = Release|Any CPU {914B9DB9-3BCD-4B55-8289-2E59D6CA96BA}.Release|Any CPU.Build.0 = Release|Any CPU + {F83A3E8C-3A03-4264-B136-1FBE569A9411}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F83A3E8C-3A03-4264-B136-1FBE569A9411}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F83A3E8C-3A03-4264-B136-1FBE569A9411}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F83A3E8C-3A03-4264-B136-1FBE569A9411}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Weather/Weather.sln.DotSettings.user b/Weather/Weather.sln.DotSettings.user deleted file mode 100644 index fe9aee4..0000000 --- a/Weather/Weather.sln.DotSettings.user +++ /dev/null @@ -1,5 +0,0 @@ - - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - 2 \ No newline at end of file From 4ada97fdd8f825611cafc0f4a3653650b4f3679e Mon Sep 17 00:00:00 2001 From: Chris Kaczor Date: Fri, 28 May 2021 19:35:48 -0400 Subject: [PATCH 2/5] Updates for new hardware - New model package - Remove battery level - Change light level decimal scale --- Weather/SerialReader/SerialReader.csproj | 2 +- Weather/Service/Data/Resources/CreateReading.sql | 4 ++-- Weather/Service/Data/Resources/GetReadingHistory.sql | 1 - Weather/Service/Data/Resources/GetRecentReading.sql | 1 - Weather/Service/Data/Resources/Schema.sql | 6 ++++-- Weather/Service/Models/WeatherValueType.cs | 1 - Weather/Service/Service.csproj | 2 +- 7 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Weather/SerialReader/SerialReader.csproj b/Weather/SerialReader/SerialReader.csproj index 8f9e7f6..3bc775d 100644 --- a/Weather/SerialReader/SerialReader.csproj +++ b/Weather/SerialReader/SerialReader.csproj @@ -13,7 +13,7 @@ - + diff --git a/Weather/Service/Data/Resources/CreateReading.sql b/Weather/Service/Data/Resources/CreateReading.sql index 9b24f53..f5001ba 100644 --- a/Weather/Service/Data/Resources/CreateReading.sql +++ b/Weather/Service/Data/Resources/CreateReading.sql @@ -1,5 +1,5 @@ INSERT INTO Reading (Timestamp, WindDirection, WindSpeed, Humidity, HumidityTemperature, Rain, Pressure, - PressureTemperature, BatteryLevel, LightLevel, Latitude, Longitude, Altitude, + PressureTemperature, LightLevel, Latitude, Longitude, Altitude, SatelliteCount, GpsTimestamp) VALUES (@Timestamp, @WindDirection, @WindSpeed, @Humidity, @HumidityTemperature, @Rain, @Pressure, @PressureTemperature, - @BatteryLevel, @LightLevel, @Latitude, @Longitude, @Altitude, @SatelliteCount, @GpsTimestamp) \ No newline at end of file + @LightLevel, @Latitude, @Longitude, @Altitude, @SatelliteCount, @GpsTimestamp) \ No newline at end of file diff --git a/Weather/Service/Data/Resources/GetReadingHistory.sql b/Weather/Service/Data/Resources/GetReadingHistory.sql index 03afa36..9ff1335 100644 --- a/Weather/Service/Data/Resources/GetReadingHistory.sql +++ b/Weather/Service/Data/Resources/GetReadingHistory.sql @@ -5,7 +5,6 @@ SELECT Timestamp, Rain, Pressure, PressureTemperature AS Temperature, - BatteryLevel, LightLevel, Latitude, Longitude, diff --git a/Weather/Service/Data/Resources/GetRecentReading.sql b/Weather/Service/Data/Resources/GetRecentReading.sql index cb7b1c4..245d514 100644 --- a/Weather/Service/Data/Resources/GetRecentReading.sql +++ b/Weather/Service/Data/Resources/GetRecentReading.sql @@ -5,7 +5,6 @@ SELECT TOP 1 Timestamp, Rain, Pressure, PressureTemperature AS Temperature, - BatteryLevel, LightLevel, Latitude, Longitude, diff --git a/Weather/Service/Data/Resources/Schema.sql b/Weather/Service/Data/Resources/Schema.sql index 3f0aea0..ec105df 100644 --- a/Weather/Service/Data/Resources/Schema.sql +++ b/Weather/Service/Data/Resources/Schema.sql @@ -11,7 +11,6 @@ Rain decimal(2, 2) NOT NULL, Pressure decimal(8, 2) NOT NULL, PressureTemperature decimal(4, 1) NOT NULL, - BatteryLevel decimal(4, 2) NOT NULL, LightLevel decimal(3, 2) NOT NULL, Latitude decimal(9, 6) NOT NULL, Longitude decimal(9, 6) NOT NULL, @@ -22,4 +21,7 @@ ALTER TABLE Reading ALTER COLUMN Rain decimal(3, 3); -ALTER TABLE Reading ALTER COLUMN BatteryLevel decimal(4, 2); \ No newline at end of file +IF COL_LENGTH('Reading', 'BatteryLevel') IS NOT NULL + ALTER TABLE Reading DROP COLUMN BatteryLevel; + +ALTER TABLE Reading ALTER COLUMN LightLevel decimal(8, 2); diff --git a/Weather/Service/Models/WeatherValueType.cs b/Weather/Service/Models/WeatherValueType.cs index abcad7a..53108c8 100644 --- a/Weather/Service/Models/WeatherValueType.cs +++ b/Weather/Service/Models/WeatherValueType.cs @@ -11,7 +11,6 @@ namespace ChrisKaczor.HomeMonitor.Weather.Service.Models Rain, Pressure, PressureTemperature, - BatteryLevel, LightLevel, Altitude, SatelliteCount diff --git a/Weather/Service/Service.csproj b/Weather/Service/Service.csproj index 7f04eae..607a195 100644 --- a/Weather/Service/Service.csproj +++ b/Weather/Service/Service.csproj @@ -34,7 +34,7 @@ - + From 714866e0c771dc33776554bed0c78800fcf85b09 Mon Sep 17 00:00:00 2001 From: Chris Kaczor Date: Fri, 28 May 2021 19:43:59 -0400 Subject: [PATCH 3/5] Update serial port settings --- Weather/SerialReader/appsettings.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Weather/SerialReader/appsettings.json b/Weather/SerialReader/appsettings.json index 7d560da..3c10255 100644 --- a/Weather/SerialReader/appsettings.json +++ b/Weather/SerialReader/appsettings.json @@ -1,11 +1,11 @@ { "Weather": { "Port": { - "Prefix": "/dev/ttyUSB", - "BaudRate": 9600 + "Prefix": "/dev/ttyACM", + "BaudRate": 115200 }, - "Queue": { - "Name": "weather" - } + "Queue": { + "Name": "weather" + } } -} +} \ No newline at end of file From ef28ab8ecfe1a70b17f840209ba7366f6d65b45f Mon Sep 17 00:00:00 2001 From: Chris Kaczor Date: Fri, 28 May 2021 19:51:44 -0400 Subject: [PATCH 4/5] Handle no GPS fix --- Weather/Models/WeatherMessage.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Weather/Models/WeatherMessage.cs b/Weather/Models/WeatherMessage.cs index 70a041e..2b97b87 100644 --- a/Weather/Models/WeatherMessage.cs +++ b/Weather/Models/WeatherMessage.cs @@ -42,6 +42,12 @@ namespace ChrisKaczor.HomeMonitor.Weather.Models LightLevel = decimal.Parse(messageValues[@"tl"]); Latitude = decimal.Parse(messageValues[@"glt"]); Longitude = decimal.Parse(messageValues[@"gln"]); + + var gpsFix = int.Parse(messageValues[@"gf"]); + + if (gpsFix == 0) + return; + Altitude = decimal.Parse(messageValues[@"ga"]); SatelliteCount = int.Parse(messageValues[@"gs"]); From 2878a038be5833981f2ce55ef0b19b0bc4b22e84 Mon Sep 17 00:00:00 2001 From: Chris Kaczor Date: Fri, 28 May 2021 19:57:04 -0400 Subject: [PATCH 5/5] Update models library --- Weather/SerialReader/SerialReader.csproj | 2 +- Weather/Service/Service.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Weather/SerialReader/SerialReader.csproj b/Weather/SerialReader/SerialReader.csproj index 3bc775d..52bebfd 100644 --- a/Weather/SerialReader/SerialReader.csproj +++ b/Weather/SerialReader/SerialReader.csproj @@ -13,7 +13,7 @@ - + diff --git a/Weather/Service/Service.csproj b/Weather/Service/Service.csproj index 607a195..da96d3b 100644 --- a/Weather/Service/Service.csproj +++ b/Weather/Service/Service.csproj @@ -34,7 +34,7 @@ - +