Move BLE states to DeviceRegistry and improve logging
- Make deviceRegistry states/lists immutable
This commit is contained in:
parent
e528e2be1f
commit
0dbe0bb95f
3 changed files with 86 additions and 34 deletions
|
|
@ -1,3 +1,6 @@
|
|||
const Logger = require('./Logger');
|
||||
|
||||
const logger = Logger.getLogger('device-registry');
|
||||
class DeviceRegistry {
|
||||
apiSite;
|
||||
cryptoKey = null;
|
||||
|
|
@ -19,20 +22,56 @@ class DeviceRegistry {
|
|||
}
|
||||
|
||||
addPlejdDevice(device) {
|
||||
this.plejdDevices[device.id] = device;
|
||||
this.deviceIdsBySerial[device.serialNumber] = device.id;
|
||||
if (!this.deviceIdsByRoom[device.roomId]) {
|
||||
this.deviceIdsByRoom[device.roomId] = [];
|
||||
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])}`);
|
||||
}
|
||||
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) {
|
||||
this.sceneDevices[scene.id] = scene;
|
||||
}
|
||||
|
||||
setApiSite(siteDetails) {
|
||||
this.apiSite = siteDetails;
|
||||
const added = {
|
||||
...this.sceneDevices[scene.id],
|
||||
...scene,
|
||||
};
|
||||
this.sceneDevices = {
|
||||
...this.sceneDevices,
|
||||
added,
|
||||
};
|
||||
logger.verbose(`Added/updated scene: ${JSON.stringify(added)}`);
|
||||
return added;
|
||||
}
|
||||
|
||||
clearPlejdDevices() {
|
||||
|
|
@ -41,10 +80,6 @@ class DeviceRegistry {
|
|||
this.deviceIdsBySerial = {};
|
||||
}
|
||||
|
||||
addRoomDevice(device) {
|
||||
this.roomDevices[device.id] = device;
|
||||
}
|
||||
|
||||
clearRoomDevices() {
|
||||
this.roomDevices = {};
|
||||
}
|
||||
|
|
@ -58,7 +93,7 @@ class DeviceRegistry {
|
|||
}
|
||||
|
||||
getDeviceBySerialNumber(serialNumber) {
|
||||
return this.plejdDevices[this.deviceIdsBySerial[serialNumber]];
|
||||
return this.getDevice(this.deviceIdsBySerial[serialNumber]);
|
||||
}
|
||||
|
||||
getDeviceName(deviceId) {
|
||||
|
|
@ -72,6 +107,33 @@ class DeviceRegistry {
|
|||
getSceneName(sceneId) {
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -171,9 +171,12 @@ class PlejBLEHandler extends EventEmitter {
|
|||
fixedPlejdPath = fixedPlejdPath.replace(/_/g, '');
|
||||
plejd.device = this.deviceRegistry.getDeviceBySerialNumber(fixedPlejdPath);
|
||||
|
||||
logger.debug(`Discovered ${plejd.path} with rssi ${plejd.rssi}, name ${plejd.device.name}`);
|
||||
// Todo: Connect should probably be done here
|
||||
this.bleDevices.push(plejd);
|
||||
if (plejd.device) {
|
||||
logger.debug(`Discovered ${plejd.path} with rssi ${plejd.rssi}, name ${plejd.device.name}`);
|
||||
this.bleDevices.push(plejd);
|
||||
} else {
|
||||
logger.warn(`Device registry does not contain device with serial ${fixedPlejdPath}`);
|
||||
}
|
||||
} catch (err) {
|
||||
logger.error(`Failed inspecting ${path}. `, err);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@ class PlejdDeviceCommunication extends EventEmitter {
|
|||
plejdBleHandler;
|
||||
config;
|
||||
deviceRegistry;
|
||||
plejdDevices = {}; // Todo: Move to deviceRegistry?
|
||||
writeQueue = [];
|
||||
writeQueueRef = null;
|
||||
|
||||
|
|
@ -77,30 +76,18 @@ class PlejdDeviceCommunication extends EventEmitter {
|
|||
_bleCommandReceived(deviceId, command, data) {
|
||||
try {
|
||||
if (command === COMMANDS.DIM) {
|
||||
this.plejdDevices[deviceId] = {
|
||||
state: data.state,
|
||||
dim: data.dim,
|
||||
};
|
||||
logger.silly(`All states: ${JSON.stringify(this.plejdDevices, null, 2)}`);
|
||||
this.deviceRegistry.setState(deviceId, data.state, data.dim);
|
||||
this.emit(PlejdDeviceCommunication.EVENTS.stateChanged, deviceId, {
|
||||
state: data.state,
|
||||
brightness: data.dim,
|
||||
});
|
||||
} else if (command === COMMANDS.TURN_ON) {
|
||||
this.plejdDevices[deviceId] = {
|
||||
state: 1,
|
||||
dim: 0,
|
||||
};
|
||||
logger.silly(`All states: ${JSON.stringify(this.plejdDevices, null, 2)}`);
|
||||
this.deviceRegistry.setState(deviceId, 1);
|
||||
this.emit(PlejdDeviceCommunication.EVENTS.stateChanged, deviceId, {
|
||||
state: 1,
|
||||
});
|
||||
} else if (command === COMMANDS.TURN_OFF) {
|
||||
this.plejdDevices[deviceId] = {
|
||||
state: 0,
|
||||
dim: 0,
|
||||
};
|
||||
logger.silly(`All states: ${JSON.stringify(this.plejdDevices, null, 2)}`);
|
||||
this.deviceRegistry.setState(deviceId, 0);
|
||||
this.emit(PlejdDeviceCommunication.EVENTS.stateChanged, deviceId, {
|
||||
state: 0,
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue