@switchbot/homebridge-switchbot 4.3.5 → 4.3.7
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 +1748 -0
- package/dist/device/hub.d.ts +19 -1
- package/dist/device/hub.d.ts.map +1 -1
- package/dist/device/hub.js +9 -5
- package/dist/device/hub.js.map +1 -1
- package/dist/platform.d.ts +2 -2
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +1 -1
- package/dist/platform.js.map +1 -1
- package/docs/variables/default.html +1 -1
- package/package.json +2 -1
- package/src/device/hub.ts +29 -6
- package/src/platform.ts +7 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>default | @switchbot/homebridge-switchbot</title><meta name="description" content="Documentation for @switchbot/homebridge-switchbot"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">@switchbot/homebridge-switchbot</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="" aria-current="page">default</a></li></ul><h1>Variable default</h1></div><div class="tsd-signature"><span class="tsd-kind-variable">default</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">api</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">API</span><span class="tsd-signature-symbol">)</span> <span class="tsd-signature-symbol">=></span> <span class="tsd-signature-type">void</span></div><div class="tsd-type-declaration"><h4>Type Declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures"><li class="tsd-signature" id="__type"><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">api</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">API</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">void</span></li><li class="tsd-description"><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">api</span>: <span class="tsd-signature-type">API</span></span></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></li></ul></li></ul></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/blob/
|
|
1
|
+
<!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>default | @switchbot/homebridge-switchbot</title><meta name="description" content="Documentation for @switchbot/homebridge-switchbot"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">@switchbot/homebridge-switchbot</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="" aria-current="page">default</a></li></ul><h1>Variable default</h1></div><div class="tsd-signature"><span class="tsd-kind-variable">default</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">api</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">API</span><span class="tsd-signature-symbol">)</span> <span class="tsd-signature-symbol">=></span> <span class="tsd-signature-type">void</span></div><div class="tsd-type-declaration"><h4>Type Declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures"><li class="tsd-signature" id="__type"><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">api</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">API</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">void</span></li><li class="tsd-description"><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">api</span>: <span class="tsd-signature-type">API</span></span></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></li></ul></li></ul></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/blob/f51d878469e185474d95f93cf5cdcbef4a0a2c7f/src/index.ts#L11">index.ts:11</a></li></ul></aside></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">@switchbot/homebridge-switchbot</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@switchbot/homebridge-switchbot",
|
|
3
3
|
"displayName": "SwitchBot",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"version": "4.3.
|
|
5
|
+
"version": "4.3.7",
|
|
6
6
|
"description": "The SwitchBot plugin allows you to access your SwitchBot device(s) from HomeKit.",
|
|
7
7
|
"author": "SwitchBot <support@wondertechlabs.com> (https://github.com/SwitchBot)",
|
|
8
8
|
"contributors": [
|
|
@@ -89,6 +89,7 @@
|
|
|
89
89
|
"@antfu/eslint-config": "^7.2.0",
|
|
90
90
|
"@types/node": "^25.2.1",
|
|
91
91
|
"@vitest/coverage-v8": "^4.0.18",
|
|
92
|
+
"@vue/compiler-sfc": "^3.5.27",
|
|
92
93
|
"eslint": "^9.39.2",
|
|
93
94
|
"eslint-plugin-format": "^1.3.1",
|
|
94
95
|
"homebridge": "^1.11.1",
|
package/src/device/hub.ts
CHANGED
|
@@ -17,6 +17,25 @@ import type { devicesConfig, hubConfig } from '../settings.js'
|
|
|
17
17
|
import { convertUnits, formatDeviceIdAsMac, validHumidity } from '../utils.js'
|
|
18
18
|
import { deviceBase } from './device.js'
|
|
19
19
|
|
|
20
|
+
/**
|
|
21
|
+
* Hub sensor data structure
|
|
22
|
+
* Represents the sensor readings that can be at root level (Hub 2) or nested (Hub 3)
|
|
23
|
+
*/
|
|
24
|
+
interface HubSensorData {
|
|
25
|
+
temperature: number
|
|
26
|
+
humidity: number
|
|
27
|
+
lightLevel: number
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Extended Hub status type that supports both Hub 2 and Hub 3 API response structures
|
|
32
|
+
* Hub 2 returns sensor data at root level
|
|
33
|
+
* Hub 3 returns sensor data in a nested sensorData object
|
|
34
|
+
*/
|
|
35
|
+
type HubStatus = hub2Status & {
|
|
36
|
+
sensorData?: HubSensorData
|
|
37
|
+
}
|
|
38
|
+
|
|
20
39
|
export class Hub extends deviceBase {
|
|
21
40
|
// Services
|
|
22
41
|
private LightSensor?: {
|
|
@@ -38,7 +57,7 @@ export class Hub extends deviceBase {
|
|
|
38
57
|
}
|
|
39
58
|
|
|
40
59
|
// OpenAPI
|
|
41
|
-
deviceStatus!:
|
|
60
|
+
deviceStatus!: HubStatus
|
|
42
61
|
|
|
43
62
|
// Webhook
|
|
44
63
|
webhookContext!: hub2WebhookContext
|
|
@@ -199,17 +218,22 @@ export class Hub extends deviceBase {
|
|
|
199
218
|
|
|
200
219
|
async openAPIparseStatus(): Promise<void> {
|
|
201
220
|
this.debugLog('openAPIparseStatus')
|
|
202
|
-
|
|
221
|
+
// Hub 3 returns sensor data in a nested sensorData object, while Hub 2 returns it at the root level
|
|
222
|
+
const sensorData: HubSensorData = this.deviceStatus.sensorData ?? this.deviceStatus
|
|
223
|
+
const temperature = sensorData.temperature
|
|
224
|
+
const humidity = sensorData.humidity
|
|
225
|
+
const lightLevel = sensorData.lightLevel
|
|
226
|
+
this.debugLog(`(temperature, humidity, lightLevel) = OpenAPI:(${temperature}, ${humidity}, ${lightLevel}), current:(${this.TemperatureSensor?.CurrentTemperature}, ${this.HumiditySensor?.CurrentRelativeHumidity}, ${this.LightSensor?.CurrentAmbientLightLevel})`)
|
|
203
227
|
|
|
204
228
|
// CurrentRelativeHumidity
|
|
205
229
|
if (!(this.device as hubConfig).hide_humidity && this.HumiditySensor?.Service) {
|
|
206
|
-
this.HumiditySensor.CurrentRelativeHumidity =
|
|
230
|
+
this.HumiditySensor.CurrentRelativeHumidity = humidity
|
|
207
231
|
this.debugLog(`CurrentRelativeHumidity: ${this.HumiditySensor.CurrentRelativeHumidity}%`)
|
|
208
232
|
}
|
|
209
233
|
|
|
210
234
|
// CurrentTemperature
|
|
211
235
|
if (!(this.device as hubConfig).hide_temperature && this.TemperatureSensor?.Service) {
|
|
212
|
-
this.TemperatureSensor.CurrentTemperature =
|
|
236
|
+
this.TemperatureSensor.CurrentTemperature = temperature
|
|
213
237
|
this.debugLog(`CurrentTemperature: ${this.TemperatureSensor.CurrentTemperature}°c`)
|
|
214
238
|
}
|
|
215
239
|
|
|
@@ -217,9 +241,8 @@ export class Hub extends deviceBase {
|
|
|
217
241
|
if (!(this.device as hubConfig).hide_lightsensor && this.LightSensor?.Service) {
|
|
218
242
|
const set_minLux = (this.device as hubConfig).set_minLux ?? 1
|
|
219
243
|
const set_maxLux = (this.device as hubConfig).set_maxLux ?? 6001
|
|
220
|
-
const lightLevel = this.deviceStatus.lightLevel
|
|
221
244
|
this.LightSensor.CurrentAmbientLightLevel = this.getLightLevel(lightLevel, set_minLux, set_maxLux, 19)
|
|
222
|
-
this.debugLog(`LightLevel: ${
|
|
245
|
+
this.debugLog(`LightLevel: ${lightLevel}, CurrentAmbientLightLevel: ${this.LightSensor!.CurrentAmbientLightLevel}`)
|
|
223
246
|
}
|
|
224
247
|
|
|
225
248
|
// Firmware Version
|
package/src/platform.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs'
|
|
1
2
|
/* Copyright(C) 2017-2024, donavanbecker (https://github.com/donavanbecker). All rights reserved.
|
|
2
3
|
*
|
|
3
4
|
* platform.ts: @switchbot/homebridge-switchbot platform class.
|
|
4
5
|
*/
|
|
5
6
|
import type { Server } from 'node:http'
|
|
7
|
+
import { argv } from 'node:process'
|
|
6
8
|
|
|
9
|
+
import asyncmqtt from 'async-mqtt'
|
|
10
|
+
import fakegato from 'fakegato-history'
|
|
7
11
|
import type { API, DynamicPlatformPlugin, Logging, PlatformAccessory } from 'homebridge'
|
|
12
|
+
import { EveHomeKitTypes } from 'homebridge-lib/EveHomeKitTypes'
|
|
8
13
|
import type { MqttClient } from 'mqtt'
|
|
9
14
|
/*
|
|
10
15
|
* For Testing Locally:
|
|
@@ -12,15 +17,6 @@ import type { MqttClient } from 'mqtt'
|
|
|
12
17
|
* import { LogLevel, SwitchBotBLE, SwitchBotModel, SwitchBotOpenAPI } from '/Users/Shared/GitHub/OpenWonderLabs/node-switchbot/dist/index.js';
|
|
13
18
|
*/
|
|
14
19
|
import type { blindTilt, bodyChange, curtain, curtain3, device, deviceStatusRequest, irdevice } from 'node-switchbot'
|
|
15
|
-
|
|
16
|
-
import type { blindTiltConfig, curtainConfig, devicesConfig, irDevicesConfig, options, SwitchBotPlatformConfig } from './settings.js'
|
|
17
|
-
|
|
18
|
-
import { readFileSync } from 'node:fs'
|
|
19
|
-
import { argv } from 'node:process'
|
|
20
|
-
|
|
21
|
-
import asyncmqtt from 'async-mqtt'
|
|
22
|
-
import fakegato from 'fakegato-history'
|
|
23
|
-
import { EveHomeKitTypes } from 'homebridge-lib/EveHomeKitTypes'
|
|
24
20
|
import { LogLevel, SwitchBotBLE, SwitchBotModel, SwitchBotOpenAPI } from 'node-switchbot'
|
|
25
21
|
import { queueScheduler } from 'rxjs'
|
|
26
22
|
|
|
@@ -54,6 +50,7 @@ import { Others } from './irdevice/other.js'
|
|
|
54
50
|
import { TV } from './irdevice/tv.js'
|
|
55
51
|
import { VacuumCleaner } from './irdevice/vacuumcleaner.js'
|
|
56
52
|
import { WaterHeater } from './irdevice/waterheater.js'
|
|
53
|
+
import type { blindTiltConfig, curtainConfig, devicesConfig, irDevicesConfig, options, SwitchBotPlatformConfig } from './settings.js'
|
|
57
54
|
import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js'
|
|
58
55
|
import { formatDeviceIdAsMac, isBlindTiltDevice, isCurtainDevice, safeStringify, sleep } from './utils.js'
|
|
59
56
|
|
|
@@ -359,7 +356,7 @@ export class SwitchBotPlatform implements DynamicPlatformPlugin {
|
|
|
359
356
|
/**
|
|
360
357
|
* Verify the config passed to the plugin is valid
|
|
361
358
|
*/
|
|
362
|
-
|
|
359
|
+
verifyConfig() {
|
|
363
360
|
this.debugLog('Verifying Config')
|
|
364
361
|
this.config = this.config || {}
|
|
365
362
|
this.config.options = this.config.options || {}
|