# System_Production data

This is the aggregated solar production data, as reported by the Envoy, class `EnvoySystemProduction`.

        data: EnvoyData = await envoy.update()

        print(f'Watts: {data.system_production.watts_now}')
        print(f'TodaysEnergy: {data.system_production.watt_hours_today}')
        print(f'LifetimeEnergy {data.system_production.watt_hours_lifetime}')
        print(f'Last7DaysEnergy {data.system_production.watt_hours_last_7_days}')

## System_Production_Phases

For metered Envoy with multi-phase installations, production phase data is available in `system_production_phases` keyed by `PhaseNames`.

    from pyenphase.const import PhaseNames, PHASENAMES

    data: EnvoyData = await envoy.update()

    # if more then 1 phase reported then get phase data
    if envoy.actual_phase_count > 1 and data.system_production_phases:
        # Get data by looping over phase data
        for phase in data.system_production_phases:
            print(f'{phase} Watts: {data.system_production_phases[phase].watts_now}')
            print(f'{phase} TodaysEnergy: {data.system_production_phases[phase].watt_hours_today}')
            print(f'{phase} LifetimeEnergy {data.system_production_phases[phase].watt_hours_lifetime}')
            print(f'{phase} Last7DaysEnergy {data.system_production_phases[phase].watt_hours_last_7_days}')

        # report specific phase data by using PhaseNames (for phase 1)
        print(
            f'watt_hours_lifetime : {data.system_production_phases[PhaseNames.PHASE_1].watt_hours_lifetime}'
        )
        # report specific phase data by using phase index 0-2 (for phase 1)
        print(
            f'watt_hours_lifetime : {data.system_production_phases[PHASENAMES[0]].watt_hours_lifetime}'
        )

## Data sources

The data is provided by one of the updaters below, ordered in their probe sequence.

This data set is identified by the `pyenphase.const.SupportedFeatures` flag `PRODUCTION`. First updater probe that returns the feature flag will be used.

### `EnvoyProductionJsonUpdater`

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

endpoint | `/production.json?details=1` |
json path aggregated | `production[?(@.type=='eim' && @.activeCount > 0)]` |
json path phases | `production[?(@.type=='eim' && @.activeCount > 0)].lines[*]` |
class data | json node | uom
`watt_hours_lifetime` | whLifetime | Wh
`watt_hours_last_7_days` | whLastSevenDays | Wh
`watt_hours_today` | whToday | Wh
`watts_now` | wNow | W

### `EnvoyProductionUpdater`

This is an alternative updater for production data if the standard updater data is not available. It only provides data for aggregated phases. Data is measured/calculated by the Envoy.

endpoint | `/production` |
json path | `production[?(@.type=='eim' && @.activeCount > 0)]` |
class data | json node | uom
`watt_hours_lifetime` | whLifetime | Wh
`watt_hours_last_7_days` | whLastSevenDays | Wh
`watt_hours_today` | whToday | Wh
`watts_now` | wNow | W

### `EnvoyApiV1ProductionUpdater`

This is an alternative updater for production data for non-metered Envoy or Envoy metered without installed CT. Previous updaters don’t return data for this type. It only provides data for aggregated phases. Data is measured/calculated by the Envoy.

endpoint | `/api/v1/production` |
json path | `$` |
class data | json node | uom
`watt_hours_lifetime` | wattHoursLifetime | Wh
`watt_hours_last_7_days` | wattHoursSevenDays | Wh
`watt_hours_today` | wattHoursToday | Wh
`watts_now` | wattsNow | W

For Envoy‑metered systems without CTs installed on firmware 8.2.8.2.4264 or newer, the V1 Production endpoint may report stalled values. When `/info` indicates `is_meter`, fall back to the inverters section in the Production endpoint (handled by the next updater).

### `EnvoyProductionJsonFallbackUpdater`

This is an alternative updater for production data for non-metered Envoy or Envoy metered without CT installed. The `EnvoyApiV1ProductionUpdater` updater does not return data for some firmware versions. In that case, this updater falls back to the `inverters` section in the production report. It only provides data for aggregated phases. Data is measured/calculated by the Envoy.

endpoint | `/production.json?details=1` or `/production` |
json path | `production[?(@.type=='inverters' && @.activeCount > 0)]` |
class data | json node | uom
`watt_hours_lifetime` | whLifetime | Wh
`watt_hours_last_7_days` | not in report, use unreliable whLastSevenDays from type==’eim’ |
`watt_hours_today` | not in report, use unreliable whToday from type==’eim’ |
`watts_now` | wNow | W