trane-thermostat-api 1.0.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.
Files changed (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -0
  3. package/dist/client/auth.d.ts +50 -0
  4. package/dist/client/auth.d.ts.map +1 -0
  5. package/dist/client/auth.js +236 -0
  6. package/dist/client/auth.js.map +1 -0
  7. package/dist/client/nexia-client.d.ts +48 -0
  8. package/dist/client/nexia-client.d.ts.map +1 -0
  9. package/dist/client/nexia-client.js +311 -0
  10. package/dist/client/nexia-client.js.map +1 -0
  11. package/dist/devices/nexia-automation.d.ts +15 -0
  12. package/dist/devices/nexia-automation.d.ts.map +1 -0
  13. package/dist/devices/nexia-automation.js +39 -0
  14. package/dist/devices/nexia-automation.js.map +1 -0
  15. package/dist/devices/nexia-sensor.d.ts +34 -0
  16. package/dist/devices/nexia-sensor.d.ts.map +1 -0
  17. package/dist/devices/nexia-sensor.js +152 -0
  18. package/dist/devices/nexia-sensor.js.map +1 -0
  19. package/dist/devices/nexia-thermostat.d.ts +73 -0
  20. package/dist/devices/nexia-thermostat.d.ts.map +1 -0
  21. package/dist/devices/nexia-thermostat.js +357 -0
  22. package/dist/devices/nexia-thermostat.js.map +1 -0
  23. package/dist/devices/nexia-zone.d.ts +61 -0
  24. package/dist/devices/nexia-zone.d.ts.map +1 -0
  25. package/dist/devices/nexia-zone.js +370 -0
  26. package/dist/devices/nexia-zone.js.map +1 -0
  27. package/dist/index.d.ts +15 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +41 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/types/api.d.ts +277 -0
  32. package/dist/types/api.d.ts.map +1 -0
  33. package/dist/types/api.js +3 -0
  34. package/dist/types/api.js.map +1 -0
  35. package/dist/types/constants.d.ts +137 -0
  36. package/dist/types/constants.d.ts.map +1 -0
  37. package/dist/types/constants.js +160 -0
  38. package/dist/types/constants.js.map +1 -0
  39. package/dist/types/interfaces.d.ts +211 -0
  40. package/dist/types/interfaces.d.ts.map +1 -0
  41. package/dist/types/interfaces.js +3 -0
  42. package/dist/types/interfaces.js.map +1 -0
  43. package/dist/utils/errors.d.ts +94 -0
  44. package/dist/utils/errors.d.ts.map +1 -0
  45. package/dist/utils/errors.js +231 -0
  46. package/dist/utils/errors.js.map +1 -0
  47. package/dist/utils/http-utils.d.ts +59 -0
  48. package/dist/utils/http-utils.d.ts.map +1 -0
  49. package/dist/utils/http-utils.js +273 -0
  50. package/dist/utils/http-utils.js.map +1 -0
  51. package/dist/utils/json-utils.d.ts +32 -0
  52. package/dist/utils/json-utils.d.ts.map +1 -0
  53. package/dist/utils/json-utils.js +389 -0
  54. package/dist/utils/json-utils.js.map +1 -0
  55. package/dist/utils/validation.d.ts +52 -0
  56. package/dist/utils/validation.d.ts.map +1 -0
  57. package/dist/utils/validation.js +272 -0
  58. package/dist/utils/validation.js.map +1 -0
  59. package/package.json +69 -0
@@ -0,0 +1,272 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NexiaValidator = exports.GeneralValidator = exports.FanSpeedValidator = exports.HumidityValidator = exports.TemperatureValidator = void 0;
4
+ const constants_1 = require("../types/constants");
5
+ const errors_1 = require("./errors");
6
+ class TemperatureValidator {
7
+ static validateSetpoints(heatTemp, coolTemp, deadband, unit) {
8
+ this.validateTemperature(heatTemp, unit);
9
+ this.validateTemperature(coolTemp, unit);
10
+ if (coolTemp - heatTemp < deadband) {
11
+ throw errors_1.ErrorFactory.createDeadbandError(heatTemp, coolTemp, deadband, unit);
12
+ }
13
+ }
14
+ static validateTemperature(temperature, unit) {
15
+ if (!Number.isFinite(temperature)) {
16
+ throw new errors_1.TemperatureValidationError('Temperature must be a finite number', 'temperature', temperature, unit);
17
+ }
18
+ const limits = this.getTemperatureLimits(unit);
19
+ if (temperature < limits.min || temperature > limits.max) {
20
+ throw errors_1.ErrorFactory.createTemperatureError(temperature, unit, limits.min, limits.max);
21
+ }
22
+ }
23
+ static roundTemperature(temperature, unit) {
24
+ if (!Number.isFinite(temperature)) {
25
+ throw new errors_1.ValidationError('Temperature must be a finite number');
26
+ }
27
+ return unit === constants_1.TemperatureUnit.CELSIUS
28
+ ? Math.round(temperature * 2) / 2
29
+ : Math.round(temperature);
30
+ }
31
+ static convertTemperature(temperature, fromUnit, toUnit) {
32
+ if (fromUnit === toUnit) {
33
+ return temperature;
34
+ }
35
+ if (fromUnit === constants_1.TemperatureUnit.CELSIUS && toUnit === constants_1.TemperatureUnit.FAHRENHEIT) {
36
+ return (temperature * 9) / 5 + 32;
37
+ }
38
+ if (fromUnit === constants_1.TemperatureUnit.FAHRENHEIT && toUnit === constants_1.TemperatureUnit.CELSIUS) {
39
+ return ((temperature - 32) * 5) / 9;
40
+ }
41
+ throw new errors_1.ValidationError(`Unsupported temperature unit conversion: ${fromUnit} to ${toUnit}`);
42
+ }
43
+ static getTemperatureLimits(unit) {
44
+ switch (unit) {
45
+ case constants_1.TemperatureUnit.CELSIUS:
46
+ return {
47
+ min: constants_1.TEMPERATURE_LIMITS.CELSIUS_MIN,
48
+ max: constants_1.TEMPERATURE_LIMITS.CELSIUS_MAX
49
+ };
50
+ case constants_1.TemperatureUnit.FAHRENHEIT:
51
+ return {
52
+ min: constants_1.TEMPERATURE_LIMITS.FAHRENHEIT_MIN,
53
+ max: constants_1.TEMPERATURE_LIMITS.FAHRENHEIT_MAX
54
+ };
55
+ default:
56
+ throw new errors_1.ValidationError(`Unsupported temperature unit: ${unit}`);
57
+ }
58
+ }
59
+ static validateTemperatureRange(heatMin, heatMax, coolMin, coolMax, deadband, unit) {
60
+ this.validateTemperature(heatMin, unit);
61
+ this.validateTemperature(heatMax, unit);
62
+ this.validateTemperature(coolMin, unit);
63
+ this.validateTemperature(coolMax, unit);
64
+ if (heatMin >= heatMax) {
65
+ throw new errors_1.ValidationError('Heat minimum must be less than heat maximum');
66
+ }
67
+ if (coolMin >= coolMax) {
68
+ throw new errors_1.ValidationError('Cool minimum must be less than cool maximum');
69
+ }
70
+ if (coolMin - heatMax < deadband) {
71
+ throw new errors_1.ValidationError(`Temperature ranges are incompatible with deadband requirement of ${deadband}°${unit}`);
72
+ }
73
+ }
74
+ }
75
+ exports.TemperatureValidator = TemperatureValidator;
76
+ class HumidityValidator {
77
+ static validateHumidity(humidity) {
78
+ if (!Number.isFinite(humidity)) {
79
+ throw new errors_1.ValidationError('Humidity must be a finite number', 'humidity', humidity);
80
+ }
81
+ if (humidity < constants_1.HUMIDITY_LIMITS.MIN || humidity > constants_1.HUMIDITY_LIMITS.MAX) {
82
+ throw new errors_1.ValidationError(`Humidity must be between ${constants_1.HUMIDITY_LIMITS.MIN * 100}% and ${constants_1.HUMIDITY_LIMITS.MAX * 100}%`, 'humidity', humidity);
83
+ }
84
+ }
85
+ static roundHumidity(humidity) {
86
+ this.validateHumidity(humidity);
87
+ let nearestValue = constants_1.HUMIDITY_SETPOINT_VALUES[0];
88
+ let minDiff = Math.abs(humidity - nearestValue);
89
+ for (const value of constants_1.HUMIDITY_SETPOINT_VALUES) {
90
+ const diff = Math.abs(humidity - value);
91
+ if (diff < minDiff) {
92
+ minDiff = diff;
93
+ nearestValue = value;
94
+ }
95
+ }
96
+ return nearestValue;
97
+ }
98
+ static validateHumiditySetpoint(setpoint) {
99
+ this.validateHumidity(setpoint);
100
+ if (!constants_1.HUMIDITY_SETPOINT_VALUES.includes(setpoint)) {
101
+ throw new errors_1.ValidationError(`Invalid humidity setpoint. Must be one of: ${constants_1.HUMIDITY_SETPOINT_VALUES.map(v => v * 100 + '%').join(', ')}`, 'humiditySetpoint', setpoint);
102
+ }
103
+ }
104
+ static getAvailableSetpoints() {
105
+ return constants_1.HUMIDITY_SETPOINT_VALUES.map(value => value * 100);
106
+ }
107
+ }
108
+ exports.HumidityValidator = HumidityValidator;
109
+ class FanSpeedValidator {
110
+ static validateFanSpeed(speed) {
111
+ if (!Number.isFinite(speed)) {
112
+ throw new errors_1.ValidationError('Fan speed must be a finite number', 'fanSpeed', speed);
113
+ }
114
+ if (speed < constants_1.FAN_SPEED_LIMITS.MIN || speed > constants_1.FAN_SPEED_LIMITS.MAX) {
115
+ throw new errors_1.ValidationError(`Fan speed must be between ${constants_1.FAN_SPEED_LIMITS.MIN} and ${constants_1.FAN_SPEED_LIMITS.MAX}`, 'fanSpeed', speed);
116
+ }
117
+ }
118
+ static roundFanSpeed(speed) {
119
+ this.validateFanSpeed(speed);
120
+ return Math.round(speed * 10) / 10;
121
+ }
122
+ static validateFanSpeedLimits(min, max) {
123
+ this.validateFanSpeed(min);
124
+ this.validateFanSpeed(max);
125
+ if (min >= max) {
126
+ throw new errors_1.ValidationError('Minimum fan speed must be less than maximum fan speed');
127
+ }
128
+ }
129
+ }
130
+ exports.FanSpeedValidator = FanSpeedValidator;
131
+ class GeneralValidator {
132
+ static validateRequiredString(value, fieldName) {
133
+ if (typeof value !== 'string') {
134
+ throw new errors_1.ValidationError(`${fieldName} must be a string`, fieldName, value);
135
+ }
136
+ if (value.trim().length === 0) {
137
+ throw new errors_1.ValidationError(`${fieldName} cannot be empty`, fieldName, value);
138
+ }
139
+ return value.trim();
140
+ }
141
+ static validateRequiredNumber(value, fieldName) {
142
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
143
+ throw new errors_1.ValidationError(`${fieldName} must be a finite number`, fieldName, value);
144
+ }
145
+ return value;
146
+ }
147
+ static validateNumberRange(value, min, max, fieldName) {
148
+ this.validateRequiredNumber(value, fieldName);
149
+ if (value < min || value > max) {
150
+ throw new errors_1.ValidationError(`${fieldName} must be between ${min} and ${max}`, fieldName, value);
151
+ }
152
+ return value;
153
+ }
154
+ static validateEnum(value, enumObject, fieldName) {
155
+ const validValues = Object.values(enumObject);
156
+ if (!validValues.includes(value)) {
157
+ throw new errors_1.ValidationError(`${fieldName} must be one of: ${validValues.join(', ')}`, fieldName, value);
158
+ }
159
+ return value;
160
+ }
161
+ static validateArray(value, validator, fieldName) {
162
+ if (!Array.isArray(value)) {
163
+ throw new errors_1.ValidationError(`${fieldName} must be an array`, fieldName, value);
164
+ }
165
+ return value.map((item, index) => {
166
+ try {
167
+ return validator(item);
168
+ }
169
+ catch (error) {
170
+ if (error instanceof errors_1.ValidationError) {
171
+ throw new errors_1.ValidationError(`${fieldName}[${index}]: ${error.message}`, `${fieldName}[${index}]`, item);
172
+ }
173
+ throw error;
174
+ }
175
+ });
176
+ }
177
+ static validateOptional(value, validator, defaultValue) {
178
+ if (value === undefined || value === null) {
179
+ return defaultValue;
180
+ }
181
+ return validator(value);
182
+ }
183
+ static validateBoolean(value, fieldName) {
184
+ if (typeof value !== 'boolean') {
185
+ throw new errors_1.ValidationError(`${fieldName} must be a boolean`, fieldName, value);
186
+ }
187
+ return value;
188
+ }
189
+ static validateDate(value, fieldName) {
190
+ let date;
191
+ if (value instanceof Date) {
192
+ date = value;
193
+ }
194
+ else if (typeof value === 'string' || typeof value === 'number') {
195
+ date = new Date(value);
196
+ }
197
+ else {
198
+ throw new errors_1.ValidationError(`${fieldName} must be a Date, string, or number`, fieldName, value);
199
+ }
200
+ if (isNaN(date.getTime())) {
201
+ throw new errors_1.ValidationError(`${fieldName} must be a valid date`, fieldName, value);
202
+ }
203
+ return date;
204
+ }
205
+ static validateRequiredProperties(obj, requiredProps, objectName) {
206
+ if (typeof obj !== 'object' || obj === null) {
207
+ throw new errors_1.ValidationError(`${objectName} must be an object`);
208
+ }
209
+ for (const prop of requiredProps) {
210
+ if (!(prop in obj) || obj[prop] === undefined) {
211
+ throw new errors_1.ValidationError(`${objectName} must have property '${String(prop)}'`);
212
+ }
213
+ }
214
+ }
215
+ }
216
+ exports.GeneralValidator = GeneralValidator;
217
+ class NexiaValidator {
218
+ static validateTemperatureConfig(config) {
219
+ const { heatTemp, coolTemp, deadband, unit, setTemp } = config;
220
+ if (setTemp !== undefined) {
221
+ TemperatureValidator.validateTemperature(setTemp, unit);
222
+ }
223
+ else if (heatTemp !== undefined && coolTemp !== undefined) {
224
+ TemperatureValidator.validateSetpoints(heatTemp, coolTemp, deadband, unit);
225
+ }
226
+ else if (heatTemp !== undefined || coolTemp !== undefined) {
227
+ if (heatTemp !== undefined) {
228
+ TemperatureValidator.validateTemperature(heatTemp, unit);
229
+ }
230
+ if (coolTemp !== undefined) {
231
+ TemperatureValidator.validateTemperature(coolTemp, unit);
232
+ }
233
+ }
234
+ else {
235
+ throw new errors_1.ValidationError('At least one temperature setpoint must be provided');
236
+ }
237
+ }
238
+ static validateHumidityConfig(config) {
239
+ const { dehumidify, humidify } = config;
240
+ if (dehumidify !== undefined) {
241
+ HumidityValidator.validateHumiditySetpoint(dehumidify);
242
+ }
243
+ if (humidify !== undefined) {
244
+ HumidityValidator.validateHumiditySetpoint(humidify);
245
+ }
246
+ if (dehumidify === undefined && humidify === undefined) {
247
+ throw new errors_1.ValidationError('At least one humidity setpoint must be provided');
248
+ }
249
+ if (dehumidify !== undefined && humidify !== undefined && humidify >= dehumidify) {
250
+ throw new errors_1.ValidationError('Humidify setpoint must be less than dehumidify setpoint');
251
+ }
252
+ }
253
+ static validateSensorSelection(config) {
254
+ const { activeSensorIds, availableSensorIds } = config;
255
+ if (!Array.isArray(activeSensorIds)) {
256
+ throw new errors_1.ValidationError('activeSensorIds must be an array');
257
+ }
258
+ if (!Array.isArray(availableSensorIds)) {
259
+ throw new errors_1.ValidationError('availableSensorIds must be an array');
260
+ }
261
+ for (const sensorId of activeSensorIds) {
262
+ if (!availableSensorIds.includes(sensorId)) {
263
+ throw new errors_1.ValidationError(`Sensor ID ${sensorId} is not available. Available sensors: ${availableSensorIds.join(', ')}`);
264
+ }
265
+ }
266
+ if (activeSensorIds.length === 0) {
267
+ throw new errors_1.ValidationError('At least one sensor must be selected');
268
+ }
269
+ }
270
+ }
271
+ exports.NexiaValidator = NexiaValidator;
272
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "trane-thermostat-api",
3
+ "version": "1.0.0",
4
+ "description": "Node.js TypeScript library for controlling Trane/Nexia/American Standard thermostats",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "dev": "tsc --watch",
10
+ "test": "jest",
11
+ "test:watch": "jest --watch",
12
+ "test:coverage": "jest --coverage",
13
+ "lint": "eslint src --ext .ts",
14
+ "lint:fix": "eslint src --ext .ts --fix",
15
+ "prepublishOnly": "npm run build",
16
+ "type-check": "tsc --noEmit"
17
+ },
18
+ "keywords": [
19
+ "trane",
20
+ "nexia",
21
+ "american-standard",
22
+ "thermostat",
23
+ "typescript",
24
+ "hvac"
25
+ ],
26
+ "author": "Spencer S",
27
+ "license": "MIT",
28
+ "dependencies": {
29
+ "axios": "^1.13.4",
30
+ "uuid": "^13.0.0"
31
+ },
32
+ "devDependencies": {
33
+ "@eslint/js": "^9.39.2",
34
+ "@types/jest": "^29.5.14",
35
+ "@types/node": "^20.19.30",
36
+ "@types/uuid": "^11.0.0",
37
+ "eslint": "^9.39.2",
38
+ "globals": "^17.3.0",
39
+ "jest": "^29.7.0",
40
+ "jiti": "^2.6.1",
41
+ "ts-jest": "^29.4.6",
42
+ "typescript": "^5.9.3",
43
+ "typescript-eslint": "^8.54.0"
44
+ },
45
+ "peerDependencies": {
46
+ "homebridge": "^1.11.1"
47
+ },
48
+ "peerDependenciesMeta": {
49
+ "homebridge": {
50
+ "optional": true
51
+ }
52
+ },
53
+ "files": [
54
+ "dist/**/*",
55
+ "README.md",
56
+ "LICENSE"
57
+ ],
58
+ "engines": {
59
+ "node": ">=20.0.0"
60
+ },
61
+ "repository": {
62
+ "type": "git",
63
+ "url": "https://github.com/sbs44/trane-thermostat-api.git"
64
+ },
65
+ "bugs": {
66
+ "url": "https://github.com/sbs44/trane-thermostat-api/issues"
67
+ },
68
+ "homepage": "https://github.com/sbs44/trane-thermostat-api#readme"
69
+ }