The Nominal stack#

The Nominal public stack is layered, so you can choose which pieces to rely on. Every layer leads to one underlying data store.

        ---
config:
  layout: elk
  themeVariables:
    fontFamily: Verdana, Geneva, Arial
    fontSize: 20px

---
%% bottom to top, so the data store is at the top
flowchart BT
    %% the logos are the home page's (landing/logos/), with the xmlns an <img> needs, and the
    %% instro wordmarks are instro's docs logos. The Nominal mark and the wordmarks come in white
    %% for dark pages and black for light. Paths start from the project's or the site's root, which
    %% _ext/snippet_paths.py turns into paths from the page that includes this snippet, and
    %% mermaid.css sizes the logos and shows one of each pair
    subgraph tools["SW Connectors"]
        teststand["<img src='../_static/logos/teststand.svg' alt=''>NI TestStand"]
        veristand["<img src='../_static/logos/veristand.svg' alt=''>NI VeriStand"]
        flexlogger["<img src='../_static/logos/flexlogger.svg' alt=''>NI FlexLogger"]
        simulink["<img src='../_static/logos/simulink.svg' alt=''><span>MathWorks<br>Simulink</span>"]
        %% invisible links stack the connectors in two rows, TestStand and VeriStand on top
        flexlogger ~~~ teststand
        simulink ~~~ veristand
    end
    subgraph domain["Proprietary Languages"]
        labview["<img src='../_static/logos/labview.svg' alt=''>NI LabVIEW"]
        matlab["<img src='../_static/logos/matlab.svg' alt=''><span>MathWorks<br>MATLAB</span>"]
    end
    subgraph languages["General Languages"]
        rust["<img src='../_static/logos/rust.svg' alt=''>Rust"]
        go["<img src='../_static/logos/go.svg' alt=''>Go"]
        python["<img src='../_static/logos/python.svg' alt=''>Python"]
    end
    subgraph hw["HW Connectors"]
        instro["<img src='../_static/logos/instro.svg' alt=''><img class='wordmark on-dark' src='../_static/logos/instro-logo-solid-white.svg' alt='instro'><img class='wordmark on-light' src='../_static/logos/instro-logo-solid-black.svg' alt='instro'>"]
    end
    %% no Grafana logo: Grafana Labs' trademark policy needs its written permission to use one on
    %% a website, so the box has an original dashboard icon (_static/logos/dashboard.svg). Its
    %% marks go before a noun ("Grafana plugin"), with ® on first use
    subgraph viz["Visualization"]
        grafana["<img src='../_static/logos/dashboard.svg' alt=''><span>Grafana®<br>plugin</span>"]
    end
    autogen["Generated Bindings"]

    subgraph access["Access Layer"]
        %% in this order, the layout draws REST, gRPC, Postgres from left to right
        grpc["gRPC API"]
        pgwire["Postgres protocol"]
        rest["REST API"]
    end
    %% the data store stands out: .hero (mermaid.css) sets its logo large, above a bold label,
    %% with a heavier outline, and its style line below gives it a denser fill
    store[("<img class='hero on-dark' src='../_static/logos/nominal-white.svg' alt=''><img class='hero on-light' src='../_static/logos/nominal-black.svg' alt=''><span>Nominal data store</span>")]
    tools --> domain
    domain --> autogen
    %% dotted, as instro streams to Nominal only if you choose to
    hw -.-> languages
    languages --> autogen
    viz --> autogen
    autogen --> access
    access --> store
    
    click teststand href "../../ni-teststand/" "NI TestStand"
    click veristand href "../../ni-veristand/" "NI VeriStand"
    click flexlogger href "../../ni-flexlogger/" "NI FlexLogger"
    click simulink href "../../simulink/" "Simulink"
    click instro href "../../instro/" "instro"
    click grafana href "https://grafana.com/grafana/plugins/nominal-nominalds-datasource/" "Grafana plugin catalog"
    click labview href "../../ni-labview/" "NI LabVIEW"
    click matlab href "../../matlab/" "MATLAB client"
    click python href "../../python/" "Python client"
    click rust href "https://github.com/nominal-io/nominal-client-rs" "Rust client on GitHub"
    click go href "https://github.com/nominal-io/nominal-streaming-go" "Go streaming client on GitHub"
    click sql href "../../sql-guides/" "SQL"
    click store href "../../platform/data-model/" "Data model"
    click rest href "../../api/" "REST API reference"
    click grpc href "../../api/grpc/" "gRPC API reference"
    click pgwire href "../../sql-guides/postgres-clients/" "Postgres clients"

    %% translucent greys work on light and dark pages; the text keeps the theme's color
    classDef default fill:#8080801a,stroke:#808080
    style tools fill:#8080800d,stroke:#80808080
    style domain fill:#8080800d,stroke:#80808080
    style languages fill:#8080800d,stroke:#80808080
    style autogen fill:#8080800d,stroke:#80808080
    style access fill:#8080800d,stroke:#80808080
    style hw fill:#8080800d,stroke:#80808080
    style viz fill:#8080800d,stroke:#80808080
    style store fill:#80808040,stroke:#808080
    

Start with the library or connector for the tool you already use. Nominal provides libraries for the general languages Python and Rust, a streaming library for Go, and libraries for the proprietary languages MATLAB and LabVIEW. It also provides software connectors for Simulink, TestStand, VeriStand, and FlexLogger. Each library and software connector writes data to the underlying data store, and some also read it back.

All of these tools are built on the access layer’s REST API and gRPC API. The generated bindings are Python, Rust, and Go packages generated from the REST API and gRPC API definitions.

Nominal’s hardware connector, instro, is an open-source Python library for test equipment. It can stream measurements to Nominal through the Python client, or write them to files instead.

For Grafana® dashboards, Nominal provides a data source plugin. It brings time series, logs, and SQL query results from Nominal into Grafana dashboards.

The underlying data store also answers SQL queries, sent through the SQL REST API or from a Postgres client.

NI®, NI LabVIEW®, NI TestStand®, NI VeriStand®, and NI FlexLogger® are registered trademarks of NI®. MATLAB® and Simulink® are registered trademarks of The MathWorks, Inc. Grafana® is a registered trademark of Grafana Labs. All other trademarks and logos are the property of their respective owners.