Ошибка чтения значений точек с устройства BACNET
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 - INFO | Зарегистрировано как простое приложение 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 градусов по Фаренгейту device1610219/ai_6: 75,00 градусов по Фаренгейту device1610219/ai_11: 1,00 65535
Процесс завершен с кодом выхода 0
0 ответов
Я провел несколько тестов, пытаясь повторить вашу ошибку, и я думаю, что вы можете бороться со странным устройством.
Используя тот же сценарий, мне удалось прочитать все пункты.
Хотя, если я могу предложить, объявление вашего устройства с использованием параметров "опрос" по умолчанию будет гарантировать чтение всех точек каждые 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