BACnetRP ======== ``BACWrite.cpp`` |image0| **BACnet (Building Automation and Control Networks)** — это стандартный протокол связи, разработанный для обеспечения взаимодействия между системами автоматизации зданий. BACnet был создан для облегчения коммуникации между различными устройствами и системами, такими как системы управления климатом, освещением, безопасностью и энергопотреблением в зданиях. **BACnet RP (BACnet Read-Write Property)** — это часть стандарта BACnet, которая определяет методы чтения и записи свойств объектов в устройствах BACnet. Это позволяет управлять и настраивать параметры устройств, такие как температура, влажность, уровень освещенности и другие. В BACnet устройства представлены в виде объектов, каждый из которых имеет определенные свойства. >Например, объект “Термостат” может иметь свойства “Текущая температура” и “Установленная температура”. Он позволяет читать значения свойств объектов (например, текущую температуру) и записывать новые значения. BACnet RP поддерживает многоадресную передачу, что позволяет одному запросу достигать нескольких устройств одновременно. .. raw:: html
Узел опроса отдельных свойств устройств в сети BACnet. ------------------------------------------------------ |image1| Входные значения ---------------- - **BACRegisterRP**: - **iface** - сетевой интерфейс, через который устройство взаимодействует в сети, берётся значение передаваемого **ip** ``str`` - **ip** - идентификация устройства в системе Bacnet ``str`` - **port** - идентификация службы на устройстве ``str`` - **cmd** - ``str`` - **period** - период сбора информации ``int`` в cекундах. - **block** - указывает на размер блока передаваемой информации - **device-instance** - адрес bacnet сервера - **device-name** - ``str`` - **object-type** - тип устройства ``int`` - **object-instance** - ``int`` - **property-name** - ``str`` - **property** - читаемое свойство ``str`` - **description** - текстовое описание ``str`` - **source** - ``str`` **RegistersCSV** - количество строк в файле *csv*, переменная. Из класса **BACRegisterRP** собирается вектор **RPDevices**, содержащий информацию об устройствах. Данный вектор будет отправлен после того, как полностью соберется. При возникновении ошибок хотя бы в одном элементе вектор отправлен не будет. - **host** - значение хоста для Redis - **REDIS-Port** - порт для Redis. По умолчанию - 6379. Redis собирает информацию, полученную за какой-то выбранный период времени и отправляет запрос к Bacnet. Пример входного файла CSV: ^^^^^^^^^^^^^^^^^^^^^^^^^^ .. csv-table:: Table :header: "ip", "port", "cmd", "period", "block", "device-instance", "device-name", "object-type", "object-instance", "property", "property-name", "description", "source" :widths: 15, 10, 10, 10, 10, 15, 15, 15, 15, 15, 20, 20, 30 "172.18.0.3", "47808", "rp", "550", "50", "0", "bacs_demo", "2", "1", "area1", "85", "Активация ДУ-1", "МФК/ARK-5/Активация ДУ-1" "172.18.0.3", "47808", "rp", "550", "50", "0", "bacs_demo", "2", "2", "area2", "85", "Активация ДУ-2", "МФК/ARK-5/Активация ДУ-2" **CSV** :: ip;port;cmd;period;block;device-instance;device-name;object-type;object-instance;property-name;property;description;source 172.18.0.4;47808;rp;3;50;0;bacnet_test;2;1;area1;85;Активация ДУ-1;МФК/ARK-5/Активация ДУ-1 172.18.0.4;47808;rp;3;50;0;enp0s3;2;2;area2;85;Активация ДУ-2;МФК/ARK-5/Активация ДУ-2 Возвращаемые значения --------------------- - **connection_status** - **time** - ``int64`` - **values**:[ - **property-name** - ``str`` - **property** - имя считываемого свойства ``str`` - **description** - текстовое описание свойства ``str`` - **source** - источник данных ``str`` - **value** - значение свойства с устройства ``str`` - **timer** - считается время выполнения запроса ``double`` ] **Пример Json** .. code:: json { "time": 1672531200000, "values": [ { "property-name": "area1", "description": "Активация ДУ-1", "source": "МФК/ARK-5/Активация ДУ-1", "value": "22", "timer": 0.1 }, { "property-name": "area2", "description": "Активация ДУ-2", "source": "МФК/ARK-5/Активация ДУ-2", "value": "45", "timer": 0.15 } ] } .. raw:: html
Пример использования -------------------- Добавим в наш **compose.yaml** контейнер для тестирования bacnet. .. code:: yaml bacnet: container_name: bacnet_emul restart: on-failure build: dockerfile: ./test_server/bac_eml.Dockerfile ports: - 47808:47808 Далее собираем наш проект и смотрим ip нашего контейнера, на который мы должны отправлять запросы. ``docker inspect bacnet_emul`` |image2| Для использования Bacnet в узле нам потребуется создать файл **.csv**, и поместить в него нашу конфигурацию. |image3| Соберем простенькую цепочку |image4| Выберем наш *Json*-файл в проводнике |image5| Сохраняем цепочку и смотрим |image6| .. |image0| image:: ../../_img/BacnetRP_input_icon.png .. |image1| image:: ../../_img/bacnetRP_input_settings.png .. |image2| image:: ../../_img/bacnet_find_ip.png .. |image3| image:: ../../_img/bacnetRP_example_file.png .. |image4| image:: ../../_img/BacnetRP_example_chain.png .. |image5| image:: ../../_img/BacnetRP_example_settings.png .. |image6| image:: ../../_img/BacnetRP_example_console.png