Move BLE states to DeviceRegistry and improve logging

- Make deviceRegistry states/lists immutable
This commit is contained in:
Victor Hagelbäck 2021-02-20 12:34:30 +01:00
parent e528e2be1f
commit 0dbe0bb95f
3 changed files with 86 additions and 34 deletions

View file

@ -1,3 +1,6 @@
const Logger = require('./Logger');
const logger = Logger.getLogger('device-registry');
class DeviceRegistry { class DeviceRegistry {
apiSite; apiSite;
cryptoKey = null; cryptoKey = null;
@ -19,20 +22,56 @@ class DeviceRegistry {
} }
addPlejdDevice(device) { addPlejdDevice(device) {
this.plejdDevices[device.id] = device; const added = {
this.deviceIdsBySerial[device.serialNumber] = device.id; ...this.plejdDevices[device.id],
if (!this.deviceIdsByRoom[device.roomId]) { ...device,
this.deviceIdsByRoom[device.roomId] = []; };
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])}`);
} }
this.deviceIdsByRoom[device.roomId].push(device.id);
return added;
}
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;
} }
addScene(scene) { addScene(scene) {
this.sceneDevices[scene.id] = scene; const added = {
} ...this.sceneDevices[scene.id],
...scene,
setApiSite(siteDetails) { };
this.apiSite = siteDetails; this.sceneDevices = {
...this.sceneDevices,
added,
};
logger.verbose(`Added/updated scene: ${JSON.stringify(added)}`);
return added;
} }
clearPlejdDevices() { clearPlejdDevices() {
@ -41,10 +80,6 @@ class DeviceRegistry {
this.deviceIdsBySerial = {}; this.deviceIdsBySerial = {};
} }
addRoomDevice(device) {
this.roomDevices[device.id] = device;
}
clearRoomDevices() { clearRoomDevices() {
this.roomDevices = {}; this.roomDevices = {};
} }
@ -58,7 +93,7 @@ class DeviceRegistry {
} }
getDeviceBySerialNumber(serialNumber) { getDeviceBySerialNumber(serialNumber) {
return this.plejdDevices[this.deviceIdsBySerial[serialNumber]]; return this.getDevice(this.deviceIdsBySerial[serialNumber]);
} }
getDeviceName(deviceId) { getDeviceName(deviceId) {
@ -72,6 +107,33 @@ class DeviceRegistry {
getSceneName(sceneId) { getSceneName(sceneId) {
return (this.sceneDevices[sceneId] || {}).name; return (this.sceneDevices[sceneId] || {}).name;
} }
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)}`);
}
}
} }
module.exports = DeviceRegistry; module.exports = DeviceRegistry;

View file

@ -171,9 +171,12 @@ class PlejBLEHandler extends EventEmitter {
fixedPlejdPath = fixedPlejdPath.replace(/_/g, ''); fixedPlejdPath = fixedPlejdPath.replace(/_/g, '');
plejd.device = this.deviceRegistry.getDeviceBySerialNumber(fixedPlejdPath); plejd.device = this.deviceRegistry.getDeviceBySerialNumber(fixedPlejdPath);
logger.debug(`Discovered ${plejd.path} with rssi ${plejd.rssi}, name ${plejd.device.name}`); if (plejd.device) {
// Todo: Connect should probably be done here logger.debug(`Discovered ${plejd.path} with rssi ${plejd.rssi}, name ${plejd.device.name}`);
this.bleDevices.push(plejd); this.bleDevices.push(plejd);
} else {
logger.warn(`Device registry does not contain device with serial ${fixedPlejdPath}`);
}
} catch (err) { } catch (err) {
logger.error(`Failed inspecting ${path}. `, err); logger.error(`Failed inspecting ${path}. `, err);
} }

View file

@ -15,7 +15,6 @@ class PlejdDeviceCommunication extends EventEmitter {
plejdBleHandler; plejdBleHandler;
config; config;
deviceRegistry; deviceRegistry;
plejdDevices = {}; // Todo: Move to deviceRegistry?
writeQueue = []; writeQueue = [];
writeQueueRef = null; writeQueueRef = null;
@ -77,30 +76,18 @@ class PlejdDeviceCommunication extends EventEmitter {
_bleCommandReceived(deviceId, command, data) { _bleCommandReceived(deviceId, command, data) {
try { try {
if (command === COMMANDS.DIM) { if (command === COMMANDS.DIM) {
this.plejdDevices[deviceId] = { this.deviceRegistry.setState(deviceId, data.state, data.dim);
state: data.state,
dim: data.dim,
};
logger.silly(`All states: ${JSON.stringify(this.plejdDevices, null, 2)}`);
this.emit(PlejdDeviceCommunication.EVENTS.stateChanged, deviceId, { this.emit(PlejdDeviceCommunication.EVENTS.stateChanged, deviceId, {
state: data.state, state: data.state,
brightness: data.dim, brightness: data.dim,
}); });
} else if (command === COMMANDS.TURN_ON) { } else if (command === COMMANDS.TURN_ON) {
this.plejdDevices[deviceId] = { this.deviceRegistry.setState(deviceId, 1);
state: 1,
dim: 0,
};
logger.silly(`All states: ${JSON.stringify(this.plejdDevices, null, 2)}`);
this.emit(PlejdDeviceCommunication.EVENTS.stateChanged, deviceId, { this.emit(PlejdDeviceCommunication.EVENTS.stateChanged, deviceId, {
state: 1, state: 1,
}); });
} else if (command === COMMANDS.TURN_OFF) { } else if (command === COMMANDS.TURN_OFF) {
this.plejdDevices[deviceId] = { this.deviceRegistry.setState(deviceId, 0);
state: 0,
dim: 0,
};
logger.silly(`All states: ${JSON.stringify(this.plejdDevices, null, 2)}`);
this.emit(PlejdDeviceCommunication.EVENTS.stateChanged, deviceId, { this.emit(PlejdDeviceCommunication.EVENTS.stateChanged, deviceId, {
state: 0, state: 0,
}); });