homebridge-plugin-klares4 1.1.7 → 2.0.0-beta.1

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 (214) hide show
  1. package/CHANGELOG.md +101 -1
  2. package/README.md +131 -34
  3. package/config.schema.json +58 -3
  4. package/dist/accessories/cover-accessory.d.ts.map +1 -1
  5. package/dist/accessories/cover-accessory.js +21 -5
  6. package/dist/accessories/cover-accessory.js.map +1 -1
  7. package/dist/accessories/gate-accessory.d.ts +20 -0
  8. package/dist/accessories/gate-accessory.d.ts.map +1 -0
  9. package/dist/accessories/gate-accessory.js +70 -0
  10. package/dist/accessories/gate-accessory.js.map +1 -0
  11. package/dist/accessories/light-accessory.d.ts.map +1 -1
  12. package/dist/accessories/sensor-accessory.d.ts.map +1 -1
  13. package/dist/accessories/thermostat-accessory.d.ts +2 -0
  14. package/dist/accessories/thermostat-accessory.d.ts.map +1 -1
  15. package/dist/accessories/thermostat-accessory.js +22 -87
  16. package/dist/accessories/thermostat-accessory.js.map +1 -1
  17. package/dist/accessories/zone-accessory.d.ts.map +1 -1
  18. package/dist/debug-capture/analysis.d.ts +6 -0
  19. package/dist/debug-capture/analysis.d.ts.map +1 -0
  20. package/dist/debug-capture/analysis.js +48 -0
  21. package/dist/debug-capture/analysis.js.map +1 -0
  22. package/dist/debug-capture/file-generator.d.ts +9 -0
  23. package/dist/debug-capture/file-generator.d.ts.map +1 -0
  24. package/dist/debug-capture/file-generator.js +116 -0
  25. package/dist/debug-capture/file-generator.js.map +1 -0
  26. package/dist/debug-capture/index.d.ts +22 -0
  27. package/dist/debug-capture/index.d.ts.map +1 -0
  28. package/dist/debug-capture/index.js +126 -0
  29. package/dist/debug-capture/index.js.map +1 -0
  30. package/dist/debug-capture/raw-message-capture.d.ts +3 -0
  31. package/dist/debug-capture/raw-message-capture.d.ts.map +1 -0
  32. package/dist/debug-capture/raw-message-capture.js +33 -0
  33. package/dist/debug-capture/raw-message-capture.js.map +1 -0
  34. package/dist/debug-capture/types.d.ts +14 -0
  35. package/dist/debug-capture/types.d.ts.map +1 -0
  36. package/dist/debug-capture/types.js +3 -0
  37. package/dist/debug-capture/types.js.map +1 -0
  38. package/dist/debug-capture.d.ts +3 -42
  39. package/dist/debug-capture.d.ts.map +1 -1
  40. package/dist/debug-capture.js +6 -278
  41. package/dist/debug-capture.js.map +1 -1
  42. package/dist/device-id.d.ts +12 -0
  43. package/dist/device-id.d.ts.map +1 -0
  44. package/dist/device-id.js +47 -0
  45. package/dist/device-id.js.map +1 -0
  46. package/dist/errors.d.ts +16 -0
  47. package/dist/errors.d.ts.map +1 -0
  48. package/dist/errors.js +37 -0
  49. package/dist/errors.js.map +1 -0
  50. package/dist/mqtt/state-payload-mapper.d.ts +3 -0
  51. package/dist/mqtt/state-payload-mapper.d.ts.map +1 -0
  52. package/dist/mqtt/state-payload-mapper.js +80 -0
  53. package/dist/mqtt/state-payload-mapper.js.map +1 -0
  54. package/dist/mqtt/topic-parser.d.ts +8 -0
  55. package/dist/mqtt/topic-parser.d.ts.map +1 -0
  56. package/dist/mqtt/topic-parser.js +42 -0
  57. package/dist/mqtt/topic-parser.js.map +1 -0
  58. package/dist/mqtt-bridge/accessory-index-service.d.ts +15 -0
  59. package/dist/mqtt-bridge/accessory-index-service.d.ts.map +1 -0
  60. package/dist/mqtt-bridge/accessory-index-service.js +77 -0
  61. package/dist/mqtt-bridge/accessory-index-service.js.map +1 -0
  62. package/dist/mqtt-bridge/command-executor.d.ts +17 -0
  63. package/dist/mqtt-bridge/command-executor.d.ts.map +1 -0
  64. package/dist/mqtt-bridge/command-executor.js +108 -0
  65. package/dist/mqtt-bridge/command-executor.js.map +1 -0
  66. package/dist/mqtt-bridge/index.d.ts +21 -0
  67. package/dist/mqtt-bridge/index.d.ts.map +1 -0
  68. package/dist/mqtt-bridge/index.js +183 -0
  69. package/dist/mqtt-bridge/index.js.map +1 -0
  70. package/dist/mqtt-bridge.d.ts +3 -30
  71. package/dist/mqtt-bridge.d.ts.map +1 -1
  72. package/dist/mqtt-bridge.js +6 -381
  73. package/dist/mqtt-bridge.js.map +1 -1
  74. package/dist/platform/accessory-handler-service.d.ts +12 -0
  75. package/dist/platform/accessory-handler-service.d.ts.map +1 -0
  76. package/dist/platform/accessory-handler-service.js +86 -0
  77. package/dist/platform/accessory-handler-service.js.map +1 -0
  78. package/dist/platform/accessory-registry.d.ts +26 -0
  79. package/dist/platform/accessory-registry.d.ts.map +1 -0
  80. package/dist/platform/accessory-registry.js +64 -0
  81. package/dist/platform/accessory-registry.js.map +1 -0
  82. package/dist/platform/config-file-service.d.ts +8 -0
  83. package/dist/platform/config-file-service.d.ts.map +1 -0
  84. package/dist/platform/config-file-service.js +62 -0
  85. package/dist/platform/config-file-service.js.map +1 -0
  86. package/dist/platform/device-list-service.d.ts +24 -0
  87. package/dist/platform/device-list-service.d.ts.map +1 -0
  88. package/dist/platform/device-list-service.js +264 -0
  89. package/dist/platform/device-list-service.js.map +1 -0
  90. package/dist/platform/discovery-service.d.ts +13 -0
  91. package/dist/platform/discovery-service.d.ts.map +1 -0
  92. package/dist/platform/discovery-service.js +69 -0
  93. package/dist/platform/discovery-service.js.map +1 -0
  94. package/dist/platform/index.d.ts +36 -0
  95. package/dist/platform/index.d.ts.map +1 -0
  96. package/dist/platform/index.js +158 -0
  97. package/dist/platform/index.js.map +1 -0
  98. package/dist/platform/platform-lifecycle-service.d.ts +10 -0
  99. package/dist/platform/platform-lifecycle-service.d.ts.map +1 -0
  100. package/dist/platform/platform-lifecycle-service.js +30 -0
  101. package/dist/platform/platform-lifecycle-service.js.map +1 -0
  102. package/dist/platform/types.d.ts +61 -0
  103. package/dist/platform/types.d.ts.map +1 -0
  104. package/dist/platform/types.js +3 -0
  105. package/dist/platform/types.js.map +1 -0
  106. package/dist/platform.d.ts +3 -81
  107. package/dist/platform.d.ts.map +1 -1
  108. package/dist/platform.js +6 -467
  109. package/dist/platform.js.map +1 -1
  110. package/dist/thermostat-mode.d.ts +7 -0
  111. package/dist/thermostat-mode.d.ts.map +1 -0
  112. package/dist/thermostat-mode.js +80 -0
  113. package/dist/thermostat-mode.js.map +1 -0
  114. package/dist/thermostat-state.d.ts +12 -0
  115. package/dist/thermostat-state.d.ts.map +1 -0
  116. package/dist/thermostat-state.js +56 -0
  117. package/dist/thermostat-state.js.map +1 -0
  118. package/dist/types/device-status.types.d.ts +34 -0
  119. package/dist/types/device-status.types.d.ts.map +1 -0
  120. package/dist/types/device-status.types.js +3 -0
  121. package/dist/types/device-status.types.js.map +1 -0
  122. package/dist/types/device.types.d.ts +41 -0
  123. package/dist/types/device.types.d.ts.map +1 -0
  124. package/dist/types/device.types.js +3 -0
  125. package/dist/types/device.types.js.map +1 -0
  126. package/dist/types/guards/device-guards.d.ts +8 -0
  127. package/dist/types/guards/device-guards.d.ts.map +1 -0
  128. package/dist/types/guards/device-guards.js +27 -0
  129. package/dist/types/guards/device-guards.js.map +1 -0
  130. package/dist/types/guards/mqtt-command-guards.d.ts +6 -0
  131. package/dist/types/guards/mqtt-command-guards.d.ts.map +1 -0
  132. package/dist/types/guards/mqtt-command-guards.js +50 -0
  133. package/dist/types/guards/mqtt-command-guards.js.map +1 -0
  134. package/dist/types/index.d.ts +8 -0
  135. package/dist/types/index.d.ts.map +1 -0
  136. package/dist/types/index.js +24 -0
  137. package/dist/types/index.js.map +1 -0
  138. package/dist/types/mqtt.types.d.ts +64 -0
  139. package/dist/types/mqtt.types.d.ts.map +1 -0
  140. package/dist/types/mqtt.types.js +3 -0
  141. package/dist/types/mqtt.types.js.map +1 -0
  142. package/dist/types/room-mapping.types.d.ts +13 -0
  143. package/dist/types/room-mapping.types.d.ts.map +1 -0
  144. package/dist/types/room-mapping.types.js +3 -0
  145. package/dist/types/room-mapping.types.js.map +1 -0
  146. package/dist/types/websocket.types.d.ts +111 -0
  147. package/dist/types/websocket.types.d.ts.map +1 -0
  148. package/dist/types/websocket.types.js +3 -0
  149. package/dist/types/websocket.types.js.map +1 -0
  150. package/dist/types.d.ts +3 -273
  151. package/dist/types.d.ts.map +1 -1
  152. package/dist/types.js +17 -76
  153. package/dist/types.js.map +1 -1
  154. package/dist/websocket/command-dispatcher.d.ts +15 -0
  155. package/dist/websocket/command-dispatcher.d.ts.map +1 -0
  156. package/dist/websocket/command-dispatcher.js +74 -0
  157. package/dist/websocket/command-dispatcher.js.map +1 -0
  158. package/dist/websocket/device-state-projector.d.ts +10 -0
  159. package/dist/websocket/device-state-projector.d.ts.map +1 -0
  160. package/dist/websocket/device-state-projector.js +157 -0
  161. package/dist/websocket/device-state-projector.js.map +1 -0
  162. package/dist/websocket/protocol-router.d.ts +16 -0
  163. package/dist/websocket/protocol-router.d.ts.map +1 -0
  164. package/dist/websocket/protocol-router.js +39 -0
  165. package/dist/websocket/protocol-router.js.map +1 -0
  166. package/dist/websocket/ws-transport.d.ts +11 -0
  167. package/dist/websocket/ws-transport.d.ts.map +1 -0
  168. package/dist/websocket/ws-transport.js +61 -0
  169. package/dist/websocket/ws-transport.js.map +1 -0
  170. package/dist/websocket-client/command-service.d.ts +37 -0
  171. package/dist/websocket-client/command-service.d.ts.map +1 -0
  172. package/dist/websocket-client/command-service.js +252 -0
  173. package/dist/websocket-client/command-service.js.map +1 -0
  174. package/dist/websocket-client/connection-service.d.ts +31 -0
  175. package/dist/websocket-client/connection-service.d.ts.map +1 -0
  176. package/dist/websocket-client/connection-service.js +241 -0
  177. package/dist/websocket-client/connection-service.js.map +1 -0
  178. package/dist/websocket-client/crc16.d.ts +2 -0
  179. package/dist/websocket-client/crc16.d.ts.map +1 -0
  180. package/dist/websocket-client/crc16.js +44 -0
  181. package/dist/websocket-client/crc16.js.map +1 -0
  182. package/dist/websocket-client/device-parsers.d.ts +8 -0
  183. package/dist/websocket-client/device-parsers.d.ts.map +1 -0
  184. package/dist/websocket-client/device-parsers.js +43 -0
  185. package/dist/websocket-client/device-parsers.js.map +1 -0
  186. package/dist/websocket-client/index.d.ts +43 -0
  187. package/dist/websocket-client/index.d.ts.map +1 -0
  188. package/dist/websocket-client/index.js +190 -0
  189. package/dist/websocket-client/index.js.map +1 -0
  190. package/dist/websocket-client/message-service.d.ts +31 -0
  191. package/dist/websocket-client/message-service.d.ts.map +1 -0
  192. package/dist/websocket-client/message-service.js +189 -0
  193. package/dist/websocket-client/message-service.js.map +1 -0
  194. package/dist/websocket-client/state.d.ts +3 -0
  195. package/dist/websocket-client/state.d.ts.map +1 -0
  196. package/dist/websocket-client/state.js +18 -0
  197. package/dist/websocket-client/state.js.map +1 -0
  198. package/dist/websocket-client/status-updater.d.ts +23 -0
  199. package/dist/websocket-client/status-updater.d.ts.map +1 -0
  200. package/dist/websocket-client/status-updater.js +192 -0
  201. package/dist/websocket-client/status-updater.js.map +1 -0
  202. package/dist/websocket-client/system-temperature-updater.d.ts +19 -0
  203. package/dist/websocket-client/system-temperature-updater.d.ts.map +1 -0
  204. package/dist/websocket-client/system-temperature-updater.js +95 -0
  205. package/dist/websocket-client/system-temperature-updater.js.map +1 -0
  206. package/dist/websocket-client/types.d.ts +76 -0
  207. package/dist/websocket-client/types.d.ts.map +1 -0
  208. package/dist/websocket-client/types.js +3 -0
  209. package/dist/websocket-client/types.js.map +1 -0
  210. package/dist/websocket-client.d.ts +3 -61
  211. package/dist/websocket-client.d.ts.map +1 -1
  212. package/dist/websocket-client.js +5 -1011
  213. package/dist/websocket-client.js.map +1 -1
  214. package/package.json +7 -2
package/CHANGELOG.md CHANGED
@@ -7,6 +7,107 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.0.0-beta.1] - 2026-03-07
11
+
12
+ ### Changed
13
+
14
+ - Release version bump for npm publication continuity after `2.0.0-beta.0` version lock.
15
+
16
+ ## [2.0.0-beta.0] - 2026-03-07
17
+
18
+ ### Added
19
+
20
+ - **Modular architecture rollout** with facade compatibility preserved:
21
+ - `platform/` split with dedicated lifecycle/discovery/registry/config services
22
+ - `websocket-client/` split with transport/router/dispatcher/projector internals
23
+ - `mqtt-bridge/` split with command execution and accessory indexing services
24
+ - `debug-capture/` split with capture/analysis/file generation modules
25
+ - **Governance quality gates**:
26
+ - `npm run check:max-lines` enforcing `src/**/*.ts <= 300` lines
27
+ - `npm run verify` for strict TypeScript + tests + build
28
+ - CI workflow for automated gate execution on push/PR
29
+ - **Release scripts**:
30
+ - `npm run release:dry-run`
31
+ - `npm run release:beta`
32
+
33
+ ### Changed
34
+
35
+ - Internal architecture now follows explicit layered hierarchy:
36
+ - `Communication -> Domain -> Infrastructure`
37
+ - `ARCHITECTURE.md` updated to document module responsibilities and flows.
38
+
39
+ ### Compatibility
40
+
41
+ - No breaking changes to Homebridge runtime contract:
42
+ - `PLATFORM_NAME` / `PLUGIN_NAME` unchanged
43
+ - accessory UUID generation unchanged
44
+ - config schema keys unchanged
45
+ - MQTT topic/payload contract unchanged
46
+ - public facades (`Lares4Platform`, `KseniaWebSocketClient`, `MqttBridge`, `DebugCaptureManager`) preserved
47
+
48
+ ## [1.1.9-beta0] - 2026-03-07
49
+
50
+ ### Added
51
+
52
+ - **Command response timeout control**: Added `commandTimeoutMs` configuration to tune write command ACK timeout.
53
+ - **Refactoring architecture modules** (internal, non-breaking):
54
+ - `device-id` helpers for canonical ID parsing/building
55
+ - `thermostat-mode` mapping helpers
56
+ - `thermostat-state` compatibility adapter (status as canonical)
57
+ - WebSocket internal components (`command-dispatcher`, `protocol-router`, `device-state-projector`, `ws-transport`)
58
+ - MQTT internal helpers (`topic-parser`, `state-payload-mapper`)
59
+ - Platform internal services (`accessory-registry`, `discovery-service`, `platform-lifecycle-service`)
60
+ - **Architecture documentation**: Added `ARCHITECTURE.md`.
61
+ - **Extended automated test suite**: Added characterization/contract tests for lifecycle helpers, WS command flow components, topic/payload contracts, thermostat mappings and ID utilities (`node --test`).
62
+
63
+ ### Fixed
64
+
65
+ - **Thermostat discovery gap**: Outputs recognized as thermostats are now discovered and exposed correctly.
66
+ - **Login false-positive**: WebSocket `connect()` now resolves only after `LOGIN_RES=OK` with explicit login timeout.
67
+ - **Accessory cache drift**: Added stale accessory pruning after initial sync to remove ghost accessories.
68
+ - **Race conditions on commands**: Added per-device command queueing and command ACK waiting to avoid concurrent command overlap.
69
+ - **Runtime value validation**: Added numeric parsing/clamping guards before HomeKit characteristic updates to avoid `NaN`/out-of-range propagation.
70
+ - **Gate handling consistency**: Added `gate_` normalization in IDs and room mapping validation.
71
+ - **Shutdown cleanup**: Improved disconnect flow for WebSocket and MQTT bridge on Homebridge shutdown.
72
+ - **Debug capture safety**: Masked sensitive parsed payload data and restored WebSocket hooks reliably after capture.
73
+
74
+ ### Security
75
+
76
+ - **TLS verification policy**: Certificate verification is strict by default; insecure TLS requires explicit `allowInsecureTls=true`.
77
+
78
+ ## [1.1.8] - 2026-03-07
79
+
80
+ ### Fixed
81
+
82
+ - **WebSocket session leak (firmware crash)**: Replaced `ws.terminate()` with graceful `ws.close(1001, 'Heartbeat timeout')` in `forceReconnect()`. The firmware now receives the WebSocket CLOSE frame and can properly release the session. Previously, abrupt TCP disconnects left "ghost" sessions accumulating on the firmware over weeks, eventually causing firmware lockup requiring full reset.
83
+ - **Double reconnect scheduling**: Added `isManualClose` flag to prevent the `close` event handler from calling `scheduleReconnect()` when the disconnect was intentional (from `forceReconnect()` or `disconnect()`). This fixes the broken exponential backoff caused by double-scheduling.
84
+ - **PIN exposed in logs**: Applied `maskSensitiveData()` to `sendMessage()` log output. The PIN was previously logged in plain text during the login message.
85
+ - **Cover movement simulation race condition**: `updateStatus()` no longer overwrites `currentPosition`/`targetPosition` while a local movement simulation interval is active. This prevents conflicting updates between the local simulation and real-time firmware messages.
86
+ - **Cover simulation not stopped on firmware stop**: The movement simulation interval is now cancelled when the firmware signals `state: 'stopped'` (e.g., user stops cover physically via Ksenia app).
87
+ - **Cover NaN stepTime in setInterval**: Added guard to detect `distance === 0` or invalid `stepTime` before starting the simulation interval, preventing `setInterval(fn, NaN)` which fires immediately and continuously.
88
+
89
+ ### Changed
90
+
91
+ - Removed all emoji characters from log messages, documentation, and UI schema
92
+ - Version bumped from 1.1.7-beta2 to 1.1.8 (stable release)
93
+
94
+ ## [1.1.7-beta2] - 2026-01-17
95
+
96
+ ### Added
97
+
98
+ - **System Temperature Sensors**: New automatic sensors for system temperatures
99
+ - Internal temperature sensor (`Temperatura Interna`) from central unit
100
+ - External temperature sensor (`Temperatura Esterna`) from external probe (if available)
101
+ - Sensors are created dynamically only when temperature data is available (not "NA")
102
+ - Real-time updates via STATUS_SYSTEM messages
103
+ - Follows the same pattern as BUS_HA sensors for consistency
104
+ - Can be assigned to different rooms and used in HomeKit automations
105
+
106
+ ### Improved
107
+
108
+ - Enhanced temperature handling with proper NA (not available) detection
109
+ - Type-safe implementation with updated interfaces for STATUS_SYSTEM data structure
110
+
10
111
  ## [1.1.7] - 2026-01-14
11
112
 
12
113
  ### Added
@@ -76,7 +177,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
76
177
  - Added `forceReconnect()` method for clean reconnection on timeout
77
178
  - Added `moveInterval` property to `CoverAccessory` for proper cleanup
78
179
 
79
-
80
180
  ## [1.1.5] - 2025-12-28
81
181
 
82
182
  ### Added
package/README.md CHANGED
@@ -17,15 +17,18 @@ Complete plugin for Ksenia Lares4 systems integrating security zones, lights, co
17
17
  - **Smart Covers**: Percentage control with configurable timing
18
18
  - **Thermostats**: Temperature and heating/cooling mode control
19
19
  - **Environmental Sensors**: Real-time temperature, humidity, and light levels
20
+ - **System Temperature Sensors**: Internal and external temperature from central unit
20
21
  - **Real-time Updates**: WebSocket connection with automatic reconnection
22
+ - **Command ACK & Timeout**: Write commands wait for API response with configurable timeout
21
23
  - **UI Configuration**: Complete graphical interface in Homebridge UI
22
24
  - **Customization**: Custom names and selective entity exclusion
23
25
  - **MQTT Bridge**: State publishing and command reception via MQTT (optional)
26
+ - **Documented Internal Architecture**: See `ARCHITECTURE.md` for module responsibilities and flows
24
27
 
25
28
  ### Prerequisites
26
29
 
27
30
  - Homebridge >= 1.6.0
28
- - Node.js >= 14.18.1
31
+ - Node.js >= 20.0.0
29
32
  - Ksenia Lares4 system with WebSocket access enabled
30
33
 
31
34
  ### Installation
@@ -102,6 +105,8 @@ The plugin can be fully configured via the Homebridge UI graphical interface. Re
102
105
  | `maxSeconds` | number | 30 | Max cover travel time (seconds) |
103
106
  | `reconnectInterval` | number | 5000 | Reconnection interval (ms) |
104
107
  | `heartbeatInterval` | number | 30000 | Heartbeat interval (ms) |
108
+ | `commandTimeoutMs` | number | 8000 | API command response timeout (ms) |
109
+ | `allowInsecureTls` | boolean | false | Disable TLS certificate validation (trusted LAN only) |
105
110
  | `debug` | boolean | false | Detailed logging |
106
111
  | `excludeZones` | string[] | [] | Zones to exclude |
107
112
  | `excludeOutputs` | string[] | [] | Outputs to exclude |
@@ -132,7 +137,7 @@ The plugin can be fully configured via the Homebridge UI graphical interface. Re
132
137
  #### Thermostats
133
138
 
134
139
  - **HomeKit Type**: Thermostat
135
- - **Modes**: Off/Heat/Cool
140
+ - **Modes**: Off/Heat/Cool/Auto
136
141
  - **Control**: Target temperature
137
142
  - **Sensors**: Current temperature
138
143
 
@@ -169,46 +174,48 @@ Enable the MQTT bridge in the "MQTT Bridge" configuration section:
169
174
 
170
175
  Accessory states are published to the following topics:
171
176
 
172
- - **Lights**: `homebridge/klares4/light/{id}/state`
173
- - **Covers**: `homebridge/klares4/cover/{id}/state`
174
- - **Thermostats**: `homebridge/klares4/thermostat/{id}/state`
175
- - **Sensors**: `homebridge/klares4/sensor/{id}/state`
176
- - **Zones**: `homebridge/klares4/zone/{id}/state`
177
- - **Scenarios**: `homebridge/klares4/scenario/{id}/state`
177
+ - **Lights**: `homebridge/klares4/light/{slug}/state`
178
+ - **Covers**: `homebridge/klares4/cover/{slug}/state`
179
+ - **Thermostats**: `homebridge/klares4/thermostat/{slug}/state`
180
+ - **Sensors**: `homebridge/klares4/sensor/{slug}/state`
181
+ - **Zones**: `homebridge/klares4/zone/{slug}/state`
182
+ - **Scenarios**: `homebridge/klares4/scenario/{slug}/state`
178
183
 
179
184
  #### Command Reception
180
185
 
181
186
  Send commands to accessories on the following topics:
182
187
 
183
- - **Lights**: `homebridge/klares4/light/{id}/set`
184
- - **Covers**: `homebridge/klares4/cover/{id}/set`
185
- - **Thermostats**: `homebridge/klares4/thermostat/{id}/set`
186
- - **Scenarios**: `homebridge/klares4/scenario/{id}/set`
188
+ - **Lights**: `homebridge/klares4/light/{device_id_or_slug}/set`
189
+ - **Covers**: `homebridge/klares4/cover/{device_id_or_slug}/set`
190
+ - **Thermostats**: `homebridge/klares4/thermostat/{device_id_or_slug}/set`
191
+ - **Scenarios**: `homebridge/klares4/scenario/{device_id_or_slug}/set`
192
+
193
+ Examples of canonical device IDs: `light_1`, `cover_2`, `thermostat_3`, `scenario_4`.
187
194
 
188
195
  #### Usage Examples
189
196
 
190
197
  ##### Turn on a light:
191
198
 
192
199
  ```bash
193
- mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/light/1/set" -m '{"on": true, "brightness": 80}'
200
+ mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/light/light_1/set" -m '{"on": true, "brightness": 80}'
194
201
  ```
195
202
 
196
203
  ##### Move a cover:
197
204
 
198
205
  ```bash
199
- mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/cover/2/set" -m '{"position": 50}'
206
+ mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/cover/cover_2/set" -m '{"position": 50}'
200
207
  ```
201
208
 
202
209
  ##### Set thermostat temperature:
203
210
 
204
211
  ```bash
205
- mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/thermostat/3/set" -m '{"targetTemperature": 22, "mode": "heat"}'
212
+ mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/thermostat/thermostat_3/set" -m '{"targetTemperature": 22, "mode": "heat"}'
206
213
  ```
207
214
 
208
215
  ##### Trigger a scenario:
209
216
 
210
217
  ```bash
211
- mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/scenario/4/set" -m '{"active": true}'
218
+ mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/scenario/scenario_4/set" -m '{"active": true}'
212
219
  ```
213
220
 
214
221
  ### Troubleshooting
@@ -232,6 +239,57 @@ Enable debug logging for detailed diagnostics:
232
239
  }
233
240
  ```
234
241
 
242
+ ### Development Quality Gates
243
+
244
+ For local validation before publishing:
245
+
246
+ ```bash
247
+ npm run verify
248
+ ```
249
+
250
+ This runs:
251
+
252
+ - max file size gate (`src/**/*.ts` <= 300 lines),
253
+ - strict TypeScript checks (`--noUnusedLocals --noUnusedParameters`),
254
+ - full test suite,
255
+ - build compatibility gate.
256
+
257
+ ### Roadmap
258
+
259
+ #### Planned for v1.2.0
260
+
261
+ The following entity types are currently not supported but are planned for the next beta release:
262
+
263
+ ##### Irrigation Systems (IRR)
264
+
265
+ - **Type**: Switch (bistable)
266
+ - **Examples**: Drip irrigation, garden zones, lawn sprinklers
267
+ - **HomeKit Mapping**: Valve/Switch accessories
268
+ - **Status**: Planned
269
+
270
+ ##### Indicators & Status LEDs (GEN, MOD:S)
271
+
272
+ - **Type**: Read-only sensors/switches
273
+ - **Examples**: Zone status indicators, system LEDs
274
+ - **HomeKit Mapping**: Contact Sensor (read-only)
275
+ - **Status**: Planned
276
+
277
+ ##### Sirens & Alarms (GEN, MOD:AT)
278
+
279
+ - **Type**: Switch (manual control)
280
+ - **Examples**: External siren, internal siren
281
+ - **HomeKit Mapping**: Switch with security considerations
282
+ - **Status**: Under evaluation
283
+
284
+ ##### Alarm Bridges (GEN, MOD:A)
285
+
286
+ - **Type**: Read-only sensors
287
+ - **Examples**: State bridges, alarm bridges
288
+ - **HomeKit Mapping**: Contact Sensor (read-only)
289
+ - **Status**: Planned
290
+
291
+ **Note**: These features will be implemented based on user feedback and testing. If you have one of these devices and would like to help with testing, please open an issue on GitHub.
292
+
235
293
  ### License
236
294
 
237
295
  This project is released under the MIT license.
@@ -240,7 +298,7 @@ This project is released under the MIT license.
240
298
 
241
299
  - [Homebridge](https://homebridge.io/)
242
300
  - [Homebridge UI](https://github.com/homebridge/homebridge-config-ui-x)
243
- - [Ksenia Security](https://www.ksenia.it/)
301
+ - [Ksenia Security](https://www.kseniasecurity.com/)
244
302
 
245
303
  ---
246
304
 
@@ -253,6 +311,7 @@ This project is released under the MIT license.
253
311
  - **Tapparelle Intelligenti**: Controllo percentuale con timing configurabile
254
312
  - **Termostati**: Controllo temperatura e modalita riscaldamento/raffreddamento
255
313
  - **Sensori Ambientali**: Temperatura, umidita e luminosita in tempo reale
314
+ - **Sensori Temperatura Sistema**: Temperatura interna ed esterna dalla centrale
256
315
  - **Aggiornamenti Real-time**: Connessione WebSocket con riconnessione automatica
257
316
  - **Configurazione UI**: Interfaccia grafica completa in Homebridge UI
258
317
  - **Personalizzazione**: Nomi personalizzati ed esclusione selettiva di entita
@@ -261,7 +320,7 @@ This project is released under the MIT license.
261
320
  ### Prerequisiti
262
321
 
263
322
  - Homebridge >= 1.6.0
264
- - Node.js >= 14.18.1
323
+ - Node.js >= 20.0.0
265
324
  - Sistema Ksenia Lares4 con accesso WebSocket abilitato
266
325
 
267
326
  ### Installazione
@@ -368,7 +427,7 @@ Il plugin puo essere configurato completamente tramite l'interfaccia grafica di
368
427
  #### Termostati
369
428
 
370
429
  - **Tipo HomeKit**: Thermostat
371
- - **Modalita**: Off/Heat/Cool
430
+ - **Modalita**: Off/Heat/Cool/Auto
372
431
  - **Controllo**: Temperatura target
373
432
  - **Sensori**: Temperatura corrente
374
433
 
@@ -405,46 +464,48 @@ Abilita il bridge MQTT nella sezione "MQTT Bridge" della configurazione:
405
464
 
406
465
  Gli stati degli accessori vengono pubblicati sui seguenti topic:
407
466
 
408
- - **Luci**: `homebridge/klares4/light/{id}/state`
409
- - **Tapparelle**: `homebridge/klares4/cover/{id}/state`
410
- - **Termostati**: `homebridge/klares4/thermostat/{id}/state`
411
- - **Sensori**: `homebridge/klares4/sensor/{id}/state`
412
- - **Zone**: `homebridge/klares4/zone/{id}/state`
413
- - **Scenari**: `homebridge/klares4/scenario/{id}/state`
467
+ - **Luci**: `homebridge/klares4/light/{slug}/state`
468
+ - **Tapparelle**: `homebridge/klares4/cover/{slug}/state`
469
+ - **Termostati**: `homebridge/klares4/thermostat/{slug}/state`
470
+ - **Sensori**: `homebridge/klares4/sensor/{slug}/state`
471
+ - **Zone**: `homebridge/klares4/zone/{slug}/state`
472
+ - **Scenari**: `homebridge/klares4/scenario/{slug}/state`
414
473
 
415
474
  #### Ricezione Comandi
416
475
 
417
476
  Invia comandi agli accessori sui seguenti topic:
418
477
 
419
- - **Luci**: `homebridge/klares4/light/{id}/set`
420
- - **Tapparelle**: `homebridge/klares4/cover/{id}/set`
421
- - **Termostati**: `homebridge/klares4/thermostat/{id}/set`
422
- - **Scenari**: `homebridge/klares4/scenario/{id}/set`
478
+ - **Luci**: `homebridge/klares4/light/{device_id_or_slug}/set`
479
+ - **Tapparelle**: `homebridge/klares4/cover/{device_id_or_slug}/set`
480
+ - **Termostati**: `homebridge/klares4/thermostat/{device_id_or_slug}/set`
481
+ - **Scenari**: `homebridge/klares4/scenario/{device_id_or_slug}/set`
482
+
483
+ Esempi di ID canonici: `light_1`, `cover_2`, `thermostat_3`, `scenario_4`.
423
484
 
424
485
  #### Esempi di Utilizzo
425
486
 
426
487
  ##### Accendere una luce:
427
488
 
428
489
  ```bash
429
- mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/light/1/set" -m '{"on": true, "brightness": 80}'
490
+ mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/light/light_1/set" -m '{"on": true, "brightness": 80}'
430
491
  ```
431
492
 
432
493
  ##### Muovere una tapparella:
433
494
 
434
495
  ```bash
435
- mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/cover/2/set" -m '{"position": 50}'
496
+ mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/cover/cover_2/set" -m '{"position": 50}'
436
497
  ```
437
498
 
438
499
  ##### Impostare temperatura termostato:
439
500
 
440
501
  ```bash
441
- mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/thermostat/3/set" -m '{"targetTemperature": 22, "mode": "heat"}'
502
+ mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/thermostat/thermostat_3/set" -m '{"targetTemperature": 22, "mode": "heat"}'
442
503
  ```
443
504
 
444
505
  ##### Attivare uno scenario:
445
506
 
446
507
  ```bash
447
- mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/scenario/4/set" -m '{"active": true}'
508
+ mosquitto_pub -h 192.168.1.100 -t "homebridge/klares4/scenario/scenario_4/set" -m '{"active": true}'
448
509
  ```
449
510
 
450
511
  ### Risoluzione Problemi
@@ -482,11 +543,47 @@ I contributi sono benvenuti! Per contribuire:
482
543
 
483
544
  Questo progetto e rilasciato sotto licenza MIT.
484
545
 
546
+ ### Roadmap
547
+
548
+ #### Pianificato per v1.2.0
549
+
550
+ I seguenti tipi di entità non sono attualmente supportati ma sono pianificati per la prossima release beta:
551
+
552
+ ##### Sistemi di Irrigazione (IRR)
553
+
554
+ - **Tipo**: Switch (bistabile)
555
+ - **Esempi**: Irrigazione a goccia, zone giardino, irrigatori
556
+ - **Mappatura HomeKit**: Accessori Valve/Switch
557
+ - **Stato**: Pianificato
558
+
559
+ ##### Indicatori e LED di Stato (GEN, MOD:S)
560
+
561
+ - **Tipo**: Sensori/switch in sola lettura
562
+ - **Esempi**: Spie stato zone, LED di sistema
563
+ - **Mappatura HomeKit**: Sensore di contatto (sola lettura)
564
+ - **Stato**: Pianificato
565
+
566
+ ##### Sirene e Allarmi (GEN, MOD:AT)
567
+
568
+ - **Tipo**: Switch (controllo manuale)
569
+ - **Esempi**: Sirena esterna, sirena interna
570
+ - **Mappatura HomeKit**: Switch con considerazioni di sicurezza
571
+ - **Stato**: In valutazione
572
+
573
+ ##### Ponti Allarme (GEN, MOD:A)
574
+
575
+ - **Tipo**: Sensori in sola lettura
576
+ - **Esempi**: Ponti di stato, ponti allarme
577
+ - **Mappatura HomeKit**: Sensore di contatto (sola lettura)
578
+ - **Stato**: Pianificato
579
+
580
+ **Nota**: Queste funzionalità verranno implementate in base al feedback degli utenti e ai test. Se hai uno di questi dispositivi e desideri aiutare con i test, apri una issue su GitHub.
581
+
485
582
  ### Link Utili
486
583
 
487
584
  - [Homebridge](https://homebridge.io/)
488
585
  - [Homebridge UI](https://github.com/homebridge/homebridge-config-ui-x)
489
- - [Ksenia Security](https://www.ksenia.it/)
586
+ - [Ksenia Security](https://www.kseniasecurity.com/)
490
587
 
491
588
  ---
492
589
 
@@ -4,7 +4,7 @@
4
4
  "singular": true,
5
5
  "customUi": false,
6
6
  "headerDisplay": "<div class='text-center mb-3'><h3>klares4 - Ksenia Lares4 per Homebridge</h3><p class='text-muted'>Integrazione professionale per sistemi di sicurezza Ksenia Lares 4.0</p></div><div class='alert alert-info'><strong>Prima di iniziare, verifica che:</strong><ul class='mb-0 mt-2'><li>La centrale Lares4 sia raggiungibile in rete locale</li><li>L'accesso WebSocket sia abilitato sulla centrale</li><li>Tu disponga di un PIN utente</li></ul></div>",
7
- "footerDisplay": "<div class='text-center mt-4 pt-3 border-top'><p class='text-muted mb-2'>Versione 1.1.6 • Sviluppato da Paolo Trivisonno</p><a href='https://github.com/paolo-trivi/homebridge-plugin-klares4' target='_blank' class='btn btn-sm btn-outline-primary mr-2'>Documentazione</a> <a href='https://github.com/paolo-trivi/homebridge-plugin-klares4/issues' target='_blank' class='btn btn-sm btn-outline-secondary mr-2'>Segnala Bug</a> <a href='https://github.com/sponsors/paolo-trivi' target='_blank' class='btn btn-sm btn-outline-success'>Supporta</a></div>",
7
+ "footerDisplay": "<div class='text-center mt-4 pt-3 border-top'><p class='text-muted mb-2'>Versione 1.1.9-beta0 • Sviluppato da Paolo Trivisonno</p><a href='https://github.com/paolo-trivi/homebridge-plugin-klares4' target='_blank' class='btn btn-sm btn-outline-primary mr-2'>Documentazione</a> <a href='https://github.com/paolo-trivi/homebridge-plugin-klares4/issues' target='_blank' class='btn btn-sm btn-outline-secondary mr-2'>Segnala Bug</a> <a href='https://github.com/sponsors/paolo-trivi' target='_blank' class='btn btn-sm btn-outline-success'>Supporta</a></div>",
8
8
  "schema": {
9
9
  "type": "object",
10
10
  "properties": {
@@ -38,6 +38,12 @@
38
38
  "default": true,
39
39
  "description": "Usa connessione crittografata - raccomandata per la sicurezza"
40
40
  },
41
+ "allowInsecureTls": {
42
+ "title": "Consenti TLS Insicuro",
43
+ "type": "boolean",
44
+ "default": false,
45
+ "description": "Disabilita la verifica del certificato TLS (solo per certificati self-signed in rete locale fidata)"
46
+ },
41
47
  "sender": {
42
48
  "title": "Identificativo Client",
43
49
  "type": "string",
@@ -113,6 +119,14 @@
113
119
  "maximum": 300000,
114
120
  "description": "Millisecondi tra i ping di keep-alive per verificare la connessione"
115
121
  },
122
+ "commandTimeoutMs": {
123
+ "title": "Timeout Comandi API",
124
+ "type": "integer",
125
+ "default": 8000,
126
+ "minimum": 1000,
127
+ "maximum": 30000,
128
+ "description": "Timeout massimo (ms) per attendere la risposta ai comandi inviati alla centrale"
129
+ },
116
130
  "coverStepSize": {
117
131
  "title": "Step Animazione Tapparelle",
118
132
  "type": "integer",
@@ -337,7 +351,7 @@
337
351
  "deviceId": {
338
352
  "title": "ID Dispositivo",
339
353
  "type": "string",
340
- "pattern": "^(light_|cover_|sensor_temp_|sensor_hum_|sensor_light_|zone_|thermostat_|scenario_)[0-9]+$"
354
+ "pattern": "^(light_|cover_|gate_|sensor_temp_|sensor_hum_|sensor_light_|zone_|thermostat_|scenario_)[0-9]+$"
341
355
  },
342
356
  "deviceName": {
343
357
  "title": "Nome Dispositivo",
@@ -357,6 +371,12 @@
357
371
  }
358
372
  }
359
373
  }
374
+ },
375
+ "generateDebugFile": {
376
+ "title": "Genera File Debug",
377
+ "type": "boolean",
378
+ "default": false,
379
+ "description": "Attiva per generare un file di diagnostica completo al prossimo riavvio (si disabilita automaticamente dopo la generazione)"
360
380
  }
361
381
  },
362
382
  "required": [
@@ -735,6 +755,16 @@
735
755
  "key": "heartbeatInterval",
736
756
  "flex": "1 1 200px",
737
757
  "description": "Frequenza ping keep-alive con timeout PONG (v1.1.6)"
758
+ },
759
+ {
760
+ "key": "commandTimeoutMs",
761
+ "flex": "1 1 200px",
762
+ "description": "Timeout risposta per comandi write/cmd_usr"
763
+ },
764
+ {
765
+ "key": "allowInsecureTls",
766
+ "flex": "1 1 220px",
767
+ "description": "Solo per impianti con certificato self-signed"
738
768
  }
739
769
  ]
740
770
  }
@@ -763,8 +793,33 @@
763
793
  ]
764
794
  }
765
795
  ]
796
+ },
797
+ {
798
+ "type": "section",
799
+ "title": "Diagnostica & Debug",
800
+ "expandable": true,
801
+ "expanded": false,
802
+ "items": [
803
+ {
804
+ "type": "help",
805
+ "helpvalue": "<div class='alert alert-warning'><strong>Strumento di Diagnostica Completa</strong><p class='mb-2'>Genera un file di debug con TUTTO il necessario per diagnosticare problemi:</p><ul class='mb-2'><li><strong>Tutti i messaggi WebSocket RAW</strong> per 60 secondi</li><li><strong>Lista completa dispositivi</strong> dalla centrale Ksenia</li><li><strong>Tutti i comandi disponibili</strong> (ZONES, OUTPUTS, BUS_HAS, SCENARIOS, STATUS)</li><li><strong>Stati in tempo reale</strong> durante la cattura</li></ul><p class='mb-0 text-danger'><strong>IMPORTANTE:</strong> Durante i 60 secondi di cattura, <strong>prova tutte le entità che non funzionano usando l'app Ksenia</strong> (accendi/spegni luci, apri/chiudi tapparelle, cambia zone, ecc). Questo ci permetterà di vedere esattamente come la centrale risponde ai comandi.</p></div>"
806
+ },
807
+ {
808
+ "key": "generateDebugFile",
809
+ "title": "Genera File Debug al Prossimo Avvio",
810
+ "description": "Si disattiverà automaticamente dopo la generazione del file"
811
+ },
812
+ {
813
+ "type": "help",
814
+ "helpvalue": "<div class='alert alert-info'><strong>Procedura consigliata:</strong><ol class='mb-0'><li><strong>Attiva</strong> l'opzione sopra e <strong>salva</strong> la configurazione</li><li><strong>Riavvia Homebridge</strong> (il debug inizierà automaticamente)</li><li><strong>Nei prossimi 60 secondi</strong>: apri l'app Ksenia e <strong>testa TUTTE le entità che non funzionano</strong> (luci on/off, tapparelle su/giù, scenari, zone, ecc)</li><li><strong>Attendi</strong> che la cattura finisca (vedrai conferma nei log con il percorso del file)</li><li><strong>Trova il file</strong> usando il pulsante qui sotto o nei log</li><li><strong>Condividi</strong> il file per supporto (PIN già mascherati automaticamente)</li></ol></div>"
815
+ },
816
+ {
817
+ "type": "help",
818
+ "helpvalue": "<div class='alert alert-success'><strong>Percorso File Debug:</strong><p class='mb-2'>I file di debug vengono salvati in:</p><p class='mb-2'><code>~/.homebridge/klares4-debug-*.json</code></p><p class='mb-2'>oppure su macOS:</p><p class='mb-2'><code>/Users/[tuo-username]/.homebridge/klares4-debug-*.json</code></p><p class='mb-0'><strong>Suggerimento:</strong> Cerca il file più recente con nome <code>klares4-debug-</code> seguito dalla data/ora. Il percorso esatto viene mostrato nei log di Homebridge quando il file viene generato.</p></div>"
819
+ }
820
+ ]
766
821
  }
767
822
  ]
768
823
  }
769
824
  ]
770
- }
825
+ }
@@ -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,EAAgB,MAAM,aAAa,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,UAAU,CAAC;AAEzD;;;GAGG;AACH,qBAAa,cAAc;IAUnB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAV9B,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;IACpC,OAAO,CAAC,YAAY,CAAC,CAAiC;gBAGjC,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;IAoDjB,YAAY,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;CAmCpD"}
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;AAE5C;;;GAGG;AACH,qBAAa,cAAc;IAUnB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAV9B,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;IACpC,OAAO,CAAC,YAAY,CAAC,CAAiC;gBAGjC,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;IA2DjB,YAAY,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;CA8CpD"}
@@ -89,6 +89,12 @@ class CoverAccessory {
89
89
  const stepSize = this.platform.config.coverStepSize ?? 5;
90
90
  const totalTime = (distance / 100) * (this.maxSeconds * 1000);
91
91
  const stepTime = totalTime / (distance / stepSize);
92
+ // Guard: nothing to simulate (position already reached during async moveCover, or invalid values)
93
+ if (distance === 0 || isNaN(stepTime) || stepTime <= 0) {
94
+ this.positionState = 2; // Stopped
95
+ this.service.updateCharacteristic(this.platform.Characteristic.PositionState, this.positionState);
96
+ return;
97
+ }
92
98
  let currentStep = 0;
93
99
  const totalSteps = Math.ceil(distance / stepSize);
94
100
  this.moveInterval = setInterval(() => {
@@ -110,11 +116,21 @@ class CoverAccessory {
110
116
  }
111
117
  updateStatus(newDevice) {
112
118
  this.device = newDevice;
113
- if (this.device.status?.position !== this.currentPosition) {
114
- this.currentPosition = this.device.status?.position ?? 0;
115
- this.targetPosition = this.device.status?.position ?? 0;
116
- this.service.updateCharacteristic(this.platform.Characteristic.CurrentPosition, this.currentPosition);
117
- this.service.updateCharacteristic(this.platform.Characteristic.TargetPosition, this.targetPosition);
119
+ // If firmware signals the cover has stopped, cancel any running simulation
120
+ if (this.moveInterval && newDevice.status?.state === 'stopped') {
121
+ clearInterval(this.moveInterval);
122
+ this.moveInterval = undefined;
123
+ this.platform.log.debug(`${this.device.name}: Simulation cancelled by firmware stop`);
124
+ }
125
+ // Only update position/target from firmware when simulation is not active,
126
+ // to avoid the simulation and real firmware updates conflicting
127
+ if (!this.moveInterval) {
128
+ if (this.device.status?.position !== this.currentPosition) {
129
+ this.currentPosition = this.device.status?.position ?? 0;
130
+ this.targetPosition = this.device.status?.position ?? 0;
131
+ this.service.updateCharacteristic(this.platform.Characteristic.CurrentPosition, this.currentPosition);
132
+ this.service.updateCharacteristic(this.platform.Characteristic.TargetPosition, this.targetPosition);
133
+ }
118
134
  }
119
135
  switch (this.device.status?.state) {
120
136
  case 'opening':
@@ -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":";;;AAIA;;;GAGG;AACH,MAAa,cAAc;IASvB,YACqB,QAAwB,EACxB,SAA4B;QAD5B,aAAQ,GAAR,QAAQ,CAAgB;QACxB,cAAS,GAAT,SAAS,CAAmB;QARzC,mBAAc,GAAW,CAAC,CAAC;QAC3B,oBAAe,GAAW,CAAC,CAAC;QAC5B,kBAAa,GAAW,CAAC,CAAC,CAAC,cAAc;QAQ7C,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,MAAqB,CAAC;QACtD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,GAAI,IAAI,CAAC,QAAQ,CAAC,MAAuB,CAAC,UAAU,IAAI,EAAE,CAAC;QAE1E,MAAM,oBAAoB,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAClD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAC7C,CAAC;QACF,IAAI,oBAAoB,EAAE,CAAC;YACvB,oBAAoB;iBACf,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,QAAQ,CAAC;iBACtE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC;iBACrE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;iBAC5E,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACnF,CAAC;QAED,IAAI,CAAC,OAAO;YACR,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC;gBAC/D,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAEpE,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEpF,IAAI,CAAC,OAAO;aACP,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC;aAC/D,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAE/C,IAAI,CAAC,OAAO;aACP,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC;aAC7D,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAE7C,IAAI,CAAC,OAAO;aACP,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC;aAC9D,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACxC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAE9C,MAAM,mBAAmB,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;QACnF,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;QAEhF,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAC1B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,eAAe,EAC5C,mBAAmB,CACtB,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAC1B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,EAC3C,kBAAkB,CACrB,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAC1B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,EAC1C,IAAI,CAAC,aAAa,CACrB,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,KAA0B;QACrD,MAAM,cAAc,GAAG,KAAe,CAAC;QAEvC,IAAI,cAAc,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1C,OAAO;QACX,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QAErC,IAAI,CAAC;YACD,IAAI,cAAc,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;gBACxC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,UAAU;YACtC,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,UAAU;YACtC,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAC7B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,EAC1C,IAAI,CAAC,aAAa,CACrB,CAAC;YAEF,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;YACxE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,eAAe,cAAc,GAAG,CAAC,CAAC;YAE5E,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CACnB,uBAAuB,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,EAC1C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACzD,CAAC;YACF,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,4EAE7C,CAAC;QACN,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,iBAAiB;QAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;IAChE,CAAC;IAEM,KAAK,CAAC,kBAAkB;QAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;IAClE,CAAC;IAEM,KAAK,CAAC,gBAAgB;QACzB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAEO,gBAAgB,CAAC,cAAsB;QAC3C,yEAAyE;QACzE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,0CAA0C,CAAC,CAAC;QAC3F,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,aAAa,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,cAAc,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAI,IAAI,CAAC,QAAQ,CAAC,MAAuB,CAAC,aAAa,IAAI,CAAC,CAAC;QAC3E,MAAM,SAAS,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,SAAS,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;QAEnD,kGAAkG;QAClG,IAAI,QAAQ,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,UAAU;YAClC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAClG,OAAO;QACX,CAAC;QAED,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;QAElD,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAS,EAAE;YACvC,WAAW,EAAE,CAAC;YAEd,IAAI,WAAW,IAAI,UAAU,EAAE,CAAC;gBAC5B,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;gBACtC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,UAAU;gBAElC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAC7B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,eAAe,EAC5C,IAAI,CAAC,eAAe,CACvB,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAC7B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,EAC1C,IAAI,CAAC,aAAa,CACrB,CAAC;gBAEF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CACnB,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,2BAA2B,cAAc,GAAG,CAClE,CAAC;gBACF,aAAa,CAAC,IAAI,CAAC,YAAa,CAAC,CAAC;gBAClC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAC3B,GAAG,EACH,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC,CAClE,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAC7B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,eAAe,EAC5C,IAAI,CAAC,eAAe,CACvB,CAAC;YACN,CAAC;QACL,CAAC,EAAE,QAAQ,CAAC,CAAC;IACjB,CAAC;IAEM,YAAY,CAAC,SAAsB;QACtC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QAExB,2EAA2E;QAC3E,IAAI,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7D,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,yCAAyC,CAAC,CAAC;QAC1F,CAAC;QAED,2EAA2E;QAC3E,gEAAgE;QAChE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;gBACxD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC;gBACzD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC;gBAExD,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAC7B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,eAAe,EAC5C,IAAI,CAAC,eAAe,CACvB,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAC7B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,EAC3C,IAAI,CAAC,cAAc,CACtB,CAAC;YACN,CAAC;QACL,CAAC;QAED,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;YAChC,KAAK,SAAS;gBACV,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;gBACvB,MAAM;YACV,KAAK,SAAS;gBACV,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;gBACvB,MAAM;YACV;gBACI,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,UAAU;QAC1C,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAC7B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,EAC1C,IAAI,CAAC,aAAa,CACrB,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;IACjG,CAAC;CACJ;AA1ND,wCA0NC"}
@@ -0,0 +1,20 @@
1
+ import type { CharacteristicValue, PlatformAccessory } from 'homebridge';
2
+ import type { Lares4Platform } from '../platform';
3
+ import type { KseniaGate } from '../types';
4
+ /**
5
+ * Gate Accessory Handler
6
+ * Handles HomeKit Switch service for Ksenia Lares4 monostable gates (GATE/M)
7
+ * Gates are exposed as momentary switches that trigger on press
8
+ */
9
+ export declare class GateAccessory {
10
+ private readonly platform;
11
+ private readonly accessory;
12
+ private service;
13
+ device: KseniaGate;
14
+ private autoOffTimeout?;
15
+ constructor(platform: Lares4Platform, accessory: PlatformAccessory);
16
+ setOn(value: CharacteristicValue): Promise<void>;
17
+ getOn(): Promise<CharacteristicValue>;
18
+ updateDevice(device: KseniaGate): void;
19
+ }
20
+ //# sourceMappingURL=gate-accessory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-accessory.d.ts","sourceRoot":"","sources":["../../src/accessories/gate-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,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C;;;;GAIG;AACH,qBAAa,aAAa;IAMlB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAN9B,OAAO,CAAC,OAAO,CAAU;IAClB,MAAM,EAAE,UAAU,CAAC;IAC1B,OAAO,CAAC,cAAc,CAAC,CAAiB;gBAGnB,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,iBAAiB;IA8BpC,KAAK,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqChD,KAAK,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAK3C,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;CAIhD"}