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
Write Path (SET Commands)
MQTT
Optional Interfaces
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
devStateInfo mapping — What value does it take when car is disconnected? When actively charging? Currently always 5 regardless of state.
sysFlag bit 6 — Does sysFlag & 64 reliably indicate car connected? Needs a disconnect/reconnect test to confirm.
- 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?
- 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?
- MQTT
userId empty — Is this expected for Developer API accounts, or does it indicate a provisioning issue on EcoFlow's side?
CurrentPower() during active charging — Which field (allocatedPower vs realPowerLock) reflects actual delivered power?
References
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
HJ35...C376...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
GetAllParametersvia PowerOcean SN —GET /iot-open/sign/device/quota/allworks and returns 345 fields including nested PowerPulse sub-device dataems_edev_sys.devInfoFix.devSubInfoFix[]andems_edev_sys.devInfoVar.devSubInfoVar[]by matchingdevInfo.devSnCurrentPower()field candidates found —allocatedPowerandrealPowerLockpresent in sub-device data; both are0when idleCurrentPower()verified — need to confirm which field (allocatedPowervsrealPowerLock) reflects actual delivered power during an active charging sessionStatus()— StatusA/B/C mapping completedevStateInfo = 5observed both with and without car connected → cannot distinguish StatusA from StatusBsysFlag & 0x40(bit 6) may indicate car connected (sysFlagchanged from35→99when car was connected). Needs verification by disconnecting and reconnecting.Enabled()field identified — no field found so far that reliably maps to charging-enabled stateWrite Path (SET Commands)
Enable(bool)— correct cmdCode foundPOWER_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 othersMaxCurrent(int64)— correct cmdCode foundEnable:POWER_PULSE_SET_MAX_CHARGING_CURRENTand others → Error 1008MQTT
/iot-open/sign/certificationmqtts://mqtt-e.ecoflow.com:8883successful#)userIdfield in the certification response is empty, which may be the causeOptional Interfaces
ChargedEnergy()— not researched yetTotalEnergy()— not researched yetCurrents()— not researched yetPhases1p3p()—targetMax = 11040 Wsuggests 3-phase support; cmdCode unknownWhat We Have vs. What's Missing
✅ Have
quota/allresponse via PowerOcean SNGET /iot-open/sign/device/quota/allems_edev_sys.devInfoFix/Var.devSubInfo*[]allocatedPower,realPowerLock)devInfoVardevInfoFixcharger/ecoflow-powerpulse.go❌ Missing / Blocked
Status()— distinguish A/B/CdevStateInfostatic;sysFlaghypothesis unverified; charging state unknownEnabled()Enable(bool)MaxCurrent(int64)CurrentPower()during chargingallocatedPower/realPowerLockunverified under active loadevPwr,chargingStatusflat fieldsuserIdempty in cert responseOpen Questions
devStateInfomapping — What value does it take when car is disconnected? When actively charging? Currently always5regardless of state.sysFlagbit 6 — DoessysFlag & 64reliably indicate car connected? Needs a disconnect/reconnect test to confirm.evPwr/chargingStatusvia POST quota? Is there a firmware update for HJ35?userIdempty — Is this expected for Developer API accounts, or does it indicate a provisioning issue on EcoFlow's side?CurrentPower()during active charging — Which field (allocatedPowervsrealPowerLock) reflects actual delivered power?References