fix(M06-E-R1): 校正智慧插座协议
This commit is contained in:
@@ -19,7 +19,8 @@ const service = new DeviceControlService({
|
||||
if (sql.includes("device_type = 'SMART_SOCKET'")) {
|
||||
return [[{
|
||||
id: 52, deviceId: 'SOCKET_001', storeId: 11, roomId: 31,
|
||||
deviceType: 'SMART_SOCKET', status: 'ONLINE'
|
||||
deviceType: 'SMART_SOCKET', status: 'ONLINE', model: 'JL-SOCKET-16A',
|
||||
capabilities: ['POWER', 'METERING', 'RATED_16A']
|
||||
}], []];
|
||||
}
|
||||
return [[{
|
||||
@@ -80,7 +81,15 @@ await service.controlSubLock(context, {
|
||||
assert.equal(issued.at(-1).payload.value, '123456654321');
|
||||
assert.equal('content' in issued.at(-1).payload, false);
|
||||
await service.readSmartSocket(context, 'workInfo');
|
||||
assert.deepEqual(issued.at(-1).payload, { read: 'workInfo' });
|
||||
assert.deepEqual(issued.at(-1).payload, { read: 'workInfo', slotNum: 1 });
|
||||
await service.readSmartSocket(context, {
|
||||
target: 'localtask', slotNum: 2, taskNum: 0
|
||||
});
|
||||
assert.deepEqual(issued.at(-1).payload, {
|
||||
read: 'localtask', slotNum: 2, taskNum: 0
|
||||
});
|
||||
await service.readSmartSocket(context, { target: 'mqttConfig' });
|
||||
assert.deepEqual(issued.at(-1).payload, { read: 'mqttConfig' });
|
||||
await service.switchSmartSocket(context, { on: false, slotNum: 2 });
|
||||
assert.deepEqual(issued.at(-1).payload, {
|
||||
action: 'off', id: '1782120000001', slotNum: 2
|
||||
@@ -89,10 +98,38 @@ await service.scheduleSmartSocket(context, {
|
||||
taskNum: 1, action: 'on', mode: 'weekly', time: '18:30', weekdays: [5, 6]
|
||||
});
|
||||
assert.equal(issued.at(-1).payload.action, 'localtask');
|
||||
assert.equal(issued.at(-1).payload.switch, 'on');
|
||||
assert.deepEqual(issued.at(-1).payload, {
|
||||
action: 'localtask', slotNum: 1, taskNum: 1, tasktype: 'on',
|
||||
cyctype: 'weekcyc', weekdata: '0000110', actiontime: '1830',
|
||||
id: '1782120000001'
|
||||
});
|
||||
await service.clearSmartSocketTask(context, 1);
|
||||
assert.equal(issued.at(-1).payload.action, 'clearTask');
|
||||
assert.equal(audits.length, 15);
|
||||
assert.deepEqual(issued.at(-1).payload, {
|
||||
action: 'clearTask', slotNum: 1, taskNum: 1, id: '1782120000001'
|
||||
});
|
||||
await service.configureSmartSocketProtection(context, {
|
||||
maxPower: 3500, maxCurrent: 15, maxTemperature: 80,
|
||||
pullOutStop: 1, pullOutPower: 5, pullOutSec: 10,
|
||||
chargeFullStop: 1, chargeFullPower: 8, chargeFullSec: 30
|
||||
});
|
||||
assert.equal(issued.at(-1).payload.setting, 'protectOff');
|
||||
assert.equal('ratedAmps' in issued.at(-1).payload, false);
|
||||
await assert.rejects(
|
||||
() => service.configureSmartSocketProtection(context, {
|
||||
maxPower: 3500, maxCurrent: 17, maxTemperature: 80,
|
||||
pullOutStop: 1, pullOutPower: 5, pullOutSec: 10,
|
||||
chargeFullStop: 1, chargeFullPower: 8, chargeFullSec: 30
|
||||
}),
|
||||
/16A capability/
|
||||
);
|
||||
await service.configureSmartSocketParameter(context, {
|
||||
resetHold: 1, keyLock: 0, keyOff: 1
|
||||
});
|
||||
assert.deepEqual(issued.at(-1).payload, {
|
||||
setting: 'parameter', resetHold: 1, keyLock: 0, KeyOff: 1,
|
||||
id: '1782120000001'
|
||||
});
|
||||
assert.equal(audits.length, 20);
|
||||
assert.match(audits[0], /DEVICE_COMMAND_REQUESTED/);
|
||||
|
||||
await assert.rejects(
|
||||
@@ -128,6 +165,50 @@ await service.controlSubLock(platformContext, {
|
||||
assert.equal(issued.at(-1).payload.value, 'all');
|
||||
assert.equal(issued.at(-1).payload.subtype, '15');
|
||||
|
||||
await assert.rejects(
|
||||
() => service.emptySmartSocketEnergy(context, 'CONFIRM_EMPTY_SOCKET_ENERGY'),
|
||||
(error) => error instanceof DeviceControlError
|
||||
&& error.code === 'DEVICE_DANGEROUS_ACTION_FORBIDDEN'
|
||||
);
|
||||
await service.emptySmartSocketEnergy(platformContext, 'CONFIRM_EMPTY_SOCKET_ENERGY');
|
||||
assert.deepEqual(issued.at(-1).payload, {
|
||||
action: 'emptyPower', id: '1782120000001'
|
||||
});
|
||||
await assert.rejects(
|
||||
() => service.resetSmartSocket(platformContext, {
|
||||
password: 'return-secret', dangerConfirmation: 'WRONG'
|
||||
}),
|
||||
(error) => error instanceof DeviceControlError
|
||||
&& error.code === 'DEVICE_DANGEROUS_ACTION_FORBIDDEN'
|
||||
);
|
||||
await service.resetSmartSocket(platformContext, {
|
||||
password: 'return-secret', dangerConfirmation: 'CONFIRM_SOCKET_FACTORY_RESET'
|
||||
});
|
||||
assert.equal(issued.at(-1).payload.action, 'returnFactory');
|
||||
assert.equal(issued.at(-1).payload.password, 'return-secret');
|
||||
assert.equal('dangerConfirmation' in issued.at(-1).payload, false);
|
||||
await service.changeSmartSocketReturnKey(platformContext, {
|
||||
old: 'old-secret', new: 'new-secret',
|
||||
dangerConfirmation: 'CONFIRM_CHANGE_SOCKET_RETURN_KEY'
|
||||
});
|
||||
assert.deepEqual(issued.at(-1).payload, {
|
||||
action: 'setReturnKey', old: 'old-secret', new: 'new-secret',
|
||||
id: '1782120000001'
|
||||
});
|
||||
await assert.rejects(
|
||||
() => service.clearSmartSocketTask(context, {
|
||||
taskNum: 0, dangerConfirmation: 'CONFIRM_CLEAR_ALL_SOCKET_TASKS'
|
||||
}),
|
||||
(error) => error instanceof DeviceControlError
|
||||
&& error.code === 'DEVICE_DANGEROUS_ACTION_FORBIDDEN'
|
||||
);
|
||||
await service.clearSmartSocketTask(platformContext, {
|
||||
slotNum: 2, taskNum: 0, dangerConfirmation: 'CONFIRM_CLEAR_ALL_SOCKET_TASKS'
|
||||
});
|
||||
assert.deepEqual(issued.at(-1).payload, {
|
||||
action: 'clearTask', slotNum: 2, taskNum: 0, id: '1782120000001'
|
||||
});
|
||||
|
||||
await assert.rejects(
|
||||
() => service.controlPower({
|
||||
...context,
|
||||
@@ -180,10 +261,16 @@ const app = await buildApp({
|
||||
async cancelTask() { return {}; },
|
||||
async pairSubLock() { return {}; },
|
||||
async controlSubLock() { return {}; },
|
||||
async readSmartSocket() { return {}; },
|
||||
async readSmartSocket(_context, input) { routed = input; return {}; },
|
||||
async switchSmartSocket(_context, input) { routed = input; return { status: 'PUBLISHED' }; },
|
||||
async scheduleSmartSocket() { return {}; },
|
||||
async clearSmartSocketTask() { return {}; }
|
||||
async clearSmartSocketTask() { return {}; },
|
||||
async rebootSmartSocket() { return {}; },
|
||||
async emptySmartSocketEnergy() { return {}; },
|
||||
async resetSmartSocket(_context, input) { routed = input; return {}; },
|
||||
async changeSmartSocketReturnKey() { return {}; },
|
||||
async configureSmartSocketProtection(_context, input) { routed = input; return {}; },
|
||||
async configureSmartSocketParameter() { return {}; }
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -222,6 +309,44 @@ const socketResponse = await app.inject({
|
||||
});
|
||||
assert.equal(socketResponse.statusCode, 200);
|
||||
assert.equal(routed.on, true);
|
||||
const socketTaskRead = await app.inject({
|
||||
method: 'POST',
|
||||
url: '/admin-api/device-control/socket/read',
|
||||
headers: { authorization: `Bearer ${token}` },
|
||||
payload: { storeId: '11', roomId: '31', target: 'localtask', slotNum: 1, taskNum: 0 }
|
||||
});
|
||||
assert.equal(socketTaskRead.statusCode, 200);
|
||||
assert.equal(routed.target, 'localtask');
|
||||
assert.equal(routed.taskNum, 0);
|
||||
const invalidSocketTaskRead = await app.inject({
|
||||
method: 'POST',
|
||||
url: '/admin-api/device-control/socket/read',
|
||||
headers: { authorization: `Bearer ${token}` },
|
||||
payload: { storeId: '11', roomId: '31', target: 'localtask' }
|
||||
});
|
||||
assert.equal(invalidSocketTaskRead.statusCode, 400);
|
||||
const invalidSocketTask = await app.inject({
|
||||
method: 'POST',
|
||||
url: '/admin-api/device-control/socket/task',
|
||||
headers: { authorization: `Bearer ${token}` },
|
||||
payload: {
|
||||
storeId: '11', roomId: '31', taskNum: 1, action: 'on',
|
||||
mode: 'weekly', time: '24:00', weekdays: [1]
|
||||
}
|
||||
});
|
||||
assert.equal(invalidSocketTask.statusCode, 400);
|
||||
const socketProtection = await app.inject({
|
||||
method: 'POST',
|
||||
url: '/admin-api/device-control/socket/protection',
|
||||
headers: { authorization: `Bearer ${token}` },
|
||||
payload: {
|
||||
storeId: '11', roomId: '31', maxPower: 3500, maxCurrent: 15,
|
||||
maxTemperature: 80, pullOutStop: 1, pullOutPower: 5, pullOutSec: 10,
|
||||
chargeFullStop: 1, chargeFullPower: 8, chargeFullSec: 30
|
||||
}
|
||||
});
|
||||
assert.equal(socketProtection.statusCode, 200);
|
||||
assert.equal(routed.maxCurrent, 15);
|
||||
const subLockResponse = await app.inject({
|
||||
method: 'POST',
|
||||
url: '/admin-api/device-control/sub-lock/action',
|
||||
@@ -274,4 +399,4 @@ assert.equal(routedContext.traceId, 'm08a-open-door');
|
||||
assert.deepEqual(routedContext.access.capabilities, ['device.write']);
|
||||
await app.close();
|
||||
|
||||
console.log('PASS: M06-E device control commands include control-box, Sub-1G and smart socket.');
|
||||
console.log('PASS: M06-E-R1 socket controls, capability limits and dangerous gates work.');
|
||||
|
||||
Reference in New Issue
Block a user