Home
Picarro
Picarro Edge — SAM FOUP Signal Streams
Picarro Edge — SAM FOUP Signal Streams
Version 6.1.0
Picarro Edge implements a publish/subscribe surface on top of gRPC server streaming: every service exposes a `watch(picarro.signal.Filter)` method that returns a stream of `Signal` messages, where the `oneof signal` field acts as the topic. This document describes that real event surface. PROVENANCE: Picarro publishes NO AsyncAPI document. This description was DERIVED from Picarro's own first-party ProtoBuf interface definitions in https://github.com/picarro/sam-foup-public (mirrored verbatim in this repo under `grpc/`). Every channel, message and enumerated value below appears in those .proto files; nothing has been invented. It is an API Evangelist derivation, not a provider artifact.
View Spec
View on GitHub
Company Gas Detection Environmental Monitoring Emissions Methane Greenhouse Gas Scientific Instruments Semiconductor Industrial IoT Sensors Analytics gRPC AsyncAPI Webhooks Events
Channels
foupSignals
Server stream of picarro.sam.foup.Signal. Clients pass a picarro.signal.Filter with the oneof field numbers to include (polarity=true) or exclude (polarity=false); an empty filter streams every event.
measurementSetSignals
Server stream of picarro.sam.ms.Signal.
controllerSignals
Server stream of picarro.sam.controller.Signal. This is a "mapping signal": each message carries mapping_action (MAP_ADDITION | MAP_UPDATE | MAP_REMOVAL) and mapping_key (the analyzer identity, e.g. "Picarro_8008-AMSADS3008"). analyzer_health is cached server-side and re-emitted to new watchers.
netConfigSignals
Server stream of picarro.platform.netconfig.Signal.
sysConfigSignals
Server stream of picarro.platform.sysconfig.Signal.
upgradeSignals
Server stream of picarro.platform.upgrade.Signal.
Messages
✉
OperationalStatus
Overall operational status
Emitted on any change of system operational state.
✉
JobStatus
Job status
Emitted upon change, and once per second during a run.
✉
JobResult
Job results
Emitted once a job has completed successfully.
✉
ReprocessedResult
Reprocessed job results
Emitted when reprocessed data is available.
✉
AnalyzerFdcEvent
Analyzer Fault Detection and Classification event
Emitted when the analyzer reports FDC flags. Introduced in FOUP v6.1. Carries an escalation reason (ESCALATED, ESCALATION_CONTINUED every 60s while critical, or DE_ESCALATED after 60s of inactivity).
✉
MSOpResponse
Measurement set operation status
Emitted on measurement-set operation status change (MS_OP_ACCEPTED, MS_OP_SUCCESS, ...).
✉
SuggestedMeasurementSets
Suggested measurement sets
Measurement-set additions the system suggests from historical data.
✉
RawPicarroMQ
Raw PicarroMQ message
Raw message received over PicarroMQ from SAM core. mapping_key is the PicarroMQ topic; mapping_action is fixed as MAP_UPDATE. Not cached server-side. Debugging use.
✉
AnalyzerDriverStarted
Analyzer driver started
mapping_action fixed as MAP_ADDITION; mapping_key is the analyzer identity (e.g. "Picarro_9038-NUV1083"). Implicitly invalidates existing analyzer_health mappings. Not cached server-side.
✉
AnalyzerHealth
Analyzer health alert
mapping_action indicates added/updated/removed; mapping_key is the analyzer identity. Cached server-side and re-emitted on subsequent watch() calls.
✉
GenericPlatformSignal
Platform service signal
Signal multiplexer emitted by the platform services. See the corresponding .proto file in grpc/ for the exact oneof variants.
Servers
grpc
edge
picarro-edge, the FOUP job-control gRPC server. Plaintext ("insecure") h2c by default; deployed on the customer's instrument network. Use --host=ADDRESS to reach a remote instance. gRPC reflection is enabled.
grpc
platform
platformserver, managing host settings on the SLIM computer. Plaintext gRPC, reflection enabled.
AsyncAPI Specification
asyncapi: 3.0.0
info:
title: Picarro Edge — SAM FOUP Signal Streams
version: 6.1.0
description: >-
Picarro Edge implements a publish/subscribe surface on top of gRPC server streaming:
every service exposes a `watch(picarro.signal.Filter)` method that returns a stream of
`Signal` messages, where the `oneof signal` field acts as the topic. This document
describes that real event surface.
PROVENANCE: Picarro publishes NO AsyncAPI document. This description was DERIVED from
Picarro's own first-party ProtoBuf interface definitions in
https://github.com/picarro/sam-foup-public (mirrored verbatim in this repo under
`grpc/`). Every channel, message and enumerated value below appears in those .proto
files; nothing has been invented. It is an API Evangelist derivation, not a provider
artifact.
contact:
name: Tor Slettnes
email: tslettnes@picarro.com
url: https://github.com/picarro/sam-foup-public
externalDocs:
url: https://github.com/picarro/sam-foup-public/blob/master/README.md
description: Picarro SAM FOUP getting-started guide
defaultContentType: application/grpc+proto
servers:
edge:
host: 'localhost:3343'
protocol: grpc
description: >-
picarro-edge, the FOUP job-control gRPC server. Plaintext ("insecure") h2c by
default; deployed on the customer's instrument network. Use --host=ADDRESS to reach
a remote instance. gRPC reflection is enabled.
platform:
host: 'localhost:7528'
protocol: grpc
description: >-
platformserver, managing host settings on the SLIM computer. Plaintext gRPC,
reflection enabled.
channels:
foupSignals:
address: picarro.sam.foup.FOUP/watch
title: FOUP measurement signals
description: >-
Server stream of picarro.sam.foup.Signal. Clients pass a picarro.signal.Filter with
the oneof field numbers to include (polarity=true) or exclude (polarity=false); an
empty filter streams every event.
servers: [{$ref: '#/servers/edge'}]
messages:
opStatus: {$ref: '#/components/messages/OperationalStatus'}
jobStatus: {$ref: '#/components/messages/JobStatus'}
jobResult: {$ref: '#/components/messages/JobResult'}
reprocessedResult: {$ref: '#/components/messages/ReprocessedResult'}
fdcEvent: {$ref: '#/components/messages/AnalyzerFdcEvent'}
measurementSetSignals:
address: picarro.sam.ms.MeasurementSet/watch
title: Measurement set signals
description: Server stream of picarro.sam.ms.Signal.
servers: [{$ref: '#/servers/edge'}]
messages:
msOpResponse: {$ref: '#/components/messages/MSOpResponse'}
suggestedMs: {$ref: '#/components/messages/SuggestedMeasurementSets'}
controllerSignals:
address: picarro.sam.controller.Controller/watch
title: SAM controller health signals
description: >-
Server stream of picarro.sam.controller.Signal. This is a "mapping signal": each
message carries mapping_action (MAP_ADDITION | MAP_UPDATE | MAP_REMOVAL) and
mapping_key (the analyzer identity, e.g. "Picarro_8008-AMSADS3008"). analyzer_health
is cached server-side and re-emitted to new watchers.
servers: [{$ref: '#/servers/edge'}]
messages:
raw: {$ref: '#/components/messages/RawPicarroMQ'}
analyzerDriverStarted: {$ref: '#/components/messages/AnalyzerDriverStarted'}
analyzerHealth: {$ref: '#/components/messages/AnalyzerHealth'}
netConfigSignals:
address: picarro.platform.netconfig.NetConfig/watch
title: Network configuration signals
description: Server stream of picarro.platform.netconfig.Signal.
servers: [{$ref: '#/servers/platform'}]
messages:
netconfig: {$ref: '#/components/messages/GenericPlatformSignal'}
sysConfigSignals:
address: picarro.platform.sysconfig.SysConfig/watch
title: System configuration signals
description: Server stream of picarro.platform.sysconfig.Signal.
servers: [{$ref: '#/servers/platform'}]
messages:
sysconfig: {$ref: '#/components/messages/GenericPlatformSignal'}
upgradeSignals:
address: picarro.platform.upgrade.Upgrade/watch
title: Software upgrade signals
description: Server stream of picarro.platform.upgrade.Signal.
servers: [{$ref: '#/servers/platform'}]
messages:
upgrade: {$ref: '#/components/messages/GenericPlatformSignal'}
operations:
receiveFoupSignals:
action: receive
channel: {$ref: '#/channels/foupSignals'}
title: Watch FOUP events
description: 'CLI equivalent: foup-api-tool monitor [op_status|job_status|job_result|reprocessed_result|fdc_event]'
receiveMeasurementSetSignals:
action: receive
channel: {$ref: '#/channels/measurementSetSignals'}
title: Watch measurement-set events
description: 'CLI equivalent: measurementset-api-tool monitor'
receiveControllerSignals:
action: receive
channel: {$ref: '#/channels/controllerSignals'}
title: Watch SAM controller health events
description: 'CLI equivalent: controller-api-tool monitor analyzer_health analyzer_driver'
receiveNetConfigSignals:
action: receive
channel: {$ref: '#/channels/netConfigSignals'}
title: Watch network configuration changes
receiveSysConfigSignals:
action: receive
channel: {$ref: '#/channels/sysConfigSignals'}
title: Watch system configuration changes
receiveUpgradeSignals:
action: receive
channel: {$ref: '#/channels/upgradeSignals'}
title: Watch software upgrade progress
components:
messages:
OperationalStatus:
name: op_status
title: Overall operational status
summary: Emitted on any change of system operational state.
x-proto-field: 8
x-proto-type: picarro.sam.foup.OperationalStatus
payload: {$ref: '#/components/schemas/OperationalStatus'}
JobStatus:
name: job_status
title: Job status
summary: Emitted upon change, and once per second during a run.
x-proto-field: 10
x-proto-type: picarro.sam.foup.JobStatus
payload: {$ref: '#/components/schemas/JobStatus'}
JobResult:
name: job_result
title: Job results
summary: Emitted once a job has completed successfully.
x-proto-field: 11
x-proto-type: picarro.sam.foup.JobResult
payload: {$ref: '#/components/schemas/JobResult'}
ReprocessedResult:
name: reprocessed_result
title: Reprocessed job results
summary: Emitted when reprocessed data is available.
x-proto-field: 12
x-proto-type: picarro.sam.foup.ReprocessedResult
payload: {$ref: '#/components/schemas/JobResult'}
AnalyzerFdcEvent:
name: fdc_event
title: Analyzer Fault Detection and Classification event
summary: >-
Emitted when the analyzer reports FDC flags. Introduced in FOUP v6.1. Carries an
escalation reason (ESCALATED, ESCALATION_CONTINUED every 60s while critical, or
DE_ESCALATED after 60s of inactivity).
x-proto-field: 15
x-proto-type: picarro.sam.foup.AnalyzerFdcEvent
payload: {$ref: '#/components/schemas/AnalyzerFdcEvent'}
MSOpResponse:
name: ms_op_response
title: Measurement set operation status
summary: 'Emitted on measurement-set operation status change (MS_OP_ACCEPTED, MS_OP_SUCCESS, ...).'
x-proto-field: 7
x-proto-type: picarro.sam.ms.MSOpResponse
payload: {$ref: '#/components/schemas/MSOpResponse'}
SuggestedMeasurementSets:
name: suggested_ms
title: Suggested measurement sets
summary: Measurement-set additions the system suggests from historical data.
x-proto-field: 13
x-proto-type: picarro.sam.ms.MeasurementSetList
payload: {$ref: '#/components/schemas/MeasurementSetList'}
RawPicarroMQ:
name: raw
title: Raw PicarroMQ message
summary: >-
Raw message received over PicarroMQ from SAM core. mapping_key is the PicarroMQ
topic; mapping_action is fixed as MAP_UPDATE. Not cached server-side. Debugging use.
x-proto-field: 8
x-proto-type: picarro.variant.Value
payload: {$ref: '#/components/schemas/VariantValue'}
AnalyzerDriverStarted:
name: analyzer_driver_started
title: Analyzer driver started
summary: >-
mapping_action fixed as MAP_ADDITION; mapping_key is the analyzer identity
(e.g. "Picarro_9038-NUV1083"). Implicitly invalidates existing analyzer_health
mappings. Not cached server-side.
x-proto-field: 14
x-proto-type: picarro.status.Error
payload: {$ref: '#/components/schemas/Error'}
AnalyzerHealth:
name: analyzer_health
title: Analyzer health alert
summary: >-
mapping_action indicates added/updated/removed; mapping_key is the analyzer
identity. Cached server-side and re-emitted on subsequent watch() calls.
x-proto-field: 15
x-proto-type: picarro.status.Error
payload: {$ref: '#/components/schemas/Error'}
GenericPlatformSignal:
name: signal
title: Platform service signal
summary: >-
Signal multiplexer emitted by the platform services. See the corresponding .proto
file in grpc/ for the exact oneof variants.
payload: {type: object}
schemas:
Error:
type: object
description: picarro.status.Error — the common status/exception payload.
properties:
domain:
type: string
enum: [DOMAIN_NONE, DOMAIN_APPLICATION, DOMAIN_SYSTEM, DOMAIN_PROCESS, DOMAIN_DEVICE, DOMAIN_SERVICE]
origin: {type: string, description: 'Domain-specific origin, e.g. "Linux", "HTTP".'}
level:
type: string
enum: [LEVEL_NONE, LEVEL_TRACE, LEVEL_DEBUG, LEVEL_INFO, LEVEL_NOTICE, LEVEL_WARNING, LEVEL_ERROR, LEVEL_CRITICAL, LEVEL_FATAL]
code: {type: integer, format: int64, description: Origin-specific numeric id.}
symbol: {type: string, description: Source-specific symbolic name, unique within each domain.}
timestamp: {type: string, format: date-time}
attributes: {type: object, description: picarro.variant.KeyValueMap of event attributes.}
text: {type: string, description: Description of the error, expanded with attribute values.}
OperationalStatus:
type: object
description: Overall system operational state.
properties:
state:
type: string
enum: [OP_UNINITIALIZED, OP_INITIALIZING]
description: >-
Partial enumeration — see picarro.sam.foup.OperationalState in
grpc/picarro-sam-foup-foup.proto for the full set.
JobStatus:
type: object
properties:
state:
type: string
enum: [JOB_INACTIVE]
description: >-
Partial enumeration — see picarro.sam.foup.JobState in
grpc/picarro-sam-foup-foup.proto for the full state machine
(Measure -> RUNNING -> WAITING).
JobResult:
type: object
description: Measured concentrations for a completed job.
properties:
unit:
type: string
enum: [UNIT_UNSPECIFIED, UNIT_PPB]
AnalyzerFdcEvent:
type: object
properties:
publish_reason:
type: string
enum: [PUBLISH_REASON_UNSPECIFIED, PUBLISH_REASON_NEW_ALERT]
description: >-
Partial enumeration — see picarro.sam.foup.PublishReason. The README documents
the escalation reasons ESCALATED, ESCALATION_CONTINUED and DE_ESCALATED.
MSOpResponse:
type: object
description: 'Measurement-set operation acknowledgement/result (MS_OP_ACCEPTED, MS_OP_SUCCESS).'
MeasurementSetList:
type: object
description: A list of measurement sets with their compound-id (cid) membership.
VariantValue:
type: object
description: picarro.variant.Value — a dynamically typed value.
x-provenance:
generated: '2026-08-02'
method: derived
source:
- grpc/picarro-sam-foup-foup.proto
- grpc/picarro-sam-foup-measurementset.proto
- grpc/picarro-sam-foup-controller.proto
- grpc/picarro-sam-foup-signal.proto
- grpc/picarro-sam-foup-status.proto
- https://github.com/picarro/sam-foup-public/blob/master/README.md
provider_publishes_asyncapi: false
note: >-
API Evangelist derivation from Picarro's published ProtoBuf definitions. Schemas are
intentionally partial where the .proto enumerations were not fully transcribed; the
.proto files in grpc/ remain the authoritative contract.