diff --git a/.github/workflows/deprecate-past-releases.yml b/.github/workflows/deprecate-past-releases.yml
new file mode 100644
index 00000000..fe7a4727
--- /dev/null
+++ b/.github/workflows/deprecate-past-releases.yml
@@ -0,0 +1,122 @@
+name: Deprecate Past Pre-Releases
+
+on:
+ workflow_dispatch:
+
+permissions:
+ contents: write
+
+jobs:
+ deprecate-previous-pre-release-data:
+ if: ${{ github.ref == 'refs/heads/latest' && github.repository == 'homebridge-plugins/homebridge-govee' }}
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out repository
+ uses: actions/checkout@v4
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 22
+ registry-url: https://registry.npmjs.org/
+
+ - name: Update npm to latest version
+ run: npm install -g npm@latest
+
+ - name: Deprecate previous pre-release npm versions
+ run: |
+ HAS_ERROR=0
+ # Read local package version
+ LATEST_VERSION=$(jq -r .version package.json)
+ echo "Latest version found in package.json: $LATEST_VERSION"
+ echo ""
+ DEPRECATED_VERSIONS=()
+ echo "Fetching pre-release versions of @homebridge-plugins/homebridge-govee from npm..."
+ # Fetch all non-deprecated pre-release versions from the registry
+ RESPONSE=$(curl -s -H "accept: application/vnd.npm.install-v1+json" "https://registry.npmjs.org/@homebridge-plugins/homebridge-govee")
+ BETA_VERSIONS=$(echo "$RESPONSE" | jq -c '[.versions[] | select(.deprecated == null and (.version | test("-"))) | .version]')
+ echo "Found $(echo "$BETA_VERSIONS" | jq 'length') pre-release versions:"
+ for VERSION in $(echo "$BETA_VERSIONS" | jq -r '.[]'); do
+ echo "* Processing version: $VERSION..."
+ BASE_VERSION="${VERSION%%-*}" # Strip pre-release part
+ # Deprecate if base version is less than or equal to latest version
+ if [ "$(printf "%s\n%s" "$BASE_VERSION" "$LATEST_VERSION" | sort -V | tail -n1)" == "$LATEST_VERSION" ]; then
+ if ! OUTPUT=$(npm deprecate @homebridge-plugins/homebridge-govee@"$VERSION" "This beta version is deprecated in favor of the latest release." 2>&1); then
+ echo "$OUTPUT" >&2
+ if echo "$OUTPUT" | grep -q "E429"; then
+ echo "* Error: Rate limit exceeded (429). Stopping the step." >&2
+ HAS_ERROR=2
+ break
+ exit 1
+ else
+ echo "* Error: failed to deprecate version $VERSION" >&2
+ HAS_ERROR=1
+ fi
+ else
+ echo "* Deprecated version: $VERSION"
+ DEPRECATED_VERSIONS+=("$VERSION")
+ fi
+ else
+ echo "* Skipped version: $VERSION"
+ fi
+ done
+ echo ""
+ echo ""
+ echo "Step Summary"
+ if [ ${#DEPRECATED_VERSIONS[@]} -eq 0 ]; then
+ echo "* No versions were deprecated."
+ else
+ echo "* Deprecated ${#DEPRECATED_VERSIONS[@]} pre-release versions:"
+ for VERSION in "${DEPRECATED_VERSIONS[@]}"; do
+ echo " * $VERSION"
+ done
+ fi
+ if [ $HAS_ERROR -eq 0 ]; then
+ echo "* No versions reported an error while being deprecated."
+ elif [ $HAS_ERROR -eq 1 ]; then
+ echo "* Some versions reported an error while being deprecated - check the logs above."
+ elif [ $HAS_ERROR -eq 2 ]; then
+ echo "* The step needed to stop early due to detecting a 429 rate limit - retry the action later."
+ fi
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.npm_token }}
+
+ - name: Delete previous pre-release GitHub releases
+ run: |
+ LATEST_VERSION=$(jq -r .version package.json)
+ echo "Latest version found in package.json: $LATEST_VERSION"
+ echo "Finding GitHub releases with a hyphen in the tag name..."
+
+ gh release list --limit 100 --json tagName --jq '.[] | select(.tagName | test("-"; "i")) | .tagName' | while read -r TAG; do
+ BASE_VERSION="${TAG%%-*}"
+
+ if [ "$(printf "%s\n%s" "$BASE_VERSION" "$LATEST_VERSION" | sort -V | tail -n1)" == "$LATEST_VERSION" ]; then
+ echo "Deleting GitHub release: $TAG (base version: $BASE_VERSION)"
+ gh release delete "$TAG" --yes
+ else
+ echo "Skipping GitHub release: $TAG (base version: $BASE_VERSION is newer than $LATEST_VERSION)"
+ fi
+ done
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Delete previous pre-release Git tags
+ run: |
+ LATEST_VERSION=$(jq -r .version package.json)
+ echo "Latest version found in package.json: $LATEST_VERSION"
+ echo "Fetching tags from origin..."
+ git fetch --tags
+
+ echo "Finding pre-release tags with a hyphen in the name..."
+ git tag -l "*-*" | while read -r TAG; do
+ BASE_VERSION="${TAG%%-*}"
+
+ if [ "$(printf "%s\n%s" "$BASE_VERSION" "$LATEST_VERSION" | sort -V | tail -n1)" == "$LATEST_VERSION" ]; then
+ echo "Deleting tag: $TAG (base version: $BASE_VERSION)"
+ git push origin ":refs/tags/$TAG"
+ else
+ echo "Skipping tag: $TAG (base version: $BASE_VERSION is newer than $LATEST_VERSION)"
+ fi
+ done
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/release-beta.yml b/.github/workflows/release-beta.yml
index 74a4b5c7..3bfd6457 100644
--- a/.github/workflows/release-beta.yml
+++ b/.github/workflows/release-beta.yml
@@ -9,7 +9,9 @@ name: Release (Beta)
on:
push:
branches: [beta-*.*.*]
- workflow_dispatch:
+
+permissions:
+ contents: read
jobs:
eslint:
diff --git a/.github/workflows/release-latest.yml b/.github/workflows/release-latest.yml
index 14a121af..980b0b25 100644
--- a/.github/workflows/release-latest.yml
+++ b/.github/workflows/release-latest.yml
@@ -9,6 +9,9 @@ on:
release:
types: [published]
+permissions:
+ contents: read
+
jobs:
eslint:
uses: homebridge/.github/.github/workflows/eslint.yml@latest
@@ -21,71 +24,3 @@ jobs:
uses: homebridge/.github/.github/workflows/npm-publish-esm.yml@latest
secrets:
npm_auth_token: ${{ secrets.npm_token }}
-
- deprecate-previous-pre-release-data:
- if: ${{ github.repository == 'homebridge-plugins/homebridge-govee' }}
- runs-on: ubuntu-latest
- needs:
- - eslint
- - publish
- steps:
- - name: Check out repository
- uses: actions/checkout@v4
-
- - name: Set up Node.js
- uses: actions/setup-node@v4
- with:
- node-version: 22
- registry-url: https://registry.npmjs.org/
-
- - name: Deprecate previous pre-release NPM versions
- run: |
- # Read local package version
- LATEST_VERSION=$(jq -r .version package.json)
- echo "Latest version found in package.json: $LATEST_VERSION"
- DEPRECATED_VERSIONS=()
- # Get all beta versions (versions with a hyphen)
- mapfile -t BETA_VERSIONS < <(npm view @homebridge-plugins/homebridge-govee versions --json | jq -r '.[]' | grep -- '-')
- for VERSION in "${BETA_VERSIONS[@]}"; do
- BASE_VERSION="${VERSION%%-*}"
- # Compare base version to latest version using sort -V
- if [ "$(printf "%s\n%s" "$BASE_VERSION" "$LATEST_VERSION" | sort -V | head -n1)" != "$LATEST_VERSION" ]; then
- npm deprecate @homebridge-plugins/homebridge-ecovacs@"$VERSION" "This beta version is deprecated in favor of the latest release."
- echo "- Deprecated version: $VERSION (base: $BASE_VERSION)"
- DEPRECATED_VERSIONS+=("$VERSION")
- else
- echo "- Skipped version: $VERSION (base: $BASE_VERSION)"
- fi
- done
- if [ ${#DEPRECATED_VERSIONS[@]} -eq 0 ]; then
- echo "No versions were deprecated."
- else
- echo "Deprecated versions:"
- for VERSION in "${DEPRECATED_VERSIONS[@]}"; do
- echo "- $VERSION"
- done
- fi
- env:
- NODE_AUTH_TOKEN: ${{ secrets.npm_token }}
-
- - name: Delete previous pre-release GitHub releases
- run: |
- echo "Finding GitHub releases with a hyphen in the tag name..."
- gh release list --limit 100 --json tagName,name --jq '.[] | select(.tagName | test("-"; "i")) | .tagName' | while read -r TAG; do
- echo "Deleting GitHub release: $TAG"
- gh release delete "$TAG" --yes
- done
- env:
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-
- - name: Delete previous pre-release Git tags
- run: |
- echo "Fetching tags from origin..."
- git fetch --tags
- echo "Finding tags with a hyphen in the name..."
- git tag -l "*-*" | while read -r TAG; do
- echo "Deleting tag: $TAG"
- git push origin ":refs/tags/$TAG"
- done
- env:
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 29bdb57a..21f882a9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,65 @@
All notable changes to homebridge-govee will be documented in this file.
+## v11.5.1 (2025-07-24)
+
+### Other Changes
+
+- dependency updates
+
+## v11.5.0 (2025-07-18)
+
+### Notable Changes
+
+- added light models: `H6038`, `H60B1` & `H60B2`
+
+## v11.4.0 (2025-07-18)
+
+- ⚠️ This update will remove and re-add any H7105 fan accessories in your Homebridge setup.
+ - It will replace the 0-100% rotation speed with a unitless rotation speed characteristic.
+ - The new rotation speed values (0-12) will better match the speeds from the Govee app.
+
+### Notable Changes
+
+- add option to hide fan light for H7105
+- use unitless rotation speed for H7105
+- fix updating swing mode for H7105 when externally controlled
+- temporarily disable controlling swing mode for H7105
+
+### Other Changes
+
+- add maintainer message
+
+## v11.3.1 (2025-07-13)
+
+### Notable Changes
+
+- fix eve characteristics for hb 2
+
+## v11.3.0 (2025-07-13)
+
+### Notable Changes
+
+- fix custom plugin config modal styles in ui 5
+- fix custom characteristics for hb 2
+
+### Other Changes
+
+- fix permission in release workflow
+- improvements to the deprecate workflow
+
+## v11.2.0 (2025-07-12)
+
+### Notable Changes
+
+- support new govee models
+ - lights: `H60A4`
+
+### Other Changes
+
+- fix plugin name in release workflow
+- add permissions to workflows
+
## v11.1.0 (2025-07-12)
### Notable Changes
diff --git a/README.md b/README.md
index a6ac5eee..e60586dc 100644
--- a/README.md
+++ b/README.md
@@ -25,6 +25,8 @@ Homebridge plugin to integrate Govee devices into HomeKit
- can control certain models locally via LAN control without any Govee credentials
- does **not** make use of the Govee API key
+> I'm looking for some lovely people to help maintain this plugin, please get in touch on GitHub or Discord if you'd like to help out 😄
+
### Prerequisites
- To use this plugin, you will need to already have:
diff --git a/config.schema.json b/config.schema.json
index 995aa91d..28b3dcbb 100644
--- a/config.schema.json
+++ b/config.schema.json
@@ -1153,6 +1153,14 @@
"condition": {
"functionBody": "return (model.fanDevices && model.fanDevices[arrayIndices] && model.fanDevices[arrayIndices].deviceId && model.fanDevices[arrayIndices].deviceId.length === 23);"
}
+ },
+ "hideLight": {
+ "type": "boolean",
+ "title": "Hide Light",
+ "description": "Enable this to not expose the light service in Homebridge/Homekit if your fan has one.",
+ "condition": {
+ "functionBody": "return (model.fanDevices && model.fanDevices[arrayIndices] && model.fanDevices[arrayIndices].deviceId && model.fanDevices[arrayIndices].deviceId.length === 23 && !model.fanDevices[arrayIndices].ignoreDevice);"
+ }
}
}
}
@@ -1604,7 +1612,8 @@
"items": [
"fanDevices[].label",
"fanDevices[].deviceId",
- "fanDevices[].ignoreDevice"
+ "fanDevices[].ignoreDevice",
+ "fanDevices[].hideLight"
]
}
]
diff --git a/lib/device/fan-H7105.js b/lib/device/fan-H7105.js
index cf71c6ec..daf85160 100644
--- a/lib/device/fan-H7105.js
+++ b/lib/device/fan-H7105.js
@@ -22,20 +22,24 @@ export default class {
// Set up variables from the accessory
this.accessory = accessory
+ // Set up custom variables for this device type
+ const deviceConf = platform.deviceConf[accessory.context.gvDeviceId]
+ this.hideLight = deviceConf && deviceConf.hideLight
+
// Codes etc
this.speedCodes = {
- 7: 'MwUBAQAAAAAAAAAAAAAAAAAAADY=',
- 14: 'MwUBAgAAAAAAAAAAAAAAAAAAADU=',
- 21: 'MwUBAwAAAAAAAAAAAAAAAAAAADQ=',
- 28: 'MwUBBAAAAAAAAAAAAAAAAAAAADM=',
- 35: 'MwUBBQAAAAAAAAAAAAAAAAAAADI=',
- 42: 'MwUBBgAAAAAAAAAAAAAAAAAAADE=',
- 49: 'MwUBBwAAAAAAAAAAAAAAAAAAADA=',
- 56: 'MwUBCAAAAAAAAAAAAAAAAAAAAD8=',
- 63: 'MwUBCQAAAAAAAAAAAAAAAAAAAD4=',
- 70: 'MwUBCgAAAAAAAAAAAAAAAAAAAD0=', // guessed
- 77: 'MwUBCwAAAAAAAAAAAAAAAAAAADw=', // guessed
- 84: 'MwUBDAAAAAAAAAAAAAAAAAAAADs=', // guessed
+ 1: 'MwUBAQAAAAAAAAAAAAAAAAAAADY=',
+ 2: 'MwUBAgAAAAAAAAAAAAAAAAAAADU=',
+ 3: 'MwUBAwAAAAAAAAAAAAAAAAAAADQ=',
+ 4: 'MwUBBAAAAAAAAAAAAAAAAAAAADM=',
+ 5: 'MwUBBQAAAAAAAAAAAAAAAAAAADI=',
+ 6: 'MwUBBgAAAAAAAAAAAAAAAAAAADE=',
+ 7: 'MwUBBwAAAAAAAAAAAAAAAAAAADA=',
+ 8: 'MwUBCAAAAAAAAAAAAAAAAAAAAD8=',
+ 9: 'MwUBCQAAAAAAAAAAAAAAAAAAAD4=',
+ 10: 'MwUBCgAAAAAAAAAAAAAAAAAAAD0=',
+ 11: 'MwUBCwAAAAAAAAAAAAAAAAAAADw=',
+ 12: 'MwUBDAAAAAAAAAAAAAAAAAAAADs=',
}
// Remove any old original Fan services
@@ -43,12 +47,17 @@ export default class {
this.accessory.removeService(this.accessory.getService(this.hapServ.Fan))
}
+ // Migrate old %-rotation speed to unitless
+ const existingService = this.accessory.getService(this.hapServ.Fanv2)
+ if (existingService) {
+ if (existingService.getCharacteristic(this.hapChar.RotationSpeed).props.unit === 'percentage') {
+ this.accessory.removeService(existingService)
+ }
+ }
+
// Add the fan service for the fan if it doesn't already exist
this.service = this.accessory.getService(this.hapServ.Fanv2) || this.accessory.addService(this.hapServ.Fanv2)
- // Add the night light service if it doesn't already exist
- this.lightService = this.accessory.getService(this.hapServ.Lightbulb) || this.accessory.addService(this.hapServ.Lightbulb)
-
// Add the set handler to the fan on/off characteristic
this.service
.getCharacteristic(this.hapChar.Active)
@@ -59,43 +68,56 @@ export default class {
this.service
.getCharacteristic(this.hapChar.RotationSpeed)
.setProps({
- minStep: 7,
+ maxValue: 12,
+ minStep: 1,
minValue: 0,
- validValues: [0, 7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 77, 84, 91],
+ unit: 'unitless', // This is actually from HAP for Bluetooth LE Specification, but fits
})
.onSet(async value => this.internalSpeedUpdate(value))
this.cacheSpeed = this.service.getCharacteristic(this.hapChar.RotationSpeed).value
- this.cacheMode = this.cacheSpeed >= 91 ? 'auto' : 'manual'
// Add the set handler to the fan swing mode
this.service
.getCharacteristic(this.hapChar.SwingMode)
.onSet(async value => this.internalSwingUpdate(value))
this.cacheSwing = this.service.getCharacteristic(this.hapChar.SwingMode).value === 1 ? 'on' : 'off'
+ this.cacheSwingCode = ''
- // Add the set handler to the lightbulb on/off characteristic
- this.lightService.getCharacteristic(this.hapChar.On).onSet(async (value) => {
- await this.internalLightStateUpdate(value)
- })
- this.cacheLightState = this.lightService.getCharacteristic(this.hapChar.On).value ? 'on' : 'off'
+ if (this.hideLight) {
+ if (this.accessory.getService(this.hapServ.Lightbulb)) {
+ // Remove the light service if it exists
+ this.accessory.removeService(this.accessory.getService(this.hapServ.Lightbulb))
+ }
+ } else {
+ // Add the night light service if it doesn't already exist
+ this.lightService = this.accessory.getService(this.hapServ.Lightbulb) || this.accessory.addService(this.hapServ.Lightbulb)
- // Add the set handler to the lightbulb brightness characteristic
- this.lightService
- .getCharacteristic(this.hapChar.Brightness)
- .onSet(async (value) => {
- await this.internalBrightnessUpdate(value)
+ // Add the set handler to the lightbulb on/off characteristic
+ this.lightService.getCharacteristic(this.hapChar.On).onSet(async (value) => {
+ await this.internalLightStateUpdate(value)
})
- this.cacheBright = this.lightService.getCharacteristic(this.hapChar.Brightness).value
-
- // Add the set handler to the lightbulb hue characteristic
- this.lightService.getCharacteristic(this.hapChar.Hue).onSet(async (value) => {
- await this.internalColourUpdate(value)
- })
- this.cacheHue = this.lightService.getCharacteristic(this.hapChar.Hue).value
- this.cacheSat = this.lightService.getCharacteristic(this.hapChar.Saturation).value
+ this.cacheLightState = this.lightService.getCharacteristic(this.hapChar.On).value ? 'on' : 'off'
+
+ // Add the set handler to the lightbulb brightness characteristic
+ this.lightService
+ .getCharacteristic(this.hapChar.Brightness)
+ .onSet(async (value) => {
+ await this.internalBrightnessUpdate(value)
+ })
+ this.cacheBright = this.lightService.getCharacteristic(this.hapChar.Brightness).value
+
+ // Add the set handler to the lightbulb hue characteristic
+ this.lightService.getCharacteristic(this.hapChar.Hue).onSet(async (value) => {
+ await this.internalColourUpdate(value)
+ })
+ this.cacheHue = this.lightService.getCharacteristic(this.hapChar.Hue).value
+ this.cacheSat = this.lightService.getCharacteristic(this.hapChar.Saturation).value
+ }
// Output the customised options to the log
- const opts = JSON.stringify({})
+ const opts = JSON.stringify({
+ hideLight: this.hideLight,
+ })
platform.log('[%s] %s %s.', accessory.displayName, platformLang.devInitOpts, opts)
}
@@ -133,74 +155,20 @@ export default class {
async internalSpeedUpdate(value) {
try {
- if (value < 3) {
- return
- }
-
- let newValue
- if (value < 10) {
- newValue = 7
- } else if (value < 17) {
- newValue = 14
- } else if (value < 24) {
- newValue = 21
- } else if (value < 31) {
- newValue = 28
- } else if (value < 38) {
- newValue = 35
- } else if (value < 45) {
- newValue = 42
- } else if (value < 52) {
- newValue = 49
- } else if (value < 59) {
- newValue = 56
- } else if (value < 66) {
- newValue = 63
- } else if (value < 73) {
- newValue = 70
- } else if (value < 80) {
- newValue = 77
- } else if (value < 87) {
- newValue = 84
- } else {
- newValue = 91
- }
-
- let newMode = value === 91 ? 'auto' : 'manual'
-
// Don't continue if the new value is the same as before
- if (this.cacheSpeed === newValue) {
+ if (this.cacheSpeed === value || value === 0) {
return
}
- // Don't continue if trying to access auto mode but there is no sensor attached
- let codeToSend
- if (newMode === 'auto') {
- if (!this.accessory.context.sensorAttached || !this.cacheAutoCode) {
- this.accessory.logWarn('auto mode not supported without a linked sensor')
- codeToSend = this.speedCodes[84]
- newMode = 'manual'
- newValue = 84
- } else {
- codeToSend = this.cacheAutoCode
- }
- } else {
- codeToSend = this.speedCodes[newValue]
- }
-
await this.platform.sendDeviceUpdate(this.accessory, {
cmd: 'ptReal',
- value: codeToSend,
+ value: this.speedCodes[value],
})
// Cache the new state and log if appropriate
- if (this.cacheMode !== newMode) {
- this.cacheMode = newMode
- this.accessory.log(`${platformLang.curMode} [${this.cacheMode}]`)
- }
- if (this.cacheSpeed !== newValue) {
- this.cacheSpeed = newValue
- this.accessory.log(`${platformLang.curSpeed} [${newValue}%]`)
+ if (this.cacheSpeed !== value) {
+ this.cacheSpeed = value
+ this.accessory.log(`${platformLang.curSpeed} [${value}]`)
}
} catch (err) {
// Catch any errors during the process
@@ -216,22 +184,33 @@ export default class {
async internalSwingUpdate(value) {
try {
- const newValue = value ? 'on' : 'off'
// Don't continue if the new value is the same as before
if (this.cacheSwing === value) {
return
}
- await this.platform.sendDeviceUpdate(this.accessory, {
- cmd: 'ptReal',
- value: value ? 'Mx8BAQAAAAAAAAAAAAAAAAAAACw=' : 'Mx8BAAAAAAAAAAAAAAAAAAAAAC0=',
- })
+ throw new Error('Swing mode update not implemented yet')
+
+ // const newValue = value ? 'on' : 'off'
+ // The existing cacheSwingCode might be something like aa1d0101960384000000000000000000000000a6
+ // We need to change the third hex value to 00 for off or 01 for on
+ // const hexValues = [
+ // 0x3A,
+ // 0x1D,
+ // value ? 0x01 : 0x00,
+ // ...this.cacheSwingCode.slice(6, 14).match(/.{1,2}/g).map(byte => Number.parseInt(byte, 16)),
+ // ]
+ //
+ // await this.platform.sendDeviceUpdate(this.accessory, {
+ // cmd: 'multiSync',
+ // value: generateCodeFromHexValues(hexValues),
+ // })
// Cache the new state and log if appropriate
- if (this.cacheSwing !== newValue) {
- this.cacheSwing = newValue
- this.accessory.log(`${platformLang.curSwing} [${newValue}]`)
- }
+ // if (this.cacheSwing !== newValue) {
+ // this.cacheSwing = newValue
+ // this.accessory.log(`${platformLang.curSwing} [${newValue}]`)
+ // }
} catch (err) {
// Catch any errors during the process
this.accessory.logWarn(`${platformLang.devNotUpdated} ${parseError(err)}`)
@@ -408,16 +387,11 @@ export default class {
case '0501': {
// Fan speed
const newSpeed = getTwoItemPosition(hexParts, 4)
- const newSpeedInt = Number.parseInt(newSpeed, 16) * 7
- const newMode = 'manual'
- if (this.cacheMode !== newMode) {
- this.cacheMode = newMode
- this.accessory.log(`${platformLang.curMode} [${this.cacheMode}]`)
- }
+ const newSpeedInt = Number.parseInt(newSpeed, 16)
if (this.cacheSpeed !== newSpeedInt) {
this.cacheSpeed = newSpeedInt
this.service.updateCharacteristic(this.hapChar.RotationSpeed, this.cacheSpeed)
- this.accessory.log(`${platformLang.curSpeed} [${this.cacheSpeed}%]`)
+ this.accessory.log(`${platformLang.curSpeed} [${this.cacheSpeed}]`)
}
break
}
@@ -430,66 +404,66 @@ export default class {
// Sleep: 5
// Nature: 6
// Turbo: 7
- const newMode = getTwoItemPosition(hexParts, 4) === '03' ? 'auto' : 'manual'
- if (this.cacheMode !== newMode) {
- this.cacheMode = newMode
- this.accessory.log(`${platformLang.curMode} [${this.cacheMode}]`)
-
- if (this.cacheMode === 'auto' && this.cacheSpeed < 91) {
- this.cacheSpeed = 91
- this.service.updateCharacteristic(this.hapChar.RotationSpeed, this.cacheSpeed)
- this.accessory.log(`${platformLang.curSpeed} [${this.cacheSpeed}%]`)
- }
- }
- break
- }
- case '0503': {
- // Auto mode, we need to keep this code to send it back to the device
- const code = hexToTwoItems(`33${hexString.substring(2, hexString.length - 2)}`)
- this.cacheAutoCode = generateCodeFromHexValues(code.map(p => Number.parseInt(p, 16)))
break
}
case '1b01': {
- const newLightState = getTwoItemPosition(hexParts, 4) === '01' ? 'on' : 'off'
- if (this.cacheLightState !== newLightState) {
- this.cacheLightState = newLightState
- this.lightService.updateCharacteristic(this.hapChar.On, this.cacheLightState === 'on')
- this.accessory.log(`${platformLang.curLight} [${this.cacheLightState}]`)
- }
- const newBrightness = hexToDecimal(getTwoItemPosition(hexParts, 5))
- if (this.cacheBright !== newBrightness) {
- this.cacheBright = newBrightness
- this.lightService.updateCharacteristic(this.hapChar.Brightness, this.cacheBright)
- this.accessory.log(`${platformLang.curBright} [${this.cacheBright}%]`)
+ // Night light on/off
+ if (!this.hideLight) {
+ const newLightState = getTwoItemPosition(hexParts, 4) === '01' ? 'on' : 'off'
+ if (this.cacheLightState !== newLightState) {
+ this.cacheLightState = newLightState
+ this.lightService.updateCharacteristic(this.hapChar.On, this.cacheLightState === 'on')
+ this.accessory.log(`${platformLang.curLight} [${this.cacheLightState}]`)
+ }
+ const newBrightness = hexToDecimal(getTwoItemPosition(hexParts, 5))
+ if (this.cacheBright !== newBrightness) {
+ this.cacheBright = newBrightness
+ this.lightService.updateCharacteristic(this.hapChar.Brightness, this.cacheBright)
+ this.accessory.log(`${platformLang.curBright} [${this.cacheBright}%]`)
+ }
}
break
}
case '1b05': {
// Night light colour
- const newR = hexToDecimal(getTwoItemPosition(hexParts, 5))
- const newG = hexToDecimal(getTwoItemPosition(hexParts, 6))
- const newB = hexToDecimal(getTwoItemPosition(hexParts, 7))
-
- const hs = rgb2hs(newR, newG, newB)
-
- // Check for a colour change
- if (hs[0] !== this.cacheHue) {
- // Colour is different so update Homebridge with new values
- this.lightService.updateCharacteristic(this.hapChar.Hue, hs[0])
- this.lightService.updateCharacteristic(this.hapChar.Saturation, hs[1]);
- [this.cacheHue] = hs
-
- // Log the change
- this.accessory.log(`${platformLang.curColour} [rgb ${newR} ${newG} ${newB}]`)
+ if (!this.hideLight) {
+ const newR = hexToDecimal(getTwoItemPosition(hexParts, 5))
+ const newG = hexToDecimal(getTwoItemPosition(hexParts, 6))
+ const newB = hexToDecimal(getTwoItemPosition(hexParts, 7))
+
+ const hs = rgb2hs(newR, newG, newB)
+
+ // Check for a colour change
+ if (hs[0] !== this.cacheHue) {
+ // Colour is different so update Homebridge with new values
+ this.lightService.updateCharacteristic(this.hapChar.Hue, hs[0])
+ this.lightService.updateCharacteristic(this.hapChar.Saturation, hs[1]);
+ [this.cacheHue] = hs
+
+ // Log the change
+ this.accessory.log(`${platformLang.curColour} [rgb ${newR} ${newG} ${newB}]`)
+ }
+ }
+ break
+ }
+ case '1d00':{
+ // Swing Mode Off
+ const newSwing = 'off'
+ this.cacheSwingCode = hexString
+ if (this.cacheSwing !== newSwing) {
+ this.cacheSwing = newSwing
+ this.service.updateCharacteristic(this.hapChar.SwingMode, 0)
+ this.accessory.log(`${platformLang.curSwing} [${this.cacheSwing}]`)
}
break
}
- case '1f01': {
- // Swing Mode
- const newSwing = getTwoItemPosition(hexParts, 4) === '01' ? 'on' : 'off'
+ case '1d01':{
+ // Swing Mode On
+ const newSwing = 'on'
+ this.cacheSwingCode = hexString
if (this.cacheSwing !== newSwing) {
this.cacheSwing = newSwing
- this.service.updateCharacteristic(this.hapChar.SwingMode, this.cacheSwing === 'on' ? 1 : 0)
+ this.service.updateCharacteristic(this.hapChar.SwingMode, 1)
this.accessory.log(`${platformLang.curSwing} [${this.cacheSwing}]`)
}
break
diff --git a/lib/homebridge-ui/public/index.html b/lib/homebridge-ui/public/index.html
index 94cd2400..21337886 100644
--- a/lib/homebridge-ui/public/index.html
+++ b/lib/homebridge-ui/public/index.html
@@ -1,3 +1,39 @@
+
-
+
Device Name |
diff --git a/lib/platform.js b/lib/platform.js
index b0bc1687..efa2158a 100644
--- a/lib/platform.js
+++ b/lib/platform.js
@@ -200,6 +200,7 @@ export default class {
break
}
case 'awsBrightnessNoScale':
+ case 'hideLight':
case 'hideModeGreenTea':
case 'hideModeOolongTea':
case 'hideModeCoffee':
diff --git a/lib/utils/constants.js b/lib/utils/constants.js
index 23a51bfe..228a4d58 100644
--- a/lib/utils/constants.js
+++ b/lib/utils/constants.js
@@ -91,7 +91,7 @@ export default {
],
leakDevices: ['label', 'deviceId', 'ignoreDevice', 'lowBattThreshold'],
thermoDevices: ['label', 'deviceId', 'ignoreDevice', 'lowBattThreshold', 'showExtraSwitch'],
- fanDevices: ['label', 'deviceId', 'ignoreDevice'],
+ fanDevices: ['label', 'deviceId', 'ignoreDevice', 'hideLight'],
heaterDevices: ['label', 'deviceId', 'ignoreDevice', 'tempReporting'],
humidifierDevices: ['label', 'deviceId', 'ignoreDevice'],
dehumidifierDevices: ['label', 'deviceId', 'ignoreDevice'],
@@ -145,6 +145,7 @@ export default {
'H601D',
'H601E',
'H6022',
+ 'H6038',
'H6039',
'H6042',
'H6043',
@@ -204,8 +205,11 @@ export default {
'H6099',
'H60A0',
'H60A1',
+ 'H60A4',
'H60A6',
'H60B0',
+ 'H60B1',
+ 'H60B2',
'H6101',
'H6102',
'H6104',
diff --git a/lib/utils/custom-chars.js b/lib/utils/custom-chars.js
index f0bc8727..6d7f4e72 100644
--- a/lib/utils/custom-chars.js
+++ b/lib/utils/custom-chars.js
@@ -1,9 +1,5 @@
-import { inherits } from 'node:util'
-
export default class {
constructor(api) {
- this.hapServ = api.hap.Service
- this.hapChar = api.hap.Characteristic
this.uuids = {
/* deprecated
bluetooth: 'E964F001-079E-48FF-8F27-9C2605A29F52'
@@ -30,178 +26,217 @@ export default class {
nightLight: 'E964F021-079E-48FF-8F27-9C2605A29F52',
displayLight: 'E964F022-079E-48FF-8F27-9C2605A29F52',
}
- const self = this
- this.ColourMode = function ColourMode() {
- self.hapChar.call(this, 'Colour Mode', self.uuids.colourMode)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- this.MusicMode = function MusicMode() {
- self.hapChar.call(this, 'Music Mode', self.uuids.musicMode)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- this.MusicModeTwo = function MusicModeTwo() {
- self.hapChar.call(this, 'Music Mode 2', self.uuids.musicModeTwo)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- this.Scene = function Scene() {
- self.hapChar.call(this, 'Scene', self.uuids.scene)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- this.SceneTwo = function SceneTwo() {
- self.hapChar.call(this, 'Scene 2', self.uuids.sceneTwo)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- this.SceneThree = function SceneThree() {
- self.hapChar.call(this, 'Scene 3', self.uuids.sceneThree)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- this.SceneFour = function SceneFour() {
- self.hapChar.call(this, 'Scene 4', self.uuids.sceneFour)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- this.DiyMode = function DiyMode() {
- self.hapChar.call(this, 'DIY Mode', self.uuids.diyMode)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- this.DiyModeTwo = function DiyModeTwo() {
- self.hapChar.call(this, 'DIY Mode 2', self.uuids.diyModeTwo)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- this.DiyModeThree = function DiyModeThree() {
- self.hapChar.call(this, 'DIY Mode 3', self.uuids.diyModeThree)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- this.DiyModeFour = function DiyModeFour() {
- self.hapChar.call(this, 'DIY Mode 4', self.uuids.diyModeFour)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- this.Segmented = function Segmented() {
- self.hapChar.call(this, 'Segmented', self.uuids.segmented)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- this.SegmentedTwo = function SegmentedTwo() {
- self.hapChar.call(this, 'Segmented 2', self.uuids.segmentedTwo)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- this.SegmentedThree = function SegmentedThree() {
- self.hapChar.call(this, 'Segmented 3', self.uuids.segmentedThree)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- this.SegmentedFour = function SegmentedFour() {
- self.hapChar.call(this, 'Segmented 4', self.uuids.segmentedFour)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- this.VideoMode = function VideoMode() {
- self.hapChar.call(this, 'Video Mode', self.uuids.videoMode)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- this.VideoModeTwo = function VideoModeTwo() {
- self.hapChar.call(this, 'Video Mode 2', self.uuids.videoModeTwo)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- this.NightLight = function NightLight() {
- self.hapChar.call(this, 'Night Light', self.uuids.nightLight)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- this.DisplayLight = function DisplayLight() {
- self.hapChar.call(this, 'Display Light', self.uuids.displayLight)
- this.setProps({
- format: api.hap.Formats.BOOL,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
- }
- inherits(this.ColourMode, this.hapChar)
- inherits(this.MusicMode, this.hapChar)
- inherits(this.MusicModeTwo, this.hapChar)
- inherits(this.Scene, this.hapChar)
- inherits(this.SceneTwo, this.hapChar)
- inherits(this.SceneThree, this.hapChar)
- inherits(this.SceneFour, this.hapChar)
- inherits(this.DiyMode, this.hapChar)
- inherits(this.DiyModeTwo, this.hapChar)
- inherits(this.DiyModeThree, this.hapChar)
- inherits(this.DiyModeFour, this.hapChar)
- inherits(this.Segmented, this.hapChar)
- inherits(this.SegmentedTwo, this.hapChar)
- inherits(this.SegmentedThree, this.hapChar)
- inherits(this.SegmentedFour, this.hapChar)
- inherits(this.VideoMode, this.hapChar)
- inherits(this.VideoModeTwo, this.hapChar)
- inherits(this.NightLight, this.hapChar)
- inherits(this.DisplayLight, this.hapChar)
+ const uuids = this.uuids
+
+ this.ColourMode = class extends api.hap.Characteristic {
+ constructor() {
+ super('Colour Mode', uuids.colourMode)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
+ this.MusicMode = class extends api.hap.Characteristic {
+ constructor() {
+ super('Music Mode', uuids.musicMode)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
+ this.MusicModeTwo = class extends api.hap.Characteristic {
+ constructor() {
+ super('Music Mode 2', uuids.musicModeTwo)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
+ this.Scene = class extends api.hap.Characteristic {
+ constructor() {
+ super('Scene', uuids.scene)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
+ this.SceneTwo = class extends api.hap.Characteristic {
+ constructor() {
+ super('Scene 2', uuids.sceneTwo)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
+ this.SceneThree = class extends api.hap.Characteristic {
+ constructor() {
+ super('Scene 3', uuids.sceneThree)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
+ this.SceneFour = class extends api.hap.Characteristic {
+ constructor() {
+ super('Scene 4', uuids.sceneFour)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
+ this.DiyMode = class extends api.hap.Characteristic {
+ constructor() {
+ super('DIY Mode', uuids.diyMode)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
+ this.DiyModeTwo = class extends api.hap.Characteristic {
+ constructor() {
+ super('DIY Mode 2', uuids.diyModeTwo)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
+ this.DiyModeThree = class extends api.hap.Characteristic {
+ constructor() {
+ super('DIY Mode 3', uuids.diyModeThree)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
+ this.DiyModeFour = class extends api.hap.Characteristic {
+ constructor() {
+ super('DIY Mode 4', uuids.diyModeFour)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
+ this.Segmented = class extends api.hap.Characteristic {
+ constructor() {
+ super('Segmented', uuids.segmented)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
+ this.SegmentedTwo = class extends api.hap.Characteristic {
+ constructor() {
+ super('Segmented 2', uuids.segmentedTwo)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
+ this.SegmentedThree = class extends api.hap.Characteristic {
+ constructor() {
+ super('Segmented 3', uuids.segmentedThree)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
+ this.SegmentedFour = class extends api.hap.Characteristic {
+ constructor() {
+ super('Segmented 4', uuids.segmentedFour)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
+ this.VideoMode = class extends api.hap.Characteristic {
+ constructor() {
+ super('Video Mode', uuids.videoMode)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
+ this.VideoModeTwo = class extends api.hap.Characteristic {
+ constructor() {
+ super('Video Mode 2', uuids.videoModeTwo)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
+ this.NightLight = class extends api.hap.Characteristic {
+ constructor() {
+ super('Night Light', uuids.nightLight)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
+ this.DisplayLight = class extends api.hap.Characteristic {
+ constructor() {
+ super('Display Light', uuids.displayLight)
+ this.setProps({
+ format: api.hap.Formats.BOOL,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.PAIRED_WRITE, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
+ }
+
this.ColourMode.UUID = this.uuids.colourMode
this.MusicMode.UUID = this.uuids.musicMode
this.MusicModeTwo.UUID = this.uuids.musicModeTwo
diff --git a/lib/utils/eve-chars.js b/lib/utils/eve-chars.js
index 2cdb7cdf..0fdfacb0 100644
--- a/lib/utils/eve-chars.js
+++ b/lib/utils/eve-chars.js
@@ -1,65 +1,71 @@
-import { inherits } from 'node:util'
-
export default class {
constructor(api) {
- this.hapServ = api.hap.Service
- this.hapChar = api.hap.Characteristic
this.uuids = {
currentConsumption: 'E863F10D-079E-48FF-8F27-9C2605A29F52',
voltage: 'E863F10A-079E-48FF-8F27-9C2605A29F52',
electricCurrent: 'E863F126-079E-48FF-8F27-9C2605A29F52',
lastActivation: 'E863F11A-079E-48FF-8F27-9C2605A29F52',
}
- const self = this
- this.CurrentConsumption = function CurrentConsumption() {
- self.hapChar.call(this, 'Current Consumption', self.uuids.currentConsumption)
- this.setProps({
- format: api.hap.Formats.UINT16,
- unit: 'W',
- maxValue: 100000,
- minValue: 0,
- minStep: 1,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
+
+ const uuids = this.uuids
+
+ this.CurrentConsumption = class extends api.hap.Characteristic {
+ constructor() {
+ super('Current Consumption', uuids.currentConsumption)
+ this.setProps({
+ format: api.hap.Formats.UINT16,
+ unit: 'W',
+ maxValue: 100000,
+ minValue: 0,
+ minStep: 1,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
}
- this.Voltage = function Voltage() {
- self.hapChar.call(this, 'Voltage', self.uuids.voltage)
- this.setProps({
- format: api.hap.Formats.FLOAT,
- unit: 'V',
- maxValue: 100000000000,
- minValue: 0,
- minStep: 1,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
+
+ this.Voltage = class extends api.hap.Characteristic {
+ constructor() {
+ super('Voltage', uuids.voltage)
+ this.setProps({
+ format: api.hap.Formats.FLOAT,
+ unit: 'V',
+ maxValue: 100000000000,
+ minValue: 0,
+ minStep: 1,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
}
- this.ElectricCurrent = function ElectricCurrent() {
- self.hapChar.call(this, 'Electric Current', self.uuids.electricCurrent)
- this.setProps({
- format: api.hap.Formats.FLOAT,
- unit: 'A',
- maxValue: 100000000000,
- minValue: 0,
- minStep: 0.1,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
+
+ this.ElectricCurrent = class extends api.hap.Characteristic {
+ constructor() {
+ super('Electric Current', uuids.electricCurrent)
+ this.setProps({
+ format: api.hap.Formats.FLOAT,
+ unit: 'A',
+ maxValue: 100000000000,
+ minValue: 0,
+ minStep: 0.1,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
}
- this.LastActivation = function LastActivation() {
- self.hapChar.call(this, 'Last Activation', self.uuids.lastActivation)
- this.setProps({
- format: api.hap.Formats.UINT32,
- unit: api.hap.Units.SECONDS,
- perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.NOTIFY],
- })
- this.value = this.getDefaultValue()
+
+ this.LastActivation = class extends api.hap.Characteristic {
+ constructor() {
+ super('Last Activation', uuids.lastActivation)
+ this.setProps({
+ format: api.hap.Formats.UINT32,
+ unit: api.hap.Units.SECONDS,
+ perms: [api.hap.Perms.PAIRED_READ, api.hap.Perms.NOTIFY],
+ })
+ this.value = this.getDefaultValue()
+ }
}
- inherits(this.CurrentConsumption, this.hapChar)
- inherits(this.Voltage, this.hapChar)
- inherits(this.ElectricCurrent, this.hapChar)
- inherits(this.LastActivation, this.hapChar)
+
this.CurrentConsumption.UUID = this.uuids.currentConsumption
this.Voltage.UUID = this.uuids.voltage
this.ElectricCurrent.UUID = this.uuids.electricCurrent
diff --git a/lib/utils/lang-en.js b/lib/utils/lang-en.js
index 94d83e24..fb43f806 100644
--- a/lib/utils/lang-en.js
+++ b/lib/utils/lang-en.js
@@ -123,6 +123,6 @@ export default {
storageWriteErr: 'could not save accessory to file as',
syncFail: 'sync failed as',
viaAL: 'via adaptive lighting',
- welcome: 'This plugin has been made with ♥ by bwp91, please consider a ☆ on GitHub if you are finding it useful!',
+ welcome: 'I\'m looking for some lovely people to help maintain this plugin, please get in touch on GitHub or Discord if you\'d like to help out 😄',
unknownCommand: 'unknown command in payload received',
}
diff --git a/package-lock.json b/package-lock.json
index a0b88f78..244a6dc5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@homebridge-plugins/homebridge-govee",
- "version": "11.1.0",
+ "version": "11.5.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@homebridge-plugins/homebridge-govee",
- "version": "11.1.0",
+ "version": "11.5.1",
"funding": [
{
"type": "github",
@@ -29,14 +29,14 @@
"dependencies": {
"@homebridge/plugin-ui-utils": "^2.1.0",
"aws-iot-device-sdk": "^2.2.15",
- "axios": "^1.10.0",
+ "axios": "^1.11.0",
"node-persist": "^4.0.4",
"node-rsa": "^1.1.1",
"p-queue": "^8.1.0",
"pem": "^1.14.8"
},
"devDependencies": {
- "@antfu/eslint-config": "^4.16.2"
+ "@antfu/eslint-config": "^4.19.0"
},
"engines": {
"homebridge": "^1.6.0 || ^2.0.0-beta.0",
@@ -48,19 +48,19 @@
}
},
"node_modules/@antfu/eslint-config": {
- "version": "4.16.2",
- "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-4.16.2.tgz",
- "integrity": "sha512-5KHZR+7ne+HZnOJUKeTTdHKYA/yOygPssaJ7TZOMoBqjSMtVAa7FO5Wvu2dEtkibM6v3emYyKnQnia1S8NHQeA==",
+ "version": "4.19.0",
+ "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-4.19.0.tgz",
+ "integrity": "sha512-IQlML0cc7qNA1Uk55raMRZjOmh26rkX3bi2MFYjhO+VOtTQt8Mz2ngxBlIwpTgZFgfuYjle6JPuOuALnEZHDFw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@antfu/install-pkg": "^1.1.0",
"@clack/prompts": "^0.11.0",
"@eslint-community/eslint-plugin-eslint-comments": "^4.5.0",
- "@eslint/markdown": "^6.6.0",
- "@stylistic/eslint-plugin": "^5.1.0",
- "@typescript-eslint/eslint-plugin": "^8.35.1",
- "@typescript-eslint/parser": "^8.35.1",
+ "@eslint/markdown": "^7.1.0",
+ "@stylistic/eslint-plugin": "^5.2.2",
+ "@typescript-eslint/eslint-plugin": "^8.38.0",
+ "@typescript-eslint/parser": "^8.38.0",
"@vitest/eslint-plugin": "^1.3.4",
"ansis": "^4.1.0",
"cac": "^6.7.14",
@@ -70,17 +70,17 @@
"eslint-plugin-antfu": "^3.1.1",
"eslint-plugin-command": "^3.3.1",
"eslint-plugin-import-lite": "^0.3.0",
- "eslint-plugin-jsdoc": "^51.3.2",
+ "eslint-plugin-jsdoc": "^51.4.1",
"eslint-plugin-jsonc": "^2.20.1",
- "eslint-plugin-n": "^17.20.0",
+ "eslint-plugin-n": "^17.21.0",
"eslint-plugin-no-only-tests": "^3.3.0",
"eslint-plugin-perfectionist": "^4.15.0",
- "eslint-plugin-pnpm": "^0.3.1",
+ "eslint-plugin-pnpm": "^1.1.0",
"eslint-plugin-regexp": "^2.9.0",
"eslint-plugin-toml": "^0.12.0",
- "eslint-plugin-unicorn": "^59.0.1",
+ "eslint-plugin-unicorn": "^60.0.0",
"eslint-plugin-unused-imports": "^4.1.4",
- "eslint-plugin-vue": "^10.2.0",
+ "eslint-plugin-vue": "^10.3.0",
"eslint-plugin-yml": "^1.18.0",
"eslint-processor-vue-blocks": "^2.0.0",
"globals": "^16.3.0",
@@ -99,6 +99,7 @@
},
"peerDependencies": {
"@eslint-react/eslint-plugin": "^1.38.4",
+ "@next/eslint-plugin-next": "^15.4.0-canary.115",
"@prettier/plugin-xml": "^3.4.1",
"@unocss/eslint-plugin": ">=0.50.0",
"astro-eslint-parser": "^1.0.2",
@@ -118,6 +119,9 @@
"@eslint-react/eslint-plugin": {
"optional": true
},
+ "@next/eslint-plugin-next": {
+ "optional": true
+ },
"@prettier/plugin-xml": {
"optional": true
},
@@ -400,9 +404,9 @@
}
},
"node_modules/@eslint/core": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
- "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
+ "version": "0.15.1",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz",
+ "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -492,21 +496,21 @@
}
},
"node_modules/@eslint/markdown": {
- "version": "6.6.0",
- "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-6.6.0.tgz",
- "integrity": "sha512-IsWPy2jU3gaQDlioDC4sT4I4kG1hX1OMWs/q2sWwJrPoMASHW/Z4SDw+6Aql6EsHejGbagYuJbFq9Zvx+Y1b1Q==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-7.1.0.tgz",
+ "integrity": "sha512-Y+X1B1j+/zupKDVJfkKc8uYMjQkGzfnd8lt7vK3y8x9Br6H5dBuhAfFrQ6ff7HAMm/1BwgecyEiRFkYCWPRxmA==",
"dev": true,
"license": "MIT",
"workspaces": [
"examples/*"
],
"dependencies": {
- "@eslint/core": "^0.14.0",
- "@eslint/plugin-kit": "^0.3.1",
+ "@eslint/core": "^0.15.1",
+ "@eslint/plugin-kit": "^0.3.4",
"github-slugger": "^2.0.0",
"mdast-util-from-markdown": "^2.0.2",
"mdast-util-frontmatter": "^2.0.1",
- "mdast-util-gfm": "^3.0.0",
+ "mdast-util-gfm": "^3.1.0",
"micromark-extension-frontmatter": "^2.0.0",
"micromark-extension-gfm": "^3.0.0"
},
@@ -526,9 +530,9 @@
}
},
"node_modules/@eslint/plugin-kit": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz",
- "integrity": "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==",
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz",
+ "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -539,19 +543,6 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
- "version": "0.15.1",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz",
- "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
"node_modules/@homebridge/plugin-ui-utils": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@homebridge/plugin-ui-utils/-/plugin-ui-utils-2.1.0.tgz",
@@ -692,9 +683,9 @@
}
},
"node_modules/@pkgr/core": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.7.tgz",
- "integrity": "sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==",
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz",
+ "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1041,18 +1032,18 @@
}
},
"node_modules/@stylistic/eslint-plugin": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.1.0.tgz",
- "integrity": "sha512-TJRJul4u/lmry5N/kyCU+7RWWOk0wyXN+BncRlDYBqpLFnzXkd7QGVfN7KewarFIXv0IX0jSF/Ksu7aHWEDeuw==",
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.2.2.tgz",
+ "integrity": "sha512-bE2DUjruqXlHYP3Q2Gpqiuj2bHq7/88FnuaS0FjeGGLCy+X6a07bGVuwtiOYnPSLHR6jmx5Bwdv+j7l8H+G97A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/types": "^8.34.1",
+ "@typescript-eslint/types": "^8.37.0",
"eslint-visitor-keys": "^4.2.1",
"espree": "^10.4.0",
"estraverse": "^5.3.0",
- "picomatch": "^4.0.2"
+ "picomatch": "^4.0.3"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1103,9 +1094,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "24.0.13",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.13.tgz",
- "integrity": "sha512-Qm9OYVOFHFYg3wJoTSrz80hoec5Lia/dPp84do3X7dZvLikQvM1YpmvTBEdIr/e+U8HTkFjLHLnl78K/qjf+jQ==",
+ "version": "24.1.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz",
+ "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==",
"license": "MIT",
"dependencies": {
"undici-types": "~7.8.0"
@@ -1135,17 +1126,17 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.36.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.36.0.tgz",
- "integrity": "sha512-lZNihHUVB6ZZiPBNgOQGSxUASI7UJWhT8nHyUGCnaQ28XFCw98IfrMCG3rUl1uwUWoAvodJQby2KTs79UTcrAg==",
+ "version": "8.38.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz",
+ "integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.36.0",
- "@typescript-eslint/type-utils": "8.36.0",
- "@typescript-eslint/utils": "8.36.0",
- "@typescript-eslint/visitor-keys": "8.36.0",
+ "@typescript-eslint/scope-manager": "8.38.0",
+ "@typescript-eslint/type-utils": "8.38.0",
+ "@typescript-eslint/utils": "8.38.0",
+ "@typescript-eslint/visitor-keys": "8.38.0",
"graphemer": "^1.4.0",
"ignore": "^7.0.0",
"natural-compare": "^1.4.0",
@@ -1159,7 +1150,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^8.36.0",
+ "@typescript-eslint/parser": "^8.38.0",
"eslint": "^8.57.0 || ^9.0.0",
"typescript": ">=4.8.4 <5.9.0"
}
@@ -1175,16 +1166,16 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "8.36.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.36.0.tgz",
- "integrity": "sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q==",
+ "version": "8.38.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz",
+ "integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/scope-manager": "8.36.0",
- "@typescript-eslint/types": "8.36.0",
- "@typescript-eslint/typescript-estree": "8.36.0",
- "@typescript-eslint/visitor-keys": "8.36.0",
+ "@typescript-eslint/scope-manager": "8.38.0",
+ "@typescript-eslint/types": "8.38.0",
+ "@typescript-eslint/typescript-estree": "8.38.0",
+ "@typescript-eslint/visitor-keys": "8.38.0",
"debug": "^4.3.4"
},
"engines": {
@@ -1200,14 +1191,14 @@
}
},
"node_modules/@typescript-eslint/project-service": {
- "version": "8.36.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.36.0.tgz",
- "integrity": "sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g==",
+ "version": "8.38.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz",
+ "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.36.0",
- "@typescript-eslint/types": "^8.36.0",
+ "@typescript-eslint/tsconfig-utils": "^8.38.0",
+ "@typescript-eslint/types": "^8.38.0",
"debug": "^4.3.4"
},
"engines": {
@@ -1222,14 +1213,14 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "8.36.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.36.0.tgz",
- "integrity": "sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA==",
+ "version": "8.38.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz",
+ "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.36.0",
- "@typescript-eslint/visitor-keys": "8.36.0"
+ "@typescript-eslint/types": "8.38.0",
+ "@typescript-eslint/visitor-keys": "8.38.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1240,9 +1231,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.36.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.36.0.tgz",
- "integrity": "sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA==",
+ "version": "8.38.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz",
+ "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1257,14 +1248,15 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "8.36.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.36.0.tgz",
- "integrity": "sha512-5aaGYG8cVDd6cxfk/ynpYzxBRZJk7w/ymto6uiyUFtdCozQIsQWh7M28/6r57Fwkbweng8qAzoMCPwSJfWlmsg==",
+ "version": "8.38.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz",
+ "integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/typescript-estree": "8.36.0",
- "@typescript-eslint/utils": "8.36.0",
+ "@typescript-eslint/types": "8.38.0",
+ "@typescript-eslint/typescript-estree": "8.38.0",
+ "@typescript-eslint/utils": "8.38.0",
"debug": "^4.3.4",
"ts-api-utils": "^2.1.0"
},
@@ -1281,9 +1273,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "8.36.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.36.0.tgz",
- "integrity": "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==",
+ "version": "8.38.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz",
+ "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1295,16 +1287,16 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.36.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.36.0.tgz",
- "integrity": "sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg==",
+ "version": "8.38.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz",
+ "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/project-service": "8.36.0",
- "@typescript-eslint/tsconfig-utils": "8.36.0",
- "@typescript-eslint/types": "8.36.0",
- "@typescript-eslint/visitor-keys": "8.36.0",
+ "@typescript-eslint/project-service": "8.38.0",
+ "@typescript-eslint/tsconfig-utils": "8.38.0",
+ "@typescript-eslint/types": "8.38.0",
+ "@typescript-eslint/visitor-keys": "8.38.0",
"debug": "^4.3.4",
"fast-glob": "^3.3.2",
"is-glob": "^4.0.3",
@@ -1324,16 +1316,16 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "8.36.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.36.0.tgz",
- "integrity": "sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g==",
+ "version": "8.38.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz",
+ "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.36.0",
- "@typescript-eslint/types": "8.36.0",
- "@typescript-eslint/typescript-estree": "8.36.0"
+ "@typescript-eslint/scope-manager": "8.38.0",
+ "@typescript-eslint/types": "8.38.0",
+ "@typescript-eslint/typescript-estree": "8.38.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1348,13 +1340,13 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.36.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.36.0.tgz",
- "integrity": "sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA==",
+ "version": "8.38.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz",
+ "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.36.0",
+ "@typescript-eslint/types": "8.38.0",
"eslint-visitor-keys": "^4.2.1"
},
"engines": {
@@ -1389,45 +1381,45 @@
}
},
"node_modules/@vue/compiler-core": {
- "version": "3.5.17",
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.17.tgz",
- "integrity": "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==",
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz",
+ "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
- "@babel/parser": "^7.27.5",
- "@vue/shared": "3.5.17",
+ "@babel/parser": "^7.28.0",
+ "@vue/shared": "3.5.18",
"entities": "^4.5.0",
"estree-walker": "^2.0.2",
"source-map-js": "^1.2.1"
}
},
"node_modules/@vue/compiler-dom": {
- "version": "3.5.17",
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.17.tgz",
- "integrity": "sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==",
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz",
+ "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
- "@vue/compiler-core": "3.5.17",
- "@vue/shared": "3.5.17"
+ "@vue/compiler-core": "3.5.18",
+ "@vue/shared": "3.5.18"
}
},
"node_modules/@vue/compiler-sfc": {
- "version": "3.5.17",
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.17.tgz",
- "integrity": "sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==",
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz",
+ "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
- "@babel/parser": "^7.27.5",
- "@vue/compiler-core": "3.5.17",
- "@vue/compiler-dom": "3.5.17",
- "@vue/compiler-ssr": "3.5.17",
- "@vue/shared": "3.5.17",
+ "@babel/parser": "^7.28.0",
+ "@vue/compiler-core": "3.5.18",
+ "@vue/compiler-dom": "3.5.18",
+ "@vue/compiler-ssr": "3.5.18",
+ "@vue/shared": "3.5.18",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.17",
"postcss": "^8.5.6",
@@ -1435,21 +1427,21 @@
}
},
"node_modules/@vue/compiler-ssr": {
- "version": "3.5.17",
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.17.tgz",
- "integrity": "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==",
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz",
+ "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
- "@vue/compiler-dom": "3.5.17",
- "@vue/shared": "3.5.17"
+ "@vue/compiler-dom": "3.5.18",
+ "@vue/shared": "3.5.18"
}
},
"node_modules/@vue/shared": {
- "version": "3.5.17",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.17.tgz",
- "integrity": "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==",
+ "version": "3.5.18",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz",
+ "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==",
"dev": true,
"license": "MIT",
"peer": true
@@ -1594,13 +1586,13 @@
}
},
"node_modules/axios": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz",
- "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==",
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz",
+ "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
- "form-data": "^4.0.0",
+ "form-data": "^4.0.4",
"proxy-from-env": "^1.1.0"
}
},
@@ -1880,6 +1872,13 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
+ "node_modules/change-case": {
+ "version": "5.4.4",
+ "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz",
+ "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/character-entities": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
@@ -2213,9 +2212,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.182",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.182.tgz",
- "integrity": "sha512-Lv65Btwv9W4J9pyODI6EWpdnhfvrve/us5h1WspW8B2Fb0366REPtY3hX7ounk1CkV/TBjWCEvCBBbYbmV0qCA==",
+ "version": "1.5.190",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.190.tgz",
+ "integrity": "sha512-k4McmnB2091YIsdCgkS0fMVMPOJgxl93ltFzaryXqwip1AaxeDqKCGLxkXODDA5Ab/D+tV5EL5+aTx76RvLRxw==",
"dev": true,
"license": "ISC"
},
@@ -2566,9 +2565,9 @@
}
},
"node_modules/eslint-plugin-jsdoc": {
- "version": "51.3.4",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-51.3.4.tgz",
- "integrity": "sha512-maz6qa95+sAjMr9m5oRyfejc+mnyQWsWSe9oyv9371bh4/T0kWOMryJNO4h8rEd97wo/9lbzwi3OOX4rDhnAzg==",
+ "version": "51.4.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-51.4.1.tgz",
+ "integrity": "sha512-y4CA9OkachG8v5nAtrwvcvjIbdcKgSyS6U//IfQr4FZFFyeBFwZFf/tfSsMr46mWDJgidZjBTqoCRlXywfFBMg==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -2702,9 +2701,9 @@
}
},
"node_modules/eslint-plugin-pnpm": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-pnpm/-/eslint-plugin-pnpm-0.3.1.tgz",
- "integrity": "sha512-vi5iHoELIAlBbX4AW8ZGzU3tUnfxuXhC/NKo3qRcI5o9igbz6zJUqSlQ03bPeMqWIGTPatZnbWsNR1RnlNERNQ==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-pnpm/-/eslint-plugin-pnpm-1.1.0.tgz",
+ "integrity": "sha512-sL93w0muBtjnogzk/loDsxzMbmXQOLP5Blw3swLDBXZgfb+qQI73bPcUbjVR+ZL+K62vGJdErV+43i3r5DsZPg==",
"dev": true,
"funding": [
{
@@ -2721,8 +2720,8 @@
"find-up-simple": "^1.0.1",
"jsonc-eslint-parser": "^2.4.0",
"pathe": "^2.0.3",
- "pnpm-workspace-yaml": "0.3.1",
- "tinyglobby": "^0.2.12",
+ "pnpm-workspace-yaml": "1.1.0",
+ "tinyglobby": "^0.2.14",
"yaml-eslint-parser": "^1.3.0"
},
"peerDependencies": {
@@ -2774,65 +2773,39 @@
}
},
"node_modules/eslint-plugin-unicorn": {
- "version": "59.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-59.0.1.tgz",
- "integrity": "sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q==",
+ "version": "60.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-60.0.0.tgz",
+ "integrity": "sha512-QUzTefvP8stfSXsqKQ+vBQSEsXIlAiCduS/V1Em+FKgL9c21U/IIm20/e3MFy1jyCf14tHAhqC1sX8OTy6VUCg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-validator-identifier": "^7.25.9",
- "@eslint-community/eslint-utils": "^4.5.1",
- "@eslint/plugin-kit": "^0.2.7",
- "ci-info": "^4.2.0",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@eslint-community/eslint-utils": "^4.7.0",
+ "@eslint/plugin-kit": "^0.3.3",
+ "change-case": "^5.4.4",
+ "ci-info": "^4.3.0",
"clean-regexp": "^1.0.0",
- "core-js-compat": "^3.41.0",
+ "core-js-compat": "^3.44.0",
"esquery": "^1.6.0",
"find-up-simple": "^1.0.1",
- "globals": "^16.0.0",
+ "globals": "^16.3.0",
"indent-string": "^5.0.0",
"is-builtin-module": "^5.0.0",
"jsesc": "^3.1.0",
"pluralize": "^8.0.0",
"regexp-tree": "^0.1.27",
"regjsparser": "^0.12.0",
- "semver": "^7.7.1",
+ "semver": "^7.7.2",
"strip-indent": "^4.0.0"
},
"engines": {
- "node": "^18.20.0 || ^20.10.0 || >=21.0.0"
+ "node": "^20.10.0 || >=21.0.0"
},
"funding": {
"url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
},
"peerDependencies": {
- "eslint": ">=9.22.0"
- }
- },
- "node_modules/eslint-plugin-unicorn/node_modules/@eslint/core": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz",
- "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/eslint-plugin-unicorn/node_modules/@eslint/plugin-kit": {
- "version": "0.2.8",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz",
- "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/core": "^0.13.0",
- "levn": "^0.4.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "eslint": ">=9.29.0"
}
},
"node_modules/eslint-plugin-unused-imports": {
@@ -2946,20 +2919,6 @@
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint/node_modules/@eslint/core": {
- "version": "0.15.1",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz",
- "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==",
- "dev": true,
- "license": "Apache-2.0",
- "peer": true,
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
"node_modules/eslint/node_modules/brace-expansion": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
@@ -3277,9 +3236,9 @@
}
},
"node_modules/form-data": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz",
- "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
+ "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
@@ -5181,9 +5140,9 @@
}
},
"node_modules/node-addon-api": {
- "version": "8.4.0",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.4.0.tgz",
- "integrity": "sha512-D9DI/gXHvVmjHS08SVch0Em8G5S1P+QWtU31appcKT/8wFSPRcdHadIFSAntdMMVM5zz+/DL+bL/gz3UDppqtg==",
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz",
+ "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==",
"license": "MIT",
"optional": true,
"engines": {
@@ -5522,9 +5481,9 @@
"license": "ISC"
},
"node_modules/picomatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
- "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5557,9 +5516,9 @@
}
},
"node_modules/pnpm-workspace-yaml": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/pnpm-workspace-yaml/-/pnpm-workspace-yaml-0.3.1.tgz",
- "integrity": "sha512-3nW5RLmREmZ8Pm8MbPsO2RM+99RRjYd25ynj3NV0cFsN7CcEl4sDFzgoFmSyduFwxFQ2Qbu3y2UdCh6HlyUOeA==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pnpm-workspace-yaml/-/pnpm-workspace-yaml-1.1.0.tgz",
+ "integrity": "sha512-OWUzBxtitpyUV0fBYYwLAfWxn3mSzVbVB7cwgNaHvTTU9P0V2QHjyaY5i7f1hEiT9VeKsNH1Skfhe2E3lx/zhA==",
"dev": true,
"funding": [
{
@@ -5573,7 +5532,7 @@
],
"license": "MIT",
"dependencies": {
- "yaml": "^2.7.0"
+ "yaml": "^2.8.0"
}
},
"node_modules/postcss": {
@@ -6157,13 +6116,13 @@
}
},
"node_modules/synckit": {
- "version": "0.11.8",
- "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.8.tgz",
- "integrity": "sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==",
+ "version": "0.11.11",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz",
+ "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@pkgr/core": "^0.2.4"
+ "@pkgr/core": "^0.2.9"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
@@ -6456,9 +6415,9 @@
}
},
"node_modules/usb": {
- "version": "2.15.0",
- "resolved": "https://registry.npmjs.org/usb/-/usb-2.15.0.tgz",
- "integrity": "sha512-BA9r7PFxyYp99wps1N70lIqdPb2Utcl2KkWohDtWUmhDBeM5hDH1Zl/L/CZvWxd5W3RUCNm1g+b+DEKZ6cHzqg==",
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/usb/-/usb-2.16.0.tgz",
+ "integrity": "sha512-jD88fvzDViMDH5KmmNJgzMBDj/95bDTt6+kBNaNxP4G98xUTnDMiLUY2CYmToba6JAFhM9VkcaQuxCNRLGR7zg==",
"hasInstallScript": true,
"license": "MIT",
"optional": true,
diff --git a/package.json b/package.json
index 0abb7374..62d6a5d2 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "@homebridge-plugins/homebridge-govee",
"alias": "Govee",
"type": "module",
- "version": "11.1.0",
+ "version": "11.5.1",
"description": "Homebridge plugin to integrate Govee devices into HomeKit.",
"author": {
"name": "bwp91",
@@ -57,7 +57,7 @@
"dependencies": {
"@homebridge/plugin-ui-utils": "^2.1.0",
"aws-iot-device-sdk": "^2.2.15",
- "axios": "^1.10.0",
+ "axios": "^1.11.0",
"node-persist": "^4.0.4",
"node-rsa": "^1.1.1",
"p-queue": "^8.1.0",
@@ -68,6 +68,6 @@
"@stoprocent/noble": "^1.19.1"
},
"devDependencies": {
- "@antfu/eslint-config": "^4.16.2"
+ "@antfu/eslint-config": "^4.19.0"
}
}
pFad - Phonifier reborn
Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy