Сохранение истории во внешней базе данных

Иногда необходимо сохранить историю переменных во внешей базе данных. Вот несколько шагов, позволяющих осуществить это: установите желаемую базу данных с таблицей для хранения значений, подключите эту базу данных к SberMobile Server и создайте Модель, которая будет слушать изменения переменных и хранить их в этой таблице.

1. Установка внешней базы данных

Мы не будем описывать аспекты управления базой данных, предполагая, что вы с этим знакомы.

Сначала нужно получить базу данных. Можно создать новую базу данных или использовать существующую. Предположим, что имя базы данных - historyDB. Затем необходимо создать таблицу, которая будет сохранять историю переменных. Пусть у таблицы будет имя variable_history и следующие поля:

Имя

Тип

Цель

id

BIGINT

Используется для хранения идентификатора событий изменения переменных. Должен быть типом "число", может содержать длинные значения.

name

CHAR/VARCHAR

Содержит имя пепременной.

time

TIME/TIMESTAMP

Время изменения переменной.

value

FLOAT/DOUBLE

Само значение переменной.

Предлагаются все типы полей, нужно определить соответствующий тип базы данных для каждого поля в соответствии с его целью.

2. Подключение к внешней базе данных

Теперь давайте подключим базу данных к SberMobile Server. Для этого нужно создать для нее учетную запись устройства. Откройте всплывающее меню для узла Device в System Tree и кликните по пункту Add Device.

В диалоге Add Device выберите База данных SQL как Device Driver. Должны появиться следующие поля:

Введите Name и Description для учетной записи устройства, как показано выше. Затем правильно заполните Database URL, эта строка подключения JDBC должна указывать на вашу базу данных. Строка подключения зависит от вашей DBMS. Можно начать редактирование строки, используя один из шаблонов в комбинированной ячейке поля. Для большинства современных баз данных можно пропустить поле Driver Class. Введите учетные данные Username и Password базы данных и нажмите OK. Если параметры верны и соединение установлено, в системе появится учетная запись устройства History Database и отобразится ее диалог Device Properties:

Теперь перейдите во вкладку Queries и добавьте новую запись путем нажатия кнопки Add Row (). Заполните все поля, как показано выше. После сохранения изменений при помощи кнопки OK наше устройство History Database получает настройку variableHistory, которая показывает содержание таблицы variable_history. Вы можете посмотреть значение variableHistory в окне настроек устройства. Оно открывается двойным щелчком по узлу устройства или путем выбора пункта Manage Device во всплывающем меню.

После создания и установки устройства можно взаимодействовать с базой данных, выполняя запросы для учетной записи устройства History Database.

3. Создание модели для извлечения данных

Мы будем использовать модель для прослушивания изменений переменных и записывать данные о событиях в базу данных. Поэтому нужно создать Модель. Откройте всплывающее меню для узла Models и выберите пункт Create, подобный созданию Device Account. Введите Name и Description в диалоге Properties, как показано ниже, и нажмите OK:

Откроется диалог Configuration. Перейдите во вкладку Bindings и нажмите кнопку Add Row (). К таблице Привязки будет добавлена новая привязка. Теперь нужно настроить поля привязки:

Установите ее поля On Startup, On Event и Periodically, как показано выше.

Цель

Оставьте это поле пустым. Мы не хотим добавлять данные события к любой цели. Вместо этого мы просто выполняем запрос обновления базы данных в поле Expression.

Активатор

Сделаем так, чтобы наша привязка прослушивала событие изменения переменных. Щелкните по кнопке [...] поля Активатор. В открывшемся диалоге Activator откройте Event tab, затем локализуйте желаемое устройство для прослушивания и дважды щелкните на событии Context variable changed. Внизу должна появиться ссылка на это событие, например: users.admin.devices.demoVirtualDevice:updated@. Теперь сохраните изменения путем нажатия кнопки OK.

После этого наша привязка будет выполняться каждый раз при изменении любых переменных в Demo Device. Для расчета нашей привязки по конкретным изменениям нужно задать условие.

Условие

Условие будет проверять каждое событие изменения переменных. Когда условие false, событие будет игнорироваться. Поэтому нужно настроить выражение условия на cell({env/value}, 'variable') == 'random'. Это означает, что выражение привязки будет рассчитываться, только когда событие изменения переменных принадлежит переменной random в Demo Device.

Выражение

Выражение рассчитывается каждый раз при вызове привязки и выполнении условия. Откройте Редактор выражений этого поля путем щелчка по кнопке [...]. В открывшемся диалоге Expression Editor задайте выражение для выполнения запроса обновления базы данных. Он выполняется путем вызова функции executeQuery нашей учетной записи устройства History Database. Запрос добавит новую запись к таблице variable_history.

Мы будем использовать функцию языка выражений callFunction(String context, String function, Object parameter1, Object parameter2, ...) для вызова функции executeQuery устройства (1) History Database. Можно найти шаблон этой функции в диалоге, который открывается кнопкой (2) Functions. Параметры следующие:

  • context - путь строки к контексту, откуда вызывается функция. Можно локализовать устройство History Database в дереве (3) Server Data, затем открыть всплывающее меню в соответствующем узле и выбрать действие Copy. После этого можно вставить путь устройства в текст выражения. Поэтому путь к устойству History Database должен быть users.admin.devices.historyDatabase (4)
  • function - имя вызывающей функции. Оно должно быть executeQuery (5). Эта функция принадлежит базе данных SQL History Database context.
  • parameter1 (query) - первый параметр вызывающей функции. Для вызывающей функции executeQuery это строка запроса. Поэтому наш запрос должен быть следующий: insert into variable_history(id, name, time, value) values(..., ..., ..., ...). Реальные значения должны быть введены вместо '...'. Мы получаем реальные значения из среды выражения. В нашем случае он будет хранить параметры события измененной переменной, потому что мы настраиваем эту привязку для расчета при событии. {env/id} ссылается на идентификатор события. cell({env/value}, "variable") получает имя переменной из данных событий. formatDate({env/time}, "YYYY-MM-dd HH:MM:s.SS") берет форматы и время событий в приемлемую временную строку базы данных . cell(cell({env/value}, "value"), "value") получает измененное значение из данных событий, берет таблицу, которая является измененной переменной value и получает поле value значения переменной (6).
  • parameter2 (update) - второй параметр executeQuery указывает, является ли этот запрос запросом обновления. В нашем случае это true, т.е. запрос должен возвращать любое значение (7).

Примените выражение путем нажатия кнопки OK и нажмите кнопку OK в предыдущем диалоге Model Configuration для сохранения наших изменений привязок в модели.

Теперь, если все сделано правильно, изменения переменной Demo Device's random начнут сохраняться в таблице value_history базы данных historyDB.

Можно проверить, если ли ошибки выполнения привязки, просматривая относящиеся к модели события External Event Storage. Просто выберите Monitor Related Events из всплывающего меню модели в System tree. Открывшийся Журнал событий можно использовать для отладки в режиме реального времени.

4. Просмотр результатов

Наконец, вы можете изучить свои результаты, открывая настройки History Database. Дважды щелкните на узле History Database в System Tree. Настройка Variable History должна содержать примерно следующие данные: