从bacnet设备读取点值时出错

时间:2018-11-27 01:17:27

标签: python 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开始(精简版)   2018-11-26 17:45:51,908-信息|使用ip:192.168.0.16   2018-11-26 17:45:51,909-信息|正在启动应用...   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-信息|将设备状态更改为RPDeviceConnected'>   2018-11-26 17:45:54,928-信息|设备1610219:发现[device1610219] ...建筑要点列表   2018-11-26 17:45:57,674-信息|准备!   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行       args_split,arr_index = arr_index,vendor_id = vendor_id,bacoid = bacoid))     在build_rp_request中的第310行中,文件“ C:_website \ BacTest \ venv \ lib \ site-packages \ BAC0 \ core \ io \ Read.py”       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 device1610219 / ai_10:-53.30华氏度 device1610219 / ai_1:0.00 noUnits

以退出代码0结束的过程

1 个答案:

答案 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