import {ZiGateCommandCode, ZiGateMessageCode, ZiGateObjectPayload} from "./constants"; export interface PermitJoinPayload extends ZiGateObjectPayload { targetShortAddress: number interval: number TCsignificance?: number } export interface RawAPSDataRequestPayload extends ZiGateObjectPayload { addressMode: number targetShortAddress: number sourceEndpoint: number destinationEndpoint: number profileID: number clusterID: number securityMode: number radius: number dataLength: number data: any } export interface ZiGateCommandParameter { name: string; parameterType: string; } export interface ZiGateCommandType { request: ZiGateCommandParameter[]; response: ZiGateResponseMatcher[]; } export interface ZiGateResponseMatcherRule { receivedProperty: string; matcher: (expected: string | number | ZiGateMessageCode, received: string | number | ZiGateMessageCode) => boolean; expectedProperty?: string; // or value?: string | number | ZiGateMessageCode; } function equal( expected: string | number | ZiGateMessageCode, received: string | number | ZiGateMessageCode): boolean { return expected === received; } function notEqual( expected: string | number | ZiGateMessageCode, received: string | number | ZiGateMessageCode): boolean { return expected !== received; } export type ZiGateResponseMatcher = ZiGateResponseMatcherRule[]; export const ZiGateCommand: { [key: string]: ZiGateCommandType } = { [ZiGateCommandCode.SetDeviceType]: { // 0x0023 request: [ {name: 'deviceType', parameterType: 'UINT8'} // ], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.SetDeviceType} ] ] }, [ZiGateCommandCode.StartNetwork]: { // 0x0024 request: [], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.StartNetwork}, ], [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.NetworkJoined} ], ] }, [ZiGateCommandCode.StartNetworkScan]: { request: [], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.StartNetworkScan}, ], [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.NetworkJoined} ] ] }, [ZiGateCommandCode.GetNetworkState]: { // 0x0009 request: [], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.GetNetworkState}, ] ] }, [ZiGateCommandCode.GetTimeServer]: { // 0x0017 request: [], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.GetTimeServer}, ] ] }, [ZiGateCommandCode.ErasePersistentData]: { // 0x0012 request: [], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.ErasePersistentData}, ] ] }, [ZiGateCommandCode.Reset]: { // 0x0011 request: [], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.Reset}, ] ] }, [ZiGateCommandCode.SetTXpower]: { // SetTXpower request: [ {name: 'value', parameterType: 'UINT8'} ], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.SetTXpower}, ] ] }, [ZiGateCommandCode.ManagementLQI]: { // 0x004E request: [ {name: 'targetAddress', parameterType: 'UINT16'}, // Status {name: 'startIndex', parameterType: 'UINT8'}, // ], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.ManagementLQI}, ] ] }, [ZiGateCommandCode.SetSecurityStateKey]: { // 0x0022 request: [ {name: 'keyType', parameterType: 'UINT8'}, // {name: 'key', parameterType: 'DATA'}, // ], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.SetSecurityStateKey}, ] ] }, [ZiGateCommandCode.GetVersion]: { request: [], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.status', matcher: notEqual, value: 0}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.GetVersion}, ], [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.VersionList} ], ] }, [ZiGateCommandCode.RawMode]: { request: [ {name: 'enabled', parameterType: 'INT8'}, ], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.RawMode}, ] ] }, [ZiGateCommandCode.SetExpendedPANID]: { request: [ {name: 'panId', parameterType: 'IEEEADDR'}, //<64-bit Extended PAN ID:uint64_t> ], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.SetExpendedPANID}, ] ] }, [ZiGateCommandCode.SetChannelMask]: { request: [ {name: 'channelMask', parameterType: 'UINT32BE'}, // ], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.SetChannelMask}, ] ] }, [ZiGateCommandCode.RemoveDevice]: { request: [ {name: 'targetShortAddress', parameterType: 'IEEEADDR'}, // {name: 'extendedAddress:', parameterType: 'IEEEADDR'}, // ], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.status', matcher: notEqual, value: 0}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.RemoveDevice}, ], [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.LeaveIndication} ], ] }, [ZiGateCommandCode.PermitJoin]: { request: [ {name: 'targetShortAddress', parameterType: 'UINT16'}, // - // broadcast 0xfffc {name: 'interval', parameterType: 'UINT8'}, // // 0 = Disable Joining // 1 – 254 = Time in seconds to allow joins // 255 = Allow all joins // {name: 'TCsignificance', parameterType: 'UINT8'}, // // 0 = No change in authentication // 1 = Authentication policy as spec ], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.PermitJoin}, ] ] }, [ZiGateCommandCode.PermitJoinStatus]: { request: [ {name: 'targetShortAddress', parameterType: 'UINT16'}, // - // broadcast 0xfffc {name: 'interval', parameterType: 'UINT8'}, // // 0 = Disable Joining // 1 – 254 = Time in seconds to allow joins // 255 = Allow all joins {name: 'TCsignificance', parameterType: 'UINT8'}, // // 0 = No change in authentication // 1 = Authentication policy as spec ], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.status', matcher: notEqual, value: 0}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.PermitJoinStatus}, ], [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.PermitJoinStatus} ], ] }, [ZiGateCommandCode.RawAPSDataRequest]: { request: [ {name: 'addressMode', parameterType: 'UINT8'}, //
{name: 'targetShortAddress', parameterType: 'UINT16BE'}, // {name: 'sourceEndpoint', parameterType: 'UINT8'}, // {name: 'destinationEndpoint', parameterType: 'UINT8'}, // {name: 'clusterID', parameterType: 'UINT16BE'}, // {name: 'profileID', parameterType: 'UINT16BE'}, // {name: 'securityMode', parameterType: 'UINT8'}, // {name: 'radius', parameterType: 'UINT8'}, // {name: 'dataLength', parameterType: 'UINT8'}, // {name: 'data', parameterType: 'BUFFER'}, // ], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.status', matcher: notEqual, value: 0}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.RawAPSDataRequest}, ], [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.DataIndication}, { receivedProperty: 'payload.sourceAddress', matcher: equal, expectedProperty: 'payload.targetShortAddress' }, { receivedProperty: 'payload.clusterID', matcher: equal, expectedProperty: 'payload.clusterID' }, { receivedProperty: 'payload.sourceEndpoint', matcher: equal, expectedProperty: 'payload.destinationEndpoint' }, {receivedProperty: 'payload.profileID', matcher: equal, expectedProperty: 'payload.profileID'}, ], ] }, [ZiGateCommandCode.SimpleDescriptor]: { request: [ {name: 'targetShortAddress', parameterType: 'UINT16BE'}, // {name: 'endpoint', parameterType: 'UINT8'}, // ], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.status', matcher: notEqual, value: 0}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.SimpleDescriptor}, ], [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.DataIndication}, { receivedProperty: 'payload.sourceAddress', matcher: equal, expectedProperty: 'payload.targetShortAddress' }, { receivedProperty: 'payload.clusterID', matcher: equal, value: ZiGateMessageCode.SimpleDescriptorResponse } ], ] }, [ZiGateCommandCode.ActiveEndpoint]: { request: [ {name: 'targetShortAddress', parameterType: 'UINT16BE'}, // ], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.status', matcher: notEqual, value: 0}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.ActiveEndpoint}, ], [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.DataIndication}, { receivedProperty: 'payload.sourceAddress', matcher: equal, expectedProperty: 'payload.targetShortAddress' }, {receivedProperty: 'payload.clusterID', matcher: equal, value: ZiGateMessageCode.ActiveEndpointResponse} ], ] }, [ZiGateCommandCode.NodeDescriptor]: { request: [ {name: 'targetShortAddress', parameterType: 'UINT16BE'}, // ], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.status', matcher: notEqual, value: 0}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.NodeDescriptor}, ], [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.DataIndication}, { receivedProperty: 'payload.sourceAddress', matcher: equal, expectedProperty: 'payload.targetShortAddress' }, {receivedProperty: 'payload.clusterID', matcher: equal, value: 0x8002}, ], ] }, [ZiGateCommandCode.Bind]: { request: [ {name: 'targetExtendedAddress', parameterType: 'IEEEADR'}, // {name: 'targetEndpoint', parameterType: 'UINT8'}, // {name: 'clusterID', parameterType: 'UINT16BE'}, // {name: 'destinationAddressMode', parameterType: 'UINT8'}, // {name: 'destinationAddress', parameterType: 'ADDRESS_WITH_TYPE_DEPENDENCY'}, // {name: 'destinationEndpoint', parameterType: 'UINT8'}, // ], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.status', matcher: notEqual, value: 0}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.Bind}, ], ] }, [ZiGateCommandCode.UnBind]: { request: [ {name: 'targetExtendedAddress', parameterType: 'IEEEADR'}, // {name: 'targetEndpoint', parameterType: 'UINT8'}, // {name: 'clusterID', parameterType: 'UINT16BE'}, // {name: 'destinationAddressMode', parameterType: 'UINT8'}, // {name: 'destinationAddress', parameterType: 'ADDRESS_WITH_TYPE_DEPENDENCY'}, // {name: 'destinationEndpoint', parameterType: 'UINT8'}, // ], response: [ [ {receivedProperty: 'code', matcher: equal, value: ZiGateMessageCode.Status}, {receivedProperty: 'payload.status', matcher: notEqual, value: 0}, {receivedProperty: 'payload.packetType', matcher: equal, value: ZiGateCommandCode.UnBind}, ], ] }, };