> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.kodelabs.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Interval data normalization

> How EnerG turns irregular interval meter readings into clean 15-minute and daily values with quality labels

Interval meters often report at irregular times, in mixed units, with gaps and glitches. **Normalization** converts those readings into a uniform dataset: one row per meter per 15-minute or daily interval, in standard units, with quality labels on every row. This page explains why that process matters and what you get from it.

Normalized interval data powers [Interval Trends](/products/energ/analytics/building-dashboards-energy#interval-trends), [M\&V](/products/energ/energy-modeling/mv-models), and [Forecasting](/products/energ/energy-modeling/forecasting). Connect the feed through the [KODE OS data source](/products/energ/data-sources/kode-os-data-source). For label definitions, see [Interval normalization labels](/products/energ/reference/interval-normalization-labels).

## Why normalization matters

Raw interval data is messy. Without cleanup, charts and totals mislead.

| Problem                | Impact without normalization                     |
| ---------------------- | ------------------------------------------------ |
| Irregular timestamps   | You cannot compare meters or aggregate reliably  |
| Mixed units            | 1 kWh is not 1 megawatt-hour; calculations break |
| Missing readings       | Gaps in charts and incomplete totals             |
| Duplicate entries      | Consumption is counted more than once            |
| Sensor glitches        | Impossible spikes or dips skew analysis          |
| Invalid configurations | Wrong conversions and ambiguous results          |

## What goes in and what comes out

**Input:** Irregular readings from accumulators, sensors, and pulse meters, with different units, gaps, duplicates, and outliers.

**Output:** A uniform dataset with:

* One row per meter per 15-minute interval (and a daily consumption row)
* Standardized units by meter type
* Quality labels that show how each value was produced or why it is empty

The pipeline runs daily for each building. Each run processes the previous day so raw readings are complete before normalization starts.

## Virtual points

For each meter, normalization produces three virtual points.

| Virtual point        | Interval   | Description                               |
| -------------------- | ---------- | ----------------------------------------- |
| Consumption (15-min) | 15 minutes | Energy or volume consumed in the interval |
| Rate (15-min)        | 15 minutes | Average power or flow during the interval |
| Consumption (Daily)  | 1 day      | Total energy or volume for the day        |

### Output units by meter type

| Meter type                    | Consumption unit | Rate unit |
| ----------------------------- | ---------------- | --------- |
| Electric                      | kWh              | kW        |
| Water                         | gal              | gal/min   |
| Natural gas                   | ft³              | ft³/h     |
| Steam                         | lbm              | lbm/h     |
| Energy (chilled or hot water) | kBtu             | kBtu/h    |

## How the process works

Normalization follows a fixed sequence.

1. **Validate meter configuration** — Flag duplicate fields, cooling and heating conflicts, and invalid units before processing.
2. **Clean raw readings** — Drop nulls and duplicates. Remove negative values, zero accumulators, and spike or dip outliers.
3. **Standardize units** — Convert every reading to the target unit for that meter type.
4. **Align to 15 minutes** — Map irregular timestamps to a uniform grid. Accumulators become interval consumption by differencing. Sensors convert rate to consumption.
5. **Apply physical limits** — Nullify values that exceed meter-type limits for a 15-minute window.
6. **Select the best field** — When a meter has multiple fields, prefer total accumulators over differentials and sensors.
7. **Fill short gaps** — Linear interpolation covers gaps up to two hours. Longer gaps stay empty.
8. **Label every row** — Attach configuration, validation, and interpolation labels so you can trust or investigate each value.

Meters with no raw data still appear in the output with empty values and a missing-data label. Nothing is silently dropped.

```mermaid actions={false} theme={"theme":{"light":"github-dark","dark":"github-dark"}}
---
config:
  layout: dagre
  theme: neutral
---
flowchart LR
  A["Raw interval readings"] --> B["Validate and clean"]
  B --> C["Standardize and resample"]
  C --> D["Label quality"]
  D --> E["15-min and daily virtual points"]
```

## Data quality labels

Every normalized row carries a `labels` dictionary. Empty braces `{}` mean clean measured data.

| Category        | What it covers                                               |
| --------------- | ------------------------------------------------------------ |
| `data_quality`  | Meter-level configuration issues                             |
| `validation`    | Row-level data problems such as missing readings or outliers |
| `interpolation` | How a gap or timestamp was filled                            |
| `field_used`    | Which source field supplied the value                        |

Treat configuration and validation labels as signals to fix mapping or sensors. Treat interpolation labels as estimates for short gaps. Full definitions live on [Interval normalization labels](/products/energ/reference/interval-normalization-labels).

## Next steps

<CardGroup cols={2}>
  <Card title="Interval normalization labels" icon="table" href="/products/energ/reference/interval-normalization-labels" arrow={true} cta="Look up">
    Look up virtual point fields, limits, and quality label meanings.
  </Card>

  <Card title="KODE OS data source" icon="plug" href="/products/energ/data-sources/kode-os-data-source" arrow={true} cta="Open">
    Connect interval meters that feed normalization.
  </Card>

  <Card title="Data sources and meters" icon="gauge" href="/products/energ/concepts/data-and-meters" arrow={true} cta="Read">
    See how bills and interval reads fit together in EnerG.
  </Card>

  <Card title="Meter comparisons" icon="git-compare" href="/products/energ/data-quality/meter-comparisons" arrow={true} cta="Open">
    Compare utility bills against interval totals after data is clean.
  </Card>
</CardGroup>
