Содержание


Сокращение расхода воды с помощью "Интернета вещей", часть 3

Настройте показатели датчиков в Cloudant для ответов на запросы клиентов и создайте приложение HTML5 для вывода данных в виде графика

Comments

Последний учебник в серии из трех учебников описывает построение и настройку системы сокращения расхода воды — монитора увлажненности грунта комнатных растений, — который работает в "Интернете вещей". В первой части было настроено оборудование и использовано решение Internet of Things Foundation Starter среды IBM Bluemix™ для создания приложения Node-RED, которое сохраняет поступающие показатели датчиков в базе данных Cloudant и отправляет их оттуда в Twitter. Во второй части была настроена защита приложения Node-RED и автоматическое развертывание изменений из хранилища кода DevOps Services в среде Bluemix.

На последнем шаге будет создан API открытых данных, чтобы обеспечить доступ к данным в хранилище данных Cloudant. Затем будет использована библиотека JavaScript Data-Driven Documents (D3.js) для создания приложения HTML5, обеспечивающего наглядное представление показателей датчиков на рабочих станциях и мобильных устройствах:

page
page

Приложению-клиенту будет предоставлен доступ к данным для создания графика, отражающего результаты чтения показателей температуры, влажности и давления отдельного датчика за последние x дней.

Что потребуется для создания системы

  • Учетная запись Bluemix и учетная запись DevOps Services, связанные с вашим идентификатором в IBM.
  • Необходимо выполнить все действия из первой части и второй части этой серии учебников.
  • Знание HTML и JavaScript

Запустите приложениеПолучите код

Шаг 1. Подготовка хранилища данных Cloudant

На этом шаге показатели датчиков из базы данных Poseidon Cloudant необходимо сделать доступными в формате, который поддерживается клиентом. В частности, приложению-клиенту необходимо предоставить данные для создания графика, отражающего результаты чтения показателей температуры, влажности и давления отдельного датчика за последние x дней.

В настоящее время каждый показатель датчика хранится в базе данных в следующем формате:

{"_id":"f15b90c35ac432034b7d08d628f204f9","_rev":"2-9d58792b0ad4e39116572ac811a2d509",
"temperature":21.74,"timestamp":"2014-09-11T20:49:03.950070",
"altitude":167703.6,"clientID":"ExamplePlantSensor",
"pressure":1021.52,"longitude":4.8,"moisture":699,"latitude":50.2}

По умолчанию все показатели отсортированы по ИД (_id). В первую очередь необходимо создать новое представление базы данных Cloudant, в котором данные сортируются по составному ключу, включающему в себя имя датчика и системное время. После этого можно будет выбирать данные определенного датчика за определенный период времени.

  1. Определите имя хоста, имя пользователя и пароль экземпляра Cloudant:
    1. Войдите в среду Bluemix.
    2. На сводной панели щелкните на значке приложения, созданного в первой части этой серии учебников.
    3. Выберите SDK for Node.js (слева).
    4. Будут показаны переменные среды служб из вашего экземпляра Bluemix. (Их загрузка может занять некоторое время.) В этих переменных указано имя хоста, ИД пользователя и пароль Cloudant, которые потребуются в ходе работы с этим учебником:
      {
         "name": "MyPoseidon3:cloudantNoSQLDB",
         "label": "cloudantNoSQLDB",
         "plan": "Shared",
         "credentials": {
            "username": "f8fe0075-9b65-49c5-bffd-b67c1fe16260-bluemix",
            "password": "11111111111111111111111111111b456b35bd2e609740ae54f83602",
            "host": "f8fe0075-9b65-49c5-bffd-b67c1fe16260-bluemix.cloudant.com",
            "port": 443,
            "url": "https://f8fe0075-9b65-49c5-bffd-b67c1fe16260-bluemix:
            801e32c10276a103abb374284d34a9bdfad91b456b35bd2e609740ae54f83602@f8fe0075-9b65-
            49c5-bffd-b67c1fe16260-bluemix.cloudant.com"
         }
      }

      Сохраните этот код в файле, который вам будет удобно открыть для копирования и вставки информации.
  2. Создайте представление хронологии в Cloudant:
    1. На сводной панели экземпляра Bluemix выберите службу Cloudant.
    2. Нажмите Launch (Запустить) для загрузки административного пользовательского интерфейса для экземпляра Cloudant.
    3. Выберите poseidonsensors.
    4. Щелкните на символе + рядом с узлом All Design Docs (Все документы эскиза) и выберите New View (Новое представление): Скриншот результатов graph that plots monitor
      Скриншот результатов graph that plots monitor
  3. Заполните поля формы нового представления:
    • В поле Save to Design Document (Сохранить в документе эскиза) выберите New document (Новый документ).
    • В поле _/design введите значение sensors.
    • В поле Index name (Имя индекса) введите значение history.
    • Выберите значение None (Нет) в необязательном параметре Reduce (Сократить).
    • В поле Map function (Функция преобразования) введите следующее:
      function(doc) { 
         if(doc.clientID && doc.timestamp) {
            sensor_values = [0, 0, 0];
            if (doc.temperature) {
                  sensor_values[0] = doc.temperature;
            }
            if (doc.moisture) {
                  sensor_values[1] = doc.moisture;
            }
            if (doc.pressure) {
                  sensor_values[2] = doc.pressure;
            }      
            emit([doc.clientID, doc.timestamp], sensor_values);
        }
      }
  4. Нажмите Save & Build index (Сохранить и создать индекс): Скриншот  Save & Build Index dialog box
    Скриншот Save & Build Index dialog box
  5. Протестируйте новое представление, перейдя по адресу:

    https://хост/poseidonsensors/_design/sensors/_view/history

    Например: https://f8fe0075-9b65-49c5-bffd-b67c1fe16260-bluemix.cloudant.com/poseidonsensors/_design/sensors/_view/history).

    Укажите имя пользователя и пароль, сохраненные на шаге 1d. (На шаге 2 эти данные будут настроены как открытые данные, для доступа к которым не требуется указывать имя пользователя и пароль.)

    Следующий запрос возвращает все документы:

    Скриншот списка документов documents
    Скриншот списка документов documents
  6. Для ограничения размера списка укажите начальное и конечное время в параметрах startkey и endkey . URL будет иметь следующий формат:

    https://хост/poseidonsensors/_design/sensors/_view/history?startkey=[ИД-датчика, дата и время]&endkey=[ИД-датчика,дата и время]

    Например: https://f8fe0075-9b65-49c5-bffd-b67c1fe16260-bluemix.cloudant.com/poseidonsensors/_design/sensors/_view/history?startkey=["BramPlantSensor", "2014-10-10T00:00:00.000000"]&endkey=["BramPlantSensor", "2014-11-10T00:00:00.000000"]
  7. Выйдите из Cloudant и снова войдите в систему для обновления административного пользовательского интерфейса. Теперь представление history будет показано в списке представлений: Скриншот списка
    Скриншот списка
  8. Представление history возвращает все данные, необходимые для создания графика, однако для более компактного представления данных их можно преобразовать в формат CSV (с помощью функций создания списков CouchDB):
    1. Выберите All Design Docs (Все документы эскиза) в административном интерфейсе Cloudant.
    2. Нажмите Edit (Изменить) для редактирования документа эскиза, созданного на этом шаге.
    3. Добавьте следующий код в документ эскиза непосредственно после кода представления history :
      "lists" : {
         "csv" : "function(head, req){ start({ 'headers': { 'Content-Type': 'text/csv' } }); 
      send('timestamp,temperature,moisture,pressure\\u000A'); while(row = getRow()){ 
      send(row.key[1] + ',' + row.value[0] + ',' + row.value[1] + ',' + row.value[2] + 
      '\\u000A'); } }"
        }
  9. Протестируйте новое представление lists в веб-браузере, указав URL следующего формата:
    https://хост/poseidonsensors/_design/sensors/_list/csv/history?startkey=[ИД-датчика, дата и время]&endkey=[ИД-датчика,дата и время]

    Например: https://f8fe0075-9b65-49c5-bffd-b67c1fe16260-bluemix.cloudant.com/poseidonsensors/_design/sensors/_list/csv/history?startkey=["BramPlantSensor", "2014-10-10T00:00:00.000000"]&endkey=["BramPlantSensor", "2014-11-10T00:00:00.000000"]

    При вводе URL будет показан файл CSV с показателями датчиков: Скриншот CSV file contents
    Скриншот CSV file contents

Этот шаг завершен. Хранилище данных полностью подготовлено.

Шаг 2. Создание API

Теперь необходимо разработать два API, позволяющие приложению визуализации получить данные. Первый API возвращает список доступных датчиков, а второй - возвращает показатели определенного датчика. В следующей таблице приведена спецификация этих API:

URLПараметрыОписание
/sensors Без параметров Возвращает список всех датчиков в формате JSON. Например:
[
{"name":"BramPlantSensor"},
{"name":"KaiPlantSensor"},
{"name":"KaisGrove"},
{"name":"TheGruPi"},
{"name":"TheGruSensor"}
]
/sensors/{датчик}/history Возвращает список в формате CSV, содержащий показатели указанного {датчика}. По умолчанию возвращаются результаты за последние 14 дней, однако эту продолжительность можно переопределить.
API history возвращает список в формате CSV, содержащий хронологию показателей датчика, включающую в себя системное время, температуру, влажность и давление.
Например:
timestamp,temperature,moisture,pressure
2014-10-26T22:14:42.733658,21.14,304,1022.69
2014-10-26T23:44:47.624428,20.74,372,1022.16
2014-10-27T00:44:50.906463,20.63,380,1021.98
2014-10-27T01:14:52.528547,20.5,335,1022.1
2014-10-27T02:14:55.786745,20.39,343,1022.29
2014-10-27T04:45:03.834080,20.1,271,1022.58
2014-10-27T05:45:07.169473,20.87,323,1022.74
датчик Имя (уникальный ИД) датчика
число дней Необязательно. Число дней, за которое необходимо вернуть данные о показателях датчика

Реализуйте API с помощью Node-RED:

  1. Откройте хранилище PoseidonProject DevOps Services и скопируйте содержимое файла /Tutorial3/Node-red/API_cloudant_proxy_flow.json в буфер обмена.
  2. Перейдите на страницу вашего приложения Bluemix и нажмите Go to your Node-RED flow editor (Перейти к редактору потока Node-RED).
  3. Нажмите + для создания нового рабочего листа, дважды щелкните на вкладке и переименуйте рабочий лист в REST API.
  4. Выберите пункты Import (Импортировать) > Clipboard (Буфер обмена) в меню, вставьте код, нажмите Ok и разместите поток прокси в произвольном месте на рабочем листе.
  5. Щелкните на каждом из узлов "HTTP in" (Sensor History и Sensor List ) для просмотра его конфигурации на вкладке информации.
  6. Отредактируйте каждый из двух узлов функций Convert To Cloudant URL (для этого дважды щелкните на узле) и измените значение переменной cloudantHost на имя хоста вашего экземпляра Cloudant.
  7. Измените узел Cloudant GET для использования простой идентификации:
    • Оставьте поле URL пустым (URL предоставляется предыдущим узлом).
    • Включите переключатель Use basic authentication? (Использовать простую идентификацию?).
    • В поле Username (Имя пользователя) введите имя пользователя своего экземпляра Cloudant.
    • В поле Password (Пароль) введите пароль своего экземпляра Cloudant.
  8. Просмотрите свойства узла функции Add CORS Header и узла HTTP Response.
  9. Нажмите Deploy (Развернуть) для активации этого потока прокси.
  10. Протестируйте работу API list-sensors, перейдя по адресу http://хост-poseidon /sensors (например, http://poseidon.mybluemix.net/sensors). Будет показан список датчиков в формате JSON.
  11. Протестируйте работу API retrieve-history, перейдя по адресу http://хост-poseidon/sensors/ИД-датчика/history (например, http://poseidon.mybluemix.net/sensors/BramPlantSensor/history). Будет показан список значений датчика в формате CSV.

Ваши API открытых данных готовы к использованию без идентификации.

Шаг 3. Создание приложения HTML5 с помощью D3.js

  1. Экспортируйте код HTML5 на свой компьютер:
    1. Перейдите в хранилище PoseidonProject DevOps Services.
    2. Нажмите EDIT CODE (ИЗМЕНИТЬ КОД). (При необходимости войдите в систему.)
    3. Перейдите в Tutorial3/node-app/public, щелкните правой кнопкой мыши на папке public в дереве проекта и выберите пункт Export (Экспортировать) > Zip.
  2. Импортируйте код в текущую среду Bluemix:
    1. Перейдите в хранилище DevOps Services текущего экземпляра Bluemix. Если вы не помните его имя, откройте сводную панель Bluemix и нажмите EDIT CODE (ИЗМЕНИТЬ КОД): Скриншот app instance in the Bluemix dashboard
      Скриншот app instance in the Bluemix dashboard
    2. Перейдите в //public. Щелкните правой кнопкой мыши на папке public и выберите пункт Import File or Zip archive (Импортировать файл или архив Zip). (По умолчанию операция импорта не заменяет имеющиеся файлы, поэтому будет показано сообщение об ошибке. Вам требуется только добавить файл, поэтому это сообщение можно проигнорировать.)
  3. Зафиксируйте файлы в Git, чтобы запустить процесс автоматического развертывания:
    1. В редакторе кода проекта DevOps Services щелкните на значке Git (второй значок сверху в левой области окна).
    2. Выберите все изменения.
    3. Введите сообщение о фиксации (например, new html5 app) и нажмите кнопку COMMIT (ЗАФИКСИРОВАТЬ).
    4. Нажмите кнопку SYNC (СИНХРОНИЗИРОВАТЬ) для передачи и синхронизации зафиксированных обновлений. При выполнении этого действия запускается автоматическое развертывание.
    5. Проверьте состояние развертывания, нажав кнопку BUILD & DEPLOY (СКОМПОНОВАТЬ И РАЗВЕРНУТЬ) на странице обзора проекта.
  4. Протестируйте работу приложения, перейдя по адресу http://хост-poseidon/sensors.html (например, http://poseidon.mybluemix.net/sensors.html). Будет показан список датчиков, которые уже отправили данные о показателях: Screenshot of the list of sensors
  5. Щелкните на одном из датчиков для просмотра графика, созданного с помощью D3.js.

Серия учебников - Заключение

В последнем учебнике было рассказано о том, как создать настроенные представления в Cloudant и создать API, играющий роль прокси, с помощью Node-RED. Было создано приложение, которое использует API и показывает график показателей датчика.

Надеемся, вам понравилась эта серия учебников проекта Poseidon. Мы призываем вас внести свой вклад и усовершенствовать код. Например, можно настроить отправку уведомлений, когда требуется полив растения. Хорошей отправной точкой может послужить учебник " Автоматическая отправка уведомлений о передаче с помощью Node-RED и службы IBM Bluemix Push."


Ресурсы для скачивания


Похожие темы


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Облачные вычисления, Web-архитектура, Open source
ArticleID=994482
ArticleTitle=Сокращение расхода воды с помощью "Интернета вещей", часть 3
publish-date=02102015