@fastybird/smart-panel-backend 0.1.0-alpha.6 → 0.3.0-alpha.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/dist/migrations/1000000000000-InitialSetup.js +22 -12
- package/dist/migrations/1000000000000-InitialSetup.js.map +1 -1
- package/dist/modules/devices/services/devices-type-mapper.service.d.ts +1 -1
- package/dist/modules/devices/services/devices.service.d.ts +1 -0
- package/dist/modules/devices/services/devices.service.js +22 -23
- package/dist/modules/devices/services/devices.service.js.map +1 -1
- package/dist/modules/system/commands/update-panel.command.js +7 -12
- package/dist/modules/system/commands/update-panel.command.js.map +1 -1
- package/dist/modules/system/services/update.service.d.ts +2 -0
- package/dist/modules/system/services/update.service.js +37 -17
- package/dist/modules/system/services/update.service.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.d.ts +11 -1
- package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.js +226 -49
- package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/devices-shelly-ng.constants.d.ts +5 -0
- package/dist/plugins/devices-shelly-ng/devices-shelly-ng.constants.js +10 -1
- package/dist/plugins/devices-shelly-ng/devices-shelly-ng.constants.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/devices-shelly-ng.plugin.d.ts +5 -1
- package/dist/plugins/devices-shelly-ng/devices-shelly-ng.plugin.js +22 -3
- package/dist/plugins/devices-shelly-ng/devices-shelly-ng.plugin.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/dto/create-device.dto.d.ts +1 -1
- package/dist/plugins/devices-shelly-ng/dto/create-device.dto.js +11 -12
- package/dist/plugins/devices-shelly-ng/dto/create-device.dto.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/dto/update-device.dto.d.ts +2 -1
- package/dist/plugins/devices-shelly-ng/dto/update-device.dto.js +19 -4
- package/dist/plugins/devices-shelly-ng/dto/update-device.dto.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/entities/devices-shelly-ng.entity.d.ts +6 -1
- package/dist/plugins/devices-shelly-ng/entities/devices-shelly-ng.entity.js +38 -6
- package/dist/plugins/devices-shelly-ng/entities/devices-shelly-ng.entity.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/entities/shelly-ng-device-address.entity.d.ts +10 -0
- package/dist/plugins/devices-shelly-ng/entities/shelly-ng-device-address.entity.js +69 -0
- package/dist/plugins/devices-shelly-ng/entities/shelly-ng-device-address.entity.js.map +1 -0
- package/dist/plugins/devices-shelly-ng/services/database-discoverer.service.d.ts +3 -1
- package/dist/plugins/devices-shelly-ng/services/database-discoverer.service.js +19 -7
- package/dist/plugins/devices-shelly-ng/services/database-discoverer.service.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/services/device-address.service.d.ts +22 -0
- package/dist/plugins/devices-shelly-ng/services/device-address.service.js +149 -0
- package/dist/plugins/devices-shelly-ng/services/device-address.service.js.map +1 -0
- package/dist/plugins/devices-shelly-ng/services/device-manager.service.d.ts +3 -1
- package/dist/plugins/devices-shelly-ng/services/device-manager.service.js +20 -7
- package/dist/plugins/devices-shelly-ng/services/device-manager.service.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.js +18 -3
- package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.js.map +1 -1
- package/dist/plugins/devices-shelly-ng/subscribers/device-entity.subscriber.d.ts +6 -2
- package/dist/plugins/devices-shelly-ng/subscribers/device-entity.subscriber.js +75 -6
- package/dist/plugins/devices-shelly-ng/subscribers/device-entity.subscriber.js.map +1 -1
- package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.constants.d.ts +4 -0
- package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.constants.js +5 -1
- package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.constants.js.map +1 -1
- package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.openapi.d.ts +2 -2
- package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.openapi.js +2 -0
- package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.openapi.js.map +1 -1
- package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.plugin.js +11 -6
- package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.plugin.js.map +1 -1
- package/dist/plugins/devices-zigbee2mqtt/dto/update-config.dto.d.ts +10 -0
- package/dist/plugins/devices-zigbee2mqtt/dto/update-config.dto.js +117 -3
- package/dist/plugins/devices-zigbee2mqtt/dto/update-config.dto.js.map +1 -1
- package/dist/plugins/devices-zigbee2mqtt/interfaces/zigbee2mqtt.interface.d.ts +8 -0
- package/dist/plugins/devices-zigbee2mqtt/mappings/definitions/covers.yaml +5 -4
- package/dist/plugins/devices-zigbee2mqtt/models/config.model.d.ts +10 -0
- package/dist/plugins/devices-zigbee2mqtt/models/config.model.js +108 -3
- package/dist/plugins/devices-zigbee2mqtt/models/config.model.js.map +1 -1
- package/dist/plugins/devices-zigbee2mqtt/platforms/zigbee2mqtt.device.platform.d.ts +3 -4
- package/dist/plugins/devices-zigbee2mqtt/platforms/zigbee2mqtt.device.platform.js +11 -22
- package/dist/plugins/devices-zigbee2mqtt/platforms/zigbee2mqtt.device.platform.js.map +1 -1
- package/dist/plugins/devices-zigbee2mqtt/services/base-client-adapter.d.ts +35 -0
- package/dist/plugins/devices-zigbee2mqtt/services/base-client-adapter.js +265 -0
- package/dist/plugins/devices-zigbee2mqtt/services/base-client-adapter.js.map +1 -0
- package/dist/plugins/devices-zigbee2mqtt/services/device-mapper.service.js +6 -5
- package/dist/plugins/devices-zigbee2mqtt/services/device-mapper.service.js.map +1 -1
- package/dist/plugins/devices-zigbee2mqtt/services/mqtt-client-adapter.service.d.ts +4 -26
- package/dist/plugins/devices-zigbee2mqtt/services/mqtt-client-adapter.service.js +16 -265
- package/dist/plugins/devices-zigbee2mqtt/services/mqtt-client-adapter.service.js.map +1 -1
- package/dist/plugins/devices-zigbee2mqtt/services/virtual-property.types.js +0 -16
- package/dist/plugins/devices-zigbee2mqtt/services/virtual-property.types.js.map +1 -1
- package/dist/plugins/devices-zigbee2mqtt/services/ws-client-adapter.service.d.ts +14 -0
- package/dist/plugins/devices-zigbee2mqtt/services/ws-client-adapter.service.js +199 -0
- package/dist/plugins/devices-zigbee2mqtt/services/ws-client-adapter.service.js.map +1 -0
- package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt-config-validator.service.d.ts +2 -0
- package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt-config-validator.service.js +69 -0
- package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt-config-validator.service.js.map +1 -1
- package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt.service.d.ts +8 -1
- package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt.service.js +86 -32
- package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt.service.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -9,7 +9,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.Zigbee2mqttConfigModel = exports.Z2mDiscoveryConfigModel = exports.Z2mTlsConfigModel = exports.Z2mMqttConfigModel = void 0;
|
|
12
|
+
exports.Zigbee2mqttConfigModel = exports.Z2mWsConfigModel = exports.Z2mDiscoveryConfigModel = exports.Z2mTlsConfigModel = exports.Z2mMqttConfigModel = void 0;
|
|
13
13
|
const class_transformer_1 = require("class-transformer");
|
|
14
14
|
const class_validator_1 = require("class-validator");
|
|
15
15
|
const swagger_1 = require("@nestjs/swagger");
|
|
@@ -43,10 +43,12 @@ __decorate([
|
|
|
43
43
|
(0, class_transformer_1.Expose)(),
|
|
44
44
|
(0, class_validator_1.IsInt)(),
|
|
45
45
|
(0, class_validator_1.Min)(1),
|
|
46
|
+
(0, class_validator_1.Max)(65535),
|
|
46
47
|
(0, swagger_1.ApiProperty)({
|
|
47
48
|
description: 'MQTT broker port',
|
|
48
49
|
example: devices_zigbee2mqtt_constants_1.DEFAULT_MQTT_PORT,
|
|
49
50
|
minimum: 1,
|
|
51
|
+
maximum: 65535,
|
|
50
52
|
}),
|
|
51
53
|
__metadata("design:type", Number)
|
|
52
54
|
], Z2mMqttConfigModel.prototype, "port", void 0);
|
|
@@ -237,11 +239,92 @@ __decorate([
|
|
|
237
239
|
exports.Z2mDiscoveryConfigModel = Z2mDiscoveryConfigModel = __decorate([
|
|
238
240
|
(0, swagger_1.ApiSchema)({ name: 'DevicesZigbee2mqttPluginDataDiscoveryConfig' })
|
|
239
241
|
], Z2mDiscoveryConfigModel);
|
|
242
|
+
let Z2mWsConfigModel = class Z2mWsConfigModel {
|
|
243
|
+
constructor() {
|
|
244
|
+
this.host = 'localhost';
|
|
245
|
+
this.port = devices_zigbee2mqtt_constants_1.DEFAULT_WS_PORT;
|
|
246
|
+
this.baseTopic = devices_zigbee2mqtt_constants_1.DEFAULT_MQTT_BASE_TOPIC;
|
|
247
|
+
this.secure = false;
|
|
248
|
+
this.connectTimeout = devices_zigbee2mqtt_constants_1.DEFAULT_WS_CONNECT_TIMEOUT;
|
|
249
|
+
this.reconnectInterval = devices_zigbee2mqtt_constants_1.DEFAULT_WS_RECONNECT_INTERVAL;
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
exports.Z2mWsConfigModel = Z2mWsConfigModel;
|
|
253
|
+
__decorate([
|
|
254
|
+
(0, class_transformer_1.Expose)(),
|
|
255
|
+
(0, class_validator_1.IsString)(),
|
|
256
|
+
(0, swagger_1.ApiProperty)({
|
|
257
|
+
description: 'Zigbee2MQTT frontend hostname or IP address',
|
|
258
|
+
example: 'localhost',
|
|
259
|
+
}),
|
|
260
|
+
__metadata("design:type", String)
|
|
261
|
+
], Z2mWsConfigModel.prototype, "host", void 0);
|
|
262
|
+
__decorate([
|
|
263
|
+
(0, class_transformer_1.Expose)(),
|
|
264
|
+
(0, class_validator_1.IsInt)(),
|
|
265
|
+
(0, class_validator_1.Min)(1),
|
|
266
|
+
(0, class_validator_1.Max)(65535),
|
|
267
|
+
(0, swagger_1.ApiProperty)({
|
|
268
|
+
description: 'Zigbee2MQTT frontend port',
|
|
269
|
+
example: devices_zigbee2mqtt_constants_1.DEFAULT_WS_PORT,
|
|
270
|
+
minimum: 1,
|
|
271
|
+
maximum: 65535,
|
|
272
|
+
}),
|
|
273
|
+
__metadata("design:type", Number)
|
|
274
|
+
], Z2mWsConfigModel.prototype, "port", void 0);
|
|
275
|
+
__decorate([
|
|
276
|
+
(0, class_transformer_1.Expose)({ name: 'base_topic' }),
|
|
277
|
+
(0, class_validator_1.IsString)(),
|
|
278
|
+
(0, swagger_1.ApiProperty)({
|
|
279
|
+
name: 'base_topic',
|
|
280
|
+
description: 'Zigbee2MQTT base topic (used for message routing)',
|
|
281
|
+
example: devices_zigbee2mqtt_constants_1.DEFAULT_MQTT_BASE_TOPIC,
|
|
282
|
+
}),
|
|
283
|
+
__metadata("design:type", String)
|
|
284
|
+
], Z2mWsConfigModel.prototype, "baseTopic", void 0);
|
|
285
|
+
__decorate([
|
|
286
|
+
(0, class_transformer_1.Expose)(),
|
|
287
|
+
(0, class_validator_1.IsBoolean)(),
|
|
288
|
+
(0, swagger_1.ApiProperty)({
|
|
289
|
+
description: 'Use secure WebSocket (wss://)',
|
|
290
|
+
example: false,
|
|
291
|
+
}),
|
|
292
|
+
__metadata("design:type", Boolean)
|
|
293
|
+
], Z2mWsConfigModel.prototype, "secure", void 0);
|
|
294
|
+
__decorate([
|
|
295
|
+
(0, class_transformer_1.Expose)({ name: 'connect_timeout' }),
|
|
296
|
+
(0, class_validator_1.IsInt)(),
|
|
297
|
+
(0, class_validator_1.Min)(1000),
|
|
298
|
+
(0, swagger_1.ApiProperty)({
|
|
299
|
+
name: 'connect_timeout',
|
|
300
|
+
description: 'Connection timeout in milliseconds',
|
|
301
|
+
example: devices_zigbee2mqtt_constants_1.DEFAULT_WS_CONNECT_TIMEOUT,
|
|
302
|
+
minimum: 1000,
|
|
303
|
+
}),
|
|
304
|
+
__metadata("design:type", Number)
|
|
305
|
+
], Z2mWsConfigModel.prototype, "connectTimeout", void 0);
|
|
306
|
+
__decorate([
|
|
307
|
+
(0, class_transformer_1.Expose)({ name: 'reconnect_interval' }),
|
|
308
|
+
(0, class_validator_1.IsInt)(),
|
|
309
|
+
(0, class_validator_1.Min)(1000),
|
|
310
|
+
(0, swagger_1.ApiProperty)({
|
|
311
|
+
name: 'reconnect_interval',
|
|
312
|
+
description: 'Reconnection interval in milliseconds',
|
|
313
|
+
example: devices_zigbee2mqtt_constants_1.DEFAULT_WS_RECONNECT_INTERVAL,
|
|
314
|
+
minimum: 1000,
|
|
315
|
+
}),
|
|
316
|
+
__metadata("design:type", Number)
|
|
317
|
+
], Z2mWsConfigModel.prototype, "reconnectInterval", void 0);
|
|
318
|
+
exports.Z2mWsConfigModel = Z2mWsConfigModel = __decorate([
|
|
319
|
+
(0, swagger_1.ApiSchema)({ name: 'DevicesZigbee2mqttPluginDataWsConfig' })
|
|
320
|
+
], Z2mWsConfigModel);
|
|
240
321
|
let Zigbee2mqttConfigModel = class Zigbee2mqttConfigModel extends config_model_1.PluginConfigModel {
|
|
241
322
|
constructor() {
|
|
242
323
|
super(...arguments);
|
|
243
324
|
this.type = devices_zigbee2mqtt_constants_1.DEVICES_ZIGBEE2MQTT_PLUGIN_NAME;
|
|
325
|
+
this.connectionType = devices_zigbee2mqtt_constants_1.DEFAULT_CONNECTION_TYPE;
|
|
244
326
|
this.mqtt = new Z2mMqttConfigModel();
|
|
327
|
+
this.ws = new Z2mWsConfigModel();
|
|
245
328
|
this.tls = new Z2mTlsConfigModel();
|
|
246
329
|
this.discovery = new Z2mDiscoveryConfigModel();
|
|
247
330
|
}
|
|
@@ -256,22 +339,44 @@ __decorate([
|
|
|
256
339
|
}),
|
|
257
340
|
__metadata("design:type", String)
|
|
258
341
|
], Zigbee2mqttConfigModel.prototype, "type", void 0);
|
|
342
|
+
__decorate([
|
|
343
|
+
(0, class_transformer_1.Expose)({ name: 'connection_type' }),
|
|
344
|
+
(0, class_validator_1.IsString)(),
|
|
345
|
+
(0, class_validator_1.IsIn)(['mqtt', 'ws']),
|
|
346
|
+
(0, swagger_1.ApiProperty)({
|
|
347
|
+
name: 'connection_type',
|
|
348
|
+
description: 'Connection type: "mqtt" for MQTT broker or "ws" for direct WebSocket to Zigbee2MQTT frontend',
|
|
349
|
+
example: devices_zigbee2mqtt_constants_1.DEFAULT_CONNECTION_TYPE,
|
|
350
|
+
enum: ['mqtt', 'ws'],
|
|
351
|
+
}),
|
|
352
|
+
__metadata("design:type", String)
|
|
353
|
+
], Zigbee2mqttConfigModel.prototype, "connectionType", void 0);
|
|
259
354
|
__decorate([
|
|
260
355
|
(0, class_transformer_1.Expose)(),
|
|
261
356
|
(0, class_validator_1.ValidateNested)(),
|
|
262
357
|
(0, class_transformer_1.Type)(() => Z2mMqttConfigModel),
|
|
263
358
|
(0, swagger_1.ApiProperty)({
|
|
264
|
-
description: 'MQTT connection configuration',
|
|
359
|
+
description: 'MQTT connection configuration (used when connection_type is "mqtt")',
|
|
265
360
|
type: () => Z2mMqttConfigModel,
|
|
266
361
|
}),
|
|
267
362
|
__metadata("design:type", Z2mMqttConfigModel)
|
|
268
363
|
], Zigbee2mqttConfigModel.prototype, "mqtt", void 0);
|
|
364
|
+
__decorate([
|
|
365
|
+
(0, class_transformer_1.Expose)(),
|
|
366
|
+
(0, class_validator_1.ValidateNested)(),
|
|
367
|
+
(0, class_transformer_1.Type)(() => Z2mWsConfigModel),
|
|
368
|
+
(0, swagger_1.ApiProperty)({
|
|
369
|
+
description: 'WebSocket connection configuration (used when connection_type is "ws")',
|
|
370
|
+
type: () => Z2mWsConfigModel,
|
|
371
|
+
}),
|
|
372
|
+
__metadata("design:type", Z2mWsConfigModel)
|
|
373
|
+
], Zigbee2mqttConfigModel.prototype, "ws", void 0);
|
|
269
374
|
__decorate([
|
|
270
375
|
(0, class_transformer_1.Expose)(),
|
|
271
376
|
(0, class_validator_1.ValidateNested)(),
|
|
272
377
|
(0, class_transformer_1.Type)(() => Z2mTlsConfigModel),
|
|
273
378
|
(0, swagger_1.ApiProperty)({
|
|
274
|
-
description: 'TLS/SSL configuration',
|
|
379
|
+
description: 'TLS/SSL configuration (used when connection_type is "mqtt")',
|
|
275
380
|
type: () => Z2mTlsConfigModel,
|
|
276
381
|
}),
|
|
277
382
|
__metadata("design:type", Z2mTlsConfigModel)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.model.js","sourceRoot":"","sources":["../../../../src/plugins/devices-zigbee2mqtt/models/config.model.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yDAAiD;AACjD,
|
|
1
|
+
{"version":3,"file":"config.model.js","sourceRoot":"","sources":["../../../../src/plugins/devices-zigbee2mqtt/models/config.model.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yDAAiD;AACjD,qDAAyG;AAEzG,6CAA8E;AAE9E,8EAAgF;AAChF,oFAW0C;AAMnC,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAAxB;QAON,SAAI,GAAW,WAAW,CAAC;QAY3B,SAAI,GAAW,iDAAiB,CAAC;QAUjC,aAAQ,GAAkB,IAAI,CAAC;QAU/B,aAAQ,GAAkB,IAAI,CAAC;QAS/B,cAAS,GAAW,uDAAuB,CAAC;QAW5C,aAAQ,GAAkB,IAAI,CAAC;QAS/B,iBAAY,GAAY,IAAI,CAAC;QAU7B,cAAS,GAAW,sDAAsB,CAAC;QAW3C,mBAAc,GAAW,4DAA4B,CAAC;QAWtD,sBAAiB,GAAW,+DAA+B,CAAC;IAC7D,CAAC;CAAA,CAAA;AArGY,gDAAkB;AAO9B;IANC,IAAA,0BAAM,GAAE;IACR,IAAA,0BAAQ,GAAE;IACV,IAAA,qBAAW,EAAC;QACZ,WAAW,EAAE,oCAAoC;QACjD,OAAO,EAAE,WAAW;KACpB,CAAC;;gDACyB;AAY3B;IAVC,IAAA,0BAAM,GAAE;IACR,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;IACN,IAAA,qBAAG,EAAC,KAAK,CAAC;IACV,IAAA,qBAAW,EAAC;QACZ,WAAW,EAAE,kBAAkB;QAC/B,OAAO,EAAE,iDAAiB;QAC1B,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,KAAK;KACd,CAAC;;gDAC+B;AAUjC;IARC,IAAA,0BAAM,GAAE;IACR,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,6BAAmB,EAAC;QACpB,WAAW,EAAE,kCAAkC;QAC/C,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;KACb,CAAC;;oDAC6B;AAU/B;IARC,IAAA,0BAAM,GAAE;IACR,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,6BAAmB,EAAC;QACpB,WAAW,EAAE,kCAAkC;QAC/C,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;KACb,CAAC;;oDAC6B;AAS/B;IAPC,IAAA,0BAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAC9B,IAAA,0BAAQ,GAAE;IACV,IAAA,qBAAW,EAAC;QACZ,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,wBAAwB;QACrC,OAAO,EAAE,uDAAuB;KAChC,CAAC;;qDAC0C;AAW5C;IATC,IAAA,0BAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC7B,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,6BAAmB,EAAC;QACpB,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,0DAA0D;QACvE,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;KACb,CAAC;;oDAC6B;AAS/B;IAPC,IAAA,0BAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;IACjC,IAAA,2BAAS,GAAE;IACX,IAAA,qBAAW,EAAC;QACZ,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,iCAAiC;QAC9C,OAAO,EAAE,IAAI;KACb,CAAC;;wDAC2B;AAU7B;IARC,IAAA,0BAAM,GAAE;IACR,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,EAAE,CAAC;IACP,IAAA,qBAAW,EAAC;QACZ,WAAW,EAAE,oCAAoC;QACjD,OAAO,EAAE,sDAAsB;QAC/B,OAAO,EAAE,EAAE;KACX,CAAC;;qDACyC;AAW3C;IATC,IAAA,0BAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;IACnC,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,IAAI,CAAC;IACT,IAAA,qBAAW,EAAC;QACZ,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,oCAAoC;QACjD,OAAO,EAAE,4DAA4B;QACrC,OAAO,EAAE,IAAI;KACb,CAAC;;0DACoD;AAWtD;IATC,IAAA,0BAAM,EAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;IACtC,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,IAAI,CAAC;IACT,IAAA,qBAAW,EAAC;QACZ,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,uCAAuC;QACpD,OAAO,EAAE,+DAA+B;QACxC,OAAO,EAAE,IAAI;KACb,CAAC;;6DAC0D;6BApGhD,kBAAkB;IAD9B,IAAA,mBAAS,EAAC,EAAE,IAAI,EAAE,wCAAwC,EAAE,CAAC;GACjD,kBAAkB,CAqG9B;AAMM,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAAvB;QAON,YAAO,GAAY,KAAK,CAAC;QASzB,uBAAkB,GAAY,IAAI,CAAC;QAUnC,OAAE,GAAkB,IAAI,CAAC;QAUzB,SAAI,GAAkB,IAAI,CAAC;QAU3B,QAAG,GAAkB,IAAI,CAAC;IAC3B,CAAC;CAAA,CAAA;AA/CY,8CAAiB;AAO7B;IANC,IAAA,0BAAM,GAAE;IACR,IAAA,2BAAS,GAAE;IACX,IAAA,qBAAW,EAAC;QACZ,WAAW,EAAE,wBAAwB;QACrC,OAAO,EAAE,KAAK;KACd,CAAC;;kDACuB;AASzB;IAPC,IAAA,0BAAM,EAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;IACvC,IAAA,2BAAS,GAAE;IACX,IAAA,qBAAW,EAAC;QACZ,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,sCAAsC;QACnD,OAAO,EAAE,IAAI;KACb,CAAC;;6DACiC;AAUnC;IARC,IAAA,0BAAM,GAAE;IACR,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,6BAAmB,EAAC;QACpB,WAAW,EAAE,gCAAgC;QAC7C,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;KACb,CAAC;;6CACuB;AAUzB;IARC,IAAA,0BAAM,GAAE;IACR,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,6BAAmB,EAAC;QACpB,WAAW,EAAE,oCAAoC;QACjD,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;KACb,CAAC;;+CACyB;AAU3B;IARC,IAAA,0BAAM,GAAE;IACR,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;IACV,IAAA,6BAAmB,EAAC;QACpB,WAAW,EAAE,oCAAoC;QACjD,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;KACb,CAAC;;8CACwB;4BA9Cd,iBAAiB;IAD7B,IAAA,mBAAS,EAAC,EAAE,IAAI,EAAE,uCAAuC,EAAE,CAAC;GAChD,iBAAiB,CA+C7B;AAMM,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAA7B;QAQN,YAAO,GAAY,IAAI,CAAC;QASxB,kBAAa,GAAY,IAAI,CAAC;IAC/B,CAAC;CAAA,CAAA;AAlBY,0DAAuB;AAQnC;IAPC,IAAA,0BAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC5B,IAAA,2BAAS,GAAE;IACX,IAAA,qBAAW,EAAC;QACZ,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,oDAAoD;QACjE,OAAO,EAAE,IAAI;KACb,CAAC;;wDACsB;AASxB;IAPC,IAAA,0BAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;IACnC,IAAA,2BAAS,GAAE;IACX,IAAA,qBAAW,EAAC;QACZ,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,oCAAoC;QACjD,OAAO,EAAE,IAAI;KACb,CAAC;;8DAC4B;kCAjBlB,uBAAuB;IADnC,IAAA,mBAAS,EAAC,EAAE,IAAI,EAAE,6CAA6C,EAAE,CAAC;GACtD,uBAAuB,CAkBnC;AAMM,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAAtB;QAON,SAAI,GAAW,WAAW,CAAC;QAY3B,SAAI,GAAW,+CAAe,CAAC;QAS/B,cAAS,GAAW,uDAAuB,CAAC;QAQ5C,WAAM,GAAY,KAAK,CAAC;QAWxB,mBAAc,GAAW,0DAA0B,CAAC;QAWpD,sBAAiB,GAAW,6DAA6B,CAAC;IAC3D,CAAC;CAAA,CAAA;AA3DY,4CAAgB;AAO5B;IANC,IAAA,0BAAM,GAAE;IACR,IAAA,0BAAQ,GAAE;IACV,IAAA,qBAAW,EAAC;QACZ,WAAW,EAAE,6CAA6C;QAC1D,OAAO,EAAE,WAAW;KACpB,CAAC;;8CACyB;AAY3B;IAVC,IAAA,0BAAM,GAAE;IACR,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;IACN,IAAA,qBAAG,EAAC,KAAK,CAAC;IACV,IAAA,qBAAW,EAAC;QACZ,WAAW,EAAE,2BAA2B;QACxC,OAAO,EAAE,+CAAe;QACxB,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,KAAK;KACd,CAAC;;8CAC6B;AAS/B;IAPC,IAAA,0BAAM,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAC9B,IAAA,0BAAQ,GAAE;IACV,IAAA,qBAAW,EAAC;QACZ,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,mDAAmD;QAChE,OAAO,EAAE,uDAAuB;KAChC,CAAC;;mDAC0C;AAQ5C;IANC,IAAA,0BAAM,GAAE;IACR,IAAA,2BAAS,GAAE;IACX,IAAA,qBAAW,EAAC;QACZ,WAAW,EAAE,+BAA+B;QAC5C,OAAO,EAAE,KAAK;KACd,CAAC;;gDACsB;AAWxB;IATC,IAAA,0BAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;IACnC,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,IAAI,CAAC;IACT,IAAA,qBAAW,EAAC;QACZ,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,oCAAoC;QACjD,OAAO,EAAE,0DAA0B;QACnC,OAAO,EAAE,IAAI;KACb,CAAC;;wDACkD;AAWpD;IATC,IAAA,0BAAM,EAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;IACtC,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,IAAI,CAAC;IACT,IAAA,qBAAW,EAAC;QACZ,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,uCAAuC;QACpD,OAAO,EAAE,6DAA6B;QACtC,OAAO,EAAE,IAAI;KACb,CAAC;;2DACwD;2BA1D9C,gBAAgB;IAD5B,IAAA,mBAAS,EAAC,EAAE,IAAI,EAAE,sCAAsC,EAAE,CAAC;GAC/C,gBAAgB,CA2D5B;AAMM,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,gCAAiB;IAAtD;;QAON,SAAI,GAAW,+DAA+B,CAAC;QAW/C,mBAAc,GAAkB,uDAAuB,CAAC;QASxD,SAAI,GAAuB,IAAI,kBAAkB,EAAE,CAAC;QASpD,OAAE,GAAqB,IAAI,gBAAgB,EAAE,CAAC;QAS9C,QAAG,GAAsB,IAAI,iBAAiB,EAAE,CAAC;QASjD,cAAS,GAA4B,IAAI,uBAAuB,EAAE,CAAC;IACpE,CAAC;CAAA,CAAA;AAvDY,wDAAsB;AAOlC;IANC,IAAA,0BAAM,GAAE;IACR,IAAA,0BAAQ,GAAE;IACV,IAAA,qBAAW,EAAC;QACZ,WAAW,EAAE,wBAAwB;QACrC,OAAO,EAAE,+DAA+B;KACxC,CAAC;;oDAC6C;AAW/C;IATC,IAAA,0BAAM,EAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;IACnC,IAAA,0BAAQ,GAAE;IACV,IAAA,sBAAI,EAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACpB,IAAA,qBAAW,EAAC;QACZ,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,8FAA8F;QAC3G,OAAO,EAAE,uDAAuB;QAChC,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC;KACpB,CAAC;;8DACsD;AASxD;IAPC,IAAA,0BAAM,GAAE;IACR,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC;IAC9B,IAAA,qBAAW,EAAC;QACZ,WAAW,EAAE,qEAAqE;QAClF,IAAI,EAAE,GAAG,EAAE,CAAC,kBAAkB;KAC9B,CAAC;8BACI,kBAAkB;oDAA4B;AASpD;IAPC,IAAA,0BAAM,GAAE;IACR,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC;IAC5B,IAAA,qBAAW,EAAC;QACZ,WAAW,EAAE,wEAAwE;QACrF,IAAI,EAAE,GAAG,EAAE,CAAC,gBAAgB;KAC5B,CAAC;8BACE,gBAAgB;kDAA0B;AAS9C;IAPC,IAAA,0BAAM,GAAE;IACR,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC;IAC7B,IAAA,qBAAW,EAAC;QACZ,WAAW,EAAE,6DAA6D;QAC1E,IAAI,EAAE,GAAG,EAAE,CAAC,iBAAiB;KAC7B,CAAC;8BACG,iBAAiB;mDAA2B;AASjD;IAPC,IAAA,0BAAM,GAAE;IACR,IAAA,gCAAc,GAAE;IAChB,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC;IACnC,IAAA,qBAAW,EAAC;QACZ,WAAW,EAAE,gCAAgC;QAC7C,IAAI,EAAE,GAAG,EAAE,CAAC,uBAAuB;KACnC,CAAC;8BACS,uBAAuB;yDAAiC;iCAtDvD,sBAAsB;IADlC,IAAA,mBAAS,EAAC,EAAE,IAAI,EAAE,oCAAoC,EAAE,CAAC;GAC7C,sBAAsB,CAuDlC"}
|
|
@@ -2,24 +2,23 @@ import { IDevicePlatform, IDevicePropertyData } from '../../../modules/devices/p
|
|
|
2
2
|
import { Zigbee2mqttChannelEntity, Zigbee2mqttChannelPropertyEntity, Zigbee2mqttDeviceEntity } from '../entities/devices-zigbee2mqtt.entity';
|
|
3
3
|
import { ConfigDrivenConverter } from '../mappings/config-driven.converter';
|
|
4
4
|
import { Z2mDeviceMapperService } from '../services/device-mapper.service';
|
|
5
|
-
import { Z2mMqttClientAdapterService } from '../services/mqtt-client-adapter.service';
|
|
6
5
|
import { Z2mVirtualPropertyService } from '../services/virtual-property.service';
|
|
6
|
+
import { Zigbee2mqttService } from '../services/zigbee2mqtt.service';
|
|
7
7
|
export type IZigbee2mqttDevicePropertyData = IDevicePropertyData & {
|
|
8
8
|
device: Zigbee2mqttDeviceEntity;
|
|
9
9
|
channel: Zigbee2mqttChannelEntity;
|
|
10
10
|
property: Zigbee2mqttChannelPropertyEntity;
|
|
11
11
|
};
|
|
12
12
|
export declare class Zigbee2mqttDevicePlatform implements IDevicePlatform {
|
|
13
|
-
private readonly
|
|
13
|
+
private readonly zigbee2mqttService;
|
|
14
14
|
private readonly virtualPropertyService;
|
|
15
15
|
private readonly configDrivenConverter;
|
|
16
16
|
private readonly deviceMapper;
|
|
17
17
|
private readonly logger;
|
|
18
|
-
constructor(
|
|
18
|
+
constructor(zigbee2mqttService: Zigbee2mqttService, virtualPropertyService: Z2mVirtualPropertyService, configDrivenConverter: ConfigDrivenConverter, deviceMapper: Z2mDeviceMapperService);
|
|
19
19
|
getType(): string;
|
|
20
20
|
process({ device, channel, property, value }: IZigbee2mqttDevicePropertyData): Promise<boolean>;
|
|
21
21
|
processBatch(updates: Array<IZigbee2mqttDevicePropertyData>): Promise<boolean>;
|
|
22
22
|
private executeCommand;
|
|
23
|
-
private coerceBoolean;
|
|
24
23
|
private coerceNumber;
|
|
25
24
|
}
|
|
@@ -17,11 +17,11 @@ const devices_zigbee2mqtt_constants_1 = require("../devices-zigbee2mqtt.constant
|
|
|
17
17
|
const devices_zigbee2mqtt_entity_1 = require("../entities/devices-zigbee2mqtt.entity");
|
|
18
18
|
const config_driven_converter_1 = require("../mappings/config-driven.converter");
|
|
19
19
|
const device_mapper_service_1 = require("../services/device-mapper.service");
|
|
20
|
-
const mqtt_client_adapter_service_1 = require("../services/mqtt-client-adapter.service");
|
|
21
20
|
const virtual_property_service_1 = require("../services/virtual-property.service");
|
|
21
|
+
const zigbee2mqtt_service_1 = require("../services/zigbee2mqtt.service");
|
|
22
22
|
let Zigbee2mqttDevicePlatform = class Zigbee2mqttDevicePlatform {
|
|
23
|
-
constructor(
|
|
24
|
-
this.
|
|
23
|
+
constructor(zigbee2mqttService, virtualPropertyService, configDrivenConverter, deviceMapper) {
|
|
24
|
+
this.zigbee2mqttService = zigbee2mqttService;
|
|
25
25
|
this.virtualPropertyService = virtualPropertyService;
|
|
26
26
|
this.configDrivenConverter = configDrivenConverter;
|
|
27
27
|
this.deviceMapper = deviceMapper;
|
|
@@ -37,8 +37,9 @@ let Zigbee2mqttDevicePlatform = class Zigbee2mqttDevicePlatform {
|
|
|
37
37
|
if (updates.length === 0) {
|
|
38
38
|
return true;
|
|
39
39
|
}
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
const adapter = this.zigbee2mqttService.getActiveAdapter();
|
|
41
|
+
if (!adapter.isConnected()) {
|
|
42
|
+
this.logger.warn('Not connected to Zigbee2MQTT, cannot send command');
|
|
42
43
|
return false;
|
|
43
44
|
}
|
|
44
45
|
const byDevice = new Map();
|
|
@@ -77,7 +78,7 @@ let Zigbee2mqttDevicePlatform = class Zigbee2mqttDevicePlatform {
|
|
|
77
78
|
const friendlyName = device.identifier;
|
|
78
79
|
for (const { channel, props } of channels.values()) {
|
|
79
80
|
try {
|
|
80
|
-
const success = await this.executeCommand(device, channel, Array.from(props.values()), friendlyName);
|
|
81
|
+
const success = await this.executeCommand(adapter, device, channel, Array.from(props.values()), friendlyName);
|
|
81
82
|
results.push(success);
|
|
82
83
|
}
|
|
83
84
|
catch (error) {
|
|
@@ -90,7 +91,7 @@ let Zigbee2mqttDevicePlatform = class Zigbee2mqttDevicePlatform {
|
|
|
90
91
|
}
|
|
91
92
|
return results.length > 0 && results.every((r) => r === true);
|
|
92
93
|
}
|
|
93
|
-
async executeCommand(device, channel, propertyUpdates, friendlyName) {
|
|
94
|
+
async executeCommand(adapter, device, channel, propertyUpdates, friendlyName) {
|
|
94
95
|
const payload = {};
|
|
95
96
|
let colorHue;
|
|
96
97
|
let colorSaturation;
|
|
@@ -160,24 +161,12 @@ let Zigbee2mqttDevicePlatform = class Zigbee2mqttDevicePlatform {
|
|
|
160
161
|
return false;
|
|
161
162
|
}
|
|
162
163
|
this.logger.log(`Sending command to ${friendlyName}: ${JSON.stringify(payload)}`);
|
|
163
|
-
const success = await
|
|
164
|
-
if (success) {
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
164
|
+
const success = await adapter.publishCommand(friendlyName, payload);
|
|
165
|
+
if (!success) {
|
|
167
166
|
this.logger.warn(`Failed to send command to ${friendlyName}`);
|
|
168
167
|
}
|
|
169
168
|
return success;
|
|
170
169
|
}
|
|
171
|
-
coerceBoolean(value) {
|
|
172
|
-
if (typeof value === 'boolean') {
|
|
173
|
-
return value;
|
|
174
|
-
}
|
|
175
|
-
if (typeof value === 'number') {
|
|
176
|
-
return value !== 0;
|
|
177
|
-
}
|
|
178
|
-
const strValue = String(value).toLowerCase();
|
|
179
|
-
return strValue === 'true' || strValue === '1' || strValue === 'on';
|
|
180
|
-
}
|
|
181
170
|
coerceNumber(value, min, max) {
|
|
182
171
|
let numValue;
|
|
183
172
|
if (typeof value === 'number') {
|
|
@@ -198,7 +187,7 @@ let Zigbee2mqttDevicePlatform = class Zigbee2mqttDevicePlatform {
|
|
|
198
187
|
exports.Zigbee2mqttDevicePlatform = Zigbee2mqttDevicePlatform;
|
|
199
188
|
exports.Zigbee2mqttDevicePlatform = Zigbee2mqttDevicePlatform = __decorate([
|
|
200
189
|
(0, common_1.Injectable)(),
|
|
201
|
-
__metadata("design:paramtypes", [
|
|
190
|
+
__metadata("design:paramtypes", [zigbee2mqtt_service_1.Zigbee2mqttService,
|
|
202
191
|
virtual_property_service_1.Z2mVirtualPropertyService,
|
|
203
192
|
config_driven_converter_1.ConfigDrivenConverter,
|
|
204
193
|
device_mapper_service_1.Z2mDeviceMapperService])
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zigbee2mqtt.device.platform.js","sourceRoot":"","sources":["../../../../src/plugins/devices-zigbee2mqtt/platforms/zigbee2mqtt.device.platform.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAE5C,mDAAuF;AACvF,kFAA8E;AAE9E,oFAA6G;AAC7G,uFAIgD;AAEhD,iFAA4E;
|
|
1
|
+
{"version":3,"file":"zigbee2mqtt.device.platform.js","sourceRoot":"","sources":["../../../../src/plugins/devices-zigbee2mqtt/platforms/zigbee2mqtt.device.platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ExtensionLoggerService } from '../../../common/logger';
|
|
2
|
+
import { Z2mAdapterCallbacks, Z2mMqttConfig, Z2mRegisteredDevice, Z2mSetPayload, Z2mWsConfig } from '../interfaces/zigbee2mqtt.interface';
|
|
3
|
+
export declare abstract class Z2mBaseClientAdapter {
|
|
4
|
+
protected readonly logger: ExtensionLoggerService;
|
|
5
|
+
protected connected: boolean;
|
|
6
|
+
protected bridgeOnline: boolean;
|
|
7
|
+
protected reconnectTimer: NodeJS.Timeout | null;
|
|
8
|
+
protected configBaseTopic: string;
|
|
9
|
+
protected readonly deviceRegistry: Map<string, Z2mRegisteredDevice>;
|
|
10
|
+
protected readonly stateCache: Map<string, Record<string, unknown>>;
|
|
11
|
+
protected callbacks: Z2mAdapterCallbacks;
|
|
12
|
+
constructor(adapterName: string);
|
|
13
|
+
setCallbacks(callbacks: Z2mAdapterCallbacks): void;
|
|
14
|
+
get baseTopic(): string;
|
|
15
|
+
isConnected(): boolean;
|
|
16
|
+
isBridgeOnline(): boolean;
|
|
17
|
+
getRegisteredDevices(): Z2mRegisteredDevice[];
|
|
18
|
+
getDevice(friendlyName: string): Z2mRegisteredDevice | undefined;
|
|
19
|
+
getDeviceByIeeeAddress(ieeeAddress: string): Z2mRegisteredDevice | undefined;
|
|
20
|
+
getCachedState(friendlyName: string): Record<string, unknown>;
|
|
21
|
+
abstract connect(config: Z2mMqttConfig | Z2mWsConfig): Promise<void>;
|
|
22
|
+
abstract disconnect(): Promise<void>;
|
|
23
|
+
abstract publishCommand(friendlyName: string, payload: Z2mSetPayload): Promise<boolean>;
|
|
24
|
+
abstract requestState(friendlyName: string, properties?: string[]): Promise<boolean>;
|
|
25
|
+
protected handleMessage(topic: string, message: string, isRelative?: boolean): void;
|
|
26
|
+
protected handleBridgeMessage(subtopic: string | undefined, message: string): void;
|
|
27
|
+
protected handleBridgeStateMessage(message: string): void;
|
|
28
|
+
protected handleBridgeDevicesMessage(message: string): void;
|
|
29
|
+
protected requestMissingStates(): void;
|
|
30
|
+
protected handleBridgeEventMessage(message: string): void;
|
|
31
|
+
protected handleDeviceStateMessage(friendlyName: string, message: string): void;
|
|
32
|
+
protected handleDeviceAvailabilityMessage(friendlyName: string, message: string): void;
|
|
33
|
+
protected clearReconnectTimer(): void;
|
|
34
|
+
protected resetState(): void;
|
|
35
|
+
}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Z2mBaseClientAdapter = void 0;
|
|
4
|
+
const logger_1 = require("../../../common/logger");
|
|
5
|
+
const devices_zigbee2mqtt_constants_1 = require("../devices-zigbee2mqtt.constants");
|
|
6
|
+
class Z2mBaseClientAdapter {
|
|
7
|
+
constructor(adapterName) {
|
|
8
|
+
this.connected = false;
|
|
9
|
+
this.bridgeOnline = false;
|
|
10
|
+
this.reconnectTimer = null;
|
|
11
|
+
this.configBaseTopic = devices_zigbee2mqtt_constants_1.DEFAULT_MQTT_BASE_TOPIC;
|
|
12
|
+
this.deviceRegistry = new Map();
|
|
13
|
+
this.stateCache = new Map();
|
|
14
|
+
this.callbacks = {};
|
|
15
|
+
this.logger = (0, logger_1.createExtensionLogger)(devices_zigbee2mqtt_constants_1.DEVICES_ZIGBEE2MQTT_PLUGIN_NAME, adapterName);
|
|
16
|
+
}
|
|
17
|
+
setCallbacks(callbacks) {
|
|
18
|
+
this.callbacks = callbacks;
|
|
19
|
+
}
|
|
20
|
+
get baseTopic() {
|
|
21
|
+
return this.configBaseTopic;
|
|
22
|
+
}
|
|
23
|
+
isConnected() {
|
|
24
|
+
return this.connected;
|
|
25
|
+
}
|
|
26
|
+
isBridgeOnline() {
|
|
27
|
+
return this.bridgeOnline;
|
|
28
|
+
}
|
|
29
|
+
getRegisteredDevices() {
|
|
30
|
+
return Array.from(this.deviceRegistry.values());
|
|
31
|
+
}
|
|
32
|
+
getDevice(friendlyName) {
|
|
33
|
+
return this.deviceRegistry.get(friendlyName);
|
|
34
|
+
}
|
|
35
|
+
getDeviceByIeeeAddress(ieeeAddress) {
|
|
36
|
+
for (const device of this.deviceRegistry.values()) {
|
|
37
|
+
if (device.ieeeAddress === ieeeAddress) {
|
|
38
|
+
return device;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
getCachedState(friendlyName) {
|
|
44
|
+
return this.stateCache.get(friendlyName) ?? {};
|
|
45
|
+
}
|
|
46
|
+
handleMessage(topic, message, isRelative = false) {
|
|
47
|
+
try {
|
|
48
|
+
const relativePath = isRelative ? topic : topic.replace(`${this.baseTopic}/`, '');
|
|
49
|
+
if (!relativePath) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const topicParts = relativePath.split('/');
|
|
53
|
+
if (this.deviceRegistry.has(relativePath)) {
|
|
54
|
+
this.handleDeviceStateMessage(relativePath, message);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (topicParts[0] === 'bridge') {
|
|
58
|
+
this.handleBridgeMessage(topicParts[1], message);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const lastPart = topicParts[topicParts.length - 1];
|
|
62
|
+
const pathWithoutSuffix = topicParts.slice(0, -1).join('/');
|
|
63
|
+
if (lastPart === 'availability' && pathWithoutSuffix) {
|
|
64
|
+
this.handleDeviceAvailabilityMessage(pathWithoutSuffix, message);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (lastPart === 'set' || lastPart === 'get') {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
this.handleDeviceStateMessage(relativePath, message);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
this.logger.warn(`Failed to handle message on topic ${topic}`, {
|
|
74
|
+
message: error instanceof Error ? error.message : String(error),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
handleBridgeMessage(subtopic, message) {
|
|
79
|
+
switch (subtopic) {
|
|
80
|
+
case 'state':
|
|
81
|
+
this.handleBridgeStateMessage(message);
|
|
82
|
+
break;
|
|
83
|
+
case 'devices':
|
|
84
|
+
this.handleBridgeDevicesMessage(message);
|
|
85
|
+
break;
|
|
86
|
+
case 'event':
|
|
87
|
+
this.handleBridgeEventMessage(message);
|
|
88
|
+
break;
|
|
89
|
+
case 'groups':
|
|
90
|
+
this.logger.debug('Received bridge/groups message (not implemented)');
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
handleBridgeStateMessage(message) {
|
|
95
|
+
try {
|
|
96
|
+
const state = JSON.parse(message);
|
|
97
|
+
const wasOnline = this.bridgeOnline;
|
|
98
|
+
this.bridgeOnline = state.state === 'online';
|
|
99
|
+
if (this.bridgeOnline && !wasOnline) {
|
|
100
|
+
this.logger.log('Zigbee2MQTT bridge is online');
|
|
101
|
+
void this.callbacks.onBridgeOnline?.();
|
|
102
|
+
}
|
|
103
|
+
else if (!this.bridgeOnline && wasOnline) {
|
|
104
|
+
this.logger.warn('Zigbee2MQTT bridge is offline');
|
|
105
|
+
void this.callbacks.onBridgeOffline?.();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
this.logger.warn('Failed to parse bridge/state message', {
|
|
110
|
+
message: error instanceof Error ? error.message : String(error),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
handleBridgeDevicesMessage(message) {
|
|
115
|
+
try {
|
|
116
|
+
const devices = JSON.parse(message);
|
|
117
|
+
this.logger.log(`Received device registry with ${devices.length} devices`);
|
|
118
|
+
for (const device of devices) {
|
|
119
|
+
if (device.definition) {
|
|
120
|
+
this.logger.debug(`Device ${device.friendly_name}: ${device.definition.exposes?.length ?? 0} exposes, ` +
|
|
121
|
+
`types: ${device.definition.exposes?.map((e) => e.type).join(', ') ?? 'none'}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
for (const device of devices) {
|
|
125
|
+
if (devices_zigbee2mqtt_constants_1.Z2M_IGNORED_DEVICE_TYPES.includes(device.type) ||
|
|
126
|
+
!device.supported ||
|
|
127
|
+
device.disabled) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
const existing = this.deviceRegistry.get(device.friendly_name);
|
|
131
|
+
const cachedState = this.stateCache.get(device.friendly_name) ?? {};
|
|
132
|
+
const registeredDevice = {
|
|
133
|
+
ieeeAddress: device.ieee_address,
|
|
134
|
+
friendlyName: device.friendly_name,
|
|
135
|
+
description: device.description,
|
|
136
|
+
type: device.type,
|
|
137
|
+
supported: device.supported,
|
|
138
|
+
disabled: device.disabled,
|
|
139
|
+
definition: device.definition,
|
|
140
|
+
powerSource: device.power_source,
|
|
141
|
+
modelId: device.model_id,
|
|
142
|
+
available: existing?.available ?? true,
|
|
143
|
+
lastSeen: existing?.lastSeen,
|
|
144
|
+
currentState: { ...(existing?.currentState ?? {}), ...cachedState },
|
|
145
|
+
};
|
|
146
|
+
this.deviceRegistry.set(device.friendly_name, registeredDevice);
|
|
147
|
+
if (Object.keys(cachedState).length > 0) {
|
|
148
|
+
this.logger.debug(`Applied cached state to "${device.friendly_name}": ${Object.keys(cachedState).join(', ')}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const currentFriendlyNames = new Set(devices.map((d) => d.friendly_name));
|
|
152
|
+
for (const friendlyName of this.deviceRegistry.keys()) {
|
|
153
|
+
if (!currentFriendlyNames.has(friendlyName)) {
|
|
154
|
+
this.deviceRegistry.delete(friendlyName);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
this.requestMissingStates();
|
|
158
|
+
const filteredDevices = devices.filter((d) => !devices_zigbee2mqtt_constants_1.Z2M_IGNORED_DEVICE_TYPES.includes(d.type) &&
|
|
159
|
+
d.supported &&
|
|
160
|
+
!d.disabled);
|
|
161
|
+
void this.callbacks.onDevicesReceived?.(filteredDevices);
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
this.logger.error('Failed to parse bridge/devices message', {
|
|
165
|
+
message: error instanceof Error ? error.message : String(error),
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
requestMissingStates() {
|
|
170
|
+
for (const [friendlyName, device] of this.deviceRegistry.entries()) {
|
|
171
|
+
if (Object.keys(device.currentState).length === 0) {
|
|
172
|
+
this.logger.debug(`Requesting state for device without current state: ${friendlyName}`);
|
|
173
|
+
this.requestState(friendlyName).catch(() => {
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
handleBridgeEventMessage(message) {
|
|
179
|
+
try {
|
|
180
|
+
const event = JSON.parse(message);
|
|
181
|
+
switch (event.type) {
|
|
182
|
+
case 'device_joined':
|
|
183
|
+
case 'device_announce':
|
|
184
|
+
this.logger.log(`Device joined: ${event.data.friendly_name}`);
|
|
185
|
+
void this.callbacks.onDeviceJoined?.(event.data.ieee_address ?? '', event.data.friendly_name ?? '');
|
|
186
|
+
break;
|
|
187
|
+
case 'device_leave':
|
|
188
|
+
this.logger.log(`Device left: ${event.data.friendly_name}`);
|
|
189
|
+
if (event.data.friendly_name) {
|
|
190
|
+
this.deviceRegistry.delete(event.data.friendly_name);
|
|
191
|
+
}
|
|
192
|
+
void this.callbacks.onDeviceLeft?.(event.data.ieee_address ?? '', event.data.friendly_name ?? '');
|
|
193
|
+
break;
|
|
194
|
+
case 'device_interview':
|
|
195
|
+
this.logger.debug(`Device interview: ${event.data.friendly_name} - ${event.data.status}`);
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
this.logger.warn('Failed to parse bridge/event message', {
|
|
201
|
+
message: error instanceof Error ? error.message : String(error),
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
handleDeviceStateMessage(friendlyName, message) {
|
|
206
|
+
try {
|
|
207
|
+
const state = JSON.parse(message);
|
|
208
|
+
this.logger.debug(`Received state for "${friendlyName}": ${Object.keys(state).join(', ')}`);
|
|
209
|
+
const existingCachedState = this.stateCache.get(friendlyName) ?? {};
|
|
210
|
+
this.stateCache.set(friendlyName, { ...existingCachedState, ...state });
|
|
211
|
+
const device = this.deviceRegistry.get(friendlyName);
|
|
212
|
+
if (device) {
|
|
213
|
+
device.currentState = { ...device.currentState, ...state };
|
|
214
|
+
device.lastSeen = new Date();
|
|
215
|
+
this.logger.debug(`Updated registry and cache for "${friendlyName}"`);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
this.logger.debug(`Updated cache for "${friendlyName}" (not yet in registry)`);
|
|
219
|
+
}
|
|
220
|
+
void this.callbacks.onDeviceStateChanged?.(friendlyName, state);
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
this.logger.warn(`Failed to parse state for device ${friendlyName}`, {
|
|
224
|
+
message: error instanceof Error ? error.message : String(error),
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
handleDeviceAvailabilityMessage(friendlyName, message) {
|
|
229
|
+
this.logger.debug(`Received availability for "${friendlyName}": ${message}`);
|
|
230
|
+
try {
|
|
231
|
+
let available;
|
|
232
|
+
try {
|
|
233
|
+
const availability = JSON.parse(message);
|
|
234
|
+
available = availability.state === 'online';
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
available = message === 'online';
|
|
238
|
+
}
|
|
239
|
+
const device = this.deviceRegistry.get(friendlyName);
|
|
240
|
+
if (device) {
|
|
241
|
+
device.available = available;
|
|
242
|
+
}
|
|
243
|
+
void this.callbacks.onDeviceAvailabilityChanged?.(friendlyName, available);
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
this.logger.warn(`Failed to parse availability for device ${friendlyName}`, {
|
|
247
|
+
message: error instanceof Error ? error.message : String(error),
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
clearReconnectTimer() {
|
|
252
|
+
if (this.reconnectTimer) {
|
|
253
|
+
clearTimeout(this.reconnectTimer);
|
|
254
|
+
this.reconnectTimer = null;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
resetState() {
|
|
258
|
+
this.connected = false;
|
|
259
|
+
this.bridgeOnline = false;
|
|
260
|
+
this.deviceRegistry.clear();
|
|
261
|
+
this.stateCache.clear();
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
exports.Z2mBaseClientAdapter = Z2mBaseClientAdapter;
|
|
265
|
+
//# sourceMappingURL=base-client-adapter.js.map
|