# Current Transformer Data

This section documents CT data for Envoy‑metered systems via `EnvoyMeterData`.

Depending on how many and which CT are installed, data is available in:

- `pyenphase.EnvoyData.ctmeters`[`CtType`]

Legacy per‑type attributes remain for compatibility:

- `pyenphase.EnvoyData.ctmeter_production`

- `pyenphase.EnvoyData.ctmeter_consumption`

- `pyenphase.EnvoyData.ctmeter_storage`

These map to their counterparts `pyenphase.EnvoyData.ctmeters`[`CtType`]. In some future version these may be deprecated.

There are multiple CT types that can be installed. The CT meter types are enumerated as `production`, `storage`, `net-consumption`, `total-consumption`, `backfeed`, `load`, `evse` and `pv3p` by `pyenphase.models.meters.CtType`. One or more of these can be installed and enabled. For multi-phase configurations, there will be one per phase.

        data: EnvoyData = await envoy.update()

        production_ct = data.ctmeters[CtType.PRODUCTION]

        print(f'eid: {production_ct.eid}')
        print(f'timestamp: {production_ct.timestamp}')
        print(f'energy_delivered: {production_ct.energy_delivered}')
        print(f'energy_received: {production_ct.energy_received}')
        print(f'power_factor: {production_ct.power_factor}')
        print(f'active_power: {production_ct.active_power}')
        print(f'voltage: {production_ct.voltage}')
        print(f'current: {production_ct.current}')
        print(f'frequency: {production_ct.frequency}')
        print(f'state: {production_ct.state}')
        print(f'measurement_type: {production_ct.measurement_type}')
        print(f'metering_status: {production_ct.metering_status}')
        print(f'status_flags: {production_ct.status_flags}')

To detect how many CTs are installed, use the Envoy property `ct_meter_count`. You can identify which CT meters are available via `pyenphase.Envoy.ct_meter_list`. To test presence of individual CT meters use `pyenphase.Envoy.meter_type()` with a `CtType` argument.

The consumption CT can be either `net-consumption` (installed at the grid boundary) or `total-consumption` (measuring house load); see ct-model below. Which one is installed, is available in `pyenphase.Envoy.consumption_meter_type`. The IQ Metered collar includes an embedded `net-consumption` CT.

        how_many_ct = envoy.ct_meter_count
        meter_list = envoy.ct_meter_list

        consumption_ct = 'installed' if envoy.consumption_meter_type else 'not installed'
        production_ct = 'installed' if envoy.meter_type(CtType.PRODUCTION) else 'not installed'
        storage_ct = 'installed' if CtType.STORAGE in meter_list else 'not installed'

        print(f'This Envoy has Production CT {production_ct}, Consumption CT {consumption_ct}, and Storage CT {storage_ct}')

## Consumption CT options

The consumption CT can be installed in two configurations: `Solar + Load` or `Load only`. The attribute `consumption_meter_type` indicates whether the CT is operating in `net-consumption` or `total-consumption` mode.

In `net-consumption` mode, `energy_delivered` reports cumulative site import (energy received from the grid), while `energy_received` reports cumulative site export (energy sent to the grid).[1][2] In `total-consumption` mode, the CT reports only the house load.

`active_power` is the instantaneous power; its sign reflects the direction of energy flow.

    if (cttype := data.consumption_meter_type) == CtType.NET_CONSUMPTION:
        grid_import = data.ctmeters[cttype].energy_delivered
        grid_export = data.ctmeters[cttype].energy_received
        grid_power = data.ctmeters[cttype].active_power
    else:
        print("No net consumption CT installed")

## Production CT Options

The production CT measures solar production. `energy_delivered` reports the energy generated by the solar array, while `energy_received` reports energy consumed by the solar hardware. The latter is typically minimal (e.g., inverter consumption during dawn and dusk).[2]

## Storage CT Options

The storage CT measures battery charge and discharge. `energy_delivered` reports energy discharged from the battery, while `energy_received` reports energy charged to the battery.[2]

## Backfeed CT Options

The backfeed CT measures energy fed back from the Combiner to the switchboard. `energy_delivered` reports energy fed back, while `energy_received` reports received from the switchboard.[2]

## Load CT Options

The load CT measures energy flow between the combiner and backup loads (installations may vary with backup and non‑backup loads). Per the CT Model, `energy_delivered` is energy towards the switchboard, and `energy_received` is energy from the switchboard.[2]

## EVSE CT Options

The EVSE CT measures energy flow between the combiner and the EV charger. Per the CT Model, `energy_delivered` is energy towards the switchboard, and `energy_received` is energy from the switchboard.[2]

## PV3P CT Options

The PV3P CT measures solar production by third party PV. `energy_delivered` reports the energy generated by the solar array, while `energy_received` reports energy consumed by the solar hardware. The latter is typically minimal (e.g., consumption during dawn and dusk).[2]

## CT Model

Below is a generic model for installed CTs. Each CT can be considered as facing the switchboard and reporting energy delivered to the switchboard in its `energy_delivered` property and energy received from the switchboard in `energy_received`. Power is positive towards the switchboard and negative from the switchboard.

These properties have different meaning for each specific CT. For a net-consumption CT, delivered is import from the grid, for Solar production CT, it is solar production and for a battery CT it is battery discharge. A total-consumption CT typically has no delivery but only receives what is consumed by the house.

When a combiner is used, several other CT types may be available.

> NOTE

> - This in no way represents a configuration direction, as actual configuration is driven by local rules, installer designs and Enphase installation guidelines. Variations may exist, based on specific needs or rules. This merely describes a simplified view and naming conventions used in this documentation to clarify integration operation. Refer to Enphase documentation for more information.

> - Some element positions, including PV3P, are assumed positions and still need confirmation.

> - This is an independent publication and has not been authorized, sponsored, or otherwise approved by Enphase Energy, Inc. It is loosely based on Enphase technical brief “PCS integration in 4th-generation Enphase Energy Systems”.

## Dual CT attributes, single production report attribute

An Envoy metered with CTs installed, sources production and consumption data from the CT meters. The system_production data is collected from the production CT. The system_consumption data represents total house load and is either collected from the consumption CT in `total-consumption` mode or calculated by the Envoy from both production and consumption CTs when the consumption CT is in `net-consumption` mode.

A single increasing/decreasing total of import and export is reported by the `/production.json?details=1` in `net-consumption` as `whLifetime` for energy and `wNow` for power. CT readings provide two monotonically increasing energy properties, `actEnergyDlvd` and `actEnergyRcvd`; power is reported in a single value `activePower`.

## Multi-phase CT

For metered Envoy with multi‑phase installations, CT phase data is available in:

- `pyenphase.EnvoyData.ctmeters_phases`[`CtType`][`PhaseNames`]

Legacy per‑type attributes remain for compatibility:

- `pyenphase.EnvoyData.ctmeter_production_phases`

- `pyenphase.EnvoyData.ctmeter_consumption_phases`

- `pyenphase.EnvoyData.ctmeter_storage_phases`

Phase data is only populated if CTs are installed on more than 1 phase for production and/or consumption phases.

To detect if multiple phases are reporting, use the Envoy property `phase_count`.

        data: EnvoyData = await envoy.update()

        if envoy.phase_count > 1:
            for phase, phase_data in data.ctmeters_phases.get(CtType.PRODUCTION, {}).items():
                for key, value in vars(phase_data).items():
                    print(f'{phase} {key}: {value}')

## Data sources

The data is provided by the updaters below.

This data set is identified by the `pyenphase.const.SupportedFeatures` flag `CTMETERS`. In addition it returns `THREEPHASE` or `DUALPHASE` to signal if a multi-phase mode is active.

### `EnvoyMetersUpdater`

This is the default updater for CT data. It provides data for aggregated phases and individual phases. Data is measured/calculated by the Envoy.

endpoint config | `/ivp/meters` |
endpoint data | `/ivp/meters/readings` |
json path config | `$` |
eid of production | `[?(@.measurementType=='production' && @.state=='enabled')][eid]` |
eid of consumption | `[?(@.measurementType=='net-consumption' && @.state=='enabled')][eid]` |
| `[?(@.measurementType=='total-consumption' && @.state=='enabled')][eid]` |
eid of storage | `[?(@.measurementType=='storage' && @.state=='enabled')][eid]` |
json path aggregated | `[?(@.eid==<eid of ....>)]` |
json path phases | `[?(@.eid==<eid of ....>)].channels[*]` |
class data | json node | uom
`eid` | eid |
`timestamp` | timestamp |
`energy_delivered` | actEnergyDlvd | Wh
`energy_received` | actEnergyRcvd | Wh
`active_power` | activePower | W
`power_factor` | pwrFactor |
`voltage` | voltage | V
`current` | current | A
`frequency` | freq | Hz
`state` | state |
`measurement_type` | measurementType |
`metering_status` | meteringStatus |
`status_flags` | statusFlags |

[1]

Provided the CT is installed on the main grid entry. Refer to the CT Model for delivered and received directions.

[2] (1,2,3,4,5,6,7)

Variations between firmware releases may exist.