That is very useful, thank you! Firefox just didn’t work for me for some reason.
thank you, other guides did not help me but yours did. I’ve been trying for 3 hours. you are the hero haha
What’s involved in adding support for Delta 3 Plus (now just no_devices_found)? I just got one of these and would love to monitor it without using the cloud service.
Let me know if I can help.
Hi @maddios , in general that would take the device itself to test the integration on it. Otherwise not much: to find the right protobuf definition and prepare some logic for the device - since it’s relatively new it should support the recent ble protocol and work similar to the available devices.
Great news folks, with 2 huge contributions from @GnoX and help with testing from the community we have a new release v0.4.1:
- Much better interface that helps new users to locate the USER_ID - it makes request to ecoflow.com with provided user/password and gives USER_ID back to continue configuration.
- River 3 now supports controls - so you can tune your device right from the integration
- Device now shows it’s SN and Mac address
- Multiple bugfixes that made the integration much better
And want thank @GnoX for all those great changes, his effort in digging and rewriting the internal systems brought this integration on a new level of quality!
Just finished setting it up using my River 3 (NAS edition), it works perfectly, really great job! ![]()
Is there maybe a way to configure it to do less updates than each second? It takes quite the CPU time to run this often.
Thanks.
And want thank @GnoX for all those great changes, his effort in digging and rewriting the internal systems brought this integration on a new level of quality!
No problem, glad I could help! Thanks to all people that helped with testing.
Is there maybe a way to configure it to do less updates than each second? It takes quite the CPU time to run this often.
Yeah, I thought that might be a concern for some lower powered devices - for River 3 we are trying to parse 3 messages per second. I am running HA on a N100 device and did not notice any noticable increase in cpu nor power usage with a single device. I do have a RPi4 laying around though, so when I have time, I’ll probably try to look into some optimizations.
Also a sidenote: I am buying Delta 3 Plus so Delta 3 owners can look forward to getting good support for it.
Note edits:
Just wanted to say thanks for this. Just bought a River 3 as a UPS for the home cable modem, router, switch, alarm system and server (an Intel NUC) and this works perfectly with it, allowing me to notify about power failures when we are away and schedule shutdowns automatically.
I am using this via an Atom Lite S3 and ESPHome, and it was picky about distance and interference as everything is in a console. I ended up plugging the Atom directly into the River’s USB A and that worked great. Thanks again for the work.
(spoke too soon…while it created the initial entities and populated them with values, it fails to update those entities. I tried 3 different ESPs, this is from a different S3 that is right next to the River 3 - within 5 inches)
2025-03-13 14:29:52.633 DEBUG (MainThread) [custom_components.ef_ble] Init EcoFlow BLE Integration
2025-03-13 14:29:52.633 DEBUG (MainThread) [custom_components.ef_ble] Connecting Device
2025-03-13 14:29:52.633 DEBUG (MainThread) [custom_components.ef_ble.eflib.devicebase] 9C:9E:6E:5B:DC:16: Creating new device: River 3 (245Wh) (R651ZAB4XGBK4446)
2025-03-13 14:29:52.634 INFO (MainThread) [custom_components.ef_ble.eflib.devicebase] 9C:9E:6E:5B:DC:16: Connecting to River 3
2025-03-13 14:29:52.634 INFO (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: Connecting to device
2025-03-13 14:29:56.571 WARNING (MainThread) [homeassistant.helpers.template] Template variable warning: 'homeassistant.util.read_only_dict.ReadOnlyDict object' has no attribute 'cell_voltages' when rendering '{{states.sensor.sok_aa01308_delta_voltage.attributes.cell_voltages}}'
2025-03-13 14:30:06.763 INFO (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: Connected
2025-03-13 14:30:06.763 DEBUG (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: MTU: 500
2025-03-13 14:30:06.763 INFO (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: Init completed, starting auth routine...
2025-03-13 14:30:06.763 DEBUG (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: initBleSessionKey: Pub key exchange
2025-03-13 14:30:06.764 DEBUG (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: Sending: '5a5a00012c00010076056784c6424c70c845e5694040fb5f11ed4abad553778474d5f468c34b3232697e8a8e6cb78a890339'
2025-03-13 14:30:14.626 WARNING (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: Disconnected from device
2025-03-13 14:30:14.626 WARNING (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: Disconnected from device
2025-03-13 14:30:14.626 WARNING (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: Reconnecting to the device in 10 seconds...
2025-03-13 14:30:14.626 WARNING (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: Reconnecting to the device in 10 seconds...
2025-03-13 14:30:15.627 DEBUG (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: Skip sending: disconnected: '5a5a00012c00010076056784c6424c70c845e5694040fb5f11ed4abad553778474d5f468c34b3232697e8a8e6cb78a890339'
2025-03-13 14:30:15.627 DEBUG (MainThread) [custom_components.ef_ble] Creating entities
2025-03-13 14:30:15.635 DEBUG (MainThread) [custom_components.ef_ble] Setup done
2025-03-13 14:30:24.627 INFO (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: Reconnecting to device
2025-03-13 14:30:24.628 INFO (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: Reconnecting to device
2025-03-13 14:30:25.272 ERROR (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: Failed to connect to the device: Error ESP_GATT_CONN_FAIL_ESTABLISH while connecting: Connection failed to establish
2025-03-13 14:30:25.272 WARNING (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: Disconnected from device
2025-03-13 14:30:25.272 ERROR (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: Failed to connect to the device: Error ESP_GATT_CONN_FAIL_ESTABLISH while connecting: Connection failed to establish
2025-03-13 14:30:25.273 WARNING (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: Disconnected from device
2025-03-13 14:30:25.273 WARNING (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: Reconnecting to the device in 30 seconds...
2025-03-13 14:30:25.273 WARNING (MainThread) [custom_components.ef_ble.eflib.connection] 9C:9E:6E:5B:DC:16: Reconnecting to the device in 30 seconds...
So I deleted the device, restarted HA, re-added the device and for a minute it worked perfectly - it was updating fairly rapidly. Then all entities went to Unavailable. I waited a minute then they all came back for a few seconds, then back to Unavailable. The log shows a ESP_GATT_CONN_FAIL_ESTABLISH and it no longer connects at all. This is from an ESP32-S3 sitting a few inches from the River 3.
So I then disabled the device, waited a couple minutes and then re-enabled the device. It connected fine and began working correctly - it held on for about 6 minutes before dropping again. I tried the disable/enable again but nada - it doesn’t come back.
More: I again swapped the ESP for a different model (a different S3), and the only thing I configured differently was removing the captive portal if it can’t connect to Wi-Fi. I located it in the same place as the previous attempt and now it has stayed up for 30 minutes. Go figure.
Yeah, if you experiencing issues with ble connectivity - I specifically bought those “esp32 devkit v1” with esp32-wroom-32 onboard as they were recommended with note that other versions could work wrong. And configuration is very important to use esp-idf instead of default arduino as I described here: EcoFlow BLE (Unofficial) - #42 by Rabit
Thanks for the reply. I actually am not sure what I did to finally get it to work reliably, but it is working fine now - and I’m back to an Atom Lite S3, which is what I started with. I had moved it all around, plugged it directly into the River 3, and nothing worked for more than a minute. I had tried 3 different ESPs. I’ve used ESPHome a bunch for various BLE equipment - Victron solar/shunts, Mopeka propane tank gauges, battery BMSs - and never had this issue before - and some of those ESPs do a bunch of things besides BLE. I also did a few router changes along the way - changed channels and turned on Bluetooth Coexistence.
But anyway, it now works and is great! Thanks so much for doing this.
As usual with hardware and complicated protocols - you never know until you poke it with a stick) There is a lot of variables - even environment and revision of the device hardware could be fatal, but anyway glad your setup is working!)
Yeah, I thought that might be a concern for some lower powered devices - for River 3 we are trying to parse 3 messages per second. I am running HA on a N100 device and did not notice any noticable increase in cpu nor power usage with a single device. I do have a RPi4 laying around though, so when I have time, I’ll probably try to look into some optimizations.
Mine is running in a VM on a Synology. It have a (silly) Intel Celeron J3455 with 4 cores. Since I enabled it, CPU load went from a 20-30% to around 60-65%.
So it would be great with an option to set the frequency down a bit ![]()
Mine is running on J4125 Celeron, and the CPU for the entire metal box (also a NAS from Qnap) is around 10-15%, and for the VM, it’s about 2~5%.
I would like to know how I can help to add DP3 support to this project. I followed the instructions on the ef-ble-reverse repo and I can make a connection to my DP3 and I can see the decrypted payload in hex… but I don’t know what to do from here to help.
Hi @sidjohn1 , so if you can see decrypted messages - you half a way there! Now you need to find the right protobuf file spec (probably in protobuf dir by using something like https://www.protobufpal.com/ trying to decode raw data and find the one spec that suits you, or checking which one is used by the android, but it’s harder) and use this protobuf to decode the data (like for the other devices like SHP2 or DPU in the example). When you get there - you can read the actual values that the device sends. Hopefully this helps!
Hi. DP3 has mostly the same protocol as D3 and R3, so I just tried to copy most of the code over from D3 - feel free to test it using my fork with pre-release version v0.10.0-pre1. If everything works, we can merge it to the main repo.
Also if you enable debug mode, you will be able to see decoded messages in the logs - if you identify what some fields are for and their values, we will be able to add them pretty easily.
edit: All fields and commands are actually officially documented here, so if my version works, we can probably straight up add most of them.
Hi @pelleravn , could you please check the recent @GnoX change adding option for update intervals here: Add configurable device update period to reduce cpu usage and writes by GnoX · Pull Request #13 · rabits/ha-ef-ble · GitHub - maybe you can measure if the different ones (5sec/10sec/1min) helps you?
so far this is what does not work for the D3pro
AC Output Power - Unknown
DC Input Port State - Unknown
DC Port Input Power - Unknown
AC Ports switch and status - does not work
probably should be:
High-voltage AC output switch
Low-voltage AC output switch
I think theses are the logs you are looking for, let em know if this helps
2025-04-02 11:08:21.976 DEBUG (MainThread) [custom_components.ef_ble.eflib.devices.delta_pro_3] Delta Pro 3 Parsed Message
pcs_fan_level: 1
plug_in_info_pv_l_type: 2
plug_in_info_ac_in_flag: 0
plug_in_info_ac_in_feq: 50
plug_in_info_5p8_flag: 0
plug_in_info_5p8_type: 0
plug_in_info_5p8_detail: 0
plug_in_info_dcp2_sn: "0000000000000000"
pv_dc_chg_setting_list {
list_info {
pv_plug_index: PV_PLUG_INDEX_1
pv_chg_vol_spec: PV_CHG_VOL_SPEC_24V
pv_chg_amp_limit: 4
}
}
bms_err_code: 0
plug_in_info_4p8_1_in_flag: 1
plug_in_info_4p8_1_type: 28
plug_in_info_4p8_1_detail: 5
plug_in_info_4p8_2_in_flag: 1
plug_in_info_4p8_2_type: 28
plug_in_info_4p8_2_detail: 5
plug_in_info_pv_l_charger_flag: true
plug_in_info_pv_l_dc_amp_max: 4
plug_in_info_4p8_1_dsg_chg_type: 2
plug_in_info_4p8_1_resv {
resv_info: 1108273722
resv_info: 1120403456
resv_info: 0
resv_info: 80000
resv_info: 80000
resv_info: 28582
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 208669808
resv_info: 488447518
resv_info: 0
resv_info: 0
}
plug_in_info_4p8_1_firm_ver: 0
plug_in_info_4p8_2_dsg_chg_type: 2
plug_in_info_4p8_2_resv {
resv_info: 1110693964
resv_info: 1120403456
resv_info: 0
resv_info: 80000
resv_info: 80000
resv_info: 35968
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 208604271
resv_info: 488381725
resv_info: 0
resv_info: 0
}
plug_in_info_4p8_2_firm_ver: 0
plug_in_info_5p8_dsg_chg: 0
plug_in_info_5p8_resv {
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
resv_info: 0
}
plug_in_info_5p8_sn: ""
plug_in_info_5p8_firm_ver: 0
plug_in_info_ac_charger_flag: true
plug_in_info_5p8_charger_flag: false
plug_in_info_5p8_run_state: 0
plug_in_info_4p8_1_charger_flag: false
plug_in_info_4p8_1_run_state: 0
plug_in_info_4p8_2_charger_flag: false
plug_in_info_4p8_2_run_state: 0
plug_in_info_ac_in_chg_pow_max: 400
plug_in_info_5p8_chg_pow_max: 500
pd_err_code: 0
llc_err_code: 0
mppt_err_code: 0
plug_in_info_5p8_err_code: 0
plug_in_info_4p8_1_err_code: 0
plug_in_info_4p8_2_err_code: 0
pcs_fan_err_flag: 0
llc_inv_err_code: 0
plug_in_info_pv_l_chg_vol_max: 0
plug_in_info_pv_l_chg_amp_max: 8
plug_in_info_5p8_dsg_pow_max: 4000
plug_in_info_ac_out_dsg_pow_max: 4000
plug_in_info_dcp_sn: "MRstuff"
plug_in_info_5p8_chg_hal_pow_max: 4000
plug_in_info_ac_in_chg_hal_pow_max: 1800
cms_batt_pow_out_max: 4000
cms_batt_pow_in_max: 400
cms_batt_full_energy: 12288
2025-04-02 11:08:21.972 DEBUG (MainThread) [custom_components.ef_ble.eflib.devices.delta_pro_3] Delta Pro 3 Parsed Message
errcode: 0
pow_in_sum_w: 54
pow_out_sum_w: 1
lcd_light: 128
energy_backup_state: 1
energy_backup_en: true
energy_backup_start_soc: 30
pow_get_qcusb1: 0
pow_get_qcusb2: 0
pow_get_typec1: 0
pow_get_typec2: -1
flow_info_qcusb1: 14
flow_info_qcusb2: 14
flow_info_typec1: 14
flow_info_typec2: 14
dev_standby_time: 120
screen_off_time: 300
ac_standby_time: 720
dc_standby_time: 720
ac_always_on_mini_soc: 5
xboost_en: false
flow_info_pv_h: 2
flow_info_pv_l: 2
flow_info_12v: 0
flow_info_24v: 2
pow_get_pv_h: 29
pow_get_pv_l: 25
pow_get_12v: 0
pow_get_24v: 0
plug_in_info_pv_h_flag: 1
plug_in_info_pv_h_type: 2
plug_in_info_pv_l_flag: 1
flow_info_ac2dc: 0
flow_info_dc2ac: 0
flow_info_ac_in: 0
flow_info_ac_hv_out: 0
flow_info_ac_lv_out: 0
flow_info_5p8_in: 0
flow_info_5p8_out: 0
pow_get_llc: 0
pow_get_ac: 0
pow_get_ac_in: 0
pow_get_ac_hv_out: 0
pow_get_ac_lv_out: 0
pow_get_ac_lv_tt30_out: 0
pow_get_5p8: 0
current_time_task_v2_item {
}
utc_timezone: -500
utc_timezone_id: "UTC"
utc_set_mode: false
output_power_off_memory: true
flow_info_bms_dsg: 0
flow_info_bms_chg: 0
flow_info_4p8_1_in: 0
flow_info_4p8_1_out: 0
flow_info_4p8_2_in: 0
flow_info_4p8_2_out: 0
pow_get_bms: 0
pow_get_4p8_1: 0
pow_get_4p8_2: 0
plug_in_info_pv_h_charger_flag: true
plug_in_info_pv_h_dc_amp_max: 4
fast_charge_switch: 1
en_beep: false
llc_GFCI_flag: false
ac_out_freq: 60
dev_sleep_state: 0
llc_hv_lv_flag: 1
plug_in_info_pv_h_chg_vol_max: 0
plug_in_info_pv_h_chg_amp_max: 20
bms_batt_soc: 18.4329529
bms_batt_soh: 100
bms_design_cap: 80000
bms_dsg_rem_time: 5939
bms_chg_rem_time: 21685
bms_min_cell_temp: 29
bms_max_cell_temp: 31
bms_min_mos_temp: 30
bms_max_mos_temp: 31
cms_batt_soc: 33.04
cms_batt_soh: 100
cms_dsg_rem_time: 5939
cms_chg_rem_time: 21685
cms_max_chg_soc: 80
cms_min_dsg_soc: 20
cms_oil_on_soc: 20
cms_oil_off_soc: 90
cms_oil_self_start: true
cms_bms_run_state: 1
bms_chg_dsg_state: 0
cms_chg_dsg_state: 0
ac_hv_always_on: false
ac_lv_always_on: false
time_task_conflict_flag: 0
time_task_change_cnt: 0
ble_standby_time: 3600
generator_pv_hybrid_mode_open: false
generator_pv_hybrid_mode_soc_max: 100
generator_care_mode_open: false
generator_care_mode_start_time: 1080
ac_energy_saving_open: false
multi_bp_chg_dsg_mode: 0
