Add hub package
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
import * as plugins from '../plugins.js';
|
||||
|
||||
export class DeviceRegistry {
|
||||
private devices: plugins.shxInterfaces.data.IDeviceDefinition[] = [
|
||||
{
|
||||
id: 'climate.office',
|
||||
name: 'Office Thermostat',
|
||||
room: 'Office',
|
||||
protocol: 'homeassistant',
|
||||
manufacturer: 'Demo',
|
||||
model: 'Climate v1',
|
||||
online: true,
|
||||
features: [
|
||||
{ id: 'temperature', capability: 'sensor', name: 'Temperature', readable: true, writable: false, unit: 'C' },
|
||||
{ id: 'target', capability: 'climate', name: 'Target temperature', readable: true, writable: true, unit: 'C' },
|
||||
],
|
||||
state: [
|
||||
{ featureId: 'temperature', value: 22.4, updatedAt: new Date().toISOString() },
|
||||
{ featureId: 'target', value: 22.4, updatedAt: new Date().toISOString() },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'lock.front',
|
||||
name: 'Front Lock',
|
||||
room: 'Hall',
|
||||
protocol: 'matter',
|
||||
manufacturer: 'Demo',
|
||||
model: 'Lock v1',
|
||||
online: true,
|
||||
features: [
|
||||
{ id: 'locked', capability: 'lock', name: 'Locked', readable: true, writable: true },
|
||||
],
|
||||
state: [
|
||||
{ featureId: 'locked', value: false, updatedAt: new Date().toISOString() },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'energy.solar',
|
||||
name: 'Solar Inverter',
|
||||
room: 'Roof',
|
||||
protocol: 'mqtt',
|
||||
manufacturer: 'Demo',
|
||||
model: 'PV v1',
|
||||
online: true,
|
||||
features: [
|
||||
{ id: 'production', capability: 'energy', name: 'Production', readable: true, writable: false, unit: 'kW' },
|
||||
],
|
||||
state: [
|
||||
{ featureId: 'production', value: 3.8, updatedAt: new Date().toISOString() },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'light.living.floor',
|
||||
name: 'Living Floor Lamp',
|
||||
room: 'Living',
|
||||
protocol: 'zigbee',
|
||||
manufacturer: 'Demo',
|
||||
model: 'Light v1',
|
||||
online: true,
|
||||
features: [
|
||||
{ id: 'on', capability: 'light', name: 'Power', readable: true, writable: true },
|
||||
{ id: 'brightness', capability: 'light', name: 'Brightness', readable: true, writable: true, unit: '%' },
|
||||
],
|
||||
state: [
|
||||
{ featureId: 'on', value: true, updatedAt: new Date().toISOString() },
|
||||
{ featureId: 'brightness', value: 65, updatedAt: new Date().toISOString() },
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
public listDevices(filterArg: { room?: string; capability?: plugins.shxInterfaces.data.TDeviceCapability } = {}) {
|
||||
return this.devices.filter((deviceArg) => {
|
||||
const roomMatches = !filterArg.room || deviceArg.room === filterArg.room;
|
||||
const capabilityMatches = !filterArg.capability || deviceArg.features.some((featureArg: plugins.shxInterfaces.data.IDeviceFeature) => featureArg.capability === filterArg.capability);
|
||||
return roomMatches && capabilityMatches;
|
||||
});
|
||||
}
|
||||
|
||||
public getDeviceById(deviceIdArg: string) {
|
||||
return this.devices.find((deviceArg) => deviceArg.id === deviceIdArg);
|
||||
}
|
||||
|
||||
public upsertDevices(devicesArg: plugins.shxInterfaces.data.IDeviceDefinition[]) {
|
||||
for (const device of devicesArg) {
|
||||
const existingIndex = this.devices.findIndex((existingDeviceArg) => existingDeviceArg.id === device.id);
|
||||
if (existingIndex >= 0) {
|
||||
this.devices[existingIndex] = device;
|
||||
} else {
|
||||
this.devices.push(device);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public updateDeviceState(deviceIdArg: string, featureIdArg: string, valueArg: plugins.shxInterfaces.data.TDeviceStateValue) {
|
||||
const device = this.getDeviceById(deviceIdArg);
|
||||
if (!device) {
|
||||
throw new Error(`Device not found: ${deviceIdArg}`);
|
||||
}
|
||||
const existingState = device.state.find((stateArg: plugins.shxInterfaces.data.IDeviceState) => stateArg.featureId === featureIdArg);
|
||||
if (existingState) {
|
||||
existingState.value = valueArg;
|
||||
existingState.updatedAt = new Date().toISOString();
|
||||
return existingState;
|
||||
}
|
||||
const newState = {
|
||||
featureId: featureIdArg,
|
||||
value: valueArg,
|
||||
updatedAt: new Date().toISOString(),
|
||||
};
|
||||
device.state.push(newState);
|
||||
return newState;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user