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 +91 -0
- package/LICENSE +176 -0
- package/README.md +43 -190
- package/RELEASE_NOTES.md +41 -0
- package/assets/README.md +13 -0
- package/assets/homebridge-pax-calima.png +0 -0
- package/assets/svarahome-master.png +0 -0
- package/assets/svarahome.png +0 -0
- package/config.schema.json +107 -61
- package/docs/DEPENDENCY-SECURITY.md +42 -0
- package/docs/VALIDATION.md +61 -0
- package/docs/VERIFICATION.md +47 -0
- package/index.js +3 -389
- package/lib/accessory.js +250 -0
- package/lib/platform.js +98 -0
- package/lib/protocol.js +84 -0
- package/lib/transport.js +119 -0
- package/package.json +40 -13
- package/scripts/check-native.cjs +25 -0
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
|
-
#
|
|
1
|
+
# SvaraHome for Homebridge
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
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
|
-
[
|
|
8
|
-
[](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
|
-
|
|
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
|
-
|
|
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": "
|
|
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
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
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
|
-
|
|
30
|
+
## In Apple Home
|
|
152
31
|
|
|
153
|
-
**
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
**
|
|
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
|
-
**
|
|
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
|
-
|
|
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
|
-
|
|
174
|
-
This is expected firmware behaviour — see the sensor note above.
|
|
48
|
+
## Quiet hours
|
|
175
49
|
|
|
176
|
-
|
|
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
|
-
##
|
|
54
|
+
## Upgrading from 2.4.x
|
|
182
55
|
|
|
183
|
-
|
|
184
|
-
-
|
|
185
|
-
-
|
|
186
|
-
-
|
|
187
|
-
-
|
|
188
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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).
|
package/RELEASE_NOTES.md
ADDED
|
@@ -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.
|
package/assets/README.md
ADDED
|
@@ -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
|