def METHOD_NAME(self, ds_id, ds_info):
    """Read a GRIB message into an xarray DataArray."""
    if (ds_id['name'] not in self.filename):
        raise IOError("File does not contain {} data".format(ds_id['name']))
    msg = self._get_message(1)
    ds_info = self.get_metadata(msg)
    ds_info['end_time'] = ds_info['data_time']
    if (ds_id['name'] == 'h05' or ds_id['name'] == 'h05B'):
        flen = len(self.filename)
        timedelt = self.filename[flen-10:flen-8]
        ds_info['start_time'] = (ds_info['end_time'] -
                                 timedelta(hours=int(timedelt)))
    else:
        ds_info['start_time'] = ds_info['end_time']
    fill = msg['missingValue']
    data = msg.values.astype(np.float32)
    if msg.valid_key('jScansPositively') and msg['jScansPositively'] == 1:
        data = data[::-1]
    if isinstance(data, np.ma.MaskedArray):
        data = data.filled(np.nan)
        data = da.from_array(data, chunks=CHUNK_SIZE)
    else:
        data[data == fill] = np.nan
        data = da.from_array(data, chunks=CHUNK_SIZE)
    return xr.DataArray(data, attrs=ds_info, dims=('y', 'x'))