homebridge-plugin-klares4 1.1.7-beta1

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 (65) hide show
  1. package/CHANGELOG.md +238 -0
  2. package/LICENSE +21 -0
  3. package/README.md +495 -0
  4. package/config.schema.json +801 -0
  5. package/dist/accessories/cover-accessory.d.ts +26 -0
  6. package/dist/accessories/cover-accessory.d.ts.map +1 -0
  7. package/dist/accessories/cover-accessory.js +134 -0
  8. package/dist/accessories/cover-accessory.js.map +1 -0
  9. package/dist/accessories/gate-accessory.d.ts +20 -0
  10. package/dist/accessories/gate-accessory.d.ts.map +1 -0
  11. package/dist/accessories/gate-accessory.js +70 -0
  12. package/dist/accessories/gate-accessory.js.map +1 -0
  13. package/dist/accessories/light-accessory.d.ts +20 -0
  14. package/dist/accessories/light-accessory.d.ts.map +1 -0
  15. package/dist/accessories/light-accessory.js +81 -0
  16. package/dist/accessories/light-accessory.js.map +1 -0
  17. package/dist/accessories/scenario-accessory.d.ts +17 -0
  18. package/dist/accessories/scenario-accessory.d.ts.map +1 -0
  19. package/dist/accessories/scenario-accessory.js +59 -0
  20. package/dist/accessories/scenario-accessory.js.map +1 -0
  21. package/dist/accessories/sensor-accessory.d.ts +28 -0
  22. package/dist/accessories/sensor-accessory.d.ts.map +1 -0
  23. package/dist/accessories/sensor-accessory.js +141 -0
  24. package/dist/accessories/sensor-accessory.js.map +1 -0
  25. package/dist/accessories/thermostat-accessory.d.ts +25 -0
  26. package/dist/accessories/thermostat-accessory.d.ts.map +1 -0
  27. package/dist/accessories/thermostat-accessory.js +228 -0
  28. package/dist/accessories/thermostat-accessory.js.map +1 -0
  29. package/dist/accessories/zone-accessory.d.ts +22 -0
  30. package/dist/accessories/zone-accessory.d.ts.map +1 -0
  31. package/dist/accessories/zone-accessory.js +99 -0
  32. package/dist/accessories/zone-accessory.js.map +1 -0
  33. package/dist/debug-capture.d.ts +45 -0
  34. package/dist/debug-capture.d.ts.map +1 -0
  35. package/dist/debug-capture.js +294 -0
  36. package/dist/debug-capture.js.map +1 -0
  37. package/dist/index.d.ts +4 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +7 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/log-levels.d.ts +28 -0
  42. package/dist/log-levels.d.ts.map +1 -0
  43. package/dist/log-levels.js +48 -0
  44. package/dist/log-levels.js.map +1 -0
  45. package/dist/mqtt-bridge.d.ts +33 -0
  46. package/dist/mqtt-bridge.d.ts.map +1 -0
  47. package/dist/mqtt-bridge.js +397 -0
  48. package/dist/mqtt-bridge.js.map +1 -0
  49. package/dist/platform.d.ts +90 -0
  50. package/dist/platform.d.ts.map +1 -0
  51. package/dist/platform.js +517 -0
  52. package/dist/platform.js.map +1 -0
  53. package/dist/settings.d.ts +3 -0
  54. package/dist/settings.d.ts.map +1 -0
  55. package/dist/settings.js +6 -0
  56. package/dist/settings.js.map +1 -0
  57. package/dist/types.d.ts +284 -0
  58. package/dist/types.d.ts.map +1 -0
  59. package/dist/types.js +81 -0
  60. package/dist/types.js.map +1 -0
  61. package/dist/websocket-client.d.ts +69 -0
  62. package/dist/websocket-client.d.ts.map +1 -0
  63. package/dist/websocket-client.js +1068 -0
  64. package/dist/websocket-client.js.map +1 -0
  65. package/package.json +63 -0
@@ -0,0 +1,397 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MqttBridge = void 0;
37
+ const mqtt = __importStar(require("mqtt"));
38
+ const types_1 = require("./types");
39
+ /**
40
+ * MQTT Bridge for Ksenia Lares4
41
+ * Publishes device states and receives commands via MQTT
42
+ */
43
+ class MqttBridge {
44
+ constructor(config, log, platform) {
45
+ this.config = config;
46
+ this.log = log;
47
+ this.platform = platform;
48
+ this.topicPrefix = config.topicPrefix ?? 'homebridge/klares4';
49
+ if (config.enabled) {
50
+ this.connect();
51
+ }
52
+ }
53
+ connect() {
54
+ if (!this.config.broker) {
55
+ this.log.warn('MQTT: Broker not configured');
56
+ return;
57
+ }
58
+ const options = {
59
+ port: this.config.port ?? 1883,
60
+ clientId: this.config.clientId ??
61
+ `homebridge-klares4-${Math.random().toString(16).substring(2, 10)}`,
62
+ clean: true,
63
+ reconnectPeriod: 5000,
64
+ connectTimeout: 30000,
65
+ };
66
+ if (this.config.username && this.config.password) {
67
+ options.username = this.config.username;
68
+ options.password = this.config.password;
69
+ }
70
+ try {
71
+ this.client = mqtt.connect(this.config.broker, options);
72
+ this.setupEventHandlers();
73
+ }
74
+ catch (error) {
75
+ this.log.error('MQTT: Connection error:', error instanceof Error ? error.message : String(error));
76
+ }
77
+ }
78
+ setupEventHandlers() {
79
+ if (!this.client)
80
+ return;
81
+ this.client.on('connect', () => {
82
+ this.log.info('MQTT: Connected to broker', this.config.broker);
83
+ this.subscribeToCommands();
84
+ });
85
+ this.client.on('error', (error) => {
86
+ this.log.error('MQTT: Error:', error.message);
87
+ });
88
+ this.client.on('reconnect', () => {
89
+ this.log.info('MQTT: Reconnecting...');
90
+ });
91
+ this.client.on('offline', () => {
92
+ this.log.warn('MQTT: Disconnected');
93
+ });
94
+ this.client.on('message', (topic, payload) => {
95
+ this.handleIncomingMessage(topic, payload.toString());
96
+ });
97
+ }
98
+ subscribeToCommands() {
99
+ if (!this.client)
100
+ return;
101
+ const directCommandTopic = `${this.topicPrefix}/+/+/set`;
102
+ const roomCommandTopic = `${this.topicPrefix}/+/+/+/set`;
103
+ this.client.subscribe([directCommandTopic, roomCommandTopic], { qos: this.config.qos ?? 1 }, (error) => {
104
+ if (error) {
105
+ this.log.error('MQTT: Subscription error:', error.message);
106
+ }
107
+ else {
108
+ this.log.info('MQTT: Subscribed to commands:', [
109
+ directCommandTopic,
110
+ roomCommandTopic,
111
+ ]);
112
+ }
113
+ });
114
+ }
115
+ handleIncomingMessage(topic, payload) {
116
+ try {
117
+ const topicParts = topic.split('/');
118
+ let deviceType;
119
+ let deviceIdentifier;
120
+ if (topicParts.length === 5 && topicParts[4] === 'set') {
121
+ deviceType = topicParts[2];
122
+ deviceIdentifier = topicParts[3];
123
+ }
124
+ else if (topicParts.length === 6 && topicParts[5] === 'set') {
125
+ deviceType = topicParts[3];
126
+ deviceIdentifier = topicParts[4];
127
+ }
128
+ else {
129
+ this.log.warn('MQTT: Invalid topic format:', topic);
130
+ return;
131
+ }
132
+ this.log.debug(`MQTT: Command received - Type: ${deviceType}, Identifier: ${deviceIdentifier}, Payload: ${payload}`);
133
+ this.executeCommand(deviceType, deviceIdentifier, payload);
134
+ }
135
+ catch (error) {
136
+ this.log.error('MQTT: Message processing error:', error instanceof Error ? error.message : String(error));
137
+ }
138
+ }
139
+ executeCommand(deviceType, deviceIdentifier, payload) {
140
+ try {
141
+ const command = JSON.parse(payload);
142
+ const accessory = this.findAccessoryByDevice(deviceType, deviceIdentifier);
143
+ if (!accessory) {
144
+ this.log.warn(`MQTT: Accessory not found - Type: ${deviceType}, Identifier: ${deviceIdentifier}`);
145
+ return;
146
+ }
147
+ switch (deviceType) {
148
+ case 'light':
149
+ if ((0, types_1.isMqttLightCommand)(command)) {
150
+ this.handleLightCommand(accessory, command);
151
+ }
152
+ break;
153
+ case 'cover':
154
+ if ((0, types_1.isMqttCoverCommand)(command)) {
155
+ this.handleCoverCommand(accessory, command);
156
+ }
157
+ break;
158
+ case 'thermostat':
159
+ if ((0, types_1.isMqttThermostatCommand)(command)) {
160
+ this.handleThermostatCommand(accessory, command);
161
+ }
162
+ break;
163
+ case 'scenario':
164
+ if ((0, types_1.isMqttScenarioCommand)(command)) {
165
+ this.handleScenarioCommand(accessory, command);
166
+ }
167
+ break;
168
+ default:
169
+ this.log.warn(`MQTT: Unsupported device type for commands: ${deviceType}`);
170
+ }
171
+ }
172
+ catch (error) {
173
+ this.log.error('MQTT: Command execution error:', error instanceof Error ? error.message : String(error));
174
+ }
175
+ }
176
+ findAccessoryByDevice(deviceType, deviceIdentifier) {
177
+ for (const [, handler] of this.platform.accessoryHandlers) {
178
+ const device = this.getDeviceFromHandler(handler);
179
+ if (device && device.type === deviceType) {
180
+ const deviceSlug = this.createDeviceSlug(device.name);
181
+ if (device.id === deviceIdentifier || deviceSlug === deviceIdentifier) {
182
+ return handler;
183
+ }
184
+ }
185
+ }
186
+ return null;
187
+ }
188
+ getDeviceFromHandler(handler) {
189
+ if ('device' in handler && handler.device) {
190
+ return handler.device;
191
+ }
192
+ return undefined;
193
+ }
194
+ handleLightCommand(accessory, command) {
195
+ if (command.on !== undefined) {
196
+ accessory.setOn(command.on).catch((error) => {
197
+ this.log.error('MQTT: Light command error:', error instanceof Error ? error.message : String(error));
198
+ });
199
+ this.log.info(`MQTT: Light -> ${command.on ? 'ON' : 'OFF'}`);
200
+ }
201
+ if (command.brightness !== undefined && 'setBrightness' in accessory) {
202
+ accessory.setBrightness(command.brightness).catch((error) => {
203
+ this.log.error('MQTT: Brightness command error:', error instanceof Error ? error.message : String(error));
204
+ });
205
+ this.log.info(`MQTT: Brightness -> ${command.brightness}%`);
206
+ }
207
+ }
208
+ handleCoverCommand(accessory, command) {
209
+ if (command.position !== undefined) {
210
+ accessory.setTargetPosition(command.position).catch((error) => {
211
+ this.log.error('MQTT: Cover command error:', error instanceof Error ? error.message : String(error));
212
+ });
213
+ this.log.info(`MQTT: Cover -> ${command.position}%`);
214
+ }
215
+ }
216
+ handleThermostatCommand(accessory, command) {
217
+ if (command.targetTemperature !== undefined) {
218
+ accessory.setTargetTemperature(command.targetTemperature).catch((error) => {
219
+ this.log.error('MQTT: Thermostat temperature error:', error instanceof Error ? error.message : String(error));
220
+ });
221
+ this.log.info(`MQTT: Thermostat -> ${command.targetTemperature}C`);
222
+ }
223
+ if (command.mode !== undefined) {
224
+ accessory
225
+ .setTargetHeatingCoolingState(this.getModeValue(command.mode))
226
+ .catch((error) => {
227
+ this.log.error('MQTT: Thermostat mode error:', error instanceof Error ? error.message : String(error));
228
+ });
229
+ this.log.info(`MQTT: Thermostat mode -> ${command.mode}`);
230
+ }
231
+ }
232
+ handleScenarioCommand(accessory, command) {
233
+ if (command.active !== undefined && command.active) {
234
+ accessory.setOn(true).catch((error) => {
235
+ this.log.error('MQTT: Scenario command error:', error instanceof Error ? error.message : String(error));
236
+ });
237
+ this.log.info('MQTT: Scenario -> Activated');
238
+ }
239
+ }
240
+ getModeValue(mode) {
241
+ switch (mode) {
242
+ case 'off':
243
+ return 0;
244
+ case 'heat':
245
+ return 1;
246
+ case 'cool':
247
+ return 2;
248
+ case 'auto':
249
+ return 3;
250
+ default:
251
+ return 0;
252
+ }
253
+ }
254
+ createDeviceSlug(deviceName) {
255
+ return deviceName
256
+ .toLowerCase()
257
+ .replace(/\s+/g, '_')
258
+ .replace(/[àáâãäå]/g, 'a')
259
+ .replace(/[èéêë]/g, 'e')
260
+ .replace(/[ìíîï]/g, 'i')
261
+ .replace(/[òóôõö]/g, 'o')
262
+ .replace(/[ùúûü]/g, 'u')
263
+ .replace(/[ç]/g, 'c')
264
+ .replace(/[^a-z0-9_]/g, '')
265
+ .replace(/_+/g, '_')
266
+ .replace(/^_|_$/g, '');
267
+ }
268
+ getRoomForDevice(deviceId) {
269
+ if (!this.platform.config.roomMapping?.enabled) {
270
+ return null;
271
+ }
272
+ if (this.platform.config.roomMapping.rooms) {
273
+ for (const room of this.platform.config.roomMapping.rooms) {
274
+ if (room.devices) {
275
+ for (const device of room.devices) {
276
+ if (device.deviceId === deviceId) {
277
+ return room.roomName;
278
+ }
279
+ }
280
+ }
281
+ }
282
+ }
283
+ return null;
284
+ }
285
+ publishDeviceState(device) {
286
+ if (!this.client || !this.config.enabled)
287
+ return;
288
+ const room = this.getRoomForDevice(device.id);
289
+ const deviceSlug = this.createDeviceSlug(device.name);
290
+ let topic;
291
+ if (room) {
292
+ topic = `${this.topicPrefix}/${room}/${device.type}/${deviceSlug}/state`;
293
+ }
294
+ else {
295
+ topic = `${this.topicPrefix}/${device.type}/${deviceSlug}/state`;
296
+ }
297
+ const payload = this.createStatePayload(device);
298
+ this.client.publish(topic, JSON.stringify(payload), {
299
+ qos: this.config.qos ?? 1,
300
+ retain: this.config.retain ?? true,
301
+ }, (error) => {
302
+ if (error) {
303
+ this.log.error('MQTT: Publish error:', error.message);
304
+ }
305
+ else {
306
+ const topicPath = room
307
+ ? `${room}/${device.type}/${deviceSlug}`
308
+ : `${device.type}/${deviceSlug}`;
309
+ this.log.debug(`MQTT: Published state ${topicPath}`);
310
+ }
311
+ });
312
+ }
313
+ createStatePayload(device) {
314
+ const basePayload = {
315
+ id: device.id,
316
+ name: device.name,
317
+ type: device.type,
318
+ timestamp: new Date().toISOString(),
319
+ };
320
+ switch (device.type) {
321
+ case 'light': {
322
+ const light = device;
323
+ const lightPayload = {
324
+ ...basePayload,
325
+ on: light.status?.on ?? false,
326
+ brightness: light.status?.brightness ?? 0,
327
+ dimmable: light.status?.dimmable ?? false,
328
+ };
329
+ return lightPayload;
330
+ }
331
+ case 'cover': {
332
+ const cover = device;
333
+ const coverPayload = {
334
+ ...basePayload,
335
+ position: cover.status?.position ?? 0,
336
+ state: cover.status?.state ?? 'stopped',
337
+ };
338
+ return coverPayload;
339
+ }
340
+ case 'thermostat': {
341
+ const thermostat = device;
342
+ const thermostatPayload = {
343
+ ...basePayload,
344
+ currentTemperature: thermostat.currentTemperature ?? 0,
345
+ targetTemperature: thermostat.targetTemperature ?? 20,
346
+ mode: thermostat.mode ?? 'off',
347
+ humidity: thermostat.humidity,
348
+ };
349
+ return thermostatPayload;
350
+ }
351
+ case 'sensor': {
352
+ const sensor = device;
353
+ const sensorPayload = {
354
+ ...basePayload,
355
+ sensorType: sensor.status?.sensorType ?? 'unknown',
356
+ value: sensor.status?.value ?? 0,
357
+ unit: sensor.status?.unit ?? '',
358
+ };
359
+ return sensorPayload;
360
+ }
361
+ case 'zone': {
362
+ const zone = device;
363
+ const zonePayload = {
364
+ ...basePayload,
365
+ open: zone.status?.open ?? false,
366
+ armed: zone.status?.armed ?? false,
367
+ fault: zone.status?.fault ?? false,
368
+ bypassed: zone.status?.bypassed ?? false,
369
+ };
370
+ return zonePayload;
371
+ }
372
+ case 'scenario': {
373
+ const scenario = device;
374
+ const scenarioPayload = {
375
+ ...basePayload,
376
+ active: scenario.status?.active ?? false,
377
+ };
378
+ return scenarioPayload;
379
+ }
380
+ default: {
381
+ const unknownPayload = {
382
+ ...basePayload,
383
+ active: false,
384
+ };
385
+ return unknownPayload;
386
+ }
387
+ }
388
+ }
389
+ disconnect() {
390
+ if (this.client) {
391
+ this.client.end();
392
+ this.log.info('MQTT: Disconnected');
393
+ }
394
+ }
395
+ }
396
+ exports.MqttBridge = MqttBridge;
397
+ //# sourceMappingURL=mqtt-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mqtt-bridge.js","sourceRoot":"","sources":["../src/mqtt-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import type { API, Characteristic, DynamicPlatformPlugin, Logger, PlatformAccessory, PlatformConfig, Service } from 'homebridge';
2
+ import { KseniaWebSocketClient } from './websocket-client';
3
+ import type { KseniaDevice, MqttConfig, RoomMappingConfig } from './types';
4
+ import { MqttBridge } from './mqtt-bridge';
5
+ import { LightAccessory } from './accessories/light-accessory';
6
+ import { CoverAccessory } from './accessories/cover-accessory';
7
+ import { GateAccessory } from './accessories/gate-accessory';
8
+ import { SensorAccessory } from './accessories/sensor-accessory';
9
+ import { ZoneAccessory } from './accessories/zone-accessory';
10
+ import { ThermostatAccessory } from './accessories/thermostat-accessory';
11
+ import { ScenarioAccessory } from './accessories/scenario-accessory';
12
+ /**
13
+ * Union type for all accessory handlers
14
+ */
15
+ export type AccessoryHandler = LightAccessory | CoverAccessory | GateAccessory | SensorAccessory | ZoneAccessory | ThermostatAccessory | ScenarioAccessory;
16
+ /**
17
+ * Platform configuration interface
18
+ */
19
+ export interface Lares4Config extends PlatformConfig {
20
+ ip?: string;
21
+ sender?: string;
22
+ pin?: string;
23
+ https?: boolean;
24
+ port?: number;
25
+ debug?: boolean;
26
+ logLevel?: number;
27
+ maxSeconds?: number;
28
+ reconnectInterval?: number;
29
+ heartbeatInterval?: number;
30
+ excludeZones?: string[];
31
+ excludeOutputs?: string[];
32
+ excludeSensors?: string[];
33
+ excludeScenarios?: string[];
34
+ customNames?: {
35
+ zones?: Record<string, string>;
36
+ outputs?: Record<string, string>;
37
+ sensors?: Record<string, string>;
38
+ scenarios?: Record<string, string>;
39
+ };
40
+ scenarioAutoOffDelay?: number;
41
+ coverStepSize?: number;
42
+ temperatureDefaults?: {
43
+ target?: number;
44
+ min?: number;
45
+ max?: number;
46
+ step?: number;
47
+ };
48
+ devicesSummaryDelay?: number;
49
+ mqtt?: MqttConfig;
50
+ roomMapping?: RoomMappingConfig;
51
+ generateDebugFile?: boolean;
52
+ }
53
+ /**
54
+ * Main platform class implementing DynamicPlatformPlugin
55
+ */
56
+ export declare class Lares4Platform implements DynamicPlatformPlugin {
57
+ readonly log: Logger;
58
+ readonly config: Lares4Config;
59
+ readonly api: API;
60
+ readonly Service: typeof Service;
61
+ readonly Characteristic: typeof Characteristic;
62
+ readonly accessories: Map<string, PlatformAccessory>;
63
+ readonly discoveredCacheUUIDs: string[];
64
+ readonly accessoryHandlers: Map<string, AccessoryHandler>;
65
+ wsClient?: KseniaWebSocketClient;
66
+ mqttBridge?: MqttBridge;
67
+ private readonly discoveredDevices;
68
+ private readonly devicesFilePath;
69
+ private summaryTimeout?;
70
+ constructor(log: Logger, config: Lares4Config, api: API);
71
+ private initializeLares4;
72
+ private handleDeviceDiscovered;
73
+ private saveDevicesList;
74
+ private printDevicesSummary;
75
+ private generateRoomMappingExample;
76
+ private getExampleDevicesForRoom;
77
+ private shouldExcludeDevice;
78
+ private getCustomName;
79
+ private handleDeviceStatusUpdate;
80
+ configureAccessory(accessory: PlatformAccessory): void;
81
+ addAccessory(device: KseniaDevice): void;
82
+ updateAccessory(device: KseniaDevice): void;
83
+ private createAccessoryHandler;
84
+ removeAccessory(accessory: PlatformAccessory): void;
85
+ /**
86
+ * Disable the debug flag in config.json to prevent re-triggering
87
+ */
88
+ private disableDebugFlag;
89
+ }
90
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}