mirror of
https://github.com/ckaczor/HomeMonitor.git
synced 2026-02-16 10:58:32 -05:00
Improvements to pressure and rain
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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 '';
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
3
Weather/Service/.vscode/launch.json
vendored
3
Weather/Service/.vscode/launch.json
vendored
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user