Получение значений Bacnet с использованием Python3

Я хотел бы реализовать простой цикл для извлечения всех значений моего бакнета вместе, не спрашивая каждого по одному, но получая сообщение об ошибке. Или есть ли лучший способ собрать все значения вместе? Кто-нибудь может помочь, пожалуйста? Спасибо! Вот мой код (это работает):

import BAC0
bacnet = BAC0.connect()

a = bacnet.read('10.1.1.9 analogValue 1 presentValue')
print(a)

Но это не работает:

import BAC0
bacnet = BAC0.connect()

i = 0
for i = i+1:
    a = bacnet.read('10.1.1.9 analogValue % i presentValue')
    print(a)
end

Это дает ошибку:

ValueError: invalid literal for int() with base 10: '%'

Хорошо, я нашел решение как:

for i in range(1,5):
a = bacnet.read('10.1.1.9 analogValue {} presentValue'.format(i))
print(a)

person Hossain    schedule 24.10.2018    source источник
comment
Я решил это, я думаю..   -  person Hossain    schedule 25.10.2018


Ответы (1)


Это приведет к получению только аналоговых значений... если это то, что вы хотите. Но более глобальным подходом было бы использование подхода BAC0.device.

Вам понадобится идентификатор BACnet устройства, чтобы определить его:

import BAC0
bacnet = BAC0.lite()
deviceID = 1000 # example
dev = BAC0.device(‘10.1.1.9’, deviceID,bacnet,poll=30)
dev.points #will give you all points on which you can iterate if you want...

Это создаст устройство с именем «dev», на котором вы сможете взаимодействовать со многими свойствами. По умолчанию BAC0 будет определять AI, AV, AO, BI, BV, BO, MV, TrendLogs.

Вы также сможете получить информацию о точках или записать их, используя синтаксис квадратных скобок:

dev[“NameOfPoint”]
#Let’s pretend a point is named HTG-O
dev[“HTG-O”] = 100 #this will override the output
dev[“HTG-O”].value # will output the value to be used in some calculation

dev.properties #will give you more details on the point itself

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

poll=30 скажет BAC0 читать все переменные каждые 30 секунд... так что вы можете выбрать то, что соответствует вашим потребностям. Использование 0 отключит опрос. По умолчанию 10.

Каждый раз, когда значение опрашивается, оно будет сохранено в истории точек, чтобы вы могли получить все значения, используя:

dev[“YourPoint”].history
# This will give you a Pandas series ready to be used

Если вы хотите взаимодействовать с устройством, имеющим много точек (> 1000), вы, вероятно, захотите отключить опрос, возможно, отключить сегментацию, если требуется... но лучше всего было бы создать собственный список объектов с переменными, которые вы хотеть. Больше не надо.

Подробнее см. здесь: https://bac0.readthedocs.io/en/latest/controller.html

person Christian Tremblay    schedule 05.02.2019