def __init__(self, **kwargs): if _debug: SampleBinaryValueObject._debug("__init__ %r", kwargs) BinaryValueObject.__init__(self, **kwargs) # add a callback when the object name has changed self._property_monitors["objectIdentifier"].append( self.object_identifier_changed)
def test_8_10_3(self): """Canceling a Subscription""" if _debug: TestBinaryValue._debug("test_8_10_3") # create a network anet = ApplicationNetwork("test_8_10_3") # add the service capability to the IUT anet.td.add_capability(COVTestClientServices) anet.iut.add_capability(ChangeOfValueServices) # make a binary value object test_bv = BinaryValueObject( objectIdentifier=('binaryValue', 1), objectName='bv', presentValue='inactive', statusFlags=[0, 0, 0, 0], ) # an easy way to change the present value write_test_bv = lambda v: setattr(test_bv, 'presentValue', v) # add it to the implementation anet.iut.add_object(test_bv) # tell the TD how to respond to confirmed notifications anet.td.test_ack = True anet.td.test_reject = None anet.td.test_abort = None # wait for the subscription, then for the cancelation anet.iut.start_state.doc("8.10.3-1-0") \ .receive(SubscribeCOVRequest).doc("8.10.3-1-1") \ .receive(SubscribeCOVRequest).doc("8.10.3-1-2") \ .success() # send the subscription, wait for the ack, then send the cancelation # and wait for the ack. Ignore the notification that is sent when # after the subscription subscription_acked = anet.td.start_state.doc("8.10.3-2-0") \ .send(SubscribeCOVRequest( destination=anet.iut.address, subscriberProcessIdentifier=1, monitoredObjectIdentifier=('binaryValue', 1), issueConfirmedNotifications=False, lifetime=30, )).doc("8.10.3-2-1") \ .ignore(UnconfirmedCOVNotificationRequest) \ .receive(SimpleAckPDU).doc("8.10.3-2-2") \ .send(SubscribeCOVRequest( destination=anet.iut.address, subscriberProcessIdentifier=1, monitoredObjectIdentifier=('binaryValue', 1), )).doc("8.10.3-2-1") \ .ignore(UnconfirmedCOVNotificationRequest) \ .receive(SimpleAckPDU).doc("8.10.3-2-2") \ .success() # run the group anet.run()
def test_9_10_1_1(self): if _debug: TestBinaryValue._debug("test_9_10_1_1") notification_fail_time = 0.5 # create a network anet = ApplicationNetwork("test_9_10_1_1") # add the service capability to the IUT anet.td.add_capability(COVTestClientServices) anet.iut.add_capability(ChangeOfValueServices) # make a binary value object test_bv = BinaryValueObject( objectIdentifier=('binaryValue', 1), objectName='bv', presentValue='inactive', statusFlags=[0, 0, 0, 0], ) # add it to the implementation anet.iut.add_object(test_bv) # tell the TD how to respond to confirmed notifications anet.td.test_ack = True anet.td.test_reject = None anet.td.test_abort = None # wait for the subscription, wait for the notification ack anet.iut.start_state.doc("9.10.1.1-1-0") \ .receive(SubscribeCOVRequest).doc("9.10.1.1-1-1") \ .receive(SimpleAckPDU).doc("9.10.1.1-1-2") \ .timeout(10).doc("9.10.1.1-1-3") \ .success() # test device is quiet wait_for_notification = \ anet.td.start_state.doc("9.10.1.1-2-0") \ .send(SubscribeCOVRequest( destination=anet.iut.address, subscriberProcessIdentifier=1, monitoredObjectIdentifier=('binaryValue', 1), issueConfirmedNotifications=True, lifetime=30, )).doc("9.10.1.1-2-1") \ .receive(SimpleAckPDU).doc("9.10.1.1-2-2") # after the ack, don't wait too long for the notification wait_for_notification \ .timeout(notification_fail_time).doc("9.10.1.1-2-3").fail() # if the notification is received, success wait_for_notification \ .receive(ConfirmedCOVNotificationRequest).doc("9.10.1.1-2-4") \ .timeout(10).doc("9.10.1.1-2-5") \ .success() # run the group anet.run()
def test_simple_transition_unconfirmed(self): if _debug: TestBinaryValue._debug("test_simple_transition_unconfirmed") # create a network anet = ApplicationNetwork("test_simple_transition_unconfirmed") # add the service capability to the IUT anet.td.add_capability(COVTestClientServices) anet.iut.add_capability(ChangeOfValueServices) # make a binary value object test_bv = BinaryValueObject( objectIdentifier=('binaryValue', 1), objectName='bv', presentValue='inactive', statusFlags=[0, 0, 0, 0], ) # an easy way to change the present value write_test_bv = lambda v: setattr(test_bv, 'presentValue', v) # add it to the implementation anet.iut.add_object(test_bv) # tell the TD how to respond to confirmed notifications anet.td.test_ack = True anet.td.test_reject = None anet.td.test_abort = None # receive the subscription request, wait until the client has # received the ack and the 'instant' notification. Then change the # value, no ack coming back anet.iut.start_state.doc("3-1-0") \ .receive(SubscribeCOVRequest).doc("3-1-1") \ .wait_event("e1").doc("3-1-2") \ .call(write_test_bv, 'active').doc("3-1-3") \ .timeout(10).doc("3-2-4") \ .success() # test device is quiet anet.td.start_state.doc("3-2-0") \ .send(SubscribeCOVRequest( destination=anet.iut.address, subscriberProcessIdentifier=1, monitoredObjectIdentifier=('binaryValue', 1), issueConfirmedNotifications=False, lifetime=30, )).doc("3-2-1") \ .receive(SimpleAckPDU).doc("3-2-2") \ .receive(UnconfirmedCOVNotificationRequest).doc("3-2-3") \ .set_event("e1").doc("3-2-4") \ .receive(UnconfirmedCOVNotificationRequest).doc("3-2-5") \ .timeout(10).doc("3-2-6") \ .success() # run the group anet.run()
def test_changing_properties(self): """This test changes the value of multiple properties to verify that only one COV notification is sent.""" if _debug: TestBinaryValue._debug("test_changing_properties") # create a network anet = ApplicationNetwork("test_changing_properties") # add the service capability to the IUT anet.td.add_capability(COVTestClientServices) anet.iut.add_capability(ChangeOfValueServices) # make a binary value object test_bv = BinaryValueObject( objectIdentifier=('binaryValue', 1), objectName='bv', presentValue='inactive', statusFlags=[0, 0, 0, 0], ) # an easy way to change the present value def test_bv_fault(): if _debug: TestBinaryValue._debug("test_bv_fault") test_bv.presentValue = 'active' test_bv.statusFlags = [0, 0, 1, 0] # add it to the implementation anet.iut.add_object(test_bv) # receive the subscription request, wait until the client has # received the ack and the 'instant' notification. Then change the # value, no ack coming back anet.iut.start_state.doc("5-1-0") \ .receive(SubscribeCOVRequest).doc("5-1-1") \ .wait_event("e1").doc("5-1-2") \ .call(test_bv_fault).doc("5-1-3") \ .timeout(10).doc("5-2-4") \ .success() # test device is quiet anet.td.start_state.doc("5-2-0") \ .send(SubscribeCOVRequest( destination=anet.iut.address, subscriberProcessIdentifier=1, monitoredObjectIdentifier=('binaryValue', 1), issueConfirmedNotifications=False, lifetime=30, )).doc("5-2-1") \ .receive(SimpleAckPDU).doc("5-2-2") \ .receive(UnconfirmedCOVNotificationRequest).doc("5-2-3") \ .set_event("e1").doc("5-2-4") \ .receive(UnconfirmedCOVNotificationRequest).doc("5-2-5") \ .timeout(10).doc("5-2-6") \ .success() # run the group anet.run()
def create_BV(oid=1, pv=0, name="BV", activeText="On", inactiveText="Off"): bvo = BinaryValueObject( objectIdentifier=("binaryValue", oid), objectName=name, presentValue=pv, activeText=activeText, inactiveText=inactiveText, ) return bvo
def main(): global test_av, test_bv, test_application # make a parser parser = ConfigArgumentParser(description=__doc__) # parse the command line arguments args = parser.parse_args() if _debug: _log.debug("initialization") if _debug: _log.debug(" - args: %r", args) # make a device object this_device = LocalDeviceObject(ini=args.ini) if _debug: _log.debug(" - this_device: %r", this_device) # make a sample application test_application = SampleApplication(this_device, args.ini.address) # make an analog value object test_av = AnalogValueObject( objectIdentifier=("analogValue", 1), objectName="av", presentValue=0.0, statusFlags=[0, 0, 0, 0], covIncrement=1.0, ) _log.debug(" - test_av: %r", test_av) # add it to the device test_application.add_object(test_av) _log.debug(" - object list: %r", this_device.objectList) # make a binary value object test_bv = BinaryValueObject( objectIdentifier=("binaryValue", 1), objectName="bv", presentValue="inactive", statusFlags=[0, 0, 0, 0], ) _log.debug(" - test_bv: %r", test_bv) # add it to the device test_application.add_object(test_bv) # binary value task do_something_task = DoSomething(INTERVAL) do_something_task.install_task() _log.debug("running") run() _log.debug("fini")
def create_BV(oid=1, pv=0, name='BV', activeText='On', inactiveText='Off'): bvo = BinaryValueObject( objectIdentifier=('binaryValue', oid), objectName=name, presentValue=pv, activeText=activeText, inactiveText=inactiveText, ) return bvo
def create_BV(oid=1, pv=0, name="BV", activeText="On", inactiveText="Off", pv_writable=False): bvo = BinaryValueObject( objectIdentifier=("binaryValue", oid), objectName=name, presentValue=pv, activeText=activeText, inactiveText=inactiveText, ) bvo = _make_mutable(bvo, mutable=pv_writable) return bvo
def test_8_10_1(self): """Confirmed Notifications Subscription""" if _debug: TestBinaryValue._debug("test_8_10_1") # create a network anet = ApplicationNetwork("test_8_10_1") # add the ability to accept COV notifications to the TD anet.td.add_capability(COVTestClientServices) # tell the TD how to respond to confirmed notifications anet.td.test_ack = True anet.td.test_reject = None anet.td.test_abort = None # add the service capability to the IUT anet.iut.add_capability(ChangeOfValueServices) # make a binary value object test_bv = BinaryValueObject( objectIdentifier=('binaryValue', 1), objectName='bv', presentValue='inactive', statusFlags=[0, 0, 0, 0], ) # add it to the implementation anet.iut.add_object(test_bv) # wait for the subscription anet.iut.start_state.doc("8.10.1-1-0") \ .receive(SubscribeCOVRequest).doc("8.10.1-1-1") \ .success() # send the subscription, wait for the ack anet.td.start_state.doc("8.10.1-2-0") \ .send(SubscribeCOVRequest( destination=anet.iut.address, subscriberProcessIdentifier=1, monitoredObjectIdentifier=('binaryValue', 1), issueConfirmedNotifications=True, lifetime=30, )).doc("8.10.1-2-1") \ .receive(SimpleAckPDU).doc("8.10.1-2-2") \ .success() # run the group anet.run()
def create_BV(oid=1, pv=0, name="BV", activeText="On", inactiveText="Off", pv_writable=False): bvo = BinaryValueObject( objectIdentifier=("binaryValue", oid), objectName=name, presentValue=pv, activeText=activeText, inactiveText=inactiveText, priorityArray=PriorityArray(), statusFlags=StatusFlags(), ) bvo = _make_mutable(bvo, mutable=pv_writable) deprecate_msg() return bvo
def test_no_traffic(self): """Test basic configuration of a network.""" if _debug: TestBinaryValue._debug("test_no_traffic") # create a network anet = ApplicationNetwork("test_no_traffic") # add the service capability to the IUT anet.iut.add_capability(ChangeOfValueServices) # make a binary value object test_bv = BinaryValueObject( objectIdentifier=('binaryValue', 1), objectName='bv', presentValue='inactive', statusFlags=[0, 0, 0, 0], ) # an easy way to change the present value write_test_bv = lambda v: setattr(test_bv, 'presentValue', v) # add it to the implementation anet.iut.add_object(test_bv) # make some transitions anet.iut.start_state.doc("1-1-0") \ .call(write_test_bv, 'active').doc("1-1-1") \ .timeout(1).doc("1-1-2") \ .call(write_test_bv, 'inactive').doc("1-1-3") \ .timeout(1).doc("1-1-4") \ .success() # test device is quiet anet.td.start_state.timeout(5).success() # run the group anet.run()
def __init__(self, **kwargs): BinaryValueObject.__init__(self, **kwargs)
def test_8_2_3(self): """To verify that the IUT can initiate ConfirmedCOVNotification service requests conveying a change of the Present_Value property of Binary Input, Binary Output, and Binary Value objects.""" if _debug: TestBinaryValue._debug("test_8_2_3") # create a network anet = ApplicationNetwork("test_simple_transition_confirmed") # add the ability to accept COV notifications to the TD anet.td.add_capability(COVTestClientServices) # tell the TD how to respond to confirmed notifications anet.td.test_ack = True anet.td.test_reject = None anet.td.test_abort = None # add the service capability to the IUT anet.iut.add_capability(ChangeOfValueServices) # make a binary value object test_bv = BinaryValueObject( objectIdentifier=('binaryValue', 1), objectName='bv', presentValue='inactive', statusFlags=[0, 0, 0, 0], ) # an easy way to change the present value write_test_bv = lambda v: setattr(test_bv, 'presentValue', v) # add it to the implementation anet.iut.add_object(test_bv) # receive the subscription request, wait until the client has # received the ack and the 'instant' notification. Then change the # value and wait for the ack. anet.iut.start_state.doc("2-1-0") \ .receive(SubscribeCOVRequest).doc("2-1-1") \ .receive(SimpleAckPDU).doc("2-1-2") \ .wait_event("e1").doc("2-1-3") \ .call(write_test_bv, 'active').doc("2-1-4") \ .receive(SimpleAckPDU).doc("2-1-5") \ .timeout(10).doc("2-2-6") \ .success() # send the subscription request, wait for the ack and the 'instant' # notification, set the event so the IUT can continue, then wait # for the next notification anet.td.start_state.doc("2-2-0") \ .send(SubscribeCOVRequest( destination=anet.iut.address, subscriberProcessIdentifier=1, monitoredObjectIdentifier=('binaryValue', 1), issueConfirmedNotifications=True, lifetime=30, )).doc("2-2-1") \ .receive(SimpleAckPDU).doc("2-2-2") \ .receive(ConfirmedCOVNotificationRequest).doc("2-2-4") \ .set_event("e1").doc("2-2-3") \ .receive(ConfirmedCOVNotificationRequest).doc("2-2-4") \ .timeout(10).doc("2-2-5") \ .success() # run the group anet.run()
def main(): global test_application # make a parser parser = ConfigArgumentParser(description=__doc__) parser.add_argument( "--console", action="store_true", default=False, help="create a console", ) # parse the command line arguments args = parser.parse_args() if _debug: _log.debug("initialization") if _debug: _log.debug(" - args: %r", args) # make a device object test_device = LocalDeviceObject( objectName=args.ini.objectname, objectIdentifier=int(args.ini.objectidentifier), maxApduLengthAccepted=int(args.ini.maxapdulengthaccepted), segmentationSupported=args.ini.segmentationsupported, vendorIdentifier=int(args.ini.vendoridentifier), ) # make a sample application test_application = SubscribeCOVApplication(test_device, args.ini.address) # make a binary value object test_bv = BinaryValueObject( objectIdentifier=('binaryValue', 1), objectName='bv', presentValue='inactive', statusFlags=[0, 0, 0, 0], ) _log.debug(" - test_bv: %r", test_bv) # add it to the device test_application.add_object(test_bv) # make an analog value object test_av = AnalogValueObject( objectIdentifier=('analogValue', 1), objectName='av', presentValue=0.0, statusFlags=[0, 0, 0, 0], covIncrement=1.0, ) _log.debug(" - test_av: %r", test_av) # add it to the device test_application.add_object(test_av) _log.debug(" - object list: %r", test_device.objectList) # get the services supported services_supported = test_application.get_services_supported() if _debug: _log.debug(" - services_supported: %r", services_supported) # let the device object know test_device.protocolServicesSupported = services_supported.value # make a console if args.console: test_console = COVConsoleCmd() _log.debug(" - test_console: %r", test_console) # enable sleeping will help with threads enable_sleeping() _log.debug("running") run() _log.debug("fini")
def run_application() -> str: ''' Simulate and query the device. :return: Object query result. ''' from bacpypes.object import AnalogInputObject, AnalogValueObject, BinaryValueObject, BinaryInputObject, BinaryOutputObject, MultiStateInputObject from bacnet.local_device_applications import SimulateAndQueryDeviceApplication import bacpypes.basetypes analog_input_objects =\ [ AnalogInputObject( objectIdentifier=('analogInput', 1), objectName='Temperature', objectType='analogInput', presentValue=19, description='Temperature', deviceType='Temperature Sensor', statusFlags=['inAlarm','inAlarm','inAlarm','inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False, units='degreesCelsius' ), AnalogInputObject( objectIdentifier=('analogInput', 2), objectName='Relative Humidity', objectType='analogInput', presentValue=60, description='Relative Humidity', deviceType='RH Sensor', statusFlags=['inAlarm','inAlarm','inAlarm','inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False, units='percentRelativeHumidity' ), AnalogInputObject( objectIdentifier=('analogInput', 3), objectName='Dewpoint Temperature', objectType='analogInput', presentValue=8, description='Dewpoint Temperature', deviceType='Dewpoint Temperature Sensor', statusFlags=['inAlarm','inAlarm','inAlarm','inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False, units='degreesCelsius' ), AnalogInputObject( objectIdentifier=('analogInput', 4), objectName='Wet Bulb Temperature', objectType='analogInput', presentValue=19, description='Wet Bulb Temperature', deviceType='Wet Bulb Temperature Sensor', statusFlags=['inAlarm','inAlarm','inAlarm','inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False, units='degreesCelsius' ), AnalogInputObject( objectIdentifier=('analogInput', 5), objectName='Enthalpy', objectType='analogInput', presentValue=19, description='Enthalpy', deviceType='Enthalpy Sensor', statusFlags=['inAlarm','inAlarm','inAlarm','inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False, units='kilojoulesPerKilogramDryAir' )] analog_value_objects = [ AnalogValueObject( objectIdentifier=('analogValue', 1), objectName='Temperature Offset', objectType='analogValue', presentValue=0, description='Temperature Offset', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', outOfService=False, units='deltaDegreesFahrenheit'), AnalogValueObject( objectIdentifier=('analogValue', 2), objectName='RH Offset', objectType='analogValue', presentValue=0, description='RH Offset', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', outOfService=False, units='percentRelativeHumidity'), AnalogValueObject( objectIdentifier=('analogValue', 3), objectName='Atmospheric Pressure', objectType='analogValue', presentValue=1013, description='Atmospheric Pressure', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', outOfService=False, units='hectopascals'), AnalogValueObject( objectIdentifier=('analogValue', 4), objectName='Altitude', objectType='analogValue', presentValue=0, description='Altitude', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', outOfService=False, units='feet'), AnalogValueObject( objectIdentifier=('analogValue', 5), objectName='Display Mode', objectType='analogValue', presentValue=0, description='Display Mode', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', outOfService=False, units='noUnits') ] binary_value_objects = [ BinaryValueObject( objectIdentifier=('binaryValue', 1), objectName='Temperature Units', objectType='binaryValue', presentValue=0, description='Celsius (0) or Fahrenheit (1)', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False), BinaryValueObject( objectIdentifier=('binaryValue', 2), objectName='Enthalpy Units', objectType='binaryValue', presentValue=0, description='kJ/kg (0) or BTU/lb (1)', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False) ] objects = analog_input_objects + analog_value_objects + binary_value_objects return SimulateAndQueryDeviceApplication.run_application( objectIdentifier=381001, objectName="DP_001", objectType=8, systemStatus='operational', vendorName='Greystone Energy Systems', vendorIdentifier=381, modelName='DP', firmwareRevision='1.2', applicationSoftwareVersion='1.0', description='Greystone Dewpoint Systems', protocolVersion=1, protocolRevision=14, protocolObjectTypesSupported=[ 'analogInput', 'analogValue', 'binaryValue', 'device' ], maxapdulength=128, segmentationSupported="noSegmentation", apduTimeout=6000, numberOfApduRetries=3, maxMaster=127, maxInfoFrames=1, objects=objects)
def main(): global test_av, test_bv, test_application # make a parser parser = ConfigArgumentParser(description=__doc__) parser.add_argument( "--console", action="store_true", default=False, help="create a console", ) # analog value task and thread parser.add_argument( "--avtask", type=float, help="analog value recurring task", ) parser.add_argument( "--avthread", type=float, help="analog value thread", ) # analog value task and thread parser.add_argument( "--bvtask", type=float, help="binary value recurring task", ) parser.add_argument( "--bvthread", type=float, help="binary value thread", ) # provide a different spin value parser.add_argument( "--spin", type=float, help="spin time", default=1.0, ) # parse the command line arguments args = parser.parse_args() if _debug: _log.debug("initialization") if _debug: _log.debug(" - args: %r", args) # make a device object this_device = LocalDeviceObject(ini=args.ini) if _debug: _log.debug(" - this_device: %r", this_device) # make a sample application test_application = SubscribeCOVApplication(this_device, args.ini.address) # make an analog value object test_av = WritableAnalogValueObject( objectIdentifier=("analogValue", 1), objectName="av", presentValue=0.0, statusFlags=[0, 0, 0, 0], covIncrement=1.0, ) _log.debug(" - test_av: %r", test_av) # add it to the device test_application.add_object(test_av) _log.debug(" - object list: %r", this_device.objectList) # make a binary value object test_bv = BinaryValueObject( objectIdentifier=("binaryValue", 1), objectName="bv", presentValue="inactive", statusFlags=[0, 0, 0, 0], ) _log.debug(" - test_bv: %r", test_bv) # add it to the device test_application.add_object(test_bv) # make a console if args.console: test_console = COVConsoleCmd() _log.debug(" - test_console: %r", test_console) # enable sleeping will help with threads enable_sleeping() # analog value task if args.avtask: test_av_task = TestAnalogValueTask(args.avtask) test_av_task.install_task() # analog value thread if args.avthread: test_av_thread = TestAnalogValueThread(args.avthread) deferred(test_av_thread.start) # binary value task if args.bvtask: test_bv_task = TestBinaryValueTask(args.bvtask) test_bv_task.install_task() # binary value thread if args.bvthread: test_bv_thread = TestBinaryValueThread(args.bvthread) deferred(test_bv_thread.start) _log.debug("running") run(args.spin) _log.debug("fini")
def run_application() -> str: ''' Simulate and query the device. :return: Object query result. ''' from bacpypes.object import AnalogInputObject, AnalogValueObject, BinaryValueObject, BinaryInputObject, BinaryOutputObject, MultiStateInputObject from bacnet.local_device_applications import SimulateAndQueryDeviceApplication import bacpypes.basetypes analog_input_objects =\ [ AnalogInputObject( objectIdentifier=('analogInput', 1), objectName='CO2_Level', objectType='analogInput', presentValue=21, description='CO2 Level', deviceType='0-2000 ppm CO2 Sensor', statusFlags=['inAlarm','inAlarm','inAlarm','inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False, units='partsPerMillion' ), AnalogInputObject( objectIdentifier=('analogInput', 2), objectName='Relative_Humidity', objectType='analogInput', presentValue=60, description='Relative Humidity', deviceType='0-100 %RH Sensor', statusFlags=['inAlarm','inAlarm','inAlarm','inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False, units='percentRelativeHumidity' ), AnalogInputObject( objectIdentifier=('analogInput', 3), objectName='Temperature', objectType='analogInput', presentValue=19, description='Temperature', deviceType='0-35 C Temperature Sensor or 32-95 F Temperature Sensor', statusFlags=['inAlarm','inAlarm','inAlarm','inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False, units='degreesCelsius' ), AnalogInputObject( objectIdentifier=('analogInput', 4), objectName='Setpoint_Control', objectType='analogInput', presentValue=67, description='Setpoint Value', deviceType='0-100 % Setpoint', statusFlags=['inAlarm','inAlarm','inAlarm','inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False, units='percent' )] analog_value_objects = [ AnalogValueObject( objectIdentifier=('analogValue', 1), objectName='Relay_Setpoint', objectType='analogValue', presentValue=1000, description='Relay Setpoint', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', outOfService=False, units='partsPerMillion'), AnalogValueObject( objectIdentifier=('analogValue', 2), objectName='Relay_Hysteresis', objectType='analogValue', presentValue=50, description='Relay Hysteresis', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', outOfService=False, units='partsPerMillion'), AnalogValueObject( objectIdentifier=('analogValue', 3), objectName='Temperature_Offset', objectType='analogValue', presentValue=50, description='Temperature Offset Calibration', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', outOfService=False, units='deltaDegreesFahrenheit'), AnalogValueObject( objectIdentifier=('analogValue', 4), objectName='Relative_Humidity_Offset', objectType='analogValue', presentValue=0, description='RH Offset Calibration', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', outOfService=False, units='percentRelativeHumidity'), AnalogValueObject( objectIdentifier=('analogValue', 5), objectName='Sensor_Altitude', objectType='analogValue', presentValue=50, description='CO2 Sensor Altitude', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', outOfService=False, units='feet'), AnalogValueObject( objectIdentifier=('analogValue', 6), objectName='Display_Modes', objectType='analogValue', presentValue=50, description='CO2 LCD Display Modes', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', outOfService=False, units='noUnits') ] binary_value_objects = [ BinaryValueObject( objectIdentifier=('binaryValue', 1), objectName='Override_Switch', objectType='binaryValue', presentValue=0, description='Override Switch', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False), BinaryValueObject( objectIdentifier=('binaryValue', 2), objectName='Auto_Cal_Enable', objectType='binaryValue', presentValue=1, description='Auto Calibration Enable', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False), BinaryValueObject( objectIdentifier=('binaryValue', 3), objectName='Fahrenheit', objectType='binaryValue', presentValue=1, description='Fahrenheit (1) or Celsius (0)', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False) ] binary_input_objects = [ BinaryInputObject( objectIdentifier=('binaryInput', 1), objectName='Relay_On', objectType='binaryInput', presentValue=0, description='Relay Status', deviceType='Indicates On/Off Status of Relay', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False, polarity='normal', ) ] objects = analog_input_objects + analog_value_objects + binary_value_objects + binary_input_objects return SimulateAndQueryDeviceApplication.run_application( objectIdentifier=381003, objectName="CDD_CO2_Detector_003", objectType=8, systemStatus='operational', vendorName='Greystone Energy Systems', vendorIdentifier=381, modelName='CDD2A', firmwareRevision='1.4', applicationSoftwareVersion='1.0', description='Greystone CO2 Detector', protocolVersion=1, protocolRevision=7, protocolObjectTypesSupported=[ 'analogInput', 'analogValue', 'binaryInput', 'binaryValue', 'device' ], maxapdulength=128, segmentationSupported="noSegmentation", apduTimeout=10000, numberOfApduRetries=3, maxMaster=127, maxInfoFrames=1, objects=objects)
def test_8_2_4(self): """To verify that the IUT can initiate ConfirmedCOVNotification service requests conveying a change of the Status_Flags property of Binary Input, Binary Output, and Binary Value objects.""" if _debug: TestBinaryValue._debug("test_8_2_4") # create a network anet = ApplicationNetwork("test_changing_status_flags") # add the ability to accept COV notifications to the TD anet.td.add_capability(COVTestClientServices) # tell the TD how to respond to confirmed notifications anet.td.test_ack = True anet.td.test_reject = None anet.td.test_abort = None # add the service capability to the IUT anet.iut.add_capability(ChangeOfValueServices) # make a binary value object test_bv = BinaryValueObject( objectIdentifier=('binaryValue', 1), objectName='bv', presentValue='inactive', statusFlags=[0, 0, 0, 0], ) # an easy way to change the present value def test_bv_fault(): if _debug: TestBinaryValue._debug("test_bv_fault") test_bv.statusFlags = [0, 1, 0, 0] # add it to the implementation anet.iut.add_object(test_bv) # receive the subscription request, wait until the client has # received the ack and the 'instant' notification. Then change the # value, no ack coming back anet.iut.start_state.doc("4-1-0") \ .receive(SubscribeCOVRequest).doc("4-1-1") \ .wait_event("e1").doc("4-1-2") \ .call(test_bv_fault).doc("4-1-3") \ .timeout(10).doc("4-2-4") \ .success() # test device is quiet anet.td.start_state.doc("4-2-0") \ .send(SubscribeCOVRequest( destination=anet.iut.address, subscriberProcessIdentifier=1, monitoredObjectIdentifier=('binaryValue', 1), issueConfirmedNotifications=False, lifetime=30, )).doc("4-2-1") \ .receive(SimpleAckPDU).doc("4-2-2") \ .receive(UnconfirmedCOVNotificationRequest).doc("4-2-3") \ .set_event("e1").doc("4-2-4") \ .receive(UnconfirmedCOVNotificationRequest).doc("4-2-5") \ .timeout(10).doc("4-2-6") \ .success() # run the group anet.run()
def test_8_10_2(self): """Unconfirmed Notifications Subscription""" if _debug: TestBinaryValue._debug("test_8_10_2") # create a network anet = ApplicationNetwork("test_8_10_2") # add the service capability to the IUT anet.td.add_capability(COVTestClientServices) anet.iut.add_capability(ChangeOfValueServices) # make a binary value object test_bv = BinaryValueObject( objectIdentifier=('binaryValue', 1), objectName='bv', presentValue='inactive', statusFlags=[0, 0, 0, 0], ) # an easy way to change the present value write_test_bv = lambda v: setattr(test_bv, 'presentValue', v) # add it to the implementation anet.iut.add_object(test_bv) # tell the TD how to respond to confirmed notifications anet.td.test_ack = True anet.td.test_reject = None anet.td.test_abort = None # wait for the subscription anet.iut.start_state.doc("8.10.2-1-0") \ .receive(SubscribeCOVRequest).doc("8.10.2-1-1") \ .success() # send the subscription, wait for the ack anet.td.start_state.doc("8.10.2-2-0") \ .send(SubscribeCOVRequest( destination=anet.iut.address, subscriberProcessIdentifier=1, monitoredObjectIdentifier=('binaryValue', 1), issueConfirmedNotifications=False, lifetime=30, )).doc("8.10.2-2-1") \ .receive(SimpleAckPDU).doc("8.10.2-2-2") \ .success() # run the group, cut the time limit short anet.run(time_limit=5.0) # check that the IUT still has the detection if _debug: TestBinaryValue._debug(" - detections: %r", anet.iut.cov_detections) assert len(anet.iut.cov_detections) == 1 # pop out the subscription list and criteria obj_ref, criteria = anet.iut.cov_detections.popitem() if _debug: TestBinaryValue._debug(" - criteria: %r", criteria) # get the list of subscriptions from the criteria subscriptions = criteria.cov_subscriptions.cov_subscriptions if _debug: TestBinaryValue._debug(" - subscriptions: %r", subscriptions) assert len(subscriptions) == 1
def run_application() -> str: ''' Simulate and query the device. :return: Object query result. ''' from bacpypes.object import AnalogInputObject, AnalogValueObject, BinaryValueObject, BinaryInputObject, BinaryOutputObject, MultiStateInputObject from bacnet.local_device_applications import SimulateAndQueryDeviceApplication import bacpypes.basetypes analog_input_objects =\ [ AnalogInputObject( objectIdentifier=('analogInput', 1), objectName='Pressure_Sensor_Value', objectType='analogInput', presentValue=101325, description='Pressure Value in Pa or wc', deviceType='Room Pressure Sensor', statusFlags=['inAlarm','inAlarm','inAlarm','inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False, units='pascals' )] analog_value_objects = [ AnalogValueObject( objectIdentifier=('analogValue', 1), objectName='Pressure_Averaging_Time', objectType='analogValue', presentValue=5, description='Pressure Averaging Time', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', outOfService=False, units='seconds'), AnalogValueObject( objectIdentifier=('analogValue', 2), objectName='Alarm_High_Limit', objectType='analogValue', presentValue=0.5, description='Alarm High Limit in Pa or wc', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', outOfService=False, units='pascals'), AnalogValueObject( objectIdentifier=('analogValue', 3), objectName='Alarm_Low_Limit', objectType='analogValue', presentValue=-0.5, description='Alarm Low Limit in Pa or wc', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', outOfService=False, units='pascals'), AnalogValueObject( objectIdentifier=('analogValue', 4), objectName='Alarm_On_Delay', objectType='analogValue', presentValue=5, description='Alarm On Delay', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', outOfService=False, units='minutes'), AnalogValueObject( objectIdentifier=('analogValue', 5), objectName='Alarm_Off_Delay', objectType='analogValue', presentValue=5, description='Alarm Off Delay', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', outOfService=False, units='minutes'), AnalogValueObject( objectIdentifier=('analogValue', 6), objectName='Alarm_Silence_Time', objectType='analogValue', presentValue=30, description='Alarm Silence Time', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', outOfService=False, units='minutes'), AnalogValueObject( objectIdentifier=('analogValue', 7), objectName='Buzzer_Volume', objectType='analogValue', presentValue=2, description='CO2 LCD Display Modes', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', outOfService=False, units='noUnits') ] binary_value_objects = [ BinaryValueObject( objectIdentifier=('binaryValue', 1), objectName='Alarm_Enable', objectType='binaryValue', presentValue=1, description='0 = Alarm Disable, 1 = Alarm Enable', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False), BinaryValueObject( objectIdentifier=('binaryValue', 2), objectName='Alarm_Test', objectType='binaryValue', presentValue=0, description='0 = Normal Operation, 1 = Alarm Test', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False), BinaryValueObject( objectIdentifier=('binaryValue', 3), objectName='Backlight_Enable', objectType='binaryValue', presentValue=1, description='0 = Backlight Disable, 1 = Backlight Enable', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False), BinaryValueObject( objectIdentifier=('binaryValue', 4), objectName='Pressure_Units', objectType='binaryValue', presentValue=0, description='0 = wc, 1 = Pa ', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False), BinaryValueObject( objectIdentifier=('binaryValue', 5), objectName='Pressure_Range', objectType='binaryValue', presentValue=1, description='0 = Low Pressure Range, 1 = High Pressure Range', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False) ] binary_input_objects = [ BinaryInputObject( objectIdentifier=('binaryInput', 1), objectName='Alarm_Status', objectType='binaryInput', presentValue=0, description='Alarm Status', deviceType='0 = No Alarm, 1 = Pressure Alarm', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False, polarity='normal', ), BinaryInputObject( objectIdentifier=('binaryInput', 2), objectName='Low_Alarm_Status', objectType='binaryInput', presentValue=0, description='Low Alarm Status', deviceType='0 = No Low Alarm, 1 = Low Pressure Alarm', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False, polarity='normal', ), BinaryInputObject( objectIdentifier=('binaryInput', 3), objectName='High_Alarm_Status', objectType='binaryInput', presentValue=0, description='High Alarm Status', deviceType='0 = No High Alarm, 1 = High Pressure Alarm', statusFlags=['inAlarm', 'inAlarm', 'inAlarm', 'inAlarm'], eventState='normal', reliability='noFaultDetected', outOfService=False, polarity='normal', ) ] objects = analog_input_objects + analog_value_objects + binary_value_objects + binary_input_objects return SimulateAndQueryDeviceApplication.run_application( objectIdentifier=381003, objectName="Room Pressure Monitor 003", objectType=8, systemStatus='operational', vendorName='Greystone Energy Systems', vendorIdentifier=381, modelName='RPC', firmwareRevision='1.4', applicationSoftwareVersion='1.0', description='Greystone RP Monitor', protocolVersion=1, protocolRevision=7, protocolObjectTypesSupported=[ 'analogInput', 'analogValue', 'binaryInput', 'binaryValue', 'device' ], maxapdulength=128, segmentationSupported="noSegmentation", apduTimeout=10000, numberOfApduRetries=3, maxMaster=127, maxInfoFrames=1, objects=objects)
def test_multiple_subscribers(self): """This has more than one subscriber for the object.""" if _debug: TestBinaryValue._debug("test_multiple_subscribers") # create a network anet = ApplicationNetwork("test_multiple_subscribers") # add the service capability to the IUT anet.td.add_capability(COVTestClientServices) anet.iut.add_capability(ChangeOfValueServices) # make a binary value object test_bv = BinaryValueObject( objectIdentifier=('binaryValue', 1), objectName='bv', presentValue='inactive', statusFlags=[0, 0, 0, 0], ) # an easy way to change both the present value and status flags # which should trigger only one notification def test_bv_fault(): if _debug: TestBinaryValue._debug("test_bv_fault") test_bv.presentValue = 'active' test_bv.statusFlags = [0, 0, 1, 0] # add it to the implementation anet.iut.add_object(test_bv) # add another test device object anet.td2_device_object = LocalDeviceObject( objectName="td2", objectIdentifier=("device", 30), maxApduLengthAccepted=1024, segmentationSupported='noSegmentation', vendorIdentifier=999, ) # another test device anet.td2 = ApplicationStateMachine(anet.td2_device_object, anet.vlan) anet.td2.add_capability(COVTestClientServices) anet.append(anet.td2) # receive the subscription requests, wait until both clients have # received the ack and the 'instant' notification. Then change the # value, no ack coming back anet.iut.start_state.doc("6-1-0") \ .receive(SubscribeCOVRequest, pduSource=anet.td.address).doc("6-1-1") \ .receive(SubscribeCOVRequest, pduSource=anet.td2.address).doc("6-1-2") \ .wait_event("e2").doc("6-1-3") \ .call(test_bv_fault).doc("6-1-4") \ .timeout(10).doc("6-2-5") \ .success() # first test device; send the subscription request, get an ack # followed by the 'instant' notification anet.td.start_state.doc("6-2-0") \ .send(SubscribeCOVRequest( destination=anet.iut.address, subscriberProcessIdentifier=1, monitoredObjectIdentifier=('binaryValue', 1), issueConfirmedNotifications=False, lifetime=30, )).doc("6-2-1") \ .receive(SimpleAckPDU).doc("6-2-2") \ .receive(UnconfirmedCOVNotificationRequest).doc("6-2-3") \ .set_event("e1").doc("6-2-4") \ .receive(UnconfirmedCOVNotificationRequest).doc("6-2-5") \ .timeout(10).doc("6-2-6") \ .success() # same pa anet.td2.start_state.doc("6-3-0") \ .wait_event("e1").doc("6-3-1") \ .send(SubscribeCOVRequest( destination=anet.iut.address, subscriberProcessIdentifier=1, monitoredObjectIdentifier=('binaryValue', 1), issueConfirmedNotifications=False, lifetime=30, )).doc("6-3-2") \ .receive(SimpleAckPDU).doc("6-3-3") \ .receive(UnconfirmedCOVNotificationRequest).doc("6-3-4") \ .set_event("e2").doc("6-3-5") \ .receive(UnconfirmedCOVNotificationRequest).doc("6-3-6") \ .timeout(10).doc("6-3-7") \ .success() # run the group anet.run()
def __init__(self, **kwargs): if _debug: RandomBinaryValueObject._debug("__init__ %r", kwargs) BinaryValueObject.__init__(self, **kwargs)