Skip to content

Release notes

Every package moves together, so one version names them all. Update them together.

Not released yet

On main, for the next release:

  • Breaking: `@dashhaus/core`'s time words given no hour cycle (the calendar's `clockTime`, `eventWhen`, `eventSpan` and the rest, the weather's `clock` and `precipitation`) now follow the browser locale's clock instead of always 24 hours, and `formatHaTime` says weekdays and dates in English. Pass `"h23"` as their last argument to keep 24 hours; cards and `useHa<Name>` hooks under `HourCycleProvider hourCycle="h23"` keep them too.
  • Breaking: guestWifiFromHass in @dashhaus/core no longer sets the QR code (qr): it is a picture, not part of the model. If you call the mapper yourself, add it with useHaPicture on the QR code's image, as useHaGuestWifi now does; useHaGuestWifi, HaGuestWifi and both skins' guest Wi-Fi cards need nothing.
  • New: A binary sensor card in Orb and Field: a door, a window, a leak or smoke in its device class's words, with its battery; smoke, gas and carbon monoxide sound the card's alarm (Orb fills its slot in warn, Field inverts its screen), leaks are marked as warnings and a garage door left open as the cover card marks one, and the automatic layouts add every door, window, leak and smoke sensor (Orb's under Security). A binary sensor in YAML takes `battery`, and `@dashhaus/core/lovelace/layout` adds `safetySensors` and `SAFETY_CLASSES` (typed as `BinarySensorClass`) for a skin's own automatic layout. `@dashhaus/core/entities/binarySensor` says each warning in a few words (`alertText`: `Smoke alarm`, `Open since 18:30`) and whole for a screen reader (`alertSentence`). Its demo seeds are `@dashhaus/core/seeds/binarySensor`, with `useDemoBinarySensor`, which times the smoke alarm from when the story mounts, as the alarm's demo does.
  • New: A calendar card in Orb and Field: what's next and when, the next event and the time until it (`In 2h 6m`, `Until 12:15`, `Tomorrow 09:30`, or `Free` with nothing ahead), with today's events and what's coming in its details, its events read with `calendar.get_events` and any other calendars merged in. A calendar in YAML takes `calendars`, `days` (how far ahead, default 7) and `events`, and `history: false` hides today's plan; Orb's automatic layout puts every calendar under Calendar, and Field's gives every calendar a module. `@dashhaus/core` adds `useHaCalendar` (with `loadHistory`) and `HaCalendar`, the calendar's words and agenda (`eventWhen`, `calendarAgenda`) for your own markup, and `readCalendarOptions` in `@dashhaus/core/lovelace/schema`.
  • New: A camera card in Orb and Field: a doorbell's or a nursery's camera, its state in words and its still, which loads only while the card is on screen and refreshes only then (every 10 seconds, or the card's refresh), and never shows a past frame while the camera is unavailable. The still opens Home Assistant's own live stream, and so does a Live view in its details, even with stills off; the name opens the details, as on every card; a compact row shows no still. YAML takes a camera's still: false and refresh, and a dashboard's stills: false (no still fetched anywhere) and quiet (a still holds until the panel wakes and says when it is from), now in Orb too; Orb's automatic layout puts every camera under Cameras. Its words are @dashhaus/core/entities/camera/words (an integration's own state in words is inWords in @dashhaus/core/entities/format), its demo seeds @dashhaus/core/seeds/camera, and @dashhaus/core/lovelace/schema adds readCameraOptions.
  • New: A media player card in Orb and Field: what is playing with its artwork, how far in (a line and a clock that run on by themselves and stop at the end, or none on a dashboard set `quiet`), and one press to pause, play or turn it on, lit while it plays, buffers or is on, with skip, volume, mute, the source and power in its details; media_player entities join both skins' automatic layouts with the controls. Field's sound module now says why its volume is unlit to a screen reader too ("62 percent, sound off"). @dashhaus/core adds useHaMediaPlayer, HaMediaPlayer, the media player model, words (with isActive, volumeReason, SKIP_WORDS and artworkLabel) and seeds, @dashhaus/core/entities/volume for any card's volume in words (volumeText, volumeSaid), the sound's soundVolumeReason, usePlayhead in @dashhaus/core/hooks, and inWords and fmtPlayTime in @dashhaus/core/entities/format.
  • New: A media player that can seek is seeked from its details: Orb's sheet slides along a groove under how far in, Field's panel along a Position fader under the Player keys, each sending one seek when let go and running on from there. Core adds onSeek to the media player's actions, supportsSeek to its entity, the useSeek hook, and onCommit and current to useSlider.
  • New: A media player that steps its volume but can't set it, such as a TV over HDMI-CEC, gets Down and Up in its details: two pills in Orb's sheet and a minus and a plus key in Field's panel, each one step. Core adds onVolumeUp and onVolumeDown to the media player's actions and supportsVolumeStep to its entity; Orb's TogglePill gains a disabled state.
  • New: A numeric card in Orb and Field for any number a sensor measures, such as CO₂ in ppm, power in W or energy in kWh: its device class and unit choose its words, its icon and how its figure is written (five places at most, scaled beyond), and today shows the day's low and high, or how far a meter that only climbs rose. Pick it in YAML with `card: numeric` (with `unit` where the entity doesn't say); the automatic layouts add the room's air quality (CO₂, particles, VOC) as numeric cards, `@dashhaus/core/entities/numeric/words` says what a reading measures (`numericWords`, `numericFact`) and `…/readings` writes its figures (`numericFigure`, `withUnit`, `numericToday`), and `@dashhaus/core/lovelace/layout` adds `numericSensors` and `NUMERIC_CLASSES` (typed as `NumericClass`) for a skin's own automatic layout.
  • New: A sensor listed in Orb's or Field's YAML without card: that measures something other than a room's temperature or humidity (CO₂, power, energy, a battery) now draws the numeric card; card: sensor keeps the room sensor. @dashhaus/core/lovelace adds sensorCard and useSensorCard, and readCard marks such a card defaulted.
  • New: A sun card in Orb and Field: when the sun next sets or rises on the dashboard's clock, counting down to it (`Sets in 4h 35m`, `Rises in 9m`, or `Up all day` where none comes), with today's path of the sun worked out from Home Assistant's own location: Orb's featured card and sheet draw it as a line with the sun on it, Field's meter as the sun's height by hour. Its details list every time to come (dawn, sunrise, noon, sunset, dusk) and where the sun is. Orb's automatic layout puts the sun beside the weather under Outside. `@dashhaus/core` adds `useHaSun` and `HaSun`, the sun's words (`sunNext`, `sunWhen`), its solar position and today's path (`sunPosition`, `sunDay`, `sunPathDrawing`) for your own markup, and its demo seeds in `@dashhaus/core/seeds/sun`.
  • New: A vacuum card in Orb and Field: a robot vacuum (`vacuum.*`) said in Home Assistant's activities (Cleaning, Docked, Returning, Paused, Idle, Error), integrations' names for them mapped and any other state in its own words, lit while it cleans or heads home, with one press that pauses it while it moves and starts or resumes it while it stands, sending it to its dock or locating it from its details, and its fan speeds there too. An error is marked as an urgent warning with what went wrong, a low battery as advisory while it stands away from the dock and isn't charging (not while it cleans or heads home), and the automatic layouts place it with the controls by area. `@dashhaus/core` adds `useHaVacuum`, `HaVacuum`, `vacuumFromHass`, `createVacuumHandlers` and `VACUUM_ACTIONS` (start, pause, return to base and locate, each gated on `supported_features`, and the fan speed as a choice), `vacuumHistoryFromHass`, and `@dashhaus/core/entities/vacuum/words` and `…/severity` for its words (`vacuumWord`, `vacuumPress`, `vacuumWarning`, `isActive`) and severity (`vacuumSeverity`).
  • New: `@dashhaus/core` adds each card's words and warning level beside its model, so a skin of your own says what Orb and Field say: `cover/words`, `alarm/words`, `lock/words`, `light/words`, `climate/words`, `toggle/words` and `sound/words`, a `severity` entry for the cover, sensor, weather, Owlet and alarm, `WARNING_WORD_MAX`, the battery's `batteryText`, the guest Wi-Fi's `noneWord` and `NONE_HINT`, and `rangeSummary` and `nowText` for a reading's day and its figure now.
  • New: @dashhaus/core can show an entity's own picture, a camera's still or a player's artwork: useHaPicture resolves it against your Home Assistant and drops it while the entity is unavailable, usePicture (in @dashhaus/core/hooks) loads it only while the box its ref is on is on screen and the page is visible and refreshes a still only then, and useHaMoreInfo opens Home Assistant's own more-info dialog, which plays a camera's live stream, from inside any skin's Lovelace card. A transport may resolve picture paths with resolveUrl, and demo transports take pictures, served from the local demo pictures in @dashhaus/core/seeds/pictures.
  • New: @dashhaus/core/entities/clock adds lineParts, which cuts a line of words at its times, so a skin can draw each time as one piece a clip keeps whole or drops whole.
  • New: Every card says its times on the dashboard's hour cycle, the header's: with `hour_cycle: h12`, Orb's and Field's cards say `Since 2:05 PM` and `Tomorrow 9:30 AM`, and Field's screens keep their four places (`2:00`) with the period beside them. In your own page, `HourCycleProvider` and `useHourCycle` from `@dashhaus/core/hooks` put every card and `useHa<Name>` hook on one clock, and core's time words take the cycle as their last argument.
  • New: Orb's warnings say whose they are first: a screen reader hears "Warning: Porch: Battery 12%, replace soon" or "Alert: Hallway smoke: Smoke detected" on every card, in every size and in the details. @dashhaus/core/entities/binarySensor/words adds alertSaid and @dashhaus/core/entities/vacuum/words adds vacuumWarningSaid, a warning said without the card's name, for a skin that puts the name first itself.
  • New: The automatic layout of Orb and Field ends with an Energy row: the grid, solar and battery power and energy meters you chose in Home Assistant's Energy dashboard, as numeric cards. Without an Energy dashboard there is no such row.
  • New: The numeric card warns past a limit you set: warn_above and warn_below in Orb's and Field's YAML (useHaNumeric's warnAbove and warnBelow), in the sensor's own unit. It says High CO₂, Low voltage or Too cold behind a warning sign, look-when-convenient and never an alarm, and its details always say the limits.
  • Fixed: A blank figure now says whether it may never come: Field says "No reading yet" where a device reports a figure but hasn't sent it (a thermostat's room temperature, a lamp's warmth, a ceiling fan's direction, an Owlet's heart rate) and "Not reported" where a thermostat has no room temperature at all, in place of each module's own words ("No room temperature", "No warmth", "Direction not reported"), and leaves out a panel's channel for a figure the device doesn't report; Orb's climate card says "No reading yet" in the room temperature's place before its first. `@dashhaus/core` adds `NO_READING_YET` and `NOT_REPORTED` to its facts, the climate model's `reportsCurrentTemperature` and `roomTemperatureBlank`.
  • Fixed: A new skin from create-dashhaus-skin builds without Vite 8's "inlineDynamicImports option is deprecated" warning. A skin made with 0.4.0 keeps printing it until you replace rollupOptions: { output: { inlineDynamicImports: true } } with rolldownOptions: { output: { codeSplitting: false } } in its vite.config.js; the built file is the same either way.
  • Fixed: A time on a card is never cut: where a line is too narrow, what follows the time goes first, then the whole time, so a line never ends in "1:44…", "2:53 A…" or "Fri 1…". The same in Orb and Field, on either clock.
  • Fixed: A warning's word stays whole on a narrow card: Field gives up a screen's pictogram, unlit places and unit first, and an urgent row's warning sign, and Orb's alarm pill gives up its figure on its narrowest card. Only on a Field row under 280 px, a Field module under 240 px or an Orb card under 180 px can a word too wide for its line still end in an ellipsis.
  • Fixed: Field's alarm and Owlet rows keep their warning's word whole: what set the alarm off, or the count of the other alerts, gives way first (TRIGGERED, never TRIGGERE…).
  • Fixed: Field's compact rows fit a four-letter word on their screen (LOCK, OPEN, DOCK, HOLD) at every width, and a hot Fahrenheit day (104.3°F) no longer shrinks on a narrow row. A module's Today line and its fader's legend stay on one line on narrow modules, ending in an ellipsis where they must, instead of wrapping onto the hour strip or the fader's slot.
  • Fixed: Field's weather module with more than one warning no longer reaches past its own edge on a narrow module, where it could scroll the page sideways.
  • Fixed: Orb and Field cards say the same thing in the same words: every warning fits a 13-character row (an Owlet's alerts, "Stopped 11:49" once its readings stop, the weather's "Strong gusts", the alarm's "Entry delay · Front door"), the small print says when first and then what the device is, Field says "Last seen" while unavailable, and a charging Owlet sock says Charging and no longer warns of its battery. Orb's triggered alarm fills its slot with the shared alarm pill and Disarm, and its entry delay, a lock's battery and the weather's figures no longer repeat the warning in orange. Code that matches `@dashhaus/core`'s words gets the new ones: the Owlet's `ALERT_WORD` ("Critical O₂", "Low pulse", "Sock offline", "No base power", "Battery dying"), the weather's "Strong gusts" in place of "Gusts 84 km/h" (`weatherWarningsSaid` still says the speed), and `ARMED_LABEL.custom_bypass` "Armed custom".
  • Fixed: Orb's details sheet sets a state said in words at one size on every card: a light's On, a cover's Closed, a fan's named speed and a switch's or sound machine's On now match a lock's Locked and an alarm's Armed home, a step smaller than a figure.
  • Fixed: Orb's details sheets space every block heading the same: the calendar's Events today and Coming up, the guest Wi-Fi code's Codes and a lead bundle's Also in this bundle no longer sit further from their block than Mode, Preset or Today.
  • Fixed: Orb's featured guest Wi-Fi card with no code says "No code" once, with "Make one in details." under it, instead of saying "No code" twice.
  • Fixed: Orb's Owlet card says that readings stopped (`Stopped 11:49`) at the status line's usual size on a narrow card, instead of in smaller type.
  • Fixed: The guest Wi-Fi card's join QR code now loads in an app on another address than your Home Assistant, as a camera's still does: useHaGuestWifi gives it resolved against your Home Assistant, and none while its image is unavailable or unknown.
  • Fixed: The opt-in performance mark for a skin's resource starting is now `dashhaus:resource:entry` (it was `dashhaus:bundle:entry`), and a new skin's scaffold calls the file Home Assistant loads its resource, as the documentation does.

0.4.0

The release on GitHub, with its tarballs.

Orb and Field now each install on their own from the Home Assistant Marketplace, under their own names, and each one lists itself in Settings → Dashboards → Add dashboard. The Dashhaus download is gone: this release adds no file to it, so move to Orb or Field with the steps below. On npm, @dashhaus/bundle and @dashhaus/dashboard are gone too: each skin’s package ships its own file, and the dashboard framework is now @dashhaus/core/lovelace.

Upgrading

From the Dashhaus download in the Marketplace:

  1. Install Orb or Field (or both) from its page: krystosterone.github.io/dashhaus/orb/ or krystosterone.github.io/dashhaus/field/.
  2. Reload the browser tab.
  3. Go to Settings → Dashboards → Add dashboard and pick the skin.
  4. Delete the Dashhaus dashboard, any Home (Orb) or Home (Field) dashboard the old setup card made, and the setup card itself.
  5. Remove the Dashhaus download.

A dashboard you wrote yourself on Orb’s or Field’s card (custom:dashhaus-orb, custom:dashhaus-field) keeps working once that skin is installed.

From npm, deploying from the command line:

  1. Replace @dashhaus/bundle with the skins you deploy: npm uninstall @dashhaus/bundle && npm install @dashhaus/orb@^0.4.0 @dashhaus/deploy@^0.4.0 (add @dashhaus/field@^0.4.0 for Field).
  2. In dashboard.config.mjs, replace bundle: fileURLToPath(bundlePath) with files: [resourceFile], importing resourceFile from @dashhaus/orb/resource or @dashhaus/field/resource. A dashboard can now name a skin’s strategy instead of a card, strategy: { type: "custom:orb-dashboard" }, and follow the skin as it updates.
  3. Deploy, then delete the old /local/dashhaus/dashhaus.js under Settings → Dashboards → Resources, since it defines the same cards.

If you call @dashhaus/deploy from code, resolveBundle is now resolveFiles, which returns one target per file, and deploy() returns { resources, dashboards } instead of { version, resource, dashboards }.

If you build a skin, drop @dashhaus/dashboard from its package.json, move @dashhaus/core to ^0.4.0, and change each import: @dashhaus/dashboard becomes @dashhaus/core/lovelace, and @dashhaus/dashboard/skin, /card, /schema, /layout and /conformance become @dashhaus/core/lovelace/skin, /card, /schema, /layout and /conformance.

0.3.0

The release on GitHub, with its tarballs.

One breaking change for Orb YAML: cards no longer take a color of their own, so delete color from your cards and set the dashboard’s accent instead. New in Orb and Field: a guest Wi-Fi card with the network’s name, its code and a join QR code. Lights and covers Home Assistant reports as unknown, such as RF blinds, now say Unknown and can be driven.

0.2.1

The release on GitHub, with its tarballs.

A patch release. A skin made with npm create dashhaus-skin now builds to exactly one file, without the empty style.css and the CSS warnings beside it. Every package is now published from this repository’s GitHub Actions, with an npm provenance attestation naming the commit it was built from.

Upgrading

Nothing to change in a deploy-only app or a developer’s app: update the packages together. A skin scaffolded from 0.2.0 keeps writing the empty stylesheet until its own vite.config.js gets the same one-line fix: in stylesInShadowRoot’s resolveId, return `\0dashhaus-style:${resolved.id}.js` instead of `\0dashhaus-style:${resolved.id}`. The stray file was never deployed, so leaving it is harmless.

0.2.0

The release on GitHub, with its tarballs.

Its notes are on GitHub.