From 0e5511d61d8de6cfd3f89e44083f513f3bfaf544 Mon Sep 17 00:00:00 2001 From: Li Zhineng Date: Fri, 18 Jul 2025 11:40:28 +0800 Subject: retrieve device status --- packages/airmx/package.json | 1 + packages/airmx/src/airmx.test.ts | 17 +++++++++++++++++ packages/airmx/src/airmx.ts | 12 +++++++++++- 3 files changed, 29 insertions(+), 1 deletion(-) (limited to 'packages') diff --git a/packages/airmx/package.json b/packages/airmx/package.json index b554568..055c0ca 100644 --- a/packages/airmx/package.json +++ b/packages/airmx/package.json @@ -7,6 +7,7 @@ "scripts": { "build": "tsc", "test": "jest", + "test:watch": "jest --watch --verbose", "format": "prettier . --write" }, "repository": { diff --git a/packages/airmx/src/airmx.test.ts b/packages/airmx/src/airmx.test.ts index 9f726be..aee5bbe 100644 --- a/packages/airmx/src/airmx.test.ts +++ b/packages/airmx/src/airmx.test.ts @@ -1,5 +1,6 @@ import { MqttClient } from 'mqtt' import { Airmx, Topic } from './airmx.js' +import { EagleStatus } from './eagle.js' describe('topic', () => { test('parse parses topic from string', () => { @@ -95,6 +96,22 @@ describe('airmx', () => { expect(mockMqttClient.subscribe).toHaveBeenCalledWith('airmx/01/+/+/1/1/+') }) + it('should record the latest status for eagles', () => { + const testDevice = { id: 1, key: 'f0eb21fe346c88e1d1ac73546022cd5d' } + const message = + '{"cmdId": 210,"name":"eagleStatus","time":1752675701,"from":2,"data":{"version":"10.00.17","power":1,"heatStatus":0,"mode":0,"cadr":47,"prm":1320,"g4Percent": 100,"hepaPercent":100,"carbonId":"031","g4Id":"041","hepaId":"021","carbonPercent":17,"diffPressure1":99999,"diffPressure2":99999,"t0":35,"status":0,"denoise":1},"sig":"b8796682da77e8c929dddf7e6461afec"}' + + const airmx = new Airmx({ mqtt: mockMqttClient, devices: [testDevice] }) + const messageHandler = mockMqttClient.on.mock.calls.find( + ([event]) => event === 'message', + )?.[1] as ((topic: string, message: Buffer) => void) | undefined + expect(messageHandler).toBeDefined() + + messageHandler!('airmx/01/0/1/1/1/1', Buffer.from(message)) + const status = airmx.getEagleStatus(1) + expect(status).toBeInstanceOf(EagleStatus) + }) + describe('message validation', () => { const testDevice = { id: 1, key: 'f0eb21fe346c88e1d1ac73546022cd5d' } let messageHandler: ((topic: string, message: Buffer) => void) | undefined diff --git a/packages/airmx/src/airmx.ts b/packages/airmx/src/airmx.ts index 092941d..2026efd 100644 --- a/packages/airmx/src/airmx.ts +++ b/packages/airmx/src/airmx.ts @@ -77,11 +77,15 @@ export class Airmx { #signer + /** Pairs of device ID and its latest running status. */ + #eagles + constructor(private readonly config: Config) { this.#client = this.config.mqtt this.#client.on('connect', this.#handleConnect.bind(this)) this.#client.on('message', this.#handleMessage.bind(this)) this.#signer = new Signer() + this.#eagles = new Map() } onSnowUpdate(callback: SnowListener) { @@ -110,7 +114,9 @@ export class Airmx { this.#notifySnow(SnowStatus.from(deviceId, data)) break case EagleStatus.commandId(): - this.#notifyEagle(EagleStatus.from(deviceId, data)) + const status = EagleStatus.from(deviceId, data) + this.#eagles.set(deviceId, status) + this.#notifyEagle(status) break } } @@ -157,4 +163,8 @@ export class Airmx { } return device } + + getEagleStatus(deviceId: number) { + return this.#eagles.get(deviceId) + } } -- cgit v1.2.3