inventoresed
Version:
Z-Wave driver written entirely in JavaScript/TypeScript
68 lines (64 loc) • 2.01 kB
text/typescript
import { ZWavePlusNodeType, ZWavePlusRoleType } from "@zwave-js/cc";
import { ZWavePlusCCGet, ZWavePlusCCReport } from "@zwave-js/cc/ZWavePlusCC";
import {
ZWaveProtocolCCNodeInformationFrame,
ZWaveProtocolCCRequestNodeInformationFrame,
} from "@zwave-js/cc/ZWaveProtocolCC";
import {
createMockZWaveRequestFrame,
MockNodeBehavior,
MockZWaveFrameType,
} from "@zwave-js/testing";
const respondToRequestNodeInfo: MockNodeBehavior = {
async onControllerFrame(controller, self, frame) {
if (
frame.type === MockZWaveFrameType.Request &&
frame.payload instanceof ZWaveProtocolCCRequestNodeInformationFrame
) {
const cc = new ZWaveProtocolCCNodeInformationFrame(self.host, {
nodeId: self.id,
...self.capabilities,
supportedCCs: [...self.implementedCCs]
.filter(([, info]) => info.isSupported)
.map(([ccId]) => ccId),
});
await self.sendToController(
createMockZWaveRequestFrame(cc, {
ackRequested: false,
}),
);
return true;
}
},
};
const respondToZWavePlusCCGet: MockNodeBehavior = {
async onControllerFrame(controller, self, frame) {
if (
frame.type === MockZWaveFrameType.Request &&
frame.payload instanceof ZWavePlusCCGet
) {
const cc = new ZWavePlusCCReport(self.host, {
nodeId: controller.host.ownNodeId,
zwavePlusVersion: 2,
nodeType: ZWavePlusNodeType.Node,
roleType: self.capabilities.isListening
? ZWavePlusRoleType.AlwaysOnSlave
: self.capabilities.isFrequentListening
? ZWavePlusRoleType.SleepingListeningSlave
: ZWavePlusRoleType.SleepingReportingSlave,
installerIcon: 0x0000,
userIcon: 0x0000,
});
await self.sendToController(
createMockZWaveRequestFrame(cc, {
ackRequested: true,
}),
);
return true;
}
},
};
/** Predefined default behaviors that are required for interacting with the Mock Controller correctly */
export function createDefaultBehaviors(): MockNodeBehavior[] {
return [respondToRequestNodeInfo, respondToZWavePlusCCGet];
}