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..2b97b87 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,34 @@ 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"]);
- DateTimeOffset.TryParseExact($"{messageValues[@"date"]} {messageValues[@"time"]}", "MM/dd/yyyy HH:mm:ss", null, DateTimeStyles.None, out var gpsTimestamp);
- GpsTimestamp = gpsTimestamp;
+ var gpsFix = int.Parse(messageValues[@"gf"]);
+
+ if (gpsFix == 0)
+ return;
+
+ Altitude = decimal.Parse(messageValues[@"ga"]);
+ SatelliteCount = int.Parse(messageValues[@"gs"]);
+
+ 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 +70,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/SerialReader/SerialReader.csproj b/Weather/SerialReader/SerialReader.csproj
index 8f9e7f6..52bebfd 100644
--- a/Weather/SerialReader/SerialReader.csproj
+++ b/Weather/SerialReader/SerialReader.csproj
@@ -13,7 +13,7 @@
-
+
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
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..da96d3b 100644
--- a/Weather/Service/Service.csproj
+++ b/Weather/Service/Service.csproj
@@ -34,7 +34,7 @@
-
+
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