Complete guide: from board to Home Assistant

For anyone hearing about ESP32 for the first time. What the board is, where to get it, how to flash EF-Bridge, and how to connect your Stream 2 to MQTT, a REST API and Home Assistant.

Step 1 · Hardware

What is the ESP32-C3

The ESP32-C3 is a tiny microcontroller (a matchbox-sized mini-computer) with built-in Wi-Fi and Bluetooth. This is what EF-Bridge runs on: the board talks to your EcoFlow Stream 2 over Bluetooth, reads its telemetry and serves it to your home network as a web dashboard, a REST API and MQTT.

No soldering, no coding required. All you need is one ready-made board and a USB cable — the firmware does the rest.

What it looks like

ESP32-C3 SuperMini

An ESP32-C3 SuperMini board — roughly 22×18 mm. USB-C connector on top, rows of pins along the sides, and next to the USB port a BOOT button and an RST (reset) button. The BOOT button is the one you need for flashing.

Where to get it

Any board based on the ESP32-C3 chip works. The most popular and cheapest is the “ESP32-C3 SuperMini”, around $2–4. If you plan to place the board far from the Stream 2 or your Wi-Fi router/access point, get the version with an external antenna (IPEX/u.FL connector + antenna) — it noticeably extends Bluetooth and Wi-Fi range.

  • AliExpress — search “ESP32-C3 SuperMini” (cheapest, slower shipping).
  • Amazon / eBay — “ESP32-C3 SuperMini”, often sold in 3–5 packs.
  • For placement far from the router — the “ESP32-C3 SuperMini” version with an external antenna.
You don't need the pin headers for EF-Bridge — the board connects over USB only, and protruding pins just get in the way. Choose a version without soldered pins (or simply leave them off).
Step 2 · Flashing

How to flash EF-Bridge

“Flashing” means writing the EF-Bridge program into the board's memory. It's done right in your browser — no Arduino IDE, no drivers, no command line.

What you need

Step by step

  1. Plug the ESP32-C3 board into your computer with the USB cable.
  2. Open ef-bridge.com/install/ in your browser and click “Install”.
  3. In the pop-up, select your board's port (usually “USB JTAG/serial” or “USB Serial”) and click “Connect”.
  4. Confirm the install — the progress bar reaches 100% in 1–2 minutes. Don't unplug the cable during this.
  5. When done, the board reboots and creates a “Stream2-Setup-XXXX” Wi-Fi hotspot.
If the board doesn't appear in the port list or flashing won't start, put it into flashing mode manually: hold the BOOT button, briefly press RST (reset), then release BOOT. Then click “Connect” again. On some boards it's enough to hold BOOT while plugging in the USB cable.

First-time setup (wizard)

Wi-Fi and settings aren't hard-coded — everything goes through a step-by-step wizard on first boot:

  1. Connect your phone to the “Stream2-Setup-XXXX” Wi-Fi — the wizard opens by itself. If not, open http://192.168.4.1/ in a browser.
  2. Wi-Fi step: scan networks, pick yours, enter the password.
  3. Device step: “Find devices” → pick your Stream 2 from the Bluetooth results → give it a name.
  4. Account & extras: EcoFlow email/password (password isn't stored); optionally static IP, MQTT/Home Assistant, a dashboard password.
After “Finish” the device reboots and is reachable on your home network at http://stream2.local/ (the name from settings) and by IP.
Step 3 · Integration

Device REST API

EF-Bridge serves data and takes commands over plain HTTP — handy for scripts, Node-RED, home automation and any custom integration. The base URL is the device address on your network, e.g. http://stream2.local/ or by IP.

If a dashboard password is enabled in settings, API requests need HTTP Basic Auth (same login/password). All data stays inside your local network — nothing leaves your home.
GET/api/telemetry

Current Stream 2 telemetry as JSON — updated every second.

// GET http://stream2.local/api/telemetry
{
  "ready": true,        // BLE link to Stream 2 is active
  "pv1": 412.0,       // PV1, W
  "pv2": 386.0,       // PV2, W
  "gridPower": 640.0, // grid feed-in, W
  "vac": 231.4,       // grid voltage, V
  "iac": 2.77,        // current, A
  "freq": 50.01,      // frequency, Hz
  "pv1v": 34.2,       // PV1 voltage, V
  "pv2v": 33.8,       // PV2 voltage, V
  "temp": 41,          // inverter temperature, °C
  "rssi": -58,        // Stream 2 Wi-Fi RSSI, dBm
  "limit": 650,        // current power limit, W
  "genToday": 5.812,  // generation today, kWh
  "genTotal": 128.44, // generation total, kWh
  "feedToday": 4.9,   // fed to grid today, kWh
  "feedTotal": 96.2,  // fed to grid total, kWh
  "espRssi": -49       // ESP32 Wi-Fi RSSI, dBm
}

Fields with no available value are returned as null. ready=false means the Bluetooth link to the inverter isn't established yet.

GET/api/status

State of the bridge itself: uptime, IP, BLE and MQTT status, free memory.

{
  "uptime": 83145,          // uptime, s
  "wifiRssi": -49,          // ESP32 RSSI, dBm
  "ip": "192.168.1.42",
  "bleConnected": true,
  "bleReady": true,
  "reconnects": 2,
  "mqtt": true,
  "freeHeap": 142880,
  "name": "stream2",
  "apName": "Stream2-Setup-AB12"
}
GET/api/history

Generation history: a JSON array of average power values (W) at 5-minute steps, up to 288 points (24 hours).

GET/api/setpower?watts=650

Set the power limit (W). The simplest way — a plain link / GET request.

POST/api/limit

Same thing, request body watts=NNN (or just a number).

# Set the limit to 650 W (GET, simplest)
curl "http://stream2.local/api/setpower?watts=650"

# Same via POST
curl -X POST "http://stream2.local/api/limit" -d "watts=650"
Valid values are 0 to 3000 W. The command is applied instantly via the inverter's native BLE command. If the Bluetooth link isn't ready, you get a 503 error.
Step 3 · Integration

MQTT

MQTT is a lightweight publish/subscribe protocol for smart homes. EF-Bridge publishes telemetry to your MQTT broker (e.g. Mosquitto) and listens for limit commands. Home Assistant integration runs over MQTT.

Enable it in the setup wizard or on the “Settings” page: broker address, port (default 1883), and username/password if needed.

Topics

TopicDirDescription
nodes/<name>/statepubTelemetry as JSON (retained), published periodically.
nodes/<name>/statuspubAvailability: online / offline (offline is set automatically on disconnect — LWT).
nodes/<name>/limit/setsubLimit command: send the wattage as plain text.

In the topics, name is your device name from settings reduced to latin letters/digits (e.g. stream2). The exact name is shown on the Diagnostics page.

state payload

A single retained JSON with all metrics:

# topic: nodes/stream2/state  (retained)
{
  "ready": true,
  "gridPower": 640.0,
  "pv1": 412.0,
  "pv2": 386.0,
  "vac": 231.4,
  "freq": 50.01,
  "temp": 41,
  "rssi": -58,
  "limit": 650,
  "genToday": 5.812,
  "genTotal": 128.440,
  "feedToday": 4.900
}

Changing the limit

Publish the wattage (0–3000) to the command topic:

# Set the limit to 500 W over MQTT
mosquitto_pub -h 192.168.1.10 -t "nodes/stream2/limit/set" -m "500"
Step 4 · Home Assistant

Home Assistant integration

The easiest path is over MQTT: EF-Bridge uses auto-discovery (MQTT Discovery), so all sensors and the limit control appear in Home Assistant by themselves — no YAML editing.

Prerequisites

Step by step

  1. In EF-Bridge settings, enable MQTT: your broker's address and port, and login/password if any.
  2. Make sure “Home Assistant discovery” is checked.
  3. Save — the device connects to the broker and publishes its discovery config.
  4. In Home Assistant open Settings → Devices & Services → MQTT — a new “Stream 2” device appears with all entities.
Nothing to add in configuration.yaml — entities are created automatically via the MQTT Discovery protocol.

Entities you'll get

Names start with your device name. Rough list:

Home AssistantDescription
sensor.*_grid_feed_powerGrid feed-in power, W
sensor.*_pv1_power / _pv2_powerGeneration on PV1 and PV2 inputs, W
sensor.*_grid_voltage / _grid_frequencyGrid voltage (V) and frequency (Hz)
sensor.*_inverter_tempInverter temperature, °C
sensor.*_device_rssiStream 2 Wi-Fi signal, dBm
sensor.*_generation_today / _totalGeneration today and lifetime, kWh
sensor.*_feed_in_todayFed to grid today, kWh
number.*_power_limitPower-limit control (slider 0–800 W, step 10) — controllable from HA

Automation example

For example, if a smart meter at your house inlet detects excess generation (export to the grid), you can lower the limit to keep net export at zero:

# Zero export: reduce feed-in based on a smart meter at the house inlet
# sensor.house_grid_power: >0 = importing, <0 = exporting
automation:
  - alias: Stream2 zero export
    trigger:
      - platform: state
        entity_id: sensor.house_grid_power
    condition:
      - condition: numeric_state
        entity_id: sensor.house_grid_power
        below: -20          # exporting more than 20 W
    action:
      - service: number.set_value
        target:
          entity_id: number.stream2_power_limit
        data:
          # lower the limit by the amount of excess export
          value: "{{ [(states('number.stream2_power_limit')|int
                 + states('sensor.house_grid_power')|int), 0] | max }}"
If auto-discovery is off, you can add entities manually via MQTT sensors, pointing to the state topic (e.g. nodes/stream2/state) with the right value_template (e.g. value_json.pv1).
← Install the firmware from your browser
← About the firmware, features & FAQ
EF-Bridge — an independent project, not affiliated with EcoFlow.