Repository navigation
Releases
v1.21.1 — a transient failure can't wedge the card
The SmarterZones card had a failure where one bad render left the card broken until a browser reload. This card grew the same signature-cached rendering and had the same hole — I reproduced it: injecting a single error mid-build left the grid's cached signature set but its DOM empty, so every later good update matched the signature, patched an empty container, and never rebuilt. The card stayed blank for good.
Three fixes:
set hassnow runs in a try/catch. On any error it shows a small error card and clears its built flag, so the next state update rebuilds from scratch — instead of the raw exception reaching Home Assistant and breaking the card.- Every cached container records its signature after the build succeeds, not before, so a mid-build failure leaves the old signature and the next pass rebuilds.
- Discovery no longer trips over a state whose
attributesis null — the kind of half-formed state you can briefly get right after a restart.
Verified in a browser: the case that used to stay blank forever now shows an error card during the failure and fully recovers on the next clean update.
v1.21.0 — custom entity tiles
Tiles could only come from the built-in catalogue, which only covers what an Ecowitt station reports. Now a tile can be any entity at all.
Click Custom entity in the weather card editor and pick one from the entity picker, or write it directly:
metrics:
- hum_out
- entity: sensor.rainwater_tank_level
- entity: sensor.pool_temperature
name: PoolA custom tile takes its label, icon and decimal places from the entity itself, so an entity id alone is a complete entry. Icons fall back through the entity's own icon, then its device class, then a generic gauge. Give it a name to override the label — often worth it, since Home Assistant friendly names are long enough to truncate. Custom and catalogue tiles mix freely and reorder together.
Two bugs surfaced only by driving the editor in a browser, which the unit tests can't do because they never construct it: the entity picker was declared in the wrong row builder, so opening the editor threw and it silently failed to mount; and a tile with no entity yet — the state of every custom tile the moment it is added — was being discarded as malformed, so the row vanished before there was anywhere to pick anything.
v1.20.0 — soil card works with any probe
The soil card was locked to the Ecowitt integration by its device picker, so a Zigbee, Z-Wave or rtl_433 probe could not be selected at all.
Its device picker is now unrestricted — for most probes, selecting the device is enough. The card also accepts entities by name:
type: custom:ecowitt-soil-card
name: Sunflower bed
moisture: sensor.sunflower_soil_moisture
battery: sensor.sunflower_battery # optionalmoisture alone is a complete config, with device optional, and either entity overrides whatever discovery found.
Testing against a real Tuya TS0601 turned up a latent bug. Third-party probes ship metadata entities beside the readings — battery_type holding "2× AAA", battery_last_replaced holding a date. Matching on name alone, either could claim the battery slot, and "2× AAA" parses to 2, rendering as a critical red 2% battery. It only avoided that here by luck of iteration order, which Home Assistant does not guarantee.
Discovery rules can now require a device_class, so only a real battery sensor can claim a battery slot. The Ecowitt devices classify exactly as before.
Pair a third-party probe with a scale suited to it — its percentage is its own scale and won't line up with a WH51's.
v1.19.1 — plainer wind bearings
A wind direction already means the direction it blows from, so from E 89° said it twice.
Rows now read "Direction E 89°" and "10-min avg NE 44°", and the weather card's inline caption reads "E · 18.4 km/h".
The word was added in 1.15.0 to disambiguate which way the arrow pointed, which was the wrong tool for that job. The needle now does it properly — its tail marks the source and its head the destination, and both markers carry a tooltip — so the text was left repeating a convention the reader already knows.
v1.19.0 — thousands separators
Values were printed with toFixed, so an illuminance of 74300 read as 74300 where Home Assistant itself would show 74,300.
Numbers are now punctuated using your Home Assistant number format (Profile → Number format), so the same reading shows as 74,300 lx, 74.300 lx, 74 300 lx or 74300 lx depending on what you have set. Every reading benefits, since they all pass through one formatter — illuminance, pressure and the longer rain totals are where it shows.
The setting is honoured rather than guessed from the language: someone may run an English UI and still want 1.234,5. And none is a deliberate choice meaning no separators at all, so it is kept distinct from "not set", which follows the profile language.
Decimal places are unchanged — they still come from each entity's display precision.
v1.18.1 — cleaner inline compass
The dashed 10-minute average marker is gone from the weather card's inline compass. At 72px it was a few faint pixels with no row beside it to say what it was — barely visible and unexplained is worse than absent.
It is gated on the same 90px threshold that governs the cardinal letters, rather than the weather card passing null. That keeps one rule about what a small compass can usefully show, in the place that decides how the compass is drawn.
The wind card's 132px compass is unchanged, and the small compass still shows the current direction with its tooltip.
v1.18.0 — the dashed marker explains itself
The faint dashed line on the compass was unlabelled, which is why it had to be asked about. It is the average wind direction over the last 10 minutes, drawn with the same downwind convention as the solid needle.
- The wind card's row is now "10-min avg" rather than "Avg dir", so the window is visible without hovering.
- The matching entry in the metric catalogue reads "Avg direction (10 min)".
- Both compass markers carry a tooltip: the dashed one names the 10-minute average, the solid one says it is the current direction. That covers the weather card's inline compass too, where there is no row to explain it and the marker is barely twenty pixels long.
When the wind is steady the two markers overlap; when it is shifting they splay apart, and the angle between them is a rough read on how variable it is.
v1.17.1 — no hover recolouring
Tappable readings dimmed under the pointer and metric tiles washed their background. On a card whose whole job is showing state, content changing colour reads as the data changing rather than as "this is clickable".
The pointer cursor is now the entire affordance, and nothing on a card recolours on hover.
That also settles an inconsistency predating this change: the wind card's rows never highlighted, while the rain rows and the metric tiles did.
The editor keeps its hover states — inputs, buttons and chips are controls rather than data, and there the feedback is doing real work.
v1.17.0 — every reading opens its history
Tiles and rows opened more-info, but the large readings did not — the temperature, wind speed, rain rate, UV index, soil moisture and indoor climate were all dead to a tap. That's the least discoverable place to have the gap, since the biggest number on a card is the first thing you'd try.
All of them are wired now, along with the smaller lines beside them. Where a line carries two sensors — "Feels 13.4°C · Dew point 9.7°C", or the weather card's "from NE · 18.4 km/h" — each part opens its own entity rather than the whole line opening whichever happened to be first.
Tappable text gets its own hover cue. The tile treatment washes the background, which suits a tile but not a 40px numeral, so text dims slightly instead.
Verified by clicking all 50 targets across the six cards and asserting each fires the entity it advertises, and that a hero reading stays the same DOM node through 30 state updates and a value change while remaining clickable.
v1.16.0 — selectable compass needle
The solid pointer was near enough symmetrical that nothing said which end was the source and which the destination — the reason the direction read ambiguously in the first place.
Two shapes are now available, on the wind card and the weather card's inline compass:
arrow(default) — a hollow ring at the upwind end, a shaft, and a solid head downwind. The two ends are different kinds of object, which is what keeps it readable at the weather card's 72px compass.classic— the original solid pointer.
Pick either from the Compass needle dropdown in the card editor, or set needle: classic in YAML. The option only appears on the two cards that actually draw a compass.
Two further candidates were drawn and rejected: a meteorological wind barb, whose barbs collapse into a scribble at 72px, and a fletched dart, whose tail feathers start to read as a second arrowhead pointing the wrong way — the exact confusion this is meant to remove.