Skip to content

Commit

Permalink
1.support category "rqbj","jwbj".
Browse files Browse the repository at this point in the history
2.fix curtain Motor Reversed.
  • Loading branch information
Hanh94 committed Aug 12, 2021
1 parent 672b843 commit 169c1c8
Show file tree
Hide file tree
Showing 3 changed files with 163 additions and 9 deletions.
7 changes: 7 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ const GarageDoorAccessory = require('./lib/garagedoor_accessory');
const AirPurifierAccessory = require('./lib/air_purifier_accessory')
const WindowCoveringAccessory = require('./lib/window_covering_accessory')
const ContactSensorAccessory = require('./lib/contactsensor_accessory');
const LeakSensorAccessory = require('./lib/leak_sensor_accessory')

const LogUtil = require('./util/logutil')
const DataUtil = require('./util/datautil')
Expand Down Expand Up @@ -176,6 +177,12 @@ class TuyaPlatform {
this.accessories.set(uuid, deviceAccessory.homebridgeAccessory);
this.deviceAccessories.set(uuid, deviceAccessory);
break;
case 'rqbj':
case 'jwbj':
deviceAccessory = new LeakSensorAccessory(this, homebridgeAccessory, device);
this.accessories.set(uuid, deviceAccessory.homebridgeAccessory);
this.deviceAccessories.set(uuid, deviceAccessory);
break;
default:
break;
}
Expand Down
115 changes: 115 additions & 0 deletions lib/leak_sensor_accessory.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
const BaseAccessory = require('./base_accessory')

let Accessory;
let Service;
let Characteristic;
let UUIDGen;

class LeakSensorAccessory extends BaseAccessory {

constructor(platform, homebridgeAccessory, deviceConfig) {
({ Accessory, Characteristic, Service } = platform.api.hap);
super(
platform,
homebridgeAccessory,
deviceConfig,
Accessory.Categories.LEAK_SENSOR,
Service.LeakSensor
);
this.statusArr = deviceConfig.status;
//link https://developer.tuya.com/cn/docs/iot/s?id=K9gf48r2nq2x4
let alarmArray = new Array();
alarmArray.push('gas_sensor_status');
alarmArray.push('gas_sensor_state');
alarmArray.push('ch4_sensor_state');
this.alarmArray = alarmArray
this.refreshAccessoryServiceIfNeed(this.statusArr, false);
};

/**
* init Or refresh AccessoryService
* @param {*} stateArr
* @param {*} isRefresh
*/
refreshAccessoryServiceIfNeed(stateArr, isRefresh) {
this.isRefresh = isRefresh;
for (const statusMap of stateArr) {
if (this.alarmArray.indexOf(statusMap.code) != -1) {
if ('alarm' === statusMap.value) {
this.normalAsync(Characteristic.LeakDetected, Characteristic.LeakDetected.LEAK_DETECTED);
} else if ('normal' === statusMap.value) {
this.normalAsync(Characteristic.LeakDetected, Characteristic.LeakDetected.LEAK_NOT_DETECTED);
} else {
// old version api like statusMap.code === gas_sensor_state
if ('1' === statusMap.value) {
this.normalAsync(Characteristic.LeakDetected, Characteristic.LeakDetected.LEAK_DETECTED);
} else if ('2' === statusMap.value) {
this.normalAsync(Characteristic.LeakDetected, Characteristic.LeakDetected.LEAK_NOT_DETECTED);
}
}
} else if (statusMap.code === 'battery_state') {
this.batteryStateMap = statusMap
let state = this.getHomeBridgeParam(Characteristic.StatusLowBattery, statusMap);
this.normalAsync(Characteristic.StatusLowBattery, state);
}
}
}

/**
* add get/set Accessory service Characteristic Listner
* @param {*} name
*/
getAccessoryCharacteristic(name) {
//set Accessory service Characteristic
this.service.getCharacteristic(name)
.on('get', callback => {
if (this.hasValidCache()) {
callback(null, this.getCachedState(name));
}
})
.on('set', (hbValue, callback) => { });
}

/**
* get HomeBridge param from tuya param
* @param {*} name
* @param {*} tuyaParam Tuya Param
*/
getHomeBridgeParam(name, tuyaParam) {
if (Characteristic.StatusLowBattery === name) {
if ('low' === tuyaParam.value) {
return Characteristic.StatusLowBattery.BATTERY_LEVEL_LOW;
} else {
return Characteristic.StatusLowBattery.BATTERY_LEVEL_NORMAL;
}
}
}

/**
* update HomeBridge state
* @param {*} name HomeBridge Name
* @param {*} hbValue HomeBridge Value
*/
normalAsync(name, hbValue) {
//store homebridge value
this.setCachedState(name, hbValue);
if (this.isRefresh) {
this.service
.getCharacteristic(name)
.updateValue(hbValue);
} else {
this.getAccessoryCharacteristic(name);
}
}

/**
* Tuya MQTT update device status
* @param {*} data
*/
updateState(data) {
this.refreshAccessoryServiceIfNeed(data.status, true);
}

}

module.exports = LeakSensorAccessory;
50 changes: 41 additions & 9 deletions lib/window_covering_accessory.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,12 @@ class WindowCoveringAccessory extends BaseAccessory {
// Characteristic.TargetPosition
if (statusMap.code === 'percent_control') {
this.percentControlMap = statusMap
this.normalAsync(Characteristic.TargetPosition, this.percentControlMap.value);
this.normalAsync(Characteristic.TargetPosition, this._getReversedPercent(this.percentControlMap.value));
}

if (statusMap.code === 'position') {
this.percentControlMap = statusMap
const percent = parseInt(this.percentControlMap.value)
const percent = this._getReversedPercent(parseInt(this.percentControlMap.value))
this.normalAsync(Characteristic.TargetPosition, percent, {
minStep: 5
});
Expand All @@ -43,10 +43,10 @@ class WindowCoveringAccessory extends BaseAccessory {
if (statusMap.code === 'percent_state') {
// Characteristic.CurrentPosition
this.positionMap = statusMap
this.normalAsync(Characteristic.CurrentPosition, this.positionMap.value);
this.normalAsync(Characteristic.CurrentPosition, this._getReversedPercent(this.positionMap.value));

// Characteristic.PositionState
let hbValue = this.getHomeBridgeParam(Characteristic.PositionState, this.positionMap);
let hbValue = this.getHomeBridgeParam(Characteristic.PositionState, this._getReversedPercent(this.positionMap.value));
this.normalAsync(Characteristic.PositionState, hbValue);
}
}
Expand All @@ -65,12 +65,13 @@ class WindowCoveringAccessory extends BaseAccessory {
}
})
.on('set', (hbValue, callback) => {
let tuyaParam = this.getTuyaParam(name, hbValue);
let percentValue = this._getReversedPercent(hbValue)
let tuyaParam = this.getTuyaParam(name, percentValue);
this.platform.tuyaOpenApi.sendCommand(this.deviceId, tuyaParam).then(() => {
//store homebridge value
this.setCachedState(name, hbValue);
this.setCachedState(name, percentValue);
//store targetPosition value
this.targetPosition = hbValue;
this.targetPosition = percentValue;
callback();
}).catch((error) => {
this.log.error('[SET][%s] Characteristic Error: %s', this.homebridgeAccessory.displayName, error);
Expand Down Expand Up @@ -111,9 +112,9 @@ class WindowCoveringAccessory extends BaseAccessory {
getHomeBridgeParam(name, tuyaParam) {
if (Characteristic.PositionState === name) {
if (this.targetPosition) {
if (this.targetPosition > tuyaParam.value) {
if (this.targetPosition > tuyaParam) {
return Characteristic.PositionState.INCREASING;
} else if (this.targetPosition < tuyaParam.value) {
} else if (this.targetPosition < tuyaParam) {
return Characteristic.PositionState.DECREASING;
} else {
return Characteristic.PositionState.STOPPED;
Expand Down Expand Up @@ -141,6 +142,37 @@ class WindowCoveringAccessory extends BaseAccessory {
}
}

_getReversedPercent(value) {
var percent = value;
if (this._isMotorReversed()) {
percent = 100 - percent;
}
return percent
}

//Check Motor Reversed
_isMotorReversed() {
let isMotorReversed
for (const statusMap of this.statusArr) {
switch (statusMap.code) {
case 'control_back_mode':
if (statusMap.value === 'forward') {
isMotorReversed = false;
} else {
isMotorReversed = true;
}
break;
case 'opposite':
case 'control_back':
isMotorReversed = statusMap.value;
break;
default:
break;
}
}
return isMotorReversed;
}

/**
* Tuya MQTT update device status
*/
Expand Down

0 comments on commit 169c1c8

Please sign in to comment.