15
15
import asyncio
16
16
from asyncio import Queue , CancelledError , QueueEmpty
17
17
from copy import deepcopy
18
+ from datetime import time
18
19
from threading import Thread
19
20
from string import ascii_lowercase
20
21
from random import choice
21
22
from time import monotonic , sleep
22
23
from typing import TYPE_CHECKING
24
+ from ast import literal_eval
23
25
24
26
from thingsboard_gateway .connectors .bacnet .ede_parser import EDEParser
25
27
from thingsboard_gateway .connectors .bacnet .entities .routers import Routers
37
39
from bacpypes3 .apdu import ErrorRejectAbortNack
38
40
39
41
from bacpypes3 .pdu import Address , IPv4Address
42
+ from bacpypes3 .primitivedata import Null , Real
43
+ from bacpypes3 .basetypes import DailySchedule , TimeValue , DeviceObjectPropertyReference
40
44
41
45
from thingsboard_gateway .connectors .bacnet .device import Device , Devices
42
46
from thingsboard_gateway .connectors .bacnet .entities .device_object_config import DeviceObjectConfig
43
47
from thingsboard_gateway .connectors .bacnet .application import Application
44
48
from thingsboard_gateway .connectors .bacnet .backward_compatibility_adapter import BackwardCompatibilityAdapter
45
- from bacpypes3 .primitivedata import Null
46
49
47
50
if TYPE_CHECKING :
48
51
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
540
543
if value is None :
541
544
value = Null (())
542
545
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
+
543
552
await self .__application .write_property (address , object_id , property_id , value , priority = priority )
544
553
return "ok"
545
554
except ErrorRejectAbortNack as err :
@@ -548,6 +557,32 @@ async def __write_property(self, address, object_id, property_id, value, priorit
548
557
self .__log .error ('Error writing property %s:%s to device %s: %s' , object_id , property_id , address , err )
549
558
return err .__str__ ()
550
559
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
+
551
586
async def __convert_data (self ):
552
587
while not self .__stopped :
553
588
try :
0 commit comments