TempoIQ

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 11:19, 5 марта 2019.
TempoIQ
TempoIQ-logo-1.png
Разработчики: TempoIQ Inc.
Выпущена: 1.0.0 // 19 December 2014 года; 5 years ago (2014-12-19)
Постоянный выпуск: 1.2.0 / 21 April 2015 года; 4 years ago (2015-04-21)
Предыдущий выпуск: 1.1.0 / 3 March 2015 года; 4 years ago (2015-03-03)
Состояние разработки: Разработка прекращена
Операционная система: Кросс-платформенное программное обеспечение
Локализация: English
Тип ПО: [Облачное хранилище данных], Мониторинг, Бизнес аналитика
Лицензия: MIT
Веб-сайт www.tempoiq.com

TempoIQ (ранее TempoDB) — облачная база данных для визуализации данных с датчиков (например, промышленных или датчиков для устройств в системах, использующих парадигму Internet of Things (IoT) — интернет вещей), разработанная совместными усилиями Wilson Athletic, Danfoss Drives, Bison Engineering, Silicon Engines и другими инновационными компаниями на промышленном рынке. Стартап работал исключительно на корпоративном рынке с коммерческими клиентами, основными клиентами являлись компании по переработке и транспортировке нефти и газа, а именно сервисы, которые собирают информацию с датчиков в нефтяной, газовой, энергетической (основанной на солнечной энергии) и медицинской отраслях. С помощью этого продукта клиенты собирают, анализируют и перерабатывают информацию, поступающую с датчиков, формируя картину происходящего на фронте событий. Благодаря этим данным TemoIQ получает сведения, необходимые для выработки рекомендаций для передачи их специалистам, которые работают в компаниях конечных клиентов организации.

Обзор

TempoIQ построен на основе облачной архитектуры CODA четвертого поколения, что позволяет быстро создавать и запускать приложение IoT без сложной инфраструктуры или интеграции с IT.Расширяется через API для подключения, анализа, оповещения и визуализации,где можно построить TempoIQ в индвидуальное приложение с возможностью добавления новых функций с течением времени.
В 2013 году публично себя анонсировал MemSQL, в противовес к нему выходит TempoIQ, заточенная под данные, ранжирующиеся по времени. Т.е. высокая частота новых записей от различных датчиков, счетчиков и сенсоров, на выходе же в основном требования к визуализации в плане графиков и определения отклонений. Стартап работал сугубо на корпоративном рынке, основные клиенты – нефть, газ, "солнечные" поставщики. В TempoIQ всего работало от 11 до 50 человек, где доходность компании составляло до 3.3млн долларов.[Источник 1] TempoIQ обеспечивает мониторинг, анализ и хранение данных датчиков для бизнес-приложений. [Источник 2] В другой сервисной платформе TempoIQ отказались от Hadoop в пользу создания собственного механизма хранения с большим коэффициентом сжатия. Пользователь может комбинировать, агрегировать и формировать сводные данные по своему желанию. Также в TempoIQ были реализованы «виртуальные сенсоры», которые поставляли данные, производные от тех, которые собраны от настоящих сенсоров, и хранятся в БД.[Источник 3] Некоторе время разработчики TempoIQ вели работу над реализацией прогнозирования и принятия решений (в сотрудничестве с компанией Numenta, выполняющей разработки в области искусственного интеллекта). Цель данных работ — формулировка для пользователя предложений, что они должны делать исходя из полученных данных. В настояшее время стартап TempoIQ с 2016 года не демонстрирует признаков жизни.

Сервисы используемые TempoIQ

ViewIQ

View Composer - c помощью View Composer можно создавать облачные информационные панели, приложения и визуализации IoT в режиме реального времени без необходимости совместного использования платформы для команды, компании и клиентов. За счёт модульности и расширяемости, хорошо выполнена интегрированность визуальных данных IoT в реальном времени, которая может быть представленна, как собственная панель иснтрументов так и на веб-сайте или в приложение гибкого API представления.

AnalyzeIQ

Analyze IQ — пакет продуктов, включённый в TempoIQ и предназначенный для получения и обработки хемометрических данных (хемометрика — раздел аналитической химии, ставящий целью получение химических данных с помощью математических методов обработки и добычи данных). По заявлению разработчиков, Analyze IQ является наиболее продвинутым средством для обработки таких данных.

Рисунок 1 - Пример использования в TempoDB

Analyze IQ Lab

С помощью Analytic Composer конечный пользователь может создавать собственные аналитические потоки, которые в режиме реального времени находят данные IoT-устройств, которые, в свою очередь, автоматически сохраняются в DataIQ и отправляются в приложение. Smart Alerts- функция дающая возможность создания оповещения, которые непрерывно отслеживают поток данных и аналитики IoT, предупреждающих о неожиданных изменениях или критических условиях в режиме реального времени.

DataIQ

DataIQ — это инструмент для автоматического сохранения данных и аналитики IoT, создание загружаемых отчётов для дальнейшего обмена и анализа. Этот инструмент масштабируется в соответсвии с потребностями IoТ-приложений со встроенной защитой частного облака

Рисунок 2 - Логотип DataIQ

ConnectIQ

API-интерфейс Connect на основе данных событий позволяет подключаться к любому устройству IoT из любого места и начинать потоковую передачу данных мгновенно, без предварительной подготовки или предварительно определенных схем. Гибкий и масштабируемый ConnectIQ предлагает гибкие возможности подключения и поддержки протоколов по HTTP с защитой SSL и MQTT, которые можно масштабировать от 1 до миллионов подключенных устройств IoT.


Организация данных

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

Каждый датчик хранит ряд числовых значений. Датчики группируются в устройство.

Рисунок 3 - Модель датчиков

Некоторые примеры устройств и датчиков, которые могут быть в приложении:

  • Прибор: термостат, термометр и т.д.
  • Датчики(какие параметры снимают): температуры, влажности


После того, как датчики сгруппированы в устройства, есть возможность дополнительно организовать устройства и датчики, пометив их атрибутами (пары ключ / значение). Можно добавить бирку к прибору как, “location=home”, или можно добавить бирку к датчику типа "unit = celsius".


Благодаря гибкости атрибутов можно создавать иерархии между устройствами или произвольными группировками датчиков. Это очень удобно при при выполнении запросов позже. Можно задать вопрос, например: "дайте мне максимальную температуру в месте = домой на почасовой основе за последнюю неделю”(текст запроса приведён на русском, для упрощения понимания технологии).

Пример

Рисунок 4 - Скриншот установки приложения

Объекты-данные

TempoIQ использует простую двухуровневую иерархию данных, состоящую из устройств и датчиков.

Рисунок 5 - Модель датчиков

Устройства

Устройство[Источник 4] , как правило, соответствует дискретному физическому блоку, который имеет один или больше связанных датчиков.
Например: солнечные панели, транспортные средства или активные мониторы.
Каждое устройство имеет глобальный уникальный ключ. Ключи устройств включают серийные номера, UUID и другие идентификаторы, которые не изменяются и не конфликтуют с другими устройствами.
В дополнение к ключу можно определять свои атрибуты на устройстве. Атрибуты позволяют добавлять дополнительные метаданные на устройства и создавать аналитическую сводку путем запроса анализа сразу нескольких устройств. Примеры возможных атрибутов включают: идентификатор пользователя, географический регион и номер модели устройства. Наконец, при необходимости устройство может иметь заданное пользователем имя. Имя не используется в самом TempoIQ, но есть возможность использовать его в конкретном применении для пользовательского дисплея.

Датчики

Датчик[Источник 5] это специалихированный прибор который измеряет только один параметр.

Например: влажность, температура, напряжение тока ДК или скорость ветра.


Датчик необходим для того чтобы иметь уникальный ключ внутри своего прибора. Аппаратура наблюдения ссылаются на ключ прибора в сочетании с ключом датчика. В дополнение к ключу, есть возможность определить дополнительные атрибуты на датчике. Атрибуты датчика должны описывать специфику датчика, а не устройства в целом. Примеры возможных атрибутов датчиков: единица измерения, смещение калибровки или местоположение датчика (если не применяется к общему устройству). К примеру сейчас очень популярны умные дома, где используются термостаты для определения температуры в доме. Каждую минуту термостаты регистрируют следующие значения для TempoIQ:


  • temp1-температура пола
  • temp2-температура второго этажа (если применимо)
  • hym-влажность основного пола

Индивидуальный термостат соответствует прибору в TempoIQ. Каждый прибор будет иметь два или три датчика, в зависимости от того, настроен ли temp2.

Здесь (Рисунок 6) представленны прибор, датчики, и атрибуты термостата в модели внутри TempoIQ:

Рисунок 6 - Пример описания данных термостата в TempoIQ

Создание устройства

createDevice(device)

HTTP Endpoint: POST /v2/devices

Аргумент: device (Device) – создание "device"

Возвращаемое значение: "Device" that was created

1) Реализация на языке Python

from tempoiq.protocol.device import Device
from tempoiq.protocol.sensor import Sensor
import tempoiq.response

temp_sensor = Sensor("temperature")
humid_sensor = Sensor("humidity")

device = Device("thermostat.0",
                attributes={"model": "v1"},
                sensors=[temp_sensor, humid_sensor])
response = client.create_device(device)

if response.successful != tempoiq.response.SUCCESS:
    print("Error creating device!")

2) Реализация на языке Java

// import java.util.*;
// import com.tempoiq.*;
// import org.joda.time.*;

// create device attributes
Map<String, String> attributes = new HashMap<String, String>();
attributes.put("model", "v1");

// create sensors
Sensor sensor1 = new Sensor("temperature");
Sensor sensor2 = new Sensor("humidity");
List<Sensor> sensors = new ArrayList<Sensor>();
sensors.addAll(Arrays.asList(sensor1, sensor2));

// create device with key "thermostat.0" with attributes and sensors
Device device = new Device("thermostat.0", "", attributes, sensors);

// store in TempoIQ
Result<Device> result = client.createDevice(device);

// Check that the request was successful
if(result.getState() != State.SUCCESS) {
  System.out.format("Error creating device! %s", result.getMessage()).println();
}

Поиск устройства

createDevice(device)

HTTP Endpoint: GET /v2/devices

Аргумент: search (Search) –

Возвращаемое значение: "Cursor" на устройстве

1) Реализация на языке Python

from tempoiq.protocol.device import Device
from tempoiq.protocol.sensor import Sensor
from tempoiq.protocol.query.selection import and_, or_

regions = or_([Device.attributes["region"] == "south",
              Device.attributes["region"] == "east"])

result = client.query(Device) \
               .filter(regions) \
               .read()

for dev in result.data:
    print("Got device with key: {}".format(dev.key))

2) Реализация на языке Java

// imoprt com.tempoiq.*;

// create selection for all devices with attribute region in "south" or "east"
Selection selection = new Selection()
  .addSelector(Selector.Type.DEVICES,
      Selector.or(
        Selector.attributes("region", "south"),
        Selector.attributes("region", "east")
      )
  );

Cursor<Device> cursor = client.listDevices(selection);

for(Device device : cursor) {
  System.out.format("device: %s", device.getKey()).println();
  for(Sensor sensor : device.getSensors()) {
    System.out.format("\tsensor: %s", sensor.getKey()).println();
  }
}

Получение устройства

getDevice(key)

HTTP Endpoint: GET /v2/devices/:key

Аргумент: key (String) – ключ устройства

Возвращаемое значение: Устройство с указанным ключом

Реализация на Java

// import com.tempoiq.*;

// get the device with key "thermostat.1"
Result<Device> result = client.getDevice("thermostat.1");

// Check that the request was successful
if(result.getState() != State.SUCCESS) {
  System.out.format("Error getting device! %s", result.getMessage()).println();
}

Обновление устройства

updateDevice(device)

HTTP Endpoint: PUT /v2/devices/:key Аргумент: device (Device) – Устройство, которое нужно обновить Возвращаемое значение: Обновлено... 1) Реализация на языке Python

from tempoiq.protocol.device import Device

result = client.query(Device).filter(Device.key == "thermostat.4").read()
device = result.data.next()

device.attributes["customer"] = "internal-test"
device.attributes["region"] = "east"

client.update_device(device)

2) Реализация на языке Java

// import com.tempoiq.*;

Result<Device> result = client.getDevice("thermostat.4");

// Check that the request was successful
if(result.getState() != State.SUCCESS) {
  System.out.format("Error getting device! %s", result.getMessage()).println();
}

// mutate the device
Device device = result.getValue();
device.getAttributes().put("customer", "internal-test");
device.getAttributes().put("region", "east");

// update in TempoIQ
result = client.updateDevice(device);

if(result.getState() != State.SUCCESS) {
  System.out.format("Error updating device! %s", result.getMessage()).println();
}

Удаление устройств

deleteDevices(search)

HTTP Endpoint: DELETE /v2/devices/

Аргумент: search (Search) – Поиск устройств по названию

Возвращаемое значение: Число устройств, которые будут удалены

1) Реализация удаления на Python

from tempoiq.protocol.device import Device
result = client.query(Device).filter(Device.key == "thermostat.5").delete()

2) Реализация удаления на Java

// import com.tempoiq.*;

Selection selection = new Selection()
  .addSelector(Selector.Type.DEVICES, Selector.key("thermostat.5"));

Result<DeleteSummary> result = client.deleteDevices(selection);

if(result.getState() == State.SUCCESS) {
  System.out.format("Deleted %d devices.", result.getValue().getDeleted()).println();
} else {
  System.out.format("Error deleting devices! %s", result.getMessage()).println();
}
deleteDevice(key)

HTTP Endpoint: DELETE /v2/devices/:key/

Arguments: key (String) – Ключ устройства для удаления

Returns: Nothing

Сбор данных

Схема организации данных с датчиков

Каждый датчик хранит свои данные в виде временных рядов точек данных. Точка данных состоит временной метки и значения. Чтобы записать единую точку данных, укажите сведения датчика в поиске (ключ прибора+ключ датчика), и пункты данных, которые нужно записать.

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

Свойства данных датчика

API записи TempoIQ разработаны так, чтобы быть как можно более гибким и простым в использовании. Несколько заметок:

  • У датчика может быть только одно значение для данной метки времени.
  • Если пишутся данные точки для той же метки времени, что и существующей точки, новое значение перезапишет старое значение на новое.
  • Если создаются данные к прибору или датчику которые не существуют, то TempoIQ автоматически создаст форму для прибора или датчика.

Запись данных

writeData(data)

HTTP Endpoint: POST /v2/write/

Arguments: data (WriteRequest) – Данные для записи

Returns: WriteResponse

1) Реализация удаления на Python

import datetime
from tempoiq.protocol.point import Point

t1 = datetime.datetime(2015, 1, 1, 0, 0)
t2 = t1 + datetime.timedelta(minutes=5)

device_data = {"temperature": [Point(t1, 68), Point(t2, 67.5)],
               "humidity": [Point(t1, 71.5), Point(t2, 70.0)]}

response = client.write({"thermostat.0": device_data})

if res.successful != tempoiq.response.SUCCESS:
    print("Error writing data!")

2) Реализация удаления на Java

// import java.util.*;
// import com.tempoiq.*;
// import org.joda.time.*;

// create datapoint at 2015-01-01T00:00:00.000Z for sensors temperature and humidity
DateTime dt1 = new DateTime(2015, 1, 1, 0, 0, 0, 0, DateTimeZone.UTC);
Map<String, Number> points1 = new HashMap<String, Number>();
points1.put("temperature", 68);
points1.put("humidity", 71.5);
MultiDataPoint mp1 = new MultiDataPoint(dt1, points1);

// create another datapoint, five minutes later, at 2015-01-01T00:05:00.000Z for sensors temperature and humidity
DateTime dt2 = dt1.plus(Period.minutes(5));
Map<String, Number> points2 = new HashMap<String, Number>();
points2.put("temperature", 67.5);
points2.put("humidity", 70.0);
MultiDataPoint mp2 = new MultiDataPoint(dt2, points2);

// Store datapoints in TempoIQ
Device device = new Device("thermostat.0");
Result<WriteResponse> result = client.writeDataPoints(device, Arrays.asList(mp1, mp2));

// Check that the request was successful
if(result.getState() != State.SUCCESS) {
  System.out.format("Error writing data! %s", result.getMessage()).println();
}

Запись данных точки на одно или несколько устройств и датчиков. Если прибор или датчик не существует, как указывалось выше, он будет автоматически создан. Метод WriteResponse указывает, было ли создано или изменено устройство в результате запроса.
Если датчик уже имеет точку данных в заданное время, то написание нового DataPoint с той же отметкой времени перезаписывает старые значения точки данных. Это означает, что запись одних и тех же данных на датчик несколько раз не изменяет сохраненные данные. Эта характеристика часто можно упростить логику записи приложения, так как нет риска повреждения данных, если данные записываются несколько раз.

Ошибки

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

Удаление данных

deleteDataPoints(device, sensor, start, stop)

HTTP Endpoint: DELETE /v2/devices/:devicekey/sensors/:sensorkey/datapoints

Удаление диапазона точек данных для данного датчика.

Arguments: start (DateTime) – Начало временного диапазона для удаления (включительно) stop (DateTime) – Конец временного диапазона для удаления (не включительно)

Returns: Число удаленных точек данных 1) Реализация на языке Python

from tempoiq.protocol.sensor import Sensor

start = datetime.datetime(2015, 1, 5, 0, 0)
end = datetime.datetime(2015, 1, 5, 1, 0)

response = client.query(Sensor).filter(Device.key == "thermostat.1") \
                               .filter(Sensor.key == "humidity") \
                               .delete(start, end)

2) Реализация на языке Java

// import com.tempoiq.*;
// import org.joda.time.*;
DateTime start = new DateTime(2015, 1, 1, 0, 0, 0, 0, DateTimeZone.UTC);
DateTime end = new DateTime(2015, 1, 1, 1, 0, 0, 0, DateTimeZone.UTC);

// delete datapoints for sensor "humidity" in device "thermostat.1"
// in the range [2015-01-01T00:00:00Z, 2015-01-01T01:00:00Z)
Device device = new Device("thermostat.1");
Sensor sensor = new Sensor("humidity");
Result<DeleteSummary> result = client.deleteDataPoints(device, sensor, start, end);

if(result.getState() == State.SUCCESS) {
  System.out.format("Deleted %d datapoints", result.getValue().getDeleted()).println();
} else {
  System.out.format("Error deleting datapoints! %s", result.getMessage()).println();
}

Источники

  1. База данных с прогнозированнием тенденций в стартапах// CBINSIGHTS [2007-2018] Дата обновления: 18.04.2017 URL: https://www.cbinsights.com/company/tempodb) (дата обращения: 21.01.2019)
  2. TempoDB – облачная база данных для визуализации датчиков// Живой журнал [1999-2018] Дата обновления: 2012 URL: http://archive.li/QF5Wc#selection-831.0-831.100 (дата обращения 21.01.2019)
  3. Современные тенденции в оласти хранения и обработки сенсорных данных // КиберЛенинка [2013-2019] Дата обновления: 2015 URL: https://cyberleninka.ru/article/n/sovremennye-tendentsii-v-oblasti-hraneniya-i-obrabotki-sensornyh-dannyh (дата обращения: 21.01.2019)
  4. Документация TempoIQ по устройствам // TempoIQ [2014-2016] Дата обновления: 2015 URL: https://app.tempoiq.com/docs/html/reference/device.html#Device (дата обращения: 21.01.2019)
  5. Документация TempoIQ по датчикам // TempoIQ [2014-2016] Дата обновления: 2015 URL: https://app.tempoiq.com/docs/html/reference/sensor.html#Sensor (дата обращения: 21.01.2019)