Add native hub protocol integrations
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
||||
import { MatterMapper } from '../../ts/integrations/matter/index.js';
|
||||
import type { IMatterSnapshot } from '../../ts/integrations/matter/index.js';
|
||||
|
||||
const snapshot: IMatterSnapshot = {
|
||||
connected: true,
|
||||
events: [],
|
||||
serverInfo: {
|
||||
fabric_id: 1,
|
||||
compressed_fabric_id: 2,
|
||||
schema_version: 11,
|
||||
min_supported_schema_version: 6,
|
||||
sdk_version: '1.4.2',
|
||||
wifi_credentials_set: true,
|
||||
thread_credentials_set: false,
|
||||
bluetooth_enabled: false,
|
||||
},
|
||||
nodes: [{
|
||||
node_id: 1234,
|
||||
available: true,
|
||||
attributes: {
|
||||
'0/29/0': [{ deviceType: 0x0016, revision: 1 }],
|
||||
'0/29/1': [29, 40],
|
||||
'0/40/1': 'Acme',
|
||||
'0/40/2': 123,
|
||||
'0/40/3': 'Matter Test Device',
|
||||
'0/40/4': 456,
|
||||
'0/40/5': 'Test Node',
|
||||
'0/40/15': 'serial-1',
|
||||
'1/29/0': [{ deviceType: 0x0101, revision: 2 }],
|
||||
'1/29/1': [29, 6, 8],
|
||||
'1/6/0': true,
|
||||
'1/8/0': 128,
|
||||
'1/8/2': 1,
|
||||
'1/8/3': 254,
|
||||
'2/29/0': [{ deviceType: 0x0015, revision: 1 }],
|
||||
'2/29/1': [29, 69],
|
||||
'2/69/0': false,
|
||||
'3/29/0': [{ deviceType: 0x0202, revision: 1 }],
|
||||
'3/29/1': [29, 258],
|
||||
'3/258/10': 0,
|
||||
'3/258/14': 2500,
|
||||
'4/29/0': [{ deviceType: 0x000a, revision: 1 }],
|
||||
'4/29/1': [29, 257],
|
||||
'4/257/0': 1,
|
||||
'5/29/0': [{ deviceType: 0x0301, revision: 1 }],
|
||||
'5/29/1': [29, 513],
|
||||
'5/513/0': 2150,
|
||||
'5/513/18': 2000,
|
||||
'5/513/28': 4,
|
||||
},
|
||||
}],
|
||||
};
|
||||
|
||||
tap.test('maps Matter nodes to canonical devices and entities', async () => {
|
||||
const devices = MatterMapper.toDevices(snapshot);
|
||||
const entities = MatterMapper.toEntities(snapshot);
|
||||
|
||||
expect(devices.some((deviceArg) => deviceArg.id === 'matter.node.1234.endpoint.1')).toBeTrue();
|
||||
expect(entities.some((entityArg) => entityArg.platform === 'light' && entityArg.state === 'on')).toBeTrue();
|
||||
expect(entities.some((entityArg) => entityArg.platform === 'binary_sensor' && entityArg.attributes?.deviceClass === 'door')).toBeTrue();
|
||||
expect(entities.some((entityArg) => entityArg.platform === 'cover' && entityArg.attributes?.position === 75)).toBeTrue();
|
||||
expect(entities.some((entityArg) => String(entityArg.platform) === 'lock' && entityArg.state === 'locked')).toBeTrue();
|
||||
expect(entities.some((entityArg) => entityArg.platform === 'climate' && entityArg.state === 'heat')).toBeTrue();
|
||||
});
|
||||
|
||||
tap.test('maps entity services to Matter server commands', async () => {
|
||||
const light = MatterMapper.toEntities(snapshot).find((entityArg) => entityArg.platform === 'light');
|
||||
const cover = MatterMapper.toEntities(snapshot).find((entityArg) => entityArg.platform === 'cover');
|
||||
|
||||
const turnOff = MatterMapper.commandForService(snapshot, {
|
||||
domain: 'light',
|
||||
service: 'turn_off',
|
||||
target: { entityId: light?.id },
|
||||
});
|
||||
const setPosition = MatterMapper.commandForService(snapshot, {
|
||||
domain: 'cover',
|
||||
service: 'set_position',
|
||||
target: { entityId: cover?.id },
|
||||
data: { position: 42 },
|
||||
});
|
||||
|
||||
expect(turnOff?.command).toEqual('device_command');
|
||||
expect(turnOff?.args?.cluster_id).toEqual(6);
|
||||
expect(turnOff?.args?.command_name).toEqual('Off');
|
||||
expect(setPosition?.args?.cluster_id).toEqual(258);
|
||||
expect(setPosition?.args?.payload).toEqual({ liftPercent100thsValue: 5800 });
|
||||
});
|
||||
|
||||
export default tap.start();
|
||||
Reference in New Issue
Block a user