Ошибка чтения значений точек с устройства BACNET - PullRequest
0 голосов
/ 27 ноября 2018
import BAC0

bacnet = BAC0.connect()

my_obj_list = [('file', 1),
             ('analogInput', 1002),
             ('analogInput', 1),
             ('analogInput', 1006),
             ('analogInput', 1011),
             ('analogInput', 1010),
             ('analogInput', 1001)]


# # Provide it as an argument
fx = BAC0.device('16102:19', 1610219, bacnet, object_list = my_obj_list)
p=fx.points
for point in p:
    print(point)

Код возвращает значения точек, как и ожидалось, но выдает исключение.Не могу понять, что я делаю не так.

ошибка

2018-11-26 17: 45: 51,864 - ИНФОРМАЦИЯ |Начиная с версии BAC0 0.99.944 (Lite) 2018-11-26 17: 45: 51 908 - ИНФОРМАЦИЯ |Использование ip: 192.168.0.16 2018-11-26 17: 45: 51,909 - INFO |Запуск приложения ... 2018-11-26 17: 45: 51,910 - ИНФОРМАЦИЯ |BAC0 начал 2018-11-26 17: 45: 51,910 - ИНФОРМАЦИЯ |Зарегистрировано как простое приложение BACnet / IP 2018-11-26 17: 45: 54,529 - ИНФОРМАЦИЯ |Изменение состояния устройства на DeviceDisconnected '> 2018-11-26 17: 45: 54,726 - INFO |Изменение состояния устройства на RPDeviceConnected '> 2018-11-26 17: 45: 54,928 - INFO |Устройство 1610219: [устройство1610219] найдено ... список точек строительства 2018-11-26 17: 45: 57,674 - INFO |Готовы!2018-11-26 17: 45: 57,676 - ИНФОРМАЦИЯ |Опрос начат, значения читаются каждые 10 секунд. Исключение в потоке rpm_poll: трассировка (последний вызов был последним): файл "C: \ Program Files (x86) \ Microsoft Visual Studio \ Shared \ Anaconda3_64 \ lib \ threading.py", строка 916,в файле _bootstrap_inner self.run () "C: _website \ BacTest \ venv \ lib \ site-packages \ BAC0 \ tasks \ TaskManager.py", строка 45, в файле запуска self.process () "C: _website \ BacTest \venv \ lib \ site-packages \ BAC0 \ tasks \ TaskManager.py ", строка 52, в процессе self.task () Файл" C: _website \ BacTest \ venv \ lib \ site-packages \ BAC0 \ tasks \ Poll.py", строка 77, в задаче self.device.read_multiple (list (self.device.points_name), points_per_request = 25) Файл" C: _website \ BacTest \ venv \ lib \ site-packages \ BAC0 \ core \ devices \ mixins \ "read_mixin.py ", строка 452, в read_multiple self.read_single (каждый, points_per_request = 1, Discover_request = Discover_request) Файл" C: _website \ BacTest \ venv \ lib \ site-packages \ BAC0 \ core \ devices \ mixins \ read_mixin.py ", строка 459, в read_single возвращает self.properties.network.read (запрос) Файл" C: _website \ BacTest \ venv \ lib \ site-packages \ BAC0 \ core \ io \ Read.py ", строка 87, в файле read args_split, arr_index = arr_index, vendor_id = vendor_id, bacoid = bacoid)) Файл" C: _website \ BacTest \ venv\ lib \ site-packages \ BAC0 \ core \ io \ Read.py ", строка 310, в build_rp_request addr, obj_type, obj_inst, prop_id = args [: 4] ValueError: недостаточно значений для распаковки (ожидается 4, получено 2)

device1610219 / ai_2: 2,30 noUnits device1610219 / zone_temp: 45,00 градусов по Фаренгейту устройство 1610219 / ai_6: 75,00 градусов по Фаренгейту 1610219 / ai_11: 1,00 65535 устройство1610219 / ai_101: 0,000 градусов по железной дороге: 105 * 5201011 * Процесс завершен с кодом выхода 0

1 Ответ

0 голосов
/ 07 декабря 2018

Я провел несколько тестов, пытаясь воспроизвести вашу ошибку, и я думаю, что вы, возможно, боретесь со странным устройством.

Используя точно такой же сценарий, я успешно читаю все точки.

ЕслиЯ могу предложить, однако, объявление вашего устройства с использованием параметров «опрос» по умолчанию будет гарантировать чтение всех точек каждые 10 секунд.

Использование точек приведет к считыванию точек (одна за другой) при вызове, что замедлит процесс.Для этого я бы использовал point.lastValue

Когда устройство внутренне опрашивает свой список точек, оно будет использовать ReadPropertyMultiple, который будет считывать несколько точек и свойств одновременно.Это более эффективно.

Что-то вроде (игра в формате ...):

import BAC0

bacnet = BAC0.lite()

# # Provide it as an argument
fx = BAC0.device('2:5', 5, bacnet)

for name in fx.points_name:
    if fx[name].units:
        val = '{:>10.2f}'.format(fx[name].lastValue)
        units = fx[name].units
    else:
        units = '({})'.format(fx[name].properties.units_state)
        val = '{:>10}'.format(fx[name].lastValue)
    print('{:<20} : {} {:<10}'.format(fx[name].properties.name, val, units))

(извлечение результата)

2018-12-06 20:43:17,167 - INFO    | Starting BAC0 version 0.99.944 (Lite)
2018-12-06 20:43:17,283 - INFO    | Using ip : 192.168.210.11
2018-12-06 20:43:17,285 - INFO    | Starting app...
2018-12-06 20:43:17,292 - INFO    | BAC0 started
2018-12-06 20:43:17,292 - INFO    | Registered as Simple BACnet/IP App
2018-12-06 20:43:19,295 - INFO    | Changing device state to DeviceDisconnected'>
2018-12-06 20:43:20,156 - INFO    | Changing device state to RPMDeviceConnected'>
2018-12-06 20:43:20,716 - INFO    | Device 5:[FX14 0005] found... building points 
2018-12-06 20:43:32,691 - INFO    | Ready!
2018-12-06 20:43:32,696 - INFO    | Polling started, values read every 10 seconds
nvoAI3               :      -1.17 degreesCelsius
nvoAI4               :      42.33 percent
nvoAI6               :     354.00 kilopascals
nvoAI5               :       1.85 percent
nvoAI1               :      22.05 degreesCelsius
nvoAI2               :      20.84 degreesCelsius
[...]
nciOvrdDO5.State     :          1 (['AUTO', 'ON', 'OFF'])
nvoAlarmPompe        :          1 (['OFF', 'ON'])
nvoAlrmGravePompe    :          1 (['OFF', 'ON'])
nvoTempOccup         :          1 (['OFF', 'ON'])
nciModeOperation     :          2 (['ARRET', 'AUTO', 'CHAUFF', 'REFROID', 'ELECTR'])
nciOvrdDO2.State     :          1 (['AUTO', 'ON', 'OFF'])
nciOvrdDO3.State     :          1 (['AUTO', 'ON', 'OFF'])
nciOvrdDO4.State     :          1 (['AUTO', 'ON', 'OFF'])
nciOvrdDO1.State     :          1 (['AUTO', 'ON', 'OFF'])
nciModeDeshum        :          1 (['Aucune', 'Ventilation', 'Rechauff'])
nciOvrdAO1.State     :          2 (['AUTO', 'MAN', '100', '0'])
nciOvrdAO2.State     :          1 (['AUTO', 'MAN', '100', '0'])
nvoDI7               :   inactive (('Off', 'On'))
nvoDI8               :   inactive (('Off', 'On'))
nvoDI10              :   inactive (('Off', 'On'))
nvoDI9               :   inactive (('Off', 'On'))
nvoDI6               :   inactive (('Off', 'On'))
nvoDI4               :   inactive (('Off', 'On'))

Если проблемы продолжают возникатьПожалуйста, напишите один здесь: https://github.com/ChristianTremblay/BAC0/issues

...