Skip to content

WIP: EcoFlow PowerPulse - charger integration #27677

Description

@JulianKahnert

Hi there, first of all thank you for this awesome project!

I have an EcoFlow PowerPulse wallbox and want to integrate it into evcc via the official EcoFlow Developer API (Access Key / Secret Key), analogous to the existing EcoFlow PowerOcean meter integration.

I started with the API research, but I keep coming across missing information.
That's why I wanted to document the current status here.
Maybe there are other people who are trying it out, so we can collect our information in this issue.

Device Info

Device SN prefix Notes
EcoFlow PowerOcean HJ35... Home battery — acts as gateway for PowerPulse
EcoFlow PowerPulse C376... 11 kW EV charger (up to 40 A)

The PowerPulse is a sub-device of the PowerOcean. It cannot be queried or controlled directly via the Developer API (Error 1006). All data access goes through the PowerOcean SN as a gateway.

Implementation Checklist

Read Path

  • GetAllParameters via PowerOcean SNGET /iot-open/sign/device/quota/all works and returns 345 fields including nested PowerPulse sub-device data
  • PowerPulse sub-device identified — accessible under ems_edev_sys.devInfoFix.devSubInfoFix[] and ems_edev_sys.devInfoVar.devSubInfoVar[] by matching devInfo.devSn
  • CurrentPower() field candidates foundallocatedPower and realPowerLock present in sub-device data; both are 0 when idle
  • CurrentPower() verified — need to confirm which field (allocatedPower vs realPowerLock) reflects actual delivered power during an active charging session
  • Status() — StatusA/B/C mapping complete
    • devStateInfo = 5 observed both with and without car connected → cannot distinguish StatusA from StatusB
    • Hypothesis: sysFlag & 0x40 (bit 6) may indicate car connected (sysFlag changed from 3599 when car was connected). Needs verification by disconnecting and reconnecting.
    • Status during active charging (StatusC) completely unknown
  • Enabled() field identified — no field found so far that reliably maps to charging-enabled state

Write Path (SET Commands)

  • Enable(bool) — correct cmdCode found
    • Sending SET via PowerPulse SN directly → Error 1006 (blocked)
    • Sending SET via PowerOcean SN → Error 1008 (wrong cmdCode/params) for all tested variants:
      POWER_PULSE_SET_CHARGING_SWITCH, JTS1_EMS_EDEV_SET_SWITCH, JTS1_EMS_EV_CHARGE_SWITCH, JTS1_EV_CHG_SET_SWITCH, JTS1_EMS_CTRL_EV_CHARGE, and ~10 others
    • Official PowerOcean docs have no documented SET commands for the PowerPulse sub-device
  • MaxCurrent(int64) — correct cmdCode found
    • Same situation as Enable: POWER_PULSE_SET_MAX_CHARGING_CURRENT and others → Error 1008
    • Correct cmdCode and param structure unknown

MQTT

  • MQTT credentials obtained via /iot-open/sign/certification
  • Connection to mqtts://mqtt-e.ecoflow.com:8883 successful
  • Subscriptions accepted (including wildcard #)
  • MQTT push updates working — broker connects but delivers zero messages for this device combination; the userId field in the certification response is empty, which may be the cause

Optional Interfaces

  • ChargedEnergy() — not researched yet
  • TotalEnergy() — not researched yet
  • Currents() — not researched yet
  • Phases1p3p()targetMax = 11040 W suggests 3-phase support; cmdCode unknown

What We Have vs. What's Missing

✅ Have

Feature Source Confidence
Full quota/all response via PowerOcean SN GET /iot-open/sign/device/quota/all Confirmed
PowerPulse sub-device data in response ems_edev_sys.devInfoFix/Var.devSubInfo*[] Confirmed
Power field candidates (allocatedPower, realPowerLock) devInfoVar Confirmed (0 at idle)
Error/fault/warn codes devInfoFix Confirmed
Skeleton charger implementation charger/ecoflow-powerpulse.go Exists

❌ Missing / Blocked

Feature Blocker
Status() — distinguish A/B/C devStateInfo static; sysFlag hypothesis unverified; charging state unknown
Enabled() No reliable field identified
Enable(bool) Correct SET cmdCode unknown; all tested variants → Error 1008
MaxCurrent(int64) Same as Enable
CurrentPower() during charging allocatedPower/realPowerLock unverified under active load
evPwr, chargingStatus flat fields Not available for HJ35 series (docs example uses HJ31)
MQTT push updates Broker delivers no messages; userId empty in cert response

Open Questions

  1. devStateInfo mapping — What value does it take when car is disconnected? When actively charging? Currently always 5 regardless of state.
  2. sysFlag bit 6 — Does sysFlag & 64 reliably indicate car connected? Needs a disconnect/reconnect test to confirm.
  3. SET cmdCode — The correct cmdCode to control the PowerPulse sub-device via PowerOcean is undocumented. Does anyone have access to EcoFlow's internal API docs or a working example?
  4. HJ31 vs HJ35 series — The official docs examples use an HJ31-series SN. Our device is HJ35. Do HJ31 devices actually expose evPwr/chargingStatus via POST quota? Is there a firmware update for HJ35?
  5. MQTT userId empty — Is this expected for Developer API accounts, or does it indicate a provisioning issue on EcoFlow's side?
  6. CurrentPower() during active charging — Which field (allocatedPower vs realPowerLock) reflects actual delivered power?

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    devicesSpecific device supportstaleOutdated and ready to closewaiting for feedbackSuspended progress

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions