Picarro · AsyncAPI Specification

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 CompanyGas DetectionEnvironmental MonitoringEmissionsMethaneGreenhouse GasScientific InstrumentsSemiconductorIndustrial IoTSensorsAnalyticsgRPCAsyncAPIWebhooksEvents

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

Raw ↑
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.