diff --git a/README.md b/README.md index cff9e1f..daca18e 100755 --- a/README.md +++ b/README.md @@ -114,6 +114,9 @@ # Примеры использования +Начальный пример работы с платформой описан в документации: +[пример](https://vovaman.github.io/peresvet/examples.html). + Примеры работы с платформой собраны в отдельном проекте [peresvet_examples](https://github.com/Vovaman/peresvet_examples). diff --git a/docs/source/configurator/configurator.rst b/docs/source/configurator/configurator.rst new file mode 100644 index 0000000..0cffae3 --- /dev/null +++ b/docs/source/configurator/configurator.rst @@ -0,0 +1,134 @@ +.. _configurator: + +Конфигуратор модели +------------------- + +.. note:: + Конфигуратор работает с платформой через :ref:`API `. + Форматы всех команд создания/чтения/обновления/удаления узлов иерархии + можно найти в документации по указанной ссылке. + +Первый запуск +^^^^^^^^^^^^^ +Запускаем платформу (:ref:`installation`). + +Запускаем браузер и в строке адреса пишем: http://localhost/grafana. + +При первом запуске вводим имя пользователя ``admin``, пароль также ``admin``. +Grafana предложит сменить пароль. + +.. figure:: pics/01.welcome.png + :alt: Пересвет + +По умолчанию открывается экран с конфигуратором. + +.. figure:: pics/02.configurator.png + :alt: Конфигуратор + +При первом запуске в низ экрана атоматически добавляется панель, которую можно удалить: + +.. figure:: pics/03.remove_panel.png + :alt: Дополнительная панель + +Папки модели +^^^^^^^^^^^^ +Создаваемая модель объекта и информационной системы имеет иерархическую структуру. + +На верхнем уровне иерархии находятся узлы, в которых создаются экземпляры соответствующих +:ref:`сущностей `. + +Проще освоить работу с конфигуратором на :ref:`примерах `. + +Объекты +_______ +Внутри этой папки создаётся основная иерархия - модель объекта. Иерархия имеет любой уровень +вложенности и может включать в себя объекты, теги, тревоги, методы. + +Теги +____ +Наиболее простой случай модели объекта - это линейный список его параметров (тегов). + +В таком случае теги можно создавать, не привязывая их к какому-либо объекту. + +Для этого случая служит отдельная папка ``Теги``. + +Коннекторы +__________ +В этой папке создаются описания :ref:`коннекторов `. +Параметры, задаваемые в узле-описании коннектора, зависят от конкретного коннектора. + +Расписания +__________ +Папка для создания расписаний - генераторов событий. + +Хранилища данных +________________ +Папка, в которой хранятся описания хранилищ данных. +Исторические данные, факты возникновения, пропадания +и квитирования тревог хранятся в этих хранилищах. + +.. note:: Открытая версия платформы "Пересвет" поддерживает работу только с одним хранилищем, + поэтому в конфигураторе для открытой платформы отсутствует узел "Хранилища данных". + +Создание новых узлов +^^^^^^^^^^^^^^^^^^^^ +1. Выбираем нужный узел, внутри которого хотим создать дочерний. +2. Выбираем нужную синюю кнопку и, нажав её, создаём новый экземпляр необходимой нам сущности. + +.. figure:: pics/04.new_node.png + +После нажатия кнопки в иерархию добавится новый экземпляр выбранной сущности. +Узел в иерархии, соответствующий данному экземпляру, станет текущим и справа появится панель +со свойствами нового узла. + +Кроме того, изменится набор кнопок в верхней части конфигуратора. + +**Синие кнопки** показывают, экземпляры каких сущностей могут быть созданы внутри выбранного узла. + +Например: внутри объекта могут быть созданы другие объекты или теги; внутри тега могут быть созданы +методы и тревоги. + +.. figure:: pics/06.but_new_object.png + + Новый объект + +.. figure:: pics/07.but_new_tag.png + + Новый тег + +.. figure:: pics/08.but_delete.png + + **Красная кнопка** - удаление выбранного узла из иерархии. + +.. figure:: pics/05.new_object_created.png + +При создании нового узла в иерархии с помощью конфигуратора он создаётся с параметрами по умолчанию. +Поэтому имя нового узла совпадает с его идентификатором. + +Редактирование свойств узла +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +На панели справа редактируем свойства узла. При этом изменённые свойства обводятся синей рамкой. + +Если у узла изменено хотя бы одно свойство, то активизируются две кнопки: + +**Записать** - сохранение в модели изменённых свойств и + +**Сбросить** - отмена внесённых изменений, возврат к начальным параметрам. + +.. figure:: pics/09.edit.png + +Нажимаем кнопку **Записать**: + +.. figure:: pics/10.changes_saved.png + +Удаление узла +^^^^^^^^^^^^^ +Выбираем нужный узел в иерархии и нажимаем красную кнопку: + +.. figure:: pics/08.but_delete.png + +Из иерархии удаляется узел и все его потомки. + +Примеры +^^^^^^^ +Работу в конфигураторе с отдельными сущностями проще освоить на :ref:`примерах `. \ No newline at end of file diff --git a/docs/source/configurator/pics/01.welcome.png b/docs/source/configurator/pics/01.welcome.png new file mode 100644 index 0000000..ff58c73 Binary files /dev/null and b/docs/source/configurator/pics/01.welcome.png differ diff --git a/docs/source/configurator/pics/02.configurator.png b/docs/source/configurator/pics/02.configurator.png new file mode 100644 index 0000000..40e9a62 Binary files /dev/null and b/docs/source/configurator/pics/02.configurator.png differ diff --git a/docs/source/configurator/pics/03.remove_panel.png b/docs/source/configurator/pics/03.remove_panel.png new file mode 100644 index 0000000..b4897b9 Binary files /dev/null and b/docs/source/configurator/pics/03.remove_panel.png differ diff --git a/docs/source/configurator/pics/04.new_node.png b/docs/source/configurator/pics/04.new_node.png new file mode 100644 index 0000000..84f7a96 Binary files /dev/null and b/docs/source/configurator/pics/04.new_node.png differ diff --git a/docs/source/configurator/pics/05.new_object_created.png b/docs/source/configurator/pics/05.new_object_created.png new file mode 100644 index 0000000..67403be Binary files /dev/null and b/docs/source/configurator/pics/05.new_object_created.png differ diff --git a/docs/source/configurator/pics/06.but_new_object.png b/docs/source/configurator/pics/06.but_new_object.png new file mode 100644 index 0000000..d7bd5bf Binary files /dev/null and b/docs/source/configurator/pics/06.but_new_object.png differ diff --git a/docs/source/configurator/pics/07.but_new_tag.png b/docs/source/configurator/pics/07.but_new_tag.png new file mode 100644 index 0000000..c6d9989 Binary files /dev/null and b/docs/source/configurator/pics/07.but_new_tag.png differ diff --git a/docs/source/configurator/pics/08.but_delete.png b/docs/source/configurator/pics/08.but_delete.png new file mode 100644 index 0000000..6d43ef0 Binary files /dev/null and b/docs/source/configurator/pics/08.but_delete.png differ diff --git a/docs/source/configurator/pics/09.edit.png b/docs/source/configurator/pics/09.edit.png new file mode 100644 index 0000000..1a6a6de Binary files /dev/null and b/docs/source/configurator/pics/09.edit.png differ diff --git a/docs/source/configurator/pics/10.changes_saved.png b/docs/source/configurator/pics/10.changes_saved.png new file mode 100644 index 0000000..f459c43 Binary files /dev/null and b/docs/source/configurator/pics/10.changes_saved.png differ diff --git a/docs/source/examples/examples.rst b/docs/source/examples/examples.rst new file mode 100644 index 0000000..20a2df6 --- /dev/null +++ b/docs/source/examples/examples.rst @@ -0,0 +1,348 @@ +.. _examples: + +Примеры +------- +Для демонстрации работы с платформой создан отдельный +`проект `_, пополняемый новыми примерами. + +Также в указанном проекте можно создавать новые задачи с запросами на новые примеры. + +Здесь рассмотрим самый простой пример. + +Простой пример с одним объектом +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Для демонстрации работы с объектами, тегами, методами и экранами Grafana сделаем следующий пример. + +Допустим, у нас есть лампочка и мы можем тем или иным способом получить +данные по току и напряжению (работу с коннекторами рассмотрим в следующих примерах). + +Кроме тока и напряжения у лампочки есть третий, расчётный тег - мощность. + +При изменении силы тока или напряжения мощность должна перерасчитываться. + +1. Объект +......... +Открываем конфигуратор, выбираем папку "Объекты" и нажимаем кнопку "Новый объект": + +.. figure:: pics/01.start.png + +В появившемся окне свойств меняем имя объекта на "Лампочка"... + +.. figure:: pics/02.before_save.png + +...и, нажав кнопку "Записать", сохраняем изменения: + +.. figure:: pics/03.after_save.png + +2. Теги +....... +Оставляя текущим объектом "Лампочку", нажимаем кнопку "Новый тег": + +.. figure:: pics/04.new_tag.png + +Меняем имя тега и единицы измерения... + +.. figure:: pics/05.tag_props.png + +...и, нажав кнопку "Записать", сохраняем изменения: + +.. figure:: pics/06.tag_saved_props.png + +Аналогичным образом создаём ещё два тега, U и P: + +.. figure:: pics/07.IUP.png + +3. Запись/чтение данных +....................... +Проверим, что данные в теги записываются и читаются. + +Выберем тег "I" и откроем панель "Данные тега": + +.. figure:: pics/08.open_read_save.png + +#. В поле "Значение" впишем 0. +#. В поле "body" можно посмотреть сформированное тело запроса на запись. + +.. figure:: pics/09.set_data.png + +Нажимаем кнопку "Записать", затем "Получить данные". + +В таблице "Значение-время-качество" появится текущее значение тега "I": + +.. figure:: pics/10.get_data.png + +4. Расчётный метод +.................. +Создадим метод для расчёта мощности лампочки. + +Для этого выберем тег "P" и нажмём кнопку "Новый метод": + +.. figure:: pics/11.new_method.png + +Затем: + +1. Изменим имя метода +2. В поле "Адрес" введём название метода, под которым он будет зарегистрирован в системе для вызовов. + Запомним это имя - ``power``: + + .. figure:: pics/12.method_name_address.png + +3. Блок "Инициаторы". Очень важный блок, в котором мы выбираем, какие события могут инициировать выполнение + расчётного метода. + + Здесь выберем оба предложенных тега: I и U, то есть изменения обоих этих тегов будут приводить к + перерасчёту мощности. + + .. attention:: Обратите внимание, что в списке возможных инициаторов расчёта нет самого тега + "P": изменение тега не может приводить к перерасчёту его самого, так как это вызовет бесконечный цикл + расчётов. + + .. figure:: pics/13.method_initiators.png + +4. Укажем, какие данные необходимо передать методу для расчёта. + + Данные, передаваемые в метод в каждом параметре - это результат запроса + :py:meth:`получения данных `. + + Для расчёта мощности нужны текущие значения двух тегов: силы тока и напряжения. + Поэтому создаём два параметра, дважды нажав на синюю кнопку с плюсом. + Заполняем данные параметров как показано на картинке: + + .. figure:: pics/14.method_parameters.png + + Здесь мы указали, что в метод передаются два параметра: первым (индекс = 1) - сила тока. + + Вторым (индекс = 2) - напряжение. + + Поле "Конфигурация" заполняется автоматически после выбора тега в поле "Тег". + + .. attention:: После изучения документации на запрос + :py:meth:`получения данных ` можно вручную править поле "Конфигурация", + составляя сколь угодно сложные запросы получения данных. Поле "Конфигурация" можно расширять + для удобства ввода текста. + + .. figure:: pics/15.extend_config.png + + .. attention:: Очень важный момент, относящийся к расчётам значений тегов: тег мощности рассчитывается, + когда изменяется значение тегов "I" и "U". Допустим, расчёт инициируется изменением тега "I" и метка + времени нового значения "I" - "2024-10-27 10:00:00+03:00". В этом случае запрос данных в параметрах + будет производиться также на метку времени "2024-10-27 10:00:00+03:00" и новое рассчитанное значение + тега мощности также будет записано с этой меткой времени, не смотря на то, что сам расчёт, возможно, + будет производиться в другое время. + +5. Нажимаем кнопку "Записать" для сохранения изменений: + + .. figure:: pics/16.save_method.png + +Теперь напишем код метода. + +В папке ``methods`` проекта https://github.com/Vovaman/peresvet уже написан метод для этого примера. + +Откроем файл ``methods/test_method.py`` и рассмотрим метод ``calc_power``: + +.. code-block:: python + + @rpc("power") + async def calc_power(I: dict, U: dict) -> float: + """Метод возвращает произведение двух параметров. + + """ + print(f"I: {json.dumps(I, indent=4)}") + print(f"U: {json.dumps(U, indent=4)}") + + cur_I = I["data"][0]["data"][0][0] + cur_U = U["data"][0]["data"][0][0] + + if cur_I == None or cur_U == None: + return 0 + + return cur_I * cur_U + +.. attention:: Первая строка: ``@rpc("power")``: именно "power" мы вводили в поле + "Адрес" при создании метода! + +Далее - строка объявления метода: ``async def calc_power(I: dict, U: dict) -> float:``. +Первым параметром указана сила тока, вторым - напряжение. Точно так же, как мы указывали +индексы у параметров. + +Далее метод просто для удобства выводит в консоль пришедшие данные, затем рассчитывает мощность +как произведение двух параметров. + +5. Запуск расчётного метода +........................... +Для запуска метода необходимо установить пакеты, указанные в файле ``methods/requirements.txt`` либо +для всех пользователей: + +.. code-block:: bash + + $ pip3 install -r requirements.txt + +Либо создав виртуальную среду проекта. + +После установки пакетов запускаем в терминале скрипт в папке ``methods``: + +.. code-block:: bash + + $ python3 test_method.py + +Результат должен быть примерно таким: + +.. figure:: pics/17.run_method.png + +6. Проверим расчёт +.................. +Помним, что расчёт мощности инициируется изменениями значений тока и напряжения. + +Запишем в тег "U" значение 230. + +Для этого выберем в иерархии тег "U" и запишем в него требуемое значение: + +.. figure:: pics/18.set_u.png + +В консоли, в которой мы запустили метод, появится вывод: + +.. figure:: pics/19.print_calc.png + +Проверим значение тега мощности "P". Оно должно быть равно 0, так как перед этим +в тег "I" мы записали 0: + +.. figure:: pics/20.P_is_0.png + +Теперь запишем в тег "I" значение 1: + +.. figure:: pics/21.I_is_1.png + +И проверим значение мощности, которое должно быть равно 230 Вт: + +.. figure:: pics/22.P_is_230.png + +.. note:: В следующих примерах будет показано, как настроить получение данных в теги + из внешних источников. + +7. Отображение данных в Grafana +............................... +.. note:: Данные из платформы можно получать + :py:meth:`описанным в документации запросом `. + + Данные тегов (как, впрочем, и всё общение с платформой) приходят в виде json и для манипулирования + этими данными в Grafan'е рекомендуется изучить языки манипулирования json-данными + `JSONata `_ или + `JSONPath `_. + + Предпочтительнее JSONata, так как обладает большими возможностями. + + Настроим отображение: + + * текущих значений тегов "I", "U" и "P"; + * трендов значений этих тегов; + +1. Создадим новую доску данных. + + Для этого заходим в меню "Home --> Dashboards" и нажимаем кнопку "New" + + .. figure:: pics/23.new_dashboard.png + + Выбрав в выпадающем меню команду "New dashboard", попадаем на экран создания новой панели: + + .. figure:: pics/24.new_panel.png + + ...и выбираем источник данных "peresvet": + + .. figure:: pics/25.ds.png + +2. В появившемся окне настройки панели выберем тип панели "Stat". + + .. figure:: pics/26.stat.png + +3. Настроим путь для получения данных, вписав ``/data/`` на закладке ``Path``. + + .. note:: По умолчанию в источнике данных "peresvet" настроен путь к + платформе: ``http:///v1/``. + Добавляя к этому пути расширения ``data``, ``objects``, ``tags`` и т.д., + мы получаем возможность работать не только с данными, но и вообще + со всеми сущностями платформы. + + .. figure:: pics/27.path.png + +4. Настроим запросы получения данных. + + Для того, чтобы не писать запрос вручную, его можно скопировать из конфигуратора. + + Открываем конфигуратор, выбираем тег "I" и копируем запрос получения текущего значения тега. + + .. figure:: pics/28.q.png + + В окне настройки панели выбираем закладку "Params" и добавляем новый ключ "q". + Значение ключа - скопированный нами запрос: + + .. figure:: pics/29.params.png + + Далее: + + #. Переходим на закладку "Fields"; + #. Меняем имя очереди на "I"; + #. Вводим выражение на языке JSONPath, разбирающее ответ от платформы с текущим значением тега + #. На экране появится "1" - текущее, введённое нами на предыдущих шагах значение тока. + + .. figure:: pics/30.data.png + + Повторим предыдущие шаги для оставшихся двух тегов напряжения и мощности, + добавляя новые запросы нажатием кнопки "Add query": + + .. figure:: pics/31.add_query.png + + .. warning:: У каждого поля отменим кэширование данных: + + .. figure:: pics/39.cache.png + +5. Окончательная настройка панели. + + После настройки данных значения напряжения и мощности отображаются красным цветом. + Так выставлены настройки по умолчанию. + + #. Чтобы все значения отражались зелёным цветом, уберём порог значения "80"; + + .. figure:: pics/32.remove_threshold.png + + #. Переименуем панель и нажмем кнопку "Save": + + .. figure:: pics/33.save.png + + Появится окно, в котором нужно задать имя доски данных. + + .. warning:: Чтобы на панели рядом с именем тега не отображался 0, введите в поля + ``Alias`` пробел: + + .. figure:: pics/35.space.png + +6. Выровняем новую панель на экране и создадим новую панель, с трендом, для чего + выберем команду "Add --> Visualization": + + .. figure:: pics/34.trend.png + +7. Настройка панели с трендом. + + Тип панели оставим по умолчанию - "Time series". + + Получение данных настроим похоже предыдущей панели, за исключением того, что ключ запроса "q" + будет включать функции Grafan'ы ``$__isoFrom()`` и ``$__isoTo()``, обозначающие начало и конец + запрашиваемого временного периода: + + ``q={"tagId":"2d95d0a6-28c7-103f-9c49-d763ac5895e8","format":true,"start":"$__isoFrom()","finish":"$__isoTo()"}``. + + Закладки "Fields" у всех трёх запросов должны быть такого вида: + + .. figure:: pics/36.trend_fields.png + +8. Выбор временных периодов. + + Настроив панель с трендом для отображения трёх тегов, приведём доску данных приблизительно к такому + виду и выберем диапазон времени для отображения на экране, а также периодичность обновления данных: + + .. figure:: pics/37.periods.png + +9. Проверим работу модели. Для чего записываем новые значения в теги "I" и "U" и наблюдаем + изменение данных на панели с электрическими параметрами: + + .. figure:: pics/38.check.png + \ No newline at end of file diff --git a/docs/source/examples/pics/01.start.png b/docs/source/examples/pics/01.start.png new file mode 100644 index 0000000..5af7003 Binary files /dev/null and b/docs/source/examples/pics/01.start.png differ diff --git a/docs/source/examples/pics/02.before_save.png b/docs/source/examples/pics/02.before_save.png new file mode 100644 index 0000000..2d14a6d Binary files /dev/null and b/docs/source/examples/pics/02.before_save.png differ diff --git a/docs/source/examples/pics/03.after_save.png b/docs/source/examples/pics/03.after_save.png new file mode 100644 index 0000000..6ead9b4 Binary files /dev/null and b/docs/source/examples/pics/03.after_save.png differ diff --git a/docs/source/examples/pics/04.new_tag.png b/docs/source/examples/pics/04.new_tag.png new file mode 100644 index 0000000..03742df Binary files /dev/null and b/docs/source/examples/pics/04.new_tag.png differ diff --git a/docs/source/examples/pics/05.tag_props.png b/docs/source/examples/pics/05.tag_props.png new file mode 100644 index 0000000..f1b80ba Binary files /dev/null and b/docs/source/examples/pics/05.tag_props.png differ diff --git a/docs/source/examples/pics/06.tag_saved_props.png b/docs/source/examples/pics/06.tag_saved_props.png new file mode 100644 index 0000000..e6fa4fd Binary files /dev/null and b/docs/source/examples/pics/06.tag_saved_props.png differ diff --git a/docs/source/examples/pics/07.IUP.png b/docs/source/examples/pics/07.IUP.png new file mode 100644 index 0000000..7337549 Binary files /dev/null and b/docs/source/examples/pics/07.IUP.png differ diff --git a/docs/source/examples/pics/08.open_read_save.png b/docs/source/examples/pics/08.open_read_save.png new file mode 100644 index 0000000..e18b13e Binary files /dev/null and b/docs/source/examples/pics/08.open_read_save.png differ diff --git a/docs/source/examples/pics/09.set_data.png b/docs/source/examples/pics/09.set_data.png new file mode 100644 index 0000000..80b1cb4 Binary files /dev/null and b/docs/source/examples/pics/09.set_data.png differ diff --git a/docs/source/examples/pics/10.get_data.png b/docs/source/examples/pics/10.get_data.png new file mode 100644 index 0000000..6ec495f Binary files /dev/null and b/docs/source/examples/pics/10.get_data.png differ diff --git a/docs/source/examples/pics/11.new_method.png b/docs/source/examples/pics/11.new_method.png new file mode 100644 index 0000000..fd49822 Binary files /dev/null and b/docs/source/examples/pics/11.new_method.png differ diff --git a/docs/source/examples/pics/12.method_name_address.png b/docs/source/examples/pics/12.method_name_address.png new file mode 100644 index 0000000..ad85af1 Binary files /dev/null and b/docs/source/examples/pics/12.method_name_address.png differ diff --git a/docs/source/examples/pics/13.method_initiators.png b/docs/source/examples/pics/13.method_initiators.png new file mode 100644 index 0000000..3dfe5ec Binary files /dev/null and b/docs/source/examples/pics/13.method_initiators.png differ diff --git a/docs/source/examples/pics/14.method_parameters.png b/docs/source/examples/pics/14.method_parameters.png new file mode 100644 index 0000000..8ca78a1 Binary files /dev/null and b/docs/source/examples/pics/14.method_parameters.png differ diff --git a/docs/source/examples/pics/15.extend_config.png b/docs/source/examples/pics/15.extend_config.png new file mode 100644 index 0000000..015a9bd Binary files /dev/null and b/docs/source/examples/pics/15.extend_config.png differ diff --git a/docs/source/examples/pics/16.save_method.png b/docs/source/examples/pics/16.save_method.png new file mode 100644 index 0000000..79f2450 Binary files /dev/null and b/docs/source/examples/pics/16.save_method.png differ diff --git a/docs/source/examples/pics/17.run_method.png b/docs/source/examples/pics/17.run_method.png new file mode 100644 index 0000000..2085f67 Binary files /dev/null and b/docs/source/examples/pics/17.run_method.png differ diff --git a/docs/source/examples/pics/18.set_u.png b/docs/source/examples/pics/18.set_u.png new file mode 100644 index 0000000..66d2bba Binary files /dev/null and b/docs/source/examples/pics/18.set_u.png differ diff --git a/docs/source/examples/pics/19.print_calc.png b/docs/source/examples/pics/19.print_calc.png new file mode 100644 index 0000000..b565d15 Binary files /dev/null and b/docs/source/examples/pics/19.print_calc.png differ diff --git a/docs/source/examples/pics/20.P_is_0.png b/docs/source/examples/pics/20.P_is_0.png new file mode 100644 index 0000000..8431cbf Binary files /dev/null and b/docs/source/examples/pics/20.P_is_0.png differ diff --git a/docs/source/examples/pics/21.I_is_1.png b/docs/source/examples/pics/21.I_is_1.png new file mode 100644 index 0000000..ea40ac2 Binary files /dev/null and b/docs/source/examples/pics/21.I_is_1.png differ diff --git a/docs/source/examples/pics/22.P_is_230.png b/docs/source/examples/pics/22.P_is_230.png new file mode 100644 index 0000000..7ef3975 Binary files /dev/null and b/docs/source/examples/pics/22.P_is_230.png differ diff --git a/docs/source/examples/pics/23.new_dashboard.png b/docs/source/examples/pics/23.new_dashboard.png new file mode 100644 index 0000000..90b0228 Binary files /dev/null and b/docs/source/examples/pics/23.new_dashboard.png differ diff --git a/docs/source/examples/pics/24.new_panel.png b/docs/source/examples/pics/24.new_panel.png new file mode 100644 index 0000000..56d083c Binary files /dev/null and b/docs/source/examples/pics/24.new_panel.png differ diff --git a/docs/source/examples/pics/25.ds.png b/docs/source/examples/pics/25.ds.png new file mode 100644 index 0000000..e378776 Binary files /dev/null and b/docs/source/examples/pics/25.ds.png differ diff --git a/docs/source/examples/pics/26.stat.png b/docs/source/examples/pics/26.stat.png new file mode 100644 index 0000000..f3e3dd0 Binary files /dev/null and b/docs/source/examples/pics/26.stat.png differ diff --git a/docs/source/examples/pics/27.path.png b/docs/source/examples/pics/27.path.png new file mode 100644 index 0000000..bdd1672 Binary files /dev/null and b/docs/source/examples/pics/27.path.png differ diff --git a/docs/source/examples/pics/28.q.png b/docs/source/examples/pics/28.q.png new file mode 100644 index 0000000..30a6088 Binary files /dev/null and b/docs/source/examples/pics/28.q.png differ diff --git a/docs/source/examples/pics/29.params.png b/docs/source/examples/pics/29.params.png new file mode 100644 index 0000000..5447dd6 Binary files /dev/null and b/docs/source/examples/pics/29.params.png differ diff --git a/docs/source/examples/pics/30.data.png b/docs/source/examples/pics/30.data.png new file mode 100644 index 0000000..136bf93 Binary files /dev/null and b/docs/source/examples/pics/30.data.png differ diff --git a/docs/source/examples/pics/31.add_query.png b/docs/source/examples/pics/31.add_query.png new file mode 100644 index 0000000..d010070 Binary files /dev/null and b/docs/source/examples/pics/31.add_query.png differ diff --git a/docs/source/examples/pics/32.remove_threshold.png b/docs/source/examples/pics/32.remove_threshold.png new file mode 100644 index 0000000..6d336d7 Binary files /dev/null and b/docs/source/examples/pics/32.remove_threshold.png differ diff --git a/docs/source/examples/pics/33.save.png b/docs/source/examples/pics/33.save.png new file mode 100644 index 0000000..445a6e2 Binary files /dev/null and b/docs/source/examples/pics/33.save.png differ diff --git a/docs/source/examples/pics/34.trend.png b/docs/source/examples/pics/34.trend.png new file mode 100644 index 0000000..f4d4bf8 Binary files /dev/null and b/docs/source/examples/pics/34.trend.png differ diff --git a/docs/source/examples/pics/35.space.png b/docs/source/examples/pics/35.space.png new file mode 100644 index 0000000..e1ad54e Binary files /dev/null and b/docs/source/examples/pics/35.space.png differ diff --git a/docs/source/examples/pics/36.trend_fields.png b/docs/source/examples/pics/36.trend_fields.png new file mode 100644 index 0000000..5270c59 Binary files /dev/null and b/docs/source/examples/pics/36.trend_fields.png differ diff --git a/docs/source/examples/pics/37.periods.png b/docs/source/examples/pics/37.periods.png new file mode 100644 index 0000000..12601f6 Binary files /dev/null and b/docs/source/examples/pics/37.periods.png differ diff --git a/docs/source/examples/pics/38.check.png b/docs/source/examples/pics/38.check.png new file mode 100644 index 0000000..50210ed Binary files /dev/null and b/docs/source/examples/pics/38.check.png differ diff --git a/docs/source/examples/pics/39.cache.png b/docs/source/examples/pics/39.cache.png new file mode 100644 index 0000000..a7dc192 Binary files /dev/null and b/docs/source/examples/pics/39.cache.png differ