Repository navigation
Releases: j0sp0r/m3-cards
Release list
M3 Cards 2.5.0 — what the cards know, on hardware that can still show it
Upgrading: no option was removed or renamed, so existing configs load
unchanged. Three things look different without having been asked for, and one
of them is a reversal rather than an addition:
- A lock chip swaps its colouring. An unlocked lock is now the active,
accent-coloured state and a locked one the quiet, inactive one. Before, it
was the other way round. This is Home Assistant's own reading — a lock is
"active" exactly when it is not locked — and it holds for the Chip Buttons
Card, the M3 Button Card and the M3 Aquarium Card, which share one list of
active states. If you prefer the old look,state_colorson a chip sets it
back per state; on a button card,inactive_colordoes. - An inactive chip with
use_entity_colorfollows the theme instead of
going straight to grey. A theme that defines, say,--state-light-off-color
now colours switched-off light chips with it. - A single setpoint lost its caption. The climate card wrote "target
temperature" under the one number a thermostat has. A band keeps its
captions — those name which of the two rows is which.
A fourth difference shows only on old hardware. Anything that stopped at
iOS 15 — an iPod touch 7, an iPad Air 2 — ran this suite badly enough to be
unusable, and now runs it. What those devices give up is the tint on a fill,
not the fill. Nothing changes on a current browser; see Old hardware is still
a dashboard below.
This release is mostly about the cards saying what they know, about the three
findings the HACS store review turned up on the way in, and — late, and after
a photograph of a very small screen — about the hardware that never got a
newer Safari.
The suite registers 44 cards.
A second look for the climate card
style: expressive redraws the card around Material 3 Expressive: the
current temperature becomes one dominant, heavy figure; the setpoint becomes
a single connected control — round outside, tight inside — instead of two
circular buttons either side of a floating pill; the mode and preset buttons
morph their shape on press; and a heat/cool frame around the card reports the
equipment.
The frame has two strengths rather than one: full while the entity's
hvac_action reports heating or cooling, dimmed while heat or cool is the
selected mode but the equipment is idle. That second level is not decoration.
Many integrations derive hvac_action from the physical valve, so a Homematic
eTRV reports idle for an entire summer with the mode set to heat, and a frame
that only lit on heating was invisible on that hardware.
The default stays tiles, unchanged in every detail — this is an opt-in second
look, not a redesign of the existing one. Contributed by @UHaFnir, over
three review rounds.
Its mode button is the first consumer of shared/dropdown-menu.ts, a
body-level portal: .card-inner.glass establishes a containing block, so a
menu rendered inside the card can neither escape ha-card's overflow: hidden
nor paint above a card that comes later in the dashboard. With only two modes
left, the button flips straight to the other one rather than opening a menu for
a binary switch.
A reading opens the history it came from
Three cards drew numbers you could look at and not ask about.
- The climate overview's room tiles show two numbers from two sensors but
tapped as one, so the humidity was the only number on the card you could not
reach. The strip along the bottom is now its own tap target and opens the
entity the percentage came from. It is the full width of the tile and
everything below the temperature, not the 10px line of text, so it can be hit
on a phone. A hold still runshold_actionanywhere on the tile — only the
tap differs between the two zones. - The room card's sensor chips open their own entity: temperature,
humidity, extra sensors, a single power sensor, and a window or door chip
with exactly one contact behind it. A power chip summed frompower_entities
and a window chip covering several contacts stay plain, because there is no
single history to show and a chip that does nothing should not look like one
that failed. - The mini climate card can show the humidity in its status line:
21,2 °C · 59 % · Aus. It stays off until it is switched on, in the card's
own editor rather than YAML-only. Most thermostats report no
current_humidityof their own, sohumidity_sensorpoints at the room's
sensor and naming one is itself the request to show it.
Chip rows
Chip labels that do not fit now slide to their end and back instead of ending
in an ellipsis, and stretch: smart gives each chip its content width first,
sharing out only what is left — so a temperature or a percentage keeps its full
width while a long name gives up space. show_name: false hides a chip's name;
with show_state off as well it becomes a round icon button. Per-chip
state_colors colour one exact state.
The three measuring passes a chip row needs — edge fades, smart widths, sliding
labels — now sit behind one controller that the chip-buttons, button and vacuum
cards each drive with a single call, so no card can wire up half of it. The
passes run when a row is first seen, when it resizes and when the text on its
chips changes, rather than on every state tick: measured on a live instance at
207 state changes in 20 seconds for zero label measurements. Contributed by
@UHaFnir.
The waste card says which bin
The reminder had no way of telling you what it covered. It watched every bin
on the card, and nothing in the editor said so — the natural reading was that
it watched the one bin you were looking at. notify_entities narrows it to
the bins you pick, and the panel now states the part that was never written
down: one notification goes out, naming every bin that is due, rather than
one per bin arriving in a row.
Three smaller things on the same card. A collection due today sat at 0% of the
timeline and one at the far end at 100%, each pulled back by half its own
width, so both hung over the edge of the track; they are inset by their radius
now. The timeline itself is optional — show_timeline: false — because it is
the part of the card you either read every day or never. And a reminder that
has started escalating is red rather than the colour of the bin: "put it out
now" on a grey Restmüll bin was washed in grey, which is what every card in
this suite looks like when it is switched off. The hero icon keeps the bin's
own colour, so it still says which bin.
Old hardware is still a dashboard
A photograph of an iPod touch 7 started this. One icon covered half the screen,
the cards had no padding, and the tiles were holes with the wallpaper showing
through. The device is not the point — it is the last iOS 15 device, and so is
every iPad Air 2 still screwed to a kitchen wall.
Two features explain all of it. Safari learned container queries in 16.0 and
color-mix() in 16.2, and this suite uses both heavily.
The repair is not interesting in itself, but one thing about it is worth
knowing if you ever write CSS for this project. The ordinary way to fall back —
a plain declaration before the modern one — only works on a value the parser
can reject on sight. A declaration that contains var() anywhere is not
checked until after substitution, and one that fails then resolves to
unset, not to the declaration before it. That is the whole bug: the icon's
size arrived through a custom property, so its fallback never ran and an <svg>
at width: auto is 300×150 by definition. Every such value is now chosen in
script against a capability test, and the colour fallbacks live in an
@supports not block, which is the one place only those browsers look.
Nothing is detected about the device. There is no version check and no
user-agent string anywhere in this — a browser that has the feature gets
exactly what it got before, byte for byte, and a browser that does not gets a
solid fill instead of a tinted one. That ages better than a list of devices,
and it covers hardware nobody here has ever tested on.
What those browsers give up, concretely: fills are solid rather than tinted,
overlays that fade to transparent are simply not drawn, and the layouts that
adapt to a narrow card rather than a narrow screen keep their wide form.
Security
Three findings from the HACS store review — thank you, @frenck — and a
fourth that his own reasoning led to. None was exploitable by the person
writing the card; they all turn on a value that person does not control, which
on a shared instance is the point.
- A
urlaction was handed towindow.openunchecked, andwindow.openruns
ajavascript:target in the page's own context with the user's session.
Cards resolve templates anywhere in their config, so the value can come from
an entity's state. It is now resolved against the current page and dropped
unless it comes outhttp:orhttps:. - An
entity_pictureand a media thumbnail went intobackground-image: url()
unquoted, and a chip put a raw entity state into a CSS custom property
name. A crafted value could close the declaration and add rules of its own.
URLs now go through a checked, escapedurl("…"), and anything reaching a
property name is reduced to[a-z0-9_]. - The review made its case about the
urlaction by pointing out that a card
renders templates anywhere in its config, so the value can come from an
entity. That argument does not stop at one option: the same is true of every
colour a card takes, and those went into inline styles as written. The limit
is worth stating, because it is narrower than "CSS injection" sounds — a
styleattribute is a declaration list with no rule to escape, so no other
element can be touched. What a crafted value can do is add declarations to
the element it is on: cover the viewport with it, or make it fetch something.
Colours are now ch...
M3 Cards 2.4.1 — what the cards were not saying
Upgrading: no configuration option was removed or renamed, so existing
configs load unchanged. Two things look different without having been asked
for: the two setpoints of a heat/cool thermostat are now drawn in the heat and
cool colours instead of plain text, and a chip row that scrolls now fades at
the edge it is hiding something behind. Both follow colours and options you
have already set.
A small release about things the cards were not saying. A thermostat in
heat/cool mode showed two numbers and left you to work out which was which. A
counter card with adjustable: true pointed at a plain sensor drew no pencil
and gave no reason. A chip row with more chips than fit simply ended at the
card's edge. None of these was a crash, and all three were the card knowing
something and keeping it to itself.
The suite registers 44 cards.
Added
-
The counter card can correct a
utility_meter. Its pencil could write an
input_numberor shift an offset helper — the two cases the author happened
to have, and not the common one: an energy or water reading is a
utility_meterfar more often than it is a helper. Pointed at one, the
pencil now callsutility_meter.calibrate, behind a confirmation that names
the old reading, the new one, and what the statistics engine will do about
the difference. A meter carries history and the rewrite cannot be undone from
the card, so the question is asked before anything is sent.It refuses the tempting shortcut on purpose. A meter must never be corrected
through its source: a falling source reads as a meter change and the whole
new value is added on the next rise — 18,899 to 40,793 in one five-minute
row, the last time that was learned here. So the platform is checked before
the domain, and a helper that happens to feed a meter still gets offset mode
while the meter itself gets calibrated. -
The button card can embed its own row of chip buttons, via
chip_buttons,
reusing the editor and rendering of the standalone Chip Buttons Card. The
layout follows the card's height: at a normal single-row height the chips sit
right-aligned beside the icon and text, and once the card is resized taller
they move to a bottom-anchored bar whose alignmentchip_buttons_justify
sets. That switch is a CSS container query rather than JS measuring height,
so it follows the dashboard editor instantly as the card is dragged.
chip_buttons_layoutdecides what happens when there are more chips than
fit:wrap(the default) breaks onto a second line,scrollkeeps one line
and scrolls it. Contributed by @UHaFnir.
Changed
-
The two setpoints of a heat/cool band are coloured. Both climate cards
drew the band's numbers in plain text. On the full card that leaves an
11-pixel label as the only thing saying which number is which; on the mini
card, where the two sit side by side with no room for a label at all, it
leaves their order. Each bound now carries the colour of the end it is:
"Heat to" in the heat colour, "Cool above" in the cool one, taken from the
samemode_colorsas the mode row, so an override there retunes the band
too. Nothing new to configure. Suggested by @enotbay in #21.The low bound is the warm one. It reads backwards as a scale and correctly as
a control:target_temp_lowis the number the heating obeys, which is also
the way round Home Assistant's own thermostat has it. -
A scrolling chip row fades at the edge that has something behind it. The
fades lived on the chip-buttons card as an inline observer, so the row the
button card now embeds would have had to copy them, and the vacuum card's own
row had none at all. They moved into the shared module, which is why all
three behave the same now: a mask appears only on a side with content
scrolled out of view, and a row that fits has none at either end.
Fixed
-
adjustable: truecould silently do nothing. On a plainsensorwith no
adjust_entitythere is nothing to write to, and the card simply left the
pencil out — an option that looks set, has no effect, and says nothing about
why. The pencil is now drawn greyed with the reason on it.adjustableand
adjust_entitywere also undocumented; the counter card's page now has a
section on all three ways a reading can be corrected. -
The counter card pointed at a service that does not exist. Its repair
instructions namedrecorder.adjust_sum_statistics, which is a websocket
command rather than a service and answers "not found" when called as one. The
confirmation and the documentation now point at Developer tools → Statistics
→ "Adjust sum", which is the same operation where it actually lives.
M3 Cards 2.4.0 — the machines release
Upgrading: no configuration option was removed or renamed, so existing
configs load unchanged. Two things look different without having been asked
for: the aquarium card's schedule bar is redrawn in the shape the suite's other
sliders use, and a chip button for a scene, a script or a button no longer
prints a state under its name. See "Behaviour changes" at the end.
The machines release. Four of the five new cards are about something that runs
a job and then stops: a robot vacuum and its maintenance, a 3D printer, and the
household appliances that were previously a row of tiles saying "Standby". They
share one idea — the state decides what is drawn — because a machine that is
idle has nothing to say about progress, and a dashboard that keeps the field
there anyway spends most of its life displaying a dash.
Alongside them, the suite-wide change: every card's own string fields take
Jinja2 templates now. A name, an icon, a colour, a label — anything a card
reads out of its own config — is subscribed over Home Assistant's
render_template websocket and pushed a new value when anything it reads
changes. Until now a composed label meant a template sensor in
configuration.yaml for every card that wanted one.
The suite registers 44 cards.
Added
-
M3 Vacuum Card (
m3-vacuum-card) — the robot itself: where it is, what
it is doing, and the handful of controls anyone presses. Every command is
drawn optimistically, because the integration polls every thirty seconds and
pushes nothing; a tap that changed nothing for half a minute read as a broken
button. Rooms are chips built fromvacuum.clean_area, offered only when the
machine's capability bits say it can honour them. Suction and mop get the
suite's Expressive sliders, and the cleaning mode — vacuum, mop or both — a
menu, because those are three different jobs rather than three strengths of
one; picking one sets what the next run will do and starts nothing.The map is cropped to the floor plan: Roborock sends a picture of the robot's
whole coordinate space, in which a flat fills a corner, so an uncropped map
arrives as a stamp in the middle of the box. It is a plain picture on the
card with a magnifier that opens it full-screen — pinching it where it sits
would have needed the same touch handling that stops the dashboard scrolling
past it. The dock is discovered as the separate device it is — without that
the card loses the tanks, the dust emptying and the mop washing. -
M3 Vacuum Maintenance Card (
m3-vacuum-maintenance-card) — filters,
brushes, sensors and mop with the life they have left, plus reminders for
the chores nothing counts. "Change the mop every three runs" is not a
sensor; the card works out when it is due, shows it, and lets it be ticked
off at any point, not only once it nags. Theinput_numberthat makes that
possible is created by the reminder's own editor, set to today's meter
reading.show_resetadds a reset button to each part row, behind a
confirmation. Both vacuum cards can build real Home Assistant automations
from their editors. -
M3 Printer Card (
m3-printer-card) — a 3D printer as one card instead of
sixteen tiles. Built against Bambu Lab's integration and deliberately not tied
to it:state_mapand a three-pass resolver mean OctoPrint, Moonraker and
Prusa Connect land in the right blocks too, and a value nothing recognises
reads as idle rather than as an error. The camera is a still, not a stream,
and the badge says so. The socket the printer hangs on stays usable while
everything else dims — it is the one control that can bring the machine back.
Pause, resume and stop press the integration's own buttons with nothing
configured, and the card folds from its header the way the vacuum cards do. -
M3 Appliance Card (
m3-appliance-card) — washing machine, dryer, oven,
fridge, coffee machine, litter robot, printer, NAS: the machines that have a
job, a phase and a finish time, with a card that shows the phase while it runs
and gets out of the way when it does not. -
M3 Search Card (
m3-search-card) — a Material 3 search field over
entities, areas and devices, with a quick bar that opens on the result. -
Jinja2 templates in every card's own string fields. Templates inside a
nested card config are deliberately left alone and handed to that card
verbatim — it renders them itself, and it renders them live. -
A compact mode for the light card (
compact: true), which drops the power
button and makes the header icon the toggle — the split the native tile card
makes. It is about horizontal room in a two-column grid. -
Smaller ones:
show_color_tempfor the light card, an action on the room
card's header, a configurable tap and hold on the presence card with both in
its editor, per-person popups there, a popup for the appliance card, and
source: synology_dsmfor the NAS card.
Changed
-
The shared popup chrome takes a title and a size. Both opt-in; a caller
that passes neither renders exactly as before. -
The presence card's
hold_actionruns through the shared handler. It used
to implement two kinds itself and silently ignore the rest, somore-info,
toggleandperform-actiondid nothing and nothing said so. -
The status rule matcher and the domain → default-action mapping are shared
helpers, rather than private methods on two cards that both needed the same
answers. -
The NAS card's notification setup resolves volumes through the card's own
discovery, so an m3-system-card's "volume full" trigger finds something to
watch. -
The vacuum cards use the suite's header and fold chevron instead of
hand-rolled copies. The chevron now lives in one place, so the next card that
folds inherits it.
Fixed
-
A thermostat in Auto showed one setpoint or none. In heat/cool a climate
entity holdstarget_temp_lowandtarget_temp_highand notemperature,
and both climate cards readtemperature— so the mini showed nothing and
the full card fell back totarget_temp_high, which looks like a single
setpoint and is silently the top of a band. Both now show the band: the full
card stacks its stepper row twice, the mini prints both numbers and lets its
one pair of buttons act on whichever is lit. A single-setpoint thermostat is
unchanged. Thanks to @enotbay for reporting both (#21, #22) — neither of
us has a thermostat with a band, so a confirmation on the issues is welcome. -
Closing a card's dialog no longer scrolls the dashboard away. It jumped to
whatever had focus last — on a phone, often a slider tapped minutes earlier —
because a tap on a card's header does not move focus there. The anchor aims
at the element the finger actually went down on — a card is most of a phone
screen, and parking focus on the card itself moved the page by the card's own
height — so closing a dialog now leaves you exactly where you were.
Behaviour changes
-
The aquarium card's schedule bar is redrawn. Same data, same behaviour —
it is now the same geometry as the suite's discrete sliders, with real gaps
either side of each handle, so the aquarium's day and the vacuum's suction
scale read as one control rather than two designs in one suite. -
A chip button for a stateless domain no longer prints a state. A scene
showed a timestamp and a script showed "off", neither of which says anything.
show_state: truebrings it back for anyone who wants it. -
A chip button with no
tap_actionnow does what its entity is for. It
opened more-info for every domain, so a chip labelled "Vollreinigung" pointing
at a script opened a dialog with a Press button in it instead of cleaning.
Scripts start, buttons press, switches toggle, and anything without an obvious
verb still opens more-info — the mapping the button card has always used.
tap_action: more-inforestores the old behaviour per chip.
M3 Cards 2.3.2 — nav card editor tidying
Editor tidying for the nav card, following 2.3.1.
Upgrading: nothing renamed, nothing removed. If you had a pull-up sheet with
entries behind a round button, opening its editor once moves them into the
drawer's tiles — the same entries, in the place that can edit them.
Fixed
- The round button's section still appeared on a pull-up sheet. 2.3.1 stopped
the card drawing one there — a sheet has a drawer instead — but the editor went
on offering it, headed "Round button's menu" on a variant that has no round
button. Editor and card agree again: only the floating bar has one. A sheet's
menu entries fold into the drawer's own tiles, where they can be renamed and
reordered; they were already drawn there, but lived in a part of the config the
editor no longer showed.
Changed
- The round button and its menu moved from Appearance to Entries, directly
under the list. They hold the same kind of thing the bar does, and moving a
page from the bar into the menu or back meant working across two panels.
Behoben
- Der Abschnitt des runden Knopfes erschien weiterhin beim Pull-up-Sheet.
Seit 2.3.1 zeichnet die Karte dort keinen mehr — ein Sheet hat stattdessen
eine Schublade —, der Editor bot ihn aber weiter an, überschrieben mit „Menü
des runden Knopfes" bei einer Variante ohne runden Knopf. Editor und Karte
sind wieder einer Meinung: nur die schwebende Leiste hat einen. Die
Menüeinträge eines Sheets gehen in die Kacheln der Schublade über, wo sie sich
umbenennen und umsortieren lassen — gezeichnet wurden sie dort ohnehin schon,
sie steckten nur in einem Teil der Konfiguration, den der Editor nicht mehr
anzeigte.
Geändert
- Der runde Knopf und sein Menü sind von „Darstellung" zu „Einträge"
gewandert, direkt unter die Liste. Sie enthalten dieselbe Art von Dingen wie
die Leiste, und eine Seite von der Leiste ins Menü zu schieben oder zurück
hieß bisher, zwischen zwei Bereichen zu wechseln.
M3 Cards 2.3.1 — nav card hotfix
A hotfix for the nav card. Everything here was found within hours of 2.3.0
by someone building their first navigation bar, and every one of it sat in
the way of doing exactly that.
Upgrading: nothing was renamed or removed, so existing configs load
unchanged. One thing looks different without having been asked for: a nav card
you add from now on starts as a floating bar rather than a docked footer. Cards
already on a dashboard are untouched.
Fixed
-
The drawer stopped responding after the editor was saved. A pull-up
sheet would not open — by tap or by drag — until the page was reloaded.
Saving re-renders the card and Lit hands the drawer fresh elements, but the
gesture kept its listeners on the discarded ones, and the code that wires
them up returned early because a gesture object already existed. Events
arrived at nodes nobody was listening to. It now compares the grip it is
bound to against the one on screen, and rebinds when they differ. -
The target page had to be typed from memory. Every entry meant recalling
a path like/lovelace/garten. It is a list of this dashboard's own views
now, labelled "Energie — /lovelace/energie", at all four places a path is
asked for — entries, submenu entries, drawer tiles, action-menu entries. A
path the list cannot know is still typeable. Choosing one also fills in the
name and icon from that view, leaving anything already written alone. -
The round action button appeared on variants that have no place for it.
It is a companion to a detached pill. Onheaderandfooter, which span a
screen edge, and onsegmented, which runs in the content flow, it read as a
stray dot that had fallen off the bar. Those three no longer draw one and the
editor stops offering it; what it would have held becomes ordinary entries at
the end of the bar, which already scrolls rather than clipping. Onsheetthe
entries go into the drawer instead, which is what the drawer is for. -
The pull-up sheet spanned the whole screen. Shut it hugged its entries;
pulled up it snapped to the full width, which on a wide monitor spread its
tiles across the glass and read as a different object from the one just
tapped. It keeps the bar's width now, open or shut. -
A docked bar spilled out of its frame in the editor. There the bar is
drawn in the flow, inside a frame the dashboard column sizes — eight entries
are wider than that, and the bar simply ran out past the dashed edge. It
scrolls inside the frame, as it already does on screen.
Changed
-
A new nav card starts as a floating bar with its labels beside the icons,
rather than docked with them underneath — the shape a phone's own navigation
uses. Only what a newly added card starts with changed; an existing card that
never named a style still falls back tofooter, so nothing moves on a
dashboard that was already set up. -
Every card's reference section folds behind a summary in the README, not
only the three adopted in 2.3.0. Each card keeps its description and its
screenshot visible; the YAML, the sub-sections and the options table collapse.
Those three cards were also missing from the card index entirely.
Behoben
-
Die Schublade reagierte nach dem Speichern des Editors nicht mehr. Ein
Pull-up-Sheet ließ sich weder antippen noch hochziehen, bis die Seite neu
geladen wurde. Beim Speichern zeichnet Lit die Karte neu und gibt der
Schublade frische Elemente; die Geste behielt ihre Lauscher auf den
weggeworfenen, und die Stelle, die sie anhängt, stieg vorzeitig aus, weil ja
schon eine Geste existierte. Die Ereignisse kamen bei Knoten an, an denen
niemand horchte. Die Karte vergleicht jetzt den Griff, an dem sie hängt, mit
dem gerade gezeichneten, und bindet sich bei Abweichung neu. -
Die Zielseite musste aus dem Gedächtnis getippt werden. Jeder Eintrag
hieß, einen Pfad wie/lovelace/gartenzu erinnern. Jetzt ist es eine Liste
der Ansichten dieses Dashboards, beschriftet als „Energie —
/lovelace/energie", an allen vier Stellen, an denen ein Pfad gefragt wird —
Einträge, Untermenü, Schubladen-Kacheln, Aktionsmenü. Ein Pfad, den die Liste
nicht kennen kann, lässt sich weiterhin eintippen. Die Auswahl füllt zudem
Beschriftung und Icon aus der Ansicht, ohne bereits Geschriebenes anzutasten. -
Der runde Aktionsknopf erschien bei Varianten, die keinen Platz dafür
haben. Er ist der Begleiter einer freistehenden Pille. Beiheaderund
footer, die an einer Bildschirmkante liegen, und beisegmented, das im
Fluss der Seite steht, wirkte er wie ein Punkt, der von der Leiste abgefallen
ist. Diese drei zeichnen ihn nicht mehr, und der Editor bietet ihn dort nicht
an; was er enthalten hätte, wird zu normalen Einträgen am Ende der Leiste,
die bei Überlauf ohnehin scrollt. Beimsheetwandern die Einträge
stattdessen in die Schublade — wofür sie da ist. -
Das Pull-up-Sheet spannte über den ganzen Bildschirm. Zugeklappt
schmiegte es sich an seine Einträge, hochgezogen sprang es auf die volle
Breite und verteilte seine Kacheln auf einem breiten Monitor über die ganze
Fläche — als wäre es ein anderes Ding als das eben angetippte. Es behält
jetzt die Breite der Leiste, auf wie zu. -
Eine angedockte Leiste lief im Editor aus ihrem Rahmen. Dort wird sie im
Fluss gezeichnet, in einem Rahmen, dessen Breite die Dashboard-Spalte
bestimmt — acht Einträge sind breiter als das, und die Leiste lief schlicht
über die gestrichelte Kante hinaus. Sie scrollt jetzt innerhalb des Rahmens,
so wie sie es am Bildschirm längst tut.
Geändert
-
Eine neu eingefügte Nav-Karte startet als schwebende Leiste mit den
Beschriftungen neben den Icons statt angedockt mit Text darunter — die
Form, die die Navigation eines Telefons selbst verwendet. Geändert hat sich
nur, womit eine neue Karte beginnt; eine bestehende ohne ausdrückliche
Variante fällt weiterhin auffooterzurück, damit auf einem eingerichteten
Dashboard nichts verrutscht. -
Im README klappt der Referenzteil jeder Karte hinter eine Zusammenfassung,
nicht nur bei den drei aus 2.3.0 übernommenen. Beschreibung und Screenshot
bleiben sichtbar; YAML, Unterabschnitte und Optionstabelle klappen weg. Jene
drei Karten fehlten außerdem vollständig im Kartenverzeichnis.
M3 Cards 2.3.0 — the navigation release
Upgrading: no configuration option was removed or renamed, so existing
configs load unchanged. Two things look different without having been asked
for: the room card's accent now follows the theme instead of a fixed blue, and
a water or gas meter's monthly figure was a thousandth of the truth and is now
right. See "Behaviour changes" at the end.
The navigation release. m3-nav-card is the new card — a dashboard navigation
bar in five variants, configurable to the level of the community's Navbar Card
but in this suite's design language. Around it, three older cards grew up: the
button card learned the shape language a phone's quick settings use, the room
card learned to hold arbitrary Lovelace cards instead of only what it can
discover by itself, and every colour field in every card can now be handed back
to the theme.
Three more cards arrived from an unexpected direction: Fabian Wendel
(UHaFnir) forked the suite, built
Lights Overview, Chip Buttons and Group Card in its design
language, improved the weather card, and found two performance faults in
code that was already here. All of it is in this release. The suite now
registers 39 cards.
Added
-
M3 Nav Card (
m3-nav-card) — a navigation bar for the dashboard, in five
variants.headerandfooterdock to a screen edge,segmentedis an
inline pill group that scrolls with the page,floatingdetaches into a
rounded bar, andsheetadds a drawer that pulls up over the view. The four
docked variants take no row of the grid: their slot collapses and they
position themselves against the screen.Per-entry badges take a template, an entity's state, or a count of entities
that are on — hidden automatically at 0, off, empty or unavailable. Popup
submenus grow out of the button that opened them. Tap, hold and double-tap
each get an action, and the phone gives a short buzz to confirm one.Desktop and mobile have separate layouts, and the bar picks between them by
measuring its own width, not the window's. Put it in a narrow column on a
wide screen and it knows it is narrow — the usual approach, which asks how
wide the screen is, would lay out a cramped bar as though it had the whole
display.name,icon,color,hidden,disabledand the badge accept a template,
so you can compute what an entry shows instead of fixing it in the config. The
card registers each template with Home Assistant, which sends a fresh value
whenever any entity the template mentions changes — a badge updates by itself,
with no polling. Only fields that really contain a template are registered,
and two entries using the same one share a single registration.The sheet is dragged, and the interesting part is not the drag but the
conflict with the content scrolling inside it: the content scrolls normally,
and the sheet only takes over once the content is already at the top and the
finger is going down. Let go and it settles to whichever open or closed
position is nearest — unless you flicked it, in which case it goes the way it
was thrown, wherever it happened to be. -
Three cards from a fork — M3 Lights Overview
(m3-lights-overview-card), M3 Chip Buttons (m3-chip-buttons-card) and
M3 Group Card (m3-group-card), built by Fabian Wendel
(UHaFnir) and adopted here.Lights Overview groups every light by area and gives each room a tile
that switches it — or lists the lights themselves, optionally with the ones
that are on first. Two independent filters decide what a room shows and
what a tap actually switches. A lamp on a smart plug is aswitchrather
than alight, soinclude_domainswidens the sweep, and a tap switches
through the generic service so those plugs really do turn on.Chip Buttons is a row of compact pills bound to entities, each able to
show its state, take the entity's own colour, hold a fixed one, or render
read-only as a label. The row scrolls sideways and its edges fade on
whichever side still has chips behind it.Group Card puts several cards on one surface with a shared background and
radius, so related cards read as one block instead of separate tiles. -
Weather card: the header and the chart switch independently. A card can
be just the current conditions, just the forecast chart, or both. The hourly
strip gained icons, temperatures, hour labels and a temperature axis, each
switchable. Icon, temperature and hour now share one rhythm and the strip
sits square in the card — it measures its own width, draws every 2nd, 3rd or
4th hour, and cuts the row back to a whole number of those steps so it ends
flush at both edges. Also from UHaFnir's fork. -
Nav card: the marker and the page move together.
marker_motion: slide
moves a single shape between entries instead of fading one out and another in
— except on arrival, where the marker is simply already where it belongs.
page_transitioncross-fades the whole view when a navigation starts from the
bar;page_transition: upis Material's fade-through and the setting worth
having, because a plain cross-fade between two pages that share a wallpaper
and a bar is invisible.page_transition_msdefaults to 180 ms rather than
the browser's 250, which reads as slow for a change the reader just asked for. -
Nav card: the bar can be shaped to taste.
label_positionputs an entry's
text below, above, right or left of its icon — the horizontal placements also
widen the active pill so it wraps icon and text together.label_sizesets
the text size, with a larger default beside an icon than under one, where
11 px is Material's figure for the secondary half of a stacked pair.
pill_sizescales the marker on its own,inactive_onlyis the missing
inverse ofactive_onlyfor labels and icons, andedge_distancesets how
far a docked bar keeps from its screen edge — added on top of the device's
safe area rather than replacing it, so no value can push the bar onto the
gesture bar. -
Nav card: the action button can open a menu. Give
action_buttonamenu
and tapping it raises a stack of labelled pills out of the button, each with
its own text, icon, colour and action, while the button itself morphs into the
close control. -
Button card:
shape_by_state,icon_offandicon_fill— the shape
language a phone's quick settings use. Withshape_by_statethe outline
follows the entity: a capsule while it is off, the configured corner radius
while it is on, and the icon well going from a circle to a rounded square with
it.icon_offgives a second icon for while the entity is off, since many
symbols have a struck-through twin that reads as "not on" before any colour
does.icon_fill: solidturns the active pairing inside out — the well takes
the accent and the glyph is darkened against it, instead of a pale wash of the
accent carrying an accent-coloured glyph. -
Room card:
modeandcards— a room card can now hold Lovelace cards of
its own.autois what it has always done, discovering the area's devices and
drawing a tile per category;manualdraws none of that and leaves the body
to the cards you put there. Two per row by default. -
Room card editor: the nested cards are editable in the UI, and each one
opens its own editor. Not a hand-picked handful of fields — the card class is
asked for its editor, the same contract Home Assistant itself uses, so a
nested button card offers exactly what a button card offers. Entities can be
added from a picker, reordered and removed. -
Room card:
power_entitiesanddoor_entities. A room's consumption is
usually the sum of its plugs, and the card could previously name only one
sensor;power_entitiesadds several together, chosen from a picker. Doors
get counted apart from windows and get a chip of their own, because a door
standing open and a window standing open are different facts and a card that
adds them together answers neither. -
Room card:
scroll_on_expand,scroll_durationandcollapse_memory. A
collapsed card near the bottom of a view opens downwards, past the edge of the
screen, so the thing you just asked to see is the thing you cannot see; it now
scrolls itself into view, keeping clear of anything docked over the bottom of
the window — a navigation bar from this suite included.collapse_memory
decides how long the fold is remembered: on the device for good, as before, or
only until the app is next started, so every start opens on the overview. -
Every colour field can take the theme's colour, and now says so. A card's
colour has always acceptedprimary, which resolves to the theme's accent —
under Material You, the tone generated from the wallpaper. It was a token you
had to know; every colour row in every editor now offers it as a button. -
Four shared modules came out of the nav card and are available to the
rest:template-sub.ts(onerender_templatesubscription per unique
template, ref-counted and shared between fields),sheet-gesture.ts(pointer
drag with a velocity estimate and snap points),tap-hold.ts(tap, hold and
double-tap told apart from each other and from a drag) andcard-helpers.ts
(hosting arbitrary Lovelace cards, with the two lifecycle rules that are easy
to get wrong).
Fixed
Thirty-six fixes, most of them the nav card being taken apart on a real phone.
The ones worth naming:
-
The active entry was one navigation behind. The bar read the path when it
was built, not when it painted, so it marked the page you had just left. -
Tapping an entry could flash the page next to it. Two separate causes: a
dashboard swipe plugin decided ontouchendfrom state it had gathered
before the shield went up, and a cac...
M3 Cards 2.2.0 — the new-cards release
Upgrading: no configuration option was removed or renamed and no default in
const.ts changed, so existing configs load unchanged. One thing looks
different without having been asked for: the light card printed its brightness
twice and now prints it once. See "Behaviour changes" at the end.
The new-cards release. Six of them: a clock that costs almost nothing to run, a
card that turns a state into a sentence, headings for the space between cards,
one card per room that works out its own contents, a (de)humidifier card that
does not insist your device is a humidifier entity, and a calendar with an
agenda and a month grid. The suite now registers 35 cards, and five shared
modules came out of building them.
Added
-
M3 Humidifier Card (
m3-humidifier-card) — target humidity, mode, fan
speed and a device's extras in one card. Home Assistant's own humidifier card
cannot set a fan speed, so the usual answer is a second card beside it.It does not insist that
entityis ahumidifier: plenty of dehumidifiers
are a switch plus a number plus a sensor, andcurrent_entity,
target_entityandaction_entitysay where the readings come from. Modes
come fromavailable_modes, aselect, or an explicit list; the fan row
reads presets, percentages or a select's options.layoutorders the four
blocks and hides the ones left out. -
M3 Calendar Card (
m3-calendar-card) — an agenda and a month grid for
any number of calendars. Events come fromcalendar.get_events, since the
entity attributes carry only the next one. Multi-day events appear under every
day they touch with "day 2 of 3", a running event is badged, and a calendar
that cannot be reached is named rather than silently dropped. -
M3 Room Card (
m3-room-card) — one card per area. Point it at a Home
Assistant area and it works out the rest: which kinds of device are in the
room, what each is doing, the climate readings, and whether anyone is in
there. Nine categories are built in,extra_domainsadds more, and a tile
appears only for a category that actually has an entity in the room.The badge under each tile is the point of it: with several devices it counts
them (2/4), with one it says what that device is doing — the fan's step,
the thermostat's target, the media title, the blind's position.Entities Home Assistant marks as configuration or diagnostic are left out,
and that single filter is what makes the switch category usable: on the
author's install a living room holds 32 switches, of which 2 are things a
person would call a switch.A tile holding several devices opens a picker on tap rather than switching all
of them, because a room's four lights are four decisions, not one. "All off"
and "All on" are there for when it really is one. Individual devices can be
excluded in the editor — that is where a plug's indicator light goes when its
integration fails to mark it as diagnostic.collapsible: truefolds the card down to its header, keeping the subtitle,
because "occupied · 3 devices on" is exactly what a folded room still needs to
say. The state persists per browser, or across devices in aninput_boolean. -
M3 Heading Card (
m3-heading-card) — section headings for the space
between cards, in four variants: a plain icon and title, one with a count chip
and an action button, a divider rule with a small-caps label, and a
collapsible one that folds away the cards below it. It draws no card of its
own — no frame, no glass, no shadow — so it reads as a label for what follows
rather than as another tile.Collapsing hides the sibling cards in the browser and writes nothing to the
dashboard configuration, so it is a view state and not an edit. That depends
on Home Assistant's own DOM, so every step is a check rather than an
assumption, and an unrecognised layout falls back to the plain variant: an
arrow that visibly does nothing is worse than no arrow. -
M3 Status Card (
m3-status-card) — shows a value large and with meaning:
a number, a piece of text, or a yes/no state, from any entity. The mapping in
between is the point: astatesrule list turnsoffinto a red "No" with a
cross, or a number under 20 into a warning colour, with no template sensor
doing the work. Five presets (yes_no,on_off,ok_problem,
open_closed,traffic) supply ready-made rule lists in the dashboard's own
language, and a card's own rules are tried first, so a preset can be adjusted
without being replaced.One value gets the large hero treatment, several get a grid or a row list. A
toggletap switches the shown state over at once instead of waiting for
Home Assistant to confirm, so a "medication given" card cannot be tapped
twice by someone who thinks the first tap missed. An optional trend chip
compares against the same entity 24 hours ago, withtrend_invertedfor the
values where falling is the win. -
M3 Clock Card (
m3-clock-card) — a clock in five styles: rounded tiles,
digits inside lobed shapes, lockscreen typography, an organic analogue dial,
and a sixty-segment ring. It reads no entity, so it works on any dashboard
without setting anything up; the optional alarm, sun, day-progress and
second-time-zone extras are the only parts that need one.The card only redraws while it is on screen — a clock on a wall tablet would
otherwise animate for weeks to an empty room — and styles with nothing moving
between whole seconds drop to a timer that wakes on the minute. Measured on a
35-card dashboard: 12 renders in 12 seconds against roughly 1440 frames,
and zero ticks while scrolled out of view. -
M3 Climate Overview —
tile_tap_action: thermostat. A tap on a room
opened the sensor's dialog, which is its history graph; it can now open that
room's thermostat instead —m3-climate-card-mini, floating over the card and
adjustable there. The thermostat is found in the room's own Home Assistant
area, or on the device the room's sensors sit on when the room has no area at
all, which is how a thermostat reporting its own room temperature is found.
climate_entitynames it per room and overrides both. A room with no
thermostat keeps the graph rather than going dead. Asked for on Reddit; the
default is unchanged. -
M3 Leak Card —
max_visible. The same "show N more" toggle the power
list, battery, NAS, updates and occupancy cards already had; the leak card
only had the all-or-nothingcollapse_ok. The limit steps aside during an
alarm, because whichever sensor is wet has to be on screen without another
tap. -
Three shared modules, each pulled out of a card rather than written
alongside it:src/shared/shapes.ts— the lobed-shape generator behind the clock's
styles. Material 3 Expressive's cookie, clover, flower and scallop shapes
are one curve with different settings, so one generator covers the family.src/shared/actions.ts— the seven-branch tap/hold action handler, moved
out of the button card so the status card'stoggleandcall-serviceuse
the same code rather than a second copy.src/shared/collapse-state.ts— the fold-state rule, shared by the heading
and room cards so the two cannot drift apart.
Fixed
-
M3 Cost Card sent a wildly wrong number to your phone. Its notification
multipliedstates(entity)by the price, and for a counter that state is the
meter reading: on the author's install the card said 112.66 € for August
while its own notification said 26,844.38 €. The automation now reads the same
statistics the card reads, so the two cannot disagree. An automation created
before this fix keeps its old template — open the card's notification
settings and save again. -
M3 Light Card showed the brightness twice. The percentage stood under the
lamp's name and again above the slider handle. The subtitle is the live one —
it already follows the value while the handle is being dragged — and it is
what every other card puts in that spot, so the label on the slider is gone. -
tintOnon a dark surface returned a CSScolor-mixstring rather than a
colour.tintInkfeeds that back in as the surface to measure ink against,
and an unparseable surface means the ink comes back unchanged — sotintInk
has been a silent no-op in every dark theme since it was written. Benign
until now, because a light accent on its own dark tint contrasts well by
accident.
Behaviour changes
No configuration option was removed or renamed and no default in const.ts
changed, so existing configs load unchanged. One point changes what you
see:
- M3 Light Card shows the brightness percentage once, under the lamp's
name. The second copy above the slider handle is gone.
Deutsche Fassung
Das Release der neuen Karten. Sechs davon: eine Uhr, die im Betrieb fast nichts
kostet, eine Karte, die aus einem Zustand einen Satz macht, Überschriften für
den Raum zwischen den Karten, eine Karte je Raum, die ihren Inhalt selbst
herausfindet, eine Karte für Be- und Entfeuchter, die nicht voraussetzt, dass
das Gerät eine humidifier-Entität ist, und ein Kalender mit Agenda und
Monatsraster. Die Suite registriert jetzt 35 Karten, und beim Bau sind fünf
gemeinsam genutzte Module entstanden.
Neu
-
M3 Humidifier Card (
m3-humidifier-card) — Zielfeuchte, Modus,
Lüfterstufe und die Zusatzfunktionen eines Geräts in einer Karte. Die
eingebaute humidifier-Karte kann keine Lüftergeschwindigkeit, deshalb steht
sonst eine zweite Karte daneben.Sie setzt nicht voraus, dass
entityeinehumidifier-Entität ist: Viele
Entfeuchter sind ein Schalter plusnumberplussensor, und
current_entity,target_entityundaction_entitysagen, woher die Werte
kommen. Modi kommen ausavailable_modes, einemselectoder einer eigenen
Liste; die Lüfterzeile lies...
M3 Cards 2.1.0 — the light theme release
Upgrading: no configuration option was removed or renamed and no default
in const.ts changed, so existing configs load unchanged — but the light theme
looks noticeably different, on purpose. See "Behaviour changes" at the end.
Everything below was measured on a live 35-card dashboard in both themes.
The light theme release. Accent colours are now corrected at render time
against the surface they are actually drawn on, so the palette reads as
deliberate rather than washed out. Alongside that: a large rendering-cost
reduction, a masonry layout fix, and calendar support for the waste card.
Added
- M3 Waste Card —
calendar_entity. Read the schedule from a calendar
whose events name the bin, instead of (or alongside) one day-count sensor per
bin. Streams from both sources are merged; a sensor wins over a calendar entry
with the same name. - Contrast tooling.
npm run test:contrastunit-tests the colour maths, and
test/contrast-audit.jsmeasures the rendered page — paste it into the
browser console on a dashboard and run it once per theme. See
docs/TESTING.md.
Fixed
- Accent colours in a light theme. The 2.0 known issue is resolved. The
palette is built for dark backgrounds — all thirteen colours fall below 4.5:1
on a light card and all thirteen pass on a dark one — so accents used as text
or as a data fill are now moved to their target contrast at render time. The
correction keeps the hue and lifts the saturation rather than blending toward
black:#85b7ebbecomes#0b6ed5, not a grey-blue. Measured on a live
35-card dashboard, the light theme now reports three findings and the dark
theme four, and all three of the light ones appear in the dark list too —
they are long-standing design choices, not theme faults. - Content on tinted surfaces. Chips, icon wells, expand toggles and count
badges took their colour from the card while sitting on a tint of the same
hue, which rendered#81c784on#9cdc9f— 1.26:1. Ink is now measured
against the surface it actually sits on. - Tints no longer mix toward
transparent. 146 surfaces mixed into
whatever was behind the card, which through a glass card is the dashboard
wallpaper, so the same 8% wash looked different depending on the picture
underneath. They mix into the card surface now. Gradients and deliberate
overlays are unchanged. - M3 Button Card and M3 Climate Card Mini in a masonry view. Both make
their card a size container so paddings can scale with height, then took
height: 100%. A masonry column imposes no height, the percentage fell back
toauto, andautoon a size-contained box is zero: the button card
rendered a squashed 37px of content inside a 0px card, and the climate-mini
card disappeared entirely. Sections views were never affected. - M3 Occupancy Card —
max_visible. The option had no effect; the list now
caps at the given number with the rest behind a toggle.
Performance
- Cards no longer re-render on unrelated state changes. Home Assistant
hands every card a freshhassobject whenever anything in the system
changes, so one chatty power sensor re-rendered every card on the dashboard.
Every card now declares what it reads. Cards that discover their entities by
scanning also watch for the entity count changing, so a newly added sensor is
still picked up. - M3 Power Summary — count-up animation. The value lerp wrote to reactive
state on every animation frame although the reading is rounded before it is
shown, so most frames re-rendered identical text. - Measured together on the same 35-card dashboard, 20 seconds:
370 renders → 12.
Behaviour changes
No configuration option was removed or renamed, and no default in const.ts
changed — existing configs load unchanged. These change what you see:
- Every card in a light theme. Accent-coloured text and data fills are
distinctly darker and more saturated than in 2.0. This is the fix, not a side
effect, but it is a visible change. - Every card. Tinted inner fills are opaque now rather than letting the
wallpaper through. The card itself stays translucent. - M3 Climate Card Mini has a minimum height of 112px. A tile configured
smaller than that is raised to it. 112px is the smallest height at which the
compact layout fits without clipping, so a tile below it was cutting off its
own content already.
Deutsche Fassung
Das Release für das helle Theme. Akzentfarben werden jetzt beim Rendern gegen
die Fläche korrigiert, auf der sie tatsächlich liegen — die Palette wirkt
dadurch gewollt statt ausgewaschen. Dazu: deutlich weniger Renderaufwand, ein
Layout-Fehler in der Masonry-Ansicht und Kalender-Unterstützung für die
Abfallkarte.
Neu
- M3 Waste Card —
calendar_entity. Abfuhrtermine aus einem Kalender
lesen, dessen Einträge die Tonne benennen — statt oder zusätzlich zu je einem
Tageszähler-Sensor pro Tonne. Beide Quellen werden zusammengeführt; bei
gleichem Namen gewinnt der Sensor. - Werkzeuge für Kontrastprüfung.
npm run test:contrasttestet die
Farbmathematik,test/contrast-audit.jsmisst die gerenderte Seite — in die
Browser-Konsole eines Dashboards einfügen und je Theme einmal ausführen.
Siehedocs/TESTING.md.
Behoben
- Akzentfarben im hellen Theme. Die bekannte Einschränkung aus 2.0 ist
erledigt. Die Palette ist für dunkle Hintergründe gebaut — alle dreizehn
Farben fallen auf heller Karte unter 4,5:1 und bestehen auf dunkler — deshalb
werden Akzente als Text oder als Datenfläche jetzt zur Laufzeit auf ihren
Zielkontrast gezogen. Die Korrektur hält den Farbton und hebt die Sättigung,
statt Richtung Schwarz zu blenden:#85b7ebwird#0b6ed5, kein Graublau.
Auf einem Dashboard mit 35 Karten gemessen meldet das helle Theme jetzt drei
Funde, das dunkle vier — und alle drei hellen stehen auch in der dunklen
Liste. Es sind also langjährige Gestaltungsentscheidungen, keine
Theme-Fehler. - Inhalt auf getönten Flächen. Chips, Icon-Felder, Aufklapp-Umschalter und
Zähler-Badges nahmen ihre Farbe von der Karte, saßen aber auf einer Tönung
desselben Farbtons — das ergab#81c784auf#9cdc9f, also 1,26:1. Die
Schrift wird jetzt gegen die Fläche gemessen, auf der sie wirklich liegt. - Tönungen mischen nicht mehr gegen
transparent. 146 Flächen mischten
gegen das, was hinter der Karte lag — durch eine Glaskarte also gegen die
Hintergrundtapete, sodass derselbe 8-%-Schleier je nach Bild anders aussah.
Sie mischen jetzt in die Kartenfläche. Gradienten und bewusste Überlagerungen
bleiben unverändert. - M3 Button Card und M3 Climate Card Mini in der Masonry-Ansicht. Beide
machen ihre Karte zum Größen-Container, damit Polster mit der Höhe skalieren
können, und nahmen dannheight: 100%. Eine Masonry-Spalte gibt keine Höhe
vor, der Prozentwert fiel aufautozurück, undautoist auf einem
größen-kontenierten Element null: Die Button-Karte zeigte 37 px gequetschten
Inhalt in einer 0-px-Karte, die Mini-Klimakarte verschwand ganz.
Sections-Ansichten waren nie betroffen. - M3 Occupancy Card —
max_visible. Die Option hatte keine Wirkung; die
Liste wird jetzt bei der angegebenen Zahl gekappt, der Rest liegt hinter
einem Umschalter.
Geschwindigkeit
- Karten rendern nicht mehr bei fremden Zustandsänderungen. Home Assistant
übergibt jeder Karte ein frischeshass-Objekt, sobald sich irgendwo im
System etwas ändert — ein einzelner geschwätziger Stromsensor rendert so das
ganze Dashboard neu. Jede Karte deklariert jetzt, was sie liest. Karten, die
ihre Entitäten selbst suchen, beobachten zusätzlich die Anzahl der Entitäten,
damit ein neu hinzugefügter Sensor weiterhin gefunden wird. - M3 Power Summary — Zähl-Animation. Die Interpolation schrieb pro
Animationsframe in reaktiven Zustand, obwohl der Wert vor der Anzeige
gerundet wird — die meisten Frames rendern also identischen Text. - Zusammen gemessen, dasselbe Dashboard mit 35 Karten, 20 Sekunden:
370 Renders → 12.
Achtung beim Update
Keine Konfigurationsoption wurde entfernt oder umbenannt, kein Standardwert in
const.ts hat sich geändert — bestehende Configs laden unverändert. Diese
Punkte ändern aber, was man sieht:
- Alle Karten im hellen Theme. Akzentfarbener Text und Datenflächen sind
deutlich dunkler und gesättigter als in 2.0. Das ist die Behebung, kein
Nebeneffekt — aber eine sichtbare Änderung. - Alle Karten. Getönte Innenflächen sind jetzt deckend, statt die Tapete
durchscheinen zu lassen. Die Karte selbst bleibt durchscheinend. - M3 Climate Card Mini hat eine Mindesthöhe von 112 px. Eine kleiner
konfigurierte Kachel wird darauf angehoben. 112 px ist die kleinste Höhe, bei
der das kompakte Layout ohne Abschneiden passt — eine kleinere Kachel schnitt
ihren Inhalt vorher bereits ab.
v2.0.0
Bekannte Einschränkung
Akzentfarben im hellen Theme. Die Farbpalette ist für dunkle Hintergründe entworfen. Im hellen Theme haben Werte, die in der Akzentfarbe gesetzt sind — große Zahlen, Prozentangaben, Statusfarben — weniger Kontrast als der übrige Text und wirken blass. Kartenflächen, getönte Flächen und Balken sind mit dieser Version korrigiert; die Vordergrundfarben folgen in 2.0.1.
Achtung beim Update
Keine Konfigurationsoption wurde entfernt oder umbenannt — bestehende Configs laden unverändert. Diese Punkte ändern aber das Verhalten, ohne dass man etwas anpasst:
- Media Card: Die rechte Zeitangabe zeigt die Restzeit mit Minuszeichen statt der Gesamtdauer (
time_display: totalstellt es zurück), führende Tracknummern verschwinden aus dem Titel (strip_track_number: false), und bei Playern mitBROWSE_MEDIAerscheint die Bibliothekszeile — die Karte wird dadurch höher und kann Layouts verschieben (show_browser: false). - Button Card mit
show_slider: true: Ein Tap setzt jetzt den Wert an der getippten Position, statt zu schalten. Zum Schalten dient das Icon, dessen Standardaktion im Slider-Modus auf den Domänen-Toggle wechselt (icon_tap_action: more-infostellt More-Info zurück). Karten ohneshow_slidersind nicht betroffen.
Neu
Sechs neue Karten — die Suite wächst von 23 auf 29.
M3 Cover Card (custom:m3-cover-card) — Rollladen- und Abdeckungssteuerung, die sich an die Fähigkeiten der Entität anpasst: Position, Lamellen-Neigung oder nur Auf/Zu, je nach supported_features. Einzel- und Gruppenmodus. Für Geräte ohne eigene Cover-Entität — etwa FingerBot-Antriebe an getrennten Schaltern — gibt es den switch_pair-Modus mit Auf-/Ab-/(optional) Stopp-Schalter; wo das Gerät keine Rückmeldung liefert, zeigt ein kurzes Tastenfeedback den ausgelösten Befehl.
M3 Leak Card (custom:m3-leak-card) — Überblick über Feuchte- und Leck-Sensoren mit den Zuständen OK, Alarm und „veraltet" (kein aktuelles Update). Optionaler Absperr-Knopf, der die Domäne der Absperr-Entität erkennt (valve / switch / cover), auf Wunsch mit Bestätigung. Optionale Benachrichtigung bei Wasseralarm.
M3 Waste Card (custom:m3-waste-card) — Abfuhrtermine als Hero mit „nächste Abfuhr in N Tagen", einer Zeitleiste über die nächsten zwei Wochen und einer Zeile je Tonne. Info- und Erinnerungsmodus, Hero-Icon einzeln oder mehrfach („N Tonnen"). Optionale Erinnerung zum Rausstellen zur eingestellten Uhrzeit. Erwartet Sensoren mit den Tagen bis zur Abfuhr, etwa aus der Integration Waste Collection Schedule.
M3 Occupancy Card (custom:m3-occupancy-card) — Belegung nach Räumen statt nach einzelnen Sensoren. Fasst Präsenz- und Bewegungssensoren je Raum zusammen, zeigt „X von Y Räumen belegt" und je Raum „belegt/frei seit …". Automatische Erkennung über Bereiche oder eine manuelle Sensorliste.
M3 Time Card (custom:m3-time-card) — Bearbeitet input_datetime-Helfer im Designsystem des Projekts, wahlweise als Stepper-Felder oder Scroll-Räder.
M3 Todo Card (custom:m3-todo-card) — Einkaufs- und Aufgabenlisten als Ersatz für HAs eingebaute todo-list-Karte. Einträge landen wahlweise oben oder unten (add_position), Dubletten werden abgefangen: statt einer zweiten identischen Zeile pulst der vorhandene Eintrag kurz auf. Schnellwahl-Chips speisen sich aus einer festen Liste, aus zuvor abgehakten Einträgen oder aus den M3 Supply Cards des Dashboards — der knappste Vorrat zuerst. Langes Drücken öffnet eine Zeile zum Umbenennen oder Löschen.
Dazu eine gemeinsame Benachrichtigungs-Infrastruktur für Occupancy-, Leak- und Waste-Karte: ein Panel im Editor mit Dienst-Auswahl, optionalem Titel und Text. Es legt eine — standardmäßig deaktivierte — Automatisierung an.
Die Media Card, überarbeitet
Bibliothek und Warteschlange. Meldet der Player BROWSE_MEDIA, öffnet eine Zeile am Fuß der Karte den Medienbrowser von Home Assistant: Breadcrumb-Navigation, Vorschaubild oder Icon je Zeile, Ordner zum Hineinnavigieren, abspielbare Einträge per Tap. Ein zweiter Reiter zeigt die Warteschlange, sofern die Integration eine liefert — Cast und Spotify tun das nicht und bekommen den Reiter gar nicht erst, statt ihn leer anzuzeigen.
Metadaten und Chips. Titel über zwei Zeilen, Interpretenzeile mit Radio-Fallback über media_channel, dritte Zeile mit Album und Jahr. Darunter Chips für Ausgabegerät und Quelle. Führende Tracknummern verschwinden aus dem Titel (07 - Enjoy the Silence → Enjoy the Silence), ohne Titel wie 1979 oder 365 Dreams anzutasten. Player ohne Metadaten — etwa ein Chromecast mit dem Default Media Receiver — greifen auf den Dateipfad zurück.
Fortschritt. Wellen-Indikator, der beim Pausieren flach ausläuft, sodass der Balken selbst den Wiedergabezustand trägt. Streams ohne Dauer zeigen ein wanderndes Segment und einen „Live"-Chip. Restzeit mit Minuszeichen, umschaltbar über time_display. Spulen per Ziehen.
Transportleiste. Reihenfolge Shuffle · Zurück · Play/Pause · Vor · Repeat. Der Play-Knopf ist der Zustandsanzeiger: Kreis pausiert, Squircle beim Abspielen, mit überblendendem Symbol. Repeat läuft dreistufig (aus → alle → einer). Knöpfe erscheinen weiterhin nur, wenn der Player das Feature meldet.
Akzentfarbe aus dem Cover. Bisher der Durchschnitt aller Pixel — also Hintergrund plus Motiv addiert, meist ein entsättigter Braunton. Jetzt wird die dominante gesättigte Farbe gewählt und auf lesbaren Kontrast gebracht. Ein Cover, das vorher ein praktisch unsichtbares Symbol ergab, liefert nun ein klar erkennbares Violett.
Behoben: helles Theme
Der Glas-Hintergrund aller Karten mischte seinen Schleier aus der Textfarbe. Im hellen Theme ist die dunkel — die Fläche verdunkelte also den Hintergrund, vor dem dann dunkler Text stand. Über einem dunklen Dashboard-Hintergrundbild waren die Karten dadurch praktisch unlesbar. Gemischt wird jetzt aus der Kartenfläche, die Home Assistant ohnehin themekorrekt liefert; der Kontrast stimmt damit von selbst, unabhängig vom Hintergrundbild. Im dunklen Theme ändert sich fast nichts. Der Fehler bestand seit 1.0.0.
Leistung
Zwei Animationen bauten bei jedem Einzelbild die komplette Karte neu auf, statt nur den animierten Pfad zu zeichnen. Bei der Light Card erzeugte eine einzige Instanz mit eingeschalteter Lampe 1820 Renders in 15 Sekunden — 73 % eines Dashboards mit 35 Karten. Nach der Korrektur sind es 9. Die Media Card hatte dieselbe Ursache im Fortschrittsbalken.
Zusätzlich filtern 15 der 29 Karten jetzt überflüssige Neuzeichnungen: Home Assistant reicht jedem Element bei jeder Zustandsänderung im gesamten System ein neues hass-Objekt, sodass bisher jede Karte bei jedem fremden Sensor neu rendert. Umgestellte Karten zeichnen nur noch, wenn eine ihrer eigenen Entitäten sich ändert.
Weitere Änderungen
- M3 Button Card: Der Slider übernimmt jetzt auch beim Tippen, nicht nur beim Ziehen, und bleibt bei ausgeschaltetem Licht bedienbar.
- Drags auf Slidern und Rädern werden von Swipe-Plugins des Dashboards abgeschirmt, damit ein seitlicher Wisch nicht die Ansicht wechselt.
- M3 Counter Card: Optionale Korrektur des Zählerstands direkt im Header.
- Alle Icon-Knöpfe der Media Card haben jetzt lokalisierte Beschriftungen für Screenreader.
- README von Grund auf neu strukturiert: ein Katalog nach Themenbereichen, je Karte Code, Erklärung und ein eigenes Bild.
Die vollständige Liste steht in CHANGELOG.md.
Known issue
Accent colours in a light theme. The palette is built for dark backgrounds. In a light theme, values set in the accent colour — large figures, percentages, status colours — carry less contrast than the surrounding text and read as pale. Card surfaces, tinted fills and bars are corrected in this release; the foreground colours follow in 2.0.1.
Before you update
No configuration option was removed or renamed — existing configs load unchanged. These do change behaviour without any edit on your side:
- Media card: the right-hand time shows remaining, with a minus sign, rather than the total length (
time_display: totalrestores it), leading track numbers drop out of titles (strip_track_number: false), and players reportingBROWSE_MEDIAgain the library row — which makes the card taller and may reflow a dashboard (show_browser: false). - Button card with
show_slider: true: a tap now sets the value at the pressed position instead of toggling. Toggling moves to the icon, whose default action in slider mode becomes the domain's toggle (icon_tap_action: more-inforestores more-info). Cards withoutshow_sliderare unaffected.
New
Six new cards — the suite grows from 23 to 29.
M3 Cover Card (custom:m3-cover-card) — Blind and cover control that adapts to what the entity can do: position, tilt, or just open/close, depending on supported_features. Single and group mode. For devices without a cover entity of their own — FingerBot actuators on separate switches, say — there is a switch_pair mode with up/down/(optional) stop switches; where the device reports nothing back, a brief button feedback shows which command was sent.
M3 Leak Card (custom:m3-leak-card) — An overview of moisture and leak sensors with OK, alarm and "stale" states (no recent update). Optional shut-off button that detects the domain of the shut-off entity (valve / switch / cover), with confirmation if you want it. Optional notification on a water alarm.
M3 Waste Card (custom:m3-waste-card) — Collection dates as a hero reading "next collection in N days", a timeline across the next two weeks, and a row per bin. Info and reminder modes, with a single hero icon or several ("N bins"). Optional reminder to put the bins out at a set time. Expects sensors carrying the days until collection, for instance from the Waste Collection Schedule integration.
M3 Occupancy Card (custom:m3-occupancy-card) — Occupan...
v1.9.0
Neu
M3 Supply Card (custom:m3-supply-card) — Vorratsverwaltung für Verbrauchsmaterial wie Waschmittel-Pods, Spülmaschinentabs, Filter oder Tierfutter.
- Ein Vorrat steht groß als Hero mit einem Punkt je verbleibender Einheit (ab 40 Stück ein Balken), Stepper mit Wiederholung beim Halten und ein „Packung nachgefüllt"-Knopf. Weitere Vorräte folgen als Zeilen mit Füllstandsbalken; ein Tap macht sie animiert zum Hero.
- Reichweiten-Schätzung aus der Historie des Helfers. Geteilt wird durch den Zeitraum, den die Daten tatsächlich abdecken, nicht durch das angefragte Fenster — der Recorder bewahrt standardmäßig nur 10 Tage auf. Eine Schätzung erscheint erst nach mindestens 3 Verbrauchsereignissen und 2 Tagen Beobachtung; wer sofort eine Zahl will, setzt
usage_per_week. - Benachrichtigung, wenn ein Vorrat zur Neige geht: als Abend-Digest mit allen Vorräten in einer Nachricht, wöchentlich oder sofort beim Unterschreiten. Auslöse-Niveau wählbar zwischen leer, kritisch und knapp, über
notify_itemsauf einzelne Vorräte begrenzbar. - Einkaufsliste: ein Chip im Hero schreibt den Vorrat auf eine To-do-Liste,
auto_add_to_listerledigt es ungefragt in der Automatisierung — inklusive Dublettenprüfung. - Schwellwerte und Farben je Artikel einstellbar, Animationen abschaltbar.
Die README erklärt das Anlegen des Zähler-Helfers und enthält ein Automatisierungs-Beispiel, das den Zähler nach jedem Waschgang herunterzählt.
New
M3 Supply Card (custom:m3-supply-card) — Supply management for consumables like laundry pods, dishwasher tabs, filters, or pet food.
- One supply is prominently displayed as a hero with one dot per remaining unit (switches to a bar for 40+ units), a stepper with press-and-hold repeat, and a "pack refilled" button. Additional supplies follow as rows with fill-level bars; a tap animates them into the hero position.
- Range estimation based on the helper's history. It calculates using the time period the data actually covers, not the requested window — the recorder only keeps 10 days by default. An estimate appears only after at least 3 consumption events and 2 days of observation; if you want a number immediately, just set
usage_per_week. - Notifications when a supply is running low: as an evening digest with all supplies in one message, weekly, or immediately upon falling below the threshold. The trigger level can be set to empty, critical, or low, and can be limited to specific supplies via
notify_items. - Shopping list: a chip in the hero section adds the supply to a to-do list,
auto_add_to_listhandles this automatically in the background — including duplicate checking. - Thresholds and colors can be configured per item, animations can be disabled.
The README explains how to create the counter helper and includes an automation example that decrements the counter after every wash cycle.