Plus Plug US (Gen2)¶
Gen2 / classic ESP32: the US plug with the relay and power metering. Partition table at the ESP-IDF default 0x8000, bootloader at 0x1000, 80 MHz flash frequency, like the Plus Plug S.
| Fact | Value |
|---|---|
| Profile | PlugUS |
| Flash | 4 MB (bootloader header and partition table) |
| Official package | 1.7.6 |
| Partition table | 0x8000 (ESP-IDF default) |
| Bootloader address | 0x1000 |
| App slot size | 0x190000 |
Before you start¶
Check first:
- the device runs Shelly's own firmware, not ESPHome yet
- you know its IP address (
--ip), or this PC is on the device's own access point (default192.168.33.1) - the device can reach this PC: same network, port 8000 (
--port) not blocked - your ESPHome config uses the partition table below and is compiled
- a UART adapter is at hand as your way back (Recovery over UART)
ESPHome config¶
Important
build refuses a config without Shelly's partition table. Copy partitions/PlugUS-stock.csv from this repository next to your
YAML and keep CONFIG_PARTITION_TABLE_OFFSET: "0x8000".
esp32:
variant: ESP32
board: esp32dev
flash_size: 4MB
partitions: PlugUS-stock.csv # copy from partitions/ in this repository
framework:
type: esp-idf
sdkconfig_options:
CONFIG_PARTITION_TABLE_OFFSET: "0x8000"
CONFIG_ESPTOOLPY_FLASHFREQ_80M: "y" # without it `build` refuses: the bootloader header says 80 MHz
advanced:
enable_ota_rollback: false
ota:
- platform: esphome
allow_partition_access: true
Flash it¶
- Install the requirements (once):
pip install -r requirements.txt
- Fetch the official package:
python ota.py fetch PlugUS --insecure
- Build: put your app into it; the ZIP goes to
out/:
python ota.py build PlugUS app.ota.bin --esphome-factory app.factory.bin --esphome-yaml app.yaml
- Check the device first. Nothing is sent:
python ota.py send PlugUS out/PlugUS-app-<date>.zip --ip <device IP> --dry-run
- Flash it (the log goes to a file with
--log-file):
python ota.py send PlugUS out/PlugUS-app-<date>.zip --ip <device IP> --log-file
app.ota.bin and app.factory.bin are the two files ESPHome compiles. --dry-run only checks the device and, for this
package, reads the update target slot. Command reference: Commands.
What to expect¶
send shows these lines at the default log level, in this order:
| # | Log line | Meaning |
|---|---|---|
| 1 | Update target slot: 0 ... |
The slot check of send. Anything else: run python ota.py restore PlugUS first |
| 2 | Device: The bootloader will be replaced ... (raw log: Boot: cur ... min ... update? 1) |
The installer will write ESPHome's bootloader. WARNING: ESPHome's bootloader was NOT written (update? 0) means it will not: build again with a higher --boot-min-version (why) |
| 3 | The progress (Update: ... %, one line that updates in place) up to 100 %, then Done: update installed, the device confirmed it |
The device restarts into ESPHome |
Notes for this device¶
Dev board only. The OTA ran through on an ESP32 dev board with the DevKit image (2026-10-30, row in Seen on a board); no real device has been flashed. The board has no relay, meter or button, so nothing of the device's function is checked.
Pins. Not mapped here. No stock dump of this device has been analysed here; pins read from firmware or templates are "not confirmed" until someone has measured them.
Bootloader min_version. The official package carries Shelly OS loader 1.0.2. The profile sets boot_min_version: 1.0.9, the
default of the newer profiles, because a unit that Shelly has already updated can report 1.0.3 and would then skip a package with
1.0.3. The loader of a real Plus Plug US has not been seen yet.
The slot. The Plus Plug S, a device of the same generation, first received the app in slot 1 and needed restore once; send checks
the target slot for you (why).
Please report the file written by --log-file, especially the lines Update target slot, Boot: cur ... update? and Will write to slot.
Way back¶
python ota.py restore PlugUS sends the official firmware back while Shelly firmware still runs.
Warning
- Wipes Wi-Fi and settings. ESPHome opens its own access point or joins the Wi-Fi from your config; if nothing comes up, power-cycle the device (help).
- No way back over the network once ESPHome's bootloader runs:
restoregets no answer, only UART brings Shelly OS back (Recovery over UART). Take a flash backup first. - Flashed it? Tell us, also when it worked: open a device report.