From ff3b30f38a551bb64160ffa8249d0ef225bcb26b Mon Sep 17 00:00:00 2001 From: trembon Date: Wed, 20 Sep 2023 22:24:15 +0200 Subject: [PATCH] added support for refreshing (ping) devices --- README.md | 3 ++- config.example.json | 3 ++- src/active-device.ts | 8 ++++++++ src/app.ts | 7 ++++++- src/interfaces/config/server.ts | 1 + src/refresh-devices.ts | 30 ++++++++++++++++++++++++++++++ 6 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 src/refresh-devices.ts diff --git a/README.md b/README.md index 6c4f519..c6bd65d 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,8 @@ Basic example of the configuration (config.json) file. { "server": { "port": 3000, - "deviceReconnectWait": 5000 + "deviceReconnectWait": 5000, + "refreshTime": 60000 }, "webhooks": ["http://localhost:4321/webhook"], "devices": [ diff --git a/config.example.json b/config.example.json index 09f2af5..1a9af2e 100644 --- a/config.example.json +++ b/config.example.json @@ -1,7 +1,8 @@ { "server": { "port": 3000, - "deviceReconnectWait": 5000 + "deviceReconnectWait": 5000, + "refreshTime": 60000 }, "webhooks": ["http://localhost:4321/webhook"], "devices": [ diff --git a/src/active-device.ts b/src/active-device.ts index d9fcc89..823b760 100644 --- a/src/active-device.ts +++ b/src/active-device.ts @@ -64,6 +64,14 @@ export default class ActiveDevice { await this.tuya.disconnect(); } + async refresh(): Promise { + if(this.device.disabled || !this.tuya.isConnected()){ + return; + } + + await this.tuya.refresh({schema: true}); + } + async set( data: ITuyaMultipleProperties | ITuyaSingleProperty ): Promise<{ [dps: string]: any }> { diff --git a/src/app.ts b/src/app.ts index 10bd870..16becc4 100644 --- a/src/app.ts +++ b/src/app.ts @@ -8,12 +8,16 @@ import { import Logger from "./logger"; import processDevices from "./process-devices"; import PublicDevice from "./public-device.model"; +import refreshDevices from "./refresh-devices"; Logger.Info(`Starting`); let devices: { [id: string]: ActiveDevice } = {}; -const config = new Configuration(async () => processDevices(devices)); +const config = new Configuration(async () => { + processDevices(devices); + refreshDevices(devices); +}); config.initialize(); const app = express(); @@ -22,6 +26,7 @@ app.use(express.json()); const port = config.server().port ?? 3000; processDevices(devices); +refreshDevices(devices); app.get("/", (req, res) => { res.json([ diff --git a/src/interfaces/config/server.ts b/src/interfaces/config/server.ts index a93d51a..161b8ee 100644 --- a/src/interfaces/config/server.ts +++ b/src/interfaces/config/server.ts @@ -1,4 +1,5 @@ export default interface IConfigServer { port: number; deviceReconnectWait: number; + refreshTime?: number; } diff --git a/src/refresh-devices.ts b/src/refresh-devices.ts new file mode 100644 index 0000000..fb019b4 --- /dev/null +++ b/src/refresh-devices.ts @@ -0,0 +1,30 @@ +import ActiveDevice from "./active-device"; +import Configuration from "./configuration"; +import Logger from "./logger"; + +let refreshDevicesInterval = undefined; +const refreshDevices = (activeDevices: { [id: string]: ActiveDevice }) => { + if (refreshDevicesInterval) { + clearInterval(refreshDevicesInterval); + refreshDevicesInterval = undefined; + } + + const refreshTime = Configuration.instance.server().refreshTime; + if (refreshTime && refreshTime > 0) { + refreshDevicesInterval = setInterval(() => { + for (const key in activeDevices) { + try { + activeDevices[key].refresh(); + } catch (ex: unknown) { + Logger.Error( + `${activeDevices[key].tuya.device.id} - Error refreshing device: ${ + (ex).message + }` + ); + } + } + }, refreshTime); + } +}; + +export default refreshDevices;