async def broadcast( self, profile, cluster, src_ep, dst_ep, grpid, radius, sequence, data, broadcast_address=zigpy.types.BroadcastAddress.RX_ON_WHEN_IDLE): req_id = self.get_sequence() LOGGER.debug( "Sending Zigbee broadcast with tsn %s under %s request id, data: %s", sequence, req_id, binascii.hexlify(data)) dst_addr_ep = t.DeconzAddressEndpoint() dst_addr_ep.address_mode = t.uint8_t(t.ADDRESS_MODE.GROUP.value) dst_addr_ep.address = t.uint16_t(broadcast_address) with self._pending.new(req_id) as req: try: await self._api.aps_data_request(req_id, dst_addr_ep, profile, cluster, min(1, src_ep), data) except zigpy_deconz.exception.CommandError as ex: return ex.status, "Couldn't enqueue send data request for broadcast: {}".format( ex) r = await asyncio.wait_for(req.result, SEND_CONFIRM_TIMEOUT) if r: LOGGER.warning( "Error while sending %s req id broadcast: 0x%02x", req_id, r) return r, "broadcast send failure" return r, "broadcast send success"
def _api_frame(self, cmd, *args): schema = TX_COMMANDS[cmd] d = t.serialize(args, schema) data = t.uint8_t(cmd).serialize() self._seq = (self._seq % 255) + 1 data += t.uint8_t(self._seq).serialize() data += t.uint8_t(0).serialize() data += t.uint16_t(len(d) + 5).serialize() data += d return data, self._seq
async def request(self, nwk, profile, cluster, src_ep, dst_ep, sequence, data, expect_reply=True, timeout=10): LOGGER.debug("Zigbee request with id %s, data: %s", sequence, binascii.hexlify(data)) assert sequence not in self._pending send_fut = asyncio.Future() reply_fut = None if expect_reply: reply_fut = asyncio.Future() self._pending[sequence] = (send_fut, reply_fut) dst_addr = t.DeconzAddress() dst_addr.address_mode = t.uint8_t(t.ADDRESS_MODE.NWK.value) dst_addr.address = t.uint16_t(nwk) await self._api.aps_data_request(sequence, dst_addr, dst_ep, profile, cluster, min(1, src_ep), data) try: r = await asyncio.wait_for(send_fut, SEND_CONFIRM_TIMEOUT) except asyncio.TimeoutError: self._pending.pop(sequence, None) LOGGER.warning( "Failed to receive transmit confirm for request id: %s", sequence) raise if r: LOGGER.warning("Error while sending frame: 0x%02x", r) if not expect_reply: self._pending.pop(sequence, None) return try: return await asyncio.wait_for(reply_fut, timeout) except asyncio.TimeoutError: self._pending.pop(sequence, None) raise
def nwk(): return t.uint16_t(0x0100)