2021-02-20 12:34:30 +01:00
|
|
|
const Logger = require('./Logger');
|
|
|
|
|
|
|
|
|
|
const logger = Logger.getLogger('device-registry');
|
2021-02-01 21:18:42 +01:00
|
|
|
class DeviceRegistry {
|
|
|
|
|
apiSite;
|
|
|
|
|
cryptoKey = null;
|
|
|
|
|
|
|
|
|
|
deviceIdsByRoom = {};
|
|
|
|
|
deviceIdsBySerial = {};
|
|
|
|
|
|
|
|
|
|
// Dictionaries of [id]: device per type
|
|
|
|
|
plejdDevices = {};
|
|
|
|
|
roomDevices = {};
|
|
|
|
|
sceneDevices = {};
|
|
|
|
|
|
|
|
|
|
get allDevices() {
|
|
|
|
|
return [
|
|
|
|
|
...Object.values(this.plejdDevices),
|
|
|
|
|
...Object.values(this.roomDevices),
|
|
|
|
|
...Object.values(this.sceneDevices),
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addPlejdDevice(device) {
|
2021-02-20 12:34:30 +01:00
|
|
|
const added = {
|
|
|
|
|
...this.plejdDevices[device.id],
|
|
|
|
|
...device,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
this.plejdDevices = {
|
|
|
|
|
...this.plejdDevices,
|
|
|
|
|
[added.id]: added,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
this.deviceIdsBySerial[added.serialNumber] = added.id;
|
|
|
|
|
|
|
|
|
|
logger.verbose(`Added/updated device: ${JSON.stringify(added)}`);
|
|
|
|
|
|
|
|
|
|
if (added.roomId) {
|
|
|
|
|
this.deviceIdsByRoom[added.roomId] = [
|
|
|
|
|
...(this.deviceIdsByRoom[added.roomId] || []),
|
|
|
|
|
added.id,
|
|
|
|
|
];
|
|
|
|
|
logger.verbose(`Added to room: ${JSON.stringify(this.deviceIdsByRoom[added.roomId])}`);
|
2021-02-01 21:18:42 +01:00
|
|
|
}
|
2021-02-20 12:34:30 +01:00
|
|
|
|
|
|
|
|
return added;
|
2021-02-01 21:18:42 +01:00
|
|
|
}
|
|
|
|
|
|
2021-02-20 12:34:30 +01:00
|
|
|
addRoomDevice(device) {
|
|
|
|
|
const added = {
|
|
|
|
|
...this.roomDevices[device.id],
|
|
|
|
|
...device,
|
|
|
|
|
};
|
|
|
|
|
this.roomDevices = {
|
|
|
|
|
...this.roomDevices,
|
|
|
|
|
[device.id]: added,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
logger.verbose(`Added/updated room device: ${JSON.stringify(added)}`);
|
|
|
|
|
return added;
|
2021-02-01 21:18:42 +01:00
|
|
|
}
|
|
|
|
|
|
2021-02-20 12:34:30 +01:00
|
|
|
addScene(scene) {
|
|
|
|
|
const added = {
|
|
|
|
|
...this.sceneDevices[scene.id],
|
|
|
|
|
...scene,
|
|
|
|
|
};
|
|
|
|
|
this.sceneDevices = {
|
|
|
|
|
...this.sceneDevices,
|
|
|
|
|
added,
|
|
|
|
|
};
|
|
|
|
|
logger.verbose(`Added/updated scene: ${JSON.stringify(added)}`);
|
|
|
|
|
return added;
|
2021-02-01 21:18:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
clearPlejdDevices() {
|
|
|
|
|
this.plejdDevices = {};
|
|
|
|
|
this.deviceIdsByRoom = {};
|
|
|
|
|
this.deviceIdsBySerial = {};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
clearRoomDevices() {
|
|
|
|
|
this.roomDevices = {};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
clearSceneDevices() {
|
|
|
|
|
this.sceneDevices = {};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getDevice(deviceId) {
|
|
|
|
|
return this.plejdDevices[deviceId];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getDeviceBySerialNumber(serialNumber) {
|
2021-02-20 12:34:30 +01:00
|
|
|
return this.getDevice(this.deviceIdsBySerial[serialNumber]);
|
2021-02-01 21:18:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getDeviceName(deviceId) {
|
|
|
|
|
return (this.plejdDevices[deviceId] || {}).name;
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-10 10:10:28 +01:00
|
|
|
getScene(sceneId) {
|
|
|
|
|
return this.sceneDevices[sceneId];
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-01 21:18:42 +01:00
|
|
|
getSceneName(sceneId) {
|
|
|
|
|
return (this.sceneDevices[sceneId] || {}).name;
|
|
|
|
|
}
|
2021-02-20 12:34:30 +01:00
|
|
|
|
|
|
|
|
getState(deviceId) {
|
|
|
|
|
const device = this.getDevice(deviceId) || {};
|
|
|
|
|
if (device.dimmable) {
|
|
|
|
|
return {
|
|
|
|
|
state: device.state,
|
|
|
|
|
dim: device.dim,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
return {
|
|
|
|
|
state: device.state,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setApiSite(siteDetails) {
|
|
|
|
|
this.apiSite = siteDetails;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setState(deviceId, state, dim) {
|
|
|
|
|
const device = this.addPlejdDevice({ id: deviceId, state });
|
|
|
|
|
if (dim && device.dimmable) {
|
|
|
|
|
device.dim = dim;
|
|
|
|
|
}
|
|
|
|
|
if (Logger.shouldLog('silly')) {
|
|
|
|
|
logger.silly(`Updated state: ${JSON.stringify(device)}`);
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-02-01 21:18:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module.exports = DeviceRegistry;
|