Работа с данными
В платформе 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
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
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}