예제 #1
0
    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"
예제 #2
0
 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
예제 #3
0
    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
예제 #4
0
def nwk():
    return t.uint16_t(0x0100)