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.
- package/CHANGELOG.md +101 -1
- package/README.md +131 -34
- package/config.schema.json +58 -3
- package/dist/accessories/cover-accessory.d.ts.map +1 -1
- package/dist/accessories/cover-accessory.js +21 -5
- package/dist/accessories/cover-accessory.js.map +1 -1
- package/dist/accessories/gate-accessory.d.ts +20 -0
- package/dist/accessories/gate-accessory.d.ts.map +1 -0
- package/dist/accessories/gate-accessory.js +70 -0
- package/dist/accessories/gate-accessory.js.map +1 -0
- package/dist/accessories/light-accessory.d.ts.map +1 -1
- package/dist/accessories/sensor-accessory.d.ts.map +1 -1
- package/dist/accessories/thermostat-accessory.d.ts +2 -0
- package/dist/accessories/thermostat-accessory.d.ts.map +1 -1
- package/dist/accessories/thermostat-accessory.js +22 -87
- package/dist/accessories/thermostat-accessory.js.map +1 -1
- package/dist/accessories/zone-accessory.d.ts.map +1 -1
- package/dist/debug-capture/analysis.d.ts +6 -0
- package/dist/debug-capture/analysis.d.ts.map +1 -0
- package/dist/debug-capture/analysis.js +48 -0
- package/dist/debug-capture/analysis.js.map +1 -0
- package/dist/debug-capture/file-generator.d.ts +9 -0
- package/dist/debug-capture/file-generator.d.ts.map +1 -0
- package/dist/debug-capture/file-generator.js +116 -0
- package/dist/debug-capture/file-generator.js.map +1 -0
- package/dist/debug-capture/index.d.ts +22 -0
- package/dist/debug-capture/index.d.ts.map +1 -0
- package/dist/debug-capture/index.js +126 -0
- package/dist/debug-capture/index.js.map +1 -0
- package/dist/debug-capture/raw-message-capture.d.ts +3 -0
- package/dist/debug-capture/raw-message-capture.d.ts.map +1 -0
- package/dist/debug-capture/raw-message-capture.js +33 -0
- package/dist/debug-capture/raw-message-capture.js.map +1 -0
- package/dist/debug-capture/types.d.ts +14 -0
- package/dist/debug-capture/types.d.ts.map +1 -0
- package/dist/debug-capture/types.js +3 -0
- package/dist/debug-capture/types.js.map +1 -0
- package/dist/debug-capture.d.ts +3 -42
- package/dist/debug-capture.d.ts.map +1 -1
- package/dist/debug-capture.js +6 -278
- package/dist/debug-capture.js.map +1 -1
- package/dist/device-id.d.ts +12 -0
- package/dist/device-id.d.ts.map +1 -0
- package/dist/device-id.js +47 -0
- package/dist/device-id.js.map +1 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +37 -0
- package/dist/errors.js.map +1 -0
- package/dist/mqtt/state-payload-mapper.d.ts +3 -0
- package/dist/mqtt/state-payload-mapper.d.ts.map +1 -0
- package/dist/mqtt/state-payload-mapper.js +80 -0
- package/dist/mqtt/state-payload-mapper.js.map +1 -0
- package/dist/mqtt/topic-parser.d.ts +8 -0
- package/dist/mqtt/topic-parser.d.ts.map +1 -0
- package/dist/mqtt/topic-parser.js +42 -0
- package/dist/mqtt/topic-parser.js.map +1 -0
- package/dist/mqtt-bridge/accessory-index-service.d.ts +15 -0
- package/dist/mqtt-bridge/accessory-index-service.d.ts.map +1 -0
- package/dist/mqtt-bridge/accessory-index-service.js +77 -0
- package/dist/mqtt-bridge/accessory-index-service.js.map +1 -0
- package/dist/mqtt-bridge/command-executor.d.ts +17 -0
- package/dist/mqtt-bridge/command-executor.d.ts.map +1 -0
- package/dist/mqtt-bridge/command-executor.js +108 -0
- package/dist/mqtt-bridge/command-executor.js.map +1 -0
- package/dist/mqtt-bridge/index.d.ts +21 -0
- package/dist/mqtt-bridge/index.d.ts.map +1 -0
- package/dist/mqtt-bridge/index.js +183 -0
- package/dist/mqtt-bridge/index.js.map +1 -0
- package/dist/mqtt-bridge.d.ts +3 -30
- package/dist/mqtt-bridge.d.ts.map +1 -1
- package/dist/mqtt-bridge.js +6 -381
- package/dist/mqtt-bridge.js.map +1 -1
- package/dist/platform/accessory-handler-service.d.ts +12 -0
- package/dist/platform/accessory-handler-service.d.ts.map +1 -0
- package/dist/platform/accessory-handler-service.js +86 -0
- package/dist/platform/accessory-handler-service.js.map +1 -0
- package/dist/platform/accessory-registry.d.ts +26 -0
- package/dist/platform/accessory-registry.d.ts.map +1 -0
- package/dist/platform/accessory-registry.js +64 -0
- package/dist/platform/accessory-registry.js.map +1 -0
- package/dist/platform/config-file-service.d.ts +8 -0
- package/dist/platform/config-file-service.d.ts.map +1 -0
- package/dist/platform/config-file-service.js +62 -0
- package/dist/platform/config-file-service.js.map +1 -0
- package/dist/platform/device-list-service.d.ts +24 -0
- package/dist/platform/device-list-service.d.ts.map +1 -0
- package/dist/platform/device-list-service.js +264 -0
- package/dist/platform/device-list-service.js.map +1 -0
- package/dist/platform/discovery-service.d.ts +13 -0
- package/dist/platform/discovery-service.d.ts.map +1 -0
- package/dist/platform/discovery-service.js +69 -0
- package/dist/platform/discovery-service.js.map +1 -0
- package/dist/platform/index.d.ts +36 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +158 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/platform-lifecycle-service.d.ts +10 -0
- package/dist/platform/platform-lifecycle-service.d.ts.map +1 -0
- package/dist/platform/platform-lifecycle-service.js +30 -0
- package/dist/platform/platform-lifecycle-service.js.map +1 -0
- package/dist/platform/types.d.ts +61 -0
- package/dist/platform/types.d.ts.map +1 -0
- package/dist/platform/types.js +3 -0
- package/dist/platform/types.js.map +1 -0
- package/dist/platform.d.ts +3 -81
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +6 -467
- package/dist/platform.js.map +1 -1
- package/dist/thermostat-mode.d.ts +7 -0
- package/dist/thermostat-mode.d.ts.map +1 -0
- package/dist/thermostat-mode.js +80 -0
- package/dist/thermostat-mode.js.map +1 -0
- package/dist/thermostat-state.d.ts +12 -0
- package/dist/thermostat-state.d.ts.map +1 -0
- package/dist/thermostat-state.js +56 -0
- package/dist/thermostat-state.js.map +1 -0
- package/dist/types/device-status.types.d.ts +34 -0
- package/dist/types/device-status.types.d.ts.map +1 -0
- package/dist/types/device-status.types.js +3 -0
- package/dist/types/device-status.types.js.map +1 -0
- package/dist/types/device.types.d.ts +41 -0
- package/dist/types/device.types.d.ts.map +1 -0
- package/dist/types/device.types.js +3 -0
- package/dist/types/device.types.js.map +1 -0
- package/dist/types/guards/device-guards.d.ts +8 -0
- package/dist/types/guards/device-guards.d.ts.map +1 -0
- package/dist/types/guards/device-guards.js +27 -0
- package/dist/types/guards/device-guards.js.map +1 -0
- package/dist/types/guards/mqtt-command-guards.d.ts +6 -0
- package/dist/types/guards/mqtt-command-guards.d.ts.map +1 -0
- package/dist/types/guards/mqtt-command-guards.js +50 -0
- package/dist/types/guards/mqtt-command-guards.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +24 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/mqtt.types.d.ts +64 -0
- package/dist/types/mqtt.types.d.ts.map +1 -0
- package/dist/types/mqtt.types.js +3 -0
- package/dist/types/mqtt.types.js.map +1 -0
- package/dist/types/room-mapping.types.d.ts +13 -0
- package/dist/types/room-mapping.types.d.ts.map +1 -0
- package/dist/types/room-mapping.types.js +3 -0
- package/dist/types/room-mapping.types.js.map +1 -0
- package/dist/types/websocket.types.d.ts +111 -0
- package/dist/types/websocket.types.d.ts.map +1 -0
- package/dist/types/websocket.types.js +3 -0
- package/dist/types/websocket.types.js.map +1 -0
- package/dist/types.d.ts +3 -273
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +17 -76
- package/dist/types.js.map +1 -1
- package/dist/websocket/command-dispatcher.d.ts +15 -0
- package/dist/websocket/command-dispatcher.d.ts.map +1 -0
- package/dist/websocket/command-dispatcher.js +74 -0
- package/dist/websocket/command-dispatcher.js.map +1 -0
- package/dist/websocket/device-state-projector.d.ts +10 -0
- package/dist/websocket/device-state-projector.d.ts.map +1 -0
- package/dist/websocket/device-state-projector.js +157 -0
- package/dist/websocket/device-state-projector.js.map +1 -0
- package/dist/websocket/protocol-router.d.ts +16 -0
- package/dist/websocket/protocol-router.d.ts.map +1 -0
- package/dist/websocket/protocol-router.js +39 -0
- package/dist/websocket/protocol-router.js.map +1 -0
- package/dist/websocket/ws-transport.d.ts +11 -0
- package/dist/websocket/ws-transport.d.ts.map +1 -0
- package/dist/websocket/ws-transport.js +61 -0
- package/dist/websocket/ws-transport.js.map +1 -0
- package/dist/websocket-client/command-service.d.ts +37 -0
- package/dist/websocket-client/command-service.d.ts.map +1 -0
- package/dist/websocket-client/command-service.js +252 -0
- package/dist/websocket-client/command-service.js.map +1 -0
- package/dist/websocket-client/connection-service.d.ts +31 -0
- package/dist/websocket-client/connection-service.d.ts.map +1 -0
- package/dist/websocket-client/connection-service.js +241 -0
- package/dist/websocket-client/connection-service.js.map +1 -0
- package/dist/websocket-client/crc16.d.ts +2 -0
- package/dist/websocket-client/crc16.d.ts.map +1 -0
- package/dist/websocket-client/crc16.js +44 -0
- package/dist/websocket-client/crc16.js.map +1 -0
- package/dist/websocket-client/device-parsers.d.ts +8 -0
- package/dist/websocket-client/device-parsers.d.ts.map +1 -0
- package/dist/websocket-client/device-parsers.js +43 -0
- package/dist/websocket-client/device-parsers.js.map +1 -0
- package/dist/websocket-client/index.d.ts +43 -0
- package/dist/websocket-client/index.d.ts.map +1 -0
- package/dist/websocket-client/index.js +190 -0
- package/dist/websocket-client/index.js.map +1 -0
- package/dist/websocket-client/message-service.d.ts +31 -0
- package/dist/websocket-client/message-service.d.ts.map +1 -0
- package/dist/websocket-client/message-service.js +189 -0
- package/dist/websocket-client/message-service.js.map +1 -0
- package/dist/websocket-client/state.d.ts +3 -0
- package/dist/websocket-client/state.d.ts.map +1 -0
- package/dist/websocket-client/state.js +18 -0
- package/dist/websocket-client/state.js.map +1 -0
- package/dist/websocket-client/status-updater.d.ts +23 -0
- package/dist/websocket-client/status-updater.d.ts.map +1 -0
- package/dist/websocket-client/status-updater.js +192 -0
- package/dist/websocket-client/status-updater.js.map +1 -0
- package/dist/websocket-client/system-temperature-updater.d.ts +19 -0
- package/dist/websocket-client/system-temperature-updater.d.ts.map +1 -0
- package/dist/websocket-client/system-temperature-updater.js +95 -0
- package/dist/websocket-client/system-temperature-updater.js.map +1 -0
- package/dist/websocket-client/types.d.ts +76 -0
- package/dist/websocket-client/types.d.ts.map +1 -0
- package/dist/websocket-client/types.js +3 -0
- package/dist/websocket-client/types.js.map +1 -0
- package/dist/websocket-client.d.ts +3 -61
- package/dist/websocket-client.d.ts.map +1 -1
- package/dist/websocket-client.js +5 -1011
- package/dist/websocket-client.js.map +1 -1
- 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 >=
|
|
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/{
|
|
173
|
-
- **Covers**: `homebridge/klares4/cover/{
|
|
174
|
-
- **Thermostats**: `homebridge/klares4/thermostat/{
|
|
175
|
-
- **Sensors**: `homebridge/klares4/sensor/{
|
|
176
|
-
- **Zones**: `homebridge/klares4/zone/{
|
|
177
|
-
- **Scenarios**: `homebridge/klares4/scenario/{
|
|
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/{
|
|
184
|
-
- **Covers**: `homebridge/klares4/cover/{
|
|
185
|
-
- **Thermostats**: `homebridge/klares4/thermostat/{
|
|
186
|
-
- **Scenarios**: `homebridge/klares4/scenario/{
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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.
|
|
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 >=
|
|
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/{
|
|
409
|
-
- **Tapparelle**: `homebridge/klares4/cover/{
|
|
410
|
-
- **Termostati**: `homebridge/klares4/thermostat/{
|
|
411
|
-
- **Sensori**: `homebridge/klares4/sensor/{
|
|
412
|
-
- **Zone**: `homebridge/klares4/zone/{
|
|
413
|
-
- **Scenari**: `homebridge/klares4/scenario/{
|
|
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/{
|
|
420
|
-
- **Tapparelle**: `homebridge/klares4/cover/{
|
|
421
|
-
- **Termostati**: `homebridge/klares4/thermostat/{
|
|
422
|
-
- **Scenari**: `homebridge/klares4/scenario/{
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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.
|
|
586
|
+
- [Ksenia Security](https://www.kseniasecurity.com/)
|
|
490
587
|
|
|
491
588
|
---
|
|
492
589
|
|
package/config.schema.json
CHANGED
|
@@ -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.
|
|
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,
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
this.
|
|
116
|
-
this.
|
|
117
|
-
this.
|
|
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":"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"}
|
|
@@ -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"}
|