How to use BAC0 readRange in Python

1.2k Views Asked by At

Hi every one I try to use BAC0 package in python 3 to get value of multiple point in bacnet network. I user something like following:

bacnet = BAC0.lite(ip=x.x.x.x)
tmp_points = bacnet.readRange("11:2 analogInput 0 presentValue");

and it seems not OK :( error is:

BAC0.core.io.IOExceptions.NoResponseFromController: APDU Abort Reason : unrecognizedService

And in document I just can find

    def readRange(
        self,
        args,
        range_params=None,
        arr_index=None,
        vendor_id=0,
        bacoid=None,
        timeout=10,
    ):
        """
        Build a ReadProperty request, wait for the answer and return the value

        :param args: String with <addr> <type> <inst> <prop> [ <indx> ]
        :returns: data read from device (str representing data like 10 or True)

        *Example*::

            import BAC0
            myIPAddr = '192.168.1.10/24'
            bacnet = BAC0.connect(ip = myIPAddr)
            bacnet.read('2:5 analogInput 1 presentValue')

        Requests the controller at (Network 2, address 5) for the presentValue of
        its analog input 1 (AI:1).
        """
1

There are 1 best solutions below

1
On

To read multiple properties from a device object, you must use readMultiple.

readRange will read from a property acting like an array (ex. TrendLogs objects implements records as an array, we use readRange to read them using chunks of records).

Details on how to use readMultiple can be found here : https://bac0.readthedocs.io/en/latest/read.html#read-multiple

A simple example would be

bacnet = BAC0.lite()
tmp_points = bacnet.readMultiple("11:2 analogInput 0 presentValue description")