redmatic-homekit
Version:
HAP-Nodejs based Node-RED nodes to create HomeKit Accessories
83 lines (72 loc) • 2.81 kB
JavaScript
const Accessory = require('./lib/accessory');
module.exports = class HmLcJa1 extends Accessory {
init(config) {
let timeout;
let level = null;
let levelSlats = null;
const that = this;
const service = this.addService('WindowCovering', config.name);
service
.get('CurrentPosition', config.deviceAddress + ':1.LEVEL', value => {
return value * 100;
})
.get('TargetPosition', config.deviceAddress + ':1.LEVEL', value => {
return value * 100;
})
.set('TargetPosition', (value, callback) => {
level = value / 100;
clearTimeout(timeout);
timeout = setTimeout(() => {
setCombined();
}, 250);
callback();
})
.get('PositionState', config.deviceAddress + ':1.DIRECTION', (value, c) => {
switch (value) {
case 1:
return c.INCREASING;
case 2:
return c.DECREASING;
default:
return c.STOPPED;
}
})
.get('CurrentVerticalTiltAngle', config.deviceAddress + ':1.LEVEL_SLATS', value => {
return (value * 180) - 90;
})
.get('TargetVerticalTiltAngle', config.deviceAddress + ':1.LEVEL_SLATS', value => {
return (value * 180) - 90;
})
.set('TargetVerticalTiltAngle', (value, callback) => {
levelSlats = (value + 90) / 180;
clearTimeout(timeout);
timeout = setTimeout(() => {
setCombined();
}, 250);
callback();
});
function setCombined() {
let dp;
let value;
if (levelSlats !== null && level !== null) {
const b1 = ('0' + ((level || 0) * 200).toString(16)).slice(-2);
const b2 = ('0' + ((levelSlats || 0) * 200).toString(16)).slice(-2);
value = '0x' + b1 + ',0x' + b2;
dp = config.deviceAddress + ':1.LEVEL_COMBINED';
} else if (level !== null) {
value = level;
dp = config.deviceAddress + ':1.LEVEL';
} else if (levelSlats !== null) {
value = levelSlats;
dp = config.deviceAddress + ':1.LEVEL_SLATS';
}
that.ccuSetValue(dp, value, error => {
if (error) {
service.updateCharacteristic('TargetPosition', error);
}
});
level = null;
levelSlats = null;
}
}
};