В этой части проекта необходимо выполнить статистическую обработку получаемых данных. Для этого потребуются следующие компоненты инфраструктуры:
- В платформе Bluemix реализовать сервис хранения данных в БД dashDB.
- Разработать структуру таблиц базы данных и SQL скрипты для добавления новых данных и удаления устаревших данных.
- Разработать поток Node-Red, реализующий запуск SQL скриптов.
- Выполнить проверку работоспособности потока с использованием консоли административной косноли dashDB.
- Выполнить разработку аналитического скрипта на языке R в среде RStudio.
- Разработать потока обработки Node-Red для запуска R скрипта.
Дополнительная информация:
Краткая справка по командам языка R
Инструкции определения данных на языке DDL
Краткий справочник по командам SQL
К началу этапа рабочая область проекта представляет собой три взаимосвязанных компонента:
- Сервис IoT Foundation для реализации функций брокера MQTT.
- Сервис CloudantDB для хранения настроек IoT Foundation и Node-Red.
- Приложения JavaScript в Node-Red сервере приложений.
Сервис dashDB представляет собой интегрированные компоненты для реализации функций хранения и аналитической обработки данных с помощью языка R. Сервис позволяет создавать и контролировать состояние SQL базы данных dashDB, содержит набор готовых скриптов на языке R, позволяет создавать и отлаживать пользовательские скрипты.
Выполним добавление сервиса dashDB. На вкладке Catalog в секции Data and Analythics необходимо выбрать сервис dashDB.
В следующем окне вводятся поля Dev, App, Service. Все поля кроме App можно оставить без изменений. В поле App в выпадающем списке выберете имя вашего приложения Node-Red. Cвязывание позволит выполнять обращения к dashDB со стороны приложений Node-Red (можно выполнить связывание позднее).
Связывание dashDB с приложением Node-Red.
Нажмите кнопку Create. После создания сервиса появится возможность перейти в консоль управления. Для этого нажмите на кнопку Launch.
Для работы с сервисом необходимо определить параметры:
- User ID
- Host name
- Password
Указанная информация доступна на вкладке Connect в пункте Connect Information. Указанная информация понадобится впоследствии.
Параметры для подключения к сервису dashDB.
На вкладке Tables объединены функции управления структурой базы данных. При создании сервиса автоматически создается новая база с именем, совпадающим с полем User ID (в примере: DASH105325).
Добавим в базу таблицу TEMP для хранения данных.
Для этого необходимо выбрать пункт Add Table и в открывшемся окне ввести код DDL.
CREATE TABLE TEMP (
TIME BIGINT NOT NULL PRIMARY KEY,
TEMP DOUBLE NOT NULL
);Поле TIME предусмотрено для хранения метки времени.
В приложении Node-Red необходимо связать блок IoT Foundation с функциональными блоками, формирующими структуру объекта payload, после чего передать его в блок output/dashdb. В блоке dashDB указать поле Service dashDB-xx (название сервиса dashDB).
Поток обработки для записи данных в dashDB.
Обратите внимание, что в функциональных блоках название ключей в структуре payload должно совпадать с полями таблицы базы данных.
Например:
msg.payload = {
TIME: Date.now(),
TEMP: msg.payload
};
return msg;Проверим работоспособность приложения (кнопка Deploy). В консоли управления dashDB на вкладе Tables выберете таблицу TEMP и Browse Data. Данные от сенсоров должны быть выбаны на экран.
Проверка работоспособности скриптов SQL в консоли dashDB.
Все полученные данные накапливаются в таблице TEMP. Так как время аналитической обработки зависит от объемов данных, выполним удаление устаревших строк из таблиц. Для этого добавим следующий поток обработки, содержащий SQL скрипты
Удаление устаревших данных из таблиц dashDB.
Скрипт для удаления данных старше одного часа:
DELETE FROM TEMP WHERE TIME <= (SELECT MAX(TIME) FROM TEMP) - 3600000;В консоли dashDB перейти в пункты Analythics и далее R Scripts. Выбрать пункт RStudio.
Ввод User ID и Password для входа в RStudio.
В результате будет открыто окно RStudio, в котором может выполняться пошаговая отладка команд на языке R.
Подробнее о работе с IDE RStudio можно узнать тут
Выполним следующий скрипт (скрипт может быть вставлен в окно Console):
library(ibmdbR)
mycon <- idaConnect("BLUDB", "", "")
idaInit(mycon)
# Загрузить данные из таблицы (запись данных в таблицу осуществляется также SQL запросом)
data <- idaQuery('SELECT TIME, TEMP from TEMP', as.is = FALSE)
fit <- lm(TEMP ~ TIME, data)
# Предсказать на минуту вперёд
new <- data.frame(TIME = max(data$TIME) + 60000)
new$TEMP = predict(fit, new)
cat(new$TEMP)
В результате скрипт будет выполнен, а все использованные фреймы могут быть проанализированы на вкладке Environment.
Для автоматического запуска разработанного скрипта необходимо сохранить его в рабочем пространстве проекта. Для этого необходимо перейти в консоль управления dashDB в пункт Analythics и пункт RScripts. Далее необходимо создать новый скрипт (+) и выполнить вставку кода R. Сохраним скрипт под именем predict.r.
Также можно выполнить тестовый запуск скрипта, нажав на кнопку Submit.
В редакторе NodeRed создайте следующий поток:
URI creator нужен для составления запроса:
var source = encodeURIComponent('source("~/predict.r")');
msg.payload = 'cmd=RScriptRunScript&command='
+ source
+ '&fileName=&profileName=BLUDB&userid=dash107216';
msg.headers = {'content-type': 'application/x-www-form-urlencoded'};
return msg;В данном коде необходимо заменить dash107216 на user ID пользователя dashDB (например DASH015794).
В данном узле необходимо выбрать способ аутентификации ([v] Use basic authentication?), в поле URL выставить правильный host name адрес dashDB приложения, в полях Username и Password указать значения user ID и password из настроек dashDB. Интервал запуск задается в начальном узле. Для этого в поле Repeat нужно указать временной интервал между генерацией сообщений (например, 20 секунд).
Разумно отображать предиктивную прямую на том же графике, что и актуальную информацию о температуре.
Добавим в функцию socket.onmessage обработку потока предиктивных данных:
switch (item.topic) {
case 'temperature':
// ...
case 'predicted':
processPredicted(item.data);
break;
}И добавим поток в инициализацию библиотеки для графиков:
var actual = [{x: new Date}];
var predicted = [];
var chart = new CanvasJS.Chart($graph, {
axisX: {title: "Timeline"},
axisY: {title: "Temperature"},
data: [{
type: "spline",
dataPoints: actual
}, {
type: "line",
dataPoints: predicted,
lineThickness: 1,
lineDashType: 'dashDot'
}]
});Будем отображать предиктивные данные как прямую от текущей точки к предсказанной. Поэтому predicted всегда будет содержать только две точки. Предсказанная точка корректируется каждый раз при поступлении новых предиктивных данных:
function processPredicted(temp) {
predicted[1] = {
x: new Date(Date.now() + 60 * 1000),
y: temp
};
chart.render();
}А текущая (predicted[0]) при поступлении актуальных:
function processTemp(temp) {
// ...
actual.push(point);
predicted[0] = point;
chart.render();
}






