mirror of
https://github.com/ckaczor/HomeMonitor.git
synced 2026-01-13 17:22:54 -05:00
65 lines
2.0 KiB
TypeScript
65 lines
2.0 KiB
TypeScript
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);
|
|
});
|
|
}
|
|
}
|