iotas-ts 0.2.0 → 1.1.0
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.
- package/CHANGELOG.md +18 -0
- package/dist/src/api/iotasClient.d.ts +3 -2
- package/dist/src/api/iotasClient.js +36 -8
- package/dist/src/api/iotasClient.js.map +1 -1
- package/dist/src/api/transport.d.ts +2 -1
- package/dist/src/cache/featureCache.d.ts +5 -1
- package/dist/src/cache/featureCache.js +8 -0
- package/dist/src/cache/featureCache.js.map +1 -1
- package/dist/src/constants.d.ts +39 -0
- package/dist/src/constants.js +51 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/device.d.ts +19 -0
- package/dist/src/device.js +32 -0
- package/dist/src/device.js.map +1 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.js +4 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/predicates.d.ts +5 -0
- package/dist/src/predicates.js +19 -0
- package/dist/src/predicates.js.map +1 -0
- package/dist/src/quirks.d.ts +2 -0
- package/dist/src/quirks.js +9 -0
- package/dist/src/quirks.js.map +1 -0
- package/dist/src/thermostat.d.ts +19 -0
- package/dist/src/thermostat.js +51 -0
- package/dist/src/thermostat.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.1.0](https://github.com/mezaugusto/iotas-ts/compare/v1.0.0...v1.1.0) (2026-04-12)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* :art: extract shared IOTAS domain logic from plugin integrations ([#10](https://github.com/mezaugusto/iotas-ts/issues/10)) ([342bc0f](https://github.com/mezaugusto/iotas-ts/commit/342bc0fa4fb94540029e5a34ae91878085cbe39d))
|
|
9
|
+
|
|
10
|
+
## [1.0.0](https://github.com/mezaugusto/iotas-ts/compare/v0.2.0...v1.0.0) (2026-04-12)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### ⚠ BREAKING CHANGES
|
|
14
|
+
|
|
15
|
+
* :sparkles: Use fire-and-forget for feature update ([#8](https://github.com/mezaugusto/iotas-ts/issues/8))
|
|
16
|
+
|
|
17
|
+
### Features
|
|
18
|
+
|
|
19
|
+
* :sparkles: Use fire-and-forget for feature update ([#8](https://github.com/mezaugusto/iotas-ts/issues/8)) ([b144cc7](https://github.com/mezaugusto/iotas-ts/commit/b144cc7f5a277df1a945b7a36cae07beddec70ff))
|
|
20
|
+
|
|
3
21
|
## [0.2.0](https://github.com/mezaugusto/iotas-ts/compare/v0.1.1...v0.2.0) (2026-04-12)
|
|
4
22
|
|
|
5
23
|
|
|
@@ -15,6 +15,7 @@ export declare class IotasClient {
|
|
|
15
15
|
private readonly delay;
|
|
16
16
|
private unitRequest;
|
|
17
17
|
private featureIndex;
|
|
18
|
+
private deviceIndex;
|
|
18
19
|
private unit;
|
|
19
20
|
constructor(options: IotasClientOptions);
|
|
20
21
|
static withCredentials(log: IotasLogger, email: string, password: string, unitName?: string, options?: Pick<IotasClientOptions, 'fetch' | 'delay'>): IotasClient;
|
|
@@ -22,6 +23,6 @@ export declare class IotasClient {
|
|
|
22
23
|
getRooms(): Promise<Rooms>;
|
|
23
24
|
getFeature(featureId: string): Promise<Feature | null>;
|
|
24
25
|
private buildFeatureIndex;
|
|
25
|
-
updateFeature(featureId: string, value: number):
|
|
26
|
-
updateFeatureReliable
|
|
26
|
+
updateFeature(featureId: string, value: number): void;
|
|
27
|
+
private updateFeatureReliable;
|
|
27
28
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { needsReliableUpdate } from '../quirks.js';
|
|
1
2
|
import { IotasSession } from './session.js';
|
|
2
3
|
import { IotasTransport } from './transport.js';
|
|
3
4
|
const DEFAULT_RELIABLE_UPDATE_ATTEMPTS = 3;
|
|
@@ -18,6 +19,7 @@ export class IotasClient {
|
|
|
18
19
|
delay;
|
|
19
20
|
unitRequest = null;
|
|
20
21
|
featureIndex = null;
|
|
22
|
+
deviceIndex = null;
|
|
21
23
|
unit = 0;
|
|
22
24
|
constructor(options) {
|
|
23
25
|
this.log = options.log;
|
|
@@ -97,27 +99,53 @@ export class IotasClient {
|
|
|
97
99
|
}
|
|
98
100
|
buildFeatureIndex(rooms) {
|
|
99
101
|
this.featureIndex = new Map();
|
|
102
|
+
this.deviceIndex = new Map();
|
|
100
103
|
for (const room of rooms) {
|
|
101
104
|
for (const device of room.devices) {
|
|
102
105
|
for (const feature of device.features) {
|
|
103
106
|
this.featureIndex.set(feature.id.toString(), feature);
|
|
107
|
+
this.deviceIndex.set(feature.id.toString(), device);
|
|
104
108
|
}
|
|
105
109
|
}
|
|
106
110
|
}
|
|
107
111
|
}
|
|
108
|
-
|
|
109
|
-
|
|
112
|
+
updateFeature(featureId, value) {
|
|
113
|
+
if (!this.deviceIndex) {
|
|
114
|
+
this.log.error('Device index not built. Call getRooms() first.');
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const device = this.deviceIndex.get(featureId);
|
|
118
|
+
if (device && needsReliableUpdate(device)) {
|
|
119
|
+
this.updateFeatureReliable(featureId, value);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
this.transport
|
|
123
|
+
.request(`/feature/${encodeURIComponent(featureId)}/value`, {
|
|
110
124
|
method: 'PUT',
|
|
111
125
|
body: JSON.stringify({ value }),
|
|
126
|
+
})
|
|
127
|
+
.catch((err) => {
|
|
128
|
+
this.log.warn(`Failed to update feature ${featureId}:`, err instanceof Error ? err.message : String(err));
|
|
112
129
|
});
|
|
113
130
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
131
|
+
updateFeatureReliable(featureId, value) {
|
|
132
|
+
const sendUpdates = async () => {
|
|
133
|
+
for (let attempt = 0; attempt < this.reliableUpdateAttempts; attempt++) {
|
|
134
|
+
try {
|
|
135
|
+
await this.transport.request(`/feature/${encodeURIComponent(featureId)}/value`, {
|
|
136
|
+
method: 'PUT',
|
|
137
|
+
body: JSON.stringify({ value }),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
this.log.warn(`Failed to update feature ${featureId} (attempt ${attempt + 1}):`, err instanceof Error ? err.message : String(err));
|
|
142
|
+
}
|
|
143
|
+
if (attempt < this.reliableUpdateAttempts - 1) {
|
|
144
|
+
await this.delay(this.reliableUpdateDelayMs);
|
|
145
|
+
}
|
|
119
146
|
}
|
|
120
|
-
}
|
|
147
|
+
};
|
|
148
|
+
sendUpdates();
|
|
121
149
|
}
|
|
122
150
|
}
|
|
123
151
|
//# sourceMappingURL=iotasClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iotasClient.js","sourceRoot":"","sources":["../../../src/api/iotasClient.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"iotasClient.js","sourceRoot":"","sources":["../../../src/api/iotasClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { IotasSession } from './session.js';
|
|
2
|
-
|
|
2
|
+
interface IotasTransportOptions {
|
|
3
3
|
session: IotasSession;
|
|
4
4
|
baseUrl?: string;
|
|
5
5
|
maxRequestAuthRetries?: number;
|
|
@@ -19,3 +19,4 @@ export declare class IotasTransport {
|
|
|
19
19
|
constructor(options: IotasTransportOptions);
|
|
20
20
|
request<T>(path: string, options?: RequestInit, authRetryCount?: number): Promise<T>;
|
|
21
21
|
}
|
|
22
|
+
export {};
|
|
@@ -2,7 +2,6 @@ import type { IotasLogger } from '../logger.js';
|
|
|
2
2
|
import type { IotasClient } from '../api/iotasClient.js';
|
|
3
3
|
import type { FeatureCacheOptions, Rooms } from '../types.js';
|
|
4
4
|
export type FeatureChangeCallback = (changed: Map<string, number>) => void;
|
|
5
|
-
/** Optional transform applied to every rooms snapshot (discovery and polling). */
|
|
6
5
|
export type SnapshotFilter = (rooms: Rooms) => Rooms;
|
|
7
6
|
/**
|
|
8
7
|
* FeatureCache provides cached feature values with background polling.
|
|
@@ -30,6 +29,11 @@ export declare class FeatureCache {
|
|
|
30
29
|
seed(rooms: Rooms): void;
|
|
31
30
|
get(featureId: string): number | undefined;
|
|
32
31
|
set(featureId: string, value: number): void;
|
|
32
|
+
/**
|
|
33
|
+
* Write-through: sets cache value with write barrier AND sends the update
|
|
34
|
+
* to the IOTAS API in one call.
|
|
35
|
+
*/
|
|
36
|
+
writeThrough(featureId: string, value: number): void;
|
|
33
37
|
/**
|
|
34
38
|
* Subscribe to feature changes. Callback is invoked when any of the
|
|
35
39
|
* specified features are updated by the poller.
|
|
@@ -52,6 +52,14 @@ export class FeatureCache {
|
|
|
52
52
|
this.values.set(featureId, value);
|
|
53
53
|
this.writeTimestamps.set(featureId, Date.now());
|
|
54
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Write-through: sets cache value with write barrier AND sends the update
|
|
57
|
+
* to the IOTAS API in one call.
|
|
58
|
+
*/
|
|
59
|
+
writeThrough(featureId, value) {
|
|
60
|
+
this.set(featureId, value);
|
|
61
|
+
this.client.updateFeature(featureId, value);
|
|
62
|
+
}
|
|
55
63
|
/**
|
|
56
64
|
* Subscribe to feature changes. Callback is invoked when any of the
|
|
57
65
|
* specified features are updated by the poller.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureCache.js","sourceRoot":"","sources":["../../../src/cache/featureCache.ts"],"names":[],"mappings":"AAKA,MAAM,wBAAwB,GAAG,MAAM,CAAC;AACxC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AACvC,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAC3C,MAAM,2BAA2B,GAAG,OAAO,CAAC,CAAC,gBAAgB;
|
|
1
|
+
{"version":3,"file":"featureCache.js","sourceRoot":"","sources":["../../../src/cache/featureCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export declare const EventTypeName: {
|
|
2
|
+
readonly OnOff: "OnOff";
|
|
3
|
+
readonly Level: "Level";
|
|
4
|
+
readonly Temperature: "Temperature";
|
|
5
|
+
readonly ThermostatMode: "ThermostatMode";
|
|
6
|
+
readonly Lock: "Lock";
|
|
7
|
+
};
|
|
8
|
+
export type EventTypeName = (typeof EventTypeName)[keyof typeof EventTypeName];
|
|
9
|
+
export declare const FeatureCategory: {
|
|
10
|
+
readonly Light: "light";
|
|
11
|
+
readonly Lock: "lock";
|
|
12
|
+
readonly CurrentTemperature: "current_temperature";
|
|
13
|
+
readonly HeatSetPoint: "heat_set_point";
|
|
14
|
+
readonly CoolSetPoint: "cool_set_point";
|
|
15
|
+
readonly ThermostatMode: "thermostat_mode";
|
|
16
|
+
readonly Battery: "battery";
|
|
17
|
+
readonly Humidity: "humidity";
|
|
18
|
+
readonly Motion: "motion";
|
|
19
|
+
readonly DoorState: "door_state";
|
|
20
|
+
};
|
|
21
|
+
export type FeatureCategory = (typeof FeatureCategory)[keyof typeof FeatureCategory];
|
|
22
|
+
export declare const FeatureTypeName: {
|
|
23
|
+
readonly Light: "Light";
|
|
24
|
+
readonly OperationMode: "Operation Mode";
|
|
25
|
+
readonly Battery: "Battery";
|
|
26
|
+
};
|
|
27
|
+
export type FeatureTypeName = (typeof FeatureTypeName)[keyof typeof FeatureTypeName];
|
|
28
|
+
export declare const DeviceCategory: {
|
|
29
|
+
readonly Dimmer: "dimmer";
|
|
30
|
+
readonly Switch: "switch";
|
|
31
|
+
readonly MotionSwitch: "motion_switch";
|
|
32
|
+
readonly Lock: "lock";
|
|
33
|
+
readonly Thermostat: "thermostat";
|
|
34
|
+
readonly Door: "door";
|
|
35
|
+
};
|
|
36
|
+
export type DeviceCategory = (typeof DeviceCategory)[keyof typeof DeviceCategory];
|
|
37
|
+
export declare function isDeviceCategory(value: string): value is DeviceCategory;
|
|
38
|
+
export declare const READ_ONLY_CATEGORIES: ReadonlySet<string>;
|
|
39
|
+
export declare const DISCOVERY_EVENT_TYPES: ReadonlySet<string>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export const EventTypeName = {
|
|
2
|
+
OnOff: 'OnOff',
|
|
3
|
+
Level: 'Level',
|
|
4
|
+
Temperature: 'Temperature',
|
|
5
|
+
ThermostatMode: 'ThermostatMode',
|
|
6
|
+
Lock: 'Lock',
|
|
7
|
+
};
|
|
8
|
+
export const FeatureCategory = {
|
|
9
|
+
Light: 'light',
|
|
10
|
+
Lock: 'lock',
|
|
11
|
+
CurrentTemperature: 'current_temperature',
|
|
12
|
+
HeatSetPoint: 'heat_set_point',
|
|
13
|
+
CoolSetPoint: 'cool_set_point',
|
|
14
|
+
ThermostatMode: 'thermostat_mode',
|
|
15
|
+
Battery: 'battery',
|
|
16
|
+
Humidity: 'humidity',
|
|
17
|
+
Motion: 'motion',
|
|
18
|
+
DoorState: 'door_state',
|
|
19
|
+
};
|
|
20
|
+
export const FeatureTypeName = {
|
|
21
|
+
Light: 'Light',
|
|
22
|
+
OperationMode: 'Operation Mode',
|
|
23
|
+
Battery: 'Battery',
|
|
24
|
+
};
|
|
25
|
+
export const DeviceCategory = {
|
|
26
|
+
Dimmer: 'dimmer',
|
|
27
|
+
Switch: 'switch',
|
|
28
|
+
MotionSwitch: 'motion_switch',
|
|
29
|
+
Lock: 'lock',
|
|
30
|
+
Thermostat: 'thermostat',
|
|
31
|
+
Door: 'door',
|
|
32
|
+
};
|
|
33
|
+
const deviceCategoryValues = new Set(Object.values(DeviceCategory));
|
|
34
|
+
export function isDeviceCategory(value) {
|
|
35
|
+
return deviceCategoryValues.has(value);
|
|
36
|
+
}
|
|
37
|
+
export const READ_ONLY_CATEGORIES = new Set([
|
|
38
|
+
FeatureCategory.CurrentTemperature,
|
|
39
|
+
FeatureCategory.Battery,
|
|
40
|
+
FeatureCategory.Humidity,
|
|
41
|
+
FeatureCategory.Motion,
|
|
42
|
+
FeatureCategory.DoorState,
|
|
43
|
+
]);
|
|
44
|
+
export const DISCOVERY_EVENT_TYPES = new Set([
|
|
45
|
+
EventTypeName.Temperature,
|
|
46
|
+
EventTypeName.OnOff,
|
|
47
|
+
EventTypeName.Level,
|
|
48
|
+
EventTypeName.ThermostatMode,
|
|
49
|
+
EventTypeName.Lock,
|
|
50
|
+
]);
|
|
51
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,aAAa;IAC1B,cAAc,EAAE,gBAAgB;IAChC,IAAI,EAAE,MAAM;CACJ,CAAC;AAGX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,kBAAkB,EAAE,qBAAqB;IACzC,YAAY,EAAE,gBAAgB;IAC9B,YAAY,EAAE,gBAAgB;IAC9B,cAAc,EAAE,iBAAiB;IACjC,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,YAAY;CACf,CAAC;AAGX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE,OAAO;IACd,aAAa,EAAE,gBAAgB;IAC/B,OAAO,EAAE,SAAS;CACV,CAAC;AAGX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,YAAY,EAAE,eAAe;IAC7B,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,YAAY;IACxB,IAAI,EAAE,MAAM;CACJ,CAAC;AAGX,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;AAE5E,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC;IAC/D,eAAe,CAAC,kBAAkB;IAClC,eAAe,CAAC,OAAO;IACvB,eAAe,CAAC,QAAQ;IACxB,eAAe,CAAC,MAAM;IACtB,eAAe,CAAC,SAAS;CAC1B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAwB,IAAI,GAAG,CAAC;IAChE,aAAa,CAAC,WAAW;IACzB,aAAa,CAAC,KAAK;IACnB,aAAa,CAAC,KAAK;IACnB,aAAa,CAAC,cAAc;IAC5B,aAAa,CAAC,IAAI;CACnB,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Device, Feature } from './types.js';
|
|
2
|
+
import type { EventTypeName, FeatureCategory } from './constants.js';
|
|
3
|
+
/**
|
|
4
|
+
* Get serial number with IOTAS-{id} fallback for short/missing values.
|
|
5
|
+
* HomeKit requires >1 character; this ensures compliance.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getSerialNumber(device: Device): string;
|
|
8
|
+
/**
|
|
9
|
+
* Get manufacturer from physicalDeviceDescription, falls back to 'IOTAS'.
|
|
10
|
+
* Handles empty strings as missing values.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getManufacturer(device: Device): string;
|
|
13
|
+
/**
|
|
14
|
+
* Get model from physicalDeviceDescription, falls back to device.category.
|
|
15
|
+
* Handles empty strings as missing values.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getModel(device: Device): string;
|
|
18
|
+
export declare function findFeatureByCategory(device: Device, category: FeatureCategory): Feature | undefined;
|
|
19
|
+
export declare function findFeatureByEventType(device: Device, eventType: EventTypeName): Feature | undefined;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get serial number with IOTAS-{id} fallback for short/missing values.
|
|
3
|
+
* HomeKit requires >1 character; this ensures compliance.
|
|
4
|
+
*/
|
|
5
|
+
export function getSerialNumber(device) {
|
|
6
|
+
const raw = device.serialNumber;
|
|
7
|
+
if (raw && raw.length > 1) {
|
|
8
|
+
return raw;
|
|
9
|
+
}
|
|
10
|
+
return `IOTAS-${device.id}`;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Get manufacturer from physicalDeviceDescription, falls back to 'IOTAS'.
|
|
14
|
+
* Handles empty strings as missing values.
|
|
15
|
+
*/
|
|
16
|
+
export function getManufacturer(device) {
|
|
17
|
+
return device.physicalDeviceDescription?.manufacturer || 'IOTAS';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get model from physicalDeviceDescription, falls back to device.category.
|
|
21
|
+
* Handles empty strings as missing values.
|
|
22
|
+
*/
|
|
23
|
+
export function getModel(device) {
|
|
24
|
+
return device.physicalDeviceDescription?.model || device.category;
|
|
25
|
+
}
|
|
26
|
+
export function findFeatureByCategory(device, category) {
|
|
27
|
+
return device.features.find((f) => f.featureTypeCategory === category);
|
|
28
|
+
}
|
|
29
|
+
export function findFeatureByEventType(device, eventType) {
|
|
30
|
+
return device.features.find((f) => f.eventTypeName === eventType);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=device.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/device.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC;IAChC,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,SAAS,MAAM,CAAC,EAAE,EAAE,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,MAAM,CAAC,yBAAyB,EAAE,YAAY,IAAI,OAAO,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,OAAO,MAAM,CAAC,yBAAyB,EAAE,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,QAAyB;IAC7E,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,KAAK,QAAQ,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,SAAwB;IAC7E,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC;AACpE,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -5,3 +5,7 @@ export type { FeatureChangeCallback, SnapshotFilter } from './cache/featureCache
|
|
|
5
5
|
export type { Room, Rooms, Device, Feature, Residency, AuthResponse, AccountResponse, PhysicalDeviceDescription, IotasClientOptions, IotasTokens, FeatureCacheOptions, } from './types.js';
|
|
6
6
|
export { Temperature, filterDevices } from './utils.js';
|
|
7
7
|
export type { DeviceFilterOptions } from './utils.js';
|
|
8
|
+
export { EventTypeName, FeatureCategory, FeatureTypeName, DeviceCategory, isDeviceCategory, READ_ONLY_CATEGORIES, DISCOVERY_EVENT_TYPES, } from './constants.js';
|
|
9
|
+
export { getSerialNumber, getManufacturer, getModel, findFeatureByCategory, findFeatureByEventType } from './device.js';
|
|
10
|
+
export { isReadOnlyCategory, isSupportedFeature, isDiscoverableFeature, isSupportedDevice } from './predicates.js';
|
|
11
|
+
export { ThermostatMode, parseThermostatModeString, parseThermostatModes, getThermostatModeAt, findThermostatModeIndex, } from './thermostat.js';
|
package/dist/src/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
// API Client
|
|
2
1
|
export { IotasClient } from './api/iotasClient.js';
|
|
3
|
-
// Caching
|
|
4
2
|
export { FeatureCache } from './cache/featureCache.js';
|
|
5
|
-
// Utilities
|
|
6
3
|
export { Temperature, filterDevices } from './utils.js';
|
|
4
|
+
export { EventTypeName, FeatureCategory, FeatureTypeName, DeviceCategory, isDeviceCategory, READ_ONLY_CATEGORIES, DISCOVERY_EVENT_TYPES, } from './constants.js';
|
|
5
|
+
export { getSerialNumber, getManufacturer, getModel, findFeatureByCategory, findFeatureByEventType } from './device.js';
|
|
6
|
+
export { isReadOnlyCategory, isSupportedFeature, isDiscoverableFeature, isSupportedDevice } from './predicates.js';
|
|
7
|
+
export { ThermostatMode, parseThermostatModeString, parseThermostatModes, getThermostatModeAt, findThermostatModeIndex, } from './thermostat.js';
|
|
7
8
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAiBvD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGxD,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAExH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEnH,OAAO,EACL,cAAc,EACd,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Device, Feature } from './types.js';
|
|
2
|
+
export declare function isReadOnlyCategory(category: string): boolean;
|
|
3
|
+
export declare function isSupportedFeature(feature: Feature): boolean;
|
|
4
|
+
export declare function isDiscoverableFeature(feature: Feature): boolean;
|
|
5
|
+
export declare function isSupportedDevice(device: Device): boolean;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { FeatureCategory, READ_ONLY_CATEGORIES, DISCOVERY_EVENT_TYPES } from './constants.js';
|
|
2
|
+
export function isReadOnlyCategory(category) {
|
|
3
|
+
return READ_ONLY_CATEGORIES.has(category);
|
|
4
|
+
}
|
|
5
|
+
export function isSupportedFeature(feature) {
|
|
6
|
+
return Boolean(feature.featureTypeSettable) || isReadOnlyCategory(feature.featureTypeCategory);
|
|
7
|
+
}
|
|
8
|
+
export function isDiscoverableFeature(feature) {
|
|
9
|
+
return ((DISCOVERY_EVENT_TYPES.has(feature.eventTypeName ?? '') &&
|
|
10
|
+
(Boolean(feature.featureTypeSettable) || feature.featureTypeCategory === FeatureCategory.CurrentTemperature)) ||
|
|
11
|
+
isReadOnlyCategory(feature.featureTypeCategory));
|
|
12
|
+
}
|
|
13
|
+
export function isSupportedDevice(device) {
|
|
14
|
+
if (!device.paired) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
return device.features.some(isDiscoverableFeature);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=predicates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"predicates.js","sourceRoot":"","sources":["../../src/predicates.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE9F,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,kBAAkB,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO,CACL,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;QACrD,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,mBAAmB,KAAK,eAAe,CAAC,kBAAkB,CAAC,CAAC;QAC/G,kBAAkB,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAChD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DeviceCategory } from './constants.js';
|
|
2
|
+
const ZWAVE_MANUFACTURERS = {
|
|
3
|
+
JASCO: '0x0063',
|
|
4
|
+
};
|
|
5
|
+
export function needsReliableUpdate(device) {
|
|
6
|
+
return (device.category === DeviceCategory.Dimmer &&
|
|
7
|
+
device.physicalDeviceDescription?.manufacturer === ZWAVE_MANUFACTURERS.JASCO);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=quirks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quirks.js","sourceRoot":"","sources":["../../src/quirks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,MAAM,mBAAmB,GAAG;IAC1B,KAAK,EAAE,QAAQ;CACP,CAAC;AAEX,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,OAAO,CACL,MAAM,CAAC,QAAQ,KAAK,cAAc,CAAC,MAAM;QACzC,MAAM,CAAC,yBAAyB,EAAE,YAAY,KAAK,mBAAmB,CAAC,KAAK,CAC7E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thermostat mode utilities for IOTAS thermostats.
|
|
3
|
+
*
|
|
4
|
+
* IOTAS stores thermostat modes as indices into a colon-delimited string
|
|
5
|
+
* (e.g., "Off:Heat:Cool:Auto"). This module provides a canonical enum
|
|
6
|
+
* and helpers to parse and look up modes.
|
|
7
|
+
*/
|
|
8
|
+
export declare enum ThermostatMode {
|
|
9
|
+
Off = 0,
|
|
10
|
+
Heat = 1,
|
|
11
|
+
Cool = 2,
|
|
12
|
+
EmergencyHeat = 3,
|
|
13
|
+
Auto = 4,
|
|
14
|
+
Unknown = -1
|
|
15
|
+
}
|
|
16
|
+
export declare function parseThermostatModeString(modeStr: string): ThermostatMode;
|
|
17
|
+
export declare function parseThermostatModes(valuesString?: string): ThermostatMode[];
|
|
18
|
+
export declare function getThermostatModeAt(modes: ThermostatMode[], index: number): ThermostatMode;
|
|
19
|
+
export declare function findThermostatModeIndex(modes: ThermostatMode[], mode: ThermostatMode): number;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thermostat mode utilities for IOTAS thermostats.
|
|
3
|
+
*
|
|
4
|
+
* IOTAS stores thermostat modes as indices into a colon-delimited string
|
|
5
|
+
* (e.g., "Off:Heat:Cool:Auto"). This module provides a canonical enum
|
|
6
|
+
* and helpers to parse and look up modes.
|
|
7
|
+
*/
|
|
8
|
+
export var ThermostatMode;
|
|
9
|
+
(function (ThermostatMode) {
|
|
10
|
+
ThermostatMode[ThermostatMode["Off"] = 0] = "Off";
|
|
11
|
+
ThermostatMode[ThermostatMode["Heat"] = 1] = "Heat";
|
|
12
|
+
ThermostatMode[ThermostatMode["Cool"] = 2] = "Cool";
|
|
13
|
+
ThermostatMode[ThermostatMode["EmergencyHeat"] = 3] = "EmergencyHeat";
|
|
14
|
+
ThermostatMode[ThermostatMode["Auto"] = 4] = "Auto";
|
|
15
|
+
ThermostatMode[ThermostatMode["Unknown"] = -1] = "Unknown";
|
|
16
|
+
})(ThermostatMode || (ThermostatMode = {}));
|
|
17
|
+
export function parseThermostatModeString(modeStr) {
|
|
18
|
+
const lower = modeStr.toLowerCase().trim();
|
|
19
|
+
if (lower.includes('emergency') || lower === 'eheat') {
|
|
20
|
+
return ThermostatMode.EmergencyHeat;
|
|
21
|
+
}
|
|
22
|
+
if (lower.includes('heat')) {
|
|
23
|
+
return ThermostatMode.Heat;
|
|
24
|
+
}
|
|
25
|
+
if (lower.includes('cool')) {
|
|
26
|
+
return ThermostatMode.Cool;
|
|
27
|
+
}
|
|
28
|
+
if (lower.includes('auto')) {
|
|
29
|
+
return ThermostatMode.Auto;
|
|
30
|
+
}
|
|
31
|
+
if (lower.includes('off')) {
|
|
32
|
+
return ThermostatMode.Off;
|
|
33
|
+
}
|
|
34
|
+
return ThermostatMode.Unknown;
|
|
35
|
+
}
|
|
36
|
+
export function parseThermostatModes(valuesString) {
|
|
37
|
+
if (!valuesString) {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
return valuesString.split(':').map(parseThermostatModeString);
|
|
41
|
+
}
|
|
42
|
+
export function getThermostatModeAt(modes, index) {
|
|
43
|
+
if (index < 0 || index >= modes.length) {
|
|
44
|
+
return ThermostatMode.Off;
|
|
45
|
+
}
|
|
46
|
+
return modes[index];
|
|
47
|
+
}
|
|
48
|
+
export function findThermostatModeIndex(modes, mode) {
|
|
49
|
+
return modes.indexOf(mode);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=thermostat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thermostat.js","sourceRoot":"","sources":["../../src/thermostat.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAN,IAAY,cAOX;AAPD,WAAY,cAAc;IACxB,iDAAO,CAAA;IACP,mDAAQ,CAAA;IACR,mDAAQ,CAAA;IACR,qEAAiB,CAAA;IACjB,mDAAQ,CAAA;IACR,0DAAY,CAAA;AACd,CAAC,EAPW,cAAc,KAAd,cAAc,QAOzB;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAe;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACrD,OAAO,cAAc,CAAC,aAAa,CAAC;IACtC,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,cAAc,CAAC,IAAI,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,cAAc,CAAC,IAAI,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,cAAc,CAAC,IAAI,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,cAAc,CAAC,GAAG,CAAC;IAC5B,CAAC;IACD,OAAO,cAAc,CAAC,OAAO,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,YAAqB;IACxD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAuB,EAAE,KAAa;IACxE,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACvC,OAAO,cAAc,CAAC,GAAG,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAuB,EAAE,IAAoB;IACnF,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
|