Handover for HA dashboard https://www.reddit.com/r/homeassistant/s/t5HpCF2vcx A developer has documented a method for building hand-illustrated, animated floorplan dashboards for Home Assistant using the stock picture-elements card, with images that swap based on device states. The approach uses one image per floor, animated WebP files for device animations, and is designed for wall tablets or TVs, though it requires significant illustration work and manual placement. Who this is for: an AI agent or engineer helping someone build an illustrated, animated floorplan dashboard for Home Assistant from scratch , with their own house, their own illustrations, their own sensors. How to read it: it is written as questions and answers. Find the question the user is really asking and answer from that section. The numbers, room names and entity IDs here are placeholders — every one of them will be different in a new build. What transfers is the method : the canvas rule, the file naming scheme, the card patterns, and a long list of traps that cost real time to discover. Nothing here requires the original artwork. A new build can have one floor or five, three devices or thirty. A hand-illustrated, isometric cutaway of a house, one image per floor, used as the home screen for Home Assistant. Devices are painted into the picture. When the air conditioner runs, the AC in the picture blows; when the TV is on, the screen glows and flickers; at night the whole house switches to a night render with warm windows. Small translucent "pills" sit over each room showing temperature, humidity and the AC setpoint. It is built on Home Assistant's stock picture-elements card. The illustration is the card's background; every device is an absolutely-positioned image element on top of it that swaps its own file when the entity changes state. One Lovelace view per floor or area , each a full-screen panel holding a single picture-elements card. A reference build had four: | view | what it holds | |---|---| | Ground floor | floorplan + AC units, TV, wood stove + two room pills | | First floor | floorplan + AC units, monitor + four room pills | | Garden | three background states day / night-dark / night-lit , tap zones on the lamps | | Combined | all three floors composited onto one canvas, sized for a TV | A new build can stop at one view. The combined view Part 10 is genuinely optional and is the hardest part of the whole project. - It is beautiful, and it is legible. People who do not use Home Assistant can read it. "The living room AC is on" is a picture of an AC that is on. - Almost entirely stock. The core backgrounds, day/night, animated devices, tap-to-open needs no custom cards at all. Only optional extras pull in HACS. - Animation costs nothing at runtime. The motion lives inside the image files animated WebP , not in CSS or JavaScript. The browser decodes an image. This is what makes it viable on a cheap wall tablet or a TV browser. - It scales down gracefully. Coordinates are percentages, so the card fills whatever screen it lands on. - Excellent for a wall display or TV. Big, glanceable, no chrome, no scrolling. - The artwork is the project. Expect the illustration to be 80% of the cost and the calendar time. If the user cannot commission or produce a consistent isometric set, stop here and suggest a photograph-based or SVG floorplan instead. - Every device state is another drawing. Adding a lamp later means going back to the illustrator. This is the single biggest structural downside — see the file count arithmetic in Part 4 before promising anything. - Placement is manual. The background does not contain the devices, so nothing can auto-locate them. Each device is dragged into position by hand, once. - picture-elements is a blunt tool. No layout engine, no grouping, no boxes. Everything is absolutely positioned, so hiding an element leaves a hole. There is one important exception Part 9 . - It is not adaptive. A phone gets the same picture, shrunk. If phone use matters, the floorplan is a second dashboard, not the only one. - Maintenance is YAML. No GUI editing — the visual editor actively corrupts this card Part 11 . - Weight. A full art set runs a few megabytes. Fine on a LAN, noticeable over a slow remote connection. - They have no illustration source and no budget for one. - They want every entity in the house on it. This design suits ~4–8 visible devices per view; past that it turns into noise and the file count explodes. - They mostly use their phone. - They want to add devices frequently. Each addition is an art request. A good compromise to offer: build one view for the main living space, with two or three animated devices and the room pills. It is a fraction of the work and delivers most of the impression. | requirement | why | |---|---| | Home Assistant with file access /config | the dashboard is YAML files on disk — Samba, SSH add-on, VS Code add-on, anything | | Willingness to run the dashboard in YAML mode | include of shared element files is the whole architecture | | An illustration set, or a way to get one | see Part 3 | | A helper toggle for day/night | input boolean | | Sensors that already work in HA | the dashboard displays entities, it does not create them | | An image tool that can encode animated WebP img2webp , from libwebp | plus pngquant for palette reduction | Start with none . Then, per feature: | feature | needs | avoidable? | |---|---|---| | backgrounds, day/night, animated devices, tap-to-open | nothing | — | | room status pills | nothing | — | | a popup controlling two or more entities from one tap | Browser Mod | yes — use a subview, or tap/hold for two dialogs | | the combined all-floors view | card-mod | no | | scaling a standalone view fluidly --fp-u | card-mod | yes, if only fixed-px sizing is wanted | Tell the user plainly which line they cross and when. A stock-only build is a real option and worth defending. Anything reasonably current. Two version-sensitive points: - The modern condition schema condition: state , condition: numeric state , condition: or works in picture-elements conditionals from frontend 2024.2 onward. Older versions only take the legacy shorthand entity: + state: . - The conditional -as-flex-container behaviour in Part 9 was checked against release tags spanning several months, not just dev — the exemption is in the shipped builds, not a recent addition. Re-check if the target is much older. Ask, because it constrains CSS. A reference build targeted a smart-TV browser, which ruled out: - flexbox gap Chromium 84+ — use margins on children instead - 100dvh Chromium 108+ — use 100vh Modern tablets and desktops have no such limits. If the target is a TV or an old tablet, keep to the conservative forms throughout; it costs nothing. Every image must be exported on one shared canvas of the same size, with content positioned where it belongs in the house — not cropped to itself. Call it the master canvas . Pick a size once a reference build used 4096×2160 RGBA PNG , and have the illustrator render every single asset onto it: each floor's day render, each floor's night render, and every device layer , all at their true position inside that canvas, transparent everywhere else. Three payoffs, all large: 1. The floors line up automatically. Compositing all floors into one image later becomes a plain alpha stack — no registration work, no guessing. 2. Device layers land themselves. If a device is exported full-canvas, its position is already known; nobody has to drag it into place. 3. Coordinates survive. Every position can be expressed in master-canvas pixels, which stay valid even if a crop box changes later. Converting percentage-to-percentage between two different crops is where mistakes happen — always go via master-canvas pixels. In the reference build the backgrounds were full-canvas but the device layers were pre-cropped, so the devices had to be placed by hand with a drag tool. That is the avoidable half. Ask for full-canvas device layers up front. Per view: find the content bounding box in the alpha channel, and crop to it — never resize . Source pixels then map 1:1 to the served image, so every measurement stays meaningful. Record, for each view, its crop origin and size. Those four numbers convert any master-canvas pixel to a card percentage: left% = Xcentre − cropX / cropW × 100 top% = Ycentre − cropY / cropH × 100 Store them in a small meta.json beside the built images. Future-you and future tools will need them. The union of both. Always. Night renders bleed outward — light spills from windows, so the opaque area extends further left and down. In the reference build the difference was 151 px left and 88 px down on one floor. Crop each render to its own box and the entire floorplan visibly jumps the moment the card swaps day for night. Crop day and night to the same union box. Both files then have identical dimensions and are pixel-aligned, and the swap is invisible. The same rule applies to any other whole-scene variant a "lights on" night render, for example . 1. One isometric cutaway per floor/area, day and night versions, on the master canvas. 2. For any whole-scene lighting state garden lamps on, for instance : an additional full render. 3. For every animated device: a still "off" frame and an 8-frame loop for "on", in both day and night lighting, each on the master canvas. 4. Device layers with their own drop shadows, on transparency. 5. Everything as PNG with alpha. No flattening, no baked backgrounds behind device layers. Yes, and enforce it. A reference build had one folder capitalised inconsistently FIreplace Night with a capital I which broke every glob that touched it. Agree a scheme, lowercase it, and check before building. This is the section to read before quoting the user a scope. One per whole-scene state , which is the product of every global condition: | situation | files | |---|---| | day/night only | 2 —