1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257
|
"""Additional types for data parsing."""
import enum
import zigpy.types as t
class Bytes(bytes):
"""Serializable and deserializable bytes."""
def serialize(self):
"""Serialize the class."""
return self
@classmethod
def deserialize(cls, data):
"""Deserialize the data into the class."""
return cls(data), b""
class ATCommand(Bytes):
"""XBee AT command name."""
@classmethod
def deserialize(cls, data):
"""Deserialize the data into the class."""
return cls(data[:2]), data[2:]
class EUI64(t.EUI64):
"""EUI64 without prefix."""
@classmethod
def deserialize(cls, data):
"""Deserialize the data into the class."""
r, data = super().deserialize(data)
return cls(r[::-1]), data
def serialize(self):
"""Serialize the class."""
assert self._length == len(self)
return super().serialize()[::-1]
class UndefinedEnumMeta(enum.EnumMeta):
"""Meta class for Enum that always has a value."""
def __call__(cls, value=None, *args, **kwargs):
"""Return the member, default, or undefined value."""
if value is None:
# the 1st enum member is default
return next(iter(cls))
try:
return super().__call__(value, *args, **kwargs)
except ValueError as exc:
try:
return super().__call__(cls._UNDEFINED)
except AttributeError:
raise exc
class UndefinedEnum(enum.Enum, metaclass=UndefinedEnumMeta):
"""Enum that always has a value."""
class FrameId(t.uint8_t):
"""API frame ID."""
class NWK(t.uint16_t_be):
"""zigpy.types.NWK but big endian."""
def __repr__(self):
"""Get printable representation."""
return f"0x{self:04x}"
def __str__(self):
"""Get string representation."""
return f"0x{self:04x}"
class Relays(t.LVList, item_type=NWK, length_type=t.uint8_t):
"""List of Relays."""
UNKNOWN_IEEE = EUI64([t.uint8_t(0xFF) for i in range(0, 8)])
UNKNOWN_NWK = NWK(0xFFFE)
class TXStatus(t.uint8_t, UndefinedEnum):
"""TX Status frame."""
SUCCESS = 0x00 # Standard
# all retries are expired and no ACK is received.
# Not returned for Broadcasts
NO_ACK_RECEIVED = 0x01
CCA_FAILURE = 0x02
# Transmission was purged because a coordinator tried to send to an end
# device, but it timed out waiting for a poll from the end device that
# never occurred, this haapens when Coordinator times out of an indirect
# transmission. Timeouse is defines ad 2.5 * 'SP' (Cyclic Sleep Period)
# parameter value
INDIRECT_TX_TIMEOUT = 0x03
# invalid destination endpoint
INVALID_DESTINATION_ENDPOINT = 0x15
# not returned for Broadcasts
NETWORK_ACK_FAILURE = 0x21
# TX failed because end device was not joined to the network
INDIRECT_TX_FAILURE = 0x22
# Self addressed
SELF_ADDRESSED = 0x23
# Address not found
ADDRESS_NOT_FOUND = 0x24
# Route not found
ROUTE_NOT_FOUND = 0x25
# Broadcast source failed to hear a neighbor relay the message
BROADCAST_RELAY_FAILURE = 0x26
# Invalid binding table index
INVALID_BINDING_IDX = 0x2B
# Resource error lack of free buffers, timers, and so forth.
NO_RESOURCES = 0x2C
# Attempted broadcast with APS transmission
BROADCAST_APS_TX_ATTEMPT = 0x2D
# Attempted unicast with APS transmission, but EE=0
UNICAST_APS_TX_ATTEMPT = 0x2E
INTERNAL_ERROR = 0x31
# Transmission failed due to resource depletion (for example, out of
# buffers, especially for indirect messages from coordinator)
NO_RESOURCES_2 = 0x32
# The payload in the frame was larger than allowed
PAYLOAD_TOO_LARGE = 0x74
_UNDEFINED = 0x2C
class DiscoveryStatus(t.uint8_t, UndefinedEnum):
"""Discovery status of TX Status frame."""
SUCCESS = 0x00
ADDRESS_DISCOVERY = 0x01
ROUTE_DISCOVERY = 0x02
ADDRESS_AND_ROUTE = 0x03
EXTENDED_TIMEOUT = 0x40
_UNDEFINED = 0x00
class TXOptions(t.bitmap8):
"""TX Options for explicit transmit frame."""
NONE = 0x00
Disable_Retries_and_Route_Repair = 0x01
Enable_APS_Encryption = 0x20
Use_Extended_TX_Timeout = 0x40
class ModemStatus(t.uint8_t, UndefinedEnum):
"""Modem Status."""
HARDWARE_RESET = 0x00
WATCHDOG_TIMER_RESET = 0x01
JOINED_NETWORK = 0x02
DISASSOCIATED = 0x03
CONFIGURATION_ERROR_SYNCHRONIZATION_LOST = 0x04
COORDINATOR_REALIGNMENT = 0x05
COORDINATOR_STARTED = 0x06
NETWORK_SECURITY_KEY_UPDATED = 0x07
NETWORK_WOKE_UP = 0x0B
NETWORK_WENT_TO_SLEEP = 0x0C
VOLTAGE_SUPPLY_LIMIT_EXCEEDED = 0x0D
DEVICE_CLOUD_CONNECTED = 0x0E
DEVICE_CLOUD_DISCONNECTED = 0x0F
MODEM_KEY_ESTABLISHED = 0x10
MODEM_CONFIGURATION_CHANGED_WHILE_JOIN_IN_PROGRESS = 0x11
ACCESS_FAULT = 0x12
FATAL_STACK_ERROR = 0x13
PLKE_TABLE_INITIATED = 0x14
PLKE_TABLE_SUCCESS = 0x15
PLKE_TABLE_IS_FULL = 0x16
PLKE_NOT_AUTHORIZED = 0x17
PLKE_INVALID_TRUST_CENTER_REQUEST = 0x18
PLKE_TRUST_CENTER_UPDATE_FAIL = 0x19
PLKE_BAD_EUI_ADDRESS = 0x1A
PLKE_LINK_KEY_REJECTED = 0x1B
PLKE_UPDATE_OCCURED = 0x1C
PLKE_LINK_KEY_TABLE_CLEAR = 0x1D
ZIGBEE_FREQUENCY_AGILITY_HAS_REQUESTED_CHANNEL_CHANGE = 0x1E
ZIGBEE_EXECUTE_ATFR_NO_JOINABLE_BEACON_RESPONSES = 0x1F
ZIGBEE_TOKENS_SPACE_RECOVERED = 0x20
ZIGBEE_TOKENS_SPACE_UNRECOVERABLE = 0x21
ZIGBEE_TOKENS_SPACE_CORRUPTED = 0x22
ZIGBEE_DUAL_MODE_METAFRAME_ERROR = 0x30
BLE_CONNECT = 0x32
BLE_DISCONNECT = 0x33
NO_SECURE_SESSION_CONNECTION = 0x34
CELL_COMPONENT_UPDATE_STARTED = 0x35
CELL_COMPONENT_UPDATE_FAILED = 0x36
CELL_COMPONENT_UPDATE_SUCCEDED = 0x37
XBEE_FIRMWARE_UPDATE_STARTED = 0x38
XBEE_FIRMWARE_UPDATE_FAILED = 0x39
XBEE_WILL_RESET_TO_APPLY_FIRMWARE_UPDATE = 0x3A
SECURE_SESSION_SUCCESSFULLY_ESTABLISHED = 0x3B
SECURE_SESSION_ENDED = 0x3C
SECURE_SESSION_AUTHENTICATION_FAILED = 0x3D
PAN_ID_CONFLICT_DETECTED = 0x3E
PAN_ID_UPDATED_DUE_TO_CONFLICT = 0x3F
ROUTER_PAN_ID_CHANGED_BY_COORDINATOR_DUE_TO_CONFLICT = 0x40
NETWORK_WATCHDOG_TIMEOUT_EXPIRED_THREE_TIMES = 0x42
JOIN_WINDOW_OPENED = 0x43
JOIN_WINDOW_CLOSED = 0x44
NETWORK_SECURITY_KEY_ROTATION_INITIATED = 0x45
STACK_RESET = 0x80
FIB_BOOTLOADER_RESET = 0x81
SEND_OR_JOIN_COMMAND_ISSUED_WITHOUT_CONNECTING_FROM_AP = 0x82
ACCESS_POINT_NOT_FOUND = 0x83
PSK_NOT_CONFIGURED = 0x84
SSID_NOT_FOUND = 0x87
FAILED_TO_JOIN_WITH_SECURITY_ENABLED = 0x88
COER_LOCKUP_OR_CRYSTAL_FAILURE_RESET = 0x89
INVALID_CHANNEL = 0x8A
LOW_VOLTAGE_RESET = 0x8B
FAILED_TO_JOIN_ACCESS_POINT = 0x8E
UNKNOWN_MODEM_STATUS = 0xFF
_UNDEFINED = 0xFF
class RegistrationStatus(t.uint8_t, UndefinedEnum):
"""Key Registration Status."""
SUCCESS = 0x00
KEY_TOO_LONG = 0x01
TRANSIENT_KEY_TABLE_IS_FULL = 0x18
ADDRESS_NOT_FOUND_IN_THE_KEY_TABLE = 0xB1
KEY_IS_INVALID_OR_RESERVED = 0xB2
INVALID_ADDRESS = 0xB3
KEY_TABLE_IS_FULL = 0xB4
SECURITY_DATA_IS_INVALID_INSTALL_CODE_CRC_FAILS = 0xBD
UNKNOWN_MODEM_STATUS = 0xFF
_UNDEFINED = 0xFF
|