@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.
Files changed (86) hide show
  1. package/dist/migrations/1000000000000-InitialSetup.js +22 -12
  2. package/dist/migrations/1000000000000-InitialSetup.js.map +1 -1
  3. package/dist/modules/devices/services/devices-type-mapper.service.d.ts +1 -1
  4. package/dist/modules/devices/services/devices.service.d.ts +1 -0
  5. package/dist/modules/devices/services/devices.service.js +22 -23
  6. package/dist/modules/devices/services/devices.service.js.map +1 -1
  7. package/dist/modules/system/commands/update-panel.command.js +7 -12
  8. package/dist/modules/system/commands/update-panel.command.js.map +1 -1
  9. package/dist/modules/system/services/update.service.d.ts +2 -0
  10. package/dist/modules/system/services/update.service.js +37 -17
  11. package/dist/modules/system/services/update.service.js.map +1 -1
  12. package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.d.ts +11 -1
  13. package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.js +226 -49
  14. package/dist/plugins/devices-shelly-ng/delegates/delegates-manager.service.js.map +1 -1
  15. package/dist/plugins/devices-shelly-ng/devices-shelly-ng.constants.d.ts +5 -0
  16. package/dist/plugins/devices-shelly-ng/devices-shelly-ng.constants.js +10 -1
  17. package/dist/plugins/devices-shelly-ng/devices-shelly-ng.constants.js.map +1 -1
  18. package/dist/plugins/devices-shelly-ng/devices-shelly-ng.plugin.d.ts +5 -1
  19. package/dist/plugins/devices-shelly-ng/devices-shelly-ng.plugin.js +22 -3
  20. package/dist/plugins/devices-shelly-ng/devices-shelly-ng.plugin.js.map +1 -1
  21. package/dist/plugins/devices-shelly-ng/dto/create-device.dto.d.ts +1 -1
  22. package/dist/plugins/devices-shelly-ng/dto/create-device.dto.js +11 -12
  23. package/dist/plugins/devices-shelly-ng/dto/create-device.dto.js.map +1 -1
  24. package/dist/plugins/devices-shelly-ng/dto/update-device.dto.d.ts +2 -1
  25. package/dist/plugins/devices-shelly-ng/dto/update-device.dto.js +19 -4
  26. package/dist/plugins/devices-shelly-ng/dto/update-device.dto.js.map +1 -1
  27. package/dist/plugins/devices-shelly-ng/entities/devices-shelly-ng.entity.d.ts +6 -1
  28. package/dist/plugins/devices-shelly-ng/entities/devices-shelly-ng.entity.js +38 -6
  29. package/dist/plugins/devices-shelly-ng/entities/devices-shelly-ng.entity.js.map +1 -1
  30. package/dist/plugins/devices-shelly-ng/entities/shelly-ng-device-address.entity.d.ts +10 -0
  31. package/dist/plugins/devices-shelly-ng/entities/shelly-ng-device-address.entity.js +69 -0
  32. package/dist/plugins/devices-shelly-ng/entities/shelly-ng-device-address.entity.js.map +1 -0
  33. package/dist/plugins/devices-shelly-ng/services/database-discoverer.service.d.ts +3 -1
  34. package/dist/plugins/devices-shelly-ng/services/database-discoverer.service.js +19 -7
  35. package/dist/plugins/devices-shelly-ng/services/database-discoverer.service.js.map +1 -1
  36. package/dist/plugins/devices-shelly-ng/services/device-address.service.d.ts +22 -0
  37. package/dist/plugins/devices-shelly-ng/services/device-address.service.js +149 -0
  38. package/dist/plugins/devices-shelly-ng/services/device-address.service.js.map +1 -0
  39. package/dist/plugins/devices-shelly-ng/services/device-manager.service.d.ts +3 -1
  40. package/dist/plugins/devices-shelly-ng/services/device-manager.service.js +20 -7
  41. package/dist/plugins/devices-shelly-ng/services/device-manager.service.js.map +1 -1
  42. package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.js +18 -3
  43. package/dist/plugins/devices-shelly-ng/services/shelly-ng.service.js.map +1 -1
  44. package/dist/plugins/devices-shelly-ng/subscribers/device-entity.subscriber.d.ts +6 -2
  45. package/dist/plugins/devices-shelly-ng/subscribers/device-entity.subscriber.js +75 -6
  46. package/dist/plugins/devices-shelly-ng/subscribers/device-entity.subscriber.js.map +1 -1
  47. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.constants.d.ts +4 -0
  48. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.constants.js +5 -1
  49. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.constants.js.map +1 -1
  50. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.openapi.d.ts +2 -2
  51. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.openapi.js +2 -0
  52. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.openapi.js.map +1 -1
  53. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.plugin.js +11 -6
  54. package/dist/plugins/devices-zigbee2mqtt/devices-zigbee2mqtt.plugin.js.map +1 -1
  55. package/dist/plugins/devices-zigbee2mqtt/dto/update-config.dto.d.ts +10 -0
  56. package/dist/plugins/devices-zigbee2mqtt/dto/update-config.dto.js +117 -3
  57. package/dist/plugins/devices-zigbee2mqtt/dto/update-config.dto.js.map +1 -1
  58. package/dist/plugins/devices-zigbee2mqtt/interfaces/zigbee2mqtt.interface.d.ts +8 -0
  59. package/dist/plugins/devices-zigbee2mqtt/mappings/definitions/covers.yaml +5 -4
  60. package/dist/plugins/devices-zigbee2mqtt/models/config.model.d.ts +10 -0
  61. package/dist/plugins/devices-zigbee2mqtt/models/config.model.js +108 -3
  62. package/dist/plugins/devices-zigbee2mqtt/models/config.model.js.map +1 -1
  63. package/dist/plugins/devices-zigbee2mqtt/platforms/zigbee2mqtt.device.platform.d.ts +3 -4
  64. package/dist/plugins/devices-zigbee2mqtt/platforms/zigbee2mqtt.device.platform.js +11 -22
  65. package/dist/plugins/devices-zigbee2mqtt/platforms/zigbee2mqtt.device.platform.js.map +1 -1
  66. package/dist/plugins/devices-zigbee2mqtt/services/base-client-adapter.d.ts +35 -0
  67. package/dist/plugins/devices-zigbee2mqtt/services/base-client-adapter.js +265 -0
  68. package/dist/plugins/devices-zigbee2mqtt/services/base-client-adapter.js.map +1 -0
  69. package/dist/plugins/devices-zigbee2mqtt/services/device-mapper.service.js +6 -5
  70. package/dist/plugins/devices-zigbee2mqtt/services/device-mapper.service.js.map +1 -1
  71. package/dist/plugins/devices-zigbee2mqtt/services/mqtt-client-adapter.service.d.ts +4 -26
  72. package/dist/plugins/devices-zigbee2mqtt/services/mqtt-client-adapter.service.js +16 -265
  73. package/dist/plugins/devices-zigbee2mqtt/services/mqtt-client-adapter.service.js.map +1 -1
  74. package/dist/plugins/devices-zigbee2mqtt/services/virtual-property.types.js +0 -16
  75. package/dist/plugins/devices-zigbee2mqtt/services/virtual-property.types.js.map +1 -1
  76. package/dist/plugins/devices-zigbee2mqtt/services/ws-client-adapter.service.d.ts +14 -0
  77. package/dist/plugins/devices-zigbee2mqtt/services/ws-client-adapter.service.js +199 -0
  78. package/dist/plugins/devices-zigbee2mqtt/services/ws-client-adapter.service.js.map +1 -0
  79. package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt-config-validator.service.d.ts +2 -0
  80. package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt-config-validator.service.js +69 -0
  81. package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt-config-validator.service.js.map +1 -1
  82. package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt.service.d.ts +8 -1
  83. package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt.service.js +86 -32
  84. package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt.service.js.map +1 -1
  85. package/dist/tsconfig.build.tsbuildinfo +1 -1
  86. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"virtual-property.types.js","sourceRoot":"","sources":["../../../../src/plugins/devices-zigbee2mqtt/services/virtual-property.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"virtual-property.types.js","sourceRoot":"","sources":["../../../../src/plugins/devices-zigbee2mqtt/services/virtual-property.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Z2mSetPayload, Z2mWsConfig } from '../interfaces/zigbee2mqtt.interface';
2
+ import { Z2mBaseClientAdapter } from './base-client-adapter';
3
+ export declare class Z2mWsClientAdapterService extends Z2mBaseClientAdapter {
4
+ private ws;
5
+ private config;
6
+ constructor();
7
+ connect(config: Z2mWsConfig): Promise<void>;
8
+ disconnect(): Promise<void>;
9
+ publishCommand(friendlyName: string, payload: Z2mSetPayload): Promise<boolean>;
10
+ requestState(friendlyName: string, properties?: string[]): Promise<boolean>;
11
+ private buildWsUrl;
12
+ private handleWsMessage;
13
+ private scheduleReconnect;
14
+ }
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.Z2mWsClientAdapterService = void 0;
16
+ const ws_1 = __importDefault(require("ws"));
17
+ const common_1 = require("@nestjs/common");
18
+ const base_client_adapter_1 = require("./base-client-adapter");
19
+ let Z2mWsClientAdapterService = class Z2mWsClientAdapterService extends base_client_adapter_1.Z2mBaseClientAdapter {
20
+ constructor() {
21
+ super('WsClientAdapter');
22
+ this.ws = null;
23
+ this.config = null;
24
+ }
25
+ async connect(config) {
26
+ this.configBaseTopic = config.baseTopic;
27
+ this.clearReconnectTimer();
28
+ await this.disconnect();
29
+ this.config = config;
30
+ const wsUrl = this.buildWsUrl(config);
31
+ this.logger.log(`Connecting to Zigbee2MQTT WebSocket: ${wsUrl}`);
32
+ return new Promise((resolve, reject) => {
33
+ let settled = false;
34
+ try {
35
+ const timeoutId = setTimeout(() => {
36
+ if (!settled && !this.connected) {
37
+ settled = true;
38
+ this.logger.error('WebSocket connection timed out');
39
+ this.ws?.terminate();
40
+ this.ws = null;
41
+ reject(new Error('WebSocket connection timed out'));
42
+ }
43
+ }, config.connectTimeout);
44
+ this.ws = new ws_1.default(wsUrl);
45
+ this.ws.on('open', () => {
46
+ clearTimeout(timeoutId);
47
+ settled = true;
48
+ this.logger.log('Connected to Zigbee2MQTT WebSocket');
49
+ this.connected = true;
50
+ resolve();
51
+ });
52
+ this.ws.on('error', (error) => {
53
+ clearTimeout(timeoutId);
54
+ this.logger.error('WebSocket client error', {
55
+ message: error.message,
56
+ });
57
+ if (!settled && !this.connected) {
58
+ settled = true;
59
+ reject(error);
60
+ }
61
+ });
62
+ this.ws.on('close', () => {
63
+ clearTimeout(timeoutId);
64
+ const wasConnected = this.connected;
65
+ this.connected = false;
66
+ this.bridgeOnline = false;
67
+ this.ws = null;
68
+ this.logger.log('Disconnected from Zigbee2MQTT WebSocket');
69
+ if (wasConnected) {
70
+ this.scheduleReconnect();
71
+ }
72
+ });
73
+ this.ws.on('message', (data) => {
74
+ this.handleWsMessage(data);
75
+ });
76
+ }
77
+ catch (error) {
78
+ this.logger.error('Failed to create WebSocket client', {
79
+ message: error instanceof Error ? error.message : String(error),
80
+ });
81
+ reject(error instanceof Error ? error : new Error(String(error)));
82
+ }
83
+ });
84
+ }
85
+ async disconnect() {
86
+ this.clearReconnectTimer();
87
+ this.connected = false;
88
+ this.bridgeOnline = false;
89
+ this.config = null;
90
+ if (this.ws) {
91
+ this.logger.log('Disconnecting from Zigbee2MQTT WebSocket');
92
+ await new Promise((resolve) => {
93
+ if (!this.ws) {
94
+ resolve();
95
+ return;
96
+ }
97
+ const closingWs = this.ws;
98
+ closingWs.removeAllListeners();
99
+ const forceCloseTimer = setTimeout(() => {
100
+ closingWs.terminate();
101
+ if (this.ws === closingWs) {
102
+ this.ws = null;
103
+ }
104
+ resolve();
105
+ }, 2000);
106
+ closingWs.on('close', () => {
107
+ clearTimeout(forceCloseTimer);
108
+ if (this.ws === closingWs) {
109
+ this.ws = null;
110
+ }
111
+ resolve();
112
+ });
113
+ closingWs.close();
114
+ });
115
+ }
116
+ this.resetState();
117
+ }
118
+ async publishCommand(friendlyName, payload) {
119
+ if (!this.ws || !this.connected) {
120
+ this.logger.warn('Cannot publish: not connected to Zigbee2MQTT WebSocket');
121
+ return false;
122
+ }
123
+ const topic = `${friendlyName}/set`;
124
+ const message = { topic, payload };
125
+ this.logger.debug(`Sending WS command to ${topic}: ${JSON.stringify(payload)}`);
126
+ return new Promise((resolve) => {
127
+ this.ws?.send(JSON.stringify(message), (error) => {
128
+ if (error) {
129
+ this.logger.error(`Failed to send WS command to ${topic}`, {
130
+ message: error.message,
131
+ });
132
+ resolve(false);
133
+ }
134
+ else {
135
+ resolve(true);
136
+ }
137
+ });
138
+ });
139
+ }
140
+ async requestState(friendlyName, properties = []) {
141
+ if (!this.ws || !this.connected) {
142
+ return false;
143
+ }
144
+ const topic = `${friendlyName}/get`;
145
+ const payload = properties.length > 0 ? Object.fromEntries(properties.map((p) => [p, ''])) : { state: '' };
146
+ const message = { topic, payload };
147
+ return new Promise((resolve) => {
148
+ this.ws?.send(JSON.stringify(message), (error) => {
149
+ resolve(!error);
150
+ });
151
+ });
152
+ }
153
+ buildWsUrl(config) {
154
+ const protocol = config.secure ? 'wss' : 'ws';
155
+ return `${protocol}://${config.host}:${config.port}/api`;
156
+ }
157
+ handleWsMessage(data) {
158
+ try {
159
+ const raw = typeof data === 'string' ? data : Buffer.from(data).toString('utf-8');
160
+ const wsMessage = JSON.parse(raw);
161
+ if (!wsMessage.topic) {
162
+ this.logger.debug('Received WS message without topic, ignoring');
163
+ return;
164
+ }
165
+ const payloadStr = typeof wsMessage.payload === 'string' ? wsMessage.payload : JSON.stringify(wsMessage.payload);
166
+ this.handleMessage(wsMessage.topic, payloadStr, true);
167
+ }
168
+ catch (error) {
169
+ this.logger.warn('Failed to parse WebSocket message', {
170
+ message: error instanceof Error ? error.message : String(error),
171
+ });
172
+ }
173
+ }
174
+ scheduleReconnect() {
175
+ if (this.reconnectTimer || !this.config) {
176
+ return;
177
+ }
178
+ const interval = this.config.reconnectInterval;
179
+ this.logger.log(`Scheduling WebSocket reconnection in ${interval}ms`);
180
+ this.reconnectTimer = setTimeout(() => {
181
+ this.reconnectTimer = null;
182
+ if (!this.connected && this.config) {
183
+ this.connect(this.config).catch((error) => {
184
+ const errorMessage = error instanceof Error ? error.message : JSON.stringify(error);
185
+ this.logger.error('WebSocket reconnection failed', {
186
+ message: errorMessage,
187
+ });
188
+ this.scheduleReconnect();
189
+ });
190
+ }
191
+ }, interval);
192
+ }
193
+ };
194
+ exports.Z2mWsClientAdapterService = Z2mWsClientAdapterService;
195
+ exports.Z2mWsClientAdapterService = Z2mWsClientAdapterService = __decorate([
196
+ (0, common_1.Injectable)(),
197
+ __metadata("design:paramtypes", [])
198
+ ], Z2mWsClientAdapterService);
199
+ //# sourceMappingURL=ws-client-adapter.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-client-adapter.service.js","sourceRoot":"","sources":["../../../../src/plugins/devices-zigbee2mqtt/services/ws-client-adapter.service.ts"],"names":[],"mappings":"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"}
@@ -8,4 +8,6 @@ export declare class Zigbee2mqttConfigValidatorService implements IPluginConfigV
8
8
  constructor(pluginConfigValidator: PluginConfigValidatorService);
9
9
  onModuleInit(): void;
10
10
  validate(config: Record<string, unknown>): Promise<IConfigValidationResult>;
11
+ private validateMqtt;
12
+ private validateWs;
11
13
  }
@@ -8,9 +8,13 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
8
8
  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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
11
14
  Object.defineProperty(exports, "__esModule", { value: true });
12
15
  exports.Zigbee2mqttConfigValidatorService = void 0;
13
16
  const mqtt_1 = require("mqtt");
17
+ const ws_1 = __importDefault(require("ws"));
14
18
  const common_1 = require("@nestjs/common");
15
19
  const logger_1 = require("../../../common/logger");
16
20
  const plugin_config_validator_service_1 = require("../../../modules/config/services/plugin-config-validator.service");
@@ -25,6 +29,13 @@ let Zigbee2mqttConfigValidatorService = class Zigbee2mqttConfigValidatorService
25
29
  this.pluginConfigValidator.register(this);
26
30
  }
27
31
  async validate(config) {
32
+ const connectionType = config['connection_type'] || 'mqtt';
33
+ if (connectionType === 'ws') {
34
+ return this.validateWs(config);
35
+ }
36
+ return this.validateMqtt(config);
37
+ }
38
+ async validateMqtt(config) {
28
39
  const mqtt = config['mqtt'];
29
40
  if (!mqtt) {
30
41
  return { valid: false, errors: [{ message: 'MQTT configuration is required' }] };
@@ -93,6 +104,64 @@ let Zigbee2mqttConfigValidatorService = class Zigbee2mqttConfigValidatorService
93
104
  });
94
105
  });
95
106
  }
107
+ async validateWs(config) {
108
+ const wsConfig = config['ws'];
109
+ if (!wsConfig) {
110
+ return { valid: false, errors: [{ message: 'WebSocket configuration is required' }] };
111
+ }
112
+ const host = wsConfig['host'];
113
+ const port = wsConfig['port'] || 8080;
114
+ const secure = wsConfig['secure'] === true;
115
+ if (!host) {
116
+ return { valid: false, errors: [{ message: 'WebSocket host is required', field: 'ws.host' }] };
117
+ }
118
+ const protocol = secure ? 'wss' : 'ws';
119
+ const wsUrl = `${protocol}://${host}:${port}/api`;
120
+ return new Promise((resolve) => {
121
+ const timeoutMs = 10000;
122
+ let settled = false;
123
+ const settle = (result) => {
124
+ if (settled)
125
+ return;
126
+ settled = true;
127
+ try {
128
+ ws.terminate();
129
+ }
130
+ catch {
131
+ }
132
+ resolve(result);
133
+ };
134
+ const timer = setTimeout(() => {
135
+ settle({
136
+ valid: false,
137
+ errors: [
138
+ {
139
+ message: 'Connection timed out — check Zigbee2MQTT host and port',
140
+ field: 'ws.host',
141
+ },
142
+ ],
143
+ });
144
+ }, timeoutMs);
145
+ const ws = new ws_1.default(wsUrl);
146
+ ws.on('open', () => {
147
+ clearTimeout(timer);
148
+ settle({ valid: true });
149
+ });
150
+ ws.on('error', (err) => {
151
+ clearTimeout(timer);
152
+ this.logger.error(`WebSocket connection test failed: ${err.message}`);
153
+ settle({
154
+ valid: false,
155
+ errors: [
156
+ {
157
+ message: `Cannot connect to Zigbee2MQTT WebSocket: ${err.message}`,
158
+ field: 'ws.host',
159
+ },
160
+ ],
161
+ });
162
+ });
163
+ });
164
+ }
96
165
  };
97
166
  exports.Zigbee2mqttConfigValidatorService = Zigbee2mqttConfigValidatorService;
98
167
  exports.Zigbee2mqttConfigValidatorService = Zigbee2mqttConfigValidatorService = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"zigbee2mqtt-config-validator.service.js","sourceRoot":"","sources":["../../../../src/plugins/devices-zigbee2mqtt/services/zigbee2mqtt-config-validator.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"zigbee2mqtt-config-validator.service.js","sourceRoot":"","sources":["../../../../src/plugins/devices-zigbee2mqtt/services/zigbee2mqtt-config-validator.service.ts"],"names":[],"mappings":"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"}
@@ -3,11 +3,14 @@ import { DeviceConnectivityService } from '../../../modules/devices/services/dev
3
3
  import { DevicesService } from '../../../modules/devices/services/devices.service';
4
4
  import { ConfigChangeResult, IManagedPluginService, ServiceState } from '../../../modules/extensions/services/managed-plugin-service.interface';
5
5
  import { PluginServiceManagerService } from '../../../modules/extensions/services/plugin-service-manager.service';
6
+ import { Z2mBaseClientAdapter } from './base-client-adapter';
6
7
  import { Z2mDeviceMapperService } from './device-mapper.service';
7
8
  import { Z2mMqttClientAdapterService } from './mqtt-client-adapter.service';
9
+ import { Z2mWsClientAdapterService } from './ws-client-adapter.service';
8
10
  export declare class Zigbee2mqttService implements IManagedPluginService {
9
11
  private readonly configService;
10
12
  private readonly mqttAdapter;
13
+ private readonly wsAdapter;
11
14
  private readonly deviceMapper;
12
15
  private readonly devicesService;
13
16
  private readonly deviceConnectivityService;
@@ -23,7 +26,9 @@ export declare class Zigbee2mqttService implements IManagedPluginService {
23
26
  private pendingDevices;
24
27
  private isSyncing;
25
28
  private transformersRestored;
26
- constructor(configService: ConfigService, mqttAdapter: Z2mMqttClientAdapterService, deviceMapper: Z2mDeviceMapperService, devicesService: DevicesService, deviceConnectivityService: DeviceConnectivityService, pluginServiceManager: PluginServiceManagerService);
29
+ private activeAdapter;
30
+ constructor(configService: ConfigService, mqttAdapter: Z2mMqttClientAdapterService, wsAdapter: Z2mWsClientAdapterService, deviceMapper: Z2mDeviceMapperService, devicesService: DevicesService, deviceConnectivityService: DeviceConnectivityService, pluginServiceManager: PluginServiceManagerService);
31
+ getActiveAdapter(): Z2mBaseClientAdapter;
27
32
  start(): Promise<void>;
28
33
  stop(): Promise<void>;
29
34
  getState(): ServiceState;
@@ -36,7 +41,9 @@ export declare class Zigbee2mqttService implements IManagedPluginService {
36
41
  private initialize;
37
42
  private doStart;
38
43
  private doStop;
44
+ private registerCallbacks;
39
45
  private buildMqttConfig;
46
+ private buildWsConfig;
40
47
  private handleBridgeOnline;
41
48
  private handleBridgeOffline;
42
49
  private handleDevicesReceived;
@@ -20,10 +20,12 @@ const plugin_service_manager_service_1 = require("../../../modules/extensions/se
20
20
  const devices_zigbee2mqtt_constants_1 = require("../devices-zigbee2mqtt.constants");
21
21
  const device_mapper_service_1 = require("./device-mapper.service");
22
22
  const mqtt_client_adapter_service_1 = require("./mqtt-client-adapter.service");
23
+ const ws_client_adapter_service_1 = require("./ws-client-adapter.service");
23
24
  let Zigbee2mqttService = class Zigbee2mqttService {
24
- constructor(configService, mqttAdapter, deviceMapper, devicesService, deviceConnectivityService, pluginServiceManager) {
25
+ constructor(configService, mqttAdapter, wsAdapter, deviceMapper, devicesService, deviceConnectivityService, pluginServiceManager) {
25
26
  this.configService = configService;
26
27
  this.mqttAdapter = mqttAdapter;
28
+ this.wsAdapter = wsAdapter;
27
29
  this.deviceMapper = deviceMapper;
28
30
  this.devicesService = devicesService;
29
31
  this.deviceConnectivityService = deviceConnectivityService;
@@ -39,15 +41,11 @@ let Zigbee2mqttService = class Zigbee2mqttService {
39
41
  this.pendingDevices = null;
40
42
  this.isSyncing = false;
41
43
  this.transformersRestored = false;
42
- this.mqttAdapter.setCallbacks({
43
- onBridgeOnline: () => this.handleBridgeOnline(),
44
- onBridgeOffline: () => this.handleBridgeOffline(),
45
- onDevicesReceived: (devices) => this.handleDevicesReceived(devices),
46
- onDeviceStateChanged: (friendlyName, state) => this.handleDeviceStateChanged(friendlyName, state),
47
- onDeviceAvailabilityChanged: (friendlyName, available) => this.handleDeviceAvailabilityChanged(friendlyName, available),
48
- onDeviceJoined: (ieeeAddress, friendlyName) => this.handleDeviceJoined(ieeeAddress, friendlyName),
49
- onDeviceLeft: (ieeeAddress, friendlyName) => this.handleDeviceLeft(ieeeAddress, friendlyName),
50
- });
44
+ this.activeAdapter = this.mqttAdapter;
45
+ this.registerCallbacks(this.activeAdapter);
46
+ }
47
+ getActiveAdapter() {
48
+ return this.activeAdapter;
51
49
  }
52
50
  async start() {
53
51
  await this.withLock(async () => {
@@ -99,21 +97,39 @@ let Zigbee2mqttService = class Zigbee2mqttService {
99
97
  if (this.state === 'started' && this.pluginConfig) {
100
98
  const oldConfig = this.pluginConfig;
101
99
  const newConfig = this.configService.getPluginConfig(devices_zigbee2mqtt_constants_1.DEVICES_ZIGBEE2MQTT_PLUGIN_NAME);
102
- const mqttChanged = oldConfig.mqtt.host !== newConfig.mqtt.host ||
103
- oldConfig.mqtt.port !== newConfig.mqtt.port ||
104
- oldConfig.mqtt.username !== newConfig.mqtt.username ||
105
- oldConfig.mqtt.password !== newConfig.mqtt.password ||
106
- oldConfig.mqtt.baseTopic !== newConfig.mqtt.baseTopic ||
107
- oldConfig.mqtt.clientId !== newConfig.mqtt.clientId;
108
- const tlsChanged = oldConfig.tls.enabled !== newConfig.tls.enabled ||
109
- oldConfig.tls.rejectUnauthorized !== newConfig.tls.rejectUnauthorized ||
110
- oldConfig.tls.ca !== newConfig.tls.ca ||
111
- oldConfig.tls.cert !== newConfig.tls.cert ||
112
- oldConfig.tls.key !== newConfig.tls.key;
113
- if (mqttChanged || tlsChanged) {
114
- this.logger.log('Config changed, restart required');
100
+ if (oldConfig.connectionType !== newConfig.connectionType) {
101
+ this.logger.log('Connection type changed, restart required');
115
102
  return Promise.resolve({ restartRequired: true });
116
103
  }
104
+ if (newConfig.connectionType === 'mqtt') {
105
+ const mqttChanged = oldConfig.mqtt.host !== newConfig.mqtt.host ||
106
+ oldConfig.mqtt.port !== newConfig.mqtt.port ||
107
+ oldConfig.mqtt.username !== newConfig.mqtt.username ||
108
+ oldConfig.mqtt.password !== newConfig.mqtt.password ||
109
+ oldConfig.mqtt.baseTopic !== newConfig.mqtt.baseTopic ||
110
+ oldConfig.mqtt.clientId !== newConfig.mqtt.clientId;
111
+ const tlsChanged = oldConfig.tls.enabled !== newConfig.tls.enabled ||
112
+ oldConfig.tls.rejectUnauthorized !== newConfig.tls.rejectUnauthorized ||
113
+ oldConfig.tls.ca !== newConfig.tls.ca ||
114
+ oldConfig.tls.cert !== newConfig.tls.cert ||
115
+ oldConfig.tls.key !== newConfig.tls.key;
116
+ if (mqttChanged || tlsChanged) {
117
+ this.logger.log('MQTT config changed, restart required');
118
+ return Promise.resolve({ restartRequired: true });
119
+ }
120
+ }
121
+ else {
122
+ const wsChanged = oldConfig.ws.host !== newConfig.ws.host ||
123
+ oldConfig.ws.port !== newConfig.ws.port ||
124
+ oldConfig.ws.baseTopic !== newConfig.ws.baseTopic ||
125
+ oldConfig.ws.secure !== newConfig.ws.secure ||
126
+ oldConfig.ws.connectTimeout !== newConfig.ws.connectTimeout ||
127
+ oldConfig.ws.reconnectInterval !== newConfig.ws.reconnectInterval;
128
+ if (wsChanged) {
129
+ this.logger.log('WebSocket config changed, restart required');
130
+ return Promise.resolve({ restartRequired: true });
131
+ }
132
+ }
117
133
  return Promise.resolve({ restartRequired: false });
118
134
  }
119
135
  this.pluginConfig = null;
@@ -126,16 +142,16 @@ let Zigbee2mqttService = class Zigbee2mqttService {
126
142
  }
127
143
  }
128
144
  isBridgeOnline() {
129
- return this.mqttAdapter.isBridgeOnline();
145
+ return this.activeAdapter.isBridgeOnline();
130
146
  }
131
147
  getRegisteredDevices() {
132
- return this.mqttAdapter.getRegisteredDevices();
148
+ return this.activeAdapter.getRegisteredDevices();
133
149
  }
134
150
  async requestDeviceState(friendlyName) {
135
- return this.mqttAdapter.requestState(friendlyName);
151
+ return this.activeAdapter.requestState(friendlyName);
136
152
  }
137
153
  getCachedState(friendlyName) {
138
- return this.mqttAdapter.getCachedState(friendlyName);
154
+ return this.activeAdapter.getCachedState(friendlyName);
139
155
  }
140
156
  async initialize() {
141
157
  const devices = await this.devicesService.findAll(devices_zigbee2mqtt_constants_1.DEVICES_ZIGBEE2MQTT_TYPE);
@@ -149,8 +165,23 @@ let Zigbee2mqttService = class Zigbee2mqttService {
149
165
  this.state = 'starting';
150
166
  this.logger.log('Starting Zigbee2MQTT plugin service');
151
167
  try {
152
- const mqttConfig = this.buildMqttConfig();
153
- await this.mqttAdapter.connect(mqttConfig);
168
+ const config = this.config;
169
+ const previousAdapter = this.activeAdapter;
170
+ this.activeAdapter = config.connectionType === 'ws' ? this.wsAdapter : this.mqttAdapter;
171
+ if (this.activeAdapter !== previousAdapter) {
172
+ previousAdapter.setCallbacks({});
173
+ this.registerCallbacks(this.activeAdapter);
174
+ }
175
+ if (config.connectionType === 'ws') {
176
+ const wsConfig = this.buildWsConfig();
177
+ this.logger.log('Using WebSocket connection to Zigbee2MQTT');
178
+ await this.activeAdapter.connect(wsConfig);
179
+ }
180
+ else {
181
+ const mqttConfig = this.buildMqttConfig();
182
+ this.logger.log('Using MQTT connection to Zigbee2MQTT');
183
+ await this.activeAdapter.connect(mqttConfig);
184
+ }
154
185
  this.logger.log('Zigbee2MQTT plugin service started successfully');
155
186
  this.state = 'started';
156
187
  }
@@ -168,7 +199,7 @@ let Zigbee2mqttService = class Zigbee2mqttService {
168
199
  this.transformersRestored = false;
169
200
  this.logger.log('Stopping Zigbee2MQTT plugin service');
170
201
  try {
171
- await this.mqttAdapter.disconnect();
202
+ await this.activeAdapter.disconnect();
172
203
  const devices = await this.devicesService.findAll(devices_zigbee2mqtt_constants_1.DEVICES_ZIGBEE2MQTT_TYPE);
173
204
  for (const device of devices) {
174
205
  await this.deviceConnectivityService.setConnectionState(device.id, {
@@ -185,6 +216,17 @@ let Zigbee2mqttService = class Zigbee2mqttService {
185
216
  this.state = 'stopped';
186
217
  }
187
218
  }
219
+ registerCallbacks(adapter) {
220
+ adapter.setCallbacks({
221
+ onBridgeOnline: () => this.handleBridgeOnline(),
222
+ onBridgeOffline: () => this.handleBridgeOffline(),
223
+ onDevicesReceived: (devices) => this.handleDevicesReceived(devices),
224
+ onDeviceStateChanged: (friendlyName, state) => this.handleDeviceStateChanged(friendlyName, state),
225
+ onDeviceAvailabilityChanged: (friendlyName, available) => this.handleDeviceAvailabilityChanged(friendlyName, available),
226
+ onDeviceJoined: (ieeeAddress, friendlyName) => this.handleDeviceJoined(ieeeAddress, friendlyName),
227
+ onDeviceLeft: (ieeeAddress, friendlyName) => this.handleDeviceLeft(ieeeAddress, friendlyName),
228
+ });
229
+ }
188
230
  buildMqttConfig() {
189
231
  const config = this.config;
190
232
  return {
@@ -209,6 +251,17 @@ let Zigbee2mqttService = class Zigbee2mqttService {
209
251
  : undefined,
210
252
  };
211
253
  }
254
+ buildWsConfig() {
255
+ const config = this.config;
256
+ return {
257
+ host: config.ws.host,
258
+ port: config.ws.port,
259
+ baseTopic: config.ws.baseTopic,
260
+ secure: config.ws.secure,
261
+ connectTimeout: config.ws.connectTimeout,
262
+ reconnectInterval: config.ws.reconnectInterval,
263
+ };
264
+ }
212
265
  async handleBridgeOnline() {
213
266
  this.logger.log('Bridge is online');
214
267
  this.bridgeOnline = true;
@@ -249,12 +302,12 @@ let Zigbee2mqttService = class Zigbee2mqttService {
249
302
  this.pendingDevices = devices;
250
303
  return;
251
304
  }
252
- const registeredDevices = this.mqttAdapter.getRegisteredDevices();
305
+ const registeredDevices = this.activeAdapter.getRegisteredDevices();
253
306
  await this.deviceMapper.restoreTransformersForExistingDevices(registeredDevices);
254
307
  this.transformersRestored = true;
255
308
  const existingDevices = await this.devicesService.findAll(devices_zigbee2mqtt_constants_1.DEVICES_ZIGBEE2MQTT_TYPE);
256
309
  for (const device of existingDevices) {
257
- const cachedState = this.mqttAdapter.getCachedState(device.identifier);
310
+ const cachedState = this.activeAdapter.getCachedState(device.identifier);
258
311
  if (Object.keys(cachedState).length > 0) {
259
312
  try {
260
313
  await this.deviceMapper.updateDeviceState(device.identifier, cachedState);
@@ -369,6 +422,7 @@ exports.Zigbee2mqttService = Zigbee2mqttService = __decorate([
369
422
  (0, common_1.Injectable)(),
370
423
  __metadata("design:paramtypes", [config_service_1.ConfigService,
371
424
  mqtt_client_adapter_service_1.Z2mMqttClientAdapterService,
425
+ ws_client_adapter_service_1.Z2mWsClientAdapterService,
372
426
  device_mapper_service_1.Z2mDeviceMapperService,
373
427
  devices_service_1.DevicesService,
374
428
  device_connectivity_service_1.DeviceConnectivityService,