@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"virtual-property.types.js","sourceRoot":"","sources":["../../../../src/plugins/devices-zigbee2mqtt/services/virtual-property.types.ts"],"names":[],"mappings":";;;
|
|
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([
|
package/dist/plugins/devices-zigbee2mqtt/services/zigbee2mqtt-config-validator.service.js.map
CHANGED
|
@@ -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":"
|
|
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
|
-
|
|
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
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
103
|
-
|
|
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.
|
|
145
|
+
return this.activeAdapter.isBridgeOnline();
|
|
130
146
|
}
|
|
131
147
|
getRegisteredDevices() {
|
|
132
|
-
return this.
|
|
148
|
+
return this.activeAdapter.getRegisteredDevices();
|
|
133
149
|
}
|
|
134
150
|
async requestDeviceState(friendlyName) {
|
|
135
|
-
return this.
|
|
151
|
+
return this.activeAdapter.requestState(friendlyName);
|
|
136
152
|
}
|
|
137
153
|
getCachedState(friendlyName) {
|
|
138
|
-
return this.
|
|
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
|
|
153
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|