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