def __init__( self, command_type: int, subsystem: int, command_id: int, data: bytes, length=None, fcs=None, ): self.type = t.CommandType(command_type) self.subsystem = t.Subsystem(subsystem) self.command_id = command_id self.data = data self.length = length self.fcs = fcs
def handle_znp(self, obj: ZpiObject): if obj.command_type != t.CommandType.AREQ: return frame = obj.to_unpi_frame() nwk = obj.payload["srcaddr"] if "srcaddr" in obj.payload else None ieee = obj.payload["ieeeaddr"] if "ieeeaddr" in obj.payload else None profile_id = zha.PROFILE_ID src_ep = 0 dst_ep = 0 lqi = 0 rssi = 0 if obj.subsystem == t.Subsystem.ZDO and obj.command == "endDeviceAnnceInd": nwk = obj.payload["nwkaddr"] LOGGER.info("New device joined: 0x%04x, %s", nwk, ieee) self.handle_join(nwk, ieee, 0) obj.sequence = 0 if obj.command in IGNORED: return if obj.subsystem == t.Subsystem.ZDO and obj.command == "mgmtPermitJoinRsp": self.set_led(LedMode.On) if obj.subsystem == t.Subsystem.ZDO and obj.command == "permitJoinInd": self.set_led(LedMode.Off if obj.payload["duration"] == 0 else LedMode.On) return if obj.subsystem == t.Subsystem.ZDO and obj.command in REQUESTS: if obj.sequence is None: return LOGGER.debug("REPLY for %d %s", obj.sequence, obj.command) cluster_id, prefix_length = REQUESTS[obj.command] tsn = bytes([obj.sequence]) data = tsn + frame.data[prefix_length:] elif obj.subsystem == t.Subsystem.AF and (obj.command == "incomingMsg" or obj.command == "incomingMsgExt"): # ZCL commands cluster_id = obj.payload["clusterid"] src_ep = obj.payload["srcendpoint"] dst_ep = obj.payload["dstendpoint"] data = obj.payload["data"] lqi = obj.payload["linkquality"] else: LOGGER.warning( "Unhandled message: %s %s %s", t.CommandType(obj.command_type), t.Subsystem(obj.subsystem), obj.command, ) return try: if ieee: device = self.get_device(ieee=ieee) else: device = self.get_device(nwk=nwk) except KeyError: LOGGER.warning("Received frame from unknown device: %s", ieee if ieee else nwk) return device.radio_details(lqi, rssi) LOGGER.info("handle_message %s", obj.command) self.handle_message(device, profile_id, cluster_id, src_ep, dst_ep, data)