# NI TDMS

Import NI TDMS files from a folder

- Category: Data acquisition
- Capabilities: Streams, History, Operations, Entities
- Runs on: Windows x64, Linux x64, Linux ARM64, macOS Apple silicon, macOS Intel

Collect the `.tdms` files your NI software already writes. Every channel comes
into Phloem on the recording's own timeline.

Works with TDMS from **any** NI tool: LabVIEW, FlexLogger, VeriStand, DIAdem,
SignalExpress. Runs on Windows, macOS and Linux. Point it at the folder,
wherever it is, including a network share.

## What you get

- **Every sample** — each channel at the rate it was acquired, with timing
  from the file. A 10 kHz recording arrives as 10 kHz.
- **Channels from the recording** — names are read from the newest log. A
  project that adds a channel needs no change here. **Test connection** also
  shows each channel's unit; the unit is not yet shown on the chart axis.
- **Files logged by NI-DAQmx** (`DAQmx Configure Logging`) — read with their
  scales, so a ±10 V input arrives in volts, not ADC counts.
- **Text and timestamp channels** — strings arrive as text, and timestamps
  keep their exact instant.

## Setup

1. In **Inputs**, add NI TDMS files.
2. Add an **input** for each test stand. Give it a **name**; it appears in your
   channel paths, so `hotfire` and `coldflow` stay separate even with the same
   channel names.
3. Add one or more **log folders or files** with the picker. Typing a Windows
   path by hand can lose backslashes.
   - **Folder** takes every `.tdms` under it. Windows' folder dialog hides the
     files while you choose; they are still there.
   - **File** takes that one log, and never the next run.
   - For a logger that writes **one file per run**, such as FlexLogger's
     `LogFile_<date>-<time>.tdms`, use the folder or a name pattern:
     `…\data\LogFile_*.tdms` follows every matching run, including future
     ones.
4. Set **how often to check for new data**. This is *not* a sampling rate.
   Checking more often only shows new samples sooner.
5. Press **Test connection**. Before you save, it shows how many logs, how much
   data, the date range, which are being written now, and what saving will do:

   > `hotfire: 48 log(s) (2.1 GB), 12 Mar 2026 – 26 Aug 2026 by file timestamp
   > — 47 finished, 1 being written now. On save: the 47 finished log(s) are
   > imported once each. New and growing logs are followed live either way.`

6. Channels appear on **Live** as `/tdms/<input>/<group>/<channel>`. Use them in
   **Trellis**, replay and notebooks like any other data.

## Several folders in one input

Put folders in **one** input when they hold the same stand's data, such as an
archive folder beside the live one, or a folder per month. They merge into one
set of channels. A file found in two folders is imported once.

**Two different stands need two inputs.** Otherwise both write
`/tdms/<input>/Dev1/ai0` and the chart mixes two instruments. If two folders
write the same channel over the same time, the input is refused and names the
folders and the channel. Folders whose runs do not overlap are fine.

## What gets collected

- **New files** are followed as they grow, including a recording in progress
  when you add the input.
- **Finished files are skipped** unless you tick **Import logs already in these
  folders**. It is off by default, so a folder of old runs does not flood the
  device. With it on, each file is imported exactly once, even across restarts.
- **Once per computer.** A second input that finds the same log does not import
  it again, and says where it went (`already imported as
  /tdms/hotfire/… on 06 Oct 2026`). Rename the first input to use the other
  name.
- **A finished log you copy in is imported whole**, even with a fresh
  timestamp. Whether a log is still being written is read from the file.
- **Progress shows on Inputs:**
  - `importing finished logs — 12 of 47 decided`, with a progress bar
  - `following run_2026-08-27.tdms as it is written` while a logger records
  - `watching … for new logs — nothing being written` when the folder is quiet
- **A file that cannot be read is named and skipped.** The rest of the folder
  still arrives.
- **A channel that cannot be scaled is named and dropped.** For example, raw
  counts with a thermocouple or RTD curve Phloem does not compute. The rest of
  the file still arrives.

## Timing

Each channel uses the timing the writer recorded:

| The file has | Samples are placed |
|---|---|
| a start time and sample interval | on the instrument's clock at that interval (the usual case) |
| an interval, no start time | back from the end of the file, with exact spacing |
| a time channel, no interval | at each sample's own instant (DAQami's `TimeStamps`, seconds since the group's `StartTime`; Phloem's own exports use `<name> Time`) |
| neither | at the time they are read, labelled as such |

## A paused log

FlexLogger's **Pause** writes the resumed recording as a new group in the same
file: `Log`, then `Log 2`, `Log 3`. These land as ONE channel on the first
group's path (`/tdms/<input>/log/<channel>`), and the pause shows as a gap.
Only a group named `<base> <number>` whose channels all exist in `<base>` is
merged.

## One channel, many runs

The same channel from a March run and from today's run land on the **same
path**. Runs are separated by time. So "show me `Dev1/ai0` across every run" is
one selection, not fifty.

As a result, **one series can span months**, with long quiet stretches when the
stand was off. Test connection shows that span before you save. Quiet stretches
are not marked as data loss.

## Notes

- A folder can mix logs from several NI tools. Channel paths name your input,
  not the tool.
- A Linux machine can collect from a Windows logging station over a network
  share.
- For **live values while a test runs**, use the **NI FlexLogger** connector.
  The file stays the full record.

## Supports

- TDMS 2.0 files (LabVIEW, FlexLogger, VeriStand, DIAdem, SignalExpress)
- Waveform timing (wf_start_time + wf_increment) preserved per channel

## Connection fields

| Field | Type | Required | Notes |
|---|---|---|---|
| How often to check for new data (Hz) | Number | No |  |
