out of bounds data catch
This commit is contained in:
parent
feb6ba49ed
commit
7e112a78e6
@ -185,13 +185,6 @@ export class AppService implements OnApplicationShutdown {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Cron('0 * * * *')
|
|
||||||
scheduledPulls() {
|
|
||||||
this.getWeather().catch(() => {
|
|
||||||
// do nothing
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
onApplicationShutdown() {
|
onApplicationShutdown() {
|
||||||
this.station?.close();
|
this.station?.close();
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,21 @@ const WIND_DIRS = [
|
|||||||
'NNW',
|
'NNW',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
interface Data {
|
||||||
|
indoorHumidity: number;
|
||||||
|
outdoorHumidity: number;
|
||||||
|
indoorTemperature: number;
|
||||||
|
outdoorTemperature: number;
|
||||||
|
outdoorDewPoint: number;
|
||||||
|
windChillTemp: number;
|
||||||
|
windSpeed: number;
|
||||||
|
gustSpeed: number;
|
||||||
|
windDirection: string;
|
||||||
|
rainDiff: number;
|
||||||
|
totalRain: number;
|
||||||
|
absPressure: number;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Model Dreamlink WH1080/WS1080
|
* Model Dreamlink WH1080/WS1080
|
||||||
*
|
*
|
||||||
@ -176,7 +191,7 @@ class WS1080 {
|
|||||||
* Read weather data from WS1080
|
* Read weather data from WS1080
|
||||||
* @returns Weather data
|
* @returns Weather data
|
||||||
*/
|
*/
|
||||||
async read() {
|
async read(): Promise<Data> {
|
||||||
const block = await WS1080.readBlock(this.device, this.dInterface, 0);
|
const block = await WS1080.readBlock(this.device, this.dInterface, 0);
|
||||||
|
|
||||||
if (!block) throw new Error('No data returned for request.');
|
if (!block) throw new Error('No data returned for request.');
|
||||||
@ -246,8 +261,8 @@ class WS1080 {
|
|||||||
|
|
||||||
this.previousRain = totalRain;
|
this.previousRain = totalRain;
|
||||||
|
|
||||||
// Return the data! Finally!
|
// Compile the data
|
||||||
return {
|
const data: Data = {
|
||||||
indoorHumidity,
|
indoorHumidity,
|
||||||
outdoorHumidity,
|
outdoorHumidity,
|
||||||
indoorTemperature,
|
indoorTemperature,
|
||||||
@ -261,11 +276,82 @@ class WS1080 {
|
|||||||
totalRain,
|
totalRain,
|
||||||
absPressure,
|
absPressure,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Validate the data integrity
|
||||||
|
this.validateReadings(data, currentBlock);
|
||||||
|
|
||||||
|
// Return the data! Finally!
|
||||||
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
close() {
|
close() {
|
||||||
this.device.close();
|
this.device.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private validateReadings(input: Data, packet: Buffer) {
|
||||||
|
const humidReadings: Array<keyof Data> = [
|
||||||
|
'indoorHumidity',
|
||||||
|
'outdoorHumidity',
|
||||||
|
];
|
||||||
|
const tempReadings: Array<keyof Data> = [
|
||||||
|
'indoorTemperature',
|
||||||
|
'outdoorTemperature',
|
||||||
|
'windChillTemp',
|
||||||
|
'outdoorDewPoint',
|
||||||
|
];
|
||||||
|
const speedReadings: Array<keyof Data> = ['windSpeed', 'gustSpeed'];
|
||||||
|
|
||||||
|
for (const key of humidReadings) {
|
||||||
|
if (
|
||||||
|
input[key] != null &&
|
||||||
|
((input[key] as number) < -1 || (input[key] as number) > 101)
|
||||||
|
) {
|
||||||
|
console.error(
|
||||||
|
'Invalid packet detected',
|
||||||
|
packet.toString('hex'),
|
||||||
|
'parsed',
|
||||||
|
input,
|
||||||
|
);
|
||||||
|
throw new Error(
|
||||||
|
`Erronous data readings detected: ${key} ${input[key]} is out of bounds.`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const key of tempReadings) {
|
||||||
|
if (
|
||||||
|
input[key] != null &&
|
||||||
|
((input[key] as number) < -100 || (input[key] as number) > 100)
|
||||||
|
) {
|
||||||
|
console.error(
|
||||||
|
'Invalid packet detected',
|
||||||
|
packet.toString('hex'),
|
||||||
|
'parsed',
|
||||||
|
input,
|
||||||
|
);
|
||||||
|
throw new Error(
|
||||||
|
`Erronous data readings detected: ${key} ${input[key]} is out of bounds.`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const key of speedReadings) {
|
||||||
|
if (
|
||||||
|
input[key] != null &&
|
||||||
|
((input[key] as number) < -1 || (input[key] as number) > 160)
|
||||||
|
) {
|
||||||
|
console.error(
|
||||||
|
'Invalid packet detected',
|
||||||
|
packet.toString('hex'),
|
||||||
|
'parsed',
|
||||||
|
input,
|
||||||
|
);
|
||||||
|
throw new Error(
|
||||||
|
`Erronous data readings detected: ${key} ${input[key]} is out of bounds.`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default WS1080;
|
export default WS1080;
|
||||||
|
Loading…
Reference in New Issue
Block a user