Data model simplification

This commit is contained in:
2020-07-30 19:31:50 -04:00
parent e810c4a240
commit 6514eb7c76
16 changed files with 75 additions and 40 deletions

10
Display/.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,10 @@
{
"cSpell.words": [
"aspnet",
"datetime",
"highcharts",
"signalr",
"suncalc",
"windbarb"
]
}

View File

@@ -106,7 +106,7 @@ export class PowerChartsComponent implements OnInit {
data[1].forEach(dataElement => { data[1].forEach(dataElement => {
const date = Date.parse(dataElement.bucket); const date = Date.parse(dataElement.bucket);
seriesData[2].data.push([date, dataElement.averageValue * 100]); seriesData[2].data.push([date, dataElement.averageValue]);
}); });
const title = this.selectedTimeSpan === TimeSpan.Last24Hours ? this.timeSpanItems[TimeSpan.Last24Hours] : this.getSelectedDateDisplayString(); const title = this.selectedTimeSpan === TimeSpan.Last24Hours ? this.timeSpanItems[TimeSpan.Last24Hours] : this.getSelectedDateDisplayString();

View File

@@ -1,5 +1,5 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { WeatherReading } from 'src/app/models/weather/weather-reading'; import { WeatherUpdate } from 'src/app/models/weather/weather-update';
import { WeatherService } from 'src/app/services/weather/weather.service'; import { WeatherService } from 'src/app/services/weather/weather.service';
import { first } from 'rxjs/operators'; import { first } from 'rxjs/operators';
@@ -14,7 +14,7 @@ import 'moment-duration-format';
}) })
export class AlmanacComponent implements OnInit { export class AlmanacComponent implements OnInit {
public loaded = false; public loaded = false;
public latestReading: WeatherReading; public latestReading: WeatherUpdate;
public sunTimes: SunCalc.GetTimesResult; public sunTimes: SunCalc.GetTimesResult;
public moonTimes: SunCalc.GetMoonTimes; public moonTimes: SunCalc.GetMoonTimes;
public moon: SunCalc.GetMoonIlluminationResult; public moon: SunCalc.GetMoonIlluminationResult;

View File

@@ -118,10 +118,10 @@ export class WeatherChartsComponent implements OnInit {
data.forEach(dataElement => { data.forEach(dataElement => {
const date = Date.parse(dataElement.bucket); const date = Date.parse(dataElement.bucket);
seriesData[0].data.push([date, dataElement.averagePressureTemperature]); seriesData[0].data.push([date, dataElement.averageTemperature]);
seriesData[1].data.push([date, dataElement.averagePressure / 33.864 / 100]); seriesData[1].data.push([date, dataElement.averagePressure / 33.864 / 100]);
seriesData[2].data.push([date, dataElement.averageHumidity]); seriesData[2].data.push([date, dataElement.averageHumidity]);
seriesData[3].data.push([date, dataElement.averageLightLevel * 100]); seriesData[3].data.push([date, dataElement.averageLightLevel]);
seriesData[4].data.push([date, dataElement.rainTotal]); seriesData[4].data.push([date, dataElement.rainTotal]);
}); });

View File

@@ -10,7 +10,7 @@
Temperature Temperature
</td> </td>
<td> <td>
{{ latestReading.PressureTemperature.toFixed(2) }}°F {{ latestReading.Temperature.toFixed(2) }}°F
</td> </td>
</tr> </tr>
<tr *ngIf="latestReading.HeatIndex"> <tr *ngIf="latestReading.HeatIndex">

View File

@@ -1,5 +1,5 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { WeatherReading } from 'src/app/models/weather/weather-reading'; import { WeatherUpdate } from 'src/app/models/weather/weather-update';
import { WeatherService } from 'src/app/services/weather/weather.service'; import { WeatherService } from 'src/app/services/weather/weather.service';
@Component({ @Component({
@@ -8,7 +8,7 @@ import { WeatherService } from 'src/app/services/weather/weather.service';
styleUrls: ['./weather-current.component.scss'] styleUrls: ['./weather-current.component.scss']
}) })
export class WeatherCurrentComponent implements OnInit { export class WeatherCurrentComponent implements OnInit {
public latestReading: WeatherReading; public latestReading: WeatherUpdate;
constructor(private weatherService: WeatherService) { } constructor(private weatherService: WeatherService) { }

View File

@@ -1,9 +1,8 @@
export class WeatherReadingGrouped { export class WeatherReadingGrouped {
bucket: string; bucket: string;
averagePressureTemperature: number; averageTemperature: number;
averagePressure: number; averagePressure: number;
averageLightLevel: number; averageLightLevel: number;
averageHumidity: number; averageHumidity: number;
averageHumidityTemperature: number;
rainTotal: number; rainTotal: number;
} }

View File

@@ -1,7 +1,7 @@
import { WeatherReading } from './weather-reading'; import { WeatherUpdate } from './weather-update';
describe('WeatherReading', () => { describe('WeatherUpdate', () => {
it('should create an instance', () => { it('should create an instance', () => {
expect(new WeatherReading()).toBeTruthy(); expect(new WeatherUpdate()).toBeTruthy();
}); });
}); });

View File

@@ -1,14 +1,13 @@
export class WeatherReading { export class WeatherUpdate {
Type: string; Type: string;
Message: null; Message: null;
Timestamp: Date; Timestamp: Date;
WindDirection: string; WindDirection: string;
WindSpeed: number; WindSpeed: number;
Humidity: number; Humidity: number;
HumidityTemperature: number;
Rain: number; Rain: number;
Pressure: number; Pressure: number;
PressureTemperature: number; Temperature: number;
BatteryLevel: number; BatteryLevel: number;
LightLevel: number; LightLevel: number;
Latitude: number; Latitude: number;

View File

@@ -1,7 +1,7 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Observable, BehaviorSubject } from 'rxjs'; import { Observable, BehaviorSubject } from 'rxjs';
import { HubConnectionBuilder, HubConnection } from '@aspnet/signalr'; import { HubConnectionBuilder, HubConnection } from '@aspnet/signalr';
import { WeatherReading } from 'src/app/models/weather/weather-reading'; import { WeatherUpdate } from 'src/app/models/weather/weather-update';
import { WeatherValue } from 'src/app/models/weather/weather-value'; import { WeatherValue } from 'src/app/models/weather/weather-value';
import { HttpClient } from '@angular/common/http'; import { HttpClient } from '@angular/common/http';
@@ -13,7 +13,7 @@ import { WeatherValueType } from 'src/app/models/weather/weather-value-type';
}) })
export class WeatherService { export class WeatherService {
private connection: HubConnection; private connection: HubConnection;
private latestReading: BehaviorSubject<WeatherReading> = new BehaviorSubject<WeatherReading>(null); private latestReading: BehaviorSubject<WeatherUpdate> = new BehaviorSubject<WeatherUpdate>(null);
constructor(private httpClient: HttpClient) { constructor(private httpClient: HttpClient) {
this.connection = new HubConnectionBuilder() this.connection = new HubConnectionBuilder()
@@ -27,7 +27,7 @@ export class WeatherService {
this.connection.start(); this.connection.start();
} }
getLatestReading(): Observable<WeatherReading> { getLatestReading(): Observable<WeatherUpdate> {
return this.latestReading.asObservable(); return this.latestReading.asObservable();
} }

View File

@@ -129,7 +129,7 @@ namespace ChrisKaczor.HomeMonitor.Weather.Service.Data
switch (weatherValueType) switch (weatherValueType)
{ {
case WeatherValueType.LightLevel: case WeatherValueType.LightLevel:
query = query.Replace("@Value", "LightLevel / 3.3"); query = query.Replace("@Value", "LightLevel / 3.3 * 100");
break; break;
default: default:
query = query.Replace("@Value", weatherValueType.ToString()); query = query.Replace("@Value", weatherValueType.ToString());

View File

@@ -2,10 +2,9 @@ SELECT Timestamp,
WindDirection, WindDirection,
WindSpeed, WindSpeed,
Humidity, Humidity,
HumidityTemperature,
Rain, Rain,
Pressure, Pressure,
PressureTemperature, PressureTemperature AS Temperature,
BatteryLevel, BatteryLevel,
LightLevel, LightLevel,
Latitude, Latitude,

View File

@@ -1,7 +1,6 @@
SELECT Bucket, SELECT Bucket,
AVG(HumidityTemperature) AS AverageHumidityTemperature,
AVG(Humidity) AS AverageHumidity, AVG(Humidity) AS AverageHumidity,
AVG(PressureTemperature) AS AveragePressureTemperature, AVG(Temperature) AS AverageTemperature,
AVG(Pressure) AS AveragePressure, AVG(Pressure) AS AveragePressure,
AVG(LightLevel) AS AverageLightLevel, AVG(LightLevel) AS AverageLightLevel,
SUM(Rain) AS RainTotal SUM(Rain) AS RainTotal
@@ -9,11 +8,10 @@ FROM (
SELECT CAST(FORMAT(Timestamp, 'yyyy-MM-ddTHH:') + SELECT CAST(FORMAT(Timestamp, 'yyyy-MM-ddTHH:') +
RIGHT('00' + CAST(DATEPART(MINUTE, Timestamp) / @BucketMinutes * @BucketMinutes AS VARCHAR), 2) RIGHT('00' + CAST(DATEPART(MINUTE, Timestamp) / @BucketMinutes * @BucketMinutes AS VARCHAR), 2)
+ ':00+00:00' AS DATETIMEOFFSET) AS Bucket, + ':00+00:00' AS DATETIMEOFFSET) AS Bucket,
HumidityTemperature,
Humidity, Humidity,
PressureTemperature, PressureTemperature AS Temperature,
Pressure, Pressure,
LightLevel / 3.3 AS LightLevel, LightLevel / 3.3 * 100 AS LightLevel,
Rain Rain
FROM Reading FROM Reading
WHERE Timestamp BETWEEN @Start AND @End WHERE Timestamp BETWEEN @Start AND @End

View File

@@ -2,10 +2,9 @@ SELECT TOP 1 Timestamp,
WindDirection, WindDirection,
WindSpeed, WindSpeed,
Humidity, Humidity,
HumidityTemperature,
Rain, Rain,
Pressure, Pressure,
PressureTemperature, PressureTemperature AS Temperature,
BatteryLevel, BatteryLevel,
LightLevel, LightLevel,
Latitude, Latitude,

View File

@@ -8,11 +8,9 @@ namespace ChrisKaczor.HomeMonitor.Weather.Service.Models
{ {
public DateTimeOffset Bucket { get; set; } public DateTimeOffset Bucket { get; set; }
public decimal AverageHumidityTemperature { get; set; }
public decimal AverageHumidity { get; set; } public decimal AverageHumidity { get; set; }
public decimal AveragePressureTemperature { get; set; } public decimal AverageTemperature { get; set; }
public decimal AveragePressure { get; set; } public decimal AveragePressure { get; set; }

View File

@@ -1,17 +1,52 @@
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;
using DecimalMath; using DecimalMath;
using JetBrains.Annotations; using JetBrains.Annotations;
using MathNet.Numerics; using MathNet.Numerics;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
namespace ChrisKaczor.HomeMonitor.Weather.Service.Models namespace ChrisKaczor.HomeMonitor.Weather.Service.Models
{ {
[PublicAPI] [PublicAPI]
public class WeatherUpdate : WeatherMessage public class WeatherUpdate
{ {
private readonly Database _database; private readonly Database _database;
[JsonConverter(typeof(StringEnumConverter))]
public MessageType Type { get; set; }
public string Message { get; set; }
public DateTimeOffset Timestamp { get; set; }
[JsonConverter(typeof(StringEnumConverter))]
public WindDirection WindDirection { get; set; }
public decimal WindSpeed { get; set; }
public decimal Humidity { get; set; }
public decimal Rain { get; set; }
public decimal Pressure { get; set; }
public decimal Temperature { get; set; }
public decimal LightLevel { get; set; }
public decimal Latitude { get; set; }
public decimal Longitude { get; set; }
public decimal Altitude { get; set; }
public int SatelliteCount { get; set; }
public DateTimeOffset GpsTimestamp { get; set; }
public decimal? WindChill { get; set; } public decimal? WindChill { get; set; }
public decimal? HeatIndex { get; set; } public decimal? HeatIndex { get; set; }
@@ -32,12 +67,10 @@ namespace ChrisKaczor.HomeMonitor.Weather.Service.Models
WindDirection = weatherMessage.WindDirection; WindDirection = weatherMessage.WindDirection;
WindSpeed = weatherMessage.WindSpeed; WindSpeed = weatherMessage.WindSpeed;
Humidity = weatherMessage.Humidity; Humidity = weatherMessage.Humidity;
HumidityTemperature = weatherMessage.HumidityTemperature;
Rain = weatherMessage.Rain; Rain = weatherMessage.Rain;
Pressure = weatherMessage.Pressure; Pressure = weatherMessage.Pressure;
PressureTemperature = weatherMessage.PressureTemperature; Temperature = weatherMessage.PressureTemperature;
BatteryLevel = weatherMessage.BatteryLevel; LightLevel = weatherMessage.LightLevel / 3.3m * 100;
LightLevel = weatherMessage.LightLevel;
Latitude = weatherMessage.Latitude; Latitude = weatherMessage.Latitude;
Longitude = weatherMessage.Longitude; Longitude = weatherMessage.Longitude;
Altitude = weatherMessage.Altitude; Altitude = weatherMessage.Altitude;
@@ -70,7 +103,7 @@ namespace ChrisKaczor.HomeMonitor.Weather.Service.Models
private void CalculateHeatIndex() private void CalculateHeatIndex()
{ {
var temperature = PressureTemperature; var temperature = Temperature;
var humidity = Humidity; var humidity = Humidity;
if (temperature.IsBetween(80, 100) && humidity.IsBetween(40, 100)) if (temperature.IsBetween(80, 100) && humidity.IsBetween(40, 100))
@@ -83,7 +116,7 @@ namespace ChrisKaczor.HomeMonitor.Weather.Service.Models
private void CalculateWindChill() private void CalculateWindChill()
{ {
var temperatureInF = PressureTemperature; var temperatureInF = Temperature;
var windSpeedInMph = WindSpeed; var windSpeedInMph = WindSpeed;
if (temperatureInF.IsBetween(-45, 45) && windSpeedInMph.IsBetween(3, 60)) if (temperatureInF.IsBetween(-45, 45) && windSpeedInMph.IsBetween(3, 60))
@@ -95,7 +128,7 @@ namespace ChrisKaczor.HomeMonitor.Weather.Service.Models
private void CalculateDewPoint() private void CalculateDewPoint()
{ {
var relativeHumidity = Humidity; var relativeHumidity = Humidity;
var temperatureInF = PressureTemperature; var temperatureInF = Temperature;
var temperatureInC = (temperatureInF - 32.0m) * 5.0m / 9.0m; var temperatureInC = (temperatureInF - 32.0m) * 5.0m / 9.0m;