From f747543962464ef45a4d864cb8602646d7ee52ea Mon Sep 17 00:00:00 2001 From: Donavan Becker Date: Thu, 28 Nov 2024 22:28:37 -0600 Subject: [PATCH] v3.4.2 - Housekeeping and update dependencies **Full Changelog**: https://github.com/OpenWonderLabs/node-switchbot/compare/v3.4.1...v3.4.2 --- BLE.md | 27 +- CHANGELOG.md | 7 + OpenAPI.md | 25 +- branding/Node_x_SwitchBot.svg | 5 +- docs/assets/hierarchy.js | 2 +- docs/assets/main.js | 8 +- docs/assets/navigation.js | 2 +- docs/assets/search.js | 2 +- docs/assets/style.css | 12 +- docs/classes/Advertising.html | 8 +- docs/classes/SwitchBotBLE.html | 16 +- docs/classes/SwitchBotOpenAPI.html | 16 +- docs/classes/SwitchbotDevice.html | 22 +- docs/classes/WoBlindTilt.html | 42 +- docs/classes/WoBulb.html | 38 +- docs/classes/WoCeilingLight.html | 44 +- docs/classes/WoContact.html | 26 +- docs/classes/WoCurtain.html | 38 +- docs/classes/WoHand.html | 36 +- docs/classes/WoHub2.html | 26 +- docs/classes/WoHumi.html | 50 +- docs/classes/WoIOSensorTH.html | 26 +- docs/classes/WoPlugMiniUS.html | 36 +- docs/classes/WoPresence.html | 26 +- docs/classes/WoSensorTH.html | 24 +- docs/classes/WoSmartLock.html | 46 +- docs/classes/WoSmartLockPro.html | 46 +- docs/classes/WoStrip.html | 40 +- docs/enums/LogLevel.html | 4 +- docs/enums/SwitchBotBLEModel.html | 7 +- docs/enums/SwitchBotBLEModelFriendlyName.html | 7 +- docs/enums/SwitchBotBLEModelName.html | 7 +- docs/enums/SwitchBotModel.html | 5 +- docs/hierarchy.html | 2 +- docs/index.html | 18 +- docs/interfaces/AdvertisementData.html | 4 +- docs/interfaces/Chars.html | 4 +- docs/interfaces/ErrorObject.html | 4 +- docs/interfaces/NobleTypes.html | 4 +- docs/interfaces/Params.html | 4 +- docs/interfaces/Rule.html | 4 +- docs/interfaces/ServiceData.html | 4 +- docs/interfaces/SwitchBotBLEDevice.html | 4 +- docs/interfaces/WebhookDetail.html | 4 +- docs/interfaces/ad.html | 4 +- docs/interfaces/body.html | 4 +- docs/interfaces/bodyChange.html | 4 +- docs/interfaces/deleteWebhookResponse.html | 4 +- docs/interfaces/device.html | 4 +- docs/interfaces/deviceList.html | 4 +- docs/interfaces/deviceStatus.html | 4 +- docs/interfaces/deviceStatusRequest.html | 4 +- docs/interfaces/deviceWebhook.html | 4 +- docs/interfaces/deviceWebhookContext.html | 4 +- docs/interfaces/devices.html | 4 +- docs/interfaces/infraredRemoteList.html | 4 +- docs/interfaces/irdevice.html | 4 +- docs/interfaces/pushResponse.html | 4 +- docs/interfaces/queryWebhookResponse.html | 4 +- docs/interfaces/setupWebhookResponse.html | 4 +- docs/interfaces/switchbot.html | 4 +- docs/interfaces/updateWebhookResponse.html | 4 +- docs/interfaces/webhookRequest.html | 4 +- docs/media/BLE.md | 27 +- docs/media/OpenAPI.md | 25 +- docs/modules.html | 2 +- docs/types/MacAddress.html | 2 +- docs/types/batteryCirculatorFan.html | 2 +- .../batteryCirculatorFanServiceData.html | 2 +- docs/types/batteryCirculatorFanStatus.html | 2 +- .../batteryCirculatorFanWebhookContext.html | 2 +- docs/types/blindTilt.html | 2 +- docs/types/blindTiltServiceData.html | 2 +- docs/types/blindTiltStatus.html | 2 +- docs/types/blindTiltWebhookContext.html | 2 +- docs/types/bot.html | 2 +- docs/types/botServiceData.html | 2 +- docs/types/botStatus.html | 2 +- docs/types/botWebhookContext.html | 2 +- docs/types/ceilingLight.html | 2 +- docs/types/ceilingLightPro.html | 2 +- docs/types/ceilingLightProServiceData.html | 2 +- docs/types/ceilingLightProStatus.html | 2 +- docs/types/ceilingLightProWebhookContext.html | 2 +- docs/types/ceilingLightServiceData.html | 2 +- docs/types/ceilingLightStatus.html | 2 +- docs/types/ceilingLightWebhookContext.html | 2 +- docs/types/colorBulb.html | 2 +- docs/types/colorBulbServiceData.html | 2 +- docs/types/colorBulbStatus.html | 2 +- docs/types/colorBulbWebhookContext.html | 2 +- docs/types/contactSensor.html | 2 +- docs/types/contactSensorServiceData.html | 2 +- docs/types/contactSensorStatus.html | 2 +- docs/types/contactSensorWebhookContext.html | 2 +- docs/types/curtain.html | 2 +- docs/types/curtain3.html | 2 +- docs/types/curtain3ServiceData.html | 2 +- docs/types/curtain3WebhookContext.html | 2 +- docs/types/curtainServiceData.html | 2 +- docs/types/curtainStatus.html | 2 +- docs/types/curtainWebhookContext.html | 2 +- docs/types/floorCleaningRobotS10.html | 2 +- docs/types/floorCleaningRobotS10Status.html | 2 +- .../floorCleaningRobotS10WebhookContext.html | 2 +- docs/types/hub2.html | 2 +- docs/types/hub2ServiceData.html | 2 +- docs/types/hub2Status.html | 2 +- docs/types/hub2WebhookContext.html | 2 +- docs/types/humidifier.html | 2 +- docs/types/humidifier2ServiceData.html | 1 + docs/types/humidifier2Status.html | 1 + docs/types/humidifier2WebhookContext.html | 1 + docs/types/humidifierServiceData.html | 2 +- docs/types/humidifierStatus.html | 2 +- docs/types/humidifierWebhookContext.html | 2 +- docs/types/indoorCam.html | 2 +- docs/types/indoorCameraWebhookContext.html | 2 +- docs/types/keypad.html | 2 +- docs/types/keypadDetectorServiceData.html | 2 +- docs/types/keypadTouch.html | 2 +- docs/types/keypadTouchWebhookContext.html | 2 +- docs/types/keypadWebhookContext.html | 2 +- docs/types/lock.html | 2 +- docs/types/lockPro.html | 2 +- docs/types/lockProServiceData.html | 2 +- docs/types/lockProStatus.html | 2 +- docs/types/lockProWebhookContext.html | 2 +- docs/types/lockServiceData.html | 2 +- docs/types/lockStatus.html | 2 +- docs/types/lockWebhookContext.html | 2 +- docs/types/meter.html | 2 +- docs/types/meterPlus.html | 2 +- docs/types/meterPlusServiceData.html | 2 +- docs/types/meterPlusStatus.html | 2 +- docs/types/meterPlusWebhookContext.html | 2 +- docs/types/meterPro.html | 2 +- docs/types/meterProCO2ServiceData.html | 2 +- docs/types/meterProCO2Status.html | 2 +- docs/types/meterProCO2WebhookContext.html | 2 +- docs/types/meterProServiceData.html | 2 +- docs/types/meterProStatus.html | 2 +- docs/types/meterProWebhookContext.html | 2 +- docs/types/meterServiceData.html | 2 +- docs/types/meterStatus.html | 2 +- docs/types/meterWebhookContext.html | 2 +- docs/types/motionSensor.html | 2 +- docs/types/motionSensorServiceData.html | 2 +- docs/types/motionSensorStatus.html | 2 +- docs/types/motionSensorWebhookContext.html | 2 +- docs/types/onadvertisement.html | 2 +- docs/types/ondiscover.html | 2 +- docs/types/outdoorMeter.html | 2 +- docs/types/outdoorMeterServiceData.html | 2 +- docs/types/outdoorMeterStatus.html | 2 +- docs/types/outdoorMeterWebhookContext.html | 2 +- docs/types/panTiltCamWebhookContext.html | 2 +- docs/types/pantiltCam.html | 2 +- docs/types/pantiltCam2k.html | 2 +- docs/types/plug.html | 2 +- docs/types/plugMini.html | 2 +- docs/types/plugMiniJPServiceData.html | 2 +- docs/types/plugMiniJPWebhookContext.html | 2 +- docs/types/plugMiniStatus.html | 2 +- docs/types/plugMiniUSServiceData.html | 2 +- docs/types/plugMiniUSWebhookContext.html | 2 +- docs/types/plugStatus.html | 2 +- docs/types/plugWebhookContext.html | 2 +- docs/types/relaySwitch1PMServiceData.html | 2 +- docs/types/relaySwitch1PlusServiceData.html | 1 - docs/types/relaySwitch1ServiceData.html | 1 + docs/types/remote.html | 2 +- docs/types/robotVacuumCleanerS1.html | 2 +- docs/types/robotVacuumCleanerS1Plus.html | 2 +- .../types/robotVacuumCleanerS1PlusStatus.html | 2 +- ...obotVacuumCleanerS1PlusWebhookContext.html | 2 +- docs/types/robotVacuumCleanerS1Status.html | 2 +- .../robotVacuumCleanerS1WebhookContext.html | 2 +- docs/types/robotVacuumCleanerServiceData.html | 2 +- docs/types/stripLight.html | 2 +- docs/types/stripLightServiceData.html | 2 +- docs/types/stripLightStatus.html | 2 +- docs/types/stripLightWebhookContext.html | 2 +- docs/types/waterLeakDetector.html | 2 +- docs/types/waterLeakDetectorServiceData.html | 2 +- docs/types/waterLeakDetectorStatus.html | 2 +- .../waterLeakDetectorWebhookContext.html | 2 +- package-lock.json | 942 +++++++++--------- package.json | 24 +- src/advertising.ts | 9 +- src/device.ts | 1 - src/device/woblindtilt.ts | 8 +- src/device/wohand.ts | 10 +- src/device/wohumi.ts | 70 +- src/device/wohumi2.ts | 140 +++ src/device/woleak.ts | 19 +- src/device/worelayswitch1.ts | 50 + src/device/worelayswitch1plus.ts | 168 ---- src/device/worelayswitch1pm.ts | 124 +-- src/settings.ts | 48 +- src/switchbot-ble.ts | 6 +- src/switchbot-openapi.ts | 20 +- src/test/settings.test.ts | 16 +- src/test/wohumi.test.ts | 97 +- src/test/wohumi2.test.ts | 45 + src/types/bledevicestatus.ts | 28 +- src/types/devicestatus.ts | 11 + src/types/devicewebhookstatus.ts | 6 + src/types/types.ts | 14 +- 209 files changed, 1487 insertions(+), 1518 deletions(-) create mode 100644 docs/types/humidifier2ServiceData.html create mode 100644 docs/types/humidifier2Status.html create mode 100644 docs/types/humidifier2WebhookContext.html delete mode 100644 docs/types/relaySwitch1PlusServiceData.html create mode 100644 docs/types/relaySwitch1ServiceData.html create mode 100644 src/device/wohumi2.ts create mode 100644 src/device/worelayswitch1.ts delete mode 100644 src/device/worelayswitch1plus.ts create mode 100644 src/test/wohumi2.test.ts diff --git a/BLE.md b/BLE.md index 43d191be..b83f4c4a 100644 --- a/BLE.md +++ b/BLE.md @@ -1126,19 +1126,20 @@ this.switchBotBLE.on('log', (log) => { The following devices are supported. -| Device | BLE Support | -| ------------------------- | ----------- | -| SwitchBot Bot | Yes | -| SwitchBot Curtain | Yes | -| SwitchBot Meter | Yes | -| SwitchBot Motion Sensor | Yes | -| SwitchBot Contact Sensor | Yes | -| SwitchBot Plug Mini | Yes | -| SwitchBot Smart Lock | Yes | -| SwitchBot Smart Lock Pro | Yes | -| SwitchBot Humidifier | Yes | -| SwitchBot Color Bulb | Yes | -| SwitchBot LED Strip Light | Yes | +| Device | BLE Support | +| ---------------------------------------------- | ----------- | +| SwitchBot Bot | Yes | +| SwitchBot Curtain | Yes | +| SwitchBot Meter | Yes | +| SwitchBot Motion Sensor | Yes | +| SwitchBot Contact Sensor | Yes | +| SwitchBot Plug Mini | Yes | +| SwitchBot Smart Lock | Yes | +| SwitchBot Smart Lock Pro | Yes | +| SwitchBot Humidifier | Yes | +| SwitchBot Evaporative Humidifier (Auto-refill) | No | +| SwitchBot Color Bulb | Yes | +| SwitchBot LED Strip Light | Yes | ### Summary diff --git a/CHANGELOG.md b/CHANGELOG.md index 96764be9..8fd76b03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. This project uses [Semantic Versioning](https://semver.org/) +## [3.4.2](https://github.com/OpenWonderLabs/node-switchbot/releases/tag/v3.4.2) (2024-12-21) + +### What's Changed +- Housekeeping and update dependencies + +**Full Changelog**: https://github.com/OpenWonderLabs/node-switchbot/compare/v3.4.1...v3.4.2 + ## [3.4.1](https://github.com/OpenWonderLabs/node-switchbot/releases/tag/v3.4.1) (2024-11-27) ### What's Changed diff --git a/OpenAPI.md b/OpenAPI.md index 3869513c..bdea49d1 100644 --- a/OpenAPI.md +++ b/OpenAPI.md @@ -167,18 +167,19 @@ this.switchBotAPI.on('log', (log) => { The following devices are supported. -| Device | OpenAPI Support | Webhook Support | -| ------------------------- | --------------- | --------------- | -| SwitchBot Bot | Yes | Yes | -| SwitchBot Curtain | Yes | Yes | -| SwitchBot Meter | Yes | Yes | -| SwitchBot Motion Sensor | Yes | Yes | -| SwitchBot Contact Sensor | Yes | Yes | -| SwitchBot Plug Mini | Yes | Yes | -| SwitchBot Smart Lock | Yes | Yes | -| SwitchBot Humidifier | Yes | Yes | -| SwitchBot Color Bulb | Yes | Yes | -| SwitchBot LED Strip Light | Yes | Yes | +| Device | OpenAPI Support | Webhook Support | +| ---------------------------------------------- | --------------- | --------------- | +| SwitchBot Bot | Yes | Yes | +| SwitchBot Curtain | Yes | Yes | +| SwitchBot Meter | Yes | Yes | +| SwitchBot Motion Sensor | Yes | Yes | +| SwitchBot Contact Sensor | Yes | Yes | +| SwitchBot Plug Min | Yes | Yes | +| SwitchBot Smart Lock | Yes | Yes | +| SwitchBot Humidifier | Yes | Yes | +| SwitchBot Evaporative Humidifier (Auto-refill) | Yes | Yes | +| SwitchBot Color Bulb | Yes | Yes | +| SwitchBot LED Strip Light | Yes | Yes | ### Summary diff --git a/branding/Node_x_SwitchBot.svg b/branding/Node_x_SwitchBot.svg index 4b36024e..adc50df1 100644 --- a/branding/Node_x_SwitchBot.svg +++ b/branding/Node_x_SwitchBot.svg @@ -1,9 +1,8 @@ - + - Node-SwitchBot - T + Node-SwitchBot diff --git a/docs/assets/hierarchy.js b/docs/assets/hierarchy.js index b3ac908a..88cf64d6 100644 --- a/docs/assets/hierarchy.js +++ b/docs/assets/hierarchy.js @@ -1 +1 @@ -window.hierarchyData = "data:application/octet-stream;base64,H4sIAAAAAAAAE42VzW6cMBRG38XrmwZfsDEs2y6mUqqORKouqiz4cWasGLsypl1EvHtFUTrjaYW9YQEf53y6kn1fibPWT6T+TktOAcUTECeftey9smYi9StBsT5NO0pSk+aX8v25s/6j/Kl6SYC8KDOQmqIAMjtNatLrdprkdH8TfXf2oyawfSY18dNwt/57t70A0p+VHpw0axfMASmDPGNQZAgFL4EVFXAsgVcIZZmByDlUlEElMqBZwYBShkCRVU8LEIr5Vetv9r1WZnhU2u81vopF2i5AkLLQMOsuAp91F+fmWcj9IJVW5vSgTudI+etk3FNkGHqs8W0fU2yhBDovQ/rsfKtMhL6F4nRWVAH90JphH70m4lyOYevD3GGEO3eYwK3whjuqGHdUcW5ZZgH305dGmsm6x8M+/ZKLO0TOA8dRz6fPyqivzb7jkos7qpuzdHRykmb/ermkEvginFPalNJntN4/oWBsnX+w/UvE8BZLUFCG/1ccnU20HJ1NECELD1fjnfoRMayRBHTJ6RV6CFcIMv5GVsZL99z2crof9pfH3+TNAhGC/lkDQvxrbHzr5ynJu0UT7Muy/AZ5MAhUSwcAAA==" \ No newline at end of file +window.hierarchyData = "eJyNlctunDAUQP/lrm+S2oAfLNssUilVR5pUXVRZ8HBmrBi7sk27iPj3CqF0Blphb1jA4ZxrS+A38M7FAPUPwssSqXhG8OrFqC5qZwPUb0DFfLXNoKCG428du3Pr4r36pTsFCK/a9lATKhBGb6CGzjQhqHC3QW/PcTCAy2OoIYb+Zn73ZrmB0J216b2y8yyUICUEqZRYyBLLimNVcGSkQMYZ8oqjoASFFCgZQfKBlkgIlUhoUT5PCISSq6m/u49G2/5Jm7g38RWWmHZCoGRTGE2bkI+mzfBKufJ+Utpoe3rUp3Ni+Gsy3Slkue44G5sulVigtL2s+No++thom7AvUNpeFWv7Q2P7ffVMpL2MFGvv2NKEd2xphpezjXfQKe+g016+2eXPX4/KBuefHvbtFy7dEJsv6WDG0xdt9bfjfuPCZTSkWDe8Csru/14uVNov2XoNebuUv0fz/2cdGBofH133mii8YxkJQuX/EwfvMisH7zJCtNisJXr9M1GYkQw1L6/V/foIoRV7N2sblX9pOhXu+v3D4y+5OUAEW44Bwf4tHmMTx5DVXdCM+jRNfwBcGVRC" \ No newline at end of file diff --git a/docs/assets/main.js b/docs/assets/main.js index e0af2659..4f59cd95 100644 --- a/docs/assets/main.js +++ b/docs/assets/main.js @@ -1,9 +1,9 @@ "use strict"; window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings.","hierarchy_expand":"Expand","hierarchy_collapse":"Collapse"}; -"use strict";(()=>{var De=Object.create;var ae=Object.defineProperty;var Ae=Object.getOwnPropertyDescriptor;var Fe=Object.getOwnPropertyNames;var Ne=Object.getPrototypeOf,Be=Object.prototype.hasOwnProperty;var Ve=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var je=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Fe(e))!Be.call(t,i)&&i!==n&&ae(t,i,{get:()=>e[i],enumerable:!(r=Ae(e,i))||r.enumerable});return t};var qe=(t,e,n)=>(n=t!=null?De(Ne(t)):{},je(e||!t||!t.__esModule?ae(n,"default",{value:t,enumerable:!0}):n,t));var he=Ve((ue,de)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,c],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. -`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[c+1]*i[d+1],c+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}s.str.length==1&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),m=s.str.charAt(1),f;m in s.node.edges?f=s.node.edges[m]:(f=new t.TokenSet,s.node.edges[m]=f),s.str.length==1&&(f.final=!0),i.push({node:f,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof ue=="object"?de.exports=n():e.lunr=n()}(this,function(){return t})})()});window.translations||={copy:"Copy",copied:"Copied!",normally_hidden:"This member is normally hidden due to your filter settings.",hierarchy_expand:"Expand",hierarchy_collapse:"Collapse"};var le=[];function J(t,e){le.push({selector:e,constructor:t})}var U=class{alwaysVisibleMember=null;constructor(){this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){le.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!$e(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function $e(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var ce=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var ye=qe(he(),1);async function fe(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=ye.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function ge(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:document.documentElement.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{fe(e,t)}),fe(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");i.addEventListener("mouseup",()=>{ne(t)}),r.addEventListener("focus",()=>t.classList.add("has-focus")),ze(t,i,r,e)}function ze(t,e,n,r){n.addEventListener("input",ce(()=>{We(t,e,n,r)},200)),n.addEventListener("keydown",i=>{i.key=="Enter"?Ue(e,t):i.key=="ArrowUp"?(pe(e,n,-1),i.preventDefault()):i.key==="ArrowDown"&&(pe(e,n,1),i.preventDefault())}),document.body.addEventListener("keypress",i=>{i.altKey||i.ctrlKey||i.metaKey||!n.matches(":focus")&&i.key==="/"&&(i.preventDefault(),n.focus())}),document.body.addEventListener("keyup",i=>{t.classList.contains("has-focus")&&(i.key==="Escape"||!e.matches(":focus-within")&&!n.matches(":focus"))&&(n.blur(),ne(t))})}function ne(t){t.classList.remove("has-focus")}function We(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=me(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` - ${me(l.parent,i)}.${d}`);let m=document.createElement("li");m.classList.value=l.classes??"";let f=document.createElement("a");f.href=r.base+l.url,f.innerHTML=c+d,m.append(f),f.addEventListener("focus",()=>{e.querySelector(".current")?.classList.remove("current"),m.classList.add("current")}),e.appendChild(m)}}function pe(t,e,n){let r=t.querySelector(".current");if(!r)r=t.querySelector(n==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let i=r;if(n===1)do i=i.nextElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);else do i=i.previousElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);i?(r.classList.remove("current"),i.classList.add("current")):n===-1&&(r.classList.remove("current"),e.focus())}}function Ue(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),ne(e)}}function me(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(te(t.substring(s,o)),`${te(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(te(t.substring(s))),i.join("")}var Je={"&":"&","<":"<",">":">","'":"'",'"':"""};function te(t){return t.replace(/[&<>"'"]/g,e=>Je[e])}var I=class{el;app;constructor(e){this.el=e.el,this.app=e.app}};var H="mousedown",xe="mousemove",B="mouseup",G={x:0,y:0},ve=!1,re=!1,Ge=!1,D=!1,Ee=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(Ee?"is-mobile":"not-mobile");Ee&&"ontouchstart"in document.documentElement&&(Ge=!0,H="touchstart",xe="touchmove",B="touchend");document.addEventListener(H,t=>{re=!0,D=!1;let e=H=="touchstart"?t.targetTouches[0]:t;G.y=e.pageY||0,G.x=e.pageX||0});document.addEventListener(xe,t=>{if(re&&!D){let e=H=="touchstart"?t.targetTouches[0]:t,n=G.x-(e.pageX||0),r=G.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(B,()=>{re=!1});document.addEventListener("click",t=>{ve&&(t.preventDefault(),t.stopImmediatePropagation(),ve=!1)});var X=class extends I{active;className;constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(B,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(H,n=>this.onDocumentPointerDown(n)),document.addEventListener(B,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var ie;try{ie=localStorage}catch{ie={getItem(){return null},setItem(){}}}var C=ie;var we=document.head.appendChild(document.createElement("style"));we.dataset.for="filters";var Y=class extends I{key;value;constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),we.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } -`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=C.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){C.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var se=new Map,oe=class{open;accordions=[];key;constructor(e,n){this.key=e,this.open=n}add(e){this.accordions.push(e),e.open=this.open,e.addEventListener("toggle",()=>{this.toggle(e.open)})}toggle(e){for(let n of this.accordions)n.open=e;C.setItem(this.key,e.toString())}},Z=class extends I{constructor(e){super(e);let n=this.el.querySelector("summary"),r=n.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)});let i=`tsd-accordion-${n.dataset.key??n.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`,s;if(se.has(i))s=se.get(i);else{let o=C.getItem(i),a=o?o==="true":this.el.open;s=new oe(i,a),se.set(i,s)}s.add(this.el)}};function be(t){let e=C.getItem("tsd-theme")||"os";t.value=e,Le(e),t.addEventListener("change",()=>{C.setItem("tsd-theme",t.value),Le(t.value)})}function Le(t){document.documentElement.dataset.theme=t}var K;function ke(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Se),Se())}async function Se(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();K=document.documentElement.dataset.base,K.endsWith("/")||(K+="/"),t.innerHTML="";for(let s of i)Ce(s,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Ce(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',Te(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let c of t.children)Ce(c,l,i)}else Te(t,r,t.class)}function Te(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=K+t.path,n&&(r.className=n),location.pathname===r.pathname&&!r.href.includes("#")&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else{let r=e.appendChild(document.createElement("span"));r.innerHTML='',r.appendChild(document.createElement("span")).textContent=t.text}}var ee=document.documentElement.dataset.base;ee.endsWith("/")||(ee+="/");function Qe(){document.querySelector(".tsd-full-hierarchy")?Xe():document.querySelector(".tsd-hierarchy")&&Ye()}function Xe(){document.addEventListener("click",r=>{let i=r.target;for(;i.parentElement&&i.parentElement.tagName!="LI";)i=i.parentElement;i.dataset.dropdown&&(i.dataset.dropdown=String(i.dataset.dropdown!=="true"))});let t=new Map,e=new Set;for(let r of document.querySelectorAll(".tsd-full-hierarchy [data-refl]")){let i=r.querySelector("ul");t.has(r.dataset.refl)?e.add(r.dataset.refl):i&&t.set(r.dataset.refl,i)}for(let r of e)n(r);function n(r){let i=t.get(r).cloneNode(!0);i.querySelectorAll("[id]").forEach(s=>{s.removeAttribute("id")}),i.querySelectorAll("[data-dropdown]").forEach(s=>{s.dataset.dropdown="false"});for(let s of document.querySelectorAll(`[data-refl="${r}"]`)){let o=et(),a=s.querySelector("ul");s.insertBefore(o,a),o.dataset.dropdown=String(!!a),a||s.appendChild(i.cloneNode(!0))}}}function Ye(){let t=document.getElementById("tsd-hierarchy-script");t&&(t.addEventListener("load",Ie),Ie())}async function Ie(){let t=document.querySelector(".tsd-panel.tsd-hierarchy:has(h4 a)");if(!t||!window.hierarchyData)return;let n=await(await fetch(window.hierarchyData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=+t.dataset.refl,s=await new Response(r).json(),o=t.querySelector("ul"),a=document.createElement("ul");if(a.classList.add("tsd-hierarchy"),Ze(a,s,i),o.querySelectorAll("li").length==a.querySelectorAll("li").length)return;let l=document.createElement("span");l.classList.add("tsd-hierarchy-toggle"),l.textContent=window.translations.hierarchy_expand,t.querySelector("h4 a")?.insertAdjacentElement("afterend",l),l.insertAdjacentText("beforebegin",", "),l.addEventListener("click",()=>{l.textContent===window.translations.hierarchy_expand?(o.insertAdjacentElement("afterend",a),o.remove(),l.textContent=window.translations.hierarchy_collapse):(a.insertAdjacentElement("afterend",o),a.remove(),l.textContent=window.translations.hierarchy_expand)})}function Ze(t,e,n){let r=e.roots.filter(i=>Ke(e,i,n));for(let i of r)t.appendChild(Pe(e,i,n))}function Pe(t,e,n,r=new Set){if(r.has(e))return;r.add(e);let i=t.reflections[e],s=document.createElement("li");if(s.classList.add("tsd-hierarchy-item"),e===n){let o=s.appendChild(document.createElement("span"));o.textContent=i.name,o.classList.add("tsd-hierarchy-target")}else{for(let a of i.uniqueNameParents||[]){let l=t.reflections[a],c=s.appendChild(document.createElement("a"));c.textContent=l.name,c.href=ee+l.url,c.className=l.class+" tsd-signature-type",s.append(document.createTextNode("."))}let o=s.appendChild(document.createElement("a"));o.textContent=t.reflections[e].name,o.href=ee+i.url,o.className=i.class+" tsd-signature-type"}if(i.children){let o=s.appendChild(document.createElement("ul"));o.classList.add("tsd-hierarchy");for(let a of i.children){let l=Pe(t,a,n,r);l&&o.appendChild(l)}}return r.delete(e),s}function Ke(t,e,n){if(e===n)return!0;let r=new Set,i=[t.reflections[e]];for(;i.length;){let s=i.pop();if(!r.has(s)){r.add(s);for(let o of s.children||[]){if(o===n)return!0;i.push(t.reflections[o])}}}return!1}function et(){let t=document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("width","20"),t.setAttribute("height","20"),t.setAttribute("viewBox","0 0 24 24"),t.setAttribute("fill","none"),t.innerHTML='',t}J(X,"a[data-toggle]");J(Z,".tsd-accordion");J(Y,".tsd-filter-item input[type=checkbox]");var Oe=document.getElementById("tsd-theme");Oe&&be(Oe);var tt=new U;Object.defineProperty(window,"app",{value:tt});ge();ke();Qe();})(); +"use strict";(()=>{var De=Object.create;var le=Object.defineProperty;var Fe=Object.getOwnPropertyDescriptor;var Ne=Object.getOwnPropertyNames;var Ve=Object.getPrototypeOf,Be=Object.prototype.hasOwnProperty;var qe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var je=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ne(e))!Be.call(t,i)&&i!==n&&le(t,i,{get:()=>e[i],enumerable:!(r=Fe(e,i))||r.enumerable});return t};var $e=(t,e,n)=>(n=t!=null?De(Ve(t)):{},je(e||!t||!t.__esModule?le(n,"default",{value:t,enumerable:!0}):n,t));var pe=qe((de,he)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,c],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[c+1]*i[d+1],c+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}s.str.length==1&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),m=s.str.charAt(1),p;m in s.node.edges?p=s.node.edges[m]:(p=new t.TokenSet,s.node.edges[m]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof de=="object"?he.exports=n():e.lunr=n()}(this,function(){return t})})()});window.translations||={copy:"Copy",copied:"Copied!",normally_hidden:"This member is normally hidden due to your filter settings.",hierarchy_expand:"Expand",hierarchy_collapse:"Collapse"};var ce=[];function G(t,e){ce.push({selector:e,constructor:t})}var J=class{alwaysVisibleMember=null;constructor(){this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){ce.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!ze(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function ze(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var ue=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var ge=$e(pe(),1);async function H(t){let e=Uint8Array.from(atob(t),s=>s.charCodeAt(0)),r=new Blob([e]).stream().pipeThrough(new DecompressionStream("deflate")),i=await new Response(r).text();return JSON.parse(i)}async function fe(t,e){if(!window.searchData)return;let n=await H(window.searchData);t.data=n,t.index=ge.Index.load(n.index),e.classList.remove("loading"),e.classList.add("ready")}function ve(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:document.documentElement.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{fe(e,t)}),fe(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");i.addEventListener("mouseup",()=>{re(t)}),r.addEventListener("focus",()=>t.classList.add("has-focus")),We(t,i,r,e)}function We(t,e,n,r){n.addEventListener("input",ue(()=>{Ue(t,e,n,r)},200)),n.addEventListener("keydown",i=>{i.key=="Enter"?Je(e,t):i.key=="ArrowUp"?(me(e,n,-1),i.preventDefault()):i.key==="ArrowDown"&&(me(e,n,1),i.preventDefault())}),document.body.addEventListener("keypress",i=>{i.altKey||i.ctrlKey||i.metaKey||!n.matches(":focus")&&i.key==="/"&&(i.preventDefault(),n.focus())}),document.body.addEventListener("keyup",i=>{t.classList.contains("has-focus")&&(i.key==="Escape"||!e.matches(":focus-within")&&!n.matches(":focus"))&&(n.blur(),re(t))})}function re(t){t.classList.remove("has-focus")}function Ue(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=ye(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` + ${ye(l.parent,i)}.${d}`);let m=document.createElement("li");m.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=c+d,m.append(p),p.addEventListener("focus",()=>{e.querySelector(".current")?.classList.remove("current"),m.classList.add("current")}),e.appendChild(m)}}function me(t,e,n){let r=t.querySelector(".current");if(!r)r=t.querySelector(n==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let i=r;if(n===1)do i=i.nextElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);else do i=i.previousElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);i?(r.classList.remove("current"),i.classList.add("current")):n===-1&&(r.classList.remove("current"),e.focus())}}function Je(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),re(e)}}function ye(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(ne(t.substring(s,o)),`${ne(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ne(t.substring(s))),i.join("")}var Ge={"&":"&","<":"<",">":">","'":"'",'"':"""};function ne(t){return t.replace(/[&<>"'"]/g,e=>Ge[e])}var I=class{el;app;constructor(e){this.el=e.el,this.app=e.app}};var A="mousedown",Ee="mousemove",B="mouseup",X={x:0,y:0},xe=!1,ie=!1,Xe=!1,D=!1,Le=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(Le?"is-mobile":"not-mobile");Le&&"ontouchstart"in document.documentElement&&(Xe=!0,A="touchstart",Ee="touchmove",B="touchend");document.addEventListener(A,t=>{ie=!0,D=!1;let e=A=="touchstart"?t.targetTouches[0]:t;X.y=e.pageY||0,X.x=e.pageX||0});document.addEventListener(Ee,t=>{if(ie&&!D){let e=A=="touchstart"?t.targetTouches[0]:t,n=X.x-(e.pageX||0),r=X.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(B,()=>{ie=!1});document.addEventListener("click",t=>{xe&&(t.preventDefault(),t.stopImmediatePropagation(),xe=!1)});var Y=class extends I{active;className;constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(B,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(A,n=>this.onDocumentPointerDown(n)),document.addEventListener(B,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var se;try{se=localStorage}catch{se={getItem(){return null},setItem(){}}}var C=se;var be=document.head.appendChild(document.createElement("style"));be.dataset.for="filters";var Z=class extends I{key;value;constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),be.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=C.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){C.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var oe=new Map,ae=class{open;accordions=[];key;constructor(e,n){this.key=e,this.open=n}add(e){this.accordions.push(e),e.open=this.open,e.addEventListener("toggle",()=>{this.toggle(e.open)})}toggle(e){for(let n of this.accordions)n.open=e;C.setItem(this.key,e.toString())}},K=class extends I{constructor(e){super(e);let n=this.el.querySelector("summary"),r=n.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)});let i=`tsd-accordion-${n.dataset.key??n.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`,s;if(oe.has(i))s=oe.get(i);else{let o=C.getItem(i),a=o?o==="true":this.el.open;s=new ae(i,a),oe.set(i,s)}s.add(this.el)}};function Se(t){let e=C.getItem("tsd-theme")||"os";t.value=e,we(e),t.addEventListener("change",()=>{C.setItem("tsd-theme",t.value),we(t.value)})}function we(t){document.documentElement.dataset.theme=t}var ee;function Ce(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Te),Te())}async function Te(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let e=await H(window.navigationData);ee=document.documentElement.dataset.base,ee.endsWith("/")||(ee+="/"),t.innerHTML="";for(let n of e)Ie(n,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Ie(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',ke(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let c of t.children)Ie(c,l,i)}else ke(t,r,t.class)}function ke(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=ee+t.path,n&&(r.className=n),location.pathname===r.pathname&&!r.href.includes("#")&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else{let r=e.appendChild(document.createElement("span"));r.innerHTML='',r.appendChild(document.createElement("span")).textContent=t.text}}var te=document.documentElement.dataset.base;te.endsWith("/")||(te+="/");function Pe(){document.querySelector(".tsd-full-hierarchy")?Ye():document.querySelector(".tsd-hierarchy")&&Ze()}function Ye(){document.addEventListener("click",r=>{let i=r.target;for(;i.parentElement&&i.parentElement.tagName!="LI";)i=i.parentElement;i.dataset.dropdown&&(i.dataset.dropdown=String(i.dataset.dropdown!=="true"))});let t=new Map,e=new Set;for(let r of document.querySelectorAll(".tsd-full-hierarchy [data-refl]")){let i=r.querySelector("ul");t.has(r.dataset.refl)?e.add(r.dataset.refl):i&&t.set(r.dataset.refl,i)}for(let r of e)n(r);function n(r){let i=t.get(r).cloneNode(!0);i.querySelectorAll("[id]").forEach(s=>{s.removeAttribute("id")}),i.querySelectorAll("[data-dropdown]").forEach(s=>{s.dataset.dropdown="false"});for(let s of document.querySelectorAll(`[data-refl="${r}"]`)){let o=tt(),a=s.querySelector("ul");s.insertBefore(o,a),o.dataset.dropdown=String(!!a),a||s.appendChild(i.cloneNode(!0))}}}function Ze(){let t=document.getElementById("tsd-hierarchy-script");t&&(t.addEventListener("load",Qe),Qe())}async function Qe(){let t=document.querySelector(".tsd-panel.tsd-hierarchy:has(h4 a)");if(!t||!window.hierarchyData)return;let e=+t.dataset.refl,n=await H(window.hierarchyData),r=t.querySelector("ul"),i=document.createElement("ul");if(i.classList.add("tsd-hierarchy"),Ke(i,n,e),r.querySelectorAll("li").length==i.querySelectorAll("li").length)return;let s=document.createElement("span");s.classList.add("tsd-hierarchy-toggle"),s.textContent=window.translations.hierarchy_expand,t.querySelector("h4 a")?.insertAdjacentElement("afterend",s),s.insertAdjacentText("beforebegin",", "),s.addEventListener("click",()=>{s.textContent===window.translations.hierarchy_expand?(r.insertAdjacentElement("afterend",i),r.remove(),s.textContent=window.translations.hierarchy_collapse):(i.insertAdjacentElement("afterend",r),i.remove(),s.textContent=window.translations.hierarchy_expand)})}function Ke(t,e,n){let r=e.roots.filter(i=>et(e,i,n));for(let i of r)t.appendChild(Oe(e,i,n))}function Oe(t,e,n,r=new Set){if(r.has(e))return;r.add(e);let i=t.reflections[e],s=document.createElement("li");if(s.classList.add("tsd-hierarchy-item"),e===n){let o=s.appendChild(document.createElement("span"));o.textContent=i.name,o.classList.add("tsd-hierarchy-target")}else{for(let a of i.uniqueNameParents||[]){let l=t.reflections[a],c=s.appendChild(document.createElement("a"));c.textContent=l.name,c.href=te+l.url,c.className=l.class+" tsd-signature-type",s.append(document.createTextNode("."))}let o=s.appendChild(document.createElement("a"));o.textContent=t.reflections[e].name,o.href=te+i.url,o.className=i.class+" tsd-signature-type"}if(i.children){let o=s.appendChild(document.createElement("ul"));o.classList.add("tsd-hierarchy");for(let a of i.children){let l=Oe(t,a,n,r);l&&o.appendChild(l)}}return r.delete(e),s}function et(t,e,n){if(e===n)return!0;let r=new Set,i=[t.reflections[e]];for(;i.length;){let s=i.pop();if(!r.has(s)){r.add(s);for(let o of s.children||[]){if(o===n)return!0;i.push(t.reflections[o])}}}return!1}function tt(){let t=document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("width","20"),t.setAttribute("height","20"),t.setAttribute("viewBox","0 0 24 24"),t.setAttribute("fill","none"),t.innerHTML='',t}G(Y,"a[data-toggle]");G(K,".tsd-accordion");G(Z,".tsd-filter-item input[type=checkbox]");var _e=document.getElementById("tsd-theme");_e&&Se(_e);var nt=new J;Object.defineProperty(window,"app",{value:nt});ve();Ce();Pe();})(); /*! Bundled license information: lunr/lunr.js: diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index 4da9c344..9a325dc3 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAE6WaTXPbNhCG/4vOmTp2Jv3wzZaTSTpSrLGc5tDpASLXEmoQUEDQrqbT/56hKVkksdhdqFfuu89iX4AgCenPfycB/gmTy8nMrWfwBGbyZrJVYTO5nIBtqvrscP2nTaja4KO25eTy1//evGYun3UoNtcuXM8+zF0ZIyJBBuuj12BLs/uiKmC5fXFGDRFbyKQNYLq/Kp/AB11ruz4iCqPqGuqzXnBIOL9IdRdD+lGesnLhBp50ASnQq0A0otst2KvFZ2JUewVF++aujbblvTYhBvWCDKMxKzS9MSs6cwraaLue6fUGHUA/zpCcDarAIV2IyW98UNqi+V2Izv+kbIklt9eZzGZ1gWY2qwsus9J4ZqXpzM+3S7C18/efsPxjlKYsTLOea6u/LjHKMcpQPNRgsdviGKMJVC+yTpaV8mHmikcUcQgKGQvvSMzCO4YUvN6iiDZA5areGtQ2gH9QBdRnarQEL97/jGyUUIENNyoolBGpKOTKlTuU0ga4xOlG2TUk07swBZlulK/R/JcIlVqCgQDfYLVx7vEO6q2zNT4UVEmjh5v/gBVv+1jyTNeBALRhHoI7s4/x6cugQkMxOoEUdAffGyC7Guh47H5GCOBeIUa1z4/2MkvcCynwB++dv139DQXO68UpjLYPXnko76ByIb0sYhkJ9cQSPQQpwBe3MnC/2yaW2DFMQRbKqwoHdCEqedvUG/Ku7Qso0PcG/E6yDWBCCnzXGBzUBqjEJfjW/+T+3ItTmBpCs5U0hglJ8OEdFqcdomSLvffp8atyv9NIRkGbbalkOzqqpNB76Q0EpQ2KHCgo1POhano3HErIh6gKAfxuqn3RGBWc/6h6L7ahvQPPMM2I+fa3X87fXzBcdFmmS6RXqaza6OFDFMKeQqIaqV0/XYvc/uOa8RfXHo1/bREEynxEI+fiNg/DYhpjKC5j6S4mRbsLlkV55rLccimfnNQhx3kzFnDEAv2e7mBF8lua5gw+Z2JU9DXD0ogZSCtza6Azg4oyyfSMkeKcSkKTTnSItyffG7kxma444/zwiGmPPATEBMpURCPn4nYOw2IaYyQu4+kvh2DdcUjM7AWzSKSjuC6Pn3A2kmRROYeTUrbK+BRxT8ROEJPZ7xLp76T51KTEEimVMQ1VCdn8gPPHm1g5/aCQJGo8r+8H45yfGlBW2/Wda98Yzt+OyajoJDLuBSE9qQrtkyCFq7oZnJR32E10So7nEUtsFBbRUEOPEQmDtitW8MxKl/pBQ7S9HyNyBukXIsogJ7wbxuU8zkdcx/G1Ldv1qqox8DUgJoBX9BjTSq7GI+y2/TP/jtddleXeQIAikA/ypFBW4d41xQZnvoQyKLSNSaGsggSexzWDH5Q6jol+R8LzkK8ug/12lMwmJjRWSJnorTsICkm02ahIQmaazuw43a68V77RvC7nqrgqSw91NK5jhGNUEOKHxMtFUebCxKa8BsQEYqowjZyLTtooLKbR05eQyejxDX64Ls2f3lKvNbgqh0042RNkECVuIkJpBYEZJzhB25DngcyAE7rnWs/tm2g6o2NBu5m9uqCdxQ8x+rEcDmUdLsui40ZGihwmY2tSydVwVvX/5DEGj8I8rdR14Z7iR80xwjKa0L4az7EHVj+WwyHmOyHLoqPzHStymPR8p5Vcja2yQZuAfOQcI3LGRfSu248JOPedlu42pWP5pllHLNOsJXntv9iw3Pa6NP/3BbHuUJGczDiW0En5+IoeRqWsr0uBCwORnCxzYayT8NMOyLvnR5c3Lg9G7bp/Qpwzr9OENKvKXFpjnlWh/WtSjGuvsrntKeIfqmia6uVgEfzyPCIhmlO42EdPSncqH19ntPrUWvR6lGWdUlve4+n95ff2v/si7gxKzFWq2z/8or/mHyNyBjFKVJRBRmd1HJfz6BlM6Tj+swrgZ6AeD2eZY3AkyCYSFlPa/Dqo4QlZNp22n5Hj1f76ASw6Jg8dNQAA" \ No newline at end of file +window.navigationData = "eJylmltz2zYQhf+LnjN1rEx68ZstJ5N05FhjOc1Dpw8QuZZQg4ACgnY1nf73DE3JIonF7kJ95Tn7LfeAd+nPfycB/gmTi8ncrefwBGbyZrJVYTO5mIBtqvrssP2nTaha8VHbcnLx639vXiuXzzoUmysXruYfblwZIyJDBuuj12BLs/uiKmC5fXNGDxFbyKQDYKa/LJ/AB11ruz4iCqPqGuqznjgknE9T08WQvspTVi5cw5MuIAV6NYj26HYL9nLxmdirvYOifXNXRtvyXpsQg3oiw2jMCi1vzIqunIE22q7ner1Bd6CvMyRngypwSCcx9Y0PSlu0vpPo+k/Kllhxu52pbFZTtLJZTbnKSuOVlaYrP98uwdbO33/C6o8qTVmYZn2jrf66xChHlaF4qMFip8VRownULLJJlpXyYe6KRxRxEIWMhXckZuEdQwpeb1FEK1C1qncMahvAP6gC6jM1OgSn739GLpRQgQ3XKiiUEbko5MqVO5TSClzhbKPsGpLlnUxBZhvla7T+RaFKSzAQ4BusNs493kG9dbbGdwV10ujhxX/Aii/7WPFc14EAtDIPwZPZa3z5MqjQUIzOIAXdwfcGyKkGPh67XxECuHeIUe39o93MEvdGCvzBe+dvV39DgfN6OoXR9sErD+UdVC6kD4vYRkI9cYgeRArwxa0M3O+2iUPsKFOQhfKqwgGdRBVvm3pDnrV9AwX63oDfSS4DmJEC3zUGB7UCVbgE3+afvD73dApTQ2i2ksEwIwk+PMPitINKjth7nh4/KvcnjWwUtNmWSnZFR50Uem+9hqC0QZEDB4V6PnRNXw2HFvImqkIAv5tpXzRGBec/qt6DbWjPwDPMM2K+/e2X8/dThoselukW6aNU1m108yEaYXchUY/UVT/di7z8xz3jN649Gn/bIghU+IhHzsVjHspiGhMobmPpLiZFVxesisrMZaXlUjk5aUKOy2Zs4IgF+j7dwYrkuzTNGbzOxKjobYalESuQdub2QFcGNWWS6RUjzTmdhCGdmBAfT3428mAyU3HG+eEnpj3yIIgJVKiIR87F4xzKYhoTJG7j6S8fwbrPITGzJ2aRyERxXx4/kWxkyaJyCSetbJfxV8Q9EfuCmKx+lyh/J62nFiW2SKlMaKhLyOZ3OH9/E0dOXxSSRIPnzf1gnPMzA8pqu75z7RPD+dsxGTWdRMazIKwndaFzEpRwXTeDL+UddhN9JcfriENsJItoaKBHRcKg44odPLPSpX7QEF3ej4qcQQeGuXLYifhGhgwiF2bCKO8giuOkNLgwcrOQRpGXhLZle/6qagx8FcQE8Irex7ST6/EIu23/N5CO122V1V5DgCKQDzZJo6zDvWuKDc58kTIodIxJo6yDBJ7HNYMf2DqOiX5Xw+uQt1CD/ZaWrCYWNHZImeipOxCFJDps1CQhM0NnTpweVz4rP2jelDequCxLD3W0X0eFY1QQ4pvmy0ZR5cLEobwKYgKxVJhHzkUXbSSLafTyJWwyenyCH7ZL62e31FML7sphE0n2DBlESZqIUdpBEMYJSdAx5GUgC+CE6bnRc+cmhs6YWDBu5qwuaGfxjzp9LYdDRYfbsuh4kJEjh8nEmnRyPZxV/T+9jMEjmaeVui7cU3yrOSosownto/ENdsPqazkcYr0Ttiw6ut6xI4dJr3fayfXYKhu0CchLzlGRM6bRs25fE3DuOy89bcrH8k2zjlimWUvq2n/1YbXtdmn97wviuENNcjKTWMIn5eNH9FCVsr4uBSkMTHKyLIWxT8JPJyCfnt+7vP3yYNSu+2fI+eKGSDVpzOkg5GfR279oxbB2K1vbfk39QxVNU718YAW/PI9IiOcULvayk/KdysePL9p9ai/6OJRVndJbPuPp8+XP9r/nIs4Lysx1qts/PqP/ajgqcgaxl6gpg4yu6liX8+gVTPk4/rMK4OegHg/fMMfgyJBNJCKmvPl90MATtmw6HT9jx7v99QOYs4+0" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index bfbdbc29..d406f0f3 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "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"; \ No newline at end of file diff --git a/docs/assets/style.css b/docs/assets/style.css index 499bc284..7f80f3dc 100644 --- a/docs/assets/style.css +++ b/docs/assets/style.css @@ -29,9 +29,9 @@ --light-color-ts-function: #572be7; --light-color-ts-class: #1f70c2; --light-color-ts-interface: #108024; - --light-color-ts-constructor: #4d7fff; - --light-color-ts-property: #ff984d; - --light-color-ts-method: #ff4db8; + --light-color-ts-constructor: var(--light-color-ts-class); + --light-color-ts-property: #9f5f30; + --light-color-ts-method: #be3989; --light-color-ts-reference: #ff4d82; --light-color-ts-call-signature: var(--light-color-ts-method); --light-color-ts-index-signature: var(--light-color-ts-property); @@ -41,7 +41,7 @@ --light-color-ts-parameter: var(--light-color-ts-variable); /* type literal not included as links will never be generated to it */ --light-color-ts-type-parameter: #a55c0e; - --light-color-ts-accessor: #ff4d4d; + --light-color-ts-accessor: #c73c3c; --light-color-ts-get-signature: var(--light-color-ts-accessor); --light-color-ts-set-signature: var(--light-color-ts-accessor); --light-color-ts-type-alias: #d51270; @@ -86,7 +86,7 @@ --dark-color-ts-function: #a280ff; --dark-color-ts-class: #8ac4ff; --dark-color-ts-interface: #6cff87; - --dark-color-ts-constructor: #4d7fff; + --dark-color-ts-constructor: var(--dark-color-ts-class); --dark-color-ts-property: #ff984d; --dark-color-ts-method: #ff4db8; --dark-color-ts-reference: #ff4d82; @@ -96,7 +96,7 @@ --dark-color-ts-parameter: var(--dark-color-ts-variable); /* type literal not included as links will never be generated to it */ --dark-color-ts-type-parameter: #e07d13; - --dark-color-ts-accessor: #ff4d4d; + --dark-color-ts-accessor: #ff6060; --dark-color-ts-get-signature: var(--dark-color-ts-accessor); --dark-color-ts-set-signature: var(--dark-color-ts-accessor); --dark-color-ts-type-alias: #ff6492; diff --git a/docs/classes/Advertising.html b/docs/classes/Advertising.html index 2c429c83..ead82251 100644 --- a/docs/classes/Advertising.html +++ b/docs/classes/Advertising.html @@ -1,8 +1,8 @@ Advertising | node-switchbot

Class Advertising

Represents the advertising data parser for SwitchBot devices.

-

Constructors

Constructors

Methods

Constructors

Methods

  • Parses the advertisement data coming from SwitchBot device.

    +

Constructors

Methods

  • Parses the advertisement data coming from SwitchBot device.

    This function processes advertising packets received from SwitchBot devices and extracts relevant information based on the device type.

    Parameters

    • peripheral: Peripheral

      The peripheral device object from noble.

      @@ -10,7 +10,7 @@

    Returns Promise<null | ad>

    • An object containing parsed data specific to the SwitchBot device type, or null if the device is not recognized.
    -
  • Parses the service data based on the device model.

    +
  • Parses the service data based on the device model.

    Parameters

    • model: string

      The device model.

    • serviceData: Buffer<ArrayBufferLike>

      The service data buffer.

    • manufacturerData: Buffer<ArrayBufferLike>

      The manufacturer data buffer.

      @@ -18,4 +18,4 @@

    Returns Promise<any>

    • The parsed service data.
    -
+
diff --git a/docs/classes/SwitchBotBLE.html b/docs/classes/SwitchBotBLE.html index deb3c159..cb8c3968 100644 --- a/docs/classes/SwitchBotBLE.html +++ b/docs/classes/SwitchBotBLE.html @@ -1,5 +1,5 @@ SwitchBotBLE | node-switchbot

Class SwitchBotBLE

SwitchBotBLE class to interact with SwitchBot devices.

-

Hierarchy

  • EventEmitter
    • SwitchBotBLE

Constructors

Hierarchy

  • EventEmitter
    • SwitchBotBLE

Constructors

Properties

noble onadvertisement? ondiscover? @@ -12,30 +12,30 @@ wait

Constructors

Properties

noble: any
onadvertisement?: onadvertisement
ondiscover?: ondiscover
ready: Promise<void>

Methods

Returns SwitchBotBLE

Properties

noble: any
onadvertisement?: onadvertisement
ondiscover?: ondiscover
ready: Promise<void>

Methods

  • Emits a log event with the specified log level and message.

    +
  • Emits a log event with the specified log level and message.

    Parameters

    • level: string

      The severity level of the log (e.g., 'info', 'warn', 'error').

    • message: string

      The log message to be emitted.

      -

    Returns Promise<void>

  • Starts scanning for SwitchBot devices.

    +

Returns Promise<void>

  • Starts scanning for SwitchBot devices.

    Parameters

    • Optionalparams: Params = {}

      Optional parameters.

    Returns Promise<void>

    • Resolves when scanning starts successfully.
    -
  • Stops scanning for SwitchBot devices.

    Returns Promise<void>

    • Resolves when scanning stops successfully.
    -
  • Validates the parameters.

    +
  • Validates the parameters.

    Parameters

    • params: Params

      The parameters to validate.

    • schema: Record<string, unknown>

      The schema to validate against.

    Returns Promise<void>

    • Resolves if parameters are valid, otherwise throws an error.
    -
  • Waits for the specified time.

    Parameters

    • msec: number

      The time to wait in milliseconds.

    Returns Promise<void>

    • Resolves after the specified time.
    -
+
diff --git a/docs/classes/SwitchBotOpenAPI.html b/docs/classes/SwitchBotOpenAPI.html index 36be173a..4f05bb70 100644 --- a/docs/classes/SwitchBotOpenAPI.html +++ b/docs/classes/SwitchBotOpenAPI.html @@ -5,35 +5,35 @@

The API token used for authentication.

The secret key used for signing requests.

-

Hierarchy

  • EventEmitter
    • SwitchBotOpenAPI

Constructors

Hierarchy

  • EventEmitter
    • SwitchBotOpenAPI

Constructors

  • Creates an instance of the SwitchBot OpenAPI client.

    +

Constructors

  • Creates an instance of the SwitchBot OpenAPI client.

    Parameters

    • token: string

      The API token used for authentication.

    • secret: string

      The secret key used for signing requests.

      -

    Returns SwitchBotOpenAPI

Properties

webhookEventListener?:
    | null
    | Server<typeof IncomingMessage, typeof ServerResponse> = null

Methods

  • Controls a device by sending a command to the SwitchBot API.

    +
  • Optionalhostname: string

Returns SwitchBotOpenAPI

Properties

webhookEventListener?:
    | null
    | Server<typeof IncomingMessage, typeof ServerResponse> = null

Methods

  • Controls a device by sending a command to the SwitchBot API.

    Parameters

    • deviceId: string

      The unique identifier of the device to control.

    • command: string

      The command to send to the device.

    • parameter: string

      The parameter for the command.

    • commandType: string = 'command'

      The type of the command, defaults to 'command'.

    Returns Promise<{ response: { commandId: string }; statusCode: number }>

    A promise that resolves to an object containing the API response.

    An error if the device control fails.

    -
  • Deletes a webhook by sending a request to the specified URL.

    +
  • Deletes a webhook by sending a request to the specified URL.

    Parameters

    • url: string

      The URL of the webhook to be deleted.

    Returns Promise<void>

    A promise that resolves when the webhook is successfully deleted.

    Will log an error if the deletion fails.

    -
  • Retrieves the list of devices from the SwitchBot OpenAPI.

    +
  • Retrieves the list of devices from the SwitchBot OpenAPI.

    Returns Promise<{ response: devices; statusCode: number }>

    A promise that resolves to an object containing the API response.

    Throws an error if the request to get devices fails.

    -
  • Retrieves the status of a specific device.

    +
  • Retrieves the status of a specific device.

    Parameters

    • deviceId: string

      The unique identifier of the device.

    Returns Promise<{ response: deviceStatus; statusCode: number }>

    A promise that resolves to the device status.

    An error if the request fails.

    -
  • Sets up a webhook listener and configures the webhook on the server.

    +
  • Sets up a webhook listener and configures the webhook on the server.

    This method performs the following steps:

    1. Creates a local server to listen for incoming webhook events.
    2. @@ -44,4 +44,4 @@

    Parameters

    • url: string

      The URL to which the webhook events will be sent.

    Returns Promise<void>

    A promise that resolves when the webhook setup is complete.

    Will log an error if any step in the webhook setup process fails.

    -
+
diff --git a/docs/classes/SwitchbotDevice.html b/docs/classes/SwitchbotDevice.html index 96085487..83073d5f 100644 --- a/docs/classes/SwitchbotDevice.html +++ b/docs/classes/SwitchbotDevice.html @@ -1,5 +1,5 @@ SwitchbotDevice | node-switchbot

Class SwitchbotDevice

Represents a Switchbot Device.

-

Hierarchy (View Summary)

Indexable

  • [x: string]: any

Constructors

Hierarchy (View Summary)

Constructors

Accessors

address connectionState friendlyName @@ -20,25 +20,25 @@

Constructors

  • Initializes a new instance of the SwitchbotDevice class.

    Parameters

    • peripheral: Peripheral

      The peripheral object from noble.

    • noble: __module

      The Noble object.

      -

    Returns SwitchbotDevice

Accessors

  • get connectionState(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    +

Returns SwitchbotDevice

Accessors

  • get connectionState(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    Parameters

    • reqBuf: Buffer<ArrayBufferLike>

      The command buffer.

    Returns Promise<Buffer<ArrayBufferLike>>

    A Promise that resolves with the response buffer.

    -
  • Connects to the device.

    +
  • Connects to the device.

    Returns Promise<void>

    A Promise that resolves when the connection is complete.

    -
  • Disconnects from the device.

    +
  • Disconnects from the device.

    Returns Promise<void>

    A Promise that resolves when the disconnection is complete.

    -
  • Discovers the device services.

    +
  • Discovers the device services.

    Returns Promise<Service[]>

    A Promise that resolves with the list of services.

    -
  • Retrieves the device characteristics.

    +
  • Retrieves the device characteristics.

    Returns Promise<Chars>

    A Promise that resolves with the device characteristics.

    -
  • Retrieves the device name.

    +
  • Retrieves the device name.

    Returns Promise<string>

    A Promise that resolves with the device name.

    -
  • Logs a message with the specified log level.

    +
  • Logs a message with the specified log level.

    Parameters

    • level: string

      The severity level of the log (e.g., 'info', 'warn', 'error').

    • message: string

      The log message to be emitted.

      -

    Returns Promise<void>

  • Sets the device name.

    +

Returns Promise<void>

  • Sets the device name.

    Parameters

    • name: string

      The new device name.

    Returns Promise<void>

    A Promise that resolves when the name is set.

    -
  • Unsubscribes from the notify characteristic.

    +
  • Unsubscribes from the notify characteristic.

    Returns Promise<void>

    A Promise that resolves when the unsubscription is complete.

    -
+
diff --git a/docs/classes/WoBlindTilt.html b/docs/classes/WoBlindTilt.html index 6a902aa4..8b60742d 100644 --- a/docs/classes/WoBlindTilt.html +++ b/docs/classes/WoBlindTilt.html @@ -1,6 +1,6 @@ WoBlindTilt | node-switchbot

Class WoBlindTilt

Class representing a WoBlindTilt device.

-

Hierarchy (View Summary)

Indexable

  • [x: string]: any

Constructors

Hierarchy (View Summary)

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Closes the blind tilt to the nearest endpoint.

    -

    Returns Promise<void>

  • Closes the blind tilt down to the nearest endpoint.

    -

    Returns Promise<void>

  • Closes the blind tilt up to the nearest endpoint.

    -

    Returns Promise<void>

  • Sends a command to the device and awaits a response.

    +

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Closes the blind tilt to the nearest endpoint.

    +

    Returns Promise<void>

  • Closes the blind tilt down to the nearest endpoint.

    +

    Returns Promise<void>

  • Closes the blind tilt up to the nearest endpoint.

    +

    Returns Promise<void>

  • Sends a command to the device and awaits a response.

    Parameters

    • reqBuf: Buffer<ArrayBufferLike>

      The command buffer.

    Returns Promise<Buffer<ArrayBufferLike>>

    A Promise that resolves with the response buffer.

    -
  • Connects to the device.

    Returns Promise<void>

    A Promise that resolves when the connection is complete.

    -
  • Disconnects from the device.

    Returns Promise<void>

    A Promise that resolves when the disconnection is complete.

    -
  • Retrieves the basic information of the blind tilt.

    Returns Promise<null | object>

    • A promise that resolves to an object containing the basic information of the blind tilt.
    -
  • Retrieves the current position of the blind tilt.

    Returns Promise<number>

    • The current position of the blind tilt (0-100).
    -
  • Logs a message with the specified log level.

    +
  • Logs a message with the specified log level.

    Parameters

    • level: string

      The severity level of the log (e.g., 'info', 'warn', 'error').

    • message: string

      The log message to be emitted.

      -

    Returns Promise<void>

  • Opens the blind tilt to the fully open position.

    -

    Returns Promise<void>

  • Runs the blind tilt to the specified position.

    +

Returns Promise<void>

  • Opens the blind tilt to the fully open position.

    +

    Returns Promise<void>

  • Runs the blind tilt to the specified position.

    Parameters

    • percent: number

      The target position percentage (0-100).

    • mode: number

      The running mode (0 or 1).

      -

    Returns Promise<void>

  • Sets the device name.

    +

Returns Promise<void>

  • Sets the device name.

    Parameters

    • name: string

      The new device name.

    Returns Promise<void>

    A Promise that resolves when the name is set.

    -
  • Parses the service data and manufacturer data for the WoBlindTilt device.

    +
  • Parses the service data and manufacturer data for the WoBlindTilt device.

    Parameters

    • serviceData: Buffer<ArrayBufferLike>

      The service data buffer.

    • manufacturerData: Buffer<ArrayBufferLike>

      The manufacturer data buffer.

    • emitLog: (level: string, message: string) => void

      The function to emit log messages.

      @@ -72,4 +72,4 @@

    Returns Promise<null | blindTiltServiceData>

    • The parsed data object or null if the data is invalid.
    -
+
diff --git a/docs/classes/WoBulb.html b/docs/classes/WoBulb.html index 60232ca5..a1e759ac 100644 --- a/docs/classes/WoBulb.html +++ b/docs/classes/WoBulb.html @@ -1,6 +1,6 @@ WoBulb | node-switchbot

Class representing a WoBulb device.

-

Hierarchy (View Summary)

Indexable

  • [x: string]: any

Constructors

Hierarchy (View Summary)

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    +

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    Parameters

    • reqBuf: Buffer<ArrayBufferLike>

      The command buffer.

    Returns Promise<Buffer<ArrayBufferLike>>

    A Promise that resolves with the response buffer.

    -
  • Connects to the device.

    Returns Promise<void>

    A Promise that resolves when the connection is complete.

    -
  • Disconnects from the device.

    Returns Promise<void>

    A Promise that resolves when the disconnection is complete.

    -
  • Logs a message with the specified log level.

    Parameters

    • level: string

      The severity level of the log (e.g., 'info', 'warn', 'error').

    • message: string

      The log message to be emitted.

      -

    Returns Promise<void>

  • Reads the state of the bulb.

    +

Returns Promise<void>

  • Reads the state of the bulb.

    Returns Promise<boolean>

    • Resolves with a boolean indicating whether the bulb is ON (true) or OFF (false).
    -
  • Sets the brightness of the bulb.

    +
  • Sets the brightness of the bulb.

    Parameters

    • brightness: number

      The brightness percentage (0-100).

    Returns Promise<boolean>

    • Resolves with a boolean indicating whether the operation was successful.
    -
  • Sets the color temperature of the bulb.

    +
  • Sets the color temperature of the bulb.

    Parameters

    • color_temperature: number

      The color temperature percentage (0-100).

    Returns Promise<boolean>

    • Resolves with a boolean indicating whether the operation was successful.
    -
  • Sets the device name.

    Parameters

    • name: string

      The new device name.

    Returns Promise<void>

    A Promise that resolves when the name is set.

    -
  • Sets the RGB color of the bulb.

    +
  • Sets the RGB color of the bulb.

    Parameters

    • brightness: number

      The brightness percentage (0-100).

    • red: number

      The red color value (0-255).

    • green: number

      The green color value (0-255).

      @@ -66,21 +66,21 @@

    Returns Promise<boolean>

    • Resolves with a boolean indicating whether the operation was successful.
    -
  • Turns off the bulb.

    Returns Promise<boolean>

    • Resolves with a boolean indicating whether the bulb is OFF (false).
    -
  • Turns on the bulb.

    Returns Promise<boolean>

    • Resolves with a boolean indicating whether the bulb is ON (true).
    -
  • Unsubscribes from the notify characteristic.

    +
  • Parses the service data for WoBulb.

    Parameters

    • serviceData: Buffer<ArrayBufferLike>

      The service data buffer.

    • manufacturerData: Buffer<ArrayBufferLike>

      The manufacturer data buffer.

    • emitLog: (level: string, message: string) => void

      The function to emit log messages.

    Returns Promise<null | colorBulbServiceData>

    • Parsed service data or null if invalid.
    -
+
diff --git a/docs/classes/WoCeilingLight.html b/docs/classes/WoCeilingLight.html index 98a5aafa..1677131e 100644 --- a/docs/classes/WoCeilingLight.html +++ b/docs/classes/WoCeilingLight.html @@ -1,6 +1,6 @@ WoCeilingLight | node-switchbot

Class WoCeilingLight

Class representing a WoCeilingLight device.

-

Hierarchy (View Summary)

Indexable

  • [x: string]: any

Constructors

Hierarchy (View Summary)

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    +

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    Parameters

    • reqBuf: Buffer<ArrayBufferLike>

      The command buffer.

    Returns Promise<Buffer<ArrayBufferLike>>

    A Promise that resolves with the response buffer.

    -
  • Connects to the device.

    Returns Promise<void>

    A Promise that resolves when the connection is complete.

    -
  • Disconnects from the device.

    Returns Promise<void>

    A Promise that resolves when the disconnection is complete.

    -
  • Logs a message with the specified log level.

    Parameters

    • level: string

      The severity level of the log (e.g., 'info', 'warn', 'error').

    • message: string

      The log message to be emitted.

      -

    Returns Promise<void>

  • Sends a command to the ceiling light.

    +

Returns Promise<void>

  • Sends a command to the ceiling light.

    Parameters

    • bytes: number[]

      The command bytes.

    Returns Promise<boolean>

    • Resolves with a boolean indicating whether the operation was successful.
    -
  • Reads the state of the ceiling light.

    Returns Promise<boolean>

    • Resolves with a boolean indicating whether the light is ON (true) or OFF (false).
    -
  • Sets the brightness of the ceiling light.

    Parameters

    • brightness: number

      The brightness percentage (0-100).

    Returns Promise<boolean>

    • Resolves with a boolean indicating whether the operation was successful.
    -
  • Sets the color temperature of the ceiling light.

    +
  • Sets the color temperature of the ceiling light.

    Parameters

    • color_temperature: number

      The color temperature percentage (0-100).

    Returns Promise<boolean>

    • Resolves with a boolean indicating whether the operation was successful.
    -
  • Sets the device name.

    Parameters

    • name: string

      The new device name.

    Returns Promise<void>

    A Promise that resolves when the name is set.

    -
  • Sets the RGB color of the ceiling light.

    +
  • Sets the RGB color of the ceiling light.

    Parameters

    • brightness: number

      The brightness percentage (0-100).

    • red: number

      The red color value (0-255).

    • green: number

      The green color value (0-255).

      @@ -74,31 +74,31 @@

    Returns Promise<boolean>

    • Resolves with a boolean indicating whether the operation was successful.
    -
  • Sets the state of the ceiling light.

    Parameters

    • reqByteArray: number[]

      The request byte array.

    Returns Promise<boolean>

    • Resolves with a boolean indicating whether the operation was successful.
    -
  • Turns off the ceiling light.

    Returns Promise<boolean>

    • Resolves with a boolean indicating whether the light is OFF (false).
    -
  • Turns on the ceiling light.

    Returns Promise<boolean>

    • Resolves with a boolean indicating whether the light is ON (true).
    -
  • Parses the service data for WoCeilingLight.

    Parameters

    • manufacturerData: Buffer<ArrayBufferLike>

      The manufacturer data buffer.

    • emitLog: (level: string, message: string) => void

      The function to emit log messages.

    Returns Promise<null | ceilingLightServiceData>

    • Parsed service data or null if invalid.
    -
  • Parses the service data for WoCeilingLight Pro.

    Parameters

    • manufacturerData: Buffer<ArrayBufferLike>

      The manufacturer data buffer.

    • emitLog: (level: string, message: string) => void

      The function to emit log messages.

    Returns Promise<null | ceilingLightProServiceData>

    • Parsed service data or null if invalid.
    -
+
diff --git a/docs/classes/WoContact.html b/docs/classes/WoContact.html index f54b9bc3..6d289671 100644 --- a/docs/classes/WoContact.html +++ b/docs/classes/WoContact.html @@ -1,6 +1,6 @@ WoContact | node-switchbot

Class representing a WoContact device.

-

Hierarchy (View Summary)

Indexable

  • [x: string]: any

Constructors

Hierarchy (View Summary)

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    +

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    Parameters

    • reqBuf: Buffer<ArrayBufferLike>

      The command buffer.

    Returns Promise<Buffer<ArrayBufferLike>>

    A Promise that resolves with the response buffer.

    -
  • Connects to the device.

    Returns Promise<void>

    A Promise that resolves when the connection is complete.

    -
  • Disconnects from the device.

    Returns Promise<void>

    A Promise that resolves when the disconnection is complete.

    -
  • Logs a message with the specified log level.

    Parameters

    • level: string

      The severity level of the log (e.g., 'info', 'warn', 'error').

    • message: string

      The log message to be emitted.

      -

    Returns Promise<void>

  • Sets the device name.

    +

Returns Promise<void>

  • Sets the device name.

    Parameters

    • name: string

      The new device name.

    Returns Promise<void>

    A Promise that resolves when the name is set.

    -
  • Parses the service data for WoContact.

    Parameters

    • serviceData: Buffer<ArrayBufferLike>

      The service data buffer.

    • emitLog: (level: string, message: string) => void

      The function to emit log messages.

    Returns Promise<null | contactSensorServiceData>

    • Parsed service data or null if invalid.
    -
+
diff --git a/docs/classes/WoCurtain.html b/docs/classes/WoCurtain.html index f9193b77..d95febb2 100644 --- a/docs/classes/WoCurtain.html +++ b/docs/classes/WoCurtain.html @@ -1,9 +1,9 @@ WoCurtain | node-switchbot

Class representing a WoCurtain device.

Hierarchy (View Summary)

Indexable

  • [x: string]: any

Constructors

Hierarchy (View Summary)

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Closes the curtain.

    +

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Closes the curtain.

    Parameters

    • Optionalmode: number = 0xFF

      Running mode (0x01 = QuietDrift, 0xFF = Default).

      -

    Returns Promise<void>

  • Sends a command to the device and awaits a response.

    +

Returns Promise<void>

  • Sends a command to the device and awaits a response.

    Parameters

    • reqBuf: Buffer<ArrayBufferLike>

      The command buffer.

    Returns Promise<Buffer<ArrayBufferLike>>

    A Promise that resolves with the response buffer.

    -
  • Connects to the device.

    Returns Promise<void>

    A Promise that resolves when the connection is complete.

    -
  • Disconnects from the device.

    Returns Promise<void>

    A Promise that resolves when the disconnection is complete.

    -
  • Logs a message with the specified log level.

    Parameters

    • level: string

      The severity level of the log (e.g., 'info', 'warn', 'error').

    • message: string

      The log message to be emitted.

      -

    Returns Promise<void>

  • Opens the curtain.

    +

Returns Promise<void>

  • Opens the curtain.

    Parameters

    • Optionalmode: number = 0xFF

      Running mode (0x01 = QuietDrift, 0xFF = Default).

      -

    Returns Promise<void>

  • Sends a command to the curtain.

    +

Returns Promise<void>

  • Sends a command to the curtain.

    Parameters

    • bytes: number[]

      The command bytes.

      -

    Returns Promise<void>

  • Runs the curtain to the target position.

    +

Returns Promise<void>

  • Runs the curtain to the target position.

    Parameters

    • percent: number

      The percentage of the target position.

    • Optionalmode: number = 0xFF

      Running mode (0x01 = QuietDrift, 0xFF = Default).

      -

    Returns Promise<void>

  • Sets the device name.

    +

Returns Promise<void>

  • Sets the device name.

    Parameters

    • name: string

      The new device name.

    Returns Promise<void>

    A Promise that resolves when the name is set.

    -
  • Parses the service data for WoCurtain.

    Parameters

    • serviceData: Buffer<ArrayBufferLike>

      The service data buffer.

    • manufacturerData: Buffer<ArrayBufferLike>

      The manufacturer data buffer.

    • emitLog: (level: string, message: string) => void

      The function to emit log messages.

      @@ -66,4 +66,4 @@

    Returns Promise<null | curtainServiceData | curtain3ServiceData>

    • Parsed service data or null if invalid.
    -
+
diff --git a/docs/classes/WoHand.html b/docs/classes/WoHand.html index 1bed185f..7e051507 100644 --- a/docs/classes/WoHand.html +++ b/docs/classes/WoHand.html @@ -1,6 +1,6 @@ WoHand | node-switchbot

Class representing a WoHand device.

-

Hierarchy (View Summary)

Indexable

  • [x: string]: any

Constructors

Hierarchy (View Summary)

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    +

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    Parameters

    • reqBuf: Buffer<ArrayBufferLike>

      The command buffer.

    Returns Promise<Buffer<ArrayBufferLike>>

    A Promise that resolves with the response buffer.

    -
  • Connects to the device.

    Returns Promise<void>

    A Promise that resolves when the connection is complete.

    -
  • Disconnects from the device.

    Returns Promise<void>

    A Promise that resolves when the disconnection is complete.

    -
  • Logs a message with the specified log level.

    Parameters

    • level: string

      The severity level of the log (e.g., 'info', 'warn', 'error').

    • message: string

      The log message to be emitted.

      -

    Returns Promise<void>

  • Sets the device name.

    +

Returns Promise<void>

  • Sets the device name.

    Parameters

    • name: string

      The new device name.

    Returns Promise<void>

    A Promise that resolves when the name is set.

    -
  • Turns off the bot.

    -

    Returns Promise<void>

  • Turns off the bot.

    +

    Returns Promise<void>

  • Parses the service data for WoHand.

    Parameters

    • serviceData: Buffer<ArrayBufferLike>

      The service data buffer.

    • emitLog: (level: string, message: string) => void

      The function to emit log messages.

    Returns Promise<null | botServiceData>

    • Parsed service data or null if invalid.
    -
+
diff --git a/docs/classes/WoHub2.html b/docs/classes/WoHub2.html index 0e704a95..ce305a0e 100644 --- a/docs/classes/WoHub2.html +++ b/docs/classes/WoHub2.html @@ -1,6 +1,6 @@ WoHub2 | node-switchbot

Class representing a WoHub2 device.

-

Hierarchy (View Summary)

Indexable

  • [x: string]: any

Constructors

Hierarchy (View Summary)

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    +

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    Parameters

    • reqBuf: Buffer<ArrayBufferLike>

      The command buffer.

    Returns Promise<Buffer<ArrayBufferLike>>

    A Promise that resolves with the response buffer.

    -
  • Connects to the device.

    Returns Promise<void>

    A Promise that resolves when the connection is complete.

    -
  • Disconnects from the device.

    Returns Promise<void>

    A Promise that resolves when the disconnection is complete.

    -
  • Logs a message with the specified log level.

    Parameters

    • level: string

      The severity level of the log (e.g., 'info', 'warn', 'error').

    • message: string

      The log message to be emitted.

      -

    Returns Promise<void>

  • Sets the device name.

    +

Returns Promise<void>

  • Sets the device name.

    Parameters

    • name: string

      The new device name.

    Returns Promise<void>

    A Promise that resolves when the name is set.

    -
  • Parses the service data for WoHub2.

    Parameters

    • manufacturerData: Buffer<ArrayBufferLike>

      The manufacturer data buffer.

    • emitLog: (level: string, message: string) => void

      The function to emit log messages.

    Returns Promise<null | hub2ServiceData>

    • Parsed service data or null if invalid.
    -
+
diff --git a/docs/classes/WoHumi.html b/docs/classes/WoHumi.html index b0dc906b..8090f20c 100644 --- a/docs/classes/WoHumi.html +++ b/docs/classes/WoHumi.html @@ -1,6 +1,6 @@ WoHumi | node-switchbot

Class representing a WoHumi device.

-

Hierarchy (View Summary)

Indexable

  • [x: string]: any

Constructors

Hierarchy (View Summary)

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    +

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    Parameters

    • reqBuf: Buffer<ArrayBufferLike>

      The command buffer.

    Returns Promise<Buffer<ArrayBufferLike>>

    A Promise that resolves with the response buffer.

    -
  • Connects to the device.

    Returns Promise<void>

    A Promise that resolves when the connection is complete.

    -
  • Decreases the humidifier setting.

    +

    Returns Promise<void>

  • Disconnects from the device.

    Returns Promise<void>

    A Promise that resolves when the disconnection is complete.

    -
  • Decreases the humidifier setting.

    -

    Returns Promise<void>

  • Increases the humidifier setting.

    +

    Returns Promise<void>

  • Logs a message with the specified log level.

    Parameters

    • level: string

      The severity level of the log (e.g., 'info', 'warn', 'error').

    • message: string

      The log message to be emitted.

      -

    Returns Promise<void>

  • Sends a command to the humidifier.

    -

    Parameters

    • bytes: number[]

      The command bytes.

      -

    Returns Promise<void>

  • Presses the humidifier button.

    -

    Returns Promise<void>

  • Sets the device name.

    +

Returns Promise<void>

  • Sets the humidifier level.

    +

    Parameters

    • level: number

      The level to set (0-100).

      +

    Returns Promise<void>

  • Sets the humidifier to auto mode.

    +

    Returns Promise<void>

  • Sets the device name.

    Parameters

    • name: string

      The new device name.

    Returns Promise<void>

    A Promise that resolves when the name is set.

    -
  • Turns off the humidifier.

    -

    Returns Promise<void>

  • Turns on the humidifier.

    -

    Returns Promise<void>

  • Sets the humidifier to manual mode.

    +

    Returns Promise<void>

  • Turns off the humidifier.

    +

    Returns Promise<void>

  • Turns on the humidifier.

    +

    Returns Promise<void>

  • Increases the humidifier setting.

    -

    Returns Promise<void>

  • Parses the service data for WoHumi.

    Parameters

    • serviceData: Buffer<ArrayBufferLike>

      The service data buffer.

    • emitLog: (level: string, message: string) => void

      The function to emit log messages.

    Returns Promise<null | humidifierServiceData>

    • Parsed service data or null if invalid.
    -
+
diff --git a/docs/classes/WoIOSensorTH.html b/docs/classes/WoIOSensorTH.html index 75628795..bceae27d 100644 --- a/docs/classes/WoIOSensorTH.html +++ b/docs/classes/WoIOSensorTH.html @@ -1,6 +1,6 @@ WoIOSensorTH | node-switchbot

Class WoIOSensorTH

Class representing a WoIOSensorTH device.

-

Hierarchy (View Summary)

Indexable

  • [x: string]: any

Constructors

Hierarchy (View Summary)

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    +

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    Parameters

    • reqBuf: Buffer<ArrayBufferLike>

      The command buffer.

    Returns Promise<Buffer<ArrayBufferLike>>

    A Promise that resolves with the response buffer.

    -
  • Connects to the device.

    Returns Promise<void>

    A Promise that resolves when the connection is complete.

    -
  • Disconnects from the device.

    Returns Promise<void>

    A Promise that resolves when the disconnection is complete.

    -
  • Logs a message with the specified log level.

    Parameters

    • level: string

      The severity level of the log (e.g., 'info', 'warn', 'error').

    • message: string

      The log message to be emitted.

      -

    Returns Promise<void>

  • Sets the device name.

    +

Returns Promise<void>

  • Sets the device name.

    Parameters

    • name: string

      The new device name.

    Returns Promise<void>

    A Promise that resolves when the name is set.

    -
  • Parses the service data for WoIOSensorTH.

    Parameters

    • serviceData: Buffer<ArrayBufferLike>

      The service data buffer.

    • manufacturerData: Buffer<ArrayBufferLike>

      The manufacturer data buffer.

    • emitLog: (level: string, message: string) => void

      The function to emit log messages.

    Returns Promise<null | outdoorMeterServiceData>

    • Parsed service data or null if invalid.
    -
+
diff --git a/docs/classes/WoPlugMiniUS.html b/docs/classes/WoPlugMiniUS.html index 4674eb4e..bd4f5225 100644 --- a/docs/classes/WoPlugMiniUS.html +++ b/docs/classes/WoPlugMiniUS.html @@ -1,6 +1,6 @@ WoPlugMiniUS | node-switchbot

Class WoPlugMiniUS

Class representing a WoPlugMini device.

-

Hierarchy (View Summary)

Indexable

  • [x: string]: any

Constructors

Hierarchy (View Summary)

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    +

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    Parameters

    • reqBuf: Buffer<ArrayBufferLike>

      The command buffer.

    Returns Promise<Buffer<ArrayBufferLike>>

    A Promise that resolves with the response buffer.

    -
  • Connects to the device.

    Returns Promise<void>

    A Promise that resolves when the connection is complete.

    -
  • Disconnects from the device.

    Returns Promise<void>

    A Promise that resolves when the disconnection is complete.

    -
  • Logs a message with the specified log level.

    Parameters

    • level: string

      The severity level of the log (e.g., 'info', 'warn', 'error').

    • message: string

      The log message to be emitted.

      -

    Returns Promise<void>

  • Operates the plug with the given bytes.

    +

Returns Promise<void>

  • Operates the plug with the given bytes.

    Parameters

    • bytes: number[]

      The byte array to send to the plug.

    Returns Promise<boolean>

    • Resolves with a boolean that tells whether the plug is ON (true) or OFF (false).
    -
  • Reads the state of the plug.

    Returns Promise<boolean>

    • Resolves with a boolean that tells whether the plug is ON (true) or OFF (false).
    -
  • Sets the device name.

    Parameters

    • name: string

      The new device name.

    Returns Promise<void>

    A Promise that resolves when the name is set.

    -
  • Toggles the state of the plug.

    Returns Promise<boolean>

    • Resolves with a boolean that tells whether the plug is ON (true) or OFF (false).
    -
  • Turns off the plug.

    Returns Promise<boolean>

    • Resolves with a boolean that tells whether the plug is ON (true) or OFF (false).
    -
  • Turns on the plug.

    Returns Promise<boolean>

    • Resolves with a boolean that tells whether the plug is ON (true) or OFF (false).
    -
  • Unsubscribes from the notify characteristic.

    +
  • Parses the service data for WoPlugMini US.

    Parameters

    • manufacturerData: Buffer<ArrayBufferLike>

      The manufacturer data buffer.

    • emitLog: (level: string, message: string) => void

      The function to emit log messages.

    Returns Promise<null | plugMiniUSServiceData>

    • Parsed service data or null if invalid.
    -
+
diff --git a/docs/classes/WoPresence.html b/docs/classes/WoPresence.html index 631483ce..10c0899d 100644 --- a/docs/classes/WoPresence.html +++ b/docs/classes/WoPresence.html @@ -1,6 +1,6 @@ WoPresence | node-switchbot

Class WoPresence

Class representing a WoPresence device.

-

Hierarchy (View Summary)

Indexable

  • [x: string]: any

Constructors

Hierarchy (View Summary)

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    +

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    Parameters

    • reqBuf: Buffer<ArrayBufferLike>

      The command buffer.

    Returns Promise<Buffer<ArrayBufferLike>>

    A Promise that resolves with the response buffer.

    -
  • Connects to the device.

    Returns Promise<void>

    A Promise that resolves when the connection is complete.

    -
  • Disconnects from the device.

    Returns Promise<void>

    A Promise that resolves when the disconnection is complete.

    -
  • Logs a message with the specified log level.

    Parameters

    • level: string

      The severity level of the log (e.g., 'info', 'warn', 'error').

    • message: string

      The log message to be emitted.

      -

    Returns Promise<void>

  • Sets the device name.

    +

Returns Promise<void>

  • Sets the device name.

    Parameters

    • name: string

      The new device name.

    Returns Promise<void>

    A Promise that resolves when the name is set.

    -
  • Parses the service data for WoPresence.

    Parameters

    • serviceData: Buffer<ArrayBufferLike>

      The service data buffer.

    • emitLog: (level: string, message: string) => void

      The function to emit log messages.

    Returns Promise<null | motionSensorServiceData>

    • Parsed service data or null if invalid.
    -
+
diff --git a/docs/classes/WoSensorTH.html b/docs/classes/WoSensorTH.html index d4ff3844..f0617421 100644 --- a/docs/classes/WoSensorTH.html +++ b/docs/classes/WoSensorTH.html @@ -1,6 +1,6 @@ WoSensorTH | node-switchbot

Class WoSensorTH

Class representing a WoSensorTH device.

-

Hierarchy (View Summary)

Indexable

  • [x: string]: any

Constructors

Hierarchy (View Summary)

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    +

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    Parameters

    • reqBuf: Buffer<ArrayBufferLike>

      The command buffer.

    Returns Promise<Buffer<ArrayBufferLike>>

    A Promise that resolves with the response buffer.

    -
  • Connects to the device.

    Returns Promise<void>

    A Promise that resolves when the connection is complete.

    -
  • Disconnects from the device.

    Returns Promise<void>

    A Promise that resolves when the disconnection is complete.

    -
  • Logs a message with the specified log level.

    Parameters

    • level: string

      The severity level of the log (e.g., 'info', 'warn', 'error').

    • message: string

      The log message to be emitted.

      -

    Returns Promise<void>

  • Sets the device name.

    +

Returns Promise<void>

  • Sets the device name.

    Parameters

    • name: string

      The new device name.

    Returns Promise<void>

    A Promise that resolves when the name is set.

    -
  • Parameters

    • serviceData: Buffer<ArrayBufferLike>
    • emitLog: (level: string, message: string) => void

    Returns Promise<null | meterServiceData>

+
  • Parameters

    • serviceData: Buffer<ArrayBufferLike>
    • emitLog: (level: string, message: string) => void

    Returns Promise<null | meterServiceData>

diff --git a/docs/classes/WoSmartLock.html b/docs/classes/WoSmartLock.html index d703df4e..6fbe4caa 100644 --- a/docs/classes/WoSmartLock.html +++ b/docs/classes/WoSmartLock.html @@ -1,6 +1,6 @@ WoSmartLock | node-switchbot

Class WoSmartLock

Class representing a WoSmartLock device.

-

Hierarchy (View Summary)

Indexable

  • [x: string]: any

Constructors

Hierarchy (View Summary)

Constructors

Properties

encryption_key: null | Buffer<ArrayBufferLike> = null
iv: null | Buffer<ArrayBufferLike> = null
key_id: string = ''
Result: { ERROR: number; SUCCESS: number; SUCCESS_LOW_BATTERY: number } = ...

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    +

Constructors

Properties

encryption_key: null | Buffer<ArrayBufferLike> = null
iv: null | Buffer<ArrayBufferLike> = null
key_id: string = ''
Result: { ERROR: number; SUCCESS: number; SUCCESS_LOW_BATTERY: number } = ...

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    Parameters

    • reqBuf: Buffer<ArrayBufferLike>

      The command buffer.

    Returns Promise<Buffer<ArrayBufferLike>>

    A Promise that resolves with the response buffer.

    -
  • Connects to the device.

    Returns Promise<void>

    A Promise that resolves when the connection is complete.

    -
  • Decrypts a buffer using AES-128-CTR.

    Parameters

    • data: Buffer<ArrayBufferLike>

      The data to decrypt.

    Returns Promise<Buffer<ArrayBufferLike>>

    • The decrypted data.
    -
  • Disconnects from the device.

    Returns Promise<void>

    A Promise that resolves when the disconnection is complete.

    -
  • Encrypts a string using AES-128-CTR.

    Parameters

    • str: string

      The string to encrypt.

    Returns Promise<string>

    • The encrypted string in hex format.
    -
  • Sends an encrypted command to the device.

    +
  • Sends an encrypted command to the device.

    Parameters

    • key: string

      The command key.

    Returns Promise<Buffer<ArrayBufferLike>>

    • The response buffer.
    -
  • Retrieves the IV from the device.

    Returns Promise<Buffer<ArrayBufferLike>>

    • The IV buffer.
    -
  • Gets general state info from the Smart Lock.

    Returns Promise<null | object>

    • The state object or null if an error occurred.
    -
  • Locks the Smart Lock.

    Returns Promise<number>

    • The result of the lock operation.
    -
  • Logs a message with the specified log level.

    +
  • Logs a message with the specified log level.

    Parameters

    • level: string

      The severity level of the log (e.g., 'info', 'warn', 'error').

    • message: string

      The log message to be emitted.

      -

    Returns Promise<void>

  • Operates the lock with the given command.

    +

Returns Promise<void>

  • Operates the lock with the given command.

    Parameters

    • key: string

      The command key.

    • Optionalencrypt: boolean = true

      Whether to encrypt the command.

    Returns Promise<Buffer<ArrayBufferLike>>

    • The response buffer.
    -
  • Sets the device name.

    Parameters

    • name: string

      The new device name.

    Returns Promise<void>

    A Promise that resolves when the name is set.

    -
  • Initializes the encryption key info for valid lock communication.

    Parameters

    • keyId: string

      The key ID.

    • encryptionKey: string

      The encryption key.

      -

    Returns Promise<void>

  • Unlocks the Smart Lock.

    +

Returns Promise<void>

  • Unlocks the Smart Lock.

    Returns Promise<number>

    • The result of the unlock operation.
    -
  • Unlocks the Smart Lock without unlatching the door.

    Returns Promise<number>

    • The result of the unlock operation.
    -
  • Parses the service data from the SwitchBot Strip Light.

    +
  • Parses the service data from the SwitchBot Strip Light.

    Parameters

    • serviceData: Buffer<ArrayBufferLike>

      The service data buffer.

    • manufacturerData: Buffer<ArrayBufferLike>

      The manufacturer data buffer.

    • emitLog: (level: string, message: string) => void

      The function to emit log messages.

    Returns Promise<null | lockServiceData>

    • Parsed service data or null if invalid.
    -
  • Parameters

    • res: Buffer<ArrayBufferLike>

    Returns Promise<number>

+
  • Parameters

    • res: Buffer<ArrayBufferLike>

    Returns Promise<number>

diff --git a/docs/classes/WoSmartLockPro.html b/docs/classes/WoSmartLockPro.html index 14024acb..e794ce21 100644 --- a/docs/classes/WoSmartLockPro.html +++ b/docs/classes/WoSmartLockPro.html @@ -1,6 +1,6 @@ WoSmartLockPro | node-switchbot

Class WoSmartLockPro

Class representing a WoSmartLockPro device.

-

Hierarchy (View Summary)

Indexable

  • [x: string]: any

Constructors

Hierarchy (View Summary)

Constructors

Properties

encryption_key: null | Buffer<ArrayBufferLike> = null
iv: null | Buffer<ArrayBufferLike> = null
key_id: string = ''
Result: { ERROR: number; SUCCESS: number; SUCCESS_LOW_BATTERY: number } = ...

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    +

Constructors

Properties

encryption_key: null | Buffer<ArrayBufferLike> = null
iv: null | Buffer<ArrayBufferLike> = null
key_id: string = ''
Result: { ERROR: number; SUCCESS: number; SUCCESS_LOW_BATTERY: number } = ...

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    Parameters

    • reqBuf: Buffer<ArrayBufferLike>

      The command buffer.

    Returns Promise<Buffer<ArrayBufferLike>>

    A Promise that resolves with the response buffer.

    -
  • Connects to the device.

    Returns Promise<void>

    A Promise that resolves when the connection is complete.

    -
  • Decrypts a buffer using AES-128-CTR.

    Parameters

    • data: Buffer<ArrayBufferLike>

      The data to decrypt.

    Returns Promise<Buffer<ArrayBufferLike>>

    • The decrypted data.
    -
  • Disconnects from the device.

    Returns Promise<void>

    A Promise that resolves when the disconnection is complete.

    -
  • Encrypts a string using AES-128-CTR.

    Parameters

    • str: string

      The string to encrypt.

    Returns Promise<string>

    • The encrypted string in hex format.
    -
  • Sends an encrypted command to the device.

    +
  • Sends an encrypted command to the device.

    Parameters

    • key: string

      The command key.

    Returns Promise<Buffer<ArrayBufferLike>>

    • The response buffer.
    -
  • Retrieves the IV from the device.

    Returns Promise<Buffer<ArrayBufferLike>>

    • The IV buffer.
    -
  • Gets general state info from the Smart Lock.

    Returns Promise<null | object>

    • The state object or null if an error occurred.
    -
  • Locks the Smart Lock.

    Returns Promise<number>

    • The result of the lock operation.
    -
  • Logs a message with the specified log level.

    Parameters

    • level: string

      The severity level of the log (e.g., 'info', 'warn', 'error').

    • message: string

      The log message to be emitted.

      -

    Returns Promise<void>

  • Operates the lock with the given command.

    +

Returns Promise<void>

  • Operates the lock with the given command.

    Parameters

    • key: string

      The command key.

    • Optionalencrypt: boolean = true

      Whether to encrypt the command.

    Returns Promise<Buffer<ArrayBufferLike>>

    • The response buffer.
    -
  • Sets the device name.

    Parameters

    • name: string

      The new device name.

    Returns Promise<void>

    A Promise that resolves when the name is set.

    -
  • Initializes the encryption key info for valid lock communication.

    Parameters

    • keyId: string

      The key ID.

    • encryptionKey: string

      The encryption key.

      -

    Returns Promise<void>

  • Unlocks the Smart Lock.

    +

Returns Promise<void>

  • Unlocks the Smart Lock.

    Returns Promise<number>

    • The result of the unlock operation.
    -
  • Unlocks the Smart Lock without unlatching the door.

    Returns Promise<number>

    • The result of the unlock operation.
    -
  • Parses the service data from the SwitchBot Strip Light.

    +
  • Parses the service data from the SwitchBot Strip Light.

    Parameters

    • serviceData: Buffer<ArrayBufferLike>

      The service data buffer.

    • manufacturerData: Buffer<ArrayBufferLike>

      The manufacturer data buffer.

    • emitLog: (level: string, message: string) => void

      The function to emit log messages.

    Returns Promise<null | lockProServiceData>

    • Parsed service data or null if invalid.
    -
  • Parameters

    • res: Buffer<ArrayBufferLike>

    Returns Promise<number>

+
  • Parameters

    • res: Buffer<ArrayBufferLike>

    Returns Promise<number>

diff --git a/docs/classes/WoStrip.html b/docs/classes/WoStrip.html index cbef1ad7..7fec2238 100644 --- a/docs/classes/WoStrip.html +++ b/docs/classes/WoStrip.html @@ -1,6 +1,6 @@ WoStrip | node-switchbot

Class representing a WoStrip device.

-

Hierarchy (View Summary)

Indexable

  • [x: string]: any

Constructors

Hierarchy (View Summary)

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    +

Constructors

Accessors

  • get address(): string
  • Returns string

  • get connectionState(): string
  • Returns string

  • get id(): string
  • Returns string

  • get onConnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onConnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

  • get onDisconnectHandler(): () => Promise<void>
  • Returns () => Promise<void>

  • set onDisconnectHandler(func: () => Promise<void>): void
  • Parameters

    • func: () => Promise<void>

    Returns void

Methods

  • Sends a command to the device and awaits a response.

    Parameters

    • reqBuf: Buffer<ArrayBufferLike>

      The command buffer.

    Returns Promise<Buffer<ArrayBufferLike>>

    A Promise that resolves with the response buffer.

    -
  • Connects to the device.

    Returns Promise<void>

    A Promise that resolves when the connection is complete.

    -
  • Disconnects from the device.

    Returns Promise<void>

    A Promise that resolves when the disconnection is complete.

    -
  • Logs a message with the specified log level.

    Parameters

    • level: string

      The severity level of the log (e.g., 'info', 'warn', 'error').

    • message: string

      The log message to be emitted.

      -

    Returns Promise<void>

  • Operates the strip light with the given byte array.

    +

Returns Promise<void>

  • Operates the strip light with the given byte array.

    Parameters

    • bytes: number[]

      The byte array to send.

    Returns Promise<boolean>

    • Resolves with true if the operation was successful.
    -
  • Reads the state of the strip light.

    Returns Promise<boolean>

    • Resolves with true if the strip light is ON, false otherwise.
    -
  • Sets the brightness of the strip light.

    +
  • Sets the brightness of the strip light.

    Parameters

    • brightness: number

      The brightness percentage (0-100).

    Returns Promise<boolean>

    • Resolves with true if the operation was successful.
    -
  • Sets the device name.

    Parameters

    • name: string

      The new device name.

    Returns Promise<void>

    A Promise that resolves when the name is set.

    -
  • Sets the RGB values of the strip light.

    +
  • Sets the RGB values of the strip light.

    Parameters

    • brightness: number

      The brightness percentage (0-100).

    • red: number

      The red value (0-255).

    • green: number

      The green value (0-255).

      @@ -67,25 +67,25 @@

    Returns Promise<boolean>

    • Resolves with true if the operation was successful.
    -
  • Sets the state of the strip light.

    +
  • Sets the state of the strip light.

    Parameters

    • reqByteArray: number[]

      The request byte array.

    Returns Promise<boolean>

    • Resolves with true if the operation was successful.
    -
  • Turns the strip light off.

    Returns Promise<boolean>

    • Resolves with true if the strip light is OFF.
    -
  • Turns the strip light on.

    Returns Promise<boolean>

    • Resolves with true if the strip light is ON.
    -
  • Unsubscribes from the notify characteristic.

    +
  • Parses the service data from the SwitchBot Strip Light.

    Parameters

    • serviceData: Buffer<ArrayBufferLike>

      The service data buffer.

    • emitLog: (level: string, message: string) => void

      The function to emit log messages.

    Returns Promise<null | stripLightServiceData>

    • Parsed service data or null if invalid.
    -
+
diff --git a/docs/enums/LogLevel.html b/docs/enums/LogLevel.html index 744133d6..7efe108f 100644 --- a/docs/enums/LogLevel.html +++ b/docs/enums/LogLevel.html @@ -1,5 +1,5 @@ LogLevel | node-switchbot

Enumeration LogLevel

Enum for log levels.

-

Enumeration Members

Enumeration Members

Enumeration Members

DEBUG: "debug"
DEBUGERROR: "debugerror"
DEBUGSUCCESS: "debugsuccess"
DEBUGWARN: "debugwarn"
ERROR: "error"
INFO: "info"
SUCCESS: "success"
WARN: "warn"
+

Enumeration Members

DEBUG: "debug"
DEBUGERROR: "debugerror"
DEBUGSUCCESS: "debugsuccess"
DEBUGWARN: "debugwarn"
ERROR: "error"
INFO: "info"
SUCCESS: "success"
WARN: "warn"
diff --git a/docs/enums/SwitchBotBLEModel.html b/docs/enums/SwitchBotBLEModel.html index e6863e90..7492fd38 100644 --- a/docs/enums/SwitchBotBLEModel.html +++ b/docs/enums/SwitchBotBLEModel.html @@ -1,4 +1,4 @@ -SwitchBotBLEModel | node-switchbot

Enumeration SwitchBotBLEModel

Enumeration Members

BlindTilt +SwitchBotBLEModel | node-switchbot

Enumeration SwitchBotBLEModel

Enumeration Members

BlindTilt: "x"
Bot: "H"
CeilingLight: "q"
CeilingLightPro: "n"
ColorBulb: "u"
ContactSensor: "d"
Curtain: "c"
Curtain3: "{"
Hub2: "v"
Humidifier: "e"
Keypad: "y"
Leak: "3"
Lock: "o"
LockPro: "$"
Meter: "T"
MeterPlus: "i"
MeterPro: "4"
MeterProCO2: "5"
MotionSensor: "s"
OutdoorMeter: "w"
PlugMiniJP: "j"
PlugMiniUS: "g"
RelaySwitch1Plus: ";"
RelaySwitch1PM: "<"
StripLight: "r"
Unknown: "Unknown"
+

Enumeration Members

BlindTilt: "x"
Bot: "H"
CeilingLight: "q"
CeilingLightPro: "n"
ColorBulb: "u"
ContactSensor: "d"
Curtain: "c"
Curtain3: "{"
Hub2: "v"
Humidifier: "e"
Humidifier2: "E"
Keypad: "y"
Leak: "3"
Lock: "o"
LockPro: "$"
Meter: "T"
MeterPlus: "i"
MeterPro: "4"
MeterProCO2: "5"
MotionSensor: "s"
OutdoorMeter: "w"
PlugMiniJP: "j"
PlugMiniUS: "g"
RelaySwitch1: ";"
RelaySwitch1PM: "<"
StripLight: "r"
Unknown: "Unknown"
diff --git a/docs/enums/SwitchBotBLEModelFriendlyName.html b/docs/enums/SwitchBotBLEModelFriendlyName.html index 333ee2b2..3621955e 100644 --- a/docs/enums/SwitchBotBLEModelFriendlyName.html +++ b/docs/enums/SwitchBotBLEModelFriendlyName.html @@ -1,4 +1,4 @@ -SwitchBotBLEModelFriendlyName | node-switchbot

Enumeration SwitchBotBLEModelFriendlyName

Enumeration Members

BlindTilt +SwitchBotBLEModelFriendlyName | node-switchbot

Enumeration SwitchBotBLEModelFriendlyName

Enumeration Members

BlindTilt: "Blind Tilt"
Bot: "Bot"
CeilingLight: "Ceiling Light"
CeilingLightPro: "Ceiling Light Pro"
ColorBulb: "Color Bulb"
ContactSensor: "Contact Sensor"
Curtain: "Curtain"
Curtain3: "Curtain 3"
Hub2: "Hub 2"
Humidifier: "Humidifier"
Keypad: "Keypad"
Leak: "Water Detector"
Lock: "Lock"
LockPro: "Lock Pro"
Meter: "Meter"
MeterPlus: "Meter Plus"
MeterPro: "Meter Pro"
MeterProCO2: "Meter Pro CO2"
MotionSensor: "Motion Sensor"
OutdoorMeter: "Outdoor Meter"
PlugMini: "Plug Mini"
RelaySwitch1Plus: "Relay Switch 1 Plus"
RelaySwitch1PM: "Relay Switch 1PM"
StripLight: "Strip Light"
Unknown: "Unknown"
+

Enumeration Members

BlindTilt: "Blind Tilt"
Bot: "Bot"
CeilingLight: "Ceiling Light"
CeilingLightPro: "Ceiling Light Pro"
ColorBulb: "Color Bulb"
ContactSensor: "Contact Sensor"
Curtain: "Curtain"
Curtain3: "Curtain 3"
Hub2: "Hub 2"
Humidifier: "Humidifier"
Humidifier2: "Humidifier2"
Keypad: "Keypad"
Leak: "Water Detector"
Lock: "Lock"
LockPro: "Lock Pro"
Meter: "Meter"
MeterPlus: "Meter Plus"
MeterPro: "Meter Pro"
MeterProCO2: "Meter Pro CO2"
MotionSensor: "Motion Sensor"
OutdoorMeter: "Outdoor Meter"
PlugMini: "Plug Mini"
RelaySwitch1: "Relay Switch 1"
RelaySwitch1PM: "Relay Switch 1PM"
StripLight: "Strip Light"
Unknown: "Unknown"
diff --git a/docs/enums/SwitchBotBLEModelName.html b/docs/enums/SwitchBotBLEModelName.html index ec9f66e5..3b82b7d8 100644 --- a/docs/enums/SwitchBotBLEModelName.html +++ b/docs/enums/SwitchBotBLEModelName.html @@ -1,4 +1,4 @@ -SwitchBotBLEModelName | node-switchbot

Enumeration SwitchBotBLEModelName

Enumeration Members

BlindTilt +SwitchBotBLEModelName | node-switchbot

Enumeration SwitchBotBLEModelName

Enumeration Members

BlindTilt: "WoBlindTilt"
Bot: "WoHand"
CeilingLight: "WoCeilingLight"
CeilingLightPro: "WoCeilingLightPro"
ColorBulb: "WoBulb"
ContactSensor: "WoContact"
Curtain: "WoCurtain"
Curtain3: "WoCurtain3"
Hub2: "WoHub2"
Humidifier: "WoHumi"
Keypad: "WoKeypad"
Leak: "WoLeakDetector"
Lock: "WoSmartLock"
LockPro: "WoSmartLockPro"
Meter: "WoSensorTH"
MeterPlus: "WoSensorTHPlus"
MeterPro: "WoSensorTHP"
MeterProCO2: "WoSensorTHPc"
MotionSensor: "WoMotion"
OutdoorMeter: "WoIOSensorTH"
PlugMini: "WoPlugMini"
RelaySwitch1Plus: "WoRelaySwitch1Plus"
RelaySwitch1PM: "WoRelaySwitch1PM"
StripLight: "WoStrip"
Unknown: "Unknown"
+

Enumeration Members

BlindTilt: "WoBlindTilt"
Bot: "WoHand"
CeilingLight: "WoCeilingLight"
CeilingLightPro: "WoCeilingLightPro"
ColorBulb: "WoBulb"
ContactSensor: "WoContact"
Curtain: "WoCurtain"
Curtain3: "WoCurtain3"
Hub2: "WoHub2"
Humidifier: "WoHumi"
Humidifier2: "WoHumi2"
Keypad: "WoKeypad"
Leak: "WoLeakDetector"
Lock: "WoSmartLock"
LockPro: "WoSmartLockPro"
Meter: "WoSensorTH"
MeterPlus: "WoSensorTHPlus"
MeterPro: "WoSensorTHP"
MeterProCO2: "WoSensorTHPc"
MotionSensor: "WoMotion"
OutdoorMeter: "WoIOSensorTH"
PlugMini: "WoPlugMini"
RelaySwitch1: "WoRelaySwitch1Plus"
RelaySwitch1PM: "WoRelaySwitch1PM"
StripLight: "WoStrip"
Unknown: "Unknown"
diff --git a/docs/enums/SwitchBotModel.html b/docs/enums/SwitchBotModel.html index cb8d9477..d38412fa 100644 --- a/docs/enums/SwitchBotModel.html +++ b/docs/enums/SwitchBotModel.html @@ -1,4 +1,4 @@ -SwitchBotModel | node-switchbot

Enumeration SwitchBotModel

Enumeration Members

BatteryCirculatorFan +SwitchBotModel | node-switchbot

Enumeration SwitchBotModel

Enumeration Members

BatteryCirculatorFan: "W3800510"
BlindTilt: "W2701600"
Bot: "SwitchBot S1"
CeilingLight: "W2612230/W2612240"
CeilingLightPro: "W2612210/W2612220"
ColorBulb: "W1401400"
ContactSensor: "W1201500"
Curtain: "W0701600"
Curtain3: "W2400000"
Hub2: "W3202100"
HubMini: "W0202200"
HubPlus: "SwitchBot Hub S1"
Humidifier: "W0801800"
IndoorCam: "W1301200"
K10: "K10+"
K10Pro: "K10+ Pro"
Keypad: "W2500010"
KeypadTouch: "W2500020"
Lock: "W1601700"
LockPro: "W3500000"
Meter: "SwitchBot MeterTH S1"
MeterPlusJP: "W2201500"
MeterPlusUS: "W2301500"
MeterPro: "W4900000"
MeterProCO2: "W4900010"
MotionSensor: "W1101500"
OutdoorMeter: "W3400010"
PanTiltCam: "W1801200"
PanTiltCam2K: "W3101100"
Plug: "SP11"
PlugMiniJP: "W2001400/W2001401"
PlugMiniUS: "W1901400/W1901401"
Remote: "Remote"
RobotVacuumCleanerS1: "W3011000"
RobotVacuumCleanerS10: "W3211800"
RobotVacuumCleanerS1Plus: "W3011010"
StripLight: "W1701100"
UniversalRemote: "UniversalRemote"
Unknown: "Unknown"
WaterDetector: "W4402000"
WoSweeper: "WoSweeper"
WoSweeperMini: "WoSweeperMini"
+

Enumeration Members

BatteryCirculatorFan: "W3800510"
BlindTilt: "W2701600"
Bot: "SwitchBot S1"
CeilingLight: "W2612230/W2612240"
CeilingLightPro: "W2612210/W2612220"
ColorBulb: "W1401400"
ContactSensor: "W1201500"
Curtain: "W0701600"
Curtain3: "W2400000"
Hub2: "W3202100"
HubMini: "W0202200"
HubPlus: "SwitchBot Hub S1"
Humidifier: "W0801800"
Humidifier2: "WXXXXXXX"
IndoorCam: "W1301200"
K10: "K10+"
K10Pro: "K10+ Pro"
Keypad: "W2500010"
KeypadTouch: "W2500020"
Lock: "W1601700"
LockPro: "W3500000"
Meter: "SwitchBot MeterTH S1"
MeterPlusJP: "W2201500"
MeterPlusUS: "W2301500"
MeterPro: "W4900000"
MeterProCO2: "W4900010"
MotionSensor: "W1101500"
OutdoorMeter: "W3400010"
PanTiltCam: "W1801200"
PanTiltCam2K: "W3101100"
Plug: "SP11"
PlugMiniJP: "W2001400/W2001401"
PlugMiniUS: "W1901400/W1901401"
Remote: "Remote"
RobotVacuumCleanerS1: "W3011000"
RobotVacuumCleanerS10: "W3211800"
RobotVacuumCleanerS1Plus: "W3011010"
StripLight: "W1701100"
UniversalRemote: "UniversalRemote"
Unknown: "Unknown"
WaterDetector: "W4402000"
WoSweeper: "WoSweeper"
WoSweeperMini: "WoSweeperMini"
diff --git a/docs/hierarchy.html b/docs/hierarchy.html index 6f38a52e..0190ec1a 100644 --- a/docs/hierarchy.html +++ b/docs/hierarchy.html @@ -1 +1 @@ -node-switchbot
+node-switchbot
diff --git a/docs/index.html b/docs/index.html index 2f4f3a72..b1c79fe3 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,21 +1,21 @@ node-switchbot

node-switchbot

node-switchbot

-

Node-SwitchBot

npm version -npm downloads

+

Node-SwitchBot

npm version +npm downloads

-

The node-switchbot is a Node.js module that allows you to interact with various SwitchBot devices. You can control your SwitchBot (Bot)'s arm, operate your SwitchBot Curtain, and manage your SwitchBot Lock. Additionally, you can monitor temperature and humidity using the SwitchBot Thermometer & Hygrometer (Meter), and check the status of the SwitchBot Motion Sensor and SwitchBot Contact Sensor.

+

The node-switchbot is a Node.js module that allows you to interact with various SwitchBot devices. You can control your SwitchBot (Bot)'s arm, operate your SwitchBot Curtain, and manage your SwitchBot Lock. Additionally, you can monitor temperature and humidity using the SwitchBot Thermometer & Hygrometer (Meter), and check the status of the SwitchBot Motion Sensor and SwitchBot Contact Sensor.

This module now supports both Bluetooth Low Energy (BLE) and the SwitchBot OpenAPI, providing more flexibility and options for interacting with your devices.

-

Please note that most of this module was developed by referencing the official BLE API and OpenAPI documentation. However, some functionalities were developed through trial and error, so there might be inaccuracies in the information obtained from this module.

+

Please note that most of this module was developed by referencing the official BLE API and OpenAPI documentation. However, some functionalities were developed through trial and error, so there might be inaccuracies in the information obtained from this module.


-

To install the node-switchbot module within your project, use the following command:

+

To install the node-switchbot module within your project, use the following command:

$ npm install --save node-switchbot
 

To see a breakdown of how to use the BLE functionality of this project, visit the BLE (Bluetooth Low Energy) documentation.

To see a breakdown of how to use the OpenAPI functionality of this project, visit the OpenAPI documentation.

-
+
diff --git a/docs/interfaces/AdvertisementData.html b/docs/interfaces/AdvertisementData.html index f69c9e2f..b4e358e5 100644 --- a/docs/interfaces/AdvertisementData.html +++ b/docs/interfaces/AdvertisementData.html @@ -1,3 +1,3 @@ -AdvertisementData | node-switchbot

Interface AdvertisementData

interface AdvertisementData {
    manufacturerData: null | Buffer<ArrayBufferLike>;
    serviceData: null | Buffer<ArrayBufferLike>;
}

Properties

manufacturerData +AdvertisementData | node-switchbot

Interface AdvertisementData

interface AdvertisementData {
    manufacturerData: null | Buffer<ArrayBufferLike>;
    serviceData: null | Buffer<ArrayBufferLike>;
}

Properties

manufacturerData: null | Buffer<ArrayBufferLike>
serviceData: null | Buffer<ArrayBufferLike>
+

Properties

manufacturerData: null | Buffer<ArrayBufferLike>
serviceData: null | Buffer<ArrayBufferLike>
diff --git a/docs/interfaces/Chars.html b/docs/interfaces/Chars.html index 4d38dddd..d2cc2687 100644 --- a/docs/interfaces/Chars.html +++ b/docs/interfaces/Chars.html @@ -1,4 +1,4 @@ -Chars | node-switchbot

Interface Chars

interface Chars {
    device: null | Characteristic;
    notify: null | Characteristic;
    write: null | Characteristic;
}

Properties

device +Chars | node-switchbot

Interface Chars

interface Chars {
    device: null | Characteristic;
    notify: null | Characteristic;
    write: null | Characteristic;
}

Properties

Properties

device: null | Characteristic
notify: null | Characteristic
write: null | Characteristic
+

Properties

device: null | Characteristic
notify: null | Characteristic
write: null | Characteristic
diff --git a/docs/interfaces/ErrorObject.html b/docs/interfaces/ErrorObject.html index 8f8ed55a..53dcf657 100644 --- a/docs/interfaces/ErrorObject.html +++ b/docs/interfaces/ErrorObject.html @@ -1,3 +1,3 @@ -ErrorObject | node-switchbot

Interface ErrorObject

interface ErrorObject {
    code: string;
    message: string;
}

Properties

code +ErrorObject | node-switchbot

Interface ErrorObject

interface ErrorObject {
    code: string;
    message: string;
}

Properties

Properties

code: string
message: string
+

Properties

code: string
message: string
diff --git a/docs/interfaces/NobleTypes.html b/docs/interfaces/NobleTypes.html index 673f3353..580993df 100644 --- a/docs/interfaces/NobleTypes.html +++ b/docs/interfaces/NobleTypes.html @@ -1,4 +1,4 @@ -NobleTypes | node-switchbot

Interface NobleTypes

interface NobleTypes {
    noble: __module;
    peripheral: Peripheral;
    state:
        | "unknown"
        | "resetting"
        | "unsupported"
        | "unauthorized"
        | "poweredOff"
        | "poweredOn";
}

Properties

noble +NobleTypes | node-switchbot

Interface NobleTypes

interface NobleTypes {
    noble: __module;
    peripheral: Peripheral;
    state:
        | "unknown"
        | "resetting"
        | "unsupported"
        | "unauthorized"
        | "poweredOff"
        | "poweredOn";
}

Properties

Properties

noble: __module
peripheral: Peripheral
state:
    | "unknown"
    | "resetting"
    | "unsupported"
    | "unauthorized"
    | "poweredOff"
    | "poweredOn"
+

Properties

noble: __module
peripheral: Peripheral
state:
    | "unknown"
    | "resetting"
    | "unsupported"
    | "unauthorized"
    | "poweredOff"
    | "poweredOn"
diff --git a/docs/interfaces/Params.html b/docs/interfaces/Params.html index c43a7868..9798e87b 100644 --- a/docs/interfaces/Params.html +++ b/docs/interfaces/Params.html @@ -1,6 +1,6 @@ -Params | node-switchbot

Interface Params

interface Params {
    duration?: number;
    id?: string;
    model?: string;
    noble?: __module;
    quick?: boolean;
}

Properties

duration? +Params | node-switchbot

Interface Params

interface Params {
    duration?: number;
    id?: string;
    model?: string;
    noble?: __module;
    quick?: boolean;
}

Properties

duration?: number
id?: string
model?: string
noble?: __module
quick?: boolean
+

Properties

duration?: number
id?: string
model?: string
noble?: __module
quick?: boolean
diff --git a/docs/interfaces/Rule.html b/docs/interfaces/Rule.html index e39af81c..6997f405 100644 --- a/docs/interfaces/Rule.html +++ b/docs/interfaces/Rule.html @@ -1,4 +1,4 @@ -Rule | node-switchbot

Interface Rule

interface Rule {
    enum?: unknown[];
    max?: number;
    maxBytes?: number;
    min?: number;
    minBytes?: number;
    pattern?: RegExp;
    required?: boolean;
    type?: "string" | "boolean" | "object" | "float" | "integer" | "array";
}

Properties

enum? +Rule | node-switchbot

Interface Rule

interface Rule {
    enum?: unknown[];
    max?: number;
    maxBytes?: number;
    min?: number;
    minBytes?: number;
    pattern?: RegExp;
    required?: boolean;
    type?: "string" | "boolean" | "object" | "float" | "integer" | "array";
}

Properties

Properties

enum?: unknown[]
max?: number
maxBytes?: number
min?: number
minBytes?: number
pattern?: RegExp
required?: boolean
type?: "string" | "boolean" | "object" | "float" | "integer" | "array"
+

Properties

enum?: unknown[]
max?: number
maxBytes?: number
min?: number
minBytes?: number
pattern?: RegExp
required?: boolean
type?: "string" | "boolean" | "object" | "float" | "integer" | "array"
diff --git a/docs/interfaces/ServiceData.html b/docs/interfaces/ServiceData.html index d2f46b6d..45d479e2 100644 --- a/docs/interfaces/ServiceData.html +++ b/docs/interfaces/ServiceData.html @@ -1,2 +1,2 @@ -ServiceData | node-switchbot

Interface ServiceData

interface ServiceData {
    model: string;
    [key: string]: unknown;
}

Indexable

  • [key: string]: unknown

Properties

Properties

model: string
+ServiceData | node-switchbot

Interface ServiceData

interface ServiceData {
    model: string;
    [key: string]: unknown;
}

Indexable

  • [key: string]: unknown

Properties

Properties

model: string
diff --git a/docs/interfaces/SwitchBotBLEDevice.html b/docs/interfaces/SwitchBotBLEDevice.html index 6ea261e8..ae39e7e4 100644 --- a/docs/interfaces/SwitchBotBLEDevice.html +++ b/docs/interfaces/SwitchBotBLEDevice.html @@ -1,4 +1,4 @@ -SwitchBotBLEDevice | node-switchbot

Interface SwitchBotBLEDevice

interface SwitchBotBLEDevice {
    BlindTilt: DeviceInfo;
    Bot: DeviceInfo;
    CeilingLight: DeviceInfo;
    CeilingLightPro: DeviceInfo;
    ColorBulb: DeviceInfo;
    ContactSensor: DeviceInfo;
    Curtain: DeviceInfo;
    Curtain3: DeviceInfo;
    Hub2: DeviceInfo;
    Humidifier: DeviceInfo;
    Lock: DeviceInfo;
    LockPro: DeviceInfo;
    Meter: DeviceInfo;
    MeterPlus: DeviceInfo;
    MeterPro: DeviceInfo;
    MeterProCO2: DeviceInfo;
    MotionSensor: DeviceInfo;
    OutdoorMeter: DeviceInfo;
    PlugMiniJP: DeviceInfo;
    PlugMiniUS: DeviceInfo;
    StripLight: DeviceInfo;
    Unknown: DeviceInfo;
}

Properties

BlindTilt +SwitchBotBLEDevice | node-switchbot

Interface SwitchBotBLEDevice

interface SwitchBotBLEDevice {
    BlindTilt: DeviceInfo;
    Bot: DeviceInfo;
    CeilingLight: DeviceInfo;
    CeilingLightPro: DeviceInfo;
    ColorBulb: DeviceInfo;
    ContactSensor: DeviceInfo;
    Curtain: DeviceInfo;
    Curtain3: DeviceInfo;
    Hub2: DeviceInfo;
    Humidifier: DeviceInfo;
    Lock: DeviceInfo;
    LockPro: DeviceInfo;
    Meter: DeviceInfo;
    MeterPlus: DeviceInfo;
    MeterPro: DeviceInfo;
    MeterProCO2: DeviceInfo;
    MotionSensor: DeviceInfo;
    OutdoorMeter: DeviceInfo;
    PlugMiniJP: DeviceInfo;
    PlugMiniUS: DeviceInfo;
    StripLight: DeviceInfo;
    Unknown: DeviceInfo;
}

Properties

BlindTilt: DeviceInfo
Bot: DeviceInfo
CeilingLight: DeviceInfo
CeilingLightPro: DeviceInfo
ColorBulb: DeviceInfo
ContactSensor: DeviceInfo
Curtain: DeviceInfo
Curtain3: DeviceInfo
Hub2: DeviceInfo
Humidifier: DeviceInfo
Lock: DeviceInfo
LockPro: DeviceInfo
Meter: DeviceInfo
MeterPlus: DeviceInfo
MeterPro: DeviceInfo
MeterProCO2: DeviceInfo
MotionSensor: DeviceInfo
OutdoorMeter: DeviceInfo
PlugMiniJP: DeviceInfo
PlugMiniUS: DeviceInfo
StripLight: DeviceInfo
Unknown: DeviceInfo
+

Properties

BlindTilt: DeviceInfo
Bot: DeviceInfo
CeilingLight: DeviceInfo
CeilingLightPro: DeviceInfo
ColorBulb: DeviceInfo
ContactSensor: DeviceInfo
Curtain: DeviceInfo
Curtain3: DeviceInfo
Hub2: DeviceInfo
Humidifier: DeviceInfo
Lock: DeviceInfo
LockPro: DeviceInfo
Meter: DeviceInfo
MeterPlus: DeviceInfo
MeterPro: DeviceInfo
MeterProCO2: DeviceInfo
MotionSensor: DeviceInfo
OutdoorMeter: DeviceInfo
PlugMiniJP: DeviceInfo
PlugMiniUS: DeviceInfo
StripLight: DeviceInfo
Unknown: DeviceInfo
diff --git a/docs/interfaces/WebhookDetail.html b/docs/interfaces/WebhookDetail.html index 7c041b1d..1a0aee62 100644 --- a/docs/interfaces/WebhookDetail.html +++ b/docs/interfaces/WebhookDetail.html @@ -1,6 +1,6 @@ -WebhookDetail | node-switchbot

Interface WebhookDetail

interface WebhookDetail {
    createTime: number;
    deviceList: string;
    enable: boolean;
    lastUpdateTime: number;
    url: string;
}

Properties

createTime +WebhookDetail | node-switchbot

Interface WebhookDetail

interface WebhookDetail {
    createTime: number;
    deviceList: string;
    enable: boolean;
    lastUpdateTime: number;
    url: string;
}

Properties

createTime: number
deviceList: string
enable: boolean
lastUpdateTime: number
url: string
+

Properties

createTime: number
deviceList: string
enable: boolean
lastUpdateTime: number
url: string
diff --git a/docs/interfaces/ad.html b/docs/interfaces/ad.html index 9b24fbd1..15891d6c 100644 --- a/docs/interfaces/ad.html +++ b/docs/interfaces/ad.html @@ -1,5 +1,5 @@ -ad | node-switchbot

Interface ad

interface ad {
    address: string;
    id: string;
    rssi: number;
    serviceData:
        | botServiceData
        | colorBulbServiceData
        | contactSensorServiceData
        | curtainServiceData
        | curtain3ServiceData
        | stripLightServiceData
        | lockServiceData
        | lockProServiceData
        | meterServiceData
        | meterPlusServiceData
        | meterProServiceData
        | meterProCO2ServiceData
        | motionSensorServiceData
        | outdoorMeterServiceData
        | plugMiniUSServiceData
        | plugMiniJPServiceData
        | blindTiltServiceData
        | ceilingLightServiceData
        | ceilingLightProServiceData
        | hub2ServiceData
        | batteryCirculatorFanServiceData
        | waterLeakDetectorServiceData
        | humidifierServiceData
        | robotVacuumCleanerServiceData
        | keypadDetectorServiceData
        | relaySwitch1PMServiceData
        | relaySwitch1PlusServiceData;
    [key: string]: unknown;
}

Indexable

  • [key: string]: unknown

Properties

address +ad | node-switchbot

Interface ad

interface ad {
    address: string;
    id: string;
    rssi: number;
    serviceData:
        | botServiceData
        | colorBulbServiceData
        | contactSensorServiceData
        | curtainServiceData
        | curtain3ServiceData
        | stripLightServiceData
        | lockServiceData
        | lockProServiceData
        | meterServiceData
        | meterPlusServiceData
        | meterProServiceData
        | meterProCO2ServiceData
        | motionSensorServiceData
        | outdoorMeterServiceData
        | plugMiniUSServiceData
        | plugMiniJPServiceData
        | blindTiltServiceData
        | ceilingLightServiceData
        | ceilingLightProServiceData
        | hub2ServiceData
        | batteryCirculatorFanServiceData
        | waterLeakDetectorServiceData
        | humidifierServiceData
        | humidifier2ServiceData
        | robotVacuumCleanerServiceData
        | keypadDetectorServiceData
        | relaySwitch1PMServiceData
        | relaySwitch1ServiceData;
    [key: string]: unknown;
}

Indexable

  • [key: string]: unknown

Properties

address: string
id: string
rssi: number
+

Properties

address: string
id: string
rssi: number
diff --git a/docs/interfaces/body.html b/docs/interfaces/body.html index 364f165b..b72bd910 100644 --- a/docs/interfaces/body.html +++ b/docs/interfaces/body.html @@ -1,3 +1,3 @@ -body | node-switchbot

Interface body

interface body {
    deviceList: deviceList;
    infraredRemoteList: infraredRemoteList;
}

Properties

deviceList +body | node-switchbot

Interface body

interface body {
    deviceList: deviceList;
    infraredRemoteList: infraredRemoteList;
}

Properties

deviceList: deviceList
infraredRemoteList: infraredRemoteList
+

Properties

deviceList: deviceList
infraredRemoteList: infraredRemoteList
diff --git a/docs/interfaces/bodyChange.html b/docs/interfaces/bodyChange.html index 28a76a70..134b16e3 100644 --- a/docs/interfaces/bodyChange.html +++ b/docs/interfaces/bodyChange.html @@ -1,4 +1,4 @@ -bodyChange | node-switchbot

Interface bodyChange

interface bodyChange {
    command: string;
    commandType: string;
    parameter: string;
}

Properties

command +bodyChange | node-switchbot

Interface bodyChange

interface bodyChange {
    command: string;
    commandType: string;
    parameter: string;
}

Properties

command: string
commandType: string
parameter: string
+

Properties

command: string
commandType: string
parameter: string
diff --git a/docs/interfaces/deleteWebhookResponse.html b/docs/interfaces/deleteWebhookResponse.html index 68e7dbdf..ee5c65f4 100644 --- a/docs/interfaces/deleteWebhookResponse.html +++ b/docs/interfaces/deleteWebhookResponse.html @@ -1,4 +1,4 @@ -deleteWebhookResponse | node-switchbot

Interface deleteWebhookResponse

interface deleteWebhookResponse {
    body: object;
    message: string;
    statusCode: number;
}

Properties

body +deleteWebhookResponse | node-switchbot

Interface deleteWebhookResponse

interface deleteWebhookResponse {
    body: object;
    message: string;
    statusCode: number;
}

Properties

Properties

body: object
message: string
statusCode: number
+

Properties

body: object
message: string
statusCode: number
diff --git a/docs/interfaces/device.html b/docs/interfaces/device.html index 56630d97..253f95e5 100644 --- a/docs/interfaces/device.html +++ b/docs/interfaces/device.html @@ -1,7 +1,7 @@ -device | node-switchbot

Interface device

interface device {
    deviceId: string;
    deviceName: string;
    deviceType: string;
    enableCloudService: boolean;
    hubDeviceId: string;
    version?: number;
}

Hierarchy (View Summary)

Properties

deviceId +device | node-switchbot

Interface device

interface device {
    deviceId: string;
    deviceName: string;
    deviceType: string;
    enableCloudService: boolean;
    hubDeviceId: string;
    version?: number;
}

Hierarchy (View Summary)

Properties

deviceId: string
deviceName: string
deviceType: string
enableCloudService: boolean
hubDeviceId: string
version?: number
+

Properties

deviceId: string
deviceName: string
deviceType: string
enableCloudService: boolean
hubDeviceId: string
version?: number
diff --git a/docs/interfaces/deviceList.html b/docs/interfaces/deviceList.html index f25ec4ad..0f2d94e8 100644 --- a/docs/interfaces/deviceList.html +++ b/docs/interfaces/deviceList.html @@ -1,2 +1,2 @@ -deviceList | node-switchbot

Interface deviceList

interface deviceList {
    device: device[];
}

Properties

Properties

device: device[]
+deviceList | node-switchbot

Interface deviceList

interface deviceList {
    device: device[];
}

Properties

Properties

device: device[]
diff --git a/docs/interfaces/deviceStatus.html b/docs/interfaces/deviceStatus.html index b3d8b8e1..c623498d 100644 --- a/docs/interfaces/deviceStatus.html +++ b/docs/interfaces/deviceStatus.html @@ -1,7 +1,7 @@ -deviceStatus | node-switchbot

Interface deviceStatus

interface deviceStatus {
    deviceId: string;
    deviceName: string;
    deviceType: string;
    enableCloudService: boolean;
    hubDeviceId: string;
    version: number;
}

Hierarchy (View Summary)

Properties

deviceId +deviceStatus | node-switchbot

Interface deviceStatus

interface deviceStatus {
    deviceId: string;
    deviceName: string;
    deviceType: string;
    enableCloudService: boolean;
    hubDeviceId: string;
    version: number;
}

Hierarchy (View Summary)

Properties

deviceId: string
deviceName: string
deviceType: string
enableCloudService: boolean
hubDeviceId: string
version: number
+

Properties

deviceId: string
deviceName: string
deviceType: string
enableCloudService: boolean
hubDeviceId: string
version: number
diff --git a/docs/interfaces/deviceStatusRequest.html b/docs/interfaces/deviceStatusRequest.html index 17fc62e8..39dfce05 100644 --- a/docs/interfaces/deviceStatusRequest.html +++ b/docs/interfaces/deviceStatusRequest.html @@ -1,4 +1,4 @@ -deviceStatusRequest | node-switchbot

Interface deviceStatusRequest

interface deviceStatusRequest {
    body: deviceStatus;
    message: string;
    statusCode: number;
}

Properties

body +deviceStatusRequest | node-switchbot

Interface deviceStatusRequest

interface deviceStatusRequest {
    body: deviceStatus;
    message: string;
    statusCode: number;
}

Properties

Properties

message: string
statusCode: number
+

Properties

message: string
statusCode: number
diff --git a/docs/interfaces/deviceWebhook.html b/docs/interfaces/deviceWebhook.html index 69f42d56..ce3768ce 100644 --- a/docs/interfaces/deviceWebhook.html +++ b/docs/interfaces/deviceWebhook.html @@ -1,4 +1,4 @@ -deviceWebhook | node-switchbot

Interface deviceWebhook

interface deviceWebhook {
    context: deviceWebhookContext;
    eventType: string;
    eventVersion: string;
}

Properties

context +deviceWebhook | node-switchbot

Interface deviceWebhook

interface deviceWebhook {
    context: deviceWebhookContext;
    eventType: string;
    eventVersion: string;
}

Properties

eventType: string
eventVersion: string
+

Properties

eventType: string
eventVersion: string
diff --git a/docs/interfaces/deviceWebhookContext.html b/docs/interfaces/deviceWebhookContext.html index 40633142..4437eab7 100644 --- a/docs/interfaces/deviceWebhookContext.html +++ b/docs/interfaces/deviceWebhookContext.html @@ -1,4 +1,4 @@ -deviceWebhookContext | node-switchbot

Interface deviceWebhookContext

interface deviceWebhookContext {
    deviceMac: string;
    deviceType: string;
    timeOfSample: number;
}

Properties

deviceMac +deviceWebhookContext | node-switchbot

Interface deviceWebhookContext

interface deviceWebhookContext {
    deviceMac: string;
    deviceType: string;
    timeOfSample: number;
}

Properties

deviceMac: string
deviceType: string
timeOfSample: number
+

Properties

deviceMac: string
deviceType: string
timeOfSample: number
diff --git a/docs/interfaces/devices.html b/docs/interfaces/devices.html index e741b972..93e263d6 100644 --- a/docs/interfaces/devices.html +++ b/docs/interfaces/devices.html @@ -1,4 +1,4 @@ -devices | node-switchbot

Interface devices

interface devices {
    body: body;
    message: string;
    statusCode: number;
}

Properties

body +devices | node-switchbot

Interface devices

interface devices {
    body: body;
    message: string;
    statusCode: number;
}

Properties

Properties

body: body
message: string
statusCode: number
+

Properties

body: body
message: string
statusCode: number
diff --git a/docs/interfaces/infraredRemoteList.html b/docs/interfaces/infraredRemoteList.html index 2dddeaba..7121862b 100644 --- a/docs/interfaces/infraredRemoteList.html +++ b/docs/interfaces/infraredRemoteList.html @@ -1,2 +1,2 @@ -infraredRemoteList | node-switchbot

Interface infraredRemoteList

interface infraredRemoteList {
    device: irdevice[];
}

Properties

Properties

device: irdevice[]
+infraredRemoteList | node-switchbot

Interface infraredRemoteList

interface infraredRemoteList {
    device: irdevice[];
}

Properties

Properties

device: irdevice[]
diff --git a/docs/interfaces/irdevice.html b/docs/interfaces/irdevice.html index 89906655..463871be 100644 --- a/docs/interfaces/irdevice.html +++ b/docs/interfaces/irdevice.html @@ -1,5 +1,5 @@ -irdevice | node-switchbot

Interface irdevice

interface irdevice {
    deviceId?: string;
    deviceName: string;
    hubDeviceId: string;
    remoteType: string;
}

Properties

deviceId? +irdevice | node-switchbot

Interface irdevice

interface irdevice {
    deviceId?: string;
    deviceName: string;
    hubDeviceId: string;
    remoteType: string;
}

Properties

deviceId?: string
deviceName: string
hubDeviceId: string
remoteType: string
+

Properties

deviceId?: string
deviceName: string
hubDeviceId: string
remoteType: string
diff --git a/docs/interfaces/pushResponse.html b/docs/interfaces/pushResponse.html index ae849030..a5124524 100644 --- a/docs/interfaces/pushResponse.html +++ b/docs/interfaces/pushResponse.html @@ -1,4 +1,4 @@ -pushResponse | node-switchbot

Interface pushResponse

interface pushResponse {
    body: { commandId: string };
    message: string;
    statusCode: number;
}

Properties

body +pushResponse | node-switchbot

Interface pushResponse

interface pushResponse {
    body: { commandId: string };
    message: string;
    statusCode: number;
}

Properties

Properties

body: { commandId: string }
message: string
statusCode: number
+

Properties

body: { commandId: string }
message: string
statusCode: number
diff --git a/docs/interfaces/queryWebhookResponse.html b/docs/interfaces/queryWebhookResponse.html index 91afb34d..b867b153 100644 --- a/docs/interfaces/queryWebhookResponse.html +++ b/docs/interfaces/queryWebhookResponse.html @@ -1,4 +1,4 @@ -queryWebhookResponse | node-switchbot

Interface queryWebhookResponse

interface queryWebhookResponse {
    body: WebhookDetail[];
    message: string;
    statusCode: number;
}

Properties

body +queryWebhookResponse | node-switchbot

Interface queryWebhookResponse

interface queryWebhookResponse {
    body: WebhookDetail[];
    message: string;
    statusCode: number;
}

Properties

Properties

message: string
statusCode: number
+

Properties

message: string
statusCode: number
diff --git a/docs/interfaces/setupWebhookResponse.html b/docs/interfaces/setupWebhookResponse.html index 348c95cc..0307d6ff 100644 --- a/docs/interfaces/setupWebhookResponse.html +++ b/docs/interfaces/setupWebhookResponse.html @@ -1,4 +1,4 @@ -setupWebhookResponse | node-switchbot

Interface setupWebhookResponse

interface setupWebhookResponse {
    body: object;
    message: string;
    statusCode: number;
}

Properties

body +setupWebhookResponse | node-switchbot

Interface setupWebhookResponse

interface setupWebhookResponse {
    body: object;
    message: string;
    statusCode: number;
}

Properties

Properties

body: object
message: string
statusCode: number
+

Properties

body: object
message: string
statusCode: number
diff --git a/docs/interfaces/switchbot.html b/docs/interfaces/switchbot.html index eba69c9a..7b583503 100644 --- a/docs/interfaces/switchbot.html +++ b/docs/interfaces/switchbot.html @@ -1,3 +1,3 @@ -switchbot | node-switchbot

Interface switchbot

interface switchbot {
    discover: (
        arg0: { duration?: any; id?: string; model: string; quick: boolean },
    ) => Promise<any>;
    wait: (arg0: number) => any;
}

Properties

discover +switchbot | node-switchbot

Interface switchbot

interface switchbot {
    discover: (
        arg0: { duration?: any; id?: string; model: string; quick: boolean },
    ) => Promise<any>;
    wait: (arg0: number) => any;
}

Properties

Properties

discover: (
    arg0: { duration?: any; id?: string; model: string; quick: boolean },
) => Promise<any>
wait: (arg0: number) => any
+

Properties

discover: (
    arg0: { duration?: any; id?: string; model: string; quick: boolean },
) => Promise<any>
wait: (arg0: number) => any
diff --git a/docs/interfaces/updateWebhookResponse.html b/docs/interfaces/updateWebhookResponse.html index c9786393..574442dd 100644 --- a/docs/interfaces/updateWebhookResponse.html +++ b/docs/interfaces/updateWebhookResponse.html @@ -1,4 +1,4 @@ -updateWebhookResponse | node-switchbot

Interface updateWebhookResponse

interface updateWebhookResponse {
    body: object;
    message: string;
    statusCode: number;
}

Properties

body +updateWebhookResponse | node-switchbot

Interface updateWebhookResponse

interface updateWebhookResponse {
    body: object;
    message: string;
    statusCode: number;
}

Properties

Properties

body: object
message: string
statusCode: number
+

Properties

body: object
message: string
statusCode: number
diff --git a/docs/interfaces/webhookRequest.html b/docs/interfaces/webhookRequest.html index 8b46b7cf..d6701d83 100644 --- a/docs/interfaces/webhookRequest.html +++ b/docs/interfaces/webhookRequest.html @@ -1,4 +1,4 @@ -webhookRequest | node-switchbot

Interface webhookRequest

interface webhookRequest {
    action: string;
    deviceList: string;
    url: string;
}

Properties

action +webhookRequest | node-switchbot

Interface webhookRequest

interface webhookRequest {
    action: string;
    deviceList: string;
    url: string;
}

Properties

Properties

action: string
deviceList: string
url: string
+

Properties

action: string
deviceList: string
url: string
diff --git a/docs/media/BLE.md b/docs/media/BLE.md index 43d191be..b83f4c4a 100644 --- a/docs/media/BLE.md +++ b/docs/media/BLE.md @@ -1126,19 +1126,20 @@ this.switchBotBLE.on('log', (log) => { The following devices are supported. -| Device | BLE Support | -| ------------------------- | ----------- | -| SwitchBot Bot | Yes | -| SwitchBot Curtain | Yes | -| SwitchBot Meter | Yes | -| SwitchBot Motion Sensor | Yes | -| SwitchBot Contact Sensor | Yes | -| SwitchBot Plug Mini | Yes | -| SwitchBot Smart Lock | Yes | -| SwitchBot Smart Lock Pro | Yes | -| SwitchBot Humidifier | Yes | -| SwitchBot Color Bulb | Yes | -| SwitchBot LED Strip Light | Yes | +| Device | BLE Support | +| ---------------------------------------------- | ----------- | +| SwitchBot Bot | Yes | +| SwitchBot Curtain | Yes | +| SwitchBot Meter | Yes | +| SwitchBot Motion Sensor | Yes | +| SwitchBot Contact Sensor | Yes | +| SwitchBot Plug Mini | Yes | +| SwitchBot Smart Lock | Yes | +| SwitchBot Smart Lock Pro | Yes | +| SwitchBot Humidifier | Yes | +| SwitchBot Evaporative Humidifier (Auto-refill) | No | +| SwitchBot Color Bulb | Yes | +| SwitchBot LED Strip Light | Yes | ### Summary diff --git a/docs/media/OpenAPI.md b/docs/media/OpenAPI.md index 3869513c..bdea49d1 100644 --- a/docs/media/OpenAPI.md +++ b/docs/media/OpenAPI.md @@ -167,18 +167,19 @@ this.switchBotAPI.on('log', (log) => { The following devices are supported. -| Device | OpenAPI Support | Webhook Support | -| ------------------------- | --------------- | --------------- | -| SwitchBot Bot | Yes | Yes | -| SwitchBot Curtain | Yes | Yes | -| SwitchBot Meter | Yes | Yes | -| SwitchBot Motion Sensor | Yes | Yes | -| SwitchBot Contact Sensor | Yes | Yes | -| SwitchBot Plug Mini | Yes | Yes | -| SwitchBot Smart Lock | Yes | Yes | -| SwitchBot Humidifier | Yes | Yes | -| SwitchBot Color Bulb | Yes | Yes | -| SwitchBot LED Strip Light | Yes | Yes | +| Device | OpenAPI Support | Webhook Support | +| ---------------------------------------------- | --------------- | --------------- | +| SwitchBot Bot | Yes | Yes | +| SwitchBot Curtain | Yes | Yes | +| SwitchBot Meter | Yes | Yes | +| SwitchBot Motion Sensor | Yes | Yes | +| SwitchBot Contact Sensor | Yes | Yes | +| SwitchBot Plug Min | Yes | Yes | +| SwitchBot Smart Lock | Yes | Yes | +| SwitchBot Humidifier | Yes | Yes | +| SwitchBot Evaporative Humidifier (Auto-refill) | Yes | Yes | +| SwitchBot Color Bulb | Yes | Yes | +| SwitchBot LED Strip Light | Yes | Yes | ### Summary diff --git a/docs/modules.html b/docs/modules.html index 19198f4d..bba0f1f8 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -1 +1 @@ -node-switchbot

node-switchbot

Enumerations

LogLevel
SwitchBotBLEModel
SwitchBotBLEModelFriendlyName
SwitchBotBLEModelName
SwitchBotModel

Classes

Advertising
SwitchBotBLE
SwitchbotDevice
SwitchBotOpenAPI
WoBlindTilt
WoBulb
WoCeilingLight
WoContact
WoCurtain
WoHand
WoHub2
WoHumi
WoIOSensorTH
WoPlugMiniUS
WoPresence
WoSensorTH
WoSmartLock
WoSmartLockPro
WoStrip

Interfaces

ad
AdvertisementData
body
bodyChange
Chars
deleteWebhookResponse
device
deviceList
devices
deviceStatus
deviceStatusRequest
deviceWebhook
deviceWebhookContext
ErrorObject
infraredRemoteList
irdevice
NobleTypes
Params
pushResponse
queryWebhookResponse
Rule
ServiceData
setupWebhookResponse
switchbot
SwitchBotBLEDevice
updateWebhookResponse
WebhookDetail
webhookRequest

Type Aliases

batteryCirculatorFan
batteryCirculatorFanServiceData
batteryCirculatorFanStatus
batteryCirculatorFanWebhookContext
blindTilt
blindTiltServiceData
blindTiltStatus
blindTiltWebhookContext
bot
botServiceData
botStatus
botWebhookContext
ceilingLight
ceilingLightPro
ceilingLightProServiceData
ceilingLightProStatus
ceilingLightProWebhookContext
ceilingLightServiceData
ceilingLightStatus
ceilingLightWebhookContext
colorBulb
colorBulbServiceData
colorBulbStatus
colorBulbWebhookContext
contactSensor
contactSensorServiceData
contactSensorStatus
contactSensorWebhookContext
curtain
curtain3
curtain3ServiceData
curtain3WebhookContext
curtainServiceData
curtainStatus
curtainWebhookContext
floorCleaningRobotS10
floorCleaningRobotS10Status
floorCleaningRobotS10WebhookContext
hub2
hub2ServiceData
hub2Status
hub2WebhookContext
humidifier
humidifierServiceData
humidifierStatus
humidifierWebhookContext
indoorCam
indoorCameraWebhookContext
keypad
keypadDetectorServiceData
keypadTouch
keypadTouchWebhookContext
keypadWebhookContext
lock
lockPro
lockProServiceData
lockProStatus
lockProWebhookContext
lockServiceData
lockStatus
lockWebhookContext
MacAddress
meter
meterPlus
meterPlusServiceData
meterPlusStatus
meterPlusWebhookContext
meterPro
meterProCO2ServiceData
meterProCO2Status
meterProCO2WebhookContext
meterProServiceData
meterProStatus
meterProWebhookContext
meterServiceData
meterStatus
meterWebhookContext
motionSensor
motionSensorServiceData
motionSensorStatus
motionSensorWebhookContext
onadvertisement
ondiscover
outdoorMeter
outdoorMeterServiceData
outdoorMeterStatus
outdoorMeterWebhookContext
pantiltCam
pantiltCam2k
panTiltCamWebhookContext
plug
plugMini
plugMiniJPServiceData
plugMiniJPWebhookContext
plugMiniStatus
plugMiniUSServiceData
plugMiniUSWebhookContext
plugStatus
plugWebhookContext
relaySwitch1PlusServiceData
relaySwitch1PMServiceData
remote
robotVacuumCleanerS1
robotVacuumCleanerS1Plus
robotVacuumCleanerS1PlusStatus
robotVacuumCleanerS1PlusWebhookContext
robotVacuumCleanerS1Status
robotVacuumCleanerS1WebhookContext
robotVacuumCleanerServiceData
stripLight
stripLightServiceData
stripLightStatus
stripLightWebhookContext
waterLeakDetector
waterLeakDetectorServiceData
waterLeakDetectorStatus
waterLeakDetectorWebhookContext
+node-switchbot

node-switchbot

Enumerations

LogLevel
SwitchBotBLEModel
SwitchBotBLEModelFriendlyName
SwitchBotBLEModelName
SwitchBotModel

Classes

Advertising
SwitchBotBLE
SwitchbotDevice
SwitchBotOpenAPI
WoBlindTilt
WoBulb
WoCeilingLight
WoContact
WoCurtain
WoHand
WoHub2
WoHumi
WoIOSensorTH
WoPlugMiniUS
WoPresence
WoSensorTH
WoSmartLock
WoSmartLockPro
WoStrip

Interfaces

ad
AdvertisementData
body
bodyChange
Chars
deleteWebhookResponse
device
deviceList
devices
deviceStatus
deviceStatusRequest
deviceWebhook
deviceWebhookContext
ErrorObject
infraredRemoteList
irdevice
NobleTypes
Params
pushResponse
queryWebhookResponse
Rule
ServiceData
setupWebhookResponse
switchbot
SwitchBotBLEDevice
updateWebhookResponse
WebhookDetail
webhookRequest

Type Aliases

batteryCirculatorFan
batteryCirculatorFanServiceData
batteryCirculatorFanStatus
batteryCirculatorFanWebhookContext
blindTilt
blindTiltServiceData
blindTiltStatus
blindTiltWebhookContext
bot
botServiceData
botStatus
botWebhookContext
ceilingLight
ceilingLightPro
ceilingLightProServiceData
ceilingLightProStatus
ceilingLightProWebhookContext
ceilingLightServiceData
ceilingLightStatus
ceilingLightWebhookContext
colorBulb
colorBulbServiceData
colorBulbStatus
colorBulbWebhookContext
contactSensor
contactSensorServiceData
contactSensorStatus
contactSensorWebhookContext
curtain
curtain3
curtain3ServiceData
curtain3WebhookContext
curtainServiceData
curtainStatus
curtainWebhookContext
floorCleaningRobotS10
floorCleaningRobotS10Status
floorCleaningRobotS10WebhookContext
hub2
hub2ServiceData
hub2Status
hub2WebhookContext
humidifier
humidifier2ServiceData
humidifier2Status
humidifier2WebhookContext
humidifierServiceData
humidifierStatus
humidifierWebhookContext
indoorCam
indoorCameraWebhookContext
keypad
keypadDetectorServiceData
keypadTouch
keypadTouchWebhookContext
keypadWebhookContext
lock
lockPro
lockProServiceData
lockProStatus
lockProWebhookContext
lockServiceData
lockStatus
lockWebhookContext
MacAddress
meter
meterPlus
meterPlusServiceData
meterPlusStatus
meterPlusWebhookContext
meterPro
meterProCO2ServiceData
meterProCO2Status
meterProCO2WebhookContext
meterProServiceData
meterProStatus
meterProWebhookContext
meterServiceData
meterStatus
meterWebhookContext
motionSensor
motionSensorServiceData
motionSensorStatus
motionSensorWebhookContext
onadvertisement
ondiscover
outdoorMeter
outdoorMeterServiceData
outdoorMeterStatus
outdoorMeterWebhookContext
pantiltCam
pantiltCam2k
panTiltCamWebhookContext
plug
plugMini
plugMiniJPServiceData
plugMiniJPWebhookContext
plugMiniStatus
plugMiniUSServiceData
plugMiniUSWebhookContext
plugStatus
plugWebhookContext
relaySwitch1PMServiceData
relaySwitch1ServiceData
remote
robotVacuumCleanerS1
robotVacuumCleanerS1Plus
robotVacuumCleanerS1PlusStatus
robotVacuumCleanerS1PlusWebhookContext
robotVacuumCleanerS1Status
robotVacuumCleanerS1WebhookContext
robotVacuumCleanerServiceData
stripLight
stripLightServiceData
stripLightStatus
stripLightWebhookContext
waterLeakDetector
waterLeakDetectorServiceData
waterLeakDetectorStatus
waterLeakDetectorWebhookContext
diff --git a/docs/types/MacAddress.html b/docs/types/MacAddress.html index 927ce14e..1ab496c5 100644 --- a/docs/types/MacAddress.html +++ b/docs/types/MacAddress.html @@ -1 +1 @@ -MacAddress | node-switchbot

Type Alias MacAddress

MacAddress: string
+MacAddress | node-switchbot

Type Alias MacAddress

MacAddress: string
diff --git a/docs/types/batteryCirculatorFan.html b/docs/types/batteryCirculatorFan.html index dffd681e..66c85686 100644 --- a/docs/types/batteryCirculatorFan.html +++ b/docs/types/batteryCirculatorFan.html @@ -1 +1 @@ -batteryCirculatorFan | node-switchbot

Type Alias batteryCirculatorFan

batteryCirculatorFan: device & {}
+batteryCirculatorFan | node-switchbot

Type Alias batteryCirculatorFan

batteryCirculatorFan: device & {}
diff --git a/docs/types/batteryCirculatorFanServiceData.html b/docs/types/batteryCirculatorFanServiceData.html index e7acb033..acf05373 100644 --- a/docs/types/batteryCirculatorFanServiceData.html +++ b/docs/types/batteryCirculatorFanServiceData.html @@ -1 +1 @@ -batteryCirculatorFanServiceData | node-switchbot

Type Alias batteryCirculatorFanServiceData

batteryCirculatorFanServiceData: serviceData & {
    fanSpeed: number;
    model: Unknown;
    modelFriendlyName: Unknown;
    modelName: Unknown;
    state: string;
}
+batteryCirculatorFanServiceData | node-switchbot

Type Alias batteryCirculatorFanServiceData

batteryCirculatorFanServiceData: serviceData & {
    fanSpeed: number;
    model: Unknown;
    modelFriendlyName: Unknown;
    modelName: Unknown;
    state: string;
}
diff --git a/docs/types/batteryCirculatorFanStatus.html b/docs/types/batteryCirculatorFanStatus.html index c833cecb..3e852ef7 100644 --- a/docs/types/batteryCirculatorFanStatus.html +++ b/docs/types/batteryCirculatorFanStatus.html @@ -1 +1 @@ -batteryCirculatorFanStatus | node-switchbot

Type Alias batteryCirculatorFanStatus

batteryCirculatorFanStatus: deviceStatus & {
    battery: number;
    chargingStatus: string;
    fanSpeed: number;
    mode: "direct" | "natural" | "sleep" | "baby";
    nightStatus: number;
    oscillation: string;
    power: string;
    verticalOscillation: string;
}
+batteryCirculatorFanStatus | node-switchbot

Type Alias batteryCirculatorFanStatus

batteryCirculatorFanStatus: deviceStatus & {
    battery: number;
    chargingStatus: string;
    fanSpeed: number;
    mode: "direct" | "natural" | "sleep" | "baby";
    nightStatus: number;
    oscillation: string;
    power: string;
    verticalOscillation: string;
}
diff --git a/docs/types/batteryCirculatorFanWebhookContext.html b/docs/types/batteryCirculatorFanWebhookContext.html index 8bbcd21c..23fd0980 100644 --- a/docs/types/batteryCirculatorFanWebhookContext.html +++ b/docs/types/batteryCirculatorFanWebhookContext.html @@ -1 +1 @@ -batteryCirculatorFanWebhookContext | node-switchbot

Type Alias batteryCirculatorFanWebhookContext

batteryCirculatorFanWebhookContext: deviceWebhookContext & {
    battery: number;
    chargingStatus: "charging" | "uncharged";
    fanSpeed: number;
    mode: "direct" | "natural" | "sleep" | "baby";
    nightStatus: "off" | 1 | 2;
    oscillation: "on" | "off";
    powerState: "ON" | "OFF";
    version: string;
    verticalOscillation: "on" | "off";
}
+batteryCirculatorFanWebhookContext | node-switchbot

Type Alias batteryCirculatorFanWebhookContext

batteryCirculatorFanWebhookContext: deviceWebhookContext & {
    battery: number;
    chargingStatus: "charging" | "uncharged";
    fanSpeed: number;
    mode: "direct" | "natural" | "sleep" | "baby";
    nightStatus: "off" | 1 | 2;
    oscillation: "on" | "off";
    powerState: "ON" | "OFF";
    version: string;
    verticalOscillation: "on" | "off";
}
diff --git a/docs/types/blindTilt.html b/docs/types/blindTilt.html index 89ccda16..0f4f34dc 100644 --- a/docs/types/blindTilt.html +++ b/docs/types/blindTilt.html @@ -1 +1 @@ -blindTilt | node-switchbot

Type Alias blindTilt

blindTilt: device & {
    blindTiltDevicesIds: string[];
    calibrate: boolean;
    direction: string;
    group: boolean;
    master: boolean;
    slidePosition: number;
}
+blindTilt | node-switchbot

Type Alias blindTilt

blindTilt: device & {
    blindTiltDevicesIds: string[];
    calibrate: boolean;
    direction: string;
    group: boolean;
    master: boolean;
    slidePosition: number;
}
diff --git a/docs/types/blindTiltServiceData.html b/docs/types/blindTiltServiceData.html index e086a719..85557415 100644 --- a/docs/types/blindTiltServiceData.html +++ b/docs/types/blindTiltServiceData.html @@ -1 +1 @@ -blindTiltServiceData | node-switchbot

Type Alias blindTiltServiceData

blindTiltServiceData: serviceData & {
    battery: number;
    calibration: boolean;
    inMotion: boolean;
    lightLevel: number;
    model: BlindTilt;
    modelFriendlyName: BlindTilt;
    modelName: BlindTilt;
    sequenceNumber: number;
    tilt: number;
}
+blindTiltServiceData | node-switchbot

Type Alias blindTiltServiceData

blindTiltServiceData: serviceData & {
    battery: number;
    calibration: boolean;
    inMotion: boolean;
    lightLevel: number;
    model: BlindTilt;
    modelFriendlyName: BlindTilt;
    modelName: BlindTilt;
    sequenceNumber: number;
    tilt: number;
}
diff --git a/docs/types/blindTiltStatus.html b/docs/types/blindTiltStatus.html index e364b43c..34936459 100644 --- a/docs/types/blindTiltStatus.html +++ b/docs/types/blindTiltStatus.html @@ -1 +1 @@ -blindTiltStatus | node-switchbot

Type Alias blindTiltStatus

blindTiltStatus: deviceStatus & {
    battery: number;
    calibrate: boolean;
    direction: string;
    lightLevel?: "bright" | "dim";
    slidePosition: string;
}
+blindTiltStatus | node-switchbot

Type Alias blindTiltStatus

blindTiltStatus: deviceStatus & {
    battery: number;
    calibrate: boolean;
    direction: string;
    lightLevel?: "bright" | "dim";
    slidePosition: string;
}
diff --git a/docs/types/blindTiltWebhookContext.html b/docs/types/blindTiltWebhookContext.html index c587f873..69437e91 100644 --- a/docs/types/blindTiltWebhookContext.html +++ b/docs/types/blindTiltWebhookContext.html @@ -1 +1 @@ -blindTiltWebhookContext | node-switchbot

Type Alias blindTiltWebhookContext

blindTiltWebhookContext: deviceWebhookContext & {
    battery: number;
    calibrate: boolean;
    direction: string;
    group: boolean;
    slidePosition: number;
    version: string;
}
+blindTiltWebhookContext | node-switchbot

Type Alias blindTiltWebhookContext

blindTiltWebhookContext: deviceWebhookContext & {
    battery: number;
    calibrate: boolean;
    direction: string;
    group: boolean;
    slidePosition: number;
    version: string;
}
diff --git a/docs/types/bot.html b/docs/types/bot.html index 7f7f4f51..ccfa8fa2 100644 --- a/docs/types/bot.html +++ b/docs/types/bot.html @@ -1 +1 @@ -bot | node-switchbot

Type Alias bot

bot: device & {}
+bot | node-switchbot

Type Alias bot

bot: device & {}
diff --git a/docs/types/botServiceData.html b/docs/types/botServiceData.html index 9a421c03..5e17f2b1 100644 --- a/docs/types/botServiceData.html +++ b/docs/types/botServiceData.html @@ -1 +1 @@ -botServiceData | node-switchbot

Type Alias botServiceData

botServiceData: serviceData & {
    battery: number;
    mode: boolean;
    model: Bot;
    modelFriendlyName: Bot;
    modelName: Bot;
    state: boolean;
}
+botServiceData | node-switchbot

Type Alias botServiceData

botServiceData: serviceData & {
    battery: number;
    mode: boolean;
    model: Bot;
    modelFriendlyName: Bot;
    modelName: Bot;
    state: boolean;
}
diff --git a/docs/types/botStatus.html b/docs/types/botStatus.html index ed0ef44b..9decb902 100644 --- a/docs/types/botStatus.html +++ b/docs/types/botStatus.html @@ -1 +1 @@ -botStatus | node-switchbot

Type Alias botStatus

botStatus: deviceStatus & {
    battery: number;
    mode: "pressMode" | "switchMode" | "customizeMode";
    power: string;
}
+botStatus | node-switchbot

Type Alias botStatus

botStatus: deviceStatus & {
    battery: number;
    mode: "pressMode" | "switchMode" | "customizeMode";
    power: string;
}
diff --git a/docs/types/botWebhookContext.html b/docs/types/botWebhookContext.html index 9cd7e1e7..532f6fe3 100644 --- a/docs/types/botWebhookContext.html +++ b/docs/types/botWebhookContext.html @@ -1 +1 @@ -botWebhookContext | node-switchbot

Type Alias botWebhookContext

botWebhookContext: deviceWebhookContext & {
    battery: number;
    deviceMode: "pressMode" | "switchMode" | "customizeMode";
    power: string;
}
+botWebhookContext | node-switchbot

Type Alias botWebhookContext

botWebhookContext: deviceWebhookContext & {
    battery: number;
    deviceMode: "pressMode" | "switchMode" | "customizeMode";
    power: string;
}
diff --git a/docs/types/ceilingLight.html b/docs/types/ceilingLight.html index bd4d3d17..dbb2d93c 100644 --- a/docs/types/ceilingLight.html +++ b/docs/types/ceilingLight.html @@ -1 +1 @@ -ceilingLight | node-switchbot

Type Alias ceilingLight

ceilingLight: device & {}
+ceilingLight | node-switchbot

Type Alias ceilingLight

ceilingLight: device & {}
diff --git a/docs/types/ceilingLightPro.html b/docs/types/ceilingLightPro.html index 0bd08ef7..adbad262 100644 --- a/docs/types/ceilingLightPro.html +++ b/docs/types/ceilingLightPro.html @@ -1 +1 @@ -ceilingLightPro | node-switchbot

Type Alias ceilingLightPro

ceilingLightPro: device & {}
+ceilingLightPro | node-switchbot

Type Alias ceilingLightPro

ceilingLightPro: device & {}
diff --git a/docs/types/ceilingLightProServiceData.html b/docs/types/ceilingLightProServiceData.html index 51c53916..6569ad98 100644 --- a/docs/types/ceilingLightProServiceData.html +++ b/docs/types/ceilingLightProServiceData.html @@ -1 +1 @@ -ceilingLightProServiceData | node-switchbot

Type Alias ceilingLightProServiceData

ceilingLightProServiceData: serviceData & {
    blue: number;
    brightness: number;
    color_mode: number;
    color_temperature: number;
    delay: number;
    green: number;
    loop_index: number;
    model: CeilingLightPro;
    modelFriendlyName: CeilingLightPro;
    modelName: CeilingLightPro;
    power: boolean;
    preset: number;
    red: number;
    speed: number;
    state: boolean;
}
+ceilingLightProServiceData | node-switchbot

Type Alias ceilingLightProServiceData

ceilingLightProServiceData: serviceData & {
    blue: number;
    brightness: number;
    color_mode: number;
    color_temperature: number;
    delay: number;
    green: number;
    loop_index: number;
    model: CeilingLightPro;
    modelFriendlyName: CeilingLightPro;
    modelName: CeilingLightPro;
    power: boolean;
    preset: number;
    red: number;
    speed: number;
    state: boolean;
}
diff --git a/docs/types/ceilingLightProStatus.html b/docs/types/ceilingLightProStatus.html index dfd4c53b..23cb4c3a 100644 --- a/docs/types/ceilingLightProStatus.html +++ b/docs/types/ceilingLightProStatus.html @@ -1 +1 @@ -ceilingLightProStatus | node-switchbot

Type Alias ceilingLightProStatus

ceilingLightProStatus: deviceStatus & {
    brightness: number;
    colorTemperature: number;
    power: boolean;
}
+ceilingLightProStatus | node-switchbot

Type Alias ceilingLightProStatus

ceilingLightProStatus: deviceStatus & {
    brightness: number;
    colorTemperature: number;
    power: boolean;
}
diff --git a/docs/types/ceilingLightProWebhookContext.html b/docs/types/ceilingLightProWebhookContext.html index 932d0b19..da7e87e3 100644 --- a/docs/types/ceilingLightProWebhookContext.html +++ b/docs/types/ceilingLightProWebhookContext.html @@ -1 +1 @@ -ceilingLightProWebhookContext | node-switchbot

Type Alias ceilingLightProWebhookContext

ceilingLightProWebhookContext: deviceWebhookContext & {
    brightness: number;
    colorTemperature: number;
    powerState: "ON" | "OFF";
}
+ceilingLightProWebhookContext | node-switchbot

Type Alias ceilingLightProWebhookContext

ceilingLightProWebhookContext: deviceWebhookContext & {
    brightness: number;
    colorTemperature: number;
    powerState: "ON" | "OFF";
}
diff --git a/docs/types/ceilingLightServiceData.html b/docs/types/ceilingLightServiceData.html index a16c24fc..e0e0f12f 100644 --- a/docs/types/ceilingLightServiceData.html +++ b/docs/types/ceilingLightServiceData.html @@ -1 +1 @@ -ceilingLightServiceData | node-switchbot

Type Alias ceilingLightServiceData

ceilingLightServiceData: serviceData & {
    blue: number;
    brightness: number;
    color_mode: number;
    color_temperature: number;
    delay: number;
    green: number;
    loop_index: number;
    model: CeilingLight;
    modelFriendlyName: CeilingLight;
    modelName: CeilingLight;
    power: boolean;
    preset: number;
    red: number;
    speed: number;
    state: boolean;
}
+ceilingLightServiceData | node-switchbot

Type Alias ceilingLightServiceData

ceilingLightServiceData: serviceData & {
    blue: number;
    brightness: number;
    color_mode: number;
    color_temperature: number;
    delay: number;
    green: number;
    loop_index: number;
    model: CeilingLight;
    modelFriendlyName: CeilingLight;
    modelName: CeilingLight;
    power: boolean;
    preset: number;
    red: number;
    speed: number;
    state: boolean;
}
diff --git a/docs/types/ceilingLightStatus.html b/docs/types/ceilingLightStatus.html index 09e1c7e0..bd6023c4 100644 --- a/docs/types/ceilingLightStatus.html +++ b/docs/types/ceilingLightStatus.html @@ -1 +1 @@ -ceilingLightStatus | node-switchbot

Type Alias ceilingLightStatus

ceilingLightStatus: deviceStatus & {
    brightness: number;
    colorTemperature: number;
    power: boolean;
}
+ceilingLightStatus | node-switchbot

Type Alias ceilingLightStatus

ceilingLightStatus: deviceStatus & {
    brightness: number;
    colorTemperature: number;
    power: boolean;
}
diff --git a/docs/types/ceilingLightWebhookContext.html b/docs/types/ceilingLightWebhookContext.html index 47b48f9b..e15b663f 100644 --- a/docs/types/ceilingLightWebhookContext.html +++ b/docs/types/ceilingLightWebhookContext.html @@ -1 +1 @@ -ceilingLightWebhookContext | node-switchbot

Type Alias ceilingLightWebhookContext

ceilingLightWebhookContext: deviceWebhookContext & {
    brightness: number;
    colorTemperature: number;
    powerState: "ON" | "OFF";
}
+ceilingLightWebhookContext | node-switchbot

Type Alias ceilingLightWebhookContext

ceilingLightWebhookContext: deviceWebhookContext & {
    brightness: number;
    colorTemperature: number;
    powerState: "ON" | "OFF";
}
diff --git a/docs/types/colorBulb.html b/docs/types/colorBulb.html index eaabfd53..7bb8bf2d 100644 --- a/docs/types/colorBulb.html +++ b/docs/types/colorBulb.html @@ -1 +1 @@ -colorBulb | node-switchbot

Type Alias colorBulb

colorBulb: device & {}
+colorBulb | node-switchbot

Type Alias colorBulb

colorBulb: device & {}
diff --git a/docs/types/colorBulbServiceData.html b/docs/types/colorBulbServiceData.html index c8a11fa7..6df4e349 100644 --- a/docs/types/colorBulbServiceData.html +++ b/docs/types/colorBulbServiceData.html @@ -1 +1 @@ -colorBulbServiceData | node-switchbot

Type Alias colorBulbServiceData

colorBulbServiceData: serviceData & {
    blue: number;
    brightness: number;
    color_mode: number;
    color_temperature: number;
    delay: number;
    green: number;
    loop_index: number;
    model: ColorBulb;
    modelFriendlyName: ColorBulb;
    modelName: ColorBulb;
    power: boolean;
    preset: number;
    red: number;
    speed: number;
    state: boolean;
}
+colorBulbServiceData | node-switchbot

Type Alias colorBulbServiceData

colorBulbServiceData: serviceData & {
    blue: number;
    brightness: number;
    color_mode: number;
    color_temperature: number;
    delay: number;
    green: number;
    loop_index: number;
    model: ColorBulb;
    modelFriendlyName: ColorBulb;
    modelName: ColorBulb;
    power: boolean;
    preset: number;
    red: number;
    speed: number;
    state: boolean;
}
diff --git a/docs/types/colorBulbStatus.html b/docs/types/colorBulbStatus.html index e042b27f..6dfc6aef 100644 --- a/docs/types/colorBulbStatus.html +++ b/docs/types/colorBulbStatus.html @@ -1 +1 @@ -colorBulbStatus | node-switchbot

Type Alias colorBulbStatus

colorBulbStatus: deviceStatus & {
    brightness: number;
    color: string;
    colorTemperature: number;
    power: string;
}
+colorBulbStatus | node-switchbot

Type Alias colorBulbStatus

colorBulbStatus: deviceStatus & {
    brightness: number;
    color: string;
    colorTemperature: number;
    power: string;
}
diff --git a/docs/types/colorBulbWebhookContext.html b/docs/types/colorBulbWebhookContext.html index 5fc19f83..f43aaef8 100644 --- a/docs/types/colorBulbWebhookContext.html +++ b/docs/types/colorBulbWebhookContext.html @@ -1 +1 @@ -colorBulbWebhookContext | node-switchbot

Type Alias colorBulbWebhookContext

colorBulbWebhookContext: deviceWebhookContext & {
    brightness: number;
    color: string;
    colorTemperature: number;
    powerState: "ON" | "OFF";
}
+colorBulbWebhookContext | node-switchbot

Type Alias colorBulbWebhookContext

colorBulbWebhookContext: deviceWebhookContext & {
    brightness: number;
    color: string;
    colorTemperature: number;
    powerState: "ON" | "OFF";
}
diff --git a/docs/types/contactSensor.html b/docs/types/contactSensor.html index 0c1f3b7b..5dfde45b 100644 --- a/docs/types/contactSensor.html +++ b/docs/types/contactSensor.html @@ -1 +1 @@ -contactSensor | node-switchbot

Type Alias contactSensor

contactSensor: device & {}
+contactSensor | node-switchbot

Type Alias contactSensor

contactSensor: device & {}
diff --git a/docs/types/contactSensorServiceData.html b/docs/types/contactSensorServiceData.html index 2aa4c326..a3d8a6f1 100644 --- a/docs/types/contactSensorServiceData.html +++ b/docs/types/contactSensorServiceData.html @@ -1 +1 @@ -contactSensorServiceData | node-switchbot

Type Alias contactSensorServiceData

contactSensorServiceData: serviceData & {
    battery: number;
    button_count: number;
    contact_open: boolean;
    contact_timeout: boolean;
    doorState: string;
    lightLevel: string;
    model: ContactSensor;
    modelFriendlyName: ContactSensor;
    modelName: ContactSensor;
    movement: boolean;
    tested: boolean;
}
+contactSensorServiceData | node-switchbot

Type Alias contactSensorServiceData

contactSensorServiceData: serviceData & {
    battery: number;
    button_count: number;
    contact_open: boolean;
    contact_timeout: boolean;
    doorState: string;
    lightLevel: string;
    model: ContactSensor;
    modelFriendlyName: ContactSensor;
    modelName: ContactSensor;
    movement: boolean;
    tested: boolean;
}
diff --git a/docs/types/contactSensorStatus.html b/docs/types/contactSensorStatus.html index 90e64cbc..d7dfc550 100644 --- a/docs/types/contactSensorStatus.html +++ b/docs/types/contactSensorStatus.html @@ -1 +1 @@ -contactSensorStatus | node-switchbot

Type Alias contactSensorStatus

contactSensorStatus: deviceStatus & {
    battery: number;
    brightness: "bright" | "dim";
    moveDetected: boolean;
    openState: "open" | "close" | "timeOutNotClose";
}
+contactSensorStatus | node-switchbot

Type Alias contactSensorStatus

contactSensorStatus: deviceStatus & {
    battery: number;
    brightness: "bright" | "dim";
    moveDetected: boolean;
    openState: "open" | "close" | "timeOutNotClose";
}
diff --git a/docs/types/contactSensorWebhookContext.html b/docs/types/contactSensorWebhookContext.html index e823269d..957f427a 100644 --- a/docs/types/contactSensorWebhookContext.html +++ b/docs/types/contactSensorWebhookContext.html @@ -1 +1 @@ -contactSensorWebhookContext | node-switchbot

Type Alias contactSensorWebhookContext

contactSensorWebhookContext: deviceWebhookContext & {
    brightness: "dim" | "bright";
    detectionState: "NOT_DETECTED" | "DETECTED";
    doorMode: "IN_DOOR" | "OUT_DOOR";
    openState: "open" | "close" | "timeOutNotClose";
}
+contactSensorWebhookContext | node-switchbot

Type Alias contactSensorWebhookContext

contactSensorWebhookContext: deviceWebhookContext & {
    brightness: "dim" | "bright";
    detectionState: "NOT_DETECTED" | "DETECTED";
    doorMode: "IN_DOOR" | "OUT_DOOR";
    openState: "open" | "close" | "timeOutNotClose";
}
diff --git a/docs/types/curtain.html b/docs/types/curtain.html index 6ebd7b42..55a5411d 100644 --- a/docs/types/curtain.html +++ b/docs/types/curtain.html @@ -1 +1 @@ -curtain | node-switchbot

Type Alias curtain

curtain: device & {
    calibrate: boolean;
    curtainDevicesIds: string[];
    group: boolean;
    master: boolean;
    openDirection: string;
}
+curtain | node-switchbot

Type Alias curtain

curtain: device & {
    calibrate: boolean;
    curtainDevicesIds: string[];
    group: boolean;
    master: boolean;
    openDirection: string;
}
diff --git a/docs/types/curtain3.html b/docs/types/curtain3.html index 97af50c7..45425881 100644 --- a/docs/types/curtain3.html +++ b/docs/types/curtain3.html @@ -1 +1 @@ -curtain3 | node-switchbot

Type Alias curtain3

curtain3: device & {
    calibrate: boolean;
    curtainDevicesIds: string[];
    group: boolean;
    master: boolean;
    openDirection?: string;
}
+curtain3 | node-switchbot

Type Alias curtain3

curtain3: device & {
    calibrate: boolean;
    curtainDevicesIds: string[];
    group: boolean;
    master: boolean;
    openDirection?: string;
}
diff --git a/docs/types/curtain3ServiceData.html b/docs/types/curtain3ServiceData.html index f5dc7913..2090b2a4 100644 --- a/docs/types/curtain3ServiceData.html +++ b/docs/types/curtain3ServiceData.html @@ -1 +1 @@ -curtain3ServiceData | node-switchbot

Type Alias curtain3ServiceData

curtain3ServiceData: serviceData & {
    battery: number;
    calibration: boolean;
    deviceChain: number;
    inMotion: boolean;
    lightLevel: number;
    model: Curtain3;
    modelFriendlyName: Curtain3;
    modelName: Curtain3;
    position: number;
}
+curtain3ServiceData | node-switchbot

Type Alias curtain3ServiceData

curtain3ServiceData: serviceData & {
    battery: number;
    calibration: boolean;
    deviceChain: number;
    inMotion: boolean;
    lightLevel: number;
    model: Curtain3;
    modelFriendlyName: Curtain3;
    modelName: Curtain3;
    position: number;
}
diff --git a/docs/types/curtain3WebhookContext.html b/docs/types/curtain3WebhookContext.html index a2afb191..ad68bb58 100644 --- a/docs/types/curtain3WebhookContext.html +++ b/docs/types/curtain3WebhookContext.html @@ -1 +1 @@ -curtain3WebhookContext | node-switchbot

Type Alias curtain3WebhookContext

curtain3WebhookContext: deviceWebhookContext & {
    battery: number;
    calibrate: boolean;
    group: boolean;
    slidePosition: number;
}
+curtain3WebhookContext | node-switchbot

Type Alias curtain3WebhookContext

curtain3WebhookContext: deviceWebhookContext & {
    battery: number;
    calibrate: boolean;
    group: boolean;
    slidePosition: number;
}
diff --git a/docs/types/curtainServiceData.html b/docs/types/curtainServiceData.html index 347aaabb..b18d7294 100644 --- a/docs/types/curtainServiceData.html +++ b/docs/types/curtainServiceData.html @@ -1 +1 @@ -curtainServiceData | node-switchbot

Type Alias curtainServiceData

curtainServiceData: serviceData & {
    battery: number;
    calibration: boolean;
    deviceChain: number;
    inMotion: boolean;
    lightLevel: number;
    model: Curtain;
    modelFriendlyName: Curtain;
    modelName: Curtain;
    position: number;
}
+curtainServiceData | node-switchbot

Type Alias curtainServiceData

curtainServiceData: serviceData & {
    battery: number;
    calibration: boolean;
    deviceChain: number;
    inMotion: boolean;
    lightLevel: number;
    model: Curtain;
    modelFriendlyName: Curtain;
    modelName: Curtain;
    position: number;
}
diff --git a/docs/types/curtainStatus.html b/docs/types/curtainStatus.html index 4560f31f..e9350038 100644 --- a/docs/types/curtainStatus.html +++ b/docs/types/curtainStatus.html @@ -1 +1 @@ -curtainStatus | node-switchbot

Type Alias curtainStatus

curtainStatus: deviceStatus & {
    battery: number;
    calibrate: boolean;
    group: boolean;
    lightLevel?: "bright" | "dim";
    moving: boolean;
    slidePosition: number;
}
+curtainStatus | node-switchbot

Type Alias curtainStatus

curtainStatus: deviceStatus & {
    battery: number;
    calibrate: boolean;
    group: boolean;
    lightLevel?: "bright" | "dim";
    moving: boolean;
    slidePosition: number;
}
diff --git a/docs/types/curtainWebhookContext.html b/docs/types/curtainWebhookContext.html index 2dc113cf..ab038d1c 100644 --- a/docs/types/curtainWebhookContext.html +++ b/docs/types/curtainWebhookContext.html @@ -1 +1 @@ -curtainWebhookContext | node-switchbot

Type Alias curtainWebhookContext

curtainWebhookContext: deviceWebhookContext & {
    battery: number;
    calibrate: boolean;
    group: boolean;
    slidePosition: number;
}
+curtainWebhookContext | node-switchbot

Type Alias curtainWebhookContext

curtainWebhookContext: deviceWebhookContext & {
    battery: number;
    calibrate: boolean;
    group: boolean;
    slidePosition: number;
}
diff --git a/docs/types/floorCleaningRobotS10.html b/docs/types/floorCleaningRobotS10.html index 5e91c7d4..ad6e237c 100644 --- a/docs/types/floorCleaningRobotS10.html +++ b/docs/types/floorCleaningRobotS10.html @@ -1 +1 @@ -floorCleaningRobotS10 | node-switchbot

Type Alias floorCleaningRobotS10

floorCleaningRobotS10: device & {}
+floorCleaningRobotS10 | node-switchbot

Type Alias floorCleaningRobotS10

floorCleaningRobotS10: device & {}
diff --git a/docs/types/floorCleaningRobotS10Status.html b/docs/types/floorCleaningRobotS10Status.html index ecfcdc0f..664ef05b 100644 --- a/docs/types/floorCleaningRobotS10Status.html +++ b/docs/types/floorCleaningRobotS10Status.html @@ -1 +1 @@ -floorCleaningRobotS10Status | node-switchbot

Type Alias floorCleaningRobotS10Status

floorCleaningRobotS10Status: deviceStatus & {
    battery: number;
    onlineStatus: string;
    taskType: string;
    waterBaseBattery: number;
    workingStatus: string;
}
+floorCleaningRobotS10Status | node-switchbot

Type Alias floorCleaningRobotS10Status

floorCleaningRobotS10Status: deviceStatus & {
    battery: number;
    onlineStatus: string;
    taskType: string;
    waterBaseBattery: number;
    workingStatus: string;
}
diff --git a/docs/types/floorCleaningRobotS10WebhookContext.html b/docs/types/floorCleaningRobotS10WebhookContext.html index 736b0586..b9eb0a35 100644 --- a/docs/types/floorCleaningRobotS10WebhookContext.html +++ b/docs/types/floorCleaningRobotS10WebhookContext.html @@ -1 +1 @@ -floorCleaningRobotS10WebhookContext | node-switchbot

Type Alias floorCleaningRobotS10WebhookContext

floorCleaningRobotS10WebhookContext: deviceWebhookContext & {
    battery: number;
    onlineStatus: "online" | "offline";
    taskType:
        | "standBy"
        | "explore"
        | "cleanAll"
        | "cleanArea"
        | "cleanRoom"
        | "fillWater"
        | "deepWashing"
        | "backToCharge"
        | "markingWaterBase"
        | "drying"
        | "collectDust"
        | "remoteControl"
        | "cleanWithExplorer"
        | "fillWaterForHumi"
        | "markingHumi";
    waterBaseBattery: number;
    workingStatus: | "Standby"
    | "Clearing"
    | "Paused"
    | "GotoChargeBase"
    | "Charging"
    | "ChargeDone"
    | "Dormant"
    | "InTrouble"
    | "InRemoteControl"
    | "InDustCollecting";
}
+floorCleaningRobotS10WebhookContext | node-switchbot

Type Alias floorCleaningRobotS10WebhookContext

floorCleaningRobotS10WebhookContext: deviceWebhookContext & {
    battery: number;
    onlineStatus: "online" | "offline";
    taskType:
        | "standBy"
        | "explore"
        | "cleanAll"
        | "cleanArea"
        | "cleanRoom"
        | "fillWater"
        | "deepWashing"
        | "backToCharge"
        | "markingWaterBase"
        | "drying"
        | "collectDust"
        | "remoteControl"
        | "cleanWithExplorer"
        | "fillWaterForHumi"
        | "markingHumi";
    waterBaseBattery: number;
    workingStatus: | "Standby"
    | "Clearing"
    | "Paused"
    | "GotoChargeBase"
    | "Charging"
    | "ChargeDone"
    | "Dormant"
    | "InTrouble"
    | "InRemoteControl"
    | "InDustCollecting";
}
diff --git a/docs/types/hub2.html b/docs/types/hub2.html index 84b1014f..c98782b2 100644 --- a/docs/types/hub2.html +++ b/docs/types/hub2.html @@ -1 +1 @@ -hub2 | node-switchbot

Type Alias hub2

hub2: device & {}
+hub2 | node-switchbot

Type Alias hub2

hub2: device & {}
diff --git a/docs/types/hub2ServiceData.html b/docs/types/hub2ServiceData.html index b4be4229..0944a673 100644 --- a/docs/types/hub2ServiceData.html +++ b/docs/types/hub2ServiceData.html @@ -1 +1 @@ -hub2ServiceData | node-switchbot

Type Alias hub2ServiceData

hub2ServiceData: serviceData & {
    celsius: number;
    fahrenheit: number;
    fahrenheit_mode: boolean;
    humidity: number;
    lightLevel: number;
    model: Hub2;
    modelFriendlyName: Hub2;
    modelName: Hub2;
}
+hub2ServiceData | node-switchbot

Type Alias hub2ServiceData

hub2ServiceData: serviceData & {
    celsius: number;
    fahrenheit: number;
    fahrenheit_mode: boolean;
    humidity: number;
    lightLevel: number;
    model: Hub2;
    modelFriendlyName: Hub2;
    modelName: Hub2;
}
diff --git a/docs/types/hub2Status.html b/docs/types/hub2Status.html index e35bdf8b..b7ab98a5 100644 --- a/docs/types/hub2Status.html +++ b/docs/types/hub2Status.html @@ -1 +1 @@ -hub2Status | node-switchbot

Type Alias hub2Status

hub2Status: deviceStatus & {
    humidity: number;
    lightLevel: number;
    temperature: number;
}
+hub2Status | node-switchbot

Type Alias hub2Status

hub2Status: deviceStatus & {
    humidity: number;
    lightLevel: number;
    temperature: number;
}
diff --git a/docs/types/hub2WebhookContext.html b/docs/types/hub2WebhookContext.html index 8d47c13e..7b036e7c 100644 --- a/docs/types/hub2WebhookContext.html +++ b/docs/types/hub2WebhookContext.html @@ -1 +1 @@ -hub2WebhookContext | node-switchbot

Type Alias hub2WebhookContext

hub2WebhookContext: deviceWebhookContext & {
    humidity: number;
    lightLevel: number;
    scale: "CELSIUS" | "FAHRENHEIT";
    temperature: number;
}
+hub2WebhookContext | node-switchbot

Type Alias hub2WebhookContext

hub2WebhookContext: deviceWebhookContext & {
    humidity: number;
    lightLevel: number;
    scale: "CELSIUS" | "FAHRENHEIT";
    temperature: number;
}
diff --git a/docs/types/humidifier.html b/docs/types/humidifier.html index 93a7f168..072b720f 100644 --- a/docs/types/humidifier.html +++ b/docs/types/humidifier.html @@ -1 +1 @@ -humidifier | node-switchbot

Type Alias humidifier

humidifier: device & {}
+humidifier | node-switchbot

Type Alias humidifier

humidifier: device & {}
diff --git a/docs/types/humidifier2ServiceData.html b/docs/types/humidifier2ServiceData.html new file mode 100644 index 00000000..600d4e18 --- /dev/null +++ b/docs/types/humidifier2ServiceData.html @@ -0,0 +1 @@ +humidifier2ServiceData | node-switchbot

Type Alias humidifier2ServiceData

humidifier2ServiceData: serviceData & {
    autoMode: boolean;
    humidity: number;
    model: Humidifier2;
    modelFriendlyName: Humidifier2;
    modelName: Humidifier2;
    onState: boolean;
    percentage: number;
}
diff --git a/docs/types/humidifier2Status.html b/docs/types/humidifier2Status.html new file mode 100644 index 00000000..a9e825ca --- /dev/null +++ b/docs/types/humidifier2Status.html @@ -0,0 +1 @@ +humidifier2Status | node-switchbot

Type Alias humidifier2Status

humidifier2Status: deviceStatus & {
    auto: boolean;
    childLock: boolean;
    humidity: number;
    lackWater: boolean;
    nebulizationEfficiency: number;
    power: string;
    sound: boolean;
    temperature: number;
}
diff --git a/docs/types/humidifier2WebhookContext.html b/docs/types/humidifier2WebhookContext.html new file mode 100644 index 00000000..0d274c1d --- /dev/null +++ b/docs/types/humidifier2WebhookContext.html @@ -0,0 +1 @@ +humidifier2WebhookContext | node-switchbot

Type Alias humidifier2WebhookContext

humidifier2WebhookContext: deviceWebhookContext & {
    humidity: number;
    scale: "CELSIUS" | "FAHRENHEIT";
    temperature: number;
}
diff --git a/docs/types/humidifierServiceData.html b/docs/types/humidifierServiceData.html index 8a185643..97ab7b51 100644 --- a/docs/types/humidifierServiceData.html +++ b/docs/types/humidifierServiceData.html @@ -1 +1 @@ -humidifierServiceData | node-switchbot

Type Alias humidifierServiceData

humidifierServiceData: serviceData & {
    autoMode: boolean;
    humidity: number;
    model: Humidifier;
    modelFriendlyName: Humidifier;
    modelName: Humidifier;
    onState: boolean;
    percentage: number;
}
+humidifierServiceData | node-switchbot

Type Alias humidifierServiceData

humidifierServiceData: serviceData & {
    autoMode: boolean;
    humidity: number;
    model: Humidifier;
    modelFriendlyName: Humidifier;
    modelName: Humidifier;
    onState: boolean;
    percentage: number;
}
diff --git a/docs/types/humidifierStatus.html b/docs/types/humidifierStatus.html index 781e2502..b0a5d0a9 100644 --- a/docs/types/humidifierStatus.html +++ b/docs/types/humidifierStatus.html @@ -1 +1 @@ -humidifierStatus | node-switchbot

Type Alias humidifierStatus

humidifierStatus: deviceStatus & {
    auto: boolean;
    childLock: boolean;
    humidity: number;
    lackWater: boolean;
    nebulizationEfficiency: number;
    power: string;
    sound: boolean;
    temperature: number;
}
+humidifierStatus | node-switchbot

Type Alias humidifierStatus

humidifierStatus: deviceStatus & {
    auto: boolean;
    childLock: boolean;
    humidity: number;
    lackWater: boolean;
    nebulizationEfficiency: number;
    power: string;
    sound: boolean;
    temperature: number;
}
diff --git a/docs/types/humidifierWebhookContext.html b/docs/types/humidifierWebhookContext.html index f54145ad..53d50f96 100644 --- a/docs/types/humidifierWebhookContext.html +++ b/docs/types/humidifierWebhookContext.html @@ -1 +1 @@ -humidifierWebhookContext | node-switchbot

Type Alias humidifierWebhookContext

humidifierWebhookContext: deviceWebhookContext & {
    humidity: number;
    scale: "CELSIUS" | "FAHRENHEIT";
    temperature: number;
}
+humidifierWebhookContext | node-switchbot

Type Alias humidifierWebhookContext

humidifierWebhookContext: deviceWebhookContext & {
    humidity: number;
    scale: "CELSIUS" | "FAHRENHEIT";
    temperature: number;
}
diff --git a/docs/types/indoorCam.html b/docs/types/indoorCam.html index 587a8252..6f0e807b 100644 --- a/docs/types/indoorCam.html +++ b/docs/types/indoorCam.html @@ -1 +1 @@ -indoorCam | node-switchbot

Type Alias indoorCam

indoorCam: device & {}
+indoorCam | node-switchbot

Type Alias indoorCam

indoorCam: device & {}
diff --git a/docs/types/indoorCameraWebhookContext.html b/docs/types/indoorCameraWebhookContext.html index cc4400f9..381c932d 100644 --- a/docs/types/indoorCameraWebhookContext.html +++ b/docs/types/indoorCameraWebhookContext.html @@ -1 +1 @@ -indoorCameraWebhookContext | node-switchbot

Type Alias indoorCameraWebhookContext

indoorCameraWebhookContext: deviceWebhookContext & {
    detectionState: "DETECTED";
}
+indoorCameraWebhookContext | node-switchbot

Type Alias indoorCameraWebhookContext

indoorCameraWebhookContext: deviceWebhookContext & {
    detectionState: "DETECTED";
}
diff --git a/docs/types/keypad.html b/docs/types/keypad.html index c5bfb0c6..5022461d 100644 --- a/docs/types/keypad.html +++ b/docs/types/keypad.html @@ -1 +1 @@ -keypad | node-switchbot

Type Alias keypad

keypad: device & { keyList: keyList; lockDeviceId: string; remoteType: string }
+keypad | node-switchbot

Type Alias keypad

keypad: device & { keyList: keyList; lockDeviceId: string; remoteType: string }
diff --git a/docs/types/keypadDetectorServiceData.html b/docs/types/keypadDetectorServiceData.html index 9088e09a..37aaab12 100644 --- a/docs/types/keypadDetectorServiceData.html +++ b/docs/types/keypadDetectorServiceData.html @@ -1 +1 @@ -keypadDetectorServiceData | node-switchbot

Type Alias keypadDetectorServiceData

keypadDetectorServiceData: serviceData & {
    battery: number;
    event: boolean;
    low_battery: boolean;
    model: Keypad;
    modelFriendlyName: Keypad;
    modelName: Keypad;
    tampered: boolean;
}
+keypadDetectorServiceData | node-switchbot

Type Alias keypadDetectorServiceData

keypadDetectorServiceData: serviceData & {
    battery: number;
    event: boolean;
    low_battery: boolean;
    model: Keypad;
    modelFriendlyName: Keypad;
    modelName: Keypad;
    tampered: boolean;
}
diff --git a/docs/types/keypadTouch.html b/docs/types/keypadTouch.html index e36aa7cf..0a9ac34d 100644 --- a/docs/types/keypadTouch.html +++ b/docs/types/keypadTouch.html @@ -1 +1 @@ -keypadTouch | node-switchbot

Type Alias keypadTouch

keypadTouch: device & {
    keyList: keyList;
    lockDeviceId: string;
    remoteType: string;
}
+keypadTouch | node-switchbot

Type Alias keypadTouch

keypadTouch: device & {
    keyList: keyList;
    lockDeviceId: string;
    remoteType: string;
}
diff --git a/docs/types/keypadTouchWebhookContext.html b/docs/types/keypadTouchWebhookContext.html index 13bcd224..5a2a94e9 100644 --- a/docs/types/keypadTouchWebhookContext.html +++ b/docs/types/keypadTouchWebhookContext.html @@ -1 +1 @@ -keypadTouchWebhookContext | node-switchbot

Type Alias keypadTouchWebhookContext

keypadTouchWebhookContext: deviceWebhookContext & {
    commandId: string;
    eventName: "createKey" | "deleteKey";
    result: "success" | "failed" | "timeout";
}
+keypadTouchWebhookContext | node-switchbot

Type Alias keypadTouchWebhookContext

keypadTouchWebhookContext: deviceWebhookContext & {
    commandId: string;
    eventName: "createKey" | "deleteKey";
    result: "success" | "failed" | "timeout";
}
diff --git a/docs/types/keypadWebhookContext.html b/docs/types/keypadWebhookContext.html index 5e7fa085..4e8e9644 100644 --- a/docs/types/keypadWebhookContext.html +++ b/docs/types/keypadWebhookContext.html @@ -1 +1 @@ -keypadWebhookContext | node-switchbot

Type Alias keypadWebhookContext

keypadWebhookContext: deviceWebhookContext & {
    commandId: string;
    eventName: "createKey" | "deleteKey";
    result: "success" | "failed" | "timeout";
}
+keypadWebhookContext | node-switchbot

Type Alias keypadWebhookContext

keypadWebhookContext: deviceWebhookContext & {
    commandId: string;
    eventName: "createKey" | "deleteKey";
    result: "success" | "failed" | "timeout";
}
diff --git a/docs/types/lock.html b/docs/types/lock.html index 95573f3b..b5ce5b5e 100644 --- a/docs/types/lock.html +++ b/docs/types/lock.html @@ -1 +1 @@ -lock | node-switchbot

Type Alias lock

lock: device & {
    group: boolean;
    groupName: string;
    lockDevicesIds: string[];
    master: boolean;
}
+lock | node-switchbot

Type Alias lock

lock: device & {
    group: boolean;
    groupName: string;
    lockDevicesIds: string[];
    master: boolean;
}
diff --git a/docs/types/lockPro.html b/docs/types/lockPro.html index 5d3b492d..b81229ac 100644 --- a/docs/types/lockPro.html +++ b/docs/types/lockPro.html @@ -1 +1 @@ -lockPro | node-switchbot

Type Alias lockPro

lockPro: device & {
    group: boolean;
    groupName: string;
    lockDevicesIds: string[];
    master: boolean;
}
+lockPro | node-switchbot

Type Alias lockPro

lockPro: device & {
    group: boolean;
    groupName: string;
    lockDevicesIds: string[];
    master: boolean;
}
diff --git a/docs/types/lockProServiceData.html b/docs/types/lockProServiceData.html index cff5abb7..36830794 100644 --- a/docs/types/lockProServiceData.html +++ b/docs/types/lockProServiceData.html @@ -1 +1 @@ -lockProServiceData | node-switchbot

Type Alias lockProServiceData

lockProServiceData: serviceData & {
    auto_lock_paused: boolean;
    battery: number;
    calibration: boolean;
    door_open: boolean;
    double_lock_mode: boolean;
    model: LockPro;
    modelFriendlyName: LockPro;
    modelName: LockPro;
    night_latch: boolean;
    status: string;
    unclosed_alarm: boolean;
    unlocked_alarm: boolean;
    update_from_secondary_lock: boolean;
}
+lockProServiceData | node-switchbot

Type Alias lockProServiceData

lockProServiceData: serviceData & {
    auto_lock_paused: boolean;
    battery: number;
    calibration: boolean;
    door_open: boolean;
    double_lock_mode: boolean;
    model: LockPro;
    modelFriendlyName: LockPro;
    modelName: LockPro;
    night_latch: boolean;
    status: string;
    unclosed_alarm: boolean;
    unlocked_alarm: boolean;
    update_from_secondary_lock: boolean;
}
diff --git a/docs/types/lockProStatus.html b/docs/types/lockProStatus.html index 5266f3cf..7c69cea0 100644 --- a/docs/types/lockProStatus.html +++ b/docs/types/lockProStatus.html @@ -1 +1 @@ -lockProStatus | node-switchbot

Type Alias lockProStatus

lockProStatus: deviceStatus & {
    battery: number;
    doorState: string;
    lockState: string;
    moveDetected: boolean;
}
+lockProStatus | node-switchbot

Type Alias lockProStatus

lockProStatus: deviceStatus & {
    battery: number;
    doorState: string;
    lockState: string;
    moveDetected: boolean;
}
diff --git a/docs/types/lockProWebhookContext.html b/docs/types/lockProWebhookContext.html index 33923700..d6fc8731 100644 --- a/docs/types/lockProWebhookContext.html +++ b/docs/types/lockProWebhookContext.html @@ -1 +1 @@ -lockProWebhookContext | node-switchbot

Type Alias lockProWebhookContext

lockProWebhookContext: deviceWebhookContext & {
    lockState: "UNLOCKED" | "LOCKED" | "JAMMED";
}
+lockProWebhookContext | node-switchbot

Type Alias lockProWebhookContext

lockProWebhookContext: deviceWebhookContext & {
    lockState: "UNLOCKED" | "LOCKED" | "JAMMED";
}
diff --git a/docs/types/lockServiceData.html b/docs/types/lockServiceData.html index 04902f13..699726d4 100644 --- a/docs/types/lockServiceData.html +++ b/docs/types/lockServiceData.html @@ -1 +1 @@ -lockServiceData | node-switchbot

Type Alias lockServiceData

lockServiceData: serviceData & {
    auto_lock_paused: boolean;
    battery: number;
    calibration: boolean;
    door_open: boolean;
    double_lock_mode: boolean;
    model: Lock;
    modelFriendlyName: Lock;
    modelName: Lock;
    night_latch: boolean;
    status: string;
    unclosed_alarm: boolean;
    unlocked_alarm: boolean;
    update_from_secondary_lock: boolean;
}
+lockServiceData | node-switchbot

Type Alias lockServiceData

lockServiceData: serviceData & {
    auto_lock_paused: boolean;
    battery: number;
    calibration: boolean;
    door_open: boolean;
    double_lock_mode: boolean;
    model: Lock;
    modelFriendlyName: Lock;
    modelName: Lock;
    night_latch: boolean;
    status: string;
    unclosed_alarm: boolean;
    unlocked_alarm: boolean;
    update_from_secondary_lock: boolean;
}
diff --git a/docs/types/lockStatus.html b/docs/types/lockStatus.html index 02f53ec2..d5a5b867 100644 --- a/docs/types/lockStatus.html +++ b/docs/types/lockStatus.html @@ -1 +1 @@ -lockStatus | node-switchbot

Type Alias lockStatus

lockStatus: deviceStatus & {
    battery: number;
    doorState: string;
    lockState: string;
    moveDetected: boolean;
}
+lockStatus | node-switchbot

Type Alias lockStatus

lockStatus: deviceStatus & {
    battery: number;
    doorState: string;
    lockState: string;
    moveDetected: boolean;
}
diff --git a/docs/types/lockWebhookContext.html b/docs/types/lockWebhookContext.html index 1f5eca76..8b8c55c8 100644 --- a/docs/types/lockWebhookContext.html +++ b/docs/types/lockWebhookContext.html @@ -1 +1 @@ -lockWebhookContext | node-switchbot

Type Alias lockWebhookContext

lockWebhookContext: deviceWebhookContext & {
    lockState: "UNLOCKED" | "LOCKED" | "JAMMED";
}
+lockWebhookContext | node-switchbot

Type Alias lockWebhookContext

lockWebhookContext: deviceWebhookContext & {
    lockState: "UNLOCKED" | "LOCKED" | "JAMMED";
}
diff --git a/docs/types/meter.html b/docs/types/meter.html index 6c91fdf7..1b227fb2 100644 --- a/docs/types/meter.html +++ b/docs/types/meter.html @@ -1 +1 @@ -meter | node-switchbot

Type Alias meter

meter: device & {}
+meter | node-switchbot

Type Alias meter

meter: device & {}
diff --git a/docs/types/meterPlus.html b/docs/types/meterPlus.html index 662bd39d..c95c106a 100644 --- a/docs/types/meterPlus.html +++ b/docs/types/meterPlus.html @@ -1 +1 @@ -meterPlus | node-switchbot

Type Alias meterPlus

meterPlus: device & {}
+meterPlus | node-switchbot

Type Alias meterPlus

meterPlus: device & {}
diff --git a/docs/types/meterPlusServiceData.html b/docs/types/meterPlusServiceData.html index 30e03f4e..d29cbce9 100644 --- a/docs/types/meterPlusServiceData.html +++ b/docs/types/meterPlusServiceData.html @@ -1 +1 @@ -meterPlusServiceData | node-switchbot

Type Alias meterPlusServiceData

meterPlusServiceData: serviceData & {
    battery: number;
    celsius: number;
    fahrenheit: number;
    fahrenheit_mode: boolean;
    humidity: number;
    model: MeterPlus;
    modelFriendlyName: MeterPlus;
    modelName: MeterPlus;
}
+meterPlusServiceData | node-switchbot

Type Alias meterPlusServiceData

meterPlusServiceData: serviceData & {
    battery: number;
    celsius: number;
    fahrenheit: number;
    fahrenheit_mode: boolean;
    humidity: number;
    model: MeterPlus;
    modelFriendlyName: MeterPlus;
    modelName: MeterPlus;
}
diff --git a/docs/types/meterPlusStatus.html b/docs/types/meterPlusStatus.html index ee5aad30..29d34c4e 100644 --- a/docs/types/meterPlusStatus.html +++ b/docs/types/meterPlusStatus.html @@ -1 +1 @@ -meterPlusStatus | node-switchbot

Type Alias meterPlusStatus

meterPlusStatus: deviceStatus & {
    battery: number;
    humidity: number;
    temperature: number;
}
+meterPlusStatus | node-switchbot

Type Alias meterPlusStatus

meterPlusStatus: deviceStatus & {
    battery: number;
    humidity: number;
    temperature: number;
}
diff --git a/docs/types/meterPlusWebhookContext.html b/docs/types/meterPlusWebhookContext.html index 8abbf4f2..629887ae 100644 --- a/docs/types/meterPlusWebhookContext.html +++ b/docs/types/meterPlusWebhookContext.html @@ -1 +1 @@ -meterPlusWebhookContext | node-switchbot

Type Alias meterPlusWebhookContext

meterPlusWebhookContext: deviceWebhookContext & {
    humidity: number;
    scale: "CELSIUS" | "FAHRENHEIT";
    temperature: number;
}
+meterPlusWebhookContext | node-switchbot

Type Alias meterPlusWebhookContext

meterPlusWebhookContext: deviceWebhookContext & {
    humidity: number;
    scale: "CELSIUS" | "FAHRENHEIT";
    temperature: number;
}
diff --git a/docs/types/meterPro.html b/docs/types/meterPro.html index c3d4d091..a669d146 100644 --- a/docs/types/meterPro.html +++ b/docs/types/meterPro.html @@ -1 +1 @@ -meterPro | node-switchbot

Type Alias meterPro

meterPro: device & {}
+meterPro | node-switchbot

Type Alias meterPro

meterPro: device & {}
diff --git a/docs/types/meterProCO2ServiceData.html b/docs/types/meterProCO2ServiceData.html index ef9f7455..c9effbef 100644 --- a/docs/types/meterProCO2ServiceData.html +++ b/docs/types/meterProCO2ServiceData.html @@ -1 +1 @@ -meterProCO2ServiceData | node-switchbot

Type Alias meterProCO2ServiceData

meterProCO2ServiceData: serviceData & {
    battery: number;
    celsius: number;
    co2: number;
    fahrenheit: number;
    fahrenheit_mode: boolean;
    humidity: number;
    model: MeterProCO2;
    modelFriendlyName: MeterProCO2;
    modelName: MeterProCO2;
}
+meterProCO2ServiceData | node-switchbot

Type Alias meterProCO2ServiceData

meterProCO2ServiceData: serviceData & {
    battery: number;
    celsius: number;
    co2: number;
    fahrenheit: number;
    fahrenheit_mode: boolean;
    humidity: number;
    model: MeterProCO2;
    modelFriendlyName: MeterProCO2;
    modelName: MeterProCO2;
}
diff --git a/docs/types/meterProCO2Status.html b/docs/types/meterProCO2Status.html index fd67a4ab..908b342c 100644 --- a/docs/types/meterProCO2Status.html +++ b/docs/types/meterProCO2Status.html @@ -1 +1 @@ -meterProCO2Status | node-switchbot

Type Alias meterProCO2Status

meterProCO2Status: deviceStatus & {
    battery: number;
    co2: number;
    humidity: number;
    temperature: number;
}
+meterProCO2Status | node-switchbot

Type Alias meterProCO2Status

meterProCO2Status: deviceStatus & {
    battery: number;
    co2: number;
    humidity: number;
    temperature: number;
}
diff --git a/docs/types/meterProCO2WebhookContext.html b/docs/types/meterProCO2WebhookContext.html index e43a660b..ea619855 100644 --- a/docs/types/meterProCO2WebhookContext.html +++ b/docs/types/meterProCO2WebhookContext.html @@ -1 +1 @@ -meterProCO2WebhookContext | node-switchbot

Type Alias meterProCO2WebhookContext

meterProCO2WebhookContext: deviceWebhookContext & {
    co2: number;
    humidity: number;
    scale: "CELSIUS" | "FAHRENHEIT";
    temperature: number;
}
+meterProCO2WebhookContext | node-switchbot

Type Alias meterProCO2WebhookContext

meterProCO2WebhookContext: deviceWebhookContext & {
    co2: number;
    humidity: number;
    scale: "CELSIUS" | "FAHRENHEIT";
    temperature: number;
}
diff --git a/docs/types/meterProServiceData.html b/docs/types/meterProServiceData.html index c5249e4b..939b4405 100644 --- a/docs/types/meterProServiceData.html +++ b/docs/types/meterProServiceData.html @@ -1 +1 @@ -meterProServiceData | node-switchbot

Type Alias meterProServiceData

meterProServiceData: serviceData & {
    battery: number;
    celsius: number;
    fahrenheit: number;
    fahrenheit_mode: boolean;
    humidity: number;
    model: MeterPro;
    modelFriendlyName: MeterPro;
    modelName: MeterPro;
}
+meterProServiceData | node-switchbot

Type Alias meterProServiceData

meterProServiceData: serviceData & {
    battery: number;
    celsius: number;
    fahrenheit: number;
    fahrenheit_mode: boolean;
    humidity: number;
    model: MeterPro;
    modelFriendlyName: MeterPro;
    modelName: MeterPro;
}
diff --git a/docs/types/meterProStatus.html b/docs/types/meterProStatus.html index 04016e2a..5ce264e2 100644 --- a/docs/types/meterProStatus.html +++ b/docs/types/meterProStatus.html @@ -1 +1 @@ -meterProStatus | node-switchbot

Type Alias meterProStatus

meterProStatus: deviceStatus & {
    battery: number;
    humidity: number;
    temperature: number;
}
+meterProStatus | node-switchbot

Type Alias meterProStatus

meterProStatus: deviceStatus & {
    battery: number;
    humidity: number;
    temperature: number;
}
diff --git a/docs/types/meterProWebhookContext.html b/docs/types/meterProWebhookContext.html index 4e0feffb..998d95da 100644 --- a/docs/types/meterProWebhookContext.html +++ b/docs/types/meterProWebhookContext.html @@ -1 +1 @@ -meterProWebhookContext | node-switchbot

Type Alias meterProWebhookContext

meterProWebhookContext: deviceWebhookContext & {
    humidity: number;
    scale: "CELSIUS" | "FAHRENHEIT";
    temperature: number;
}
+meterProWebhookContext | node-switchbot

Type Alias meterProWebhookContext

meterProWebhookContext: deviceWebhookContext & {
    humidity: number;
    scale: "CELSIUS" | "FAHRENHEIT";
    temperature: number;
}
diff --git a/docs/types/meterServiceData.html b/docs/types/meterServiceData.html index 1bfd4030..fcfb10ca 100644 --- a/docs/types/meterServiceData.html +++ b/docs/types/meterServiceData.html @@ -1 +1 @@ -meterServiceData | node-switchbot

Type Alias meterServiceData

meterServiceData: serviceData & {
    battery: number;
    celsius: number;
    fahrenheit: number;
    fahrenheit_mode: boolean;
    humidity: number;
    model: Meter;
    modelFriendlyName: Meter;
    modelName: Meter;
}
+meterServiceData | node-switchbot

Type Alias meterServiceData

meterServiceData: serviceData & {
    battery: number;
    celsius: number;
    fahrenheit: number;
    fahrenheit_mode: boolean;
    humidity: number;
    model: Meter;
    modelFriendlyName: Meter;
    modelName: Meter;
}
diff --git a/docs/types/meterStatus.html b/docs/types/meterStatus.html index 8518699d..ce2159d0 100644 --- a/docs/types/meterStatus.html +++ b/docs/types/meterStatus.html @@ -1 +1 @@ -meterStatus | node-switchbot

Type Alias meterStatus

meterStatus: deviceStatus & {
    battery: number;
    humidity: number;
    temperature: number;
}
+meterStatus | node-switchbot

Type Alias meterStatus

meterStatus: deviceStatus & {
    battery: number;
    humidity: number;
    temperature: number;
}
diff --git a/docs/types/meterWebhookContext.html b/docs/types/meterWebhookContext.html index 25296734..d4288abc 100644 --- a/docs/types/meterWebhookContext.html +++ b/docs/types/meterWebhookContext.html @@ -1 +1 @@ -meterWebhookContext | node-switchbot

Type Alias meterWebhookContext

meterWebhookContext: deviceWebhookContext & {
    humidity: number;
    scale: "CELSIUS" | "FAHRENHEIT";
    temperature: number;
}
+meterWebhookContext | node-switchbot

Type Alias meterWebhookContext

meterWebhookContext: deviceWebhookContext & {
    humidity: number;
    scale: "CELSIUS" | "FAHRENHEIT";
    temperature: number;
}
diff --git a/docs/types/motionSensor.html b/docs/types/motionSensor.html index 09654f51..f9697342 100644 --- a/docs/types/motionSensor.html +++ b/docs/types/motionSensor.html @@ -1 +1 @@ -motionSensor | node-switchbot

Type Alias motionSensor

motionSensor: device & {}
+motionSensor | node-switchbot

Type Alias motionSensor

motionSensor: device & {}
diff --git a/docs/types/motionSensorServiceData.html b/docs/types/motionSensorServiceData.html index d2b182d7..b4bc7960 100644 --- a/docs/types/motionSensorServiceData.html +++ b/docs/types/motionSensorServiceData.html @@ -1 +1 @@ -motionSensorServiceData | node-switchbot

Type Alias motionSensorServiceData

motionSensorServiceData: serviceData & {
    battery: number;
    iot: number;
    is_light: boolean;
    led: number;
    lightLevel: string;
    model: MotionSensor;
    modelFriendlyName: MotionSensor;
    modelName: MotionSensor;
    movement: boolean;
    sense_distance: number;
    tested: boolean;
}
+motionSensorServiceData | node-switchbot

Type Alias motionSensorServiceData

motionSensorServiceData: serviceData & {
    battery: number;
    iot: number;
    is_light: boolean;
    led: number;
    lightLevel: string;
    model: MotionSensor;
    modelFriendlyName: MotionSensor;
    modelName: MotionSensor;
    movement: boolean;
    sense_distance: number;
    tested: boolean;
}
diff --git a/docs/types/motionSensorStatus.html b/docs/types/motionSensorStatus.html index e85bd680..7b15dbd1 100644 --- a/docs/types/motionSensorStatus.html +++ b/docs/types/motionSensorStatus.html @@ -1 +1 @@ -motionSensorStatus | node-switchbot

Type Alias motionSensorStatus

motionSensorStatus: deviceStatus & {
    battery: number;
    brightness: "bright" | "dim";
    moveDetected: boolean;
}
+motionSensorStatus | node-switchbot

Type Alias motionSensorStatus

motionSensorStatus: deviceStatus & {
    battery: number;
    brightness: "bright" | "dim";
    moveDetected: boolean;
}
diff --git a/docs/types/motionSensorWebhookContext.html b/docs/types/motionSensorWebhookContext.html index 0dbdd1c1..bd84b8e4 100644 --- a/docs/types/motionSensorWebhookContext.html +++ b/docs/types/motionSensorWebhookContext.html @@ -1 +1 @@ -motionSensorWebhookContext | node-switchbot

Type Alias motionSensorWebhookContext

motionSensorWebhookContext: deviceWebhookContext & {
    detectionState: "NOT_DETECTED" | "DETECTED";
}
+motionSensorWebhookContext | node-switchbot

Type Alias motionSensorWebhookContext

motionSensorWebhookContext: deviceWebhookContext & {
    detectionState: "NOT_DETECTED" | "DETECTED";
}
diff --git a/docs/types/onadvertisement.html b/docs/types/onadvertisement.html index 5521db22..5f678fba 100644 --- a/docs/types/onadvertisement.html +++ b/docs/types/onadvertisement.html @@ -1 +1 @@ -onadvertisement | node-switchbot

Type Alias onadvertisement

onadvertisement: (ad: ad) => Promise<void> | void
+onadvertisement | node-switchbot

Type Alias onadvertisement

onadvertisement: (ad: ad) => Promise<void> | void

Type declaration

    • (ad: ad): Promise<void> | void
    • Parameters

      Returns Promise<void> | void

diff --git a/docs/types/ondiscover.html b/docs/types/ondiscover.html index 491219a8..8d7635e1 100644 --- a/docs/types/ondiscover.html +++ b/docs/types/ondiscover.html @@ -1 +1 @@ -ondiscover | node-switchbot

Type Alias ondiscover

ondiscover: (device: SwitchbotDevice) => Promise<void> | void
+ondiscover | node-switchbot

Type Alias ondiscover

ondiscover: (device: SwitchbotDevice) => Promise<void> | void

Type declaration

diff --git a/docs/types/outdoorMeter.html b/docs/types/outdoorMeter.html index d4db35e5..13786f5a 100644 --- a/docs/types/outdoorMeter.html +++ b/docs/types/outdoorMeter.html @@ -1 +1 @@ -outdoorMeter | node-switchbot

Type Alias outdoorMeter

outdoorMeter: device & {}
+outdoorMeter | node-switchbot

Type Alias outdoorMeter

outdoorMeter: device & {}
diff --git a/docs/types/outdoorMeterServiceData.html b/docs/types/outdoorMeterServiceData.html index fa7219b6..f28d107c 100644 --- a/docs/types/outdoorMeterServiceData.html +++ b/docs/types/outdoorMeterServiceData.html @@ -1 +1 @@ -outdoorMeterServiceData | node-switchbot

Type Alias outdoorMeterServiceData

outdoorMeterServiceData: serviceData & {
    battery: number;
    celsius: number;
    fahrenheit: number;
    fahrenheit_mode: boolean;
    humidity: number;
    model: OutdoorMeter;
    modelFriendlyName: OutdoorMeter;
    modelName: OutdoorMeter;
}
+outdoorMeterServiceData | node-switchbot

Type Alias outdoorMeterServiceData

outdoorMeterServiceData: serviceData & {
    battery: number;
    celsius: number;
    fahrenheit: number;
    fahrenheit_mode: boolean;
    humidity: number;
    model: OutdoorMeter;
    modelFriendlyName: OutdoorMeter;
    modelName: OutdoorMeter;
}
diff --git a/docs/types/outdoorMeterStatus.html b/docs/types/outdoorMeterStatus.html index bf31c710..5e23d395 100644 --- a/docs/types/outdoorMeterStatus.html +++ b/docs/types/outdoorMeterStatus.html @@ -1 +1 @@ -outdoorMeterStatus | node-switchbot

Type Alias outdoorMeterStatus

outdoorMeterStatus: deviceStatus & {
    battery: number;
    humidity: number;
    temperature: number;
}
+outdoorMeterStatus | node-switchbot

Type Alias outdoorMeterStatus

outdoorMeterStatus: deviceStatus & {
    battery: number;
    humidity: number;
    temperature: number;
}
diff --git a/docs/types/outdoorMeterWebhookContext.html b/docs/types/outdoorMeterWebhookContext.html index 8e86153e..69f22669 100644 --- a/docs/types/outdoorMeterWebhookContext.html +++ b/docs/types/outdoorMeterWebhookContext.html @@ -1 +1 @@ -outdoorMeterWebhookContext | node-switchbot

Type Alias outdoorMeterWebhookContext

outdoorMeterWebhookContext: deviceWebhookContext & {
    humidity: number;
    scale: "CELSIUS" | "FAHRENHEIT";
    temperature: number;
}
+outdoorMeterWebhookContext | node-switchbot

Type Alias outdoorMeterWebhookContext

outdoorMeterWebhookContext: deviceWebhookContext & {
    humidity: number;
    scale: "CELSIUS" | "FAHRENHEIT";
    temperature: number;
}
diff --git a/docs/types/panTiltCamWebhookContext.html b/docs/types/panTiltCamWebhookContext.html index 5b121ed0..d3ca7e7f 100644 --- a/docs/types/panTiltCamWebhookContext.html +++ b/docs/types/panTiltCamWebhookContext.html @@ -1 +1 @@ -panTiltCamWebhookContext | node-switchbot

Type Alias panTiltCamWebhookContext

panTiltCamWebhookContext: deviceWebhookContext & { detectionState: "DETECTED" }
+panTiltCamWebhookContext | node-switchbot

Type Alias panTiltCamWebhookContext

panTiltCamWebhookContext: deviceWebhookContext & { detectionState: "DETECTED" }
diff --git a/docs/types/pantiltCam.html b/docs/types/pantiltCam.html index 2f46b3eb..657d6a0b 100644 --- a/docs/types/pantiltCam.html +++ b/docs/types/pantiltCam.html @@ -1 +1 @@ -pantiltCam | node-switchbot

Type Alias pantiltCam

pantiltCam: device & {}
+pantiltCam | node-switchbot

Type Alias pantiltCam

pantiltCam: device & {}
diff --git a/docs/types/pantiltCam2k.html b/docs/types/pantiltCam2k.html index 4ce3ae23..fed1fede 100644 --- a/docs/types/pantiltCam2k.html +++ b/docs/types/pantiltCam2k.html @@ -1 +1 @@ -pantiltCam2k | node-switchbot

Type Alias pantiltCam2k

pantiltCam2k: device & {}
+pantiltCam2k | node-switchbot

Type Alias pantiltCam2k

pantiltCam2k: device & {}
diff --git a/docs/types/plug.html b/docs/types/plug.html index 4d224fca..10d348ba 100644 --- a/docs/types/plug.html +++ b/docs/types/plug.html @@ -1 +1 @@ -plug | node-switchbot

Type Alias plug

plug: device & {}
+plug | node-switchbot

Type Alias plug

plug: device & {}
diff --git a/docs/types/plugMini.html b/docs/types/plugMini.html index d5179521..54a42c47 100644 --- a/docs/types/plugMini.html +++ b/docs/types/plugMini.html @@ -1 +1 @@ -plugMini | node-switchbot

Type Alias plugMini

plugMini: device & {}
+plugMini | node-switchbot

Type Alias plugMini

plugMini: device & {}
diff --git a/docs/types/plugMiniJPServiceData.html b/docs/types/plugMiniJPServiceData.html index b0604a4a..02898bd0 100644 --- a/docs/types/plugMiniJPServiceData.html +++ b/docs/types/plugMiniJPServiceData.html @@ -1 +1 @@ -plugMiniJPServiceData | node-switchbot

Type Alias plugMiniJPServiceData

plugMiniJPServiceData: serviceData & {
    currentPower: number;
    delay: boolean;
    model: PlugMiniJP;
    modelFriendlyName: PlugMini;
    modelName: PlugMini;
    overload: boolean;
    state: string;
    syncUtcTime: boolean;
    timer: boolean;
    wifiRssi: number;
}
+plugMiniJPServiceData | node-switchbot

Type Alias plugMiniJPServiceData

plugMiniJPServiceData: serviceData & {
    currentPower: number;
    delay: boolean;
    model: PlugMiniJP;
    modelFriendlyName: PlugMini;
    modelName: PlugMini;
    overload: boolean;
    state: string;
    syncUtcTime: boolean;
    timer: boolean;
    wifiRssi: number;
}
diff --git a/docs/types/plugMiniJPWebhookContext.html b/docs/types/plugMiniJPWebhookContext.html index d4346f7d..a2e40773 100644 --- a/docs/types/plugMiniJPWebhookContext.html +++ b/docs/types/plugMiniJPWebhookContext.html @@ -1 +1 @@ -plugMiniJPWebhookContext | node-switchbot

Type Alias plugMiniJPWebhookContext

plugMiniJPWebhookContext: deviceWebhookContext & { powerState: "ON" | "OFF" }
+plugMiniJPWebhookContext | node-switchbot

Type Alias plugMiniJPWebhookContext

plugMiniJPWebhookContext: deviceWebhookContext & { powerState: "ON" | "OFF" }
diff --git a/docs/types/plugMiniStatus.html b/docs/types/plugMiniStatus.html index e80aad49..ac603810 100644 --- a/docs/types/plugMiniStatus.html +++ b/docs/types/plugMiniStatus.html @@ -1 +1 @@ -plugMiniStatus | node-switchbot

Type Alias plugMiniStatus

plugMiniStatus: deviceStatus & {
    electricCurrent: Float64Array;
    electricityOfDay: number;
    power: string;
    voltage: Float64Array;
    weight: Float64Array;
}
+plugMiniStatus | node-switchbot

Type Alias plugMiniStatus

plugMiniStatus: deviceStatus & {
    electricCurrent: Float64Array;
    electricityOfDay: number;
    power: string;
    voltage: Float64Array;
    weight: Float64Array;
}
diff --git a/docs/types/plugMiniUSServiceData.html b/docs/types/plugMiniUSServiceData.html index be31514a..be1115ed 100644 --- a/docs/types/plugMiniUSServiceData.html +++ b/docs/types/plugMiniUSServiceData.html @@ -1 +1 @@ -plugMiniUSServiceData | node-switchbot

Type Alias plugMiniUSServiceData

plugMiniUSServiceData: serviceData & {
    currentPower: number;
    delay: boolean;
    model: PlugMiniUS;
    modelFriendlyName: PlugMini;
    modelName: PlugMini;
    overload: boolean;
    state: string;
    syncUtcTime: boolean;
    timer: boolean;
    wifiRssi: number;
}
+plugMiniUSServiceData | node-switchbot

Type Alias plugMiniUSServiceData

plugMiniUSServiceData: serviceData & {
    currentPower: number;
    delay: boolean;
    model: PlugMiniUS;
    modelFriendlyName: PlugMini;
    modelName: PlugMini;
    overload: boolean;
    state: string;
    syncUtcTime: boolean;
    timer: boolean;
    wifiRssi: number;
}
diff --git a/docs/types/plugMiniUSWebhookContext.html b/docs/types/plugMiniUSWebhookContext.html index dcf8414b..14a860ca 100644 --- a/docs/types/plugMiniUSWebhookContext.html +++ b/docs/types/plugMiniUSWebhookContext.html @@ -1 +1 @@ -plugMiniUSWebhookContext | node-switchbot

Type Alias plugMiniUSWebhookContext

plugMiniUSWebhookContext: deviceWebhookContext & { powerState: "ON" | "OFF" }
+plugMiniUSWebhookContext | node-switchbot

Type Alias plugMiniUSWebhookContext

plugMiniUSWebhookContext: deviceWebhookContext & { powerState: "ON" | "OFF" }
diff --git a/docs/types/plugStatus.html b/docs/types/plugStatus.html index 5fdafcc5..e8614b9f 100644 --- a/docs/types/plugStatus.html +++ b/docs/types/plugStatus.html @@ -1 +1 @@ -plugStatus | node-switchbot

Type Alias plugStatus

plugStatus: deviceStatus & { power: string; version: string }
+plugStatus | node-switchbot

Type Alias plugStatus

plugStatus: deviceStatus & { power: string; version: string }
diff --git a/docs/types/plugWebhookContext.html b/docs/types/plugWebhookContext.html index 582db979..2b0dc8f0 100644 --- a/docs/types/plugWebhookContext.html +++ b/docs/types/plugWebhookContext.html @@ -1 +1 @@ -plugWebhookContext | node-switchbot

Type Alias plugWebhookContext

plugWebhookContext: deviceWebhookContext & { powerState: "ON" | "OFF" }
+plugWebhookContext | node-switchbot

Type Alias plugWebhookContext

plugWebhookContext: deviceWebhookContext & { powerState: "ON" | "OFF" }
diff --git a/docs/types/relaySwitch1PMServiceData.html b/docs/types/relaySwitch1PMServiceData.html index b6b8652b..4a76ee2e 100644 --- a/docs/types/relaySwitch1PMServiceData.html +++ b/docs/types/relaySwitch1PMServiceData.html @@ -1 +1 @@ -relaySwitch1PMServiceData | node-switchbot

Type Alias relaySwitch1PMServiceData

relaySwitch1PMServiceData: serviceData & {
    current: number;
    mode: boolean;
    model: RelaySwitch1PM;
    modelFriendlyName: RelaySwitch1PM;
    modelName: RelaySwitch1PM;
    power: number;
    sequence_number: number;
    state: boolean;
    voltage: number;
}
+relaySwitch1PMServiceData | node-switchbot

Type Alias relaySwitch1PMServiceData

relaySwitch1PMServiceData: serviceData & {
    current: number;
    mode: boolean;
    model: RelaySwitch1PM;
    modelFriendlyName: RelaySwitch1PM;
    modelName: RelaySwitch1PM;
    power: number;
    sequence_number: number;
    state: boolean;
    voltage: number;
}
diff --git a/docs/types/relaySwitch1PlusServiceData.html b/docs/types/relaySwitch1PlusServiceData.html deleted file mode 100644 index ed7d4040..00000000 --- a/docs/types/relaySwitch1PlusServiceData.html +++ /dev/null @@ -1 +0,0 @@ -relaySwitch1PlusServiceData | node-switchbot

Type Alias relaySwitch1PlusServiceData

relaySwitch1PlusServiceData: serviceData & {
    mode: boolean;
    model: RelaySwitch1Plus;
    modelFriendlyName: RelaySwitch1Plus;
    modelName: RelaySwitch1Plus;
    sequence_number: number;
    state: boolean;
}
diff --git a/docs/types/relaySwitch1ServiceData.html b/docs/types/relaySwitch1ServiceData.html new file mode 100644 index 00000000..1a6bc94b --- /dev/null +++ b/docs/types/relaySwitch1ServiceData.html @@ -0,0 +1 @@ +relaySwitch1ServiceData | node-switchbot

Type Alias relaySwitch1ServiceData

relaySwitch1ServiceData: serviceData & {
    mode: boolean;
    model: RelaySwitch1;
    modelFriendlyName: RelaySwitch1;
    modelName: RelaySwitch1;
    sequence_number: number;
    state: boolean;
}
diff --git a/docs/types/remote.html b/docs/types/remote.html index d3586d4b..4f8229ab 100644 --- a/docs/types/remote.html +++ b/docs/types/remote.html @@ -1 +1 @@ -remote | node-switchbot

Type Alias remote

remote: device & {}
+remote | node-switchbot

Type Alias remote

remote: device & {}
diff --git a/docs/types/robotVacuumCleanerS1.html b/docs/types/robotVacuumCleanerS1.html index e09866ff..0c11e80a 100644 --- a/docs/types/robotVacuumCleanerS1.html +++ b/docs/types/robotVacuumCleanerS1.html @@ -1 +1 @@ -robotVacuumCleanerS1 | node-switchbot

Type Alias robotVacuumCleanerS1

robotVacuumCleanerS1: device & {}
+robotVacuumCleanerS1 | node-switchbot

Type Alias robotVacuumCleanerS1

robotVacuumCleanerS1: device & {}
diff --git a/docs/types/robotVacuumCleanerS1Plus.html b/docs/types/robotVacuumCleanerS1Plus.html index 22552154..eac97375 100644 --- a/docs/types/robotVacuumCleanerS1Plus.html +++ b/docs/types/robotVacuumCleanerS1Plus.html @@ -1 +1 @@ -robotVacuumCleanerS1Plus | node-switchbot

Type Alias robotVacuumCleanerS1Plus

robotVacuumCleanerS1Plus: device & {}
+robotVacuumCleanerS1Plus | node-switchbot

Type Alias robotVacuumCleanerS1Plus

robotVacuumCleanerS1Plus: device & {}
diff --git a/docs/types/robotVacuumCleanerS1PlusStatus.html b/docs/types/robotVacuumCleanerS1PlusStatus.html index 5e1ffe13..0588cfd2 100644 --- a/docs/types/robotVacuumCleanerS1PlusStatus.html +++ b/docs/types/robotVacuumCleanerS1PlusStatus.html @@ -1 +1 @@ -robotVacuumCleanerS1PlusStatus | node-switchbot

Type Alias robotVacuumCleanerS1PlusStatus

robotVacuumCleanerS1PlusStatus: deviceStatus & {
    battery: number;
    onlineStatus: string;
    workingStatus: string;
}
+robotVacuumCleanerS1PlusStatus | node-switchbot

Type Alias robotVacuumCleanerS1PlusStatus

robotVacuumCleanerS1PlusStatus: deviceStatus & {
    battery: number;
    onlineStatus: string;
    workingStatus: string;
}
diff --git a/docs/types/robotVacuumCleanerS1PlusWebhookContext.html b/docs/types/robotVacuumCleanerS1PlusWebhookContext.html index 50bc50eb..58eaedbe 100644 --- a/docs/types/robotVacuumCleanerS1PlusWebhookContext.html +++ b/docs/types/robotVacuumCleanerS1PlusWebhookContext.html @@ -1 +1 @@ -robotVacuumCleanerS1PlusWebhookContext | node-switchbot

Type Alias robotVacuumCleanerS1PlusWebhookContext

robotVacuumCleanerS1PlusWebhookContext: deviceWebhookContext & {
    battery: number;
    onlineStatus: "online" | "offline";
    workingStatus:
        | "Standby"
        | "Clearing"
        | "Paused"
        | "GotoChargeBase"
        | "Charging"
        | "ChargeDone"
        | "Dormant"
        | "InTrouble"
        | "InRemoteControl"
        | "InDustCollecting";
}
+robotVacuumCleanerS1PlusWebhookContext | node-switchbot

Type Alias robotVacuumCleanerS1PlusWebhookContext

robotVacuumCleanerS1PlusWebhookContext: deviceWebhookContext & {
    battery: number;
    onlineStatus: "online" | "offline";
    workingStatus:
        | "Standby"
        | "Clearing"
        | "Paused"
        | "GotoChargeBase"
        | "Charging"
        | "ChargeDone"
        | "Dormant"
        | "InTrouble"
        | "InRemoteControl"
        | "InDustCollecting";
}
diff --git a/docs/types/robotVacuumCleanerS1Status.html b/docs/types/robotVacuumCleanerS1Status.html index f6e51f68..eeeb36bb 100644 --- a/docs/types/robotVacuumCleanerS1Status.html +++ b/docs/types/robotVacuumCleanerS1Status.html @@ -1 +1 @@ -robotVacuumCleanerS1Status | node-switchbot

Type Alias robotVacuumCleanerS1Status

robotVacuumCleanerS1Status: deviceStatus & {
    battery: number;
    onlineStatus: string;
    workingStatus: string;
}
+robotVacuumCleanerS1Status | node-switchbot

Type Alias robotVacuumCleanerS1Status

robotVacuumCleanerS1Status: deviceStatus & {
    battery: number;
    onlineStatus: string;
    workingStatus: string;
}
diff --git a/docs/types/robotVacuumCleanerS1WebhookContext.html b/docs/types/robotVacuumCleanerS1WebhookContext.html index 2f5dc206..6a83c969 100644 --- a/docs/types/robotVacuumCleanerS1WebhookContext.html +++ b/docs/types/robotVacuumCleanerS1WebhookContext.html @@ -1 +1 @@ -robotVacuumCleanerS1WebhookContext | node-switchbot

Type Alias robotVacuumCleanerS1WebhookContext

robotVacuumCleanerS1WebhookContext: deviceWebhookContext & {
    battery: number;
    onlineStatus: "online" | "offline";
    workingStatus:
        | "Standby"
        | "Clearing"
        | "Paused"
        | "GotoChargeBase"
        | "Charging"
        | "ChargeDone"
        | "Dormant"
        | "InTrouble"
        | "InRemoteControl"
        | "InDustCollecting";
}
+robotVacuumCleanerS1WebhookContext | node-switchbot

Type Alias robotVacuumCleanerS1WebhookContext

robotVacuumCleanerS1WebhookContext: deviceWebhookContext & {
    battery: number;
    onlineStatus: "online" | "offline";
    workingStatus:
        | "Standby"
        | "Clearing"
        | "Paused"
        | "GotoChargeBase"
        | "Charging"
        | "ChargeDone"
        | "Dormant"
        | "InTrouble"
        | "InRemoteControl"
        | "InDustCollecting";
}
diff --git a/docs/types/robotVacuumCleanerServiceData.html b/docs/types/robotVacuumCleanerServiceData.html index e36a2ac3..27a51dea 100644 --- a/docs/types/robotVacuumCleanerServiceData.html +++ b/docs/types/robotVacuumCleanerServiceData.html @@ -1 +1 @@ -robotVacuumCleanerServiceData | node-switchbot

Type Alias robotVacuumCleanerServiceData

robotVacuumCleanerServiceData: serviceData & {
    battery: number;
    model: Unknown;
    modelFriendlyName: Unknown;
    modelName: Unknown;
    state: string;
}
+robotVacuumCleanerServiceData | node-switchbot

Type Alias robotVacuumCleanerServiceData

robotVacuumCleanerServiceData: serviceData & {
    battery: number;
    model: Unknown;
    modelFriendlyName: Unknown;
    modelName: Unknown;
    state: string;
}
diff --git a/docs/types/stripLight.html b/docs/types/stripLight.html index da49899b..9426f9cf 100644 --- a/docs/types/stripLight.html +++ b/docs/types/stripLight.html @@ -1 +1 @@ -stripLight | node-switchbot

Type Alias stripLight

stripLight: device & {}
+stripLight | node-switchbot

Type Alias stripLight

stripLight: device & {}
diff --git a/docs/types/stripLightServiceData.html b/docs/types/stripLightServiceData.html index 629e9ecd..6fe1eef1 100644 --- a/docs/types/stripLightServiceData.html +++ b/docs/types/stripLightServiceData.html @@ -1 +1 @@ -stripLightServiceData | node-switchbot

Type Alias stripLightServiceData

stripLightServiceData: serviceData & {
    blue: number;
    brightness: number;
    color_mode: number;
    delay: number;
    green: number;
    loop_index: number;
    model: StripLight;
    modelFriendlyName: StripLight;
    modelName: StripLight;
    power: boolean;
    preset: number;
    red: number;
    speed: number;
    state: boolean;
}
+stripLightServiceData | node-switchbot

Type Alias stripLightServiceData

stripLightServiceData: serviceData & {
    blue: number;
    brightness: number;
    color_mode: number;
    delay: number;
    green: number;
    loop_index: number;
    model: StripLight;
    modelFriendlyName: StripLight;
    modelName: StripLight;
    power: boolean;
    preset: number;
    red: number;
    speed: number;
    state: boolean;
}
diff --git a/docs/types/stripLightStatus.html b/docs/types/stripLightStatus.html index 2dc53d63..6b3bad93 100644 --- a/docs/types/stripLightStatus.html +++ b/docs/types/stripLightStatus.html @@ -1 +1 @@ -stripLightStatus | node-switchbot

Type Alias stripLightStatus

stripLightStatus: deviceStatus & {
    brightness: number;
    color: string;
    power: string;
}
+stripLightStatus | node-switchbot

Type Alias stripLightStatus

stripLightStatus: deviceStatus & {
    brightness: number;
    color: string;
    power: string;
}
diff --git a/docs/types/stripLightWebhookContext.html b/docs/types/stripLightWebhookContext.html index a9807812..8dbb6b1a 100644 --- a/docs/types/stripLightWebhookContext.html +++ b/docs/types/stripLightWebhookContext.html @@ -1 +1 @@ -stripLightWebhookContext | node-switchbot

Type Alias stripLightWebhookContext

stripLightWebhookContext: deviceWebhookContext & {
    brightness: number;
    color: string;
    powerState: "ON" | "OFF";
}
+stripLightWebhookContext | node-switchbot

Type Alias stripLightWebhookContext

stripLightWebhookContext: deviceWebhookContext & {
    brightness: number;
    color: string;
    powerState: "ON" | "OFF";
}
diff --git a/docs/types/waterLeakDetector.html b/docs/types/waterLeakDetector.html index 31b3eec2..063d4371 100644 --- a/docs/types/waterLeakDetector.html +++ b/docs/types/waterLeakDetector.html @@ -1 +1 @@ -waterLeakDetector | node-switchbot

Type Alias waterLeakDetector

waterLeakDetector: device & {}
+waterLeakDetector | node-switchbot

Type Alias waterLeakDetector

waterLeakDetector: device & {}
diff --git a/docs/types/waterLeakDetectorServiceData.html b/docs/types/waterLeakDetectorServiceData.html index daeead46..b9bc9658 100644 --- a/docs/types/waterLeakDetectorServiceData.html +++ b/docs/types/waterLeakDetectorServiceData.html @@ -1 +1 @@ -waterLeakDetectorServiceData | node-switchbot

Type Alias waterLeakDetectorServiceData

waterLeakDetectorServiceData: serviceData & {
    battery: number;
    leak: boolean;
    low_battery: boolean;
    model: Leak;
    modelFriendlyName: Leak;
    modelName: Leak;
    tampered: boolean;
}
+waterLeakDetectorServiceData | node-switchbot

Type Alias waterLeakDetectorServiceData

waterLeakDetectorServiceData: serviceData & {
    battery: number;
    leak: boolean;
    low_battery: boolean;
    model: Leak;
    modelFriendlyName: Leak;
    modelName: Leak;
    tampered: boolean;
}
diff --git a/docs/types/waterLeakDetectorStatus.html b/docs/types/waterLeakDetectorStatus.html index 6306efed..d912096a 100644 --- a/docs/types/waterLeakDetectorStatus.html +++ b/docs/types/waterLeakDetectorStatus.html @@ -1 +1 @@ -waterLeakDetectorStatus | node-switchbot

Type Alias waterLeakDetectorStatus

waterLeakDetectorStatus: deviceStatus & { battery: number; status: 0 | 1 }
+waterLeakDetectorStatus | node-switchbot

Type Alias waterLeakDetectorStatus

waterLeakDetectorStatus: deviceStatus & { battery: number; status: 0 | 1 }
diff --git a/docs/types/waterLeakDetectorWebhookContext.html b/docs/types/waterLeakDetectorWebhookContext.html index aab4c3ad..0a71029a 100644 --- a/docs/types/waterLeakDetectorWebhookContext.html +++ b/docs/types/waterLeakDetectorWebhookContext.html @@ -1 +1 @@ -waterLeakDetectorWebhookContext | node-switchbot

Type Alias waterLeakDetectorWebhookContext

waterLeakDetectorWebhookContext: deviceWebhookContext & {
    battery: number;
    detectionState: 0 | 1;
}
+waterLeakDetectorWebhookContext | node-switchbot

Type Alias waterLeakDetectorWebhookContext

waterLeakDetectorWebhookContext: deviceWebhookContext & {
    battery: number;
    detectionState: 0 | 1;
}
diff --git a/package-lock.json b/package-lock.json index aa585731..e6f988a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,46 +1,46 @@ { "name": "node-switchbot", - "version": "3.4.1", + "version": "3.4.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "node-switchbot", - "version": "3.4.1", + "version": "3.4.2", "license": "MIT", "dependencies": { - "@stoprocent/noble": "^1.15.1", + "@stoprocent/noble": "^1.16.1", "async-mutex": "^0.5.0", - "undici": "^7.0.0" + "undici": "^7.2.0" }, "devDependencies": { - "@antfu/eslint-config": "^3.11.0", + "@antfu/eslint-config": "^3.12.0", "@types/aes-js": "^3.1.4", "@types/debug": "^4.1.12", "@types/fs-extra": "^11.0.4", "@types/jest": "^29.5.14", "@types/mdast": "^4.0.4", - "@types/node": "^22.10.0", + "@types/node": "^22.10.2", "@types/semver": "^7.5.8", "@types/sinon": "^17.0.3", "@types/source-map-support": "^0.5.10", - "@vitest/coverage-v8": "^2.1.6", - "eslint": "^9.15.0", - "eslint-plugin-format": "^0.1.2", + "@vitest/coverage-v8": "^2.1.8", + "eslint": "^9.17.0", + "eslint-plugin-format": "^0.1.3", "jest": "^29.7.0", - "nodemon": "^3.1.7", + "nodemon": "^3.1.9", "shx": "^0.3.4", "sinon": "^19.0.2", "ts-node": "^10.9.2", - "typedoc": "^0.27.1", + "typedoc": "^0.27.5", "typescript": "^5.7.2", - "vitest": "^2.1.5" + "vitest": "^2.1.8" }, "engines": { "node": "^20 || ^22" }, "optionalDependencies": { - "@stoprocent/bluetooth-hci-socket": "^1.4.1" + "@stoprocent/bluetooth-hci-socket": "^1.4.2" } }, "node_modules/@ampproject/remapping": { @@ -58,9 +58,9 @@ } }, "node_modules/@antfu/eslint-config": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-3.11.0.tgz", - "integrity": "sha512-yJ8xkY7qtSoZpTOEOo3gMRsiYYvhNXHaWWh1APN0brDZsmRSjSPJBxMgq+JG+6hjeToJh9koZQxzDiwCbmirEg==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-3.12.0.tgz", + "integrity": "sha512-dMHomZZXufEpjKElh7dcfBKu+qFGz9NOACGaqNNAmr9XHe5JQe/6oNNdP3YGeyXSPR/V37IXFvxM0P76WHv1IA==", "dev": true, "license": "MIT", "dependencies": { @@ -68,29 +68,29 @@ "@clack/prompts": "^0.8.2", "@eslint-community/eslint-plugin-eslint-comments": "^4.4.1", "@eslint/markdown": "^6.2.1", - "@stylistic/eslint-plugin": "^2.11.0", - "@typescript-eslint/eslint-plugin": "^8.16.0", - "@typescript-eslint/parser": "^8.16.0", - "@vitest/eslint-plugin": "^1.1.11", + "@stylistic/eslint-plugin": "^2.12.1", + "@typescript-eslint/eslint-plugin": "^8.18.0", + "@typescript-eslint/parser": "^8.18.0", + "@vitest/eslint-plugin": "^1.1.16", "eslint-config-flat-gitignore": "^0.3.0", "eslint-flat-config-utils": "^0.4.0", "eslint-merge-processors": "^0.1.0", "eslint-plugin-antfu": "^2.7.0", "eslint-plugin-command": "^0.2.6", - "eslint-plugin-import-x": "^4.4.3", - "eslint-plugin-jsdoc": "^50.6.0", + "eslint-plugin-import-x": "^4.5.0", + "eslint-plugin-jsdoc": "^50.6.1", "eslint-plugin-jsonc": "^2.18.2", - "eslint-plugin-n": "^17.14.0", + "eslint-plugin-n": "^17.15.0", "eslint-plugin-no-only-tests": "^3.3.0", - "eslint-plugin-perfectionist": "^4.1.2", + "eslint-plugin-perfectionist": "^4.3.0", "eslint-plugin-regexp": "^2.7.0", - "eslint-plugin-toml": "^0.11.1", + "eslint-plugin-toml": "^0.12.0", "eslint-plugin-unicorn": "^56.0.1", "eslint-plugin-unused-imports": "^4.1.4", - "eslint-plugin-vue": "^9.31.0", - "eslint-plugin-yml": "^1.15.0", + "eslint-plugin-vue": "^9.32.0", + "eslint-plugin-yml": "^1.16.0", "eslint-processor-vue-blocks": "^0.1.2", - "globals": "^15.12.0", + "globals": "^15.13.0", "jsonc-eslint-parser": "^2.4.0", "local-pkg": "^0.5.1", "parse-gitignore": "^2.0.0", @@ -107,7 +107,7 @@ "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "@eslint-react/eslint-plugin": "^1.5.8", + "@eslint-react/eslint-plugin": "^1.19.0", "@prettier/plugin-xml": "^3.4.1", "@unocss/eslint-plugin": ">=0.50.0", "astro-eslint-parser": "^1.0.2", @@ -164,6 +164,19 @@ } } }, + "node_modules/@antfu/eslint-config/node_modules/globals": { + "version": "15.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz", + "integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@antfu/install-pkg": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.5.0.tgz", @@ -788,9 +801,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -801,13 +814,13 @@ "aix" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -818,13 +831,13 @@ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -835,13 +848,13 @@ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -852,13 +865,13 @@ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -869,13 +882,13 @@ "darwin" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -886,13 +899,13 @@ "darwin" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -903,13 +916,13 @@ "freebsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -920,13 +933,13 @@ "freebsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -937,13 +950,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -954,13 +967,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -971,13 +984,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -988,13 +1001,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -1005,13 +1018,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -1022,13 +1035,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -1039,13 +1052,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -1056,13 +1069,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -1073,13 +1086,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -1090,30 +1103,13 @@ "netbsd" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -1124,13 +1120,13 @@ "openbsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -1141,13 +1137,13 @@ "sunos" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -1158,13 +1154,13 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -1175,13 +1171,13 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -1192,7 +1188,7 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@eslint-community/eslint-plugin-eslint-comments": { @@ -1386,9 +1382,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.15.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", - "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz", + "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==", "dev": true, "license": "MIT", "engines": { @@ -1435,14 +1431,14 @@ } }, "node_modules/@gerrit0/mini-shiki": { - "version": "1.23.2", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-1.23.2.tgz", - "integrity": "sha512-6e/41ZAilc2iE4n0bxxMSvzrt1dy2MSa9lSdd2M5lcTDlrzcau+FucIEDrG+xF1dPou/a093tm1t4HPTSI4g1w==", + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-1.24.1.tgz", + "integrity": "sha512-PNP/Gjv3VqU7z7DjRgO3F9Ok5frTKqtpV+LJW1RzMcr2zpRk0ulhEWnbcNGXzPC7BZyWMIHrkfQX2GZRfxrn6Q==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/engine-oniguruma": "^1.23.1", - "@shikijs/types": "^1.23.1", + "@shikijs/engine-oniguruma": "^1.24.0", + "@shikijs/types": "^1.24.0", "@shikijs/vscode-textmate": "^9.3.0" } }, @@ -2171,9 +2167,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz", - "integrity": "sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.0.tgz", + "integrity": "sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ==", "cpu": [ "arm" ], @@ -2185,9 +2181,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz", - "integrity": "sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.0.tgz", + "integrity": "sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==", "cpu": [ "arm64" ], @@ -2199,9 +2195,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz", - "integrity": "sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.0.tgz", + "integrity": "sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==", "cpu": [ "arm64" ], @@ -2213,9 +2209,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz", - "integrity": "sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.0.tgz", + "integrity": "sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==", "cpu": [ "x64" ], @@ -2227,9 +2223,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz", - "integrity": "sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.0.tgz", + "integrity": "sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==", "cpu": [ "arm64" ], @@ -2241,9 +2237,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz", - "integrity": "sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.0.tgz", + "integrity": "sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==", "cpu": [ "x64" ], @@ -2255,9 +2251,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz", - "integrity": "sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.0.tgz", + "integrity": "sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==", "cpu": [ "arm" ], @@ -2269,9 +2265,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz", - "integrity": "sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.0.tgz", + "integrity": "sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==", "cpu": [ "arm" ], @@ -2283,9 +2279,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz", - "integrity": "sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.0.tgz", + "integrity": "sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==", "cpu": [ "arm64" ], @@ -2297,9 +2293,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz", - "integrity": "sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.0.tgz", + "integrity": "sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==", "cpu": [ "arm64" ], @@ -2311,9 +2307,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz", - "integrity": "sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.0.tgz", + "integrity": "sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==", "cpu": [ "ppc64" ], @@ -2325,9 +2321,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz", - "integrity": "sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.0.tgz", + "integrity": "sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==", "cpu": [ "riscv64" ], @@ -2339,9 +2335,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz", - "integrity": "sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.0.tgz", + "integrity": "sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==", "cpu": [ "s390x" ], @@ -2353,9 +2349,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz", - "integrity": "sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.0.tgz", + "integrity": "sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==", "cpu": [ "x64" ], @@ -2367,9 +2363,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz", - "integrity": "sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.0.tgz", + "integrity": "sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==", "cpu": [ "x64" ], @@ -2381,9 +2377,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz", - "integrity": "sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.0.tgz", + "integrity": "sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==", "cpu": [ "arm64" ], @@ -2395,9 +2391,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz", - "integrity": "sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.0.tgz", + "integrity": "sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==", "cpu": [ "ia32" ], @@ -2409,9 +2405,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz", - "integrity": "sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.0.tgz", + "integrity": "sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==", "cpu": [ "x64" ], @@ -2713,20 +2709,20 @@ "optional": true }, "node_modules/@shikijs/engine-oniguruma": { - "version": "1.23.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.23.1.tgz", - "integrity": "sha512-KQ+lgeJJ5m2ISbUZudLR1qHeH3MnSs2mjFg7bnencgs5jDVPeJ2NVDJ3N5ZHbcTsOIh0qIueyAJnwg7lg7kwXQ==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.0.tgz", + "integrity": "sha512-Eua0qNOL73Y82lGA4GF5P+G2+VXX9XnuUxkiUuwcxQPH4wom+tE39kZpBFXfUuwNYxHSkrSxpB1p4kyRW0moSg==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "1.23.1", + "@shikijs/types": "1.24.0", "@shikijs/vscode-textmate": "^9.3.0" } }, "node_modules/@shikijs/types": { - "version": "1.23.1", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.23.1.tgz", - "integrity": "sha512-98A5hGyEhzzAgQh2dAeHKrWW4HfCMeoFER2z16p5eJ+vmPeF6lZ/elEne6/UCU551F/WqkopqRsr1l2Yu6+A0g==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.24.0.tgz", + "integrity": "sha512-aptbEuq1Pk88DMlCe+FzXNnBZ17LCiLIGWAeCWhoFDzia5Q5Krx3DgnULLiouSdd6+LUM39XwXGppqYE0Ghtug==", "dev": true, "license": "MIT", "dependencies": { @@ -2798,9 +2794,9 @@ "license": "(Unlicense OR Apache-2.0)" }, "node_modules/@stoprocent/bluetooth-hci-socket": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@stoprocent/bluetooth-hci-socket/-/bluetooth-hci-socket-1.4.1.tgz", - "integrity": "sha512-p/7G+ydYLIBRX2S8/PJgVU+66CbPucnFOkyDiyrHLtg6wdDCw/Ihm/O2XVVG33Sk77pIsRJsXt7HL6CqjSNDjw==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@stoprocent/bluetooth-hci-socket/-/bluetooth-hci-socket-1.4.2.tgz", + "integrity": "sha512-VlULC6DCrZ3XjOMk9dwQdem42uhZEZegf/Okegyip00TV2gKGpo6F5dU+f+CsJGiSGj1lYQOBvC+f6voq5d1nQ==", "hasInstallScript": true, "license": "MIT", "optional": true, @@ -2824,9 +2820,9 @@ } }, "node_modules/@stoprocent/noble": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@stoprocent/noble/-/noble-1.15.1.tgz", - "integrity": "sha512-e4uG5oQMFDz+94hBtupWvnr7QvmFcNPXZXYB5DS4vqo6/2e6dvReEscRyofv/WxB14O8vc3RQC+QwHDN++vCFw==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@stoprocent/noble/-/noble-1.16.1.tgz", + "integrity": "sha512-yJ3Tl4hsaH1nYpMi+cR0uOrVE5zVUrtKDSjSY7dP+HDLsiuKO6n4xT6g/FrA0pH1iAMmllRwl/IcZzUGdMoyyg==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -2839,13 +2835,13 @@ "node": ">=14" }, "optionalDependencies": { - "@stoprocent/bluetooth-hci-socket": "^1.4.1" + "@stoprocent/bluetooth-hci-socket": "^1.4.2" } }, "node_modules/@stylistic/eslint-plugin": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.11.0.tgz", - "integrity": "sha512-PNRHbydNG5EH8NK4c+izdJlxajIR6GxcUhzsYNRsn6Myep4dsZt0qFCz3rCPnkvgO5FYibDcMqgNHUT+zvjYZw==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.12.1.tgz", + "integrity": "sha512-fubZKIHSPuo07FgRTn6S4Nl0uXPRPYVNpyZzIDGfp7Fny6JjNus6kReLD7NI380JXi4HtUTSOZ34LBuNPO1XLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3063,9 +3059,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.0.tgz", - "integrity": "sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==", + "version": "22.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3152,17 +3148,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.16.0.tgz", - "integrity": "sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.1.tgz", + "integrity": "sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.16.0", - "@typescript-eslint/type-utils": "8.16.0", - "@typescript-eslint/utils": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0", + "@typescript-eslint/scope-manager": "8.18.1", + "@typescript-eslint/type-utils": "8.18.1", + "@typescript-eslint/utils": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -3177,25 +3173,21 @@ }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.16.0.tgz", - "integrity": "sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.1.tgz", + "integrity": "sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.16.0", - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/typescript-estree": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0", + "@typescript-eslint/scope-manager": "8.18.1", + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/typescript-estree": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1", "debug": "^4.3.4" }, "engines": { @@ -3206,23 +3198,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.16.0.tgz", - "integrity": "sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.1.tgz", + "integrity": "sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0" + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3233,14 +3221,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.16.0.tgz", - "integrity": "sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.1.tgz", + "integrity": "sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.16.0", - "@typescript-eslint/utils": "8.16.0", + "@typescript-eslint/typescript-estree": "8.18.1", + "@typescript-eslint/utils": "8.18.1", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -3252,18 +3240,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.16.0.tgz", - "integrity": "sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.1.tgz", + "integrity": "sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==", "dev": true, "license": "MIT", "engines": { @@ -3275,14 +3259,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.16.0.tgz", - "integrity": "sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.1.tgz", + "integrity": "sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0", + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3297,23 +3281,21 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.16.0.tgz", - "integrity": "sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.1.tgz", + "integrity": "sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.16.0", - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/typescript-estree": "8.16.0" + "@typescript-eslint/scope-manager": "8.18.1", + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/typescript-estree": "8.18.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3323,22 +3305,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.16.0.tgz", - "integrity": "sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.1.tgz", + "integrity": "sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/types": "8.18.1", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -3350,9 +3328,9 @@ } }, "node_modules/@vitest/coverage-v8": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.6.tgz", - "integrity": "sha512-qItJVYDbG3MUFO68dOZUz+rWlqe9LMzotERXFXKg25s2A/kSVsyS9O0yNGrITfBd943GsnBeQZkBUu7Pc+zVeA==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.8.tgz", + "integrity": "sha512-2Y7BPlKH18mAZYAW1tYByudlCYrQyl5RGvnnDYJKW5tCiO5qg3KSAy3XAxcxKz900a0ZXxWtKrMuZLe3lKBpJw==", "dev": true, "license": "MIT", "dependencies": { @@ -3373,8 +3351,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "2.1.6", - "vitest": "2.1.6" + "@vitest/browser": "2.1.8", + "vitest": "2.1.8" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -3383,9 +3361,9 @@ } }, "node_modules/@vitest/eslint-plugin": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.12.tgz", - "integrity": "sha512-iv9K9fz9qRxBo9J/PGSMcLdOFIKqtFZ6THqSVG/jW8CJZFkIWLxPduCTXkbyG6FNKgL49fkv348nSgmfqCU6FA==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.17.tgz", + "integrity": "sha512-V3cu24F73gN1h37XNo6fMGVDws+O7vHwsH2CHWUP9eJQXw91keCI2X+lYqDaSO98nxAIBi5AhsOjGLAGXvtmhw==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3404,14 +3382,14 @@ } }, "node_modules/@vitest/expect": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.6.tgz", - "integrity": "sha512-9M1UR9CAmrhJOMoSwVnPh2rELPKhYo0m/CSgqw9PyStpxtkwhmdM6XYlXGKeYyERY1N6EIuzkQ7e3Lm1WKCoUg==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz", + "integrity": "sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.6", - "@vitest/utils": "2.1.6", + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", "chai": "^5.1.2", "tinyrainbow": "^1.2.0" }, @@ -3420,13 +3398,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.6.tgz", - "integrity": "sha512-MHZp2Z+Q/A3am5oD4WSH04f9B0T7UvwEb+v5W0kCYMhtXGYbdyl2NUk1wdSMqGthmhpiThPDp/hEoVwu16+u1A==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz", + "integrity": "sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.6", + "@vitest/spy": "2.1.8", "estree-walker": "^3.0.3", "magic-string": "^0.30.12" }, @@ -3435,7 +3413,7 @@ }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0" + "vite": "^5.0.0" }, "peerDependenciesMeta": { "msw": { @@ -3457,9 +3435,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.6.tgz", - "integrity": "sha512-exZyLcEnHgDMKc54TtHca4McV4sKT+NKAe9ix/yhd/qkYb/TP8HTyXRFDijV19qKqTZM0hPL4753zU/U8L/gAA==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz", + "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3470,13 +3448,13 @@ } }, "node_modules/@vitest/runner": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.6.tgz", - "integrity": "sha512-SjkRGSFyrA82m5nz7To4CkRSEVWn/rwQISHoia/DB8c6IHIhaE/UNAo+7UfeaeJRE979XceGl00LNkIz09RFsA==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz", + "integrity": "sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.6", + "@vitest/utils": "2.1.8", "pathe": "^1.1.2" }, "funding": { @@ -3484,13 +3462,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.6.tgz", - "integrity": "sha512-5JTWHw8iS9l3v4/VSuthCndw1lN/hpPB+mlgn1BUhFbobeIUj1J1V/Bj2t2ovGEmkXLTckFjQddsxS5T6LuVWw==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz", + "integrity": "sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.6", + "@vitest/pretty-format": "2.1.8", "magic-string": "^0.30.12", "pathe": "^1.1.2" }, @@ -3499,9 +3477,9 @@ } }, "node_modules/@vitest/spy": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.6.tgz", - "integrity": "sha512-oTFObV8bd4SDdRka5O+mSh5w9irgx5IetrD5i+OsUUsk/shsBoHifwCzy45SAORzAhtNiprUVaK3hSCCzZh1jQ==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz", + "integrity": "sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==", "dev": true, "license": "MIT", "dependencies": { @@ -3512,13 +3490,13 @@ } }, "node_modules/@vitest/utils": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.6.tgz", - "integrity": "sha512-ixNkFy3k4vokOUTU2blIUvOgKq/N2PW8vKIjZZYsGJCMX69MRa9J2sKqX5hY/k5O5Gty3YJChepkqZ3KM9LyIQ==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz", + "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.6", + "@vitest/pretty-format": "2.1.8", "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" }, @@ -4418,9 +4396,9 @@ "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", - "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4705,9 +4683,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4715,33 +4693,32 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=18" + "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { @@ -4768,9 +4745,9 @@ } }, "node_modules/eslint": { - "version": "9.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz", - "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==", + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz", + "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", "dev": true, "license": "MIT", "dependencies": { @@ -4779,7 +4756,7 @@ "@eslint/config-array": "^0.19.0", "@eslint/core": "^0.9.0", "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.15.0", + "@eslint/js": "9.17.0", "@eslint/plugin-kit": "^0.2.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -4788,7 +4765,7 @@ "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.5", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", @@ -5008,19 +4985,19 @@ } }, "node_modules/eslint-plugin-format": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-format/-/eslint-plugin-format-0.1.2.tgz", - "integrity": "sha512-ZrcO3aiumgJ6ENAv65IWkPjtW77ML/5mp0YrRK0jdvvaZJb+4kKWbaQTMr/XbJo6CtELRmCApAziEKh7L2NbdQ==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-format/-/eslint-plugin-format-0.1.3.tgz", + "integrity": "sha512-vTmshuv1iMfmcM1HADnyhae5MBBGlJZBZyZ+ybtXCEzRe3nRhUvLX+6rAvsEfcdK6a2pqpLs/F530dXKvfQqYQ==", "dev": true, "license": "MIT", "dependencies": { "@dprint/formatter": "^0.3.0", - "@dprint/markdown": "^0.17.1", - "@dprint/toml": "^0.6.2", + "@dprint/markdown": "^0.17.8", + "@dprint/toml": "^0.6.3", "eslint-formatting-reporter": "^0.0.0", "eslint-parser-plain": "^0.1.0", - "prettier": "^3.3.2", - "synckit": "^0.9.0" + "prettier": "^3.4.1", + "synckit": "^0.9.2" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -5030,12 +5007,13 @@ } }, "node_modules/eslint-plugin-import-x": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.4.3.tgz", - "integrity": "sha512-QBprHvhLsfDhP++2T1NnjsOUt6bLDX3NMHaYwAB1FD3xmYTkdFH+HS1OamGhz28jLkRyIZa6UNAzTxbHnJwz5w==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.5.0.tgz", + "integrity": "sha512-l0OTfnPF8RwmSXfjT75N8d6ZYLVrVYWpaGlgvVkVqFERCI5SyBfDP7QEMr3kt0zWi2sOa9EQ47clbdFsHkF83Q==", "dev": true, "license": "MIT", "dependencies": { + "@typescript-eslint/scope-manager": "^8.1.0", "@typescript-eslint/utils": "^8.1.0", "debug": "^4.3.4", "doctrine": "^3.0.0", @@ -5055,9 +5033,9 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "50.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.0.tgz", - "integrity": "sha512-tCNp4fR79Le3dYTPB0dKEv7yFyvGkUCa+Z3yuTrrNGGOxBlXo9Pn0PEgroOZikUQOGjxoGMVKNjrOHcYEdfszg==", + "version": "50.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.1.tgz", + "integrity": "sha512-UWyaYi6iURdSfdVVqvfOs2vdCVz0J40O/z/HTsv2sFjdjmdlUI/qlKLOTmwbPQ2tAfQnE5F9vqx+B+poF71DBQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5182,9 +5160,9 @@ } }, "node_modules/eslint-plugin-n": { - "version": "17.14.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.14.0.tgz", - "integrity": "sha512-maxPLMEA0rPmRpoOlxEclKng4UpDe+N5BJS4t24I3UKnN109Qcivnfs37KMy84G0af3bxjog5lKctP5ObsvcTA==", + "version": "17.15.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.15.0.tgz", + "integrity": "sha512-xF3zJkOfLlFOm5TvmqmsnA9/fO+/z2pYs0dkuKXKN/ymS6UB1yEcaoIkqxLKQ9Dw/WmLX/Tdh6/5ZS5azVixFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5218,14 +5196,14 @@ } }, "node_modules/eslint-plugin-perfectionist": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-4.1.2.tgz", - "integrity": "sha512-YjXPWB/rKe/gPUsyuxw75wTUrzN5MuJnRV0PH9NoonFvgcdVIXk551mkBKPr59nRZCbu7S3dFHwfo4gA42DB2w==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-4.3.0.tgz", + "integrity": "sha512-8tQ/wn1dFelul2WoXL/NQOEwvWO8H4Vjmsqpt3fDQrfgybr8kQ5Vgb9BQyVRB33ywQqjUApsiwi5Ci7grMPPRA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "^8.16.0", - "@typescript-eslint/utils": "^8.16.0", + "@typescript-eslint/types": "^8.18.0", + "@typescript-eslint/utils": "^8.18.0", "natural-orderby": "^5.0.0" }, "engines": { @@ -5258,14 +5236,14 @@ } }, "node_modules/eslint-plugin-toml": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-toml/-/eslint-plugin-toml-0.11.1.tgz", - "integrity": "sha512-Y1WuMSzfZpeMIrmlP1nUh3kT8p96mThIq4NnHrYUhg10IKQgGfBZjAWnrg9fBqguiX4iFps/x/3Hb5TxBisfdw==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-toml/-/eslint-plugin-toml-0.12.0.tgz", + "integrity": "sha512-+/wVObA9DVhwZB1nG83D2OAQRrcQZXy+drqUnFJKymqnmbnbfg/UPmEMCKrJNcEboUGxUjYrJlgy+/Y930mURQ==", "dev": true, "license": "MIT", "dependencies": { "debug": "^4.1.1", - "eslint-compat-utils": "^0.5.0", + "eslint-compat-utils": "^0.6.0", "lodash": "^4.17.19", "toml-eslint-parser": "^0.10.0" }, @@ -5279,6 +5257,22 @@ "eslint": ">=6.0.0" } }, + "node_modules/eslint-plugin-toml/node_modules/eslint-compat-utils": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.4.tgz", + "integrity": "sha512-/u+GQt8NMfXO8w17QendT4gvO5acfxQsAKirAt0LVxDnr2N8YLCVbregaNc/Yhp7NM128DwCaRvr8PLDfeNkQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, "node_modules/eslint-plugin-unicorn": { "version": "56.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.1.tgz", @@ -5330,9 +5324,9 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "9.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.31.0.tgz", - "integrity": "sha512-aYMUCgivhz1o4tLkRHj5oq9YgYPM4/EJc0M7TAKRLCUA5OYxRLAhYEVD2nLtTwLyixEFI+/QXSvKU9ESZFgqjQ==", + "version": "9.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.32.0.tgz", + "integrity": "sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==", "dev": true, "license": "MIT", "dependencies": { @@ -5382,14 +5376,14 @@ } }, "node_modules/eslint-plugin-yml": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.15.0.tgz", - "integrity": "sha512-leC8APYVOsKyWUlvRwVhewytK5wS70BfMqIaUplFstRfzCoVp0YoEroV4cUEvQrBj93tQ3M9LcjO/ewr6D4kjA==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.16.0.tgz", + "integrity": "sha512-t4MNCetPjTn18/fUDlQ/wKkcYjnuLYKChBrZ0qUaNqRigVqChHWzTP8SrfFi5s4keX3vdlkWRSu8zHJMdKwxWQ==", "dev": true, "license": "MIT", "dependencies": { "debug": "^4.3.2", - "eslint-compat-utils": "^0.5.0", + "eslint-compat-utils": "^0.6.0", "lodash": "^4.17.21", "natural-compare": "^1.4.0", "yaml-eslint-parser": "^1.2.1" @@ -5404,6 +5398,22 @@ "eslint": ">=6.0.0" } }, + "node_modules/eslint-plugin-yml/node_modules/eslint-compat-utils": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.4.tgz", + "integrity": "sha512-/u+GQt8NMfXO8w17QendT4gvO5acfxQsAKirAt0LVxDnr2N8YLCVbregaNc/Yhp7NM128DwCaRvr8PLDfeNkQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, "node_modules/eslint-processor-vue-blocks": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/eslint-processor-vue-blocks/-/eslint-processor-vue-blocks-0.1.2.tgz", @@ -8559,9 +8569,9 @@ "license": "MIT" }, "node_modules/nodemon": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", - "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz", + "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==", "dev": true, "license": "MIT", "dependencies": { @@ -9206,9 +9216,9 @@ } }, "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", "dev": true, "license": "MIT", "bin": { @@ -9662,9 +9672,9 @@ } }, "node_modules/rollup": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.4.tgz", - "integrity": "sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.0.tgz", + "integrity": "sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9678,24 +9688,24 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.27.4", - "@rollup/rollup-android-arm64": "4.27.4", - "@rollup/rollup-darwin-arm64": "4.27.4", - "@rollup/rollup-darwin-x64": "4.27.4", - "@rollup/rollup-freebsd-arm64": "4.27.4", - "@rollup/rollup-freebsd-x64": "4.27.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.27.4", - "@rollup/rollup-linux-arm-musleabihf": "4.27.4", - "@rollup/rollup-linux-arm64-gnu": "4.27.4", - "@rollup/rollup-linux-arm64-musl": "4.27.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.27.4", - "@rollup/rollup-linux-riscv64-gnu": "4.27.4", - "@rollup/rollup-linux-s390x-gnu": "4.27.4", - "@rollup/rollup-linux-x64-gnu": "4.27.4", - "@rollup/rollup-linux-x64-musl": "4.27.4", - "@rollup/rollup-win32-arm64-msvc": "4.27.4", - "@rollup/rollup-win32-ia32-msvc": "4.27.4", - "@rollup/rollup-win32-x64-msvc": "4.27.4", + "@rollup/rollup-android-arm-eabi": "4.28.0", + "@rollup/rollup-android-arm64": "4.28.0", + "@rollup/rollup-darwin-arm64": "4.28.0", + "@rollup/rollup-darwin-x64": "4.28.0", + "@rollup/rollup-freebsd-arm64": "4.28.0", + "@rollup/rollup-freebsd-x64": "4.28.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.28.0", + "@rollup/rollup-linux-arm-musleabihf": "4.28.0", + "@rollup/rollup-linux-arm64-gnu": "4.28.0", + "@rollup/rollup-linux-arm64-musl": "4.28.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.28.0", + "@rollup/rollup-linux-riscv64-gnu": "4.28.0", + "@rollup/rollup-linux-s390x-gnu": "4.28.0", + "@rollup/rollup-linux-x64-gnu": "4.28.0", + "@rollup/rollup-linux-x64-musl": "4.28.0", + "@rollup/rollup-win32-arm64-msvc": "4.28.0", + "@rollup/rollup-win32-ia32-msvc": "4.28.0", + "@rollup/rollup-win32-x64-msvc": "4.28.0", "fsevents": "~2.3.2" } }, @@ -10523,13 +10533,13 @@ } }, "node_modules/typedoc": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.27.1.tgz", - "integrity": "sha512-cbFtNFpkCtHAHRvMnCDdtM2+xhO2uiJAcw4ooLmVMuaY9yLJswKvi6wOwPZgTnKKnm/HKpO/Ub6DVk4KRf/vRg==", + "version": "0.27.5", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.27.5.tgz", + "integrity": "sha512-x+fhKJtTg4ozXwKayh/ek4wxZQI/+2hmZUdO2i2NGDBRUflDble70z+ewHod3d4gRpXSO6fnlnjbDTnJk7HlkQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@gerrit0/mini-shiki": "^1.23.2", + "@gerrit0/mini-shiki": "^1.24.0", "lunr": "^2.3.9", "markdown-it": "^14.1.0", "minimatch": "^9.0.5", @@ -10581,9 +10591,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.0.0.tgz", - "integrity": "sha512-c4xi3kWnQJrb7h2q8aJYKvUzmz7boCgz1cUCC6OwdeM5Tr2P0hDuthr2iut4ggqsz+Cnh20U/LoTzbKIdDS/Nw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.2.0.tgz", + "integrity": "sha512-klt+0S55GBViA9nsq48/NSCo4YX5mjydjypxD7UmHh/brMu8h/Mhd/F7qAeoH2NOO8SDTk6kjnTFc4WpzmfYpQ==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -10774,21 +10784,21 @@ } }, "node_modules/vite": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.1.tgz", - "integrity": "sha512-Ldn6gorLGr4mCdFnmeAOLweJxZ34HjKnDm4HGo6P66IEqTxQb36VEdFJQENKxWjupNfoIjvRUnswjn1hpYEpjQ==", + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.24.0", - "postcss": "^8.4.49", - "rollup": "^4.23.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -10797,25 +10807,19 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" + "terser": "^5.4.0" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, - "jiti": { - "optional": true - }, "less": { "optional": true }, @@ -10836,19 +10840,13 @@ }, "terser": { "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true } } }, "node_modules/vite-node": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.6.tgz", - "integrity": "sha512-DBfJY0n9JUwnyLxPSSUmEePT21j8JZp/sR9n+/gBwQU6DcQOioPdb8/pibWfXForbirSagZCilseYIwaL3f95A==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.8.tgz", + "integrity": "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==", "dev": true, "license": "MIT", "dependencies": { @@ -10856,32 +10854,32 @@ "debug": "^4.3.7", "es-module-lexer": "^1.5.4", "pathe": "^1.1.2", - "vite": "^5.0.0 || ^6.0.0" + "vite": "^5.0.0" }, "bin": { "vite-node": "vite-node.mjs" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/vitest": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.6.tgz", - "integrity": "sha512-isUCkvPL30J4c5O5hgONeFRsDmlw6kzFEdLQHLezmDdKQHy8Ke/B/dgdTMEgU0vm+iZ0TjW8GuK83DiahBoKWQ==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.8.tgz", + "integrity": "sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "2.1.6", - "@vitest/mocker": "2.1.6", - "@vitest/pretty-format": "^2.1.6", - "@vitest/runner": "2.1.6", - "@vitest/snapshot": "2.1.6", - "@vitest/spy": "2.1.6", - "@vitest/utils": "2.1.6", + "@vitest/expect": "2.1.8", + "@vitest/mocker": "2.1.8", + "@vitest/pretty-format": "^2.1.8", + "@vitest/runner": "2.1.8", + "@vitest/snapshot": "2.1.8", + "@vitest/spy": "2.1.8", + "@vitest/utils": "2.1.8", "chai": "^5.1.2", "debug": "^4.3.7", "expect-type": "^1.1.0", @@ -10892,24 +10890,24 @@ "tinyexec": "^0.3.1", "tinypool": "^1.0.1", "tinyrainbow": "^1.2.0", - "vite": "^5.0.0 || ^6.0.0", - "vite-node": "2.1.6", + "vite": "^5.0.0", + "vite-node": "2.1.8", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "2.1.6", - "@vitest/ui": "2.1.6", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.8", + "@vitest/ui": "2.1.8", "happy-dom": "*", "jsdom": "*" }, diff --git a/package.json b/package.json index a7b48f6b..f9a11e26 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "node-switchbot", "type": "module", - "version": "3.4.1", + "version": "3.4.2", "description": "The node-switchbot is a Node.js module which allows you to control your Switchbot Devices through Bluetooth (BLE).", "author": "OpenWonderLabs (https://github.com/OpenWonderLabs)", "license": "MIT", @@ -50,34 +50,34 @@ }, "readmeFilename": "README.md", "dependencies": { - "@stoprocent/noble": "^1.15.1", + "@stoprocent/noble": "^1.16.1", "async-mutex": "^0.5.0", - "undici": "^7.0.0" + "undici": "^7.2.0" }, "optionalDependencies": { - "@stoprocent/bluetooth-hci-socket": "^1.4.1" + "@stoprocent/bluetooth-hci-socket": "^1.4.2" }, "devDependencies": { - "@antfu/eslint-config": "^3.11.0", + "@antfu/eslint-config": "^3.12.0", "@types/aes-js": "^3.1.4", "@types/debug": "^4.1.12", "@types/fs-extra": "^11.0.4", "@types/jest": "^29.5.14", "@types/mdast": "^4.0.4", - "@types/node": "^22.10.0", + "@types/node": "^22.10.2", "@types/semver": "^7.5.8", "@types/sinon": "^17.0.3", "@types/source-map-support": "^0.5.10", - "@vitest/coverage-v8": "^2.1.6", - "eslint": "^9.15.0", - "eslint-plugin-format": "^0.1.2", + "@vitest/coverage-v8": "^2.1.8", + "eslint": "^9.17.0", + "eslint-plugin-format": "^0.1.3", "jest": "^29.7.0", - "nodemon": "^3.1.7", + "nodemon": "^3.1.9", "shx": "^0.3.4", "sinon": "^19.0.2", "ts-node": "^10.9.2", - "typedoc": "^0.27.1", + "typedoc": "^0.27.5", "typescript": "^5.7.2", - "vitest": "^2.1.5" + "vitest": "^2.1.8" } } diff --git a/src/advertising.ts b/src/advertising.ts index c525f182..b792fa10 100644 --- a/src/advertising.ts +++ b/src/advertising.ts @@ -15,13 +15,14 @@ import { WoContact } from './device/wocontact.js' import { WoCurtain } from './device/wocurtain.js' import { WoHand } from './device/wohand.js' import { WoHub2 } from './device/wohub2.js' +import { WoHumi2 } from './device/wohumi2.js' import { WoHumi } from './device/wohumi.js' import { WoIOSensorTH } from './device/woiosensorth.js' import { WoLeak } from './device/woleak.js' import { WoPlugMiniUS } from './device/woplugmini.js' import { WoPlugMiniJP } from './device/woplugmini_jp.js' import { WoPresence } from './device/wopresence.js' -import { WoRelaySwitch1Plus } from './device/worelayswitch1plus.js' +import { WoRelaySwitch1 } from './device/worelayswitch1.js' import { WoRelaySwitch1PM } from './device/worelayswitch1pm.js' import { WoSensorTH } from './device/wosensorth.js' import { WoSensorTHPlus } from './device/wosensorthplus.js' @@ -121,6 +122,8 @@ export class Advertising { return WoCurtain.parseServiceData(serviceData, manufacturerData, emitLog) case SwitchBotBLEModel.Humidifier: return WoHumi.parseServiceData(serviceData, emitLog) + case SwitchBotBLEModel.Humidifier2: + return WoHumi2.parseServiceData(serviceData, emitLog) case SwitchBotBLEModel.Meter: return WoSensorTH.parseServiceData(serviceData, emitLog) case SwitchBotBLEModel.MeterPlus: @@ -157,10 +160,10 @@ export class Advertising { return WoBlindTilt.parseServiceData(serviceData, manufacturerData, emitLog) case SwitchBotBLEModel.Leak: return WoLeak.parseServiceData(serviceData, manufacturerData, emitLog) + case SwitchBotBLEModel.RelaySwitch1: + return WoRelaySwitch1.parseServiceData(serviceData, manufacturerData, emitLog) case SwitchBotBLEModel.RelaySwitch1PM: return WoRelaySwitch1PM.parseServiceData(serviceData, manufacturerData, emitLog) - case SwitchBotBLEModel.RelaySwitch1Plus: - return WoRelaySwitch1Plus.parseServiceData(serviceData, manufacturerData, emitLog) default: emitLog('debug', `[parseAdvertising.${model}] return null, model "${model}" not available!`) return null diff --git a/src/device.ts b/src/device.ts index cd1c58f8..3887af8c 100644 --- a/src/device.ts +++ b/src/device.ts @@ -17,7 +17,6 @@ import { CHAR_UUID_DEVICE, CHAR_UUID_NOTIFY, CHAR_UUID_WRITE, READ_TIMEOUT_MSEC, * Represents a Switchbot Device. */ export class SwitchbotDevice extends EventEmitter { - [x: string]: any private noble: NobleTypes['noble'] private peripheral: NobleTypes['peripheral'] private characteristics: Chars | null = null diff --git a/src/device/woblindtilt.ts b/src/device/woblindtilt.ts index 0f19e817..4523df96 100644 --- a/src/device/woblindtilt.ts +++ b/src/device/woblindtilt.ts @@ -15,7 +15,7 @@ import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName * @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/blob/latest/devicetypes/curtain.md */ export class WoBlindTilt extends SwitchbotDevice { - private _reverse: boolean = false + private reverse: boolean = false /** * Parses the service data and manufacturer data for the WoBlindTilt device. @@ -145,9 +145,9 @@ export class WoBlindTilt extends SwitchbotDevice { closing = !opening && Boolean(data[5] & 0b00000001) if (opening) { const flag = Boolean(data[5] & 0b00000001) - up = flag ? this._reverse : !flag + up = flag ? this.reverse : !flag } else { - up = tilt < 50 ? this._reverse : tilt > 50 + up = tilt < 50 ? this.reverse : tilt > 50 } } @@ -166,7 +166,7 @@ export class WoBlindTilt extends SwitchbotDevice { up: moving && up, down: moving && !up, }, - tilt: this._reverse ? 100 - tilt : tilt, + tilt: this.reverse ? 100 - tilt : tilt, timers: data[7], } } diff --git a/src/device/wohand.ts b/src/device/wohand.ts index b0f8d8fb..5f975976 100644 --- a/src/device/wohand.ts +++ b/src/device/wohand.ts @@ -25,22 +25,24 @@ export class WoHand extends SwitchbotDevice { serviceData: Buffer, emitLog: (level: string, message: string) => void, ): Promise { - if (serviceData.length !== 3) { - emitLog('debugerror', `[parseServiceData] Buffer length ${serviceData.length} !== 3!`) + if (!serviceData || serviceData.length < 3) { + emitLog('debugerror', `[parseServiceData] Service Data Buffer length ${serviceData?.length ?? 0} < 3!`) return null } const byte1 = serviceData.readUInt8(1) const byte2 = serviceData.readUInt8(2) - return { + const data: botServiceData = { model: SwitchBotBLEModel.Bot, modelName: SwitchBotBLEModelName.Bot, modelFriendlyName: SwitchBotBLEModelFriendlyName.Bot, mode: !!(byte1 & 0b10000000), // Whether the light switch Add-on is used or not. 0 = press, 1 = switch - state: !(byte1 & 0b01000000), // Whether the switch status is ON or OFF. 0 = on, 1 = off + state: !!(byte1 & 0b01000000), // Whether the switch status is ON or OFF. 0 = on, 1 = off battery: byte2 & 0b01111111, // % } + + return data } constructor(peripheral: NobleTypes['peripheral'], noble: NobleTypes['noble']) { diff --git a/src/device/wohumi.ts b/src/device/wohumi.ts index 17e084cb..1d5da373 100644 --- a/src/device/wohumi.ts +++ b/src/device/wohumi.ts @@ -10,11 +10,23 @@ import { Buffer } from 'node:buffer' import { SwitchbotDevice } from '../device.js' import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types/types.js' +const HUMIDIFIER_COMMAND_HEADER = '5701' +const TURN_ON_KEY = `${HUMIDIFIER_COMMAND_HEADER}0101` +const TURN_OFF_KEY = `${HUMIDIFIER_COMMAND_HEADER}0102` +const INCREASE_KEY = `${HUMIDIFIER_COMMAND_HEADER}0103` +const DECREASE_KEY = `${HUMIDIFIER_COMMAND_HEADER}0104` +const SET_AUTO_MODE_KEY = `${HUMIDIFIER_COMMAND_HEADER}0105` +const SET_MANUAL_MODE_KEY = `${HUMIDIFIER_COMMAND_HEADER}0106` + /** * Class representing a WoHumi device. * @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/tree/latest/devicetypes */ export class WoHumi extends SwitchbotDevice { + constructor(peripheral: NobleTypes['peripheral'], noble: NobleTypes['noble']) { + super(peripheral, noble) + } + /** * Parses the service data for WoHumi. * @param {Buffer} serviceData - The service data buffer. @@ -51,17 +63,12 @@ export class WoHumi extends SwitchbotDevice { return data } - constructor(peripheral: NobleTypes['peripheral'], noble: NobleTypes['noble']) { - super(peripheral, noble) - } - /** * Sends a command to the humidifier. - * @param {number[]} bytes - The command bytes. + * @param {Buffer} reqBuf - The command buffer. * @returns {Promise} */ - public async operateHumi(bytes: number[]): Promise { - const reqBuf = Buffer.from(bytes) + protected async operateHumi(reqBuf: Buffer): Promise { const resBuf = await this.command(reqBuf) const code = resBuf.readUInt8(0) @@ -71,42 +78,63 @@ export class WoHumi extends SwitchbotDevice { } /** - * Presses the humidifier button. + * Turns on the humidifier. * @returns {Promise} */ - async press(): Promise { - await this.operateHumi([0x57, 0x01, 0x00]) + public async turnOn(): Promise { + await this.operateHumi(Buffer.from(TURN_ON_KEY, 'hex')) } /** - * Turns on the humidifier. + * Turns off the humidifier. * @returns {Promise} */ - async turnOn(): Promise { - await this.operateHumi([0x57, 0x01, 0x01]) + public async turnOff(): Promise { + await this.operateHumi(Buffer.from(TURN_OFF_KEY, 'hex')) } /** - * Turns off the humidifier. + * Increases the humidifier setting. * @returns {Promise} */ - async turnOff(): Promise { - await this.operateHumi([0x57, 0x01, 0x02]) + public async increase(): Promise { + await this.operateHumi(Buffer.from(INCREASE_KEY, 'hex')) } /** * Decreases the humidifier setting. * @returns {Promise} */ - async down(): Promise { - await this.operateHumi([0x57, 0x01, 0x03]) + public async decrease(): Promise { + await this.operateHumi(Buffer.from(DECREASE_KEY, 'hex')) } /** - * Increases the humidifier setting. + * Sets the humidifier to auto mode. + * @returns {Promise} + */ + public async setAutoMode(): Promise { + await this.operateHumi(Buffer.from(SET_AUTO_MODE_KEY, 'hex')) + } + + /** + * Sets the humidifier to manual mode. * @returns {Promise} */ - async up(): Promise { - await this.operateHumi([0x57, 0x01, 0x04]) + public async setManualMode(): Promise { + await this.operateHumi(Buffer.from(SET_MANUAL_MODE_KEY, 'hex')) + } + + /** + * Sets the humidifier level. + * @param {number} level - The level to set (0-100). + * @returns {Promise} + */ + public async percentage(level: number): Promise { + if (level < 0 || level > 100) { + throw new Error('Level must be between 0 and 100') + } + const levelKey = `${HUMIDIFIER_COMMAND_HEADER}0107${level.toString(16).padStart(2, '0')}` + await this.operateHumi(Buffer.from(levelKey, 'hex')) } } diff --git a/src/device/wohumi2.ts b/src/device/wohumi2.ts new file mode 100644 index 00000000..5934a340 --- /dev/null +++ b/src/device/wohumi2.ts @@ -0,0 +1,140 @@ +/* Copyright(C) 2024, donavanbecker (https://github.com/donavanbecker). All rights reserved. + * + * wohumi.ts: Switchbot BLE API registration. + */ +import type { humidifier2ServiceData } from '../types/bledevicestatus.js' +import type { NobleTypes } from '../types/types.js' + +import { Buffer } from 'node:buffer' + +import { SwitchbotDevice } from '../device.js' +import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types/types.js' + +const HUMIDIFIER_COMMAND_HEADER = '5701' +const TURN_ON_KEY = `${HUMIDIFIER_COMMAND_HEADER}0101` +const TURN_OFF_KEY = `${HUMIDIFIER_COMMAND_HEADER}0102` +const INCREASE_KEY = `${HUMIDIFIER_COMMAND_HEADER}0103` +const DECREASE_KEY = `${HUMIDIFIER_COMMAND_HEADER}0104` +const SET_AUTO_MODE_KEY = `${HUMIDIFIER_COMMAND_HEADER}0105` +const SET_MANUAL_MODE_KEY = `${HUMIDIFIER_COMMAND_HEADER}0106` + +/** + * Class representing a WoHumi device. + * @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/tree/latest/devicetypes + */ +export class WoHumi2 extends SwitchbotDevice { + constructor(peripheral: NobleTypes['peripheral'], noble: NobleTypes['noble']) { + super(peripheral, noble) + } + + /** + * Parses the service data for WoHumi. + * @param {Buffer} serviceData - The service data buffer. + * @param {Function} emitLog - The function to emit log messages. + * @returns {Promise} - Parsed service data or null if invalid. + */ + static async parseServiceData( + serviceData: Buffer, + emitLog: (level: string, message: string) => void, + ): Promise { + if (serviceData.length !== 8) { + emitLog('debugerror', `[parseServiceDataForWoHumi] Buffer length ${serviceData.length} !== 8!`) + return null + } + + const byte1 = serviceData.readUInt8(1) + const byte4 = serviceData.readUInt8(4) + + const onState = !!(byte1 & 0b10000000) // 1 - on + const autoMode = !!(byte4 & 0b10000000) // 1 - auto + const percentage = byte4 & 0b01111111 // 0-100%, 101/102/103 - Quick gear 1/2/3 + const humidity = autoMode ? 0 : percentage === 101 ? 33 : percentage === 102 ? 66 : percentage === 103 ? 100 : percentage + + const data: humidifier2ServiceData = { + model: SwitchBotBLEModel.Humidifier2, + modelName: SwitchBotBLEModelName.Humidifier2, + modelFriendlyName: SwitchBotBLEModelFriendlyName.Humidifier2, + onState, + autoMode, + percentage: autoMode ? 0 : percentage, + humidity, + } + + return data + } + + /** + * Sends a command to the humidifier. + * @param {Buffer} reqBuf - The command buffer. + * @returns {Promise} + */ + protected async operateHumi(reqBuf: Buffer): Promise { + const resBuf = await this.command(reqBuf) + const code = resBuf.readUInt8(0) + + if (resBuf.length !== 3 || (code !== 0x01 && code !== 0x05)) { + throw new Error(`The device returned an error: 0x${resBuf.toString('hex')}`) + } + } + + /** + * Turns on the humidifier. + * @returns {Promise} + */ + public async turnOn(): Promise { + await this.operateHumi(Buffer.from(TURN_ON_KEY, 'hex')) + } + + /** + * Turns off the humidifier. + * @returns {Promise} + */ + public async turnOff(): Promise { + await this.operateHumi(Buffer.from(TURN_OFF_KEY, 'hex')) + } + + /** + * Increases the humidifier setting. + * @returns {Promise} + */ + public async increase(): Promise { + await this.operateHumi(Buffer.from(INCREASE_KEY, 'hex')) + } + + /** + * Decreases the humidifier setting. + * @returns {Promise} + */ + public async decrease(): Promise { + await this.operateHumi(Buffer.from(DECREASE_KEY, 'hex')) + } + + /** + * Sets the humidifier to auto mode. + * @returns {Promise} + */ + public async setAutoMode(): Promise { + await this.operateHumi(Buffer.from(SET_AUTO_MODE_KEY, 'hex')) + } + + /** + * Sets the humidifier to manual mode. + * @returns {Promise} + */ + public async setManualMode(): Promise { + await this.operateHumi(Buffer.from(SET_MANUAL_MODE_KEY, 'hex')) + } + + /** + * Sets the humidifier level. + * @param {number} level - The level to set (0-100). + * @returns {Promise} + */ + public async percentage(level: number): Promise { + if (level < 0 || level > 100) { + throw new Error('Level must be between 0 and 100') + } + const levelKey = `${HUMIDIFIER_COMMAND_HEADER}0107${level.toString(16).padStart(2, '0')}` + await this.operateHumi(Buffer.from(levelKey, 'hex')) + } +} diff --git a/src/device/woleak.ts b/src/device/woleak.ts index 5ee1bfce..fca70e13 100644 --- a/src/device/woleak.ts +++ b/src/device/woleak.ts @@ -37,21 +37,10 @@ export class WoLeak extends SwitchbotDevice { return null } - const modelId = serviceData.readUInt8(0) - - if (modelId !== 0x26) { - // Not a Water Leak Detector - emitLog('debugerror', `[parseServiceDataForWoLeakDetector] Model ID ${modelId} !== 0x26!`) - return null - } - - const eventFlags = serviceData.readUInt8(1) - const waterLeakDetected = !!(eventFlags & 0b00000001) // Bit 0 - const deviceTampered = !!(eventFlags & 0b00000010) // Bit 1 - - const batteryInfo = serviceData.readUInt8(2) - const batteryLevel = batteryInfo & 0b01111111 // Bits 0-6 - const lowBattery = !!(batteryInfo & 0b10000000) // Bit 7 + const waterLeakDetected = !!(manufacturerData.readUInt8(8) & 0b00000001) // Bit 0 + const deviceTampered = !!(manufacturerData.readUInt8(8) & 0b00000010) // Bit 1 + const batteryLevel = manufacturerData.readUInt8(7) & 0b01111111 // Bits 0-6 + const lowBattery = !!(manufacturerData.readUInt8(7) & 0b10000000) // Bit 7 // Manufacturer data can be processed here if needed diff --git a/src/device/worelayswitch1.ts b/src/device/worelayswitch1.ts new file mode 100644 index 00000000..e86dd8a6 --- /dev/null +++ b/src/device/worelayswitch1.ts @@ -0,0 +1,50 @@ +/* Copyright(C) 2024, donavanbecker (https://github.com/donavanbecker). All rights reserved. + * + * worelayswitch1plus.ts: Switchbot BLE API registration. + */ +import type { Buffer } from 'node:buffer' + +import type { relaySwitch1ServiceData } from '../types/bledevicestatus.js' +import type { NobleTypes } from '../types/types.js' + +import { SwitchbotDevice } from '../device.js' +import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types/types.js' + +/** + * Class representing a WoRelaySwitch1 device. + * @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/ + */ +export class WoRelaySwitch1 extends SwitchbotDevice { + constructor(peripheral: NobleTypes['peripheral'], noble: NobleTypes['noble']) { + super(peripheral, noble) + } + + /** + * Parses the service data for WoRelaySwitch1. + * @param {Buffer} serviceData - The service data buffer. + * @param {Buffer} manufacturerData - The manufacturer data buffer. + * @param {Function} emitLog - The function to emit log messages. + * @returns {Promise} - Parsed service data or null if invalid. + */ + static async parseServiceData( + serviceData: Buffer, + manufacturerData: Buffer, + emitLog: (level: string, message: string) => void, + ): Promise { + if (serviceData.length < 8 || manufacturerData.length === null) { + emitLog('debugerror', `[parseServiceDataForWoRelaySwitch1Plus] Buffer length ${serviceData.length} < 8!`) + return null + } + + const data: relaySwitch1ServiceData = { + model: SwitchBotBLEModel.RelaySwitch1, + modelName: SwitchBotBLEModelName.RelaySwitch1, + modelFriendlyName: SwitchBotBLEModelFriendlyName.RelaySwitch1, + mode: true, // for compatibility, useless + state: !!(manufacturerData[7] & 0b10000000), + sequence_number: manufacturerData[6], + } + + return data + } +} diff --git a/src/device/worelayswitch1plus.ts b/src/device/worelayswitch1plus.ts deleted file mode 100644 index 23da1388..00000000 --- a/src/device/worelayswitch1plus.ts +++ /dev/null @@ -1,168 +0,0 @@ -/* Copyright(C) 2024, donavanbecker (https://github.com/donavanbecker). All rights reserved. - * - * worelayswitch1plus.ts: Switchbot BLE API registration. - */ -import type { relaySwitch1PlusServiceData } from '../types/bledevicestatus.js' -import type { NobleTypes } from '../types/types.js' - -import { Buffer } from 'node:buffer' -import { type Cipher, createCipheriv } from 'node:crypto' - -import { SwitchbotDevice } from '../device.js' -import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types/types.js' - -const COMMAND_HEADER = '57' -const COMMAND_GET_CK_IV = `${COMMAND_HEADER}0f2103` -const COMMAND_TURN_OFF = `${COMMAND_HEADER}0f70010000` -const COMMAND_TURN_ON = `${COMMAND_HEADER}0f70010100` -const COMMAND_TOGGLE = `${COMMAND_HEADER}0f70010200` -const COMMAND_GET_VOLTAGE_AND_CURRENT = `${COMMAND_HEADER}0f7106000000` -// const PASSIVE_POLL_INTERVAL = 1 * 60 - -/** - * Class representing a WoRelaySwitch1Plus device. - * @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/ - */ -export class WoRelaySwitch1Plus extends SwitchbotDevice { - private _iv: Buffer | null = null - private _cipher: Cipher | null = null - private _keyId: string - private _encryptionKey: Buffer - - constructor(peripheral: NobleTypes['peripheral'], noble: NobleTypes['noble']) { - super(peripheral, noble) - const keyId = peripheral.advertisement.localName?.slice(-2) || '' - const encryptionKey = peripheral.advertisement.localName?.slice(0, 32) || '' - if (keyId.length === 0) { - throw new Error('key_id is missing') - } else if (keyId.length !== 2) { - throw new Error('key_id is invalid') - } - if (encryptionKey.length === 0) { - throw new Error('encryption_key is missing') - } else if (encryptionKey.length !== 32) { - throw new Error('encryption_key is invalid') - } - this._keyId = keyId - this._encryptionKey = Buffer.from(encryptionKey, 'hex') - } - - /** - * Parses the service data for WoRelaySwitch1Plus. - * @param {Buffer} serviceData - The service data buffer. - * @param {Buffer} manufacturerData - The manufacturer data buffer. - * @param {Function} emitLog - The function to emit log messages. - * @returns {Promise} - Parsed service data or null if invalid. - */ - static async parseServiceData( - serviceData: Buffer, - manufacturerData: Buffer, - emitLog: (level: string, message: string) => void, - ): Promise { - if (serviceData.length < 8 || manufacturerData.length === null) { - emitLog('debugerror', `[parseServiceDataForWoRelaySwitch1Plus] Buffer length ${serviceData.length} < 8!`) - return null - } - - const data: relaySwitch1PlusServiceData = { - model: SwitchBotBLEModel.RelaySwitch1Plus, - modelName: SwitchBotBLEModelName.RelaySwitch1Plus, - modelFriendlyName: SwitchBotBLEModelFriendlyName.RelaySwitch1Plus, - mode: true, // for compatibility, useless - state: !!(manufacturerData[7] & 0b10000000), - sequence_number: manufacturerData[6], - } - - return data - } - - async turnOn(): Promise { - const result = await this._sendCommand(COMMAND_TURN_ON) - const ok = this._checkCommandResult(result, 0, new Set([1])) - if (ok) { - this._overrideState({ isOn: true }) - this._fireCallbacks() - } - return ok - } - - async turnOff(): Promise { - const result = await this._sendCommand(COMMAND_TURN_OFF) - const ok = this._checkCommandResult(result, 0, new Set([1])) - if (ok) { - this._overrideState({ isOn: false }) - this._fireCallbacks() - } - return ok - } - - async toggle(): Promise { - const result = await this._sendCommand(COMMAND_TOGGLE) - return this._checkCommandResult(result, 0, new Set([1])) - } - - async getVoltageAndCurrent(): Promise<{ voltage: number, current: number } | null> { - const result = await this._sendCommand(COMMAND_GET_VOLTAGE_AND_CURRENT) - const ok = this._checkCommandResult(result, 0, new Set([1])) - if (ok) { - return { - voltage: result ? (result[9] << 8) + result[10] : 0, - current: result ? (result[11] << 8) + result[12] : 0, - } - } - return null - } - - private async _sendCommand(key: string, retry: number | null = null, encrypt: boolean = true): Promise { - if (!encrypt) { - return await super._sendCommand(`${key.slice(0, 2)}000000${key.slice(2)}`, retry) - } - - const result = await this._ensureEncryptionInitialized() - if (!result) { - return null - } - - const encrypted = key.slice(0, 2) + this._keyId + this._iv!.slice(0, 2).toString('hex') + this._encrypt(key.slice(2)) - const response = await super._sendCommand(encrypted, retry) - return response ? Buffer.concat([response.slice(0, 1), this._decrypt(response.slice(4))]) : null - } - - private async _ensureEncryptionInitialized(): Promise { - if (this._iv !== null) { - return true - } - - const result = await this._sendCommand(COMMAND_GET_CK_IV + this._keyId, null, false) - const ok = this._checkCommandResult(result, 0, new Set([1])) - if (ok) { - this._iv = result!.slice(4) - } - return ok - } - - private _getCipher(): Cipher { - if (this._cipher === null) { - this._cipher = createCipheriv('aes-128-ctr', this._encryptionKey, this._iv!) - } - return this._cipher - } - - private _encrypt(data: string): string { - if (data.length === 0) { - return '' - } - const cipher = this._getCipher() - const encrypted = Buffer.concat([cipher.update(Buffer.from(data, 'hex')), cipher.final()]) - return encrypted.toString('hex') - } - - private _decrypt(data: Buffer): Buffer { - if (data.length === 0) { - return Buffer.alloc(0) - } - const decipher = createCipheriv('aes-128-ctr', this._encryptionKey, this._iv!) - const decrypted = Buffer.concat([decipher.update(data), decipher.final()]) - return decrypted - } -} diff --git a/src/device/worelayswitch1pm.ts b/src/device/worelayswitch1pm.ts index dac842f8..ce17af53 100644 --- a/src/device/worelayswitch1pm.ts +++ b/src/device/worelayswitch1pm.ts @@ -2,51 +2,21 @@ * * worelayswitch1pm.ts: Switchbot BLE API registration. */ -import type { Cipher } from 'node:crypto' +import type { Buffer } from 'node:buffer' import type { relaySwitch1PMServiceData } from '../types/bledevicestatus.js' import type { NobleTypes } from '../types/types.js' -import { Buffer } from 'node:buffer' -import { createCipheriv } from 'node:crypto' - import { SwitchbotDevice } from '../device.js' import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types/types.js' -const COMMAND_HEADER = '57' -const COMMAND_GET_CK_IV = `${COMMAND_HEADER}0f2103` -const COMMAND_TURN_OFF = `${COMMAND_HEADER}0f70010000` -const COMMAND_TURN_ON = `${COMMAND_HEADER}0f70010100` -const COMMAND_TOGGLE = `${COMMAND_HEADER}0f70010200` -const COMMAND_GET_VOLTAGE_AND_CURRENT = `${COMMAND_HEADER}0f7106000000` -// const PASSIVE_POLL_INTERVAL = 1 * 60 - /** * Class representing a WoRelaySwitch1PM device. * @see https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/ */ export class WoRelaySwitch1PM extends SwitchbotDevice { - private _iv: Buffer | null = null - private _cipher: Cipher | null = null - private _keyId: string - private _encryptionKey: Buffer - constructor(peripheral: NobleTypes['peripheral'], noble: NobleTypes['noble']) { super(peripheral, noble) - const keyId = peripheral.advertisement.localName?.slice(-2) || '' - const encryptionKey = peripheral.advertisement.localName?.slice(0, 32) || '' - if (keyId.length === 0) { - throw new Error('key_id is missing') - } else if (keyId.length !== 2) { - throw new Error('key_id is invalid') - } - if (encryptionKey.length === 0) { - throw new Error('encryption_key is missing') - } else if (encryptionKey.length !== 32) { - throw new Error('encryption_key is invalid') - } - this._keyId = keyId - this._encryptionKey = Buffer.from(encryptionKey, 'hex') } /** @@ -61,7 +31,7 @@ export class WoRelaySwitch1PM extends SwitchbotDevice { manufacturerData: Buffer, emitLog: (level: string, message: string) => void, ): Promise { - if (serviceData.length < 8 || manufacturerData.length === null) { + if (serviceData.length < 8 || manufacturerData.length === 0) { emitLog('debugerror', `[parseServiceDataForWoRelaySwitch1PM] Buffer length ${serviceData.length} < 8!`) return null } @@ -80,94 +50,4 @@ export class WoRelaySwitch1PM extends SwitchbotDevice { return data } - - async turnOn(): Promise { - const result = await this._sendCommand(COMMAND_TURN_ON) - const ok = this._checkCommandResult(result, 0, new Set([1])) - if (ok) { - this._overrideState({ isOn: true }) - this._fireCallbacks() - } - return ok - } - - async turnOff(): Promise { - const result = await this._sendCommand(COMMAND_TURN_OFF) - const ok = this._checkCommandResult(result, 0, new Set([1])) - if (ok) { - this._overrideState({ isOn: false }) - this._fireCallbacks() - } - return ok - } - - async toggle(): Promise { - const result = await this._sendCommand(COMMAND_TOGGLE) - return this._checkCommandResult(result, 0, new Set([1])) - } - - async getVoltageAndCurrent(): Promise<{ voltage: number, current: number } | null> { - const result = await this._sendCommand(COMMAND_GET_VOLTAGE_AND_CURRENT) - const ok = this._checkCommandResult(result, 0, new Set([1])) - if (ok) { - return { - voltage: result ? (result[9] << 8) + result[10] : 0, - current: result ? (result[11] << 8) + result[12] : 0, - } - } - return null - } - - private async _sendCommand(key: string, retry: number | null = null, encrypt: boolean = true): Promise { - if (!encrypt) { - return await super._sendCommand(`${key.slice(0, 2)}000000${key.slice(2)}`, retry) - } - - const result = await this._ensureEncryptionInitialized() - if (!result) { - return null - } - - const encrypted = key.slice(0, 2) + this._keyId + this._iv!.slice(0, 2).toString('hex') + this._encrypt(key.slice(2)) - const response = await super._sendCommand(encrypted, retry) - return response ? Buffer.concat([response.slice(0, 1), this._decrypt(response.slice(4))]) : null - } - - private async _ensureEncryptionInitialized(): Promise { - if (this._iv !== null) { - return true - } - - const result = await this._sendCommand(COMMAND_GET_CK_IV + this._keyId, null, false) - const ok = this._checkCommandResult(result, 0, new Set([1])) - if (ok) { - this._iv = result!.slice(4) - } - return ok - } - - private _getCipher(): Cipher { - if (this._cipher === null) { - this._cipher = createCipheriv('aes-128-ctr', this._encryptionKey, this._iv!) - } - return this._cipher - } - - private _encrypt(data: string): string { - if (data.length === 0) { - return '' - } - const cipher = this._getCipher() - const encrypted = Buffer.concat([cipher.update(Buffer.from(data, 'hex')), cipher.final()]) - return encrypted.toString('hex') - } - - private _decrypt(data: Buffer): Buffer { - if (data.length === 0) { - return Buffer.alloc(0) - } - const decipher = createCipheriv('aes-128-ctr', this._encryptionKey, this._iv!) - const decrypted = Buffer.concat([decipher.update(data), decipher.final()]) - return decrypted - } } diff --git a/src/settings.ts b/src/settings.ts index a629fa09..b0d7ae5c 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -3,35 +3,35 @@ * * © 2024, donavanbecker (https://github.com/donavanbecker). All rights reserved. */ -/** - * This is the main url used to scan for Devices SwitchBot API - */ -export const baseURL = 'https://api.switch-bot.com/v1.1' - -/** - * This is the main url used to scan for Devices SwitchBot API - */ -export const devicesURL = 'https://api.switch-bot.com/v1.1/devices' - -/** - * This is the updateWebhook url used to access SwitchBot API - */ -export const setupWebhook = 'https://api.switch-bot.com/v1.1/webhook/setupWebhook' +let baseURL = 'https://api.switch-bot.com' -/** - * This is the updateWebhook url used to access SwitchBot API - */ -export const queryWebhook = 'https://api.switch-bot.com/v1.1/webhook/queryWebhook' +let devicesURL = `${baseURL}/v1.1/devices` +let setupWebhook = `${baseURL}/v1.1/webhook/setupWebhook` +let queryWebhook = `${baseURL}/v1.1/webhook/queryWebhook` +let updateWebhook = `${baseURL}/v1.1/webhook/updateWebhook` +let deleteWebhook = `${baseURL}/v1.1/webhook/deleteWebhook` /** - * This is the updateWebhook url used to access SwitchBot API + * Updates the base URL for the SwitchBot API endpoints. + * @param {string} newBaseURL - The new base URL to use. */ -export const updateWebhook = 'https://api.switch-bot.com/v1.1/webhook/updateWebhook' +export function updateBaseURL(newBaseURL: string): void { + baseURL = newBaseURL + devicesURL = `${baseURL}/v1.1/devices` + setupWebhook = `${baseURL}/v1.1/webhook/setupWebhook` + queryWebhook = `${baseURL}/v1.1/webhook/queryWebhook` + updateWebhook = `${baseURL}/v1.1/webhook/updateWebhook` + deleteWebhook = `${baseURL}/v1.1/webhook/deleteWebhook` +} -/** - * This is the deleteWebhook url used to access SwitchBot API - */ -export const deleteWebhook = 'https://api.switch-bot.com/v1.1/webhook/deleteWebhook' +export const urls = { + get baseURL() { return baseURL }, + get devicesURL() { return devicesURL }, + get setupWebhook() { return setupWebhook }, + get queryWebhook() { return queryWebhook }, + get updateWebhook() { return updateWebhook }, + get deleteWebhook() { return deleteWebhook }, +} /** * constants used to access SwitchBot BLE API diff --git a/src/switchbot-ble.ts b/src/switchbot-ble.ts index 360ed244..5527a0b8 100644 --- a/src/switchbot-ble.ts +++ b/src/switchbot-ble.ts @@ -15,6 +15,7 @@ import { WoContact } from './device/wocontact.js' import { WoCurtain } from './device/wocurtain.js' import { WoHand } from './device/wohand.js' import { WoHub2 } from './device/wohub2.js' +import { WoHumi2 } from './device/wohumi2.js' import { WoHumi } from './device/wohumi.js' import { WoIOSensorTH } from './device/woiosensorth.js' import { WoKeypad } from './device/wokeypad.js' @@ -22,7 +23,7 @@ import { WoLeak } from './device/woleak.js' import { WoPlugMiniUS } from './device/woplugmini.js' import { WoPlugMiniJP } from './device/woplugmini_jp.js' import { WoPresence } from './device/wopresence.js' -import { WoRelaySwitch1Plus } from './device/worelayswitch1plus.js' +import { WoRelaySwitch1 } from './device/worelayswitch1.js' import { WoRelaySwitch1PM } from './device/worelayswitch1pm.js' import { WoSensorTH } from './device/wosensorth.js' import { WoSensorTHPlus } from './device/wosensorthplus.js' @@ -227,6 +228,7 @@ export class SwitchBotBLE extends EventEmitter { case SwitchBotBLEModel.Curtain: case SwitchBotBLEModel.Curtain3: return new WoCurtain(peripheral, this.noble) case SwitchBotBLEModel.Humidifier: return new WoHumi(peripheral, this.noble) + case SwitchBotBLEModel.Humidifier2: return new WoHumi2(peripheral, this.noble) case SwitchBotBLEModel.Meter: return new WoSensorTH(peripheral, this.noble) case SwitchBotBLEModel.MeterPlus: return new WoSensorTHPlus(peripheral, this.noble) case SwitchBotBLEModel.MeterPro: return new WoSensorTHPro(peripheral, this.noble) @@ -246,8 +248,8 @@ export class SwitchBotBLE extends EventEmitter { case SwitchBotBLEModel.LockPro: return new WoSmartLockPro(peripheral, this.noble) case SwitchBotBLEModel.BlindTilt: return new WoBlindTilt(peripheral, this.noble) case SwitchBotBLEModel.Keypad: return new WoKeypad(peripheral, this.noble) + case SwitchBotBLEModel.RelaySwitch1: return new WoRelaySwitch1(peripheral, this.noble) case SwitchBotBLEModel.RelaySwitch1PM: return new WoRelaySwitch1PM(peripheral, this.noble) - case SwitchBotBLEModel.RelaySwitch1Plus: return new WoRelaySwitch1Plus(peripheral, this.noble) default: return new SwitchbotDevice(peripheral, this.noble) } } diff --git a/src/switchbot-openapi.ts b/src/switchbot-openapi.ts index 13dc5c1d..13e94f32 100644 --- a/src/switchbot-openapi.ts +++ b/src/switchbot-openapi.ts @@ -16,7 +16,7 @@ import { createServer } from 'node:http' import { request } from 'undici' -import { baseURL, deleteWebhook, devicesURL, queryWebhook, setupWebhook, updateWebhook } from './settings.js' +import { updateBaseURL, urls } from './settings.js' /** * The `SwitchBotOpenAPI` class provides methods to interact with the SwitchBot OpenAPI. @@ -66,11 +66,15 @@ export class SwitchBotOpenAPI extends EventEmitter { * @param token - The API token used for authentication. * @param secret - The secret key used for signing requests. */ - constructor(token: string, secret: string) { + constructor(token: string, secret: string, hostname?: string) { super() this.token = token this.secret = secret - this.baseURL = baseURL + this.baseURL = urls.baseURL + + if (hostname) { + updateBaseURL(hostname) + } } /** @@ -91,7 +95,7 @@ export class SwitchBotOpenAPI extends EventEmitter { */ async getDevices(): Promise<{ response: devices, statusCode: number }> { try { - const { body, statusCode } = await request(devicesURL, { headers: this.generateHeaders() }) + const { body, statusCode } = await request(urls.devicesURL, { headers: this.generateHeaders() }) const response = await body.json() as devices this.emitLog('debug', `Got devices: ${JSON.stringify(response)}`) this.emitLog('debug', `statusCode: ${statusCode}`) @@ -233,7 +237,7 @@ export class SwitchBotOpenAPI extends EventEmitter { } try { - const { body, statusCode } = await request(setupWebhook, { + const { body, statusCode } = await request(urls.setupWebhook, { method: 'POST', headers: this.generateHeaders(), body: JSON.stringify({ @@ -252,7 +256,7 @@ export class SwitchBotOpenAPI extends EventEmitter { } try { - const { body, statusCode } = await request(updateWebhook, { + const { body, statusCode } = await request(urls.updateWebhook, { method: 'POST', headers: this.generateHeaders(), body: JSON.stringify({ @@ -273,7 +277,7 @@ export class SwitchBotOpenAPI extends EventEmitter { } try { - const { body, statusCode } = await request(queryWebhook, { + const { body, statusCode } = await request(urls.queryWebhook, { method: 'POST', headers: this.generateHeaders(), body: JSON.stringify({ @@ -302,7 +306,7 @@ export class SwitchBotOpenAPI extends EventEmitter { */ async deleteWebhook(url: string): Promise { try { - const { body, statusCode } = await request(deleteWebhook, { + const { body, statusCode } = await request(urls.deleteWebhook, { method: 'POST', headers: this.generateHeaders(), body: JSON.stringify({ diff --git a/src/test/settings.test.ts b/src/test/settings.test.ts index 93b3573b..212ec6cf 100644 --- a/src/test/settings.test.ts +++ b/src/test/settings.test.ts @@ -5,13 +5,9 @@ import { CHAR_UUID_NOTIFY, CHAR_UUID_WRITE, COMMAND_TIMEOUT_MSEC, - deleteWebhook, - devicesURL, - queryWebhook, READ_TIMEOUT_MSEC, SERV_UUID_PRIMARY, - setupWebhook, - updateWebhook, + urls, WoSmartLockCommands, WoSmartLockProCommands, WRITE_TIMEOUT_MSEC, @@ -19,23 +15,23 @@ import { describe('switchBot API Settings', () => { it('should have correct Devices URL', () => { - expect(devicesURL).toBe('https://api.switch-bot.com/v1.1/devices') + expect(urls.devicesURL).toBe('https://api.switch-bot.com/v1.1/devices') }) it('should have correct setupWebhook URL', () => { - expect(setupWebhook).toBe('https://api.switch-bot.com/v1.1/webhook/setupWebhook') + expect(urls.setupWebhook).toBe('https://api.switch-bot.com/v1.1/webhook/setupWebhook') }) it('should have correct queryWebhook URL', () => { - expect(queryWebhook).toBe('https://api.switch-bot.com/v1.1/webhook/queryWebhook') + expect(urls.queryWebhook).toBe('https://api.switch-bot.com/v1.1/webhook/queryWebhook') }) it('should have correct updateWebhook URL', () => { - expect(updateWebhook).toBe('https://api.switch-bot.com/v1.1/webhook/updateWebhook') + expect(urls.updateWebhook).toBe('https://api.switch-bot.com/v1.1/webhook/updateWebhook') }) it('should have correct deleteWebhook URL', () => { - expect(deleteWebhook).toBe('https://api.switch-bot.com/v1.1/webhook/deleteWebhook') + expect(urls.deleteWebhook).toBe('https://api.switch-bot.com/v1.1/webhook/deleteWebhook') }) it('should have correct BLE API constants', () => { diff --git a/src/test/wohumi.test.ts b/src/test/wohumi.test.ts index 1cb1c31a..31dea137 100644 --- a/src/test/wohumi.test.ts +++ b/src/test/wohumi.test.ts @@ -2,93 +2,44 @@ import type { NobleTypes } from '../types/types.js' import { Buffer } from 'node:buffer' -import { describe, expect, it, vi } from 'vitest' +import { describe, expect, it } from 'vitest' +import { SwitchbotDevice } from '../device.js' import { WoHumi } from '../device/wohumi.js' -import { SwitchBotBLEModel, SwitchBotBLEModelFriendlyName, SwitchBotBLEModelName } from '../types/types.js' describe('woHumi', () => { - const emitLog = vi.fn() - - describe('parseServiceData', () => { - it('should return parsed data for valid service data', async () => { - const serviceData = Buffer.from([0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00]) - const result = await WoHumi.parseServiceData(serviceData, emitLog) - expect(result).toEqual({ - model: SwitchBotBLEModel.Humidifier, - modelName: SwitchBotBLEModelName.Humidifier, - modelFriendlyName: SwitchBotBLEModelFriendlyName.Humidifier, - onState: true, - autoMode: true, - percentage: 0, - humidity: 0, - }) - }) - - it('should return null for invalid service data length', async () => { - const serviceData = Buffer.from([0x00, 0x80, 0x00]) - const result = await WoHumi.parseServiceData(serviceData, emitLog) - expect(result).toBeNull() - expect(emitLog).toHaveBeenCalledWith('error', '[parseServiceDataForWoHumi] Buffer length 3 !== 8!') - }) + let wohumi: WoHumi + let mockPeripheral: NobleTypes['peripheral'] + let mockNoble: NobleTypes['noble'] + + beforeEach(() => { + mockPeripheral = {} as NobleTypes['peripheral'] + mockNoble = {} as NobleTypes['noble'] + wohumi = new WoHumi(mockPeripheral, mockNoble) + jest.spyOn(SwitchbotDevice.prototype, 'command').mockResolvedValue(Buffer.from([0x01, 0x00, 0x00])) }) - describe('operateHumi', () => { - it('should throw an error if the device returns an error', async () => { - const peripheral = {} as unknown as NobleTypes['peripheral'] - const wohumi = new WoHumi(peripheral, emitLog as any) - vi.spyOn(wohumi, 'command').mockResolvedValue(Buffer.from([0x00, 0x00, 0x00])) - await expect(wohumi.operateHumi([0x57, 0x01, 0x00])).rejects.toThrow('The device returned an error: 0x000000') - }) + afterEach(() => { + jest.restoreAllMocks() }) - describe('press', () => { - it('should call operateHumi with correct bytes', async () => { - const peripheral = {} as unknown as NobleTypes['peripheral'] - const wohumi = new WoHumi(peripheral, emitLog as any) - const operateHumiSpy = vi.spyOn(wohumi, 'operateHumi').mockResolvedValue() - await wohumi.press() - expect(operateHumiSpy).toHaveBeenCalledWith([0x57, 0x01, 0x00]) + describe('percentage', () => { + it('should throw an error if level is less than 0', async () => { + await expect(wohumi.percentage(-1)).rejects.toThrow('Level must be between 0 and 100') }) - }) - describe('turnOn', () => { - it('should call operateHumi with correct bytes', async () => { - const peripheral = {} as unknown as NobleTypes['peripheral'] - const wohumi = new WoHumi(peripheral, emitLog as any) - const operateHumiSpy = vi.spyOn(wohumi, 'operateHumi').mockResolvedValue() - await wohumi.turnOn() - expect(operateHumiSpy).toHaveBeenCalledWith([0x57, 0x01, 0x01]) + it('should throw an error if level is greater than 100', async () => { + await expect(wohumi.percentage(101)).rejects.toThrow('Level must be between 0 and 100') }) - }) - describe('turnOff', () => { - it('should call operateHumi with correct bytes', async () => { - const peripheral = {} as unknown as NobleTypes['peripheral'] - const wohumi = new WoHumi(peripheral, emitLog as any) - const operateHumiSpy = vi.spyOn(wohumi, 'operateHumi').mockResolvedValue() - await wohumi.turnOff() - expect(operateHumiSpy).toHaveBeenCalledWith([0x57, 0x01, 0x02]) - }) - }) + it('should send the correct command for a valid level', async () => { + const level = 50 + const expectedCommand = Buffer.from(`57010107${level.toString(16).padStart(2, '0')}`, 'hex') + const operateHumiSpy = jest.spyOn(wohumi as any, 'operateHumi') - describe('down', () => { - it('should call operateHumi with correct bytes', async () => { - const peripheral = {} as unknown as NobleTypes['peripheral'] - const wohumi = new WoHumi(peripheral, emitLog as any) - const operateHumiSpy = vi.spyOn(wohumi, 'operateHumi').mockResolvedValue() - await wohumi.down() - expect(operateHumiSpy).toHaveBeenCalledWith([0x57, 0x01, 0x03]) - }) - }) + await wohumi.percentage(level) - describe('up', () => { - it('should call operateHumi with correct bytes', async () => { - const peripheral = {} as unknown as NobleTypes['peripheral'] - const wohumi = new WoHumi(peripheral, emitLog as any) - const operateHumiSpy = vi.spyOn(wohumi, 'operateHumi').mockResolvedValue() - await wohumi.up() - expect(operateHumiSpy).toHaveBeenCalledWith([0x57, 0x01, 0x04]) + expect(operateHumiSpy).toHaveBeenCalledWith(expectedCommand) }) }) }) diff --git a/src/test/wohumi2.test.ts b/src/test/wohumi2.test.ts new file mode 100644 index 00000000..01d9626e --- /dev/null +++ b/src/test/wohumi2.test.ts @@ -0,0 +1,45 @@ +import type { NobleTypes } from '../types/types.js' + +import { Buffer } from 'node:buffer' + +import { describe, expect, it } from 'vitest' + +import { SwitchbotDevice } from '../device.js' +import { WoHumi2 } from '../device/wohumi2.js' + +describe('woHumi', () => { + let wohumi: WoHumi2 + let mockPeripheral: NobleTypes['peripheral'] + let mockNoble: NobleTypes['noble'] + + beforeEach(() => { + mockPeripheral = {} as NobleTypes['peripheral'] + mockNoble = {} as NobleTypes['noble'] + wohumi = new WoHumi2(mockPeripheral, mockNoble) + jest.spyOn(SwitchbotDevice.prototype, 'command').mockResolvedValue(Buffer.from([0x01, 0x00, 0x00])) + }) + + afterEach(() => { + jest.restoreAllMocks() + }) + + describe('percentage', () => { + it('should throw an error if level is less than 0', async () => { + await expect(wohumi.percentage(-1)).rejects.toThrow('Level must be between 0 and 100') + }) + + it('should throw an error if level is greater than 100', async () => { + await expect(wohumi.percentage(101)).rejects.toThrow('Level must be between 0 and 100') + }) + + it('should send the correct command for a valid level', async () => { + const level = 50 + const expectedCommand = Buffer.from(`57010107${level.toString(16).padStart(2, '0')}`, 'hex') + const operateHumiSpy = jest.spyOn(wohumi as any, 'operateHumi') + + await wohumi.percentage(level) + + expect(operateHumiSpy).toHaveBeenCalledWith(expectedCommand) + }) + }) +}) diff --git a/src/types/bledevicestatus.ts b/src/types/bledevicestatus.ts index a2a3d7b4..cf7aeb7b 100644 --- a/src/types/bledevicestatus.ts +++ b/src/types/bledevicestatus.ts @@ -312,6 +312,16 @@ export type humidifierServiceData = serviceData & { humidity: number } +export type humidifier2ServiceData = serviceData & { + model: SwitchBotBLEModel.Humidifier2 + modelName: SwitchBotBLEModelName.Humidifier2 + modelFriendlyName: SwitchBotBLEModelFriendlyName.Humidifier2 + onState: boolean + autoMode: boolean + percentage: number + humidity: number +} + export type robotVacuumCleanerServiceData = serviceData & { model: SwitchBotBLEModel.Unknown modelName: SwitchBotBLEModelName.Unknown @@ -330,6 +340,15 @@ export type keypadDetectorServiceData = serviceData & { low_battery: boolean } +export type relaySwitch1ServiceData = serviceData & { + model: SwitchBotBLEModel.RelaySwitch1 + modelName: SwitchBotBLEModelName.RelaySwitch1 + modelFriendlyName: SwitchBotBLEModelFriendlyName.RelaySwitch1 + mode: boolean + state: boolean + sequence_number: number +} + export type relaySwitch1PMServiceData = serviceData & { model: SwitchBotBLEModel.RelaySwitch1PM modelName: SwitchBotBLEModelName.RelaySwitch1PM @@ -341,12 +360,3 @@ export type relaySwitch1PMServiceData = serviceData & { voltage: number current: number } - -export type relaySwitch1PlusServiceData = serviceData & { - model: SwitchBotBLEModel.RelaySwitch1Plus - modelName: SwitchBotBLEModelName.RelaySwitch1Plus - modelFriendlyName: SwitchBotBLEModelFriendlyName.RelaySwitch1Plus - mode: boolean - state: boolean - sequence_number: number -} diff --git a/src/types/devicestatus.ts b/src/types/devicestatus.ts index 0dddee36..39e607ee 100644 --- a/src/types/devicestatus.ts +++ b/src/types/devicestatus.ts @@ -165,6 +165,17 @@ export type humidifierStatus = deviceStatus & { lackWater: boolean } +export type humidifier2Status = deviceStatus & { + power: string + humidity: number + temperature: number + nebulizationEfficiency: number + auto: boolean + childLock: boolean + sound: boolean + lackWater: boolean +} + export type blindTiltStatus = deviceStatus & { calibrate: boolean battery: number diff --git a/src/types/devicewebhookstatus.ts b/src/types/devicewebhookstatus.ts index bec9c0e2..9b10506c 100644 --- a/src/types/devicewebhookstatus.ts +++ b/src/types/devicewebhookstatus.ts @@ -240,3 +240,9 @@ export type humidifierWebhookContext = deviceWebhookContext & { humidity: number scale: 'CELSIUS' | 'FAHRENHEIT' } + +export type humidifier2WebhookContext = deviceWebhookContext & { + temperature: number + humidity: number + scale: 'CELSIUS' | 'FAHRENHEIT' +} diff --git a/src/types/types.ts b/src/types/types.ts index 5b7526bd..ff115223 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -7,7 +7,7 @@ import type { Buffer } from 'node:buffer' import type * as Noble from '@stoprocent/noble' import type { SwitchbotDevice } from '../device.js' -import type { batteryCirculatorFanServiceData, blindTiltServiceData, botServiceData, ceilingLightProServiceData, ceilingLightServiceData, colorBulbServiceData, contactSensorServiceData, curtain3ServiceData, curtainServiceData, hub2ServiceData, humidifierServiceData, keypadDetectorServiceData, lockProServiceData, lockServiceData, meterPlusServiceData, meterProCO2ServiceData, meterProServiceData, meterServiceData, motionSensorServiceData, outdoorMeterServiceData, plugMiniJPServiceData, plugMiniUSServiceData, relaySwitch1PlusServiceData, relaySwitch1PMServiceData, robotVacuumCleanerServiceData, stripLightServiceData, waterLeakDetectorServiceData } from '../index.js' +import type { batteryCirculatorFanServiceData, blindTiltServiceData, botServiceData, ceilingLightProServiceData, ceilingLightServiceData, colorBulbServiceData, contactSensorServiceData, curtain3ServiceData, curtainServiceData, hub2ServiceData, humidifier2ServiceData, humidifierServiceData, keypadDetectorServiceData, lockProServiceData, lockServiceData, meterPlusServiceData, meterProCO2ServiceData, meterProServiceData, meterServiceData, motionSensorServiceData, outdoorMeterServiceData, plugMiniJPServiceData, plugMiniUSServiceData, relaySwitch1PMServiceData, relaySwitch1ServiceData, robotVacuumCleanerServiceData, stripLightServiceData, waterLeakDetectorServiceData } from '../index.js' export type MacAddress = string @@ -54,6 +54,7 @@ export enum SwitchBotModel { Curtain = 'W0701600', Curtain3 = 'W2400000', Humidifier = 'W0801800', + Humidifier2 = 'WXXXXXXX', Plug = 'SP11', // Currently only available in Japan Meter = 'SwitchBot MeterTH S1', MeterPlusJP = 'W2201500', @@ -96,6 +97,7 @@ export enum SwitchBotBLEModel { Curtain = 'c', Curtain3 = '{', Humidifier = 'e', + Humidifier2 = 'E', Meter = 'T', MeterPlus = 'i', MeterPro = '4', @@ -115,8 +117,8 @@ export enum SwitchBotBLEModel { BlindTilt = 'x', Leak = '3', Keypad = 'y', + RelaySwitch1 = ';', RelaySwitch1PM = '<', - RelaySwitch1Plus = ';', Unknown = 'Unknown', } @@ -127,6 +129,7 @@ export enum SwitchBotBLEModelName { Curtain = 'WoCurtain', Curtain3 = 'WoCurtain3', Humidifier = 'WoHumi', + Humidifier2 = 'WoHumi2', Meter = 'WoSensorTH', MeterPlus = 'WoSensorTHPlus', MeterPro = 'WoSensorTHP', @@ -143,8 +146,8 @@ export enum SwitchBotBLEModelName { CeilingLightPro = 'WoCeilingLightPro', Leak = 'WoLeakDetector', Keypad = 'WoKeypad', + RelaySwitch1 = 'WoRelaySwitch1Plus', RelaySwitch1PM = 'WoRelaySwitch1PM', - RelaySwitch1Plus = 'WoRelaySwitch1Plus', Unknown = 'Unknown', } @@ -155,6 +158,7 @@ export enum SwitchBotBLEModelFriendlyName { Curtain = 'Curtain', Curtain3 = 'Curtain 3', Humidifier = 'Humidifier', + Humidifier2 = 'Humidifier2', Meter = 'Meter', Lock = 'Lock', LockPro = 'Lock Pro', @@ -171,8 +175,8 @@ export enum SwitchBotBLEModelFriendlyName { CeilingLightPro = 'Ceiling Light Pro', Leak = 'Water Detector', Keypad = 'Keypad', + RelaySwitch1 = 'Relay Switch 1', RelaySwitch1PM = 'Relay Switch 1PM', - RelaySwitch1Plus = 'Relay Switch 1 Plus', Unknown = 'Unknown', } @@ -210,7 +214,7 @@ export interface ad { id: string address: string rssi: number - serviceData: botServiceData | colorBulbServiceData | contactSensorServiceData | curtainServiceData | curtain3ServiceData | stripLightServiceData | lockServiceData | lockProServiceData | meterServiceData | meterPlusServiceData | meterProServiceData | meterProCO2ServiceData | motionSensorServiceData | outdoorMeterServiceData | plugMiniUSServiceData | plugMiniJPServiceData | blindTiltServiceData | ceilingLightServiceData | ceilingLightProServiceData | hub2ServiceData | batteryCirculatorFanServiceData | waterLeakDetectorServiceData | humidifierServiceData | robotVacuumCleanerServiceData | keypadDetectorServiceData | relaySwitch1PMServiceData | relaySwitch1PlusServiceData + serviceData: botServiceData | colorBulbServiceData | contactSensorServiceData | curtainServiceData | curtain3ServiceData | stripLightServiceData | lockServiceData | lockProServiceData | meterServiceData | meterPlusServiceData | meterProServiceData | meterProCO2ServiceData | motionSensorServiceData | outdoorMeterServiceData | plugMiniUSServiceData | plugMiniJPServiceData | blindTiltServiceData | ceilingLightServiceData | ceilingLightProServiceData | hub2ServiceData | batteryCirculatorFanServiceData | waterLeakDetectorServiceData | humidifierServiceData | humidifier2ServiceData | robotVacuumCleanerServiceData | keypadDetectorServiceData | relaySwitch1PMServiceData | relaySwitch1ServiceData [key: string]: unknown }