hassio-plejd/plejd/SceneManager.js
Victor Hagelbäck ef7a5086a1 Handle when scene and device have the same Id
- Catch emitted errors in Mqtt
2021-02-10 10:10:28 +01:00

54 lines
1.5 KiB
JavaScript

const EventEmitter = require('events');
const Logger = require('./Logger');
const Scene = require('./Scene');
const logger = Logger.getLogger('scene-manager');
class SceneManager extends EventEmitter {
deviceRegistry;
plejdBle;
scenes;
constructor(deviceRegistry, plejdBle) {
super();
this.deviceRegistry = deviceRegistry;
this.plejdBle = plejdBle;
this.scenes = {};
}
init() {
const scenes = this.deviceRegistry.apiSite.scenes.filter(
(x) => x.hiddenFromSceneList === false,
);
this.scenes = {};
scenes.forEach((scene) => {
const idx = this.deviceRegistry.apiSite.sceneIndex[scene.sceneId];
this.scenes[idx] = new Scene(idx, scene, this.deviceRegistry.apiSite.sceneSteps);
});
}
executeScene(sceneId) {
const scene = this.scenes[sceneId];
if (!scene) {
logger.info(`Scene with id ${sceneId} not found`);
logger.verbose(`Scenes: ${JSON.stringify(this.scenes, null, 2)}`);
return;
}
scene.steps.forEach((step) => {
const device = this.deviceRegistry.getDeviceBySerialNumber(step.deviceId);
if (device) {
if (device.dimmable && step.state) {
this.plejdBle.turnOn(device.id, { brightness: step.brightness });
} else if (!device.dimmable && step.state) {
this.plejdBle.turnOn(device.id, {});
} else if (!step.state) {
this.plejdBle.turnOff(device.id, {});
}
}
});
}
}
module.exports = SceneManager;