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