@switchbot/homebridge-switchbot 4.3.2-beta.9 → 5.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/copilot-instructions.md +328 -0
- package/.github/workflows/beta-release.yml +8 -12
- package/.github/workflows/release.yml +57 -21
- package/README.md +13 -10
- package/config.schema.json +1 -12
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +15847 -0
- package/coverage/coverage-final.json +42 -0
- package/coverage/docs/assets/dmt/dmt-component-data.js.html +85 -0
- package/coverage/docs/assets/dmt/dmt-components.js.html +286 -0
- package/coverage/docs/assets/dmt/index.html +131 -0
- package/coverage/docs/assets/hierarchy.js.html +85 -0
- package/coverage/docs/assets/icons.js.html +136 -0
- package/coverage/docs/assets/index.html +146 -0
- package/coverage/docs/assets/main.js.html +265 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +191 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +196 -0
- package/coverage/src/device/blindtilt.ts.html +3238 -0
- package/coverage/src/device/bot.ts.html +2803 -0
- package/coverage/src/device/ceilinglight.ts.html +2338 -0
- package/coverage/src/device/colorbulb.ts.html +2824 -0
- package/coverage/src/device/contact.ts.html +1465 -0
- package/coverage/src/device/curtain.ts.html +2869 -0
- package/coverage/src/device/device.ts.html +2500 -0
- package/coverage/src/device/fan.ts.html +2242 -0
- package/coverage/src/device/hub.ts.html +1408 -0
- package/coverage/src/device/humidifier.ts.html +2116 -0
- package/coverage/src/device/index.html +416 -0
- package/coverage/src/device/iosensor.ts.html +1375 -0
- package/coverage/src/device/lightstrip.ts.html +2617 -0
- package/coverage/src/device/lock.ts.html +1963 -0
- package/coverage/src/device/meter.ts.html +1372 -0
- package/coverage/src/device/meterplus.ts.html +1384 -0
- package/coverage/src/device/meterpro.ts.html +1618 -0
- package/coverage/src/device/motion.ts.html +1264 -0
- package/coverage/src/device/plug.ts.html +1372 -0
- package/coverage/src/device/relayswitch.ts.html +2284 -0
- package/coverage/src/device/robotvacuumcleaner.ts.html +1810 -0
- package/coverage/src/device/waterdetector.ts.html +1294 -0
- package/coverage/src/homebridge-ui/index.html +116 -0
- package/coverage/src/homebridge-ui/server.ts.html +229 -0
- package/coverage/src/index.html +161 -0
- package/coverage/src/index.ts.html +124 -0
- package/coverage/src/irdevice/airconditioner.ts.html +1687 -0
- package/coverage/src/irdevice/airpurifier.ts.html +844 -0
- package/coverage/src/irdevice/camera.ts.html +475 -0
- package/coverage/src/irdevice/fan.ts.html +766 -0
- package/coverage/src/irdevice/index.html +251 -0
- package/coverage/src/irdevice/irdevice.ts.html +1117 -0
- package/coverage/src/irdevice/light.ts.html +826 -0
- package/coverage/src/irdevice/other.ts.html +2458 -0
- package/coverage/src/irdevice/tv.ts.html +1222 -0
- package/coverage/src/irdevice/vacuumcleaner.ts.html +466 -0
- package/coverage/src/irdevice/waterheater.ts.html +469 -0
- package/coverage/src/platform.ts.html +8776 -0
- package/coverage/src/settings.ts.html +934 -0
- package/coverage/src/utils.ts.html +2092 -0
- package/dist/{device → devices-hap}/airpurifier.d.ts +3 -3
- package/dist/devices-hap/airpurifier.d.ts.map +1 -0
- package/dist/devices-hap/airpurifier.js.map +1 -0
- package/dist/{device → devices-hap}/blindtilt.d.ts +3 -3
- package/dist/devices-hap/blindtilt.d.ts.map +1 -0
- package/dist/{device → devices-hap}/blindtilt.js +6 -1
- package/dist/devices-hap/blindtilt.js.map +1 -0
- package/dist/{device → devices-hap}/bot.d.ts +3 -3
- package/dist/devices-hap/bot.d.ts.map +1 -0
- package/dist/devices-hap/bot.js.map +1 -0
- package/dist/{device → devices-hap}/ceilinglight.d.ts +3 -3
- package/dist/devices-hap/ceilinglight.d.ts.map +1 -0
- package/dist/devices-hap/ceilinglight.js.map +1 -0
- package/dist/{device → devices-hap}/colorbulb.d.ts +3 -3
- package/dist/devices-hap/colorbulb.d.ts.map +1 -0
- package/dist/devices-hap/colorbulb.js.map +1 -0
- package/dist/{device → devices-hap}/contact.d.ts +3 -3
- package/dist/devices-hap/contact.d.ts.map +1 -0
- package/dist/devices-hap/contact.js.map +1 -0
- package/dist/{device → devices-hap}/curtain.d.ts +3 -3
- package/dist/devices-hap/curtain.d.ts.map +1 -0
- package/dist/{device → devices-hap}/curtain.js +32 -8
- package/dist/devices-hap/curtain.js.map +1 -0
- package/dist/{device → devices-hap}/device.d.ts +3 -3
- package/dist/devices-hap/device.d.ts.map +1 -0
- package/dist/{device → devices-hap}/device.js +10 -4
- package/dist/devices-hap/device.js.map +1 -0
- package/dist/{device → devices-hap}/fan.d.ts +3 -3
- package/dist/devices-hap/fan.d.ts.map +1 -0
- package/dist/devices-hap/fan.js.map +1 -0
- package/dist/{device → devices-hap}/hub.d.ts +5 -5
- package/dist/devices-hap/hub.d.ts.map +1 -0
- package/dist/{device → devices-hap}/hub.js +2 -1
- package/dist/devices-hap/hub.js.map +1 -0
- package/dist/{device → devices-hap}/humidifier.d.ts +3 -3
- package/dist/devices-hap/humidifier.d.ts.map +1 -0
- package/dist/devices-hap/humidifier.js.map +1 -0
- package/dist/{device → devices-hap}/iosensor.d.ts +3 -3
- package/dist/devices-hap/iosensor.d.ts.map +1 -0
- package/dist/devices-hap/iosensor.js.map +1 -0
- package/dist/{device → devices-hap}/lightstrip.d.ts +3 -3
- package/dist/devices-hap/lightstrip.d.ts.map +1 -0
- package/dist/devices-hap/lightstrip.js.map +1 -0
- package/dist/{device → devices-hap}/lock.d.ts +3 -3
- package/dist/devices-hap/lock.d.ts.map +1 -0
- package/dist/devices-hap/lock.js.map +1 -0
- package/dist/{device → devices-hap}/meter.d.ts +3 -3
- package/dist/devices-hap/meter.d.ts.map +1 -0
- package/dist/devices-hap/meter.js.map +1 -0
- package/dist/{device → devices-hap}/meterplus.d.ts +3 -3
- package/dist/devices-hap/meterplus.d.ts.map +1 -0
- package/dist/devices-hap/meterplus.js.map +1 -0
- package/dist/{device → devices-hap}/meterpro.d.ts +3 -3
- package/dist/devices-hap/meterpro.d.ts.map +1 -0
- package/dist/{device → devices-hap}/meterpro.js +16 -3
- package/dist/devices-hap/meterpro.js.map +1 -0
- package/dist/{device → devices-hap}/motion.d.ts +3 -3
- package/dist/devices-hap/motion.d.ts.map +1 -0
- package/dist/devices-hap/motion.js.map +1 -0
- package/dist/{device → devices-hap}/plug.d.ts +3 -3
- package/dist/devices-hap/plug.d.ts.map +1 -0
- package/dist/devices-hap/plug.js.map +1 -0
- package/dist/{device → devices-hap}/relayswitch.d.ts +3 -3
- package/dist/devices-hap/relayswitch.d.ts.map +1 -0
- package/dist/devices-hap/relayswitch.js.map +1 -0
- package/dist/{device → devices-hap}/robotvacuumcleaner.d.ts +3 -3
- package/dist/devices-hap/robotvacuumcleaner.d.ts.map +1 -0
- package/dist/devices-hap/robotvacuumcleaner.js.map +1 -0
- package/dist/{device → devices-hap}/waterdetector.d.ts +3 -3
- package/dist/devices-hap/waterdetector.d.ts.map +1 -0
- package/dist/devices-hap/waterdetector.js.map +1 -0
- package/dist/devices-matter/BaseMatterAccessory.d.ts +63 -0
- package/dist/devices-matter/BaseMatterAccessory.d.ts.map +1 -0
- package/dist/devices-matter/BaseMatterAccessory.js +100 -0
- package/dist/devices-matter/BaseMatterAccessory.js.map +1 -0
- package/dist/devices-matter/ColorLightAccessory.d.ts +18 -0
- package/dist/devices-matter/ColorLightAccessory.d.ts.map +1 -0
- package/dist/devices-matter/ColorLightAccessory.js +96 -0
- package/dist/devices-matter/ColorLightAccessory.js.map +1 -0
- package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts +16 -0
- package/dist/devices-matter/ColorTemperatureLightAccessory.d.ts.map +1 -0
- package/dist/devices-matter/ColorTemperatureLightAccessory.js +83 -0
- package/dist/devices-matter/ColorTemperatureLightAccessory.js.map +1 -0
- package/dist/devices-matter/ContactSensorAccessory.d.ts +10 -0
- package/dist/devices-matter/ContactSensorAccessory.d.ts.map +1 -0
- package/dist/devices-matter/ContactSensorAccessory.js +31 -0
- package/dist/devices-matter/ContactSensorAccessory.js.map +1 -0
- package/dist/devices-matter/DimmableLightAccessory.d.ts +56 -0
- package/dist/devices-matter/DimmableLightAccessory.d.ts.map +1 -0
- package/dist/devices-matter/DimmableLightAccessory.js +170 -0
- package/dist/devices-matter/DimmableLightAccessory.js.map +1 -0
- package/dist/devices-matter/DoorLockAccessory.d.ts +12 -0
- package/dist/devices-matter/DoorLockAccessory.d.ts.map +1 -0
- package/dist/devices-matter/DoorLockAccessory.js +47 -0
- package/dist/devices-matter/DoorLockAccessory.js.map +1 -0
- package/dist/devices-matter/ExtendedColorLightAccessory.d.ts +19 -0
- package/dist/devices-matter/ExtendedColorLightAccessory.d.ts.map +1 -0
- package/dist/devices-matter/ExtendedColorLightAccessory.js +108 -0
- package/dist/devices-matter/ExtendedColorLightAccessory.js.map +1 -0
- package/dist/devices-matter/FanAccessory.d.ts +14 -0
- package/dist/devices-matter/FanAccessory.d.ts.map +1 -0
- package/dist/devices-matter/FanAccessory.js +73 -0
- package/dist/devices-matter/FanAccessory.js.map +1 -0
- package/dist/devices-matter/HumiditySensorAccessory.d.ts +10 -0
- package/dist/devices-matter/HumiditySensorAccessory.d.ts.map +1 -0
- package/dist/devices-matter/HumiditySensorAccessory.js +33 -0
- package/dist/devices-matter/HumiditySensorAccessory.js.map +1 -0
- package/dist/devices-matter/LeakSensorAccessory.d.ts +10 -0
- package/dist/devices-matter/LeakSensorAccessory.d.ts.map +1 -0
- package/dist/devices-matter/LeakSensorAccessory.js +30 -0
- package/dist/devices-matter/LeakSensorAccessory.js.map +1 -0
- package/dist/devices-matter/LightSensorAccessory.d.ts +10 -0
- package/dist/devices-matter/LightSensorAccessory.d.ts.map +1 -0
- package/dist/devices-matter/LightSensorAccessory.js +33 -0
- package/dist/devices-matter/LightSensorAccessory.js.map +1 -0
- package/dist/devices-matter/OccupancySensorAccessory.d.ts +10 -0
- package/dist/devices-matter/OccupancySensorAccessory.d.ts.map +1 -0
- package/dist/devices-matter/OccupancySensorAccessory.js +43 -0
- package/dist/devices-matter/OccupancySensorAccessory.js.map +1 -0
- package/dist/devices-matter/OnOffLightAccessory.d.ts +36 -0
- package/dist/devices-matter/OnOffLightAccessory.d.ts.map +1 -0
- package/dist/devices-matter/OnOffLightAccessory.js +117 -0
- package/dist/devices-matter/OnOffLightAccessory.js.map +1 -0
- package/dist/devices-matter/OnOffOutletAccessory.d.ts +12 -0
- package/dist/devices-matter/OnOffOutletAccessory.d.ts.map +1 -0
- package/dist/devices-matter/OnOffOutletAccessory.js +43 -0
- package/dist/devices-matter/OnOffOutletAccessory.js.map +1 -0
- package/dist/devices-matter/OnOffSwitchAccessory.d.ts +12 -0
- package/dist/devices-matter/OnOffSwitchAccessory.d.ts.map +1 -0
- package/dist/devices-matter/OnOffSwitchAccessory.js +43 -0
- package/dist/devices-matter/OnOffSwitchAccessory.js.map +1 -0
- package/dist/devices-matter/RoboticVacuumAccessory.d.ts +66 -0
- package/dist/devices-matter/RoboticVacuumAccessory.d.ts.map +1 -0
- package/dist/devices-matter/RoboticVacuumAccessory.js +402 -0
- package/dist/devices-matter/RoboticVacuumAccessory.js.map +1 -0
- package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts +11 -0
- package/dist/devices-matter/SmokeCOAlarmAccessory.d.ts.map +1 -0
- package/dist/devices-matter/SmokeCOAlarmAccessory.js +49 -0
- package/dist/devices-matter/SmokeCOAlarmAccessory.js.map +1 -0
- package/dist/devices-matter/TemperatureSensorAccessory.d.ts +10 -0
- package/dist/devices-matter/TemperatureSensorAccessory.d.ts.map +1 -0
- package/dist/devices-matter/TemperatureSensorAccessory.js +33 -0
- package/dist/devices-matter/TemperatureSensorAccessory.js.map +1 -0
- package/dist/devices-matter/ThermostatAccessory.d.ts +17 -0
- package/dist/devices-matter/ThermostatAccessory.d.ts.map +1 -0
- package/dist/devices-matter/ThermostatAccessory.js +87 -0
- package/dist/devices-matter/ThermostatAccessory.js.map +1 -0
- package/dist/devices-matter/VenetianBlindAccessory.d.ts +17 -0
- package/dist/devices-matter/VenetianBlindAccessory.d.ts.map +1 -0
- package/dist/devices-matter/VenetianBlindAccessory.js +100 -0
- package/dist/devices-matter/VenetianBlindAccessory.js.map +1 -0
- package/dist/devices-matter/WindowBlindAccessory.d.ts +15 -0
- package/dist/devices-matter/WindowBlindAccessory.d.ts.map +1 -0
- package/dist/devices-matter/WindowBlindAccessory.js +81 -0
- package/dist/devices-matter/WindowBlindAccessory.js.map +1 -0
- package/dist/devices-matter/custom/PowerStripAccessory.d.ts +97 -0
- package/dist/devices-matter/custom/PowerStripAccessory.d.ts.map +1 -0
- package/dist/devices-matter/custom/PowerStripAccessory.js +265 -0
- package/dist/devices-matter/custom/PowerStripAccessory.js.map +1 -0
- package/dist/devices-matter/custom/index.d.ts +8 -0
- package/dist/devices-matter/custom/index.d.ts.map +1 -0
- package/dist/devices-matter/custom/index.js +8 -0
- package/dist/devices-matter/custom/index.js.map +1 -0
- package/dist/devices-matter/index.d.ts +29 -0
- package/dist/devices-matter/index.d.ts.map +1 -0
- package/dist/devices-matter/index.js +28 -0
- package/dist/devices-matter/index.js.map +1 -0
- package/dist/homebridge-ui/public/index.html +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +2 -2
- package/dist/index.test.js.map +1 -1
- package/dist/irdevice/airconditioner.d.ts +3 -3
- package/dist/irdevice/airconditioner.d.ts.map +1 -1
- package/dist/irdevice/airconditioner.js.map +1 -1
- package/dist/irdevice/airpurifier.d.ts +3 -3
- package/dist/irdevice/airpurifier.d.ts.map +1 -1
- package/dist/irdevice/airpurifier.js.map +1 -1
- package/dist/irdevice/camera.d.ts +3 -3
- package/dist/irdevice/camera.d.ts.map +1 -1
- package/dist/irdevice/camera.js.map +1 -1
- package/dist/irdevice/fan.d.ts +3 -3
- package/dist/irdevice/fan.d.ts.map +1 -1
- package/dist/irdevice/fan.js.map +1 -1
- package/dist/irdevice/irdevice.d.ts +3 -3
- package/dist/irdevice/irdevice.d.ts.map +1 -1
- package/dist/irdevice/irdevice.js.map +1 -1
- package/dist/irdevice/light.d.ts +3 -3
- package/dist/irdevice/light.d.ts.map +1 -1
- package/dist/irdevice/light.js.map +1 -1
- package/dist/irdevice/other.d.ts +3 -3
- package/dist/irdevice/other.d.ts.map +1 -1
- package/dist/irdevice/other.js.map +1 -1
- package/dist/irdevice/tv.d.ts +3 -3
- package/dist/irdevice/tv.d.ts.map +1 -1
- package/dist/irdevice/tv.js.map +1 -1
- package/dist/irdevice/vacuumcleaner.d.ts +3 -3
- package/dist/irdevice/vacuumcleaner.d.ts.map +1 -1
- package/dist/irdevice/vacuumcleaner.js.map +1 -1
- package/dist/irdevice/waterheater.d.ts +3 -3
- package/dist/irdevice/waterheater.d.ts.map +1 -1
- package/dist/irdevice/waterheater.js.map +1 -1
- package/dist/{platform.d.ts → platform-hap.d.ts} +2 -2
- package/dist/platform-hap.d.ts.map +1 -0
- package/dist/{platform.js → platform-hap.js} +32 -31
- package/dist/{platform.js.map → platform-hap.js.map} +1 -1
- package/dist/platform-matter.d.ts +75 -0
- package/dist/platform-matter.d.ts.map +1 -0
- package/dist/platform-matter.js +362 -0
- package/dist/platform-matter.js.map +1 -0
- package/dist/verifyconfig.test.d.ts +2 -0
- package/dist/verifyconfig.test.d.ts.map +1 -0
- package/dist/verifyconfig.test.js +167 -0
- package/dist/verifyconfig.test.js.map +1 -0
- package/docs/index.html +20 -11
- package/docs/variables/default.html +1 -1
- package/package.json +7 -7
- package/src/{device → devices-hap}/airpurifier.ts +2 -2
- package/src/{device → devices-hap}/blindtilt.ts +7 -3
- package/src/{device → devices-hap}/bot.ts +2 -2
- package/src/{device → devices-hap}/ceilinglight.ts +2 -2
- package/src/{device → devices-hap}/colorbulb.ts +2 -2
- package/src/{device → devices-hap}/contact.ts +2 -2
- package/src/{device → devices-hap}/curtain.ts +32 -10
- package/src/{device → devices-hap}/device.ts +12 -6
- package/src/{device → devices-hap}/fan.ts +2 -2
- package/src/{device → devices-hap}/hub.ts +7 -6
- package/src/{device → devices-hap}/humidifier.ts +2 -2
- package/src/{device → devices-hap}/iosensor.ts +2 -2
- package/src/{device → devices-hap}/lightstrip.ts +2 -2
- package/src/{device → devices-hap}/lock.ts +2 -2
- package/src/{device → devices-hap}/meter.ts +2 -2
- package/src/{device → devices-hap}/meterplus.ts +2 -2
- package/src/{device → devices-hap}/meterpro.ts +18 -5
- package/src/{device → devices-hap}/motion.ts +2 -2
- package/src/{device → devices-hap}/plug.ts +2 -2
- package/src/{device → devices-hap}/relayswitch.ts +2 -2
- package/src/{device → devices-hap}/robotvacuumcleaner.ts +2 -2
- package/src/{device → devices-hap}/waterdetector.ts +2 -2
- package/src/devices-matter/BaseMatterAccessory.ts +131 -0
- package/src/devices-matter/ColorLightAccessory.ts +113 -0
- package/src/devices-matter/ColorTemperatureLightAccessory.ts +98 -0
- package/src/devices-matter/ContactSensorAccessory.ts +37 -0
- package/src/devices-matter/DimmableLightAccessory.ts +196 -0
- package/src/devices-matter/DoorLockAccessory.ts +56 -0
- package/src/devices-matter/ExtendedColorLightAccessory.ts +127 -0
- package/src/devices-matter/FanAccessory.ts +87 -0
- package/src/devices-matter/HumiditySensorAccessory.ts +39 -0
- package/src/devices-matter/LeakSensorAccessory.ts +36 -0
- package/src/devices-matter/LightSensorAccessory.ts +39 -0
- package/src/devices-matter/OccupancySensorAccessory.ts +52 -0
- package/src/devices-matter/OnOffLightAccessory.ts +133 -0
- package/src/devices-matter/OnOffOutletAccessory.ts +52 -0
- package/src/devices-matter/OnOffSwitchAccessory.ts +52 -0
- package/src/devices-matter/RoboticVacuumAccessory.ts +484 -0
- package/src/devices-matter/SmokeCOAlarmAccessory.ts +59 -0
- package/src/devices-matter/TemperatureSensorAccessory.ts +39 -0
- package/src/devices-matter/ThermostatAccessory.ts +105 -0
- package/src/devices-matter/VenetianBlindAccessory.ts +118 -0
- package/src/devices-matter/WindowBlindAccessory.ts +94 -0
- package/src/devices-matter/custom/PowerStripAccessory.ts +309 -0
- package/src/devices-matter/custom/index.ts +8 -0
- package/src/devices-matter/index.ts +29 -0
- package/src/homebridge-ui/public/index.html +1 -1
- package/src/index.test.ts +2 -2
- package/src/index.ts +7 -2
- package/src/irdevice/airconditioner.ts +2 -2
- package/src/irdevice/airpurifier.ts +2 -2
- package/src/irdevice/camera.ts +2 -2
- package/src/irdevice/fan.ts +2 -2
- package/src/irdevice/irdevice.ts +2 -2
- package/src/irdevice/light.ts +2 -2
- package/src/irdevice/other.ts +2 -2
- package/src/irdevice/tv.ts +2 -2
- package/src/irdevice/vacuumcleaner.ts +2 -2
- package/src/irdevice/waterheater.ts +2 -2
- package/src/{platform.ts → platform-hap.ts} +31 -30
- package/src/platform-matter.ts +450 -0
- package/src/verifyconfig.test.ts +197 -0
- package/tsconfig.json +2 -1
- package/typedoc.json +1 -0
- package/.github/workflows/build.yml +0 -18
- package/.github/workflows/changerelease.yml +0 -11
- package/.github/workflows/labeler.yml +0 -16
- package/.github/workflows/release-drafter.yml +0 -14
- package/dist/device/airpurifier.d.ts.map +0 -1
- package/dist/device/airpurifier.js.map +0 -1
- package/dist/device/blindtilt.d.ts.map +0 -1
- package/dist/device/blindtilt.js.map +0 -1
- package/dist/device/bot.d.ts.map +0 -1
- package/dist/device/bot.js.map +0 -1
- package/dist/device/ceilinglight.d.ts.map +0 -1
- package/dist/device/ceilinglight.js.map +0 -1
- package/dist/device/colorbulb.d.ts.map +0 -1
- package/dist/device/colorbulb.js.map +0 -1
- package/dist/device/contact.d.ts.map +0 -1
- package/dist/device/contact.js.map +0 -1
- package/dist/device/curtain.d.ts.map +0 -1
- package/dist/device/curtain.js.map +0 -1
- package/dist/device/device.d.ts.map +0 -1
- package/dist/device/device.js.map +0 -1
- package/dist/device/fan.d.ts.map +0 -1
- package/dist/device/fan.js.map +0 -1
- package/dist/device/hub.d.ts.map +0 -1
- package/dist/device/hub.js.map +0 -1
- package/dist/device/humidifier.d.ts.map +0 -1
- package/dist/device/humidifier.js.map +0 -1
- package/dist/device/iosensor.d.ts.map +0 -1
- package/dist/device/iosensor.js.map +0 -1
- package/dist/device/lightstrip.d.ts.map +0 -1
- package/dist/device/lightstrip.js.map +0 -1
- package/dist/device/lock.d.ts.map +0 -1
- package/dist/device/lock.js.map +0 -1
- package/dist/device/meter.d.ts.map +0 -1
- package/dist/device/meter.js.map +0 -1
- package/dist/device/meterplus.d.ts.map +0 -1
- package/dist/device/meterplus.js.map +0 -1
- package/dist/device/meterpro.d.ts.map +0 -1
- package/dist/device/meterpro.js.map +0 -1
- package/dist/device/motion.d.ts.map +0 -1
- package/dist/device/motion.js.map +0 -1
- package/dist/device/plug.d.ts.map +0 -1
- package/dist/device/plug.js.map +0 -1
- package/dist/device/relayswitch.d.ts.map +0 -1
- package/dist/device/relayswitch.js.map +0 -1
- package/dist/device/robotvacuumcleaner.d.ts.map +0 -1
- package/dist/device/robotvacuumcleaner.js.map +0 -1
- package/dist/device/waterdetector.d.ts.map +0 -1
- package/dist/device/waterdetector.js.map +0 -1
- package/dist/platform.d.ts.map +0 -1
- /package/dist/{device → devices-hap}/airpurifier.js +0 -0
- /package/dist/{device → devices-hap}/bot.js +0 -0
- /package/dist/{device → devices-hap}/ceilinglight.js +0 -0
- /package/dist/{device → devices-hap}/colorbulb.js +0 -0
- /package/dist/{device → devices-hap}/contact.js +0 -0
- /package/dist/{device → devices-hap}/fan.js +0 -0
- /package/dist/{device → devices-hap}/humidifier.js +0 -0
- /package/dist/{device → devices-hap}/iosensor.js +0 -0
- /package/dist/{device → devices-hap}/lightstrip.js +0 -0
- /package/dist/{device → devices-hap}/lock.js +0 -0
- /package/dist/{device → devices-hap}/meter.js +0 -0
- /package/dist/{device → devices-hap}/meterplus.js +0 -0
- /package/dist/{device → devices-hap}/motion.js +0 -0
- /package/dist/{device → devices-hap}/plug.js +0 -0
- /package/dist/{device → devices-hap}/relayswitch.js +0 -0
- /package/dist/{device → devices-hap}/robotvacuumcleaner.js +0 -0
- /package/dist/{device → devices-hap}/waterdetector.js +0 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dimmable Light Accessory Class
|
|
3
|
+
*
|
|
4
|
+
* Example of a more complex device with multiple clusters.
|
|
5
|
+
* Shows how to handle devices with on/off + level control.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { API, Logger, MatterRequests } from 'homebridge'
|
|
9
|
+
|
|
10
|
+
import { BaseMatterAccessory } from './BaseMatterAccessory.js'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Dimmable Light Device Class
|
|
14
|
+
*
|
|
15
|
+
* Demonstrates:
|
|
16
|
+
* - Multiple clusters (OnOff + LevelControl)
|
|
17
|
+
* - Type-safe request handlers
|
|
18
|
+
* - Value conversion (Matter level ↔ percentage)
|
|
19
|
+
* - Custom public methods for external control
|
|
20
|
+
*/
|
|
21
|
+
export class DimmableLightAccessory extends BaseMatterAccessory {
|
|
22
|
+
// Track current state
|
|
23
|
+
private currentLevel: number = 127 // 50% brightness
|
|
24
|
+
|
|
25
|
+
constructor(api: API, log: Logger) {
|
|
26
|
+
const serialNumber = 'LIGHT-002'
|
|
27
|
+
const displayName = 'Dimmable Light'
|
|
28
|
+
const manufacturer = 'Homebridge Matter'
|
|
29
|
+
const model = 'HB-MATTER-LIGHT-DIMMABLE'
|
|
30
|
+
const firmwareRevision = '2.0.0'
|
|
31
|
+
const hardwareRevision = '1.0.0'
|
|
32
|
+
|
|
33
|
+
super(api, log, {
|
|
34
|
+
uuid: api.matter.uuid.generate(serialNumber),
|
|
35
|
+
displayName,
|
|
36
|
+
deviceType: api.matter.deviceTypes.DimmableLight,
|
|
37
|
+
serialNumber,
|
|
38
|
+
manufacturer,
|
|
39
|
+
model,
|
|
40
|
+
firmwareRevision,
|
|
41
|
+
hardwareRevision,
|
|
42
|
+
|
|
43
|
+
clusters: {
|
|
44
|
+
onOff: {
|
|
45
|
+
onOff: false,
|
|
46
|
+
},
|
|
47
|
+
levelControl: {
|
|
48
|
+
currentLevel: 127, // 50% brightness (range 1-254)
|
|
49
|
+
minLevel: 1,
|
|
50
|
+
maxLevel: 254,
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
handlers: {
|
|
55
|
+
onOff: {
|
|
56
|
+
on: async () => this.handleOn(),
|
|
57
|
+
off: async () => this.handleOff(),
|
|
58
|
+
},
|
|
59
|
+
levelControl: {
|
|
60
|
+
moveToLevelWithOnOff: async (request: MatterRequests.MoveToLevel) =>
|
|
61
|
+
this.handleSetLevel(request),
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
this.logInfo('initialized.')
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Handle the "on" command
|
|
71
|
+
*/
|
|
72
|
+
private async handleOn(): Promise<void> {
|
|
73
|
+
this.logInfo('turning on.')
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
// TODO: Control your physical device
|
|
77
|
+
// await myLightAPI.turnOn()
|
|
78
|
+
|
|
79
|
+
this.logInfo('physical device turned on.')
|
|
80
|
+
} catch (error) {
|
|
81
|
+
this.logError('failed to turn on:', error)
|
|
82
|
+
throw error
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Handle the "off" command
|
|
88
|
+
*/
|
|
89
|
+
private async handleOff(): Promise<void> {
|
|
90
|
+
this.logInfo('turning off.')
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
// TODO: Control your physical device
|
|
94
|
+
// await myLightAPI.turnOff()
|
|
95
|
+
|
|
96
|
+
this.logInfo('physical device turned off.')
|
|
97
|
+
} catch (error) {
|
|
98
|
+
this.logError('failed to turn off:', error)
|
|
99
|
+
throw error
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Handle brightness level changes
|
|
105
|
+
*/
|
|
106
|
+
private async handleSetLevel(request: MatterRequests.MoveToLevel): Promise<void> {
|
|
107
|
+
this.logInfo(`MoveToLevel request: ${JSON.stringify(request)}`)
|
|
108
|
+
const { level, transitionTime } = request
|
|
109
|
+
|
|
110
|
+
// Convert Matter level (1-254) to percentage (0-100%)
|
|
111
|
+
const brightnessPercent = Math.round((level / 254) * 100)
|
|
112
|
+
this.currentLevel = level
|
|
113
|
+
|
|
114
|
+
this.logInfo(`setting brightness to ${brightnessPercent}% (level: ${level}), transitionTime: ${transitionTime}.`)
|
|
115
|
+
|
|
116
|
+
try {
|
|
117
|
+
// TODO: Control your physical device
|
|
118
|
+
// await myLightAPI.setBrightness(brightnessPercent, transitionTime)
|
|
119
|
+
|
|
120
|
+
this.logInfo(`physical device brightness set to ${brightnessPercent}%.`)
|
|
121
|
+
} catch (error) {
|
|
122
|
+
this.logError('Failed to set brightness:', error)
|
|
123
|
+
throw error
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Update on/off state from external source
|
|
129
|
+
*/
|
|
130
|
+
public updateOnOffState(isOn: boolean): void {
|
|
131
|
+
this.updateState(this.api.matter.clusterNames.OnOff, { onOff: isOn })
|
|
132
|
+
this.logInfo(`state synced: ${isOn ? 'ON' : 'OFF'}.`)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Update brightness level from external source
|
|
137
|
+
* @param percent - Brightness percentage (0-100)
|
|
138
|
+
*/
|
|
139
|
+
public updateBrightness(percent: number): void {
|
|
140
|
+
// Validate input
|
|
141
|
+
if (percent < 0 || percent > 100) {
|
|
142
|
+
this.logWarn(`Invalid brightness percentage: ${percent}. Must be 0-100.`)
|
|
143
|
+
return
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Convert percent to Matter level (1-254)
|
|
147
|
+
const matterLevel = Math.max(1, Math.round((percent / 100) * 254))
|
|
148
|
+
this.currentLevel = matterLevel
|
|
149
|
+
|
|
150
|
+
this.updateState(this.api.matter.clusterNames.LevelControl, {
|
|
151
|
+
currentLevel: matterLevel,
|
|
152
|
+
})
|
|
153
|
+
|
|
154
|
+
this.logInfo(`brightness synced: ${percent}% (level: ${matterLevel}).`)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Get current brightness as percentage
|
|
159
|
+
*/
|
|
160
|
+
public getBrightness(): number {
|
|
161
|
+
return Math.round((this.currentLevel / 254) * 100)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Set brightness and power state together
|
|
166
|
+
* Useful for syncing complete state from external source
|
|
167
|
+
*/
|
|
168
|
+
public updateFullState(isOn: boolean, percent: number): void {
|
|
169
|
+
this.updateOnOffState(isOn)
|
|
170
|
+
if (isOn) {
|
|
171
|
+
this.updateBrightness(percent)
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Example monitoring setup
|
|
177
|
+
*/
|
|
178
|
+
public startMonitoring(): void {
|
|
179
|
+
// Example: MQTT listener
|
|
180
|
+
// mqttClient.on('message', (topic, message) => {
|
|
181
|
+
// const { state, brightness } = JSON.parse(message.toString())
|
|
182
|
+
// this.updateFullState(state === 'ON', brightness)
|
|
183
|
+
// })
|
|
184
|
+
|
|
185
|
+
// Example: Polling
|
|
186
|
+
// setInterval(async () => {
|
|
187
|
+
// try {
|
|
188
|
+
// const response = await fetch('https://api.mydevice.com/light/state')
|
|
189
|
+
// const data = await response.json()
|
|
190
|
+
// this.updateFullState(data.power === 'on', data.brightness)
|
|
191
|
+
// } catch (error) {
|
|
192
|
+
// this.logError('Polling error:', error)
|
|
193
|
+
// }
|
|
194
|
+
// }, 5000)
|
|
195
|
+
}
|
|
196
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Door Lock Accessory Class
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { API, Logger } from 'homebridge'
|
|
6
|
+
|
|
7
|
+
import { BaseMatterAccessory } from './BaseMatterAccessory.js'
|
|
8
|
+
|
|
9
|
+
export class DoorLockAccessory extends BaseMatterAccessory {
|
|
10
|
+
constructor(api: API, log: Logger) {
|
|
11
|
+
const serialNumber = 'LOCK-001'
|
|
12
|
+
super(api, log, {
|
|
13
|
+
uuid: api.matter.uuid.generate(serialNumber),
|
|
14
|
+
displayName: 'Door Lock',
|
|
15
|
+
deviceType: api.matter.deviceTypes.DoorLock,
|
|
16
|
+
serialNumber,
|
|
17
|
+
manufacturer: 'Homebridge Matter',
|
|
18
|
+
model: 'HB-MATTER-LOCK-DOOR',
|
|
19
|
+
firmwareRevision: '2.0.0',
|
|
20
|
+
hardwareRevision: '1.0.0',
|
|
21
|
+
|
|
22
|
+
clusters: {
|
|
23
|
+
doorLock: {
|
|
24
|
+
lockState: api.matter.types.DoorLock.LockState.Unlocked,
|
|
25
|
+
lockType: api.matter.types.DoorLock.LockType.DeadBolt,
|
|
26
|
+
actuatorEnabled: true,
|
|
27
|
+
operatingMode: api.matter.types.DoorLock.OperatingMode.Normal,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
handlers: {
|
|
32
|
+
doorLock: {
|
|
33
|
+
lockDoor: async () => this.handleLock(),
|
|
34
|
+
unlockDoor: async () => this.handleUnlock(),
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
this.logInfo('initialized.')
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
private async handleLock(): Promise<void> {
|
|
43
|
+
this.logInfo('locked.')
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
private async handleUnlock(): Promise<void> {
|
|
47
|
+
this.logInfo('unlocked.')
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public updateLockState(state: 0 | 1 | 2): void {
|
|
51
|
+
// 0 = Not fully locked, 1 = Locked, 2 = Unlocked
|
|
52
|
+
this.updateState('doorLock', { lockState: state })
|
|
53
|
+
const stateStr = ['Not Fully Locked', 'Locked', 'Unlocked'][state]
|
|
54
|
+
this.logInfo(`lock state: ${stateStr}.`)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extended Color Light Accessory Class (HS+CCT)
|
|
3
|
+
* Hue, Saturation, and Color Temperature control
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { API, Logger, MatterRequests } from 'homebridge'
|
|
7
|
+
|
|
8
|
+
import { BaseMatterAccessory } from './BaseMatterAccessory.js'
|
|
9
|
+
|
|
10
|
+
export class ExtendedColorLightAccessory extends BaseMatterAccessory {
|
|
11
|
+
constructor(api: API, log: Logger) {
|
|
12
|
+
const serialNumber = 'LIGHT-005'
|
|
13
|
+
super(api, log, {
|
|
14
|
+
uuid: api.matter.uuid.generate(serialNumber),
|
|
15
|
+
displayName: 'Extended Colour Light (HS+CCT)',
|
|
16
|
+
deviceType: api.matter.deviceTypes.ExtendedColorLight,
|
|
17
|
+
serialNumber,
|
|
18
|
+
manufacturer: 'Homebridge Matter',
|
|
19
|
+
model: 'HB-MATTER-LIGHT-EXTENDED-COLOUR',
|
|
20
|
+
firmwareRevision: '2.0.0',
|
|
21
|
+
hardwareRevision: '1.0.0',
|
|
22
|
+
|
|
23
|
+
clusters: {
|
|
24
|
+
onOff: { onOff: false },
|
|
25
|
+
levelControl: {
|
|
26
|
+
currentLevel: 127,
|
|
27
|
+
minLevel: 1,
|
|
28
|
+
maxLevel: 254,
|
|
29
|
+
},
|
|
30
|
+
colorControl: {
|
|
31
|
+
colorMode: api.matter.types.ColorControl.ColorMode.CurrentHueAndCurrentSaturation,
|
|
32
|
+
currentHue: 0,
|
|
33
|
+
currentSaturation: 254,
|
|
34
|
+
currentX: 41942,
|
|
35
|
+
currentY: 21626,
|
|
36
|
+
colorTemperatureMireds: 250,
|
|
37
|
+
colorTempPhysicalMinMireds: 147,
|
|
38
|
+
colorTempPhysicalMaxMireds: 454,
|
|
39
|
+
coupleColorTempToLevelMinMireds: 147,
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
handlers: {
|
|
44
|
+
onOff: {
|
|
45
|
+
on: async () => this.handleOn(),
|
|
46
|
+
off: async () => this.handleOff(),
|
|
47
|
+
},
|
|
48
|
+
levelControl: {
|
|
49
|
+
moveToLevelWithOnOff: async (request: MatterRequests.MoveToLevel) =>
|
|
50
|
+
this.handleSetLevel(request),
|
|
51
|
+
},
|
|
52
|
+
colorControl: {
|
|
53
|
+
moveToColorLogic: async (request: MatterRequests.MoveToColor) =>
|
|
54
|
+
this.handleSetColor(request),
|
|
55
|
+
moveToHueAndSaturationLogic: async (request: MatterRequests.MoveToHueAndSaturation) =>
|
|
56
|
+
this.handleSetHueSaturation(request),
|
|
57
|
+
moveToColorTemperatureLogic: async (request: MatterRequests.MoveToColorTemperature) =>
|
|
58
|
+
this.handleSetColorTemperature(request),
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
this.logInfo('initialized.')
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
private async handleOn(): Promise<void> {
|
|
67
|
+
this.logInfo('turning on.')
|
|
68
|
+
// TODO: await myLightAPI.turnOn()
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
private async handleOff(): Promise<void> {
|
|
72
|
+
this.logInfo('turning off.')
|
|
73
|
+
// TODO: await myLightAPI.turnOff()
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
private async handleSetLevel(request: MatterRequests.MoveToLevel): Promise<void> {
|
|
77
|
+
this.logInfo(`MoveToLevel request: ${JSON.stringify(request)}`)
|
|
78
|
+
const { level } = request
|
|
79
|
+
const brightnessPercent = Math.round((level / 254) * 100)
|
|
80
|
+
this.logInfo(`setting brightness to ${brightnessPercent}%.`)
|
|
81
|
+
// TODO: await myLightAPI.setBrightness(brightnessPercent)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private async handleSetColor(request: MatterRequests.MoveToColor): Promise<void> {
|
|
85
|
+
this.logInfo(`MoveToColor request: ${JSON.stringify(request)}`)
|
|
86
|
+
const { colorX, colorY, transitionTime } = request
|
|
87
|
+
const xFloat = (colorX / 65535).toFixed(4)
|
|
88
|
+
const yFloat = (colorY / 65535).toFixed(4)
|
|
89
|
+
this.logInfo(`setting xy color to (${xFloat}, ${yFloat}), ${transitionTime}ms.`)
|
|
90
|
+
// TODO: await myLightAPI.setXY(xFloat, yFloat, transitionTime)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private async handleSetHueSaturation(request: MatterRequests.MoveToHueAndSaturation): Promise<void> {
|
|
94
|
+
this.logInfo(`MoveToHueAndSaturation request: ${JSON.stringify(request)}`)
|
|
95
|
+
const { hue, saturation, transitionTime } = request
|
|
96
|
+
const hueDegrees = Math.round((hue / 254) * 360)
|
|
97
|
+
const saturationPercent = Math.round((saturation / 254) * 100)
|
|
98
|
+
this.logInfo(`setting color to ${hueDegrees}°, ${saturationPercent}%, ${transitionTime}ms.`)
|
|
99
|
+
// TODO: await myLightAPI.setColor(hueDegrees, saturationPercent, transitionTime)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
private async handleSetColorTemperature(request: MatterRequests.MoveToColorTemperature): Promise<void> {
|
|
103
|
+
this.logInfo(`MoveToColorTemperature request: ${JSON.stringify(request)}`)
|
|
104
|
+
const { colorTemperatureMireds, transitionTime } = request
|
|
105
|
+
const kelvin = Math.round(1000000 / colorTemperatureMireds)
|
|
106
|
+
this.logInfo(`setting color temp to ${kelvin}k, ${transitionTime}ms.`)
|
|
107
|
+
// TODO: await myLightAPI.setColorTemperature(kelvin, transitionTime)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
public updateOnOffState(isOn: boolean): void {
|
|
111
|
+
this.updateState(this.api.matter.clusterNames.OnOff, { onOff: isOn })
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
public updateBrightness(percent: number): void {
|
|
115
|
+
const matterLevel = Math.max(1, Math.round((percent / 100) * 254))
|
|
116
|
+
this.updateState(this.api.matter.clusterNames.LevelControl, { currentLevel: matterLevel })
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
public updateHueSaturation(hue: number, saturation: number): void {
|
|
120
|
+
const matterHue = Math.round((hue / 360) * 254)
|
|
121
|
+
const matterSat = Math.round((saturation / 100) * 254)
|
|
122
|
+
this.updateState(this.api.matter.clusterNames.ColorControl, {
|
|
123
|
+
currentHue: matterHue,
|
|
124
|
+
currentSaturation: matterSat,
|
|
125
|
+
})
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fan Accessory Class
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { API, Logger, MatterRequests } from 'homebridge'
|
|
6
|
+
|
|
7
|
+
import { BaseMatterAccessory } from './BaseMatterAccessory.js'
|
|
8
|
+
|
|
9
|
+
export class FanAccessory extends BaseMatterAccessory {
|
|
10
|
+
constructor(api: API, log: Logger) {
|
|
11
|
+
const serialNumber = 'FAN-001'
|
|
12
|
+
super(api, log, {
|
|
13
|
+
uuid: api.matter.uuid.generate(serialNumber),
|
|
14
|
+
displayName: 'Fan',
|
|
15
|
+
deviceType: api.matter.deviceTypes.Fan,
|
|
16
|
+
serialNumber,
|
|
17
|
+
manufacturer: 'Homebridge Matter',
|
|
18
|
+
model: 'HB-MATTER-FAN',
|
|
19
|
+
firmwareRevision: '2.0.0',
|
|
20
|
+
hardwareRevision: '1.0.0',
|
|
21
|
+
|
|
22
|
+
clusters: {
|
|
23
|
+
fanControl: {
|
|
24
|
+
fanMode: api.matter.types.FanControl.FanMode.Off,
|
|
25
|
+
fanModeSequence: api.matter.types.FanControl.FanModeSequence.OffLowMedHigh,
|
|
26
|
+
percentSetting: 0,
|
|
27
|
+
percentCurrent: 0,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
handlers: {
|
|
32
|
+
fanControl: {
|
|
33
|
+
step: async (request: MatterRequests.FanStep) => this.handleStep(request),
|
|
34
|
+
fanModeChange: async (request: { fanMode: number, oldFanMode: number }) => this.handleFanModeChange(request),
|
|
35
|
+
percentSettingChange: async (request: { percentSetting: number | null, oldPercentSetting: number | null }) =>
|
|
36
|
+
this.handlePercentSettingChange(request),
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
this.logInfo('initialized.')
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private async handleStep(request: MatterRequests.FanStep): Promise<void> {
|
|
45
|
+
this.logInfo(`FanStep request: ${JSON.stringify(request)}`)
|
|
46
|
+
const { direction, wrap, lowestOff } = request
|
|
47
|
+
const dirStr = direction === 0 ? 'increase' : 'decrease'
|
|
48
|
+
this.logInfo(`step ${dirStr} (wrap: ${wrap}, lowestoff: ${lowestOff}).`)
|
|
49
|
+
// TODO: await myFanAPI.step(direction, wrap, lowestOff)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private async handleFanModeChange(request: { fanMode: number, oldFanMode: number }): Promise<void> {
|
|
53
|
+
this.logInfo(`FanMode change: ${JSON.stringify(request)}`)
|
|
54
|
+
const modeNames = ['Off', 'Low', 'Medium', 'High', 'On', 'Auto', 'Smart']
|
|
55
|
+
const modeName = modeNames[request.fanMode] || `Unknown (${request.fanMode})`
|
|
56
|
+
this.logInfo(`fan mode changed to: ${modeName}.`)
|
|
57
|
+
// TODO: await myFanAPI.setMode(request.fanMode)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
private async handlePercentSettingChange(request: { percentSetting: number | null, oldPercentSetting: number | null }): Promise<void> {
|
|
61
|
+
this.logInfo(`PercentSetting change: ${JSON.stringify(request)}`)
|
|
62
|
+
const percent = request.percentSetting ?? 0
|
|
63
|
+
const isOff = percent === 0
|
|
64
|
+
const wasOff = (request.oldPercentSetting ?? 0) === 0
|
|
65
|
+
|
|
66
|
+
if (isOff !== wasOff) {
|
|
67
|
+
this.logInfo(`fan turned ${isOff ? 'off' : 'on'}.`)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (!isOff) {
|
|
71
|
+
this.logInfo(`fan speed changed to: ${percent}%.`)
|
|
72
|
+
}
|
|
73
|
+
// TODO: await myFanAPI.setSpeed(percent)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
public updateFanMode(mode: number): void {
|
|
77
|
+
this.updateState(this.api.matter.clusterNames.FanControl, { fanMode: mode })
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public updateFanSpeed(percent: number): void {
|
|
81
|
+
this.updateState(this.api.matter.clusterNames.FanControl, {
|
|
82
|
+
percentSetting: percent,
|
|
83
|
+
percentCurrent: percent,
|
|
84
|
+
})
|
|
85
|
+
this.logInfo(`fan speed: ${percent}%.`)
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Humidity Sensor Accessory Class
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { API, Logger } from 'homebridge'
|
|
6
|
+
|
|
7
|
+
import { BaseMatterAccessory } from './BaseMatterAccessory.js'
|
|
8
|
+
|
|
9
|
+
export class HumiditySensorAccessory extends BaseMatterAccessory {
|
|
10
|
+
constructor(api: API, log: Logger) {
|
|
11
|
+
const serialNumber = 'SENSOR-005'
|
|
12
|
+
super(api, log, {
|
|
13
|
+
uuid: api.matter.uuid.generate(serialNumber),
|
|
14
|
+
displayName: 'Humidity Sensor',
|
|
15
|
+
deviceType: api.matter.deviceTypes.HumiditySensor,
|
|
16
|
+
serialNumber,
|
|
17
|
+
manufacturer: 'Homebridge Matter',
|
|
18
|
+
model: 'HB-MATTER-SENSOR-HUMIDITY',
|
|
19
|
+
firmwareRevision: '2.0.0',
|
|
20
|
+
hardwareRevision: '1.0.0',
|
|
21
|
+
|
|
22
|
+
clusters: {
|
|
23
|
+
relativeHumidityMeasurement: {
|
|
24
|
+
measuredValue: 5500, // 55% (in hundredths of a percent)
|
|
25
|
+
minMeasuredValue: 0,
|
|
26
|
+
maxMeasuredValue: 10000,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
this.logInfo('initialized.')
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public updateHumidity(percent: number): void {
|
|
35
|
+
const value = Math.round(percent * 100) // convert to hundredths
|
|
36
|
+
this.updateState('relativeHumidityMeasurement', { measuredValue: value })
|
|
37
|
+
this.logInfo(`humidity: ${percent}%.`)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Leak Sensor Accessory Class
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { API, Logger } from 'homebridge'
|
|
6
|
+
|
|
7
|
+
import { BaseMatterAccessory } from './BaseMatterAccessory.js'
|
|
8
|
+
|
|
9
|
+
export class LeakSensorAccessory extends BaseMatterAccessory {
|
|
10
|
+
constructor(api: API, log: Logger) {
|
|
11
|
+
const serialNumber = 'SENSOR-007'
|
|
12
|
+
super(api, log, {
|
|
13
|
+
uuid: api.matter.uuid.generate(serialNumber),
|
|
14
|
+
displayName: 'Leak Sensor',
|
|
15
|
+
deviceType: api.matter.deviceTypes.LeakSensor,
|
|
16
|
+
serialNumber,
|
|
17
|
+
manufacturer: 'Homebridge Matter',
|
|
18
|
+
model: 'HB-MATTER-SENSOR-LEAK',
|
|
19
|
+
firmwareRevision: '2.0.0',
|
|
20
|
+
hardwareRevision: '1.0.0',
|
|
21
|
+
|
|
22
|
+
clusters: {
|
|
23
|
+
booleanState: {
|
|
24
|
+
stateValue: false, // false = dry, true = leak
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
this.logInfo('initialized.')
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public updateLeakState(leakDetected: boolean): void {
|
|
33
|
+
this.updateState(this.api.matter.clusterNames.BooleanState, { stateValue: leakDetected })
|
|
34
|
+
this.logInfo(`leak: ${leakDetected ? 'detected' : 'none'}.`)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Light Sensor Accessory Class
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { API, Logger } from 'homebridge'
|
|
6
|
+
|
|
7
|
+
import { BaseMatterAccessory } from './BaseMatterAccessory.js'
|
|
8
|
+
|
|
9
|
+
export class LightSensorAccessory extends BaseMatterAccessory {
|
|
10
|
+
constructor(api: API, log: Logger) {
|
|
11
|
+
const serialNumber = 'SENSOR-002'
|
|
12
|
+
super(api, log, {
|
|
13
|
+
uuid: api.matter.uuid.generate(serialNumber),
|
|
14
|
+
displayName: 'Light Sensor',
|
|
15
|
+
deviceType: api.matter.deviceTypes.LightSensor,
|
|
16
|
+
serialNumber,
|
|
17
|
+
manufacturer: 'Homebridge Matter',
|
|
18
|
+
model: 'HB-MATTER-SENSOR-LIGHT',
|
|
19
|
+
firmwareRevision: '2.0.0',
|
|
20
|
+
hardwareRevision: '1.0.0',
|
|
21
|
+
|
|
22
|
+
clusters: {
|
|
23
|
+
illuminanceMeasurement: {
|
|
24
|
+
measuredValue: 5000,
|
|
25
|
+
minMeasuredValue: 1,
|
|
26
|
+
maxMeasuredValue: 65534,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
this.logInfo('initialized.')
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public updateIlluminance(lux: number): void {
|
|
35
|
+
const value = Math.round(10000 * Math.log10(lux))
|
|
36
|
+
this.updateState('illuminanceMeasurement', { measuredValue: value })
|
|
37
|
+
this.logInfo(`illuminance: ${lux} lux.`)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Occupancy Sensor Accessory Class
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { API, Logger } from 'homebridge'
|
|
6
|
+
|
|
7
|
+
import { BaseMatterAccessory } from './BaseMatterAccessory.js'
|
|
8
|
+
|
|
9
|
+
export class OccupancySensorAccessory extends BaseMatterAccessory {
|
|
10
|
+
constructor(api: API, log: Logger) {
|
|
11
|
+
const serialNumber = 'SENSOR-003'
|
|
12
|
+
// Note: Matter.js API calls this "MotionSensor" but it's actually an Occupancy Sensor
|
|
13
|
+
const OccupancySensingServer = api.matter.deviceTypes.MotionSensor.requirements.OccupancySensingServer
|
|
14
|
+
const OccupancySensorWithPIR = api.matter.deviceTypes.MotionSensor.with(
|
|
15
|
+
OccupancySensingServer.with('PassiveInfrared'),
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
super(api, log, {
|
|
19
|
+
uuid: api.matter.uuid.generate(serialNumber),
|
|
20
|
+
displayName: 'Occupancy Sensor',
|
|
21
|
+
deviceType: OccupancySensorWithPIR,
|
|
22
|
+
serialNumber,
|
|
23
|
+
manufacturer: 'Homebridge Matter',
|
|
24
|
+
model: 'HB-MATTER-SENSOR-OCCUPANCY',
|
|
25
|
+
firmwareRevision: '2.0.0',
|
|
26
|
+
hardwareRevision: '1.0.0',
|
|
27
|
+
|
|
28
|
+
clusters: {
|
|
29
|
+
occupancySensing: {
|
|
30
|
+
occupancy: {
|
|
31
|
+
occupied: false,
|
|
32
|
+
},
|
|
33
|
+
occupancySensorType: 0,
|
|
34
|
+
occupancySensorTypeBitmap: {
|
|
35
|
+
pir: true,
|
|
36
|
+
ultrasonic: false,
|
|
37
|
+
physicalContact: false,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
this.logInfo('initialized.')
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public updateOccupancyDetected(detected: boolean): void {
|
|
47
|
+
this.updateState('occupancySensing', {
|
|
48
|
+
occupancy: { occupied: detected },
|
|
49
|
+
})
|
|
50
|
+
this.logInfo(`occupancy: ${detected ? 'detected' : 'clear'}.`)
|
|
51
|
+
}
|
|
52
|
+
}
|