Skip to main content

API for interfacing with the core acquisition process via platform and language agnostic message queues.

Project description

Autotrainer API: Python Integration

The python auto-trainer-api module is intended to provide an efficient means to emit information that is needed for local or remote management of applications running locally on the device and to receive commands from those sources.

The exposed API is intended to be agnostic to the underlying transport layer. The current implementation uses ZeroMQ. The reasons for this decision include:

  • Relatively low overhead for the acquisition application
  • Does not require either side to manage connections and know when the other side is available or changes availability
  • Does not require an additional process or service to maintain a persistent message queue (e.g., RabbitMQ)
    • Persistent data is managed elsewhere

Client Integration

There are two points of integration available for clients to support the remote interface. The first allows publishing "events" for state and property changes that occur in the client. The second is a "command" interface for the client to receive command requests from remote sources.

Both interfaces are provided through an instance of the RpcService protocol. An instance can be obtained via create_api_service(...) which constructs the specific concrete implementation. After creation, the service must be explicitly started (start(...)) and can be stopped (stop(...)). Once stopped, an instance can not be restarted. If a connection should be reestablished after stopping an instance, a new instance should be created and started.

Events

Events are supported through the send_dict(topic: ApiTopic, message: dict) method on the RpcService instance.

The first argument is the appropriate ApiTopic value for the event. The most common for clients to support are

  • ApiTopic.EVENT - the topic for most events representing general activity in the about or high-level state changes
  • ApiTopic.EMERGENCY - a dedicated topic for emergency-related events such as emergency-stop/resume, alarm changes, etc. [1]
  • ApiTopic.PROPERTY_CHANGE - lower-level property changes on specific objects of interest
  • ApiTopic.COMMAND_RESULT - command responses for non-immediate commands (see Commands section)

The second argument is a dictionary whose contents depend on the topic. All elements must serializable to JSON.

ApiTopic.EVENT

The dictionary contains the following entries:

  • kind - an ApiEventKind value
  • when - a wall-clock value of time
  • index - monotonically increasing timestamp w/units if nanoseconds
  • context - an object whose contents depend on the ApiEventKind; may be None for some event kinds

ApiTopic.EMERGENCY

Still under development.

ApiTopic.PROPERTY_CHANGE

Still under development.

ApiTopic.COMMAND_RESULT

An instance of ApiCommandRequestResponse.

[1] Currently these are supported as special cases of ApiTopic.EVENT. At some point these should be transitioned to the dedicated topic.

Commands

Commands from external sources are supported by registering a CommandRequestDelegate with the RpcService instance. The delegate receives an instance of ApiCommandRequest and must return an instance of ApiCommandRequestResponse.

The primary property of the ApiCommandRequest is command which is an ApiCommand value. Depending on the command, there may also be a dictionary in the data property with arguments or other information relevant to the command. The nonce property can be ignored if the command is handled synchronously. For commands that send an ApiTopic.COMMAND_RESULT event after completion (see below), the nonce must be stored to associate with that event (along with the command value).

The returned ApiCommandRequestResponse object contains one require field

  • result - a value of ApiCommandReqeustResult

There are also three optional fields

  • data - an optional object with results from the command beyond success/failure (often will be None)
  • error_code an integer error code value if the command is not successful or can't be initiated
  • error_message an integer error code value if the command is not successful or can't be initiated

The expected contents of the data property are defined by the command, but is typically None.

The error_code property should be a non-zero value if there is an error code to report.

There are two fields on the ApiCommandRequestResponse object that are ignored as part of the returned object from the command delegate: command and nonce. See Asynchronous Commands for when these fields are required.

Asynchronous Commands

The command delegate is expected to return "immediately" (low millisecond type of time frame). If the command is not deterministically fast, it is expected to immediately return an ApiCommandRequestResponse with a result value of ApiCommandReqeustResult.PENDING_WITH_NOTIFICATION.

Once the action associated with the command is complete, the client should send an Event (previous section), with a topic of ApiTopic.COMMAND_RESULT. The message argument of the send_dict method should be another instance of ApiCommandRequestResponse. The command and nonce properties of the response object should be set to the values received in the ApiCommandRequest (the client is responsible for storing these values until needed). Note that those two properties are ignored for synchronous command handling, but required for asynchronous responses.

Tools

Client Application

scripts/client_application.py starts an interactive process that enables the RpcService as a "real" autotrainer application would. It generates heartbeat events, can publish other events from the command line, and responds to commands. This is primarily useful for testing remote applictions/services without running the main autotrainer acquisition application.

Remote Console

scripts/remote_console.py starts an interactive process that connects to an RpcService instance in the same manner full remote management services would. Currently, it only supports sending a small subset of the predefined ApiCommand values, but may be expanded to show events and send additional commands.

Publishing

python -m build

python -m twine upload dist/* (requires PyPi API token)

Installation

The package is published to the PyPi package index and can be installed with standard pip commands.

pip install auto-trainer-api

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

auto_trainer_api-0.9.7.tar.gz (15.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

auto_trainer_api-0.9.7-py3-none-any.whl (16.3 kB view details)

Uploaded Python 3

File details

Details for the file auto_trainer_api-0.9.7.tar.gz.

File metadata

  • Download URL: auto_trainer_api-0.9.7.tar.gz
  • Upload date:
  • Size: 15.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.8.0

File hashes

Hashes for auto_trainer_api-0.9.7.tar.gz
Algorithm Hash digest
SHA256 c2dd9df9f986078c9dab09e49aabfa3d9b5a267688c34f93845c59c05453fe8c
MD5 fcb50262978d5b5513aeffa790070848
BLAKE2b-256 b83acb59c63ca28154f2022824ce89906face524ec5244bcafea6a5325fa154f

See more details on using hashes here.

File details

Details for the file auto_trainer_api-0.9.7-py3-none-any.whl.

File metadata

File hashes

Hashes for auto_trainer_api-0.9.7-py3-none-any.whl
Algorithm Hash digest
SHA256 9b7babc266b7fd5812f7b1a6d5c2df212af2ba102e422939bd0e8abafaac7431
MD5 13b8db989019b26c2e7f7dc5dde31dfe
BLAKE2b-256 52f0f0ec4dc9b0a98b1242e95f7789790bc093108ad89230d05e80dc52b8a1ba

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page