@mega-yfue/eufy-sdk 0.5.0-beta.54 → 0.5.0-beta.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -42,6 +42,7 @@ import type { VacuumCleanActions } from "./vacuum-clean.js";
42
42
  import type { VacuumDockActions } from "./vacuum-dock.js";
43
43
  import type { DisplayActions } from "./display.js";
44
44
  import type { SuctionActions } from "./suction.js";
45
+ import type { MowerActions } from "./mower.js";
45
46
  import type { LocateActions } from "./locate.js";
46
47
  import type { DeviceInfo } from "./info.js";
47
48
  import type { CusPushAlarmType } from "../push-events.js";
@@ -426,6 +427,8 @@ export interface DeviceActionMap {
426
427
  vacuumDock: VacuumDockActions;
427
428
  /** RoboVac suction: `level`, `boostIq`, `supportedLevels`; `setSuctionLevel`, `setBoostIq`. */
428
429
  suction: SuctionActions;
430
+ /** Robot mower (read-only): `battery`, `cutHeight`, `network`, `wifiSignal`, wear timers and settings. No write is captured. */
431
+ mower: MowerActions;
429
432
  /** RoboVac locate (find-robot beep): `locating`; `locate(on?)`. */
430
433
  locate: LocateActions;
431
434
  /** Smart Display (read-only): `battery`. No display write is captured. */
@@ -521,7 +524,7 @@ export type { ActionSpec } from "./types.js";
521
524
  * `undefined` for an action nothing describes.
522
525
  */
523
526
  export { actionSpecOf } from "./access.js";
524
- export type { PtzActions, LightActions, SmartLightActions, RgbColor, CameraActions, LockActions, SirenActions, ArmingActions, BatteryActions, MotionActions, ContactActions, LeakActions, SmokeActions, CoActions, KeypadActions, RtspActions, VacuumCleanActions, SuctionActions, LocateActions, };
527
+ export type { PtzActions, LightActions, SmartLightActions, RgbColor, CameraActions, LockActions, SirenActions, ArmingActions, BatteryActions, MotionActions, ContactActions, LeakActions, SmokeActions, CoActions, KeypadActions, RtspActions, VacuumCleanActions, SuctionActions, MowerActions, LocateActions, };
525
528
  /**
526
529
  * The member table each `*Actions` type is DERIVED from (`LockActions = Surface<typeof LOCK_MEMBERS>`),
527
530
  * so the type names the table and the table is part of the published surface.
@@ -550,6 +553,7 @@ export { SMART_LIGHT_MEMBERS } from "./smart-light.js";
550
553
  export { SMOKE_MEMBERS } from "./smoke.js";
551
554
  export { DISPLAY_MEMBERS, type DisplayActions } from "./display.js";
552
555
  export { SUCTION_MEMBERS } from "./suction.js";
556
+ export { MOWER_MEMBERS } from "./mower.js";
553
557
  export { VACUUM_CLEAN_MEMBERS } from "./vacuum-clean.js";
554
558
  export type { DeviceInfo } from "./info.js";
555
559
  export type { AutoSpotlightOptions } from "./light.js";
@@ -0,0 +1,230 @@
1
+ import { type Surface } from "./members.js";
2
+ import type { CapabilityModule } from "./types.js";
3
+ /**
4
+ * Robot-mower Tuya **DP ids** — the E15's Tuya product schema (`thing.m.device.ref.info.list` v5.4,
5
+ * `schemaInfo.schema`, product `bvxrcjxom787vnit`), each id also reported by a live E15. The product
6
+ * is built on Tuya's robot-vacuum template, so ids below 101 carry that template's codes; the mower's
7
+ * own data points are 101-146.
8
+ *
9
+ * Only scalar data points are named here. The Raw ones (`robot_status` 107, `battery_status` 108,
10
+ * `map_info` 113, the `*_control` commands 103-106, …) are protobuf messages whose field layout no
11
+ * source in hand states, and 102 (`device_infomation`) and 142 (`gps_info`) carry the device's network
12
+ * identity and position.
13
+ * @internal
14
+ */
15
+ export declare const MOWER_DP: {
16
+ readonly BATTERY: 8;
17
+ readonly VOLUME: 26;
18
+ readonly CHILD_LOCK: 47;
19
+ readonly RAIN_AUTO_RETURN: 101;
20
+ readonly WIFI_SIGNAL: 109;
21
+ readonly MOW_HEIGHT: 110;
22
+ readonly SAVE_MAP_PROGRESS: 118;
23
+ readonly STATION_USED_TIME: 125;
24
+ readonly BLADE_USED_TIME: 126;
25
+ readonly EDGE_TRIM: 128;
26
+ readonly WORK_ANGLE_ENABLED: 130;
27
+ readonly WORK_ANGLE: 131;
28
+ readonly SMART_NO_GO_ZONES: 132;
29
+ readonly BIRD_VIEW_CAPTURE: 133;
30
+ readonly NETWORK: 134;
31
+ readonly CELLULAR_ENABLED: 137;
32
+ readonly EDGE_DISTANCE: 139;
33
+ readonly GPS_ANTI_THEFT: 140;
34
+ readonly SPARSE_LAWN_OPTIMIZATION: 141;
35
+ };
36
+ /** The `net_media_type` (DP 134) range, as the schema lists it. */
37
+ export declare const MOWER_NETWORKS: readonly ["None", "Wifi", "Cellular"];
38
+ /** The mower's network link (DP 134). */
39
+ export type MowerNetwork = (typeof MOWER_NETWORKS)[number];
40
+ /**
41
+ * Every `mower` read, declared once.
42
+ *
43
+ * All read-only. Several of these data points are `rw` in the schema, but no write has been captured
44
+ * against a mower, and the vendor app drives the mower through named pass-through commands rather than
45
+ * by publishing these DPs, so no setter is installed.
46
+ *
47
+ * Exported but NOT published: each entry states its wire id, which the reference site does not carry.
48
+ * @internal
49
+ */
50
+ export declare const MOWER_MEMBERS: {
51
+ /** Charge percentage (DP 8, `battery_percentage`). */
52
+ readonly battery: {
53
+ readonly param: 8;
54
+ readonly type: "number";
55
+ readonly unit: "%";
56
+ readonly kind: "percent";
57
+ readonly provenance: "mega";
58
+ readonly description: "Battery level 0-100 (DP 8, battery_percentage). Read-only.";
59
+ };
60
+ /** Speaker volume (DP 26, `volume_set`). */
61
+ readonly volume: {
62
+ readonly param: 26;
63
+ readonly type: "number";
64
+ readonly unit: "%";
65
+ readonly kind: "percent";
66
+ readonly provenance: "mega";
67
+ readonly description: "Speaker volume 0-100 (DP 26, volume_set). Read-only.";
68
+ };
69
+ /** Whether the child lock is on (DP 47, `child_lock`). */
70
+ readonly childLock: {
71
+ readonly param: 47;
72
+ readonly type: "bool";
73
+ readonly kind: "boolean";
74
+ readonly provenance: "mega";
75
+ readonly description: "Child lock on (DP 47, child_lock). Read-only.";
76
+ };
77
+ /** Whether the mower returns to its station when it detects rain (DP 101, `rain_auto_return`). */
78
+ readonly rainAutoReturn: {
79
+ readonly param: 101;
80
+ readonly type: "bool";
81
+ readonly kind: "boolean";
82
+ readonly provenance: "mega";
83
+ readonly description: "Return to the station when rain is detected (DP 101, rain_auto_return). Read-only.";
84
+ };
85
+ /** Wi-Fi signal strength as a percentage (DP 109, `wifi_signal_strength`), not a dBm reading. */
86
+ readonly wifiSignal: {
87
+ readonly param: 109;
88
+ readonly type: "number";
89
+ readonly unit: "%";
90
+ readonly kind: "percent";
91
+ readonly provenance: "mega";
92
+ readonly description: "Wi-Fi signal strength 0-100 % (DP 109, wifi_signal_strength). Read-only.";
93
+ };
94
+ /** Cutting height in millimetres (DP 110, `mow_height`), 25-75. */
95
+ readonly cutHeight: {
96
+ readonly param: 110;
97
+ readonly type: "number";
98
+ readonly unit: "mm";
99
+ readonly kind: "millimetres";
100
+ readonly min: 25;
101
+ readonly max: 75;
102
+ readonly provenance: "mega";
103
+ readonly description: "Cutting height 25-75 mm (DP 110, mow_height). Read-only.";
104
+ };
105
+ /** Progress of saving the map (DP 118, `save_map_process`). */
106
+ readonly mapSaveProgress: {
107
+ readonly param: 118;
108
+ readonly type: "number";
109
+ readonly unit: "%";
110
+ readonly kind: "percent";
111
+ readonly provenance: "mega";
112
+ readonly description: "Map-save progress 0-100 % (DP 118, save_map_process). Read-only.";
113
+ };
114
+ /** Total base-station use in minutes (DP 125, `base_station_used_time`). */
115
+ readonly stationUsedTime: {
116
+ readonly param: 125;
117
+ readonly type: "number";
118
+ readonly unit: "min";
119
+ readonly kind: "minutes";
120
+ readonly provenance: "mega";
121
+ readonly description: "Base-station use in minutes (DP 125, base_station_used_time). Read-only.";
122
+ };
123
+ /** Total cutting-blade use in minutes (DP 126, `mow_blade_used_time`). */
124
+ readonly bladeUsedTime: {
125
+ readonly param: 126;
126
+ readonly type: "number";
127
+ readonly unit: "min";
128
+ readonly kind: "minutes";
129
+ readonly provenance: "mega";
130
+ readonly description: "Cutting-blade use in minutes (DP 126, mow_blade_used_time). Read-only.";
131
+ };
132
+ /** Whether edge trimming is on (DP 128, `edge_trim`). */
133
+ readonly edgeTrim: {
134
+ readonly param: 128;
135
+ readonly type: "bool";
136
+ readonly kind: "boolean";
137
+ readonly provenance: "mega";
138
+ readonly description: "Edge trimming on (DP 128, edge_trim). Read-only.";
139
+ };
140
+ /** Whether a fixed mowing angle is in use (DP 130, `enable_work_angle`); the angle is `workAngle`. */
141
+ readonly workAngleEnabled: {
142
+ readonly param: 130;
143
+ readonly type: "bool";
144
+ readonly kind: "boolean";
145
+ readonly provenance: "mega";
146
+ readonly description: "Fixed mowing angle in use (DP 130, enable_work_angle). Read-only.";
147
+ };
148
+ /** The mowing angle in degrees, -90 to 90 (DP 131, `work_angle`). */
149
+ readonly workAngle: {
150
+ readonly param: 131;
151
+ readonly type: "number";
152
+ readonly unit: "°";
153
+ readonly kind: "degrees";
154
+ readonly min: -90;
155
+ readonly max: 90;
156
+ readonly provenance: "mega";
157
+ readonly description: "Mowing angle -90 to 90 degrees (DP 131, work_angle). Read-only.";
158
+ };
159
+ /** Whether smart no-go zones are on (DP 132, `enable_smart_forbid_zone`). */
160
+ readonly smartNoGoZones: {
161
+ readonly param: 132;
162
+ readonly type: "bool";
163
+ readonly kind: "boolean";
164
+ readonly provenance: "mega";
165
+ readonly description: "Smart no-go zones on (DP 132, enable_smart_forbid_zone). Read-only.";
166
+ };
167
+ /** Whether bird's-eye-view capture is on (DP 133, `enable_bird_view_capture`). */
168
+ readonly birdViewCapture: {
169
+ readonly param: 133;
170
+ readonly type: "bool";
171
+ readonly kind: "boolean";
172
+ readonly provenance: "mega";
173
+ readonly description: "Bird's-eye-view capture on (DP 133, enable_bird_view_capture). Read-only.";
174
+ };
175
+ /**
176
+ * The network link in use (DP 134, `net_media_type`). Answers `undefined` for a value outside the
177
+ * schema's range.
178
+ */
179
+ readonly network: {
180
+ readonly param: 134;
181
+ readonly type: "string";
182
+ readonly provenance: "mega";
183
+ readonly decode: (raw: unknown) => MowerNetwork | undefined;
184
+ readonly decodedKind: "enum";
185
+ readonly decodedValues: readonly ["None", "Wifi", "Cellular"];
186
+ readonly description: "Network link: None, Wifi or Cellular (DP 134, net_media_type). Read-only.";
187
+ };
188
+ /** Whether the cellular link is enabled (DP 137, `enable_cellular`). */
189
+ readonly cellularEnabled: {
190
+ readonly param: 137;
191
+ readonly type: "bool";
192
+ readonly kind: "boolean";
193
+ readonly provenance: "mega";
194
+ readonly description: "Cellular link enabled (DP 137, enable_cellular). Read-only.";
195
+ };
196
+ /** Edge-following distance in millimetres (DP 139, `follow_edge_distance`), signed. */
197
+ readonly edgeDistance: {
198
+ readonly param: 139;
199
+ readonly type: "number";
200
+ readonly unit: "mm";
201
+ readonly kind: "millimetres";
202
+ readonly min: -10000;
203
+ readonly max: 10000;
204
+ readonly provenance: "mega";
205
+ readonly description: "Edge-following distance in mm, signed (DP 139, follow_edge_distance). Read-only.";
206
+ };
207
+ /** Whether GPS anti-theft is on (DP 140, `gps_location_check`). */
208
+ readonly gpsAntiTheft: {
209
+ readonly param: 140;
210
+ readonly type: "bool";
211
+ readonly kind: "boolean";
212
+ readonly provenance: "mega";
213
+ readonly description: "GPS anti-theft on (DP 140, gps_location_check). Read-only.";
214
+ };
215
+ /** Whether sparse-lawn optimisation is on (DP 141, `sparse_lawn_optimization`). */
216
+ readonly sparseLawnOptimization: {
217
+ readonly param: 141;
218
+ readonly type: "bool";
219
+ readonly kind: "boolean";
220
+ readonly provenance: "mega";
221
+ readonly description: "Sparse-lawn optimisation on (DP 141, sparse_lawn_optimization). Read-only.";
222
+ };
223
+ };
224
+ /**
225
+ * Bound mower reads — the object returned by `dev.mower()`. Each getter is present only once the
226
+ * mower has reported its data point.
227
+ */
228
+ export type MowerActions = Surface<typeof MOWER_MEMBERS>;
229
+ /** `mower` — robot-mower state from its Tuya data points. */
230
+ export declare const MOWER: CapabilityModule;
@@ -9,6 +9,7 @@
9
9
  * `types.ts`.
10
10
  * - CLEAN_PARAMS — RoboVac Tuya DP space (ids 1 and above), names from the cloud
11
11
  * `get_product_data_point` data_point_list, hence provenance `mega`.
12
+ * - MOWER_PARAMS — robot-mower Tuya DP space, names from the mower's Tuya product schema.
12
13
  *
13
14
  * Which models reported an id, and the capture that named it, are in the commit that adds the entry.
14
15
  */
@@ -50,3 +51,8 @@ export declare const CLEAN_PARAMS: Record<number, ParamDef>;
50
51
  * display settings screen, one control at a time, params diffed after each.
51
52
  */
52
53
  export declare const DISPLAY_PARAMS: Record<number, ParamDef>;
54
+ /**
55
+ * Robot-mower Tuya DP space — names from the E15's Tuya product schema (`schemaInfo.schema`), each id
56
+ * also reported by a live E15. Only the scalar data points the `mower` capability reads are listed.
57
+ */
58
+ export declare const MOWER_PARAMS: Record<number, ParamDef>;
@@ -14,7 +14,7 @@
14
14
  import type { Codec } from "./types.js";
15
15
  import { type ParamDef } from "./param-dictionary.js";
16
16
  /** The param id spaces this SDK models. */
17
- export type ParamNamespace = "security" | "clean" | "life" | "print" | "display";
17
+ export type ParamNamespace = "security" | "clean" | "mower" | "life" | "print" | "display";
18
18
  /** Look up a param def in the given namespace. */
19
19
  export declare function paramDef(ns: ParamNamespace, paramType: number): ParamDef | undefined;
20
20
  /** The param namespace a device's ids live in, from its codec, via the module-local `NAMESPACE_BY_CODEC` table. */
@@ -39,7 +39,7 @@ export type Codec = "station" | "camera" | "sensor" | "lock" | "keypad" | "vacuu
39
39
  * it maps to a {@link CapabilityModule} that owns its property schema. Extend this union as
40
40
  * new capabilities are modelled — adding one never requires a subclass.
41
41
  */
42
- export type Capability = "video" | "snapshot" | "motion" | "person_detection" | "battery" | "light" | "ptz" | "doorbell" | "contact" | "leak" | "smoke" | "co" | "siren" | "lock" | "keypad" | "arming" | "storage" | "rtsp" | "camera" | "audio" | "vacuum_clean" | "vacuum_dock" | "suction" | "locate" | "smart_light" | "display" | "info";
42
+ export type Capability = "video" | "snapshot" | "motion" | "person_detection" | "battery" | "light" | "ptz" | "doorbell" | "contact" | "leak" | "smoke" | "co" | "siren" | "lock" | "keypad" | "arming" | "storage" | "rtsp" | "camera" | "audio" | "vacuum_clean" | "vacuum_dock" | "suction" | "locate" | "mower" | "smart_light" | "display" | "info";
43
43
  /** Value type of a property. */
44
44
  export type PropertyValueType = "bool" | "number" | "string" | "enum";
45
45
  /**
@@ -52,11 +52,12 @@ export type PropertyValueType = "bool" | "number" | "string" | "enum";
52
52
  * one as the other is wrong in a way no type check catches.
53
53
  *
54
54
  * - `boolean` — an on/off state (always paired with `type: "bool"`).
55
- * - `percent` / `celsius` / `dbm` / `seconds` / `hours` / `megabytes` / `degrees` — a measured quantity
56
- * in the unit the device reports it in; each pairs with the matching `unit`. Values are
57
- * never converted on the way out — a converted reading is an invented one. `seconds` and `hours`
58
- * are separate kinds for exactly that reason: a robot reports a run in seconds and a consumable's
59
- * wear in hours, and normalising one into the other would publish a number the device never sent.
55
+ * - `percent` / `celsius` / `dbm` / `seconds` / `hours` / `minutes` / `millimetres` / `megabytes` /
56
+ * `degrees` — a measured quantity in the unit the device reports it in; each pairs with the
57
+ * matching `unit`. Values are never converted on the way out — a converted reading is an invented
58
+ * one. `seconds`, `minutes` and `hours` are separate kinds for exactly that reason: a robot reports
59
+ * a run in seconds, a mower its blade wear in minutes and a vacuum's consumable wear in hours, and
60
+ * normalising one into another would publish a number the device never sent.
60
61
  * - `scalar` — a plain number in no unit at all: a step on a ladder, a mode index, a raw level, a
61
62
  * segment count. Ordered and comparable, but its range and direction are the device's, so nothing
62
63
  * but the device says what a given value means.
@@ -83,7 +84,7 @@ export type PropertyValueType = "bool" | "number" | "string" | "enum";
83
84
  * decodes them and are exported beside that decoder; unlike an enum's options they are not carried
84
85
  * here, which is a gap this vocabulary does not close on its own.
85
86
  */
86
- export declare const KNOWN_VALUE_KINDS: readonly ["boolean", "percent", "celsius", "dbm", "seconds", "hours", "megabytes", "degrees", "scalar", "bitfield", "enum", "identifier", "timestamp", "text"];
87
+ export declare const KNOWN_VALUE_KINDS: readonly ["boolean", "percent", "celsius", "dbm", "seconds", "hours", "minutes", "millimetres", "megabytes", "degrees", "scalar", "bitfield", "enum", "identifier", "timestamp", "text"];
87
88
  /** One of the kinds this version models — the closed half of {@link ValueKind}. */
88
89
  export type KnownValueKind = (typeof KNOWN_VALUE_KINDS)[number];
89
90
  /**
@@ -106,7 +107,8 @@ export declare function isKnownValueKind(kind: ValueKind): kind is KnownValueKin
106
107
  /**
107
108
  * How much a param's name and meaning can be trusted, most-trusted first. This is the one definition;
108
109
  * the param dictionary and every `provenance` field use it.
109
- * - `mega` — the vendor's cloud names it: its data-point catalog (`get_product_data_point`), or a
110
+ * - `mega` — the vendor's cloud names it: its data-point catalog (`get_product_data_point`), the
111
+ * Tuya product schema of an `eufy_home_tuya` device (`thing.m.device.ref.info.list`), or a
110
112
  * reported value that matches what the cloud record already says (a model name or code).
111
113
  * - `verified` — confirmed on a real device by this project: our own capture or observation, or
112
114
  * identified by someone who has the hardware.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mega-yfue/eufy-sdk",
3
- "version": "0.5.0-beta.54",
3
+ "version": "0.5.0-beta.55",
4
4
  "description": "One typed TypeScript client for the Anker eufy v6 cloud — capability-driven devices, realtime events over P2P/MQTT/push, and live media",
5
5
  "license": "Apache-2.0",
6
6
  "author": "mega-yfue",