Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

5th Generation Blinds Switch #317

Open
wants to merge 13 commits into
base: main
Choose a base branch
from
4 changes: 3 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ const SimpleFanAccessory = require('./lib/SimpleFanAccessory');
const SimpleFanLightAccessory = require('./lib/SimpleFanLightAccessory');
const ValveAccessory = require('./lib/ValveAccessory');
const OilDiffuserAccessory = require('./lib/OilDiffuserAccessory');
const EcoFanLightAccessory = require('./lib/EcoFanLightAccessory');

const PLUGIN_NAME = 'homebridge-tuya-lan';
const PLATFORM_NAME = 'TuyaLan';
Expand All @@ -45,7 +46,8 @@ const CLASS_DEF = {
fan: SimpleFanAccessory,
fanlight: SimpleFanLightAccessory,
watervalve: ValveAccessory,
oildiffuser: OilDiffuserAccessory
oildiffuser: OilDiffuserAccessory,
ecofanlight: EcoFanLightAccessory
};

let Characteristic, PlatformAccessory, Service, Categories, UUID;
Expand Down
165 changes: 165 additions & 0 deletions lib/EcoFanLightAccessory.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
const BaseAccessory = require('./BaseAccessory');

class EcoFanLightAccessory extends BaseAccessory {
static getCategory(Categories) {
return Categories.FANLIGHT;
}

constructor(...props) {
super(...props);
}

_registerPlatformAccessory() {
const {Service} = this.hap;

this.accessory.addService(Service.Fan, this.device.context.name);
this.accessory.addService(Service.Lightbulb, this.device.context.name + " Light");

super._registerPlatformAccessory();
}

_registerCharacteristics(dps) {
const {Service, Characteristic} = this.hap;
const serviceFan = this.accessory.getService(Service.Fan);
const serviceLightbulb = this.accessory.getService(Service.Lightbulb);
this._checkServiceName(serviceFan, this.device.context.name);
this._checkServiceName(serviceLightbulb, this.device.context.name + " Light");

this.dpActive = this._getCustomDP(this.device.context.dpActive) || '1';
this.dpRotationSpeed = this._getCustomDP(this.device.context.RotationSpeed) || '3';
this.dpLightOn = this._getCustomDP(this.device.context.dpLightOn) || '9';
this.dpBrightness = this._getCustomDP(this.device.context.dpBrightness) || '10';
this.dpUseLight = this._getCustomDP(this.device.context.dpUseLight) || true;

const characteristicActive = serviceFan.getCharacteristic(Characteristic.On)
.updateValue(this._getActive(dps[this.dpActive]))
.on('get', this.getActive.bind(this))
.on('set', this.setActive.bind(this));

const characteristicRotationSpeed = serviceFan.getCharacteristic(Characteristic.RotationSpeed)
.setProps({
minValue: 0,
maxValue: 6,
minStep: 1
})
.updateValue(this._getSpeed(dps[this.dpRotationSpeed]))
.on('get', this.getSpeed.bind(this))
.on('set', this.setSpeed.bind(this));

if (this.dpUseLight === true) {
const characterLightOn = serviceLightbulb.getCharacteristic(Characteristic.On)
.updateValue(this._getLightOn(dps[this.dpLightOn]))
.on('get', this.getLightOn.bind(this))
.on('set', this.setLightOn.bind(this));

const characteristicBrightness = serviceLightbulb.getCharacteristic(Characteristic.Brightness)
.setProps({
minValue: 0,
maxValue: 100,
minStep: 2
})
.updateValue(this.convertBrightnessFromTuyaToHomeKit(dps[this.dpBrightness]))
.on('get', this.getBrightness.bind(this))
.on('set', this.setBrightness.bind(this));
}
}

/*************************** FAN ***************************/
// Fan State
getActive(callback) {
this.getState(this.dpActive, (err, dp) => {
if (err) return callback(err);

callback(null, this._getActive(dp));
});
}

_getActive(dp) {
const {Characteristic} = this.hap;

return dp;
}

setActive(value, callback) {
const {Characteristic} = this.hap;

return this.setState(this.dpActive, value, callback);

callback();
}

// Fan Speed
getSpeed(callback) {
this.getState(this.dpRotationSpeed, (err, dp) => {
if (err) return callback(err);

callback(null, this._getSpeed(dp));
});
}

_getSpeed(dp) {
const {Characteristic} = this.hap;
// console.log("_getSpeed = " + dp);
return dp;
}

setSpeed(value, callback) {
const {Characteristic} = this.hap;
if (value == 0) {
return this.setState(this.dpActive, false, callback);
} else {
return this.setState(this.dpRotationSpeed, value.toString(), callback);
}

callback();
}

/*************************** LIGHT ***************************/
// Lightbulb State
getLightOn(callback) {
this.getState(this.dpLightOn, (err, dp) => {
if (err) return callback(err);

callback(null, this._getLightOn(dp));
});
}

_getLightOn(dp) {
const {Characteristic} = this.hap;

return dp;
}

setLightOn(value, callback) {
const {Characteristic} = this.hap;

return this.setState(this.dpLightOn, value, callback);

callback();
}

// Lightbulb Brightness
getBrightness(callback) {
this.getState(this.dpBrightness, (err, dp) => {
if (err) return callback(err);

callback(null, this._getBrightness(dp));
});
}

_getBrightness(dp) {
const {Characteristic} = this.hap;
// console.log("_getBrightness = " + dp);
return dp;
}

setBrightness(value, callback) {
const {Characteristic} = this.hap;
// console.log("setBrightness - Raw value = " + value);
return this.setState(this.dpBrightness, value, callback);

callback();
}
}

module.exports = EcoFanLightAccessory;
4 changes: 2 additions & 2 deletions lib/TuyaAccessory.js
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,7 @@ class TuyaAccessory extends EventEmitter {
case 10:
if (data) {
if (data.dps) {
console.log(`[TuyaAccessory] Heard back from ${this.context.name} with command ${cmd}`);
console.log(`[TuyaAccessory] Heard back from ${this.context.name} with command ${cmd}`, JSON.stringify(data.dps));
this._change(data.dps);
} else {
console.log(`[TuyaAccessory] Malformed message from ${this.context.name} with command ${cmd}:`, decryptedMsg);
Expand Down Expand Up @@ -499,4 +499,4 @@ const getCRC32 = buffer => {
};


module.exports = TuyaAccessory;
module.exports = TuyaAccessory;
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "homebridge-tuya",
"version": "1.1.0",
"name": "@newbishme/homebridge-tuya",
"version": "1.1.4",
"description": "🏠 Offical Homebridge plugin for TuyAPI ",
"main": "index.js",
"scripts": {
Expand All @@ -13,14 +13,14 @@
},
"repository": {
"type": "git",
"url": "git+https://github.com/iRayanKhan/homebridge-tuya.git"
"url": "git+https://github.com/newbishme/homebridge-tuya.git"
},
"author": "Rayan Khan",
"author": "Newbishme",
"license": "MIT",
"bugs": {
"url": "https://github.com/iRayanKhan/homebridge-tuya/issues"
"url": "https://github.com/newbishme/homebridge-tuya/issues"
},
"homepage": "https://github.com/iRayanKhan/homebridge-tuya#readme",
"homepage": "https://github.com/newbishme/homebridge-tuya#readme",
"dependencies": {
"async": "^3.1.0",
"commander": "^3.0.1",
Expand Down