# Запись данных с устройства в базу данных

{% note warning %}

Сервис Yandex IoT Core больше не доступен для новых пользователей. 

Текущие пользователи могут создавать ресурсы до 1 ноября 2026 года. После сервис перейдет в режим read-only, а 1 декабря 2026 года — прекратит работу. Подробнее о сроках и порядке закрытия читайте на странице [Закрытие сервиса](../sunset.md).

{% endnote %}

В данном руководстве вы организуете запись данных с устройства в базу данных. В качестве примера будет использоваться [кластер Yandex Managed Service for PostgreSQL](../../managed-postgresql/concepts/index.md). Чтобы подключить устройство к Yandex IoT Core, вам понадобится MQTT-брокер. Все шаги выполняются в [консоли управления](https://console.yandex.cloud).

Чтобы начать записывать информацию с устройства в базу данных:

1. [Подготовьте облако к работе](#before-you-begin).
1. [Создайте сервисный аккаунт](#create-sa).
1. [Создайте необходимые ресурсы Yandex IoT Core](#resources).
    1. [Создайте реестр](#registry).
    1. [Создайте устройство](#device).
1. [Подключите устройство к MQTT-брокеру](#connect).
1. [Подготовьте базу данных](#db).
    1. [Создайте кластер](#cluster).
    1. [Подключитесь к кластеру](#connect-to-cluster).
    1. [Создайте таблицу](#table).
1. [Создайте функцию для обработки данных](#func).
1. [Создайте триггер для Yandex IoT Core](#trigger).

Если созданные ресурсы вам больше не нужны, [удалите их](#clear-out).

## Подготовьте облако к работе {#before-you-begin}

Зарегистрируйтесь в Yandex Cloud и создайте [платежный аккаунт](../../billing/concepts/billing-account.md):
1. Перейдите в [консоль управления](https://console.yandex.cloud), затем войдите в Yandex Cloud или зарегистрируйтесь.
1. На странице **[Yandex Cloud Billing](https://center.yandex.cloud/billing/accounts)** убедитесь, что у вас подключен платежный аккаунт, и он находится в [статусе](../../billing/concepts/billing-account-statuses.md) `ACTIVE` или `TRIAL_ACTIVE`. Если платежного аккаунта нет, [создайте его](../../billing/quickstart/index.md) и [привяжите](../../billing/operations/pin-cloud.md) к нему облако.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать [каталог](../../resource-manager/concepts/resources-hierarchy.md#folder), в котором будет работать ваша инфраструктура, на [странице облака](https://console.yandex.cloud/cloud).

[Подробнее об облаках и каталогах](../../resource-manager/concepts/resources-hierarchy.md).


### Необходимые платные ресурсы {#paid-resources}

* Кластер Managed Service for PostgreSQL: выделенные хостам вычислительные ресурсы, объем хранилища и резервных копий ([тарифы Managed Service for PostgreSQL](../../managed-postgresql/pricing.md)).
* Реестр Yandex IoT Core: количество отправленных сообщений ([тарифы Yandex IoT Core](../pricing.md)).
* Функции Yandex Cloud Functions: количество вызовов функции, время простоя подготовленных экземпляров и выделенные для выполнения функции вычислительные ресурсы ([тарифы Yandex Cloud Functions](../../functions/pricing.md)).


## Создайте сервисный аккаунт {#create-sa}

{% list tabs group=instructions %}

- Консоль управления {#console}

    1. В [консоли управления](https://console.yandex.cloud) выберите каталог, в котором хотите создать сервисный аккаунт.
    1. Перейдите в сервис **Identity and Access Management**.
    1. Нажмите кнопку **Создать сервисный аккаунт**.
    1. Введите имя сервисного аккаунта: `my-db-function-service-account`.
    1. Нажмите кнопку ![](../../_assets/console-icons/plus.svg) **Добавить роль** и выберите [роли](../../iam/concepts/access-control/roles.md) `functions.functionInvoker` и `editor`.
    1. Нажмите кнопку **Создать**.

{% endlist %}

## Создайте необходимые ресурсы Yandex IoT Core {#resources}

{% note info %}

В руководстве используется [авторизация по логину и паролю](../concepts/authorization.md#log-pass), поэтому добавлять сертификат реестру и устройству не требуется. В своих проектах вы можете использовать [авторизацию с помощью сертификатов](../concepts/authorization.md#certs).

{% endnote %}

### Создайте реестр {#registry}

{% list tabs group=instructions %}

- Консоль управления {#console}

    1. В [консоли управления](https://console.yandex.cloud) выберите каталог, в котором нужно создать реестр.
    1. Перейдите в сервис **IoT Core**.
    1. Нажмите кнопку **Создать реестр**.
    1. В поле **Имя** введите `my-registry`.
    1. Введите пароль.

        * Длина — не менее 14 символов.
        * Должен содержать букву верхнего регистра, букву нижнего регистра и цифру.

        {% note warning %}

        Сохраните пароль, так как прочитать его из Yandex IoT Core будет невозможно.

        {% endnote %}

    1. Нажмите кнопку **Создать**.

{% endlist %}

### Создайте устройство {#device}

{% list tabs group=instructions %}

- Консоль управления {#console}

    После создания реестра вы попадете в его настройки.

    1. Перейдите на вкладку **Устройства**.
    1. Нажмите кнопку **Добавить устройство**.
    1. В поле **Имя** введите `my-device`.
    1. Введите пароль.

        * Длина — не менее 14 символов.
        * Должен содержать букву верхнего регистра, букву нижнего регистра и цифру.

        {% note warning %}

        Сохраните пароль, так как прочитать его из Yandex IoT Core будет невозможно.

        {% endnote %}

    1. Нажмите кнопку **Создать**.

{% endlist %}

## Подключите устройство к MQTT-брокеру {#connect}

Для подключения к [MQTT-серверу](../../glossary/mqtt-server.md) используйте следующие параметры:
- [Сертификат удостоверяющего центра](https://storage.yandexcloud.net/mqtt/rootCA.crt).
- **Адрес сервера:** `mqtt.cloud.yandex.net`.
- **Порт сервера:** `8883`.
- **Протокол:** `TLSv1.2`.

## Подготовьте базу данных {#db}

### Создайте кластер {#cluster}

{% list tabs group=instructions %}

- Консоль управления {#console}

    1. В [консоли управления](https://console.yandex.cloud) выберите каталог, в котором нужно создать кластер БД.
    1. Перейдите в сервис **Managed Service for&nbsp;PostgreSQL**.
    1. Нажмите кнопку **Создать кластер**.
    1. В поле **Имя кластера** введите `my-pg-database`.
    1. В поле **Окружение** выберите `PRODUCTION`.
    1. В поле **Версия** выберите `17`.
    1. В блоке **Класс хоста**:
        * Укажите платформу `Intel Cascade Lake`.
        * Выберите тип `burstable`.
        * Укажите класс `b2.medium`.

        {% note warning %}

        Класс `b2.medium` был выбран только в рамках тестирования. В реальных проектах использовать хосты с гарантированной долей vCPU ниже 100% не рекомендуется.

        {% endnote %}

    1. В блоке **Размер хранилища**:

        * Выберите `network-ssd`.
        * Укажите размер равным 10 ГБ.

        {% note info %}

        Тип и размер диска следует выбирать в соответствии с решаемыми задачами. Значения, указанные выше, используются для тестирования.

        {% endnote %}

    1. В блоке **База данных** укажите атрибуты БД:

        * Имя базы данных. Имя БД должно быть уникальным в рамках каталога и содержать только латинские буквы, цифры и подчеркивания.
        * Имя пользователя — владельца БД. Имя пользователя должно содержать только латинские буквы, цифры и подчеркивания.
        * Пароль пользователя. Длина — от 8 до 128 символов.

        Для базы данных, которая создается вместе с кластером, устанавливаются настройки набора символов (кодировки) `LC_CTYPE=C` и `LC_COLLATE=C`. После создания эти настройки изменить нельзя, но вы можете [создать новую базу](../../managed-postgresql/operations/databases.md#add-db) с нужными настройками.

    1. В блоке **Хосты** нажмите ![image](../../_assets/console-icons/pencil.svg) и включите опцию **Публичный доступ**.
    1. В блоке **Дополнительные настройки** включите опцию **Доступ из консоли управления**.
    1. Нажмите кнопку **Создать кластер**.

{% endlist %}

Подробнее о создании кластера — в разделе [Как создать кластер PostgreSQL](../../managed-postgresql/operations/cluster-create.md#create-cluster).

В дальнейшем настройки кластера можно будет [изменить](../../managed-postgresql/operations/update.md).

### Подключитесь к кластеру {#connect-to-cluster}

После создания кластера вы автоматически будете перенаправлены на страницу **Кластеры**.

Дождитесь, пока статус кластера изменится на `Alive`.

{% list tabs group=instructions %}

- Консоль управления {#console}

    1. Выберите кластер `my-pg-database`.
    1. Перейдите на вкладку **SQL**.
    1. В поле **Имя пользователя БД** укажите имя пользователя, который владеет БД, созданной на предыдущем шаге.
    1. В поле **Пароль** введите пароль, указанный при создании кластера.
    1. Нажмите кнопку **Подключиться**.

{% endlist %}

### Создайте таблицу {#table}

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

* Влажность.
* Уровень содержания углекислого газа (CO<sub>2</sub>).
* Давление.
* Температура.

Датчик выдает результат в формате JSON. Например:

```json
{
"DeviceId":"0e3ce1d0-1504-4325-972f-55c9********",
"TimeStamp":"2020-05-21T22:53:16Z",
"Values":[
    {"Type":"Float","Name":"Humidity","Value":"25.281837"},
    {"Type":"Float","Name":"CarbonDioxide","Value":"67.96608"},
    {"Type":"Float","Name":"Pressure","Value":"110.7021"},
    {"Type":"Float","Name":"Temperature","Value":"127.708824"}
    ]
}
```

Запишите полученную информацию в таблицу базы данных с помощью функции.

После того, как вы [подключились к кластеру](#connect-to-cluster), создайте таблицу. Для этого:

{% list tabs group=instructions %}

- Консоль управления {#console}

    1. В окне редактирования введите следующий запрос:

        {% note warning %}

        Запрос ниже приведен в качестве примера. Если ваше устройство отправляет другую информацию, измените столбцы в создаваемой таблице.

        {% endnote %}

        ```sql
        CREATE TABLE iot_events (
            event_id varchar(24) not null,
            device_id varchar(50) not null,
            event_datetime timestamptz not null,
            humidity float8 null,
            carbon_dioxide float8 null,
            pressure float8 null,
            temperature float8 null
        )
        ```

    1. Нажмите кнопку **Выполнить**.

    Дождитесь появления надписи о завершении выполнения запроса.

{% endlist %}

## Создайте функцию для обработки данных {#func}

Функция будет получать сообщения из MQTT-брокера и записывать данные в таблицу, созданную на предыдущем шаге.

{% list tabs group=instructions %}

- Консоль управления {#console}

    1. В [консоли управления](https://console.yandex.cloud) выберите каталог, в котором нужно создать функцию.
    1. Перейдите в сервис **Cloud Functions**.
    1. Нажмите кнопку **Создать функцию**.
    1. Введите имя функции.
    1. Нажмите кнопку **Создать**.

{% endlist %}

### Создайте версию функции {#func-version}

После создания функции вы автоматически будете перенаправлены на страницу **Редактор**.

{% list tabs group=instructions %}

- Консоль управления {#console}

    1. В блоке **Код функции**:

        * В поле **Среда выполнения** выберите `python37`.
        * В поле **Источник кода** оставьте значение по умолчанию: **Редактор кода**.

    1. Создайте файл `myfunction.py`.
    1. В области редактирования файла вставьте код функции, размещенный на [Github](https://github.com/yandex-cloud-examples/yc-iot-postgresql/blob/main/myfunction.py).

        {% note info %}

        Запрос, который используется для записи данных в БД, формируется в методе `makeInsertStatement`. Если необходимо убрать или добавить параметры, внесите изменения в этот метод.

        {% endnote %}

    1. В поле **Точка входа** укажите `myfunction.msgHandler`.
    1. Задайте следующие параметры версии:

        * **Таймаут** — `10`.
        * **Память** — `128 МБ`.

    1. В поле **Сервисный аккаунт** выберите `my-db-function-service-account`.

    1. Добавьте переменные окружения:

        * `VERBOSE_LOG` — параметр, отвечающий за вывод подробной информации о выполнении функции. Введите значение `True`.
        * `DB_HOSTNAME` — имя хоста БД PostgreSQL для подключения.
        * `DB_PORT` — порт для подключения.
        * `DB_NAME` — имя базы данных для подключения.
        * `DB_USER` — имя пользователя для подключения.
        * `DB_PASSWORD` — пароль, который был введен при [создании кластера](#cluster).

        Чтобы определить значения параметров для подключения:

        1. В [консоли управления](https://console.yandex.cloud) выберите каталог, в котором вы создали кластер.
        1. Перейдите в сервис **Managed Service for&nbsp;PostgreSQL**.
        1. Выберите кластер `my-pg-database`.
        1. В строке с нужной БД нажмите значок ![image](../../_assets/console-icons/ellipsis.svg) и выберите **Подключиться**.
        1. На вкладке **PowerShell** найдите пример строки подключения.
        1. Перенесите значения переменных `host`, `port`, `dbname` и `user` в соответствующее поле **Значение** переменных окружения функции.

    1. Нажмите кнопку **Сохранить изменения**.

{% endlist %}

## Создайте триггер для Yandex IoT Core {#trigger}

Триггер будет принимать копии сообщений из топика устройства и передавать их в функцию для обработки.

{% list tabs group=instructions %}

- Консоль управления {#console}

    1. В [консоли управления](https://console.yandex.cloud) выберите каталог, в котором нужно создать триггер.
    1. Перейдите в сервис **Cloud Functions**.
    1. На панели слева выберите ![image](../../_assets/console-icons/gear-play.svg) **Триггеры**.
    1. Нажмите кнопку **Создать триггер**.
    1. В блоке **Базовые параметры**:

        * В поле **Имя** введите имя триггера.
        * В поле **Описание** введите описание триггера.
        * В поле **Тип** выберите **IoT Core (устройство)**.

    1. В блоке **Настройки сообщений IoT Core**:

        * В поле **Реестр** введите `my-registry`.
        * В поле **Устройство** введите `my-device`.
        * В поле **MQTT-топик** укажите топик, в который устройство отправляет данные:

            ```text
            $devices/<идентификатор_устройства>/events
            ```

            Где `<идентификатор_устройства>` — идентификатор вашего устройства.

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

    1. В блоке **Настройки функции**:

        * Выберите функцию для обработки данных, созданную ранее.
        * В поле **Тег версии функции** укажите `$latest`.
        * В поле **Сервисный аккаунт** укажите `my-db-function-service-account`.

    1. Остальные поля оставьте пустыми или заполните по своему усмотрению.
    1. Нажмите кнопку **Создать триггер**.

{% endlist %}

## Как удалить созданные ресурсы {#clear-out}

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

1. [Удалите](../operations/device/device-delete.md) устройство.
1. [Удалите](../operations/registry/registry-delete.md) реестр.
1. [Удалите](../../managed-postgresql/operations/cluster-delete.md) кластер PostgreSQL.
1. [Удалите](../../functions/operations/trigger/trigger-delete.md) триггер.
1. [Удалите](../../functions/operations/function/function-delete.md) функцию.