libre-oven-card is a custom Lovelace card that provides full control and monitoring of the Libre Oven — an open-source ESP32-S3 smart oven controller running ESPHome.
Required firmware: This card is designed for the Libre Oven ESPHome firmware. Flash the ESP32-S3 firmware from
project/esp32/before using this card.
Key features at a glance:
- Live oven status — state label with color coding (Idle / Waiting / Preheating / Ready / Cooking), current temperature, target temperature, and countdown timer.
- SVG oven visualization — real-time element states: gray (off), white (selected), yellow (armed/active), red (heating).
- Temperature control — slider/input for target temperature.
- Timer controls — cook duration and start delay inputs.
- Element toggles — independently control Top, Bottom, Grill, and Fan elements beyond the original 6-mode limitation.
- Program actions — Apply Program (start/update) and Cancel Program buttons.
- Food probe support — optional NTC 10K probe for food temperature monitoring with auto-stop when target reached. UI elements only appear when probe is connected.
- Device auto-discovery — pass any entity from the oven device and the card discovers all others automatically.
- Zero external dependencies — single vanilla-JS file.
Author: gil — 2026
- In Home Assistant, open HACS → Frontend.
- Click the three-dot menu (⋮) in the top-right and choose Custom repositories.
- Paste
https://github.com/gilbertorconde/libre-ovenand select Dashboard as the category. - Click Add, then search for Libre Oven Card and install it.
- Reload your browser / clear the cache.
- Download
libre-oven-card.jsfrom the latest release. - Copy it to
/config/www/libre-oven/libre-oven-card.js. - Add the following under Settings → Dashboards → Resources:
resources:
- url: /local/libre-oven/libre-oven-card.js
type: moduleBase name (recommended): Pass the device base name; the card auto-discovers all entities:
type: custom:libre-oven-card
base_name: libre_ovenThe base name is the ESPHome device name with hyphens replaced by underscores (e.g. libre-oven → libre_oven). All sensors, numbers, switches, and buttons are derived automatically. Override specific entities if needed:
type: custom:libre-oven-card
base_name: libre_oven
entities:
set_temperature: number.custom_temp_entity # override just this oneExplicit entities: For custom setups, paste the full entity map:
type: custom:libre-oven-card
title: Libre Oven
entities:
oven_temperature: sensor.libre_oven_oven_temperature
active_temperature: sensor.libre_oven_active_temperature
timer_state: sensor.libre_oven_timer_state
timer_state_code: sensor.libre_oven_timer_state_code
active_countdown: sensor.libre_oven_active_countdown
delay_remaining: sensor.libre_oven_delay_remaining
cook_remaining: sensor.libre_oven_cook_remaining
active_cook_total: sensor.libre_oven_active_cook_total
active_delay_total: sensor.libre_oven_active_delay_total
set_temperature: number.libre_oven_set_temperature
cook_duration: number.libre_oven_cook_duration
start_delay: number.libre_oven_start_delay
top_element_selected: switch.libre_oven_top_element_selected
bottom_element_selected: switch.libre_oven_bottom_element_selected
grill_element_selected: switch.libre_oven_grill_element_selected
fan_selected: switch.libre_oven_fan_selected
apply_program: button.libre_oven_apply_program
cancel_program: button.libre_oven_cancel_program
start_cooking: button.libre_oven_start_cooking
# Element visual-state sensors (0=off, 1=selected, 2=armed/active, 3=heating)
top_element_state: sensor.libre_oven_top_element_state
bottom_element_state: sensor.libre_oven_bottom_element_state
grill_element_state: sensor.libre_oven_grill_element_state
fan_element_state: sensor.libre_oven_fan_element_state
frame_state: sensor.libre_oven_oven_frame_state
# Active element flags (for draft-change detection)
active_top_element: binary_sensor.libre_oven_active_top_element
active_bottom_element: binary_sensor.libre_oven_active_bottom_element
active_grill_element: binary_sensor.libre_oven_active_grill_element
active_fan_element: binary_sensor.libre_oven_active_fan_element
# Food probe (optional — only active when probe is physically connected)
food_probe_temperature: sensor.libre_oven_food_probe_temperature
food_probe_connected: binary_sensor.libre_oven_food_probe_connected
food_target_temperature: number.libre_oven_food_target_temperature
cook_mode: number.libre_oven_cook_modeIf your device name differs from libre_oven, use base_name: your_device_name or update the entity IDs in the explicit config.
The card is divided into three sections:
Mirrors the physical oven display:
- State label with color coding:
- Idle: white
- Waiting: yellow (#e5c000)
- Preheating: red (#e01e00)
- Ready: green (#4caf50)
- Cooking: green (#4caf50)
- Current oven temperature
- Target temperature (active when program running, draft when idle)
- Oven graphic with SVG element visualization:
- Gray: off
- White: selected in draft
- Yellow: armed/active (program running, SSR cycling)
- Red: actively heating (SSR on)
Four tiles in a 2×2 grid, each opening a bottom-sheet for editing:
- Timer tile: Cook remaining countdown during COOKING, "Preheating"/"Oven ready" during those states, set cook total when WAITING. Shows the applied set value beneath.
- Start Delay tile: Delay remaining countdown during WAITING, "Done" once delay has passed. Shows the applied set value beneath.
- Elements tile: Active element summary (Top + Bottom + Grill + Fan).
- Temperature tile: Current temperature, set temperature, and food probe temperature (when connected) side by side.
Controls in the sheets:
- Temperature: draggable arc thermostat with +/− 5°C buttons
- Cook duration: +/−1 and +/−10 minute buttons with numeric input; cook mode toggle (Timer / Probe) and food target temperature when probe is connected
- Start delay: +/−1 and +/−10 minute buttons with numeric input
- Element toggles: Top, Bottom, Grill, Fan pill buttons
When a program is running, any change to draft values (temperature, duration, delay, or elements) is shown inline on the tiles:
- Temperature: old value with strikethrough → new value in accent color
- Timer / Delay: old set time with strikethrough → new time in accent color
- Elements: added elements in green, removed elements in red with strikethrough
- A pulsing "DRAFT CHANGES — Press Update to apply" hint appears above the action buttons
- Apply Program: Starts or updates the active program (equivalent to pressing the timer encoder button on the physical interface).
- Cancel Program: Stops the current program and clears the ESP32 draft.
The card reads the timer_state_code sensor (numeric) for logic and the timer_state sensor (text) for display:
| Code | Text | Card Display | Color |
|---|---|---|---|
| 0 | IDLE | Idle | White |
| 1 | WAITING | Waiting | Yellow |
| 2 | PREHEATING | Preheating | Red |
| 3 | READY | Ready | Green |
| 4 | COOKING | Cooking | Green |
| Entity Key | Type | Description |
|---|---|---|
oven_temperature |
sensor | Current oven temperature |
active_temperature |
sensor | Active target temperature |
timer_state |
sensor | Timer state text |
timer_state_code |
sensor | Timer state numeric code (0-4) |
active_countdown |
sensor | Formatted countdown (HH:MM:SS) |
delay_remaining |
sensor | Delay remaining countdown |
cook_remaining |
sensor | Cook remaining countdown |
active_cook_total |
sensor | Active program cook total (min) |
active_delay_total |
sensor | Active program delay total (min) |
set_temperature |
number | Draft temperature control |
cook_duration |
number | Draft cook duration (minutes) |
start_delay |
number | Draft start delay (minutes) |
top_element_selected |
switch | Top element toggle |
bottom_element_selected |
switch | Bottom element toggle |
grill_element_selected |
switch | Grill element toggle |
fan_selected |
switch | Fan toggle |
apply_program |
button | Apply/start program |
cancel_program |
button | Cancel program |
start_cooking |
button | Resume from READY to COOKING |
| Entity Key | Type | Description |
|---|---|---|
food_probe_temperature |
sensor | Current food probe temperature (NTC 10K) |
food_probe_connected |
binary_sensor | Whether the food probe jack is plugged in |
food_target_temperature |
number | Target food temperature for probe-mode auto-stop |
cook_mode |
number | 0 = timer mode, 1 = probe mode |
| Entity Key | Type | Description |
|---|---|---|
top_element_state |
sensor | 0=off, 1=selected, 2=armed, 3=heating |
bottom_element_state |
sensor | 0=off, 1=selected, 2=armed, 3=heating |
grill_element_state |
sensor | 0=off, 1=selected, 2=armed, 3=heating |
fan_element_state |
sensor | 0=off, 1=selected, 2=active |
frame_state |
sensor | 0=off, 1=selected, 2=active |
- Home Assistant 2023.4 or newer
- The Libre Oven ESPHome firmware flashed and connected
- No additional HACS frontend cards required
For the full hardware build guide (ESP32-S3 wiring, PCB, 3D-printed parts, oven reference), see project/README.md.
For firmware details (state machine, PID tuning, ESPHome configuration), see project/esp32/README.md.