homebridge-plugin-klares4 1.1.1-beta.4 → 1.1.1-beta.6

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 (43) hide show
  1. package/CHANGELOG.md +53 -7
  2. package/README.md +34 -34
  3. package/dist/accessories/cover-accessory.d.ts +8 -4
  4. package/dist/accessories/cover-accessory.d.ts.map +1 -1
  5. package/dist/accessories/cover-accessory.js +36 -37
  6. package/dist/accessories/cover-accessory.js.map +1 -1
  7. package/dist/accessories/light-accessory.d.ts +7 -3
  8. package/dist/accessories/light-accessory.d.ts.map +1 -1
  9. package/dist/accessories/light-accessory.js +27 -24
  10. package/dist/accessories/light-accessory.js.map +1 -1
  11. package/dist/accessories/scenario-accessory.d.ts +8 -4
  12. package/dist/accessories/scenario-accessory.d.ts.map +1 -1
  13. package/dist/accessories/scenario-accessory.js +23 -19
  14. package/dist/accessories/scenario-accessory.js.map +1 -1
  15. package/dist/accessories/sensor-accessory.d.ts +5 -1
  16. package/dist/accessories/sensor-accessory.d.ts.map +1 -1
  17. package/dist/accessories/sensor-accessory.js +49 -36
  18. package/dist/accessories/sensor-accessory.js.map +1 -1
  19. package/dist/accessories/thermostat-accessory.d.ts +5 -1
  20. package/dist/accessories/thermostat-accessory.d.ts.map +1 -1
  21. package/dist/accessories/thermostat-accessory.js +68 -55
  22. package/dist/accessories/thermostat-accessory.js.map +1 -1
  23. package/dist/accessories/zone-accessory.d.ts +5 -1
  24. package/dist/accessories/zone-accessory.d.ts.map +1 -1
  25. package/dist/accessories/zone-accessory.js +32 -32
  26. package/dist/accessories/zone-accessory.js.map +1 -1
  27. package/dist/mqtt-bridge.d.ts +6 -12
  28. package/dist/mqtt-bridge.d.ts.map +1 -1
  29. package/dist/mqtt-bridge.js +148 -104
  30. package/dist/mqtt-bridge.js.map +1 -1
  31. package/dist/platform.d.ts +26 -37
  32. package/dist/platform.d.ts.map +1 -1
  33. package/dist/platform.js +177 -132
  34. package/dist/platform.js.map +1 -1
  35. package/dist/types.d.ts +203 -21
  36. package/dist/types.d.ts.map +1 -1
  37. package/dist/types.js +78 -0
  38. package/dist/types.js.map +1 -1
  39. package/dist/websocket-client.d.ts +6 -5
  40. package/dist/websocket-client.d.ts.map +1 -1
  41. package/dist/websocket-client.js +257 -313
  42. package/dist/websocket-client.js.map +1 -1
  43. package/package.json +4 -4
package/CHANGELOG.md CHANGED
@@ -7,23 +7,59 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.1.1-beta.6] - 2025-12-28
11
+
12
+ ### Changed
13
+
14
+ - **Strict TypeScript Refactoring**: Complete codebase rewrite for strict type compliance
15
+ - Replaced all `any` types with proper interfaces and discriminated unions
16
+ - Added explicit return types to all functions and methods
17
+ - Implemented type guards for MQTT command validation
18
+ - Improved error handling: clean messages without stack traces in production logs
19
+ - Removed all emojis from source code, comments, and log messages
20
+
21
+ ### Technical
22
+
23
+ - New discriminated union types for device status (`KseniaLight`, `KseniaCover`, etc.)
24
+ - `AccessoryHandler` union type for typed accessory management
25
+ - Raw API response interfaces (`KseniaOutputStatusRaw`, `KseniaSensorStatusRaw`, etc.)
26
+ - Type guard functions (`isMqttLightCommand`, `isMqttCoverCommand`, etc.)
27
+ - Removed duplicate `MqttConfig` definition
28
+
29
+ ### Documentation
30
+
31
+ - Removed all emojis from README.md, CHANGELOG.md, and CONTEXT.md
32
+ - Updated code style to match strict TypeScript standards
33
+
34
+ ## [1.1.1-beta.5] - 2025-09-18
35
+
36
+ ### Fixed
37
+
38
+ - **MQTT Bridge**: Corrected light state publishing - fixed `light.on` to `light.status?.on` mapping
39
+ - Light states now correctly reflect actual on/off status in MQTT messages
40
+ - Resolved issue where lights always appeared as "off" in MQTT broker
41
+
10
42
  ### Added
43
+
11
44
  - Dynamic device list generation for room mapping configuration
12
45
  - Auto-generated `klares4-room-mapping-example.json` file with real device data
13
46
  - Enhanced user interface for room mapping with actual device names and IDs
14
47
  - Improved logging with full device IDs for easier configuration
15
48
 
16
49
  ### Changed
50
+
17
51
  - Removed hardcoded device examples from config schema
18
52
  - Enhanced device discovery summary with full device IDs
19
53
  - Improved help documentation in Homebridge UI for room mapping
20
54
 
21
55
  ### Fixed
56
+
22
57
  - Room mapping configuration now uses actual devices from user's Lares4 system
23
58
 
24
59
  ## [1.1.1-beta.1] - 2025-09-16
25
60
 
26
61
  ### Added
62
+
27
63
  - **Room Mapping for MQTT**: New feature to organize devices by room in MQTT topics
28
64
  - Room-based MQTT topic structure: `homebridge/{room}/{type}/{id}/state`
29
65
  - Configurable room mapping through Homebridge UI
@@ -31,11 +67,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
31
67
  - Support for both old and new command topic formats
32
68
 
33
69
  ### Changed
70
+
34
71
  - MQTT topic structure can now include room names when room mapping is enabled
35
72
  - Enhanced config schema with new "Mappatura Stanze MQTT" section
36
73
  - Improved MQTT bridge to support dynamic room assignment
37
74
 
38
75
  ### Technical
76
+
39
77
  - Added `getRoomForDevice()` function to MQTT bridge
40
78
  - Enhanced TypeScript types for room mapping configuration
41
79
  - Updated subscription logic to handle multiple topic formats
@@ -44,36 +82,41 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
44
82
  ## [1.1.1-beta.0] - 2025-09-16
45
83
 
46
84
  ### Added
85
+
47
86
  - Initial MQTT bridge functionality
48
87
  - Device state publishing to MQTT topics
49
88
  - MQTT command reception for device control
50
89
  - Comprehensive device discovery and caching
51
90
 
52
91
  ### Changed
92
+
53
93
  - Enhanced plugin architecture for better extensibility
54
94
  - Improved device management and exclusion system
55
95
 
56
96
  ### Fixed
97
+
57
98
  - Various stability improvements
58
99
  - Enhanced error handling
59
100
 
60
101
  ## [1.1.0] - 2025-09-10
61
102
 
62
103
  ### Added
104
+
63
105
  - Complete plugin rewrite for Ksenia Lares4 systems
64
106
  - Support for multiple device types:
65
- - 🔐 Security zones (contact sensors)
66
- - 💡 Lights with on/off control
67
- - 🪟 Window coverings with position control
68
- - 🌡️ Thermostats with temperature and mode control
69
- - 📊 Environmental sensors (temperature, humidity, light)
70
- - 🎬 Scenario automation triggers
107
+ - Security zones (contact sensors)
108
+ - Lights with on/off control
109
+ - Window coverings with position control
110
+ - Thermostats with temperature and mode control
111
+ - Environmental sensors (temperature, humidity, light)
112
+ - Scenario automation triggers
71
113
  - Real-time WebSocket communication with Lares4 system
72
114
  - Configurable device exclusion system
73
115
  - Custom device naming support
74
116
  - Comprehensive Homebridge UI configuration interface
75
117
 
76
118
  ### Technical
119
+
77
120
  - Modern TypeScript implementation
78
121
  - Robust WebSocket client with auto-reconnection
79
122
  - Modular accessory architecture
@@ -91,11 +134,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
91
134
  ## Migration Guide
92
135
 
93
136
  ### From 1.1.1-beta.0 to 1.1.1-beta.1+
137
+
94
138
  - Room mapping is optional and disabled by default
95
139
  - Existing MQTT configurations continue to work unchanged
96
140
  - To use room mapping, enable it in the new "Mappatura Stanze MQTT" section
97
141
 
98
142
  ### From 1.0.x to 1.1.0+
143
+
99
144
  - Complete reconfiguration required
100
145
  - New device discovery process
101
146
  - Enhanced configuration options through Homebridge UI
@@ -104,5 +149,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
104
149
  ## Support
105
150
 
106
151
  For issues, feature requests, or questions:
152
+
107
153
  - GitHub Issues: https://github.com/paolo-trivi/homebridge-plugin-klares4/issues
108
- - Documentation: Check README.md for detailed setup instructions
154
+ - Documentation: Check README.md for detailed setup instructions
package/README.md CHANGED
@@ -5,25 +5,25 @@
5
5
 
6
6
  Plugin completo per sistemi Ksenia Lares4 che integra zone di sicurezza, luci, tapparelle, termostati e sensori ambientali in un'unica soluzione per Homebridge.
7
7
 
8
- ## Caratteristiche
8
+ ## Caratteristiche
9
9
 
10
- - 🔐 **Zone di Sicurezza**: Sensori di contatto per porte e finestre
11
- - 💡 **Controllo Luci**: Accensione/spegnimento di tutte le luci del sistema
12
- - 🪟 **Tapparelle Intelligenti**: Controllo percentuale con timing configurabile
13
- - 🌡️ **Termostati**: Controllo temperatura e modalità riscaldamento/raffreddamento
14
- - 📊 **Sensori Ambientali**: Temperatura, umidità e luminosità in tempo reale
15
- - 🔄 **Aggiornamenti Real-time**: Connessione WebSocket con riconnessione automatica
16
- - ⚙️ **Configurazione UI**: Interfaccia grafica completa in Homebridge UI
17
- - 🎯 **Personalizzazione**: Nomi personalizzati ed esclusione selettiva di entità
18
- - 📡 **Bridge MQTT**: Pubblicazione stati e ricezione comandi via MQTT (opzionale)
10
+ - **Zone di Sicurezza**: Sensori di contatto per porte e finestre
11
+ - **Controllo Luci**: Accensione/spegnimento di tutte le luci del sistema
12
+ - **Tapparelle Intelligenti**: Controllo percentuale con timing configurabile
13
+ - **Termostati**: Controllo temperatura e modalita riscaldamento/raffreddamento
14
+ - **Sensori Ambientali**: Temperatura, umidita e luminosita in tempo reale
15
+ - **Aggiornamenti Real-time**: Connessione WebSocket con riconnessione automatica
16
+ - **Configurazione UI**: Interfaccia grafica completa in Homebridge UI
17
+ - **Personalizzazione**: Nomi personalizzati ed esclusione selettiva di entita
18
+ - **Bridge MQTT**: Pubblicazione stati e ricezione comandi via MQTT (opzionale)
19
19
 
20
- ## 📋 Prerequisiti
20
+ ## Prerequisiti
21
21
 
22
22
  - Homebridge >= 1.6.0
23
23
  - Node.js >= 14.18.1
24
24
  - Sistema Ksenia Lares4 con accesso WebSocket abilitato
25
25
 
26
- ## 🚀 Installazione
26
+ ## Installazione
27
27
 
28
28
  ### Tramite Homebridge UI (Consigliato)
29
29
 
@@ -39,13 +39,13 @@ Plugin completo per sistemi Ksenia Lares4 che integra zone di sicurezza, luci, t
39
39
  npm install -g homebridge-plugin-klares4
40
40
  ```
41
41
 
42
- ## ⚙️ Configurazione
42
+ ## Configurazione
43
43
 
44
44
  ### Configurazione Base
45
45
 
46
- Il plugin può essere configurato completamente tramite l'interfaccia grafica di Homebridge UI. I parametri obbligatori sono:
46
+ Il plugin puo essere configurato completamente tramite l'interfaccia grafica di Homebridge UI. I parametri obbligatori sono:
47
47
 
48
- - **Nome Plugin**: Nome che apparirà nei log
48
+ - **Nome Plugin**: Nome che apparira nei log
49
49
  - **Indirizzo IP**: IP del sistema Ksenia Lares4
50
50
  - **Sender ID**: Identificativo univoco per la connessione WebSocket
51
51
  - **PIN Sistema**: PIN di accesso al sistema Lares4
@@ -103,7 +103,7 @@ Il plugin può essere configurato completamente tramite l'interfaccia grafica di
103
103
  | `excludeSensors` | string[] | [] | Sensori da escludere |
104
104
  | `customNames` | object | {} | Nomi personalizzati |
105
105
 
106
- ## 🏠 Tipi di Accessori Supportati
106
+ ## Tipi di Accessori Supportati
107
107
 
108
108
  ### Zone di Sicurezza
109
109
 
@@ -121,27 +121,27 @@ Il plugin può essere configurato completamente tramite l'interfaccia grafica di
121
121
 
122
122
  - **Tipo HomeKit**: Window Covering
123
123
  - **Controllo**: Percentuale (0-100%)
124
- - **Comandi**: Su/Giù/Stop
124
+ - **Comandi**: Su/Giu/Stop
125
125
  - **Timing**: Configurabile tramite `maxSeconds`
126
126
 
127
127
  ### Termostati
128
128
 
129
129
  - **Tipo HomeKit**: Thermostat
130
- - **Modalità**: Off/Heat/Cool
130
+ - **Modalita**: Off/Heat/Cool
131
131
  - **Controllo**: Temperatura target
132
132
  - **Sensori**: Temperatura corrente
133
133
 
134
134
  ### Sensori Ambientali
135
135
 
136
136
  - **Tipi HomeKit**: Temperature/Humidity/Light Sensor
137
- - **Dati**: Temperatura, Umidità, Luminosità
137
+ - **Dati**: Temperatura, Umidita, Luminosita
138
138
  - **Aggiornamenti**: Real-time
139
139
 
140
- ## 📡 Bridge MQTT (Opzionale)
140
+ ## Bridge MQTT (Opzionale)
141
141
 
142
142
  Il plugin include un bridge MQTT che permette di pubblicare gli stati degli accessori e ricevere comandi via MQTT.
143
143
 
144
- ### 🚀 Configurazione MQTT
144
+ ### Configurazione MQTT
145
145
 
146
146
  Abilita il bridge MQTT nella sezione "MQTT Bridge" della configurazione:
147
147
 
@@ -160,7 +160,7 @@ Abilita il bridge MQTT nella sezione "MQTT Bridge" della configurazione:
160
160
  }
161
161
  ```
162
162
 
163
- ### 📤 Pubblicazione Stati
163
+ ### Pubblicazione Stati
164
164
 
165
165
  Gli stati degli accessori vengono pubblicati sui seguenti topic:
166
166
 
@@ -171,7 +171,7 @@ Gli stati degli accessori vengono pubblicati sui seguenti topic:
171
171
  - **Zone**: `homebridge/klares4/zone/{id}/state`
172
172
  - **Scenari**: `homebridge/klares4/scenario/{id}/state`
173
173
 
174
- ### 📥 Ricezione Comandi
174
+ ### Ricezione Comandi
175
175
 
176
176
  Invia comandi agli accessori sui seguenti topic:
177
177
 
@@ -180,7 +180,7 @@ Invia comandi agli accessori sui seguenti topic:
180
180
  - **Termostati**: `homebridge/klares4/thermostat/{id}/set`
181
181
  - **Scenari**: `homebridge/klares4/scenario/{id}/set`
182
182
 
183
- ### 💡 Esempi di Utilizzo
183
+ ### Esempi di Utilizzo
184
184
 
185
185
  #### Accendere una luce:
186
186
 
@@ -206,7 +206,7 @@ mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/thermostat/3/set" -m '{"ta
206
206
  mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/scenario/4/set" -m '{"active": true}'
207
207
  ```
208
208
 
209
- ### 📊 Formato Payload Stati
209
+ ### Formato Payload Stati
210
210
 
211
211
  ```json
212
212
  {
@@ -219,7 +219,7 @@ mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/scenario/4/set" -m '{"acti
219
219
  }
220
220
  ```
221
221
 
222
- ## 🔧 Risoluzione Problemi
222
+ ## Risoluzione Problemi
223
223
 
224
224
  ### Connessione WebSocket
225
225
 
@@ -242,7 +242,7 @@ Abilita il debug logging per diagnosi dettagliate:
242
242
 
243
243
  ### Serial Number Warning
244
244
 
245
- Il warning "Serial Number characteristic must have a length of more than 1 character" è stato risolto nelle versioni recenti. Assicurati di avere l'ultima versione del plugin.
245
+ Il warning "Serial Number characteristic must have a length of more than 1 character" e stato risolto nelle versioni recenti. Assicurati di avere l'ultima versione del plugin.
246
246
 
247
247
  ### Tapparelle non Responsive
248
248
 
@@ -252,16 +252,16 @@ Se le tapparelle non rispondono correttamente:
252
252
  2. Controlla che i comandi up, down, alt siano supportati dal sistema
253
253
  3. Testa prima con movimenti completi (0% o 100%)
254
254
 
255
- ## 📊 Monitoraggio
255
+ ## Monitoraggio
256
256
 
257
257
  Il plugin fornisce log dettagliati per monitorare:
258
258
 
259
259
  - Stato connessione WebSocket
260
260
  - Comandi inviati e ricevuti
261
- - Aggiornamenti entità
261
+ - Aggiornamenti entita
262
262
  - Errori e riconnessioni
263
263
 
264
- ## 🤝 Contributi
264
+ ## Contributi
265
265
 
266
266
  I contributi sono benvenuti! Per contribuire:
267
267
 
@@ -271,11 +271,11 @@ I contributi sono benvenuti! Per contribuire:
271
271
  4. Push al branch
272
272
  5. Apri una Pull Request
273
273
 
274
- ## 📄 Licenza
274
+ ## Licenza
275
275
 
276
- Questo progetto è rilasciato sotto licenza MIT.
276
+ Questo progetto e rilasciato sotto licenza MIT.
277
277
 
278
- ## 🔗 Link Utili
278
+ ## Link Utili
279
279
 
280
280
  - [Homebridge](https://homebridge.io/)
281
281
  - [Homebridge UI](https://github.com/homebridge/homebridge-config-ui-x)
@@ -283,4 +283,4 @@ Questo progetto è rilasciato sotto licenza MIT.
283
283
 
284
284
  ---
285
285
 
286
- **Nota**: Questo progetto non è affiliato con Ksenia Security S.p.A. È un progetto open source sviluppato dalla comunità.
286
+ **Nota**: Questo progetto non e affiliato con Ksenia Security S.p.A. E un progetto open source sviluppato dalla comunita.
@@ -1,21 +1,25 @@
1
1
  import type { CharacteristicValue, PlatformAccessory } from 'homebridge';
2
2
  import type { Lares4Platform } from '../platform';
3
- import type { KseniaDevice } from '../types';
3
+ import type { KseniaCover } from '../types';
4
+ /**
5
+ * Cover Accessory Handler
6
+ * Handles HomeKit WindowCovering service for Ksenia Lares4 covers/shutters
7
+ */
4
8
  export declare class CoverAccessory {
5
9
  private readonly platform;
6
10
  private readonly accessory;
7
11
  private service;
8
- private device;
12
+ device: KseniaCover;
9
13
  private targetPosition;
10
14
  private currentPosition;
11
15
  private positionState;
12
- private maxSeconds;
16
+ private readonly maxSeconds;
13
17
  constructor(platform: Lares4Platform, accessory: PlatformAccessory);
14
18
  setTargetPosition(value: CharacteristicValue): Promise<void>;
15
19
  getTargetPosition(): Promise<CharacteristicValue>;
16
20
  getCurrentPosition(): Promise<CharacteristicValue>;
17
21
  getPositionState(): Promise<CharacteristicValue>;
18
22
  private simulateMovement;
19
- updateStatus(newDevice: KseniaDevice): void;
23
+ updateStatus(newDevice: KseniaCover): void;
20
24
  }
21
25
  //# sourceMappingURL=cover-accessory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cover-accessory.d.ts","sourceRoot":"","sources":["../../src/accessories/cover-accessory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAW,MAAM,YAAY,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,qBAAa,cAAc;IASnB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAT9B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,UAAU,CAAS;gBAGN,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,iBAAiB;IAwC3C,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC5D,iBAAiB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIjD,kBAAkB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIlD,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAItD,OAAO,CAAC,gBAAgB;IAiCxB,YAAY,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI;CA4B9C"}
1
+ {"version":3,"file":"cover-accessory.d.ts","sourceRoot":"","sources":["../../src/accessories/cover-accessory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAW,MAAM,YAAY,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,aAAa,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,UAAU,CAAC;AAEzD;;;GAGG;AACH,qBAAa,cAAc;IASnB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAT9B,OAAO,CAAC,OAAO,CAAU;IAClB,MAAM,EAAE,WAAW,CAAC;IAC3B,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAGf,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,iBAAiB;IAsDpC,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoC5D,iBAAiB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIjD,kBAAkB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIlD,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAI7D,OAAO,CAAC,gBAAgB;IA4CjB,YAAY,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;CAmCpD"}
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CoverAccessory = void 0;
4
+ /**
5
+ * Cover Accessory Handler
6
+ * Handles HomeKit WindowCovering service for Ksenia Lares4 covers/shutters
7
+ */
4
8
  class CoverAccessory {
5
9
  constructor(platform, accessory) {
6
10
  this.platform = platform;
@@ -9,28 +13,31 @@ class CoverAccessory {
9
13
  this.currentPosition = 0;
10
14
  this.positionState = 2; // 2 = stopped
11
15
  this.device = accessory.context.device;
12
- this.currentPosition = this.device.status?.position || 0;
13
- this.targetPosition = this.device.status?.position || 0;
14
- this.maxSeconds = this.platform.config.maxSeconds || 30;
15
- // Imposta le informazioni dell'accessorio
16
- this.accessory.getService(this.platform.Service.AccessoryInformation)
17
- .setCharacteristic(this.platform.Characteristic.Manufacturer, 'Ksenia')
18
- .setCharacteristic(this.platform.Characteristic.Model, 'Lares4 Cover')
19
- .setCharacteristic(this.platform.Characteristic.SerialNumber, this.device.id)
20
- .setCharacteristic(this.platform.Characteristic.FirmwareRevision, '2.0.0');
21
- // Ottieni o crea il servizio WindowCovering
22
- this.service = this.accessory.getService(this.platform.Service.WindowCovering)
23
- || this.accessory.addService(this.platform.Service.WindowCovering);
16
+ this.currentPosition = this.device.status?.position ?? 0;
17
+ this.targetPosition = this.device.status?.position ?? 0;
18
+ this.maxSeconds = this.platform.config.maxSeconds ?? 30;
19
+ const accessoryInfoService = this.accessory.getService(this.platform.Service.AccessoryInformation);
20
+ if (accessoryInfoService) {
21
+ accessoryInfoService
22
+ .setCharacteristic(this.platform.Characteristic.Manufacturer, 'Ksenia')
23
+ .setCharacteristic(this.platform.Characteristic.Model, 'Lares4 Cover')
24
+ .setCharacteristic(this.platform.Characteristic.SerialNumber, this.device.id)
25
+ .setCharacteristic(this.platform.Characteristic.FirmwareRevision, '2.0.0');
26
+ }
27
+ this.service =
28
+ this.accessory.getService(this.platform.Service.WindowCovering) ??
29
+ this.accessory.addService(this.platform.Service.WindowCovering);
24
30
  this.service.setCharacteristic(this.platform.Characteristic.Name, this.device.name);
25
- // Imposta gli handlers per le caratteristiche
26
- this.service.getCharacteristic(this.platform.Characteristic.CurrentPosition)
31
+ this.service
32
+ .getCharacteristic(this.platform.Characteristic.CurrentPosition)
27
33
  .onGet(this.getCurrentPosition.bind(this));
28
- this.service.getCharacteristic(this.platform.Characteristic.PositionState)
34
+ this.service
35
+ .getCharacteristic(this.platform.Characteristic.PositionState)
29
36
  .onGet(this.getPositionState.bind(this));
30
- this.service.getCharacteristic(this.platform.Characteristic.TargetPosition)
37
+ this.service
38
+ .getCharacteristic(this.platform.Characteristic.TargetPosition)
31
39
  .onSet(this.setTargetPosition.bind(this))
32
40
  .onGet(this.getTargetPosition.bind(this));
33
- // Inizializza i valori delle caratteristiche con valori sicuri
34
41
  const safeCurrentPosition = isNaN(this.currentPosition) ? 0 : this.currentPosition;
35
42
  const safeTargetPosition = isNaN(this.targetPosition) ? 0 : this.targetPosition;
36
43
  this.service.setCharacteristic(this.platform.Characteristic.CurrentPosition, safeCurrentPosition);
@@ -40,26 +47,23 @@ class CoverAccessory {
40
47
  async setTargetPosition(value) {
41
48
  const targetPosition = value;
42
49
  if (targetPosition === this.currentPosition) {
43
- return; // Nessun movimento necessario
50
+ return;
44
51
  }
45
52
  this.targetPosition = targetPosition;
46
53
  try {
47
- // Determina lo stato del movimento
48
54
  if (targetPosition > this.currentPosition) {
49
55
  this.positionState = 1; // Opening
50
56
  }
51
57
  else {
52
- this.positionState = 0; // Closing
58
+ this.positionState = 0; // Closing
53
59
  }
54
- // Aggiorna lo stato del movimento
55
60
  this.service.updateCharacteristic(this.platform.Characteristic.PositionState, this.positionState);
56
61
  await this.platform.wsClient?.moveCover(this.device.id, targetPosition);
57
- this.platform.log.info(`🪟 ${this.device.name}: Movimento a ${targetPosition}%`);
58
- // Simula il movimento graduale
62
+ this.platform.log.info(`${this.device.name}: Moving to ${targetPosition}%`);
59
63
  this.simulateMovement(targetPosition);
60
64
  }
61
65
  catch (error) {
62
- this.platform.log.error(`❌ Errore controllo tapparella ${this.device.name}:`, error);
66
+ this.platform.log.error(`Cover control error ${this.device.name}:`, error instanceof Error ? error.message : String(error));
63
67
  throw new this.platform.api.hap.HapStatusError(-70402 /* this.platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
64
68
  }
65
69
  }
@@ -76,40 +80,35 @@ class CoverAccessory {
76
80
  const startPosition = this.currentPosition;
77
81
  const distance = Math.abs(targetPosition - startPosition);
78
82
  const direction = targetPosition > startPosition ? 1 : -1;
79
- const stepSize = this.platform.config.coverStepSize || 5; // % per step (configurabile)
80
- const totalTime = (distance / 100) * (this.maxSeconds * 1000); // Tempo totale basato su maxSeconds
81
- const stepTime = totalTime / (distance / stepSize); // Tempo per step calcolato
83
+ const stepSize = this.platform.config.coverStepSize ?? 5;
84
+ const totalTime = (distance / 100) * (this.maxSeconds * 1000);
85
+ const stepTime = totalTime / (distance / stepSize);
82
86
  let currentStep = 0;
83
87
  const totalSteps = Math.ceil(distance / stepSize);
84
88
  const moveInterval = setInterval(() => {
85
89
  currentStep++;
86
90
  if (currentStep >= totalSteps) {
87
- // Movimento completato
88
91
  this.currentPosition = targetPosition;
89
92
  this.positionState = 2; // Stopped
90
93
  this.service.updateCharacteristic(this.platform.Characteristic.CurrentPosition, this.currentPosition);
91
94
  this.service.updateCharacteristic(this.platform.Characteristic.PositionState, this.positionState);
92
- this.platform.log.debug(`🪟 ${this.device.name}: Movimento completato a ${targetPosition}%`);
95
+ this.platform.log.debug(`${this.device.name}: Movement completed to ${targetPosition}%`);
93
96
  clearInterval(moveInterval);
94
97
  }
95
98
  else {
96
- // Movimento in corso
97
- this.currentPosition = Math.min(100, Math.max(0, startPosition + (direction * stepSize * currentStep)));
99
+ this.currentPosition = Math.min(100, Math.max(0, startPosition + direction * stepSize * currentStep));
98
100
  this.service.updateCharacteristic(this.platform.Characteristic.CurrentPosition, this.currentPosition);
99
101
  }
100
102
  }, stepTime);
101
103
  }
102
- // Metodo per aggiornare lo stato dall'esterno (aggiornamenti real-time)
103
104
  updateStatus(newDevice) {
104
105
  this.device = newDevice;
105
106
  if (this.device.status?.position !== this.currentPosition) {
106
- this.currentPosition = this.device.status?.position || 0;
107
- this.targetPosition = this.device.status?.position || 0;
108
- // Aggiorna le caratteristiche
107
+ this.currentPosition = this.device.status?.position ?? 0;
108
+ this.targetPosition = this.device.status?.position ?? 0;
109
109
  this.service.updateCharacteristic(this.platform.Characteristic.CurrentPosition, this.currentPosition);
110
110
  this.service.updateCharacteristic(this.platform.Characteristic.TargetPosition, this.targetPosition);
111
111
  }
112
- // Aggiorna lo stato del movimento
113
112
  switch (this.device.status?.state) {
114
113
  case 'opening':
115
114
  this.positionState = 1;
@@ -121,7 +120,7 @@ class CoverAccessory {
121
120
  this.positionState = 2; // stopped
122
121
  }
123
122
  this.service.updateCharacteristic(this.platform.Characteristic.PositionState, this.positionState);
124
- this.platform.log.debug(`🔄 Aggiornato stato tapparella ${this.device.name}: ${this.currentPosition}%`);
123
+ this.platform.log.debug(`Updated cover state ${this.device.name}: ${this.currentPosition}%`);
125
124
  }
126
125
  }
127
126
  exports.CoverAccessory = CoverAccessory;
@@ -1 +1 @@
1
- {"version":3,"file":"cover-accessory.js","sourceRoot":"","sources":["../../src/accessories/cover-accessory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cover-accessory.js","sourceRoot":"","sources":["../../src/accessories/cover-accessory.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,20 @@
1
1
  import type { CharacteristicValue, PlatformAccessory } from 'homebridge';
2
2
  import type { Lares4Platform } from '../platform';
3
- import type { KseniaDevice } from '../types';
3
+ import type { KseniaLight } from '../types';
4
+ /**
5
+ * Light Accessory Handler
6
+ * Handles HomeKit Lightbulb service for Ksenia Lares4 lights
7
+ */
4
8
  export declare class LightAccessory {
5
9
  private readonly platform;
6
10
  private readonly accessory;
7
11
  private service;
8
- private device;
12
+ device: KseniaLight;
9
13
  constructor(platform: Lares4Platform, accessory: PlatformAccessory);
10
14
  setOn(value: CharacteristicValue): Promise<void>;
11
15
  getOn(): Promise<CharacteristicValue>;
12
16
  setBrightness(value: CharacteristicValue): Promise<void>;
13
17
  getBrightness(): Promise<CharacteristicValue>;
14
- updateStatus(newDevice: KseniaDevice): void;
18
+ updateStatus(newDevice: KseniaLight): void;
15
19
  }
16
20
  //# sourceMappingURL=light-accessory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"light-accessory.d.ts","sourceRoot":"","sources":["../../src/accessories/light-accessory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAW,MAAM,YAAY,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,qBAAa,cAAc;IAKnB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAL9B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,MAAM,CAAe;gBAGR,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,iBAAiB;IA8B3C,KAAK,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAahD,KAAK,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIrC,aAAa,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBxD,aAAa,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAKnD,YAAY,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI;CAY9C"}
1
+ {"version":3,"file":"light-accessory.d.ts","sourceRoot":"","sources":["../../src/accessories/light-accessory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAW,MAAM,YAAY,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,UAAU,CAAC;AAEzD;;;GAGG;AACH,qBAAa,cAAc;IAKnB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAL9B,OAAO,CAAC,OAAO,CAAU;IAClB,MAAM,EAAE,WAAW,CAAC;gBAGN,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,iBAAiB;IAkCpC,KAAK,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBhD,KAAK,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIrC,aAAa,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BxD,aAAa,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAInD,YAAY,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;CAmBpD"}