Metadata-Version: 2.4
Name: ewt-gen
Version: 1.5.0
Summary: Generate static websites for ESPHome firmware distribution using ESP Web Tools
Project-URL: Homepage, https://github.com/esphome/ewt-gen
Project-URL: Repository, https://github.com/esphome/ewt-gen
Project-URL: Issues, https://github.com/esphome/ewt-gen/issues
License-Expression: Apache-2.0
Keywords: esp32,esp8266,esphome,firmware,web-tools
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Home Automation
Requires-Python: >=3.10
Requires-Dist: click>=8.0
Requires-Dist: pyyaml>=6.0
Description-Content-Type: text/markdown

# ewt-gen

Generate static websites for ESPHome firmware distribution using ESP Web Tools. [Example output.](https://esphome.github.io/ewt-gen/)

## Quick Start

```bash
# From a local file
uvx ewt-gen config.yaml

# From a URL
uvx ewt-gen https://github.com/esphome/firmware/blob/main/esphome-web/esp32.factory.yaml

# Multiple configurations
uvx ewt-gen esp32.yaml esp32c3.yaml
```

## Installation

```bash
# Run directly without installing (recommended)
uvx ewt-gen config.yaml

# Or install globally
uv tool install ewt-gen
ewt-gen config.yaml

# Or with pip
pip install ewt-gen
```

## Usage

```bash
# From a local file
uvx ewt-gen config.yaml

# From a GitHub file URL
uvx ewt-gen https://github.com/user/repo/blob/main/config.yaml

# From a GitHub Gist
uvx ewt-gen https://gist.github.com/user/abc123

# From any URL
uvx ewt-gen https://example.com/config.yaml
```

### Options

```
ewt-gen [OPTIONS] YAML_SOURCE

Options:
  --version                       Show version
  --skip-compile                  Skip ESPHome compilation (use existing firmware)
  -f, --firmware PATH             Path to firmware binary
  -c, --chip-family [esp32|esp32-c3|esp32-s2|esp32-s3|esp8266]
                                  Chip family (auto-detected from YAML)
  -o, --output PATH               Output directory (defaults to YAML filename)
  -t, --title TEXT                Page title (defaults to name from YAML)
  --pre-release                   Use pre-release ESPHome version via uvx
  --publish-url TEXT              URL where firmware will be published (enables OTA)
  --fw-version TEXT               Firmware version (read from esphome.project.version if not specified)
  --release-url TEXT              Release notes URL for the manifest OTA entry (auto-detected from the GitHub Actions trigger: release page or triggering commit)
  --release-summary TEXT          Short release summary for the manifest OTA entry
  --help                          Show help
```

### Examples

```bash
# Basic usage - compiles and generates site
ewt-gen my-device.yaml

# Custom output directory and title
ewt-gen my-device.yaml -o ./dist -t "My Smart Device"

# Use pre-release ESPHome
ewt-gen my-device.yaml --pre-release

# Skip compilation, use existing firmware
ewt-gen my-device.yaml --skip-compile -f firmware.bin

# Enable OTA updates and dashboard import
ewt-gen my-device.yaml --publish-url https://firmware.example.com/my-device

# Specify version explicitly
ewt-gen my-device.yaml --publish-url https://firmware.example.com/my-device --fw-version 1.0.0
```

### OTA Updates and Dashboard Import

When using `--publish-url`, the tool generates a factory firmware that includes:

- **OTA updates via HTTP** - Devices can check for and install firmware updates
- **Dashboard import** - Users can adopt the device ("Take Control") in ESPHome Dashboard

ESPHome's dashboard import requires a git shorthand URL
(`github://owner/repo/config.yaml@ref`) — a plain published URL is not
accepted. The import URL is determined, in order, from:

1. `--import-url` if provided (e.g. `github://user/repo/config.yaml@main`)
2. The GitHub source URL, when the config is fetched from one
3. The GitHub Actions context (`GITHUB_REPOSITORY`, `GITHUB_REF_NAME` and the
   config's path in the checkout) when generated by a workflow

If none of these apply, dashboard import is omitted (OTA updates still work).

The tool creates two YAML files in the output:
- `{name}.yaml` - The original configuration (for users to customize)
- `{name}.factory.yaml` - Factory firmware that imports the original and adds OTA support

The version is required for OTA updates to work correctly. It can be specified via:
- `--fw-version` command line option
- `esphome.project.version` field in the YAML configuration

If no version is found, a warning is shown and OTA components are omitted (dashboard import still works).

When OTA is enabled, each `manifest.json` build also gets an `ota` entry that
ESPHome's `update.http_request` platform uses to update already-running
devices:

```json
{
  "chipFamily": "ESP32-S3",
  "parts": [{ "path": "firmware-esp32s3-2026.6.0.bin", "offset": 0 }],
  "ota": {
    "path": "firmware-esp32s3-2026.6.0.ota.bin",
    "md5": "...",
    "sha256": "...",
    "summary": "ESPHome 2026.6.0",
    "release_url": "https://github.com/owner/repo/releases/tag/2026.6.0"
  }
}
```

The OTA (app-only) image is copied alongside the factory image and its
checksums are computed automatically. The optional `summary` and `release_url`
fields, shown by the firmware update entity, are set with:

- `--release-summary` - short text describing the release
- `--release-url` - link to the release notes. When not specified and running in
  GitHub Actions, this is auto-detected from the trigger: the release page for
  `release` events, otherwise a link to the triggering commit (since not every
  workflow publishes a GitHub Release)

## Generated Site

The tool generates a static website containing:

- **ESP Web Tools install button** - One-click firmware installation (requires HTTPS)
- **Alternative install section** - Link to download binary and use with ESPHome Web
- **ESPHome configuration section** - Download links and expandable view of the YAML configuration
- **Manual installation instructions** - For non-HTTPS contexts, with link to web.esphome.io

### HTTPS Requirement

Browser-based installation using ESP Web Tools requires a secure context (HTTPS or localhost). When served over HTTP, the page automatically shows manual installation instructions instead.

## ESPHome Detection

The tool automatically:

- Detects chip family from the YAML configuration
- Finds compiled firmware in `.esphome/build/` directory
- Uses local `esphome` if available, falls back to `uvx esphome`

## License

Apache 2.0

## Credits

- [ESP Web Tools](https://esphome.github.io/esp-web-tools/) - Browser-based firmware installation
- [ESPHome](https://esphome.io) - Easy ESP8266/ESP32 firmware configuration
- [Open Home Foundation](https://www.openhomefoundation.org/)
