From f7bad148631765ecf0179ea39a7650b3957354c1 Mon Sep 17 00:00:00 2001 From: mrbungle64 Date: Fri, 5 Jan 2024 19:50:57 +0100 Subject: [PATCH] Add support for Curtain 3 --- lib/adapterHelper.js | 2 ++ lib/adapterObjects.js | 10 +++++----- main.js | 13 +++++++------ 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/lib/adapterHelper.js b/lib/adapterHelper.js index 646460e..219cb93 100644 --- a/lib/adapterHelper.js +++ b/lib/adapterHelper.js @@ -38,6 +38,8 @@ function getProductName(model) { return 'Indoor/Outdoor Hygrometer'; } else if (model === 'c') { // WoCurtain return 'SwitchBot Curtain'; + } else if (model === '{') { // WoCurtain + return 'SwitchBot Curtain 3'; } else if (model === 's') { // WoMotion return 'SwitchBot Motion Sensor'; } else if (model === 'd') { // WoContact diff --git a/lib/adapterObjects.js b/lib/adapterObjects.js index 6bd49d4..7c56e87 100644 --- a/lib/adapterObjects.js +++ b/lib/adapterObjects.js @@ -6,7 +6,7 @@ const helper = require('./adapterHelper'); * * @param {Object} adapter * @param {{address: String, rssi: Number, id: String, - * serviceData: {model: 'H'|'T'|'c'|'s'|'d'|'i'|'o'|'w', modelName: String, battery: Number, state: Boolean, mode: Boolean, + * serviceData: {model: 'H'|'T'|'c'|'{'|'s'|'d'|'i'|'o'|'w', modelName: String, battery: Number, state: Boolean, mode: Boolean, * temperature: {c: Number, f: Number}, humidity: Number, * position: Number, calibration: Number, lightLevel: String, movement: Boolean, doorState: String}}} data */ @@ -77,8 +77,8 @@ async function createBotObjects(adapter, data) { await adapter.createObjectNotExists( data.address + '.humidity', 'Humidity value', 'number', 'value.humidity', false, data.serviceData.humidity, '%'); - } else if (data.serviceData.model === 'c') { - // SwitchBot "Curtain" + } else if ((data.serviceData.model === 'c') || (data.serviceData.model === '{')) { + // SwitchBot "Curtain" / "Curtain 3" await adapter.createChannelNotExists(data.address + '.control'); await adapter.createObjectNotExists( data.address + '.control.open', 'Sends an open command to the Curtain', @@ -141,7 +141,7 @@ async function createBotObjects(adapter, data) { * * @param {Object} adapter * @param {{address: String, rssi: Number, id: String, - * serviceData: {model: 'H'|'T'|'c'|'s'|'d'|'i'|'o'|'w', modelName: String, battery: Number, state: Boolean, mode: Boolean, + * serviceData: {model: 'H'|'T'|'c'|'{'|'s'|'d'|'i'|'o'|'w', modelName: String, battery: Number, state: Boolean, mode: Boolean, * temperature: {c: Number, f: Number}, humidity: Number, * position: Number, calibration: Number, lightLevel: String, movement: Boolean, doorState: String}}} data */ @@ -172,7 +172,7 @@ async function setAdvertisementData(adapter, data) { adapter.setStateConditional(data.address + '.temperature', data.serviceData.temperature.c, true); adapter.setStateConditional(data.address + '.temperatureF', data.serviceData.temperature.f, true); adapter.setStateConditional(data.address + '.humidity', data.serviceData.humidity, true); - } else if (data.serviceData.model === 'c') { + } else if ((data.serviceData.model === 'c') || (data.serviceData.model === '{')) { // SwitchBot "Curtain" adapter.setStateConditional(data.address + '.calibration', data.serviceData.calibration, true); adapter.setStateConditional(data.address + '.position', data.serviceData.position, true); diff --git a/main.js b/main.js index e44ad8e..83422b6 100644 --- a/main.js +++ b/main.js @@ -27,7 +27,7 @@ class SwitchbotBle extends utils.Adapter { /** * @type {{[mac: String]: {address: String, rssi: Number, id: String, - * serviceData: {model: 'H'|'T'|'c'|'s'|'d'|'i'|'o'|'w', modelName: String, battery: Number, state: Boolean, mode: Boolean, + * serviceData: {model: 'H'|'T'|'c'|'{'|'s'|'d'|'i'|'o'|'w', modelName: String, battery: Number, state: Boolean, mode: Boolean, * temperature: {c: Number, f: Number}, humidity: Number, * position: Number, calibration: Number, lightLevel: Number, movement: Boolean, doorState: String}, * on: Boolean}}} @@ -151,33 +151,34 @@ class SwitchbotBle extends utils.Adapter { } const on = this.switchbotDevice[macAddress].on; + const model = this.switchbotDevice[macAddress].serviceData.model; switch (cmd) { case 'turnOn': if (on) { this.log.info(`[deviceAction] ${helper.getProductName('H')} (${macAddress}) already turned on`); } else { - await this.botAction(cmd, macAddress, 'H'); + await this.botAction(cmd, macAddress, model); } break; case 'turnOff': if (!on) { this.log.info(`[deviceAction] ${helper.getProductName('H')} (${macAddress}) already turned off`); } else { - await this.botAction(cmd, macAddress, 'H'); + await this.botAction(cmd, macAddress, model); } break; case 'press': case 'up': case 'down': - await this.botAction(cmd, macAddress, 'H'); + await this.botAction(cmd, macAddress, model); break; case 'open': case 'close': case 'pause': - await this.botAction(cmd, macAddress, 'c'); + await this.botAction(cmd, macAddress, model); break; case 'runToPos': - await this.botAction(cmd, macAddress, 'c', value); + await this.botAction(cmd, macAddress, model, value); break; default: this.log.debug(`[deviceAction] unhandled control cmd '${cmd}' for device ${macAddress}`);