Start work on new web display

This commit is contained in:
2024-02-10 03:27:13 +00:00
parent 3617c0cf5f
commit 122d417026
38 changed files with 3268 additions and 0 deletions

View File

@@ -0,0 +1,4 @@
export default class DeviceMessage {
name: string = '';
status: boolean = false;
}

View File

@@ -0,0 +1,4 @@
export default class LaundryStatus {
washer: boolean | undefined = false;
dryer: boolean | undefined = false;
}

View File

@@ -0,0 +1,64 @@
import { HubConnectionBuilder, HubConnection } from '@microsoft/signalr';
import axios from 'axios';
import DeviceMessage from './device-message';
import LaundryStatus from './laundry-status';
import Environment from '../../environment';
export default class LaundryService {
private connection: HubConnection;
private started: boolean = false;
private latestStatus: LaundryStatus = new LaundryStatus();
constructor() {
this.connection = new HubConnectionBuilder()
.withUrl(Environment.getUrlPrefix() + '/api/hub/device-status', {
withCredentials: false,
})
.build();
}
async getLatest(): Promise<LaundryStatus> {
const response = await axios.get<DeviceMessage[]>(Environment.getUrlPrefix() + `/api/device-status/status/recent`);
const newStatus = new LaundryStatus();
response.data.forEach((deviceMessage) => {
if (deviceMessage.name === 'washer') {
newStatus.washer = deviceMessage.status;
} else if (deviceMessage.name === 'dryer') {
newStatus.dryer = deviceMessage.status;
}
});
return newStatus;
}
async start(callback: (laundryStatus: LaundryStatus) => void) {
if (this.started) {
return;
}
this.started = true;
this.latestStatus = await this.getLatest();
await this.connection.start();
this.connection!.on('LatestStatus', (message: string) => {
const deviceMessage = JSON.parse(message) as DeviceMessage;
const newStatus = new LaundryStatus();
newStatus.dryer = this.latestStatus.dryer;
newStatus.washer = this.latestStatus.washer;
if (deviceMessage.name === 'washer') {
newStatus.washer = deviceMessage.status;
} else if (deviceMessage.name === 'dryer') {
newStatus.dryer = deviceMessage.status;
}
callback(newStatus);
});
}
}

View File

@@ -0,0 +1,30 @@
import { HubConnectionBuilder, HubConnection } from '@microsoft/signalr';
import PowerStatus from './power-status';
import Environment from '../../environment';
export default class PowerService {
private connection: HubConnection;
private started: boolean = false;
constructor() {
this.connection = new HubConnectionBuilder()
.withUrl(Environment.getUrlPrefix() + '/api/hub/power', {
withCredentials: false,
})
.build();
}
async start(callback: (powerStatus: PowerStatus) => void) {
if (this.started) {
return;
}
this.started = true;
await this.connection.start();
this.connection!.on('LatestSample', (message: string) => {
callback(JSON.parse(message));
});
}
}

View File

@@ -0,0 +1,4 @@
export default class PowerStatus {
Generation: number = 0;
Consumption: number = 0;
}

View File

@@ -0,0 +1,38 @@
import { HubConnectionBuilder, HubConnection } from '@microsoft/signalr';
import WeatherUpdate from './weather-update';
import WeatherRecent from './weather-recent';
import Environment from '../../environment';
import axios from 'axios';
export default class WeatherService {
private connection: HubConnection;
private started: boolean = false;
constructor() {
this.connection = new HubConnectionBuilder()
.withUrl(Environment.getUrlPrefix() + '/api/hub/weather', {
withCredentials: false,
})
.build();
}
async getLatest(): Promise<WeatherRecent> {
const response = await axios.get<WeatherRecent>(Environment.getUrlPrefix() + `/api/weather/readings/recent`);
return response.data;
}
async start(callback: (weatherUpdate: WeatherUpdate) => void) {
if (this.started) {
return;
}
this.started = true;
await this.connection.start();
this.connection!.on('LatestReading', (message: string) => {
callback(JSON.parse(message));
});
}
}

View File

@@ -0,0 +1,25 @@
export default class WeatherRecent {
type: string | undefined;
message: null | undefined;
timestamp: Date | undefined;
windDirection: string | undefined;
windSpeed: number | undefined;
humidity: number | undefined;
rain: number | undefined;
pressure: number | undefined;
temperature: number | undefined;
batteryLevel: number | undefined;
lightLevel: number | undefined;
latitude: number | undefined;
longitude: number | undefined;
altitude: number | undefined;
satelliteCount: number | undefined;
gpsTimestamp: Date | undefined;
windChill: number | undefined;
heatIndex: number | undefined;
dewPoint: number | undefined;
pressureDifferenceThreeHour: number | undefined;
pressureSlope: number | undefined;
pressureAngle: number | undefined;
rainLastHour: number | undefined;
}

View File

@@ -0,0 +1,25 @@
export default class WeatherUpdate {
Type: string | undefined;
Message: null | undefined;
Timestamp: Date | undefined;
WindDirection: string | undefined;
WindSpeed: number | undefined;
Humidity: number | undefined;
Rain: number | undefined;
Pressure: number | undefined;
Temperature: number | undefined;
BatteryLevel: number | undefined;
LightLevel: number | undefined;
Latitude: number | undefined;
Longitude: number | undefined;
Altitude: number | undefined;
SatelliteCount: number | undefined;
GpsTimestamp: Date | undefined;
WindChill: number | undefined;
HeatIndex: number | undefined;
DewPoint: number | undefined;
PressureDifferenceThreeHour: number | undefined;
PressureSlope: number | undefined;
PressureAngle: number | undefined;
RainLastHour: number | undefined;
}