0

(novice Python programmer at best here..)

I use a module to access a building automation system called BAC0. The script creates a building automation device out of my Windows laptop when it is ran to communicate BACnet to the building automation system over a local Wifi LAN to retrieve data.

Specifically this script below is polling a hot water plant controller for a leaving temperature sensor every 120 seconds, and then updating every 600 in the while True loop.

import BAC0
import time

#alarm setpoint
setPoint = 140

#connect to device
bacnet = BAC0.lite()
hws = BAC0.device('100:99', 30099, bacnet, poll=120, history_size=10000)



while True:

    data = hws['SHWS-T']

    time.sleep(600)


    if data > setPoint:
        good = f'[INFO] - Looks good, the temp of the {data} on {time.ctime()}'
        print(good)

    else:
        bad = f'[INFO] - Looks bad, the temp of the {data} on {time.ctime()}'
        print(bad)
        print("Here's the coldest last 10 recorded boiler supply temp readings")
        print(data.history.nsmallest(n=10, keep='last'))
        print("I better get some help!")

Anyways, what happens every once and a while is the controller doesn't respond, and then the scripts halts because if this... And it would be great if I knew how to do a retry like retry 3 times, and then just pass to wait another 600 seconds to retry again...

I know this isn't correct below but something like this???

try:
     if isinstance(Exception: Problem reading : SHWS-T) 
     # retry function?
     retry()

     else:
     # This is our sensor value
     pass

Full trace back:

benbartling@benbartling-HP-ProDesk-600-G1-SFF ~/Desktop/bac0 $ python interpreter.py
2019-04-12 13:39:49,484 - INFO    | Starting BAC0 version 0.99.944 (Lite)
2019-04-12 13:39:49,513 - INFO    | Using ip : 10.30.4.200
2019-04-12 13:39:49,514 - INFO    | Starting app...
2019-04-12 13:39:49,514 - INFO    | BAC0 started
2019-04-12 13:39:49,514 - INFO    | Registered as Simple BACnet/IP App
2019-04-12 13:39:51,517 - INFO    | Changing device state to DeviceDisconnected'>
2019-04-12 13:39:57,867 - INFO    | Changing device state to RPMDeviceConnected'>
2019-04-12 13:39:58,306 - INFO    | Device 30099:[Boiler] found... building points list
2019-04-12 13:39:59,683 - INFO    | Ready!
2019-04-12 13:39:59,688 - INFO    | Polling started, values read every 120 seconds
[INFO] - Looks good, the temp of the Boiler/SHWS-T : 141.62 degreesFahrenheit on Fri Apr 12 13:50:05 2019
[INFO] - Looks good, the temp of the Boiler/SHWS-T : 141.78 degreesFahrenheit on Fri Apr 12 14:00:06 2019
[INFO] - Looks good, the temp of the Boiler/SHWS-T : 143.18 degreesFahrenheit on Fri Apr 12 14:10:06 2019
[INFO] - Looks good, the temp of the Boiler/SHWS-T : 141.33 degreesFahrenheit on Fri Apr 12 14:20:06 2019
[INFO] - Looks good, the temp of the Boiler/SHWS-T : 143.15 degreesFahrenheit on Fri Apr 12 14:30:07 2019
[INFO] - Looks good, the temp of the Boiler/SHWS-T : 141.97 degreesFahrenheit on Fri Apr 12 14:40:07 2019
[INFO] - Looks good, the temp of the Boiler/SHWS-T : 141.42 degreesFahrenheit on Fri Apr 12 14:50:07 2019
[INFO] - Looks good, the temp of the Boiler/SHWS-T : 141.96 degreesFahrenheit on Fri Apr 12 15:00:08 2019
[INFO] - Looks good, the temp of the Boiler/SHWS-T : 141.19 degreesFahrenheit on Fri Apr 12 15:10:08 2019
[INFO] - Looks good, the temp of the Boiler/SHWS-T : 141.51 degreesFahrenheit on Fri Apr 12 15:20:09 2019
[INFO] - Looks good, the temp of the Boiler/SHWS-T : 142.76 degreesFahrenheit on Fri Apr 12 15:30:15 2019
[INFO] - Looks good, the temp of the Boiler/SHWS-T : 142.10 degreesFahrenheit on Fri Apr 12 15:40:15 2019
[INFO] - Looks good, the temp of the Boiler/SHWS-T : 142.66 degreesFahrenheit on Fri Apr 12 15:50:16 2019
[INFO] - Looks good, the temp of the Boiler/SHWS-T : 142.86 degreesFahrenheit on Fri Apr 12 16:00:16 2019
[INFO] - Looks good, the temp of the Boiler/SHWS-T : 141.98 degreesFahrenheit on Fri Apr 12 16:10:16 2019
[INFO] - Looks good, the temp of the Boiler/SHWS-T : 141.67 degreesFahrenheit on Fri Apr 12 16:20:16 2019
[INFO] - Looks good, the temp of the Boiler/SHWS-T : 142.45 degreesFahrenheit on Fri Apr 12 16:30:17 2019
[INFO] - Looks good, the temp of the Boiler/SHWS-T : 143.06 degreesFahrenheit on Fri Apr 12 16:40:17 2019
Traceback (most recent call last):
  File "/home/benbartling/anaconda3/lib/python3.6/site-packages/BAC0/core/devices/Points.py", line 112, in value
    self.properties.device.properties.address, self.properties.type, str(self.properties.address)))
  File "/home/benbartling/anaconda3/lib/python3.6/site-packages/BAC0/core/io/Read.py", line 163, in read
    "APDU Abort Reason : {}".format(reason))
BAC0.core.io.IOExceptions.NoResponseFromController: APDU Abort Reason : noResponse

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "interpreter.py", line 20, in <module>
    if data > setPoint:
  File "/home/benbartling/anaconda3/lib/python3.6/site-packages/BAC0/core/devices/Points.py", line 524, in __gt__
    return self.value > other
  File "/home/benbartling/anaconda3/lib/python3.6/site-packages/BAC0/core/devices/Points.py", line 116, in value
    'Problem reading : {}'.format(self.properties.name))
Exception: Problem reading : SHWS-T
bbartling
  • 3,288
  • 9
  • 43
  • 88

2 Answers2

1

As you defined polling, you should not need to read the point in your logic. Try using ´hws[SHWS-T].lastValue ´

Using the call to the point will force a read on the network, not efficient. LastValue will use the history of the point.

0

You can try using retrying PyPi package and modify your program according to your needs. Check https://pypi.org/project/retrying/

Something along these lines.

@retry(stop_max_attempt_number=3)
def read_from_sensor():
   #your code here
    pass

@retry(wait_fixed=6000)
def get_sensor_reading():
    read_from_sensor()

St1id3r
  • 313
  • 5
  • 12