Skip to content

Tovala Smart Oven for Home Assistant

Home Assistant custom integration for Tovala Smart Ovens via their cloud API. Monitor cook status, meal details, history, and trigger automations. (Tovala has no public API; this is reverse-engineered from the mobile app.)

Features

  • Real-time cooking status and remaining time (polls every 10s).
  • Meal details with name, image, ingredients for Tovala meals.
  • Cooking history (last 10 sessions).
  • Automation-ready events and attributes.
  • Automatic oven discovery (no manual IDs).

Installation

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

  1. HACS → Integrations → ⋮ → Custom repositories.
  2. Add https://github.com/WeaveHubHQ/ha-tovala (category: Integration).
  3. Install, restart Home Assistant.
  4. Settings → Devices & Services → Add Integration → search Tovala Smart Oven → sign in with Tovala credentials.

Manual

  1. Copy custom_components/tovala/ to config/custom_components/.
  2. Restart Home Assistant.
  3. Add the integration from Settings → Devices & Services.

Entities

Sensors

  • sensor.tovala_time_remaining: remaining cook time (s).
    Attributes: cooking_state ("idle"/"cooking"), barcode, meal_id, meal_title, meal_subtitle, meal_image, meal_ingredients, estimated_end_time.
  • sensor.tovala_last_cook: last cook summary.
    Attributes: last_cook_barcode, last_cook_meal_id, last_cook_start_time, last_cook_end_time, last_cook_status, recent_history (last 10 sessions).

Binary sensors

  • binary_sensor.tovala_timer_running: on when actively cooking.

Events

  • tovala_timer_finished: fires when timer hits zero. Example payload:
json
{
  "oven_id": "b3d64c11-96db-4ed2-9589-b52fbd0a15b1",
  "data": { "state": "idle", "meal": {...} }
}

Automation examples

Notify with meal name and image (Telegram):

yaml
automation:
  - alias: "Tovala Cooking Done"
    trigger:
      - platform: numeric_state
        entity_id: sensor.tovala_time_remaining
        below: 1
        above: -0.3
    action:
      - service: telegram_bot.send_photo
        data:
          url: "{{ state_attr('sensor.tovala_time_remaining', 'meal_image') }}"
          caption: >-
            {% set meal = state_attr('sensor.tovala_time_remaining', 'meal_title') %}
            {{ meal if meal else 'Your oven' }} is done cooking!

Notify via HA mobile app:

yaml
automation:
  - alias: "Tovala Cooking Done - Mobile"
    trigger:
      - platform: state
        entity_id: binary_sensor.tovala_timer_running
        from: "on"
        to: "off"
    action:
      - service: notify.mobile_app_YOUR_DEVICE
        data:
          title: "Tovala Oven"
          message: "{{ state_attr('sensor.tovala_time_remaining', 'meal_title') }} is ready!"
          data:
            image: "{{ state_attr('sensor.tovala_time_remaining', 'meal_image') }}"

Alert when 1 minute remains:

yaml
automation:
  - alias: "Tovala Almost Done"
    trigger:
      - platform: numeric_state
        entity_id: sensor.tovala_time_remaining
        below: 60
    action:
      - service: notify.notify
        data:
          message: "Your {{ state_attr('sensor.tovala_time_remaining', 'meal_title') }} has 1 minute left!"

Dashboard example (Mushroom)

yaml
type: custom:mushroom-template-card
primary: Tovala Oven
secondary: >-
  {% if state_attr('sensor.tovala_time_remaining', 'meal_title') %}
    {{ state_attr('sensor.tovala_time_remaining', 'meal_title') }}
  {% elif states('sensor.tovala_time_remaining') | int > 0 %}
    {{ states('sensor.tovala_time_remaining') | int // 60 }}m {{ states('sensor.tovala_time_remaining') | int % 60 }}s remaining
  {% else %}
    Idle
  {% endif %}
entity: sensor.tovala_time_remaining
icon: mdi:toaster-oven
icon_color: >-
  {% if is_state('binary_sensor.tovala_timer_running', 'on') %}
    orange
  {% else %}
    grey
  {% endif %}
tap_action:
  action: more-info

Troubleshooting

Enable debug logging:

yaml
logger:
  default: warning
  logs:
    custom_components.tovala: debug

cannot_connect error: check internet, verify credentials, test API:

bash
curl -i -X POST "https://api.beta.tovala.com/v0/getToken" \
  -H "Content-Type: application/json" \
  -H "X-Tovala-AppID: MAPP" \
  -d '{"email":"YOUR_EMAIL","password":"YOUR_PASSWORD","type":"user"}'
  • HTTP 200 → credentials valid; 401/403 → fix creds; connection errors → firewall/DNS.

auth error: credentials incorrect.

No meal details: only present for scanned Tovala meal barcodes, when meal exists in DB, and after reloading the integration.

Roadmap

  • WebSocket realtime updates (currently polls every 10s)
  • Multi-oven support with UI selection
  • Control capabilities (start/stop cooking)
  • Configurable poll interval
  • Device triggers for “Timer Started/Finished”

Contributing

PRs welcome. See repo for license (MIT © 2025 Jason Lazerus). Unofficial integration; not affiliated with Tovala and may break if the API changes.