Skip to content

Releases: ni/measurement-plugin-python

MeasurementLink Support for Python v1.4.0

22 Mar 19:13
2ba12c6
Compare
Choose a tag to compare

What's Changed

  • Support for NI multiplexers

    • New APIs to allow using NI multiplexers in Python measurement services (#595, #605, #608, #610, #612, #621, #623)
    • Add a new example demonstrating the multiplexer workflow (#625)
    • Advertise new Mux example (#642)
    • Turn on Mux feature toggle for release (#667)
  • Add a security policy to the repo (#577)

  • Bug fixes (#575, #597, #631)

  • Add annotation for programming language of the service (#599)

  • Delete _internal/utilities submodule (#604)

  • Beginnings of support for Pin and Relay groups (#636, #639)

  • Support an array of XY data plots to allow multiple plots on a (LabVIEW-only) UI (#632)

  • Fix error when running the DCPower example with 1.4.0-dev0 installed (#643)

  • NI-FGEN example: Update pin_name parameter to pin_names (#656)

  • NI-DCPower example: update multisite pinmap to have separate channel groups (#659)

  • Move to Poetry version 1.8.2 (#663)

New Contributors

Full Changelog: 1.3.0...1.4.0

MeasurementLink Support for Python v1.4.0-dev1

08 Mar 14:26
e9b3706
Compare
Choose a tag to compare

What's Changed

  • Beginnings of support for Pin and Relay groups (#636, #639)
  • Advertise new Mux example (#642)
  • Support an array of XY data plots to allow multiple plots on a (LabVIEW-only) UI (#632)
  • Fix error when running the DCPower example with 1.4.0-dev0 installed (#643)

Full Changelog: 1.4.0-dev0...1.4.0-dev1

MeasurementLink Support for Python v1.4.0-dev0

05 Mar 17:24
896e4c6
Compare
Choose a tag to compare

What's Changed

  • New APIs to allow using NI multiplexers in Python measurement services (#595, #605, #608, #610, #612, #621, #623)
    • Add a new example demonstrating the multiplexer workflow (#625)
  • Add a security policy to the repo (#577)
  • Bug fixes (#575, #597, #631)
  • Add annotation for programming language of the service (#599)
  • Delete _internal/utilities submodule (#604)

Full Changelog: 1.3.0...1.4.0-dev0

MeasurementLink Support for Python v1.3.0

12 Jan 17:38
ed1f7c7
Compare
Choose a tag to compare

What's Changed

  • Simplified session management (#386 #389 #402 #426 #429 #432 #433 #436 #438 #440 #442 #446 #466 #469 #480 #481 #482)
    • The MeasurementContext class now provides reserve_session(s) methods, eliminating the need to explicitly instantiate a SessionManagementClient and pass measurement_service.context.pin_map_context to it. Example:
      with measurement_service.context.reserve_sessions(pin_names) as reservation:
          ...
    • The reserve_session(s) methods now accept a single pin name in addition to a list of pin names.
    • The reservation classes now provide initialize_${driver}_session(s) methods for initializing modular instrument sessions. These methods are designed to be used in a with block. They yield one or multiple SessionInformation objects, which now contain a reference to the session object.
      Example:
      with reservation.initialize_nidcpower_sessions() as session_infos:
          for session_info in session_infos:
              session_info.session.channels[session_info.channel_list].initiate()
    • The reservation classes now provide get_${driver}_connection(s) methods for querying connections between pins and instrument channels. These methods return one or multiple Connection objects, which also contain a reference to the instrument session object.
      Example:
      vdd_connection = reservation.get_nidcpower_connection("Vdd")
      measurement = vdd_connection.session.channels[vdd_connection.channel_name].measure_multiple()
    • The reservation classes also provide:
      • create_nidaqmx_task(s) and get_nidaqmx_connection(s) methods for NI-DAQmx.
      • Generic initialize_session(s) and get_connection(s) methods for custom session types, such as instrument drivers based on VISA.
    • The new reservation methods have type hints, which enable LSP-enabled text editors such as VS Code and PyCharm to auto-complete references to driver-specific session objects. For example, reservation.get_nidmm_connection(pin).session. should auto-complete by displaying the methods for the nidmm.Session class. To support these type hints, the new methods use generic protocol classes TypedSessionInformation[TSession] and TypedConnection[TSession].
    • The reservation.session_info property now includes the session object(s) in the returned SessionInformation objects, if they have been created. However, clients are encouraged to use the type-safe TypedSessionInformation[TSession] objects returned from reservation.initialize_${driver}_session(s).
    • TestStand code modules can also use the new initialize_${driver}_sessions methods. These methods accept an optional initialization_behavior enum parameter, which has INITIALIZE_SESSION_THEN_DETACH and ATTACH_TO_SESSION_THEN_CLOSE enum values designed for this use case.
    • The example measurements and TestStand code modules have been updated to use the new session management API. As such, most of the examples now require ni-measurementlink-service version 1.3.0 or later. For example measurements that work with previous versions, use the examples zip file provided with that release on GitHub.
  • Configuration via .env files (#421 #425 #441)
    • You can now configure ni-measurementlink-service settings by setting environment variables or creating a .env file.
      • A .env file is a text file containing environment variables in the form VAR=value.
      • The .env may be located in the measurement service's current working directory or one of its parent directories. For example, you can place a .env file at the root of this GitHub repo, in the examples/nidcpower_source_dc_voltage directory, or in C:\ProgramData\National Instruments\MeasurementLink for configuring statically registered services.
      • If the current working directory and its parents do not contain a .env file, the search falls back to the script/EXE path (if there is one) or the path of the Python module calling into ni-measurementlink-service (to support TestStand code modules).
      • Support for parsing the .env file is implemented by the 3rd party python-decouple package.
    • The modular instrument initialize_${driver}_sessions(s) methods allow you to use .env settings to override the IVI option string and specify simulation options.
      Example:
      # Add this to your .env file to enable NI-DCPower simulation with PXIe-4141 instruments.
      MEASUREMENTLINK_NIDCPOWER_SIMULATE=1
      MEASUREMENTLINK_NIDCPOWER_BOARD_TYPE=PXIe
      MEASUREMENTLINK_NIDCPOWER_MODEL=4141
      
    • The example measurements no longer have a hardcoded USE_SIMULATION constant that you must edit to enable/disable simulation. To enable simulation for all example measurements, copy .env.simulation to .env in the 'examples' directory of this Git repo.
    • The VISA example measurements use python-decouple directly to read MEASUREMENTLINK_VISA_DMM_SIMULATE from the .env file.
    • There are a few other .env settings for overriding the NI gRPC Device Server configuration and enabling feature toggles. For a complete reference, see .env.sample in the 'examples' directory of this Git repo.
  • Make gRPC extensions public (#545)
    • The GrpcChannelPool class is now provided by the ni_measurementlink_service.grpc.channelpool module. It is still aliased into ni_measurementlink_service.measurement.service for compatibility with existing code.
    • The ClientLogger and ServerLogger interceptor classes are now provided by the ni_measurementlink_service.grpc.loggers module. GrpcChannelPool automatically adds a ClientLogger and MeasurementService automatically adds a ServerLogger, but these helper classes may be useful to clients in other situations.
  • Python 3.12 support (#427)
    • ni-measurementlink-service is now tested with Python 3.12.
    • No code changes were required, so previous releases should work with Python 3.12 as well.
  • Bug fixes
    • Some cosmetic issues with example measurement UI panels have been fixed. (#420 #424 #435)
    • Copying an example measurement into a separate Git repo no longer causes ni-python-styleguide to reorder its import directives. (#374 #443)
    • ServerCallLogger no longer incorrectly logs OK when the call is canceled. (#370 #462)
    • Fixed several APIs that leak internal types. (#375 #394 #396 #437)
      • The DiscoveryClient class is now publicly available via the ni_measurement_service.discovery sub-package.
      • The DiscoveryClient.register_measurement_service method has been deprecated in favor of a more general register_service API that supports other service types and registering multiple services.
      • In several public and internal classes, attributes and properties that should not be public have been deprecated and will be removed in a future release.
      • Deprecated attributes, methods, and properties generate deprecation warnings, which are enabled by default for pytest tests but not for standalone Python scripts.
    • In the examples and generator templates, start.bat now assumes you are using an in-project virtualenv. (#416 #417)
    • The DiscoveryClient class now reads the MeasurementLink installation directories from the Windows registry instead of environment variables, eliminating the need to use passenv when testing with Tox. (#483 )
    • DeprecationWarning raised due to Pathlib.Path (#514)
    • Fix deserialization of large messages (>= ~30 fields) (#554)
  • Example improvements
    • The VISA examples now have a visa_dmm instrument driver rather than using VISA directly. (#439, #447)
    • The reservation timeout and instrument type ID parameters have been removed from the examples because the defaults are sufficient. (#393)
    • Update example TestStand sequences to use the new Update Pin Map custom step (#538 #539 #540 #541 #547 #551 #550 #553)
      • MeasurementLink 2024Q1 introduces a new TestStand step, Update Pin Map, which sets the active pin map for the sequence execution.
      • The teststand_pin_map.py code module and related code in _helpers.py have been deleted.
      • The example TestStand sequences now require MeasurementLink 2024 Q1 or later and will not work with older versions.
      • Existing TestStand sequences should continue to work with MeasurementLink 2024 Q1 or later.
    • Add gRPC support to VISA examples (#525)
    • Remove streaming-specific examples (#536)
      • Remove sample_streaming_measurement and ui_progress_updates because the Game of Life example demonstrates this feature.
      • Add cancellation to the Game of Life example.

New Contributors

For More Details, see Version 1.3.0 Changes

Full Changelog: 1.2.0...1.3.0

MeasurementLink Support for Python v1.3.0-dev2

14 Dec 20:40
a29cd07
Compare
Choose a tag to compare

What's Changed

  • Bug fixes
    • Fix deserialization of large messages (>= ~30 fields) (#554)
  • Examples
    • Update example TestStand sequences to use the new Update Pin Map custom step (#538 #539 #540 #541 #547 #551 #550 #553)
      • MeasurementLink 2024Q1 introduces a new TestStand step, Update Pin Map, which sets the active pin map for the sequence execution.
      • The teststand_pin_map.py code module and related code in _helpers.py have been deleted.
      • The example TestStand sequences now require MeasurementLink 2024 Q1 or later and will not work with older versions.
      • Existing TestStand sequences should continue to work with MeasurementLink 2024 Q1 or later.
    • Add gRPC support to VISA examples (#525)
    • Remove streaming-specific examples (#536)
      • Remove sample_streaming_measurement and ui_progress_updates because the Game of Life example demonstrates this feature.
      • Add cancellation to the Game of Life example.
  • Configuration settings
    • Rename GRPC_DEVICE_SERVER_ADDRESS and change it to a URL (#522)
  • Make gRPC extensions public (#545)
    • The GrpcChannelPool class is now provided by the ni_measurementlink_service.grpc.channelpool module. It is still aliased into ni_measurementlink_service.measurement.service for compatibility with existing code.
    • The ClientLogger and ServerLogger interceptor classes are now provided by the ni_measurementlink_service.grpc.loggers module. GrpcChannelPool automatically adds a ClientLogger and MeasurementService automatically adds a ServerLogger, but these helper classes may be useful to clients in other situations.
  • Development workflow improvements
    • The PR workflow now checks for out-of-date gRPC stubs (#546)
  • Testing
    • The test-specific gRPC stubs and test measurements have been moved to tests.utilities.stubs.* and tests.utilities.measurements.* (#548)

Full Changelog: 1.3.0-dev1...1.3.0-dev2

MeasurementLink Support for Python v1.2.1-dev0

14 Dec 17:30
67f8b2a
Compare
Choose a tag to compare

What's Changed

Full Changelog: 1.2.0...1.2.1-dev0

MeasurementLink Support for Python v1.3.0-dev1

17 Nov 16:37
9fd7bec
Compare
Choose a tag to compare

What's Changed

  • Bug fixes
    • DeprecationWarning raised due to Pathlib.Path (#514)
    • Fix incorrect type hints for some new session management APIs. Mypy doesn't catch these because the driver APIs don't have type hints yet, but it affects auto-complete.
  • Documentation improvements
  • Examples
    • Change DMM range to 10 V for output_voltage_measurement (#496)
    • Make examples depend on newly released 1.3.0.dev0 (#497)
    • Remove unused methods in _helpers.py.mako (#510)
  • Tests
    • Add integration and acceptance tests for driver specific session management APIs (#490 #503 #506 #504)
    • Move .env.simulation to .env in run_system_tests workflow (#499)

Full Changelog: 1.3.0-dev0...1.3.0-dev1

MeasurementLink Support for Python v1.3.0-dev0 🎃👻

31 Oct 18:25
11fa07e
Compare
Choose a tag to compare

What's Changed

  • Simplified session management (#386 #389 #402 #426 #429 #432 #433 #436 #438 #440 #442 #446 #466 #469 #480 #481 #482)
    • The MeasurementContext class now provides reserve_session(s) methods, eliminating the need to explicitly instantiate a SessionManagementClient and pass measurement_service.context.pin_map_context to it. Example:
      with measurement_service.context.reserve_sessions(pin_names) as reservation:
          ...
    • The reserve_session(s) methods now accept a single pin name in addition to a list of pin names.
    • The reservation classes now provide initialize_${driver}_session(s) methods for initializing modular instrument sessions. These methods are designed to be used in a with block. They yield one or multiple SessionInformation objects, which now contain a reference to the session object.
      Example:
      with reservation.initialize_nidcpower_sessions() as session_infos:
          for session_info in session_infos:
              session_info.session.channels[session_info.channel_list].initiate()
    • The reservation classes now provide get_${driver}_connection(s) methods for querying connections between pins and instrument channels. These methods return one or multiple Connection objects, which also contain a reference to the instrument session object.
      Example:
      vdd_connection = reservation.get_nidcpower_connection("Vdd")
      measurement = vdd_connection.session.channels[vdd_connection.channel_name].measure_multiple()
    • The reservation classes also provide:
      • create_nidaqmx_task(s) and get_nidaqmx_connection(s) methods for NI-DAQmx.
      • Generic initialize_session(s) and get_connection(s) methods for custom session types, such as instrument drivers based on VISA.
    • The new reservation methods have type hints, which enable LSP-enabled text editors such as VS Code and PyCharm to auto-complete references to driver-specific session objects. For example, reservation.get_nidmm_connection(pin).session. should auto-complete by displaying the methods for the nidmm.Session class. To support these type hints, the new methods use generic protocol classes TypedSessionInformation[TSession] and TypedConnection[TSession].
    • The reservation.session_info property now includes the session object(s) in the returned SessionInformation objects, if they have been created. However, clients are encouraged to use the type-safe TypedSessionInformation[TSession] objects returned from reservation.initialize_${driver}_session(s).
    • TestStand code modules can also use the new initialize_${driver}_sessions methods. These methods accept an optional initialization_behavior enum parameter, which has INITIALIZE_SESSION_THEN_DETACH and ATTACH_TO_SESSION_THEN_CLOSE enum values designed for this use case.
    • The example measurements and TestStand code modules have been updated to use the new session management API. As such, most of the examples now require ni-measurementlink-service version 1.3.0-dev0 or later. For example measurements that work with previous versions, use the examples zip file provided with that release on GitHub.
  • Configuration via .env files (#421 #425 #441)
    • You can now configure ni-measurementlink-service settings by setting environment variables or creating a .env file.
      • A .env file is a text file containing environment variables in the form VAR=value.
      • The .env may be located in the measurement service's current working directory or one of its parent directories. For example, you can place a .env file at the root of this GitHub repo, in the examples/nidcpower_source_dc_voltage directory, or in C:\ProgramData\National Instruments\MeasurementLink for configuring statically registered services.
      • If the current working directory and its parents do not contain a .env file, the search falls back to the script/EXE path (if there is one) or the path of the Python module calling into ni-measurementlink-service (to support TestStand code modules).
      • Support for parsing the .env file is implemented by the 3rd party python-decouple package.
    • The modular instrument initialize_${driver}_sessions(s) methods allow you to use .env settings to override the IVI option string and specify simulation options.
      Example:
      # Add this to your .env file to enable NI-DCPower simulation with PXIe-4141 instruments.
      MEASUREMENTLINK_NIDCPOWER_SIMULATE=1
      MEASUREMENTLINK_NIDCPOWER_BOARD_TYPE=PXIe
      MEASUREMENTLINK_NIDCPOWER_MODEL=4141
      
    • The example measurements no longer have a hardcoded USE_SIMULATION constant that you must edit to enable/disable simulation. To enable simulation for all example measurements, copy .env.simulation to .env in the root of this Git repo.
    • The VISA example measurements use python-decouple directly to read MEASUREMENTLINK_VISA_DMM_SIMULATE from the .env file.
    • There are a few other .env settings for overriding the NI gRPC Device Server configuration and enabling feature toggles. For a complete reference, see .env.sample in the root of this Git repo.
  • Python 3.12 support (#427)
    • ni-measurementlink-service is now tested with Python 3.12.
    • No code changes were required, so previous releases should work with Python 3.12 as well.
  • Example improvements
    • The VISA examples now have a visa_dmm instrument driver rather than using VISA directly. (#439, #447)
    • The reservation timeout and instrument type ID parameters have been removed from the examples because the defaults are sufficient. (#393)
    • The example TestStand code modules have been split into teststand_pin_map.py, teststand_nidcpower.py, teststand_nidmm.py etc. to faciliate reuse and make it easier to mix and match code modules in the same sequence. (#460 #461 #465)
  • Documentation improvements (#430)
    • The API reference documentation now includes more accurate type information with hyperlinks.
    • The API reference documentation now includes hyperlinks to the documentation for nimi-python, nidaqmx-python, and the Python standard library.

    Note These improvements will not be visible on https://ni.github.io/measurementlink-python/ until version 1.3 is officially released.

  • Bug fixes
    • Some cosmetic issues with example measurement UI panels have been fixed. (#420 #424 #435)
    • Copying an example measurement into a separate Git repo no longer causes ni-python-styleguide to reorder its import directives. (#374 #443)
    • ServerCallLogger no longer incorrectly logs OK when the call is canceled. (#370 #462)
    • Fixed several APIs that leak internal types. (#375 #394 #396 #437)
      • The DiscoveryClient class is now publicly available via the ni_measurement_service.discovery sub-package.
      • The DiscoveryClient.register_measurement_service method has been deprecated in favor of a more general register_service API that supports other service types and registering multiple services.
      • In several public and internal classes, attributes and properties that should not be public have been deprecated and will be removed in a future release.
      • Deprecated attributes, methods, and properties generate deprecation warnings, which are enabled by default for pytest tests but not for standalone Python scripts.
    • In the examples and generator templates, start.bat now assumes you are using an in-project virtualenv. (#416 #417)
    • The DiscoveryClient class now reads the MeasurementLink installation directories from the Windows registry instead of environment variables, eliminating the need to use passenv when testing with Tox. (#483 )
  • Development workflow improvements
    • We are now using Mend Renovate to update dependencies. (#444 #445 #470 #471)
    • We now have a self-hosted GitHub runner for running system tests. (#479)
  • Miscellaneous minor improvements and fixes

New Contributors

Full Changelog: 1.2.0...1.3.0-dev0

MeasurementLink Support for Python v1.2.0

05 Oct 15:47
58979c7
Compare
Choose a tag to compare

What's Changed

  • Added support for service annotations (#291 #294 #296 #338)
    • The .serviceconfig file now supports specifying additional information about the measurement via the annotations dictionary.
    • Example:
      "annotations":
      {
        "ni/service.description": "Measure inrush current with a shorted load.",
        "ni/service.collection": "CurrentTests.Inrush",
        "ni/service.tags": [ "powerup", "current" ]
      }
    
    • ni-measurementlink-generator now supports generating the annotations dictionary. By default, it sets ni/service.description, ni/service.collection, and ni/service.tags to empty values. You can specify values with the --description, --collection, and --tags command line options.
  • Added support for protobuf enums (#328)
    • The protobuf generated code for enums does not use the Python enum module. Instead, it uses integers and provides a subclass of EnumTypeWrapper describing the enum value mapping.
    • When you use the configuration and output decorators to specify measurement parameters, you can now specify either an enum.Enum subclass or an EnumTypeWrapper instance for enum_type.
  • Support for Python services returning DoubleXYData
    • Add encoder and decoder for DoubleXYData (#358)
    • Game of Life example (#360)
  • Bug fixes
    • Improved support for automatically launching the discovery service (#343, #344, #345, #346, #353, #391)
    • Importing nidcpower.session into output voltage measurement (#399)
    • Fix pywintypes error during the launch of the discovery service after a fresh install of MeasurementLink (#407)
    • Update reserve_session to roll back on error (#401)
    • Fixed CVE-2023-4570
  • Misc improvements
    • Log exceptions in more cases (#371)
    • Only service interfaces listed in .serviceconfig file (#368)
    • Improved logging and ETW tracing (#361)
  • Examples
    • Add _helpers.py file to non-driver examples (#329)
    • Add Enum out to sample_measurement (#307)
    • Realign DMM UI controls (#312)
    • Disallow click version 8.1.4 due to an issue with type hints (#325)
    • Add measurement example involving NI-DCPower and NI-VISA DMM instruments (#323)
    • Update examples to centralize USE_SIMULATION in _constants.py (#348)
    • Read serviceconfig path from __file__ or exe location (#355)
    • Remove unused TypeVar from _helpers.py (#363)
    • Make enum zero translation more readable (#365)
    • Configure mypy for all examples to disallow untyped function definitions (#372)
    • Use a threading.Event for cancellation instead of a local callback function and nonlocal variable.
    • Consistently use the name measurement_service for the measurement service variable.
  • Minor updates and improvements not listed here

New Contributors

Full Changelog: 1.1.0...1.2.0

MeasurementLink Support for Python v1.1.1

05 Oct 15:08
d2c73b1
Compare
Choose a tag to compare

What's Changed

Full Changelog: 1.1.0...1.1.1