VK Cloud logo

Работа с данными

Типы хранилищ

В платформе IoT выделяют типы хранилищ:

  • Хранилище метаинформации. Хранит всю метаинформацию: пользовательские настройки и данные. Основным инструментом работы с метаинформацией является графический интерфейс платформы https://iot.mcs.mail.ru

  • Долговременное хранилище. Основное аналитическое хранилище данных от устройств в платформе IoT. Основным инструментом работы с долговременным хранилищем является публичное HTTP API. В API есть эндпоинт для выполнения произвольных аналитических SQL-запросов. Для SQL доступны операции SELECT и INSERT. Синтаксис SQL-запросов полностью совместим с синтаксисом Clickhouse, поэтому при написании запросов можно руководствоваться официальной документацией базы данных Clickhouse в части синтаксиса запросов.

  • Оперативное хранилище. Хранит в себе данные от устройств за последние 24 часа и предназначено для активной работы с оперативными данными от устройств. Основным инструментом работы с оперативным хранилищем является публичное HTTP API.

  • Сервис цифровых двойников. Хранит в себе актуальные состояния датчиков, устройств, агентов и переменных для бизнес-правил. Основным инструментом работы с сервисом является публичное HTTP API.

Примеры работы с данными в хранилищах

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

Параметры для подключения доступны в разделе Сервисные аккаунты в карточке аккаунта на вкладке Инструкция по подключению.

Чтобы получить токен доступа ACCESS_TOKEN, выполните запрос:

curl -X POST https://iot.mcs.mail.ru/keycloak/auth/realms/iot/protocol/openid-connect/token -d "client_id=<CLIENT_ID>&client_secret=<SECRET_KEY>&grant_type=client_credentials" -H "Content-Type: application/x-www-form-urlencoded"

где:

  • CLIENT_ID — идентификатор сервисного аккаунта IoT.
  • SECRET_KEY — секретный ключ для указываемого аккаунта.

Экспортируйте переменные CLIENT_ID и сгенерированный ACCESS_TOKEN в окружение, чтобы использовать их для последующих запросов:

1export CLIENT_ID=<CLIENT_ID>
2export ACCESS_TOKEN=<ACCESS_TOKEN>

Работа с хранилищем метаинформации

Получить список правил

1curl -X GET \
2  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
3  https://iot.mcs.mail.ru/registry/v1/clients/${CLIENT_ID}/rules

Получить корневой тег проекта (структуры)

1curl -X GET \
2  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
3  https://iot.mcs.mail.ru/registry/v1/clients/${CLIENT_ID}/root_tag

Получить дочерние теги для корневого тега

1# id корневого тега проекта, который был получен в предыдущем примере
2export ROOT_TAG_ID=
3
4curl \
5  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
6  https://iot.mcs.mail.ru/registry/v1/clients/${CLIENT_ID}/tags/${ROOT_TAG_ID}/children

Работа с долговременным хранилищем

Доступные таблицы для SQL-запросов
  • events — временные ряды от сенсоров и история состояний:
1CREATE TABLE
2    events (
3        tag_id UInt64,
4        value_type Enum8(
5            'integer' = 0,
6            'float' = 1,
7            'boolean' = 2,
8            'string' = 3,
9            'location' = 4,
10            'timestamp' = 5
11        ),
12        integer_value Int64,
13        float_value Float64,
14        boolean_value UInt8,
15        string_value String,
16        timestamp_value DateTime64(6, 'UTC'),
17        location_value Tuple(lat Float64, lng Float64),
18        payload String,
19        time DateTime64(6, 'UTC'),
20        received_at DateTime64(6, 'UTC')
21    );
  • aggregates — подсчитанные платформой IoT агрегаты:
1CREATE TABLE
2    aggregates (
3        tag_id UInt64,
4        value_type Enum8(
5            'integer' = 0,
6            'float' = 1
7        ),
8        fvalue Float64,
9        ivalue Int64,
10        payload String,
11        time DateTime64(6, 'UTC'),
12        received_at DateTime64(6, 'UTC') DEFAULT now()
13    );
  • tags — слепок метаинформации о тегах:
1CREATE TABLE
2    tags (
3        tag_id UInt64,
4        name String,
5        label String,
6        type Enum8(
7            'undefined' = 0,
8            'event' = 1,
9            'state' = 2,
10            'node' = 3,
11            'device' = 4,
12            'agent' = 5,
13            'aggregate' = 6
14        ),
15        full_name String,
16        created_at DateTime64(6, 'UTC'),
17        updated_at DateTime64(6, 'UTC'),
18        device_id Nullable(UInt64),
19        agent_id Nullable(UInt64),
20        attrs Nested (key String, value String),
21        last_check_date DateTime('UTC'),
22        deleted UInt8 DEFAULT 0
23    );

Сумма и количество показаний сенсора за последний месяц с группировкой по дням

1# id датчика, по которому просматриваются данные
2export TAG_ID=
1export TS_FROM=$(date -d '-1 month' +%s000000)
2export TS_TO=$(date +%s000000)
1curl -G \
2  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
3  -d 'tag_id=${TAG_ID}' \
4  -d 'ts_from=${TS_FROM}' \
5  -d 'ts_to=${TS_TO}' \
6  -d 'period=1d' \
7  -d '{"sum": null, "count": null}' \
8  https://iot.mcs.mail.ru/long-term-storage/api/v1/clients/${CLIENT_ID}/query/events/group

История изменений состояния за последний день

1# id состояния, по которому просматриваются данные
2export TAG_ID=
1export TS_FROM=$(date -d '-1 day' +%s000000)
2export TS_TO=$(date +%s000000)
1curl -G \
2  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
3  -d 'tag_id=${TAG_ID}' \
4  -d 'ts_from=${TS_FROM}' \
5  -d 'ts_to=${TS_TO}' \
6  -d 'limit=100' \
7  -d 'order_by=desc(time)' \
8  https://iot.mcs.mail.ru/long-term-storage/api/v1/clients/${CLIENT_ID}/query/events

Получить последние 100 событий (sql)

1curl -G \
2  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
3  --data-urlencode 'query=SELECT * FROM events ORDER BY time DESC LIMIT 100' \
4  https://iot.mcs.mail.ru/long-term-storage/api/v1/clients/${CLIENT_ID}/proxy

Работа с оперативным хранилищем

Последнее показание сенсора по ID

1curl -G \
2  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
3  -d 'tag_id={ id }' \
4  https://iot.mcs.mail.ru/operational-storage/api/v1/clients/${CLIENT_ID}/query/events/latest

Среднее, минимум и максимум показаний сенсора за час

1# id датчика, по которому просматриваются данные
2export TAG_ID=
1export TS_FROM=$(date -d '-1 hour' +%s000000)
2export TS_TO=$(date +%s000000)
1curl -G \
2  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
3  -d 'tag_id=${TAG_ID}' \
4  -d 'ts_from=${TS_FROM}' \
5  -d 'ts_to=${TS_TO}' \
6  -d '{"avg": null, "min": null, "max": null}' \
7  https://iot.mcs.mail.ru/operational-storage/api/v1/clients/${CLIENT_ID}/query/events/aggregate

Работа с сервисом цифровых двойников

Получить текущее значение состояния

1# id состояния, по которому просматриваются данные
2export TAG_ID=
3
4curl -G \
5  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
6  https://iot.mcs.mail.ru/digital-twins/api/v1/clients/${CLIENT_ID}/tags/${TAG_ID}

Получить текущее состояние устройства

1# id устройства
2export DEVICE_ID=
3
4curl -G \
5  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
6  https://iot.mcs.mail.ru/digital-twins/api/v1/clients/${CLIENT_ID}/devices/${DEVICE_ID}