class lsst.ts.salobj.Remote(domain, name, index=None, *, readonly=False, include=None, exclude=None, evt_max_history=1, tel_max_history=None, start=True)

Bases: object

A class that issues commands to a SAL component and receives telemetry and events from that component.

If a SAL component listens to or commands other SAL components then it will have one Remote for each such component.

domain : Domain

DDS Domain. If you have a Controller then use its domain attribute. Otherwise create your own Domain and close it when you are done, for example:

async with Domain() as domain:
    dome = Remote(domain=domain, name="ATDome", index=0)
name : str

Name of SAL component.

index : int or None, optional

SAL component index, or 0 or None if the component is not indexed. A value is required if the component is indexed.

readonly : bool

If True then do not provide commands.

include : iterable of str, optional

Names of topics (telemetry or events) to support, for example [“FilterChangeInPosition”, “TrackingTarget”] If None then all are included except those in exclude.

exclude : iterable of str, optional

Names of topics (telemetry or events) to not support. If None or empty then no topics are excluded.

evt_max_history : int, optional

Maximum number of historical items to read for events. Set to 0 if your remote is not interested in “late joiner” data.

tel_max_history : int, optional

Deprecated because historical telemetry data is no longer available. Must be 0 (or None, but please don’t do that) if specified.

start : bool, optional

Automatically start the read loop when constructed? Normally this should be True, but if you are adding topics piecemeal after constructing the remote then specify False and call start manually after you have added all topics. Warning: if False then self.start_task will not exist and the remote cannot be used as an async context manager.


If include and exclude are both iterables (one or both must be None).


Here is an example that makes a Test remote and displays the topic-related attributes:

include salobj
# the index is arbitrary, but a remote must use the same index
# as the controller or CSC in order to communicate
index = 5
test_remote = salobj.Remote("Test", index)


You should see the following topic-related attributes:

  • Commands, each an instance of topics.RemoteCommand:

    • cmd_standby
    • cmd_start
    • … and so on for all other standard CSC commands
    • cmd_setArrays
    • cmd_setScalars
  • Events, each an instance of topics.RemoteEvent:

    • evt_appliedSettingsMatchStart
    • evt_errorCode
    • … and so on for all other standard CSC log events
    • evt_arrays
    • evt_scalars
  • Telemetry, each an instance of topics.RemoteTelemetry:

    • tel_arrays
    • tel_scalars
cmd_<command_name> : topics.RemoteCommand

Remote command topic for each command supported by the component. Omitted if readonly true.

evt_<event_name> : topics.RemoteEvent

Remote event for each event supported by the component, as specified by include and the exclude arguments.

tel_<telemetry_name> : topics.RemoteTelemetry

Remote telemetry topic for each telemetry topic supported by the component, as specified by the include and exclude arguments.

Methods Summary

close() Shut down and clean up resources.

Methods Documentation


Shut down and clean up resources.

Close the contained SalInfo, but not the Domain, because that may be used by other objects.

May be called multiple times. The first call closes the SalInfo; subsequent calls wait until the Remote is closed.