Skip to content

Daemon API

The daemon exposes a single gRPC service: galois.edge.v1.EdgeDaemonService. Every wrapper — Python SDK, PyVISA backend, cloud control plane — is a client of this service. The proto schema is the canonical contract; this page is generated by hand from proto/edge/v1/edge.proto.

MethodRequestResponseStreaming
SendCommandSendCommandRequestSendCommandResponseunary
StreamCommandsSendCommandRequestSendCommandResponsebidi
ListInstrumentsListInstrumentsRequestListInstrumentsResponseunary
GetInstrumentGetInstrumentRequestInstrumentunary
ScanInstrumentsScanInstrumentsRequestScanInstrumentsResponseunary
GetCapabilitiesGetCapabilitiesRequestGetCapabilitiesResponseunary
ExecuteCommandExecuteCommandRequestExecuteCommandResponseunary
ExecuteSequenceExecuteSequenceRequestExecuteSequenceResponseunary
StreamMeasurementStreamMeasurementRequestMeasurementDataPointserver
StopStreamStopStreamRequestStopStreamResponseunary
GetStatusGetStatusRequestEdgeStatusunary
PingPingRequestPingResponseunary
RegisterEdgeRegisterEdgeRequestRegisterEdgeResponseunary
HeartbeatHeartbeatRequestHeartbeatResponseunary
GetWebcamSnapshotGetWebcamSnapshotRequestGetWebcamSnapshotResponseunary
ProxySDKCallProxySDKCallRequestProxySDKCallResponseunary
StartSweepStartSweepRequestStartSweepResponseunary
GetSweepStatusGetSweepStatusRequestSweepStatusResponseunary
StopSweepStopSweepRequestStopSweepResponseunary
DeployProfileDeployProfileRequestDeployProfileResponseunary
RemoveProfileRemoveProfileRequestRemoveProfileResponseunary
ListProfilesListProfilesRequestListProfilesResponseunary
ConnectModbusInstrumentConnectModbusInstrumentRequestConnectModbusInstrumentResponseunary
DisconnectInstrumentDisconnectInstrumentRequestDisconnectInstrumentResponseunary
ValueNumber
CONNECTION_TYPE_UNSPECIFIED0
CONNECTION_TYPE_GPIB1
CONNECTION_TYPE_USB2
CONNECTION_TYPE_LAN3
CONNECTION_TYPE_SERIAL4
ValueNumber
PARAMETER_TYPE_UNSPECIFIED0
PARAMETER_TYPE_STRING1
PARAMETER_TYPE_NUMBER2
PARAMETER_TYPE_BOOLEAN3
PARAMETER_TYPE_ENUM4
ValueNumber
EDGE_STATUS_CODE_UNSPECIFIED0
EDGE_STATUS_CODE_ONLINE1
EDGE_STATUS_CODE_OFFLINE2
EDGE_STATUS_CODE_DEGRADED3
FieldTypeNotes
idstringDaemon-assigned identifier.
addressstringVISA resource string.
connection_typeConnectionType
idn_stringstringRaw *IDN? response.
manufacturerstringParsed from IDN.
modelstringParsed from IDN.
serial_numberstring
firmwarestring
profile_namestringYAML profile key, empty if no match.
instrument_classstringdmm, oscilloscope, sourcemeter, …
is_connectedboolFalse if discovery saw it but a session can’t open.
capabilitiesrepeated CommandCapability
FieldTypeNotes
namestringProfile command name.
descriptionstring
typestringquery, write, or property.
parametersrepeated CommandParameter
returns_databoolTrue for queries.
is_dangerousboolSurface a confirmation in UIs.
return_typestringfloat, string, int, array, binary, bool, vector.
unitstring
is_streamableboolEligible for StreamMeasurement.
FieldTypeNotes
namestring
descriptionstring
typeParameterType
requiredbool
default_valuestringStringified default.
enum_valuesrepeated stringPopulated when type == ENUM.
unitstring
FieldTypeNotes
namestringSequence name from the profile.
descriptionstring
paramsrepeated stringParameter names. Schema/units belong to the underlying step parameters.

Send a raw SCPI string to a single instrument and return its response.

SendCommandRequest:

FieldTypeNotes
command_idstringCaller-chosen identifier echoed back in the response.
scpi_commandstringThe SCPI string.
instrument_idstringTarget instrument.
timeout_msint320 = use the profile/settings default.

SendCommandResponse:

FieldTypeNotes
command_idstring
responsestringEmpty on writes.
errorstringNon-empty on failure.
statusstringcompleted or error.
execution_time_msint64

Bidirectional stream of SendCommandRequest / SendCommandResponse. Useful for high-throughput batches where round-trip latency dominates.

Returns every instrument currently known to the daemon.

ListInstrumentsRequest.filter (string, optional) is matched against instrument_class or status. ListInstrumentsResponse carries instruments and the daemon’s edge_id.

Look up a single instrument by instrument_id. Returns the full Instrument (including capabilities).

Triggers an immediate discovery sweep and returns instruments newly found this scan.

Returns InstrumentCapabilities per matched instrument. Filter by instrument_id or instrument_class. The response also carries the daemon’s edge_id alongside capabilities. Each entry carries:

FieldTypeNotes
instrument_idstring
has_profileboolFalse = raw SCPI only.
profile_keystring
manufacturer, model, instrument_classstring
commandsrepeated CommandCapability
sequencesrepeated SequenceCapability
settingsmap<string, string>E.g. timeout_ms, opc_query.

Run a named command from a profile. Parameters are key/value strings; the daemon coerces and validates per the profile.

ExecuteCommandRequest:

FieldTypeNotes
command_idstring
instrument_idstring
command_namestringProfile-defined name.
parametersmap<string, string>
is_queryboolFor property commands: true = getter.
timeout_msint32

ExecuteCommandResponse:

FieldTypeNotes
command_idstring
successbool
datastringScalar result.
error_messagestring
execution_time_msint64
scpi_commandstringThe SCPI that was actually sent.
vector_dataVectorDataSet when the return type is vector.

Runs a multi-step sequence (e.g. an IV sweep) defined in the profile. The daemon executes every step under the per-instrument lock; the network is unloaded for the duration of the run.

ExecuteSequenceRequest:

FieldTypeNotes
sequence_idstringCaller-chosen identifier echoed in the response.
instrument_idstring
sequence_namestring
parametersmap<string, string>
timeout_msint32Whole-sequence timeout.

ExecuteSequenceResponse:

FieldTypeNotes
sequence_idstring
resultstringCaptured value defined by the profile’s returns: field.
errorstring
statusstringcompleted or error.
execution_time_msint64
steps_executedrepeated stringSCPI commands actually sent, in order.

Polls a profile command at a fixed cadence and emits a stream of MeasurementDataPoint.

StreamMeasurementRequest:

FieldTypeNotes
stream_idstringUsed by StopStream.
instrument_idstring
command_namestringMust be marked is_streamable in the profile.
interval_msint32Minimum 100.
timeout_msint320 = run until StopStream.
parametersmap<string, string>Optional.

MeasurementDataPoint:

FieldTypeNotes
stream_idstring
valuedoublePrimary scalar.
timestamp_msint64Unix ms.
unitstring
errorstring
statusstringok, error, stopped.
valuesmap<string, double>Multi-value measurements.
vector_dataVectorDataWaveform/curve data.
FieldTypeNotes
y_databytesRaw binary samples.
y_dtypestringfloat32, int16, int8, …
y_lengthint32
x_startdouble
x_incrementdouble
x_unitstring
y_unitstring
x_namestring
y_scaledouble
y_offsetdouble

Cancels an active stream by stream_id. Idempotent. StopStreamResponse returns a single success: bool.

Returns EdgeStatus:

FieldTypeNotes
edge_idstring
hostnamestring
statusEdgeStatusCode
instrument_countint32
uptime_secondsint64
versionstring
os_infostringlinux/amd64, windows/amd64, …
cpu_usagedouble0..1
memory_usagedouble0..1

Lightweight liveness check. Both request and response carry a google.protobuf.Timestamp for round-trip measurement.

Used by the Go supervisor — not normally invoked by user clients.

RegisterEdgeRequest carries edge_id, hostname, instruments, tailscale_ip, grpc_port, ws_port, and free-form metadata. RegisterEdgeResponse returns success, message, and assigned_edge_id.

HeartbeatRequest carries edge_id, instrument_count, cpu_usage, memory_usage. HeartbeatResponse returns acknowledged, server_timestamp_ms (for clock sync), and a config_updates map of pending server-side config changes.

Forwards a vendor-SDK Python method call to the edge for instruments without a YAML profile.

ProxySDKCallRequest:

FieldTypeNotes
call_idstring
instrument_idstring
modulestringE.g. MultiPyVu.
methodstringMethod or obj.method path.
argsrepeated google.protobuf.Value
kwargsmap<string, google.protobuf.Value>
timeout_msint32

ProxySDKCallResponse:

FieldTypeNotes
call_idstring
successbool
resultgoogle.protobuf.Value
error_messagestring
execution_time_msint64

Begins a long-running ramp on the edge. Continues even if the client drops.

StartSweepRequest:

FieldTypeNotes
instrument_idstring
command_namestringThe profile command to ramp. Commands marked requires_sweep in the profile must use this RPC instead of ExecuteCommand.
target_valuedouble
sweep_ratedouble
extra_parametersmap<string, string>

StartSweepResponse returns sweep_id, accepted, and an optional error.

Returns SweepStatusResponse with status (sweeping, completed, error, aborted), current_value, target_value, sweep_rate, and error.

Aborts (StopSweepResponse.status == "stopped") or holds ("holding") the sweep.

Pushes a YAML profile to the daemon’s PROFILE_DIR. Re-loads it without restarting.

DeployProfileRequest:

FieldTypeNotes
profile_namestringE.g. eurotherm_3504.
profile_yamlstringFull file content.
protocolstring"modbus", "hart", etc.

DeployProfileResponse:

FieldTypeNotes
successbool
error_messagestring
register_countint32Useful for Modbus/CAN — number of register entries the profile defines.

Removes a deployed profile by profile_name and protocol. RemoveProfileResponse returns success: bool and error_message: string.

Returns every deployed profile as a DriverProfileSummary:

FieldTypeNotes
name, protocol, manufacturer, model, descriptionstring
register_countint32For Modbus/CAN profiles.
activeboolCurrently mapped to a connected instrument.

Deploy a Modbus profile and open a connection in one call.

ConnectModbusInstrumentRequest:

FieldTypeNotes
profile_namestringUse a previously deployed profile.
profile_yamlstringOr send the YAML inline.
protocolstring
instrument_idstringCaller-chosen ID.
transport_uristringE.g. rtu:///dev/ttyUSB0 or tcp://192.168.1.10:502.
slave_idint32

ConnectModbusInstrumentResponse:

FieldTypeNotes
successbool
error_messagestring
instrument_idstringEchoed back so callers can confirm the assigned ID.
register_countint32
commandsrepeated stringNames of the commands the deployed profile exposes — handy for telling the user what’s available without a follow-up GetCapabilities call.

Closes a protocol-driver instrument by instrument_id. DisconnectInstrumentResponse returns success: bool and error_message: string.

Fetches a JPEG from a LAN camera reachable from the edge. GetWebcamSnapshotRequest.camera_url is e.g. http://192.168.1.100/snapshot.cgi. GetWebcamSnapshotResponse carries image_data (bytes), timestamp_ms, content_type, and error.