как запустить функцию с помощью BAC0 в python3, когда имеет Notify by COV

#python #python-3.x #bacnet

#python #python-3.x #bacnet

Вопрос:

Привет, я разрабатываю проект с помощью bacnet (библиотеки BAC0) и python 3, и это мой код в моем методе

         // Connect in Lite Mode
        self.bacnet = BAC0.connect(
            ip='192.168.1.2'
        )
        self.bacnet.discover(networks='known')
        tmp = self.bacnet.devices
        my_controller = BAC0.device(address=tmp[0][2], device_id=tmp[0][3], network=self.bacnet)
        points = my_controller.points
        point = points[0]   
        numeric_point = self.GetNumericPoint(point)
        
        // create a while for change value of point and trig COV notification
        while True:
            i = i   1
            numeric_point.write(i, prop="presentValue", priority="12")
            value = numeric_point
            time.sleep(1)
            print('wait')
  

И вопрос в том, как запустить функцию с помощью BAC0 в python3, когда имеет Notify by COV (изменение значения)
Спасибо.

Ответ №1:

На данный момент COV реализован только в ветке разработки. Это будет в следующем выпуске, не знаю когда.

Вы можете подписаться на COV для любой точки (если ваше устройство поддерживает это). Когда уведомление будет получено, история точки будет записана, поэтому последнее значение точки будет точным.

По умолчанию объявлены подтвержденные значения. Но вы также можете настроить это как время жизни.

 # This would declare a COV for a point.
device['point'].subscribe_cov(confirmed=False, lifetime=900)
# This would declare a COV outside the context of a device
bacnet.cov(address, objectID, confirmed=True, lifetime=None)
  

Отредактируйте, чтобы проиллюстрировать использование обратного вызова, добавленного в ветку разработки

 # The Notification will pass a variable named "elements" to the callback
# your function must include this argument

# elements is a dict containing all the information of the COV
def my_callback(elements):
    print("Present value is : {}".format(elements['properties']['presentValue'])

bacnet.cov(address, objectID, confirmed=True, lifetime=None, callback=my_callback)
  

ObjectId : кортеж с («ObjectType», экземпляр), например («analogInput», 1)

Более подробная информация доступна в документации : https://bac0.readthedocs.io/en/latest/cov.html ?выделить=cov

Комментарии:

1. Спасибо, мой друг, не мог бы ты, пожалуйста, написать пример для bacnet.cov(address, objectID, confirmed=True, lifetime=None) , чтобы вывести его текущее значение в качестве функции обратного вызова. (если это возможно) и для точки, как создать ObjectId. это правда? objectID="analogInput:12"

2. Я добавил этот пример в качестве правки исходного ответа

3. Большое спасибо Кристиану. Не могли бы вы рассказать мне, как создать #ObjectId # Я не могу найти никакого описания об этом в вашей документации.

4. Идентификатор объекта поступает от самого устройства. bacnet. whois() и bacnet.read (адресный список объектов bacoid устройства) выдадут вам то, что доступно в устройстве.

5. пример. Контроллер MSTP в сети 2 с MAC-адресом 4, который будет иметь аналоговый вход с адресом 1… « bacnet.cov («2:4», («analogInput», 1)) « Поэтому я предполагаю, что короткий ответ будет: кортеж («строка типа объекта», экземпляр)