mirror of
https://github.com/ckaczor/HomeMonitor.git
synced 2026-01-13 17:22:54 -05:00
Data model simplification
This commit is contained in:
10
Display/.vscode/settings.json
vendored
Normal file
10
Display/.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"cSpell.words": [
|
||||||
|
"aspnet",
|
||||||
|
"datetime",
|
||||||
|
"highcharts",
|
||||||
|
"signalr",
|
||||||
|
"suncalc",
|
||||||
|
"windbarb"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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) { }
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user