class MultistateInput(Cluster): cluster_id = 0x0012 attributes = { 0x000e: ('state_text', t.List(t.LVBytes)), 0x001c: ('description', t.LVBytes), 0x004a: ('number_of_states', t.uint16_t), 0x0051: ('out_of_service', t.Bool), 0x0055: ('present_value', t.Single), # 0x0057: ('priority_array', TODO.array), # Array of 16 structures of (boolean, single precision) 0x0067: ('reliability', t.uint8_t), # enum8 0x006f: ('status_flags', t.uint8_t), # bitmap8 0x0100: ('application_type', t.uint32_t), } server_commands = {} client_commands = {}
0x0022: ('Unind_req', (('SrcAddress', t.EmberEUI64), ('SrcEndpoint', t.uint8_t), ('ClusterID', t.uint16_t), ('DstAddress', MultiAddress))), # Network Management Server Services Requests # ... TODO optional stuff ... 0x0034: ('Mgmt_Leave_req', (('DeviceAddress', t.EmberEUI64), ('Options', t.uint8_t))), # bitmap8 0x0036: ('Mgmt_Permit_Joining_req', (('PermitDuration', t.uint8_t), ('TC_Significant', t.Bool))), # ... TODO optional stuff ... # Responses # Device and Service Discovery Server Responses 0x8000: ('NWK_addr_rsp', (STATUS, IEEE, NWK, ('NumAssocDev', t.uint8_t), ('StartIndex', t.uint8_t), ('NWKAddressAssocDevList', t.List(t.uint16_t)))), 0x8001: ('IEEE_addr_rsp', (STATUS, IEEE, NWK, ('NumAssocDev', t.uint8_t), ('StartIndex', t.uint8_t), ('NWKAddrAssocDevList', t.List(t.uint16_t)))), 0x8002: ('Node_Desc_rsp', (STATUS, NWKI, ('NodeDescriptor', NodeDescriptor))), 0x8003: ('Power_Desc_rsp', (STATUS, NWKI, ('PowerDescriptor', PowerDescriptor))), 0x8004: ('Simple_Desc_rsp', (STATUS, NWKI, ('SimpleDescriptor', SizePrefixedSimpleDescriptor))), 0x8005: ('Active_EP_rsp', (STATUS, NWKI, ('ActiveEPList', t.LVList(t.uint8_t)))), 0x8006: ('Match_Desc_rsp', (STATUS, NWKI, ('MatchList', t.LVList(t.uint8_t)))), # 0x8010: ('Complex_Desc_rsp', (STATUS, NWKI, ('Length', t.uint8_t), ('ComplexDescriptor', ComplexDescriptor))),
def test_list(): expected = list(map(ord, '\x0123')) assert t.List(t.uint8_t).deserialize(b'\x0123') == (expected, b'')
_fields = [ ('direction', t.uint8_t), ('attrid', t.uint16_t), ] class DiscoverAttributesResponseRecord(t.EzspStruct): _fields = [ ('attrid', t.uint16_t), ('datatype', t.uint8_t), ] COMMANDS = { # id: (name, params, is_response) 0x00: ('Read attributes', (t.List(t.uint16_t), ), False), 0x01: ('Read attributes response', (t.List(ReadAttributeRecord), ), True), 0x02: ('Write attributes', (t.List(Attribute), ), False), 0x03: ('Write attributes undivided', (t.List(Attribute), ), False), 0x04: ('Write attributes response', (t.List(WriteAttributesStatusRecord), ), True), 0x05: ('Write attributes no response', (t.List(Attribute), ), False), 0x06: ('Configure reporting', (t.List(AttributeReportingConfig), ), False), 0x07: ('Configure reporting response', (t.List(ConfigureReportingResponseRecord), ), True), 0x08: ('Read reporting configuration', (t.List(ReadReportingConfigRecord), ), False), 0x09: ('Read reporting configuration response', (t.List(AttributeReportingConfig), ), True), 0x0a: ('Report attributes', (t.List(Attribute), ), False), 0x0b: ('Default response', (t.uint8_t, Status), True),
def test_list(): expected = list(map(ord, "\x0123")) assert t.List(t.uint8_t).deserialize(b"\x0123") == (expected, b"")
# 4. Configuration frames "version": (0x00, (t.uint8_t, ), (t.uint8_t, t.uint8_t, t.uint16_t)), "getConfigurationValue": (0x52, (t.EzspConfigId, ), (t.EzspStatus, t.uint16_t)), "setConfigurationValue": (0x53, (t.EzspConfigId, t.uint16_t), (t.EzspStatus, )), "addEndpoint": ( 0x02, ( t.uint8_t, t.uint16_t, t.uint16_t, t.uint8_t, t.uint8_t, t.uint8_t, t.List(t.uint16_t), t.List(t.uint16_t), ), (t.EzspStatus, ), ), "setPolicy": (0x55, (t.EzspPolicyId, t.EzspDecisionId), (t.EzspStatus, )), "getPolicy": (0x56, (t.EzspPolicyId, ), (t.EzspStatus, t.EzspDecisionId)), "getValue": (0xAA, (t.EzspValueId, ), (t.EzspStatus, t.LVBytes)), "getExtendedValue": ( 0x03, (t.EzspExtendedValueId, t.uint32_t), (t.EzspStatus, t.LVBytes), ), "setValue": (0xAB, (t.EzspValueId, t.LVBytes), (t.EzspStatus, )), "setGpioCurrentConfiguration": ( 0xAC,
import bellows.types as t COMMANDS = { # 4. Configuration frames 'version': (0x00, (t.uint8_t, ), (t.uint8_t, t.uint8_t, t.uint16_t)), 'getConfigurationValue': (0x52, (t.EzspConfigId, ), (t.EzspStatus, t.uint16_t)), 'setConfigurationValue': (0x53, (t.EzspConfigId, t.uint16_t), (t.EzspStatus, )), # TODO: Last four fields are length, length, array, array. Need some # composite type to handle that. 'addEndpoint': (0x02, (t.uint8_t, t.uint16_t, t.uint16_t, t.uint8_t, t.uint8_t, t.uint8_t, t.List(t.uint16_t), t.List(t.uint16_t)), (t.EzspStatus, )), 'setPolicy': (0x55, (t.EzspPolicyId, t.EzspDecisionId), (t.EzspStatus, )), 'getPolicy': (0x56, (t.EzspPolicyId, ), (t.EzspStatus, t.EzspDecisionId)), 'getValue': (0xAA, (t.EzspValueId, ), (t.EzspStatus, t.LVBytes)), 'getExtendedValue': (0x03, (t.EzspExtendedValueId, t.uint32_t), (t.EzspStatus, t.LVBytes)), 'setValue': (0xAB, (t.EzspValueId, t.LVBytes), (t.EzspStatus, )), 'setGpioCurrentConfiguration': (0xAC, (t.uint8_t, t.uint8_t, t.uint8_t), (t.EzspStatus, )), 'setGpioPowerUpDownConfiguration': (0xAD, (t.uint8_t, t.uint8_t, t.uint8_t, t.uint8_t, t.uint8_t), (t.EzspStatus, )), 'setGpioRadioPowerMask': (0xAE, (t.uint32_t, ), ()), 'setCtune': (0xF5, (t.uint16_t, ), ()), 'getCtune': (0xF6, (), (t.uint16_t, )), 'setChannelMap': (0xF7, (t.uint8_t, t.uint8_t), ()), # 5. Utilities Frames 'nop': (0x05, (), ()), 'echo': (0x81, (t.LVBytes, ), (t.LVBytes, )), 'invalidCommand': (0x58, (), (t.EzspStatus, )), 'callback': (0x06, (), ()), 'noCallbacks': (0x07, (), ()), 'setToken': (0x09, (t.uint8_t, t.fixed_list(8, t.uint8_t)), (t.EmberStatus, )), 'getToken': (0x0A, (t.uint8_t, ), (t.EmberStatus, t.fixed_list(8, t.uint8_t))), 'getMfgToken': (0x0B, (t.EzspMfgTokenId, ), (t.LVBytes, )),