From 1a658ae30d6d2538220b33af052be045590322a9 Mon Sep 17 00:00:00 2001 From: Elias Renman Date: Mon, 3 Jul 2023 22:36:58 +0200 Subject: [PATCH] fix: sqlite and types --- server/.env.example | 1 - server/src/axios/iot.axios.ts | 3 +++ server/src/cron/index.ts | 20 +++++++++++--------- server/src/db/Databasehandler.ts | 5 +++-- server/src/processors/moisture.processor.ts | 18 ++++++++---------- server/src/sockets/moisture.socket.ts | 6 +++--- 6 files changed, 28 insertions(+), 25 deletions(-) diff --git a/server/.env.example b/server/.env.example index b5bf3c8..319865c 100644 --- a/server/.env.example +++ b/server/.env.example @@ -1,2 +1 @@ -DATABASE_URL="file:./db.sqlite" IOT_BASE_URL='192.168.1.203' \ No newline at end of file diff --git a/server/src/axios/iot.axios.ts b/server/src/axios/iot.axios.ts index efa9d53..5d7f8a3 100644 --- a/server/src/axios/iot.axios.ts +++ b/server/src/axios/iot.axios.ts @@ -1,4 +1,7 @@ +import { config } from "dotenv"; import axios from "axios"; +config(); + export const BASE_URL = process.env.IOT_BASE_URL; export const iotClient = axios.create({ baseURL: BASE_URL, diff --git a/server/src/cron/index.ts b/server/src/cron/index.ts index 0429f0b..ff86c48 100644 --- a/server/src/cron/index.ts +++ b/server/src/cron/index.ts @@ -4,7 +4,7 @@ import { MoistureResponse } from "../axios/iot.types"; import { emitter } from "../eventemitter"; import { AxiosError } from "axios"; import { logger } from "../config"; -import { db } from "../db/Databasehandler"; +import { MoistureValueRow, db } from "../db/Databasehandler"; export function registerCronjobs() { cron.schedule( @@ -33,27 +33,29 @@ export function readMoistureLevels() { return iotClient .get("moisture/read") .catch((err: AxiosError) => { + console.log(err); return { data: undefined, }; }); } -export type MositureRow = Awaited>[number]; - -function insertRows(data: MoistureResponse | undefined) { +function insertRows(data: MoistureResponse | undefined): MoistureValueRow[] { if (!data) { return []; } - - return Object.entries(data.data).map(([key, value]) => - db.moistureValue.create({ + return Object.entries(data.data).map(([key, value]) => { + const result = db.moistureValue.create({ data: { name: key, value: value.precentage, createdAt: new Date(), }, select: { createdAt: true, id: true, name: true, value: true }, - }) - ); + }); + if ("changes" in result && "lastInsertRowid" in result) { + throw Error("Failed to insert row"); + } + return result as MoistureValueRow; + }); } diff --git a/server/src/db/Databasehandler.ts b/server/src/db/Databasehandler.ts index ba01545..dcc48a3 100644 --- a/server/src/db/Databasehandler.ts +++ b/server/src/db/Databasehandler.ts @@ -1,6 +1,7 @@ import sqlite from "better-sqlite3"; import { validate } from "node-cron"; import { join, resolve } from "path"; +import { logger } from "../config"; export class DatabaseHandler extends sqlite { public moistureValue: MositureValue; @@ -12,7 +13,7 @@ export class DatabaseHandler extends sqlite { } } -type MoistureValueRow = { +export type MoistureValueRow = { name: string; value: number; createdAt: Date | string; @@ -57,7 +58,7 @@ class MositureValue { public select(query: string, value: Record) { const select = this.getSelectStatement(value); const sql = `SELECT ${select} FROM 'MoistureValue' ${query}`; - console.log("SQL SELECT STATEMENT:", sql); + logger.debug("SQL SELECT STATEMENT:", sql); return this.db.prepare(sql); } diff --git a/server/src/processors/moisture.processor.ts b/server/src/processors/moisture.processor.ts index 7cd9907..b134f5d 100644 --- a/server/src/processors/moisture.processor.ts +++ b/server/src/processors/moisture.processor.ts @@ -1,15 +1,16 @@ import Queue from "queue"; import { iotClient } from "../axios/iot.axios"; import { config, logger } from "../config"; -import { MositureRow, readMoistureLevels } from "../cron"; +import { readMoistureLevels } from "../cron"; import { emitter } from "../eventemitter"; import { AxiosError } from "axios"; +import { MoistureValueRow } from "../db/Databasehandler"; const queue = new Queue({ results: [], concurrency: 1 }); queue.start((result) => logger.info("Successfully started queue")); -export function checkReadingAndEnqueue(rows: MositureRow[]) { +export function checkReadingAndEnqueue(rows: MoistureValueRow[]) { rows .sort((a, b) => +a.name) .forEach((row) => { @@ -18,8 +19,8 @@ export function checkReadingAndEnqueue(rows: MositureRow[]) { config.config.moisture.thresholds.lower["sensor_" + row.name]; // Conclude which sensors need watering. - if (row.value.toNumber() <= threshold) { - logger.info(`Enqueing ${row.name} Value at ${row.value.toNumber()}%`); + if (row.value <= threshold) { + logger.info(`Enqueing ${row.name} Value at ${row.value}%`); // Enqueue relevant sensors queue.push((cb) => process(row) @@ -27,15 +28,13 @@ export function checkReadingAndEnqueue(rows: MositureRow[]) { .catch((err) => cb && cb(err!)) ); } else { - logger.info( - `Will not enqueue ${row.name} Value at ${row.value.toNumber()}%` - ); + logger.info(`Will not enqueue ${row.name} Value at ${row.value}%`); } }); queue.start(); } -async function process(row: MositureRow) { +async function process(row: MoistureValueRow) { logger.info("Started processing of", row.name); const index = row.name; try { @@ -46,7 +45,7 @@ async function process(row: MositureRow) { // Check moisture level once per second for configured time await Promise.race([ // sleep(config.config.timeout * 1000), - timeoutCb(row.name, row.value.toNumber()), + timeoutCb(row.name, row.value), ]); } catch (e) { logger.info(`Failed to processing of ${row.name}`); @@ -117,7 +116,6 @@ function toggleWater(index: string, on: boolean) { } ) .then(async (item) => { - console.log(item.status, item.data); logger.info(`Successfully ${on ? "activate" : "deactivate"}d water gate`); return { on }; }); diff --git a/server/src/sockets/moisture.socket.ts b/server/src/sockets/moisture.socket.ts index cdc515b..7131d4a 100644 --- a/server/src/sockets/moisture.socket.ts +++ b/server/src/sockets/moisture.socket.ts @@ -2,10 +2,10 @@ import { Server, Socket } from "socket.io"; import { DefaultEventsMap } from "socket.io/dist/typed-events"; import { SocketHandler } from "./sockets"; import { emitter } from "../eventemitter"; -import { MositureRow } from "../cron"; + import { checkReadingAndEnqueue } from "../processors/moisture.processor"; import { logger } from "../config"; -import { db } from "../db/Databasehandler"; +import { MoistureValueRow, db } from "../db/Databasehandler"; export class MoistureSocket extends SocketHandler { constructor(server: Server) { @@ -14,7 +14,7 @@ export class MoistureSocket extends SocketHandler { this.server.on("getMoisture", this.getMoisture); this.server.on("getAllMoistures", this.getAllMoistures); - emitter.on("moisture.updated", (...rows: MositureRow[]) => { + emitter.on("moisture.updated", (...rows: MoistureValueRow[]) => { logger.info("Moisture updated event listener called"); server.emit("moisture.updated", rows); checkReadingAndEnqueue(rows);