Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_ota_image_destination():
extra = b"abcdefghklmnpqr"
dst = t.EUI64.deserialize(b"12345678")[0]
hdr, rest = _test_ota_img_header(b"\x02\x00", dst.serialize(), extra)
assert rest == extra
assert hdr.security_credential_version_present is False
assert hdr.device_specific_file is True
assert hdr.upgrade_file_destination == dst
assert hdr.hardware_versions_present is False
return cls(raw.decode("utf8", errors="replace")), data[cls._size :]
def serialize(self):
return self.encode("utf8").ljust(self._size, b"\x00")
class OTAImageHeader(t.Struct):
MAGIC_VALUE = 0x0BEEF11E
OTA_HEADER = MAGIC_VALUE.to_bytes(4, "little")
upgrade_file_id: t.uint32_t
header_version: t.uint16_t
header_length: t.uint16_t
field_control: t.uint16_t
manufacturer_id: t.uint16_t
image_type: t.uint16_t
file_version: t.uint32_t
stack_version: t.uint16_t
header_string: HeaderString
image_size: t.uint32_t
@property
def security_credential_version_present(self) -> bool:
if self.field_control is None:
return None
return bool(self.field_control & 0x01)
@property
def device_specific_file(self) -> bool:
if self.field_control is None:
return None
return bool(self.field_control & 0x02)
status._name_ = chained.name
status._value_ = value
return status
NWK = ("NWKAddr", t.NWK)
NWKI = ("NWKAddrOfInterest", t.NWK)
IEEE = ("IEEEAddr", t.EUI64)
STATUS = ("Status", Status)
class _CommandID(t.uint16_t, hex_repr=True):
pass
class ZDOCmd(t.enum_factory(_CommandID)):
# Device and Service Discovery Server Requests
NWK_addr_req = 0x0000
IEEE_addr_req = 0x0001
Node_Desc_req = 0x0002
Power_Desc_req = 0x0003
Simple_Desc_req = 0x0004
Active_EP_req = 0x0005
Match_Desc_req = 0x0006
Complex_Desc_req = 0x0010
User_Desc_req = 0x0011
Discovery_Cache_req = 0x0012
Device_annce = 0x0013
User_Desc_set = 0x0014
System_Server_Discovery_req = 0x0015
Discovery_store_req = 0x0016
Node_Desc_store_req = 0x0017
),
}
client_commands = {}
class Ballast(Cluster):
"""Attributes and commands for configuring a lighting
ballast"""
cluster_id = 0x0301
ep_attribute = "light_ballast"
attributes = {
# Ballast Information
0x0000: ("physical_min_level", t.uint8_t),
0x0001: ("physical_max_level", t.uint8_t),
0x0002: ("ballast_status", t.bitmap8),
# Ballast Settings
0x0010: ("min_level", t.uint8_t),
0x0011: ("max_level", t.uint8_t),
0x0012: ("power_on_level", t.uint8_t),
0x0013: ("power_on_fade_time", t.uint16_t),
0x0014: ("intrinsic_ballast_factor", t.uint8_t),
0x0015: ("ballast_factor_adjustment", t.uint8_t),
# Lamp Information
0x0020: ("lamp_quantity", t.uint8_t),
# Lamp Settings
0x0030: ("lamp_type", t.LimitedCharString(16)),
0x0031: ("lamp_manufacturer", t.LimitedCharString(16)),
0x0032: ("lamp_rated_hours", t.uint24_t),
0x0033: ("lamp_burn_hours", t.uint24_t),
0x0034: ("lamp_alarm_mode", t.bitmap8),
0x0035: ("lamp_burn_hours_trip_point", t.uint24_t),
0x006F: ("status_flags", t.bitmap8),
0x0100: ("application_type", t.uint32_t),
}
server_commands = {}
client_commands = {}
class BinaryValue(Cluster):
cluster_id = 0x0011
ep_attribute = "binary_value"
attributes = {
0x0004: ("active_text", t.CharacterString),
0x001C: ("description", t.CharacterString),
0x002E: ("inactive_text", t.CharacterString),
0x0042: ("minimum_off_time", t.uint32_t),
0x0043: ("minimum_on_time", t.uint32_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.enum8),
0x0068: ("relinquish_default", t.Single),
0x006F: ("status_flags", t.bitmap8),
0x0100: ("application_type", t.uint32_t),
}
server_commands = {}
client_commands = {}
class MultistateInput(Cluster):
cluster_id = 0x0012
ep_attribute = "multistate_input"
try:
schema = commands[hdr.command_id][1]
hdr.frame_control.is_reply = commands[hdr.command_id][2]
except KeyError:
self.warning("Unknown cluster-specific command %s", hdr.command_id)
return hdr, data
else:
# General command
try:
schema = foundation.COMMANDS[hdr.command_id][0]
hdr.frame_control.is_reply = foundation.COMMANDS[hdr.command_id][1]
except KeyError:
self.warning("Unknown foundation command %s", hdr.command_id)
return hdr, data
value, data = t.deserialize(data, schema)
if data != b"":
self.warning("Data remains after deserializing ZCL frame")
return hdr, value
return hdr, data
def serialize(self) -> bytes:
data = super().serialize()
if self.security_credential_version_present:
data += self.security_credential_version.serialize()
if self.device_specific_file:
data += self.upgrade_file_destination.serialize()
if self.hardware_versions_present:
data += self.minimum_hardware_version.serialize()
data += self.maximum_hardware_version.serialize()
return data
class ElementTagId(t.enum16):
UPGRADE_IMAGE = 0x0000
ECDSA_SIGNATURE = 0x0001
ECDSA_SIGNING_CERTIFICATE = 0x0002
IMAGE_INTEGRITY_CODE = 0x0003
class SubElement(bytes):
@property
def data(self):
return self
@property
def length(self):
return t.uint32_t(len(self))
@classmethod
def serialize(self):
return self.encode("utf8").ljust(self._size, b"\x00")
class OTAImageHeader(t.Struct):
MAGIC_VALUE = 0x0BEEF11E
OTA_HEADER = MAGIC_VALUE.to_bytes(4, "little")
upgrade_file_id: t.uint32_t
header_version: t.uint16_t
header_length: t.uint16_t
field_control: t.uint16_t
manufacturer_id: t.uint16_t
image_type: t.uint16_t
file_version: t.uint32_t
stack_version: t.uint16_t
header_string: HeaderString
image_size: t.uint32_t
@property
def security_credential_version_present(self) -> bool:
if self.field_control is None:
return None
return bool(self.field_control & 0x01)
@property
def device_specific_file(self) -> bool:
if self.field_control is None:
return None
return bool(self.field_control & 0x02)