Python 3.x中BAC0/Bacpypes的positiveIntegerValue实现问题求助
问题分析
报错TypeError: invalid constructor datatype源于Bacpypes处理positiveIntegerValue对象的presentValue属性时数据类型映射错误。默认情况下,BAC0创建的positiveIntegerValue未将presentValue正确绑定为PositiveInteger类型,导致读取请求触发类型构造失败,进而引发客户端的列表索引越界错误。
解决方案
1. 自定义PositiveIntegerValue对象类(推荐)
通过继承BAC0基础对象类,手动指定presentValue的类型为PositiveInteger,确保类型映射正确:
from BAC0.core.devices.local.object import Object from bacpypes.primitivedata import PositiveInteger from bacpypes.basetypes import PositiveIntegerValueObjectType class CustomPositiveIntegerValue(Object): _object_type = PositiveIntegerValueObjectType _properties = ['presentValue', 'name', 'description', 'units'] _required_properties = ['presentValue', 'name'] def __init__(self, **kwargs): # 强制将presentValue转换为PositiveInteger类型 if 'presentValue' in kwargs: kwargs['presentValue'] = PositiveInteger(kwargs['presentValue']) super().__init__(**kwargs)
使用自定义类创建对象:
# 在Jupyter Notebook中创建虚拟设备对象 CustomPositiveIntegerValue(instance = 10, name = "Power", description = "Instantaneous Power", units = "watts", presentValue = 18)
2. 手动修正默认对象的类型
若不想自定义类,可在创建默认positive_integer_value后,手动替换presentValue的类型:
from bacpypes.primitivedata import PositiveInteger # 创建默认对象 piv = positive_integer_value(instance = 10, name = "Power", description = "Instantaneous Power", units = "watts", presentValue = 18) # 修正presentValue类型 piv.presentValue = PositiveInteger(18)
3. 升级依赖库
确保使用最新版本的BAC0和Bacpypes,避免版本兼容问题:
pip install --upgrade BAC0 bacpypes
4. 验证读取命令格式
确认读取命令的地址格式正确,若设备使用非默认端口,可尝试指定端口:
av = self.bacnet.read("192.168.1.2:47808 positiveIntegerValue 10 presentValue")
注意事项
- 确保
presentValue的取值为正整数(大于0),符合BACnet规范中PositiveInteger的定义; - 测试时可先通过BAC0本地设备属性直接读取
presentValue,验证对象创建是否正确,再跨程序测试。
内容的提问来源于stack exchange,提问作者Noah W.
相关产品推荐
相关产品推荐

