Skip to content

Migration Guide

Andrew Blackburn edited this page Aug 27, 2026 · 4 revisions

Migration Guide

Room Card To Area Card

Orbit Room Card has been renamed to Orbit Area Card.

New configs should use:

type: custom:orbit-area-card

Existing configs using:

type: custom:orbit-room-card

continue to work through a legacy alias.

Editor Migration

When an old Room Card config is opened in the visual editor, the editor migrates:

type: custom:orbit-room-card

to:

type: custom:orbit-area-card

It also migrates:

room_name: Lounge

to:

area_name: Lounge

Navigation Migration

Older Area/Room Card configs may use:

navigate:
  navigation_path: /dashboard-main/lounge

This still works as a legacy fallback.

New configs should use:

tap_action:
  action: navigate
  navigation_path: /dashboard-main/lounge

The visual editor writes navigation through tap_action.

Main Icon Migration

Area Card now supports icon source selection:

icon_source: area

Options:

  • area
  • entity
  • custom
  • template

If custom icon config exists, the editor can preserve custom mode. If no custom icon config exists, it prefers Area when an area is configured, otherwise Entity when a main entity is configured.

Interaction Migration

Actions now live in a native-style Interactions section in the editor.

Unset actions use card defaults.

Use:

action: none

only when you intentionally want to disable an interaction.

Compatibility Summary

Old New
custom:orbit-room-card custom:orbit-area-card
room_name area_name
navigate.navigation_path tap_action.navigation_path with action: navigate

Tabbed Card To Deck Card

Deck Card is compatible with the same basic item shape used by custom:tabbed-card.

Change:

type: custom:tabbed-card
tabs:
  - attributes:
      icon: mdi:home
      label: Home
    card:
      type: entities
      entities:
        - light.lounge

to:

type: custom:orbit-deck-card
layout: tabs
decks:
  - attributes:
      icon: mdi:home
      label: Home
    card:
      type: entities
      entities:
        - light.lounge

Deck Card accepts attributes.label. When the visual editor opens the card, it saves that value back as attributes.name.

Unified Presentation Keys

Orbit now uses the same compact presentation schema across Area, Status, Action, and Status Badge components. Legacy presentation keys are migrated automatically when the component loads.

Common colour migrations:

Previous key Current key
accent_color_source color_source
accent_color color
accent_on_color color_on
accent_off_color color_off

Common icon migrations:

Previous key Current key
main_entity_icon_source or entity_icon_source icon_source
main_entity_icon_template, entity_icon_template, or icon_template icon
main_entity_icon or entity_icon icon
main_entity_icon_on or entity_icon_on icon_on
main_entity_icon_off or entity_icon_off icon_off
Corresponding prefixed SVG override keys icon*_svg_color_override

When icon_source: template is selected, the Jinja template is stored directly in icon. Colour template mode uses color_source: template and stores its Jinja template in color.

Area Card additionally migrates:

  • main_entity_state_template to state_template;
  • statusN_icon_template to statusN_icon;
  • button, curved-button, and Action-button *_icon_template to *_icon;
  • their *_on_color / *_off_color keys to *_color_on / *_color_off.

Action Card migrates accent_color to color and its main_entity_icon* presentation keys to the generic icon* keys, both at the root and inside grouped entities entries.

Status Badge migrates its legacy accent colour and icon_template keys to the shared schema.

If both a current and legacy key exist, the current value wins and the legacy key is removed. Orbit Area, Action, and Status Cards nested inside Deck Cards are also migrated recursively, including nested Deck Cards and both release and -dev types.

Status Card Native Naming And State Sources

Status Card also migrates these non-presentation keys:

Previous key Current key
main_entity entity
status_name name
main_entity_tap_action entity_tap_action
main_entity_hold_action entity_hold_action
main_entity_double_tap_action entity_double_tap_action

These renames apply to Status Card. main_entity remains the current entity key for Area Card and Action Card, and Area Card retains main_entity_*_action for its large icon interactions.

Root Status Card configs and object entries inside grouped entities are normalized. New visual-editor configs explicitly save state_source: entity, area_count, or template; runtime configs that omit it remain compatible and default to Entity.

Legacy Status configs containing state_template or label_template without an Area Count or Template source are automatically assigned state_source: template. The templates themselves are preserved:

# Previous
main_entity: sensor.recycle_collection
label_template: >-
  {{ state_attr('sensor.recycle_collection', 'daysTo') }}
state_template: >-
  {{ state_attr('sensor.recycle_collection', 'daysTo') | int < 2 }}

# Automatically normalized
state_source: template
entity: sensor.recycle_collection
label_template: >-
  {{ state_attr('sensor.recycle_collection', 'daysTo') }}
state_template: >-
  {{ state_attr('sensor.recycle_collection', 'daysTo') | int < 2 }}

In Template state, state_template supplies the rendered state and fallback active detection. label_template optionally supplies the displayed status text. active_template and inactive_template can override active detection explicitly. Person mode keeps state_template as its tracker active-state override.

Grouped Icon only Status Cards store an explicit state_source, Area Count filters, presentation, templates, and interactions on each item, allowing Entity, Area Count, and Template items in one group.

Native Template Migration

Area Card button state templates and Status Card templates use Home Assistant's native Jinja renderer.

Legacy bare expressions such as:

state_template: state_attr('fan.wetroom_extractor_fan', 'percentage') | int > 50

are migrated when the card is loaded in the visual editor:

state_template: >-
  {{ state_attr('fan.wetroom_extractor_fan', 'percentage') | int > 50 }}

Templates that already contain Jinja delimiters are preserved unchanged.

Clone this wiki locally