Move BLE states to DeviceRegistry and improve logging
- Make deviceRegistry states/lists immutable
This commit is contained in:
parent
8d259a768b
commit
4d7de61e42
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 {
|
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 = {};
|
||||||
}
|
}
|
||||||
|
|
@ -62,7 +97,7 @@ class DeviceRegistry {
|
||||||
}
|
}
|
||||||
|
|
||||||
getDeviceBySerialNumber(serialNumber) {
|
getDeviceBySerialNumber(serialNumber) {
|
||||||
return this.plejdDevices[this.deviceIdsBySerial[serialNumber]];
|
return this.getDevice(this.deviceIdsBySerial[serialNumber]);
|
||||||
}
|
}
|
||||||
|
|
||||||
getDeviceName(deviceId) {
|
getDeviceName(deviceId) {
|
||||||
|
|
@ -76,6 +111,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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue