Примеры

Для демонстрации работы с платформой создан отдельный проект, пополняемый новыми примерами.

Также в указанном проекте можно создавать новые задачи с запросами на новые примеры.

Здесь рассмотрим самый простой пример.

Простой пример с одним объектом

Для демонстрации работы с объектами, тегами, методами и экранами Grafana сделаем следующий пример.

Допустим, у нас есть лампочка и мы можем тем или иным способом получить данные по току и напряжению (работу с коннекторами рассмотрим в следующих примерах).

Кроме тока и напряжения у лампочки есть третий, расчётный тег - мощность.

При изменении силы тока или напряжения мощность должна перерасчитываться.

1. Объект

Открываем конфигуратор, выбираем папку «Объекты» и в меню команд узла выбираем «Новый объект»:

../_images/01.start.png

В появившемся окне свойств меняем имя объекта на «Лампочка»…

../_images/02.before_save.png

…и, нажав кнопку «Записать», сохраняем изменения:

../_images/03.after_save.png

2. Теги

Оставляя текущим объектом «Лампочку», в меню команд выбираем «Новый тег»:

../_images/04.new_tag.png

Меняем имя тега и единицы измерения…

../_images/05.tag_props.png

…и, нажав кнопку «Записать», сохраняем изменения:

../_images/06.tag_saved_props.png

Аналогичным образом создаём ещё два тега, U и P:

../_images/07.IUP.png

3. Запись/чтение данных

Проверим, что данные в теги записываются и читаются.

Выберем тег «I» и на вкладке «Хранилище» откроем панель «Данные тега»:

../_images/08.open_read_save.png

На закладке «Запрос на запись»:

  1. В поле «Значение» впишем 0.

  2. В поле «body» можно посмотреть сформированное тело запроса на запись.

../_images/09.set_data.png

Нажимаем кнопку «Записать данные», затем на закладке «Запрос на чтение» — «Получить данные».

В таблице появятся время и текущее значение тега «I»:

../_images/10.get_data.png

4. Расчётный метод

Создадим метод для расчёта мощности лампочки.

Для этого выберем тег «P» и в меню команд выберем «Новый метод».

Затем:

  1. Изменим имя метода

  2. В поле «Адрес» введём название метода, под которым он будет зарегистрирован в системе для вызовов. Запомним это имя - power.

    ../_images/12.method_name_address.png
  3. Блок «Инициаторы». Очень важный блок, в котором мы выбираем, какие события могут инициировать выполнение расчётного метода.

    На вкладке «Теги» найдём I и U и добавим их. Изменение любого из этих тегов приводит к перерасчёту мощности.

    ../_images/13.method_initiators.png

    Внимание

    Обратите внимание, что в списке возможных инициаторов расчёта нет самого тега «P»: изменение тега не может приводить к перерасчёту его самого, так как это вызовет бесконечный цикл расчётов.

  4. Укажем, какие данные необходимо передать методу для расчёта.

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

    Для расчёта мощности нужны текущие значения двух тегов: силы тока и напряжения. Поэтому создаём два параметра кнопкой «+».

    Первый параметр (индекс 1) — сила тока, второй (индекс 2) — напряжение. Источник данных — «Данные тега»: после выбора тега запрос к платформе собирается сам.

    ../_images/14.method_parameters.png

    Внимание

    После изучения документации на запрос получения данных можно править сформированный JSON запроса и собирать более сложные выборки.

    Внимание

    Очень важный момент, относящийся к расчётам значений тегов: тег мощности рассчитывается, когда изменяется значение тегов «I» и «U». Допустим, расчёт инициируется изменением тега «I» и метка времени нового значения «I» - «2024-10-27 10:00:00+03:00». В этом случае запрос данных в параметрах будет производиться также на метку времени «2024-10-27 10:00:00+03:00» и новое рассчитанное значение тега мощности также будет записано с этой меткой времени, не смотря на то, что сам расчёт, возможно, будет производиться в другое время.

  5. Нажимаем кнопку «Записать» для сохранения изменений.

    ../_images/16.save_method.png

Теперь напишем код метода.

В папке methods проекта https://github.com/Vovaman/peresvet уже написан метод для этого примера.

Откроем файл methods/test_method.py и рассмотрим метод calc_power:

@rpc("power")
async def calc_power(I: dict, U: dict) -> float:
    """Метод возвращает произведение двух параметров.

    """
    print(f"{int_to_local_timestamp(ts())} :: power")

    # точка данных: [x, y, q] либо [y] / [x, y]
    pI = I["data"][0]["data"][0]
    pU = U["data"][0]["data"][0]
    cur_I = (pI[0], pI[1])[len(pI) >= 2]
    cur_U = (pU[0], pU[1])[len(pU) >= 2]

    if cur_I == None or cur_U == None:
        return 0

    return cur_I * cur_U

Внимание

Первая строка: @rpc("power"): именно «power» мы вводили в поле «Адрес» при создании метода!

Далее - строка объявления метода: async def calc_power(I: dict, U: dict) -> float:. Первым параметром указана сила тока, вторым - напряжение. Точно так же, как мы указывали индексы у параметров.

Далее метод пишет в консоль время вызова и считает мощность как произведение двух параметров.

5. Запуск расчётного метода

Для запуска метода необходимо установить пакеты, указанные в файле methods/requirements.txt либо для всех пользователей:

$ pip3 install -r requirements.txt

Либо создав виртуальную среду проекта.

После установки пакетов запускаем в терминале скрипт в папке methods:

$ python3 test_method.py

Результат должен быть примерно таким:

../_images/17.run_method.png

6. Проверим расчёт

Помним, что расчёт мощности инициируется изменениями значений тока и напряжения.

Запишем в тег «U» значение 230.

Для этого выберем в иерархии тег «U» и запишем в него требуемое значение:

../_images/18.set_u.png

В консоли, в которой мы запустили метод, появится вывод:

../_images/19.print_calc.png

Проверим значение тега мощности «P». Оно должно быть равно 0, так как перед этим в тег «I» мы записали 0:

../_images/20.P_is_0.png

Теперь запишем в тег «I» значение 1:

../_images/21.I_is_1.png

И проверим значение мощности, которое должно быть равно 230 Вт:

../_images/22.P_is_230.png

Примечание

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

7. Отображение данных в Grafana

Примечание

Данные из платформы можно получать описанным в документации запросом.

Данные тегов (как, впрочем, и всё общение с платформой) приходят в виде json и для манипулирования этими данными в Grafan’е рекомендуется изучить языки манипулирования json-данными JSONata или JSONPath.

Предпочтительнее JSONata, так как обладает большими возможностями.

Настроим отображение:

  • текущих значений тегов «I», «U» и «P»;

  • трендов значений этих тегов;

  1. Создадим новый дашборд.

    Откройте раздел «Дашборды» и нажмите кнопку «Новые элементы».

    ../_images/23.new_dashboard.png

    В меню выберите «Новый дашборд». Откроется пустой дашборд:

    ../_images/24.new_panel.png

    Нажмите «Добавить визуализацию» и в окне «Выбор источника данных» выберите peresvet:

    ../_images/25.ds.png
  2. В окне настройки панели выберите тип «Stat».

    ../_images/26.stat.png
  3. На закладке Path укажите путь /data/.

    Примечание

    У источника данных peresvet уже задан адрес платформы http://<server>/v1/. Путь /data/ дополняет его до запроса данных тегов. Так же можно обращаться к objects, tags и другим сущностям платформы.

    ../_images/27.path.png
  4. Настроим запросы получения данных.

    Запрос можно скопировать из конфигуратора. Откройте тег «I», вкладку «Хранилище» и строку «Запрос на чтение».

    ../_images/28.q.png

    На закладке Params добавьте параметры из этой строки. Ключ tagId — идентификатор тега, ключ format — true:

    ../_images/29.params.png

    Далее:

    1. Перейдите на закладку Fields и назовите запрос I (щёлкните букву запроса слева).

    2. В поле JSONPath введите $.data[0].data[0][1]. В ответе платформы сначала идёт метка времени, затем значение тега.

    3. На панели появится 1 — записанное ранее значение тока.

    ../_images/30.data.png

    Повторите те же шаги для тегов напряжения и мощности. Новый запрос добавляется кнопкой «Добавить запрос» или значком дублирования. У каждого запроса свой tagId и то же выражение JSONPath. Назовите запросы U и P.

    ../_images/31.add_query.png

    Предупреждение

    У каждого запроса отключите кэш: в поле Cache Time выберите 0s.

    ../_images/39.cache.png
  5. Окончательная настройка панели.

    Значения 230 отображаются красным цветом: порог по умолчанию равен 80. Удалите этот порог в блоке «Пороговые значения». Останется базовый зелёный цвет.

    ../_images/32.remove_threshold.png

    Переименуйте панель в «Электрические параметры» и нажмите «Сохранить дашборд». В окне сохранения задайте имя дашборда, например «Лампочка».

    ../_images/33.save.png

    Предупреждение

    Рядом с именем тега Grafana показывает имя поля. Впишите в Alias пробел — на панели останется имя запроса: I, U и P.

    ../_images/35.space.png
  6. Вернитесь на дашборд и добавьте панель тренда: «Добавить» → «Визуализация».

    ../_images/34.trend.png
  7. Настройка панели с трендом.

    Тип панели оставьте «Time series» и назовите панель «Тренд».

    Параметры запроса те же, что у панели текущих значений, и ещё две границы интервала:

    • tagId — идентификатор тега;

    • format = true;

    • start = $__isoFrom();

    • finish = $__isoTo().

    $__isoFrom() и $__isoTo() Grafana подставляет как начало и конец выбранного на дашборде периода.

    На закладке Fields у каждого из трёх запросов две строки:

    • $.data[0].data[*][0], тип Time — метка времени;

    • $.data[0].data[*][1], тип Number, в Alias имя тега (I, U или P).

    ../_images/36.trend_fields.png
  8. Выбор временного периода.

    Выберите интервал, за который в тегах уже есть данные (например, «Последний 1 час»), и период обновления экрана (например, 5 с).

    ../_images/37.periods.png
  9. Проверим работу модели. Запишите в тег «I» значение 0,5, а в тег «U» — 220. Запущенный на предыдущем шаге метод power пересчитает мощность. На панели отобразятся ток 0,5, напряжение 220 и мощность 110:

    ../_images/38.check.png