code: async def _i2c_reply(self, data):
          
          # remove the start and end sysex commands from the data
          data = data[1:-1]
          reply_data = []
          # reassemble the data from the firmata 2 byte format
          address = (data[0] & 0x7f) + (data[1] << 7)
  
          # if we have an entry in the i2c_map, proceed
          if address in self.i2c_map:
              # get 2 bytes, combine them and append to reply data list
              for i in range(0, len(data), 2):
                  combined_data = (data[i] & 0x7f) + (data[i + 1] << 7)
                  reply_data.append(combined_data)
  
              # place the data in the i2c map without storing the address byte or
              #  register byte (returned data only)
              map_entry = self.i2c_map.get(address)
              map_entry['value'] = reply_data[2:]
              self.i2c_map[address] = map_entry
              cb = map_entry.get('callback')
              cb_type = map_entry.get('callback_type')
              if cb:
                  # send everything, including address and register bytes back
                  # to caller
                  if cb_type:
                      await cb(reply_data)
                  else:
                      loop = self.loop
                      loop.call_soon(cb, reply_data)
                  await asyncio.sleep(self.sleep_tune)
docs: This is a private message handler method.
          It handles replies to i2c_read requests. It stores the data
          for each i2c device address in a dictionary called i2c_map.
          The data may be retrieved via a polling call to i2c_get_read_data().
          It a callback was specified in pymata.i2c_read, the raw data is sent
          through the callback
  
          :param data: raw data returned from i2c device