collect environment metrics

This commit is contained in:
liamcottle
2024-06-06 23:40:58 +12:00
parent 21e3afe1c2
commit 97fee2778d
3 changed files with 93 additions and 0 deletions

View File

@ -0,0 +1,21 @@
-- CreateTable
CREATE TABLE `environment_metrics` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`node_id` BIGINT NOT NULL,
`packet_id` BIGINT NULL,
`temperature` DECIMAL(65, 30) NULL,
`relative_humidity` DECIMAL(65, 30) NULL,
`barometric_pressure` DECIMAL(65, 30) NULL,
`gas_resistance` DECIMAL(65, 30) NULL,
`voltage` DECIMAL(65, 30) NULL,
`current` DECIMAL(65, 30) NULL,
`iaq` INTEGER NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `environment_metrics_created_at_idx`(`created_at`),
INDEX `environment_metrics_updated_at_idx`(`updated_at`),
INDEX `environment_metrics_node_id_idx`(`node_id`),
INDEX `environment_metrics_packet_id_idx`(`packet_id`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

View File

@ -116,6 +116,29 @@ model DeviceMetric {
@@map("device_metrics") @@map("device_metrics")
} }
model EnvironmentMetric {
id BigInt @id @default(autoincrement())
node_id BigInt
packet_id BigInt?
temperature Decimal?
relative_humidity Decimal?
barometric_pressure Decimal?
gas_resistance Decimal?
voltage Decimal?
current Decimal?
iaq Int?
created_at DateTime @default(now())
updated_at DateTime @default(now()) @updatedAt
@@index(created_at)
@@index(updated_at)
@@index(node_id)
@@index(packet_id)
@@map("environment_metrics")
}
model Position { model Position {
id BigInt @id @default(autoincrement()) id BigInt @id @default(autoincrement())
node_id BigInt node_id BigInt

View File

@ -654,6 +654,55 @@ client.on("message", async (topic, message) => {
} }
// handle environment metrics
if(telemetry.environmentMetrics){
// get metric values
const temperature = telemetry.environmentMetrics.temperature !== 0 ? telemetry.environmentMetrics.temperature : null;
const relativeHumidity = telemetry.environmentMetrics.relativeHumidity !== 0 ? telemetry.environmentMetrics.relativeHumidity : null;
const barometricPressure = telemetry.environmentMetrics.barometricPressure !== 0 ? telemetry.environmentMetrics.barometricPressure : null;
const gasResistance = telemetry.environmentMetrics.gasResistance !== 0 ? telemetry.environmentMetrics.gasResistance : null;
const voltage = telemetry.environmentMetrics.voltage !== 0 ? telemetry.environmentMetrics.voltage : null;
const current = telemetry.environmentMetrics.current !== 0 ? telemetry.environmentMetrics.current : null;
const iaq = telemetry.environmentMetrics.iaq !== 0 ? telemetry.environmentMetrics.iaq : null;
// create environment metric
try {
// find an existing metric with duplicate information created in the last 15 seconds
const existingDuplicateEnvironmentMetric = await prisma.environmentMetric.findFirst({
where: {
node_id: envelope.packet.from,
packet_id: envelope.packet.id,
created_at: {
gte: new Date(Date.now() - 15000), // created in the last 15 seconds
},
}
})
// create metric if no duplicates found
if(!existingDuplicateEnvironmentMetric){
await prisma.environmentMetric.create({
data: {
node_id: envelope.packet.from,
packet_id: envelope.packet.id,
temperature: temperature,
relative_humidity: relativeHumidity,
barometric_pressure: barometricPressure,
gas_resistance: gasResistance,
voltage: voltage,
current: current,
iaq: iaq,
},
});
}
} catch (e) {
console.error(e);
}
}
// update node telemetry in db // update node telemetry in db
if(Object.keys(data).length > 0){ if(Object.keys(data).length > 0){
try { try {