summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorLi Zhineng <[email protected]>2025-07-18 11:40:28 +0800
committerLi Zhineng <[email protected]>2025-07-18 11:40:28 +0800
commit0e5511d61d8de6cfd3f89e44083f513f3bfaf544 (patch)
tree9da988e71602551544c154f3325b1a5255ab41d0 /packages
parentf44550336834a19b15f63cc8c4553b9112aeaad4 (diff)
downloadairmx-0e5511d61d8de6cfd3f89e44083f513f3bfaf544.tar.gz
airmx-0e5511d61d8de6cfd3f89e44083f513f3bfaf544.zip
retrieve device status
Diffstat (limited to 'packages')
-rw-r--r--packages/airmx/package.json1
-rw-r--r--packages/airmx/src/airmx.test.ts17
-rw-r--r--packages/airmx/src/airmx.ts12
3 files changed, 29 insertions, 1 deletions
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<number, EagleStatus>()
}
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)
+ }
}