homebridge-pax-calima 2.4.5 → 2.5.0-beta.2

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 ADDED
@@ -0,0 +1,91 @@
1
+ # Changelog
2
+
3
+ [Release notes](RELEASE_NOTES.md) describe the proposed update. Beta entries are consolidated into the stable release when it is promoted; beta history remains in GitHub prereleases and tags.
4
+
5
+ ## 2.5.0-beta.2 — Patient requests, truthful tiles
6
+
7
+ - Keep Boost, Pause and speed requests pending through temporary Bluetooth failures, including child-bridge restarts. A newer manual command replaces the pending request.
8
+ - Confirm the fan's state before showing an action as active. Check uncertain writes before retrying, preserving an already-running timer.
9
+ - Restore measured speed after HomeKit caches a requested slider position.
10
+ - Retry stalled disconnects and wait for scanning to stop before connecting.
11
+ - Allow a short authentication processing interval before protected controls and log differing manual readback without exposing PINs.
12
+ - Retain a recent verified reading during a missed background poll, within the existing 45-second freshness limit.
13
+ - Add explicit Boost/Pause tile names and identify the fan in communication logs.
14
+ - Add an optional speed-target limit for each fan, covering Boost and the Home speed slider. This accommodates the owner's older Wetroom fan, which accepts 2400 RPM and returns zero RPM for a 2450 RPM request, while retaining Kitchen's existing setting.
15
+ - Stop retries for rejected authentication, invalid data, explicitly different control readback or unsupported operating modes. Siri can still time out before Bluetooth recovers; a pending request continues until confirmed, replaced or stopped by one of these faults.
16
+
17
+ - Point the plugin website and support links to the new [SvaraHome site](https://homebridge.svarahome.kernowekconsulting.co.uk).
18
+ - Confirm live Boost, Pause and cancellation on both fans, plus capped slider control on Wetroom. All 48 automated tests pass across Node 22/24 and Homebridge 1/2 for the control implementation.
19
+
20
+ ## 2.5.0-beta.1 — Boost and Pause
21
+
22
+ ### SvaraHome
23
+
24
+ - Introduced the SvaraHome name across the plugin listing, setup guidance and release copy.
25
+ - Added the approved layered house-and-fan logo and prepared a Homebridge icon.
26
+ - Retained the existing package identifier and fan accessory identities for upgrade continuity.
27
+
28
+ ### Everyday controls
29
+
30
+ - Added timed Boost and Pause switches, shown by default with individual visibility settings.
31
+ - Added early return to automatic ventilation and readback after control commands.
32
+ - Used the fan’s native timer so temporary actions can finish while Homebridge is disconnected.
33
+ - Changed the speed slider to temporary manual control, preserving persistent speed presets.
34
+ - Made Boost and Pause mutually exclusive and prevented an inactive switch-off from cancelling the other action.
35
+ - Restricted manual controls to operating mode 00 without changing installation settings.
36
+
37
+ ### Bluetooth and telemetry
38
+
39
+ - Added explicit address/PIN routing and validation for six- and eight-digit PINs.
40
+ - Required confirmed authentication and stopped unattended retries after a rejected PIN.
41
+ - Queued Bluetooth sessions across fans and added bounded operations, connection cleanup and late-connection recovery handling.
42
+ - Reported communication failures for unconfirmed commands, stale telemetry and invalid readings.
43
+ - Reconciled the fan’s current override through polling and after restart.
44
+
45
+ ### Setup and upgrades
46
+
47
+ - Replaced the non-actionable Boost event service.
48
+ - Removed unsupported temperature, humidity and light services.
49
+ - Applied changed quiet-hours schedules once, preserving later official-app edits.
50
+ - Updated configuration guidance and supported Node versions.
51
+ - Added 32 automated tests covering protocol handling, native Homebridge services, configuration, queues, recorded telemetry and the maintained Bluetooth library’s real classes.
52
+
53
+ ### Dependency security
54
+
55
+ - Replaced the old Bluetooth dependency with the maintained Noble fork, removing the vulnerable archive and native-build dependency chain.
56
+ - Confirmed zero reported vulnerabilities in fresh full and production audits, including a separately resolved Linux ARM64 production tree.
57
+ - Added high/critical audit gates and a native-module load check to CI.
58
+
59
+ ### Beta validation
60
+
61
+ - Automated tests passed across Node 22/24 and Homebridge 1/2.
62
+ - Verified isolated native Linux ARM64 installation/loading on the Pi under Node 22/24, without initialising Bluetooth or changing the running bridge.
63
+ - Live plugin deployment and older-fan authentication remain outstanding.
64
+ - Homebridge verification remains pending.
65
+
66
+ ## 2.4.5
67
+
68
+ - Replaced the removed Silent Hours service lookup with `getServiceById` for Homebridge 2 compatibility.
69
+ - Reported live validation on Homebridge 2.4.0 and Node 24.19.0.
70
+
71
+ ## 2.4.4
72
+
73
+ - Improved Silent Hours time-field hints and invalid-time warnings.
74
+
75
+ ## 2.4.3
76
+
77
+ - Added schedule configuration, an optional Silent Hours switch and optional light sensor exposure.
78
+ - Added plugin display metadata and reorganised settings.
79
+ - Wrote Silent Hours during every poll. This behaviour is replaced in 2.5.0.
80
+
81
+ ## 2.4.2
82
+
83
+ - Disabled the optional humidity tile by default and rewrote setup guidance.
84
+
85
+ ## 2.4.1 / 2.4.0
86
+
87
+ - Revised Bluetooth connection handling and polling.
88
+
89
+ ## Earlier releases
90
+
91
+ - Added initial Bluetooth integration, Homebridge lifecycle changes and fan services. Earlier sensor interpretations are corrected in 2.5.0.
package/LICENSE ADDED
@@ -0,0 +1,176 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
package/README.md CHANGED
@@ -1,228 +1,81 @@
1
- # homebridge-pax-calima
1
+ # SvaraHome for Homebridge
2
2
 
3
- **Bring your bathroom fan into Apple Home — no hub, no cloud, just Bluetooth.**
3
+ Give the fan a boost. Pause it for a quiet moment. Let it return to normal when the time is up.
4
4
 
5
- If you have a **Pax Calima** or **Vent-Axia Lo-Carbon Svara** extractor fan, this plugin connects it directly to HomeKit via Bluetooth. Once set up, your fan appears in the Home app with live temperature and fan speed — and you can build automations around all of them.
5
+ SvaraHome brings local Bluetooth control for Pax Calima and Vent-Axia Svara fans in Apple Home. No cloud account is needed.
6
6
 
7
- [![Homebridge 2 Ready](https://img.shields.io/badge/Homebridge-2%20Ready-brightgreen)](https://github.com/homebridge/homebridge/wiki/Updating-To-Homebridge-v2.0)
8
- [![npm](https://img.shields.io/npm/v/homebridge-pax-calima)](https://www.npmjs.com/package/homebridge-pax-calima)
7
+ [Visit SvaraHome for setup guidance and support](https://homebridge.svarahome.kernowekconsulting.co.uk).
9
8
 
10
- ---
9
+ ## Set up your fan
11
10
 
12
- ## Is this the right plugin for your fan?
11
+ Install `homebridge-pax-calima` through Homebridge UI, then open Plugin Config. Add each fan's Bluetooth address and its own six- or eight-digit PIN from the official app. Keep leading zeroes. Close the official app while Homebridge connects.
13
12
 
14
- This plugin works with fans that connect via the official **Pax** or **Vent-Axia** Bluetooth app. If your fan has a MAC address starting with `58:2b:db`, you're in the right place.
15
-
16
- **Confirmed compatible:**
17
- - Pax Calima — Sweden, Norway, Denmark, Finland, Spain, Portugal
18
- - Vent-Axia Lo-Carbon Svara White — UK
19
- - Vent-Axia Lo-Carbon Svara Black — UK
20
-
21
- These fans are hardware-identical. The same plugin works for all of them.
22
-
23
- ---
24
-
25
- ## What you get in the Home app
26
-
27
- Each fan appears as a single accessory with:
28
-
29
- - 💨 **Fan speed** — shows current RPM as a percentage, live and accurate
30
- - 🌡️ **Temperature** — live reading, updates every ~20 seconds
31
- - ⚡ **Boost** — a button that triggers the fan's high-speed boost mode
32
- - 🌙 **Silent Hours** — keeps the fan quiet at night; set a schedule, a switch, or both (see below)
33
- - 💧 **Humidity** — available but off by default (read below before enabling)
34
- - 💡 **Light level** — available but off by default (read below before enabling)
35
-
36
- > Accessories appear in the **Home app on your iPhone**, not the Homebridge UI accessories tab — that's normal for child bridge plugins.
37
-
38
- ---
39
-
40
- ## Before you start
41
-
42
- You'll need:
43
- - Homebridge `^1.6.0` or `^2.0.0`
44
- - Node.js `18.20.4` or later
45
- - A Bluetooth adapter on your Homebridge host (the Pi 4's built-in adapter works well)
46
-
47
- **Running Homebridge OS on a Raspberry Pi?** There's one extra step after installation. Run this once in the **Homebridge terminal**:
48
-
49
- ```bash
50
- sudo setcap cap_net_raw+eip /opt/homebridge/bin/node
51
- ```
52
-
53
- If Bluetooth shows as off after that:
54
-
55
- ```bash
56
- sudo rfkill unblock bluetooth
57
- ```
58
-
59
- If things still aren't working after both of those — unplug the Pi, wait 10 seconds, plug it back in. A full power cycle rather than a software restart is sometimes needed to reinitialise the Bluetooth stack cleanly.
60
-
61
- ---
62
-
63
- ## Installation
64
-
65
- Search for **Pax Calima** or **Svara** in the Homebridge UI and click Install.
66
-
67
- Or via terminal:
68
- ```bash
69
- npm install -g homebridge-pax-calima
70
- ```
71
-
72
- ---
73
-
74
- ## Configuration
75
-
76
- **You don't need to configure anything to get started.** The plugin finds your fan automatically and registers it in HomeKit.
77
-
78
- A full config example with all options:
13
+ Use Node 22.12 or later within Node 22, or Node 24, with Homebridge 1.8+ or 2. A working Bluetooth adapter and the normal Bluetooth access for your Homebridge installation are required. A dedicated child bridge is recommended. This plugin does not alter system permissions or install system tools.
79
14
 
80
15
  ```json
81
16
  {
82
17
  "platform": "PaxCalima",
83
- "name": "Pax Calima / Vent-Axia Svara",
84
- "silentHoursStart": "23:00",
85
- "silentHoursEnd": "07:00",
86
- "showSilentSwitch": false,
87
- "showHumidity": false,
88
- "showLight": false,
18
+ "name": "SvaraHome",
89
19
  "fans": [
90
- {
91
- "name": "Wetroom Fan",
92
- "mac": "58:2b:db:xx:xx:xx",
93
- "pin": "012345"
94
- }
95
- ]
20
+ { "name": "Kitchen Fan", "mac": "58:2b:db:12:34:56", "pin": "00123456" }
21
+ ],
22
+ "boostMinutes": 10,
23
+ "boostRpm": 2000,
24
+ "pauseMinutes": 10
96
25
  }
97
26
  ```
98
27
 
99
- | Setting | Default | What it does |
100
- |---|---|---|
101
- | `silentHoursStart` | — | Time the fan stops boosting at night, e.g. `"23:00"` |
102
- | `silentHoursEnd` | — | Time the fan resumes boosting, e.g. `"07:00"` |
103
- | `showSilentSwitch` | `false` | Adds a Silent Hours switch to the Home app — great for Goodnight scenes |
104
- | `showHumidity` | `false` | Shows humidity tile — read the note below first |
105
- | `showLight` | `false` | Shows light tile — read the note below first |
106
- | `fans[].name` | Auto | Friendly name for a specific fan |
107
- | `fans[].mac` | — | Only needed to assign a custom name or PIN |
108
- | `fans[].pin` | `012345` | 6-digit PIN — only change if set via the official app |
109
-
110
- ---
111
-
112
- ## Silent Hours
113
-
114
- Silent Hours tells the fan not to boost during a set period — useful for not being woken by a noisy fan at 3am.
115
-
116
- **Two ways to use it — pick one or combine both:**
117
-
118
- **Schedule (set and forget):** Set `silentHoursStart` and `silentHoursEnd` in your config using 24-hour format. The plugin calculates whether you're in the quiet window on every poll and writes the schedule to the fan automatically. Overnight spans work correctly — `23:00` to `07:00` does what you'd expect.
119
-
120
- **Switch (for scenes and shift workers):** Set `showSilentSwitch: true` to add a Silent Hours on/off switch to your accessory. This is ideal for including in a **Goodnight scene** alongside lights and heating — one tap and the fan goes quiet with everything else. It's also the right choice if your sleep schedule changes regularly, like shift work, where a fixed time window doesn't suit.
121
-
122
- **Using both together:** If you set a schedule AND enable the switch, the switch takes priority when you toggle it manually. The schedule still runs in the background — useful as a safety net if you forget to turn the switch back on.
123
-
124
- ---
125
-
126
- ## A note on humidity and light
127
-
128
- Both tiles are **off by default**, and for good reason.
129
-
130
- During testing we confirmed that both sensors — while active on the device — don't expose live readings via Bluetooth. The fan uses them internally to decide when to boost, but the BLE characteristic returns the fan's last internal threshold state rather than a continuous measurement. In practical terms:
131
-
132
- - With all lights off at 21:20, the fan's Bluetooth still reported **52 lux**
133
- - After a shower that raised the room to **89% humidity**, the Bluetooth still reported **50%**
134
-
135
- This isn't a bug in the plugin — it's how the fan's firmware works (confirmed on firmware 02.08, and consistent with observations from the Home Assistant community).
136
-
137
- **If you turn them on**, be aware that:
138
- - Asking Siri "what's the humidity in the bathroom?" will likely return a stale number
139
- - Automations based on these values won't fire reliably
140
-
141
- **What does work well for shower detection:** when the fan's internal humidity sensor detects a sharp rise, it boosts to near full speed automatically. A `Fan Speed > 75%` automation in Apple Home is a reliable, practical trigger for "shower in use."
142
-
143
- If you want to enable humidity or light anyway — perhaps for settled ambient readings — set `showHumidity: true` or `showLight: true` in your config.
144
-
145
- ---
146
-
147
- ## Fan speed control — it depends on how your fan is wired
148
-
149
- The fan can be installed in two wiring modes:
28
+ The address and PIN above are examples. Each fan needs its own entry. An empty or invalid configuration does not start Bluetooth discovery. Incorrect fan entries are skipped, with a short explanation in the Homebridge log. There is no fallback PIN or automatic pairing with nearby fans.
150
29
 
151
- **Intermittent mode** — the fan is off by default and spins up when triggered. In this mode the speed slider in Apple Home works as expected.
30
+ ## In Apple Home
152
31
 
153
- **Always-on (trickle) mode** — the fan runs continuously at a speed managed by its own controller. Speed commands are accepted via Bluetooth but the fan resets to its own setpoint within seconds. The slider shows the current speed accurately but can't override it.
32
+ **Boost** runs the fan at your chosen speed for the configured time. Turn it off to return to automatic ventilation. Turn it on again to start a fresh full duration.
154
33
 
155
- Not sure which mode you have? If your fan is always running — even quietly — you're in always-on mode. In either mode, temperature, fan speed and automations work perfectly.
34
+ **Pause** stops the fan temporarily. The fan's own timer returns it to automatic ventilation, even if Homebridge disconnects. Turn Pause off to resume sooner. The motor can take several seconds to respond.
156
35
 
157
- ---
36
+ Boost and Pause share one manual override: starting one replaces the other. Switching off an already inactive control leaves the other action alone. The switches follow the fan's readback, including actions started in the official app; updates arrive after a successful poll, normally around every ten seconds plus Bluetooth connection time. Home does not show a remaining-time countdown.
158
37
 
159
- ## Something not working?
38
+ Name the switches clearly in Home, such as Kitchen Boost and Kitchen Pause. You can then use scenes or Siri phrases such as “Turn on Kitchen Boost” and “Turn on Kitchen Pause”. Siri wording and tile grouping depend on your Home setup; a custom scene can provide your preferred phrase.
160
39
 
161
- **Fan not showing up in Home**
162
- Run `hciconfig` in the Homebridge terminal — you should see `UP RUNNING`. If it shows `RF-KILL`, run `sudo rfkill unblock bluetooth`. If still nothing, unplug the Pi and power cycle it.
40
+ The fan's speed slider starts a temporary manual session using the Boost duration. Nonzero targets range from 1000 to 2500 RPM in steps of 25; percentages below 40% request the minimum 1000 RPM. Zero starts Pause. The displayed percentage follows measured RPM, so it can differ while the motor settles. Turning the fan off starts a timed Pause; turning it on clears an active Pause and returns to automatic ventilation. Automatic mode may still leave the motor idle under its native rules.
163
41
 
164
- **setcap not taking effect**
165
- Make sure you're targeting the right binary — on Homebridge OS it's `/opt/homebridge/bin/node`, not the system Node.
42
+ Each fan can have its own **Maximum requested speed** in Plugin Config (`maxManualRpm`). This caps both Boost and speed-slider targets for that fan while keeping the displayed speed tied to measurement. Leave it blank for the normal 2500 RPM target limit. The owner's older Wetroom fan accepted 2400 RPM but returned zero RPM for a 2450 RPM request; its validated limit is therefore set to 2400. This observation does not establish the limit for every fan with that firmware.
166
43
 
167
- **Wrong PIN**
168
- Default is `012345`. If you changed it in the official app, add the fan to the `fans` config array with the correct PIN.
44
+ After saving configuration changes, use **Restart Child Bridge** on SvaraHome's plugin card. During validation, terminating the child process directly reloaded its source but retained the parent's previous configuration; the Homebridge UI restart applied the saved fan limit.
169
45
 
170
- **Speed slider does nothing**
171
- Your fan is in always-on mode — see above. Everything else works normally.
46
+ Hide either switch in Plugin Config if you prefer fewer tiles. Hiding a switch does not cancel a running action. Temporary controls currently require operating mode 00, the mode tested on the newer Kitchen fan. The plugin refuses controls in other modes and does not change installation modes.
172
47
 
173
- **Humidity or light reading seems stuck**
174
- This is expected firmware behaviour — see the sensor note above.
48
+ ## Quiet hours
175
49
 
176
- **Accessories not appearing in Home**
177
- Go to Homebridge UI → plugin settings → Remove Accessory Cache, then restart. They'll reappear within a few seconds.
50
+ Leave both time fields blank to retain the fan's own schedule. To save a new schedule, enter different start and end times in 24-hour format. A changed plugin schedule is applied and checked once. Later changes in the official app are retained across polls and Homebridge restarts.
178
51
 
179
- ---
52
+ The optional Silent Hours switch enables or disables that saved schedule while preserving its times. It does not start an immediate quiet period; use Pause for that. Native quiet-hours suppression of automatic boosts has not yet been behaviorally verified by this project.
180
53
 
181
- ## Homebridge 2 compatibility
54
+ ## Upgrading from 2.4.x
182
55
 
183
- This plugin is compatible with Homebridge 2:
184
- - Registered as a dynamic platform
185
- - Waits for `didFinishLaunching` before starting BLE or accessory work
186
- - Uses the Homebridge 2-compatible `Accessory.getServiceById()` API for the optional Silent Hours service
187
- - No analytics, tracking or post-install scripts
188
- - Accessories restore cleanly from cache without re-registration
189
- - Requires Node.js 18.20.4 or later
190
- - Live-tested on Homebridge 2.4.0 (HAP 2.2.2) with Node.js 24.19.0
56
+ - Retain the existing fan accessory and its Home assignment. Correct each fan's address/PIN in Plugin Config; name-only entries cannot be routed safely.
57
+ - The old event-only Boost button is replaced by an actionable switch. Check scenes that referred to the old service. Pause is added by default.
58
+ - Temperature, humidity and light tiles are removed. The previous humidity/light values came from a heat-setting characteristic; the previous temperature conversion remains unverified. These values should not drive automations. Old `showHumidity` and `showLight` settings are ignored.
59
+ - Speed control now uses temporary manual override, leaving humidity, light and trickle speed presets alone.
60
+ - Quiet hours are no longer rewritten on every poll. The switch represents the native schedule's enabled flag.
61
+ - No factory reset or accessory-cache reset is required.
191
62
 
192
- ---
63
+ ## When a fan is unavailable
193
64
 
194
- ## Release notes
65
+ Boost, Pause and speed requests remain pending through temporary Bluetooth failures. SvaraHome retries every ten seconds after a failed attempt until readback confirms the request or a newer manual command replaces it. Pending requests survive child-bridge restarts. To cancel a pending Boost, turn Boost off; to cancel a pending Pause, turn Pause off. A request may therefore run when the fan becomes reachable later.
195
66
 
196
- ### 2.4.5
197
- - **Fixed:** Homebridge 2 compatibility for the optional Silent Hours switch. Homebridge 2 removed `Accessory.getServiceByUUIDAndSubType()`; both lookups now use the supported `Accessory.getServiceById()` API.
198
- - **Verified:** Live-tested successfully on Homebridge 2.4.0 (HAP 2.2.2) with Node.js 24.19.0 on Homebridge OS.
199
- - No BLE protocol, fan control, sensor mapping, configuration, or accessory behaviour changes.
67
+ The tiles follow verified fan state, never the pending request. If a reply is lost after a write, a retry first checks whether the requested override is already running, avoiding repeated timer extensions. Siri or HomeKit can time out before recovery; an error from Siri does not cancel the pending request or prove the fan did not receive it. Homebridge logs identify pending requests.
200
68
 
201
- ### 2.4.4
202
- - **Fixed:** Silent Hours time fields no longer show a raw regex pattern as validation hint in the Homebridge UI — replaced with plain human-readable placeholder text (e.g. `23:00`) and a description
203
- - **Improved:** Invalid time format now logs a clear warning message rather than silently disabling the schedule
69
+ A missed background poll retains the last verified reading only within the existing 45-second freshness limit. Home reports a communication failure when authentication fails, a command fails, telemetry is stale or RPM is outside the accepted range. Rejected authentication, invalid data, an explicitly different control readback and unsupported operating modes stop command retries and need attention. A rejected PIN also stops unattended authentication retries; correct the configuration and restart the child bridge, then issue the request again.
204
70
 
205
- ### 2.4.3
206
- - **Silent Hours** reworked — now supports a config schedule (`silentHoursStart` / `silentHoursEnd`) that runs automatically, an optional HomeKit switch (`showSilentSwitch: true`) for Goodnight scenes and irregular schedules, or both together. The switch takes priority when toggled manually; the schedule runs as a background default. Any existing Silent Hours switch from earlier versions is automatically removed unless `showSilentSwitch` is enabled.
207
- - **Light sensor** (`showLight`) added as opt-in — confirmed via live testing that the characteristic returns a static value regardless of lighting conditions.
208
- - **`showSilentSwitch`**, **`showHumidity`** and **`showLight`** grouped under "Optional Sensors" in the Homebridge UI config for a cleaner settings experience.
209
- - **`displayName`** added to `package.json` — shows correctly as "Vent-Axia Svara / Pax Calima" in the Homebridge UI.
210
- - Sensor characteristic only read when at least one optional sensor is enabled — slightly leaner poll cycle for most users.
211
- - Silent Hours written to fan on every poll — stays in sync after power cuts.
71
+ Check the fan's address and PIN securely in Plugin Config, Bluetooth range and adapter access, and whether another app is connected. The plugin never prints PINs or raw backend errors. After a timed-out disconnect, it retries disconnection before allowing another session to use the radio. It waits for scanning to stop before connecting. Persistent adapter failures may still require attention.
212
72
 
213
- ### 2.4.2
214
- - Humidity sensor disabled by default — opt-in via `showHumidity: true`
215
- - README rewritten with a more human tone
73
+ ## What has been checked
216
74
 
217
- ### 2.4.1
218
- - Fixed sensors returning stale values — reverted to connect→read→disconnect per poll
75
+ Device-level trials on the owner's newer eight-digit-PIN Kitchen fan established timed Boost, timed zero-RPM Pause, expiry, early resume and speed changes. All tested settings were restored. Both Kitchen and the older Wetroom fan subsequently authenticated and provided telemetry after Wetroom's address and PIN were corrected. Kitchen's pending-command retries were also exercised through HomeKit switches. Wetroom's firmware 02.08 accepted a temporary 2400 RPM Boost, confirmed by HomeKit readback, and returned to automatic ventilation after cancellation. Its initial 2450 RPM request produced a zero-RPM override; the per-fan target limit addresses this observed difference.
219
76
 
220
- ### 2.4.0
221
- - Rebuilt with persistent connection architecture
77
+ Version 2.5.0-beta.2 adds recovery and pending-command fixes to beta.1. The control implementation has been tested on the owner's Pi, with automated protocol, queue and native Homebridge-service checks. See [live diagnostic evidence](docs/BETA1-LIVE-DIAGNOSTIC.md), [validation](docs/VALIDATION.md), [release notes](RELEASE_NOTES.md) and [changelog](CHANGELOG.md). Brief successful sessions do not establish sustained Bluetooth reliability.
222
78
 
223
- ### 2.3.x / 2.2.1 / 2.1.0
224
- - Correct sensor UUIDs and byte mappings confirmed via live device testing
225
- - Homebridge 2.0 initialisation fixes; duplicate accessory registration resolved
79
+ Homebridge verification remains an aim. The SvaraHome logo is bundled for the icon request; Homebridge controls verified status and icon display. See [verification preparation](docs/VERIFICATION.md).
226
80
 
227
- ### 1.0.x
228
- - Initial releases
81
+ Dependency security: this candidate uses the maintained Noble library. The recorded six high and one critical dependency findings have been removed; fresh audits report zero vulnerabilities. See [security evidence](docs/DEPENDENCY-SECURITY.md).
@@ -0,0 +1,41 @@
1
+ # SvaraHome 2.5.0-beta.2 — Patient requests, truthful tiles
2
+
3
+ Ask for a boost. Let SvaraHome work through a temporary Bluetooth interruption. See what the fan has confirmed.
4
+
5
+ This beta builds on SvaraHome's timed Boost and Pause controls, with recovery improvements tested on both the newer Kitchen fan and the older Wetroom fan.
6
+
7
+ ## A request worth waiting for
8
+
9
+ Boost, Pause and speed requests now stay pending through temporary Bluetooth failures. SvaraHome retries after a failed attempt, including after a child-bridge restart. A newer manual command replaces the waiting request.
10
+
11
+ For example, say, “Siri, boost the kitchen fan.” Siri may still time out while Bluetooth recovers; the request can continue afterwards. Turn Boost off to cancel a pending Boost, or Pause off to cancel a pending Pause. A waiting request can start when the fan becomes reachable later.
12
+
13
+ Rejected authentication, invalid data, unsupported operating modes and an explicitly different control readback stop retries and need attention.
14
+
15
+ ## What Home shows
16
+
17
+ Boost and Pause follow the fan's confirmed manual state. The speed slider returns to measured speed after a request, rather than staying at the percentage you asked for.
18
+
19
+ An uncertain write is checked before it is repeated, so an already-running timer is preserved. A missed background poll retains the last verified reading only within the existing 45-second freshness limit. Failed commands and stale or invalid readings report a communication fault.
20
+
21
+ Bluetooth recovery now retries stalled disconnects and waits for scanning to stop before connecting. Logs identify which fan needs attention, and Boost and Pause have explicit tile names.
22
+
23
+ ## A limit for each fan
24
+
25
+ The optional **Maximum requested speed** setting caps Boost and slider targets separately for each fan. Measured speed remains unchanged.
26
+
27
+ Our older Wetroom fan accepted 2400 RPM but returned a zero-RPM override for a 2450 RPM request. Its tested limit is now 2400 RPM; Kitchen retains 2450 RPM. This is evidence from these fans, rather than a universal limit for every firmware version.
28
+
29
+ ## Before you upgrade
30
+
31
+ Check that each fan has its own Bluetooth address and correct six- or eight-digit PIN. Close the official app while Homebridge connects. After saving configuration changes, use **Restart Child Bridge** on SvaraHome's plugin card so the saved settings are loaded.
32
+
33
+ Timed controls keep the fan's own expiry timer and leave persistent ventilation presets in place. Existing fan identities and room assignments are retained. If upgrading from 2.4.x, check scenes that used the old Boost event button; it is replaced by a working switch. Unsupported temperature, humidity and light tiles are removed.
34
+
35
+ Setup guidance and support now live at the [SvaraHome website](https://homebridge.svarahome.kernowekconsulting.co.uk).
36
+
37
+ ## Tested, with more to learn
38
+
39
+ Live checks confirmed Boost, Pause and cancellation on both fans, plus the capped speed slider on Wetroom. The control implementation passed 48 automated tests in each Node 22/24 and Homebridge 1/2 combination. Short successful trials do not establish uninterrupted Bluetooth reliability, and Siri voice recognition still depends on your Home names and scenes.
40
+
41
+ This is a testing release. Homebridge verification remains pending.
@@ -0,0 +1,13 @@
1
+ # SvaraHome artwork
2
+
3
+ SvaraHome belongs to the same visual family as GivHome: a rounded-square tile and layered house, with a turquoise three-bladed fan replacing the GivHome letter.
4
+
5
+ Brand blue: `#026AB3`. The house uses layered cool blues, clear roof eaves and restrained highlights. The fan remains legible within a white circular face. The app/plugin icon carries no text so it reads at small sizes.
6
+
7
+ - `svarahome-master.png`: selected full-size generated artwork.
8
+ - `svarahome.png`: 1024 × 1024 project icon.
9
+ - `homebridge-pax-calima.png`: 100 × 100 PNG for the existing npm package’s Homebridge icon request.
10
+
11
+ The original supplied GivHome image and the two SvaraHome drafts remain untouched in the owner’s files. This icon was produced with the built-in image generation tool; the final prompt is saved in `docs/BRANDING.md`.
12
+
13
+ Homebridge maintains plugin icons centrally. Submit the small icon with verification, or request its registration after verification. The artwork does not imply manufacturer endorsement or Homebridge verification.
Binary file
Binary file
Binary file