/// <summary>
        /// ЛИЧНЫЙ КАБИНЕТ Вернуть страницу со списком тревожных сообщений
        /// Возращает список всех тревожных сообщений (event)
        /// Информацию о конфигурации (config)
        /// Информацию о текущем состоянии устройства (сделать автообновление) (head_state)
        /// Информацию о конфигурационной таблице устройств (head_table)
        /// Информацию об адресе из конфигурации (address)
        /// </summary>
        /// <param name="page"></param>
        /// <returns></returns>
        public ActionResult Index(int?page, int?idHead, string type = "all")
        {
            // !!! запрос происходит не с ObjectCardIndex а с GetEventData // check // временно передавать в модель тип текущих сообщений
            int _idHead      = idHead == null ? 1 : (int)idHead;
            var dvHeadEvents = db.DvHeadEvents.Include(e => e.DvHead).Where(e => e.DvHead.Id.Equals(_idHead)).ToList();
            var pageNumber   = (page ?? 1);
            var pageSize     = 6;

            // получить таблицы подключенных устройств
            TablesDto tablesDto = tableService.RequestDeviceTables(_idHead);

            if (tablesDto.Failure)
            {
                return(HttpNotFound());
            }
            ;

            // узнать состояние DV-HEAD OMEGA
            HeadState headState = stateService.RequestLastStateById(_idHead);

            // TODO Config и Address в дальнейшем можно хранить в классе конфигурация приложения

            // в зависимости от типа запрашиваемых данных требуется возвращать обработанные или нет сообщения
            // var events = null; - check
            EventViewModel eventViewModel = new EventViewModel();

            switch (type)
            {
            case "all":
                eventViewModel.Events = dvHeadEvents.OrderByDescending(o => o.Time).ToPagedList(pageNumber, pageSize);
                eventViewModel.Type   = "all";
                break;

            case "crud":
                eventViewModel.Events = dvHeadEvents.Where(o => o.Alarm > 0).OrderByDescending(o => o.Time).ToPagedList(pageNumber, pageSize);
                eventViewModel.Type   = "crud";
                break;

            default:
                eventViewModel.Events = dvHeadEvents.OrderByDescending(o => o.Time).ToPagedList(pageNumber, pageSize);
                eventViewModel.Type   = "all";
                break;
            }

            eventViewModel.ExternalTable      = tablesDto.ExternalTable;
            eventViewModel.ConfigurationTable = tablesDto.ConfigurationTable;
            eventViewModel.DvHead             = tablesDto.DvHead;
            eventViewModel.DvHeadState        = headState;
            eventViewModel.Address            = tablesDto.Address;

            return(View(eventViewModel));
        }
        /// <summary>
        /// Запросить таблицы устройств DV-HEAD OMEGA
        /// </summary>
        /// <param name="id">Идентификатор DV-HEAD</param>
        /// <returns></returns>
        public TablesDto RequestDeviceTables(int id)
        {
            TablesDto tablesDto = new TablesDto();

            try {
                using (MainDbContext dbContext = new MainDbContext()) {
                    HeadTable hd = dbContext.DvHeadTables.Where(t => t.Idhead == id).OrderByDescending(t => t.DgsTime).First();
                    tablesDto.DvHead             = hd.DvHead;
                    tablesDto.ConfigurationTable = ParseConfigTable(hd.ConfigurationTable).OrderBy(s => s); // the original was not sorted
                    tablesDto.ExternalTable      = ParseExternalTable(hd.ConnectedTable, tablesDto.ConfigurationTable);
                    tablesDto.Address            = hd.DvHead.Address;
                    tablesDto.Failure            = false;
                }
            } catch (Exception)
            {
                tablesDto.Failure = true;
            }
            return(tablesDto);
        }