Skip to content

V2C Trydan: IntensityMeasure_L1/L2/L3 are grid currents but are exposed as charger phase currents #33154

Description

@pvodoz

Describe the bug

The Trydan charger integration incorrectly uses the Trydan's phase current measurement (IntensityMeasure_L1) as the EV charging current.
My Trydan V2C is a single-phase installation and is configured with a Shelly Pro 3EM as its external energy meter. The Shelly Pro 3EM has three current clamps in single phase profile:

  • L1: house/grid connection
  • L2: photovoltaic production
  • L3: Trydan EV charger

The Trydan is configured to receive the Shelly measurements via MQTT. I do NOT have the proprietary current clamp connected to the Trydan.
The Trydan /RealTimeData endpoint exposes IntensityMeasure_L1, IntensityMeasure_L2 and IntensityMeasure_L3.

In my configuration, IntensityMeasure_L1 corresponds to the current measured by the Shelly on phase L1 of the house/grid connection. It is therefore NOT the current consumed by the EV charger.

However, the EVCC Trydan integration exposes these values through the api.PhaseCurrents interface, and EVCC subsequently uses GetMaxPhaseCurrent() as a fallback for charger-current consistency checking.
This causes EVCC to interpret the house/grid current as the actual EV charging current.

For example, when the car is charging at approximately 7 A, the Trydan reports:
ChargePower: 1610 W
Intensity: 7 A
IntensityMeasure_L1: 11.09 A

The 11.09 A value is the current measured on the grid/house phase, not the EV charging current.

This leads to errors such as:
charger logic error: current mismatch (got 11.1A measured, expected 7A)
and can also cause the EVCC loadpoint current to be incorrectly updated.

The important distinction is:

  • Intensity = current offered/set by the Trydan to the EV
  • ChargePower = actual EV charging power
  • IntensityMeasure_L1 = Shelly Pro 3EM L1 current / grid phase current in my configuration

Therefore IntensityMeasure_L1 must not be used as the EV charger phase current in this configuration.

Steps to reproduce

  1. Use a V2C Trydan with firmware 2.5.0.

  2. Configure the Trydan in single-phase mode:
    ChargeMode = 0

  3. Do not connect the proprietary current clamp to the Trydan.

  4. Configure the Trydan to use an external Shelly Pro 3EM via MQTT.

  5. Configure the Shelly Pro 3EM with:

    • Clamp L1 = house/grid
    • Clamp L2 = photovoltaic production
    • Clamp L3 = EV charger
  6. Configure EVCC to use the Trydan charger integration.

  7. Start an EV charging session at a known current, for example 7 A.

  8. Query:
    http:///RealTimeData

  9. Observe values similar to:

    "ChargePower":1610.00,
    "Intensity":7,
    "IntensityMeasure_L1":11.09,
    "VoltageMeasure_L1":225.44

  10. Compare this with the Shelly Pro 3EM measurement. The 11.09 A value corresponds to the Shelly L1 measurement (house/grid), not to the EV charging current.

  11. EVCC nevertheless uses the phase current returned by the Trydan PhaseCurrents implementation when checking the consistency between the expected and measured charging current.

  12. This results in a current mismatch warning and EVCC can interpret the grid current as the EV charging current.

Configuration details

EVCC version:
Latest version, freshly reinstalled from the current EVCC source tree.

Charger:
V2C Trydan

Trydan firmware:
2.5.0

Connection:
Local HTTP API

Trydan IP:
192.168.0.45

Charging mode:
Single phase

Trydan ChargeMode:
0

Current measurement:
No proprietary Trydan current clamp is connected.

External energy meter:
Shelly Pro 3EM

Shelly configuration:
- L1 clamp: house/grid
- L2 clamp: photovoltaic production
- L3 clamp: EV charger

The Trydan receives the Shelly measurements via MQTT.

EVCC configuration:
The EVCC configuration is managed through the EVCC web UI.

The relevant charger configuration is the Trydan charger using the local Trydan HTTP interface.

The EVCC site/circuit grid meter is also based on the Shelly installation.

The vehicle is configured as a single-phase vehicle with:
- minCurrent: 6 A
- maxCurrent: 32 A
- phases: 1

The Trydan reports the following relevant fields through /RealTimeData:

- ChargePower
- Intensity
- IntensityMeasure_L1
- IntensityMeasure_L2
- IntensityMeasure_L3
- VoltageMeasure_L1
- VoltageMeasure_L2
- VoltageMeasure_L3

In this setup, IntensityMeasure_L1 is not the EV charging current. It is the external Shelly L1/grid current.

Log details

Below is an excerpt from the EVCC trace log while the vehicle is charging:

[trydan] TRACE 2026/08/25 08:34:56 {"ID":"XXXXXX","FirmwareVersion":"2.5.0","ChargeState":2,"ChargeMode":0,"ReadyState":0,"ChargePower":1610.00,"VoltageInstallation":230,"ChargeEnergy":0.01,"SlaveError":0,"ChargeTime":21,"GridPower":347.00,"HousePower":457.00,"FVPower":110.00,"BatteryPower":0.00,"Paused":0,"Locked":0,"Timer":0,"Intensity":7,"IntensityMeasure_L1":11.09,"IntensityMeasure_L2":0.00,"IntensityMeasure_L3":0.00,"VoltageMeasure_L1":225.44,"VoltageMeasure_L2":0.00,"VoltageMeasure_L3":0.00,"Dynamic":1,"MinIntensity":6,"MaxIntensity":7,"PauseDynamic":0,"LightLED":45,"LogoLED":1,"DynamicPowerMode":0,"ContractedPower":9000,"SSID":"toto","IP":"192.168.0.45","SignalStatus":3}

[trydan] TRACE 2026/08/25 08:35:07 {"ID":"XXXXXX","FirmwareVersion":"2.5.0","ChargeState":2,"ChargeMode":0,"ReadyState":0,"ChargePower":1610.00,"VoltageInstallation":230,"ChargeEnergy":0.01,"SlaveError":0,"ChargeTime":31,"GridPower":851.00,"HousePower":967.00,"FVPower":116.00,"BatteryPower":0.00,"Paused":0,"Locked":0,"Timer":0,"Intensity":7,"IntensityMeasure_L1":11.09,"IntensityMeasure_L2":0.00,"IntensityMeasure_L3":0.00,"VoltageMeasure_L1":226.15,"VoltageMeasure_L2":0.00,"VoltageMeasure_L3":0.00,"Dynamic":1,"MinIntensity":6,"MaxIntensity":7,"PauseDynamic":0,"LightLED":45,"LogoLED":1,"DynamicPowerMode":0,"ContractedPower":9000,"SSID":"toto","IP":"192.168.0.45","SignalStatus":3}

[trydan] TRACE 2026/08/25 08:35:16 {"ID":"XXXXXX","FirmwareVersion":"2.5.0","ChargeState":2,"ChargeMode":0,"ReadyState":0,"ChargePower":1610.00,"VoltageInstallation":230,"ChargeEnergy":0.02,"SlaveError":0,"GridPower":-68.00,"HousePower":48.00,"FVPower":116.00,"BatteryPower":0.00,"Paused":0,"Locked":0,"Timer":0,"Intensity":7,"IntensityMeasure_L1":11.08,"IntensityMeasure_L2":0.00,"IntensityMeasure_L3":0.00,"VoltageMeasure_L1":226.00,"VoltageMeasure_L2":0.00,"VoltageMeasure_L3":0.00,"Dynamic":1,"MinIntensity":6,"MaxIntensity":7,"PauseDynamic":0,"LightLED":45,"LogoLED":1,"DynamicPowerMode":0,"ContractedPower":9000,"SSID":"toto","IP":"192.168.0.45","SignalStatus":3}

[trydan] TRACE 2026/08/25 08:35:25 {"ID":"XXXXXX","FirmwareVersion":"2.5.0","ChargeState":2,"ChargeMode":0,"ReadyState":0,"ChargePower":1610.00,"VoltageInstallation":230,"ChargeEnergy":0.02,"SlaveError":0,"ChargeTime":51,"GridPower":-16.00,"HousePower":100.00,"FVPower":116.00,"BatteryPower":0.00,"Paused":0,"Locked":0,"Timer":0,"Intensity":7,"IntensityMeasure_L1":11.07,"IntensityMeasure_L2":0.00,"IntensityMeasure_L3":0.00,"VoltageMeasure_L1":226.14,"VoltageMeasure_L2":0.00,"VoltageMeasure_L3":0.00,"Dynamic":1,"MinIntensity":6,"MaxIntensity":7,"PauseDynamic":0,"LightLED":45,"LogoLED":1,"DynamicPowerMode":0,"ContractedPower":9000,"SSID":"toto","IP":"192.168.0.45","SignalStatus":3}

[trydan] TRACE 2026/08/25 08:35:33 {"ID":"XXXXXX","FirmwareVersion":"2.5.0","ChargeState":2,"ChargeMode":0,"ReadyState":0,"ChargePower":1610.00,"VoltageInstallation":230,"ChargeEnergy":0.03,"SlaveError":0,"GridPower":31.00,"HousePower":147.00,"FVPower":116.00,"BatteryPower":0.00,"Paused":0,"Locked":0,"Timer":0,"Intensity":7,"IntensityMeasure_L1":11.25,"IntensityMeasure_L2":0.00,"IntensityMeasure_L3":0.00,"VoltageMeasure_L1":226.04,"VoltageMeasure_L2":0.00,"VoltageMeasure_L3":0.00,"Dynamic":1,"MinIntensity":6,"MaxIntensity":7,"PauseDynamic":0,"LightLED":45,"LogoLED":1,"DynamicPowerMode":0,"ContractedPower":9000,"SSID":"toto","IP":"192.168.0.45","SignalStatus":3}

The relevant EVCC code appears to be:

charger/trydan.go:

var _ api.PhaseCurrents = (*Trydan)(nil)

func (c Trydan) Currents() (float64, float64, float64, error) {
    data, err := c.statusG.Get()
    if err != nil {
        return 0, 0, 0, err
    }
    if data.phaseMeasurementsUnavailable() {
        return 0, 0, 0, api.ErrNotAvailable
    }
    return data.IntensityMeasureL1,
           data.IntensityMeasureL2,
           data.IntensityMeasureL3, nil
}

The EVCC loadpoint fallback then uses:

lp.GetMaxPhaseCurrent()

which returns the maximum of the reported phase currents.

In this setup this means EVCC receives approximately 11 A as the "measured charger current", although the EV is actually charging at 7 A.

I believe the Trydan integration should not expose IntensityMeasure_L1/L2/L3 as api.PhaseCurrents when these values represent external/grid measurements rather than the actual EVSE output current.

A possible fix would be to:
- not implement api.PhaseCurrents for Trydan in this situation, or
- only expose phase currents when they are known to represent the actual EVSE output current, or
- use the Trydan's Intensity value for the charger current instead.

The exact correct interpretation of the Trydan fields may need to be confirmed with V2C, but the current behavior demonstrably causes EVCC to use the wrong current for its charger consistency check.

What type of operating system or environment does evcc run on?

Docker container

External automation

  • I have made sure that no external automation like HomeAssistant or Node-RED is active or accessing any of the mentioned devices when this issue occurs.

Nightly build

  • I have verified that the issue is reproducible with the latest nightly build

Version

v 0.315.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionRather clarification than issue

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions