homebridge-plugin-klares4 1.1.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 (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +203 -0
  3. package/config.schema.json +206 -0
  4. package/dist/accessories/cover-accessory.d.ts +21 -0
  5. package/dist/accessories/cover-accessory.d.ts.map +1 -0
  6. package/dist/accessories/cover-accessory.js +128 -0
  7. package/dist/accessories/cover-accessory.js.map +1 -0
  8. package/dist/accessories/light-accessory.d.ts +16 -0
  9. package/dist/accessories/light-accessory.d.ts.map +1 -0
  10. package/dist/accessories/light-accessory.js +78 -0
  11. package/dist/accessories/light-accessory.js.map +1 -0
  12. package/dist/accessories/scenario-accessory.d.ts +13 -0
  13. package/dist/accessories/scenario-accessory.d.ts.map +1 -0
  14. package/dist/accessories/scenario-accessory.js +55 -0
  15. package/dist/accessories/scenario-accessory.js.map +1 -0
  16. package/dist/accessories/sensor-accessory.d.ts +24 -0
  17. package/dist/accessories/sensor-accessory.d.ts.map +1 -0
  18. package/dist/accessories/sensor-accessory.js +128 -0
  19. package/dist/accessories/sensor-accessory.js.map +1 -0
  20. package/dist/accessories/thermostat-accessory.d.ts +21 -0
  21. package/dist/accessories/thermostat-accessory.d.ts.map +1 -0
  22. package/dist/accessories/thermostat-accessory.js +215 -0
  23. package/dist/accessories/thermostat-accessory.js.map +1 -0
  24. package/dist/accessories/zone-accessory.d.ts +18 -0
  25. package/dist/accessories/zone-accessory.d.ts.map +1 -0
  26. package/dist/accessories/zone-accessory.js +99 -0
  27. package/dist/accessories/zone-accessory.js.map +1 -0
  28. package/dist/index.d.ts +4 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +7 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/platform.d.ts +69 -0
  33. package/dist/platform.d.ts.map +1 -0
  34. package/dist/platform.js +345 -0
  35. package/dist/platform.js.map +1 -0
  36. package/dist/settings.d.ts +3 -0
  37. package/dist/settings.d.ts.map +1 -0
  38. package/dist/settings.js +6 -0
  39. package/dist/settings.js.map +1 -0
  40. package/dist/types.d.ts +82 -0
  41. package/dist/types.d.ts.map +1 -0
  42. package/dist/types.js +3 -0
  43. package/dist/types.js.map +1 -0
  44. package/dist/websocket-client.d.ts +57 -0
  45. package/dist/websocket-client.d.ts.map +1 -0
  46. package/dist/websocket-client.js +991 -0
  47. package/dist/websocket-client.js.map +1 -0
  48. package/package.json +64 -0
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ZoneAccessory = void 0;
4
+ class ZoneAccessory {
5
+ constructor(platform, accessory) {
6
+ this.platform = platform;
7
+ this.accessory = accessory;
8
+ this.device = accessory.context.device;
9
+ // Imposta le informazioni dell'accessorio
10
+ this.accessory.getService(this.platform.Service.AccessoryInformation)
11
+ .setCharacteristic(this.platform.Characteristic.Manufacturer, 'Ksenia')
12
+ .setCharacteristic(this.platform.Characteristic.Model, 'Lares4 Security Zone')
13
+ .setCharacteristic(this.platform.Characteristic.SerialNumber, this.device.id)
14
+ .setCharacteristic(this.platform.Characteristic.FirmwareRevision, '2.0.0');
15
+ // Usa ContactSensor per le zone di sicurezza (piΓΉ appropriato per porte/finestre)
16
+ this.service = this.accessory.getService(this.platform.Service.ContactSensor)
17
+ || this.accessory.addService(this.platform.Service.ContactSensor);
18
+ this.service.setCharacteristic(this.platform.Characteristic.Name, this.device.name);
19
+ // Imposta gli handlers per le caratteristiche
20
+ this.service.getCharacteristic(this.platform.Characteristic.ContactSensorState)
21
+ .onGet(this.getContactState.bind(this));
22
+ // Aggiungi caratteristiche personalizzate per lo stato della zona
23
+ // StatusActive per indicare se la zona Γ¨ armata
24
+ this.service.getCharacteristic(this.platform.Characteristic.StatusActive)
25
+ .onGet(this.getStatusActive.bind(this));
26
+ // StatusFault per indicare problemi con la zona
27
+ this.service.getCharacteristic(this.platform.Characteristic.StatusFault)
28
+ .onGet(this.getStatusFault.bind(this));
29
+ // StatusTampered per indicare manomissioni (se supportato)
30
+ this.service.getCharacteristic(this.platform.Characteristic.StatusTampered)
31
+ .onGet(this.getStatusTampered.bind(this));
32
+ // Inizializza i valori delle caratteristiche
33
+ this.updateCharacteristics();
34
+ }
35
+ async getContactState() {
36
+ // 0 = contact detected (chiuso), 1 = contact not detected (aperto)
37
+ return this.device.status.open ? 1 : 0;
38
+ }
39
+ async getStatusActive() {
40
+ // Indica se la zona Γ¨ armata
41
+ return this.device.status.armed;
42
+ }
43
+ async getStatusFault() {
44
+ // 0 = no fault, 1 = general fault
45
+ return this.device.status.fault ? 1 : 0;
46
+ }
47
+ async getStatusTampered() {
48
+ // 0 = not tampered, 1 = tampered
49
+ // Usa il campo bypassed come indicatore di possibile manomissione
50
+ return this.device.status.bypassed ? 1 : 0;
51
+ }
52
+ updateCharacteristics() {
53
+ this.service.updateCharacteristic(this.platform.Characteristic.ContactSensorState, this.device.status.open ? 1 : 0);
54
+ this.service.updateCharacteristic(this.platform.Characteristic.StatusActive, this.device.status.armed);
55
+ this.service.updateCharacteristic(this.platform.Characteristic.StatusFault, this.device.status.fault ? 1 : 0);
56
+ this.service.updateCharacteristic(this.platform.Characteristic.StatusTampered, this.device.status.bypassed ? 1 : 0);
57
+ }
58
+ // Metodo per aggiornare lo stato dall'esterno (aggiornamenti real-time)
59
+ updateStatus(newDevice) {
60
+ const oldDevice = this.device;
61
+ this.device = newDevice;
62
+ // Aggiorna le caratteristiche solo se necessario
63
+ if (oldDevice.status.open !== newDevice.status.open) {
64
+ this.service.updateCharacteristic(this.platform.Characteristic.ContactSensorState, newDevice.status.open ? 1 : 0);
65
+ this.platform.log.info(`πŸšͺ ${this.device.name}: ${newDevice.status.open ? 'Aperta' : 'Chiusa'}`);
66
+ }
67
+ if (oldDevice.status.armed !== newDevice.status.armed) {
68
+ this.service.updateCharacteristic(this.platform.Characteristic.StatusActive, newDevice.status.armed);
69
+ this.platform.log.info(`πŸ›‘οΈ ${this.device.name}: ${newDevice.status.armed ? 'Armata' : 'Disarmata'}`);
70
+ }
71
+ if (oldDevice.status.fault !== newDevice.status.fault) {
72
+ this.service.updateCharacteristic(this.platform.Characteristic.StatusFault, newDevice.status.fault ? 1 : 0);
73
+ if (newDevice.status.fault) {
74
+ this.platform.log.warn(`⚠️ ${this.device.name}: Fault rilevato`);
75
+ }
76
+ }
77
+ if (oldDevice.status.bypassed !== newDevice.status.bypassed) {
78
+ this.service.updateCharacteristic(this.platform.Characteristic.StatusTampered, newDevice.status.bypassed ? 1 : 0);
79
+ if (newDevice.status.bypassed) {
80
+ this.platform.log.warn(`πŸ”“ ${this.device.name}: Zona bypassata`);
81
+ }
82
+ }
83
+ this.platform.log.debug(`πŸ”„ Aggiornato stato zona ${this.device.name}: ${this.getZoneStatusString()}`);
84
+ }
85
+ getZoneStatusString() {
86
+ const status = [];
87
+ if (this.device.status.open)
88
+ status.push('Aperta');
89
+ if (this.device.status.armed)
90
+ status.push('Armata');
91
+ if (this.device.status.fault)
92
+ status.push('Fault');
93
+ if (this.device.status.bypassed)
94
+ status.push('Bypassata');
95
+ return status.length > 0 ? status.join(', ') : 'OK';
96
+ }
97
+ }
98
+ exports.ZoneAccessory = ZoneAccessory;
99
+ //# sourceMappingURL=zone-accessory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zone-accessory.js","sourceRoot":"","sources":["../../src/accessories/zone-accessory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { API } from 'homebridge';
2
+ declare const _default: (api: API) => void;
3
+ export = _default;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;yBAIvB,KAAK,GAAG;AAAlB,kBAEE"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ const platform_1 = require("./platform");
3
+ const settings_1 = require("./settings");
4
+ module.exports = (api) => {
5
+ api.registerPlatform(settings_1.PLUGIN_NAME, settings_1.PLATFORM_NAME, platform_1.Lares4Platform);
6
+ };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,yCAA4C;AAC5C,yCAAwD;AAExD,iBAAS,CAAC,GAAQ,EAAE,EAAE;IAClB,GAAG,CAAC,gBAAgB,CAAC,sBAAW,EAAE,wBAAa,EAAE,yBAAc,CAAC,CAAC;AACrE,CAAC,CAAC"}
@@ -0,0 +1,69 @@
1
+ import type { API, Characteristic, DynamicPlatformPlugin, Logger, PlatformAccessory, PlatformConfig, Service } from 'homebridge';
2
+ import { KseniaWebSocketClient } from './websocket-client';
3
+ import { KseniaDevice } from './types';
4
+ export interface Lares4Config extends PlatformConfig {
5
+ ip: string;
6
+ sender: string;
7
+ pin: string;
8
+ https?: boolean;
9
+ port?: number;
10
+ debug?: boolean;
11
+ maxSeconds?: number;
12
+ reconnectInterval?: number;
13
+ heartbeatInterval?: number;
14
+ excludeZones?: string[];
15
+ excludeOutputs?: string[];
16
+ excludeSensors?: string[];
17
+ excludeScenarios?: string[];
18
+ customNames?: {
19
+ zones?: {
20
+ [id: string]: string;
21
+ };
22
+ outputs?: {
23
+ [id: string]: string;
24
+ };
25
+ sensors?: {
26
+ [id: string]: string;
27
+ };
28
+ scenarios?: {
29
+ [id: string]: string;
30
+ };
31
+ };
32
+ scenarioAutoOffDelay?: number;
33
+ coverStepSize?: number;
34
+ temperatureDefaults?: {
35
+ target?: number;
36
+ min?: number;
37
+ max?: number;
38
+ step?: number;
39
+ };
40
+ devicesSummaryDelay?: number;
41
+ }
42
+ export declare class Lares4Platform implements DynamicPlatformPlugin {
43
+ readonly log: Logger;
44
+ readonly config: Lares4Config;
45
+ readonly api: API;
46
+ readonly Service: typeof Service;
47
+ readonly Characteristic: typeof Characteristic;
48
+ readonly accessories: Map<string, PlatformAccessory>;
49
+ readonly discoveredCacheUUIDs: string[];
50
+ private readonly accessoryHandlers;
51
+ wsClient?: KseniaWebSocketClient;
52
+ private discoveredDevices;
53
+ private devicesFilePath;
54
+ private summaryTimeout?;
55
+ constructor(log: Logger, config: Lares4Config, api: API);
56
+ private initializeLares4;
57
+ private handleDeviceDiscovered;
58
+ private saveDevicesList;
59
+ private printDevicesSummary;
60
+ private shouldExcludeDevice;
61
+ private getCustomName;
62
+ private handleDeviceStatusUpdate;
63
+ configureAccessory(accessory: PlatformAccessory): void;
64
+ addAccessory(device: KseniaDevice): void;
65
+ updateAccessory(device: KseniaDevice): void;
66
+ private createAccessoryHandler;
67
+ removeAccessory(accessory: PlatformAccessory): void;
68
+ }
69
+ //# 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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"}
@@ -0,0 +1,345 @@
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.Lares4Platform = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const settings_1 = require("./settings");
40
+ const websocket_client_1 = require("./websocket-client");
41
+ const light_accessory_1 = require("./accessories/light-accessory");
42
+ const cover_accessory_1 = require("./accessories/cover-accessory");
43
+ const sensor_accessory_1 = require("./accessories/sensor-accessory");
44
+ const zone_accessory_1 = require("./accessories/zone-accessory");
45
+ const thermostat_accessory_1 = require("./accessories/thermostat-accessory");
46
+ const scenario_accessory_1 = require("./accessories/scenario-accessory");
47
+ class Lares4Platform {
48
+ constructor(log, config, api) {
49
+ this.log = log;
50
+ this.config = config;
51
+ this.api = api;
52
+ this.accessories = new Map();
53
+ this.discoveredCacheUUIDs = [];
54
+ // Map per tenere traccia degli handlers degli accessori
55
+ this.accessoryHandlers = new Map();
56
+ // Cache dei dispositivi per la configurazione UI
57
+ this.discoveredDevices = new Map();
58
+ this.Service = api.hap.Service;
59
+ this.Characteristic = api.hap.Characteristic;
60
+ // Percorso per salvare la lista dei dispositivi
61
+ this.devicesFilePath = path.join(this.api.user.storagePath(), 'klares4-devices.json');
62
+ if (!config) {
63
+ this.log.error('❌ Nessuna configurazione trovata');
64
+ return;
65
+ }
66
+ if (!config.ip) {
67
+ this.log.error('❌ Indirizzo IP mancante nella configurazione');
68
+ return;
69
+ }
70
+ if (!config.pin) {
71
+ this.log.error('❌ PIN mancante nella configurazione');
72
+ return;
73
+ }
74
+ this.log.debug('πŸ”§ Inizializzazione platform completata:', this.config.name);
75
+ this.api.on('didFinishLaunching', async () => {
76
+ this.log.debug('πŸš€ Callback didFinishLaunching eseguito');
77
+ await this.initializeLares4();
78
+ });
79
+ }
80
+ async initializeLares4() {
81
+ try {
82
+ this.log.info('πŸ”Œ Inizializzazione connessione Ksenia Lares4...');
83
+ const useHttps = this.config.https !== false; // Default true
84
+ const port = this.config.port || (useHttps ? 443 : 80);
85
+ this.wsClient = new websocket_client_1.KseniaWebSocketClient(this.config.ip, port, useHttps, this.config.sender || 'homebridge', this.config.pin, this.log, {
86
+ debug: this.config.debug || false,
87
+ reconnectInterval: this.config.reconnectInterval || 5000,
88
+ heartbeatInterval: this.config.heartbeatInterval || 30000
89
+ });
90
+ // Setup event handlers
91
+ this.wsClient.onDeviceDiscovered = (device) => this.handleDeviceDiscovered(device);
92
+ this.wsClient.onDeviceStatusUpdate = (device) => this.handleDeviceStatusUpdate(device);
93
+ await this.wsClient.connect();
94
+ this.log.info('βœ… Ksenia Lares4 inizializzato con successo');
95
+ }
96
+ catch (error) {
97
+ this.log.error('❌ Errore inizializzazione Lares4:', error);
98
+ }
99
+ }
100
+ handleDeviceDiscovered(device) {
101
+ // Aggiungi il dispositivo alla cache per la UI di configurazione
102
+ this.discoveredDevices.set(device.id, device);
103
+ // Salva la lista aggiornata dei dispositivi
104
+ this.saveDevicesList();
105
+ // Controlla se il dispositivo deve essere escluso
106
+ if (this.shouldExcludeDevice(device)) {
107
+ this.log.info(`⏭️ Dispositivo escluso: ${device.type} - ${device.name}`);
108
+ return;
109
+ }
110
+ // Applica nome personalizzato se presente
111
+ const customName = this.getCustomName(device);
112
+ if (customName) {
113
+ device.name = customName;
114
+ device.description = customName;
115
+ }
116
+ this.log.info(`πŸ” Dispositivo scoperto: ${device.type} - ${device.name}`);
117
+ this.addAccessory(device);
118
+ }
119
+ saveDevicesList() {
120
+ try {
121
+ const devicesList = {
122
+ zones: [],
123
+ outputs: [],
124
+ sensors: [],
125
+ scenarios: [],
126
+ lastUpdated: new Date().toISOString()
127
+ };
128
+ for (const device of this.discoveredDevices.values()) {
129
+ const id = device.id.replace(/^(light_|cover_|sensor_temp_|sensor_hum_|sensor_light_|zone_|thermostat_|scenario_)/, '');
130
+ const deviceInfo = {
131
+ id: id,
132
+ name: device.name,
133
+ type: device.type,
134
+ description: device.description || device.name,
135
+ fullId: device.id
136
+ };
137
+ if (device.type === 'zone') {
138
+ devicesList.zones.push(deviceInfo);
139
+ }
140
+ else if (device.type === 'light' || device.type === 'cover' || device.type === 'thermostat') {
141
+ devicesList.outputs.push(deviceInfo);
142
+ }
143
+ else if (device.type === 'sensor') {
144
+ devicesList.sensors.push(deviceInfo);
145
+ }
146
+ else if (device.type === 'scenario') {
147
+ devicesList.scenarios.push(deviceInfo);
148
+ }
149
+ }
150
+ // Ordina per nome
151
+ devicesList.zones.sort((a, b) => a.name.localeCompare(b.name));
152
+ devicesList.outputs.sort((a, b) => a.name.localeCompare(b.name));
153
+ devicesList.sensors.sort((a, b) => a.name.localeCompare(b.name));
154
+ devicesList.scenarios.sort((a, b) => a.name.localeCompare(b.name));
155
+ fs.writeFileSync(this.devicesFilePath, JSON.stringify(devicesList, null, 2));
156
+ this.log.debug(`πŸ“ Lista dispositivi salvata: ${this.discoveredDevices.size} dispositivi`);
157
+ // Ritarda la stampa del riassunto per evitare duplicati durante la scoperta
158
+ if (this.summaryTimeout) {
159
+ clearTimeout(this.summaryTimeout);
160
+ }
161
+ const summaryDelay = this.config.devicesSummaryDelay || 2000;
162
+ this.summaryTimeout = setTimeout(() => {
163
+ this.printDevicesSummary(devicesList);
164
+ this.summaryTimeout = undefined;
165
+ }, summaryDelay); // Aspetta tempo configurabile dopo l'ultimo dispositivo scoperto
166
+ }
167
+ catch (error) {
168
+ this.log.error('❌ Errore nel salvare la lista dispositivi:', error);
169
+ }
170
+ }
171
+ printDevicesSummary(devicesList) {
172
+ this.log.info('');
173
+ this.log.info('πŸ“‹ ========== DISPOSITIVI DISPONIBILI ==========');
174
+ this.log.info('πŸ’‘ Per escludere dispositivi, usa i seguenti ID:');
175
+ this.log.info('');
176
+ if (devicesList.outputs.length > 0) {
177
+ this.log.info('πŸ”Œ OUTPUT (Luci, Tapparelle, Termostati):');
178
+ devicesList.outputs.forEach((device) => {
179
+ const icon = device.type === 'thermostat' ? '🌑️' : device.type === 'light' ? 'πŸ’‘' : 'πŸͺŸ';
180
+ this.log.info(` ID: ${device.id.padEnd(3)} - ${icon} ${device.name}`);
181
+ });
182
+ this.log.info('');
183
+ }
184
+ if (devicesList.zones.length > 0) {
185
+ this.log.info('πŸšͺ ZONE (Sensori di Sicurezza):');
186
+ devicesList.zones.forEach((device) => {
187
+ this.log.info(` ID: ${device.id.padEnd(3)} - πŸšͺ ${device.name}`);
188
+ });
189
+ this.log.info('');
190
+ }
191
+ if (devicesList.sensors.length > 0) {
192
+ this.log.info('🌑️ SENSORI (Temperatura, Umidità, Luminosità):');
193
+ devicesList.sensors.forEach((device) => {
194
+ const icon = device.name.includes('Temperatura') ? '🌑️' :
195
+ device.name.includes('UmiditΓ ') ? 'πŸ’§' : 'β˜€οΈ';
196
+ this.log.info(` ID: ${device.id.padEnd(3)} - ${icon} ${device.name}`);
197
+ });
198
+ this.log.info('');
199
+ }
200
+ if (devicesList.scenarios.length > 0) {
201
+ this.log.info('🎬 SCENARI (Automazioni):');
202
+ devicesList.scenarios.forEach((device) => {
203
+ this.log.info(` ID: ${device.id.padEnd(3)} - 🎬 ${device.name}`);
204
+ });
205
+ this.log.info('');
206
+ }
207
+ this.log.info('πŸ“ Lista completa salvata in: ' + this.devicesFilePath);
208
+ this.log.info('πŸ”§ Usa questi ID nella configurazione per escludere dispositivi');
209
+ this.log.info('===============================================');
210
+ this.log.info('');
211
+ }
212
+ shouldExcludeDevice(device) {
213
+ const config = this.config;
214
+ const id = device.id.replace(/^(light_|cover_|sensor_temp_|sensor_hum_|sensor_light_|zone_|thermostat_|scenario_)/, '');
215
+ if (device.type === 'zone' && config.excludeZones?.includes(id)) {
216
+ this.log.info(`⏭️ Zona esclusa: ${device.name} (ID: ${id})`);
217
+ return true;
218
+ }
219
+ if ((device.type === 'light' || device.type === 'cover' || device.type === 'thermostat') && config.excludeOutputs?.includes(id)) {
220
+ this.log.info(`⏭️ Output escluso: ${device.name} (ID: ${id})`);
221
+ return true;
222
+ }
223
+ if (device.type === 'sensor' && config.excludeSensors?.includes(id)) {
224
+ this.log.info(`⏭️ Sensore escluso: ${device.name} (ID: ${id})`);
225
+ return true;
226
+ }
227
+ if (device.type === 'scenario' && config.excludeScenarios?.includes(id)) {
228
+ this.log.info(`⏭️ Scenario escluso: ${device.name} (ID: ${id})`);
229
+ return true;
230
+ }
231
+ return false;
232
+ }
233
+ getCustomName(device) {
234
+ const config = this.config;
235
+ const id = device.id.replace(/^(light_|cover_|sensor_temp_|sensor_hum_|sensor_light_|zone_|thermostat_|scenario_)/, '');
236
+ if (device.type === 'zone') {
237
+ return config.customNames?.zones?.[id];
238
+ }
239
+ if (device.type === 'light' || device.type === 'cover' || device.type === 'thermostat') {
240
+ return config.customNames?.outputs?.[id];
241
+ }
242
+ if (device.type === 'sensor') {
243
+ const sensorName = config.customNames?.sensors?.[id];
244
+ if (sensorName) {
245
+ // Mantieni il suffixo per i sensori multipli
246
+ if (device.id.includes('_temp_'))
247
+ return `${sensorName} - Temperatura`;
248
+ if (device.id.includes('_hum_'))
249
+ return `${sensorName} - UmiditΓ `;
250
+ if (device.id.includes('_light_'))
251
+ return `${sensorName} - LuminositΓ `;
252
+ }
253
+ }
254
+ if (device.type === 'scenario') {
255
+ return config.customNames?.scenarios?.[id];
256
+ }
257
+ return undefined;
258
+ }
259
+ handleDeviceStatusUpdate(device) {
260
+ this.log.debug(`πŸ”„ Aggiornamento stato dispositivo: ${device.name}`);
261
+ // Qui implementeremo l'aggiornamento dello stato degli accessori
262
+ this.updateAccessory(device);
263
+ }
264
+ configureAccessory(accessory) {
265
+ this.log.info('πŸ”§ Caricamento accessorio dalla cache:', accessory.displayName);
266
+ this.accessories.set(accessory.UUID, accessory);
267
+ }
268
+ // Metodi per la gestione degli accessori
269
+ addAccessory(device) {
270
+ const uuid = this.api.hap.uuid.generate(device.id);
271
+ const existingAccessory = this.accessories.get(uuid);
272
+ if (existingAccessory) {
273
+ this.log.info('πŸ”„ Ripristino accessorio esistente dalla cache:', device.name);
274
+ existingAccessory.context.device = device;
275
+ this.createAccessoryHandler(existingAccessory, device);
276
+ }
277
+ else {
278
+ this.log.info('πŸ†• Aggiunta nuovo accessorio:', device.name);
279
+ const accessory = new this.api.platformAccessory(device.name, uuid);
280
+ accessory.context.device = device;
281
+ this.createAccessoryHandler(accessory, device);
282
+ this.api.registerPlatformAccessories(settings_1.PLUGIN_NAME, settings_1.PLATFORM_NAME, [accessory]);
283
+ this.accessories.set(uuid, accessory);
284
+ }
285
+ }
286
+ updateAccessory(device) {
287
+ const uuid = this.api.hap.uuid.generate(device.id);
288
+ const accessory = this.accessories.get(uuid);
289
+ const handler = this.accessoryHandlers.get(uuid);
290
+ if (accessory && handler) {
291
+ accessory.context.device = device;
292
+ // Chiama il metodo updateStatus dell'handler specifico
293
+ if (handler.updateStatus && typeof handler.updateStatus === 'function') {
294
+ handler.updateStatus(device);
295
+ }
296
+ }
297
+ }
298
+ createAccessoryHandler(accessory, device) {
299
+ const uuid = accessory.UUID;
300
+ // Rimuovi handler esistente se presente
301
+ if (this.accessoryHandlers.has(uuid)) {
302
+ this.accessoryHandlers.delete(uuid);
303
+ }
304
+ // Crea il nuovo handler in base al tipo di dispositivo
305
+ let handler;
306
+ switch (device.type) {
307
+ case 'light':
308
+ handler = new light_accessory_1.LightAccessory(this, accessory);
309
+ this.log.debug(`πŸ’‘ Creato handler per luce: ${device.name}`);
310
+ break;
311
+ case 'cover':
312
+ handler = new cover_accessory_1.CoverAccessory(this, accessory);
313
+ this.log.debug(`πŸͺŸ Creato handler per tapparella: ${device.name}`);
314
+ break;
315
+ case 'sensor':
316
+ handler = new sensor_accessory_1.SensorAccessory(this, accessory);
317
+ this.log.debug(`🌑️ Creato handler per sensore: ${device.name}`);
318
+ break;
319
+ case 'zone':
320
+ handler = new zone_accessory_1.ZoneAccessory(this, accessory);
321
+ this.log.debug(`πŸšͺ Creato handler per zona: ${device.name}`);
322
+ break;
323
+ case 'thermostat':
324
+ handler = new thermostat_accessory_1.ThermostatAccessory(this, accessory);
325
+ this.log.debug(`🌑️ Creato handler per termostato: ${device.name}`);
326
+ break;
327
+ case 'scenario':
328
+ handler = new scenario_accessory_1.ScenarioAccessory(this, accessory, device);
329
+ this.log.debug(`🎬 Creato handler per scenario: ${device.name}`);
330
+ break;
331
+ default:
332
+ this.log.warn(`⚠️ Tipo dispositivo non supportato: ${device.type}`);
333
+ return;
334
+ }
335
+ // Salva l'handler per aggiornamenti futuri
336
+ this.accessoryHandlers.set(uuid, handler);
337
+ }
338
+ removeAccessory(accessory) {
339
+ this.log.info('πŸ—‘οΈ Rimozione accessorio:', accessory.displayName);
340
+ this.api.unregisterPlatformAccessories(settings_1.PLUGIN_NAME, settings_1.PLATFORM_NAME, [accessory]);
341
+ this.accessories.delete(accessory.UUID);
342
+ }
343
+ }
344
+ exports.Lares4Platform = Lares4Platform;
345
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const PLATFORM_NAME = "Lares4Complete";
2
+ export declare const PLUGIN_NAME = "homebridge-plugin-klares4";
3
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,mBAAmB,CAAC;AAC9C,eAAO,MAAM,WAAW,8BAA8B,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PLUGIN_NAME = exports.PLATFORM_NAME = void 0;
4
+ exports.PLATFORM_NAME = 'Lares4Complete';
5
+ exports.PLUGIN_NAME = 'homebridge-plugin-klares4';
6
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":";;;AAAa,QAAA,aAAa,GAAG,gBAAgB,CAAC;AACjC,QAAA,WAAW,GAAG,2BAA2B,CAAC"}