Skip to content

Commit 9385f64

Browse files
authored
Merge pull request #1931 from majuss/BACnet-schedular-support
BACnet schedular support
2 parents 4698db1 + fe491a4 commit 9385f64

File tree

2 files changed

+48
-3
lines changed

2 files changed

+48
-3
lines changed

thingsboard_gateway/connectors/bacnet/bacnet_connector.py

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@
1515
import asyncio
1616
from asyncio import Queue, CancelledError, QueueEmpty
1717
from copy import deepcopy
18+
from datetime import time
1819
from threading import Thread
1920
from string import ascii_lowercase
2021
from random import choice
2122
from time import monotonic, sleep
2223
from typing import TYPE_CHECKING
24+
from ast import literal_eval
2325

2426
from thingsboard_gateway.connectors.bacnet.ede_parser import EDEParser
2527
from thingsboard_gateway.connectors.bacnet.entities.routers import Routers
@@ -37,12 +39,13 @@
3739
from bacpypes3.apdu import ErrorRejectAbortNack
3840

3941
from bacpypes3.pdu import Address, IPv4Address
42+
from bacpypes3.primitivedata import Null, Real
43+
from bacpypes3.basetypes import DailySchedule, TimeValue, DeviceObjectPropertyReference
4044

4145
from thingsboard_gateway.connectors.bacnet.device import Device, Devices
4246
from thingsboard_gateway.connectors.bacnet.entities.device_object_config import DeviceObjectConfig
4347
from thingsboard_gateway.connectors.bacnet.application import Application
4448
from thingsboard_gateway.connectors.bacnet.backward_compatibility_adapter import BackwardCompatibilityAdapter
45-
from bacpypes3.primitivedata import Null
4649

4750
if TYPE_CHECKING:
4851
from thingsboard_gateway.gateway.tb_gateway_service import TBGatewayService
@@ -540,6 +543,12 @@ async def __write_property(self, address, object_id, property_id, value, priorit
540543
if value is None:
541544
value = Null(())
542545

546+
if property_id == "weeklySchedule":
547+
value = self.__prepare_weekly_schedule_value(value)
548+
549+
if property_id == "listOfObjectPropertyReferences":
550+
value = self.__prepare_list_of_object_property_references_value(value, property_id)
551+
543552
await self.__application.write_property(address, object_id, property_id, value, priority=priority)
544553
return "ok"
545554
except ErrorRejectAbortNack as err:
@@ -548,6 +557,32 @@ async def __write_property(self, address, object_id, property_id, value, priorit
548557
self.__log.error('Error writing property %s:%s to device %s: %s', object_id, property_id, address, err)
549558
return err.__str__()
550559

560+
async def __prepare_weekly_schedule_value(self, value):
561+
schedule = []
562+
raw_schedule = literal_eval(value)
563+
for idx, day in enumerate(raw_schedule):
564+
schedule.append(DailySchedule(daySchedule=[]))
565+
for sched in day:
566+
schedule[idx].daySchedule.append(
567+
TimeValue(
568+
time=time(int(sched[0].split(":")[0]), int(sched[0].split(":")[1])),
569+
value=Real(sched[1])
570+
)
571+
)
572+
return schedule
573+
574+
async def __prepare_list_of_object_property_references_value(self, value, property_id):
575+
props = []
576+
raw_props = literal_eval(value)
577+
for prop in raw_props:
578+
props.append(
579+
DeviceObjectPropertyReference(
580+
objectIdentifier = prop,
581+
propertyIdentifier = property_id
582+
)
583+
)
584+
return props
585+
551586
async def __convert_data(self):
552587
while not self.__stopped:
553588
try:

thingsboard_gateway/connectors/bacnet/bacnet_uplink_converter.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
from bacpypes3.basetypes import DateTime
1717
from bacpypes3.constructeddata import AnyAtomic, Array
18-
from bacpypes3.basetypes import ErrorType, PriorityValue, ObjectPropertyReference
18+
from bacpypes3.basetypes import ErrorType, PriorityValue, ObjectPropertyReference, DailySchedule, DeviceObjectPropertyReference
1919

2020
from thingsboard_gateway.connectors.bacnet.bacnet_converter import AsyncBACnetConverter
2121
from thingsboard_gateway.connectors.bacnet.entities.uplink_converter_config import UplinkConverterConfig
@@ -109,9 +109,19 @@ def __convert_data(self, data):
109109
for item in value:
110110
if isinstance(item, PriorityValue):
111111
result.append(str(getattr(item, item._choice)))
112+
if isinstance(item, DailySchedule):
113+
schedular_array = []
114+
for sched in item.daySchedule:
115+
schedular_array.append((str(sched.time), str(sched.value.get_value())))
116+
result.append(schedular_array)
112117
else:
113118
result.append(item)
114-
119+
value = result
120+
elif isinstance(value, list):
121+
result = []
122+
for item in value:
123+
if isinstance(item, DeviceObjectPropertyReference):
124+
result.append(str(item.objectIdentifier))
115125
value = result
116126

117127
converted_data.append({'propName': str(value_prop_id), 'value': value})

0 commit comments

Comments
 (0)