summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Zhineng <[email protected]>2025-07-16 23:44:20 +0800
committerLi Zhineng <[email protected]>2025-07-16 23:44:20 +0800
commit359f267dcb57e869bd08cc50673fb617771d517b (patch)
treeec118bf0965307aa20112d743dbf92beb99f7ff9
parent1fb982433e22ab8d34bdeb8e7e9d15baf4c0bac9 (diff)
downloadairmx-359f267dcb57e869bd08cc50673fb617771d517b.tar.gz
airmx-359f267dcb57e869bd08cc50673fb617771d517b.zip
extract typings
-rw-r--r--packages/airmx/src/airmx.test.ts4
-rw-r--r--packages/airmx/src/airmx.ts52
-rw-r--r--packages/airmx/src/eagle.test.ts3
-rw-r--r--packages/airmx/src/eagle.ts26
-rw-r--r--packages/airmx/src/snow.ts42
-rw-r--r--packages/airmx/src/types.ts101
6 files changed, 118 insertions, 110 deletions
diff --git a/packages/airmx/src/airmx.test.ts b/packages/airmx/src/airmx.test.ts
index 80e70a0..0a71070 100644
--- a/packages/airmx/src/airmx.test.ts
+++ b/packages/airmx/src/airmx.test.ts
@@ -1,5 +1,5 @@
import { MqttClient } from 'mqtt/*'
-import { Airmx, Topic, TOPIC_STATUS } from './airmx'
+import { Airmx, Topic } from './airmx'
describe('topic', () => {
test('parse parses topic from string', () => {
@@ -83,7 +83,7 @@ describe('airmx', () => {
([event]) => event === 'connect'
)?.[1] as (() => void) | undefined;
connectHandler?.()
- expect(mockMqttClient.subscribe).toHaveBeenCalledWith(TOPIC_STATUS);
+ expect(mockMqttClient.subscribe).toHaveBeenCalledWith('airmx/01/+/+/1/1/+');
})
describe('message validation', () => {
diff --git a/packages/airmx/src/airmx.ts b/packages/airmx/src/airmx.ts
index 00c379f..947bda4 100644
--- a/packages/airmx/src/airmx.ts
+++ b/packages/airmx/src/airmx.ts
@@ -2,42 +2,12 @@ import crypto from 'crypto'
import { MqttClient } from 'mqtt'
import { EagleStatus } from './eagle'
import { SnowStatus } from './snow'
-
-type TSnowListener = (status: SnowStatus) => void
-type TEagleListener = (status: EagleStatus) => void
-
-export interface Config {
- mqtt: MqttClient
- devices: Device[]
-}
-
-export interface Device {
- id: number
- key: string
-}
-
-export enum Command {
- SnowStatus = 200,
- EagleStatus = 210
-}
-
-export enum MessageSource {
- Snow = 1,
- Eagle = 2,
- App_iOS = 3,
- App_Android = 4
-}
-
-export interface Message<T> {
- cmdId: number
- name: string
- time: number
- from: MessageSource
- data: T
- sig: string
-}
-
-export const TOPIC_STATUS = 'airmx/01/+/+/1/1/+'
+import {
+ Config,
+ Command,
+ SnowListener,
+ EagleListener
+} from './types'
export class Topic {
constructor(
@@ -89,8 +59,8 @@ export class Topic {
export class Airmx {
#listeners: {
- eagle: TEagleListener[],
- snow: TSnowListener[]
+ eagle: EagleListener[],
+ snow: SnowListener[]
} = {
eagle: [],
snow: []
@@ -106,18 +76,18 @@ export class Airmx {
this.#client.on('message', this.#handleMessage.bind(this))
}
- onSnowUpdate(callback: TSnowListener) {
+ onSnowUpdate(callback: SnowListener) {
this.#listeners.snow.push(callback)
return this
}
- onEagleUpdate(callback: TEagleListener) {
+ onEagleUpdate(callback: EagleListener) {
this.#listeners.eagle.push(callback)
return this
}
#handleConnect() {
- this.#client.subscribe(TOPIC_STATUS)
+ this.#client.subscribe('airmx/01/+/+/1/1/+')
}
#handleMessage(topic: string, message: Buffer): void {
diff --git a/packages/airmx/src/eagle.test.ts b/packages/airmx/src/eagle.test.ts
index 5bf6643..7ffe211 100644
--- a/packages/airmx/src/eagle.test.ts
+++ b/packages/airmx/src/eagle.test.ts
@@ -1,4 +1,5 @@
-import { EagleMode, EagleStatus, EagleStatusData } from './eagle'
+import { EagleStatus } from './eagle'
+import { EagleMode, EagleStatusData } from './types'
test('from parses message to eagle status', () => {
const status = EagleStatus.from(12345, createStubStatusData())
diff --git a/packages/airmx/src/eagle.ts b/packages/airmx/src/eagle.ts
index 3eccdd2..d36b6bc 100644
--- a/packages/airmx/src/eagle.ts
+++ b/packages/airmx/src/eagle.ts
@@ -1,28 +1,4 @@
-import { Message } from './airmx'
-
-export interface EagleStatusData {
- version: string
- power: number
- mode: number
- status: number
- denoise: number
- heatStatus: number
- cadr: number
- prm: number
- diffPressure1: number,
- diffPressure2: number,
- t0: number,
- g4Id: string
- g4Percent: number
- carbonId: string
- carbonPercent: number
- hepaId: string
- hepaPercent: number
-}
-
-export enum EagleMode {
- Silent = 2
-}
+import { Message, EagleStatusData, EagleMode } from './types'
export class EagleStatus {
constructor(
diff --git a/packages/airmx/src/snow.ts b/packages/airmx/src/snow.ts
index 5fb5ef6..5984c00 100644
--- a/packages/airmx/src/snow.ts
+++ b/packages/airmx/src/snow.ts
@@ -1,44 +1,4 @@
-import { Command, Message } from './airmx'
-
-export enum SensorState {
- Sampling = 'sampling'
-}
-
-export enum BatteryState {
- Charging = 'charging',
- Discharge = 'discharge'
-}
-
-export interface SnowStatusData {
- battery: number
- battery_state: BatteryState
- co2: number
- co2_state: SensorState
- co2_time: number
- h: number
- humi_state: SensorState
- oh: number
- opm100: number
- opm25: number
- ot: number
- pm100: number
- pm25: number
- pm250: number
- pm50: number
- pm_state: SensorState
- pm_time: number
- t: number
- temp_state: SensorState
- temp_unit: 'c'
- time: number
- tvoc: number
- tvoc_duration: number
- tvoc_state: SensorState
- tvoc_time: number
- tvoc_unit: 'ppb'
- version: string
- version_type: 'release'
-}
+import { Command, Message, SnowStatusData, BatteryState, SensorState } from './types'
export class SnowStatus {
constructor(
diff --git a/packages/airmx/src/types.ts b/packages/airmx/src/types.ts
new file mode 100644
index 0000000..c50785a
--- /dev/null
+++ b/packages/airmx/src/types.ts
@@ -0,0 +1,101 @@
+import type { MqttClient } from 'mqtt'
+import type { EagleStatus } from './eagle'
+import type { SnowStatus } from './snow'
+
+export interface Config {
+ mqtt: MqttClient
+ devices: Device[]
+}
+
+export interface Device {
+ id: number
+ key: string
+}
+
+export type SnowListener = (status: SnowStatus) => void
+export type EagleListener = (status: EagleStatus) => void
+
+export enum Command {
+ SnowStatus = 200,
+ EagleStatus = 210
+}
+
+export enum MessageSource {
+ Snow = 1,
+ Eagle = 2,
+ App_iOS = 3,
+ App_Android = 4
+}
+
+export interface Message<T> {
+ cmdId: number
+ name: string
+ time: number
+ from: MessageSource
+ data: T
+ sig: string
+}
+
+export interface EagleStatusData {
+ version: string
+ power: number
+ mode: number
+ status: number
+ denoise: number
+ heatStatus: number
+ cadr: number
+ prm: number
+ diffPressure1: number,
+ diffPressure2: number,
+ t0: number,
+ g4Id: string
+ g4Percent: number
+ carbonId: string
+ carbonPercent: number
+ hepaId: string
+ hepaPercent: number
+}
+
+export enum EagleMode {
+ Silent = 2
+}
+
+export enum SensorState {
+ Sampling = 'sampling'
+}
+
+export enum BatteryState {
+ Charging = 'charging',
+ Discharge = 'discharge'
+}
+
+export interface SnowStatusData {
+ battery: number
+ battery_state: BatteryState
+ co2: number
+ co2_state: SensorState
+ co2_time: number
+ h: number
+ humi_state: SensorState
+ oh: number
+ opm100: number
+ opm25: number
+ ot: number
+ pm100: number
+ pm25: number
+ pm250: number
+ pm50: number
+ pm_state: SensorState
+ pm_time: number
+ t: number
+ temp_state: SensorState
+ temp_unit: 'c'
+ time: number
+ tvoc: number
+ tvoc_duration: number
+ tvoc_state: SensorState
+ tvoc_time: number
+ tvoc_unit: 'ppb'
+ version: string
+ version_type: 'release'
+}