1
0
mirror of https://github.com/JoelBender/bacpypes synced 2025-09-28 22:15:23 +08:00

Attempt to implement the feature where some properties must be writable when OutOfService is set to True.

I've added a new parameter to ReadProperty and OptionalProperty named writable_if_oos that propagate to the property.
Then at the object level, it is possible to look this parameter in the property then check the outOfService value to change mutability of the property on the fly.
In the ReadProperty function, I will also check the OutOfService property to reset mutability if no longer needed.
Internally, in the app, if writing to the presentValue directly, a validation of the OutOfService property will be possible when this parameter is True so the program won't update the value of the property as long as the OutOfService property is True.

It could also be a good practice that the program can reset the mutability as soon as OutOfService is set to false in the logic of the program... not necessarely fast enough to wait for a network Read on the property.

Signed-off-by: Christian Tremblay <christian.tremblay@servisys.com>
This commit is contained in:
Christian Tremblay 2019-08-23 11:10:04 -04:00
parent a9239037c0
commit 9e318177b4

View File

@ -150,7 +150,7 @@ def get_datatype(object_type, propid, vendor_id=0):
@bacpypes_debugging
class Property:
def __init__(self, identifier, datatype, default=None, optional=True, mutable=True):
def __init__(self, identifier, datatype, default=None, optional=True, mutable=True, writable_if_oos=False):
if _debug:
Property._debug("__init__ %s %s default=%r optional=%r mutable=%r",
identifier, datatype, default, optional, mutable
@ -167,6 +167,7 @@ class Property:
self.optional = optional
self.mutable = mutable
self.default = default
self.writable_if_oos = writable_if_oos
def ReadProperty(self, obj, arrayIndex=None):
if _debug:
@ -360,7 +361,7 @@ class Property:
@bacpypes_debugging
class StandardProperty(Property):
def __init__(self, identifier, datatype, default=None, optional=True, mutable=True):
def __init__(self, identifier, datatype, default=None, optional=True, mutable=True, writable_if_oos=False):
if _debug:
StandardProperty._debug("__init__ %s %s default=%r optional=%r mutable=%r",
identifier, datatype, default, optional, mutable
@ -375,7 +376,7 @@ class StandardProperty(Property):
raise ConfigurationError("unknown standard property identifier: %s" % (identifier,))
# continue with the initialization
Property.__init__(self, identifier, datatype, default, optional, mutable)
Property.__init__(self, identifier, datatype, default, optional, mutable, writable_if_oos)
#
# OptionalProperty
@ -386,14 +387,14 @@ class OptionalProperty(StandardProperty):
"""The property is required to be present and readable using BACnet services."""
def __init__(self, identifier, datatype, default=None, optional=True, mutable=False):
def __init__(self, identifier, datatype, default=None, optional=True, mutable=False, writable_if_oos=False):
if _debug:
OptionalProperty._debug("__init__ %s %s default=%r optional=%r mutable=%r",
identifier, datatype, default, optional, mutable
)
# continue with the initialization
StandardProperty.__init__(self, identifier, datatype, default, optional, mutable)
StandardProperty.__init__(self, identifier, datatype, default, optional, mutable, writable_if_oos)
#
# ReadableProperty
@ -404,14 +405,14 @@ class ReadableProperty(StandardProperty):
"""The property is required to be present and readable using BACnet services."""
def __init__(self, identifier, datatype, default=None, optional=False, mutable=False):
def __init__(self, identifier, datatype, default=None, optional=False, mutable=False, writable_if_oos=False):
if _debug:
ReadableProperty._debug("__init__ %s %s default=%r optional=%r mutable=%r",
identifier, datatype, default, optional, mutable
)
# continue with the initialization
StandardProperty.__init__(self, identifier, datatype, default, optional, mutable)
StandardProperty.__init__(self, identifier, datatype, default, optional, mutable, writable_if_oos)
#
# WritableProperty
@ -590,6 +591,11 @@ class Object:
if not prop:
raise PropertyError(propid)
if prop.writable_if_oos:
# Reset mutability if no longer needed
if not self._properties.get("outOfService"):
prop.mutable = False
# defer to the property to get the value
return prop.ReadProperty(self, arrayIndex)
@ -601,6 +607,13 @@ class Object:
if not prop:
raise PropertyError(propid)
if prop.writable_if_oos:
if self._properties.get("outOfService"):
# Turn on mutability as OutOfService is true
prop.mutable = True
else:
prop.mutable = False
# defer to the property to set the value
return prop.WriteProperty(self, value, arrayIndex, priority, direct)
@ -949,11 +962,11 @@ class AlertEnrollmentObject(Object):
class AnalogInputObject(Object):
objectType = 'analogInput'
properties = \
[ ReadableProperty('presentValue', Real)
[ ReadableProperty('presentValue', Real, writable_if_oos=True)
, OptionalProperty('deviceType', CharacterString)
, ReadableProperty('statusFlags', StatusFlags)
, ReadableProperty('eventState', EventState)
, OptionalProperty('reliability', Reliability)
, OptionalProperty('reliability', Reliability, writable_if_oos=True)
, ReadableProperty('outOfService', Boolean)
, OptionalProperty('updateInterval', Unsigned)
, ReadableProperty('units', EngineeringUnits)