Improvements to pressure and rain

This commit is contained in:
2020-07-20 12:00:04 +00:00
parent 8bf01ea027
commit 388e9d03c2
5 changed files with 41 additions and 32 deletions

View File

@@ -52,7 +52,7 @@
<td> <td>
{{ (latestReading.Pressure / 33.864 / 100).toFixed(2) }}" {{ (latestReading.Pressure / 33.864 / 100).toFixed(2) }}"
<span class="pressure-trend-arrow" [ngClass]="rotationClass()" title="Trend: {{ latestReading.PressureTrend.toFixed(1) }}"></span> <span class="pressure-trend-arrow" [ngClass]="rotationClass()" title="Trend: {{ latestReading.PressureDifferenceThreeHour.toFixed(1) }}"></span>
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -68,7 +68,7 @@
Rain Rain
</td> </td>
<td> <td>
{{ latestReading.Rain.toFixed(2) }}" (last hour) {{ latestReading.RainLastHour.toFixed(2) }}" (last hour)
</td> </td>
</tr> </tr>
<tr> <tr>

View File

@@ -17,7 +17,7 @@ export class WeatherCurrentComponent implements OnInit {
} }
rotationClass(): string { rotationClass(): string {
const pressureDifference = this.latestReading.PressureTrend; const pressureDifference = this.latestReading.PressureDifferenceThreeHour;
if (!pressureDifference) { if (!pressureDifference) {
return ''; return '';

View File

@@ -19,5 +19,8 @@ export class WeatherReading {
WindChill: number; WindChill: number;
HeatIndex: number; HeatIndex: number;
DewPoint: number; DewPoint: number;
PressureTrend: number; PressureDifferenceThreeHour: number;
PressureSlope: number;
PressureAngle: number;
RainLastHour: number;
} }

View File

@@ -9,8 +9,7 @@
"type": "coreclr", "type": "coreclr",
"request": "launch", "request": "launch",
"preLaunchTask": "build", "preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path. "program": "${workspaceFolder}/bin/Debug/netcoreapp3.1/ChrisKaczor.HomeMonitor.Weather.Service.dll",
"program": "${workspaceFolder}/bin/Debug/netcoreapp3.0/ChrisKaczor.HomeMonitor.Weather.Service.dll",
"args": [], "args": [],
"cwd": "${workspaceFolder}", "cwd": "${workspaceFolder}",
"stopAtEntry": false, "stopAtEntry": false,

View File

@@ -1,3 +1,4 @@
using System;
using System.Linq; using System.Linq;
using ChrisKaczor.HomeMonitor.Weather.Models; using ChrisKaczor.HomeMonitor.Weather.Models;
using ChrisKaczor.HomeMonitor.Weather.Service.Data; using ChrisKaczor.HomeMonitor.Weather.Service.Data;
@@ -18,7 +19,13 @@ namespace ChrisKaczor.HomeMonitor.Weather.Service.Models
public decimal DewPoint { get; set; } public decimal DewPoint { get; set; }
public decimal PressureTrend { get; set; } public decimal PressureDifferenceThreeHour { get; set; }
public decimal PressureSlope { get; set; }
public decimal PressureAngle { get; set; }
public decimal RainLastHour { get; set; }
public WeatherUpdate(WeatherMessage weatherMessage, Database database) public WeatherUpdate(WeatherMessage weatherMessage, Database database)
{ {
@@ -42,15 +49,19 @@ namespace ChrisKaczor.HomeMonitor.Weather.Service.Models
SatelliteCount = weatherMessage.SatelliteCount; SatelliteCount = weatherMessage.SatelliteCount;
GpsTimestamp = weatherMessage.GpsTimestamp; GpsTimestamp = weatherMessage.GpsTimestamp;
HeatIndex = CalculateHeatIndex(); CalculateHeatIndex();
WindChill = CalculateWindChill(); CalculateWindChill();
DewPoint = CalculateDewPoint(); CalculateDewPoint();
PressureTrend = CalculatePressureTrend(); CalculatePressureTrend();
CalculateRainLastHour();
Rain = database.GetReadingValueSum(WeatherValueType.Rain, Timestamp.AddHours(-1), Timestamp).Result;
} }
private decimal CalculatePressureTrend() private void CalculateRainLastHour()
{
RainLastHour = _database.GetReadingValueSum(WeatherValueType.Rain, Timestamp.AddHours(-1), Timestamp).Result;
}
private void CalculatePressureTrend()
{ {
var pressureData = _database.GetReadingValueHistory(WeatherValueType.Pressure, Timestamp.AddHours(-3), Timestamp).Result; var pressureData = _database.GetReadingValueHistory(WeatherValueType.Pressure, Timestamp.AddHours(-3), Timestamp).Result;
@@ -59,44 +70,40 @@ namespace ChrisKaczor.HomeMonitor.Weather.Service.Models
var lineFunction = Fit.LineFunc(xData, yData); var lineFunction = Fit.LineFunc(xData, yData);
var difference = (decimal) (lineFunction(yData.Length - 1) - lineFunction(0)); var pressureSlope = (lineFunction(xData[0]) - lineFunction(xData.Last())) / (xData[0] - xData.Last());
return difference; PressureSlope = (decimal)pressureSlope;
PressureAngle = (decimal)Math.Atan(pressureSlope);
PressureDifferenceThreeHour = (decimal)(lineFunction(xData.Last()) - lineFunction(xData[0]));
} }
private decimal? CalculateHeatIndex() private void CalculateHeatIndex()
{ {
var temperature = PressureTemperature; var temperature = PressureTemperature;
var humidity = Humidity; var humidity = Humidity;
if (temperature.IsBetween(80, 100) && humidity.IsBetween(40, 100)) if (temperature.IsBetween(80, 100) && humidity.IsBetween(40, 100))
{ {
var heatIndex = -42.379m + 2.04901523m * temperature + 10.14333127m * humidity - .22475541m * temperature * humidity - .00683783m * temperature * temperature - HeatIndex = -42.379m + 2.04901523m * temperature + 10.14333127m * humidity - .22475541m * temperature * humidity - .00683783m * temperature * temperature -
.05481717m * humidity * humidity + .00122874m * temperature * temperature * humidity + .00085282m * temperature * humidity * humidity - .05481717m * humidity * humidity + .00122874m * temperature * temperature * humidity + .00085282m * temperature * humidity * humidity -
.00000199m * temperature * temperature * humidity * humidity; .00000199m * temperature * temperature * humidity * humidity;
return heatIndex;
} }
return null;
} }
private decimal? CalculateWindChill() private void CalculateWindChill()
{ {
var temperatureInF = PressureTemperature; var temperatureInF = PressureTemperature;
var windSpeedInMph = WindSpeed; var windSpeedInMph = WindSpeed;
if (temperatureInF.IsBetween(-45, 45) && windSpeedInMph.IsBetween(3, 60)) if (temperatureInF.IsBetween(-45, 45) && windSpeedInMph.IsBetween(3, 60))
{ {
var windChill = 35.74m + 0.6215m * temperatureInF - 35.75m * DecimalEx.Pow(windSpeedInMph, 0.16m) + 0.4275m * temperatureInF * DecimalEx.Pow(windSpeedInMph, 0.16m); WindChill = 35.74m + 0.6215m * temperatureInF - 35.75m * DecimalEx.Pow(windSpeedInMph, 0.16m) + 0.4275m * temperatureInF * DecimalEx.Pow(windSpeedInMph, 0.16m);
return windChill;
} }
return null;
} }
private decimal CalculateDewPoint() private void CalculateDewPoint()
{ {
var relativeHumidity = Humidity; var relativeHumidity = Humidity;
var temperatureInF = PressureTemperature; var temperatureInF = PressureTemperature;
@@ -108,7 +115,7 @@ namespace ChrisKaczor.HomeMonitor.Weather.Service.Models
var denominator = 19.43m - DecimalEx.Log(vaporPressure); var denominator = 19.43m - DecimalEx.Log(vaporPressure);
var dewPointInC = numerator / denominator; var dewPointInC = numerator / denominator;
return dewPointInC * 9.0m / 5.0m + 32.0m; DewPoint = dewPointInC * 9.0m / 5.0m + 32.0m;
} }
} }
} }