Repository navigation
feat: Chartdeck 2.0, every remaining roadmap chart - #111
Merged
Merged
Conversation
Ring, arc and needle gauges get three extras, all in the Style section of the editor under the style picker (only while a gauge style is chosen): - start_angle / end_angle: where the gauge's arc starts and ends, in degrees clockwise from the top (-90 is the left, 90 the right). Leave either out and the style's usual end is used (ring -180/180, arc -135/135, needle -90/90). The end must come after the start and the sweep can be at most 360 degrees. The drawing is cropped to the arc, so a half-circle arc leaves no empty space below it. - center: what sits in the middle (on the needle, under the hub): the value (as before), the current colour band's label drawn in the band's colour (the value when the band has no label), the entity's name (the name under the gauge is then left out), your own text (center_text), or nothing. - tick_labels (needle only): round numbers along the scale from min to max, the ends always shown, outside the arc and past the target marker. The options are the card's: they are read once when the config is set and carried on each entity, so every gauge on a card is drawn the same way, including entities added by an include rule. With none of them set the gauges draw exactly as before. Unavailable and missing entities keep their status text whatever the centre shows. Closes #46
A new "Funnel" style, under "Parts of a total" in the style picker, draws the card's entities as stages, each as wide as its value against the largest one. It suits values that are each a share of the last: solar produced, then used in the house, then exported. The shape option picks a funnel (first stage on top, each stage narrowing to the width of the next) or a pyramid (first stage at the bottom, the top one coming to a point). Each stage shows its percentage of the first stage, of the stage before, or none (percent_of). Stages take one colour per entity (an entity's own color, else the series palette) or their colour band (color_by: bands), and the percentage switches to dark text on light fills. Names and values sit in a column beside the shape and follow the Show name / Show value switches. An unavailable, missing, zero or negative stage is drawn as an empty dashed outline with its state beside it, and percentages that would divide by nothing are left out. Every stage is a tappable entity, so tap, hold and double-tap actions work as on the other styles. The stages grow in from the centre unless animation is off or the browser asks for reduced motion. All three options are in the editor's Chart section. The small editor helpers (chartForm, cachedSchema, choice) are the same as on the line chart branch. Closes #29
The new radar style draws the card's entities as spokes round a circle,
the first straight up, with a shape joining their values. It is in the
style picker under Comparisons.
Each axis runs from its entity's own minimum to maximum (scale: limits),
so readings in different units, such as CO2 and temperature, still make
a fair shape; scale: shared puts every axis on one scale from 0 to the
largest value instead. Shapes are filled at a fifth of their colour, or
drawn as outlines with fill: false.
Several shapes come from grouping: group_by reads each entity's floor,
area, device or label from Home Assistant's registries, and an entity's
own group text wins ("Ground floor / Kitchen" for two levels). Each group
is one shape in the next series colour, named in a legend under the
chart. Entities then line up on an axis by their own axis name, else
their device class (shown as "CO₂", "Humidity"...), else their name.
Without groups every entity is an axis and its value shows under the
axis label.
An unavailable or missing entity keeps its axis, with its status shown
muted, but gets no point; the shape skips it. Each point is a tappable
entity, so tap, hold and double-tap actions open more-info as usual.
Shapes grow out from the centre on first draw, and not at all with
reduced motion or animate: false.
Everything is in the editor's Chart section: scale, fill, group by, and
a text box per entity for its own group and its axis name.
Shared helpers added for the charts that follow: polar maths
(src/chart/polar.ts), grouping and trees (src/chart/hierarchy.ts),
series colours (src/chart/colors.ts) and the chart editor forms
(src/editor/chart-editors.ts, entity-options.ts, group-fields.ts).
Closes #32
The new polar area style is like a pie where every slice gets the same angle and its length shows the value, which suits comparing like things: power by circuit, or how often the wind blows from each direction. It is in the style picker under Comparisons. Slices go round from straight up, so a wind rose's north sits at the top, with a thin gap between them. By default each slice's length is its share of the largest value (scale: shared), with three dashed rings labelled in the first entity's unit; scale: limits measures each slice between its own entity's minimum and maximum instead, and leaves the ring values off since they would differ per slice. Colour comes from color_by: one series colour per entity (the default), shades of a single colour that get stronger as the slice gets longer (color_by: shades, with color naming a palette colour or any CSS colour), or each value's colour band. Shades are mixed with the card's background, so they work in light and dark themes. Names and values are written round the outside and follow the Display switches. An unavailable or missing entity gets no slice and a greyed label. Slices are tappable entities, so tap, hold and double-tap actions work as on any other style. Slices grow out from the centre on first draw, and not at all with reduced motion or animate: false. The editor's Chart section sets the scale, the colouring and the colour for shades. Closes #33
The new treemap style draws each entity as a rectangle sized by its value,
packed so the rectangles stay close to square (the squarified layout). It
sits in the style picker under "Parts of a total".
Entities can be grouped. group_by picks any of floor, area, device and
label from Home Assistant's registries, nested in that order, so
"floor, area" gives a box per floor holding a box per room. An entity's
own group text wins over group_by, and a slash makes two levels:
"Ground floor / Kitchen". An entity with no area (or floor...) goes under
"Other". Each group gets a tinted box in its own colour with its name and
total along the top when there is room, and its tiles share that colour,
the smaller ones a little fainter. color_by: bands colours every tile by
its current colour band instead.
The drawing is laid out for the card's real width and again whenever the
card is resized. A total sits above the map ("5.9 kW in all"), and on
each group, when the entities share a unit. Entities with no reading
(unavailable or not found) are listed under the map, still tappable;
zero and negative values get no tile. Tiles are tappable entities, so
tap, hold and double-tap actions work as on the other styles. They fade
in on first draw, and not with reduced motion or animate: false.
Everything is in the editor's Chart section: colour, group by, and a
text box per listed entity for its own group.
Shared pieces added for the hierarchy charts: grouping and trees
(src/chart/hierarchy.ts), the squarified layout
(src/chart/treemap-layout.ts), series colours, and the chart editor
forms. The card now redraws on a bare requestUpdate(), as on the line
chart branch, so a resize lays the map out again.
Tapping a group to drill into it comes with the drill-down change (#44).
Closes #34
Two new styles under "Parts of a total" draw the card's entities as a hierarchy, such as house, floor, room and device power. The sunburst draws a ring per level round the total: the first ring is the top-level groups, each sized by its share, and every ring out splits its parent into what makes it up, ending with the entities. shape: half draws the top half only, with the total underneath, for a lower card. A legend under it names the top level with each total. The icicle draws the same hierarchy as columns: the total on the left, then each level to the right, stacked top to bottom by share, with names and values where there is room. The levels come from grouping. group_by picks any of floor, area, device and label from Home Assistant's registries, nested in that order. An entity's own group text wins, with a slash for each level: "Ground floor / Kitchen". An entity without an area (or floor...) goes under "Other". Each top-level group takes the next series colour and its children fade from it level by level, mixed with the card's background so it works in light and dark themes. color_by: bands colours the entities by their current colour band instead. Totals show only when the entities share a unit. Entities with no reading are listed under the chart, still tappable; zero and negative values take no space. Every entity's arc or cell is tappable, so tap, hold and double-tap actions work as on the other styles. The chart draws in on first show, and not with reduced motion or animate: false. Everything is in the editor's Chart section: shape, colour, group by, and a text box per listed entity for its own group. The grouping, tree and polar helpers are the same files as on the treemap and radar branches. Closes #35
…it up
Tapping a group now opens it: the chart redraws with that group as the
whole, so a treemap of the house becomes a treemap of the kitchen, and a
sunburst's "Ground floor" segment becomes a sunburst of its rooms. A row
above the chart gives a back button named after the level above ("All",
"Ground floor") and the group being shown with its total. Back goes up
one level at a time.
What can be tapped: a treemap's group boxes (their name strip and
border), a sunburst's group segments and its legend items, and an
icicle's group cells. Entities themselves keep their tap, hold and
double-tap actions. Groups work from the keyboard too (Enter or Space),
and screen readers hear "Kitchen, 1.8 kW. Show what makes it up".
Colours stay put while drilling: the parts of a group keep the colour
that group has on the whole chart. Where a card has been drilled to is
kept while its entities update; if that group disappears (its entities
were removed, or the grouping changed), the card goes back to the
deepest group that still exists.
drill_down: false turns it off. It is a switch in the Chart section of
all three charts, on by default.
The drilling itself lives in src/chart/drill.ts, so other charts that
group their entities can use it. This branch includes the treemap and
sunburst/icicle branches, which it builds on.
Closes #44
…e options in The gauge options (start_angle, end_angle, center, center_text, tick_labels) were checked on every card, so center: total on a rings or pie card was rejected as not a gauge centre mode. They are now only read for the ring, arc and needle styles.
A new chart style, "Grouped bars" (`style: grouped_bars`, under Comparisons in the style picker), draws horizontal bars for comparing categories with several values each, such as energy per room split by device, or today against yesterday per sensor. Each entity is one bar. An entity's "Row" (`group`) puts it in a row with the other entities of the same row; one without a row gets its own, under its name. Its "Series" (`series`) names what it is (Today, Heating...): series share a colour across rows and are listed in a legend under the chart. "Bar colour" (`color`) overrides the series colour. These three are in each entity's own options in the editor, through a new registry hook, `entityFields`, that lets a chart style add per-entity fields there. The Chart section sets `mode`: side by side (default), stacked, or stacked to 100 % of the row, and `color_by`: one colour per series, or each bar in its current colour band. All rows share one scale, taken from the data and always including zero. Negative values run left of a zero line; in a stack, positives run right and negatives left. Stacked rows show their total, 100 % rows show each segment's share inside it when there is room, grouped rows label each bar. The card's sort orders rows by their total and rows slide to their new place as values change (no motion with reduced motion or animate: false). Bars keep their colours and order within a row whatever the sort. Unavailable and missing entities draw no bar but keep their row and say why. Every bar is tappable with the entity's actions. Shared pieces for the comparison charts live in src/chart/compare.ts (scale maths) and src/chart/compare-form.ts (the editor helpers the line chart keeps in chart-editors.ts, which this branch does not have yet). Closes #24
Two new chart styles in the "Comparisons" group of the style picker.
Bullet draws one row per entity: the name (with "target 18 kWh" under it
when the entity has a target), a track from the entity's min to max with
its colour bands as ranges behind the bar, the value bar, a line at the
target, and the value on the right. The ranges are grey shades that get
deeper band by band, or the bands' own colours, faint ("Ranges behind the
bar" in the editor's Chart section, `ranges: shades | colours`). The bar
takes the colour of the band the value is in. Targets can be a number or
an entity, as for the other styles.
Lollipop draws a stem with a dot at the value for each entity, upright in
columns over a shared baseline (value above, name below) or across in rows
("Direction" in the Chart section, `orientation: vertical | horizontal`).
A target shows as a hollow ring on the stem's line.
Both use each entity's own min and max, like the bar styles, so values
below zero grow left of (or below) the zero point when min is negative.
Every entity is its own element with tap, hold and double-tap actions and
a meter role for screen readers. Unavailable and missing entities keep
their track but draw no bar, dot or target, and say what is wrong where
the value goes. The marks grow in like the bar styles and stay still when
the browser asks for less motion.
src/chart/compare.ts and src/chart/compare-form.ts are shared helpers
for the comparison charts; compare-form.ts matches the line chart's editor
helpers and can go once both are on main.
Closes #38
A new "Waterfall" style (Parts of a total) draws each entity as a step that lifts or lowers a running total, joined by dashed lines at the running level, with an end bar showing where the steps finished. By default a step is how much the entity changed over the chart's period (its last reading less its first), read from history or long-term statistics like the line chart. "steps: current" uses each entity's current value instead, for sensors that already hold a part (this month's cost of heating), and then no history is loaded. "start_from_first" turns the first entity into a Start bar from its reading at the start of the period, for "battery charge through the day". An entity marked "invert" counts down, for meters that count energy used. "total: false" leaves the end bar out, and "orientation: horizontal" draws rows instead of columns. Rises are green and falls red from the theme; start and end bars use the primary colour. A step with no number (unavailable, missing, or no readings in the period) adds nothing and is drawn as a dashed outline with its state. Bars and names open the entity like any other card part; the end total is not an entity. Bars grow in unless motion is reduced. Everything is in the editor's Chart section: period, source, what a step is, direction, start and total, then a "Counts down" switch for each listed entity. Closes #26
A new "Slope" style (Comparisons group in the style picker) draws one line per entity from its value at the start of the period to its value now, so it is easy to see which went up and which went down. Values come from history or long-term statistics, with the same period and source options as the line chart. With "Compare: how much it rose in each period" (measure: change) it is made for meters such as energy totals: the left end is how much the reading rose over the previous period and the right end how much over the latest one, so a one-month period gives "this month vs last month". The card loads twice the period for this; months step back by calendar month. A meter that resets inside a period gives a wrong rise, which is not corrected. Lines are coloured by direction (a rise red and a fall green, or the other way round with "A rise is: good"), or by group: each entity can set a group in its own options in the editor, entities in a group share a colour (an entity's own colour wins) and a legend lists the groups. The headings say "24 hours ago | Now" or "Previous month | Last month", the shared unit sits between them (or goes on each value when units differ), and the right-hand labels show the change in per cent, hidden on narrow cards. Labels are pushed apart so they never overlap; the dots stay at the true values. An entity with no reading at one end gets a lone dot; one with neither is left out; with nothing at all the chart says there are no readings. Every line, dot and label belongs to its entity's element, so tap, hold and double-tap actions work on any of them. Chart styles can now declare per-entity options (entityFields), which the entities editor shows in each entity's options. Small comparison maths shared with the other comparison charts lives in src/chart/compare.ts. Closes #28
A new "Dumbbell" style in the Comparisons group draws one row per entity with its values as dots on a shared axis, joined by a bar. What the dots are is chosen with `ends`: - range (default): the lowest and highest reading over the period, from history or long-term statistics (their min and max count), with the current value marked between them as a ring (`show_now`, on by default). The range is stretched to take in the current value, which can be newer than the last stored reading. - then: the reading at the start of the period against the current value, e.g. now against a week ago. With statistics, whose first row can start after the period does, the first reading stands in. - target: the entity's target (a number or an entity) against the current value, for set point against actual. This mode loads no history and draws straight away. `orientation: vertical` draws columns instead of rows. The axis has round tick values; the unit is shown once, beside the legend, when every entity shares it, and narrow cards show every other tick label. Low is drawn in the theme's info colour, high in its error colour, the start of the period in grey, and a target or the current value in range mode as a hollow ring; otherwise the current value takes the entity's colour band. Every row is the entity's tap target, with a spoken description of its values. Unavailable and missing entities keep their row with their status text. Loading and failed history use the same messages as the line chart. In the editor, the Chart section sets what to compare, rows or columns, the period and source (hidden for a target) and the current-value mark (range only). src/chart/compare.ts holds round-tick and reading-at-a-time maths shared with the other comparison charts. Closes #27
… those charts read They read a rolling span (how far back, and from history or statistics). The shared history fields now also hold calendar spans, offsets, previous/next buttons and grouping, which these charts ignore, so their editors use a rolling-only form. Also moves the slope chart's per-entity options to the function form every chart uses.
A new history style, `range_area`: a shaded band from each period's minimum to its maximum, with the average drawn as a line through it (`mean`, on by default). Daily temperature range over a month, or min/max humidity per day. It reads long-term statistics by default, since Home Assistant already keeps each hour's (or day's, month's) min, mean and max. Grouped by day, week or month, each group's band runs from the lowest of its rows' minimums to the highest of their maximums. History works too: it has no spread per reading, so a history range area is grouped (by hour up to two days, else by day) and each group spans the values held in it. Gaps in the data break the band. The tooltip shows "low - high" and the average. The shared history frame gained an opt-in that asks the recorder for min and max and keeps them on grouped points; charts that don't ask are unchanged. Editor: Chart section has the period, source (Statistics by default) and grouping, Line shape, "Draw the average as a line" and its width, then axes and layout. Each entity has its own Colour, Line shape and Dashed. Closes #13
A new history style, `sparkline`: one row per entity with its name, a small chart of its recent history with no axes, and its current value. A row per sensor showing its last 24 hours, in the space of a 1.0 bar row. - `spark: line`, `area` or `column`, for the card or per entity. Each row is scaled to its own readings, gaps break the line, and a column sparkline that isn't grouped is grouped by hour (two days or less) or by day so its columns aren't hairlines. - `bar: true` puts the 1.0 thin bar (current value between min and max, in its band colour, with the target) under the name and value, with the sparkline beside it. This is an option on the sparkline style rather than on the bar styles because those draw one entity at a time without access to history; this style loads every row's history in one call. - Rows are coloured like the 1.0 bars (the value's band) unless an entity sets its own colour, and every sparkline lines up across rows whatever the width of its value. - Each row opens more-info (and takes the card's actions). Unavailable and missing entities keep their row and say so. - The shared period options apply: period, previous/next, source and grouping. Editor: Chart section has the period, Sparkline (Line, Area, Columns), Line shape, Line width and "Bar under the name and value". Each entity can pick its own kind and colour. Closes #14
A new "Streamgraph" style (Parts of a total in the style picker) stacks each entity's history as a stream, so it is easy to see how, say, each device's share of the house's power changed through the day. It uses the same period, source, grouping, axes, tooltip and layout options as the line chart. Shape (baseline) picks how the stack sits: - wiggle (default): the classic streamgraph. The centre line moves so the streams' slopes are as small as they can be overall (Byron & Wattenberg), then the whole stream is centred. - centre: the stack centred on a straight line. - share: each moment scaled to 100 %, for the share of the total over time. - zero: an ordinary stacked area from zero. On wiggle and centre the value axis means nothing, so value labels, lines across and the value range are hidden (and left out of the editor). Share runs 0 to 100; zero starts at zero. Readings are cut into even slices across the period (about one per 4 px), each the time-weighted average of the history in it, or the mean of the statistics rows in it (never finer than the rows themselves). Grouped readings are one slice per group. Gaps, and negative readings such as power going back out, count as nothing: a stack can't show less than nothing. Order "biggest in the middle" (default) puts streams that peak early in first, each on the lighter side, so the edges stay calm; "as listed" stacks the first entity at the bottom. Edges can be smooth, straight or steps. The thickest streams get their name and value (or share) on them, placed so they never overlap; hovering lists every value, top of the stack first, with shares and a total. Each stream opens its entity like any other card item, and each entity can set its own colour in its options. All options are in the editor's Chart section: Shape, Order, Edges, Names on the streams, plus the shared period, axes and layout fields. The stacking maths is in src/chart/stream.ts. Closes #30
A new "Candlestick" style (History charts in the style picker) draws one candle per hour, day,
week or month for the card's first entity: the box runs from where the period opened to where it
closed, the wick from its highest to its lowest. A candle that closed at or above its open is
drawn in the "rose" colour (green unless set), one that closed lower in the "fell" colour (red).
It suits an electricity price per day, or a day's temperature.
Candles come from long-term statistics by default (Home Assistant only keeps 10 days of full
history), with a last-14-days period. Daily candles are built from hourly rows: the open is the
first hour's average, the close the last hour's, and high and low the highest and lowest the
statistics recorded. Hourly candles use five-minute rows; weeks and months use daily rows when
Home Assistant's time zone is the card's. With history as the source, the open is the value held
as the period began and high and low are every value that held in it. A period with no readings
has no candle.
Any other entities are drawn underneath the candles, in a strip at the bottom, as columns
(default) or a line, each scaled to its own largest value and grey unless given a colour. They
are combined per period like grouped readings on the line chart ("combine readings with"), so a
meter set to "change" shows how much was used each day.
Hovering shows the period, its open, high, low and close, and the values underneath. Candles open
the first entity's more-info (or its tap action); the strip opens its own entity. Period
navigation, axes, gridlines, the hover box and compact layout work as on the line chart.
Everything is in the editor's Chart section: the period, "One candle per", how the entities
underneath are combined, the rise and fall colours, columns or a line underneath, and the shared
axes and layout fields. Candle maths is in src/chart/candles.ts.
Closes #31
A new "Violin" style (Distributions in the style picker) draws the shape of each entity's
readings over the period: wide where the readings spend most of their time, narrow where they
rarely go, with a box marking the median and the middle half. It answers "how warm does the
bedroom usually get" better than a line through every reading.
Shape "raincloud" draws half a violin as a cloud, the box just beneath it, and every reading as
a dot falling below. A plain violin can scatter its readings over the shape too ("Every reading
as a dot"), and the box can be turned off. Direction "Up" stands the shapes up side by side
instead of one row each. "One shape per" can split each entity by day, week or month, so a
month of nights becomes a row of violins, one per day.
The shape is a kernel density estimate: a smooth bump for each reading, added up. How wide the
bumps are (the smoothing) follows Silverman's rule of thumb from the readings' spread and count,
never finer than the sensor's own step so a sensor that reports in 0.5 degree steps doesn't make
a comb. It can be set by hand in the entity's unit. History records changes rather than samples,
so each value counts for as long as it held: a room that sat at 20 degrees all night and
flickered to 21 a few times was at 20. Grouped readings and statistics rows count once each.
The median and quartiles are weighted the same way.
Each row is named with its median; hovering shows the median, the middle half, the lowest and
highest and how many readings there were. Names open their entity. An entity with no readings
keeps its row, marked "No readings". Value labels, lines and fixed lowest/highest values are
options, and the usual period, source, grouping and compact settings apply. Everything is in
the editor's Chart section.
The distribution maths (weighted readings, quantiles, bandwidth, density) is in
src/chart/density.ts and the shared category layout (rows or columns along a value axis, the
hover box) in src/chart/category-plot.ts, both used by the beeswarm chart too.
Closes #36
A new "Beeswarm" style (Distributions in the style picker) draws each entity's readings as dots along a value axis, one row per entity, packed side by side so no two overlap. Where the dots pile up is where the readings were. "Place each dot by: the time of day it happened" puts each dot at its clock time on a midnight to midnight axis instead. For motion sensors, doors, switches and lights each dot is a time it turned on, so a week of hallway motion shows when the house is busy. To make that possible, history now reads "on" as 1 and "off" as 0 (they were gaps before); a line chart of a binary sensor therefore draws a 0/1 line where it said "No readings". Coming back on after being unavailable is not counted as a new event when it was on before, so restarts don't add dots. "Bigger dots for bigger values" sizes each dot by its reading, from small at the row's lowest value to full size at its highest, by area. Direction "Up" stands the rows up as columns. Dot size is set in px. Value labels, lines and fixed lowest/highest values work as on the violin. Dots are packed in screen pixels so they stay round: in order along the axis, each takes the free spot nearest its row's line. A row too busy for its height is packed again with smaller dots, and if that still doesn't fit the swarm is squeezed into its row (dots overlap rather than spill into the next one). Rows show at most 400 dots, evenly sampled; the count under the name is always the full one and the hover box says how many are drawn. Hovering also shows the median, middle half and range, as clock times on a time-of-day axis. Each row opens its entity. Everything is in the editor's Chart section. Packing is in src/chart/swarm.ts; readings and the shared row layout come from src/chart/density.ts and src/chart/category-plot.ts (also used by the violin chart). Closes #37
…ankey chart
The new "Sankey (flow)" style (group "Parts of a total") draws each of the
card's entities as one flow between two named nodes, from live values (no
history). Each entity gets "Flows from" and "Flows to" in its options in the
editor (`from:` and `to:` in YAML), plus an optional "Flow colour":
style: sankey
entities:
- entity: sensor.solar_to_house
from: Solar
to: House
- entity: sensor.grid_import
from: Grid
to: House
- entity: sensor.heat_pump_power
from: House
to: Heat pump
Nodes come from the names. A node's value is the larger of what flows in and
what flows out, and its column is the longest path to it from a source, so a
node that only receives (a battery or export fed straight from solar) stays
in the middle rather than being pushed to the far right. Columns share one
height scale, set by the fullest; band widths are proportional to the flow,
and bands leave and arrive in the order of the nodes at their other end so
they cross as little as possible. Bands are filled shapes, not wide strokes,
so a thick band between close columns keeps clean edges.
Labels give each node's name and total, with the first flow's unit and
decimals: left of the first column, right of the last, and above a middle
node that has flows in and out ("House 3.9 kW"). Long names are cut short
with an ellipsis and values dropped where they would not fit, so nothing is
clipped on a 320 px card; labels in a column are moved apart so they never
overlap. The Display name and value switches hide either.
Colours follow the theme: nodes take the series colours in order. With
"Colour flows by" (link_color, Chart section) on auto, a band takes its
source's colour, or its target's when the source is itself fed (each circuit
out of the house in its own colour); source and target force one or the
other. A flow's own colour paints its band and the node it is coloured by.
Tapping, holding or double-tapping a band runs that entity's actions.
Hovering or focusing one raises it, dims the rest and shows "From → To
value" in the card's tooltip. The drawing is role="img" with a label listing
every flow, and fades in unless animation is off or reduced motion is asked
for.
Zero, negative, unavailable and missing flows draw nothing (a negative value
counts as 0); when nothing flows the card says so, and when no entity has
both ends it says how to add them. A setup where flows go round in a loop is
rejected with the loop named ("Flows can't go round in a loop: A → B → A");
at draw time any flow that would close a loop is skipped rather than failing.
A new history chart, `style: timeline`, for entities whose states are words. Each entity gets a row of coloured bars, one per stretch of time it spent in one state, across the card's period, with the shared time labels, period buttons and hover tooltip (the time, each row's state and how long that stretch lasted). Bars that are wide enough say the state, how long it lasted, or both (`bar_labels`). A legend above lists the states drawn. Rows given the same `group` are drawn together under a heading. A dashed line marks now when the period runs past it. New states are added live as they happen, without reloading. Colours: the card's `state_colors` first (a palette name or any CSS colour), then the theme's `--state-<domain>-<state>-color` when it has one, then defaults for common Home Assistant states (on amber, home green, heat orange, cool blue, …), with quiet states (off, idle, closed, away, docked…) drawn faint grey, and any other word given a colour picked from the word, so it matches on every row. The history loader gains text series: `SeriesRequest.text` keeps the words in `Point.s` instead of turning them into gaps, on load and on live updates; their key ends in `|text`. Number charts get exactly what they did before. `historyFrame` takes a third argument to ask for them. The same loader change is on the climate chart branch. Edge cases: unavailable and unknown are gaps (the empty track shows). A row that is all numbers with more than eight different values is a measurement, not states, and says a line chart suits it instead of drawing a sliver per reading. Statistics keep no states, so `source: statistics` and `group_by` are refused. In the editor's Chart section: the period, text on the bars, time labels, lines down, the tooltip, compact, whether to show the legend, and a list of state colours (add, rename, recolour, remove; a new row starts from a current state). Each entity's options have its group. Closes #25
A new history chart, `style: climate`, for one climate entity. It draws the room temperature (`current_temperature`) as a line, the set point (`temperature`) as a dashed stepped line held until it changes, and, for heat/cool thermostats, the `target_temp_low` and `target_temp_high` lines with a faint band between them. While the thermostat is running (`hvac_action`) the chart is shaded: heating and preheating in Home Assistant's heat colour, cooling and defrosting in its cool colour, drying in its dry colour, and fan-only when asked. Idle and off are not shaded. The row above shows the room temperature, the set point (or "19.0 – 24.0 °C") and what it is doing now; the hover tooltip shows the same at the guide. It is its own style rather than a line-chart preset because one entity becomes four number series plus a series of words drawn as shaded spans, which the line chart's one-entity-one-series model doesn't fit. It reuses the shared history machinery, so periods, previous/next, axes, gridlines, a fixed value range, the tooltip, compact and header placement all work as on the line chart. All five attributes load in one history call. The loader gains text series: `SeriesRequest.text` keeps the words in `Point.s` instead of turning them into gaps, both on load and when live states are appended. Number series are unchanged; a text series' key ends in `|text`. Edge cases: only the first entity is drawn (one thermostat per chart). An entity that isn't `climate.*` shows its state and says to pick a thermostat. An unavailable one says so in the row above and still draws its past. A set point that disappears (mode switched to off or to heat/cool) ends there. `source: statistics` and `group_by` are rejected, since statistics don't keep attributes. Temperatures use the card's unit and decimals, else Home Assistant's temperature unit and one decimal. In the editor's Chart section: show the set point, shade while heating or cooling, shade while only the fan runs, the line shape and width, and the temperature, set point, heating and cooling colours (empty follows the theme), with the usual period, axes and layout options. Closes #59
The new wind rose style (style: wind_rose, under Distributions in the style picker) reads two entities: the first is the wind direction, the second the wind speed. Direction can be degrees or compass points (N, SSW, "north-east", any case); anything else is skipped. Without a speed, or when the speed has no readings, the petals show only how often the wind came from each way. By default it covers the last 30 days of history. Each direction is paired with the speed in effect at the same moment: both sensors hold their value until they change, a new stretch starts whenever either changes, and each stretch counts for as long as it lasted. Counting rows would favour gusty spells, which report more often. Long-term statistics can be used instead (hourly means, with the hour's max as the strongest speed); the editor warns that an hourly mean direction is only right across north for sensors recorded as angles. Readings fall into 16 sectors (or 8 or 4) centred on north, so with 16 the north sector runs from 348.75 to 11.25 degrees. Speeds below calm (0.5 m/s by default, or the same in km/h, mph or knots) count as calm and are left out of the petals. Petal length is the share of the time, stacked from the centre by speed band: 0-3-6-9-12+ m/s, with bands that start at Beaufort 3 to 6 in km/h, mph and knots. Colour bands set in the Colours section replace the speed bands and their colours. The default colours run light to dark from the theme's primary colour, and turn round in a dark theme so strong winds still stand out. Beside the rose (below it on a narrow card) are the prevailing sector and its share, mean speed, strongest speed and calm share, then the speed legend. Hovering or focusing a petal shows its share split by speed band. Tapping a petal opens the direction sensor; tapping the speed figures opens the speed sensor. Petals grow out from the centre, and don't with reduced motion. Compact, previous/next period buttons and the tooltip switch work as on the line chart. The history loader learned to read a series as bearings, so compass text loads and updates live as degrees; other charts are unchanged.
…e hour
A new history chart, `style: day_clock` ("24-hour clock" in the picker, under
History charts). A round dial with midnight at the top and the day running
clockwise, 00/06/12/18 labels (12-hour labels when the profile or language
uses a 12-hour clock), and one ring per entity, the first outermost.
State entities (switches, lights, binary sensors, climate, people, covers…,
or anything with its own `active` list) get arcs for the time they spent in
an active state, over a grey track. By default on, open, home, playing,
heating, cooling and similar count as active; each entity's "Counts as on"
option (`active`, one state or a list) replaces that. Climate entities follow
what they are doing (`hvac_action`), not their mode. Unavailable and unknown
leave a gap.
Numeric entities get short radial bars, one per hour (or per 15 or 30
minutes with `bucket`). A bar is the hour's time-weighted mean, or for a
meter (state_class total_increasing) how much it went up; the card's shared
`aggregate` option overrides that.
By default the clock shows today from midnight in Home Assistant's time zone,
with a hand at the current time, the rest of the day dimmed, and a redraw
each minute (stopped when the card leaves the page). `days: 7` instead shows
the average day over the last 7 days: arc strength is the share of days each
minute was on (counting only days it was recorded and had happened), and
bars are the mean across days. `period.offset` and `period.navigate` step
back a day (or N days) at a time.
The middle shows the first state entity's time on ("4 h 10 m", "Heating
on"); `center: now` shows the time and the first entity's state, `center:
none` nothing. The legend beside the dial (below it on narrow cards) gives
each ring's time on and how often it switched on, or its total and busiest
hour, then the current time and state. Hovering, touching or focusing an
arc shows its start, end and length; a bar shows its hour and value.
Clock changes: the dial is always 24 hours of wall clock. On the 23-hour day
the skipped hour stays empty and an arc across it keeps its real length; on
the 25-hour day the repeated hour draws over itself, and its two bars are
added together (totals) or averaged (levels).
The shared history loader can now keep states as words (`text` series), the
same change as the state timeline's, so both charts load the same way.
Everything is in the editor: the Chart section has days, periods back, the
previous/next buttons, the middle, the bar length, how bars combine and the
tooltip; each entity has its colour and which states count as on.
…s history A new history style, `style: trend`, after mini-graph-card: the name and icon, the current value in large type, and a graph of the last 24 hours filling the bottom of the card edge to edge. It sizes like a tile (half a sections row) and the graph keeps its shape as the card resizes. Everything mini-graph-card does, under Chartdeck's names where one exists: - Graph: `graph: line | bar | none`, `fill: fade | solid | none` (true and false also work; fade is the default), `curve: smooth | straight | step`, `line_width`, `height` (per 500 px of width, as mini-graph's), `bar_spacing`. - Detail: `points_per_hour` (0.5 by default; 0 draws every reading) with `aggregate`, card-wide or per entity. `period`, `source: statistics`, `group_by` and previous/next buttons come from the shared history options. - Colour: the colour bands colour the line and fill by value, blended or changing at each band (`color_transition: smooth | hard`); an entity's own `color` wins. `color_icon`, `color_name` and `color_value` take the current colour. - Dots and labels: `points` and `labels` (the highest and lowest reading, as pills over the corners) are `hover`, `always` or `never`. - Range: `y_min` / `y_max` take a number or a soft `~N` that gives way to readings past it; `min_range` stops small wobbles filling the graph. Each has a `_secondary` twin for entities on the right-hand axis. - `extrema` and `average` add min / avg / max (with times) under the value. - Layout: `align_header`, `align_icon` (left, right, or beside the value), `align_state`, `font_size`, `font_size_header`, `icon_image`, and `group: true` to drop the card's background inside another card. - `value_factor` scales readings and the value by a power of ten. - Per entity: `y_axis: secondary`, `aggregate`, `fixed_value` (the current value as a flat line), `show_state` (a small value beside the main one), `show_indicator`, `show_graph`, `show_line`, `show_fill`, `show_points`, `show_legend` and `show_legend_state`. With two or more entities a legend sits above the graph; tapping an entry opens it. It is drawn like the other history charts rather than like mini-graph-card: the area chart's fill fading from 42 % to 5 %, the 2.5 px line, the column chart's rounded columns growing in, the guide line and ringed dot on hover, the series header's swatches for the legend, and high / low labels and Low / Average / High chips tinted with the series colour. Improvements over mini-graph-card: hovering or dragging along the graph puts the value at that moment (and its time) in place of the current one; the smoothing never overshoots a reading; unavailable stretches stay gaps; a bar takes its own value's band colour; bars stand on zero; long periods can read long-term statistics; and every option is in the visual editor. Not carried over: `state_map` (needs text states in history), `logarithmic` (on the log-scale branch), `hour24` and `cache` (Home Assistant's locale and Chartdeck's history store cover them), `show.state: last`. Editor: the Chart section has every card option; each entity's options have the per-entity ones. A chart style can now set its own sections size (`gridOptions`), used here for the half-width tile.
Restores ChartStyleModule.gridOptions, lost when the style registry was merged.
…an overview strip Two new switches in the Chart section of the editor, after the tooltip one: - "Zoom and pan" (`zoom: true`). With a mouse, drag across the chart to zoom into that stretch; once zoomed, drag to pan. Ctrl (or Cmd) + scroll zooms about the pointer, and a trackpad pinch does the same because browsers send it as Ctrl + scroll. A plain scroll is left to the page, so a dashboard still scrolls over the chart; sideways or Shift + scroll pans once zoomed. On a phone or tablet two fingers pinch and pan, keeping the moment under each finger under it; one finger still reads values with the tooltip, and an up-and-down swipe still scrolls. - "Overview strip below the chart" (`overview: true`). The whole period drawn small under the chart with the zoomed window over it: drag the window to move it, its edges to resize it, across the strip for a new one, or tap beside it to centre it there. It works on its own too, for zooming only through the strip. The window can be focused and moved with the arrow keys, zoomed with up/down or + and -, and reset with Escape; screen readers hear the times it shows. A "Reset zoom" button appears in the chart's top corner while zoomed (an icon only on a compact card); a double click or double tap does the same. Zooming fits the value axis and the time labels to what is on show, and draws the readings in the window at full detail rather than the thinned whole period. The zoom is kept on the card, not in its config. It is held as a share of the period, so a live chart keeps the same window as time moves on, and it starts again from the whole period when the previous/next buttons step to another one or the period, grouping or source changes. The narrowest zoom is two groups for grouped readings, else five minutes. The tooltip steps aside during a drag or pinch and comes back on the next move. The gestures, maths, overview strip and their styles live in src/chart/zoom.ts, and chartArea takes the gestures, extra plot classes and a row under the plot, so the area and column charts can adopt it with a few lines (see zoomView, zoomGestures, overviewStrip). The editor fields are ZOOM_FIELDS / ZOOM_SCHEMA in chart-editors.ts. Closes #40
… on a history chart
A line chart can now carry annotations, set up in the editor's Chart section
under "Annotations" (one form per annotation, a remove button on each, and
buttons to add one of each kind) and written as an `annotations:` list:
- `type: line` draws a horizontal line at a value: a number, or an entity
whose state is the number (an input_number target, a setpoint sensor).
Dashed unless `dash: false`. The value axis widens to include it, so a
threshold off the readings' range is still on show.
- `type: band` shades a band of values between `from` and `to` (numbers or
entities); leave either out to run to the chart's edge.
- `type: time` draws a vertical mark at set times: "07:00" marks every day at
seven in Home Assistant's time zone, "2026-10-28 07:00" marks that moment
once, and ISO times with an offset are taken as written.
- `type: state` marks each time an entity changed to a state ("on"), or every
change when no state is given, and with `shade: true` also shades the
stretches it spent in that state - "heating on" across a temperature chart.
Its states load with one history call of their own, are kept up to date
from live states like the readings are, and are simply left off while they
load or if loading fails.
- `type: point` labels the highest, lowest, latest or first reading of a
series (the first series unless `entity` names another), with a dot, the
value and an optional label before it.
Every annotation takes a `label` and a `color` (a palette name or any CSS
colour; each kind has its own default). A new switch, "Shade the severity
bands behind the chart" (`zones: true`), draws the card's severity bands as
faint zones behind the readings.
Labels of time and state marks from every annotation share two rows along the
top of the chart; one that would overlap another is left out (its line stays,
and each label's tooltip gives its time), and above 60 marks only the lines
are drawn. An annotation whose entity is unavailable or missing is skipped
without upsetting the chart, and a change to any entity an annotation reads
redraws the card.
Drawing, validation and the maths are in src/chart/annotations.ts
(annotationLayers returns what goes behind the data, in front of it, and over
it), and the editor list in src/editor/annotations-editor.ts, so the area and
column charts can take them with a few lines.
Closes #41
…ing ones hidden The line chart's "Show values on the points" switch used to label every reading and give up entirely past 40 of them, so a busy chart had no labels and a quiet one had them piled on top of each other. Value labels are now a shared feature with three more options, shown in the Chart section under the switch once it is on: - "Which readings" (`labels_show`): all of them (the default, as many as fit), the latest, the highest and lowest, or the first and latest. - "Label position" (`labels_position`): above peaks and below dips (`auto`, the default), above, below, or on the point (`center`, for columns and bars). - "Let labels overlap" (`labels_overlap: true`): off by default, so a label that would land on another is left out. Placement is greedy and in pixels: each series' latest, highest and lowest readings are placed first so they survive on a crowded chart, then the rest in time order; a label that doesn't fit on its side tries the other, and is hidden if neither works or it would leave the plot. Labels near the left or right edge line up with it instead of running off. Each label has a thin underline in its series' colour, so labels of two series can be told apart. With overlapping allowed, a series of more than 40 readings still gets none, as before. Carried values at the chart's edges are still never labelled. The choice and placement live in src/chart/data-labels.ts: dataLabels takes the series and a layout that says where a reading sits, so the column chart can pass the top of a column, and sliceAnchor plus placeLabels give a pie or donut its slice labels. The editor fields are LABEL_FIELDS and labelSchema in chart-editors.ts. Closes #42
…e others Give several chart cards the same group name in "Sync group" (Chart section, `sync: house`) and they share one time axis: - Hovering or touching one chart shows the guide, a dot on each series and the tooltip on every chart in the group at that same moment, so a temperature, a battery and a power chart can be read together. The guide goes at the exact moment, not snapped to each chart's own readings, so the guides line up; each chart's values are its readings nearest to it. A chart's own pointer wins over another's, and a moment outside a chart's span shows nothing there. - Stepping back or forward with the previous/next buttons steps every chart in the group that has the same period and its own buttons. Charts covering a different period (the last 24 hours and the last 7 days) keep their own. Charts find each other through one window event, so they can sit anywhere on the dashboard (stacks, grids, different columns) without being wrapped in anything. Each card listens only while it is on the page and in a group, and ignores its own messages and other groups'. A card notices its own changes when it draws, so a mouse leaving, a finger lifting and the tooltip's linger timer all reach the group. The bus is src/chart/sync.ts: syncChart(ctx, frame, hoverTime) is the one call a chart makes from render, and it also carries a "zoom" message with an onSync hook, ready for zoom (#40) to share its window once both are merged; that last step is left for then, as zoom isn't on this branch. Closes #43
Turn on "A small chart for each entity" in the Chart section (`multiples: true`) and a line chart becomes a grid of small charts, one per entity, so many sensors can be compared at a glance instead of tangled on one plot. - They share the time axis, and by default the value axis too, so heights compare directly; "Value scale: each chart its own" (`multiples_scale: independent`) fits each to its own readings instead. - "Columns" (`multiples_columns`, 1 to 6) sets how many go across; left empty, the card fits as many as it can at about 150 px each. A set number drops to fewer before a chart would get narrower than 110 px. - Each chart's title is its entity's colour, name and value, and acts like the header did: tap, hold and double-tap actions work on it, and the Display switches for name and value hide those parts. The period and its previous/next buttons stay above the grid. - Pointing at any of them puts the guide on all of them at that moment, and every title shows its reading then; the tooltip box shows only on the chart under the pointer. - An entity with no readings in the period (unavailable, missing) shows "No readings in this period." in its own place without upsetting the others. It is a layout option rather than a style of its own, so every history chart option (periods, grouping, curves, widths, dots, band colours, labels, compact) carries over. The grid is src/chart/multiples.ts: multiplesGrid takes a function that draws one series into its plot, so the area and column charts can offer it the same way. To do that, the line chart's drawing moved into one function used for the single chart and each small one, and plotAxes now takes the width it is drawn at. Closes #45
…chart
A line chart can now put a ringed dot at each series' highest and lowest
reading in the period, labelled with the value and when it happened
("High 14.2 °C · 14:10"), and show each series' average either as a dashed
line across the chart labelled "Avg 8.6 °C" at its right end, or as a figure
only, in the plot's top-right corner.
extremes:
max: true
min: true
average: line # none (default), line or figure
entities:
- sensor.outside
- entity: sensor.inside
extremes: false # no marks for this series
The time is a clock time when the period is a day or less and a date with
the time beyond that; grouped readings name their day or month. It follows
the user's language, 12/24-hour clock and time zone setting.
Highs and lows ignore unavailable stretches and the reading carried in from
before the period (it was taken earlier); on a tie the earliest wins, so the
value carried on to the right edge never beats the reading it repeats.
History readings arrive irregularly, so their average is weighted by how
long each value held, up to now. Grouped readings and long-term statistics
are one per equal period, so they get a plain mean.
Labels prefer above the high and below the low, flip when they would leave
the plot or cover another label, a dot or a header laid over the chart,
step one label further out on a crowded chart, and hold against the left or
right edge instead of running off it. They fade in with the line, so
reduced motion shows them at once.
The maths, the label placing and the drawing live in src/chart/extremes.ts,
which any history chart can use: it hands back the SVG average lines and the
HTML overlay.
In the editor: Chart section, "Mark the highest reading", "Mark the lowest
reading" and "Average". While any is on, each entity's options get "Mark
highest, lowest and average" to switch one series off.
Closes #57
`y_scale: log` puts the value axis on powers of ten, for readings that span several orders of magnitude: light from a dim room to full sun, network traffic with spikes. It is in the Chart section of the editor as "Value scale" (Even steps / Logarithmic), with the other axis options, so every history chart drawn through the shared axes gets it. Labels go at each power of ten. Within a decade or two they go at 1, 2 and 5 (or every step for a narrow span); across many decades every other or every third power of ten is labelled, counting from the bottom. The steps between labels are drawn as fainter gridlines. Ends that are not fixed move out to the next labelled step; y_min and y_max are kept exactly. Small ticks get the decimals they need (0.01) and large ones read short (10K, 1M). Zero and negative readings have no place on a log axis, so they are drawn as gaps in the line (statistics min and max too) and the axis starts from the smallest reading above zero. The tooltip still reads their real value, with no dot. A chart with nothing above zero says so instead of drawing an empty axis. A y_min or y_max at or below zero with a log scale is refused with a readable error rather than ignored. The line chart's band colours (color_by: bands) now place their stops through the value scale, so they change colour where the value is drawn on either scale. Closes #58
The log scale was added to the axis options every history chart shares, so columns, stacked areas and the climate chart offered it too, though their bars and fills stand on zero. It is now in the line chart's Chart section only, and other charts draw on even steps whatever y_scale says. Also brings the timeline and wind rose tests up to date with the merged history readers.
…first Editor strings are global, and several charts registered the same key with different text, so whichever loaded last labelled the others: the treemap's Group by read 'Group readings by', the trend card's Legend and No background options renamed the heatmap's and the slope chart's, the day clock's centre choices changed the pie's, and direction and reading options read differently from chart to chart. Fields that mean different things now have their own labels (chartForm takes label keys), and the rest share one text. Also removes the comparison charts' copy of the editor helpers and series colours.
…ore editor labels stay put Each small chart drew its readings at or below zero on a log axis; they are now gaps, as on the full-size chart, and a chart with nothing above zero says so. The trend card relabelled every chart's value-labels switch, and the rings chart the gauges' start angle; both now use their own label keys.
…read group_by groups entities by floor or area on the treemap, sunburst, icicle and radar, and readings by hour or day on the history charts. Picking one kind of style on a card set up for the other kept the old value, and the card showed an error. The editor now drops it. Also lets a long sunburst total wrap its unit under the number instead of running over the rings, and the grouped bars use the shared series colours.
…the 24-hour clock draws a text sensor as states Placed by value, the beeswarm's readout called the ends of a row 'Earliest – latest'; it now says 'Lowest – highest' there, keeping 'Earliest – latest' for time of day. The 24-hour clock gave any available entity without a unit a ring of number bars, so a text sensor (a washer's 'washing') drew empty bars; it now gets a state ring unless its state reads as a number.
github-actions Bot
pushed a commit
that referenced
this pull request
Nov 6, 2026
## [2.0.0](v1.3.0...v2.0.0) (2026-11-06) ### ⚠ BREAKING CHANGES * on/off states now read as 1 and 0 on number charts, so a binary sensor on a line, area or column chart draws a 0/1 step instead of nothing. ### Features * Chartdeck 2.0, every remaining roadmap chart ([#111](#111)) ([3aa1f9b](3aa1f9b)), closes [#13](#13) [#14](#14) [#24](#24) [#25](#25) [#26](#26) [#27](#27) [#28](#28) [#29](#29) [#30](#30) [#31](#31) [#32](#32) [#33](#33) [#34](#34) [#35](#35) [#36](#36) [#37](#37) [#38](#38) [#40](#40) [#41](#41) [#42](#42) [#43](#43) [#44](#44) [#45](#45) [#46](#46) [#57](#57) [#58](#58) [#59](#59) [#82](#82) [#83](#83) [#84](#84) [#110](#110) * histogram, scatter, bubble, heatmap and box plot charts ([#106](#106)) ([1af60ee](1af60ee)), closes [#19](#19) [#20](#20) [#21](#21) [#22](#22) [#23](#23) * pie and donut, rings, pictograph and waffle charts ([#104](#104)) ([e596014](e596014)), closes [#15](#15) [#16](#16) [#17](#17) [#18](#18) ### Documentation * list the histogram, scatter, bubble, heatmap and box plot charts in the README ([bd6116f](bd6116f)) * list the pie, rings, pictograph and waffle charts in the README ([#107](#107)) ([886b1fc](886b1fc))
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release 2.0.0, milestone 2.0.0. Everything left on the chart roadmap ships in one release, along with the charts that went out as 1.4.0 and 1.5.0 (those two releases are withdrawn and their notes folded into 2.0.0).
What's in it
Fixes made while merging
center: totalonce the gauge options were in, because the gauge options were checked on every card. They are now only read for ring, arc and needle.chartFormtakes a label map); the rest share one text.period-card.test.tsno longer fails between midnight and 1 am (from 1.5.0).src/chart/compare-form.ts) and the secondSERIES_COLORSare gone; they use the shared ones.Breaking change
On/off states now read as numbers on number charts:
onas 1 andoffas 0 (seetoReadinginsrc/history/fetch.ts; other words such ashomeoropenare still gaps). A binary sensor on a line, area or column chart used to draw nothing and now draws a 0/1 step. Text charts (state timeline, 24-hour clock) still read the words.Checks
chartdeck-chartsdashboard draws with no error cards (the only failing views are for six unreleased gallery charts that are not in this release).Not in this release
The six gallery charts (horizon, ridgeline, bump, Pareto, diverging bars, circle packing) were never committed and their working copies are gone, so they would have to be rebuilt.
Closes #13
Closes #14
Closes #24
Closes #25
Closes #26
Closes #27
Closes #28
Closes #29
Closes #30
Closes #31
Closes #32
Closes #33
Closes #34
Closes #35
Closes #36
Closes #37
Closes #38
Closes #40
Closes #41
Closes #42
Closes #43
Closes #44
Closes #45
Closes #46
Closes #57
Closes #58
Closes #59
Closes #82
Closes #83
Closes #84
Closes #110