[APP][Pro] EcoFlow STREAM Series - solar, battery, smart meter and Homey Energy automation

Hi Justin,

Thanks for the update and for adding the monitoring trial.

I’ve updated to v1.10.30 and enabled Use linked 5000 battery reporter on my existing STREAM Home Battery.

The latest integration report was captured on 11 October 2026 at 22:45:15 CEST (20:45:15 UTC).

The readings look plausible:

  • System SOC: 61%
  • Battery power: −372 W (discharging)
  • The connection is active and the readings are fresh.
  • The monitoring trial is enabled and reports status active.

The Homey STREAM Verbund now displays the correct battery percentage and battery flow. However, the other installation readings, such as solar generation, grid import/export and house consumption, are still unavailable. The original energy counters also remain unchanged in terms of their data source, so I understand that the total energy accounting is not yet verified.

The EcoFlow combined-battery screen showed the AC 5000 and both original STREAM batteries at approximately 61–62% SOC around the same time.

I’ll send you the latest integration JSON and the corresponding screenshots by DM, together with a separate Homey diagnostic report ID.

Since I’m not using any Flows at the moment, the disabled controls and missing installation readings are not currently a problem for me. My main goal is to get reliable combined battery monitoring without deleting or re-pairing existing devices.

Please let me know if you need any further tests, especially while one of the original STREAM batteries is supplying power.

Thanks again for your work on this and for your patience.

Cheers,
Robert

------ Originalnachricht ------
Von “Justin Zarb” <notifications@athom.discoursemail.com>
An rg@rgr.de
Datum 11.10.2026 19:53:19
Betreff Homey Community Forum: [APP][Pro] EcoFlow STREAM Series - solar, battery, smart meter and Homey Energy automation

(Attachment EcoFlow_Report_nach_MonitoringTrial.json is missing)

(Attachment EcoFlow_Integration_Auszug_2035.json is missing)

(attachments)

Sorry, the forum wouldn’t accept the attachments—it’s really tricky. I’ll try a different approach.

Hi Robert,

That sounds promising—thank you! Sorry, one more favour: the two JSON attachments haven’t come through on the forum.

Could you upload the latest integration JSON directly in a forum DM, rather than replying by email? A screenshot of EcoFlow’s combined battery view and the Homey Home Battery readings taken around the same time would also help.

Please also send the Homey app diagnostic report ID after capturing those.

This should let me check that we’re following the correct combined reporter and receiving fresh readings.

I’ve also messaged EcoFlow again to chase my hardware and told them that the delays are really killing progress on development. I want to be able to work through these tests myself, rather than keep asking you to do them for me.

Thanks again for your patience!

JZ

rg@rgr.de

(Attachment EcoFlow_Integration_Auszug_2035.json.txt is missing)

(Attachment EcoFlow_Report_nach_MonitoringTrial.json.txt is missing)

I am just seeing this in the community posts that keep getting sent. So i am not seeing the details come through :frowning:

really sorry to ask again… Feel free to ping them via DM

After the transition

{
“schemaVersion”: 9,
“capturedAt”: “2026-10-11T20:45:15.171Z”,
“appVersion”: “1.10.30”,
“homeyVersion”: “13.5.2-rc.4”,
“platform”: “local”,
“betaPairingEnabled”: true,
“drivers”: [
{
“id”: “stream”,
“role”: “installation_energy”,
“packaged”: true,
“deprecated”: false,
“registered”: true,
“pairedCount”: 1,
“reporting”: [
{
“deviceIndex”: 0,
“currentReadings”: {
“measure_battery”: 61,
“measure_power”: -372,
“measure_power.pv”: null,
“measure_power.grid”: null,
“measure_power.load”: null,
“measure_power.grid_import”: null,
“measure_power.grid_export”: null,
“stream_unit_power_battery_flow”: null,
“stream_5000_direct_pv”: null
},
“lastControlFailure”: null,
“mainResolution”: {
“status”: “changed”,
“ageSec”: 0,
“stale”: false,
“resolvedFamily”: “ac_5000”,
“installationScopeVerified”: false,
“automaticRepairAllowed”: false
},
“observations”: {
“measure_battery”: {
“value”: 0,
“ageSec”: 24,
“source”: “rest”
},
“measure_power”: {
“value”: 0,
“ageSec”: 24,
“source”: “rest”
},
“measure_power.pv”: {
“value”: 0,
“ageSec”: 24,
“source”: “rest”
},
“measure_power.grid”: {
“value”: 0,
“ageSec”: 24,
“source”: “rest”
},
“measure_power.load”: {
“value”: 0,
“ageSec”: 24,
“source”: “rest”
}
},
“readAddressMatchesSavedMain”: true,
“currentInstallationReporterVerified”: false
}
],
“monitoringTrial”: [
{
“deviceIndex”: 0,
“enabled”: true,
“status”: “active”,
“candidateDevice”: {
“driverId”: “stream_5000_unit”,
“deviceIndex”: 0
},
“readingScope”: “system_soc_and_derived_battery_power_only”,
“accountingSource”: “original_address_unchanged_scope_unverified”,
“controlMigrationAllowed”: false,
“installationScopeVerified”: false,
“requiresRePairing”: false,
“rollbackAvailable”: true,
“rollbackAwaitingFreshOriginal”: false,
“readiness”: {
“eligible”: false,
“status”: “active”
},
“timeline”: {
“startedAt”: 1791750350353,
“sessionUptimeSec”: 1164,
“events”: [
{
“at”: 1791750350353,
“event”: “session_started”,
“reason”: null
},
{
“at”: 1791751282183,
“event”: “trial_enabled”,
“reason”: null
},
{
“at”: 1791751282198,
“event”: “reporter_state”,
“reason”: “active”
}
]
},
“coalescedLocalTicks”: 0,
“localRefreshIntervalSec”: 15,
“resolutionCheckIntervalSec”: 240
}
],
“accounting”: [
{
“source”: “device_counters”,
“samples”: 253,
“skippedSamples”: 234,
“ignoredGaps”: 0,
“counterResets”: 0,
“chargedCounterSeen”: true,
“dischargedCounterSeen”: true,
“lastSampleAgeSec”: 9,
“chargedKWh”: 503.537,
“dischargedKWh”: 477.511,
“checkpoint”: {
“pending”: true,
“writing”: false,
“failures”: 0
}
}
],
“topology”: [
{
“deviceIndex”: 0,
“source”: “bk_main_address”,
“membership”: “unverified”,
“pairedAddressFamily”: “original_stream”,
“observedPeerCount”: 0,
“freshPeerCount”: 0,
“peerFamilies”: {
“original_stream”: 0,
“ac_5000”: 0,
“stream_5000”: 0,
“unknown”: 0
},
“peerVisibility”: ,
“expansionPackCount”: null,
“installedCapacityKWh”: null,
“maxReportedRecordCount”: 0,
“lastPeerRecordAgeSec”: null,
“peerEvidenceStale”: true,
“systemSocObserved”: false,
“truncated”: false
}
],
“systemReporter”: ,
“systemFlow”: ,
“configuration”: ,
“assessment”: ,
“readingFreshness”: ,
“connection”:
},
{
“id”: “stream_unit”,
“role”: “physical_monitor”,
“packaged”: true,
“deprecated”: false,
“registered”: true,
“pairedCount”: 2,
“reporting”: [
{
“deviceIndex”: 0,
“currentReadings”: {
“measure_battery”: 61.27147,
“measure_power”: null,
“measure_power.pv”: null,
“measure_power.grid”: null,
“measure_power.load”: null,
“measure_power.grid_import”: null,
“measure_power.grid_export”: null,
“stream_unit_power_battery_flow”: null,
“stream_5000_direct_pv”: null
},
“lastControlFailure”: null,
“mainResolution”: {
“status”: “not_checked”,
“ageSec”: null,
“stale”: true,
“resolvedFamily”: “unknown”,
“installationScopeVerified”: false,
“automaticRepairAllowed”: false
},
“observations”: {},
“readAddressMatchesSavedMain”: null,
“currentInstallationReporterVerified”: false
},
{
“deviceIndex”: 1,
“currentReadings”: {
“measure_battery”: 60.208107,
“measure_power”: null,
“measure_power.pv”: null,
“measure_power.grid”: null,
“measure_power.load”: null,
“measure_power.grid_import”: null,
“measure_power.grid_export”: null,
“stream_unit_power_battery_flow”: null,
“stream_5000_direct_pv”: null
},
“lastControlFailure”: null,
“mainResolution”: {
“status”: “not_checked”,
“ageSec”: null,
“stale”: true,
“resolvedFamily”: “unknown”,
“installationScopeVerified”: false,
“automaticRepairAllowed”: false
},
“observations”: {},
“readAddressMatchesSavedMain”: null,
“currentInstallationReporterVerified”: false
}
],
“monitoringTrial”: ,
“accounting”: ,
“topology”: [
{
“deviceIndex”: 0,
“source”: “unavailable”,
“membership”: “unverified”
},
{
“deviceIndex”: 1,
“source”: “unavailable”,
“membership”: “unverified”
}
],
“systemReporter”: ,
“systemFlow”: ,
“configuration”: ,
“assessment”: ,
“readingFreshness”: [
{
“deviceIndex”: 0,
“readings”: {
“stream_unit_pv3_voltage”: {
“ageSec”: 53,
“stale”: false
},
“stream_unit_pv3_current”: {
“ageSec”: 53,
“stale”: false
},
“stream_unit_pv4_voltage”: {
“ageSec”: 53,
“stale”: false
},
“stream_unit_pv4_current”: {
“ageSec”: 53,
“stale”: false
}
}
},
{
“deviceIndex”: 1,
“readings”: {}
}
],
“connection”:
},
{
“id”: “stream_5000_system”,
“role”: “installation_energy”,
“packaged”: true,
“deprecated”: false,
“registered”: true,
“pairedCount”: 0,
“reporting”: ,
“monitoringTrial”: ,
“accounting”: ,
“topology”: ,
“systemReporter”: ,
“systemFlow”: ,
“configuration”: ,
“assessment”: ,
“readingFreshness”: ,
“connection”:
},
{
“id”: “stream_5000_unit”,
“role”: “physical_monitor”,
“packaged”: true,
“deprecated”: false,
“registered”: true,
“pairedCount”: 1,
“reporting”: [
{
“deviceIndex”: 0,
“currentReadings”: {
“measure_battery”: 61,
“measure_power”: null,
“measure_power.pv”: null,
“measure_power.grid”: -5,
“measure_power.load”: 343,
“measure_power.grid_import”: 0,
“measure_power.grid_export”: 29,
“stream_unit_power_battery_flow”: null,
“stream_5000_direct_pv”: null
},
“lastControlFailure”: null,
“mainResolution”: {
“status”: “not_checked”,
“ageSec”: null,
“stale”: true,
“resolvedFamily”: “unknown”,
“installationScopeVerified”: false,
“automaticRepairAllowed”: false
},
“observations”: {},
“readAddressMatchesSavedMain”: null,
“currentInstallationReporterVerified”: false
}
],
“monitoringTrial”: ,
“accounting”: ,
“topology”: [
{
“deviceIndex”: 0,
“source”: “es22_peer_records”,
“membership”: “unverified”,
“pairedAddressFamily”: “ac_5000”,
“observedPeerCount”: 2,
“freshPeerCount”: 2,
“peerFamilies”: {
“original_stream”: 2,
“ac_5000”: 0,
“stream_5000”: 0,
“unknown”: 0
},
“peerVisibility”: [
{
“observationIndex”: 0,
“prefix”: “BK11”,
“family”: “original_stream”,
“entityRole”: “unverified”,
“fresh”: true,
“fieldsSeenThisSession”: {
“soc”: true,
“rawBatteryPower”: true,
“pv”: true
}
},
{
“observationIndex”: 1,
“prefix”: “BK31”,
“family”: “original_stream”,
“entityRole”: “unverified”,
“fresh”: true,
“fieldsSeenThisSession”: {
“soc”: true,
“rawBatteryPower”: true,
“pv”: true
}
}
],
“expansionPackCount”: null,
“installedCapacityKWh”: null,
“maxReportedRecordCount”: 3,
“lastPeerRecordAgeSec”: 1,
“peerEvidenceStale”: false,
“systemSocObserved”: true,
“truncated”: false
}
],
“systemReporter”: [
{
“deviceIndex”: 0,
“fields”: {
“socPct”: {
“value”: 61,
“ageSec”: 1,
“stale”: false,
“source”: “app_protocol_system_soc”
},
“batteryW”: {
“value”: -372,
“ageSec”: 1,
“stale”: false,
“source”: “derived_app_protocol_flow_matrix”
}
},
“installationScopeVerified”: false
}
],
“systemFlow”: [
{
“deviceIndex”: 0,
“fields”: {
“mpptToBatteryW”: {
“value”: 0,
“ageSec”: 1,
“stale”: false
},
“solarToBatteryW”: {
“value”: 0,
“ageSec”: 1,
“stale”: false
},
“gridToBatteryW”: {
“value”: 0,
“ageSec”: 1,
“stale”: false
},
“batteryToHomeW”: {
“value”: 343,
“ageSec”: 1,
“stale”: false
},
“batteryToGridW”: {
“value”: 29,
“ageSec”: 1,
“stale”: false
},
“batteryToSocketW”: {
“value”: 0,
“ageSec”: 1,
“stale”: false
},
“gridToHomeW”: {
“value”: 0,
“ageSec”: 1,
“stale”: false
},
“gridToSocketW”: {
“value”: 0,
“ageSec”: 1,
“stale”: false
},
“solarToGridW”: {
“value”: 0,
“ageSec”: 1,
“stale”: false
},
“homeW”: {
“value”: 343,
“ageSec”: 1,
“stale”: false
},
“gridMeterW”: {
“value”: -5,
“ageSec”: 0,
“stale”: false
},
“gridFlowNetW”: {
“value”: -29,
“ageSec”: 1,
“stale”: false
},
“batteryDerivedW”: {
“value”: -372,
“ageSec”: 1,
“stale”: false
}
},
“gridReceiptSkewSec”: 1,
“meterMinusFlowW”: 24,
“deviceTimestampsVerified”: false,
“accountingUsed”: false
}
],
“configuration”: [
{
“deviceIndex”: 0,
“source”: “captured_app_protocol”,
“scope”: “subscription_source”,
“ordering”: “receipt_only”,
“controlsEnabled”: false,
“values”: {
“maxGridInputW”: {
“value”: 1500,
“ageSec”: 71,
“stale”: false
},
“maxGridOutputW”: {
“value”: 800,
“ageSec”: 71,
“stale”: false
},
“outputCeilingObservedW”: {
“value”: 800,
“ageSec”: 71,
“stale”: false
},
“backupReservePct”: {
“value”: 10,
“ageSec”: 71,
“stale”: false
},
“maxChargeSocPct”: {
“value”: 100,
“ageSec”: 5,
“stale”: false
},
“minDischargeSocPct”: {
“value”: 0,
“ageSec”: 5,
“stale”: false
},
“backupSocketEnabled”: {
“value”: false,
“ageSec”: 71,
“stale”: false
},
“backupReserveEnabled”: {
“value”: true,
“ageSec”: 71,
“stale”: false
},
“mode”: {
“value”: “self_powered”,
“ageSec”: 71,
“stale”: false
},
“tasks”: {
“value”: ,
“ageSec”: 72,
“stale”: false
}
}
}
],
“assessment”: [
{
“deviceIndex”: 0,
“controlsEnabled”: false,
“gridInput”: {
“scope”: “addressed_device_grid_input_not_total_battery_charge”,
“observation”: “recent_receipt_not_verified_application”,
“modelWriteEvidence”: “offline_es22_payload_replay”,
“safeCeilingVerified”: false,
“zeroBlocksSolarVerified”: false
},
“scheduling”: {
“observedEnabledTaskCount”: 0,
“controllerOwnership”: “unverified”,
“setpointIsMeasuredPower”: false,
“replacementAllowed”: false
},
“topology”: {
“status”: “mixed_family_peer_evidence_for_review”,
“freshPeerCount”: 2,
“autoMergeAllowed”: false,
“capacitySummationAllowed”: false,
“socAveragingAllowed”: false
},
“hardwareAcceptance”: “pending”
}
],
“readingFreshness”: [
{
“deviceIndex”: 0,
“readings”: {
“measure_battery”: {
“ageSec”: 1,
“stale”: false
},
“measure_power.load”: {
“ageSec”: 1,
“stale”: false
},
“measure_power.grid”: {
“ageSec”: 0,
“stale”: false
},
“measure_power.grid_import”: {
“ageSec”: 1,
“stale”: false
},
“measure_power.grid_export”: {
“ageSec”: 1,
“stale”: false
},
“measure_temperature”: {
“ageSec”: 5,
“stale”: false
},
“battery_soh”: {
“ageSec”: 5,
“stale”: false
}
}
}
],
“connection”: [
{
“deviceIndex”: 0,
“subscriptionState”: “active”,
“frameAgeSec”: 0,
“telemetryAgeSec”: 0,
“subscriptionAttempts”: 1,
“reconnectCount”: 0
}
]
},
{
“id”: “stream_ac5000”,
“role”: “legacy_physical_monitor”,
“packaged”: true,
“deprecated”: true,
“registered”: true,
“pairedCount”: 0,
“reporting”: ,
“monitoringTrial”: ,
“accounting”: ,
“topology”: ,
“systemReporter”: ,
“systemFlow”: ,
“configuration”: ,
“assessment”: ,
“readingFreshness”: ,
“connection”:
}
],
“smartMeters”: ,
“installationTopology”: {
“autoGroupingEnabled”: false,
“stableMembershipVerified”: false,
“aggregateCount”: 1,
“evidenceAvailableCount”: 1,
“potentialOverlapPairs”:
},
“reporterShadow”: [
{
“driverId”: “stream”,
“deviceIndex”: 0,
“status”: “comparison_ready”,
“exactResolvedReporterCount”: 1,
“candidateDevice”: {
“driverId”: “stream_5000_unit”,
“deviceIndex”: 0
},
“comparisons”: {
“socPct”: {
“status”: “comparable_receipts”,
“legacy”: {
“value”: 0,
“ageSec”: 24,
“fresh”: true
},
“candidate”: {
“value”: 61,
“ageSec”: 1,
“fresh”: true
},
“candidateSource”: “app_protocol_system_soc”,
“receiptSkewSec”: 23,
“candidateMinusLegacy”: 61
},
“batteryW”: {
“status”: “comparable_receipts”,
“legacy”: {
“value”: 0,
“ageSec”: 24,
“fresh”: true
},
“candidate”: {
“value”: -372,
“ageSec”: 1,
“fresh”: true
},
“candidateSource”: “derived_app_protocol_flow_matrix”,
“receiptSkewSec”: 23,
“candidateMinusLegacy”: -372
}
},
“maxComparisonReceiptSkewSec”: 30,
“deviceTimestampsVerified”: false,
“installationScopeVerified”: false,
“telemetryOnly”: true,
“energyAccountingUnchanged”: true,
“repairAllowed”: false,
“controlMigrationAllowed”: false
}
],
“reporterRepair”: [
{
“driverId”: “stream_5000_unit”,
“deviceIndex”: 0,
“correlatedAggregates”: [
{
“driverId”: “stream”,
“deviceIndex”: 0
}
],
“status”: “candidate_requires_validation”,
“freshSystemSoc”: true,
“freshSystemBatteryPower”: true,
“matchedAggregateCount”: 1,
“repairAllowed”: false,
“blockers”: [
“installation_scope_unverified”,
“counter_source_transition_unverified”,
“hardware_acceptance_pending”
],
“preservesExistingDevices”: true,
“requiresRePairing”: false,
“controlMigrationAllowed”: false
}
],
“streamDiscovery”: {
“source”: “unavailable”,
“scope”: “account_not_installation”,
“membership”: “unverified”,
“expansionCapacity”: “unverified”,
“lastObservationAgeSec”: null,
“stale”: true,
“observedDeviceCount”: 0,
“invalidRecordCount”: 0,
“truncated”: false,
“groups”: ,
“productResearch”:
}
}

The values in the ECOflow app matched

It’s complicated to post here :frowning:

Hi @Robert_Greiner,

Thanks again, and sorry for the repeated requests. I can read the JSON now.

It confirms that the trial is receiving fresh percentage and battery-power readings from the 5000-series reporter. Your latest picture is helpful too, although it’s the Homey overview—we still need the equivalent combined-system screen from EcoFlow.

The remaining question is whether the reported battery power includes the original STREAM units when they’re supplying power. There are also two different grid readings in the report, which I don’t want to treat as interchangeable without checking them.

I’ve published v1.10.31 to Test:

This adds individual battery observations and their receipt ages to the diagnostics. It doesn’t change controls or energy accounting.

Could you update to v1.10.31, allow about five minutes for fresh readings to arrive, then collect one set of information? Ideally, choose a moment when an original STREAM battery is naturally supplying power. Please don’t force a mode just to create that situation.

Here’s exactly what I need:

  1. EcoFlow combined-system screenshot: battery percentage, battery watts, solar, house consumption and grid power.
  2. EcoFlow individual-battery screenshots: the AC 5000 and each original STREAM battery, showing their percentage and charging/discharging watts. If individual watts aren’t available, please let me know.
  3. Homey combined Home Battery details: percentage, battery watts, total charged energy and total discharged energy. Please use the device’s readings page rather than the app overview.
  4. Fresh integration JSON: open the EcoFlow STREAM Series app settings in Homey, select Show integration support report, wait for it to finish, then select Download integration JSON. The download alone saves the previous snapshot, so refreshing first matters.
  5. Separate Homey diagnostic report: create a diagnostics report for the EcoFlow app immediately afterwards and send its report ID.

Please take the screenshots and download as close together as practical—ideally within the same minute. Include the date, local time and timezone, which battery was supplying power, and any longer gaps between captures.

Sending everything together by DM is absolutely fine: the downloaded JSON file, screenshots, capture details and diagnostic ID. Please attach the original JSON without editing it. If the forum rejects the file, let me know and we’ll find another way.

That should help us check whether the 5000 reporter covers the complete installation or only part of it, before I change anything further.

Thanks for sticking with this, and apologies again for the extra work.

JZ

I have read your questions, but this is starting to get a bit too complicated for me. I hope there are others willing to help with the testing, as it is becoming too technical for me. Testing isn’t a problem, but the informational side is a bit more difficult for me.

Hi @Robert_Greiner,

Thanks again, and sorry for another update when I’ve only just asked you for more information! I’ve now published v1.10.33 to Test:

I’ve reviewed your messages, screenshots, full JSON and diagnostic log together. Your latest EcoFlow picture shows one combined battery percentage and power figure, with the AC 5000 and both original STREAM batteries underneath, all charging. That supports keeping one Home Battery for the installation, with optional individual monitors.

The screenshot was taken later than the JSON, so I can’t compare those readings directly. What I still need to check is the combined power when the original STREAM batteries are discharging too.

This update addresses brief unavailable states while readings change, stops old watt readings appearing fresh just because other information is still arriving, and adds more individual-battery information to the support report. Battery controls and energy accounting haven’t changed.

The AC 5000’s individual power and charging-state tiles may still be blank when batteries are linked. That’s deliberate for now: I don’t want to show the combined installation’s power as though it belongs to that one battery. There’s now an explanation for this in the app.

Once you’re on v1.10.33, could you capture these two things when an original STREAM battery is naturally supplying power?

  1. An EcoFlow screenshot showing the combined battery percentage and watts, with the battery breakdown expanded so each battery’s percentage and charging/discharging watts are visible.
  2. Within about a minute, open the EcoFlow app settings in Homey, select Show integration support report (“Integrationsbericht anzeigen”), wait for it to finish, then Download integration JSON (“Integrations-JSON herunterladen”).

Please send the screenshot and JSON together by DM, with your local date/time, timezone and any longer gap between them. No need to change operating modes to force a test. If you’ve already captured a matching set on v1.10.32, that’s still useful.

I already have your diagnostic log, so another is only needed if something goes wrong during the capture. Please send the JSON separately rather than pasting it into Homey’s diagnostic message box, as it gets cut short.

I chased EcoFlow about my equipment, and they said my items should be here in late October—which feels ages away! I really want to be able to work through these tests myself instead of repeatedly asking you.

Thanks for sticking with it, and apologies again for the back and forth.

JZ