homebridge-broadlink-rm-pro
Version:
Broadlink RM plugin (including the mini and pro) for homebridge with AC Pro and TV features
377 lines (285 loc) • 12.3 kB
JavaScript
const { expect } = require('chai');
const { log, setup } = require('./helpers/setup')
const FakeServiceManager = require('./helpers/fakeServiceManager')
const delayForDuration = require('../helpers/delayForDuration')
const { getDevice } = require('../helpers/getDevice')
const { WindowCovering } = require('../accessories')
const data = {
open: 'OPEN',
close: 'CLOSE',
stop: 'STOP',
openCompletely: 'OPEN_COMPLETELY',
closeCompletely: 'CLOSE_COMPLETELY',
};
// TODO: resendData
describe('windowCoveringAccessory', () => {
it ('default config', async () => {
const { device } = setup();
const config = {
data,
totalDurationOpen: 5,
totalDurationClose: 5,
persistState: false,
host: device.host.address
}
const windowCoveringAccessory = new WindowCovering(null, config, 'FakeServiceManager');
expect(windowCoveringAccessory.config.initialDelay).to.equal(0.1);
})
it ('custom config', async () => {
const { device } = setup();
const config = {
data,
initialDelay: 0.5,
totalDurationOpen: 5,
totalDurationClose: 5,
persistState: false,
host: device.host.address
}
const windowCoveringAccessory = new WindowCovering(null, config, 'FakeServiceManager');
expect(windowCoveringAccessory.config.initialDelay).to.equal(0.5);
})
it ('determineOpenCloseDurationPerPercent', async () => {
const { device } = setup();
const config = {
data,
totalDurationOpen: 5,
totalDurationClose: 5,
persistState: false,
host: device.host.address
};
const windowCoveringAccessory = new WindowCovering(null, config, 'FakeServiceManager');
const totalDurationOpen = 5;
const totalDurationClose = 8;
const openDurationPerPercent = windowCoveringAccessory.determineOpenCloseDurationPerPercent({
opening: true,
totalDurationOpen,
totalDurationClose
});
expect(openDurationPerPercent).to.equal(totalDurationOpen / 100);
const closeDurationPerPercent = windowCoveringAccessory.determineOpenCloseDurationPerPercent({
opening: false,
totalDurationOpen,
totalDurationClose
});
expect(closeDurationPerPercent).to.equal(totalDurationClose / 100);
})
// Open blinds to 50%
it('0% -> 50%', async () => {
const { device } = setup();
const config = {
data,
totalDurationOpen: 2,
totalDurationClose: 1,
persistState: false,
host: device.host.address
}
const windowCoveringAccessory = new WindowCovering(null, config, 'FakeServiceManager')
const durationPerPercent = windowCoveringAccessory.determineOpenCloseDurationPerPercent({
opening: true,
totalDurationOpen: config.totalDurationOpen,
totalDurationClose: config.totalDurationClose
});
// Set Blinds to 50%
windowCoveringAccessory.serviceManager.setCharacteristic(Characteristic.TargetPosition, 50)
// Wait for initialDelay
await delayForDuration(windowCoveringAccessory.config.initialDelay);
expect(windowCoveringAccessory.state.currentPosition).to.equal(0);
// Check value at 50%
await delayForDuration(50 * durationPerPercent);
await delayForDuration(.1);
expect(windowCoveringAccessory.state.currentPosition).to.equal(50);
// Check hex code was sent
const hasSentCodes = device.hasSentCodes([ 'OPEN', 'STOP' ]);
expect(hasSentCodes).to.equal(true);
// Check the number of sent codes
const sentHexCodeCount = device.getSentHexCodeCount();
expect(sentHexCodeCount).to.equal(2);
}).timeout(6000);
// Open blinds to 20% then 50%
it('0% -> 20% -> 50%', async () => {
const { device } = setup();
const config = {
data,
totalDurationOpen: 2,
totalDurationClose: 1,
persistState: false,
host: device.host.address
}
const windowCoveringAccessory = new WindowCovering(null, config, 'FakeServiceManager')
const durationPerPercent = windowCoveringAccessory.determineOpenCloseDurationPerPercent({
opening: true,
totalDurationOpen: config.totalDurationOpen,
totalDurationClose: config.totalDurationClose
});
// Set blinds to 20%
windowCoveringAccessory.serviceManager.setCharacteristic(Characteristic.TargetPosition, 20);
// Wait for initialDelay
await delayForDuration(windowCoveringAccessory.config.initialDelay);
expect(windowCoveringAccessory.state.currentPosition).to.equal(0);
// Check value at 20%
await delayForDuration(20 * durationPerPercent);
await delayForDuration(.1);
expect(windowCoveringAccessory.state.currentPosition).to.equal(20);
// Set blinds to 50%
windowCoveringAccessory.serviceManager.setCharacteristic(Characteristic.TargetPosition, 50);
// Wait for initialDelay
await delayForDuration(windowCoveringAccessory.config.initialDelay);
expect(windowCoveringAccessory.state.currentPosition).to.equal(20);
// Check value at 50%
await delayForDuration(50 * durationPerPercent);
await delayForDuration(.1);
expect(windowCoveringAccessory.state.currentPosition).to.equal(50);
// Check hex code was sent
const hasSentCodes = device.hasSentCodes([ 'OPEN', 'STOP' ]);
expect(hasSentCodes).to.equal(true);
// Check the number of sent codes
const sentHexCodeCount = device.getSentHexCodeCount();
expect(sentHexCodeCount).to.equal(4);
}).timeout(6000);
// Open blinds to 90% then close to 50%
it('0% -> 90% -> 60%', async () => {
const { device } = setup();
const config = {
data,
totalDurationOpen: 2,
totalDurationClose: 3,
persistState: false,
host: device.host.address
}
const windowCoveringAccessory = new WindowCovering(null, config, 'FakeServiceManager');
const openDurationPerPercent = windowCoveringAccessory.determineOpenCloseDurationPerPercent({
opening: true,
totalDurationOpen: config.totalDurationOpen,
totalDurationClose: config.totalDurationClose
});
const closeDurationPerPercent = windowCoveringAccessory.determineOpenCloseDurationPerPercent({
opening: false,
totalDurationOpen: config.totalDurationOpen,
totalDurationClose: config.totalDurationClose
});
// Set blinds to 90%
windowCoveringAccessory.serviceManager.setCharacteristic(Characteristic.TargetPosition, 90);
// Wait for initialDelay
await delayForDuration(windowCoveringAccessory.config.initialDelay);
expect(windowCoveringAccessory.state.currentPosition).to.equal(0);
// Check value at 90%
await delayForDuration(90 * openDurationPerPercent);
await delayForDuration(.1);
expect(windowCoveringAccessory.state.currentPosition).to.equal(90);
// Set blinds to 60%
windowCoveringAccessory.serviceManager.setCharacteristic(Characteristic.TargetPosition, 60);
// Wait for initialDelay
await delayForDuration(windowCoveringAccessory.config.initialDelay);
expect(windowCoveringAccessory.state.currentPosition).to.equal(90);
// Check value at 60%
await delayForDuration(30 * closeDurationPerPercent);
await delayForDuration(.1);
expect(windowCoveringAccessory.state.currentPosition).to.equal(60);
// Check hex code was sent
const hasSentCodes = device.hasSentCodes([ 'OPEN', 'CLOSE', 'STOP' ]);
expect(hasSentCodes).to.equal(true);
// Check the number of sent codes
const sentHexCodeCount = device.getSentHexCodeCount();
expect(sentHexCodeCount).to.equal(4);
}).timeout(6000);
// Test initialDelay
it('"initialDelay": 1', async () => {
const { device } = setup();
const config = {
data,
initialDelay: 1,
totalDurationOpen: 2,
totalDurationClose: 1,
persistState: false,
host: device.host.address
}
const windowCoveringAccessory = new WindowCovering(null, config, 'FakeServiceManager')
const durationPerPercent = windowCoveringAccessory.determineOpenCloseDurationPerPercent({
opening: true,
totalDurationOpen: config.totalDurationOpen,
totalDurationClose: config.totalDurationClose
});
// Set Blinds to 10%
windowCoveringAccessory.serviceManager.setCharacteristic(Characteristic.TargetPosition, 10)
// Wait for initialDelay. Subtract .1 to allow for minor timeout discrepancies.
await delayForDuration(windowCoveringAccessory.config.initialDelay - .1);
// Ensure `initialDelay` has been taken into account by checking that no hex codes have
// been sent yet.
const sentHexCodeCount = device.getSentHexCodeCount();
expect(sentHexCodeCount).to.equal(0);
}).timeout(6000);
// Open blinds to 100%
it('0% -> 100%', async () => {
const { device } = setup();
const config = {
data,
totalDurationOpen: 1,
totalDurationClose: 1,
sendStopAt100: true,
sendStopAt0: true,
persistState: false,
host: device.host.address
}
const windowCoveringAccessory = new WindowCovering(null, config, 'FakeServiceManager')
const durationPerPercent = windowCoveringAccessory.determineOpenCloseDurationPerPercent({
opening: true,
totalDurationOpen: config.totalDurationOpen,
totalDurationClose: config.totalDurationClose
});
// Set Blinds to 100%
windowCoveringAccessory.serviceManager.setCharacteristic(Characteristic.TargetPosition, 100)
// Wait for initialDelay
await delayForDuration(windowCoveringAccessory.config.initialDelay);
expect(windowCoveringAccessory.state.currentPosition).to.equal(100);
await delayForDuration(.1);
// Check hex code was sent
const hasSentCodes = device.hasSentCodes([ 'OPEN_COMPLETELY', 'STOP' ]);
expect(hasSentCodes).to.equal(true);
// Check the number of sent codes
const sentHexCodeCount = device.getSentHexCodeCount();
expect(sentHexCodeCount).to.equal(2);
}).timeout(6000);
// Open blinds to 0%
it('0% -> 100% -> 0%', async () => {
const { device } = setup();
const config = {
data,
totalDurationOpen: 1,
totalDurationClose: 1,
sendStopAt100: true,
sendStopAt0: true,
persistState: false,
host: device.host.address
}
const windowCoveringAccessory = new WindowCovering(null, config, 'FakeServiceManager')
const durationPerPercent = windowCoveringAccessory.determineOpenCloseDurationPerPercent({
opening: true,
totalDurationOpen: config.totalDurationOpen,
totalDurationClose: config.totalDurationClose
});
// Set Blinds to 100%
windowCoveringAccessory.serviceManager.setCharacteristic(Characteristic.TargetPosition, 100)
// Wait for initialDelay
await delayForDuration(windowCoveringAccessory.config.initialDelay);
expect(windowCoveringAccessory.state.currentPosition).to.equal(100);
await delayForDuration(.1);
// Check hex code was sent
let hasSentCodes = device.hasSentCodes([ 'OPEN_COMPLETELY', 'STOP' ]);
expect(hasSentCodes).to.equal(true);
// Check the number of sent codes
let sentHexCodeCount = device.getSentHexCodeCount();
expect(sentHexCodeCount).to.equal(2);
// Set Blinds to 0%
windowCoveringAccessory.serviceManager.setCharacteristic(Characteristic.TargetPosition, 0)
// Wait for initialDelay
await delayForDuration(windowCoveringAccessory.config.initialDelay);
expect(windowCoveringAccessory.state.currentPosition).to.equal(0);
await delayForDuration(.1);
// Check hex code was sent
hasSentCodes = device.hasSentCodes([ 'OPEN_COMPLETELY', 'STOP', 'CLOSE_COMPLETELY' ]);
expect(hasSentCodes).to.equal(true);
// Check the number of sent codes
sentHexCodeCount = device.getSentHexCodeCount();
expect(sentHexCodeCount).to.equal(4);
}).timeout(6000);
})