Render an interactive 3D model of your home directly in a Lovelace card and bind every object in the scene to a Home Assistant entity — lights, doors, covers, sensors, cameras, and more. Walk through your digital twin and control your home in real time.
Search for floor3d in HACS → Frontend and install. After installing, add the card resource:
# configuration.yaml (or via Settings → Dashboards → Resources)
lovelace:
resources:
- url: /hacsfiles/floor3d-card/floor3d-card.js
type: moduleDownload floor3d-card.js from the latest release and place it in /config/www/. Then add the resource:
lovelace:
resources:
- url: /local/floor3d-card.js
type: moduleSweetHome3D is free and works well. Model your home, then export via 3D View → Export to OBJ format. Copy the resulting files (*.obj, *.mtl, textures) to a subfolder of /config/www/.
Convert the OBJ export to a single binary GLB file for faster loading:
npm install -g obj2gltf
obj2gltf --checkTransparency -i home.obj -o home.glbCopy only home.glb to /config/www/. No .mtl or texture files needed.
- Place the upper-left corner of your floor plan at 0, 0 in the modeling tool for correct camera behaviour.
- Use the ExportToHASS SweetHome3D plugin to preserve object IDs across re-exports.
- To find object IDs: load the card with no entity bindings, then double-click any object in edit mode — a popup shows its ID and the current camera position.
type: custom:floor3d-card
name: My Home
path: /local/my_home/ # folder containing the model files
objfile: home.glb # .glb (recommended) or .obj
# mtlfile: home.mtl # only needed for .obj format
height: 500 # card height in pixels (default 400)
backgroundColor: '#aaaaaa'
globalLightPower: '0.8'
header: 'yes'
shadow: 'no'
lock_camera: 'no'| Option | Type | Default | Description |
|---|---|---|---|
type |
string | required | custom:floor3d-card |
name |
string | Floor 3d |
Card title |
path |
string | required | URL path to the folder holding model files |
objfile |
string | required | Model filename (.glb or .obj) |
mtlfile |
string | — | Material file (.obj models only) |
height |
number or string | 400 |
Card height — pixels (500) or any CSS value ("100vh", "50%", "calc(100vh - 60px)") |
backgroundColor |
string | #aaaaaa |
Canvas background: hex color, color name, or transparent |
backdrop_filter |
string | — | CSS backdrop-filter applied to the card (e.g. "blur(10px) saturate(180%)"); requires backgroundColor to be semi-transparent |
globalLightPower |
number/string | 0.5 |
Ambient light intensity (0–1) or a numeric sensor entity ID |
header |
yes/no |
yes |
Show the card title bar |
shadow |
yes/no |
no |
Enable light shadows (impacts performance) |
extralightmode |
yes/no |
no |
Limit simultaneous shadow-casting lights to the GPU maximum |
lock_camera |
yes/no |
no |
Disable orbit / zoom / pan |
click |
yes/no |
no |
Enable click events on 3D objects |
show_axes |
yes/no |
no |
Show X/Y/Z axes (useful when setting up spotlights) |
sky |
yes/no |
no |
Render sky, ground, and sun driven by sun.sun |
north |
object | {x:0, z:1} |
North direction on the X-Z plane (used with sky: yes) |
editModeNotifications |
yes/no |
yes |
Double-click popups in edit mode |
selectionMode |
yes/no |
no |
Select multiple objects (IDs logged to console) |
hideLevelsMenu |
yes/no |
no |
Hide the floor-level selector |
initialLevel |
number | — | Level index shown on load |
style |
string | — | Inline CSS applied to the ha-card element |
In edit mode, double-click an empty area of the model to log the current camera YAML to the console and clipboard. Paste into your config:
camera_position:
x: 609.3
y: 905.5
z: 376.6
camera_rotate:
x: -1.093
y: 0.520
z: 0.764
camera_target:
x: 37.4
y: 18.6
z: -82.6Zoom areas let you jump the camera to a specific room. The card smoothly animates the camera fly-to (750 ms cubic ease-in-out).
zoom_areas:
- name: living_room # unique name — also the input_select option value
object_id: LivingRoom_floor # 3D object used to calculate the zoom target
distance: 600 # camera distance from the target (cm)
direction: # camera approach vector
x: 0
y: 1
z: 0
level: 0 # (optional) show this level when zoomed in
- name: kitchen
object_id: Kitchen_floor
distance: 400| Option | Type | Default | Description |
|---|---|---|---|
name |
string | required | Unique zoom area identifier |
object_id |
string | required | 3D object that defines the zoom target |
distance |
number | 500 |
Camera distance from target in model units |
direction |
object | {x:0,y:1,z:0} |
Camera approach direction vector |
level |
number | — | Show this floor level when zoom is active |
hide_zoom_areas_ui: 'yes' # hides the bottom-left zoom dropdownBind zoom to an input_select helper so automations and other cards can both read and set the current zoom:
zoom_entity: input_select.floor3d_zoomHow it works:
- When the
input_selectstate changes → card flies to the matching zoom area. - When the user clicks a zoom button in the card → the
input_selectis updated. - Set the state to
resetto return to the default camera position.
Setting up the helper (Settings → Helpers → Add → Dropdown):
- Options: one per zoom area
name, plusreset
Triggering from a Button card:
type: button
name: Living Room
tap_action:
action: call-service
service: input_select.select_option
data:
entity_id: input_select.floor3d_zoom
option: living_roomAutomation — zoom to occupied room:
alias: Follow room presence
trigger:
- platform: state
entity_id: input_select.anas_room
action:
- service: input_select.select_option
data:
entity_id: input_select.floor3d_zoom
option: "{{ trigger.to_state.state }}"Bind 3D objects to Home Assistant entities via the entities list.
entities:
- entity: light.living_room
type3d: light
object_id: LivingRoom_ceiling_lamp
light:
lumens: 800
decay: 1
distance: 300| Field | Type | Description |
|---|---|---|
entity |
string | HA entity ID (or <object_group> reference) |
type3d |
string | Binding type — see sections below |
object_id |
string | 3D object name in the model |
entity_template |
string | JS template: '[[[ if ($entity > 25) { "hot" } ]]]' |
action |
string | On-click: more-info, overlay, or default |
Illuminates a point in the scene. Tracks brightness, color, and color temperature.
- entity: light.kitchen
type3d: light
object_id: Kitchen_pendant
light:
lumens: 600 # max brightness (0–4000)
color: '#ffddaa' # static color (overridden by HA color attrs)
decay: 1 # light falloff rate (0–2)
distance: 400 # effect radius in model units
shadow: 'no' # override global shadow for this light
vertical_alignment: top # top/middle/bottom — avoids lamp blocking itself
light_target: TV_screen # makes it a spotlight aimed at this objectHide or reveal a 3D object based on entity state.
- entity: binary_sensor.front_door
type3d: hide
object_id: FrontDoor_open_state
hide:
state: 'off' # hide the object when entity state equals this
- entity: binary_sensor.rain
type3d: show
object_id: Umbrella
show:
state: 'on' # show the object when entity state equals thisPaint a 3D object a different color depending on entity state.
- entity: sensor.living_room_temp
type3d: color
object_id: Thermometer
entity_template: '[[[ if ($entity > 25) { "hot" } else { "cool" } ]]]'
colorcondition:
- state: hot
color: '#ff4444'
- state: cool
color: '#4444ff'Render entity state as text on a flat plane object (TV screen, picture frame, display).
- entity: sensor.living_room_temp
type3d: text
object_id: TempDisplay_plane
text:
span: 60%
font: verdana
textbgcolor: '#000000'
textfgcolor: '#ffffff'
attribute: temperature # optional — show an attribute instead of stateAnimate a door or window opening and closing.
- entity: binary_sensor.front_door
type3d: door
object_id: FrontDoor
door:
doortype: swing # swing or slide
direction: inner # inner or outer (swing only)
side: left # up/down/left/right — hinge side
degrees: 90 # open angle (swing) or percentage (slide)
hinge: FrontDoor_hinge # object_id of the hinge (optional)
pane: FrontDoor_pane # object_id of the moving panel (optional)Animate covers (blinds, roller shutters) based on current_position attribute.
- entity: cover.living_room_blind
type3d: cover
object_id: LivingRoom_blind
cover:
doortype: slide
side: up
direction: inner
percentage: 100Continuously rotate an object (fans, turbines, etc.).
- entity: fan.ceiling_fan
type3d: rotate
object_id: CeilingFan_blades
rotate:
axis: y
round_per_second: 2Highlight a room with a translucent parallelepiped and an optional state label.
- entity: sensor.living_room_motion
type3d: room
object_id: LivingRoom_floor_room
room:
elevation: 240
transparency: 60
color: '#aaffaa'
label: 'yes'
span: 50%
font: verdana
textbgcolor: '#00000000'
textfgcolor: '#ffffff'
colorcondition:
- state: 'on'
color: '#ff0000'
- state: 'off'
color: '#00ff00'Call a service when a 3D object is double-clicked.
- entity: switch.coffee_maker
type3d: gesture
object_id: CoffeeMaker
gesture:
domain: switch
service: toggleShow a camera feed popup when an object is double-clicked.
- entity: camera.front_door
type3d: camera
object_id: FrontDoor_camera_mountGroup multiple objects so they respond to one entity binding. Reference a group with <group_name> syntax.
object_groups:
- object_group: LivingRoomLights
objects:
- object_id: Lamp_1
- object_id: Lamp_2
- object_id: Lamp_3
entities:
- entity: light.living_room
type3d: light
object_id: <LivingRoomLights>
light:
lumens: 800Show entity name and state in a floating panel when objects are clicked.
overlay: 'yes'
click: 'yes'
overlay_bgcolor: 'rgba(0,0,0,0.6)'
overlay_fgcolor: '#ffffff'
overlay_alignment: top-left # top-left, top-right, bottom-left, bottom-right
overlay_width: '33' # percentage of card width
overlay_height: '20' # percentage of card height
overlay_font: verdana
overlay_fontsize: 14px
entities:
- entity: sensor.living_room_temp
type3d: color
object_id: Thermometer
action: overlay # clicking shows state in the overlay panelNamed anchors attach logical positions to 3D objects. Markers, room controls, and animations all reference anchors.
anchors:
- id: living_room_center # logical name used by markers/controls/animations
object_id: LivingRoom_floor # any object in the scene
- id: kitchen_center
object_id: Kitchen_island
- id: ac_unit_living
object_id: AC_unit_living_roomMarkers render floating HTML elements above 3D anchors to show where people, pets, or devices are. They animate smoothly between rooms when the entity state changes.
| Type | Description |
|---|---|
person |
Round avatar from a person.* entity (uses entity picture) |
avatar |
Round image from a custom URL |
icon |
MDI icon |
dot |
Filled circle |
badge |
Label badge |
anchors:
- id: living_room_center
object_id: LivingRoom_floor
- id: kitchen_center
object_id: Kitchen_floor
markers:
- id: anas_marker
entity: input_select.anas_current_room # state = current room name
type: person
person_entity: person.anas # pulls picture + name
size: 52
hide_states:
- not_home
- unknown
rooms:
living_room: living_room_center # entity state → anchor id
kitchen: kitchen_center
bedroom: bedroom_centermarkers:
- id: robot_vacuum
entity: input_select.vacuum_room
type: icon
icon: mdi:robot-vacuum
color: '#4fc3f7'
size: 40
rooms:
living_room: living_room_center
kitchen: kitchen_center
visible_when:
entity: vacuum.roborock
state_not: docked| Option | Type | Default | Description |
|---|---|---|---|
id |
string | required | Unique identifier |
entity |
string | required | Entity whose state is the current room name |
type |
string | required | person, avatar, icon, dot, or badge |
person_entity |
string | — | person.* entity (for type: person) |
image |
string | — | Image URL (for type: avatar) |
icon |
string | — | MDI icon name (for type: icon) |
color |
string | — | CSS color |
size |
number | 48 |
Marker size in pixels |
rooms |
map | required | room_state_value: anchor_id mapping |
hide_states |
list | — | States that hide the marker |
visible_when |
condition | — | Additional visibility condition |
action |
string | more-info |
Click action: more-info or none |
z_offset |
number | 0 |
Vertical shift in model units |
offset_x |
number | 0 |
Screen-space X offset in pixels |
offset_y |
number | 0 |
Screen-space Y offset in pixels |
Floating icon buttons anchored to 3D positions for quick room-level control.
room_controls:
- id: living_lights_btn
anchor: living_room_center # anchor id from the anchors list
entity: light.living_room
control_type: toggle
icon: mdi:lightbulb
color_on: '#ffdd55'
color_off: 'rgba(255,255,255,0.3)'
size: 44
z_offset: 50
- id: living_media_btn
anchor: living_room_center
entity: media_player.living_room_tv
control_type: more-info
icon: mdi:television
size: 44
offset_x: 56 # stack horizontally next to first button| Type | Description |
|---|---|
toggle |
Calls homeassistant.toggle on click |
more-info |
Opens the more-info dialog |
service-call |
Calls a custom service with service_data |
scene-select |
Activates a scene entity |
media-toggle |
Plays / pauses a media player |
| Option | Type | Default | Description |
|---|---|---|---|
id |
string | required | Unique identifier |
anchor |
string | required | Anchor ID from anchors |
entity |
string | required | HA entity to reflect and control |
control_type |
string | required | See table above |
icon |
string | — | MDI icon name |
label |
string | — | Text label |
size |
number | 40 |
Button size in pixels |
color_on |
string | — | CSS color when entity is active |
color_off |
string | — | CSS color when entity is inactive |
service |
string | — | Service to call (for service-call type) |
service_data |
map | — | Data passed to the service |
visible_when |
condition | — | Visibility condition |
z_offset |
number | 0 |
Vertical shift in model units |
offset_x |
number | 0 |
Screen-space X offset in pixels |
offset_y |
number | 0 |
Screen-space Y offset in pixels |
True 3D particle animations anchored to scene objects — musical notes that jump out of a speaker in 3D space, and airflow streaks that fan out from an AC unit in a configurable direction. Both are rendered inside the THREE.js scene (not as HTML overlays) so they move naturally when you orbit the camera.
THREE.Sprite objects float upward from the speaker anchor, each with a smooth fade-in/out and a gentle sinusoidal drift. The animation only activates when the media player is both playing and has volume > 0 — so a muted or paused player stays silent.
animations:
- id: living_room_music
type: music_notes
entity: media_player.living_room_speaker
anchor: speaker_anchor # 3D object name in the loaded model
active_state: playing # default: 'playing'
color: 'rgba(255,215,80,0.95)' # note color (default: golden)
z_offset: 0 # extra vertical shift in world unitsHow it looks: Eight ♪ / ♫ sprites cycle upward one after another with staggered timing. Each note fades in, drifts sideways, and fades out as it rises — giving a continuous stream effect.
THREE.LineSegments streaks fan out in a flat arc from the AC anchor — mimicking the horizontal louver spread of a wall-mounted split unit. Color updates automatically based on hvac_mode / hvac_action.
animations:
- id: bedroom_ac
type: ac_flow
entity: climate.bedroom_ac
anchor: ac_unit_anchor # 3D object name in the loaded model
flow_direction: 'north|down' # forward + slightly downward (wall unit)
flow_spread: 110 # total horizontal arc in degrees (default 110)
color_cool: '#4fc3f7' # cooling mode color (default: sky blue)
color_heat: '#ff7043' # heating mode color (default: orange)
color_fan: 'rgba(210,210,210,0.85)' # fan-only color (default: light grey)
z_offset: 0How it looks: Twelve streaks are distributed evenly across the fan arc, all starting at the anchor and cycling outward together. The spread is flat (left-right) — not a 3D cone — so it looks like air coming out of a louver rather than a leaf blower. The animation disappears automatically when the AC is off or idle.
flow_direction accepts three formats:
| Format | Example | Description |
|---|---|---|
| Single keyword | north |
One of the 6 cardinal directions below |
| Compound (pipe) | north|down |
Sum of two or more keywords, normalized — ideal for wall ACs |
| Raw vector | 0.7,-0.3,0 |
Custom x,y,z normalized direction |
Keyword reference:
| Value | Description |
|---|---|
down (default) |
Blows downward — ceiling cassette units |
up |
Blows upward — floor vents, upflow units |
north |
Horizontal, toward the model's north |
south |
Horizontal, toward south |
east |
Horizontal, 90° clockwise from north |
west |
Horizontal, 90° counter-clockwise from north |
bottom |
Alias for down |
The north/south/east/west values respect the card-level north config so the direction is always correct for your floor plan orientation.
| Option | Type | Default | Description |
|---|---|---|---|
id |
string | required | Unique identifier |
type |
string | required | music_notes or ac_flow |
entity |
string | required | HA entity driving the animation |
anchor |
string | required | 3D object name used as the spawn point |
active_state |
string | playing |
State that activates the animation (music_notes only) |
color |
string | golden | Note color (music_notes only) |
note_size |
number | 1.0 |
Sprite size multiplier — 0.5 = half size, 2.0 = double (music_notes) |
note_speed |
number | 1.0 |
Float speed multiplier — 0.5 = half speed, 2.0 = double (music_notes) |
flow_direction |
string | down |
Airflow direction — keyword, compound north|down, or raw x,y,z (ac_flow) |
flow_spread |
number | 110 |
Total horizontal fan arc in degrees (ac_flow) |
color_cool |
string | #4fc3f7 |
Streak color in cooling mode (ac_flow) |
color_heat |
string | #ff7043 |
Streak color in heating mode (ac_flow) |
color_fan |
string | grey | Streak color in fan-only mode (ac_flow) |
z_offset |
number | 0 |
Vertical shift of the anchor in world units |
visible_when |
condition | — | Additional visibility condition |
visible_when can be used on markers, room controls, and animations. It supports simple leaf conditions and compound AND/OR logic.
visible_when:
entity: binary_sensor.someone_home
state: 'on'Available operators: state, state_not, state_in, state_not_in.
visible_when:
and:
- entity: input_boolean.show_markers
state: 'on'
- entity: person.anas
state_not: not_homevisible_when:
or:
- entity: sensor.mode
state: home
- entity: sensor.mode
state: guestSet sky: 'yes' to activate the atmospheric sky shader (THREE.js Sky). A realistic atmosphere, directional sunlight, and optional ground plane are added to the scene. The sun position is read from the sun.sun entity and updates live as it changes throughout the day.
sky: 'yes'
north: # optional — which axis points north in your model
x: -1
z: 0Tip: Add a flat transparent slab object in SweetHome3D named
transparent_slab*to prevent sunlight from shining through the ceiling.
| Option | Type | Default | Description |
|---|---|---|---|
sky |
yes/no |
no |
Enable the atmospheric sky |
north |
object | {x:0, z:1} |
North direction in model space (X-Z plane) — aligns sun/moon with real cardinal directions |
sky_distance |
number | 100000 |
Radius of the sky dome in world units; reduce for a "closer horizon" feel |
sky_background |
yes/no |
yes |
no removes the atmosphere mesh so the background is transparent (sun/moon/weather still work) |
ground |
string | warm yellow | Ground plane appearance: none removes it, transparent keeps it invisible (for shadow reception), or any CSS color ('#2d4a1e') |
When sky: 'yes', a visible 3D sun sphere is added to the scene and follows the real solar elevation/azimuth live.
| Option | Type | Default | Description |
|---|---|---|---|
sun_distance |
number | auto | Distance of the sun sphere from scene center (world units); defaults to 1.5× bounding-box diagonal |
sun_size |
number | 1.0 |
Size multiplier for the sun sphere — < 1 shrinks, > 1 enlarges |
When sky: 'yes' and the sun is below the horizon (sun.sun state = below_horizon), a moon sphere automatically appears at the antipodal position in the sky. Its texture shows the correct lunar phase (waxing/waning crescent, quarter, gibbous, full, new).
| Option | Type | Default | Description |
|---|---|---|---|
show_moon |
yes/no |
yes |
Show/hide the moon sphere at night |
moon_distance |
number | auto | Distance of the moon sphere from scene center (world units) |
moon_size |
number | 1.0 |
Size multiplier for the moon sphere |
moon_entity |
string | — | Optional HA moon phase sensor (e.g. sensor.moon) whose state is the phase name (full_moon, waxing_crescent, etc.) — overrides the built-in calculation |
Supported moon_entity state values: new_moon, waxing_crescent, first_quarter, waxing_gibbous, full_moon, waning_gibbous, last_quarter, waning_crescent.
Point weather_entity at a HA weather.* entity to have the sky dynamically adapt to current conditions. Sky turbidity and fog automatically update, and 3D particle systems create rain, snow, hail, wind, or sandstorm effects in the scene.
sky: 'yes'
weather_entity: weather.home
weather_precipitation: 'yes' # set 'no' to disable 3D particles (sky still adapts)| Option | Type | Default | Description |
|---|---|---|---|
weather_entity |
string | — | HA weather entity ID |
weather_precipitation |
yes/no |
yes |
Enable 3D particle weather effects |
| HA state | Sky change | 3D particle effect |
|---|---|---|
sunny / clear-night |
Bright blue sky, no fog | — |
partlycloudy |
Slightly hazier | — |
cloudy |
High turbidity + light fog | — |
fog |
Very high turbidity + dense fog | — |
rainy |
Hazy + light fog | Rain streaks (900 drops) |
lightning-rainy |
Hazy + fog | Rain streaks + lightning flash |
pouring |
Very hazy + medium fog | Heavy rain streaks (1500 drops) |
snowy |
Hazy + light fog | Snowflakes (800 particles) |
snowy-rainy |
Hazy + fog | Snowflakes (800 particles) |
hail |
Overcast + fog | Hailstones (500 particles) |
lightning |
Overcast + fog | Lightning flash |
windy / windy-variant |
Clear | Wind streaks (speed-proportional, see below) |
sandstorm / dust / exceptional |
Amber, very dense fog | Sand particles below roofline (800 particles) |
Wind streaks appear automatically whenever wind_speed > 18 km/h, regardless of the overall weather state (e.g., you can have rain + wind at the same time). They are oriented along wind_bearing and their speed, count, and opacity scale with wind speed.
wind_speed (km/h) |
Effect |
|---|---|
| ≤ 18 | No streaks |
| 19–30 | Light streaks (soft blue-white lines) |
| 30–60 | Moderate to heavy streaks |
| > 60 | Dense, fast-moving streaks |
The wind_bearing attribute (meteorological convention — direction from which wind blows) automatically rotates the streak direction to match actual wind direction. north config is respected.
sky: 'yes'
north:
x: -1
z: 0
weather_entity: weather.home
weather_precipitation: 'yes'
show_moon: 'yes'
moon_entity: sensor.moon # optional
sun_distance: 3000
sun_size: 1.2
moon_distance: 3000
moon_size: 1.0
sky_distance: 100000
ground: '#2d4a1e' # dark green grassApply a CSS backdrop-filter to create a frosted-glass look. Use a semi-transparent backgroundColor so the blurred content behind the card is visible.
backgroundColor: 'rgba(0,0,0,0.35)'
backdrop_filter: 'blur(12px) saturate(180%)'type: custom:floor3d-card
name: Home
path: /local/my_home/
objfile: home.glb
height: 550 # or: height: "100vh"
backgroundColor: '#cccccc'
globalLightPower: '0.7'
header: 'yes'
shadow: 'no'
lock_camera: 'no'
hide_zoom_areas_ui: 'no'
zoom_entity: input_select.floor3d_zoom
# Sky & weather
sky: 'yes'
north:
x: -1
z: 0
weather_entity: weather.home
weather_precipitation: 'yes'
show_moon: 'yes'
sun_distance: 3000
sun_size: 1.2
moon_distance: 3000
ground: '#2d4a1e'
camera_position:
x: 609.3
y: 905.5
z: 376.6
camera_target:
x: 37.4
y: 18.6
z: -82.6
zoom_areas:
- name: living_room
object_id: LivingRoom_floor
distance: 500
- name: kitchen
object_id: Kitchen_floor
distance: 400
anchors:
- id: living_room_center
object_id: LivingRoom_floor
- id: kitchen_center
object_id: Kitchen_floor
- id: ac_unit_living
object_id: AC_LivingRoom
markers:
- id: anas
entity: input_select.anas_room
type: person
person_entity: person.anas
size: 52
hide_states: [not_home, unknown]
rooms:
living_room: living_room_center
kitchen: kitchen_center
room_controls:
- id: living_lights
anchor: living_room_center
entity: light.living_room
control_type: toggle
icon: mdi:lightbulb
color_on: '#ffdd55'
color_off: 'rgba(255,255,255,0.25)'
size: 44
z_offset: 60
animations:
- id: living_music
type: music_notes
entity: media_player.living_room
anchor: living_room_center
active_state: playing
z_offset: 90
- id: living_ac
type: ac_flow
entity: climate.living_room_ac
anchor: ac_unit_living
direction: down-right
z_offset: 20
entities:
- entity: light.kitchen
type3d: light
object_id: Kitchen_lamp
light:
lumens: 600
decay: 1
distance: 350
- entity: binary_sensor.front_door
type3d: door
object_id: FrontDoor
door:
doortype: swing
direction: inner
side: left
degrees: 90Original card by adizanni.
Room-aware smart home features (markers, room controls, animations, zoom entity, diagonal AC wind, sky/weather/moon system, backdrop blur, CSS height, particle weather effects) added by anasmadrhar.
